/// <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"); }