Exemple #1
0
        public void LoadXml()
        {
            const string pValue           = "oDZlcdJA1Kf6UeNEIZqm4KDqA6zpX7CmEtAGWi9pgnBhWOUDVEfhswfsvTLR5BCbKfE6KoHvt5Hh8D1RcAko//iZkLZ+gds9y/5Oxape8tu3TUi1BnNPWu8ieXjMtdnpyudKFsCymssJked1rBeRePG23HTVwOV1DpopjRkjBEU=";
            const string qValue           = "0JxsZhjbIteTbrtfWmt5Uif6il8=";
            const string gValue           = "EOVCfv1saTWIc6Dgim24a07dqqyCJXmIT+5PrgrfV3M8/hfmaMfZtpvM0BUkXVv0dFScnN7txnSpnLWchBz0RfehL6c7Mofu/d2H1cp8zvwTasfiJhypQHDuC4p1aSXuQ1hnzzyYeHKzBH9r0PA78haL7/HnwrrscttXGhmU/L0=";
            const string yValue           = "HBHSdiOJDoZhRpK+B4Ft5hisHvRjz6rELay+aPrya2yKRUUN7ZysNi12PltAvljexay0gEpPncg6TrRtH1+7usTxbgkuIwcQ3RPPIzM7y+XldbcyVUfyze5+zXy9ALiugT+zP8DOMRj9Yj6kR6ZsgbnSdlH2hGIn9NctXgRQ6Kg=";
            const string seedValue        = "NKemrvYwT/4u8DNiXoPj9jO6LAg=";
            const string pgenCounterValue = "uA==";
            string       dsaKey           = $"<KeyValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><DSAKeyValue><P>{pValue}</P><Q>{qValue}</Q><G>{gValue}</G><Y>{yValue}</Y><Seed>{seedValue}</Seed><PgenCounter>{pgenCounterValue}</PgenCounter></DSAKeyValue></KeyValue>";

            var xmlDoc = new XmlDocument();

            xmlDoc.LoadXml(dsaKey);

            var dsaKeyValue = new DSAKeyValue();

            dsaKeyValue.LoadXml(xmlDoc.DocumentElement);

            var parameters = dsaKeyValue.Key.ExportParameters(false);

            Assert.Equal(Convert.ToBase64String(parameters.P), pValue);
            Assert.Equal(Convert.ToBase64String(parameters.Q), qValue);
            Assert.Equal(Convert.ToBase64String(parameters.G), gValue);
            Assert.Equal(Convert.ToBase64String(parameters.Y), yValue);
            Assert.NotNull(parameters.Seed);
            Assert.Equal(Convert.ToBase64String(parameters.Seed), seedValue);
            Assert.Equal(BitConverter.GetBytes(parameters.Counter)[0], Convert.FromBase64String(pgenCounterValue)[0]);
        }
Exemple #2
0
        public void GetXml()
        {
            DSAKeyValue dsa    = new DSAKeyValue();
            XmlElement  xmlkey = dsa.GetXml();

            XmlNamespaceManager ns = new XmlNamespaceManager(xmlkey.OwnerDocument.NameTable);

            ns.AddNamespace("schema", SignedXml.XmlDsigNamespaceUrl);

            IEnumerable <XmlNode> elements =
                new[] { "P", "Q", "G", "Y", "J", "Seed", "PgenCounter" }
            .Select(elementName => xmlkey.SelectSingleNode($"/schema:DSAKeyValue/schema:{elementName}", ns))
            .Where(element => element != null);

            //There MUST be existing elements
            Assert.NotEmpty(elements);

            //Existing elements MUST include a "Y"-Element
            Assert.True(elements.SingleOrDefault(element => element.Name == "Y") != null);

            //Existing elements MUST contain InnerText
            Assert.True(elements.All(element => !string.IsNullOrEmpty(element.InnerText)));

            //Existing elements MUST be convertible from BASE64
            elements.Select(element => Convert.FromBase64String(element.InnerText));
        }
