Guest User

Untitled

a guest
Oct 22nd, 2017
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics.Contracts;
  4. using System.Linq;
  5. using System.Security.Cryptography.X509Certificates;
  6. using System.Security.Cryptography.Xml;
  7. using System.Text;
  8. using System.Xml;
  9. using CryptoPro.Sharpei.Xml;
  10. using OpenEhr.V1.Its.Xml.RM;
  11. using OpenHealth.Common.Extensions;
  12. using OpenHealth.Common.OpenEHR.Extensions;
  13. using OpenHealth.KnowledgeManager.Definition;
  14.  
  15. namespace OpenHealth.Storage.Ehr
  16. {
  17. public class VersionSigner : IVersionSigner
  18. {
  19. readonly ICertificateContainer _certificateContainer;
  20. readonly IKnowledgeManager _knowledgeManager;
  21.  
  22. public VersionSigner(ICertificateContainer certificateContainer, IKnowledgeManager knowledgeManager)
  23. {
  24. Contract.Requires(certificateContainer != null);
  25. Contract.Requires(knowledgeManager != null);
  26.  
  27. _certificateContainer = certificateContainer;
  28. _knowledgeManager = knowledgeManager;
  29. }
  30.  
  31. public string GetSignatureForVersion(VERSION version)
  32. {
  33. var composition = version.Cast<ORIGINAL_VERSION>().data as COMPOSITION;
  34.  
  35. // При создании Ehr в data приходит EHR_STATUS, а не COMPOSITION
  36. if (composition == null)
  37. return string.Empty;
  38.  
  39. X509Certificate2 certificate = GetCertificate(composition.archetype_details.template_id.value);
  40.  
  41. if (certificate == null)
  42. return string.Empty;
  43.  
  44. var doc = new XmlDocument
  45. {
  46. PreserveWhitespace = false
  47. };
  48. doc.LoadXml(version.Serialize<VERSION>());
  49.  
  50. var reference = new Reference { DigestMethod = CPSignedXml.XmlDsigGost3411Url, Uri = string.Empty };
  51. // Добавляем transform на подписываемые данные для удаления вложенной подписи.
  52. reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
  53. // Добавляем transform для канонизации.
  54. reference.AddTransform(new XmlDsigC14NTransform());
  55.  
  56. var keyInfo = new KeyInfo();
  57. keyInfo.AddClause(new KeyInfoX509Data(certificate));
  58.  
  59. var signedXml = new SignedXml(doc)
  60. {
  61. SigningKey = certificate.PrivateKey
  62. };
  63. signedXml.AddReference(reference);
  64. signedXml.KeyInfo = keyInfo;
  65.  
  66. signedXml.ComputeSignature();
  67.  
  68. XmlElement xmlElement = signedXml.GetXml();
  69.  
  70. return Convert.ToBase64String(Encoding.UTF8.GetBytes(xmlElement.InnerXml));
  71. }
  72.  
  73. X509Certificate2 GetCertificate(string templateId)
  74. {
  75. if (_certificateContainer == null)
  76. return null;
  77.  
  78. if (templateId.IsNullOrWhiteSpace())
  79. return _certificateContainer.DefaultCertificate;
  80.  
  81. var path = _knowledgeManager.GetFullPathById(templateId);
  82.  
  83. return _certificateContainer.Certificates
  84. .Where(c => path.Contains(c.Key) && c.Key.IsNullOrWhiteSpace().Not())
  85. .DefaultIfEmpty(new KeyValuePair<string, X509Certificate2>("", _certificateContainer.DefaultCertificate))
  86. .FirstOrDefault().Value;
  87. }
  88. }
  89. }
Add Comment
Please, Sign In to add comment