<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.0" />

ECDHPublicBcpgKey

using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC; using System; namespace Org.BouncyCastle.Bcpg { public class ECDHPublicBcpgKey : ECPublicBcpgKey { private byte reserved; private HashAlgorithmTag hashFunctionId; private SymmetricKeyAlgorithmTag symAlgorithmId; public virtual byte Reserved => reserved; public virtual HashAlgorithmTag HashAlgorithm => hashFunctionId; public virtual SymmetricKeyAlgorithmTag SymmetricKeyAlgorithm => symAlgorithmId; public unsafe ECDHPublicBcpgKey(BcpgInputStream bcpgIn) : base(bcpgIn) { if (bcpgIn.RequireByte() != 3) throw new InvalidOperationException("KDF parameters size of 3 expected."); Span<byte> buffer = new Span<byte>(stackalloc byte[3], 3); bcpgIn.ReadFully(buffer); reserved = buffer[0]; hashFunctionId = (HashAlgorithmTag)buffer[1]; symAlgorithmId = (SymmetricKeyAlgorithmTag)buffer[2]; VerifyHashAlgorithm(); VerifySymmetricKeyAlgorithm(); } public ECDHPublicBcpgKey(DerObjectIdentifier oid, ECPoint point, HashAlgorithmTag hashAlgorithm, SymmetricKeyAlgorithmTag symmetricKeyAlgorithm) : base(oid, point) { reserved = 1; hashFunctionId = hashAlgorithm; symAlgorithmId = symmetricKeyAlgorithm; VerifyHashAlgorithm(); VerifySymmetricKeyAlgorithm(); } public ECDHPublicBcpgKey(DerObjectIdentifier oid, BigInteger point, HashAlgorithmTag hashAlgorithm, SymmetricKeyAlgorithmTag symmetricKeyAlgorithm) : base(oid, point) { reserved = 1; hashFunctionId = hashAlgorithm; symAlgorithmId = symmetricKeyAlgorithm; VerifyHashAlgorithm(); VerifySymmetricKeyAlgorithm(); } public override void Encode(BcpgOutputStream bcpgOut) { base.Encode(bcpgOut); bcpgOut.WriteByte(3); bcpgOut.WriteByte(reserved); bcpgOut.WriteByte((byte)hashFunctionId); bcpgOut.WriteByte((byte)symAlgorithmId); } private void VerifyHashAlgorithm() { HashAlgorithmTag hashAlgorithmTag = hashFunctionId; if ((uint)(hashAlgorithmTag - 8) > 2) throw new InvalidOperationException("Hash algorithm must be SHA-256 or stronger."); } private void VerifySymmetricKeyAlgorithm() { SymmetricKeyAlgorithmTag symmetricKeyAlgorithmTag = symAlgorithmId; if ((uint)(symmetricKeyAlgorithmTag - 7) > 2) throw new InvalidOperationException("Symmetric key algorithm must be AES-128 or stronger."); } } }