Esempio n. 1
0
        public void TestMultipartSignedSignUsingKeys()
        {
            var body = new TextPart("plain")
            {
                Text = "This is some cleartext that we'll end up signing..."
            };
            var          self = new SecureMailboxAddress("MimeKit UnitTests", "*****@*****.**", "44CD48EEC90D8849961F36BA50DCD107AB0821A2");
            PgpSecretKey signer;

            using (var ctx = new DummyOpenPgpContext()) {
                signer = ctx.GetSigningKey(self);

                foreach (DigestAlgorithm digest in Enum.GetValues(typeof(DigestAlgorithm)))
                {
                    if (digest == DigestAlgorithm.None ||
                        digest == DigestAlgorithm.DoubleSha ||
                        digest == DigestAlgorithm.Tiger192 ||
                        digest == DigestAlgorithm.Haval5160 ||
                        digest == DigestAlgorithm.MD4)
                    {
                        continue;
                    }

                    var multipart = MultipartSigned.Create(signer, digest, body);

                    Assert.AreEqual(2, multipart.Count, "The multipart/signed has an unexpected number of children.");

                    var protocol = multipart.ContentType.Parameters["protocol"];
                    Assert.AreEqual("application/pgp-signature", protocol, "The multipart/signed protocol does not match.");

                    var micalg    = multipart.ContentType.Parameters["micalg"];
                    var algorithm = ctx.GetDigestAlgorithm(micalg);

                    Assert.AreEqual(digest, algorithm, "The multipart/signed micalg does not match.");

                    Assert.IsInstanceOf <TextPart> (multipart[0], "The first child is not a text part.");
                    Assert.IsInstanceOf <ApplicationPgpSignature> (multipart[1], "The second child is not a detached signature.");

                    var signatures = multipart.Verify();
                    Assert.AreEqual(1, signatures.Count, "Verify returned an unexpected number of signatures.");
                    foreach (var signature in signatures)
                    {
                        try {
                            bool valid = signature.Verify();

                            Assert.IsTrue(valid, "Bad signature from {0}", signature.SignerCertificate.Email);
                        } catch (DigitalSignatureVerifyException ex) {
                            Assert.Fail("Failed to verify signature: {0}", ex);
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        public void TestAlgorithmMappings()
        {
            using (var ctx = new DummyOpenPgpContext()) {
                foreach (DigestAlgorithm digest in Enum.GetValues(typeof(DigestAlgorithm)))
                {
                    if (digest == DigestAlgorithm.None || digest == DigestAlgorithm.DoubleSha)
                    {
                        continue;
                    }

                    var name = ctx.GetDigestAlgorithmName(digest);
                    var algo = ctx.GetDigestAlgorithm(name);

                    Assert.AreEqual(digest, algo);
                }

                Assert.AreEqual(DigestAlgorithm.MD5, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.MD5));
                Assert.AreEqual(DigestAlgorithm.Sha1, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.Sha1));
                Assert.AreEqual(DigestAlgorithm.RipeMD160, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.RipeMD160));
                Assert.AreEqual(DigestAlgorithm.DoubleSha, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.DoubleSha));
                Assert.AreEqual(DigestAlgorithm.MD2, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.MD2));
                Assert.AreEqual(DigestAlgorithm.Tiger192, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.Tiger192));
                Assert.AreEqual(DigestAlgorithm.Haval5160, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.Haval5pass160));
                Assert.AreEqual(DigestAlgorithm.Sha256, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.Sha256));
                Assert.AreEqual(DigestAlgorithm.Sha384, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.Sha384));
                Assert.AreEqual(DigestAlgorithm.Sha512, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.Sha512));
                Assert.AreEqual(DigestAlgorithm.Sha224, OpenPgpContext.GetDigestAlgorithm(Org.BouncyCastle.Bcpg.HashAlgorithmTag.Sha224));

                Assert.AreEqual(PublicKeyAlgorithm.RsaGeneral, OpenPgpContext.GetPublicKeyAlgorithm(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag.RsaGeneral));
                Assert.AreEqual(PublicKeyAlgorithm.RsaEncrypt, OpenPgpContext.GetPublicKeyAlgorithm(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag.RsaEncrypt));
                Assert.AreEqual(PublicKeyAlgorithm.RsaSign, OpenPgpContext.GetPublicKeyAlgorithm(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag.RsaSign));
                Assert.AreEqual(PublicKeyAlgorithm.ElGamalGeneral, OpenPgpContext.GetPublicKeyAlgorithm(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag.ElGamalGeneral));
                Assert.AreEqual(PublicKeyAlgorithm.ElGamalEncrypt, OpenPgpContext.GetPublicKeyAlgorithm(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag.ElGamalEncrypt));
                Assert.AreEqual(PublicKeyAlgorithm.Dsa, OpenPgpContext.GetPublicKeyAlgorithm(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag.Dsa));
                Assert.AreEqual(PublicKeyAlgorithm.EllipticCurve, OpenPgpContext.GetPublicKeyAlgorithm(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag.ECDH));
                Assert.AreEqual(PublicKeyAlgorithm.EllipticCurveDsa, OpenPgpContext.GetPublicKeyAlgorithm(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag.ECDsa));
                Assert.AreEqual(PublicKeyAlgorithm.DiffieHellman, OpenPgpContext.GetPublicKeyAlgorithm(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag.DiffieHellman));
                //Assert.AreEqual (PublicKeyAlgorithm.EdwardsCurveDsa, OpenPgpContext.GetPublicKeyAlgorithm (Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag.EdDSA));
            }
        }
