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);
        }
예제 #2
0
        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));
        }