SigV4  v1.0.0
SigV4 Library for AWS Authentication
sigv4.h
Go to the documentation of this file.
1 /*
2  * SigV4 Utility Library v1.0.0
3  * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of
6  * this software and associated documentation files (the "Software"), to deal in
7  * the Software without restriction, including without limitation the rights to
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9  * the Software, and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in all
13  * copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21  */
22 
28 #ifndef SIGV4_H_
29 #define SIGV4_H_
30 
31 /* Standard includes. */
32 #include <stdint.h>
33 #include <stddef.h>
34 
35 /* *INDENT-OFF* */
36 #ifdef __cplusplus
37  extern "C" {
38 #endif
39 /* *INDENT-ON* */
40 
41 /* SIGV4_DO_NOT_USE_CUSTOM_CONFIG allows building of the SigV4 library without a
42  * config file. If a config file is provided, the SIGV4_DO_NOT_USE_CUSTOM_CONFIG
43  * macro must not be defined.
44  */
45 #ifndef SIGV4_DO_NOT_USE_CUSTOM_CONFIG
46  #include "sigv4_config.h"
47 #endif
48 
49 /* Include config defaults header to get default values of configurations not
50  * defined in sigv4_config.h file. */
51 #include "sigv4_config_defaults.h"
52 
53 /* Convenience macros for library optimization */
54 
58 #define SIGV4_AWS4_HMAC_SHA256 "AWS4-HMAC-SHA256"
59 #define SIGV4_AWS4_HMAC_SHA256_LENGTH ( sizeof( SIGV4_AWS4_HMAC_SHA256 ) - 1U )
60 #define SIGV4_HTTP_X_AMZ_DATE_HEADER "x-amz-date"
61 #define SIGV4_HTTP_X_AMZ_SECURITY_TOKEN_HEADER "x-amz-security-token"
63 #define SIGV4_STREAMING_AWS4_HMAC_SHA256_PAYLOAD "STREAMING-AWS4-HMAC-SHA256-PAYLOAD"
64 #define SIGV4_HTTP_X_AMZ_CONTENT_SHA256_HEADER "x-amz-content-sha256"
65 #define SIGV4_HTTP_X_AMZ_STORAGE_CLASS_HEADER "x-amz-storage-class"
67 #define SIGV4_ACCESS_KEY_ID_LENGTH 20U
68 #define SIGV4_SECRET_ACCESS_KEY_LENGTH 40U
70 #define SIGV4_ISO_STRING_LEN 16U
71 #define SIGV4_EXPECTED_LEN_RFC_3339 20U
72 #define SIGV4_EXPECTED_LEN_RFC_5322 29U
73 
93 #define SIGV4_HTTP_PATH_IS_CANONICAL_FLAG 0x1U
94 
102 #define SIGV4_HTTP_QUERY_IS_CANONICAL_FLAG 0x2U
103 
111 #define SIGV4_HTTP_HEADERS_ARE_CANONICAL_FLAG 0x4U
112 
120 #define SIGV4_HTTP_ALL_ARE_CANONICAL_FLAG 0x7U
121 
126 typedef enum SigV4Status
127 {
136 
146 
155 
163 
175 
187 
195 
204 
210 typedef struct SigV4CryptoInterface
211 {
220  int32_t ( * hashInit )( void * pHashContext );
221 
232  int32_t ( * hashUpdate )( void * pHashContext,
233  const uint8_t * pInput,
234  size_t inputLen );
235 
249  int32_t ( * hashFinal )( void * pHashContext,
250  uint8_t * pOutput,
251  size_t outputLen );
252 
256  void * pHashContext;
257 
261  size_t hashBlockLen;
262 
268 
274 typedef struct SigV4HttpParameters
275 {
276  const char * pHttpMethod;
277  size_t httpMethodLen;
290  uint32_t flags;
291 
302  const char * pPath;
303  size_t pathLen;
314  const char * pQuery;
315  size_t queryLen;
326  const char * pHeaders;
327  size_t headersLen;
334  const char * pPayload;
335  size_t payloadLen;
337 
343 typedef struct SigV4Credentials
344 {
349  const char * pAccessKeyId;
350  size_t accessKeyIdLen;
355  const char * pSecretAccessKey;
358 
368 typedef struct SigV4Parameters
369 {
375 
380  const char * pDateIso8601;
381 
386  const char * pAlgorithm;
387 
388  size_t algorithmLen;
395  const char * pRegion;
396  size_t regionLen;
405  const char * pService;
406  size_t serviceLen;
412 
418 
475 /* @[declare_sigV4_generateHTTPAuthorization_function] */
477  char * pAuthBuf,
478  size_t * authBufLen,
479  char ** pSignature,
480  size_t * signatureLen );
481 /* @[declare_sigV4_generateHTTPAuthorization_function] */
482 
546 /* @[declare_sigV4_awsIotDateToIso8601_function] */
547 SigV4Status_t SigV4_AwsIotDateToIso8601( const char * pDate,
548  size_t dateLen,
549  char * pDateISO8601,
550  size_t dateISO8601Len );
551 /* @[declare_sigV4_awsIotDateToIso8601_function] */
552 
553 /* *INDENT-OFF* */
554 #ifdef __cplusplus
555  }
556 #endif
557 /* *INDENT-ON* */
558 
559 #endif /* SIGV4_H_ */
SigV4InvalidParameter
@ SigV4InvalidParameter
The SigV4 Utility library function received an invalid input parameter.
Definition: sigv4.h:145
SigV4MaxQueryPairCountExceeded
@ SigV4MaxQueryPairCountExceeded
The maximum number of query parameters was exceeded while parsing the query string passed to the libr...
Definition: sigv4.h:186
SigV4HttpParameters_t::payloadLen
size_t payloadLen
Length of pPayload.
Definition: sigv4.h:335
SigV4Parameters_t::algorithmLen
size_t algorithmLen
Length of pAlgorithm.
Definition: sigv4.h:388
SigV4Credentials_t::accessKeyIdLen
size_t accessKeyIdLen
Length of pAccessKeyId.
Definition: sigv4.h:350
SigV4HttpParameters_t::pPayload
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:334
SigV4CryptoInterface_t
The cryptography interface used to supply the user-defined hash implementation.
Definition: sigv4.h:211
SigV4HashError
@ SigV4HashError
An error occurred while performing a hash operation.
Definition: sigv4.h:194
SigV4Credentials_t
Configurations for the AWS credentials used to generate the Signing Key.
Definition: sigv4.h:344
SigV4Parameters_t::regionLen
size_t regionLen
Length of pRegion.
Definition: sigv4.h:396
SigV4CryptoInterface_t::pHashContext
void * pHashContext
Context for the hashInit, hashUpdate, and hashFinal interfaces.
Definition: sigv4.h:256
sigv4_config_defaults.h
The default values for configuration macros used by the SigV4 Utility Library.
SigV4Success
@ SigV4Success
The SigV4 Utility library function completed successfully.
Definition: sigv4.h:135
SigV4HttpParameters_t::queryLen
size_t queryLen
Length of pQuery.
Definition: sigv4.h:315
SigV4HttpParameters_t::pathLen
size_t pathLen
Length of pPath.
Definition: sigv4.h:303
SigV4Parameters_t::pAlgorithm
const char * pAlgorithm
The algorithm used for SigV4 authentication. If set to NULL, this will automatically be set to "AWS4-...
Definition: sigv4.h:386
SigV4HttpParameters_t::pQuery
const char * pQuery
The HTTP request query from the URL, if it exists. This contains all characters following the questio...
Definition: sigv4.h:314
SigV4HttpParameters_t
Configurations of the HTTP request used to create the Canonical Request.
Definition: sigv4.h:275
SigV4Credentials_t::pAccessKeyId
const char * pAccessKeyId
The pAccessKeyId MUST be at least 16 characters long but not more than 128 characters long.
Definition: sigv4.h:349
SigV4_GenerateHTTPAuthorization
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:3000
SigV4Parameters_t::pRegion
const char * pRegion
The target AWS region for the request. Please see https://docs.aws.amazon.com/general/latest/gr/rande...
Definition: sigv4.h:395
SigV4CryptoInterface_t::hashBlockLen
size_t hashBlockLen
The block length of the hash function.
Definition: sigv4.h:261
SigV4Credentials_t::pSecretAccessKey
const char * pSecretAccessKey
The pSecretAccessKey MUST be at least 40 characters long.
Definition: sigv4.h:355
SigV4CryptoInterface_t::hashDigestLen
size_t hashDigestLen
The digest length of the hash function.
Definition: sigv4.h:266
SigV4ISOFormattingError
@ SigV4ISOFormattingError
An error occurred while formatting the provided date header.
Definition: sigv4.h:162
SigV4Parameters_t::serviceLen
size_t serviceLen
Length of pService.
Definition: sigv4.h:406
SigV4HttpParameters_t::httpMethodLen
size_t httpMethodLen
Length of pHttpMethod.
Definition: sigv4.h:277
SigV4HttpParameters_t::pHeaders
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:326
SigV4Parameters_t::pHttpParameters
SigV4HttpParameters_t * pHttpParameters
HTTP specific SigV4 parameters for canonical request calculation.
Definition: sigv4.h:416
SigV4HttpParameters_t::pHttpMethod
const char * pHttpMethod
The HTTP method: GET, POST, PUT, etc.
Definition: sigv4.h:276
SigV4Parameters_t
Complete configurations required for generating "String to Sign" and "Signing Key" values.
Definition: sigv4.h:369
SigV4MaxHeaderPairCountExceeded
@ SigV4MaxHeaderPairCountExceeded
The maximum number of header parameters was exceeded while parsing the http header string passed to t...
Definition: sigv4.h:174
SigV4HttpParameters_t::flags
uint32_t flags
These flags are used to indicate if the path, query, or headers are already in the canonical form....
Definition: sigv4.h:290
SigV4_AwsIotDateToIso8601
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:2924
SigV4Parameters_t::pCredentials
SigV4Credentials_t * pCredentials
The AccessKeyId, SecretAccessKey, and SecurityToken used to generate the Authorization header.
Definition: sigv4.h:374
SigV4Credentials_t::secretAccessKeyLen
size_t secretAccessKeyLen
Length of pSecretAccessKey.
Definition: sigv4.h:356
SigV4Parameters_t::pDateIso8601
const char * pDateIso8601
The date in ISO 8601 format, e.g. "20150830T123600Z". This is always 16 characters long.
Definition: sigv4.h:380
SigV4InsufficientMemory
@ SigV4InsufficientMemory
The application buffer was not large enough for the specified hash function.
Definition: sigv4.h:154
SigV4Parameters_t::pCryptoInterface
SigV4CryptoInterface_t * pCryptoInterface
The cryptography interface.
Definition: sigv4.h:411
SigV4HttpParameters_t::pPath
const char * pPath
The path in the HTTP request. This is the absolute request URI, which contains everything in the URI ...
Definition: sigv4.h:302
SigV4HttpParameters_t::headersLen
size_t headersLen
Length of pHeaders.
Definition: sigv4.h:327
SigV4InvalidHttpHeaders
@ SigV4InvalidHttpHeaders
HTTP headers parsed to the library are invalid.
Definition: sigv4.h:202
SigV4Status_t
SigV4Status_t
Return status of the SigV4 Utility Library.
Definition: sigv4.h:127
SigV4Parameters_t::pService
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:405