protected override PublicKey BuildPublicKey() { ECParameters ecParameters = _key.ExportParameters(false); if (!ecParameters.Curve.IsNamed) { throw new InvalidOperationException(SR.GetString(SR.Cryptography_ECC_NamedCurvesOnly)); } string curveOid = ecParameters.Curve.Oid.Value; if (string.IsNullOrEmpty(curveOid)) { string friendlyName = ecParameters.Curve.Oid.FriendlyName; // Translate the three curves that were supported Windows 7-8.1, but emit no Oid.Value; // otherwise just wash the friendly name back through Oid to see if we can get a value. switch (friendlyName) { case "nistP256": curveOid = Oids.EccCurveSecp256r1; break; case "nistP384": curveOid = Oids.EccCurveSecp384r1; break; case "nistP521": curveOid = Oids.EccCurveSecp521r1; break; default: curveOid = new Oid(friendlyName).Value; break; } } Debug.Assert(ecParameters.Q.X.Length == ecParameters.Q.Y.Length); byte[] uncompressedPoint = new byte[1 + ecParameters.Q.X.Length + ecParameters.Q.Y.Length]; // Uncompressed point (0x04) uncompressedPoint[0] = 0x04; Buffer.BlockCopy(ecParameters.Q.X, 0, uncompressedPoint, 1, ecParameters.Q.X.Length); Buffer.BlockCopy(ecParameters.Q.Y, 0, uncompressedPoint, 1 + ecParameters.Q.X.Length, ecParameters.Q.Y.Length); Oid ecPublicKey = new Oid(Oids.Ecc); return(new PublicKey( ecPublicKey, new AsnEncodedData(ecPublicKey, DerEncoder.EncodeOid(curveOid)), new AsnEncodedData(ecPublicKey, uncompressedPoint))); }