| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | using Google.Apis.Json; |
| | using Google.Apis.Util; |
| | using System; |
| | using System.Security.Cryptography; |
| | using System.Text; |
| |
|
| | namespace Google.Apis.Auth |
| | { |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | internal class SignedToken<TJwsHeader, TJwsPayload> |
| | where TJwsHeader : JsonWebSignature.Header |
| | where TJwsPayload : JsonWebSignature.Payload |
| | { |
| | private readonly Lazy<byte[]> _sha256; |
| |
|
| | internal string EncodedHeader { get; } |
| | internal string EncodedPayload { get; } |
| | internal TJwsHeader Header { get; } |
| | internal TJwsPayload Payload { get; } |
| | internal byte[] Signature { get; } |
| | internal byte[] Sha256Hash => _sha256.Value; |
| |
|
| | private SignedToken(string encodedHeader, string encodedPayload, TJwsHeader header, TJwsPayload payload, byte[] signature) |
| | { |
| | EncodedHeader = encodedHeader.ThrowIfNullOrEmpty(nameof(encodedHeader)); |
| | EncodedPayload = encodedPayload.ThrowIfNullOrEmpty(nameof(encodedPayload)); |
| | Header = header.ThrowIfNull(nameof(header)); |
| | Payload = payload.ThrowIfNull(nameof(payload)); |
| | Signature = signature; |
| | _sha256 = new Lazy<byte[]>(InitSha256); |
| | } |
| |
|
| | internal static SignedToken<TJwsHeader, TJwsPayload> FromSignedToken(string signedToken) |
| | { |
| | |
| | |
| | |
| | signedToken.ThrowIfNull(nameof(signedToken)); |
| | signedToken.ThrowIfNullOrEmpty(nameof(signedToken)); |
| |
|
| | var parts = signedToken.Split('.'); |
| | if (parts.Length != 3) |
| | { |
| | throw new InvalidJwtException($"JWT must consist of Header, Payload, and Signature"); |
| | } |
| |
|
| | var encodedHeader = parts[0]; |
| | var encodedPayload = parts[1]; |
| |
|
| | |
| | var headerValue = NewtonsoftJsonSerializer.Instance.Deserialize<TJwsHeader>(TokenEncodingHelpers.Base64UrlToString(encodedHeader)); |
| | var payloadValue = NewtonsoftJsonSerializer.Instance.Deserialize<TJwsPayload>(TokenEncodingHelpers.Base64UrlToString(encodedPayload)); |
| | var signature = TokenEncodingHelpers.Base64UrlDecode(parts[2]); |
| |
|
| | return new SignedToken<TJwsHeader, TJwsPayload>(encodedHeader, encodedPayload, headerValue, payloadValue, signature); |
| | } |
| |
|
| | private byte[] InitSha256() |
| | { |
| | using var hashAlg = SHA256.Create(); |
| | return hashAlg.ComputeHash(Encoding.ASCII.GetBytes($"{EncodedHeader}.{EncodedPayload}")); |
| | } |
| | } |
| | } |
| |
|