SigV4  v1.0.0
SigV4 Library for AWS Authentication
sigv4_internal.h
Go to the documentation of this file.
1 /*
2  * SigV4 Utility Library v1.0.0
3  * Copyright (C) 2021 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_INTERNAL_H_
29 #define SIGV4_INTERNAL_H_
30 
31 /* *INDENT-OFF* */
32 #ifdef __cplusplus
33  extern "C" {
34 #endif
35 /* *INDENT-ON* */
36 
37 /* SIGV4_DO_NOT_USE_CUSTOM_CONFIG allows building of the SigV4 library without a
38  * config file. If a config file is provided, the SIGV4_DO_NOT_USE_CUSTOM_CONFIG
39  * macro must not be defined.
40  */
41 #ifndef SIGV4_DO_NOT_USE_CUSTOM_CONFIG
42  #include "sigv4_config.h"
43 #endif
44 
45 /* Include config defaults header to get default values of configurations not
46  * defined in sigv4_config.h file. */
47 #include "sigv4_config_defaults.h"
48 
49 /* Constants for date verification. */
50 #define YEAR_MIN 1900L
51 #define MONTH_ASCII_LEN 3U
56 #define MONTH_NAMES { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
57 
61 #define MONTH_DAYS { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
62 
63 #define FORMAT_RFC_3339 "%4Y-%2M-%2DT%2h:%2m:%2sZ"
64 #define FORMAT_RFC_3339_LEN sizeof( FORMAT_RFC_3339 ) - 1U
66 #define FORMAT_RFC_5322 "%3*, %2D %3M %4Y %2h:%2m:%2s GMT"
67 #define FORMAT_RFC_5322_LEN sizeof( FORMAT_RFC_5322 ) - 1U
69 #define ISO_YEAR_LEN 4U
70 #define ISO_NON_YEAR_LEN 2U
72 #define ISO_DATE_SCOPE_LEN 8U
74 /* SigV4 related string literals and lengths. */
75 
79 #define CREDENTIAL_SCOPE_SEPARATOR '/'
80 #define CREDENTIAL_SCOPE_SEPARATOR_LEN 1U
85 #define CREDENTIAL_SCOPE_TERMINATOR "aws4_request"
86 #define CREDENTIAL_SCOPE_TERMINATOR_LEN ( sizeof( CREDENTIAL_SCOPE_TERMINATOR ) - 1U )
91 #define HTTP_EMPTY_PATH "/"
92 #define HTTP_EMPTY_PATH_LEN ( sizeof( HTTP_EMPTY_PATH ) - 1U )
94 #define URI_ENCODED_SPECIAL_CHAR_SIZE 3U
95 #define URI_DOUBLE_ENCODED_EQUALS_CHAR_SIZE 5U
97 #define LINEFEED_CHAR '\n'
98 #define LINEFEED_CHAR_LEN 1U
100 #define HTTP_REQUEST_LINE_ENDING "\r\n"
101 #define HTTP_REQUEST_LINE_ENDING_LEN ( sizeof( HTTP_REQUEST_LINE_ENDING ) - 1U )
103 #define SPACE_CHAR ' '
104 #define SPACE_CHAR_LEN 1U
106 #define S3_SERVICE_NAME "s3"
107 #define S3_SERVICE_NAME_LEN ( sizeof( S3_SERVICE_NAME ) - 1U )
109 #define SIGV4_HMAC_SIGNING_KEY_PREFIX "AWS4"
110 #define SIGV4_HMAC_SIGNING_KEY_PREFIX_LEN ( sizeof( SIGV4_HMAC_SIGNING_KEY_PREFIX ) - 1U )
112 #define AUTH_CREDENTIAL_PREFIX "Credential="
113 #define AUTH_CREDENTIAL_PREFIX_LEN ( sizeof( AUTH_CREDENTIAL_PREFIX ) - 1U )
114 #define AUTH_SEPARATOR ", "
115 #define AUTH_SEPARATOR_LEN ( sizeof( AUTH_SEPARATOR ) - 1U )
116 #define AUTH_SIGNED_HEADERS_PREFIX "SignedHeaders="
117 #define AUTH_SIGNED_HEADERS_PREFIX_LEN ( sizeof( AUTH_SIGNED_HEADERS_PREFIX ) - 1U )
118 #define AUTH_SIGNATURE_PREFIX "Signature="
119 #define AUTH_SIGNATURE_PREFIX_LEN ( sizeof( AUTH_SIGNATURE_PREFIX ) - 1U )
121 #define HMAC_INNER_PAD_BYTE ( 0x36U )
122 #define HMAC_OUTER_PAD_BYTE ( 0x5CU )
127 #define LOG_INSUFFICIENT_MEMORY_ERROR( purposeOfWrite, bytesExceeded ) \
128  { \
129  LogError( ( "Unable to " purposeOfWrite ": Insufficient memory configured in \"SIGV4_PROCESSING_BUFFER_LENGTH\" macro. BytesExceeded=%lu", \
130  ( unsigned long ) ( bytesExceeded ) ) ); \
131  }
132 
136 #define FLAG_IS_SET( bits, flag ) ( ( ( bits ) & ( flag ) ) == ( flag ) )
137 
146 #define isWhitespace( c ) ( ( ( c ) == ' ' ) || ( ( c ) == '\t' ) )
147 
153 typedef struct SigV4DateTime
154 {
155  int32_t tm_year;
156  int32_t tm_mon;
157  int32_t tm_mday;
158  int32_t tm_hour;
159  int32_t tm_min;
160  int32_t tm_sec;
162 
168 typedef struct SigV4String
169 {
170  char * pData;
171  size_t dataLen;
172 } SigV4String_t;
173 
179 typedef struct SigV4ConstString
180 {
181  const char * pData;
182  size_t dataLen;
184 
190 typedef struct SigV4KeyValuePair
191 {
195 
200 typedef struct CanonicalContext
201 {
205  uint8_t pBufProcessing[ SIGV4_PROCESSING_BUFFER_LENGTH ];
206  char * pBufCur;
207  size_t bufRemaining;
209 
214 typedef struct HmacContext
215 {
220 
225 
229  size_t keyLen;
230 } HmacContext_t;
231 
232 /* *INDENT-OFF* */
233 #ifdef __cplusplus
234  }
235 #endif
236 /* *INDENT-ON* */
237 
238 #endif /* ifndef SIGV4_INTERNAL_H_ */
HmacContext_t::pCryptoInterface
const SigV4CryptoInterface_t * pCryptoInterface
The cryptography interface.
Definition: sigv4_internal.h:219
SigV4DateTime_t::tm_mday
int32_t tm_mday
Definition: sigv4_internal.h:157
SIGV4_PROCESSING_BUFFER_LENGTH
#define SIGV4_PROCESSING_BUFFER_LENGTH
Macro defining the size of the internal buffer used for incremental canonicalization and hashing.
Definition: sigv4_config_defaults.h:76
HmacContext_t
An aggregator to maintain the internal state of HMAC calculations.
Definition: sigv4_internal.h:215
SigV4ConstString_t::pData
const char * pData
Definition: sigv4_internal.h:181
SIGV4_HASH_MAX_BLOCK_LENGTH
#define SIGV4_HASH_MAX_BLOCK_LENGTH
Macro indicating the largest block size of any hashing algorithm used for SigV4 authentication i....
Definition: sigv4_config_defaults.h:130
SigV4CryptoInterface_t
The cryptography interface used to supply the user-defined hash implementation.
Definition: sigv4.h:211
SIGV4_MAX_QUERY_PAIR_COUNT
#define SIGV4_MAX_QUERY_PAIR_COUNT
Macro defining the maximum number of query key/value pairs, used to assist the library in sorting que...
Definition: sigv4_config_defaults.h:104
SigV4DateTime_t::tm_mon
int32_t tm_mon
Definition: sigv4_internal.h:156
SigV4ConstString_t
A library structure holding the string and length values of parameters to be sorted and standardized....
Definition: sigv4_internal.h:180
sigv4_config_defaults.h
The default values for configuration macros used by the SigV4 Utility Library.
SigV4String_t::pData
char * pData
Definition: sigv4_internal.h:170
SigV4KeyValuePair_t
A key-value pair data structure that allows for sorting of SigV4 string values using internal compari...
Definition: sigv4_internal.h:191
SigV4DateTime_t::tm_min
int32_t tm_min
Definition: sigv4_internal.h:159
SigV4ConstString_t::dataLen
size_t dataLen
Definition: sigv4_internal.h:182
SigV4KeyValuePair_t::value
SigV4ConstString_t value
Definition: sigv4_internal.h:193
CanonicalContext_t::pBufCur
char * pBufCur
Definition: sigv4_internal.h:206
SigV4String_t
A library structure holding the string and length values of parameters to be sorted and standardized....
Definition: sigv4_internal.h:169
SigV4KeyValuePair_t::key
SigV4ConstString_t key
Definition: sigv4_internal.h:192
SigV4DateTime_t::tm_year
int32_t tm_year
Definition: sigv4_internal.h:155
HmacContext_t::keyLen
size_t keyLen
The length of the accumulated key data.
Definition: sigv4_internal.h:229
SigV4DateTime_t
An aggregator representing the individually parsed elements of the user-provided date parameter....
Definition: sigv4_internal.h:154
SigV4String_t::dataLen
size_t dataLen
Definition: sigv4_internal.h:171
SigV4DateTime_t::tm_sec
int32_t tm_sec
Definition: sigv4_internal.h:160
CanonicalContext_t::bufRemaining
size_t bufRemaining
Definition: sigv4_internal.h:207
CanonicalContext_t
An aggregator to maintain the internal state of canonicalization during intermediate calculations.
Definition: sigv4_internal.h:201
SigV4DateTime_t::tm_hour
int32_t tm_hour
Definition: sigv4_internal.h:158
SIGV4_MAX_HTTP_HEADER_COUNT
#define SIGV4_MAX_HTTP_HEADER_COUNT
Macro defining the maximum number of headers in the request, used to assist the library in sorting he...
Definition: sigv4_config_defaults.h:90