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

MPInteger

public sealed class MPInteger : BcpgObject
using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC; using System; namespace Org.BouncyCastle.Bcpg { public sealed class MPInteger : BcpgObject { private readonly BigInteger m_val; public BigInteger Value => m_val; public unsafe MPInteger(BcpgInputStream bcpgIn) { if (bcpgIn == null) throw new ArgumentNullException("bcpgIn"); int num = (StreamUtilities.RequireUInt16BE(bcpgIn) + 7) / 8; Span<byte> span; if (num <= 512) { int num2 = num; span = new Span<byte>(stackalloc byte[(int)(uint)num2], num2); } else span = new byte[num]; Span<byte> span2 = span; bcpgIn.ReadFully(span2); m_val = new BigInteger(1, span2); } public MPInteger(BigInteger val) { if (val == null) throw new ArgumentNullException("val"); if (val.SignValue < 0) throw new ArgumentException("Values must be positive", "val"); m_val = val; } public override void Encode(BcpgOutputStream bcpgOut) { bcpgOut.WriteShort((short)m_val.BitLength); bcpgOut.Write(m_val.ToByteArrayUnsigned()); } internal unsafe static BigInteger ToMpiBigInteger(ECPoint point) { int encodedLength = point.GetEncodedLength(false); Span<byte> span; if (encodedLength <= 512) { int num = encodedLength; span = new Span<byte>(stackalloc byte[(int)(uint)num], num); } else span = new byte[encodedLength]; Span<byte> span2 = span; point.EncodeTo(false, span2); return new BigInteger(1, span2); } } }