/// <summary>
 /// Changes the primary user id of a public key
 /// </summary>
 /// <param name="newPUID">the certified user id to se as primary</param>
 /// <param name="KeyID">the keyID to execute the operation for</param>
 /// <param name="strPassphrase"></param>
 public void changePrimaryUserID(CertifiedUserID newPUID, ulong KeyID, string strPassphrase)
 {
     TransportablePublicKey tpkKey = this.PublicRing.Find(KeyID,false);
     TransportableSecretKey tskKey = this.SecretRing.Find(KeyID);
     if (tpkKey!=null && tskKey!=null) {
         CertifiedUserID oldPUID = tpkKey.PrimaryUserIDCert;
         if (oldPUID!=newPUID) {
             bool updated = false;
             for (int k = 0; k < oldPUID.Certificates.Count; k++) {
                 SignaturePacket sp = (SignaturePacket)oldPUID.Certificates[k];
                 if(sp.SignatureType == SignatureTypes.UserIDSignature ||
                     sp.SignatureType == SignatureTypes.UserIDSignature_CasualVerification ||
                     sp.SignatureType == SignatureTypes.UserIDSignature_NoVerification ||
                     sp.SignatureType == SignatureTypes.UserIDSignature_PositivVerification)
                 {
                     foreach (SignatureSubPacket ssp in sp.HashedSubPackets) {
                         if(ssp.Type == SignatureSubPacketTypes.PrimaryUserID) {
                             ssp.PrimaryUserID = false;
                             updated = true;
                         }
                     }
                     if (!updated) {
                         foreach(SignatureSubPacket ssp in sp.UnhashedSubPackets) {
                             if(ssp.Type == SignatureSubPacketTypes.PrimaryUserID) {
                                 ssp.PrimaryUserID = false;
                                 updated = true;
                             }
                         }
                     }
                     if (updated)	{
                         oldPUID.Certificates.Remove(sp);
                         oldPUID.Sign(sp, tskKey.PrimaryKey, strPassphrase, tpkKey.PrimaryKey);
                         break;
                     }
                 }
             }
             updated = false;
             for (int k = 0; k < oldPUID.Certificates.Count; k++) {
                 SignaturePacket sp = (SignaturePacket)newPUID.Certificates[k];
                 if (sp.SignatureType == SignatureTypes.UserIDSignature ||
                     sp.SignatureType == SignatureTypes.UserIDSignature_CasualVerification ||
                     sp.SignatureType == SignatureTypes.UserIDSignature_NoVerification ||
                     sp.SignatureType == SignatureTypes.UserIDSignature_PositivVerification)
                 {
                     foreach(SignatureSubPacket ssp in sp.HashedSubPackets) {
                         if(ssp.Type == SignatureSubPacketTypes.PrimaryUserID) {
                             ssp.PrimaryUserID = true;
                             updated = true;
                         }
                     }
                     if (!updated) {
                         foreach (SignatureSubPacket ssp in sp.UnhashedSubPackets) {
                             if (ssp.Type == SignatureSubPacketTypes.PrimaryUserID) {
                                 ssp.PrimaryUserID = true;
                                 updated = true;
                             }
                         }
                     }
                     if (updated) {
                         newPUID.Certificates.Remove(sp);
                         newPUID.Sign(sp, tskKey.PrimaryKey, strPassphrase, tpkKey.PrimaryKey);
                         break;
                     }
                     if (!updated) {
                         SignatureSubPacket sspPrimaryUserID = new SignatureSubPacket();
                         sspPrimaryUserID.Type = SignatureSubPacketTypes.PrimaryUserID;
                         sspPrimaryUserID.PrimaryUserID = true;
                         sp.AddSubPacket(sspPrimaryUserID,true);
                         newPUID.Certificates.Remove(sp);
                         newPUID.Sign(sp, tskKey.PrimaryKey, strPassphrase, tpkKey.PrimaryKey);
                         break;
                     }
                 }
             }
         }
     }
 }
        /// <summary>
        /// Generate a key pair
        /// </summary>
        /// <param name="iKeySize">Encription key size</param>
        /// <param name="strPassphrase">passhrase for the key pair</param>
        /// <param name="userID">primary user id</param>
        /// <param name="email">user email</param>
        /// <param name="notation">xml encoded user info</param>
        /// <param name="expirationTime">expiration date of the primary key (new DateTime(0) == never)</param>
        /// <param name="keyType">1: RSA/DSA   0:Elgamal/DSA(DEFAULT)</param>
        /// <param name="isRevocableKey">revocable?</param>
        /// <param name="isRevocableSubkey">revocable subkey?</param>
        public void GenerateKey(int iKeySize, string strPassphrase, string userID, string email, string notation, DateTime expirationTime, int keyType, bool isRevocableKey, bool isRevocableSubkey)
        {
            if(iKeySize % 1024 != 0)
                throw new Exception("Keysize must be a 1024 multiple");

            System.Security.Cryptography.RandomNumberGenerator rngRand;

            // let's first create the encryption key
            BigInteger[][] biEncryptionKey;
            if (keyType == 1) {
                // it's a RSA/DSA key
                biEncryptionKey = GenerateRSAEncryptionKey(iKeySize);
            } else {
                // it's an elgamal/DSA key DEFAULF
                biEncryptionKey = GenerateElGamalEncryptionKey(iKeySize);
            }

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

            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 = System.Security.Cryptography.RandomNumberGenerator.Create();
            rngRand.GetBytes(skpSignatureKey.InitialVector);
            skpSignatureKey.EncryptKeyMaterial(biSignatureKey[1], strPassphrase);
            skpSignatureKey.PublicKey = pkpSignatureKey;

            PublicKeyPacket pkpEncryptionKey = new PublicKeyPacket(true);
            if (keyType == 0) {
                // it's an elgamal/DSA key
                pkpEncryptionKey.Algorithm = AsymAlgorithms.ElGamal_Encrypt_Only;
            } else if (keyType == 1) {
                // it's a RSA/DSA key
                pkpEncryptionKey.Algorithm = AsymAlgorithms.RSA_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 = System.Security.Cryptography.RandomNumberGenerator.Create();
            rngRand.GetBytes(skpEncryptionKey.InitialVector);
            skpEncryptionKey.EncryptKeyMaterial(biEncryptionKey[1], strPassphrase);
            skpEncryptionKey.PublicKey = pkpEncryptionKey;

            CertifiedUserID cuiUID = new CertifiedUserID();
            UserIDPacket uipUID = new UserIDPacket();
            uipUID.UserID = userID.Trim() + " <" + email.Trim() + ">";
            cuiUID.UserID = uipUID;
            SignaturePacket spSelfSig = new SignaturePacket();
            if (notation != null) {
                SignatureSubPacket sspNotation = new SignatureSubPacket();
                sspNotation.Type = SignatureSubPacketTypes.NotationData;
                sspNotation.NotationName = "PersonalData";
                sspNotation.NotationValue = notation;
                spSelfSig.AddSubPacket(sspNotation,false);
            }
            if (expirationTime.Ticks != 0) {
                SignatureSubPacket sspExpiration = new SignatureSubPacket();
                sspExpiration.Type = SignatureSubPacketTypes.KeyExpirationTime;
                sspExpiration.KeyExpirationTime = new DateTime(expirationTime.Ticks + (new DateTime(1970,1,2)).Ticks - pkpEncryptionKey.TimeCreated.Ticks);
                spSelfSig.AddSubPacket(sspExpiration, true);
            }
            if (!isRevocableKey) {
                SignatureSubPacket sspRevocable = new SignatureSubPacket();
                sspRevocable.Type = SignatureSubPacketTypes.Revocable;
                sspRevocable.Revocable = isRevocableKey;
                spSelfSig.AddSubPacket(sspRevocable, true);
            }
            SignatureSubPacket sspPrimaryUID = new SignatureSubPacket();
            sspPrimaryUID.Type = SignatureSubPacketTypes.PrimaryUserID;
            sspPrimaryUID.Revocable = true;
            spSelfSig.AddSubPacket(sspPrimaryUID, true);

            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);

            cuiUID.Certificates = new System.Collections.ArrayList();
            cuiUID.Sign(spSelfSig, skpSignatureKey, strPassphrase, pkpSignatureKey);

            CertifiedPublicSubkey cpsEncryptionKey = new CertifiedPublicSubkey();
            cpsEncryptionKey.Subkey = pkpEncryptionKey;
            cpsEncryptionKey.SignKeyBindingSignature(pkpSignatureKey, skpSignatureKey, strPassphrase, expirationTime, isRevocableSubkey);

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

            this.PublicRing.AddPublicKey(tpkPublicKey);

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

            this.SecretRing.AddSecretKey(tskSecretKey);
        }
        /// <summary>
        /// Adds a userID to the specified key
        /// </summary>
        /// <param name="userID">user id to be added</param>
        /// <param name="email">user email address</param>
        /// <param name="infos">xml encoded user infos</param>
        /// <param name="strPassphrase">passphrase of the secret key we want to add the user id to</param>
        /// <param name="KeyID">keyID of the key we want to add the userID to</param>
        /// <param name="isRevocable">is a revocable keyID</param>
        public void AddUserID(string userID, string email, string infos, string strPassphrase, ulong KeyID, bool isRevocable)
        {
            TransportablePublicKey tpkKey = this.PublicRing.Find(KeyID,false);
            TransportableSecretKey tskKey = this.SecretRing.Find(KeyID);
            if (tpkKey != null && tskKey != null) {
                CertifiedUserID cuiUID = new CertifiedUserID();
                UserIDPacket uipUID = new UserIDPacket();
                uipUID.UserID = userID.Trim() + " <" + email.Trim() + ">";
                cuiUID.UserID = uipUID;

                SecretKeyPacket skpSignatureKey = tskKey.FindKey(AsymActions.Sign);
                SignaturePacket spSelfSig = new SignaturePacket();
                if (infos != null) {
                    SignatureSubPacket sspNotation = new SignatureSubPacket();
                    sspNotation.Type = SignatureSubPacketTypes.NotationData;
                    sspNotation.NotationName = "PersonalData";
                    sspNotation.NotationValue = infos;
                    spSelfSig.AddSubPacket(sspNotation,false);
                }
                if (!isRevocable) {
                    SignatureSubPacket sspRevocable = new SignatureSubPacket();
                    sspRevocable.Type = SignatureSubPacketTypes.Revocable;
                    sspRevocable.Revocable = isRevocable;
                    spSelfSig.AddSubPacket(sspRevocable, true);
                }
                SignatureSubPacket sspPrimaryUID = new SignatureSubPacket();
                sspPrimaryUID.Type = SignatureSubPacketTypes.PrimaryUserID;
                sspPrimaryUID.Revocable = false;
                spSelfSig.AddSubPacket(sspPrimaryUID, true);

                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);
                return;
            }
            throw new Exception("Keys not found");
        }
        /// <summary>
        /// Signs a key 
        /// </summary>
        /// <param name="tspKey">key to be signed</param>
        /// <param name="cuidTobeSigned">user id to be signed</param>
        /// <param name="skpKeySigner">signer private key</param>
        /// <param name="strPassphrase">signer passphrase</param>
        /// <param name="exportable">exportable signature</param>
        /// <param name="expirationTime">expiration time (new DateTime(0) == never)</param>
        /// <param name="isRevocable"></param>
        public void SignKey(TransportablePublicKey tspKey, CertifiedUserID cuidTobeSigned, TransportableSecretKey skpKeySigner, string strPassphrase, bool exportable, DateTime expirationTime, bool isRevocable)
        {
            SignaturePacket spSig = new SignaturePacket();
            spSig.Version = SignaturePacketVersionNumbers.v4;
            spSig.HashAlgorithm = HashAlgorithms.SHA1;
            spSig.KeyID = skpKeySigner.PrimaryKey.PublicKey.KeyID;
            spSig.TimeCreated = DateTime.Now;
            SignatureSubPacket sspExportableSignature = new SignatureSubPacket();
            sspExportableSignature.Type = SignatureSubPacketTypes.ExportableSignature;
            sspExportableSignature.ExportableSignature = exportable;
            spSig.AddSubPacket(sspExportableSignature, false);
            if (!isRevocable) {
                SignatureSubPacket sspRevocable = new SignatureSubPacket();
                sspRevocable.Type = SignatureSubPacketTypes.Revocable;
                sspRevocable.Revocable = isRevocable;
                spSig.AddSubPacket(sspRevocable, true);
            }
            if (expirationTime.Ticks != 0) {
                SignatureSubPacket sspExpiration = new SignatureSubPacket();
                sspExpiration.Type = SignatureSubPacketTypes.KeyExpirationTime;
                sspExpiration.KeyExpirationTime = new DateTime(expirationTime.Ticks + (new DateTime(1970,1,2)).Ticks - tspKey.PrimaryKey.TimeCreated.Ticks);
                spSig.AddSubPacket(sspExpiration, true);
            }

            cuidTobeSigned.Sign(spSig, skpKeySigner.PrimaryKey, strPassphrase, tspKey.PrimaryKey);
        }
 /// <summary>
 /// Sets the trust level and amount for a specified userID in a key
 /// </summary>
 /// <param name="userIdKeyId">KeyID of the key containing the userID which this set the trust of</param>
 /// <param name="userID">UserID whose trust has to be set</param>
 /// <param name="KeyID">Signer (Truster) keyID</param>
 /// <param name="strPassphrase">passphrase of the signer</param>
 /// <param name="trustLevel">trust level</param>
 /// <param name="trustAmount">trust amount</param>
 public void setUserIDTrust(ulong userIdKeyId, CertifiedUserID userID, ulong KeyID, string strPassphrase, int trustLevel, int trustAmount)
 {
     TransportablePublicKey tpkKey = this.PublicRing.Find(userIdKeyId,false);
     TransportableSecretKey tskKey = this.SecretRing.Find(KeyID);
     bool updated = false;
     if (tpkKey!=null && tskKey!=null) {
         ArrayList cert = new ArrayList(userID.Certificates);
         for (int k = 0; k < cert.Count; k++) {
             updated = false;
             SignaturePacket sp = (SignaturePacket)cert[k];
             if ((sp.SignatureType == SignatureTypes.UserIDSignature ||
                 sp.SignatureType == SignatureTypes.UserIDSignature_CasualVerification ||
                 sp.SignatureType == SignatureTypes.UserIDSignature_NoVerification ||
                 sp.SignatureType == SignatureTypes.UserIDSignature_PositivVerification) && sp.KeyID == KeyID)
             {
                 foreach (SignatureSubPacket ssp in sp.HashedSubPackets) {
                     if(ssp.Type == SignatureSubPacketTypes.TrustSignature) {
                         ssp.TrustLevel = (byte)(trustLevel & 0xFF);
                         ssp.TrustAmount = (byte)(trustAmount & 0xFF);
                         updated = true;
                     }
                 }
                 if (!updated) {
                     foreach (SignatureSubPacket ssp in sp.UnhashedSubPackets) {
                         if (ssp.Type == SignatureSubPacketTypes.TrustSignature) {
                             ssp.TrustLevel = (byte)(trustLevel & 0xFF);
                             ssp.TrustAmount = (byte)(trustAmount & 0xFF);
                             updated = true;
                         }
                     }
                 }
                 if(updated)	{
                     userID.Certificates.Remove(sp);
                     userID.Sign(sp, tskKey.PrimaryKey, strPassphrase, tpkKey.PrimaryKey);
                     updated = true;
                 } else {
                     SignatureSubPacket sspTrust = new SignatureSubPacket();
                     sspTrust.Type = SignatureSubPacketTypes.TrustSignature;
                     sspTrust.TrustAmount = (byte)(trustAmount & 0xFF);
                     sspTrust.TrustLevel = (byte)(trustLevel & 0xFF);
                     sp.AddSubPacket(sspTrust, false);
                     userID.Certificates.Remove(sp);
                     userID.Sign(sp, tskKey.PrimaryKey, strPassphrase, tpkKey.PrimaryKey);
                     updated = true;
                 }
             }
         }
     }
     if (!updated)
         throw new Exception("User id not certified by this Key. You cannot set Trust.");
 }
Beispiel #6
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);
        }
Beispiel #7
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") {

            }
        }