@@ -96,10 +96,6 @@ struct hmac_methods_st {
96
96
static int AWS_LC_TRAMPOLINE_##HASH_NAME##_Update(void *, const void *, \
97
97
size_t); \
98
98
static int AWS_LC_TRAMPOLINE_##HASH_NAME##_Final(uint8_t *, void *); \
99
- static int AWS_LC_TRAMPOLINE_##HASH_NAME##_Init_from_state( \
100
- void *, const uint8_t *, uint64_t); \
101
- static int AWS_LC_TRAMPOLINE_##HASH_NAME##_get_state(void *, uint8_t *, \
102
- uint64_t *); \
103
99
static int AWS_LC_TRAMPOLINE_##HASH_NAME##_Init(void *ctx) { \
104
100
return HASH_NAME##_Init((HASH_CTX *)ctx); \
105
101
} \
@@ -110,6 +106,18 @@ struct hmac_methods_st {
110
106
static int AWS_LC_TRAMPOLINE_##HASH_NAME##_Final(uint8_t *out, void *ctx) { \
111
107
return HASH_NAME##_Final(out, (HASH_CTX *)ctx); \
112
108
} \
109
+ OPENSSL_STATIC_ASSERT(HASH_CBLOCK % 8 == 0, \
110
+ HASH_NAME##_has_blocksize_not_divisible_by_eight_t) \
111
+ OPENSSL_STATIC_ASSERT(HASH_CBLOCK <= EVP_MAX_MD_BLOCK_SIZE, \
112
+ HASH_NAME##_has_overlarge_blocksize_t) \
113
+ OPENSSL_STATIC_ASSERT(sizeof(HASH_CTX) <= sizeof(union md_ctx_union), \
114
+ HASH_NAME##_has_overlarge_context_t)
115
+
116
+ // For merkle-damgard constructions, we also define functions for importing and
117
+ // exporting hash state for precomputed keys. These are not applicable to
118
+ // Keccak/SHA3.
119
+ #define MD_TRAMPOLINES_EXPLICIT_PRECOMPUTED (HASH_NAME , HASH_CTX , HASH_CBLOCK ) \
120
+ MD_TRAMPOLINES_EXPLICIT(HASH_NAME, HASH_CTX, HASH_CBLOCK); \
113
121
static int AWS_LC_TRAMPOLINE_##HASH_NAME##_Init_from_state( \
114
122
void *ctx, const uint8_t *h, uint64_t n) { \
115
123
return HASH_NAME##_Init_from_state((HASH_CTX *)ctx, h, n); \
@@ -118,62 +126,75 @@ struct hmac_methods_st {
118
126
void *ctx, uint8_t *out_h, uint64_t *out_n) { \
119
127
return HASH_NAME##_get_state((HASH_CTX *)ctx, out_h, out_n); \
120
128
} \
121
- OPENSSL_STATIC_ASSERT(HASH_CBLOCK % 8 == 0, \
122
- HASH_NAME##_has_blocksize_not_divisible_by_eight_t) \
123
- OPENSSL_STATIC_ASSERT(HASH_CBLOCK <= EVP_MAX_MD_BLOCK_SIZE, \
124
- HASH_NAME##_has_overlarge_blocksize_t) \
125
129
OPENSSL_STATIC_ASSERT(HMAC_##HASH_NAME##_PRECOMPUTED_KEY_SIZE == \
126
130
2 * HASH_NAME##_CHAINING_LENGTH, \
127
131
HASH_NAME##_has_incorrect_precomputed_key_size) \
128
132
OPENSSL_STATIC_ASSERT(HMAC_##HASH_NAME##_PRECOMPUTED_KEY_SIZE <= \
129
133
HMAC_MAX_PRECOMPUTED_KEY_SIZE, \
130
134
HASH_NAME##_has_too_large_precomputed_key_size) \
131
- OPENSSL_STATIC_ASSERT(sizeof(HASH_CTX) <= sizeof(union md_ctx_union), \
132
- HASH_NAME##_has_overlarge_context_t)
133
135
134
136
// The maximum number of HMAC implementations
135
- #define HMAC_METHOD_MAX 8
136
-
137
- MD_TRAMPOLINES_EXPLICIT (MD5 , MD5_CTX , MD5_CBLOCK )
138
- MD_TRAMPOLINES_EXPLICIT (SHA1 , SHA_CTX , SHA_CBLOCK )
139
- MD_TRAMPOLINES_EXPLICIT (SHA224 , SHA256_CTX , SHA256_CBLOCK )
140
- MD_TRAMPOLINES_EXPLICIT (SHA256 , SHA256_CTX , SHA256_CBLOCK )
141
- MD_TRAMPOLINES_EXPLICIT (SHA384 , SHA512_CTX , SHA512_CBLOCK )
142
- MD_TRAMPOLINES_EXPLICIT (SHA512 , SHA512_CTX , SHA512_CBLOCK )
143
- MD_TRAMPOLINES_EXPLICIT (SHA512_224 , SHA512_CTX , SHA512_CBLOCK )
144
- MD_TRAMPOLINES_EXPLICIT (SHA512_256 , SHA512_CTX , SHA512_CBLOCK )
137
+ #define HMAC_METHOD_MAX 12
138
+
139
+ MD_TRAMPOLINES_EXPLICIT_PRECOMPUTED (MD5 , MD5_CTX , MD5_CBLOCK )
140
+ MD_TRAMPOLINES_EXPLICIT_PRECOMPUTED (SHA1 , SHA_CTX , SHA_CBLOCK )
141
+ MD_TRAMPOLINES_EXPLICIT_PRECOMPUTED (SHA224 , SHA256_CTX , SHA256_CBLOCK )
142
+ MD_TRAMPOLINES_EXPLICIT_PRECOMPUTED (SHA256 , SHA256_CTX , SHA256_CBLOCK )
143
+ MD_TRAMPOLINES_EXPLICIT_PRECOMPUTED (SHA384 , SHA512_CTX , SHA512_CBLOCK )
144
+ MD_TRAMPOLINES_EXPLICIT_PRECOMPUTED (SHA512 , SHA512_CTX , SHA512_CBLOCK )
145
+ MD_TRAMPOLINES_EXPLICIT_PRECOMPUTED (SHA512_224 , SHA512_CTX , SHA512_CBLOCK )
146
+ MD_TRAMPOLINES_EXPLICIT_PRECOMPUTED (SHA512_256 , SHA512_CTX , SHA512_CBLOCK )
147
+ MD_TRAMPOLINES_EXPLICIT (SHA3_224 , KECCAK1600_CTX , SHA3_224_CBLOCK )
148
+ MD_TRAMPOLINES_EXPLICIT (SHA3_256 , KECCAK1600_CTX , SHA3_256_CBLOCK )
149
+ MD_TRAMPOLINES_EXPLICIT (SHA3_384 , KECCAK1600_CTX , SHA3_384_CBLOCK )
150
+ MD_TRAMPOLINES_EXPLICIT (SHA3_512 , KECCAK1600_CTX , SHA3_512_CBLOCK )
145
151
146
152
struct hmac_method_array_st {
147
153
HmacMethods methods [HMAC_METHOD_MAX ];
148
154
};
149
155
156
+ // This macro does not set any values for precomputed keys for portable state,
157
+ // and as such is suitable for use with Keccak/SHA3.
150
158
#define DEFINE_IN_PLACE_METHODS (EVP_MD , HASH_NAME ) { \
151
159
out->methods[idx].evp_md = EVP_MD; \
152
- out->methods[idx].chaining_length = HASH_NAME##_CHAINING_LENGTH; \
153
160
out->methods[idx].init = AWS_LC_TRAMPOLINE_##HASH_NAME##_Init; \
154
161
out->methods[idx].update = AWS_LC_TRAMPOLINE_##HASH_NAME##_Update; \
155
162
out->methods[idx].finalize = AWS_LC_TRAMPOLINE_##HASH_NAME##_Final; \
156
- out->methods[idx].init_from_state = \
157
- AWS_LC_TRAMPOLINE_##HASH_NAME##_Init_from_state; \
158
- out->methods[idx].get_state = AWS_LC_TRAMPOLINE_##HASH_NAME##_get_state; \
163
+ out->methods[idx].chaining_length = 0UL; \
164
+ out->methods[idx].init_from_state = NULL; \
165
+ out->methods[idx].get_state = NULL; \
159
166
idx++; \
160
167
assert(idx <= HMAC_METHOD_MAX); \
161
168
}
162
169
170
+ // Use |idx-1| because DEFINE_IN_PLACE_METHODS has already incremented it.
171
+ #define DEFINE_IN_PLACE_METHODS_PRECOMPUTED (EVP_MD , HASH_NAME ) { \
172
+ DEFINE_IN_PLACE_METHODS(EVP_MD, HASH_NAME); \
173
+ assert(idx-1 >= 0); \
174
+ out->methods[idx-1].chaining_length = HASH_NAME##_CHAINING_LENGTH; \
175
+ out->methods[idx-1].init_from_state = \
176
+ AWS_LC_TRAMPOLINE_##HASH_NAME##_Init_from_state; \
177
+ out->methods[idx-1].get_state = \
178
+ AWS_LC_TRAMPOLINE_##HASH_NAME##_get_state; \
179
+ }
180
+
163
181
DEFINE_LOCAL_DATA (struct hmac_method_array_st , AWSLC_hmac_in_place_methods ) {
164
182
OPENSSL_memset ((void * ) out -> methods , 0 , sizeof (out -> methods ));
165
183
int idx = 0 ;
166
184
// Since we search these linearly it helps (just a bit) to put the most common ones first.
167
185
// This isn't based on hard metrics and will not make a significant different on performance.
168
- // FIXME: all hashes but SHA256 have been disabled to check first SHA256
169
- DEFINE_IN_PLACE_METHODS (EVP_sha256 (), SHA256 );
170
- DEFINE_IN_PLACE_METHODS (EVP_sha1 (), SHA1 );
171
- DEFINE_IN_PLACE_METHODS (EVP_sha384 (), SHA384 );
172
- DEFINE_IN_PLACE_METHODS (EVP_sha512 (), SHA512 );
173
- DEFINE_IN_PLACE_METHODS (EVP_md5 (), MD5 );
174
- DEFINE_IN_PLACE_METHODS (EVP_sha224 (), SHA224 );
175
- DEFINE_IN_PLACE_METHODS (EVP_sha512_224 (), SHA512_224 );
176
- DEFINE_IN_PLACE_METHODS (EVP_sha512_256 (), SHA512_256 );
186
+ DEFINE_IN_PLACE_METHODS_PRECOMPUTED (EVP_sha256 (), SHA256 );
187
+ DEFINE_IN_PLACE_METHODS_PRECOMPUTED (EVP_sha1 (), SHA1 );
188
+ DEFINE_IN_PLACE_METHODS_PRECOMPUTED (EVP_sha384 (), SHA384 );
189
+ DEFINE_IN_PLACE_METHODS_PRECOMPUTED (EVP_sha512 (), SHA512 );
190
+ DEFINE_IN_PLACE_METHODS_PRECOMPUTED (EVP_md5 (), MD5 );
191
+ DEFINE_IN_PLACE_METHODS_PRECOMPUTED (EVP_sha224 (), SHA224 );
192
+ DEFINE_IN_PLACE_METHODS_PRECOMPUTED (EVP_sha512_224 (), SHA512_224 );
193
+ DEFINE_IN_PLACE_METHODS_PRECOMPUTED (EVP_sha512_256 (), SHA512_256 );
194
+ DEFINE_IN_PLACE_METHODS (EVP_sha3_224 (), SHA3_224 );
195
+ DEFINE_IN_PLACE_METHODS (EVP_sha3_256 (), SHA3_256 );
196
+ DEFINE_IN_PLACE_METHODS (EVP_sha3_384 (), SHA3_384 );
197
+ DEFINE_IN_PLACE_METHODS (EVP_sha3_512 (), SHA3_512 );
177
198
}
178
199
179
200
static const HmacMethods * GetInPlaceMethods (const EVP_MD * evp_md ) {
@@ -494,6 +515,11 @@ void HMAC_CTX_reset(HMAC_CTX *ctx) {
494
515
}
495
516
496
517
int HMAC_set_precomputed_key_export (HMAC_CTX * ctx ) {
518
+ GUARD_PTR (ctx );
519
+ if (ctx -> methods != NULL && ctx -> methods -> get_state == NULL ) {
520
+ OPENSSL_PUT_ERROR (HMAC , HMAC_R_PRECOMPUTED_KEY_NOT_SUPPORTED_FOR_DIGEST );
521
+ return 0 ;
522
+ }
497
523
if (HMAC_STATE_INIT_NO_DATA != ctx -> state &&
498
524
HMAC_STATE_PRECOMPUTED_KEY_EXPORT_READY != ctx -> state ) {
499
525
// HMAC_set_precomputed_key_export can only be called after Hmac_Init_*
@@ -505,6 +531,13 @@ int HMAC_set_precomputed_key_export(HMAC_CTX *ctx) {
505
531
}
506
532
507
533
int HMAC_get_precomputed_key (HMAC_CTX * ctx , uint8_t * out , size_t * out_len ) {
534
+ GUARD_PTR (ctx );
535
+ GUARD_PTR (ctx -> methods );
536
+ if (ctx -> methods -> get_state == NULL ) {
537
+ OPENSSL_PUT_ERROR (HMAC , HMAC_R_PRECOMPUTED_KEY_NOT_SUPPORTED_FOR_DIGEST );
538
+ return 0 ;
539
+ }
540
+
508
541
if (HMAC_STATE_PRECOMPUTED_KEY_EXPORT_READY != ctx -> state ) {
509
542
OPENSSL_PUT_ERROR (EVP , HMAC_R_SET_PRECOMPUTED_KEY_EXPORT_NOT_CALLED );
510
543
return 0 ;
@@ -583,6 +616,10 @@ int HMAC_Init_from_precomputed_key(HMAC_CTX *ctx,
583
616
}
584
617
585
618
const HmacMethods * methods = ctx -> methods ;
619
+ if (ctx -> methods -> init_from_state == NULL ) {
620
+ OPENSSL_PUT_ERROR (HMAC , HMAC_R_PRECOMPUTED_KEY_NOT_SUPPORTED_FOR_DIGEST );
621
+ return 0 ;
622
+ }
586
623
587
624
const size_t chaining_length = methods -> chaining_length ;
588
625
const size_t block_size = EVP_MD_block_size (methods -> evp_md );
0 commit comments