/// <summary>Returns a new instance of <see cref="Jwks"/>.</summary> /// <param name="issuer">The issuer of the keys.</param> /// <param name="json">a string that contains JSON Web Key parameters in JSON format.</param> public static Jwks FromJson(string issuer, ReadOnlySpan <byte> json) { // a JWKS is : // { // "keys": [ // { jwk1 }, // { jwk2 }, // ... // ] // } var jwks = new Jwks(issuer); var reader = new Utf8JsonReader(json, true, default); if (reader.Read() && reader.TokenType is JsonTokenType.StartObject && reader.Read()) { while (reader.TokenType is JsonTokenType.PropertyName) { var propertyName = reader.ValueSpan; if (propertyName.Length == 4) { ref byte propertyNameRef = ref MemoryMarshal.GetReference(propertyName); if (IntegerMarshal.ReadUInt32(ref propertyNameRef) == keys /* keys */) { if (reader.Read() && reader.TokenType is JsonTokenType.StartArray) { while (reader.Read() && reader.TokenType is JsonTokenType.StartObject) { Jwk jwk = Jwk.FromJsonReader(ref reader); jwks.Add(jwk); } if (!(reader.TokenType is JsonTokenType.EndArray) || !reader.Read()) { ThrowHelper.ThrowInvalidOperationException_MalformedJwks(); } } continue; } } reader.Read(); if (reader.TokenType >= JsonTokenType.String && reader.TokenType <= JsonTokenType.Null) { reader.Read(); } else if (reader.TokenType == JsonTokenType.StartObject) { JsonParser.ConsumeJsonObject(ref reader); } else if (reader.TokenType == JsonTokenType.StartArray) { JsonParser.ConsumeJsonArray(ref reader); } else { ThrowHelper.ThrowInvalidOperationException_MalformedJwks(); } } }
/// <summary> /// Returns a new instance of <see cref="Jwks"/>. /// </summary> /// <param name="json">a string that contains JSON Web Key parameters in JSON format.</param> /// <returns><see cref="Jwks"/></returns> public static Jwks FromJson(ReadOnlySpan <byte> json) { // a JWKS is : // { // "keys": [ // { jwk1 }, // { jwk2 }, // ... // ] // } var jwks = new Jwks(); var reader = new Utf8JsonReader(json, true, default); if (reader.Read() && reader.TokenType is JsonTokenType.StartObject && reader.Read() && reader.TokenType is JsonTokenType.PropertyName) { var propertyName = reader.ValueSpan /* reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan */; if (propertyName.Length == 4) { ref byte propertyNameRef = ref MemoryMarshal.GetReference(propertyName); if (IntegerMarshal.ReadUInt32(ref propertyNameRef) == keys /* keys */) { if (reader.Read() && reader.TokenType is JsonTokenType.StartArray) { while (reader.Read() && reader.TokenType is JsonTokenType.StartObject) { Jwk jwk = Jwk.FromJsonReader(ref reader); jwks.Add(jwk); } if (!(reader.TokenType is JsonTokenType.EndArray) || !reader.Read()) { ThrowHelper.ThrowInvalidOperationException_MalformedJwks(); } } } } }