/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ using System; using System.Collections.Generic; using System.Security; using System.Text; using Amazon.Runtime.Internal; using Amazon.Runtime.Internal.Util; using Amazon.Util; namespace Amazon.Runtime.Internal.Auth { public class QueryStringSigner : AbstractAWSSigner { private const string SignatureVersion2 = "2"; public QueryStringSigner() { } public override ClientProtocol Protocol { get { return ClientProtocol.QueryStringProtocol; } } /// /// Signs the specified request with the AWS2 signing protocol by using the /// AWS account credentials given in the method parameters. /// /// The AWS public key /// The AWS secret key used to sign the request in clear text /// Request metrics /// The configuration that specifies which hashing algorithm to use /// The request to have the signature compute for /// If any problems are encountered while signing the request public override void Sign(IRequest request, IClientConfig clientConfig, RequestMetrics metrics, string awsAccessKeyId, string awsSecretAccessKey) { if (String.IsNullOrEmpty(awsAccessKeyId)) { throw new ArgumentOutOfRangeException("awsAccessKeyId", "The AWS Access Key ID cannot be NULL or a Zero length string"); } request.Parameters["AWSAccessKeyId"] = awsAccessKeyId; request.Parameters["SignatureVersion"] = SignatureVersion2; request.Parameters["SignatureMethod"] = clientConfig.SignatureMethod.ToString(); request.Parameters["Timestamp"] = AWSSDKUtils.GetFormattedTimestampISO8601(clientConfig); // remove Signature parameter, in case this is a retry request.Parameters.Remove("Signature"); string toSign = AWSSDKUtils.CalculateStringToSignV2(request.ParameterCollection, request.Endpoint.AbsoluteUri); metrics.AddProperty(Metric.StringToSign, toSign); string auth = ComputeHash(toSign, awsSecretAccessKey, clientConfig.SignatureMethod); request.Parameters["Signature"] = auth; } /// /// Signs the specified request with the AWS2 signing protocol by using the /// AWS account credentials given in the method parameters. /// /// The request to have the signature compute for /// The configuration that specifies which hashing algorithm to use /// Request metrics /// AWS credentials for the account making the request /// If any problems are encountered while signing the request public override void Sign(IRequest request, IClientConfig clientConfig, RequestMetrics metrics, ImmutableCredentials credentials) { Sign(request, clientConfig, metrics, credentials.AccessKey, credentials.SecretKey); } } }