Esempio n. 3
0
        public void TestArgumentExceptions()
        {
            Assert.Throws <ArgumentNullException> (() => CryptographyContext.Create(null));
            Assert.Throws <ArgumentNullException> (() => CryptographyContext.Register((Type)null));
            Assert.Throws <ArgumentNullException> (() => CryptographyContext.Register((Func <OpenPgpContext>)null));
            Assert.Throws <ArgumentNullException> (() => CryptographyContext.Register((Func <SecureMimeContext>)null));

            using (var ctx = new DummyOpenPgpContext()) {
                var mailboxes      = new [] { new MailboxAddress("MimeKit UnitTests", "*****@*****.**") };
                var emptyMailboxes = new MailboxAddress[0];
                var pubkeys        = ctx.GetPublicKeys(mailboxes);
                var key            = ctx.GetSigningKey(mailboxes[0]);
                var emptyPubkeys   = new PgpPublicKey[0];
                var stream         = new MemoryStream();

                Assert.Throws <ArgumentException> (() => ctx.KeyServer = new Uri("relative/uri", UriKind.Relative));

                Assert.Throws <ArgumentNullException> (() => ctx.GetDigestAlgorithm(null));
                Assert.Throws <ArgumentOutOfRangeException> (() => ctx.GetDigestAlgorithmName(DigestAlgorithm.DoubleSha));
                Assert.Throws <NotSupportedException> (() => OpenPgpContext.GetHashAlgorithm(DigestAlgorithm.DoubleSha));
                Assert.Throws <NotSupportedException> (() => OpenPgpContext.GetHashAlgorithm(DigestAlgorithm.Tiger192));
                Assert.Throws <NotSupportedException> (() => OpenPgpContext.GetHashAlgorithm(DigestAlgorithm.Haval5160));
                Assert.Throws <NotSupportedException> (() => OpenPgpContext.GetHashAlgorithm(DigestAlgorithm.MD4));
                Assert.Throws <ArgumentOutOfRangeException> (() => OpenPgpContext.GetDigestAlgorithm((Org.BouncyCastle.Bcpg.HashAlgorithmTag) 1024));

                Assert.Throws <ArgumentNullException> (() => new ApplicationPgpEncrypted((MimeEntityConstructorArgs)null));
                Assert.Throws <ArgumentNullException> (() => new ApplicationPgpSignature((MimeEntityConstructorArgs)null));
                Assert.Throws <ArgumentNullException> (() => new ApplicationPgpSignature((Stream)null));

                // Accept
                Assert.Throws <ArgumentNullException> (() => new ApplicationPgpEncrypted().Accept(null));
                Assert.Throws <ArgumentNullException> (() => new ApplicationPgpSignature(stream).Accept(null));

                // Decrypt
                Assert.Throws <ArgumentNullException> (() => ctx.Decrypt(null), "Decrypt");

                // Encrypt
                Assert.Throws <ArgumentNullException> (() => ctx.Encrypt(EncryptionAlgorithm.Cast5, (MailboxAddress[])null, stream), "Encrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.Encrypt(EncryptionAlgorithm.Cast5, (PgpPublicKey[])null, stream), "Encrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.Encrypt((MailboxAddress[])null, stream), "Encrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.Encrypt((PgpPublicKey[])null, stream), "Encrypt");
                Assert.Throws <ArgumentException> (() => ctx.Encrypt(EncryptionAlgorithm.Cast5, emptyMailboxes, stream), "Encrypt");
                Assert.Throws <ArgumentException> (() => ctx.Encrypt(EncryptionAlgorithm.Cast5, emptyPubkeys, stream), "Encrypt");
                Assert.Throws <ArgumentException> (() => ctx.Encrypt(emptyMailboxes, stream), "Encrypt");
                Assert.Throws <ArgumentException> (() => ctx.Encrypt(emptyPubkeys, stream), "Encrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.Encrypt(EncryptionAlgorithm.Cast5, mailboxes, null), "Encrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.Encrypt(EncryptionAlgorithm.Cast5, pubkeys, null), "Encrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.Encrypt(mailboxes, null), "Encrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.Encrypt(pubkeys, null), "Encrypt");

                // Export
                Assert.Throws <ArgumentNullException> (() => ctx.Export((PgpPublicKeyRingBundle)null), "Export");
                Assert.Throws <ArgumentNullException> (() => ctx.Export((MailboxAddress[])null), "Export");
                Assert.Throws <ArgumentNullException> (() => ctx.Export((PgpPublicKey[])null), "Export");

                // GetDecryptedStream
                Assert.Throws <ArgumentNullException> (() => ctx.GetDecryptedStream(null), "GetDecryptedStream");

                // GetDigestAlgorithmName
                Assert.Throws <ArgumentOutOfRangeException> (() => ctx.GetDigestAlgorithmName(DigestAlgorithm.None), "GetDigestAlgorithmName");

                // Import
                Assert.Throws <ArgumentNullException> (() => ctx.Import((Stream)null), "Import");
                Assert.Throws <ArgumentNullException> (() => ctx.Import((PgpPublicKeyRing)null), "Import");
                Assert.Throws <ArgumentNullException> (() => ctx.Import((PgpPublicKeyRingBundle)null), "Import");
                Assert.Throws <ArgumentNullException> (() => ctx.Import((PgpSecretKeyRing)null), "Import");
                Assert.Throws <ArgumentNullException> (() => ctx.Import((PgpSecretKeyRingBundle)null), "Import");

                // ImportSecretKeys
                Assert.Throws <ArgumentNullException> (() => ctx.ImportSecretKeys(null), "ImportSecretKeys");

                // Sign
                Assert.Throws <ArgumentNullException> (() => ctx.Sign((MailboxAddress)null, DigestAlgorithm.Sha1, stream), "Sign");
                Assert.Throws <ArgumentNullException> (() => ctx.Sign((PgpSecretKey)null, DigestAlgorithm.Sha1, stream), "Sign");
                Assert.Throws <ArgumentNullException> (() => ctx.Sign(mailboxes[0], DigestAlgorithm.Sha1, null), "Sign");
                Assert.Throws <ArgumentNullException> (() => ctx.Sign(key, DigestAlgorithm.Sha1, null), "Sign");

                // SignAndEncrypt
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt((MailboxAddress)null, DigestAlgorithm.Sha1, EncryptionAlgorithm.Cast5, mailboxes, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt((PgpSecretKey)null, DigestAlgorithm.Sha1, EncryptionAlgorithm.Cast5, pubkeys, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt(mailboxes[0], DigestAlgorithm.Sha1, EncryptionAlgorithm.Cast5, (MailboxAddress[])null, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt(key, DigestAlgorithm.Sha1, EncryptionAlgorithm.Cast5, (PgpPublicKey[])null, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentException> (() => ctx.SignAndEncrypt(mailboxes[0], DigestAlgorithm.Sha1, EncryptionAlgorithm.Cast5, emptyMailboxes, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentException> (() => ctx.SignAndEncrypt(key, DigestAlgorithm.Sha1, EncryptionAlgorithm.Cast5, emptyPubkeys, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt(mailboxes[0], DigestAlgorithm.Sha1, EncryptionAlgorithm.Cast5, mailboxes, null), "SignAndEncrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt(key, DigestAlgorithm.Sha1, EncryptionAlgorithm.Cast5, pubkeys, null), "SignAndEncrypt");

                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt((MailboxAddress)null, DigestAlgorithm.Sha1, mailboxes, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt((PgpSecretKey)null, DigestAlgorithm.Sha1, pubkeys, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt(mailboxes[0], DigestAlgorithm.Sha1, (MailboxAddress[])null, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt(key, DigestAlgorithm.Sha1, (PgpPublicKey[])null, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentException> (() => ctx.SignAndEncrypt(mailboxes[0], DigestAlgorithm.Sha1, emptyMailboxes, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentException> (() => ctx.SignAndEncrypt(key, DigestAlgorithm.Sha1, emptyPubkeys, stream), "SignAndEncrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt(mailboxes[0], DigestAlgorithm.Sha1, mailboxes, null), "SignAndEncrypt");
                Assert.Throws <ArgumentNullException> (() => ctx.SignAndEncrypt(key, DigestAlgorithm.Sha1, pubkeys, null), "SignAndEncrypt");

                // Supports
                Assert.Throws <ArgumentNullException> (() => ctx.Supports(null), "Supports");

                // Verify
                Assert.Throws <ArgumentNullException> (() => ctx.Verify(null, stream), "Verify");
                Assert.Throws <ArgumentNullException> (() => ctx.Verify(stream, null), "Verify");
            }
        }
Esempio n. 4
0
		public void TestMultipartSignedSignUsingKeys ()
		{
			var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." };
			var self = new SecureMailboxAddress ("MimeKit UnitTests", "*****@*****.**", "44CD48EEC90D8849961F36BA50DCD107AB0821A2");
			PgpSecretKey signer;

			using (var ctx = new DummyOpenPgpContext ()) {
				signer = ctx.GetSigningKey (self);

				foreach (DigestAlgorithm digest in Enum.GetValues (typeof (DigestAlgorithm))) {
					if (digest == DigestAlgorithm.None ||
						digest == DigestAlgorithm.DoubleSha ||
						digest == DigestAlgorithm.Tiger192 ||
						digest == DigestAlgorithm.Haval5160 ||
						digest == DigestAlgorithm.MD4)
						continue;

					var multipart = MultipartSigned.Create (signer, digest, body);

					Assert.AreEqual (2, multipart.Count, "The multipart/signed has an unexpected number of children.");

					var protocol = multipart.ContentType.Parameters["protocol"];
					Assert.AreEqual ("application/pgp-signature", protocol, "The multipart/signed protocol does not match.");

					var micalg = multipart.ContentType.Parameters["micalg"];
					var algorithm = ctx.GetDigestAlgorithm (micalg);

					Assert.AreEqual (digest, algorithm, "The multipart/signed micalg does not match.");

					Assert.IsInstanceOf<TextPart> (multipart[0], "The first child is not a text part.");
					Assert.IsInstanceOf<ApplicationPgpSignature> (multipart[1], "The second child is not a detached signature.");

					var signatures = multipart.Verify ();
					Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures.");
					foreach (var signature in signatures) {
						try {
							bool valid = signature.Verify ();

							Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email);
						} catch (DigitalSignatureVerifyException ex) {
							Assert.Fail ("Failed to verify signature: {0}", ex);
						}
					}
				}
			}
		}