/// <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>
		/// <exception cref="PgpException"></exception>
		public void AddSubKey(
			PgpKeyPair					keyPair,
			PgpSignatureSubpacketVector	hashedPackets,
			PgpSignatureSubpacketVector	unhashedPackets)
		{
			try
            {
                PgpSignatureGenerator sGen = new PgpSignatureGenerator(
					masterKey.PublicKey.Algorithm, HashAlgorithmTag.Sha1);

				//
                // 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, passPhrase, useSha1, rand));
			}
            catch (PgpException e)
            {
                throw e;
            }
            catch (Exception e)
            {
                throw new PgpException("exception adding subkey: ", e);
            }
        }
예제 #2
0
		private static PgpPublicKey certifiedPublicKey(
			int							certificationLevel,
			PgpKeyPair					keyPair,
			string						id,
			PgpSignatureSubpacketVector	hashedPackets,
			PgpSignatureSubpacketVector	unhashedPackets)
		{
			PgpSignatureGenerator sGen;
			try
			{
				sGen = new PgpSignatureGenerator(keyPair.PublicKey.Algorithm, HashAlgorithmTag.Sha1);
			}
			catch (Exception e)
			{
				throw new PgpException("Creating signature generator: " + e.Message, e);
			}

			//
			// Generate the certification
			//
			sGen.InitSign(certificationLevel, keyPair.PrivateKey);

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

			try
            {
				PgpSignature certification = sGen.GenerateCertification(id, keyPair.PublicKey);
                return PgpPublicKey.AddCertification(keyPair.PublicKey, id, certification);
            }
            catch (Exception e)
            {
				throw new PgpException("Exception doing certification: " + e.Message, e);
			}
        }