Skip to content

Example usage of OpenGost to verify XMLDSIG. #20

@Degot

Description

@Degot

Hello, I've used this library to verify XMLDSIG created by CryptoPro, the main problem was that I needed to extract public key manually. Example:

public static bool VerifyXMLDSIG(string xmldsigFilename)
{
    if (xmldsigFilename == null)
        throw new ArgumentNullException(nameof(xmldsigFilename));

    var xmlDocument = new XmlDocument();
    xmlDocument.PreserveWhitespace = true;
    xmlDocument.Load(xmldsigFilename);
    var signedXml = new SignedXml(xmlDocument);
    var signatureElement = xmlDocument.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl)[0] as XmlElement;
    signedXml.LoadXml(signatureElement);
    
    var isValidXml = false;

    if (signedXml.KeyInfo != null)
    {
        foreach (KeyInfoClause clause in signedXml.KeyInfo)
        {
            if (isValidXml) break;

            if (clause is KeyInfoX509Data x509Data)
            {
                foreach(X509Certificate2 cert  in x509Data.Certificates)
                {
                    if (isValidXml) break;

                    var oid = cert.PublicKey.EncodedParameters.Oid;                            
                    var key = default(AsymmetricAlgorithm);

                    if (oid.Value == "1.2.643.7.1.1.1.1" || oid.Value == "1.2.643.7.1.1.1.2")
                    {
                        key = cert.GetGostECDsaPublicKey();
                        
                    } else
                    {
                        key = cert.GetECDsaPublicKey();
                    }

                    if (key  != null)
                    {
                        isValidXml = signedXml.CheckSignature(key);
                        key.Dispose();
                        key = null;
                    }                            
                }
            }
        }
    }           
    return isValidXml;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions