diff --git a/src/LetsEncrypt/Entities/LetsEncrypt/State.cs b/src/LetsEncrypt/Entities/LetsEncrypt/State.cs index d55db08..3f40e84 100644 --- a/src/LetsEncrypt/Entities/LetsEncrypt/State.cs +++ b/src/LetsEncrypt/Entities/LetsEncrypt/State.cs @@ -1,5 +1,7 @@ -using MaksIT.LetsEncrypt.Models.Responses; +using MaksIT.Core.Security.JWK; +using MaksIT.LetsEncrypt.Models.Responses; using MaksIT.LetsEncrypt.Services; +using System.Security.Cryptography; namespace MaksIT.LetsEncrypt.Entities.LetsEncrypt; @@ -12,4 +14,9 @@ public class State { public List Challenges { get; } = new List(); public string? Nonce { get; set; } public RegistrationCache? Cache { get; set; } + + + + public Jwk? Jwk; + private RSA? RSA; } diff --git a/src/LetsEncrypt/Services/JwsService.cs b/src/LetsEncrypt/Services/JwsService.cs index 97fdfb9..58d8069 100644 --- a/src/LetsEncrypt/Services/JwsService.cs +++ b/src/LetsEncrypt/Services/JwsService.cs @@ -26,12 +26,12 @@ public class JwsService : IJwsService { private RSA _rsa; public JwsService(RSA rsa) { - _rsa = rsa ?? throw new ArgumentNullException(nameof(rsa)); + _rsa = rsa; var publicParameters = rsa.ExportParameters(false); - var exp = publicParameters.Exponent ?? throw new ArgumentNullException(nameof(publicParameters.Exponent)); - var mod = publicParameters.Modulus ?? throw new ArgumentNullException(nameof(publicParameters.Modulus)); + var exp = publicParameters.Exponent; + var mod = publicParameters.Modulus; _jwk = new Jwk() { KeyType = JwkKeyType.Rsa.Name, @@ -80,6 +80,11 @@ public class JwsService : IJwsService { public string GetKeyAuthorization(string token) => $"{token}.{GetSha256Thumbprint()}"; + + /// + /// For thumbprint calculation, always build the JSON string manually or use an anonymous object with the correct property order + /// + /// private string GetSha256Thumbprint() { var thumbprint = new { @@ -88,7 +93,7 @@ public class JwsService : IJwsService { n = _jwk.RsaModulus }; - var json = "{\"e\":\"" + _jwk.RsaExponent + "\",\"kty\":\"RSA\",\"n\":\"" + _jwk.RsaModulus + "\"}"; + var json = thumbprint.ToJson(); return Base64UrlUtility.Encode(SHA256.HashData(Encoding.UTF8.GetBytes(json))); } }