public async Task <Signature> CreateSignature(HttpRequestMessage request, SigningSettings settings, DateTimeOffset timeOfSigning) { if (request == null) { throw new ArgumentNullException(nameof(request)); } if (settings == null) { throw new ArgumentNullException(nameof(settings)); } _signingSettingsSanitizer.SanitizeHeaderNamesToInclude(settings, request); settings.Validate(); var nonce = settings.EnableNonce ? _nonceGenerator.GenerateNonce() : null; var requestForSigning = request.ToRequestForSigning(); var signingString = _signingStringComposer.Compose( requestForSigning, settings.SignatureAlgorithm.Name, settings.Headers, timeOfSigning, settings.Expires, nonce); var eventTask = settings.Events?.OnSigningStringComposed?.Invoke(request, signingString); if (eventTask != null) { await eventTask; } _logger?.LogDebug("Composed the following signing string for request signing: {0}", signingString); var signatureHash = settings.SignatureAlgorithm.ComputeHash(signingString); var signatureString = _base64Converter.ToBase64(signatureHash); _logger?.LogDebug("The base64 hash of the signature string for signing is '{0}'.", signatureString); var signature = new Signature { KeyId = settings.KeyId, Algorithm = $"{settings.SignatureAlgorithm.Name.ToLowerInvariant()}-{settings.SignatureAlgorithm.HashAlgorithm.ToString().ToLowerInvariant()}", Created = timeOfSigning, Expires = timeOfSigning.Add(settings.Expires), Headers = settings.Headers, Nonce = nonce, String = signatureString }; return(signature); }
public IRequestSigner Create(KeyId keyId, SigningSettings signingSettings) { if (keyId == KeyId.Empty) { throw new ArgumentException("The specified key id cannot be empty.", nameof(keyId)); } if (signingSettings == null) { throw new ArgumentNullException(nameof(signingSettings)); } signingSettings.KeyId = keyId; signingSettings.Validate(); return(new RequestSigner( _signingSettingsSanitizer, _signatureCreator, _authorizationHeaderParamCreator, signingSettings, _signatureHeaderEnsurer, _systemClock, _logger)); }