Exemple #3
0
        public void Ctor_Dsa()
        {
            var         pair        = TestHelpers.DSAGenerateKeyPair();
            DSAKeyValue dsaKeyValue = new DSAKeyValue((DsaPublicKeyParameters)pair.Public);

            Assert.Equal(pair.Public, dsaKeyValue.Key);
        }
        virtual protected void SignWithKeyInfo(String src, String dest, ICipherParameters pk,
                                               AsymmetricAlgorithm publicKey, String digestAlgorithm)
        {
            // Creating the reader and the stamper
            PdfReader  reader  = new PdfReader(src);
            FileStream os      = new FileStream(dest, FileMode.Create);
            PdfStamper stamper = PdfStamper.createXmlSignature(reader, os);
            // Creating the appearance
            XmlSignatureAppearance appearance = stamper.XmlSignatureAppearance;

            //Set XfaXmlLocator to control getting and setting Document
            appearance.SetXmlLocator(new XfaXmlLocator(stamper));
            // Creating the signature
            IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm);

            KeyInfoClause keyInfo;

            if (publicKey is DSA)
            {
                keyInfo = new DSAKeyValue((DSA)publicKey);
            }
            else if (publicKey is RSA)
            {
                keyInfo = new RSAKeyValue((RSA)publicKey);
            }
            else
            {
                throw new ArgumentException("Invalid public key algorithm", "publicKey");
            }

            MakeXmlSignature.SignXmlDSig(appearance, pks, keyInfo);
        }
Exemple #5
0
 public void Ctor_Dsa()
 {
     using (DSA dsa = DSA.Create())
     {
         DSAKeyValue dsaKeyValue = new DSAKeyValue(dsa);
         Assert.Equal(dsa, dsaKeyValue.Key);
     }
 }
Exemple #6
0
        public void GetXml_SameDsa()
        {
            var         pair         = TestHelpers.DSAGenerateKeyPair();
            DSAKeyValue dsaKeyValue1 = new DSAKeyValue((DsaPublicKeyParameters)pair.Public);
            DSAKeyValue dsaKeyValue2 = new DSAKeyValue((DsaPublicKeyParameters)pair.Public);

            Assert.Equal(dsaKeyValue1.GetXml(), dsaKeyValue2.GetXml());
        }
Exemple #7
0
 public void GetXml_SameDsa()
 {
     using (DSA dsa = DSA.Create())
     {
         DSAKeyValue dsaKeyValue1 = new DSAKeyValue(dsa);
         DSAKeyValue dsaKeyValue2 = new DSAKeyValue(dsa);
         Assert.Equal(dsaKeyValue1.GetXml(), dsaKeyValue2.GetXml());
     }
 }
Exemple #8
0
 public void GetXml_SameDsa()
 {
     using (DSA dsa = TestHelpers.GetWorkingDSA())
     {
         DSAKeyValue dsaKeyValue1 = new DSAKeyValue(dsa);
         DSAKeyValue dsaKeyValue2 = new DSAKeyValue(dsa);
         Assert.Equal(dsaKeyValue1.GetXml(), dsaKeyValue2.GetXml());
     }
 }
Exemple #9
0
        public void Ctor_Dsa_Null()
        {
            DSAKeyValue dsaKeyValue = new DSAKeyValue(null);

            //From https://github.com/peterwurzinger:
            //This assertion is incorrect, since the parameter value is stored unvalidated/unprocessed
            //Assert.NotNull(dsaKeyValue.Key);

            Assert.Null(dsaKeyValue.Key);
        }
Exemple #10
0
        public void InvalidValue2()
        {
            string      badKey = "<Test></Test>";
            XmlDocument doc    = new XmlDocument();

            doc.LoadXml(badKey);

            DSAKeyValue dsa1 = new DSAKeyValue();

            dsa1.LoadXml(doc.DocumentElement);
        }
Exemple #11
0
        public void DSAKeyValue()
        {
            DSA key = DSA.Create();

            key.FromXmlString(xmlDSA);
            DSAKeyValue dsa = new DSAKeyValue(key);

            info.AddClause(dsa);
            AssertCrypto.AssertXmlEquals("dsa", "<KeyInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><KeyValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" + xmlDSA + "</KeyValue></KeyInfo>", (info.GetXml().OuterXml));
            Assert.AreEqual(1, info.Count, "dsa count");
        }
