static bool ValidateXml(XmlDocument receipt, X509Certificate2 certificate)
    {
        // Create the signed XML object.
        SignedXml sxml = new SignedXml(receipt);

        // Get the XML Signature node and load it into the signed XML object.
        XmlNode dsig = receipt.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl)[0];

        if (dsig == null)
        {
            // If signature is not found return false
            System.Console.WriteLine("Signature not found.");
            return(false);
        }

        sxml.LoadXml((XmlElement)dsig);

        // Check the signature
        bool isValid = sxml.CheckSignature(certificate, true);


        FieldInfo field = sxml.GetType().GetField("m_signature",
                                                  BindingFlags.NonPublic |
                                                  BindingFlags.Instance);

        var sig  = (Signature)field.GetValue(sxml);
        var _ref = (Reference)sig.SignedInfo.References[0];

        //var pre = Type.GetType("System.Security.Cryptography.Xml.Utils").GetMethod("PreProcessDocumentInput");
        //pre.Invoke(null, new[] { });


        var enveloped = (XmlDsigEnvelopedSignatureTransform)_ref.TransformChain[0];

        enveloped.LoadInput(receipt);
        var outputstream = enveloped.GetOutput();

        var securityUrl = receipt.BaseURI;
        var resolver    = new XmlSecureResolver(new XmlUrlResolver(), securityUrl);
        //TransformToOctetStream(Stream input, XmlResolver resolver, string baseUri)
        MethodInfo trans = _ref.TransformChain.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)[2];

        var stream = trans.Invoke(_ref.TransformChain, new object[] { receipt, resolver, securityUrl });


        var canontype = sig.GetType().Assembly.GetType("System.Security.Cryptography.Xml.CanonicalXml");
        var foo       = Activator.CreateInstance(canontype, BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { receipt, resolver }, null);



        MethodInfo method = _ref.GetType().GetMethod("CalculateHashValue",
                                                     BindingFlags.NonPublic |
                                                     BindingFlags.Instance);

        FieldInfo refs = sig.GetType().GetField("m_referencedItems",
                                                BindingFlags.NonPublic |
                                                BindingFlags.Instance);
        var refs1 = refs.GetValue(sig);

        var res = method.Invoke(_ref, new [] { receipt, refs1 });
        var str = Convert.ToBase64String((byte[])res);

        return(isValid);
    }
    static bool ValidateXml(XmlDocument receipt, X509Certificate2 certificate)
    {
        // Create the signed XML object.
        SignedXml sxml = new SignedXml(receipt);

        // Get the XML Signature node and load it into the signed XML object.
        XmlNode dsig = receipt.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl)[0];
        if (dsig == null)
        {
            // If signature is not found return false
            System.Console.WriteLine("Signature not found.");
            return false;
        }

        sxml.LoadXml((XmlElement)dsig);

        // Check the signature
        bool isValid = sxml.CheckSignature(certificate, true);

        FieldInfo field = sxml.GetType().GetField("m_signature",
                       BindingFlags.NonPublic |
                       BindingFlags.Instance);

        var sig = (Signature)field.GetValue(sxml);
        var _ref = (Reference)sig.SignedInfo.References[0];

        //var pre = Type.GetType("System.Security.Cryptography.Xml.Utils").GetMethod("PreProcessDocumentInput");
        //pre.Invoke(null, new[] { });

        var enveloped = (XmlDsigEnvelopedSignatureTransform)_ref.TransformChain[0];

        enveloped.LoadInput(receipt);
        var outputstream = enveloped.GetOutput();

        var securityUrl = receipt.BaseURI;
        var resolver = new XmlSecureResolver(new XmlUrlResolver(), securityUrl);
        //TransformToOctetStream(Stream input, XmlResolver resolver, string baseUri)
        MethodInfo trans = _ref.TransformChain.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)[2];

        var stream = trans.Invoke(_ref.TransformChain, new object[] {receipt, resolver, securityUrl});

        var canontype = sig.GetType().Assembly.GetType("System.Security.Cryptography.Xml.CanonicalXml");
        var foo = Activator.CreateInstance(canontype, BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] {receipt, resolver}, null);

        MethodInfo method = _ref.GetType().GetMethod("CalculateHashValue",
                       BindingFlags.NonPublic |
                       BindingFlags.Instance);

        FieldInfo refs = sig.GetType().GetField("m_referencedItems",
                       BindingFlags.NonPublic |
                       BindingFlags.Instance);
        var refs1 = refs.GetValue(sig);

        var res = method.Invoke(_ref, new [] {receipt, refs1});
        var str = Convert.ToBase64String((byte[])res);

        return isValid;
    }