SigV4 v1.2.0
SigV4 Library for AWS Authentication
sigv4.h
Go to the documentation of this file.
1/*
2 * SigV4 Library v1.2.0
3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4 *
5 * SPDX-License-Identifier: MIT
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy of
8 * this software and associated documentation files (the "Software"), to deal in
9 * the Software without restriction, including without limitation the rights to
10 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11 * the Software, and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in all
15 * copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
30#ifndef SIGV4_H_
31#define SIGV4_H_
32
33/* Standard includes. */
34#include <stdint.h>
35#include <stddef.h>
36
37/* *INDENT-OFF* */
38#ifdef __cplusplus
39 extern "C" {
40#endif
41/* *INDENT-ON* */
42
43/* SIGV4_DO_NOT_USE_CUSTOM_CONFIG allows building of the SigV4 library without a
44 * config file. If a config file is provided, the SIGV4_DO_NOT_USE_CUSTOM_CONFIG
45 * macro must not be defined.
46 */
47#ifndef SIGV4_DO_NOT_USE_CUSTOM_CONFIG
48 #include "sigv4_config.h"
49#endif
50
51/* Include config defaults header to get default values of configurations not
52 * defined in sigv4_config.h file. */
54
55/* Convenience macros for library optimization */
56
60#define SIGV4_AWS4_HMAC_SHA256 "AWS4-HMAC-SHA256"
61#define SIGV4_AWS4_HMAC_SHA256_LENGTH ( sizeof( SIGV4_AWS4_HMAC_SHA256 ) - 1U )
62#define SIGV4_HTTP_X_AMZ_DATE_HEADER "x-amz-date"
63#define SIGV4_HTTP_X_AMZ_SECURITY_TOKEN_HEADER "x-amz-security-token"
65#define SIGV4_STREAMING_AWS4_HMAC_SHA256_PAYLOAD "STREAMING-AWS4-HMAC-SHA256-PAYLOAD"
66/* MISRA Ref 5.4.1 [Macro identifiers] */
67/* More details at: https://github.com/aws/SigV4-for-AWS-IoT-embedded-sdk/blob/main/MISRA.md#rule-54 */
68/* coverity[other_declaration] */
69#define SIGV4_HTTP_X_AMZ_CONTENT_SHA256_HEADER "x-amz-content-sha256"
70#define SIGV4_HTTP_X_AMZ_CONTENT_SHA256_HEADER_LENGTH ( sizeof( SIGV4_HTTP_X_AMZ_CONTENT_SHA256_HEADER ) - 1U )
71#define SIGV4_HTTP_X_AMZ_STORAGE_CLASS_HEADER "x-amz-storage-class"
73#define SIGV4_ACCESS_KEY_ID_LENGTH 20U
74#define SIGV4_SECRET_ACCESS_KEY_LENGTH 40U
76#define SIGV4_ISO_STRING_LEN 16U
77#define SIGV4_EXPECTED_LEN_RFC_3339 20U
78#define SIGV4_EXPECTED_LEN_RFC_5322 29U
99#define SIGV4_HTTP_PATH_IS_CANONICAL_FLAG 0x1U
100
108#define SIGV4_HTTP_QUERY_IS_CANONICAL_FLAG 0x2U
109
117#define SIGV4_HTTP_HEADERS_ARE_CANONICAL_FLAG 0x4U
118
126#define SIGV4_HTTP_PAYLOAD_IS_HASH 0x8U
127
135#define SIGV4_HTTP_ALL_ARE_CANONICAL_FLAG 0x7U
136
141typedef enum SigV4Status
142{
151
161
170
178
190
202
210
219
225typedef struct SigV4CryptoInterface
226{
235 int32_t ( * hashInit )( void * pHashContext );
236
247 int32_t ( * hashUpdate )( void * pHashContext,
248 const uint8_t * pInput,
249 size_t inputLen );
250
264 int32_t ( * hashFinal )( void * pHashContext,
265 uint8_t * pOutput,
266 size_t outputLen );
267
272
277
283
289typedef struct SigV4HttpParameters
290{
291 const char * pHttpMethod;
305 uint32_t flags;
306
317 const char * pPath;
318 size_t pathLen;
329 const char * pQuery;
330 size_t queryLen;
341 const char * pHeaders;
342 size_t headersLen;
349 const char * pPayload;
350 size_t payloadLen;
352
358typedef struct SigV4Credentials
359{
364 const char * pAccessKeyId;
370 const char * pSecretAccessKey;
373
383typedef struct SigV4Parameters
384{
390
395 const char * pDateIso8601;
396
401 const char * pAlgorithm;
402
410 const char * pRegion;
411 size_t regionLen;
420 const char * pService;
421 size_t serviceLen;
427
433
490/* @[declare_sigV4_generateHTTPAuthorization_function] */
492 char * pAuthBuf,
493 size_t * authBufLen,
494 char ** pSignature,
495 size_t * signatureLen );
496/* @[declare_sigV4_generateHTTPAuthorization_function] */
497
561/* @[declare_sigV4_awsIotDateToIso8601_function] */
562SigV4Status_t SigV4_AwsIotDateToIso8601( const char * pDate,
563 size_t dateLen,
564 char * pDateISO8601,
565 size_t dateISO8601Len );
566/* @[declare_sigV4_awsIotDateToIso8601_function] */
567
568/* *INDENT-OFF* */
569#ifdef __cplusplus
570 }
571#endif
572/* *INDENT-ON* */
573
574#endif /* SIGV4_H_ */
SigV4Status_t
Return status of the SigV4 Library.
Definition: sigv4.h:142
@ SigV4Success
The SigV4 library function completed successfully.
Definition: sigv4.h:150
@ SigV4InsufficientMemory
The application buffer was not large enough for the specified hash function.
Definition: sigv4.h:169
@ SigV4HashError
An error occurred while performing a hash operation.
Definition: sigv4.h:209
@ SigV4ISOFormattingError
An error occurred while formatting the provided date header.
Definition: sigv4.h:177
@ SigV4MaxQueryPairCountExceeded
The maximum number of query parameters was exceeded while parsing the query string passed to the libr...
Definition: sigv4.h:201
@ SigV4MaxHeaderPairCountExceeded
The maximum number of header parameters was exceeded while parsing the http header string passed to t...
Definition: sigv4.h:189
@ SigV4InvalidHttpHeaders
HTTP headers parsed to the library are invalid.
Definition: sigv4.h:217
@ SigV4InvalidParameter
The SigV4 library function received an invalid input parameter.
Definition: sigv4.h:160
SigV4Status_t SigV4_GenerateHTTPAuthorization(const SigV4Parameters_t *pParams, char *pAuthBuf, size_t *authBufLen, char **pSignature, size_t *signatureLen)
Generates the HTTP Authorization header value.
Definition: sigv4.c:3186
SigV4Status_t SigV4_AwsIotDateToIso8601(const char *pDate, size_t dateLen, char *pDateISO8601, size_t dateISO8601Len)
Parse the date header value from the AWS IoT response, and generate the formatted ISO 8601 date requi...
Definition: sigv4.c:3110
The default values for configuration macros used by the SigV4 Library.
Configurations for the AWS credentials used to generate the Signing Key.
Definition: sigv4.h:359
size_t secretAccessKeyLen
Length of pSecretAccessKey.
Definition: sigv4.h:371
const char * pSecretAccessKey
The pSecretAccessKey MUST be at least 40 characters long.
Definition: sigv4.h:370
const char * pAccessKeyId
The pAccessKeyId MUST be at least 16 characters long but not more than 128 characters long.
Definition: sigv4.h:364
size_t accessKeyIdLen
Length of pAccessKeyId.
Definition: sigv4.h:365
The cryptography interface used to supply the user-defined hash implementation.
Definition: sigv4.h:226
size_t hashBlockLen
The block length of the hash function.
Definition: sigv4.h:276
size_t hashDigestLen
The digest length of the hash function.
Definition: sigv4.h:281
void * pHashContext
Context for the hashInit, hashUpdate, and hashFinal interfaces.
Definition: sigv4.h:271
Configurations of the HTTP request used to create the Canonical Request.
Definition: sigv4.h:290
const char * pPath
The path in the HTTP request. This is the absolute request URI, which contains everything in the URI ...
Definition: sigv4.h:317
const char * pHeaders
The headers from the HTTP request that we want to sign. This should be the raw headers in HTTP reques...
Definition: sigv4.h:341
size_t queryLen
Length of pQuery.
Definition: sigv4.h:330
const char * pPayload
The HTTP response body, if one exists (ex. PUT request). If this body is chunked, then this field sho...
Definition: sigv4.h:349
uint32_t flags
These flags are used to indicate if the path, query, or headers are already in the canonical form....
Definition: sigv4.h:305
size_t pathLen
Length of pPath.
Definition: sigv4.h:318
const char * pQuery
The HTTP request query from the URL, if it exists. This contains all characters following the questio...
Definition: sigv4.h:329
size_t headersLen
Length of pHeaders.
Definition: sigv4.h:342
size_t payloadLen
Length of pPayload.
Definition: sigv4.h:350
const char * pHttpMethod
The HTTP method: GET, POST, PUT, etc.
Definition: sigv4.h:291
size_t httpMethodLen
Length of pHttpMethod.
Definition: sigv4.h:292
Complete configurations required for generating "String to Sign" and "Signing Key" values.
Definition: sigv4.h:384
const char * pService
The target AWS service for the request. The service name can be found as the first segment of the ser...
Definition: sigv4.h:420
const char * pRegion
The target AWS region for the request. Please see https://docs.aws.amazon.com/general/latest/gr/rande...
Definition: sigv4.h:410
SigV4Credentials_t * pCredentials
The AccessKeyId, SecretAccessKey, and SecurityToken used to generate the Authorization header.
Definition: sigv4.h:389
size_t algorithmLen
Length of pAlgorithm.
Definition: sigv4.h:403
const char * pDateIso8601
The date in ISO 8601 format, e.g. "20150830T123600Z". This is always 16 characters long.
Definition: sigv4.h:395
SigV4HttpParameters_t * pHttpParameters
HTTP specific SigV4 parameters for canonical request calculation.
Definition: sigv4.h:431
SigV4CryptoInterface_t * pCryptoInterface
The cryptography interface.
Definition: sigv4.h:426
const char * pAlgorithm
The algorithm used for SigV4 authentication. If set to NULL, this will automatically be set to "AWS4-...
Definition: sigv4.h:401
size_t regionLen
Length of pRegion.
Definition: sigv4.h:411
size_t serviceLen
Length of pService.
Definition: sigv4.h:421