Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 1 | /* BEGIN_HEADER */ |
| 2 | #include "mbedtls/nist_kw.h" |
| 3 | /* END_HEADER */ |
| 4 | |
| 5 | /* BEGIN_DEPENDENCIES |
| 6 | * depends_on:MBEDTLS_NIST_KW_C |
| 7 | * END_DEPENDENCIES |
| 8 | */ |
| 9 | |
| 10 | /* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST:MBEDTLS_AES_C */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 11 | void mbedtls_nist_kw_self_test() |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 12 | { |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 13 | TEST_ASSERT(mbedtls_nist_kw_self_test(1) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 14 | } |
| 15 | /* END_CASE */ |
| 16 | |
| 17 | /* BEGIN_CASE depends_on:MBEDTLS_AES_C */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 18 | void mbedtls_nist_kw_mix_contexts() |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 19 | { |
| 20 | mbedtls_nist_kw_context ctx1, ctx2; |
| 21 | unsigned char key[16]; |
| 22 | unsigned char plaintext[32]; |
| 23 | unsigned char ciphertext1[40]; |
| 24 | unsigned char ciphertext2[40]; |
| 25 | size_t output_len, i; |
| 26 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 27 | memset(plaintext, 0, sizeof(plaintext)); |
| 28 | memset(ciphertext1, 0, sizeof(ciphertext1)); |
| 29 | memset(ciphertext2, 0, sizeof(ciphertext2)); |
| 30 | memset(key, 0, sizeof(key)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 31 | |
| 32 | /* |
Antonin Décimo | 36e89b5 | 2019-01-23 15:24:37 +0100 | [diff] [blame] | 33 | * 1. Check wrap and unwrap with two separate contexts |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 34 | */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 35 | mbedtls_nist_kw_init(&ctx1); |
| 36 | mbedtls_nist_kw_init(&ctx2); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 37 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 38 | TEST_ASSERT(mbedtls_nist_kw_setkey(&ctx1, |
| 39 | MBEDTLS_CIPHER_ID_AES, |
| 40 | key, sizeof(key) * 8, |
| 41 | 1) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 42 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 43 | TEST_ASSERT(mbedtls_nist_kw_wrap(&ctx1, MBEDTLS_KW_MODE_KW, |
| 44 | plaintext, sizeof(plaintext), |
| 45 | ciphertext1, &output_len, |
| 46 | sizeof(ciphertext1)) == 0); |
| 47 | TEST_ASSERT(output_len == sizeof(ciphertext1)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 48 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 49 | TEST_ASSERT(mbedtls_nist_kw_setkey(&ctx2, |
| 50 | MBEDTLS_CIPHER_ID_AES, |
| 51 | key, sizeof(key) * 8, |
| 52 | 0) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 53 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 54 | TEST_ASSERT(mbedtls_nist_kw_unwrap(&ctx2, MBEDTLS_KW_MODE_KW, |
| 55 | ciphertext1, output_len, |
| 56 | plaintext, &output_len, |
| 57 | sizeof(plaintext)) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 58 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 59 | TEST_ASSERT(output_len == sizeof(plaintext)); |
| 60 | for (i = 0; i < sizeof(plaintext); i++) { |
| 61 | TEST_ASSERT(plaintext[i] == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 62 | } |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 63 | mbedtls_nist_kw_free(&ctx1); |
| 64 | mbedtls_nist_kw_free(&ctx2); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 65 | |
| 66 | /* |
| 67 | * 2. Check wrapping with two modes, on same context |
| 68 | */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 69 | mbedtls_nist_kw_init(&ctx1); |
| 70 | mbedtls_nist_kw_init(&ctx2); |
| 71 | output_len = sizeof(ciphertext1); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 72 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 73 | TEST_ASSERT(mbedtls_nist_kw_setkey(&ctx1, |
| 74 | MBEDTLS_CIPHER_ID_AES, |
| 75 | key, sizeof(key) * 8, |
| 76 | 1) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 77 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 78 | TEST_ASSERT(mbedtls_nist_kw_wrap(&ctx1, MBEDTLS_KW_MODE_KW, |
| 79 | plaintext, sizeof(plaintext), |
| 80 | ciphertext1, &output_len, |
| 81 | sizeof(ciphertext1)) == 0); |
| 82 | TEST_ASSERT(output_len == sizeof(ciphertext1)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 83 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 84 | TEST_ASSERT(mbedtls_nist_kw_wrap(&ctx1, MBEDTLS_KW_MODE_KWP, |
| 85 | plaintext, sizeof(plaintext), |
| 86 | ciphertext2, &output_len, |
| 87 | sizeof(ciphertext2)) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 88 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 89 | TEST_ASSERT(output_len == sizeof(ciphertext2)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 90 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 91 | TEST_ASSERT(mbedtls_nist_kw_setkey(&ctx2, |
| 92 | MBEDTLS_CIPHER_ID_AES, |
| 93 | key, sizeof(key) * 8, |
| 94 | 0) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 95 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 96 | TEST_ASSERT(mbedtls_nist_kw_unwrap(&ctx2, MBEDTLS_KW_MODE_KW, |
| 97 | ciphertext1, sizeof(ciphertext1), |
| 98 | plaintext, &output_len, |
| 99 | sizeof(plaintext)) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 100 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 101 | TEST_ASSERT(output_len == sizeof(plaintext)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 102 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 103 | for (i = 0; i < sizeof(plaintext); i++) { |
| 104 | TEST_ASSERT(plaintext[i] == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 105 | } |
| 106 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 107 | TEST_ASSERT(mbedtls_nist_kw_unwrap(&ctx2, MBEDTLS_KW_MODE_KWP, |
| 108 | ciphertext2, sizeof(ciphertext2), |
| 109 | plaintext, &output_len, |
| 110 | sizeof(plaintext)) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 111 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 112 | TEST_ASSERT(output_len == sizeof(plaintext)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 113 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 114 | for (i = 0; i < sizeof(plaintext); i++) { |
| 115 | TEST_ASSERT(plaintext[i] == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 116 | } |
| 117 | |
| 118 | exit: |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 119 | mbedtls_nist_kw_free(&ctx1); |
| 120 | mbedtls_nist_kw_free(&ctx2); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 121 | } |
| 122 | /* END_CASE */ |
| 123 | |
| 124 | /* BEGIN_CASE */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 125 | void mbedtls_nist_kw_setkey(int cipher_id, int key_size, |
| 126 | int is_wrap, int result) |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 127 | { |
| 128 | mbedtls_nist_kw_context ctx; |
| 129 | unsigned char key[32]; |
| 130 | int ret; |
| 131 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 132 | mbedtls_nist_kw_init(&ctx); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 133 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 134 | memset(key, 0x2A, sizeof(key)); |
| 135 | TEST_ASSERT((unsigned) key_size <= 8 * sizeof(key)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 136 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 137 | ret = mbedtls_nist_kw_setkey(&ctx, cipher_id, key, key_size, is_wrap); |
| 138 | TEST_ASSERT(ret == result); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 139 | |
| 140 | exit: |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 141 | mbedtls_nist_kw_free(&ctx); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 142 | } |
| 143 | /* END_CASE */ |
| 144 | |
| 145 | /* BEGIN_CASE depends_on:MBEDTLS_AES_C */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 146 | void nist_kw_plaintext_lengths(int in_len, int out_len, int mode, int res) |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 147 | { |
| 148 | mbedtls_nist_kw_context ctx; |
| 149 | unsigned char key[16]; |
| 150 | unsigned char *plaintext = NULL; |
| 151 | unsigned char *ciphertext = NULL; |
| 152 | size_t output_len = out_len; |
| 153 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 154 | mbedtls_nist_kw_init(&ctx); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 155 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 156 | memset(key, 0, sizeof(key)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 157 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 158 | if (in_len != 0) { |
| 159 | plaintext = mbedtls_calloc(1, in_len); |
| 160 | TEST_ASSERT(plaintext != NULL); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 161 | } |
Ron Eldor | 446227a | 2018-08-13 14:46:45 +0300 | [diff] [blame] | 162 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 163 | if (out_len != 0) { |
| 164 | ciphertext = mbedtls_calloc(1, output_len); |
| 165 | TEST_ASSERT(ciphertext != NULL); |
Ron Eldor | 446227a | 2018-08-13 14:46:45 +0300 | [diff] [blame] | 166 | } |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 167 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 168 | TEST_ASSERT(mbedtls_nist_kw_setkey(&ctx, MBEDTLS_CIPHER_ID_AES, |
| 169 | key, 8 * sizeof(key), 1) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 170 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 171 | TEST_ASSERT(mbedtls_nist_kw_wrap(&ctx, mode, plaintext, in_len, |
| 172 | ciphertext, &output_len, |
| 173 | output_len) == res); |
| 174 | if (res == 0) { |
| 175 | if (mode == MBEDTLS_KW_MODE_KWP) { |
| 176 | TEST_ASSERT(output_len == (size_t) in_len + 8 - |
| 177 | (in_len % 8) + 8); |
| 178 | } else { |
| 179 | TEST_ASSERT(output_len == (size_t) in_len + 8); |
| 180 | } |
| 181 | } else { |
| 182 | TEST_ASSERT(output_len == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 183 | } |
| 184 | |
| 185 | exit: |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 186 | mbedtls_free(ciphertext); |
| 187 | mbedtls_free(plaintext); |
| 188 | mbedtls_nist_kw_free(&ctx); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 189 | } |
| 190 | /* END_CASE */ |
| 191 | |
| 192 | /* BEGIN_CASE depends_on:MBEDTLS_AES_C */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 193 | void nist_kw_ciphertext_lengths(int in_len, int out_len, int mode, int res) |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 194 | { |
| 195 | mbedtls_nist_kw_context ctx; |
| 196 | unsigned char key[16]; |
| 197 | unsigned char *plaintext = NULL; |
| 198 | unsigned char *ciphertext = NULL; |
| 199 | int unwrap_ret; |
| 200 | size_t output_len = out_len; |
| 201 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 202 | mbedtls_nist_kw_init(&ctx); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 203 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 204 | memset(key, 0, sizeof(key)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 205 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 206 | if (out_len != 0) { |
| 207 | plaintext = mbedtls_calloc(1, output_len); |
| 208 | TEST_ASSERT(plaintext != NULL); |
Ron Eldor | 446227a | 2018-08-13 14:46:45 +0300 | [diff] [blame] | 209 | } |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 210 | if (in_len != 0) { |
| 211 | ciphertext = mbedtls_calloc(1, in_len); |
| 212 | TEST_ASSERT(ciphertext != NULL); |
Ron Eldor | 446227a | 2018-08-13 14:46:45 +0300 | [diff] [blame] | 213 | } |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 214 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 215 | TEST_ASSERT(mbedtls_nist_kw_setkey(&ctx, MBEDTLS_CIPHER_ID_AES, |
| 216 | key, 8 * sizeof(key), 0) == 0); |
| 217 | unwrap_ret = mbedtls_nist_kw_unwrap(&ctx, mode, ciphertext, in_len, |
| 218 | plaintext, &output_len, |
| 219 | output_len); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 220 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 221 | if (res == 0) { |
| 222 | TEST_ASSERT(unwrap_ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED); |
| 223 | } else { |
| 224 | TEST_ASSERT(unwrap_ret == res); |
| 225 | } |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 226 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 227 | TEST_ASSERT(output_len == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 228 | |
| 229 | exit: |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 230 | mbedtls_free(ciphertext); |
| 231 | mbedtls_free(plaintext); |
| 232 | mbedtls_nist_kw_free(&ctx); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 233 | } |
| 234 | /* END_CASE */ |
| 235 | |
| 236 | /* BEGIN_CASE */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 237 | void mbedtls_nist_kw_wrap(int cipher_id, int mode, data_t *key, data_t *msg, |
| 238 | data_t *expected_result) |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 239 | { |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 240 | unsigned char result[528]; |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 241 | mbedtls_nist_kw_context ctx; |
Ronald Cron | 9ed4073 | 2020-06-25 09:03:34 +0200 | [diff] [blame] | 242 | size_t result_len, i, padlen; |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 243 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 244 | mbedtls_nist_kw_init(&ctx); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 245 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 246 | memset(result, '+', sizeof(result)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 247 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 248 | TEST_ASSERT(mbedtls_nist_kw_setkey(&ctx, cipher_id, |
| 249 | key->x, key->len * 8, 1) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 250 | |
| 251 | /* Test with input == output */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 252 | TEST_ASSERT(mbedtls_nist_kw_wrap(&ctx, mode, msg->x, msg->len, |
| 253 | result, &result_len, sizeof(result)) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 254 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 255 | TEST_ASSERT(result_len == expected_result->len); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 256 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 257 | TEST_ASSERT(memcmp(expected_result->x, result, result_len) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 258 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 259 | padlen = (msg->len % 8 != 0) ? 8 - (msg->len % 8) : 0; |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 260 | /* Check that the function didn't write beyond the end of the buffer. */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 261 | for (i = msg->len + 8 + padlen; i < sizeof(result); i++) { |
| 262 | TEST_ASSERT(result[i] == '+'); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 263 | } |
| 264 | |
| 265 | exit: |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 266 | mbedtls_nist_kw_free(&ctx); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 267 | } |
| 268 | /* END_CASE */ |
| 269 | |
| 270 | /* BEGIN_CASE */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 271 | void mbedtls_nist_kw_unwrap(int cipher_id, int mode, data_t *key, data_t *msg, |
| 272 | data_t *expected_result, int expected_ret) |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 273 | { |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 274 | unsigned char result[528]; |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 275 | mbedtls_nist_kw_context ctx; |
Ronald Cron | 9ed4073 | 2020-06-25 09:03:34 +0200 | [diff] [blame] | 276 | size_t result_len, i; |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 277 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 278 | mbedtls_nist_kw_init(&ctx); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 279 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 280 | memset(result, '+', sizeof(result)); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 281 | |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 282 | TEST_ASSERT(mbedtls_nist_kw_setkey(&ctx, cipher_id, |
| 283 | key->x, key->len * 8, 0) == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 284 | |
| 285 | /* Test with input == output */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 286 | TEST_ASSERT(mbedtls_nist_kw_unwrap(&ctx, mode, msg->x, msg->len, |
| 287 | result, &result_len, sizeof(result)) == expected_ret); |
| 288 | if (expected_ret == 0) { |
| 289 | TEST_ASSERT(result_len == expected_result->len); |
| 290 | TEST_ASSERT(memcmp(expected_result->x, result, result_len) == 0); |
| 291 | } else { |
| 292 | TEST_ASSERT(result_len == 0); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 293 | } |
| 294 | |
| 295 | /* Check that the function didn't write beyond the end of the buffer. */ |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 296 | for (i = msg->len - 8; i < sizeof(result); i++) { |
| 297 | TEST_ASSERT(result[i] == '+'); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 298 | } |
| 299 | |
| 300 | exit: |
Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 301 | mbedtls_nist_kw_free(&ctx); |
Ron Eldor | 8dd03cd | 2018-07-15 09:37:28 +0300 | [diff] [blame] | 302 | } |
| 303 | /* END_CASE */ |