/// <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); } }
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(); }