예제 #1
0
파일: Pkcs8.cs 프로젝트: uruk-project/Jwt
        // 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();
            }
        }