Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.56 KB | None | 0 0
  1. ////Seleciona o armazenamento de certificado usado pelo usuário atual.
  2. X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
  3. store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
  4. X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
  5. X509Certificate2Collection collection1 = (X509Certificate2Collection)collection.Find(X509FindType.FindBySubjectDistinguishedName, _xnome, false);
  6. if (collection1.Count == 0)
  7. {
  8. resultado = 1;
  9. }
  10. else
  11. {
  12. //Certificado ok
  13. X509Cert = collection1[0];
  14. string x;
  15.  
  16. //Retorna informações do algoritmo para esse certificado X.509v3 como uma cadeia de caracteres. (Herdado de X509Certificate.)
  17. x = X509Cert.GetKeyAlgorithm().ToString();
  18.  
  19. //Cria um novo documento xml
  20. XmlDocument doc = new XmlDocument();
  21.  
  22. //Formata o documento para ignorar espaços
  23. doc.PreserveWhitespace = false;
  24.  
  25. try
  26. {
  27. //Carregar o arquivo XML pelo nome
  28. doc.LoadXml(_conteudoXml);
  29. List<XmlNode> nodes = new List<XmlNode>();
  30. foreach (XmlNode node in doc.SelectNodes("//*['Signature']"))
  31. {
  32. nodes.Add(node);
  33. }
  34. foreach (XmlNode node in nodes)
  35. {
  36. if (Convert.ToString(node.Name) == "Signature")
  37. {
  38. node.ParentNode.RemoveChild(node);
  39. }
  40.  
  41. }
  42.  
  43. //Verifica se a tag a ser assinada existe é única
  44. int qtdeRefUri = doc.GetElementsByTagName(_RefUri).Count;
  45.  
  46. if (qtdeRefUri == 0)
  47. {
  48. //A URI indicada não existe
  49. resultado = 2;
  50. }
  51. //Exsiste mais de uma tag a ser assinada
  52. else
  53. {
  54. try
  55. {
  56. for (int i = 0; i < qtdeRefUri; i++)
  57. {
  58. //Cria o objeto SignedXml.
  59. SignedXml signedXml = new SignedXml(doc);
  60.  
  61. //Define o objeto de AsymmetricAlgorithm que representa a chave particular associada com um certificado.
  62. signedXml.SigningKey = X509Cert.PrivateKey;
  63.  
  64. //Cria a referência a ser assinada
  65. Reference reference = new Reference();
  66.  
  67. //Pega o uri que deve ser assinada
  68. XmlAttributeCollection _Uri = doc.GetElementsByTagName(_RefUri).Item(i).Attributes;
  69.  
  70. foreach (XmlAttribute _atributo in _Uri)
  71. {
  72. //Verifica se a URI informada possui o Id
  73. if (_atributo.Name == "Id")
  74. {
  75. reference.Uri = "#" + _atributo.InnerText;
  76. }
  77. }
  78.  
  79. //Adiciona o envelopamento para referência
  80. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
  81. reference.AddTransform(env);
  82.  
  83. //Adiciona a Canonatização para referência
  84. XmlDsigC14NTransform c14 = new XmlDsigC14NTransform();
  85. reference.AddTransform(c14);
  86.  
  87. //Adiciona referência para o SignedXml objeto.
  88. signedXml.AddReference(reference);
  89.  
  90. //Cria novo objeto KeyInfo
  91. KeyInfo keyInfo = new KeyInfo();
  92.  
  93. //Carrega o certificado e insere KeyInfoX509Data
  94. keyInfo.AddClause(new KeyInfoX509Data(X509Cert));
  95.  
  96. //Adiciona Keyinfo para o SignedXml.
  97. signedXml.KeyInfo = keyInfo;
  98.  
  99. //Adiciona a assinatura no XML com autenticação por ser chave privada
  100. signedXml.ComputeSignature();
  101.  
  102. //Referencia xml, coloca assinatura e salva
  103. XmlElement xmlDigitalSignature = signedXml.GetXml();
  104.  
  105. //Assina no final da Uri informada.
  106. XmlElement xmlElement = doc.GetElementsByTagName(_RefUri)[i] as XmlElement;
  107. xmlElement.ParentNode.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
  108.  
  109. XMLDoc = new XmlDocument();
  110. XMLDoc.PreserveWhitespace = false;
  111. XMLDoc = doc;
  112. }
  113. }
  114. catch (CryptographicException ex)
  115. {
  116. resultado = 3;
  117. }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement