Exemple #1
0
        public string SignText(string strMessage, ulong lSignatureKeyID, string strPassphrase)
        {
            SignaturePacket spSign = new SignaturePacket();

            strMessage = Radix64.TrimMessage(strMessage);

            TransportableSecretKey tskKey = skrKeyRing.Find(lSignatureKeyID);
            SecretKeyPacket        skpKey = tskKey.FindKey(AsymActions.Sign);

            spSign.HashAlgorithm      = HashAlgorithms.SHA1;
            spSign.Format             = PacketFormats.New;
            spSign.KeyID              = skpKey.PublicKey.KeyID;
            spSign.TimeCreated        = DateTime.Now;
            spSign.SignatureAlgorithm = skpKey.PublicKey.Algorithm;
            spSign.SignatureType      = SignatureTypes.TextSignature;
            spSign.Version            = SignaturePacketVersionNumbers.v4;

            byte[] bMessage = System.Text.Encoding.UTF8.GetBytes(strMessage);
            spSign.Sign(bMessage, skpKey, strPassphrase);
            byte[] bSignature   = spSign.Generate();
            string strSignature = Radix64.Encode(bSignature, true);
            string strFinal     = Armor.WrapCleartextSignature(strMessage, strSignature);

            return(strFinal);
        }
Exemple #2
0
 internal PgpSignature(
     SignaturePacket sigPacket,
     TrustPacket trustPacket)
     : this(sigPacket)
 {
     this.trustPck = trustPacket;
 }
        /// <summary>
        /// Creates a new Certification for the UserID.
        /// </summary>
        /// <param name="spSignature">A signaturepacket that has been
        /// prepared for being signed. Things like signature subpackets
        /// MUST already be in place. Only the signature type is
        /// automatically set to UserIDCertification.</param>
        /// <param name="skpKey">A secret key that is used to signed the
        /// certification.</param>
        /// <param name="strPassphrase">The passphrase that fits to the
        /// given secret key packet.</param>
        /// <param name="pkpKey">The public key to which the userid that
        /// is to be signed belongs.</param>
        public void Sign(SignaturePacket spSignature, SecretKeyPacket skpKey, string strPassphrase, PublicKeyPacket pkpKey)
        {
            if (spSignature.Version == SignaturePacketVersionNumbers.v4)
            {
                byte[] bKey = new byte[pkpKey.Body.Length + 3];
                bKey[0] = 0x99;
                bKey[1] = (byte)((pkpKey.Body.Length >> 8) & 0xFF);
                bKey[2] = (byte)(pkpKey.Body.Length & 0xFF);
                Array.Copy(pkpKey.Body, 0, bKey, 3, pkpKey.Body.Length);

                byte[] bUserID = new byte[UserID.Body.Length + 5];
                bUserID[0] = 0xb4;
                bUserID[1] = (byte)((UserID.Body.Length >> 24) & 0xFF);
                bUserID[2] = (byte)((UserID.Body.Length >> 16) & 0xFF);
                bUserID[3] = (byte)((UserID.Body.Length >> 8) & 0xFF);
                bUserID[4] = (byte)(UserID.Body.Length & 0xFF);
                Array.Copy(UserID.Body, 0, bUserID, 5, UserID.Body.Length);

                byte[] bData = new byte[bUserID.Length + bKey.Length];
                Array.Copy(bKey, 0, bData, 0, bKey.Length);
                Array.Copy(bUserID, 0, bData, bKey.Length, bUserID.Length);

                spSignature.SignatureType = SignatureTypes.UserIDSignature;
                spSignature.Sign(bData, skpKey, strPassphrase);
                this.alCertificates.Add(spSignature);
            }
            else
            {
                throw new System.NotImplementedException("Only v4 signatures are supported so far!");
            }
        }
Exemple #4
0
 internal PgpSignature(
     SignaturePacket sigPacket)
 {
     sigPck        = sigPacket;
     signatureType = sigPck.SignatureType;
     trustPck      = null;
 }
Exemple #5
0
        public void SignKeyBindingSignature(PublicKeyPacket pkpPrimaryKey, SecretKeyPacket skpPrimaryKey, string strPassphrase)
        {
            byte[] bSubKey = new byte[pkpSubkey.Body.Length + 3];
            bSubKey[0] = 0x99;
            bSubKey[1] = (byte)((pkpSubkey.Body.Length >> 8) & 0xFF);
            bSubKey[2] = (byte)(pkpSubkey.Body.Length & 0xFF);
            Array.Copy(pkpSubkey.Body, 0, bSubKey, 3, pkpSubkey.Body.Length);

            byte[] bPrimaryKey = new byte[pkpPrimaryKey.Body.Length + 3];
            bPrimaryKey[0] = 0x99;
            bPrimaryKey[1] = (byte)((pkpPrimaryKey.Body.Length >> 8) & 0xFF);
            bPrimaryKey[2] = (byte)(pkpPrimaryKey.Body.Length & 0xFF);
            Array.Copy(pkpPrimaryKey.Body, 0, bPrimaryKey, 3, pkpPrimaryKey.Body.Length);

            byte[] bData = new byte[bPrimaryKey.Length + bSubKey.Length];
            Array.Copy(bSubKey, 0, bData, 0, bSubKey.Length);
            Array.Copy(bPrimaryKey, 0, bData, bSubKey.Length, bPrimaryKey.Length);

            SignaturePacket spKeyBindingSig = new SignaturePacket();

            spKeyBindingSig.Version       = SignaturePacketVersionNumbers.v4;
            spKeyBindingSig.HashAlgorithm = HashAlgorithms.SHA1;
            spKeyBindingSig.KeyID         = pkpPrimaryKey.KeyID;
            spKeyBindingSig.SignatureType = SignatureTypes.SubkeyBindingSignature;

            spKeyBindingSig.Sign(bData, skpPrimaryKey, strPassphrase);
            this.KeyBindingSignature = spKeyBindingSig;
        }
Exemple #6
0
        private protected PgpKey(IPacketReader packetReader, KeyPacket keyPacket, bool subKey)
            : this(keyPacket)
        {
            // Ignore GPG comment packets if found.
            while (packetReader.NextPacketTag() == PacketTag.Experimental2)
            {
                packetReader.ReadContainedPacket();
            }

            this.trustPacket = packetReader.NextPacketTag() == PacketTag.Trust ? (TrustPacket)packetReader.ReadContainedPacket() : null;

            while (packetReader.NextPacketTag() == PacketTag.Signature)
            {
                SignaturePacket signaturePacket      = (SignaturePacket)packetReader.ReadContainedPacket();
                TrustPacket?    signatureTrustPacket = packetReader.NextPacketTag() == PacketTag.Trust ? (TrustPacket)packetReader.ReadContainedPacket() : null;
                var             signature            = new PgpSignature(signaturePacket, signatureTrustPacket);
                this.keyCertifications.Add(new PgpCertification(signature, null, this));
            }

            if (!subKey)
            {
                while (packetReader.NextPacketTag() == PacketTag.UserId ||
                       packetReader.NextPacketTag() == PacketTag.UserAttribute)
                {
                    ids.Add(new PgpUser(packetReader, this));
                }
            }
        }
