I am really new to cryptography but - what I am trying to do is get the X and Y coordinates from byte array representation of public key. Iam using secp256r1 curve.
// get curve
X9ECParameters x9 = ECNamedCurveTable.GetByName("secp256r1");
ECCurve curve = x9.Curve;
// get coordinates from ASN.1 encoded public key point
var asn1 = (Asn1Sequence)Asn1Object.FromByteArray(publicKeyBytes);
var at1 = (DerBitString)asn1[1];
var bytes = at1.GetBytes();
var x = bytes.Skip(1).Take(32).Reverse().ToArray();
var y = bytes.Skip(33).Take(32).Reverse().ToArray();
// get affine X and Y using point on curve from X and Y
var ecPoint = curve.CreatePoint(new Org.BouncyCastle.Math.BigInteger(1, x), new Org.BouncyCastle.Math.BigInteger(1, y));
ECDomainParameters dParams = new ECDomainParameters(curve, ecPoint, x9.N);
ECPublicKeyParameters pubKey = new ECPublicKeyParameters(ecPoint, dParams);
var affineX = pubKey.Q.AffineXCoord.ToBigInteger().ToByteArrayUnsigned();
var affineY = pubKey.Q.AffineYCoord.ToBigInteger().ToByteArrayUnsigned();
// return a tuple of the coordinates
return (affineX, affineY);
I receive X and Y coordinates but these are probably not right. What am I doing wrong? Thanks
Ok, so, there were few issues with the code. Here is the version that works, maybe it will help someone
internal static (string x, string y) GetCertificateCoordinates(byte[] publicKeyBytes)
{
// parse based on asn1 format the content of the certificate
var asn1 = (Asn1Sequence)Asn1Object.FromByteArray(publicKeyBytes);
var at1 = (DerBitString)asn1[1];
var xyBytes = at1.GetBytes();
//retrieve preddefined parameters for P256 curve
X9ECParameters x9 = ECNamedCurveTable.GetByName("P-256");
//establish domain we will be looking for the x and y
ECDomainParameters domainParams = new ECDomainParameters(x9.Curve, x9.G, x9.N, x9.H, x9.GetSeed());
ECPublicKeyParameters publicKeyParams = new ECPublicKeyParameters(x9.Curve.DecodePoint(xyBytes), domainParams);
//get the affine x and y coordinates
var affineX = EncodeCordinate(publicKeyParams.Q.AffineXCoord.ToBigInteger());
var affineY = EncodeCordinate(publicKeyParams.Q.AffineYCoord.ToBigInteger());
return (affineX, affineY);
}
public static string EncodeCordinate(Org.BouncyCastle.Math.BigInteger integer)
{
var notPadded = integer.ToByteArray();
int bytesToOutput = (256 + 7) / 8;
if (notPadded.Length >= bytesToOutput)
return Jose.Base64Url.Encode(notPadded);
var padded = new byte[bytesToOutput];
Array.Copy(notPadded, 0, padded, bytesToOutput - notPadded.Length, notPadded.Length);
return Jose.Base64Url.Encode(padded);
}
I am using this code in android for the JWT providing X and Y to server side as jwk in header
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.