Beispiel #1
0
 public void SetHashedSubpackets(
     PgpSignatureSubpacketVector hashedPackets)
 {
     hashed = hashedPackets == null
                         ?       EmptySignatureSubpackets
                         :       hashedPackets.ToSubpacketArray();
 }
Beispiel #2
0
 public void SetUnhashedSubpackets(
     PgpSignatureSubpacketVector unhashedPackets)
 {
     unhashed = unhashedPackets == null
                         ?       EmptySignatureSubpackets
                         :       unhashedPackets.ToSubpacketArray();
 }
Beispiel #3
0
        /// <summary>
        /// Add a subkey with specific hashed and unhashed packets associated with it and
        /// default certification.
        /// </summary>
        /// <param name="keyPair">Public/private key pair.</param>
        /// <param name="hashedPackets">Hashed packet values to be included in certification.</param>
        /// <param name="unhashedPackets">Unhashed packets values to be included in certification.</param>
        /// <param name="hashAlgorithm">The hash algorithm.</param>
        /// <exception cref="Essensoft.AspNetCore.Security.Bcpg.OpenPgp.PgpException">exception adding subkey: </exception>
        /// <exception cref="PgpException"></exception>
        public void AddSubKey(
            PgpKeyPair keyPair,
            PgpSignatureSubpacketVector hashedPackets,
            PgpSignatureSubpacketVector unhashedPackets,
            HashAlgorithmTag hashAlgorithm)
        {
            try
            {
                PgpSignatureGenerator sGen = new PgpSignatureGenerator(masterKey.PublicKey.Algorithm, hashAlgorithm);

                //
                // Generate the certification
                //
                sGen.InitSign(PgpSignature.SubkeyBinding, masterKey.PrivateKey);

                sGen.SetHashedSubpackets(hashedPackets);
                sGen.SetUnhashedSubpackets(unhashedPackets);

                IList subSigs = Platform.CreateArrayList();
                subSigs.Add(sGen.GenerateCertification(masterKey.PublicKey, keyPair.PublicKey));

                keys.Add(new PgpSecretKey(keyPair.PrivateKey, new PgpPublicKey(keyPair.PublicKey, null, subSigs), encAlgorithm,
                                          rawPassPhrase, false, useSha1, rand, false));
            }
            catch (PgpException)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new PgpException("exception adding subkey: ", e);
            }
        }
Beispiel #4
0
        /// <summary>
        /// Create a new key ring generator.
        /// </summary>
        /// <remarks>
        /// Allows the caller to handle the encoding of the passphrase to bytes.
        /// </remarks>
        /// <param name="certificationLevel">The certification level for keys on this ring.</param>
        /// <param name="masterKey">The master key pair.</param>
        /// <param name="id">The id to be associated with the ring.</param>
        /// <param name="encAlgorithm">The algorithm to be used to protect secret keys.</param>
        /// <param name="hashAlgorithm">The hash algorithm.</param>
        /// <param name="rawPassPhrase">The passPhrase to be used to protect secret keys.</param>
        /// <param name="useSha1">Checksum the secret keys with SHA1 rather than the older 16 bit checksum.</param>
        /// <param name="hashedPackets">Packets to be included in the certification hash.</param>
        /// <param name="unhashedPackets">Packets to be attached unhashed to the certification.</param>
        /// <param name="rand">input secured random.</param>
        public PgpKeyRingGenerator(
            int certificationLevel,
            PgpKeyPair masterKey,
            string id,
            SymmetricKeyAlgorithmTag encAlgorithm,
            HashAlgorithmTag hashAlgorithm,
            byte[]                      rawPassPhrase,
            bool useSha1,
            PgpSignatureSubpacketVector hashedPackets,
            PgpSignatureSubpacketVector unhashedPackets,
            SecureRandom rand)
        {
            this.certificationLevel = certificationLevel;
            this.masterKey          = masterKey;
            this.id                   = id;
            this.encAlgorithm         = encAlgorithm;
            this.rawPassPhrase        = rawPassPhrase;
            this.useSha1              = useSha1;
            this.hashedPacketVector   = hashedPackets;
            this.unhashedPacketVector = unhashedPackets;
            this.rand                 = rand;
            this.hashAlgorithm        = hashAlgorithm;

            keys.Add(new PgpSecretKey(certificationLevel, masterKey, id, encAlgorithm, hashAlgorithm, rawPassPhrase, false, useSha1, hashedPackets, unhashedPackets, rand));
        }
Beispiel #5
0
 public PgpKeyRingGenerator(
     int certificationLevel,
     PgpKeyPair masterKey,
     string id,
     SymmetricKeyAlgorithmTag encAlgorithm,
     char[]                                          passPhrase,
     PgpSignatureSubpacketVector hashedPackets,
     PgpSignatureSubpacketVector unhashedPackets,
     SecureRandom rand)
     : this(certificationLevel, masterKey, id, encAlgorithm, passPhrase, false, hashedPackets, unhashedPackets, rand)
 {
 }
Beispiel #6
0
 /// <summary>
 /// Create a new key ring generator.
 /// </summary>
 /// <param name="certificationLevel">The certification level for keys on this ring.</param>
 /// <param name="masterKey">The master key pair.</param>
 /// <param name="id">The id to be associated with the ring.</param>
 /// <param name="encAlgorithm">The algorithm to be used to protect secret keys.</param>
 /// <param name="utf8PassPhrase">
 /// If true, conversion of the passphrase to bytes uses Encoding.UTF8.GetBytes(), otherwise the conversion
 /// is performed using Convert.ToByte(), which is the historical behaviour of the library (1.7 and earlier).
 /// </param>
 /// <param name="passPhrase">The passPhrase to be used to protect secret keys.</param>
 /// <param name="useSha1">Checksum the secret keys with SHA1 rather than the older 16 bit checksum.</param>
 /// <param name="hashedPackets">Packets to be included in the certification hash.</param>
 /// <param name="unhashedPackets">Packets to be attached unhashed to the certification.</param>
 /// <param name="rand">input secured random.</param>
 public PgpKeyRingGenerator(
     int certificationLevel,
     PgpKeyPair masterKey,
     string id,
     SymmetricKeyAlgorithmTag encAlgorithm,
     bool utf8PassPhrase,
     char[]                                              passPhrase,
     bool useSha1,
     PgpSignatureSubpacketVector hashedPackets,
     PgpSignatureSubpacketVector unhashedPackets,
     SecureRandom rand)
     : this(certificationLevel, masterKey, id, encAlgorithm,
            PgpUtilities.EncodePassPhrase(passPhrase, utf8PassPhrase),
            useSha1, hashedPackets, unhashedPackets, rand)
 {
 }
Beispiel #7
0
        private long GetExpirationTimeFromSig(bool selfSigned, int signatureType)
        {
            long expiryTime = -1;
            long lastDate   = -1;

            foreach (PgpSignature sig in GetSignaturesOfType(signatureType))
            {
                if (selfSigned && sig.KeyId != this.KeyId)
                {
                    continue;
                }

                PgpSignatureSubpacketVector hashed = sig.GetHashedSubPackets();
                if (hashed == null)
                {
                    continue;
                }

                long current = hashed.GetKeyExpirationTime();

                if (sig.KeyId == this.KeyId)
                {
                    if (sig.CreationTime.Ticks > lastDate)
                    {
                        lastDate   = sig.CreationTime.Ticks;
                        expiryTime = current;
                    }
                }
                else if (current == 0 || current > expiryTime)
                {
                    expiryTime = current;
                }
            }

            return(expiryTime);
        }