diff options
Diffstat (limited to 'src/spdk/intel-ipsec-mb/LibTestApp/cmac_test.c')
-rw-r--r-- | src/spdk/intel-ipsec-mb/LibTestApp/cmac_test.c | 1354 |
1 files changed, 1354 insertions, 0 deletions
diff --git a/src/spdk/intel-ipsec-mb/LibTestApp/cmac_test.c b/src/spdk/intel-ipsec-mb/LibTestApp/cmac_test.c new file mode 100644 index 000000000..9365af761 --- /dev/null +++ b/src/spdk/intel-ipsec-mb/LibTestApp/cmac_test.c @@ -0,0 +1,1354 @@ +/***************************************************************************** + Copyright (c) 2018, Intel Corporation + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Intel Corporation nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*****************************************************************************/ + +#include <stdint.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <intel-ipsec-mb.h> +#include "gcm_ctr_vectors_test.h" +#include "utils.h" + +enum cmac_type { + CMAC = 0, + CMAC_BITLEN, +}; + +int cmac_test(const enum arch_type arch, struct MB_MGR *mb_mgr); + +/* + * Test vectors from https://tools.ietf.org/html/rfc4493 + */ + +/* + * Subkey Generation + * K 2b7e1516 28aed2a6 abf71588 09cf4f3c + * AES-128(key,0) 7df76b0c 1ab899b3 3e42f047 b91b546f + * K1 fbeed618 35713366 7c85e08f 7236a8de + * K2 f7ddac30 6ae266cc f90bc11e e46d513b + */ +static const uint8_t key[16] = { + 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, + 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c +}; +static const uint8_t sub_key1[16] = { + 0xfb, 0xee, 0xd6, 0x18, 0x35, 0x71, 0x33, 0x66, + 0x7c, 0x85, 0xe0, 0x8f, 0x72, 0x36, 0xa8, 0xde +}; +static const uint8_t sub_key2[16] = { + 0xf7, 0xdd, 0xac, 0x30, 0x6a, 0xe2, 0x66, 0xcc, + 0xf9, 0x0b, 0xc1, 0x1e, 0xe4, 0x6d, 0x51, 0x3b +}; + +/* + * Example 1: len = 0 + * M <empty string> + * AES-CMAC bb1d6929 e9593728 7fa37d12 9b756746 + */ +static const uint8_t T_1[16] = { + 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28, + 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46 +}; + +/* + * Example 2: len = 16 + * M 6bc1bee2 2e409f96 e93d7e11 7393172a + * AES-CMAC 070a16b4 6b4d4144 f79bdd9d d04a287c + */ +static const uint8_t T_2[16] = { + 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44, + 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c +}; + +/* + * Example 3: len = 40 + * M 6bc1bee2 2e409f96 e93d7e11 7393172a + * ae2d8a57 1e03ac9c 9eb76fac 45af8e51 + * 30c81c46 a35ce411 + * AES-CMAC dfa66747 de9ae630 30ca3261 1497c827 + */ +static const uint8_t T_3[16] = { + 0xdf, 0xa6, 0x67, 0x47, 0xde, 0x9a, 0xe6, 0x30, + 0x30, 0xca, 0x32, 0x61, 0x14, 0x97, 0xc8, 0x27 +}; + +/* + * Example 4: len = 64 + * M 6bc1bee2 2e409f96 e93d7e11 7393172a + * ae2d8a57 1e03ac9c 9eb76fac 45af8e51 + * 30c81c46 a35ce411 e5fbc119 1a0a52ef + * f69f2445 df4f9b17 ad2b417b e66c3710 + * AES-CMAC 51f0bebf 7e3b9d92 fc497417 79363cfe + */ +static const uint8_t T_4[16] = { + 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92, + 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe +}; + +/* + * Custom Vector + * + * Example 5: len = 8 + * M 6bc1bee2 2e409f96 + * AES-CMAC dc87cdcf 77a2f182 9e012c4d 31af2f8b + */ +static const uint8_t T_5[16] = { + 0xdc, 0x87, 0xcd, 0xcf, 0x77, 0xa2, 0xf1, 0x82, + 0x9e, 0x01, 0x2c, 0x4d, 0x31, 0xaf, 0x2f, 0x8b +}; + +static const uint8_t M[64] = { + 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, + 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, + 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, + 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, + 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, + 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, + 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, + 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 +}; + +/* + * 3GPP 33.401 C.2.1 Test Case 1 + * + * CMAC(K,M): + * K = (hex) 2bd6459f 82c5b300 952c4910 4881ff48 + * Mlen = 122 (bits) + * M = (hex) 38a6f056 c0000000 33323462 63393840 + * + * Subkey generation: + * K1 = (hex) dc84c270 b5bf83f9 6f90be18 8d3f6418 + * K2 = (hex) b90984e1 6b7f07f2 df217c31 1a7ec8b7 + * + * MAC generation: + * C1 = (hex) 118c6eb8 b775144b 0b831110 54c96eb6 + * MACT = (hex) 118c6eb8 + */ +static const uint8_t EIA2_128_K_1[16] = { + 0x2b, 0xd6, 0x45, 0x9f, 0x82, 0xc5, 0xb3, 0x00, + 0x95, 0x2c, 0x49, 0x10, 0x48, 0x81, 0xff, 0x48 +}; + +static const uint8_t EIA2_128_SK1_1[16] = { + 0xdc, 0x84, 0xc2, 0x70, 0xb5, 0xbf, 0x83, 0xf9, + 0x6f, 0x90, 0xbe, 0x18, 0x8d, 0x3f, 0x64, 0x18 +}; + +static const uint8_t EIA2_128_SK2_1[16] = { + 0xb9, 0x09, 0x84, 0xe1, 0x6b, 0x7f, 0x07, 0xf2, + 0xdf, 0x21, 0x7c, 0x31, 0x1a, 0x7e, 0xc8, 0xb7 +}; + +static const uint8_t EIA2_128_T_1[4] = { + 0x11, 0x8c, 0x6e, 0xb8 +}; + +static const uint8_t EIA2_128_M_1[16] = { + 0x38, 0xa6, 0xf0, 0x56, 0xc0, 0x00, 0x00, 0x00, + 0x33, 0x32, 0x34, 0x62, 0x63, 0x39, 0x38, 0x40 /* 0x40 = 0100 0000 */ +}; + +/* + * 3GPP 33.401 C.2.1 Test Case 2 + * + * CMAC(K, M): + * K = d3c5d592 327fb11c 4035c668 0af8c6d1 + * Mlen = 128 + * M = 398a59b4 d4000000 484583d5 afe082ae + * + * Subkey Generation: + * L = 9b71f299 132915d3 605211b5 e5df8632 + * K1 = 36e3e532 26522ba6 c0a4236b cbbf0ce3 + * K2 = 6dc7ca64 4ca4574d 814846d7 977e19c6 + * + * MAC generation: + * C1 = b93787e6 493ff113 ad73d3e0 1e826d73 + * MACT = b93787e6 + */ +static const uint8_t EIA2_128_K_2[16] = { + 0xd3, 0xc5, 0xd5, 0x92, 0x32, 0x7f, 0xb1, 0x1c, + 0x40, 0x35, 0xc6, 0x68, 0x0a, 0xf8, 0xc6, 0xd1 +}; + +static const uint8_t EIA2_128_SK1_2[16] = { + 0x36, 0xe3, 0xe5, 0x32, 0x26, 0x52, 0x2b, 0xa6, + 0xc0, 0xa4, 0x23, 0x6b, 0xcb, 0xbf, 0x0c, 0xe3 +}; + +static const uint8_t EIA2_128_SK2_2[16] = { + 0x6d, 0xc7, 0xca, 0x64, 0x4c, 0xa4, 0x57, 0x4d, + 0x81, 0x48, 0x46, 0xd7, 0x97, 0x7e, 0x19, 0xc6 +}; + +static const uint8_t EIA2_128_T_2[4] = { + 0xb9, 0x37, 0x87, 0xe6 +}; + +static const uint8_t EIA2_128_M_2[16] = { + 0x39, 0x8a, 0x59, 0xb4, 0xd4, 0x00, 0x00, 0x00, + 0x48, 0x45, 0x83, 0xd5, 0xaf, 0xe0, 0x82, 0xae +}; + +/* + * 3GPP 33.401 C.2.1 Test Case 3 + * + * CMAC(K, M): + * K = 7e5e9443 1e11d738 28d739cc 6ced4573 + * Mlen = 318 + * M = 36af6144 c4000000 b3d3c917 0a4e1632 f60f8610 13d22d84 b726b6a2 + * 78d802d1 eeaf1321 ba5929dc + * + * Subkey Generation: + * L = d78b4628 35781e79 d2255f8d 309a60ef + * K1 = af168c50 6af03cf3 a44abf1a 6134c159 + * K2 = 5e2d18a0 d5e079e7 48957e34 c2698235 + * + * MAC generation: + * C3 = 1f60b01d e05aa666 3bda32c6 1771e70b + * MACT = 1f60b01d + */ +static const uint8_t EIA2_128_K_3[16] = { + 0x7e, 0x5e, 0x94, 0x43, 0x1e, 0x11, 0xd7, 0x38, + 0x28, 0xd7, 0x39, 0xcc, 0x6c, 0xed, 0x45, 0x73 +}; + +static const uint8_t EIA2_128_SK1_3[16] = { + 0xaf, 0x16, 0x8c, 0x50, 0x6a, 0xf0, 0x3c, 0xf3, + 0xa4, 0x4a, 0xbf, 0x1a, 0x61, 0x34, 0xc1, 0x59 +}; + +static const uint8_t EIA2_128_SK2_3[16] = { + 0x5e, 0x2d, 0x18, 0xa0, 0xd5, 0xe0, 0x79, 0xe7, + 0x48, 0x95, 0x7e, 0x34, 0xc2, 0x69, 0x82, 0x35 +}; + +static const uint8_t EIA2_128_T_3[4] = { + 0x1f, 0x60, 0xb0, 0x1d +}; + +static const uint8_t EIA2_128_M_3[40] = { + 0x36, 0xaf, 0x61, 0x44, 0xc4, 0x00, 0x00, 0x00, + 0xb3, 0xd3, 0xc9, 0x17, 0x0a, 0x4e, 0x16, 0x32, + 0xf6, 0x0f, 0x86, 0x10, 0x13, 0xd2, 0x2d, 0x84, + 0xb7, 0x26, 0xb6, 0xa2, 0x78, 0xd8, 0x02, 0xd1, + 0xee, 0xaf, 0x13, 0x21, 0xba, 0x59, 0x29, 0xdc +}; + +/* + * 3GPP 33.401 C.2.1 Test Case 4 + * + * CMAC(K, M): + * K = d3419be8 21087acd 02123a92 48033359 + * Mlen = 575 + * M = c7590ea9 b8000000 bbb05703 8809496b + * cff86d6f bc8ce5b1 35a06b16 6054f2d5 + * 65be8ace 75dc851e 0bcdd8f0 7141c495 + * 872fb5d8 c0c66a8b 6da55666 3e4e4612 + * 05d84580 bee5bc7e + * + * Subkey Generation: + * L = 054dd008 2d9ecd21 a3f32b0a a7369be4 + * K1 = 0a9ba010 5b3d9a43 47e65615 4e6d37c8 + * K2 = 15374020 b67b3486 8fccac2a 9cda6f90 + * + * MAC generation: + * C5 = 6846a2f0 a0b6be7a 4fb26a15 7e914c53 + * MACT = 6846a2f0 + */ +static const uint8_t EIA2_128_K_4[16] = { + 0xd3, 0x41, 0x9b, 0xe8, 0x21, 0x08, 0x7a, 0xcd, + 0x02, 0x12, 0x3a, 0x92, 0x48, 0x03, 0x33, 0x59 +}; + +static const uint8_t EIA2_128_SK1_4[16] = { + 0x0a, 0x9b, 0xa0, 0x10, 0x5b, 0x3d, 0x9a, 0x43, + 0x47, 0xe6, 0x56, 0x15, 0x4e, 0x6d, 0x37, 0xc8 +}; + +static const uint8_t EIA2_128_SK2_4[16] = { + 0x15, 0x37, 0x40, 0x20, 0xb6, 0x7b, 0x34, 0x86, + 0x8f, 0xcc, 0xac, 0x2a, 0x9c, 0xda, 0x6f, 0x90 +}; + +static const uint8_t EIA2_128_T_4[4] = { + 0x68, 0x46, 0xa2, 0xf0 +}; + +static const uint8_t EIA2_128_M_4[72] = { + 0xc7, 0x59, 0x0e, 0xa9, 0xb8, 0x00, 0x00, 0x00, + 0xbb, 0xb0, 0x57, 0x03, 0x88, 0x09, 0x49, 0x6b, + 0xcf, 0xf8, 0x6d, 0x6f, 0xbc, 0x8c, 0xe5, 0xb1, + 0x35, 0xa0, 0x6b, 0x16, 0x60, 0x54, 0xf2, 0xd5, + 0x65, 0xbe, 0x8a, 0xce, 0x75, 0xdc, 0x85, 0x1e, + 0x0b, 0xcd, 0xd8, 0xf0, 0x71, 0x41, 0xc4, 0x95, + 0x87, 0x2f, 0xb5, 0xd8, 0xc0, 0xc6, 0x6a, 0x8b, + 0x6d, 0xa5, 0x56, 0x66, 0x3e, 0x4e, 0x46, 0x12, + 0x05, 0xd8, 0x45, 0x80, 0xbe, 0xe5, 0xbc, 0x7e +}; + +/* + * 3GPP 33.401 C.2.1 Test Case 5 + * + * CMAC(K, M): + * K = 83fd23a2 44a74cf3 58da3019 f1722635 + * Mlen = 832 + * M = 36af6144 7c000000 35c68716 633c66fb + * 750c2668 65d53c11 ea05b1e9 fa49c839 + * 8d48e1ef a5909d39 47902837 f5ae96d5 + * a05bc8d6 1ca8dbef 1b13a4b4 abfe4fb1 + * 006045b6 74bb5472 9304c382 be53a5af + * 05556176 f6eaa2ef 1d05e4b0 83181ee6 + * 74cda5a4 85f74d7a + * + * Subkey Generation: + * L = 9df61c57 3c86acac 704db9d5 b0dea444 + * K1 = 3bec38ae 790d5958 e09b73ab 61bd480f + * K2 = 77d8715c f21ab2b1 c136e756 c37a901e + * + * MAC generation: + * C7 = e657e182 5298f2fa ee2ca1e0 7373bc7e + * MACT = e657e182 + */ +static const uint8_t EIA2_128_K_5[16] = { + 0x83, 0xfd, 0x23, 0xa2, 0x44, 0xa7, 0x4c, 0xf3, + 0x58, 0xda, 0x30, 0x19, 0xf1, 0x72, 0x26, 0x35 +}; + +static const uint8_t EIA2_128_SK1_5[16] = { + 0x3b, 0xec, 0x38, 0xae, 0x79, 0x0d, 0x59, 0x58, + 0xe0, 0x9b, 0x73, 0xab, 0x61, 0xbd, 0x48, 0x0f +}; + +static const uint8_t EIA2_128_SK2_5[16] = { + 0x77, 0xd8, 0x71, 0x5c, 0xf2, 0x1a, 0xb2, 0xb1, + 0xc1, 0x36, 0xe7, 0x56, 0xc3, 0x7a, 0x90, 0x1e +}; + +static const uint8_t EIA2_128_T_5[4] = { + 0xe6, 0x57, 0xe1, 0x82 +}; + +static const uint8_t EIA2_128_M_5[104] = { + 0x36, 0xaf, 0x61, 0x44, 0x7c, 0x00, 0x00, 0x00, + 0x35, 0xc6, 0x87, 0x16, 0x63, 0x3c, 0x66, 0xfb, + 0x75, 0x0c, 0x26, 0x68, 0x65, 0xd5, 0x3c, 0x11, + 0xea, 0x05, 0xb1, 0xe9, 0xfa, 0x49, 0xc8, 0x39, + 0x8d, 0x48, 0xe1, 0xef, 0xa5, 0x90, 0x9d, 0x39, + 0x47, 0x90, 0x28, 0x37, 0xf5, 0xae, 0x96, 0xd5, + 0xa0, 0x5b, 0xc8, 0xd6, 0x1c, 0xa8, 0xdb, 0xef, + 0x1b, 0x13, 0xa4, 0xb4, 0xab, 0xfe, 0x4f, 0xb1, + 0x00, 0x60, 0x45, 0xb6, 0x74, 0xbb, 0x54, 0x72, + 0x93, 0x04, 0xc3, 0x82, 0xbe, 0x53, 0xa5, 0xaf, + 0x05, 0x55, 0x61, 0x76, 0xf6, 0xea, 0xa2, 0xef, + 0x1d, 0x05, 0xe4, 0xb0, 0x83, 0x18, 0x1e, 0xe6, + 0x74, 0xcd, 0xa5, 0xa4, 0x85, 0xf7, 0x4d, 0x7a +}; + +/* + * 3GPP 33.401 C.2.1 Test Case 6 + * + * CMAC(K, M): + * K = 6832a65c ff447362 1ebdd4ba 26a921fe + * Mlen = 447 + * M = 36af6144 c0000000 d3c53839 62682071 + * 77656676 20323837 63624098 1ba6824c + * 1bfb1ab4 85472029 b71d808c e33e2cc3 + * c0b5fc1f 3de8a6dc + * + * Subkey Generation: + * L = e50123c3 87e13fd6 8d8bf0d0 a4581685 + * K1 = ca024787 0fc27fad 1b17e1a1 48b02d8d + * K2 = 94048f0e 1f84ff5a 362fc342 91605b9d + * + * MAC generation: + * C4 = f0668c1e 4197300b 1243f834 25d06c25 + * MACT = f0668c1e + */ +static const uint8_t EIA2_128_K_6[16] = { + 0x68, 0x32, 0xa6, 0x5c, 0xff, 0x44, 0x73, 0x62, + 0x1e, 0xbd, 0xd4, 0xba, 0x26, 0xa9, 0x21, 0xfe +}; + +static const uint8_t EIA2_128_SK1_6[16] = { + 0xca, 0x02, 0x47, 0x87, 0x0f, 0xc2, 0x7f, 0xad, + 0x1b, 0x17, 0xe1, 0xa1, 0x48, 0xb0, 0x2d, 0x8d +}; + +static const uint8_t EIA2_128_SK2_6[16] = { + 0x94, 0x04, 0x8f, 0x0e, 0x1f, 0x84, 0xff, 0x5a, + 0x36, 0x2f, 0xc3, 0x42, 0x91, 0x60, 0x5b, 0x9d +}; + +static const uint8_t EIA2_128_T_6[4] = { + 0xf0, 0x66, 0x8c, 0x1e +}; + +static const uint8_t EIA2_128_M_6[56] = { + 0x36, 0xaf, 0x61, 0x44, 0xc0, 0x00, 0x00, 0x00, + 0xd3, 0xc5, 0x38, 0x39, 0x62, 0x68, 0x20, 0x71, + 0x77, 0x65, 0x66, 0x76, 0x20, 0x32, 0x38, 0x37, + 0x63, 0x62, 0x40, 0x98, 0x1b, 0xa6, 0x82, 0x4c, + 0x1b, 0xfb, 0x1a, 0xb4, 0x85, 0x47, 0x20, 0x29, + 0xb7, 0x1d, 0x80, 0x8c, 0xe3, 0x3e, 0x2c, 0xc3, + 0xc0, 0xb5, 0xfc, 0x1f, 0x3d, 0xe8, 0xa6, 0xdc +}; + +/* + * 3GPP 33.401 C.2.1 Test Case 7 + * + * CMAC(K, M): + * K = 5d0a80d8 134ae196 77824b67 1e838af4 + * Mlen = 2622 + * M = 7827fab2 2c000000 70dedf2d c42c5cbd + * 3a96f8a0 b11418b3 608d5733 604a2cd3 + * 6aabc70c e3193bb5 153be2d3 c06dfdb2 + * d16e9c35 7158be6a 41d6b861 e491db3f + * bfeb518e fcf048d7 d5895373 0ff30c9e + * c470ffcd 663dc342 01c36add c0111c35 + * b38afee7 cfdb582e 3731f8b4 baa8d1a8 + * 9c06e811 99a97162 27be344e fcb436dd + * d0f096c0 64c3b5e2 c399993f c77394f9 + * e09720a8 11850ef2 3b2ee05d 9e617360 + * 9d86e1c0 c18ea51a 012a00bb 413b9cb8 + * 188a703c d6bae31c c67b34b1 b00019e6 + * a2b2a690 f02671fe 7c9ef8de c0094e53 + * 3763478d 58d2c5f5 b827a014 8c5948a9 + * 6931acf8 4f465a64 e62ce740 07e991e3 + * 7ea823fa 0fb21923 b79905b7 33b631e6 + * c7d6860a 3831ac35 1a9c730c 52ff72d9 + * d308eedb ab21fde1 43a0ea17 e23edc1f + * 74cbb363 8a2033aa a15464ea a733385d + * bbeb6fd7 3509b857 e6a419dc a1d8907a + * f977fbac 4dfa35ec + * + * Subkey Generation: + * L = 9832e229 fbb93970 bcf7b282 3ee4fe5d + * K1 = 3065c453 f77272e1 79ef6504 7dc9fc3d + * K2 = 60cb88a7 eee4e5c2 f3deca08 fb93f87a + * + * MAC generation: + * C21 = f4cc8fa3 59e6e2e7 6e09c45d 6ea5e0de + * MACT = f4cc8fa3 + */ +static const uint8_t EIA2_128_K_7[16] = { + 0x5d, 0x0a, 0x80, 0xd8, 0x13, 0x4a, 0xe1, 0x96, + 0x77, 0x82, 0x4b, 0x67, 0x1e, 0x83, 0x8a, 0xf4 +}; + +static const uint8_t EIA2_128_SK1_7[16] = { + 0x30, 0x65, 0xc4, 0x53, 0xf7, 0x72, 0x72, 0xe1, + 0x79, 0xef, 0x65, 0x04, 0x7d, 0xc9, 0xfc, 0x3d +}; + +static const uint8_t EIA2_128_SK2_7[16] = { + 0x60, 0xcb, 0x88, 0xa7, 0xee, 0xe4, 0xe5, 0xc2, + 0xf3, 0xde, 0xca, 0x08, 0xfb, 0x93, 0xf8, 0x7a +}; + +static const uint8_t EIA2_128_T_7[4] = { + 0xf4, 0xcc, 0x8f, 0xa3 +}; + +static const uint8_t EIA2_128_M_7[328] = { + 0x78, 0x27, 0xfa, 0xb2, 0x2c, 0x00, 0x00, 0x00, + 0x70, 0xde, 0xdf, 0x2d, 0xc4, 0x2c, 0x5c, 0xbd, + 0x3a, 0x96, 0xf8, 0xa0, 0xb1, 0x14, 0x18, 0xb3, + 0x60, 0x8d, 0x57, 0x33, 0x60, 0x4a, 0x2c, 0xd3, + 0x6a, 0xab, 0xc7, 0x0c, 0xe3, 0x19, 0x3b, 0xb5, + 0x15, 0x3b, 0xe2, 0xd3, 0xc0, 0x6d, 0xfd, 0xb2, + 0xd1, 0x6e, 0x9c, 0x35, 0x71, 0x58, 0xbe, 0x6a, + 0x41, 0xd6, 0xb8, 0x61, 0xe4, 0x91, 0xdb, 0x3f, + 0xbf, 0xeb, 0x51, 0x8e, 0xfc, 0xf0, 0x48, 0xd7, + 0xd5, 0x89, 0x53, 0x73, 0x0f, 0xf3, 0x0c, 0x9e, + 0xc4, 0x70, 0xff, 0xcd, 0x66, 0x3d, 0xc3, 0x42, + 0x01, 0xc3, 0x6a, 0xdd, 0xc0, 0x11, 0x1c, 0x35, + 0xb3, 0x8a, 0xfe, 0xe7, 0xcf, 0xdb, 0x58, 0x2e, + 0x37, 0x31, 0xf8, 0xb4, 0xba, 0xa8, 0xd1, 0xa8, + 0x9c, 0x06, 0xe8, 0x11, 0x99, 0xa9, 0x71, 0x62, + 0x27, 0xbe, 0x34, 0x4e, 0xfc, 0xb4, 0x36, 0xdd, + 0xd0, 0xf0, 0x96, 0xc0, 0x64, 0xc3, 0xb5, 0xe2, + 0xc3, 0x99, 0x99, 0x3f, 0xc7, 0x73, 0x94, 0xf9, + 0xe0, 0x97, 0x20, 0xa8, 0x11, 0x85, 0x0e, 0xf2, + 0x3b, 0x2e, 0xe0, 0x5d, 0x9e, 0x61, 0x73, 0x60, + 0x9d, 0x86, 0xe1, 0xc0, 0xc1, 0x8e, 0xa5, 0x1a, + 0x01, 0x2a, 0x00, 0xbb, 0x41, 0x3b, 0x9c, 0xb8, + 0x18, 0x8a, 0x70, 0x3c, 0xd6, 0xba, 0xe3, 0x1c, + 0xc6, 0x7b, 0x34, 0xb1, 0xb0, 0x00, 0x19, 0xe6, + 0xa2, 0xb2, 0xa6, 0x90, 0xf0, 0x26, 0x71, 0xfe, + 0x7c, 0x9e, 0xf8, 0xde, 0xc0, 0x09, 0x4e, 0x53, + 0x37, 0x63, 0x47, 0x8d, 0x58, 0xd2, 0xc5, 0xf5, + 0xb8, 0x27, 0xa0, 0x14, 0x8c, 0x59, 0x48, 0xa9, + 0x69, 0x31, 0xac, 0xf8, 0x4f, 0x46, 0x5a, 0x64, + 0xe6, 0x2c, 0xe7, 0x40, 0x07, 0xe9, 0x91, 0xe3, + 0x7e, 0xa8, 0x23, 0xfa, 0x0f, 0xb2, 0x19, 0x23, + 0xb7, 0x99, 0x05, 0xb7, 0x33, 0xb6, 0x31, 0xe6, + 0xc7, 0xd6, 0x86, 0x0a, 0x38, 0x31, 0xac, 0x35, + 0x1a, 0x9c, 0x73, 0x0c, 0x52, 0xff, 0x72, 0xd9, + 0xd3, 0x08, 0xee, 0xdb, 0xab, 0x21, 0xfd, 0xe1, + 0x43, 0xa0, 0xea, 0x17, 0xe2, 0x3e, 0xdc, 0x1f, + 0x74, 0xcb, 0xb3, 0x63, 0x8a, 0x20, 0x33, 0xaa, + 0xa1, 0x54, 0x64, 0xea, 0xa7, 0x33, 0x38, 0x5d, + 0xbb, 0xeb, 0x6f, 0xd7, 0x35, 0x09, 0xb8, 0x57, + 0xe6, 0xa4, 0x19, 0xdc, 0xa1, 0xd8, 0x90, 0x7a, + 0xf9, 0x77, 0xfb, 0xac, 0x4d, 0xfa, 0x35, 0xec +}; + +/* + * 3GPP 33.401 C.2.1 Test Case 8 + * + * CMAC(K, M): + * K = b3120ffd b2cf6af4 e73eaf2e f4ebec69 + * Mlen = 16512 + * M = 296f393c 5c000000 00000000 00000000 + * 01010101 01010101 e0958045 f3a0bba4 + * e3968346 f0a3b8a7 c02a018a e6407652 + * 26b987c9 13e6cbf0 83570016 cf83efbc + * 61c08251 3e21561a 427c009d 28c298ef + * ace78ed6 d56c2d45 05ad032e 9c04dc60 + * e73a8169 6da665c6 c48603a5 7b45ab33 + * 221585e6 8ee31691 87fb0239 528632dd + * 656c807e a3248b7b 46d002b2 b5c7458e + * b85b9ce9 5879e034 0859055e 3b0abbc3 + * eace8719 caa80265 c97205d5 dc4bcc90 + * 2fe18396 29ed7132 8a0f0449 f588557e + * 6898860e 042aecd8 4b2404c2 12c9222d + * a5bf8a89 ef679787 0cf50771 a60f66a2 + * ee628536 57addf04 cdde07fa 414e11f1 + * 2b4d81b9 b4e8ac53 8ea30666 688d881f + * 6c348421 992f31b9 4f8806ed 8fccff4c + * 9123b896 42527ad6 13b109bf 75167485 + * f1268bf8 84b4cd23 d29a0934 925703d6 + * 34098f77 67f1be74 91e708a8 bb949a38 + * 73708aef 4a36239e 50cc0823 5cd5ed6b + * be578668 a17b58c1 171d0b90 e813a9e4 + * f58a89d7 19b11042 d6360b1b 0f52deb7 + * 30a58d58 faf46315 954b0a87 26914759 + * 77dc88c0 d733feff 54600a0c c1d0300a + * aaeb9457 2c6e95b0 1ae90de0 4f1dce47 + * f87e8fa7 bebf77e1 dbc20d6b a85cb914 + * 3d518b28 5dfa04b6 98bf0cf7 819f20fa + * 7a288eb0 703d995c 59940c7c 66de57a9 + * b70f8237 9b70e203 1e450fcf d2181326 + * fcd28d88 23baaa80 df6e0f44 35596475 + * 39fd8907 c0ffd9d7 9c130ed8 1c9afd9b + * 7e848c9f ed38443d 5d380e53 fbdb8ac8 + * c3d3f068 76054f12 2461107d e92fea09 + * c6f6923a 188d53af e54a10f6 0e6e9d5a + * 03d996b5 fbc820f8 a637116a 27ad04b4 + * 44a0932d d60fbd12 671c11e1 c0ec73e7 + * 89879faa 3d42c64d 20cd1252 742a3768 + * c25a9015 85888ece e1e612d9 936b403b + * 0775949a 66cdfd99 a29b1345 baa8d9d5 + * 400c9102 4b0a6073 63b013ce 5de9ae86 + * 9d3b8d95 b0570b3c 2d391422 d32450cb + * cfae9665 2286e96d ec1214a9 34652798 + * 0a8192ea c1c39a3a af6f1535 1da6be76 + * 4df89772 ec0407d0 6e4415be fae7c925 + * 80df9bf5 07497c8f 2995160d 4e218daa + * cb02944a bf83340c e8be1686 a960faf9 + * 0e2d90c5 5cc6475b abc3171a 80a36317 + * 4954955d 7101dab1 6ae81791 67e21444 + * b443a9ea aa7c91de 36d118c3 9d389f8d + * d4469a84 6c9a262b f7fa1848 7a79e8de + * 11699e0b 8fdf557c b48719d4 53ba7130 + * 56109b93 a218c896 75ac195f b4fb0663 + * 9b379714 4955b3c9 327d1aec 003d42ec + * d0ea98ab f19ffb4a f3561a67 e77c35bf + * 15c59c24 12da881d b02b1bfb cebfac51 + * 52bc99bc 3f1d15f7 71001b70 29fedb02 + * 8f8b852b c4407eb8 3f891c9c a733254f + * dd1e9edb 56919ce9 fea21c17 4072521c + * 18319a54 b5d4efbe bddf1d8b 69b1cbf2 + * 5f489fcc 98137254 7cf41d00 8ef0bca1 + * 926f934b 735e090b 3b251eb3 3a36f82e + * d9b29cf4 cb944188 fa0e1e38 dd778f7d + * 1c9d987b 28d132df b9731fa4 f4b41693 + * 5be49de3 0516af35 78581f2f 13f561c0 + * 66336194 1eab249a 4bc123f8 d15cd711 + * a956a1bf 20fe6eb7 8aea2373 361da042 + * 6c79a530 c3bb1de0 c99722ef 1fde39ac + * 2b00a0a8 ee7c800a 08bc2264 f89f4eff + * e627ac2f 0531fb55 4f6d21d7 4c590a70 + * adfaa390 bdfbb3d6 8e46215c ab187d23 + * 68d5a71f 5ebec081 cd3b20c0 82dbe4cd + * 2faca287 73795d6b 0c10204b 659a939e + * f29bbe10 88243624 429927a7 eb576dd3 + * a00ea5e0 1af5d475 83b2272c 0c161a80 + * 6521a16f f9b0a722 c0cf26b0 25d5836e + * 2258a4f7 d4773ac8 01e4263b c294f43d + * ef7fa870 3f3a4197 46352588 7652b0b2 + * a4a2a7cf 87f00914 871e2503 9113c7e1 + * 618da340 64b57a43 c463249f b8d05e0f + * 26f4a6d8 4972e7a9 05482414 5f91295c + * dbe39a6f 920facc6 59712b46 a54ba295 + * bbe6a901 54e91b33 985a2bcd 420ad5c6 + * 7ec9ad8e b7ac6864 db272a51 6bc94c28 + * 39b0a816 9a6bf58e 1a0c2ada 8c883b7b + * f497a491 71268ed1 5ddd2969 384e7ff4 + * bf4aab2e c9ecc652 9cf629e2 df0f08a7 + * 7a65afa1 2aa9b505 df8b287e f6cc9149 + * 3d1caa39 076e28ef 1ea028f5 118de61a + * e02bb6ae fc3343a0 50292f19 9f401857 + * b2bead5e 6ee2a1f1 91022f92 78016f04 + * 7791a9d1 8da7d2a6 d27f2e0e 51c2f6ea + * 30e8ac49 a0604f4c 13542e85 b68381b9 + * fdcfa0ce 4b2d3413 54852d36 0245c536 + * b612af71 f3e77c90 95ae2dbd e504b265 + * 733dabfe 10a20fc7 d6d32c21 ccc72b8b + * 3444ae66 3d65922d 17f82caa 2b865cd8 + * 8913d291 a6589902 6ea13284 39723c19 + * 8c36b0c3 c8d085bf af8a320f de334b4a + * 4919b44c 2b95f6e8 ecf73393 f7f0d2a4 + * 0e60b1d4 06526b02 2ddc3318 10b1a5f7 + * c347bd53 ed1f105d 6a0d30ab a477e178 + * 889ab2ec 55d558de ab263020 4336962b + * 4db5b663 b6902b89 e85b31bc 6af50fc5 + * 0accb3fb 9b57b663 29703137 8db47896 + * d7fbaf6c 600add2c 67f936db 037986db + * 856eb49c f2db3f7d a6d23650 e438f188 + * 4041b013 119e4c2a e5af37cc cdfb6866 + * 0738b58b 3c59d1c0 24843747 2aba1f35 + * ca1fb90c d714aa9f 635534f4 9e7c5bba + * 81c2b6b3 6fdee21c a27e347f 793d2ce9 + * 44edb23c 8c9b914b e10335e3 50feb507 + * 0394b7a4 a15c0ca1 20283568 b7bfc254 + * fe838b13 7a2147ce 7c113a3a 4d65499d + * 9e86b87d bcc7f03b bd3a3ab1 aa243ece + * 5ba9bcf2 5f82836c fe473b2d 83e7a720 + * 1cd0b96a 72451e86 3f6c3ba6 64a6d073 + * d1f7b5ed 990865d9 78bd3815 d06094fc + * 9a2aba52 21c22d5a b996389e 3721e3af + * 5f05bedd c2875e0d faeb3902 1ee27a41 + * 187cbb45 ef40c3e7 3bc03989 f9a30d12 + * c54ba7d2 141da8a8 75493e65 776ef35f + * 97debc22 86cc4af9 b4623eee 902f840c + * 52f1b8ad 658939ae f71f3f72 b9ec1de2 + * 1588bd35 484ea444 36343ff9 5ead6ab1 + * d8afb1b2 a303df1b 71e53c4a ea6b2e3e + * 9372be0d 1bc99798 b0ce3cc1 0d2a596d + * 565dba82 f88ce4cf f3b33d5d 24e9c083 + * 1124bf1a d54b7925 32983dd6 c3a8b7d0 + * + * Subkey Generation: + * L = 2c645dcd 72114961 d8b9c864 7aac2c5b + * K1 = 58c8bb9a e42292c3 b17390c8 f55858b6 + * K2 = b1917735 c8452587 62e72191 eab0b16c + * + * MAC generation: + * C129 = ebd5ccb0 b61ca905 29138303 f3377d22 + * MACT = ebd5ccb0 + */ +static const uint8_t EIA2_128_K_8[16] = { + 0xb3, 0x12, 0x0f, 0xfd, 0xb2, 0xcf, 0x6a, 0xf4, + 0xe7, 0x3e, 0xaf, 0x2e, 0xf4, 0xeb, 0xec, 0x69 +}; + +static const uint8_t EIA2_128_SK1_8[16] = { + 0x58, 0xc8, 0xbb, 0x9a, 0xe4, 0x22, 0x92, 0xc3, + 0xb1, 0x73, 0x90, 0xc8, 0xf5, 0x58, 0x58, 0xb6 +}; + +static const uint8_t EIA2_128_SK2_8[16] = { + 0xb1, 0x91, 0x77, 0x35, 0xc8, 0x45, 0x25, 0x87, + 0x62, 0xe7, 0x21, 0x91, 0xea, 0xb0, 0xb1, 0x6c +}; + +static const uint8_t EIA2_128_T_8[4] = { + 0xeb, 0xd5, 0xcc, 0xb0 +}; + +static const uint8_t EIA2_128_M_8[2064] = { + 0x29, 0x6f, 0x39, 0x3c, 0x5c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0xe0, 0x95, 0x80, 0x45, 0xf3, 0xa0, 0xbb, 0xa4, + 0xe3, 0x96, 0x83, 0x46, 0xf0, 0xa3, 0xb8, 0xa7, + 0xc0, 0x2a, 0x01, 0x8a, 0xe6, 0x40, 0x76, 0x52, + 0x26, 0xb9, 0x87, 0xc9, 0x13, 0xe6, 0xcb, 0xf0, + 0x83, 0x57, 0x00, 0x16, 0xcf, 0x83, 0xef, 0xbc, + 0x61, 0xc0, 0x82, 0x51, 0x3e, 0x21, 0x56, 0x1a, + 0x42, 0x7c, 0x00, 0x9d, 0x28, 0xc2, 0x98, 0xef, + 0xac, 0xe7, 0x8e, 0xd6, 0xd5, 0x6c, 0x2d, 0x45, + 0x05, 0xad, 0x03, 0x2e, 0x9c, 0x04, 0xdc, 0x60, + 0xe7, 0x3a, 0x81, 0x69, 0x6d, 0xa6, 0x65, 0xc6, + 0xc4, 0x86, 0x03, 0xa5, 0x7b, 0x45, 0xab, 0x33, + 0x22, 0x15, 0x85, 0xe6, 0x8e, 0xe3, 0x16, 0x91, + 0x87, 0xfb, 0x02, 0x39, 0x52, 0x86, 0x32, 0xdd, + 0x65, 0x6c, 0x80, 0x7e, 0xa3, 0x24, 0x8b, 0x7b, + 0x46, 0xd0, 0x02, 0xb2, 0xb5, 0xc7, 0x45, 0x8e, + 0xb8, 0x5b, 0x9c, 0xe9, 0x58, 0x79, 0xe0, 0x34, + 0x08, 0x59, 0x05, 0x5e, 0x3b, 0x0a, 0xbb, 0xc3, + 0xea, 0xce, 0x87, 0x19, 0xca, 0xa8, 0x02, 0x65, + 0xc9, 0x72, 0x05, 0xd5, 0xdc, 0x4b, 0xcc, 0x90, + 0x2f, 0xe1, 0x83, 0x96, 0x29, 0xed, 0x71, 0x32, + 0x8a, 0x0f, 0x04, 0x49, 0xf5, 0x88, 0x55, 0x7e, + 0x68, 0x98, 0x86, 0x0e, 0x04, 0x2a, 0xec, 0xd8, + 0x4b, 0x24, 0x04, 0xc2, 0x12, 0xc9, 0x22, 0x2d, + 0xa5, 0xbf, 0x8a, 0x89, 0xef, 0x67, 0x97, 0x87, + 0x0c, 0xf5, 0x07, 0x71, 0xa6, 0x0f, 0x66, 0xa2, + 0xee, 0x62, 0x85, 0x36, 0x57, 0xad, 0xdf, 0x04, + 0xcd, 0xde, 0x07, 0xfa, 0x41, 0x4e, 0x11, 0xf1, + 0x2b, 0x4d, 0x81, 0xb9, 0xb4, 0xe8, 0xac, 0x53, + 0x8e, 0xa3, 0x06, 0x66, 0x68, 0x8d, 0x88, 0x1f, + 0x6c, 0x34, 0x84, 0x21, 0x99, 0x2f, 0x31, 0xb9, + 0x4f, 0x88, 0x06, 0xed, 0x8f, 0xcc, 0xff, 0x4c, + 0x91, 0x23, 0xb8, 0x96, 0x42, 0x52, 0x7a, 0xd6, + 0x13, 0xb1, 0x09, 0xbf, 0x75, 0x16, 0x74, 0x85, + 0xf1, 0x26, 0x8b, 0xf8, 0x84, 0xb4, 0xcd, 0x23, + 0xd2, 0x9a, 0x09, 0x34, 0x92, 0x57, 0x03, 0xd6, + 0x34, 0x09, 0x8f, 0x77, 0x67, 0xf1, 0xbe, 0x74, + 0x91, 0xe7, 0x08, 0xa8, 0xbb, 0x94, 0x9a, 0x38, + 0x73, 0x70, 0x8a, 0xef, 0x4a, 0x36, 0x23, 0x9e, + 0x50, 0xcc, 0x08, 0x23, 0x5c, 0xd5, 0xed, 0x6b, + 0xbe, 0x57, 0x86, 0x68, 0xa1, 0x7b, 0x58, 0xc1, + 0x17, 0x1d, 0x0b, 0x90, 0xe8, 0x13, 0xa9, 0xe4, + 0xf5, 0x8a, 0x89, 0xd7, 0x19, 0xb1, 0x10, 0x42, + 0xd6, 0x36, 0x0b, 0x1b, 0x0f, 0x52, 0xde, 0xb7, + 0x30, 0xa5, 0x8d, 0x58, 0xfa, 0xf4, 0x63, 0x15, + 0x95, 0x4b, 0x0a, 0x87, 0x26, 0x91, 0x47, 0x59, + 0x77, 0xdc, 0x88, 0xc0, 0xd7, 0x33, 0xfe, 0xff, + 0x54, 0x60, 0x0a, 0x0c, 0xc1, 0xd0, 0x30, 0x0a, + 0xaa, 0xeb, 0x94, 0x57, 0x2c, 0x6e, 0x95, 0xb0, + 0x1a, 0xe9, 0x0d, 0xe0, 0x4f, 0x1d, 0xce, 0x47, + 0xf8, 0x7e, 0x8f, 0xa7, 0xbe, 0xbf, 0x77, 0xe1, + 0xdb, 0xc2, 0x0d, 0x6b, 0xa8, 0x5c, 0xb9, 0x14, + 0x3d, 0x51, 0x8b, 0x28, 0x5d, 0xfa, 0x04, 0xb6, + 0x98, 0xbf, 0x0c, 0xf7, 0x81, 0x9f, 0x20, 0xfa, + 0x7a, 0x28, 0x8e, 0xb0, 0x70, 0x3d, 0x99, 0x5c, + 0x59, 0x94, 0x0c, 0x7c, 0x66, 0xde, 0x57, 0xa9, + 0xb7, 0x0f, 0x82, 0x37, 0x9b, 0x70, 0xe2, 0x03, + 0x1e, 0x45, 0x0f, 0xcf, 0xd2, 0x18, 0x13, 0x26, + 0xfc, 0xd2, 0x8d, 0x88, 0x23, 0xba, 0xaa, 0x80, + 0xdf, 0x6e, 0x0f, 0x44, 0x35, 0x59, 0x64, 0x75, + 0x39, 0xfd, 0x89, 0x07, 0xc0, 0xff, 0xd9, 0xd7, + 0x9c, 0x13, 0x0e, 0xd8, 0x1c, 0x9a, 0xfd, 0x9b, + 0x7e, 0x84, 0x8c, 0x9f, 0xed, 0x38, 0x44, 0x3d, + 0x5d, 0x38, 0x0e, 0x53, 0xfb, 0xdb, 0x8a, 0xc8, + 0xc3, 0xd3, 0xf0, 0x68, 0x76, 0x05, 0x4f, 0x12, + 0x24, 0x61, 0x10, 0x7d, 0xe9, 0x2f, 0xea, 0x09, + 0xc6, 0xf6, 0x92, 0x3a, 0x18, 0x8d, 0x53, 0xaf, + 0xe5, 0x4a, 0x10, 0xf6, 0x0e, 0x6e, 0x9d, 0x5a, + 0x03, 0xd9, 0x96, 0xb5, 0xfb, 0xc8, 0x20, 0xf8, + 0xa6, 0x37, 0x11, 0x6a, 0x27, 0xad, 0x04, 0xb4, + 0x44, 0xa0, 0x93, 0x2d, 0xd6, 0x0f, 0xbd, 0x12, + 0x67, 0x1c, 0x11, 0xe1, 0xc0, 0xec, 0x73, 0xe7, + 0x89, 0x87, 0x9f, 0xaa, 0x3d, 0x42, 0xc6, 0x4d, + 0x20, 0xcd, 0x12, 0x52, 0x74, 0x2a, 0x37, 0x68, + 0xc2, 0x5a, 0x90, 0x15, 0x85, 0x88, 0x8e, 0xce, + 0xe1, 0xe6, 0x12, 0xd9, 0x93, 0x6b, 0x40, 0x3b, + 0x07, 0x75, 0x94, 0x9a, 0x66, 0xcd, 0xfd, 0x99, + 0xa2, 0x9b, 0x13, 0x45, 0xba, 0xa8, 0xd9, 0xd5, + 0x40, 0x0c, 0x91, 0x02, 0x4b, 0x0a, 0x60, 0x73, + 0x63, 0xb0, 0x13, 0xce, 0x5d, 0xe9, 0xae, 0x86, + 0x9d, 0x3b, 0x8d, 0x95, 0xb0, 0x57, 0x0b, 0x3c, + 0x2d, 0x39, 0x14, 0x22, 0xd3, 0x24, 0x50, 0xcb, + 0xcf, 0xae, 0x96, 0x65, 0x22, 0x86, 0xe9, 0x6d, + 0xec, 0x12, 0x14, 0xa9, 0x34, 0x65, 0x27, 0x98, + 0x0a, 0x81, 0x92, 0xea, 0xc1, 0xc3, 0x9a, 0x3a, + 0xaf, 0x6f, 0x15, 0x35, 0x1d, 0xa6, 0xbe, 0x76, + 0x4d, 0xf8, 0x97, 0x72, 0xec, 0x04, 0x07, 0xd0, + 0x6e, 0x44, 0x15, 0xbe, 0xfa, 0xe7, 0xc9, 0x25, + 0x80, 0xdf, 0x9b, 0xf5, 0x07, 0x49, 0x7c, 0x8f, + 0x29, 0x95, 0x16, 0x0d, 0x4e, 0x21, 0x8d, 0xaa, + 0xcb, 0x02, 0x94, 0x4a, 0xbf, 0x83, 0x34, 0x0c, + 0xe8, 0xbe, 0x16, 0x86, 0xa9, 0x60, 0xfa, 0xf9, + 0x0e, 0x2d, 0x90, 0xc5, 0x5c, 0xc6, 0x47, 0x5b, + 0xab, 0xc3, 0x17, 0x1a, 0x80, 0xa3, 0x63, 0x17, + 0x49, 0x54, 0x95, 0x5d, 0x71, 0x01, 0xda, 0xb1, + 0x6a, 0xe8, 0x17, 0x91, 0x67, 0xe2, 0x14, 0x44, + 0xb4, 0x43, 0xa9, 0xea, 0xaa, 0x7c, 0x91, 0xde, + 0x36, 0xd1, 0x18, 0xc3, 0x9d, 0x38, 0x9f, 0x8d, + 0xd4, 0x46, 0x9a, 0x84, 0x6c, 0x9a, 0x26, 0x2b, + 0xf7, 0xfa, 0x18, 0x48, 0x7a, 0x79, 0xe8, 0xde, + 0x11, 0x69, 0x9e, 0x0b, 0x8f, 0xdf, 0x55, 0x7c, + 0xb4, 0x87, 0x19, 0xd4, 0x53, 0xba, 0x71, 0x30, + 0x56, 0x10, 0x9b, 0x93, 0xa2, 0x18, 0xc8, 0x96, + 0x75, 0xac, 0x19, 0x5f, 0xb4, 0xfb, 0x06, 0x63, + 0x9b, 0x37, 0x97, 0x14, 0x49, 0x55, 0xb3, 0xc9, + 0x32, 0x7d, 0x1a, 0xec, 0x00, 0x3d, 0x42, 0xec, + 0xd0, 0xea, 0x98, 0xab, 0xf1, 0x9f, 0xfb, 0x4a, + 0xf3, 0x56, 0x1a, 0x67, 0xe7, 0x7c, 0x35, 0xbf, + 0x15, 0xc5, 0x9c, 0x24, 0x12, 0xda, 0x88, 0x1d, + 0xb0, 0x2b, 0x1b, 0xfb, 0xce, 0xbf, 0xac, 0x51, + 0x52, 0xbc, 0x99, 0xbc, 0x3f, 0x1d, 0x15, 0xf7, + 0x71, 0x00, 0x1b, 0x70, 0x29, 0xfe, 0xdb, 0x02, + 0x8f, 0x8b, 0x85, 0x2b, 0xc4, 0x40, 0x7e, 0xb8, + 0x3f, 0x89, 0x1c, 0x9c, 0xa7, 0x33, 0x25, 0x4f, + 0xdd, 0x1e, 0x9e, 0xdb, 0x56, 0x91, 0x9c, 0xe9, + 0xfe, 0xa2, 0x1c, 0x17, 0x40, 0x72, 0x52, 0x1c, + 0x18, 0x31, 0x9a, 0x54, 0xb5, 0xd4, 0xef, 0xbe, + 0xbd, 0xdf, 0x1d, 0x8b, 0x69, 0xb1, 0xcb, 0xf2, + 0x5f, 0x48, 0x9f, 0xcc, 0x98, 0x13, 0x72, 0x54, + 0x7c, 0xf4, 0x1d, 0x00, 0x8e, 0xf0, 0xbc, 0xa1, + 0x92, 0x6f, 0x93, 0x4b, 0x73, 0x5e, 0x09, 0x0b, + 0x3b, 0x25, 0x1e, 0xb3, 0x3a, 0x36, 0xf8, 0x2e, + 0xd9, 0xb2, 0x9c, 0xf4, 0xcb, 0x94, 0x41, 0x88, + 0xfa, 0x0e, 0x1e, 0x38, 0xdd, 0x77, 0x8f, 0x7d, + 0x1c, 0x9d, 0x98, 0x7b, 0x28, 0xd1, 0x32, 0xdf, + 0xb9, 0x73, 0x1f, 0xa4, 0xf4, 0xb4, 0x16, 0x93, + 0x5b, 0xe4, 0x9d, 0xe3, 0x05, 0x16, 0xaf, 0x35, + 0x78, 0x58, 0x1f, 0x2f, 0x13, 0xf5, 0x61, 0xc0, + 0x66, 0x33, 0x61, 0x94, 0x1e, 0xab, 0x24, 0x9a, + 0x4b, 0xc1, 0x23, 0xf8, 0xd1, 0x5c, 0xd7, 0x11, + 0xa9, 0x56, 0xa1, 0xbf, 0x20, 0xfe, 0x6e, 0xb7, + 0x8a, 0xea, 0x23, 0x73, 0x36, 0x1d, 0xa0, 0x42, + 0x6c, 0x79, 0xa5, 0x30, 0xc3, 0xbb, 0x1d, 0xe0, + 0xc9, 0x97, 0x22, 0xef, 0x1f, 0xde, 0x39, 0xac, + 0x2b, 0x00, 0xa0, 0xa8, 0xee, 0x7c, 0x80, 0x0a, + 0x08, 0xbc, 0x22, 0x64, 0xf8, 0x9f, 0x4e, 0xff, + 0xe6, 0x27, 0xac, 0x2f, 0x05, 0x31, 0xfb, 0x55, + 0x4f, 0x6d, 0x21, 0xd7, 0x4c, 0x59, 0x0a, 0x70, + 0xad, 0xfa, 0xa3, 0x90, 0xbd, 0xfb, 0xb3, 0xd6, + 0x8e, 0x46, 0x21, 0x5c, 0xab, 0x18, 0x7d, 0x23, + 0x68, 0xd5, 0xa7, 0x1f, 0x5e, 0xbe, 0xc0, 0x81, + 0xcd, 0x3b, 0x20, 0xc0, 0x82, 0xdb, 0xe4, 0xcd, + 0x2f, 0xac, 0xa2, 0x87, 0x73, 0x79, 0x5d, 0x6b, + 0x0c, 0x10, 0x20, 0x4b, 0x65, 0x9a, 0x93, 0x9e, + 0xf2, 0x9b, 0xbe, 0x10, 0x88, 0x24, 0x36, 0x24, + 0x42, 0x99, 0x27, 0xa7, 0xeb, 0x57, 0x6d, 0xd3, + 0xa0, 0x0e, 0xa5, 0xe0, 0x1a, 0xf5, 0xd4, 0x75, + 0x83, 0xb2, 0x27, 0x2c, 0x0c, 0x16, 0x1a, 0x80, + 0x65, 0x21, 0xa1, 0x6f, 0xf9, 0xb0, 0xa7, 0x22, + 0xc0, 0xcf, 0x26, 0xb0, 0x25, 0xd5, 0x83, 0x6e, + 0x22, 0x58, 0xa4, 0xf7, 0xd4, 0x77, 0x3a, 0xc8, + 0x01, 0xe4, 0x26, 0x3b, 0xc2, 0x94, 0xf4, 0x3d, + 0xef, 0x7f, 0xa8, 0x70, 0x3f, 0x3a, 0x41, 0x97, + 0x46, 0x35, 0x25, 0x88, 0x76, 0x52, 0xb0, 0xb2, + 0xa4, 0xa2, 0xa7, 0xcf, 0x87, 0xf0, 0x09, 0x14, + 0x87, 0x1e, 0x25, 0x03, 0x91, 0x13, 0xc7, 0xe1, + 0x61, 0x8d, 0xa3, 0x40, 0x64, 0xb5, 0x7a, 0x43, + 0xc4, 0x63, 0x24, 0x9f, 0xb8, 0xd0, 0x5e, 0x0f, + 0x26, 0xf4, 0xa6, 0xd8, 0x49, 0x72, 0xe7, 0xa9, + 0x05, 0x48, 0x24, 0x14, 0x5f, 0x91, 0x29, 0x5c, + 0xdb, 0xe3, 0x9a, 0x6f, 0x92, 0x0f, 0xac, 0xc6, + 0x59, 0x71, 0x2b, 0x46, 0xa5, 0x4b, 0xa2, 0x95, + 0xbb, 0xe6, 0xa9, 0x01, 0x54, 0xe9, 0x1b, 0x33, + 0x98, 0x5a, 0x2b, 0xcd, 0x42, 0x0a, 0xd5, 0xc6, + 0x7e, 0xc9, 0xad, 0x8e, 0xb7, 0xac, 0x68, 0x64, + 0xdb, 0x27, 0x2a, 0x51, 0x6b, 0xc9, 0x4c, 0x28, + 0x39, 0xb0, 0xa8, 0x16, 0x9a, 0x6b, 0xf5, 0x8e, + 0x1a, 0x0c, 0x2a, 0xda, 0x8c, 0x88, 0x3b, 0x7b, + 0xf4, 0x97, 0xa4, 0x91, 0x71, 0x26, 0x8e, 0xd1, + 0x5d, 0xdd, 0x29, 0x69, 0x38, 0x4e, 0x7f, 0xf4, + 0xbf, 0x4a, 0xab, 0x2e, 0xc9, 0xec, 0xc6, 0x52, + 0x9c, 0xf6, 0x29, 0xe2, 0xdf, 0x0f, 0x08, 0xa7, + 0x7a, 0x65, 0xaf, 0xa1, 0x2a, 0xa9, 0xb5, 0x05, + 0xdf, 0x8b, 0x28, 0x7e, 0xf6, 0xcc, 0x91, 0x49, + 0x3d, 0x1c, 0xaa, 0x39, 0x07, 0x6e, 0x28, 0xef, + 0x1e, 0xa0, 0x28, 0xf5, 0x11, 0x8d, 0xe6, 0x1a, + 0xe0, 0x2b, 0xb6, 0xae, 0xfc, 0x33, 0x43, 0xa0, + 0x50, 0x29, 0x2f, 0x19, 0x9f, 0x40, 0x18, 0x57, + 0xb2, 0xbe, 0xad, 0x5e, 0x6e, 0xe2, 0xa1, 0xf1, + 0x91, 0x02, 0x2f, 0x92, 0x78, 0x01, 0x6f, 0x04, + 0x77, 0x91, 0xa9, 0xd1, 0x8d, 0xa7, 0xd2, 0xa6, + 0xd2, 0x7f, 0x2e, 0x0e, 0x51, 0xc2, 0xf6, 0xea, + 0x30, 0xe8, 0xac, 0x49, 0xa0, 0x60, 0x4f, 0x4c, + 0x13, 0x54, 0x2e, 0x85, 0xb6, 0x83, 0x81, 0xb9, + 0xfd, 0xcf, 0xa0, 0xce, 0x4b, 0x2d, 0x34, 0x13, + 0x54, 0x85, 0x2d, 0x36, 0x02, 0x45, 0xc5, 0x36, + 0xb6, 0x12, 0xaf, 0x71, 0xf3, 0xe7, 0x7c, 0x90, + 0x95, 0xae, 0x2d, 0xbd, 0xe5, 0x04, 0xb2, 0x65, + 0x73, 0x3d, 0xab, 0xfe, 0x10, 0xa2, 0x0f, 0xc7, + 0xd6, 0xd3, 0x2c, 0x21, 0xcc, 0xc7, 0x2b, 0x8b, + 0x34, 0x44, 0xae, 0x66, 0x3d, 0x65, 0x92, 0x2d, + 0x17, 0xf8, 0x2c, 0xaa, 0x2b, 0x86, 0x5c, 0xd8, + 0x89, 0x13, 0xd2, 0x91, 0xa6, 0x58, 0x99, 0x02, + 0x6e, 0xa1, 0x32, 0x84, 0x39, 0x72, 0x3c, 0x19, + 0x8c, 0x36, 0xb0, 0xc3, 0xc8, 0xd0, 0x85, 0xbf, + 0xaf, 0x8a, 0x32, 0x0f, 0xde, 0x33, 0x4b, 0x4a, + 0x49, 0x19, 0xb4, 0x4c, 0x2b, 0x95, 0xf6, 0xe8, + 0xec, 0xf7, 0x33, 0x93, 0xf7, 0xf0, 0xd2, 0xa4, + 0x0e, 0x60, 0xb1, 0xd4, 0x06, 0x52, 0x6b, 0x02, + 0x2d, 0xdc, 0x33, 0x18, 0x10, 0xb1, 0xa5, 0xf7, + 0xc3, 0x47, 0xbd, 0x53, 0xed, 0x1f, 0x10, 0x5d, + 0x6a, 0x0d, 0x30, 0xab, 0xa4, 0x77, 0xe1, 0x78, + 0x88, 0x9a, 0xb2, 0xec, 0x55, 0xd5, 0x58, 0xde, + 0xab, 0x26, 0x30, 0x20, 0x43, 0x36, 0x96, 0x2b, + 0x4d, 0xb5, 0xb6, 0x63, 0xb6, 0x90, 0x2b, 0x89, + 0xe8, 0x5b, 0x31, 0xbc, 0x6a, 0xf5, 0x0f, 0xc5, + 0x0a, 0xcc, 0xb3, 0xfb, 0x9b, 0x57, 0xb6, 0x63, + 0x29, 0x70, 0x31, 0x37, 0x8d, 0xb4, 0x78, 0x96, + 0xd7, 0xfb, 0xaf, 0x6c, 0x60, 0x0a, 0xdd, 0x2c, + 0x67, 0xf9, 0x36, 0xdb, 0x03, 0x79, 0x86, 0xdb, + 0x85, 0x6e, 0xb4, 0x9c, 0xf2, 0xdb, 0x3f, 0x7d, + 0xa6, 0xd2, 0x36, 0x50, 0xe4, 0x38, 0xf1, 0x88, + 0x40, 0x41, 0xb0, 0x13, 0x11, 0x9e, 0x4c, 0x2a, + 0xe5, 0xaf, 0x37, 0xcc, 0xcd, 0xfb, 0x68, 0x66, + 0x07, 0x38, 0xb5, 0x8b, 0x3c, 0x59, 0xd1, 0xc0, + 0x24, 0x84, 0x37, 0x47, 0x2a, 0xba, 0x1f, 0x35, + 0xca, 0x1f, 0xb9, 0x0c, 0xd7, 0x14, 0xaa, 0x9f, + 0x63, 0x55, 0x34, 0xf4, 0x9e, 0x7c, 0x5b, 0xba, + 0x81, 0xc2, 0xb6, 0xb3, 0x6f, 0xde, 0xe2, 0x1c, + 0xa2, 0x7e, 0x34, 0x7f, 0x79, 0x3d, 0x2c, 0xe9, + 0x44, 0xed, 0xb2, 0x3c, 0x8c, 0x9b, 0x91, 0x4b, + 0xe1, 0x03, 0x35, 0xe3, 0x50, 0xfe, 0xb5, 0x07, + 0x03, 0x94, 0xb7, 0xa4, 0xa1, 0x5c, 0x0c, 0xa1, + 0x20, 0x28, 0x35, 0x68, 0xb7, 0xbf, 0xc2, 0x54, + 0xfe, 0x83, 0x8b, 0x13, 0x7a, 0x21, 0x47, 0xce, + 0x7c, 0x11, 0x3a, 0x3a, 0x4d, 0x65, 0x49, 0x9d, + 0x9e, 0x86, 0xb8, 0x7d, 0xbc, 0xc7, 0xf0, 0x3b, + 0xbd, 0x3a, 0x3a, 0xb1, 0xaa, 0x24, 0x3e, 0xce, + 0x5b, 0xa9, 0xbc, 0xf2, 0x5f, 0x82, 0x83, 0x6c, + 0xfe, 0x47, 0x3b, 0x2d, 0x83, 0xe7, 0xa7, 0x20, + 0x1c, 0xd0, 0xb9, 0x6a, 0x72, 0x45, 0x1e, 0x86, + 0x3f, 0x6c, 0x3b, 0xa6, 0x64, 0xa6, 0xd0, 0x73, + 0xd1, 0xf7, 0xb5, 0xed, 0x99, 0x08, 0x65, 0xd9, + 0x78, 0xbd, 0x38, 0x15, 0xd0, 0x60, 0x94, 0xfc, + 0x9a, 0x2a, 0xba, 0x52, 0x21, 0xc2, 0x2d, 0x5a, + 0xb9, 0x96, 0x38, 0x9e, 0x37, 0x21, 0xe3, 0xaf, + 0x5f, 0x05, 0xbe, 0xdd, 0xc2, 0x87, 0x5e, 0x0d, + 0xfa, 0xeb, 0x39, 0x02, 0x1e, 0xe2, 0x7a, 0x41, + 0x18, 0x7c, 0xbb, 0x45, 0xef, 0x40, 0xc3, 0xe7, + 0x3b, 0xc0, 0x39, 0x89, 0xf9, 0xa3, 0x0d, 0x12, + 0xc5, 0x4b, 0xa7, 0xd2, 0x14, 0x1d, 0xa8, 0xa8, + 0x75, 0x49, 0x3e, 0x65, 0x77, 0x6e, 0xf3, 0x5f, + 0x97, 0xde, 0xbc, 0x22, 0x86, 0xcc, 0x4a, 0xf9, + 0xb4, 0x62, 0x3e, 0xee, 0x90, 0x2f, 0x84, 0x0c, + 0x52, 0xf1, 0xb8, 0xad, 0x65, 0x89, 0x39, 0xae, + 0xf7, 0x1f, 0x3f, 0x72, 0xb9, 0xec, 0x1d, 0xe2, + 0x15, 0x88, 0xbd, 0x35, 0x48, 0x4e, 0xa4, 0x44, + 0x36, 0x34, 0x3f, 0xf9, 0x5e, 0xad, 0x6a, 0xb1, + 0xd8, 0xaf, 0xb1, 0xb2, 0xa3, 0x03, 0xdf, 0x1b, + 0x71, 0xe5, 0x3c, 0x4a, 0xea, 0x6b, 0x2e, 0x3e, + 0x93, 0x72, 0xbe, 0x0d, 0x1b, 0xc9, 0x97, 0x98, + 0xb0, 0xce, 0x3c, 0xc1, 0x0d, 0x2a, 0x59, 0x6d, + 0x56, 0x5d, 0xba, 0x82, 0xf8, 0x8c, 0xe4, 0xcf, + 0xf3, 0xb3, 0x3d, 0x5d, 0x24, 0xe9, 0xc0, 0x83, + 0x11, 0x24, 0xbf, 0x1a, 0xd5, 0x4b, 0x79, 0x25, + 0x32, 0x98, 0x3d, 0xd6, 0xc3, 0xa8, 0xb7, 0xd0 +}; + +static const struct cmac_rfc4493_vector { + const uint8_t *key; + const uint8_t *sub_key1; + const uint8_t *sub_key2; + const uint8_t *M; + size_t len; + const uint8_t *T; + size_t T_len; + enum cmac_type type; /* vector type - std or 3gpp */ +} cmac_vectors[] = { + { key, sub_key1, sub_key2, M, 0, T_1, 16, CMAC }, + { key, sub_key1, sub_key2, M, 16, T_2, 16, CMAC }, + { key, sub_key1, sub_key2, M, 40, T_3, 16, CMAC }, + { key, sub_key1, sub_key2, M, 64, T_4, 16, CMAC }, + { key, sub_key1, sub_key2, M, 0, T_1, 15, CMAC }, + { key, sub_key1, sub_key2, M, 16, T_2, 15, CMAC }, + { key, sub_key1, sub_key2, M, 40, T_3, 15, CMAC }, + { key, sub_key1, sub_key2, M, 64, T_4, 15, CMAC }, + { key, sub_key1, sub_key2, M, 0, T_1, 12, CMAC }, + { key, sub_key1, sub_key2, M, 16, T_2, 12, CMAC }, + { key, sub_key1, sub_key2, M, 40, T_3, 12, CMAC }, + { key, sub_key1, sub_key2, M, 64, T_4, 12, CMAC }, + { key, sub_key1, sub_key2, M, 0, T_1, 4, CMAC }, + { key, sub_key1, sub_key2, M, 16, T_2, 4, CMAC }, + { key, sub_key1, sub_key2, M, 40, T_3, 4, CMAC }, + { key, sub_key1, sub_key2, M, 64, T_4, 4, CMAC }, + { key, sub_key1, sub_key2, M, 8, T_5, 16, CMAC }, +}; + +static const struct cmac_rfc4493_vector cmac_3gpp_vectors[] = { + { EIA2_128_K_1, EIA2_128_SK1_1, EIA2_128_SK2_1, + EIA2_128_M_1, 122, EIA2_128_T_1, 4, CMAC_BITLEN }, + { EIA2_128_K_2, EIA2_128_SK1_2, EIA2_128_SK2_2, + EIA2_128_M_2, 128, EIA2_128_T_2, 4, CMAC_BITLEN }, + { EIA2_128_K_3, EIA2_128_SK1_3, EIA2_128_SK2_3, + EIA2_128_M_3, 318, EIA2_128_T_3, 4, CMAC_BITLEN }, + { EIA2_128_K_4, EIA2_128_SK1_4, EIA2_128_SK2_4, + EIA2_128_M_4, 575, EIA2_128_T_4, 4, CMAC_BITLEN }, + { EIA2_128_K_5, EIA2_128_SK1_5, EIA2_128_SK2_5, + EIA2_128_M_5, 832, EIA2_128_T_5, 4, CMAC_BITLEN }, + { EIA2_128_K_6, EIA2_128_SK1_6, EIA2_128_SK2_6, + EIA2_128_M_6, 447, EIA2_128_T_6, 4, CMAC_BITLEN }, + { EIA2_128_K_7, EIA2_128_SK1_7, EIA2_128_SK2_7, + EIA2_128_M_7, 2622, EIA2_128_T_7, 4, CMAC_BITLEN }, + { EIA2_128_K_8, EIA2_128_SK1_8, EIA2_128_SK2_8, + EIA2_128_M_8, 16512, EIA2_128_T_8, 4, CMAC_BITLEN }, +}; + +static int +cmac_job_ok(const struct cmac_rfc4493_vector *vec, + const struct JOB_AES_HMAC *job, + const uint8_t *auth, + const uint8_t *padding, + const size_t sizeof_padding) +{ + const size_t auth_len = job->auth_tag_output_len_in_bytes; + + if (job->status != STS_COMPLETED) { + printf("%d Error status:%d", __LINE__, job->status); + return 0; + } + + /* hash checks */ + if (memcmp(padding, &auth[sizeof_padding + auth_len], + sizeof_padding)) { + printf("hash overwrite tail\n"); + hexdump(stderr, "Target", + &auth[sizeof_padding + auth_len], sizeof_padding); + return 0; + } + + if (memcmp(padding, &auth[0], sizeof_padding)) { + printf("hash overwrite head\n"); + hexdump(stderr, "Target", &auth[0], sizeof_padding); + return 0; + } + + if (memcmp(vec->T, &auth[sizeof_padding], auth_len)) { + printf("hash mismatched\n"); + hexdump(stderr, "Received", &auth[sizeof_padding], + auth_len); + hexdump(stderr, "Expected", vec->T, + auth_len); + return 0; + } + return 1; +} + +static int +test_cmac(struct MB_MGR *mb_mgr, + const struct cmac_rfc4493_vector *vec, + const int dir, + const int num_jobs, + const enum cmac_type type) +{ + DECLARE_ALIGNED(uint32_t expkey[4*15], 16); + DECLARE_ALIGNED(uint32_t dust[4*15], 16); + uint32_t skey1[4], skey2[4]; + struct JOB_AES_HMAC *job; + uint8_t padding[16]; + uint8_t **auths = malloc(num_jobs * sizeof(void *)); + int i = 0, jobs_rx = 0, ret = -1; + + if (auths == NULL) { + fprintf(stderr, "Can't allocate buffer memory\n"); + goto end2; + } + + memset(padding, -1, sizeof(padding)); + memset(auths, 0, num_jobs * sizeof(void *)); + + for (i = 0; i < num_jobs; i++) { + auths[i] = malloc(16 + (sizeof(padding) * 2)); + if (auths[i] == NULL) { + fprintf(stderr, "Can't allocate buffer memory\n"); + goto end; + } + + memset(auths[i], -1, 16 + (sizeof(padding) * 2)); + } + + IMB_AES_KEYEXP_128(mb_mgr, vec->key, expkey, dust); + IMB_AES_CMAC_SUBKEY_GEN_128(mb_mgr, expkey, skey1, skey2); + + if (memcmp(vec->sub_key1, skey1, sizeof(skey1))) { + printf("sub-key1 mismatched\n"); + hexdump(stderr, "Received", &skey1[0], sizeof(skey1)); + hexdump(stderr, "Expected", vec->sub_key1, sizeof(skey1)); + goto end; + } + + if (memcmp(vec->sub_key2, skey2, sizeof(skey2))) { + printf("sub-key2 mismatched\n"); + hexdump(stderr, "Received", &skey2[0], sizeof(skey2)); + hexdump(stderr, "Expected", vec->sub_key2, sizeof(skey2)); + goto end; + } + + while ((job = IMB_FLUSH_JOB(mb_mgr)) != NULL) + ; + + /** + * Submit all jobs then flush any outstanding jobs + */ + for (i = 0; i < num_jobs; i++) { + job = IMB_GET_NEXT_JOB(mb_mgr); + job->cipher_direction = dir; + job->chain_order = HASH_CIPHER; + job->cipher_mode = NULL_CIPHER; + + if (type == CMAC) { + job->hash_alg = AES_CMAC; + job->msg_len_to_hash_in_bytes = vec->len; + } else { + job->hash_alg = AES_CMAC_BITLEN; + /* check for std or 3gpp vectors + scale len if necessary */ + if (vec->type == CMAC) + job->msg_len_to_hash_in_bits = + vec->len * 8; + else + job->msg_len_to_hash_in_bits = + vec->len; + } + job->u.CMAC._key_expanded = expkey; + job->u.CMAC._skey1 = skey1; + job->u.CMAC._skey2 = skey2; + job->src = vec->M; + job->hash_start_src_offset_in_bytes = 0; + job->auth_tag_output = auths[i] + sizeof(padding); + job->auth_tag_output_len_in_bytes = vec->T_len; + + job->user_data = auths[i]; + + job = IMB_SUBMIT_JOB(mb_mgr); + if (job) { + jobs_rx++; + if (num_jobs < 4) { + printf("%d Unexpected return from submit_job\n", + __LINE__); + goto end; + } + if (!cmac_job_ok(vec, job, job->user_data, padding, + sizeof(padding))) + goto end; + } + } + + while ((job = IMB_FLUSH_JOB(mb_mgr)) != NULL) { + jobs_rx++; + + if (!cmac_job_ok(vec, job, job->user_data, padding, + sizeof(padding))) + goto end; + } + + if (jobs_rx != num_jobs) { + printf("Expected %d jobs, received %d\n", num_jobs, jobs_rx); + goto end; + } + + /** + * Submit each job and flush immediately + */ + for (i = 0; i < num_jobs; i++) { + struct JOB_AES_HMAC *first_job = NULL; + + job = IMB_GET_NEXT_JOB(mb_mgr); + first_job = job; + + job->cipher_direction = dir; + job->chain_order = HASH_CIPHER; + job->cipher_mode = NULL_CIPHER; + + if (type == CMAC) { + job->hash_alg = AES_CMAC; + job->msg_len_to_hash_in_bytes = vec->len; + } else { + job->hash_alg = AES_CMAC_BITLEN; + if (vec->type == CMAC) + job->msg_len_to_hash_in_bits = vec->len * 8; + else + job->msg_len_to_hash_in_bits = vec->len; + } + job->u.CMAC._key_expanded = expkey; + job->u.CMAC._skey1 = skey1; + job->u.CMAC._skey2 = skey2; + job->src = vec->M; + job->hash_start_src_offset_in_bytes = 0; + job->auth_tag_output = auths[i] + sizeof(padding); + job->auth_tag_output_len_in_bytes = vec->T_len; + + job->user_data = auths[i]; + + job = IMB_SUBMIT_JOB(mb_mgr); + if (job != NULL) { + printf("Received job, expected NULL\n"); + goto end; + } + + while ((job = IMB_FLUSH_JOB(mb_mgr)) != NULL) { + if (job != first_job) { + printf("Invalid return job received\n"); + goto end; + } + if (!cmac_job_ok(vec, job, job->user_data, padding, + sizeof(padding))) + goto end; + } + } + + ret = 0; + + end: + while ((job = IMB_FLUSH_JOB(mb_mgr)) != NULL) + ; + + for (i = 0; i < num_jobs; i++) { + if (auths[i] != NULL) + free(auths[i]); + } + + end2: + if (auths != NULL) + free(auths); + + return ret; +} + +static int +test_cmac_std_vectors(struct MB_MGR *mb_mgr, const int num_jobs) +{ + const int vectors_cnt = sizeof(cmac_vectors) / sizeof(cmac_vectors[0]); + int vect; + int errors = 0; + + printf("AES-CMAC standard test vectors (N jobs = %d):\n", num_jobs); + for (vect = 1; vect <= vectors_cnt; vect++) { + const int idx = vect - 1; +#ifdef DEBUG + printf("Standard vector [%d/%d] M len: %d, T len:%d\n", + vect, vectors_cnt, + (int) cmac_vectors[idx].len, + (int) cmac_vectors[idx].T_len); +#else + printf("."); +#endif + + if (test_cmac(mb_mgr, &cmac_vectors[idx], + ENCRYPT, num_jobs, CMAC)) { + printf("error #%d encrypt\n", vect); + errors++; + } + + if (test_cmac(mb_mgr, &cmac_vectors[idx], + DECRYPT, num_jobs, CMAC)) { + printf("error #%d decrypt\n", vect); + errors++; + } + + } + printf("\n"); + return errors; +} + +static int +test_cmac_bitlen_std_vectors(struct MB_MGR *mb_mgr, const int num_jobs) +{ + const int vectors_cnt = sizeof(cmac_vectors) / sizeof(cmac_vectors[0]); + int vect; + int errors = 0; + + + printf("AES-CMAC BITLEN standard test vectors " + "(N jobs = %d):\n", num_jobs); + for (vect = 1; vect <= vectors_cnt; vect++) { + const int idx = vect - 1; +#ifdef DEBUG + printf("Standard vector [%d/%d] M len: %d (bits), " + "T len:%d\n", + vect, vectors_cnt, + (int) cmac_vectors[idx].len * 8, + (int) cmac_vectors[idx].T_len); +#else + printf("."); +#endif + + if (test_cmac(mb_mgr, &cmac_vectors[idx], + ENCRYPT, num_jobs, CMAC_BITLEN)) { + printf("error #%d encrypt\n", vect); + errors++; + } + + if (test_cmac(mb_mgr, &cmac_vectors[idx], + DECRYPT, num_jobs, CMAC_BITLEN)) { + printf("error #%d decrypt\n", vect); + errors++; + } + + } + printf("\n"); + return errors; +} + +static int +test_cmac_bitlen_3gpp_vectors(struct MB_MGR *mb_mgr, const int num_jobs) +{ + const int vectors_cnt = + sizeof(cmac_3gpp_vectors) / sizeof(cmac_3gpp_vectors[0]); + int vect; + int errors = 0; + + printf("AES-CMAC BITLEN 3GPP test vectors (N jobs = %d):\n", num_jobs); + for (vect = 1; vect <= vectors_cnt; vect++) { + const int idx = vect - 1; +#ifdef DEBUG + printf("3GPP vector [%d/%d] M len: %d (bits), " + "T len:%d (bytes)\n", + vect, vectors_cnt, + (int) cmac_3gpp_vectors[idx].len, + (int) cmac_3gpp_vectors[idx].T_len); +#else + printf("."); +#endif + + if (test_cmac(mb_mgr, &cmac_3gpp_vectors[idx], + ENCRYPT, num_jobs, CMAC_BITLEN)) { + printf("error #%d encrypt\n", vect); + errors++; + } + + if (test_cmac(mb_mgr, &cmac_3gpp_vectors[idx], + DECRYPT, num_jobs, CMAC_BITLEN)) { + printf("error #%d decrypt\n", vect); + errors++; + } + + } + printf("\n"); + return errors; +} + +int +cmac_test(const enum arch_type arch, + struct MB_MGR *mb_mgr) +{ + int i, errors = 0; + + (void) arch; /* unused */ + + /* CMAC with standard vectors */ + for (i = 1; i < 10; i++) + errors += test_cmac_std_vectors(mb_mgr, i); + + /* CMAC BITLEN with standard vectors */ + for (i = 1; i < 10; i++) + errors += test_cmac_bitlen_std_vectors(mb_mgr, i); + + /* CMAC BITLEN with 3GPP vectors */ + for (i = 1; i < 10; i++) + errors += test_cmac_bitlen_3gpp_vectors(mb_mgr, i); + + if (0 == errors) + printf("...Pass\n"); + else + printf("...Fail\n"); + + return errors; +} |