Poprzedni post poruszał tematykę związaną z podpisywaniem dokumentów. Wpis ten jednak nie zamykał tematu, ponieważ nie pokazywał jak można zweryfikować podpisany dokument. Temat ten postaram się poruszyć w tym wpisie.

Weryfikacja podpisanego dokumentu wydaje mi się o wiele prostsza niż jego podpisywanie. W celu weryfikacji dokumentu należy tylko odnaleźć element Signature i sprawdzić, czy podpis w nim zawarty odpowiada podpisywanemu dokumentowi. Od razu dodam założenie, że dokument, w którym znajduje się inna ilość elementów Signature niż jeden, uważam za niepoprawny. Dodatkowo w przypadku, gdy dokument XML nie zawiera w sobie informacji pozwalającej na weryfikację podpisu należy ją uzupełnić.

Funkcja weryfikująca autentyczność dokumentu poprzez weryfikację podpisu wyglądać może w następujący sposób:

/// <summary>
/// Checks if document has valid XML signature
/// </summary>
/// <param name="xmlDocument">Document to check</param>
/// <param name="key">Key which XML signature should be checked</param>
/// <returns>Valid of signature</returns>
public static bool CheckXmlSignature(XmlDocument xmlDocument, AsymmetricAlgorithm key)
{
   if (xmlDocument == null)
   {
      throw new ArgumentNullException("xmlDocument");
   }

   if (key == null)
   {
      throw new ArgumentNullException("key");
   }

   // Create a new SignedXml object and pass it
   // the XML document class.
   SignedXml signedXml = new SignedXml(xmlDocument);

   // Find the "Signature" node and create a new
   // XmlNodeList object.
   XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");

   if (nodeList.Count == 1)
   {
      // Load the signature node.
      signedXml.LoadXml((XmlElement)nodeList[0]);

      // Check the signature and return the result.
      return signedXml.CheckSignature(key);
   }
   else
   {
      return false;
   }
}

W powyższej metodzie, sprawdzany jest podpisany dokument, w którym brakuje informacji pozwalającej zweryfikować poprawność podpisu. Dlatego też uzupełniamy tę informację poprzez parametr key. W przypadku, gdy dokument XML zawiera w sobie informację pozwalającą na weryfikację podpisu w powyższej metodzie należy zmienić tylko jedną linijkę:

Z:

return signedXml.CheckSignature(key);

Na:

return signedXml.CheckSignature();

W tym wypadku należy również usunąć bezużyteczny parametr z metody – AsymmetricAlgorithm key.