From 4a81716535e13748b63ffa1ee027d093c1adc303 Mon Sep 17 00:00:00 2001 From: vnugent Date: Sat, 14 Jan 2023 16:33:01 -0500 Subject: Utils updates --- .../src/VaultSecrets.cs | 41 +++++++++++++++------- 1 file changed, 29 insertions(+), 12 deletions(-) (limited to 'lib/VNLib.Plugins.Extensions.Loading/src/VaultSecrets.cs') diff --git a/lib/VNLib.Plugins.Extensions.Loading/src/VaultSecrets.cs b/lib/VNLib.Plugins.Extensions.Loading/src/VaultSecrets.cs index 2b6bfd8..d3bdf42 100644 --- a/lib/VNLib.Plugins.Extensions.Loading/src/VaultSecrets.cs +++ b/lib/VNLib.Plugins.Extensions.Loading/src/VaultSecrets.cs @@ -328,20 +328,21 @@ namespace VNLib.Plugins.Extensions.Loading _ = secret ?? throw new ArgumentNullException(nameof(secret)); //Temp buffer - using UnsafeMemoryHandle buffer = Memory.UnsafeAlloc(secret.Result.Length); + using UnsafeMemoryHandle buffer = MemoryUtil.UnsafeAlloc(secret.Result.Length); //Get base64 - if(Convert.TryFromBase64Chars(secret.Result, buffer, out int count)) + if(!Convert.TryFromBase64Chars(secret.Result, buffer, out int count)) { - //Copy to array - byte[] value = buffer.Span[..count].ToArray(); - //Clear block before returning - Memory.InitializeBlock(buffer); - - return value; + throw new InternalBufferTooSmallException("internal buffer too small"); } - throw new InternalBufferTooSmallException("internal buffer too small"); + //Copy to array + byte[] value = buffer.Span[..count].ToArray(); + + //Clear block before returning + MemoryUtil.InitializeBlock(buffer); + + return value; } /// @@ -354,7 +355,9 @@ namespace VNLib.Plugins.Extensions.Loading public static async Task ToBase64Bytes(this Task secret) { _ = secret ?? throw new ArgumentNullException(nameof(secret)); + using SecretResult? sec = await secret.ConfigureAwait(false); + return sec?.GetFromBase64(); } @@ -378,12 +381,16 @@ namespace VNLib.Plugins.Extensions.Loading public static JsonDocument GetJsonDocument(this SecretResult secret) { _ = secret ?? throw new ArgumentNullException(nameof(secret)); + //Alloc buffer, utf8 so 1 byte per char - using IMemoryHandle buffer = Memory.SafeAlloc(secret.Result.Length); + using IMemoryHandle buffer = MemoryUtil.SafeAlloc(secret.Result.Length); + //Get utf8 bytes int count = Encoding.UTF8.GetBytes(secret.Result, buffer.Span); + //Reader and parse Utf8JsonReader reader = new(buffer.Span[..count]); + return JsonDocument.ParseValue(ref reader); } @@ -396,10 +403,13 @@ namespace VNLib.Plugins.Extensions.Loading public static PublicKey GetPublicKey(this SecretResult secret) { _ = secret ?? throw new ArgumentNullException(nameof(secret)); + //Alloc buffer, base64 is larger than binary value so char len is large enough - using IMemoryHandle buffer = Memory.SafeAlloc(secret.Result.Length); + using IMemoryHandle buffer = MemoryUtil.SafeAlloc(secret.Result.Length); + //Get base64 bytes ERRNO count = VnEncoding.TryFromBase64Chars(secret.Result, buffer.Span); + //Parse the SPKI from base64 return PublicKey.CreateFromSubjectPublicKeyInfo(buffer.Span[..(int)count], out _); } @@ -429,10 +439,13 @@ namespace VNLib.Plugins.Extensions.Loading public static ReadOnlyJsonWebKey GetJsonWebKey(this SecretResult secret) { _ = secret ?? throw new ArgumentNullException(nameof(secret)); + //Alloc buffer, utf8 so 1 byte per char - using IMemoryHandle buffer = Memory.SafeAlloc(secret.Result.Length); + using IMemoryHandle buffer = MemoryUtil.SafeAlloc(secret.Result.Length); + //Get utf8 bytes int count = Encoding.UTF8.GetBytes(secret.Result, buffer.Span); + return new ReadOnlyJsonWebKey(buffer.Span[..count]); } @@ -446,7 +459,9 @@ namespace VNLib.Plugins.Extensions.Loading public static async Task ToJsonWebKey(this Task secret) { _ = secret ?? throw new ArgumentNullException(nameof(secret)); + using SecretResult? sec = await secret.ConfigureAwait(false); + return sec?.GetJsonWebKey(); } @@ -464,7 +479,9 @@ namespace VNLib.Plugins.Extensions.Loading public static async Task ToJsonWebKey(this Task secret, bool required) { _ = secret ?? throw new ArgumentNullException(nameof(secret)); + using SecretResult? sec = await secret.ConfigureAwait(false); + //If required is true and result is null, raise an exception return required && sec == null ? throw new KeyNotFoundException("A required secret was missing") : (sec?.GetJsonWebKey()!); } -- cgit