Exemple #12
0
        public void Complex()
        {
            KeyInfoName name = new KeyInfoName();

            name.Value = "CoreFx::";
            info.AddClause(name);

            using (DSA keyDSA = DSA.Create())
            {
                keyDSA.ImportParameters(new DSAParameters
                {
                    P = Convert.FromBase64String(dsaP),
                    Q = Convert.FromBase64String(dsaQ),
                    G = Convert.FromBase64String(dsaG),
                    Y = Convert.FromBase64String(dsaY),
                });
                DSAKeyValue dsa = new DSAKeyValue(keyDSA);
                info.AddClause(dsa);

                using (RSA keyRSA = RSA.Create())
                {
                    keyRSA.ImportParameters(new RSAParameters()
                    {
                        Modulus  = Convert.FromBase64String(rsaModulus),
                        Exponent = Convert.FromBase64String(rsaExponent)
                    });
                    RSAKeyValue rsa = new RSAKeyValue(keyRSA);
                    info.AddClause(rsa);

                    KeyInfoRetrievalMethod retrieval = new KeyInfoRetrievalMethod();
                    retrieval.Uri = "https://github.com/dotnet/corefx";
                    info.AddClause(retrieval);

                    using (X509Certificate x509 = new X509Certificate(cert))
                    {
                        KeyInfoX509Data x509data = new KeyInfoX509Data(x509);
                        info.AddClause(x509data);

                        string s = "<KeyInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><KeyName>CoreFx::</KeyName><KeyValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><DSAKeyValue><P>rjxsMU368YOCTQejWkiuO9e/vUVwkLtq1jKiU3TtJ53hBJqjFRuTa228vZe+BH2su9RPn/vYFWfQDv6zgBYe3eNdu4Afw+Ny0FatX6dl3E77Ra6Tsd3MmLXBiGSQ1mMNd5G2XQGpbt9zsGlUaexXekeMLxIufgfZLwYp67M+2WM=</P><Q>tf0K9rMyvUrU4cIkwbCrDRhQAJk=</Q><G>S8Z+1pGCed00w6DtVcqZLKjfqlCJ7JsugEFIgSy/Vxtu9YGCMclV4ijGEbPo/jU8YOSMuD7E9M7UaopMRcmKQjoKZzoJjkgVFP48Ohxl1f08lERnButsxanx3+OstFwUGQ8XNaGg3KrIoZt1FUnfxN3RHHTvVhjzNSHxMGULGaU=</G><Y>LnrxxRGLYeV2XLtK3SYz8RQHlHFZYrtznDZyMotuRfO5uC5YODhSFyLXvb1qB3WeGtF4h3Eo4KzHgMgfN2ZMlffxFRhJgTtH3ctbL8lfQoDkjeiPPnYGhspdJxr0tyZmiy0gkjJG3vwHYrLnvZWx9Wm/unqiOlGBPNuxJ+hOeP8=</Y></DSAKeyValue></KeyValue>";
                        s += "<KeyValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><RSAKeyValue><Modulus>9DC4XNdQJwMRnz5pP2a6U51MHCODRilaIoVXqUPhCUb0lJdGroeqVYT84ZyIVrcarzD7Tqs3aEOIa3rKox0N1bxQpZPqayVQeLAkjLLtzJW/ScRJx3uEDJdgT1JnM1FH0GZTinmEdCUXdLc7+Y/c/qqIkTfbwHbRZjW0bBJyExM=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue>";
                        s += "<RetrievalMethod URI=\"https://github.com/dotnet/corefx\" />";
                        s += "<X509Data xmlns=\"http://www.w3.org/2000/09/xmldsig#\">";
                        s += "<X509Certificate>MIICHTCCAYYCARQwDQYJKoZIhvcNAQEEBQAwWDELMAkGA1UEBhMCQ0ExHzAdBgNVBAMTFktleXdpdG5lc3MgQ2FuYWRhIEluYy4xKDAmBgorBgEEASoCCwIBExhrZXl3aXRuZXNzQGtleXdpdG5lc3MuY2EwHhcNOTYwNTA3MDAwMDAwWhcNOTkwNTA3MDAwMDAwWjBYMQswCQYDVQQGEwJDQTEfMB0GA1UEAxMWS2V5d2l0bmVzcyBDYW5hZGEgSW5jLjEoMCYGCisGAQQBKgILAgETGGtleXdpdG5lc3NAa2V5d2l0bmVzcy5jYTCBnTANBgkqhkiG9w0BAQEFAAOBiwAwgYcCgYEAzSP6KuHtmPTp0JM+13qAAkzMwQKvXLYff/pXQm8w0SDFtSEHQCyphsLzZISuPYUu7YW9VLAYKO9q+BvnCxYfkyVPx/iOw7nKmIQOVdAv73h3xXIoX2C/GSvRcqK32D/glzRaAb0EnMh4Rc2TjRXydhARq7hbLp5S3YE+nGTIKZMCAQMwDQYJKoZIhvcNAQEEBQADgYEAMho1ur9DJ9a01Lh25eObTWzAhsl3NbprFi0TRkqwMlOhW1rpmeIMhogXTg3+gqxOR+/7/zms7jXI+lI3CkmtWa3iiqkcxl8f+G9zfs2gMegMvvVN2bKrihK2MHhoEXwN8UlNo/2y6f8d8JH6VIX/M5Dowb+km6RiRr1hElmYQYk=</X509Certificate></X509Data></KeyInfo>";
                        AssertCrypto.AssertXmlEquals("Complex", s, (info.GetXml().OuterXml));
                        Assert.Equal(5, info.Count);
                    }
                }
            }
        }
