// SEQUENCE // INTEGER 0 version // SEQUENCE // OBJECT IDENTIFIER 1.2.840.113549.1.1.1 // NULL // OCTET STRING // SEQUENCE // INTEGER 0 // INTEGER N // INTEGER E // INTEGER D // INTEGER P // INTEGER Q // INTEGER DP // INTEGER DQ // INTEGER QI private static RsaJwk ReadRsaPrivateKey(ref AsnReader reader) { reader = reader.ReadOctetString(); reader = reader.ReadSequence(); var version = reader.ReadInteger(); if (version.Length != 1 || version[0] != 0) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } var n = reader.ReadInteger(); var e = reader.ReadInteger(); var d = reader.ReadInteger(); var p = reader.ReadInteger(); var q = reader.ReadInteger(); var dp = reader.ReadInteger(); var dq = reader.ReadInteger(); var qi = reader.ReadInteger(); if (reader.Read()) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } return(RsaJwk.FromByteArray( n: AsnReader.TrimLeadingZeroes(n), e: AsnReader.TrimLeadingZeroes(e, align: false), d: AsnReader.TrimLeadingZeroes(d), p: AsnReader.TrimLeadingZeroes(p), q: AsnReader.TrimLeadingZeroes(q), dp: AsnReader.TrimLeadingZeroes(dp), dq: AsnReader.TrimLeadingZeroes(dq), qi: AsnReader.TrimLeadingZeroes(qi))); }
// SEQUENCE // INTEGER N // INTEGER E public static RsaJwk ReadRsaPublicKey(ReadOnlySpan <char> key) { var data = key.Slice(PublicRsaKeyPrefix.Length, key.Length - PublicRsaKeyPrefix.Length - PublicRsaKeySuffix.Length); byte[] tmpArray; Span <byte> keyData = tmpArray = ArrayPool <byte> .Shared.Rent(Base64.GetArraySizeRequiredToDecode(data.Length)); try { int length = Base64.Decode(data, keyData); var reader = new AsnReader(keyData.Slice(0, length)); reader = reader.ReadSequence(); var n = reader.ReadInteger(); var e = reader.ReadInteger(); if (reader.Read()) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } return(RsaJwk.FromByteArray( n: AsnReader.TrimLeadingZeroes(n), e: AsnReader.TrimLeadingZeroes(e, align: false))); } finally { ArrayPool <byte> .Shared.Return(tmpArray); } }
// SEQUENCE // SEQUENCE // OBJECT IDENTIFIER 1.2.840.113549.1.1.1 // NULL // BIT STRING // SEQUENCE // INTEGER N // INTEGER E private static AsymmetricJwk ReadRsaPublicKey(ref AsnReader reader) { reader = reader.ReadBitString(); reader = reader.ReadSequence(); var n = reader.ReadInteger(); var e = reader.ReadInteger(); if (reader.Read()) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } return(RsaJwk.FromByteArray( n: AsnReader.TrimLeadingZeroes(n), e: AsnReader.TrimLeadingZeroes(e, align: false))); }
// SEQUENCE // INTEGER 0 // INTEGER N // INTEGER E // INTEGER D // INTEGER P // INTEGER Q // INTEGER DP // INTEGER DQ // INTEGER QI public static RsaJwk ReadRsaPrivateKey(ReadOnlySpan <char> key) { var data = key.Slice(PrivateRsaKeyPrefix.Length, key.Length - PrivateRsaKeyPrefix.Length - PrivatRsaKeySuffix.Length); byte[] tmpArray; Span <byte> keyData = tmpArray = ArrayPool <byte> .Shared.Rent(Base64.GetArraySizeRequiredToDecode(data.Length)); try { int length = Base64.Decode(data, keyData); var reader = new AsnReader(keyData.Slice(0, length)); reader = reader.ReadSequence(); var version = reader.ReadInteger(); if (version.Length != 1 || version[0] != 0) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } var n = reader.ReadInteger(); var e = reader.ReadInteger(); var d = reader.ReadInteger(); var p = reader.ReadInteger(); var q = reader.ReadInteger(); var dp = reader.ReadInteger(); var dq = reader.ReadInteger(); var qi = reader.ReadInteger(); if (reader.Read()) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } return(RsaJwk.FromByteArray( n: AsnReader.TrimLeadingZeroes(n), e: AsnReader.TrimLeadingZeroes(e, align: false), d: AsnReader.TrimLeadingZeroes(d), p: AsnReader.TrimLeadingZeroes(p), q: AsnReader.TrimLeadingZeroes(q), dp: AsnReader.TrimLeadingZeroes(dp), dq: AsnReader.TrimLeadingZeroes(dq), qi: AsnReader.TrimLeadingZeroes(qi))); } finally { ArrayPool <byte> .Shared.Return(tmpArray); } }
// SEQUENCE // INTEGER N // INTEGER E public static RsaJwk ReadRsaPublicKey(string key) { string base64KeyData = key.Substring(PublicRsaKeyPrefix.Length, key.Length - PublicRsaKeyPrefix.Length - PublicRsaKeySuffix.Length); byte[] keyData = Convert.FromBase64String(base64KeyData); var reader = new AsnReader(keyData); reader = reader.ReadSequence(); var n = reader.ReadInteger(); var e = reader.ReadInteger(); if (reader.Read()) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } return(RsaJwk.FromByteArray( n: AsnReader.TrimLeadingZeroes(n), e: AsnReader.TrimLeadingZeroes(e, align: false))); }
// SEQUENCE // INTEGER 0 // INTEGER N // INTEGER E // INTEGER D // INTEGER P // INTEGER Q // INTEGER DP // INTEGER DQ // INTEGER QI public static RsaJwk ReadRsaPrivateKey(string key) { string base64KeyData = key.Substring(PrivateRsaKeyPrefix.Length, key.Length - PrivateRsaKeyPrefix.Length - PrivatRsaKeySuffix.Length); byte[] keyData = Convert.FromBase64String(base64KeyData); var reader = new AsnReader(keyData); reader = reader.ReadSequence(); var version = reader.ReadInteger(); if (version.Length != 1 || version[0] != 0) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } var n = reader.ReadInteger(); var e = reader.ReadInteger(); var d = reader.ReadInteger(); var p = reader.ReadInteger(); var q = reader.ReadInteger(); var dp = reader.ReadInteger(); var dq = reader.ReadInteger(); var qi = reader.ReadInteger(); if (reader.Read()) { ThrowHelper.ThrowInvalidOperationException_InvalidPem(); } return(RsaJwk.FromByteArray( n: AsnReader.TrimLeadingZeroes(n), e: AsnReader.TrimLeadingZeroes(e, align: false), d: AsnReader.TrimLeadingZeroes(d), p: AsnReader.TrimLeadingZeroes(p), q: AsnReader.TrimLeadingZeroes(q), dp: AsnReader.TrimLeadingZeroes(dp), dq: AsnReader.TrimLeadingZeroes(dq), qi: AsnReader.TrimLeadingZeroes(qi))); }