/// <summary>
        /// Deliver a Sealed Message to a Receiver or Intermediary.
        /// </summary>
        /// <param name="message">The message to deliver.</param>
        /// <param name="endpointUrl">The endpoint of the SMD service.</param>
        /// <returns>A value indicating if the operation is successful.</returns>
        public deliverResponse Deliver(SealedMessageType message, Uri endpointUrl)
        {
            Validation.ValidateArgumentRequired("message", message);
            Validation.ValidateArgumentRequired("endpointUrl", endpointUrl);

            // Validate metadata
            ValidateMetadata(message.metadata);

            // Validate encrypted payload
            Validation.ValidateArgumentRequired("message.encryptedPayload", message.encryptedPayload);

            if (smdClient is Nehta.SMD2010.SMD.SealedMessageDeliveryClient)
            {
                Nehta.SMD2010.SMD.SealedMessageDeliveryClient client = (Nehta.SMD2010.SMD.SealedMessageDeliveryClient)smdClient;
                client.Endpoint.Address = new EndpointAddress(endpointUrl);
            }

            deliverRequest request = new deliverRequest();

            request.deliver         = new deliver();
            request.deliver.message = message;

            deliverResponse1 response = smdClient.deliver(request);

            if (response != null && response.deliverResponse != null)
            {
                return(response.deliverResponse);
            }
            else
            {
                throw new ApplicationException(Properties.Resources.UnexpectedServiceResponse);
            }
        }
