コード例 #1
0
        /// <summary>Extract a <c>PgpPrivateKey</c> from this secret key's encrypted contents.</summary>
        /// <remarks>
        /// Allows the caller to handle the encoding of the passphrase to bytes.
        /// </remarks>
        public PgpPrivateKey?ExtractPrivateKey(ReadOnlySpan <byte> rawPassPhrase)
        {
            if (IsPrivateKeyEmpty)
            {
                return(null);
            }

            if (keyPacket.Version < 4)
            {
                Debug.Assert(keyPacket.Algorithm == PgpPublicKeyAlgorithm.RsaGeneral || keyPacket.Algorithm == PgpPublicKeyAlgorithm.RsaEncrypt || keyPacket.Algorithm == PgpPublicKeyAlgorithm.RsaSign);
                var rsa = RsaKey.CreatePrivate(rawPassPhrase, keyPacket.KeyBytes, out var _, version: 3);
                return(new PgpPrivateKey(KeyId, rsa));
            }
            else if (keyPacket.Version >= 4)
            {
                switch (keyPacket.Algorithm)
                {
                case PgpPublicKeyAlgorithm.RsaGeneral:
                case PgpPublicKeyAlgorithm.RsaSign:
                case PgpPublicKeyAlgorithm.RsaEncrypt:
                    var rsa = RsaKey.CreatePrivate(rawPassPhrase, keyPacket.KeyBytes, out var _);
                    return(new PgpPrivateKey(KeyId, rsa));

                case PgpPublicKeyAlgorithm.Dsa:
                    var dsa = DsaKey.CreatePrivate(rawPassPhrase, keyPacket.KeyBytes, out var _);
                    return(new PgpPrivateKey(KeyId, dsa));

                case PgpPublicKeyAlgorithm.ECDH:
                    var ecdh = ECDiffieHellmanKey.CreatePrivate(Fingerprint, rawPassPhrase, keyPacket.KeyBytes, out var _);
                    return(new PgpPrivateKey(KeyId, ecdh));

                case PgpPublicKeyAlgorithm.ECDsa:
                    var ecdsa = ECDsaKey.CreatePrivate(rawPassPhrase, keyPacket.KeyBytes, out var _);
                    return(new PgpPrivateKey(KeyId, ecdsa));

                case PgpPublicKeyAlgorithm.EdDsa:
                    var eddsa = EdDsaKey.CreatePrivate(rawPassPhrase, keyPacket.KeyBytes, out var _);
                    return(new PgpPrivateKey(KeyId, eddsa));

                case PgpPublicKeyAlgorithm.ElGamalEncrypt:
                case PgpPublicKeyAlgorithm.ElGamalGeneral:
                    var elgamal = ElGamalKey.CreatePrivate(rawPassPhrase, keyPacket.KeyBytes, out var _);
                    return(new PgpPrivateKey(KeyId, elgamal));
                }
            }

            throw new PgpException("unknown public key version encountered");
        }