Branch data Line data Source code
1 : : /* 2 : : * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 : : * 4 : : * Licensed under the Apache License, Version 2.0 (the "License"). 5 : : * You may not use this file except in compliance with the License. 6 : : * A copy of the License is located at 7 : : * 8 : : * http://aws.amazon.com/apache2.0 9 : : * 10 : : * or in the "license" file accompanying this file. This file is distributed 11 : : * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 12 : : * express or implied. See the License for the specific language governing 13 : : * permissions and limitations under the License. 14 : : */ 15 : : 16 : : #include "tls/s2n_handshake_hashes.h" 17 : : 18 : : #include "crypto/s2n_fips.h" 19 : : #include "tls/s2n_connection.h" 20 : : #include "utils/s2n_blob.h" 21 : : #include "utils/s2n_mem.h" 22 : : #include "utils/s2n_safety.h" 23 : : 24 : : static S2N_RESULT s2n_handshake_hashes_new_hashes(struct s2n_handshake_hashes *hashes) 25 : 125496 : { 26 [ - + ][ # # ]: 125496 : RESULT_ENSURE_REF(hashes); 27 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_new(&hashes->md5)); 28 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_new(&hashes->sha1)); 29 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_new(&hashes->sha224)); 30 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_new(&hashes->sha256)); 31 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_new(&hashes->sha384)); 32 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_new(&hashes->sha512)); 33 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_new(&hashes->md5_sha1)); 34 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_new(&hashes->hash_workspace)); 35 : 125496 : return S2N_RESULT_OK; 36 : 125496 : } 37 : : 38 : : static S2N_RESULT s2n_handshake_hashes_reset_hashes(struct s2n_handshake_hashes *hashes) 39 : 3420594 : { 40 [ + + ][ + - ]: 3420594 : RESULT_ENSURE_REF(hashes); 41 [ - + ]: 3420593 : RESULT_GUARD_POSIX(s2n_hash_reset(&hashes->md5)); 42 [ - + ]: 3420593 : RESULT_GUARD_POSIX(s2n_hash_reset(&hashes->sha1)); 43 [ - + ]: 3420593 : RESULT_GUARD_POSIX(s2n_hash_reset(&hashes->sha224)); 44 [ - + ]: 3420593 : RESULT_GUARD_POSIX(s2n_hash_reset(&hashes->sha256)); 45 [ - + ]: 3420593 : RESULT_GUARD_POSIX(s2n_hash_reset(&hashes->sha384)); 46 [ - + ]: 3420593 : RESULT_GUARD_POSIX(s2n_hash_reset(&hashes->sha512)); 47 [ - + ]: 3420593 : RESULT_GUARD_POSIX(s2n_hash_reset(&hashes->md5_sha1)); 48 [ - + ]: 3420593 : RESULT_GUARD_POSIX(s2n_hash_reset(&hashes->hash_workspace)); 49 : 3420593 : return S2N_RESULT_OK; 50 : 3420593 : } 51 : : 52 : : static S2N_RESULT s2n_handshake_hashes_free_hashes(struct s2n_handshake_hashes *hashes) 53 : 125522 : { 54 [ + + ]: 125522 : if (!hashes) { 55 : 26 : return S2N_RESULT_OK; 56 : 26 : } 57 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_free(&hashes->md5)); 58 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_free(&hashes->sha1)); 59 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_free(&hashes->sha224)); 60 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_free(&hashes->sha256)); 61 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_free(&hashes->sha384)); 62 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_free(&hashes->sha512)); 63 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_free(&hashes->md5_sha1)); 64 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_free(&hashes->hash_workspace)); 65 : 125496 : return S2N_RESULT_OK; 66 : 125496 : } 67 : : 68 : : static S2N_RESULT s2n_handshake_hashes_init_hashes(struct s2n_handshake_hashes *hashes) 69 : 125496 : { 70 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_init(&hashes->md5, S2N_HASH_MD5)); 71 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_init(&hashes->sha1, S2N_HASH_SHA1)); 72 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_init(&hashes->sha224, S2N_HASH_SHA224)); 73 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_init(&hashes->sha256, S2N_HASH_SHA256)); 74 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_init(&hashes->sha384, S2N_HASH_SHA384)); 75 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_init(&hashes->sha512, S2N_HASH_SHA512)); 76 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_init(&hashes->md5_sha1, S2N_HASH_MD5_SHA1)); 77 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_hash_init(&hashes->hash_workspace, S2N_HASH_NONE)); 78 : : 79 : 125496 : return S2N_RESULT_OK; 80 : 125496 : } 81 : : 82 : : S2N_RESULT s2n_handshake_hashes_new(struct s2n_handshake_hashes **hashes) 83 : 125497 : { 84 [ + + ][ + - ]: 125497 : RESULT_ENSURE_REF(hashes); 85 [ - + ][ # # ]: 125496 : RESULT_ENSURE_EQ(*hashes, NULL); 86 : : 87 : 125496 : DEFER_CLEANUP(struct s2n_blob data = { 0 }, s2n_free); 88 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_realloc(&data, sizeof(struct s2n_handshake_hashes))); 89 [ - + ]: 125496 : RESULT_GUARD_POSIX(s2n_blob_zero(&data)); 90 : 125496 : *hashes = (struct s2n_handshake_hashes *) (void *) data.data; 91 : 125496 : ZERO_TO_DISABLE_DEFER_CLEANUP(data); 92 : : 93 [ - + ]: 125496 : RESULT_GUARD(s2n_handshake_hashes_new_hashes(*hashes)); 94 [ - + ]: 125496 : RESULT_GUARD(s2n_handshake_hashes_init_hashes(*hashes)); 95 : : 96 : 125496 : return S2N_RESULT_OK; 97 : 125496 : } 98 : : 99 : : S2N_RESULT s2n_handshake_hashes_wipe(struct s2n_handshake_hashes *hashes) 100 : 3420594 : { 101 [ + + ]: 3420594 : RESULT_GUARD(s2n_handshake_hashes_reset_hashes(hashes)); 102 : 3420593 : return S2N_RESULT_OK; 103 : 3420594 : } 104 : : 105 : : S2N_CLEANUP_RESULT s2n_handshake_hashes_free(struct s2n_handshake_hashes **hashes) 106 : 125523 : { 107 [ + + ][ + - ]: 125523 : RESULT_ENSURE_REF(hashes); 108 [ - + ]: 125522 : RESULT_GUARD(s2n_handshake_hashes_free_hashes(*hashes)); 109 [ - + ]: 125522 : RESULT_GUARD_POSIX(s2n_free_object((uint8_t **) hashes, sizeof(struct s2n_handshake_hashes))); 110 : 125522 : return S2N_RESULT_OK; 111 : 125522 : }