createAWS4Header method

Map<String, String> createAWS4Header(
  1. dynamic credentials,
  2. Map<String, dynamic> payload, [
  3. String? datetime
])

Implementation

Map<String, String> createAWS4Header(dynamic credentials, Map<String, dynamic> payload, [String? datetime]) {
  final accessKeyId = credentials['Credentials']['AccessKeyId'];
  final secretKey = credentials['Credentials']['SecretKey'];
  final sessionToken = credentials['Credentials']['SessionToken'];
  datetime ??= getDateTime();

  Map<String, String> headers = {
    'accept': 'application/json',
    'content-type': 'application/x-amz-json-1.1; charset=utf-8',
    'host': 'ssm.$region.amazonaws.com',
    'x-amz-date': datetime,
    'x-amz-target': 'AmazonSSM.GetParameters'
  };

  final canonicalRequest = [
    'POST',
    '/',
    '',
    headers.map((key, value) => MapEntry(key, '$key:$value')).values.join('\n') + '\n',
    headers.keys.join(';'),
    hex.encode(sha256.convert(utf8.encode(json.encode(payload))).bytes)
  ].join('\n');

  final hashedCanonicalRequest = hex.encode(sha256.convert(utf8.encode(canonicalRequest)).bytes);
  final credentialScope = '${datetime.substring(0, 8)}/$region/ssm/aws4_request';
  final stringToSign = ['AWS4-HMAC-SHA256', datetime, credentialScope, hashedCanonicalRequest].join('\n');

  final signingKey = _sign(
      _sign(_sign(_sign(utf8.encode('AWS4$secretKey'), datetime.substring(0, 8)), region), 'ssm'), 'aws4_request');
  final signature = hex.encode(_sign(signingKey, stringToSign));

  headers['Authorization'] = [
    'AWS4-HMAC-SHA256',
    ' Credential=',
    accessKeyId,
    '/',
    credentialScope,
    ', SignedHeaders=',
    headers.keys.join(';'),
    ', Signature=',
    signature
  ].join();
  headers['x-amz-security-token'] = sessionToken;

  return headers;
}