Exemple #13
0
        public void ImportKey()
        {
            string      dsaKey = "<KeyValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><DSAKeyValue><P>xc+QZRWTgr390gzwNXF+WzoepZkvAQvCzfCm+YyXj0KPoeHHeSc5ORzXQw81V+7XJR3gupvlI4F7lW9YC538l+3eqGm8IQlCIS+U+7ICTDOFFKevqsYX0BnjO0vvE4aAtDyxfSOTCOAo1cJ+6G6xgcC1JGIBEYCtg1tH8wUewDE=</P><Q>yyfZb0S/rimXl9ScJ3zIba2oGl8=</Q><G>crLazMg+vgI7u6+Idgi9iTLdRa4fptat3gdY97zcc857+OVdmT+lVRpK3okWpmBbw2wSffU8QltwFf42BVs+/HGUOUo2hNqSSXgzl1i+1frO7/cqooHVcy5WX0xxaIPsKcREPI5pNPj/3g8apTgErLMGsHkFdngwbMed9DArTks=</G><Y>FlAozo17wV/LCMRrtnmMKxVQNpidJVkZNM1/0eR65x8giwPs6yXzJmFT8f2tmPJY2FIOAtp5JYin4xUhwIHF452Gg50wUrjV6WTGkiC+gzLC2fVIyGlVsFecLj6ue7J+MACG+b3NQnxFuT5maQnPnEeuGgjLXfwYsAR1vfU0Gas=</Y><J>+UPMvUPq9Fo6Q1fr2oEYDxfGMMtfdoQmVBxI+TkUYQsReodRzBbnvGV1uPLWTpKKd/uJNUHO/QGb05Cvc6u49/AToDJIyi4e01hTLNCzeQk/Hj19gowb5wkTIjyaH04VyPE5zYoTYfuu3Y3Q</J><Seed>+cvoO7bzdpAwAjnDDApPzBCl6zg=</Seed><PgenCounter>ATM=</PgenCounter></DSAKeyValue></KeyValue>";
            XmlDocument doc    = new XmlDocument();

            doc.LoadXml(dsaKey);

            DSAKeyValue dsa1 = new DSAKeyValue();

            dsa1.LoadXml(doc.DocumentElement);

            string s = (dsa1.GetXml().OuterXml);

            Assert.AreEqual(dsaKey, s, "DSA Key");
        }
        /// <summary>
        /// Verify the given document using a KeyInfo instance. The KeyInfo instance's KeyClauses will be traversed for
        /// elements that can verify the signature, eg. certificates or keys. If nothing is found, an exception is thrown.
        /// </summary>
        public static bool CheckSignature(XmlDocument doc, KeyInfo keyinfo)
        {
            CheckDocument(doc);
            SignedXml signedXml = RetrieveSignature(doc);

            AsymmetricAlgorithm alg  = null;
            X509Certificate2    cert = null;

            foreach (KeyInfoClause clause in keyinfo)
            {
                if (clause is RSAKeyValue)
                {
                    RSAKeyValue key = (RSAKeyValue)clause;
                    alg = key.Key;
                    break;
                }
                else if (clause is KeyInfoX509Data)
                {
                    KeyInfoX509Data x509data = (KeyInfoX509Data)clause;
                    int             count    = x509data.Certificates.Count;
                    cert = (X509Certificate2)x509data.Certificates[count - 1];
                }
                else if (clause is DSAKeyValue)
                {
                    DSAKeyValue key = (DSAKeyValue)clause;
                    alg = key.Key;
                    break;
                }
            }

            if (alg == null && cert == null)
            {
                throw new InvalidOperationException("Unable to locate the key or certificate to verify the signature.");
            }

            if (alg != null)
            {
                return(signedXml.CheckSignature(alg));
            }
            else
            {
                return(signedXml.CheckSignature(cert, true));
            }
        }
