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)));
        }