Exemple #7
0
        public static string ClearTextSign(string strMessage, SecretKeyRing skrKeyRing)
        {
            SignaturePacket spSign = new SignaturePacket();

            strMessage = Radix64.TrimMessage(strMessage);
            QueryPassphrase qpPassphrase = new QueryPassphrase();

            qpPassphrase.ShowMyDialog(skrKeyRing);
            string strPassphrase          = qpPassphrase.Passphrase;
            TransportableSecretKey tskKey = qpPassphrase.SelectedKey;
            SecretKeyPacket        skpKey = tskKey.FindKey(AsymActions.Sign);

            Working wWorking = new Working();

            wWorking.Show();

            spSign.HashAlgorithm = HashAlgorithms.SHA1;
            spSign.Format        = PacketFormats.New;

            wWorking.Progress(10);

            SignatureSubPacket sspCreator = new SignatureSubPacket();

            sspCreator.Type  = SignatureSubPacketTypes.IssuerKeyID;
            sspCreator.KeyID = skpKey.PublicKey.KeyID;
            SignatureSubPacket sspCreationTime = new SignatureSubPacket();

            sspCreationTime.Type        = SignatureSubPacketTypes.SignatureCreationTime;
            sspCreationTime.TimeCreated = DateTime.Now;
            spSign.HashedSubPackets     = new SignatureSubPacket[2];
            spSign.HashedSubPackets[0]  = sspCreator;
            spSign.HashedSubPackets[1]  = sspCreationTime;

            wWorking.Progress(20);

            //spSign.KeyID = skpKey.PublicKey.KeyID;
            //spSign.TimeCreated = DateTime.Now;
            spSign.SignatureAlgorithm = skpKey.PublicKey.Algorithm;
            spSign.SignatureType      = SignatureTypes.TextSignature;
            spSign.Version            = SignaturePacketVersionNumbers.v4;

            wWorking.Progress(10);

            byte[] bMessage = System.Text.Encoding.UTF8.GetBytes(strMessage);
            spSign.Sign(bMessage, skpKey, strPassphrase);

            wWorking.Progress(40);
            byte[] bSignature = spSign.Generate();

            string strSignature = Radix64.Encode(bSignature, true);

            wWorking.Progress(20);

            string strFinal = Armor.WrapCleartextSignature(strMessage, strSignature);

            wWorking.Hide();

            return(strFinal);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="PgpSignature"/> class.
        /// </summary>
        /// <param name="sigPacket">The sig packet.</param>
        /// <param name="trustPacket">The trust packet.</param>
        /// <exception cref="System.ArgumentNullException">sigPacket</exception>
        internal PgpSignature(SignaturePacket sigPacket, ITrustPacket trustPacket)
        {
            if (sigPacket == null)
                throw new ArgumentNullException("sigPacket");

            _sigPck = sigPacket;
            _signatureType = _sigPck.SignatureType;
            _trustPck = trustPacket;
        }
Exemple #9
0
        public PgpSignature(Stream detachedSignature)
        {
            var packetReader = new PacketReader(detachedSignature);

            if (packetReader.NextPacketTag() != PacketTag.Signature)
            {
                throw new PgpUnexpectedPacketException();
            }
            this.sigPck = (SignaturePacket)packetReader.ReadContainedPacket();
        }
Exemple #10
0
        internal PgpSignature(SignaturePacket sigPacket, TrustPacket?trustPacket)
        {
            if (sigPacket == null)
            {
                throw new ArgumentNullException(nameof(sigPacket));
            }

            this.sigPck   = sigPacket;
            this.trustPck = trustPacket;
        }
 internal PgpSignature(SignaturePacket sigPacket, TrustPacket trustPacket)
 {
     if (sigPacket == null)
     {
         throw new ArgumentNullException("sigPacket");
     }
     sigPck        = sigPacket;
     signatureType = sigPck.SignatureType;
     trustPck      = trustPacket;
 }
        public static string ClearTextSign(string strMessage, SecretKeyRing skrKeyRing)
        {
            SignaturePacket spSign = new SignaturePacket();

            strMessage = Radix64.TrimMessage(strMessage);
            QueryPassphrase qpPassphrase = new QueryPassphrase();
            qpPassphrase.ShowMyDialog(skrKeyRing);
            string strPassphrase = qpPassphrase.Passphrase;
            TransportableSecretKey tskKey = qpPassphrase.SelectedKey;
            SecretKeyPacket skpKey = tskKey.FindKey(AsymActions.Sign);

            Working wWorking = new Working();
            wWorking.Show();

            spSign.HashAlgorithm = HashAlgorithms.SHA1;
            spSign.Format = PacketFormats.New;

            wWorking.Progress(10);

            SignatureSubPacket sspCreator = new SignatureSubPacket();
            sspCreator.Type = SignatureSubPacketTypes.IssuerKeyID;
            sspCreator.KeyID = skpKey.PublicKey.KeyID;
            SignatureSubPacket sspCreationTime = new SignatureSubPacket();
            sspCreationTime.Type = SignatureSubPacketTypes.SignatureCreationTime;
            sspCreationTime.TimeCreated = DateTime.Now;
            spSign.HashedSubPackets = new SignatureSubPacket[2];
            spSign.HashedSubPackets[0] = sspCreator;
            spSign.HashedSubPackets[1] = sspCreationTime;

            wWorking.Progress(20);

            //spSign.KeyID = skpKey.PublicKey.KeyID;
            //spSign.TimeCreated = DateTime.Now;
            spSign.SignatureAlgorithm = skpKey.PublicKey.Algorithm;
            spSign.SignatureType = SignatureTypes.TextSignature;
            spSign.Version = SignaturePacketVersionNumbers.v4;

            wWorking.Progress(10);

            byte[] bMessage = System.Text.Encoding.UTF8.GetBytes(strMessage);
            spSign.Sign(bMessage, skpKey, strPassphrase);

            wWorking.Progress(40);
            byte[] bSignature = spSign.Generate();

            string strSignature = Radix64.Encode(bSignature, true);

            wWorking.Progress(20);

            string strFinal = Armor.WrapCleartextSignature(strMessage, strSignature);

            wWorking.Hide();

            return strFinal;
        }
Exemple #13
0
        private string FindPrimaryUserID()
        {
            string      strReturn      = "";
            int         nUserIDCounter = 0;
            IEnumerator ieCertificates = this.alCertifications.GetEnumerator();

            while (ieCertificates.MoveNext())
            {
                if (!(ieCertificates.Current is CertifiedUserID))
                {
                    continue;
                }

                nUserIDCounter++;
                CertifiedUserID cuiID        = (CertifiedUserID)ieCertificates.Current;
                IEnumerator     ieSignatures = cuiID.Certificates.GetEnumerator();
                while (ieSignatures.MoveNext())
                {
                    if (!(ieSignatures.Current is SignaturePacket))
                    {
                        continue;
                    }

                    SignaturePacket spCertificate = (SignaturePacket)ieSignatures.Current;

                    // look only at selfsignatures
                    if (spCertificate.KeyID != this.PrimaryKey.KeyID)
                    {
                        continue;
                    }

                    if (nUserIDCounter == 1)
                    {
                        strReturn = cuiID.UserID.UserID;
                    }
                    for (int i = 0; i < spCertificate.UnhashedSubPackets.Length; i++)
                    {
                        if ((spCertificate.UnhashedSubPackets[i].Type == SignatureSubPacketTypes.PrimaryUserID) && (spCertificate.UnhashedSubPackets[i].PrimaryUserID))
                        {
                            strReturn = cuiID.UserID.UserID;
                        }
                    }
                    for (int i = 0; i < spCertificate.HashedSubPackets.Length; i++)
                    {
                        if ((spCertificate.HashedSubPackets[i].Type == SignatureSubPacketTypes.PrimaryUserID) && (spCertificate.HashedSubPackets[i].PrimaryUserID))
                        {
                            strReturn = cuiID.UserID.UserID;
                        }
                    }
                }
            }

            return(strReturn);
        }
 internal PgpSignature(SignaturePacket sigPacket, TrustPacket trustPacket)
 {
     //IL_000e: Unknown result type (might be due to invalid IL or missing references)
     if (sigPacket == null)
     {
         throw new ArgumentNullException("sigPacket");
     }
     sigPck        = sigPacket;
     signatureType = sigPck.SignatureType;
     trustPck      = trustPacket;
 }
Exemple #15
0
        /// <summary>
        /// Parses a signed message out of the given array of packets.
        /// In this special case, the first packet must be a signature
        /// packet or a one-pass signature packet. This is followed by
        /// an OpenPGP message and optionally (if the first packet was
        /// a one-pass signature packet) and ordinary signature packet.
        /// </summary>
        /// <returns>Returns the number of packets used by the function.
        /// </returns>
        /// <param name="packets">Array of packets that contains the
        /// signed message.</param>
        /// <remarks>No remarks</remarks>
        public override int ParseMessage(Packet[] packets)
        {
            if (packets[0] is OnePassSignaturePacket)
            {
                bOnePassSigned = true;
                opsOnePass     = (OnePassSignaturePacket)packets[0];
            }
            else if (packets[0] is SignaturePacket)
            {
                bOnePassSigned = false;
                spSignature    = (SignaturePacket)packets[0];
            }
            else
            {
                throw new System.ArgumentException("This does not appear to be a valid OpenPGP signed message!");
            }

            Packet[] pMessage = new Packet[packets.Length - 1];
            Array.Copy(packets, 1, pMessage, 0, pMessage.Length);
            lmSignedMessage = new LiteralMessage();
            int iPos = 0;

            try {
                iPos = lmSignedMessage.ParseMessage(pMessage);
            } catch (Exception) {}

            if (iPos == 0)
            {
                throw new System.ArgumentException("This does not appear to be a valid OpenPGP signed message!");
            }

            iPos++;
            if (bOnePassSigned)
            {
                if (packets[iPos] is SignaturePacket)
                {
                    spSignature = (SignaturePacket)packets[iPos];
                    iPos++;
                }
                else
                {
                    throw new System.ArgumentException("This does not appear to be a valid OpenPGP signed message!");
                }
            }

            return(iPos);
        }
        /// <summary>
        /// Validates all certificates belonging the the given public key packet
        /// and the current certifications.
        /// </summary>
        /// <remarks>
        /// So far only works with v4 signatures!
        /// </remarks>
        /// <param name="pkpKey">The public key packet to which the userid
        /// belongs.</param>
        /// <param name="pkrRing">A keyring containing all public keys known to
        /// the system. This is neccessary in order to verify the signatures.
        /// </param>
        public void Validate(PublicKeyPacket pkpKey, PublicKeyRing pkrRing)
        {
            IEnumerator ieCertificates = Certificates.GetEnumerator();

            while (ieCertificates.MoveNext())
            {
                if (ieCertificates.Current is SignaturePacket)
                {
                    SignaturePacket spCert = (SignaturePacket)ieCertificates.Current;

                    TransportablePublicKey tkpSigningKey = pkrRing.Find(spCert.KeyID);
                    if (tkpSigningKey == null)
                    {
                        continue;
                    }
                    PublicKeyPacket pkpSigningKey = tkpSigningKey.PrimaryKey;

                    if (spCert.Version == SignaturePacketVersionNumbers.v4)
                    {
                        byte[] bKey = new byte[pkpKey.Body.Length + 3];
                        bKey[0] = 0x99;
                        bKey[1] = (byte)((pkpKey.Body.Length >> 8) & 0xFF);
                        bKey[2] = (byte)(pkpKey.Body.Length & 0xFF);
                        Array.Copy(pkpKey.Body, 0, bKey, 3, pkpKey.Body.Length);

                        byte[] bUserID = new byte[UserID.Body.Length + 5];
                        bUserID[0] = 0xb4;
                        bUserID[1] = (byte)((UserID.Body.Length >> 24) & 0xFF);
                        bUserID[2] = (byte)((UserID.Body.Length >> 16) & 0xFF);
                        bUserID[3] = (byte)((UserID.Body.Length >> 8) & 0xFF);
                        bUserID[4] = (byte)(UserID.Body.Length & 0xFF);
                        Array.Copy(UserID.Body, 0, bUserID, 5, UserID.Body.Length);

                        byte[] bData = new byte[bUserID.Length + bKey.Length];
                        Array.Copy(bKey, 0, bData, 0, bKey.Length);
                        Array.Copy(bUserID, 0, bData, bKey.Length, bUserID.Length);

                        spCert.Verify(bData, pkpSigningKey);
                    }
                    else
                    {
                        //TODO: Add code for v3 Signature verification
                    }
                }
            }
        }
 internal static IList ReadSignaturesAndTrust(BcpgInputStream bcpgInput)
 {
     try
     {
         IList list = Platform.CreateArrayList();
         while (bcpgInput.NextPacketTag() == PacketTag.Signature)
         {
             SignaturePacket sigPacket   = (SignaturePacket)bcpgInput.ReadPacket();
             TrustPacket     trustPacket = ReadOptionalTrustPacket(bcpgInput);
             list.Add(new PgpSignature(sigPacket, trustPacket));
         }
         return(list);
     }
     catch (PgpException ex)
     {
         throw new IOException("can't create signature object: " + ex.Message, ex);
     }
 }
Exemple #18
0
 internal static global::System.Collections.IList ReadSignaturesAndTrust(BcpgInputStream bcpgInput)
 {
     //IL_0049: Unknown result type (might be due to invalid IL or missing references)
     try
     {
         global::System.Collections.IList list = Platform.CreateArrayList();
         while (bcpgInput.NextPacketTag() == PacketTag.Signature)
         {
             SignaturePacket sigPacket   = (SignaturePacket)bcpgInput.ReadPacket();
             TrustPacket     trustPacket = ReadOptionalTrustPacket(bcpgInput);
             list.Add((object)new PgpSignature(sigPacket, trustPacket));
         }
         return(list);
     }
     catch (PgpException ex)
     {
         throw new IOException("can't create signature object: " + ((global::System.Exception)ex).get_Message(), (global::System.Exception)ex);
     }
 }
        public PgpSignatureList GetEmbeddedSignatures()
        {
            SignatureSubpacket [] sigs = GetSubpackets(SignatureSubpacketTag.EmbeddedSignature);
            PgpSignature[]        l    = new PgpSignature[sigs.Length];

            for (int i = 0; i < sigs.Length; i++)
            {
                try
                {
                    l[i] = new PgpSignature(SignaturePacket.FromByteArray(sigs[i].GetData()));
                }
                catch (IOException e)
                {
                    throw new PgpException("Unable to parse signature packet: " + e.Message, e);
                }
            }

            return(new PgpSignatureList(l));
        }
Exemple #20
0
        public void SignKeyBindingSignature(PublicKeyPacket pkpPrimaryKey, SecretKeyPacket skpPrimaryKey, string strPassphrase, DateTime expirationTime, bool revocable)
        {
            byte[] bSubKey = new byte[pkpSubkey.Body.Length + 3];
            bSubKey[0] = 0x99;
            bSubKey[1] = (byte)((pkpSubkey.Body.Length >> 8) & 0xFF);
            bSubKey[2] = (byte)(pkpSubkey.Body.Length & 0xFF);
            Array.Copy(pkpSubkey.Body, 0, bSubKey, 3, pkpSubkey.Body.Length);

            byte[] bPrimaryKey = new byte[pkpPrimaryKey.Body.Length + 3];
            bPrimaryKey[0] = 0x99;
            bPrimaryKey[1] = (byte)((pkpPrimaryKey.Body.Length >> 8) & 0xFF);
            bPrimaryKey[2] = (byte)(pkpPrimaryKey.Body.Length & 0xFF);
            Array.Copy(pkpPrimaryKey.Body, 0, bPrimaryKey, 3, pkpPrimaryKey.Body.Length);

            byte[] bData = new byte[bPrimaryKey.Length + bSubKey.Length];
            Array.Copy(bPrimaryKey, 0, bData, 0, bPrimaryKey.Length);
            Array.Copy(bSubKey, 0, bData, bPrimaryKey.Length, bSubKey.Length);

            SignaturePacket spKeyBindingSig = new SignaturePacket();

            spKeyBindingSig.Version       = SignaturePacketVersionNumbers.v4;
            spKeyBindingSig.HashAlgorithm = HashAlgorithms.SHA1;
            spKeyBindingSig.KeyID         = pkpPrimaryKey.KeyID;
            spKeyBindingSig.SignatureType = SignatureTypes.SubkeyBindingSignature;
            if (expirationTime.Ticks != 0)
            {
                SignatureSubPacket sspExpiration = new SignatureSubPacket();
                sspExpiration.Type = SignatureSubPacketTypes.KeyExpirationTime;
                sspExpiration.KeyExpirationTime = new DateTime(expirationTime.Ticks + (new DateTime(1970, 1, 2)).Ticks - pkpPrimaryKey.TimeCreated.Ticks);
                spKeyBindingSig.AddSubPacket(sspExpiration, true);
            }
            if (!revocable)
            {
                SignatureSubPacket sspRevocable = new SignatureSubPacket();
                sspRevocable.Type      = SignatureSubPacketTypes.Revocable;
                sspRevocable.Revocable = revocable;
                spKeyBindingSig.AddSubPacket(sspRevocable, true);
            }
            spKeyBindingSig.Sign(bData, skpPrimaryKey, strPassphrase);
            this.KeyBindingSignature = spKeyBindingSig;
        }
Exemple #21
0
        private SignedMessage SignMessage(LiteralMessage lmToBeSigned, ulong lSignatureKeyID, string strPassphrase)
        {
            TransportableSecretKey tskKey    = skrKeyRing.Find(lSignatureKeyID);
            SignedMessage          smMessage = new SignedMessage();

            smMessage.MessageSigned = lmToBeSigned;
            SignaturePacket spPacket = new SignaturePacket();

            spPacket.Version = SignaturePacketVersionNumbers.v3;
            SecretKeyPacket skpKey = tskKey.FindKey(AsymActions.Sign);

            spPacket.KeyID              = skpKey.PublicKey.KeyID;
            spPacket.HashAlgorithm      = HashAlgorithms.SHA1;
            spPacket.SignatureAlgorithm = skpKey.PublicKey.Algorithm;
            spPacket.TimeCreated        = DateTime.Now;
            spPacket.SignatureType      = SignatureTypes.TextSignature;
            spPacket.Sign(lmToBeSigned.Binary, skpKey, strPassphrase);
            smMessage.Signature = spPacket;

            return(smMessage);
        }
Exemple #22
0
        private DateTime FindExpirationDate()
        {
            IEnumerator ieCertificates = this.alCertifications.GetEnumerator();

            while (ieCertificates.MoveNext())
            {
                if (!(ieCertificates.Current is CertifiedUserID))
                {
                    continue;
                }

                CertifiedUserID cuiID        = (CertifiedUserID)ieCertificates.Current;
                IEnumerator     ieSignatures = cuiID.Certificates.GetEnumerator();
                while (ieSignatures.MoveNext())
                {
                    if (!(ieSignatures.Current is SignaturePacket))
                    {
                        continue;
                    }

                    SignaturePacket spCertificate = (SignaturePacket)ieSignatures.Current;

                    // look only at selfsignatures
                    if (spCertificate.KeyID != this.PrimaryKey.KeyID)
                    {
                        continue;
                    }

                    for (int i = 0; i < spCertificate.HashedSubPackets.Length; i++)
                    {
                        if (spCertificate.HashedSubPackets[i].Type == SignatureSubPacketTypes.KeyExpirationTime)
                        {
                            return(spCertificate.HashedSubPackets[i].KeyExpirationTime);
                        }
                    }
                }
            }

            throw new Exception("never");
        }
Exemple #23
0
        public SymAlgorithms[] FindPreferedAlgorithms()
        {
            IEnumerator ieCertificates = this.alCertifications.GetEnumerator();

            while (ieCertificates.MoveNext())
            {
                if (!(ieCertificates.Current is CertifiedUserID))
                {
                    continue;
                }

                CertifiedUserID cuiID        = (CertifiedUserID)ieCertificates.Current;
                IEnumerator     ieSignatures = cuiID.Certificates.GetEnumerator();
                while (ieSignatures.MoveNext())
                {
                    if (!(ieSignatures.Current is SignaturePacket))
                    {
                        continue;
                    }

                    SignaturePacket spCertificate = (SignaturePacket)ieSignatures.Current;

                    // look only at selfsignatures
                    if (spCertificate.KeyID != this.PrimaryKey.KeyID)
                    {
                        continue;
                    }

                    try {
                        SymAlgorithms[] saReturn = spCertificate.FindPreferedSymAlgorithms();
                        return(saReturn);
                    } catch (Exception) {}
                }
            }

            throw new Exception("none found!");
        }
Exemple #24
0
        public void AddUserID(ulong lKeyID, string strName, string strEmail, string strPassphrase)
        {
            TransportableSecretKey tskKey = skrKeyRing.Find(lKeyID);
            TransportablePublicKey tpkKey = pkrKeyRing.Find(lKeyID, false);

            CertifiedUserID cuiUID = new CertifiedUserID();
            UserIDPacket    uipUID = new UserIDPacket();

            uipUID.UserID = strName.Trim() + " <" + strEmail.Trim() + ">";
            cuiUID.UserID = uipUID;

            SecretKeyPacket skpSignatureKey = tskKey.FindKey(AsymActions.Sign);
            SignaturePacket spSelfSig       = new SignaturePacket();

            spSelfSig.Version       = SignaturePacketVersionNumbers.v4;
            spSelfSig.HashAlgorithm = HashAlgorithms.SHA1;
            spSelfSig.KeyID         = skpSignatureKey.PublicKey.KeyID;
            spSelfSig.TimeCreated   = DateTime.Now;
            cuiUID.Certificates     = new System.Collections.ArrayList();
            cuiUID.Sign(spSelfSig, skpSignatureKey, strPassphrase, tpkKey.PrimaryKey);

            tpkKey.Certifications.Add(cuiUID);
            tskKey.UserIDs.Add(uipUID);
        }
        public PgpSecretKeyRing(
            Stream inputStream)
        {
            this.keys = new ArrayList();

            BcpgInputStream bcpgInput  = BcpgInputStream.Wrap(inputStream);
            PacketTag       initialTag = bcpgInput.NextPacketTag();

            if (initialTag != PacketTag.SecretKey && initialTag != PacketTag.SecretSubkey)
            {
                throw new IOException(
                          "secret key ring doesn't start with secret key tag: " +
                          "tag 0x" + initialTag.ToString("X"));
            }

            SecretKeyPacket secret   = (SecretKeyPacket)bcpgInput.ReadPacket();
            TrustPacket     trust    = null;
            ArrayList       keySigs  = new ArrayList();
            ArrayList       ids      = new ArrayList();
            ArrayList       idTrusts = new ArrayList();
            ArrayList       idSigs   = new ArrayList();
            IDigest         sha;

            try
            {
                sha = DigestUtilities.GetDigest("SHA1");
            }
            catch (Exception)
            {
                throw new IOException("can't find SHA1 digest");
            }

            //
            // ignore GPG comment packets if found.
            //
            while (bcpgInput.NextPacketTag() == PacketTag.Experimental2)
            {
                bcpgInput.ReadPacket();
            }

            if (bcpgInput.NextPacketTag() == PacketTag.Trust)
            {
                trust = (TrustPacket)bcpgInput.ReadPacket();  // ignore for the moment
            }

            //
            // revocation and direct signatures
            //
            while (bcpgInput.NextPacketTag() == PacketTag.Signature)
            {
                try
                {
                    keySigs.Add(new PgpSignature(bcpgInput));
                }
                catch (PgpException e)
                {
                    throw new IOException("can't create signature object: " + e.Message + ", cause: " + e.InnerException.ToString());
                }
            }

            while (bcpgInput.NextPacketTag() == PacketTag.UserId ||
                   bcpgInput.NextPacketTag() == PacketTag.UserAttribute)
            {
                object    obj     = bcpgInput.ReadPacket();
                ArrayList sigList = new ArrayList();

                if (obj is UserIdPacket)
                {
                    UserIdPacket id = (UserIdPacket)obj;
                    ids.Add(id.GetId());
                }
                else
                {
                    UserAttributePacket user = (UserAttributePacket)obj;
                    ids.Add(new PgpUserAttributeSubpacketVector(user.GetSubpackets()));
                }

                if (bcpgInput.NextPacketTag() == PacketTag.Trust)
                {
                    idTrusts.Add(bcpgInput.ReadPacket());
                }
                else
                {
                    idTrusts.Add(null);
                }

                idSigs.Add(sigList);

                while (bcpgInput.NextPacketTag() == PacketTag.Signature)
                {
                    SignaturePacket s = (SignaturePacket)bcpgInput.ReadPacket();

                    if (bcpgInput.NextPacketTag() == PacketTag.Trust)
                    {
                        sigList.Add(new PgpSignature(s, (TrustPacket)bcpgInput.ReadPacket()));
                    }
                    else
                    {
                        sigList.Add(new PgpSignature(s));
                    }
                }
            }

            keys.Add(new PgpSecretKey(secret, trust, sha, keySigs, ids, idTrusts, idSigs));

            while (bcpgInput.NextPacketTag() == PacketTag.SecretSubkey)
            {
                SecretSubkeyPacket sub      = (SecretSubkeyPacket)bcpgInput.ReadPacket();
                TrustPacket        subTrust = null;
                ArrayList          sigList  = new ArrayList();

                //
                // ignore GPG comment packets if found.
                //
                while (bcpgInput.NextPacketTag() == PacketTag.Experimental2)
                {
                    bcpgInput.ReadPacket();
                }

                if (bcpgInput.NextPacketTag() == PacketTag.Trust)
                {
                    subTrust = (TrustPacket)bcpgInput.ReadPacket();
                }

                while (bcpgInput.NextPacketTag() == PacketTag.Signature)
                {
                    SignaturePacket s = (SignaturePacket)bcpgInput.ReadPacket();

                    if (bcpgInput.NextPacketTag() == PacketTag.Trust)
                    {
                        sigList.Add(new PgpSignature(s, (TrustPacket)bcpgInput.ReadPacket()));
                    }
                    else
                    {
                        sigList.Add(new PgpSignature(s));
                    }
                }

                keys.Add(new PgpSecretKey(sub, subTrust, sha, sigList));
            }
        }
        public static void EncryptFiles(String[] strFiles, PublicKeyRing pkrPublicKeyRing, SecretKeyRing skrSecretKeyRing, bool bEncrypt, bool bSign)
        {
            PublicKeySelector pksSelectKeys = new PublicKeySelector(pkrPublicKeyRing);
            if (bEncrypt) {
                pksSelectKeys.ShowDialog();
                if (pksSelectKeys.SelectedKeys.Count == 0) {
                    MessageBox.Show("You did not select a public key to encrypt to. Doing nothing...", "Nothing Done...");
                    return;
                }
            }

            TransportableSecretKey tskKey = new TransportableSecretKey();
            string strPassphrase = "";

            if (bSign) {
                QueryPassphrase qpPassphrase = new QueryPassphrase();
                qpPassphrase.ShowMyDialog(skrSecretKeyRing);
                tskKey = qpPassphrase.SelectedKey;
                strPassphrase = qpPassphrase.Passphrase;
            }

            Working wWorking = new Working();
            wWorking.Show();

            for (int i=0; i<strFiles.Length; i++) {
                byte[] bFileContent = new byte[0];
                try {
                    System.IO.FileStream fsFile = new FileStream(strFiles[i], FileMode.Open);
                    BinaryReader brReader = new BinaryReader(fsFile);
                    bFileContent = brReader.ReadBytes((int)fsFile.Length);
                    brReader.Close();
                    fsFile.Close();
                } catch (Exception e) {
                    wWorking.Hide();
                    MessageBox.Show("An error occured while opening the file " + strFiles[i] + ": " + e.Message, "Error...");
                    return;
                }

                LiteralMessage lmMessage = new LiteralMessage(DataFormatTypes.Binary);
                lmMessage.Binary = bFileContent;
                lmMessage.TimeCreated = DateTime.Now;
                int iLastBackslash = strFiles[i].LastIndexOf("\\");
                lmMessage.Filename = strFiles[i].Substring(iLastBackslash + 1, strFiles[i].Length - iLastBackslash - 1);

                SharpPrivacy.OpenPGP.Messages.Message mEncryptionMessage = lmMessage;

                if (bSign) {
                    SignedMessage smMessage = new SignedMessage();
                    smMessage.MessageSigned = lmMessage;
                    SignaturePacket spPacket = new SignaturePacket();
                    spPacket.Version = SignaturePacketVersionNumbers.v3;
                    SecretKeyPacket skpKey = tskKey.FindKey(AsymActions.Sign);
                    spPacket.KeyID = skpKey.PublicKey.KeyID;
                    spPacket.HashAlgorithm = HashAlgorithms.SHA1;
                    spPacket.SignatureAlgorithm = skpKey.PublicKey.Algorithm;
                    spPacket.TimeCreated = DateTime.Now;
                    spPacket.SignatureType = SignatureTypes.TextSignature;
                    spPacket.Sign(lmMessage.Binary, skpKey, strPassphrase);
                    smMessage.Signature = spPacket;
                    mEncryptionMessage = smMessage;
                }

                CompressedMessage cmMessage = new CompressedMessage();
                cmMessage.Compress(mEncryptionMessage);

                wWorking.Progress(20/strFiles.Length);

                SymAlgorithms saAlgo = GetSymAlgorithmPreferences(pksSelectKeys.SelectedKeys);

                wWorking.Progress(10/strFiles.Length);
                byte[] bReturn = new byte[0];
                if (bEncrypt) {
                    SymmetricallyEncryptedDataPacket sedpEncrypted = new SymmetricallyEncryptedDataPacket();
                    SymmetricAlgorithm saEncrypt = CipherHelper.CreateSymAlgorithm(saAlgo);
                    saEncrypt.Mode = CipherMode.OpenPGP_CFB;
                    saEncrypt.GenerateKey();
                    byte[] bKey = saEncrypt.Key;

                    ESKSequence esksKeys = new ESKSequence();
                    try {
                         esksKeys = CreateESKSequence(pksSelectKeys.SelectedKeys, AsymActions.Encrypt, saAlgo, bKey);
                    } catch (Exception e) {
                        wWorking.Hide();
                        MessageBox.Show("The following error occured: " + e.Message, "Error...");
                        return;
                    }

                    wWorking.Progress(50/strFiles.Length);

                    ICryptoTransform ictEncryptor = saEncrypt.CreateEncryptor();
                    byte[] bMessage = cmMessage.GetEncoded();
                    byte[] bOutput = new byte[bMessage.Length];
                    ictEncryptor.TransformBlock(bMessage, 0, bMessage.Length, ref bOutput, 0);
                    bKey.Initialize();

                    wWorking.Progress(10/strFiles.Length);

                    int iOutLength = (saEncrypt.BlockSize >> 3) + 2 + bMessage.Length;
                    sedpEncrypted.Body = new byte[iOutLength];
                    Array.Copy(bOutput, 0, sedpEncrypted.Body, 0, iOutLength);

                    byte[] bESK = esksKeys.GetEncoded();
                    byte[] bEncrypted = sedpEncrypted.Generate();

                    bReturn = new byte[bESK.Length + bEncrypted.Length];
                    bESK.CopyTo(bReturn, 0);
                    bEncrypted.CopyTo(bReturn, bESK.Length);
                } else {
                    wWorking.Progress(60/strFiles.Length);
                    bReturn = cmMessage.GetEncoded();
                }

                wWorking.Progress(10/strFiles.Length);

                try {
                    FileStream fsOut = new FileStream(strFiles[i] + ".asc", FileMode.CreateNew);
                    BinaryWriter bwWrite = new BinaryWriter(fsOut);

                    bwWrite.Write(bReturn);
                    bwWrite.Close();
                    fsOut.Close();
                } catch (IOException io) {
                    MessageBox.Show("Could not write to file. The following error occured: " + io.Message, "Error...");
                }
            }

            wWorking.Hide();
        }
        public static string EncryptText(string strMessage, PublicKeyRing pkrPublicKeyRing, SecretKeyRing skrSecretKeyRing, bool bSign)
        {
            PublicKeySelector pksSelectKeys = new PublicKeySelector(pkrPublicKeyRing);
            pksSelectKeys.ShowDialog();
            TransportableSecretKey tskKey = new TransportableSecretKey();
            string strPassphrase = "";

            if (bSign) {
                QueryPassphrase qpPassphrase = new QueryPassphrase();
                qpPassphrase.ShowMyDialog(skrSecretKeyRing);
                tskKey = qpPassphrase.SelectedKey;
                strPassphrase = qpPassphrase.Passphrase;
            }

            if (pksSelectKeys.SelectedKeys.Count == 0)
                return strMessage;

            Working wWorking = new Working();
            wWorking.Show();

            LiteralMessage lmMessage = new LiteralMessage(DataFormatTypes.Text);
            lmMessage.Text = strMessage;
            lmMessage.TimeCreated = DateTime.Now;
            lmMessage.Filename = "";

            SharpPrivacy.OpenPGP.Messages.Message mEncryptionMessage = lmMessage;

            if (bSign) {
                SignedMessage smMessage = new SignedMessage();
                smMessage.MessageSigned = lmMessage;
                SignaturePacket spPacket = new SignaturePacket();
                spPacket.Version = SignaturePacketVersionNumbers.v3;
                SecretKeyPacket skpKey = tskKey.FindKey(AsymActions.Sign);
                spPacket.KeyID = skpKey.PublicKey.KeyID;
                spPacket.HashAlgorithm = HashAlgorithms.SHA1;
                spPacket.SignatureAlgorithm = skpKey.PublicKey.Algorithm;
                spPacket.TimeCreated = DateTime.Now;
                spPacket.SignatureType = SignatureTypes.TextSignature;
                spPacket.Sign(lmMessage.Binary, skpKey, strPassphrase);
                smMessage.Signature = spPacket;
                mEncryptionMessage = smMessage;
            }

            CompressedMessage cmMessage = new CompressedMessage();
            cmMessage.Compress(mEncryptionMessage);

            wWorking.Progress(20);

            SymAlgorithms saAlgo = GetSymAlgorithmPreferences(pksSelectKeys.SelectedKeys);

            SymmetricallyEncryptedDataPacket sedpEncrypted = new SymmetricallyEncryptedDataPacket();
            SymmetricAlgorithm saEncrypt = CipherHelper.CreateSymAlgorithm(saAlgo);
            saEncrypt.Mode = CipherMode.OpenPGP_CFB;
            saEncrypt.GenerateKey();
            byte[] bKey = saEncrypt.Key;

            wWorking.Progress(10);
            ESKSequence esksKeys = new ESKSequence();
            try {
                 esksKeys = CreateESKSequence(pksSelectKeys.SelectedKeys, AsymActions.Encrypt, saAlgo, bKey);
            } catch (Exception e) {
                wWorking.Hide();
                MessageBox.Show("The following error occured: " + e.Message, "Error...");
                return strMessage;
            }

            wWorking.Progress(50);

            ICryptoTransform ictEncryptor = saEncrypt.CreateEncryptor();
            byte[] bMessage = cmMessage.GetEncoded();
            byte[] bOutput = new byte[bMessage.Length];
            ictEncryptor.TransformBlock(bMessage, 0, bMessage.Length, ref bOutput, 0);
            bKey.Initialize();

            wWorking.Progress(10);

            int iOutLength = (saEncrypt.BlockSize >> 3) + 2 + bMessage.Length;
            sedpEncrypted.Body = new byte[iOutLength];
            Array.Copy(bOutput, 0, sedpEncrypted.Body, 0, iOutLength);

            byte[] bESK = esksKeys.GetEncoded();
            byte[] bEncrypted = sedpEncrypted.Generate();

            byte[] bReturn = new byte[bESK.Length + bEncrypted.Length];
            bESK.CopyTo(bReturn, 0);
            bEncrypted.CopyTo(bReturn, bESK.Length);

            wWorking.Progress(10);
            string strReturn = Radix64.Encode(bReturn, true);

            strReturn = Armor.WrapMessage(strReturn);

            wWorking.Hide();
            return strReturn;
        }
Exemple #28
0
        private SymAlgorithms GetSymAlgorithmPreferences(TransportablePublicKey[] tpkKeys)
        {
            bool bCAST5  = true;
            bool bAES256 = true;
            bool bAES192 = true;
            bool bAES128 = true;

            for (int i = 0; i < tpkKeys.Length; i++)
            {
                TransportablePublicKey tpkKey = tpkKeys[i];
                ulong       lKeyID            = tpkKey.PrimaryKey.KeyID;
                IEnumerator ieCerts           = tpkKey.Certifications.GetEnumerator();
                while (ieCerts.MoveNext())
                {
                    if (!(ieCerts.Current is CertifiedUserID))
                    {
                        continue;
                    }

                    CertifiedUserID cuiID  = (CertifiedUserID)ieCerts.Current;
                    IEnumerator     ieSigs = cuiID.Certificates.GetEnumerator();
                    while (ieSigs.MoveNext())
                    {
                        if (!(ieSigs.Current is SignaturePacket))
                        {
                            continue;
                        }

                        SignaturePacket spSig = (SignaturePacket)ieSigs.Current;
                        if ((spSig.Version == SignaturePacketVersionNumbers.v4) && (spSig.KeyID == lKeyID))
                        {
                            try {
                                bool            bTmpCAST5  = false;
                                bool            bTmpAES256 = false;
                                bool            bTmpAES192 = false;
                                bool            bTmpAES128 = false;
                                SymAlgorithms[] saThisKey  = spSig.FindPreferedSymAlgorithms();
                                for (int j = 0; j < saThisKey.Length; j++)
                                {
                                    if (saThisKey[j] == SymAlgorithms.AES128)
                                    {
                                        bTmpAES128 = true;
                                    }
                                    else if (saThisKey[j] == SymAlgorithms.AES192)
                                    {
                                        bTmpAES192 = true;
                                    }
                                    else if (saThisKey[j] == SymAlgorithms.AES256)
                                    {
                                        bTmpAES256 = true;
                                    }
                                    else if (saThisKey[j] == SymAlgorithms.CAST5)
                                    {
                                        bTmpCAST5 = true;
                                    }
                                }

                                if (!bTmpCAST5)
                                {
                                    bCAST5 = false;
                                }

                                if (!bTmpAES256)
                                {
                                    bAES256 = false;
                                }

                                if (!bTmpAES192)
                                {
                                    bAES192 = false;
                                }

                                if (!bTmpAES128)
                                {
                                    bAES128 = false;
                                }
                            } catch (InvalidOperationException) {}
                        }
                    }
                }
            }
            if (bAES256)
            {
                return(SymAlgorithms.AES256);
            }

            if (bAES192)
            {
                return(SymAlgorithms.AES192);
            }

            if (bAES128)
            {
                return(SymAlgorithms.AES128);
            }

            if (bCAST5)
            {
                return(SymAlgorithms.CAST5);
            }

            return(SymAlgorithms.Triple_DES);
        }
Exemple #29
0
        public void GenerateKey(string strName, string strEmail, string strKeyType, int iKeySize, long lExpiration, string strPassphrase)
        {
            if (strKeyType == "ElGamal/DSA")
            {
                System.Security.Cryptography.RandomNumberGenerator rngRand = System.Security.Cryptography.RandomNumberGenerator.Create();

                // let's first create the encryption key
                BigInteger[][] biEncryptionKey = GenerateEncryptionKey(iKeySize);

                // now the signature key
                BigInteger[][] biSignatureKey = GenerateSignatureKey();

                PublicKeyPacket pkpSignatureKey = new PublicKeyPacket(false);
                pkpSignatureKey.Algorithm   = AsymAlgorithms.DSA;
                pkpSignatureKey.KeyMaterial = biSignatureKey[0];
                pkpSignatureKey.TimeCreated = DateTime.Now;
                pkpSignatureKey.Version     = PublicKeyPacketVersionNumbers.v4;

                SecretKeyPacket skpSignatureKey = new SecretKeyPacket(false);
                skpSignatureKey.SymmetricalAlgorithm = SymAlgorithms.AES256;
                skpSignatureKey.PublicKey            = pkpSignatureKey;
                skpSignatureKey.InitialVector        = new byte[CipherHelper.CipherBlockSize(SymAlgorithms.AES256)];
                rngRand.GetBytes(skpSignatureKey.InitialVector);
                skpSignatureKey.EncryptKeyMaterial(biSignatureKey[1], strPassphrase);
                skpSignatureKey.PublicKey = pkpSignatureKey;

                PublicKeyPacket pkpEncryptionKey = new PublicKeyPacket(true);
                pkpEncryptionKey.Algorithm   = AsymAlgorithms.ElGamal_Encrypt_Only;
                pkpEncryptionKey.KeyMaterial = biEncryptionKey[0];
                pkpEncryptionKey.TimeCreated = DateTime.Now;
                pkpEncryptionKey.Version     = PublicKeyPacketVersionNumbers.v4;

                SecretKeyPacket skpEncryptionKey = new SecretKeyPacket(true);
                skpEncryptionKey.SymmetricalAlgorithm = SymAlgorithms.AES256;
                skpEncryptionKey.PublicKey            = pkpEncryptionKey;
                skpEncryptionKey.InitialVector        = new byte[CipherHelper.CipherBlockSize(SymAlgorithms.AES256)];
                rngRand.GetBytes(skpEncryptionKey.InitialVector);
                skpEncryptionKey.EncryptKeyMaterial(biEncryptionKey[1], strPassphrase);
                skpEncryptionKey.PublicKey = pkpEncryptionKey;

                CertifiedUserID cuiUID = new CertifiedUserID();
                UserIDPacket    uipUID = new UserIDPacket();
                uipUID.UserID = strName.Trim() + " <" + strEmail.Trim() + ">";
                cuiUID.UserID = uipUID;
                SignaturePacket spSelfSig = new SignaturePacket();
                spSelfSig.Version       = SignaturePacketVersionNumbers.v4;
                spSelfSig.HashAlgorithm = HashAlgorithms.SHA1;
                spSelfSig.KeyID         = pkpSignatureKey.KeyID;
                spSelfSig.TimeCreated   = DateTime.Now;
                SignatureSubPacket sspPrimaryUserID = new SignatureSubPacket();
                sspPrimaryUserID.Type          = SignatureSubPacketTypes.PrimaryUserID;
                sspPrimaryUserID.PrimaryUserID = true;
                spSelfSig.AddSubPacket(sspPrimaryUserID, true);
                SignatureSubPacket sspPreferedSymAlgos = new SignatureSubPacket();
                sspPreferedSymAlgos.Type             = SignatureSubPacketTypes.PreferedSymmetricAlgorithms;
                sspPreferedSymAlgos.PreferedSymAlgos = new SymAlgorithms[] { SymAlgorithms.AES256, SymAlgorithms.AES192, SymAlgorithms.AES256, SymAlgorithms.CAST5, SymAlgorithms.Triple_DES };
                spSelfSig.AddSubPacket(sspPreferedSymAlgos, true);
                SignatureSubPacket sspPreferedHashAlgos = new SignatureSubPacket();
                sspPreferedHashAlgos.Type = SignatureSubPacketTypes.PreferedHashAlgorithms;
                sspPreferedHashAlgos.PreferedHashAlgos = new HashAlgorithms[] { HashAlgorithms.SHA1 };
                spSelfSig.AddSubPacket(sspPreferedHashAlgos, true);
                if (lExpiration != 0)
                {
                    SignatureSubPacket sspExpiration = new SignatureSubPacket();
                    sspExpiration.Type = SignatureSubPacketTypes.SignatureExpirationTime;
                    sspExpiration.SignatureExpirationTime = new DateTime(lExpiration);
                    spSelfSig.AddSubPacket(sspExpiration, true);
                }
                cuiUID.Certificates = new System.Collections.ArrayList();
                cuiUID.Sign(spSelfSig, skpSignatureKey, strPassphrase, pkpSignatureKey);

                CertifiedPublicSubkey cpsEncryptionKey = new CertifiedPublicSubkey();
                cpsEncryptionKey.Subkey = pkpEncryptionKey;
                cpsEncryptionKey.SignKeyBindingSignature(pkpSignatureKey, skpSignatureKey, strPassphrase, new DateTime(lExpiration), true);

                TransportablePublicKey tpkPublicKey = new TransportablePublicKey();
                tpkPublicKey.PrimaryKey = pkpSignatureKey;
                tpkPublicKey.SubKeys.Add(cpsEncryptionKey);
                tpkPublicKey.Certifications.Add(cuiUID);

                TransportableSecretKey tskSecretKey = new TransportableSecretKey();
                tskSecretKey.PrimaryKey = skpSignatureKey;
                tskSecretKey.SubKeys.Add(skpEncryptionKey);
                tskSecretKey.UserIDs.Add(uipUID);

                this.pkrKeyRing.AddPublicKey(tpkPublicKey);
                this.skrKeyRing.AddSecretKey(tskSecretKey);
                pkrKeyRing.Save();
                skrKeyRing.Save();

                // it's an RSA key
            }
            else if (strKeyType == "RSA")
            {
            }
        }
Exemple #30
0
        public void SignKey(ulong lSignedKeyID, ulong lSigningKeyID, string strUserID, int nIntroducerDepth, bool bIsExportable, int nType, string strPassphrase)
        {
            TransportableSecretKey tskKey          = skrKeyRing.Find(lSigningKeyID);
            SecretKeyPacket        skpSignatureKey = tskKey.FindKey(AsymActions.Sign);

            TransportablePublicKey tpkKey = pkrKeyRing.Find(lSignedKeyID, false);

            SignaturePacket spCertificate = new SignaturePacket();

            spCertificate.SignatureType = (SignatureTypes)nType;
            spCertificate.Version       = SignaturePacketVersionNumbers.v4;
            spCertificate.HashAlgorithm = HashAlgorithms.SHA1;
            spCertificate.KeyID         = skpSignatureKey.PublicKey.KeyID;
            spCertificate.TimeCreated   = DateTime.Now;

            CertifiedUserID cuiID     = null;
            IEnumerator     ieUserIDs = tpkKey.Certifications.GetEnumerator();

            while (ieUserIDs.MoveNext())
            {
                if (!(ieUserIDs.Current is CertifiedUserID))
                {
                    continue;
                }

                CertifiedUserID cuiThisID = (CertifiedUserID)ieUserIDs.Current;
                if (cuiThisID.ToString() == strUserID)
                {
                    cuiID = cuiThisID;
                }
            }
            if (cuiID == null)
            {
                throw new Exception("UserID could not be found!");
            }

            if (bIsExportable == false)
            {
                SignatureSubPacket sspNotExportable = new SignatureSubPacket();
                sspNotExportable.Type = SignatureSubPacketTypes.ExportableSignature;
                sspNotExportable.ExportableSignature = false;
                spCertificate.AddSubPacket(sspNotExportable, true);
            }

            if (nIntroducerDepth > 0)
            {
                SignatureSubPacket sspTrust = new SignatureSubPacket();
                sspTrust.Type        = SignatureSubPacketTypes.TrustSignature;
                sspTrust.TrustLevel  = (byte)nIntroducerDepth;
                sspTrust.TrustAmount = 120;
                spCertificate.AddSubPacket(sspTrust, true);
            }

            cuiID.Sign(spCertificate, skpSignatureKey, strPassphrase, tpkKey.PrimaryKey);
            tpkKey.Certifications.Remove(cuiID);
            tpkKey.Certifications.Add(cuiID);

            pkrKeyRing.Delete(lSignedKeyID);
            pkrKeyRing.AddPublicKey(tpkKey);
            pkrKeyRing.Save();
        }
        /// <summary>
        /// Creates a new Certification for the UserID.
        /// </summary>
        /// <param name="spSignature">A signaturepacket that has been
        /// prepared for being signed. Things like signature subpackets
        /// MUST already be in place. Only the signature type is
        /// automatically set to UserIDCertification.</param>
        /// <param name="skpKey">A secret key that is used to signed the
        /// certification.</param>
        /// <param name="strPassphrase">The passphrase that fits to the
        /// given secret key packet.</param>
        /// <param name="pkpKey">The public key to which the userid that
        /// is to be signed belongs.</param>
        public void Sign(SignaturePacket spSignature, SecretKeyPacket skpKey, string strPassphrase, PublicKeyPacket pkpKey)
        {
            if (spSignature.Version == SignaturePacketVersionNumbers.v4) {
                byte[] bKey = new byte[pkpKey.Body.Length + 3];
                bKey[0] = 0x99;
                bKey[1] = (byte)((pkpKey.Body.Length >> 8) & 0xFF);
                bKey[2] = (byte)(pkpKey.Body.Length & 0xFF);
                Array.Copy(pkpKey.Body, 0, bKey, 3, pkpKey.Body.Length);

                byte[] bUserID = new byte[UserID.Body.Length + 5];
                bUserID[0] = 0xb4;
                bUserID[1] = (byte)((UserID.Body.Length >> 24) & 0xFF);
                bUserID[2] = (byte)((UserID.Body.Length >> 16) & 0xFF);
                bUserID[3] = (byte)((UserID.Body.Length >> 8) & 0xFF);
                bUserID[4] = (byte)(UserID.Body.Length & 0xFF);
                Array.Copy(UserID.Body, 0, bUserID, 5, UserID.Body.Length);

                byte[] bData = new byte[bUserID.Length + bKey.Length];
                Array.Copy(bKey, 0, bData, 0, bKey.Length);
                Array.Copy(bUserID, 0, bData, bKey.Length, bUserID.Length);

                spSignature.SignatureType = SignatureTypes.UserIDSignature;
                spSignature.Sign(bData, skpKey, strPassphrase);
                this.alCertificates.Add(spSignature);
            } else {
                throw new System.NotImplementedException("Only v4 signatures are supported so far!");
            }
        }
Exemple #32
0
		internal PgpSignature(
            SignaturePacket sigPacket)
			: this(sigPacket, null)
        {
        }
Exemple #33
0
 /// <summary>
 /// Creates a new CertifiedPublicSubkey with all null properties.
 /// </summary>
 /// <remarks>No remarks</remarks>
 public CertifiedPublicSubkey()
 {
     this.Subkey = null;
     this.KeyBindingSignature = null;
     this.RevocationSignature = null;
 }
Exemple #34
0
 internal PgpSignature(
     SignaturePacket sigPacket)
     : this(sigPacket, null)
 {
 }
Exemple #35
0
        public static void EncryptFiles(String[] strFiles, PublicKeyRing pkrPublicKeyRing, SecretKeyRing skrSecretKeyRing, bool bEncrypt, bool bSign)
        {
            PublicKeySelector pksSelectKeys = new PublicKeySelector(pkrPublicKeyRing);

            if (bEncrypt)
            {
                pksSelectKeys.ShowDialog();
                if (pksSelectKeys.SelectedKeys.Count == 0)
                {
                    MessageBox.Show("You did not select a public key to encrypt to. Doing nothing...", "Nothing Done...");
                    return;
                }
            }

            TransportableSecretKey tskKey = new TransportableSecretKey();
            string strPassphrase          = "";

            if (bSign)
            {
                QueryPassphrase qpPassphrase = new QueryPassphrase();
                qpPassphrase.ShowMyDialog(skrSecretKeyRing);
                tskKey        = qpPassphrase.SelectedKey;
                strPassphrase = qpPassphrase.Passphrase;
            }

            Working wWorking = new Working();

            wWorking.Show();


            for (int i = 0; i < strFiles.Length; i++)
            {
                byte[] bFileContent = new byte[0];
                try {
                    System.IO.FileStream fsFile   = new FileStream(strFiles[i], FileMode.Open);
                    BinaryReader         brReader = new BinaryReader(fsFile);
                    bFileContent = brReader.ReadBytes((int)fsFile.Length);
                    brReader.Close();
                    fsFile.Close();
                } catch (Exception e) {
                    wWorking.Hide();
                    MessageBox.Show("An error occured while opening the file " + strFiles[i] + ": " + e.Message, "Error...");
                    return;
                }

                LiteralMessage lmMessage = new LiteralMessage(DataFormatTypes.Binary);
                lmMessage.Binary      = bFileContent;
                lmMessage.TimeCreated = DateTime.Now;
                int iLastBackslash = strFiles[i].LastIndexOf("\\");
                lmMessage.Filename = strFiles[i].Substring(iLastBackslash + 1, strFiles[i].Length - iLastBackslash - 1);

                SharpPrivacy.OpenPGP.Messages.Message mEncryptionMessage = lmMessage;

                if (bSign)
                {
                    SignedMessage smMessage = new SignedMessage();
                    smMessage.MessageSigned = lmMessage;
                    SignaturePacket spPacket = new SignaturePacket();
                    spPacket.Version = SignaturePacketVersionNumbers.v3;
                    SecretKeyPacket skpKey = tskKey.FindKey(AsymActions.Sign);
                    spPacket.KeyID              = skpKey.PublicKey.KeyID;
                    spPacket.HashAlgorithm      = HashAlgorithms.SHA1;
                    spPacket.SignatureAlgorithm = skpKey.PublicKey.Algorithm;
                    spPacket.TimeCreated        = DateTime.Now;
                    spPacket.SignatureType      = SignatureTypes.TextSignature;
                    spPacket.Sign(lmMessage.Binary, skpKey, strPassphrase);
                    smMessage.Signature = spPacket;
                    mEncryptionMessage  = smMessage;
                }

                CompressedMessage cmMessage = new CompressedMessage();
                cmMessage.Compress(mEncryptionMessage);

                wWorking.Progress(20 / strFiles.Length);

                SymAlgorithms saAlgo = GetSymAlgorithmPreferences(pksSelectKeys.SelectedKeys);

                wWorking.Progress(10 / strFiles.Length);
                byte[] bReturn = new byte[0];
                if (bEncrypt)
                {
                    SymmetricallyEncryptedDataPacket sedpEncrypted = new SymmetricallyEncryptedDataPacket();
                    SymmetricAlgorithm saEncrypt = CipherHelper.CreateSymAlgorithm(saAlgo);
                    saEncrypt.Mode = CipherMode.OpenPGP_CFB;
                    saEncrypt.GenerateKey();
                    byte[] bKey = saEncrypt.Key;

                    ESKSequence esksKeys = new ESKSequence();
                    try {
                        esksKeys = CreateESKSequence(pksSelectKeys.SelectedKeys, AsymActions.Encrypt, saAlgo, bKey);
                    } catch (Exception e) {
                        wWorking.Hide();
                        MessageBox.Show("The following error occured: " + e.Message, "Error...");
                        return;
                    }

                    wWorking.Progress(50 / strFiles.Length);

                    ICryptoTransform ictEncryptor = saEncrypt.CreateEncryptor();
                    byte[]           bMessage     = cmMessage.GetEncoded();
                    byte[]           bOutput      = new byte[bMessage.Length];
                    ictEncryptor.TransformBlock(bMessage, 0, bMessage.Length, ref bOutput, 0);
                    bKey.Initialize();

                    wWorking.Progress(10 / strFiles.Length);

                    int iOutLength = (saEncrypt.BlockSize >> 3) + 2 + bMessage.Length;
                    sedpEncrypted.Body = new byte[iOutLength];
                    Array.Copy(bOutput, 0, sedpEncrypted.Body, 0, iOutLength);

                    byte[] bESK       = esksKeys.GetEncoded();
                    byte[] bEncrypted = sedpEncrypted.Generate();

                    bReturn = new byte[bESK.Length + bEncrypted.Length];
                    bESK.CopyTo(bReturn, 0);
                    bEncrypted.CopyTo(bReturn, bESK.Length);
                }
                else
                {
                    wWorking.Progress(60 / strFiles.Length);
                    bReturn = cmMessage.GetEncoded();
                }

                wWorking.Progress(10 / strFiles.Length);

                try {
                    FileStream   fsOut   = new FileStream(strFiles[i] + ".asc", FileMode.CreateNew);
                    BinaryWriter bwWrite = new BinaryWriter(fsOut);

                    bwWrite.Write(bReturn);
                    bwWrite.Close();
                    fsOut.Close();
                } catch (IOException io) {
                    MessageBox.Show("Could not write to file. The following error occured: " + io.Message, "Error...");
                }
            }

            wWorking.Hide();
        }
        public void SignKeyBindingSignature(PublicKeyPacket pkpPrimaryKey, SecretKeyPacket skpPrimaryKey, string strPassphrase, DateTime expirationTime, bool revocable)
        {
            byte[] bSubKey = new byte[pkpSubkey.Body.Length + 3];
            bSubKey[0] = 0x99;
            bSubKey[1] = (byte)((pkpSubkey.Body.Length >> 8) & 0xFF);
            bSubKey[2] = (byte)(pkpSubkey.Body.Length & 0xFF);
            Array.Copy(pkpSubkey.Body, 0, bSubKey, 3, pkpSubkey.Body.Length);

            byte[] bPrimaryKey = new byte[pkpPrimaryKey.Body.Length + 3];
            bPrimaryKey[0] = 0x99;
            bPrimaryKey[1] = (byte)((pkpPrimaryKey.Body.Length >> 8) & 0xFF);
            bPrimaryKey[2] = (byte)(pkpPrimaryKey.Body.Length & 0xFF);
            Array.Copy(pkpPrimaryKey.Body, 0, bPrimaryKey, 3, pkpPrimaryKey.Body.Length);

            byte[] bData = new byte[bPrimaryKey.Length + bSubKey.Length];
            Array.Copy(bPrimaryKey, 0, bData, 0, bPrimaryKey.Length);
            Array.Copy(bSubKey, 0, bData, bPrimaryKey.Length, bSubKey.Length);

            SignaturePacket spKeyBindingSig = new SignaturePacket();
            spKeyBindingSig.Version = SignaturePacketVersionNumbers.v4;
            spKeyBindingSig.HashAlgorithm = HashAlgorithms.SHA1;
            spKeyBindingSig.KeyID = pkpPrimaryKey.KeyID;
            spKeyBindingSig.SignatureType = SignatureTypes.SubkeyBindingSignature;
            if(expirationTime.Ticks != 0) {
                SignatureSubPacket sspExpiration = new SignatureSubPacket();
                sspExpiration.Type = SignatureSubPacketTypes.KeyExpirationTime;
                sspExpiration.KeyExpirationTime = new DateTime(expirationTime.Ticks + (new DateTime(1970,1,2)).Ticks - pkpPrimaryKey.TimeCreated.Ticks);
                spKeyBindingSig.AddSubPacket(sspExpiration, true);
            }
            if(!revocable) {
                SignatureSubPacket sspRevocable = new SignatureSubPacket();
                sspRevocable.Type = SignatureSubPacketTypes.Revocable;
                sspRevocable.Revocable = revocable;
                spKeyBindingSig.AddSubPacket(sspRevocable, true);
            }
            spKeyBindingSig.Sign(bData, skpPrimaryKey, strPassphrase);
            this.KeyBindingSignature = spKeyBindingSig;
        }
Exemple #37
0
        public string GetPublicKeyProperties(ulong lKeyID)
        {
            TransportablePublicKey tpkKey = pkrKeyRing.Find(lKeyID, false);

            XmlDocument xmlDoc = new XmlDocument();

            XmlElement xmlPublicKey = xmlDoc.CreateElement("PublicKey");

            xmlPublicKey.SetAttribute("keyid", "0x" + tpkKey.PrimaryKey.KeyID.ToString("x"));
            xmlPublicKey.SetAttribute("fingerprint", tpkKey.PrimaryKey.Fingerprint.ToString(16));
            xmlPublicKey.SetAttribute("created", tpkKey.PrimaryKey.TimeCreated.Ticks.ToString());
            try {
                xmlPublicKey.SetAttribute("expiration", tpkKey.KeyExpirationTime.Ticks.ToString());
            } catch (System.Exception) {
                xmlPublicKey.SetAttribute("expiration", "never");
            }
            xmlPublicKey.SetAttribute("size", tpkKey.PrimaryKey.KeyMaterial[0].bitCount().ToString());
            xmlPublicKey.SetAttribute("algorithm", tpkKey.PrimaryKey.Algorithm.ToString());

            XmlElement xmlUserIDs = xmlDoc.CreateElement("UserIDs");

            XmlElement xmlUserID;

            IEnumerator ieUserIDs = tpkKey.Certifications.GetEnumerator();

            while (ieUserIDs.MoveNext())
            {
                if (!(ieUserIDs.Current is CertifiedUserID))
                {
                    continue;
                }

                CertifiedUserID cuiUID = (CertifiedUserID)ieUserIDs.Current;
                cuiUID.Validate(tpkKey.PrimaryKey, pkrKeyRing);

                xmlUserID = xmlDoc.CreateElement("UserID");
                xmlUserID.SetAttribute("name", cuiUID.UserID.UserID);
                string strPrimary = "false";
                if (tpkKey.PrimaryUserID == cuiUID.UserID.UserID)
                {
                    strPrimary = "true";
                }

                xmlUserID.SetAttribute("primary", strPrimary);

                DateTime    dtTimeCreated = DateTime.Now;
                XmlElement  xmlSignature;
                IEnumerator ieSignatures = cuiUID.Certificates.GetEnumerator();
                while (ieSignatures.MoveNext())
                {
                    if (!(ieSignatures.Current is SignaturePacket))
                    {
                        continue;
                    }

                    SignaturePacket spSignature = (SignaturePacket)ieSignatures.Current;
                    xmlSignature = xmlDoc.CreateElement("Signature");
                    xmlSignature.SetAttribute("keyid", "0x" + spSignature.KeyID.ToString("x"));
                    xmlSignature.SetAttribute("created", spSignature.TimeCreated.Ticks.ToString());
                    string strExpiration = "";
                    try {
                        strExpiration = spSignature.FindExpirationTime().Ticks.ToString();
                    } catch (InvalidOperationException) {
                        strExpiration = "never";
                    }
                    xmlSignature.SetAttribute("expiration", strExpiration);
                    xmlSignature.SetAttribute("signaturestatus", spSignature.SignatureStatus.ToString());

                    string strCreator = "";
                    try {
                        TransportablePublicKey tpkSignatureKey = pkrKeyRing.Find(spSignature.KeyID, false);
                        strCreator = tpkSignatureKey.PrimaryUserID;
                    } catch (Exception) {
                        strCreator = "0x" + spSignature.KeyID.ToString("x");
                    }
                    xmlSignature.SetAttribute("creator", strCreator);
                    xmlSignature.SetAttribute("algorithm", spSignature.SignatureAlgorithm.ToString());
                    if (spSignature.KeyID == tpkKey.PrimaryKey.KeyID)
                    {
                        dtTimeCreated = spSignature.TimeCreated;
                    }

                    xmlUserID.AppendChild(xmlSignature);
                }
                xmlUserID.SetAttribute("created", dtTimeCreated.Ticks.ToString());

                xmlUserIDs.AppendChild(xmlUserID);
            }
            xmlPublicKey.AppendChild(xmlUserIDs);

            XmlElement xmlSubkeys = xmlDoc.CreateElement("Subkeys");

            XmlElement  xmlSubkey;
            IEnumerator ieSubkeys = tpkKey.SubKeys.GetEnumerator();

            while (ieSubkeys.MoveNext())
            {
                if (!(ieSubkeys.Current is CertifiedPublicSubkey))
                {
                    continue;
                }

                CertifiedPublicSubkey cpsSubkey = (CertifiedPublicSubkey)ieSubkeys.Current;

                xmlSubkey = xmlDoc.CreateElement("Subkey");
                xmlSubkey.SetAttribute("keyid", "0x" + cpsSubkey.Subkey.KeyID.ToString("x"));
                xmlSubkey.SetAttribute("fingerprint", cpsSubkey.Subkey.Fingerprint.ToString(16));
                xmlSubkey.SetAttribute("created", cpsSubkey.Subkey.TimeCreated.Ticks.ToString());

                string strExpiration = "";
                try {
                    strExpiration = cpsSubkey.KeyBindingSignature.FindExpirationTime().Ticks.ToString();
                } catch (InvalidOperationException) {
                    strExpiration = "never";
                }
                xmlSubkey.SetAttribute("expiration", strExpiration);
                xmlSubkey.SetAttribute("size", cpsSubkey.Subkey.KeyMaterial[0].bitCount().ToString());
                xmlSubkey.SetAttribute("algorithm", cpsSubkey.Subkey.Algorithm.ToString());

                xmlSubkeys.AppendChild(xmlSubkey);
            }

            xmlPublicKey.AppendChild(xmlSubkeys);
            xmlDoc.AppendChild(xmlPublicKey);
            return(xmlDoc.OuterXml);
        }