Example #2
0
        public void Sample()
        {
            // Payload
            XmlDocument payload = new XmlDocument();

            payload.LoadXml("<data>Sample data to deliver.</data>");

            // TLS certificate used to authenticate the client to the SMD service during TLS connection.
            X509Certificate2 tlsCert = X509CertificateUtil.GetCertificate("TlsCertificateSerialNumber", X509FindType.FindBySerialNumber, StoreName.My, StoreLocation.CurrentUser, true);

            // Certificate used to sign the payload.
            X509Certificate2 signingCert = X509CertificateUtil.GetCertificate("SigningCertificateSerialNumber", X509FindType.FindBySerialNumber, StoreName.My, StoreLocation.CurrentUser, true);

            // Certificate used to encrypt the payload.
            X509Certificate2 payloadEncryptionCert = X509CertificateUtil.GetCertificate("EncryptionCertificateSerialNumber", X509FindType.FindBySerialNumber, StoreName.My, StoreLocation.CurrentUser, true);

            // Instantiate the client.
            SealedMessageDeliveryClient client = new SealedMessageDeliveryClient(tlsCert);

            // Set up metadata
            MessageMetadataType metadata = new MessageMetadataType();

            metadata.creationTime         = DateTime.Now.ToUniversalTime();
            metadata.expiryTime           = DateTime.Now.AddDays(30).ToUniversalTime();
            metadata.expiryTimeSpecified  = true;
            metadata.invocationId         = new UniqueId().ToString();
            metadata.receiverIndividual   = HIQualifiers.HPIIQualifier + "16 digit receiver HPII";
            metadata.receiverOrganisation = HIQualifiers.HPIOQualifier + "16 digit receiver organisation HPIO";
            metadata.senderIndividual     = HIQualifiers.HPIIQualifier + "16 digit sender HPII";
            metadata.senderOrganisation   = HIQualifiers.HPIOQualifier + "16 digit sender organisation HPIO";
            metadata.serviceCategory      = "ServiceCategory";
            metadata.serviceInterface     = ServiceInterfaces.SmdServiceInterface;

            // Set up route record. Route records are used to indicate where transport responses
            // are to be sent to.
            metadata.routeRecord    = new RouteRecordEntryType[1];
            metadata.routeRecord[0] = new RouteRecordEntryType();
            metadata.routeRecord[0].sendIntermediateResponses = false;
            metadata.routeRecord[0].interaction                  = new InteractionType();
            metadata.routeRecord[0].interaction.target           = HIQualifiers.HPIOQualifier + "16 digit HPIO of the transport response target";
            metadata.routeRecord[0].interaction.serviceCategory  = "ServiceCategory";
            metadata.routeRecord[0].interaction.serviceEndpoint  = "https://TransportResponseDeliveryEndpoint";
            metadata.routeRecord[0].interaction.serviceInterface = ServiceInterfaces.TrdServiceInterface;
            metadata.routeRecord[0].interaction.serviceProvider  = HIQualifiers.HPIOQualifier + "16 digit HPIO of the TRD service provider";

            // Obtain a SealedMessageType instance.
            SealedMessageType sealedMessage = SealedMessageDeliveryClient.GetSealedMessage(payload, metadata, signingCert, payloadEncryptionCert);

            // Invoke the Deliver operation on the client.
            deliverResponse response = client.Deliver(sealedMessage, new Uri("https://SMDServiceEndpoint"));
        }
        /// <summary>
        /// Create and returns a SealedMessageType instance encapsulating payload signing and encryption.
        /// </summary>
        /// <param name="payload">The xml document payload.</param>
        /// <param name="metadata">The metadata of the message.</param>
        /// <param name="signingCert">The certificate to sign the payload with.</param>
        /// <param name="encryptionCert">The certificate to encrypt the payload with.</param>
        /// <returns>The SealedMessageType instance.</returns>
        public static SealedMessageType GetSealedMessage(XmlDocument payload, MessageMetadataType metadata, X509Certificate2 signingCert, X509Certificate2 encryptionCert)
        {
            // Create SealedMessageType
            SealedMessageType sealedMessage = new SealedMessageType();

            // Create signed payload container
            XmlDocument signedPayload = payload.XspSign(signingCert);

            // Create the encrypted payload container
            XmlDocument encryptedPayload = signedPayload.XspEncrypt(encryptionCert);

            // Set encrypted payload
            sealedMessage.encryptedPayload = encryptedPayload.Deserialize <EncryptedPayloadType>();

            // Set metadata
            ValidateMetadata(metadata);
            sealedMessage.metadata = metadata;

            return(sealedMessage);
        }
        public void Sample()
        {
            // TLS certificate used to authenticate the client to the SMR service during TLS connection.
            X509Certificate2 tlsCert = X509CertificateUtil.GetCertificate("TlsCertificateSerialNumber", X509FindType.FindBySerialNumber, StoreName.My, StoreLocation.CurrentUser, true);

            // Certificate used to sign the payload.
            X509Certificate2 signingCert = X509CertificateUtil.GetCertificate("SigningCertificateSerialNumber", X509FindType.FindBySerialNumber, StoreName.My, StoreLocation.CurrentUser, true);

            // Certificate used to encrypt the payload.
            X509Certificate2 payloadDecryptionCert = X509CertificateUtil.GetCertificate("DecryptionCertificateSerialNumber", X509FindType.FindBySerialNumber, StoreName.My, StoreLocation.CurrentUser, true);

            // Instantiate client
            SealedMessageRetrievalClient client = new SealedMessageRetrievalClient(tlsCert);

            // ------------------------------------------------------------------------------
            // List
            // ------------------------------------------------------------------------------

            // Set up request
            list listRequest = new list()
            {
                allAvailable         = true,
                limit                = 0,
                receiverOrganisation = HIQualifiers.HPIOQualifier + "16 digit HPIO of receiver organisation"
            };

            // Invoke the List operation
            MessageListType messageList = client.List(listRequest, new Uri("https://SMRServiceEndpointUri"));

            // ------------------------------------------------------------------------------
            // Retrieve
            // ------------------------------------------------------------------------------

            // Get list of invocation IDs obtained from List operation
            string[] invocationIds = messageList.retrievalRecord.Select(r => r.metadata.invocationId).ToArray();

            // Set up request
            retrieve retrieveRequest = new retrieve()
            {
                invocationId         = invocationIds,
                receiverOrganisation = HIQualifiers.HPIOQualifier + "16 digit HPIO of receiver organisation"
            };

            // Invoke the Retrieve operation
            SealedMessageType[] sealedMessages = client.Retrieve(retrieveRequest, new Uri("https://SMRServiceEndpointUri"));

            // ------------------------------------------------------------------------------
            // Obtaining the payload from the Sealed Messages
            // ------------------------------------------------------------------------------

            // Obtain the first Sealed Message to decrypt
            SealedMessageType sealedMessage = sealedMessages[0];

            // Serialize the encrypted payload
            XmlDocument encryptedPayload = sealedMessage.encryptedPayload.SerializeToXml("encryptedPayload");

            // Decrypt the payload, obtaining the signed payload
            XmlDocument decryptedPayload = encryptedPayload.XspDecrypt(payloadDecryptionCert);

            // Obtain the original payload from the signed payload
            XmlDocument originalPayload = decryptedPayload.XspGetPayloadFromSignedDocument();
        }