// SEQUENCE // INTEGER 0 // SEQUENCE // OBJECT IDENTIFIER 1.2.840.10045.2.1 // OBJECT IDENTIFIER EC curve OID // OCTET STRING // SEQUENCE // INTEGER 1 // OCTET STRING private key // [1] // BIT STRING public key private static ECJwk ReadECPrivateKey(ref AsnReader reader, int[] curveOid) { reader = reader.ReadOctetString(); reader = reader.ReadSequence(); var version = reader.ReadInteger(); if (version.Length != 1 || version[0] != 1) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } var privateKey = reader.ReadOctetStringBytes().ToArray(); reader = reader.ReadSequence(true); var publicKey = reader.ReadBitStringBytes(); if (publicKey.IsEmpty) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } if (publicKey[0] != 0x04) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } if (publicKey.Length != 2 * privateKey.Length + 1) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } var x = publicKey.Slice(1, privateKey.Length).ToArray(); var y = publicKey.Slice(1 + privateKey.Length).ToArray(); if (reader.Read()) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } if (IsP256(curveOid)) { return(ECJwk.FromByteArray(EllipticalCurve.P256, d: privateKey, x: x, y: y)); } else if (IsP384(curveOid)) { return(ECJwk.FromByteArray(EllipticalCurve.P384, d: privateKey, x: x, y: y)); } else if (IsP521(curveOid)) { return(ECJwk.FromByteArray(EllipticalCurve.P521, d: privateKey, x: x, y: y)); } else { throw new NotSupportedException(); } }