X9ECPoint
using Org.BouncyCastle.Math.EC;
using Org.BouncyCastle.Utilities;
using System;
namespace Org.BouncyCastle.Asn1.X9
{
public class X9ECPoint : Asn1Encodable
{
private readonly Asn1OctetString m_encoding;
private readonly ECCurve m_c;
private ECPoint m_p;
public Asn1OctetString PointEncoding => m_encoding;
public ECPoint Point => Objects.EnsureSingletonInitialized(ref m_p, this, (X9ECPoint self) => self.CreatePoint());
public bool IsPointCompressed {
get {
byte[] octets = m_encoding.GetOctets();
if (octets.Length != 0) {
if (octets[0] != 2)
return octets[0] == 3;
return true;
}
return false;
}
}
public X9ECPoint(ECPoint p, bool compressed)
{
m_c = p.Curve;
m_p = p.Normalize();
m_encoding = new DerOctetString(p.GetEncoded(compressed));
}
public X9ECPoint(ECCurve c, byte[] encoding)
: this(c, DerOctetString.FromContents(encoding))
{
}
public X9ECPoint(ECCurve c, Asn1OctetString s)
{
if (c == null)
throw new ArgumentNullException("c");
m_c = c;
m_p = null;
if (s == null)
throw new ArgumentNullException("s");
m_encoding = s;
}
public byte[] GetPointEncoding()
{
return Arrays.Clone(m_encoding.GetOctets());
}
public override Asn1Object ToAsn1Object()
{
return m_encoding;
}
private ECPoint CreatePoint()
{
return m_c.DecodePoint(m_encoding.GetOctets());
}
}
}