Exemple #15
0
        public void GenerateKey()
        {
            DSAKeyValue dsa1 = new DSAKeyValue();

            Assert.IsNotNull(dsa1.Key, "Key");
            XmlElement xmlkey = dsa1.GetXml();

            DSAKeyValue dsa2 = new DSAKeyValue();

            dsa2.LoadXml(xmlkey);

            Assert.IsTrue((dsa1.GetXml().OuterXml) == (dsa2.GetXml().OuterXml), "dsa1==dsa2");

            DSA         key  = dsa1.Key;
            DSAKeyValue dsa3 = new DSAKeyValue(key);

            Assert.IsTrue((dsa3.GetXml().OuterXml) == (dsa1.GetXml().OuterXml), "dsa3==dsa1");
            Assert.IsTrue((dsa3.GetXml().OuterXml) == (dsa2.GetXml().OuterXml), "dsa3==dsa2");
        }
Exemple #16
0
        public void DSAKeyValue()
        {
            var key = new DsaPublicKeyParameters(y: new BigInteger(1, Convert.FromBase64String(dsaY)),
                                                 parameters: new DsaParameters(
                                                     p: new BigInteger(1, Convert.FromBase64String(dsaP)),
                                                     q: new BigInteger(1, Convert.FromBase64String(dsaQ)),
                                                     g: new BigInteger(1, Convert.FromBase64String(dsaG))
                                                     ));
            //J = Convert.FromBase64String(dsaJ),
            //Seed = Convert.FromBase64String(dsaSeed),
            //Counter = BitConverter.ToUInt16(Convert.FromBase64String(dsaPgenCounter), 0)

            DSAKeyValue dsa = new DSAKeyValue(key);

            info.AddClause(dsa);
            AssertCrypto.AssertXmlEquals("dsa",
                                         "<KeyInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><KeyValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" +
                                         xmlDSA + "</KeyValue></KeyInfo>", (info.GetXml().OuterXml));
            Assert.Equal(1, info.Count);
        }
        /// <summary>
        /// Attempts to retrieve an asymmetric key from the KeyInfoClause given as parameter.
        /// </summary>
        /// <param name="keyInfoClause"></param>
        /// <returns>null if the key could not be found.</returns>
        public static AsymmetricAlgorithm ExtractKey(KeyInfoClause keyInfoClause)
        {
            if (keyInfoClause is RSAKeyValue)
            {
                RSAKeyValue key = (RSAKeyValue)keyInfoClause;
                return(key.Key);
            }
            else if (keyInfoClause is KeyInfoX509Data)
            {
                X509Certificate2 cert = GetCertificateFromKeyInfo((KeyInfoX509Data)keyInfoClause);

                return(cert != null ? cert.PublicKey.Key : null);
            }
            else if (keyInfoClause is DSAKeyValue)
            {
                DSAKeyValue key = (DSAKeyValue)keyInfoClause;
                return(key.Key);
            }

            return(null);
        }
Exemple #18
0
 public void DSAKeyValue()
 {
     using (DSA key = DSA.Create())
     {
         key.ImportParameters(new DSAParameters {
             P = Convert.FromBase64String(dsaP),
             Q = Convert.FromBase64String(dsaQ),
             G = Convert.FromBase64String(dsaG),
             Y = Convert.FromBase64String(dsaY),
             //J = Convert.FromBase64String(dsaJ),
             //Seed = Convert.FromBase64String(dsaSeed),
             //Counter = BitConverter.ToUInt16(Convert.FromBase64String(dsaPgenCounter), 0)
         });
         DSAKeyValue dsa = new DSAKeyValue(key);
         info.AddClause(dsa);
         AssertCrypto.AssertXmlEquals("dsa",
                                      "<KeyInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><KeyValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" +
                                      xmlDSA + "</KeyValue></KeyInfo>", (info.GetXml().OuterXml));
         Assert.Equal(1, info.Count);
     }
 }
Exemple #19
0
        public void LoadXml_Null()
        {
            DSAKeyValue dsa1 = new DSAKeyValue();

            Assert.Throws <ArgumentNullException>(() => dsa1.LoadXml(null));
        }
Exemple #20
0
        public void Ctor_Empty()
        {
            DSAKeyValue dsaKeyValue = new DSAKeyValue();

            Assert.NotNull(dsaKeyValue.Key);
        }