David Brown | fecda2d | 2017-09-07 10:20:34 -0600 | [diff] [blame] | 1 | /* test_cbc_mode.c - TinyCrypt implementation of some AES-CBC tests */ |
| 2 | |
| 3 | /* |
Fabio Utzig | 3efe6b6 | 2017-09-22 16:03:24 -0300 | [diff] [blame] | 4 | * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. |
David Brown | fecda2d | 2017-09-07 10:20:34 -0600 | [diff] [blame] | 5 | * |
| 6 | * Redistribution and use in source and binary forms, with or without |
| 7 | * modification, are permitted provided that the following conditions are met: |
| 8 | * |
| 9 | * - Redistributions of source code must retain the above copyright notice, |
| 10 | * this list of conditions and the following disclaimer. |
| 11 | * |
| 12 | * - Redistributions in binary form must reproduce the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer in the |
| 14 | * documentation and/or other materials provided with the distribution. |
| 15 | * |
| 16 | * - Neither the name of Intel Corporation nor the names of its contributors |
| 17 | * may be used to endorse or promote products derived from this software |
| 18 | * without specific prior written permission. |
| 19 | * |
| 20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| 21 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 22 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 23 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
| 24 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 25 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 26 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 27 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 28 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 29 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 30 | * POSSIBILITY OF SUCH DAMAGE. |
| 31 | */ |
| 32 | /* |
| 33 | * DESCRIPTION |
| 34 | * This module tests the following AES-CBC Mode routines: |
| 35 | * |
| 36 | * Scenarios tested include: |
| 37 | * - AES128 CBC mode encryption SP 800-38a tests |
| 38 | */ |
| 39 | |
| 40 | #include <tinycrypt/cbc_mode.h> |
| 41 | #include <tinycrypt/constants.h> |
| 42 | #include <test_utils.h> |
| 43 | |
| 44 | #include <stdlib.h> |
| 45 | #include <stdio.h> |
| 46 | #include <string.h> |
| 47 | |
| 48 | /* |
| 49 | * NIST test vectors from SP 800-38a: |
| 50 | * |
| 51 | * Block #1 |
| 52 | * Plaintext 6bc1bee22e409f96e93d7e117393172a |
| 53 | * Input Block 6bc0bce12a459991e134741a7f9e1925 |
| 54 | * Output Block 7649abac8119b246cee98e9b12e9197d |
| 55 | * Ciphertext 7649abac8119b246cee98e9b12e9197d |
| 56 | * Block #2 |
| 57 | * Plaintext ae2d8a571e03ac9c9eb76fac45af8e51 |
| 58 | * Input Block d86421fb9f1a1eda505ee1375746972c |
| 59 | * Output Block 5086cb9b507219ee95db113a917678b2 |
| 60 | * Ciphertext 5086cb9b507219ee95db113a917678b2 |
| 61 | * Block #3 |
| 62 | * Plaintext 30c81c46a35ce411e5fbc1191a0a52ef |
| 63 | * Input Block 604ed7ddf32efdff7020d0238b7c2a5d |
| 64 | * Output Block 73bed6b8e3c1743b7116e69e22229516 |
| 65 | * Ciphertext 73bed6b8e3c1743b7116e69e22229516 |
| 66 | * Block #4 |
| 67 | * Plaintext f69f2445df4f9b17ad2b417be66c3710 |
| 68 | * Input Block 8521f2fd3c8eef2cdc3da7e5c44ea206 |
| 69 | * Output Block 3ff1caa1681fac09120eca307586e1a7 |
| 70 | * Ciphertext 3ff1caa1681fac09120eca307586e1a7 |
| 71 | */ |
| 72 | const uint8_t key[16] = { |
| 73 | 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, |
| 74 | 0x09, 0xcf, 0x4f, 0x3c |
| 75 | }; |
| 76 | |
| 77 | const uint8_t iv[16] = { |
| 78 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, |
| 79 | 0x0c, 0x0d, 0x0e, 0x0f |
| 80 | }; |
| 81 | |
| 82 | const uint8_t plaintext[64] = { |
| 83 | 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, |
| 84 | 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, |
| 85 | 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, |
| 86 | 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, |
| 87 | 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, |
| 88 | 0xe6, 0x6c, 0x37, 0x10 |
| 89 | }; |
| 90 | |
| 91 | const uint8_t ciphertext[80] = { |
| 92 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, |
| 93 | 0x0c, 0x0d, 0x0e, 0x0f, 0x76, 0x49, 0xab, 0xac, 0x81, 0x19, 0xb2, 0x46, |
| 94 | 0xce, 0xe9, 0x8e, 0x9b, 0x12, 0xe9, 0x19, 0x7d, 0x50, 0x86, 0xcb, 0x9b, |
| 95 | 0x50, 0x72, 0x19, 0xee, 0x95, 0xdb, 0x11, 0x3a, 0x91, 0x76, 0x78, 0xb2, |
| 96 | 0x73, 0xbe, 0xd6, 0xb8, 0xe3, 0xc1, 0x74, 0x3b, 0x71, 0x16, 0xe6, 0x9e, |
| 97 | 0x22, 0x22, 0x95, 0x16, 0x3f, 0xf1, 0xca, 0xa1, 0x68, 0x1f, 0xac, 0x09, |
| 98 | 0x12, 0x0e, 0xca, 0x30, 0x75, 0x86, 0xe1, 0xa7 |
| 99 | }; |
| 100 | |
| 101 | /* |
| 102 | * NIST SP 800-38a CBC Test for encryption and decryption. |
| 103 | */ |
| 104 | int test_1_and_2(void) |
| 105 | { |
| 106 | struct tc_aes_key_sched_struct a; |
| 107 | uint8_t iv_buffer[16]; |
| 108 | uint8_t encrypted[80]; |
| 109 | uint8_t decrypted[64]; |
| 110 | uint8_t *p; |
Fabio Utzig | 3efe6b6 | 2017-09-22 16:03:24 -0300 | [diff] [blame] | 111 | unsigned int length; |
David Brown | fecda2d | 2017-09-07 10:20:34 -0600 | [diff] [blame] | 112 | int result = TC_PASS; |
| 113 | |
| 114 | (void)tc_aes128_set_encrypt_key(&a, key); |
| 115 | |
| 116 | (void)memcpy(iv_buffer, iv, TC_AES_BLOCK_SIZE); |
| 117 | |
| 118 | TC_PRINT("CBC test #1 (encryption SP 800-38a tests):\n"); |
Fabio Utzig | 3efe6b6 | 2017-09-22 16:03:24 -0300 | [diff] [blame] | 119 | if (tc_cbc_mode_encrypt(encrypted, sizeof(plaintext) + TC_AES_BLOCK_SIZE, |
| 120 | plaintext, sizeof(plaintext), iv_buffer, &a) == 0) { |
David Brown | fecda2d | 2017-09-07 10:20:34 -0600 | [diff] [blame] | 121 | TC_ERROR("CBC test #1 (encryption SP 800-38a tests) failed in " |
| 122 | "%s.\n", __func__); |
| 123 | result = TC_FAIL; |
| 124 | goto exitTest1; |
| 125 | } |
| 126 | |
Fabio Utzig | 3efe6b6 | 2017-09-22 16:03:24 -0300 | [diff] [blame] | 127 | result = check_result(1, ciphertext, sizeof(encrypted), encrypted, |
| 128 | sizeof(encrypted)); |
David Brown | fecda2d | 2017-09-07 10:20:34 -0600 | [diff] [blame] | 129 | TC_END_RESULT(result); |
| 130 | |
| 131 | TC_PRINT("CBC test #2 (decryption SP 800-38a tests):\n"); |
| 132 | (void)tc_aes128_set_decrypt_key(&a, key); |
| 133 | |
| 134 | p = &encrypted[TC_AES_BLOCK_SIZE]; |
Fabio Utzig | 3efe6b6 | 2017-09-22 16:03:24 -0300 | [diff] [blame] | 135 | length = ((unsigned int) sizeof(encrypted)) - TC_AES_BLOCK_SIZE; |
David Brown | fecda2d | 2017-09-07 10:20:34 -0600 | [diff] [blame] | 136 | |
Fabio Utzig | 3efe6b6 | 2017-09-22 16:03:24 -0300 | [diff] [blame] | 137 | if (tc_cbc_mode_decrypt(decrypted, length - TC_AES_BLOCK_SIZE, p, length, |
| 138 | encrypted, &a) == 0) { |
David Brown | fecda2d | 2017-09-07 10:20:34 -0600 | [diff] [blame] | 139 | TC_ERROR("CBC test #2 (decryption SP 800-38a tests) failed in. " |
| 140 | "%s\n", __func__); |
| 141 | result = TC_FAIL; |
| 142 | goto exitTest1; |
| 143 | } |
| 144 | |
Fabio Utzig | 3efe6b6 | 2017-09-22 16:03:24 -0300 | [diff] [blame] | 145 | result = check_result(2, plaintext, sizeof(decrypted), decrypted, |
| 146 | sizeof(decrypted)); |
David Brown | fecda2d | 2017-09-07 10:20:34 -0600 | [diff] [blame] | 147 | |
| 148 | exitTest1: |
| 149 | TC_END_RESULT(result); |
| 150 | return result; |
| 151 | } |
| 152 | |
| 153 | /* |
| 154 | * Main task to test AES |
| 155 | */ |
| 156 | int main(void) |
| 157 | { |
| 158 | int result = TC_PASS; |
| 159 | |
| 160 | TC_START("Performing AES128 tests:"); |
| 161 | |
| 162 | TC_PRINT("Performing CBC tests:\n"); |
| 163 | result = test_1_and_2(); |
Fabio Utzig | 3efe6b6 | 2017-09-22 16:03:24 -0300 | [diff] [blame] | 164 | if (result == TC_FAIL) { |
| 165 | /* terminate test */ |
David Brown | fecda2d | 2017-09-07 10:20:34 -0600 | [diff] [blame] | 166 | TC_ERROR("CBC test #1 failed.\n"); |
| 167 | goto exitTest; |
| 168 | } |
| 169 | |
| 170 | TC_PRINT("All CBC tests succeeded!\n"); |
| 171 | |
| 172 | exitTest: |
| 173 | TC_END_RESULT(result); |
| 174 | TC_END_REPORT(result); |
| 175 | |
| 176 | return result; |
| 177 | } |