15
15
16
16
#include "crypto/s2n_hash.h"
17
17
18
- #include "crypto/s2n_fips .h"
18
+ #include "crypto/s2n_evp_signing .h"
19
19
#include "crypto/s2n_hmac.h"
20
20
#include "crypto/s2n_openssl.h"
21
21
#include "error/s2n_errno.h"
22
22
#include "utils/s2n_safety.h"
23
23
24
- static bool s2n_use_custom_md5_sha1 ()
25
- {
26
- #if defined(S2N_LIBCRYPTO_SUPPORTS_EVP_MD5_SHA1_HASH )
27
- return false;
28
- #else
29
- return true;
30
- #endif
31
- }
32
-
33
24
static bool s2n_use_evp_impl ()
34
25
{
35
- return s2n_is_in_fips_mode ();
36
- }
37
-
38
- bool s2n_hash_evp_fully_supported ()
39
- {
40
- return s2n_use_evp_impl () && !s2n_use_custom_md5_sha1 ();
26
+ /* Our current EVP signing implementation requires EVP hashing.
27
+ *
28
+ * We could use the EVP hashing impl with legacy signing, but that would
29
+ * unnecessarily complicate the logic. The only known libcrypto that
30
+ * doesn't support EVP signing is openssl-1.0.2. Just let legacy
31
+ * libcryptos use legacy methods.
32
+ */
33
+ return s2n_evp_signing_supported ();
41
34
}
42
35
43
36
const EVP_MD * s2n_hash_alg_to_evp_md (s2n_hash_algorithm alg )
@@ -289,13 +282,8 @@ static int s2n_low_level_hash_free(struct s2n_hash_state *state)
289
282
static int s2n_evp_hash_new (struct s2n_hash_state * state )
290
283
{
291
284
POSIX_ENSURE_REF (state -> digest .high_level .evp .ctx = S2N_EVP_MD_CTX_NEW ());
292
- if (s2n_use_custom_md5_sha1 ()) {
293
- POSIX_ENSURE_REF (state -> digest .high_level .evp_md5_secondary .ctx = S2N_EVP_MD_CTX_NEW ());
294
- }
295
-
296
285
state -> is_ready_for_input = 0 ;
297
286
state -> currently_in_hash = 0 ;
298
-
299
287
return S2N_SUCCESS ;
300
288
}
301
289
@@ -311,13 +299,6 @@ static int s2n_evp_hash_init(struct s2n_hash_state *state, s2n_hash_algorithm al
311
299
return S2N_SUCCESS ;
312
300
}
313
301
314
- if (alg == S2N_HASH_MD5_SHA1 && s2n_use_custom_md5_sha1 ()) {
315
- POSIX_ENSURE_REF (state -> digest .high_level .evp_md5_secondary .ctx );
316
- POSIX_GUARD_OSSL (EVP_DigestInit_ex (state -> digest .high_level .evp .ctx , EVP_sha1 (), NULL ), S2N_ERR_HASH_INIT_FAILED );
317
- POSIX_GUARD_OSSL (EVP_DigestInit_ex (state -> digest .high_level .evp_md5_secondary .ctx , EVP_md5 (), NULL ), S2N_ERR_HASH_INIT_FAILED );
318
- return S2N_SUCCESS ;
319
- }
320
-
321
302
POSIX_ENSURE_REF (s2n_hash_alg_to_evp_md (alg ));
322
303
POSIX_GUARD_OSSL (EVP_DigestInit_ex (state -> digest .high_level .evp .ctx , s2n_hash_alg_to_evp_md (alg ), NULL ), S2N_ERR_HASH_INIT_FAILED );
323
304
return S2N_SUCCESS ;
@@ -335,12 +316,6 @@ static int s2n_evp_hash_update(struct s2n_hash_state *state, const void *data, u
335
316
336
317
POSIX_ENSURE_REF (EVP_MD_CTX_md (state -> digest .high_level .evp .ctx ));
337
318
POSIX_GUARD_OSSL (EVP_DigestUpdate (state -> digest .high_level .evp .ctx , data , size ), S2N_ERR_HASH_UPDATE_FAILED );
338
-
339
- if (state -> alg == S2N_HASH_MD5_SHA1 && s2n_use_custom_md5_sha1 ()) {
340
- POSIX_ENSURE_REF (EVP_MD_CTX_md (state -> digest .high_level .evp_md5_secondary .ctx ));
341
- POSIX_GUARD_OSSL (EVP_DigestUpdate (state -> digest .high_level .evp_md5_secondary .ctx , data , size ), S2N_ERR_HASH_UPDATE_FAILED );
342
- }
343
-
344
319
return S2N_SUCCESS ;
345
320
}
346
321
@@ -362,23 +337,6 @@ static int s2n_evp_hash_digest(struct s2n_hash_state *state, void *out, uint32_t
362
337
363
338
POSIX_ENSURE_REF (EVP_MD_CTX_md (state -> digest .high_level .evp .ctx ));
364
339
365
- if (state -> alg == S2N_HASH_MD5_SHA1 && s2n_use_custom_md5_sha1 ()) {
366
- POSIX_ENSURE_REF (EVP_MD_CTX_md (state -> digest .high_level .evp_md5_secondary .ctx ));
367
-
368
- uint8_t sha1_digest_size = 0 ;
369
- POSIX_GUARD (s2n_hash_digest_size (S2N_HASH_SHA1 , & sha1_digest_size ));
370
-
371
- unsigned int sha1_primary_digest_size = sha1_digest_size ;
372
- unsigned int md5_secondary_digest_size = digest_size - sha1_primary_digest_size ;
373
-
374
- POSIX_ENSURE (EVP_MD_CTX_size (state -> digest .high_level .evp .ctx ) <= sha1_digest_size , S2N_ERR_HASH_DIGEST_FAILED );
375
- POSIX_ENSURE ((size_t ) EVP_MD_CTX_size (state -> digest .high_level .evp_md5_secondary .ctx ) <= md5_secondary_digest_size , S2N_ERR_HASH_DIGEST_FAILED );
376
-
377
- POSIX_GUARD_OSSL (EVP_DigestFinal_ex (state -> digest .high_level .evp .ctx , ((uint8_t * ) out ) + MD5_DIGEST_LENGTH , & sha1_primary_digest_size ), S2N_ERR_HASH_DIGEST_FAILED );
378
- POSIX_GUARD_OSSL (EVP_DigestFinal_ex (state -> digest .high_level .evp_md5_secondary .ctx , out , & md5_secondary_digest_size ), S2N_ERR_HASH_DIGEST_FAILED );
379
- return S2N_SUCCESS ;
380
- }
381
-
382
340
POSIX_ENSURE ((size_t ) EVP_MD_CTX_size (state -> digest .high_level .evp .ctx ) <= digest_size , S2N_ERR_HASH_DIGEST_FAILED );
383
341
POSIX_GUARD_OSSL (EVP_DigestFinal_ex (state -> digest .high_level .evp .ctx , out , & digest_size ), S2N_ERR_HASH_DIGEST_FAILED );
384
342
return S2N_SUCCESS ;
@@ -397,21 +355,12 @@ static int s2n_evp_hash_copy(struct s2n_hash_state *to, struct s2n_hash_state *f
397
355
398
356
POSIX_ENSURE_REF (to -> digest .high_level .evp .ctx );
399
357
POSIX_GUARD_OSSL (EVP_MD_CTX_copy_ex (to -> digest .high_level .evp .ctx , from -> digest .high_level .evp .ctx ), S2N_ERR_HASH_COPY_FAILED );
400
-
401
- if (from -> alg == S2N_HASH_MD5_SHA1 && s2n_use_custom_md5_sha1 ()) {
402
- POSIX_ENSURE_REF (to -> digest .high_level .evp_md5_secondary .ctx );
403
- POSIX_GUARD_OSSL (EVP_MD_CTX_copy_ex (to -> digest .high_level .evp_md5_secondary .ctx , from -> digest .high_level .evp_md5_secondary .ctx ), S2N_ERR_HASH_COPY_FAILED );
404
- }
405
-
406
358
return S2N_SUCCESS ;
407
359
}
408
360
409
361
static int s2n_evp_hash_reset (struct s2n_hash_state * state )
410
362
{
411
363
POSIX_GUARD_OSSL (S2N_EVP_MD_CTX_RESET (state -> digest .high_level .evp .ctx ), S2N_ERR_HASH_WIPE_FAILED );
412
- if (state -> alg == S2N_HASH_MD5_SHA1 && s2n_use_custom_md5_sha1 ()) {
413
- POSIX_GUARD_OSSL (S2N_EVP_MD_CTX_RESET (state -> digest .high_level .evp_md5_secondary .ctx ), S2N_ERR_HASH_WIPE_FAILED );
414
- }
415
364
416
365
/* hash_init resets the ready_for_input and currently_in_hash fields. */
417
366
return s2n_evp_hash_init (state , state -> alg );
@@ -421,12 +370,6 @@ static int s2n_evp_hash_free(struct s2n_hash_state *state)
421
370
{
422
371
S2N_EVP_MD_CTX_FREE (state -> digest .high_level .evp .ctx );
423
372
state -> digest .high_level .evp .ctx = NULL ;
424
-
425
- if (s2n_use_custom_md5_sha1 ()) {
426
- S2N_EVP_MD_CTX_FREE (state -> digest .high_level .evp_md5_secondary .ctx );
427
- state -> digest .high_level .evp_md5_secondary .ctx = NULL ;
428
- }
429
-
430
373
state -> is_ready_for_input = 0 ;
431
374
return S2N_SUCCESS ;
432
375
}
0 commit comments