/// <summary> /// Validates if xmldocument contains a valid signature /// </summary> /// <param name="xmlDocument">Xmldocument to verify</param> /// <returns>true/false</returns> public async Task <bool> IsValidSignature(XmlDocument xmlDocument) { logger.LogTrace(string.Format("SE.GOV.MM.Integration.Infrastructure.MessageService: entering IsValidSignature")); try { var signingHandler = new SigningHandler(); var isValid = signingHandler.IsValidSignature(xmlDocument); logger.LogTrace(string.Format("SE.GOV.MM.Integration.Infrastructure.MessageService: leaving IsValidSignature")); return(isValid); } catch (Exception ex) { logger.LogError(ex, ex.Message); throw ex; } }
private async Task <DeliveryResult> handleDistributeSecure(SignedDelivery SignedDelivery, string endpointAdressAuthority, string endpointAdressRecipient, X509Certificate2 x509Certificate) { logger.LogTrace(string.Format("SE.GOV.MM.Integration.Infrastructure.MessageService: entering handleDistributeSecure")); // Initilize messageHandler var messageHandler = new MessageHandler(logger); //Check if valid Sender var senders = await GetSenders(endpointAdressAuthority, x509Certificate); if (!senders.Select(x => x.Id).Contains(SignedDelivery.Delivery.Header.Sender.Id)) { var errorMessage = $"SE.GOV.MM.Integration.Infrastructure.MessageService: not valid SenderId={SignedDelivery.Delivery.Header.Sender.Id} in metod handleDistributeSecure"; logger.LogWarning(errorMessage); throw new Exception(errorMessage); } // Initiate serializeHelper var serializehelper = new SerializeHelper(logger); // SerializeToXmlDocument string defaultNamespace = DefaultNamespace.v3.AsString(EnumFormat.Description); var xmlDocSignedDelivery = serializehelper.SerializeToXmlDocumentV3(SignedDelivery, defaultNamespace); // Initiate signingHandler var signingHandler = new SigningHandler(x509Certificate); // Check if signed by Sender, otherwize sign SignedDelivery if (!signingHandler.IsMessageSigned(xmlDocSignedDelivery)) { signingHandler.SignXmlDocument(xmlDocSignedDelivery, TagName.Delivery.AsString(EnumFormat.Description)); SignedDelivery = serializehelper.DeserializeXmlToSignedDeliveryV3(xmlDocSignedDelivery, defaultNamespace); } // Create signed sealeddelivery var SealedDelivery = CreateSealadDelivery(); SealedDelivery.SignedDelivery = SignedDelivery; var xmlDocSealedDelivery = serializehelper.SerializeToXmlDocumentV3(SealedDelivery, defaultNamespace); signingHandler.SignXmlDocument(xmlDocSealedDelivery, TagName.Seal.AsString(EnumFormat.Description)); SealedDelivery = serializehelper.DeserializeXmlToSealedDeliveryV3(xmlDocSealedDelivery, defaultNamespace); // Verify that Receiver is reachable var isReachable = await handleIsUserReachableInFaRV3( SignedDelivery.Delivery.Header.Recipient, SignedDelivery.Delivery.Header.Sender.Id, endpointAdressRecipient, x509Certificate); // Send to Operator if (isReachable == null || isReachable.Count() == 0) { throw new Exception($"SE.GOV.MM.Integration.Infrastructure.MessageService: Recipient is not reachable {SignedDelivery.Delivery.Header.Recipient}"); } if (!isReachable[0].SenderAccepted) { throw new Exception($"SE.GOV.MM.Integration.Infrastructure.MessageService: Recipient '{SignedDelivery.Delivery.Header.Recipient}' " + $"does not accept delivery from supplier '{SignedDelivery.Delivery.Header.Sender.Id}' "); } if (isReachable[0]?.AccountStatus?.ServiceSupplier == null && isReachable[0]?.AccountStatus?.ServiceSupplier?.UIAdress == null) { throw new Exception($"SE.GOV.MM.Integration.Infrastructure.MessageService: Recipient does not have an account in FaR {SignedDelivery.Delivery.Header.Recipient}"); } var baseAdressServiceSupplier = isReachable[0].AccountStatus.ServiceSupplier.ServiceAdress; logger.LogTrace(string.Format("SE.GOV.MM.Integration.Infrastructure.MessageService: leaving handleDistributeSecure")); return(await messageHandler.SendMessageToMailBoxOperator(SealedDelivery, x509Certificate, baseAdressServiceSupplier)); }