xref: /isa-l_crypto/fips/aes_self_tests.c (revision 5e6526ee40a69b90ccddc657a303f853af79de4d)
15e4dc74cSPablo de Lara /**********************************************************************
25e4dc74cSPablo de Lara   Copyright(c) 2024 Intel Corporation All rights reserved.
35e4dc74cSPablo de Lara 
45e4dc74cSPablo de Lara   Redistribution and use in source and binary forms, with or without
55e4dc74cSPablo de Lara   modification, are permitted provided that the following conditions
65e4dc74cSPablo de Lara   are met:
75e4dc74cSPablo de Lara     * Redistributions of source code must retain the above copyright
85e4dc74cSPablo de Lara       notice, this list of conditions and the following disclaimer.
95e4dc74cSPablo de Lara     * Redistributions in binary form must reproduce the above copyright
105e4dc74cSPablo de Lara       notice, this list of conditions and the following disclaimer in
115e4dc74cSPablo de Lara       the documentation and/or other materials provided with the
125e4dc74cSPablo de Lara       distribution.
135e4dc74cSPablo de Lara     * Neither the name of Intel Corporation nor the names of its
145e4dc74cSPablo de Lara       contributors may be used to endorse or promote products derived
155e4dc74cSPablo de Lara       from this software without specific prior written permission.
165e4dc74cSPablo de Lara 
175e4dc74cSPablo de Lara   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
185e4dc74cSPablo de Lara   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
195e4dc74cSPablo de Lara   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
205e4dc74cSPablo de Lara   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
215e4dc74cSPablo de Lara   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
225e4dc74cSPablo de Lara   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
235e4dc74cSPablo de Lara   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
245e4dc74cSPablo de Lara   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
255e4dc74cSPablo de Lara   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
265e4dc74cSPablo de Lara   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
275e4dc74cSPablo de Lara   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
285e4dc74cSPablo de Lara **********************************************************************/
295e4dc74cSPablo de Lara 
305e4dc74cSPablo de Lara /*
315e4dc74cSPablo de Lara  * AES self tests
325e4dc74cSPablo de Lara  */
335e4dc74cSPablo de Lara 
345e4dc74cSPablo de Lara #include <stdlib.h>
355e4dc74cSPablo de Lara #include <stdio.h>
365e4dc74cSPablo de Lara #include <stdint.h>
375e4dc74cSPablo de Lara #include <string.h>
38158a2fa5SPablo de Lara 
39158a2fa5SPablo de Lara #include "aes_cbc.h"
409b0cbfb3SPablo de Lara #include "aes_cbc_internal.h"
41811b558fSMarcel Cornu #include "aes_xts_internal.h"
42ae502d05SPablo de Lara #include "aes_gcm.h"
4369a73acfSTomasz Kantecki #include "aes_gcm_internal.h"
44cb5bcf4bSMarcel Cornu #include "aes_keyexp_internal.h"
455e4dc74cSPablo de Lara 
465e4dc74cSPablo de Lara #include "internal_fips.h"
475e4dc74cSPablo de Lara #include "types.h"
485e4dc74cSPablo de Lara #include "test.h"
495e4dc74cSPablo de Lara 
505e4dc74cSPablo de Lara struct self_test_cbc_vector {
515e4dc74cSPablo de Lara         const uint8_t *cipher_key; /* Cipher key */
525e4dc74cSPablo de Lara         size_t cipher_key_size;    /* Key size in bytes */
535e4dc74cSPablo de Lara         uint8_t *cipher_iv;        /* Initialization vector */
545e4dc74cSPablo de Lara         const uint8_t *plaintext;  /* Plaintext */
555e4dc74cSPablo de Lara         size_t plaintext_size;     /* Plaintext length in bytes */
565e4dc74cSPablo de Lara         const uint8_t *ciphertext; /* Ciphertext */
575e4dc74cSPablo de Lara         const char *description;   /* Description of vector */
585e4dc74cSPablo de Lara };
595e4dc74cSPablo de Lara 
605e4dc74cSPablo de Lara struct self_test_xts_vector {
615e4dc74cSPablo de Lara         uint8_t *cipher_key1;      /* Cipher key 1 */
625e4dc74cSPablo de Lara         uint8_t *cipher_key2;      /* Cipher key 2 */
635e4dc74cSPablo de Lara         size_t cipher_key_size;    /* Key size in bytes */
645e4dc74cSPablo de Lara         uint8_t *tweak;            /* 16-byte tweak */
655e4dc74cSPablo de Lara         const uint8_t *plaintext;  /* Plaintext */
665e4dc74cSPablo de Lara         size_t plaintext_size;     /* Plaintext length in bytes */
675e4dc74cSPablo de Lara         const uint8_t *ciphertext; /* Ciphertext */
685e4dc74cSPablo de Lara         const char *description;   /* Description of vector */
695e4dc74cSPablo de Lara };
705e4dc74cSPablo de Lara 
71ae502d05SPablo de Lara struct self_test_gcm_vector {
72ae502d05SPablo de Lara         const uint8_t *key;        /* Cipher key */
73ae502d05SPablo de Lara         size_t cipher_key_size;    /* Key size in bytes */
74ae502d05SPablo de Lara         uint8_t *cipher_iv;        /* Initialization vector */
75ae502d05SPablo de Lara         const uint8_t *plaintext;  /* Plaintext */
76ae502d05SPablo de Lara         size_t plaintext_size;     /* Plaintext length in bytes */
77ae502d05SPablo de Lara         const uint8_t *ciphertext; /* Ciphertext */
78ae502d05SPablo de Lara         const uint8_t *aad;        /* AAD */
79ae502d05SPablo de Lara         size_t aad_size;           /* AAD size */
80ae502d05SPablo de Lara         uint8_t *tag;              /* Authenticationg tag */
81ae502d05SPablo de Lara         size_t tag_size;           /* Authenticationg tag size */
82ae502d05SPablo de Lara         const char *description;   /* Description of vector */
83ae502d05SPablo de Lara };
84ae502d05SPablo de Lara 
855e4dc74cSPablo de Lara /*
865e4dc74cSPablo de Lara  *  AES-CBC Test vectors from
875e4dc74cSPablo de Lara  *  http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
885e4dc74cSPablo de Lara  */
895e4dc74cSPablo de Lara 
905e4dc74cSPablo de Lara static const uint8_t aes_cbc_128_key[] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
915e4dc74cSPablo de Lara                                            0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c };
925e4dc74cSPablo de Lara 
935e4dc74cSPablo de Lara static uint8_t aes_cbc_128_iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
945e4dc74cSPablo de Lara                                     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
955e4dc74cSPablo de Lara 
965e4dc74cSPablo de Lara static const uint8_t aes_cbc_128_plaintext[] = {
975e4dc74cSPablo de Lara         0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73,
985e4dc74cSPablo de Lara         0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7,
995e4dc74cSPablo de Lara         0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4,
1005e4dc74cSPablo de Lara         0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45,
1015e4dc74cSPablo de Lara         0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
1025e4dc74cSPablo de Lara };
1035e4dc74cSPablo de Lara 
1045e4dc74cSPablo de Lara static const uint8_t aes_cbc_128_ciphertext[] = {
1055e4dc74cSPablo de Lara         0x76, 0x49, 0xab, 0xac, 0x81, 0x19, 0xb2, 0x46, 0xce, 0xe9, 0x8e, 0x9b, 0x12,
1065e4dc74cSPablo de Lara         0xe9, 0x19, 0x7d, 0x50, 0x86, 0xcb, 0x9b, 0x50, 0x72, 0x19, 0xee, 0x95, 0xdb,
1075e4dc74cSPablo de Lara         0x11, 0x3a, 0x91, 0x76, 0x78, 0xb2, 0x73, 0xbe, 0xd6, 0xb8, 0xe3, 0xc1, 0x74,
1085e4dc74cSPablo de Lara         0x3b, 0x71, 0x16, 0xe6, 0x9e, 0x22, 0x22, 0x95, 0x16, 0x3f, 0xf1, 0xca, 0xa1,
1095e4dc74cSPablo de Lara         0x68, 0x1f, 0xac, 0x09, 0x12, 0x0e, 0xca, 0x30, 0x75, 0x86, 0xe1, 0xa7
1105e4dc74cSPablo de Lara };
1115e4dc74cSPablo de Lara 
1125e4dc74cSPablo de Lara static const uint8_t aes_cbc_192_key[] = { 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
1135e4dc74cSPablo de Lara                                            0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
1145e4dc74cSPablo de Lara                                            0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b };
1155e4dc74cSPablo de Lara 
1165e4dc74cSPablo de Lara static uint8_t aes_cbc_192_iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1175e4dc74cSPablo de Lara                                     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1185e4dc74cSPablo de Lara 
1195e4dc74cSPablo de Lara static const uint8_t aes_cbc_192_plaintext[] = {
1205e4dc74cSPablo de Lara         0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73,
1215e4dc74cSPablo de Lara         0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7,
1225e4dc74cSPablo de Lara         0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4,
1235e4dc74cSPablo de Lara         0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45,
1245e4dc74cSPablo de Lara         0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
1255e4dc74cSPablo de Lara };
1265e4dc74cSPablo de Lara 
1275e4dc74cSPablo de Lara static const uint8_t aes_cbc_192_ciphertext[] = {
1285e4dc74cSPablo de Lara         0x4f, 0x02, 0x1d, 0xb2, 0x43, 0xbc, 0x63, 0x3d, 0x71, 0x78, 0x18, 0x3a, 0x9f,
1295e4dc74cSPablo de Lara         0xa0, 0x71, 0xe8, 0xb4, 0xd9, 0xad, 0xa9, 0xad, 0x7d, 0xed, 0xf4, 0xe5, 0xe7,
1305e4dc74cSPablo de Lara         0x38, 0x76, 0x3f, 0x69, 0x14, 0x5a, 0x57, 0x1b, 0x24, 0x20, 0x12, 0xfb, 0x7a,
1315e4dc74cSPablo de Lara         0xe0, 0x7f, 0xa9, 0xba, 0xac, 0x3d, 0xf1, 0x02, 0xe0, 0x08, 0xb0, 0xe2, 0x79,
1325e4dc74cSPablo de Lara         0x88, 0x59, 0x88, 0x81, 0xd9, 0x20, 0xa9, 0xe6, 0x4f, 0x56, 0x15, 0xcd
1335e4dc74cSPablo de Lara };
1345e4dc74cSPablo de Lara 
1355e4dc74cSPablo de Lara static const uint8_t aes_cbc_256_key[] = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
1365e4dc74cSPablo de Lara                                            0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
1375e4dc74cSPablo de Lara                                            0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
1385e4dc74cSPablo de Lara                                            0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 };
1395e4dc74cSPablo de Lara 
1405e4dc74cSPablo de Lara static uint8_t aes_cbc_256_iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1415e4dc74cSPablo de Lara                                     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1425e4dc74cSPablo de Lara 
1435e4dc74cSPablo de Lara static const uint8_t aes_cbc_256_plaintext[] = {
1445e4dc74cSPablo de Lara         0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73,
1455e4dc74cSPablo de Lara         0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7,
1465e4dc74cSPablo de Lara         0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4,
1475e4dc74cSPablo de Lara         0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45,
1485e4dc74cSPablo de Lara         0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
1495e4dc74cSPablo de Lara };
1505e4dc74cSPablo de Lara 
1515e4dc74cSPablo de Lara static const uint8_t aes_cbc_256_ciphertext[] = {
1525e4dc74cSPablo de Lara         0xf5, 0x8c, 0x4c, 0x04, 0xd6, 0xe5, 0xf1, 0xba, 0x77, 0x9e, 0xab, 0xfb, 0x5f,
1535e4dc74cSPablo de Lara         0x7b, 0xfb, 0xd6, 0x9c, 0xfc, 0x4e, 0x96, 0x7e, 0xdb, 0x80, 0x8d, 0x67, 0x9f,
1545e4dc74cSPablo de Lara         0x77, 0x7b, 0xc6, 0x70, 0x2c, 0x7d, 0x39, 0xf2, 0x33, 0x69, 0xa9, 0xd9, 0xba,
1555e4dc74cSPablo de Lara         0xcf, 0xa5, 0x30, 0xe2, 0x63, 0x04, 0x23, 0x14, 0x61, 0xb2, 0xeb, 0x05, 0xe2,
1565e4dc74cSPablo de Lara         0xc3, 0x9b, 0xe9, 0xfc, 0xda, 0x6c, 0x19, 0x07, 0x8c, 0x6a, 0x9d, 0x1b
1575e4dc74cSPablo de Lara };
1585e4dc74cSPablo de Lara 
1595e4dc74cSPablo de Lara /*
1605e4dc74cSPablo de Lara  *  AES-XTS Test vectors from the standard:
1615e4dc74cSPablo de Lara  * "IEEE Standard for Cryptographic Protection of Data on Block-Oriented
1625e4dc74cSPablo de Lara  * Storage Devices"
1635e4dc74cSPablo de Lara  * http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4493450
1645e4dc74cSPablo de Lara  */
1655e4dc74cSPablo de Lara static uint8_t aes_xts_128_key1[16] = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1665e4dc74cSPablo de Lara                                         0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 };
1675e4dc74cSPablo de Lara 
1685e4dc74cSPablo de Lara static uint8_t aes_xts_128_key2[16] = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1695e4dc74cSPablo de Lara                                         0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };
1705e4dc74cSPablo de Lara 
1715e4dc74cSPablo de Lara static uint8_t aes_xts_128_tweak[16] = { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1725e4dc74cSPablo de Lara                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
1735e4dc74cSPablo de Lara 
1745e4dc74cSPablo de Lara static uint8_t aes_xts_128_plaintext[32] = { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1755e4dc74cSPablo de Lara                                              0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1765e4dc74cSPablo de Lara                                              0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1775e4dc74cSPablo de Lara                                              0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 };
1785e4dc74cSPablo de Lara 
1795e4dc74cSPablo de Lara static uint8_t aes_xts_128_ciphertext[32] = { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1805e4dc74cSPablo de Lara                                               0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1815e4dc74cSPablo de Lara                                               0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1825e4dc74cSPablo de Lara                                               0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 };
1835e4dc74cSPablo de Lara 
1845e4dc74cSPablo de Lara static uint8_t aes_xts_256_key1[32] = { 0x27, 0x18, 0x28, 0x18, 0x28, 0x45, 0x90, 0x45,
1855e4dc74cSPablo de Lara                                         0x23, 0x53, 0x60, 0x28, 0x74, 0x71, 0x35, 0x26,
1865e4dc74cSPablo de Lara                                         0x62, 0x49, 0x77, 0x57, 0x24, 0x70, 0x93, 0x69,
1875e4dc74cSPablo de Lara                                         0x99, 0x59, 0x57, 0x49, 0x66, 0x96, 0x76, 0x27 };
1885e4dc74cSPablo de Lara 
1895e4dc74cSPablo de Lara static uint8_t aes_xts_256_key2[32] = { 0x31, 0x41, 0x59, 0x26, 0x53, 0x58, 0x97, 0x93,
1905e4dc74cSPablo de Lara                                         0x23, 0x84, 0x62, 0x64, 0x33, 0x83, 0x27, 0x95,
1915e4dc74cSPablo de Lara                                         0x02, 0x88, 0x41, 0x97, 0x16, 0x93, 0x99, 0x37,
1925e4dc74cSPablo de Lara                                         0x51, 0x05, 0x82, 0x09, 0x74, 0x94, 0x45, 0x92 };
1935e4dc74cSPablo de Lara 
1945e4dc74cSPablo de Lara static uint8_t aes_xts_256_tweak[16] = { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1955e4dc74cSPablo de Lara                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
1965e4dc74cSPablo de Lara 
1975e4dc74cSPablo de Lara static uint8_t aes_xts_256_plaintext[512] = {
1985e4dc74cSPablo de Lara         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
1995e4dc74cSPablo de Lara         0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
2005e4dc74cSPablo de Lara         0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c,
2015e4dc74cSPablo de Lara         0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
2025e4dc74cSPablo de Lara         0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
2035e4dc74cSPablo de Lara         0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
2045e4dc74cSPablo de Lara         0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
2055e4dc74cSPablo de Lara         0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
2065e4dc74cSPablo de Lara         0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
2075e4dc74cSPablo de Lara         0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
2085e4dc74cSPablo de Lara         0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
2095e4dc74cSPablo de Lara         0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
2105e4dc74cSPablo de Lara         0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2,
2115e4dc74cSPablo de Lara         0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1,
2125e4dc74cSPablo de Lara         0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0,
2135e4dc74cSPablo de Lara         0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
2145e4dc74cSPablo de Lara         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe,
2155e4dc74cSPablo de Lara         0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
2165e4dc74cSPablo de Lara         0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c,
2175e4dc74cSPablo de Lara         0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
2185e4dc74cSPablo de Lara         0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a,
2195e4dc74cSPablo de Lara         0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
2205e4dc74cSPablo de Lara         0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
2215e4dc74cSPablo de Lara         0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
2225e4dc74cSPablo de Lara         0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
2235e4dc74cSPablo de Lara         0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
2245e4dc74cSPablo de Lara         0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
2255e4dc74cSPablo de Lara         0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3,
2265e4dc74cSPablo de Lara         0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2,
2275e4dc74cSPablo de Lara         0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1,
2285e4dc74cSPablo de Lara         0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
2295e4dc74cSPablo de Lara         0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
2305e4dc74cSPablo de Lara         0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee,
2315e4dc74cSPablo de Lara         0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd,
2325e4dc74cSPablo de Lara         0xfe, 0xff
2335e4dc74cSPablo de Lara };
2345e4dc74cSPablo de Lara 
2355e4dc74cSPablo de Lara static uint8_t aes_xts_256_ciphertext[512] = {
2365e4dc74cSPablo de Lara         0x1c, 0x3b, 0x3a, 0x10, 0x2f, 0x77, 0x03, 0x86, 0xe4, 0x83, 0x6c, 0x99, 0xe3, 0x70, 0xcf,
2375e4dc74cSPablo de Lara         0x9b, 0xea, 0x00, 0x80, 0x3f, 0x5e, 0x48, 0x23, 0x57, 0xa4, 0xae, 0x12, 0xd4, 0x14, 0xa3,
2385e4dc74cSPablo de Lara         0xe6, 0x3b, 0x5d, 0x31, 0xe2, 0x76, 0xf8, 0xfe, 0x4a, 0x8d, 0x66, 0xb3, 0x17, 0xf9, 0xac,
2395e4dc74cSPablo de Lara         0x68, 0x3f, 0x44, 0x68, 0x0a, 0x86, 0xac, 0x35, 0xad, 0xfc, 0x33, 0x45, 0xbe, 0xfe, 0xcb,
2405e4dc74cSPablo de Lara         0x4b, 0xb1, 0x88, 0xfd, 0x57, 0x76, 0x92, 0x6c, 0x49, 0xa3, 0x09, 0x5e, 0xb1, 0x08, 0xfd,
2415e4dc74cSPablo de Lara         0x10, 0x98, 0xba, 0xec, 0x70, 0xaa, 0xa6, 0x69, 0x99, 0xa7, 0x2a, 0x82, 0xf2, 0x7d, 0x84,
2425e4dc74cSPablo de Lara         0x8b, 0x21, 0xd4, 0xa7, 0x41, 0xb0, 0xc5, 0xcd, 0x4d, 0x5f, 0xff, 0x9d, 0xac, 0x89, 0xae,
2435e4dc74cSPablo de Lara         0xba, 0x12, 0x29, 0x61, 0xd0, 0x3a, 0x75, 0x71, 0x23, 0xe9, 0x87, 0x0f, 0x8a, 0xcf, 0x10,
2445e4dc74cSPablo de Lara         0x00, 0x02, 0x08, 0x87, 0x89, 0x14, 0x29, 0xca, 0x2a, 0x3e, 0x7a, 0x7d, 0x7d, 0xf7, 0xb1,
2455e4dc74cSPablo de Lara         0x03, 0x55, 0x16, 0x5c, 0x8b, 0x9a, 0x6d, 0x0a, 0x7d, 0xe8, 0xb0, 0x62, 0xc4, 0x50, 0x0d,
2465e4dc74cSPablo de Lara         0xc4, 0xcd, 0x12, 0x0c, 0x0f, 0x74, 0x18, 0xda, 0xe3, 0xd0, 0xb5, 0x78, 0x1c, 0x34, 0x80,
2475e4dc74cSPablo de Lara         0x3f, 0xa7, 0x54, 0x21, 0xc7, 0x90, 0xdf, 0xe1, 0xde, 0x18, 0x34, 0xf2, 0x80, 0xd7, 0x66,
2485e4dc74cSPablo de Lara         0x7b, 0x32, 0x7f, 0x6c, 0x8c, 0xd7, 0x55, 0x7e, 0x12, 0xac, 0x3a, 0x0f, 0x93, 0xec, 0x05,
2495e4dc74cSPablo de Lara         0xc5, 0x2e, 0x04, 0x93, 0xef, 0x31, 0xa1, 0x2d, 0x3d, 0x92, 0x60, 0xf7, 0x9a, 0x28, 0x9d,
2505e4dc74cSPablo de Lara         0x6a, 0x37, 0x9b, 0xc7, 0x0c, 0x50, 0x84, 0x14, 0x73, 0xd1, 0xa8, 0xcc, 0x81, 0xec, 0x58,
2515e4dc74cSPablo de Lara         0x3e, 0x96, 0x45, 0xe0, 0x7b, 0x8d, 0x96, 0x70, 0x65, 0x5b, 0xa5, 0xbb, 0xcf, 0xec, 0xc6,
2525e4dc74cSPablo de Lara         0xdc, 0x39, 0x66, 0x38, 0x0a, 0xd8, 0xfe, 0xcb, 0x17, 0xb6, 0xba, 0x02, 0x46, 0x9a, 0x02,
2535e4dc74cSPablo de Lara         0x0a, 0x84, 0xe1, 0x8e, 0x8f, 0x84, 0x25, 0x20, 0x70, 0xc1, 0x3e, 0x9f, 0x1f, 0x28, 0x9b,
2545e4dc74cSPablo de Lara         0xe5, 0x4f, 0xbc, 0x48, 0x14, 0x57, 0x77, 0x8f, 0x61, 0x60, 0x15, 0xe1, 0x32, 0x7a, 0x02,
2555e4dc74cSPablo de Lara         0xb1, 0x40, 0xf1, 0x50, 0x5e, 0xb3, 0x09, 0x32, 0x6d, 0x68, 0x37, 0x8f, 0x83, 0x74, 0x59,
2565e4dc74cSPablo de Lara         0x5c, 0x84, 0x9d, 0x84, 0xf4, 0xc3, 0x33, 0xec, 0x44, 0x23, 0x88, 0x51, 0x43, 0xcb, 0x47,
2575e4dc74cSPablo de Lara         0xbd, 0x71, 0xc5, 0xed, 0xae, 0x9b, 0xe6, 0x9a, 0x2f, 0xfe, 0xce, 0xb1, 0xbe, 0xc9, 0xde,
2585e4dc74cSPablo de Lara         0x24, 0x4f, 0xbe, 0x15, 0x99, 0x2b, 0x11, 0xb7, 0x7c, 0x04, 0x0f, 0x12, 0xbd, 0x8f, 0x6a,
2595e4dc74cSPablo de Lara         0x97, 0x5a, 0x44, 0xa0, 0xf9, 0x0c, 0x29, 0xa9, 0xab, 0xc3, 0xd4, 0xd8, 0x93, 0x92, 0x72,
2605e4dc74cSPablo de Lara         0x84, 0xc5, 0x87, 0x54, 0xcc, 0xe2, 0x94, 0x52, 0x9f, 0x86, 0x14, 0xdc, 0xd2, 0xab, 0xa9,
2615e4dc74cSPablo de Lara         0x91, 0x92, 0x5f, 0xed, 0xc4, 0xae, 0x74, 0xff, 0xac, 0x6e, 0x33, 0x3b, 0x93, 0xeb, 0x4a,
2625e4dc74cSPablo de Lara         0xff, 0x04, 0x79, 0xda, 0x9a, 0x41, 0x0e, 0x44, 0x50, 0xe0, 0xdd, 0x7a, 0xe4, 0xc6, 0xe2,
2635e4dc74cSPablo de Lara         0x91, 0x09, 0x00, 0x57, 0x5d, 0xa4, 0x01, 0xfc, 0x07, 0x05, 0x9f, 0x64, 0x5e, 0x8b, 0x7e,
2645e4dc74cSPablo de Lara         0x9b, 0xfd, 0xef, 0x33, 0x94, 0x30, 0x54, 0xff, 0x84, 0x01, 0x14, 0x93, 0xc2, 0x7b, 0x34,
2655e4dc74cSPablo de Lara         0x29, 0xea, 0xed, 0xb4, 0xed, 0x53, 0x76, 0x44, 0x1a, 0x77, 0xed, 0x43, 0x85, 0x1a, 0xd7,
2665e4dc74cSPablo de Lara         0x7f, 0x16, 0xf5, 0x41, 0xdf, 0xd2, 0x69, 0xd5, 0x0d, 0x6a, 0x5f, 0x14, 0xfb, 0x0a, 0xab,
2675e4dc74cSPablo de Lara         0x1c, 0xbb, 0x4c, 0x15, 0x50, 0xbe, 0x97, 0xf7, 0xab, 0x40, 0x66, 0x19, 0x3c, 0x4c, 0xaa,
2685e4dc74cSPablo de Lara         0x77, 0x3d, 0xad, 0x38, 0x01, 0x4b, 0xd2, 0x09, 0x2f, 0xa7, 0x55, 0xc8, 0x24, 0xbb, 0x5e,
2695e4dc74cSPablo de Lara         0x54, 0xc4, 0xf3, 0x6f, 0xfd, 0xa9, 0xfc, 0xea, 0x70, 0xb9, 0xc6, 0xe6, 0x93, 0xe1, 0x48,
2705e4dc74cSPablo de Lara         0xc1, 0x51
2715e4dc74cSPablo de Lara };
2725e4dc74cSPablo de Lara 
273ae502d05SPablo de Lara /* AES-GCM-128 vector, from
274ae502d05SPablo de Lara  * http://www.ieee802.org/1/files/public/docs2011/bn-randall-test-vectors-0511-v1.pdf */
275ae502d05SPablo de Lara static const uint8_t aes_gcm_128_key[] = { 0xAD, 0x7A, 0x2B, 0xD0, 0x3E, 0xAC, 0x83, 0x5A,
276ae502d05SPablo de Lara                                            0x6F, 0x62, 0x0F, 0xDC, 0xB5, 0x06, 0xB3, 0x45 };
277ae502d05SPablo de Lara static const uint8_t aes_gcm_128_plaintext[] = { 0x08, 0x00, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14,
278ae502d05SPablo de Lara                                                  0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C,
279ae502d05SPablo de Lara                                                  0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24,
280ae502d05SPablo de Lara                                                  0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C,
281ae502d05SPablo de Lara                                                  0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34,
282ae502d05SPablo de Lara                                                  0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x00, 0x02 };
283ae502d05SPablo de Lara static uint8_t aes_gcm_128_iv[] = { 0x12, 0x15, 0x35, 0x24, 0xC0, 0x89,
284ae502d05SPablo de Lara                                     0x5E, 0x81, 0xB2, 0xC2, 0x84, 0x65 };
285ae502d05SPablo de Lara static const uint8_t aes_gcm_128_aad[] = { 0xD6, 0x09, 0xB1, 0xF0, 0x56, 0x63, 0x7A,
286ae502d05SPablo de Lara                                            0x0D, 0x46, 0xDF, 0x99, 0x8D, 0x88, 0xE5,
287ae502d05SPablo de Lara                                            0x2E, 0x00, 0xB2, 0xC2, 0x84, 0x65, 0x12,
288ae502d05SPablo de Lara                                            0x15, 0x35, 0x24, 0xC0, 0x89, 0x5E, 0x81 };
289ae502d05SPablo de Lara static const uint8_t aes_gcm_128_ciphertext[] = { 0x70, 0x1A, 0xFA, 0x1C, 0xC0, 0x39, 0xC0, 0xD7,
290ae502d05SPablo de Lara                                                   0x65, 0x12, 0x8A, 0x66, 0x5D, 0xAB, 0x69, 0x24,
291ae502d05SPablo de Lara                                                   0x38, 0x99, 0xBF, 0x73, 0x18, 0xCC, 0xDC, 0x81,
292ae502d05SPablo de Lara                                                   0xC9, 0x93, 0x1D, 0xA1, 0x7F, 0xBE, 0x8E, 0xDD,
293ae502d05SPablo de Lara                                                   0x7D, 0x17, 0xCB, 0x8B, 0x4C, 0x26, 0xFC, 0x81,
294ae502d05SPablo de Lara                                                   0xE3, 0x28, 0x4F, 0x2B, 0x7F, 0xBA, 0x71, 0x3D };
295ae502d05SPablo de Lara static uint8_t aes_gcm_128_tag[] = { 0x4F, 0x8D, 0x55, 0xE7, 0xD3, 0xF0, 0x6F, 0xD5,
296ae502d05SPablo de Lara                                      0xA1, 0x3C, 0x0C, 0x29, 0xB9, 0xD5, 0xB8, 0x80 };
297ae502d05SPablo de Lara 
298ae502d05SPablo de Lara /* AES-GCM-256 vector, from
299ae502d05SPablo de Lara  * http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf */
300ae502d05SPablo de Lara static const uint8_t aes_gcm_256_key[] = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
301ae502d05SPablo de Lara                                            0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
302ae502d05SPablo de Lara                                            0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
303ae502d05SPablo de Lara                                            0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 };
304ae502d05SPablo de Lara static const uint8_t aes_gcm_256_plaintext[] = {
305ae502d05SPablo de Lara         0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26,
306ae502d05SPablo de Lara         0x9a, 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31,
307ae502d05SPablo de Lara         0x8a, 0x72, 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, 0x2f, 0xcf, 0x0e, 0x24, 0x49,
308ae502d05SPablo de Lara         0xa6, 0xb5, 0x25, 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, 0xba, 0x63, 0x7b, 0x39
309ae502d05SPablo de Lara };
310ae502d05SPablo de Lara static const uint8_t aes_gcm_256_aad[] = { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe,
311ae502d05SPablo de Lara                                            0xef, 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad,
312ae502d05SPablo de Lara                                            0xbe, 0xef, 0xab, 0xad, 0xda, 0xd2 };
313ae502d05SPablo de Lara static uint8_t aes_gcm_256_iv[] = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce,
314ae502d05SPablo de Lara                                     0xdb, 0xad, 0xde, 0xca, 0xf8, 0x88 };
315ae502d05SPablo de Lara static const uint8_t aes_gcm_256_ciphertext[] = {
316ae502d05SPablo de Lara         0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42,
317ae502d05SPablo de Lara         0x7d, 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55,
318ae502d05SPablo de Lara         0xd1, 0xaa, 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, 0xa7, 0xb0, 0x8b, 0x10, 0x56,
319ae502d05SPablo de Lara         0x82, 0x88, 0x38, 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, 0xbc, 0xc9, 0xf6, 0x62
320ae502d05SPablo de Lara };
321ae502d05SPablo de Lara static uint8_t aes_gcm_256_tag[] = { 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68,
322ae502d05SPablo de Lara                                      0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b };
323ae502d05SPablo de Lara 
3245e4dc74cSPablo de Lara #define ADD_CBC_VECTOR(_key, _iv, _plain, _cipher, _descr)                                         \
32572e78736SMarcel Cornu         { _key, sizeof(_key), _iv, _plain, sizeof(_plain), _cipher, _descr }
3265e4dc74cSPablo de Lara 
3275e4dc74cSPablo de Lara static const struct self_test_cbc_vector cbc_vectors[] = {
3285e4dc74cSPablo de Lara         ADD_CBC_VECTOR(aes_cbc_128_key, aes_cbc_128_iv, aes_cbc_128_plaintext,
3295e4dc74cSPablo de Lara                        aes_cbc_128_ciphertext, "AES128-CBC"),
3305e4dc74cSPablo de Lara         ADD_CBC_VECTOR(aes_cbc_192_key, aes_cbc_192_iv, aes_cbc_192_plaintext,
3315e4dc74cSPablo de Lara                        aes_cbc_192_ciphertext, "AES192-CBC"),
3325e4dc74cSPablo de Lara         ADD_CBC_VECTOR(aes_cbc_256_key, aes_cbc_256_iv, aes_cbc_256_plaintext,
3335e4dc74cSPablo de Lara                        aes_cbc_256_ciphertext, "AES256-CBC"),
3345e4dc74cSPablo de Lara };
3355e4dc74cSPablo de Lara 
3365e4dc74cSPablo de Lara static int
cbc_self_test_vector(const struct self_test_cbc_vector * v)3375e4dc74cSPablo de Lara cbc_self_test_vector(const struct self_test_cbc_vector *v)
3385e4dc74cSPablo de Lara {
3395e4dc74cSPablo de Lara         struct {
3405e4dc74cSPablo de Lara                 DECLARE_ALIGNED(uint8_t expkey_enc[16 * 15], 16);
3415e4dc74cSPablo de Lara                 DECLARE_ALIGNED(uint8_t expkey_dec[16 * 15], 16);
3425e4dc74cSPablo de Lara         } aes_keys;
3435e4dc74cSPablo de Lara         uint8_t scratch[256];
3445e4dc74cSPablo de Lara 
3455e4dc74cSPablo de Lara         /* message too long */
3465e4dc74cSPablo de Lara         if (v->plaintext_size > sizeof(scratch))
3475e4dc74cSPablo de Lara                 return 0;
3485e4dc74cSPablo de Lara 
3495e4dc74cSPablo de Lara         /* test encrypt direction */
3505e4dc74cSPablo de Lara         memset(scratch, 0, sizeof(scratch));
3515e4dc74cSPablo de Lara         memcpy(scratch, v->plaintext, v->plaintext_size);
3525e4dc74cSPablo de Lara 
3535e4dc74cSPablo de Lara         switch (v->cipher_key_size) {
354e4a84933SMarcel Cornu         case ISAL_CBC_128_BITS:
355cb5bcf4bSMarcel Cornu                 _aes_keyexp_128(v->cipher_key, aes_keys.expkey_enc, aes_keys.expkey_dec);
3569b0cbfb3SPablo de Lara                 _aes_cbc_enc_128(scratch, v->cipher_iv, aes_keys.expkey_enc, scratch,
3575e4dc74cSPablo de Lara                                  v->plaintext_size);
3585e4dc74cSPablo de Lara                 break;
359e4a84933SMarcel Cornu         case ISAL_CBC_192_BITS:
360cb5bcf4bSMarcel Cornu                 _aes_keyexp_192(v->cipher_key, aes_keys.expkey_enc, aes_keys.expkey_dec);
3619b0cbfb3SPablo de Lara                 _aes_cbc_enc_192(scratch, v->cipher_iv, aes_keys.expkey_enc, scratch,
3625e4dc74cSPablo de Lara                                  v->plaintext_size);
3635e4dc74cSPablo de Lara                 break;
364e4a84933SMarcel Cornu         case ISAL_CBC_256_BITS:
365cb5bcf4bSMarcel Cornu                 _aes_keyexp_256(v->cipher_key, aes_keys.expkey_enc, aes_keys.expkey_dec);
3669b0cbfb3SPablo de Lara                 _aes_cbc_enc_256(scratch, v->cipher_iv, aes_keys.expkey_enc, scratch,
3675e4dc74cSPablo de Lara                                  v->plaintext_size);
3685e4dc74cSPablo de Lara                 break;
3695e4dc74cSPablo de Lara         default:
3705e4dc74cSPablo de Lara                 /* invalid key size */
3715e4dc74cSPablo de Lara                 return 0;
3725e4dc74cSPablo de Lara         }
3735e4dc74cSPablo de Lara 
3745e4dc74cSPablo de Lara         /* check for cipher text mismatch */
3755e4dc74cSPablo de Lara         if (memcmp(scratch, v->ciphertext, v->plaintext_size))
3765e4dc74cSPablo de Lara                 return 0;
3775e4dc74cSPablo de Lara 
3785e4dc74cSPablo de Lara         /* test decrypt direction */
3795e4dc74cSPablo de Lara         memset(scratch, 0, sizeof(scratch));
3805e4dc74cSPablo de Lara         memcpy(scratch, v->ciphertext, v->plaintext_size);
3815e4dc74cSPablo de Lara 
3825e4dc74cSPablo de Lara         switch (v->cipher_key_size) {
383e4a84933SMarcel Cornu         case ISAL_CBC_128_BITS:
3849b0cbfb3SPablo de Lara                 _aes_cbc_dec_128(scratch, v->cipher_iv, aes_keys.expkey_dec, scratch,
3855e4dc74cSPablo de Lara                                  v->plaintext_size);
3865e4dc74cSPablo de Lara                 break;
387e4a84933SMarcel Cornu         case ISAL_CBC_192_BITS:
3889b0cbfb3SPablo de Lara                 _aes_cbc_dec_192(scratch, v->cipher_iv, aes_keys.expkey_dec, scratch,
3895e4dc74cSPablo de Lara                                  v->plaintext_size);
3905e4dc74cSPablo de Lara                 break;
391e4a84933SMarcel Cornu         case ISAL_CBC_256_BITS:
3929b0cbfb3SPablo de Lara                 _aes_cbc_dec_256(scratch, v->cipher_iv, aes_keys.expkey_dec, scratch,
3935e4dc74cSPablo de Lara                                  v->plaintext_size);
3945e4dc74cSPablo de Lara                 break;
3955e4dc74cSPablo de Lara         default:
3965e4dc74cSPablo de Lara                 /* invalid key size */
3975e4dc74cSPablo de Lara                 return 0;
3985e4dc74cSPablo de Lara         }
3995e4dc74cSPablo de Lara 
4005e4dc74cSPablo de Lara         /* check for plain text mismatch */
4015e4dc74cSPablo de Lara         if (memcmp(scratch, v->plaintext, v->plaintext_size))
4025e4dc74cSPablo de Lara                 return 0;
4035e4dc74cSPablo de Lara 
4045e4dc74cSPablo de Lara         return 1;
4055e4dc74cSPablo de Lara }
4065e4dc74cSPablo de Lara 
4075e4dc74cSPablo de Lara static int
_aes_cbc_self_test(void)4085e4dc74cSPablo de Lara _aes_cbc_self_test(void)
4095e4dc74cSPablo de Lara {
4105e4dc74cSPablo de Lara         for (uint32_t i = 0; i < DIM(cbc_vectors); i++) {
4115e4dc74cSPablo de Lara                 const struct self_test_cbc_vector *v = &cbc_vectors[i];
4125e4dc74cSPablo de Lara 
4135e4dc74cSPablo de Lara                 if (cbc_self_test_vector(v) == 0)
4145e4dc74cSPablo de Lara                         return 1;
4155e4dc74cSPablo de Lara         }
4165e4dc74cSPablo de Lara 
4175e4dc74cSPablo de Lara         return 0;
4185e4dc74cSPablo de Lara }
4195e4dc74cSPablo de Lara 
4205e4dc74cSPablo de Lara #define ADD_XTS_VECTOR(_key1, _key2, _tweak, _plain, _cipher, _descr)                              \
42172e78736SMarcel Cornu         { _key1, _key2, sizeof(_key1), _tweak, _plain, sizeof(_plain), _cipher, _descr }
4225e4dc74cSPablo de Lara 
4235e4dc74cSPablo de Lara static const struct self_test_xts_vector xts_vectors[] = {
4245e4dc74cSPablo de Lara         ADD_XTS_VECTOR(aes_xts_128_key1, aes_xts_128_key2, aes_xts_128_tweak, aes_xts_128_plaintext,
4255e4dc74cSPablo de Lara                        aes_xts_128_ciphertext, "AES128-XTS"),
4265e4dc74cSPablo de Lara         ADD_XTS_VECTOR(aes_xts_256_key1, aes_xts_256_key2, aes_xts_256_tweak, aes_xts_256_plaintext,
4275e4dc74cSPablo de Lara                        aes_xts_256_ciphertext, "AES256-XTS"),
4285e4dc74cSPablo de Lara };
4295e4dc74cSPablo de Lara 
4305e4dc74cSPablo de Lara static int
xts_self_test_vector(const struct self_test_xts_vector * v)4315e4dc74cSPablo de Lara xts_self_test_vector(const struct self_test_xts_vector *v)
4325e4dc74cSPablo de Lara {
4335e4dc74cSPablo de Lara         struct {
4345e4dc74cSPablo de Lara                 DECLARE_ALIGNED(uint8_t expkey1_enc[16 * 15], 16);
4355e4dc74cSPablo de Lara                 DECLARE_ALIGNED(uint8_t expkey1_dec[16 * 15], 16);
4365e4dc74cSPablo de Lara                 DECLARE_ALIGNED(uint8_t expkey2_enc[16 * 15], 16);
4375e4dc74cSPablo de Lara                 DECLARE_ALIGNED(uint8_t expkey2_dec[16 * 15], 16);
4385e4dc74cSPablo de Lara         } aes_keys;
4395e4dc74cSPablo de Lara         uint8_t scratch[512];
4405e4dc74cSPablo de Lara 
4415e4dc74cSPablo de Lara         /* message too long */
4425e4dc74cSPablo de Lara         if (v->plaintext_size > sizeof(scratch))
4435e4dc74cSPablo de Lara                 return 0;
4445e4dc74cSPablo de Lara 
4455e4dc74cSPablo de Lara         /* test encrypt direction */
4465e4dc74cSPablo de Lara         memset(scratch, 0, sizeof(scratch));
4475e4dc74cSPablo de Lara         memcpy(scratch, v->plaintext, v->plaintext_size);
4485e4dc74cSPablo de Lara 
4495e4dc74cSPablo de Lara         switch (v->cipher_key_size) {
4505e4dc74cSPablo de Lara         case 16:
451811b558fSMarcel Cornu                 _XTS_AES_128_enc(v->cipher_key2, v->cipher_key1, v->tweak, v->plaintext_size,
4525e4dc74cSPablo de Lara                                  scratch, scratch);
4535e4dc74cSPablo de Lara                 break;
4545e4dc74cSPablo de Lara         case 32:
455811b558fSMarcel Cornu                 _XTS_AES_256_enc(v->cipher_key2, v->cipher_key1, v->tweak, v->plaintext_size,
4565e4dc74cSPablo de Lara                                  scratch, scratch);
4575e4dc74cSPablo de Lara                 break;
4585e4dc74cSPablo de Lara         default:
4595e4dc74cSPablo de Lara                 /* invalid key size */
4605e4dc74cSPablo de Lara                 return 0;
4615e4dc74cSPablo de Lara         }
4625e4dc74cSPablo de Lara 
4635e4dc74cSPablo de Lara         /* check for ciphertext mismatch */
4645e4dc74cSPablo de Lara         if (memcmp(scratch, v->ciphertext, v->plaintext_size))
4655e4dc74cSPablo de Lara                 return 0;
4665e4dc74cSPablo de Lara 
4675e4dc74cSPablo de Lara         /* test encrypt direction (expanded keys) */
4685e4dc74cSPablo de Lara         memset(scratch, 0, sizeof(scratch));
4695e4dc74cSPablo de Lara         memcpy(scratch, v->plaintext, v->plaintext_size);
4705e4dc74cSPablo de Lara         switch (v->cipher_key_size) {
4715e4dc74cSPablo de Lara         case 16:
472cb5bcf4bSMarcel Cornu                 _aes_keyexp_128(v->cipher_key1, aes_keys.expkey1_enc, aes_keys.expkey1_dec);
473cb5bcf4bSMarcel Cornu                 _aes_keyexp_128(v->cipher_key2, aes_keys.expkey2_enc, aes_keys.expkey2_dec);
474811b558fSMarcel Cornu                 _XTS_AES_128_enc_expanded_key(aes_keys.expkey2_enc, aes_keys.expkey1_enc, v->tweak,
4755e4dc74cSPablo de Lara                                               v->plaintext_size, scratch, scratch);
4765e4dc74cSPablo de Lara                 break;
4775e4dc74cSPablo de Lara         case 32:
478cb5bcf4bSMarcel Cornu                 _aes_keyexp_256(v->cipher_key1, aes_keys.expkey1_enc, aes_keys.expkey1_dec);
479cb5bcf4bSMarcel Cornu                 _aes_keyexp_256(v->cipher_key2, aes_keys.expkey2_enc, aes_keys.expkey2_dec);
480811b558fSMarcel Cornu                 _XTS_AES_256_enc_expanded_key(aes_keys.expkey2_enc, aes_keys.expkey1_enc, v->tweak,
4815e4dc74cSPablo de Lara                                               v->plaintext_size, scratch, scratch);
4825e4dc74cSPablo de Lara                 break;
4835e4dc74cSPablo de Lara         default:
4845e4dc74cSPablo de Lara                 /* invalid key size */
4855e4dc74cSPablo de Lara                 return 0;
4865e4dc74cSPablo de Lara         }
4875e4dc74cSPablo de Lara 
4885e4dc74cSPablo de Lara         /* check for ciphertext mismatch */
4895e4dc74cSPablo de Lara         if (memcmp(scratch, v->ciphertext, v->plaintext_size))
4905e4dc74cSPablo de Lara                 return 0;
4915e4dc74cSPablo de Lara 
4925e4dc74cSPablo de Lara         /* test decrypt direction */
4935e4dc74cSPablo de Lara         memset(scratch, 0, sizeof(scratch));
4945e4dc74cSPablo de Lara         memcpy(scratch, v->ciphertext, v->plaintext_size);
4955e4dc74cSPablo de Lara 
4965e4dc74cSPablo de Lara         switch (v->cipher_key_size) {
4975e4dc74cSPablo de Lara         case 16:
498811b558fSMarcel Cornu                 _XTS_AES_128_dec(v->cipher_key2, v->cipher_key1, v->tweak, v->plaintext_size,
4995e4dc74cSPablo de Lara                                  scratch, scratch);
5005e4dc74cSPablo de Lara                 break;
5015e4dc74cSPablo de Lara         case 32:
502811b558fSMarcel Cornu                 _XTS_AES_256_dec(v->cipher_key2, v->cipher_key1, v->tweak, v->plaintext_size,
5035e4dc74cSPablo de Lara                                  scratch, scratch);
5045e4dc74cSPablo de Lara                 break;
5055e4dc74cSPablo de Lara         default:
5065e4dc74cSPablo de Lara                 /* invalid key size */
5075e4dc74cSPablo de Lara                 return 0;
5085e4dc74cSPablo de Lara         }
5095e4dc74cSPablo de Lara 
5105e4dc74cSPablo de Lara         /* check for plaintext mismatch */
5115e4dc74cSPablo de Lara         if (memcmp(scratch, v->plaintext, v->plaintext_size))
5125e4dc74cSPablo de Lara                 return 0;
5135e4dc74cSPablo de Lara 
5145e4dc74cSPablo de Lara         /* test decrypt direction (expanded keys) */
5155e4dc74cSPablo de Lara         memset(scratch, 0, sizeof(scratch));
5165e4dc74cSPablo de Lara         memcpy(scratch, v->ciphertext, v->plaintext_size);
5175e4dc74cSPablo de Lara         switch (v->cipher_key_size) {
5185e4dc74cSPablo de Lara         case 16:
519cb5bcf4bSMarcel Cornu                 _aes_keyexp_128(v->cipher_key1, aes_keys.expkey1_enc, aes_keys.expkey1_dec);
520cb5bcf4bSMarcel Cornu                 _aes_keyexp_128(v->cipher_key2, aes_keys.expkey2_enc, aes_keys.expkey2_dec);
521811b558fSMarcel Cornu                 _XTS_AES_128_dec_expanded_key(aes_keys.expkey2_enc, aes_keys.expkey1_dec, v->tweak,
5225e4dc74cSPablo de Lara                                               v->plaintext_size, scratch, scratch);
5235e4dc74cSPablo de Lara                 break;
5245e4dc74cSPablo de Lara         case 32:
525cb5bcf4bSMarcel Cornu                 _aes_keyexp_256(v->cipher_key1, aes_keys.expkey1_enc, aes_keys.expkey1_dec);
526cb5bcf4bSMarcel Cornu                 _aes_keyexp_256(v->cipher_key2, aes_keys.expkey2_enc, aes_keys.expkey2_dec);
527811b558fSMarcel Cornu                 _XTS_AES_256_dec_expanded_key(aes_keys.expkey2_enc, aes_keys.expkey1_dec, v->tweak,
5285e4dc74cSPablo de Lara                                               v->plaintext_size, scratch, scratch);
5295e4dc74cSPablo de Lara                 break;
5305e4dc74cSPablo de Lara         default:
5315e4dc74cSPablo de Lara                 /* invalid key size */
5325e4dc74cSPablo de Lara                 return 0;
5335e4dc74cSPablo de Lara         }
5345e4dc74cSPablo de Lara 
5355e4dc74cSPablo de Lara         /* check for plaintext mismatch */
5365e4dc74cSPablo de Lara         if (memcmp(scratch, v->plaintext, v->plaintext_size))
5375e4dc74cSPablo de Lara                 return 0;
5385e4dc74cSPablo de Lara 
5395e4dc74cSPablo de Lara         return 1;
5405e4dc74cSPablo de Lara }
5415e4dc74cSPablo de Lara 
5425e4dc74cSPablo de Lara static int
_aes_xts_self_test(void)5435e4dc74cSPablo de Lara _aes_xts_self_test(void)
5445e4dc74cSPablo de Lara {
5455e4dc74cSPablo de Lara         for (uint32_t i = 0; i < DIM(xts_vectors); i++) {
5465e4dc74cSPablo de Lara                 const struct self_test_xts_vector *v = &xts_vectors[i];
5475e4dc74cSPablo de Lara 
5485e4dc74cSPablo de Lara                 if (xts_self_test_vector(v) == 0)
5495e4dc74cSPablo de Lara                         return 1;
5505e4dc74cSPablo de Lara         }
5515e4dc74cSPablo de Lara 
5525e4dc74cSPablo de Lara         return 0;
5535e4dc74cSPablo de Lara }
5545e4dc74cSPablo de Lara 
555ae502d05SPablo de Lara #define ADD_GCM_VECTOR(_key, _iv, _plain, _cipher, _aad, _tag, _descr)                             \
55672e78736SMarcel Cornu         { _key, sizeof(_key), _iv,  _plain,       sizeof(_plain), _cipher,                         \
55772e78736SMarcel Cornu           _aad, sizeof(_aad), _tag, sizeof(_tag), _descr }
558ae502d05SPablo de Lara 
559ae502d05SPablo de Lara static const struct self_test_gcm_vector gcm_vectors[] = {
560ae502d05SPablo de Lara         ADD_GCM_VECTOR(aes_gcm_128_key, aes_gcm_128_iv, aes_gcm_128_plaintext,
561ae502d05SPablo de Lara                        aes_gcm_128_ciphertext, aes_gcm_128_aad, aes_gcm_128_tag, "AES128-GCM"),
562ae502d05SPablo de Lara         ADD_GCM_VECTOR(aes_gcm_256_key, aes_gcm_256_iv, aes_gcm_256_plaintext,
563ae502d05SPablo de Lara                        aes_gcm_256_ciphertext, aes_gcm_256_aad, aes_gcm_256_tag, "AES256-GCM"),
564ae502d05SPablo de Lara };
565ae502d05SPablo de Lara 
566ae502d05SPablo de Lara static int
gcm_self_test_vector(const struct self_test_gcm_vector * v)567ae502d05SPablo de Lara gcm_self_test_vector(const struct self_test_gcm_vector *v)
568ae502d05SPablo de Lara {
569*5e6526eeSMarcel Cornu         struct isal_gcm_key_data gkey;
570*5e6526eeSMarcel Cornu         struct isal_gcm_context_data gctx;
571ae502d05SPablo de Lara         uint8_t scratch[512];
572ae502d05SPablo de Lara         uint8_t result_tag[16];
573ae502d05SPablo de Lara 
574ae502d05SPablo de Lara         /* message too long */
575ae502d05SPablo de Lara         if (v->plaintext_size > sizeof(scratch))
576ae502d05SPablo de Lara                 return 0;
577ae502d05SPablo de Lara 
578ae502d05SPablo de Lara         /* Precompute AES and GHASH keys */
579ae502d05SPablo de Lara         switch (v->cipher_key_size) {
580ae502d05SPablo de Lara         case 16:
58169a73acfSTomasz Kantecki                 _aes_gcm_pre_128(v->key, &gkey);
582ae502d05SPablo de Lara                 break;
583ae502d05SPablo de Lara         case 32:
58469a73acfSTomasz Kantecki                 _aes_gcm_pre_256(v->key, &gkey);
585ae502d05SPablo de Lara                 break;
586ae502d05SPablo de Lara         default:
587ae502d05SPablo de Lara                 /* invalid key size */
588ae502d05SPablo de Lara                 return 0;
589ae502d05SPablo de Lara         }
590ae502d05SPablo de Lara 
591ae502d05SPablo de Lara         /* test encrypt direction (single call API) */
592ae502d05SPablo de Lara         memset(scratch, 0, sizeof(scratch));
593ae502d05SPablo de Lara         memcpy(scratch, v->plaintext, v->plaintext_size);
594ae502d05SPablo de Lara         switch (v->cipher_key_size) {
595ae502d05SPablo de Lara         case 16:
59669a73acfSTomasz Kantecki                 _aes_gcm_enc_128(&gkey, &gctx, scratch, scratch, v->plaintext_size, v->cipher_iv,
597ae502d05SPablo de Lara                                  v->aad, v->aad_size, result_tag, v->tag_size);
598ae502d05SPablo de Lara                 break;
599ae502d05SPablo de Lara         case 32:
60069a73acfSTomasz Kantecki                 _aes_gcm_enc_256(&gkey, &gctx, scratch, scratch, v->plaintext_size, v->cipher_iv,
601ae502d05SPablo de Lara                                  v->aad, v->aad_size, result_tag, v->tag_size);
602ae502d05SPablo de Lara                 break;
603ae502d05SPablo de Lara         default:
604ae502d05SPablo de Lara                 /* invalid key size */
605ae502d05SPablo de Lara                 return 0;
606ae502d05SPablo de Lara         }
607ae502d05SPablo de Lara 
608ae502d05SPablo de Lara         /* check for ciphertext mismatch */
609ae502d05SPablo de Lara         if (memcmp(scratch, v->ciphertext, v->plaintext_size))
610ae502d05SPablo de Lara                 return 0;
611ae502d05SPablo de Lara 
612ae502d05SPablo de Lara         /* check for authentication tag mismatch */
613ae502d05SPablo de Lara         if (memcmp(result_tag, v->tag, v->tag_size))
614ae502d05SPablo de Lara                 return 0;
615ae502d05SPablo de Lara 
616ae502d05SPablo de Lara         /* test encrypt direction (multi-call API) */
617ae502d05SPablo de Lara         memset(scratch, 0, sizeof(scratch));
618ae502d05SPablo de Lara         memcpy(scratch, v->plaintext, v->plaintext_size);
619ae502d05SPablo de Lara         switch (v->cipher_key_size) {
620ae502d05SPablo de Lara         case 16:
62169a73acfSTomasz Kantecki                 _aes_gcm_init_128(&gkey, &gctx, v->cipher_iv, v->aad, v->aad_size);
62269a73acfSTomasz Kantecki                 _aes_gcm_enc_128_update(&gkey, &gctx, scratch, scratch, v->plaintext_size);
62369a73acfSTomasz Kantecki                 _aes_gcm_enc_128_finalize(&gkey, &gctx, v->tag, v->tag_size);
624ae502d05SPablo de Lara                 break;
625ae502d05SPablo de Lara         case 32:
62669a73acfSTomasz Kantecki                 _aes_gcm_init_256(&gkey, &gctx, v->cipher_iv, v->aad, v->aad_size);
62769a73acfSTomasz Kantecki                 _aes_gcm_enc_256_update(&gkey, &gctx, scratch, scratch, v->plaintext_size);
62869a73acfSTomasz Kantecki                 _aes_gcm_enc_256_finalize(&gkey, &gctx, v->tag, v->tag_size);
629ae502d05SPablo de Lara                 break;
630ae502d05SPablo de Lara         default:
631ae502d05SPablo de Lara                 /* invalid key size */
632ae502d05SPablo de Lara                 return 0;
633ae502d05SPablo de Lara         }
634ae502d05SPablo de Lara 
635ae502d05SPablo de Lara         /* check for ciphertext mismatch */
636ae502d05SPablo de Lara         if (memcmp(scratch, v->ciphertext, v->plaintext_size))
637ae502d05SPablo de Lara                 return 0;
638ae502d05SPablo de Lara 
639ae502d05SPablo de Lara         /* check for authentication tag mismatch */
640ae502d05SPablo de Lara         if (memcmp(result_tag, v->tag, v->tag_size))
641ae502d05SPablo de Lara                 return 0;
642ae502d05SPablo de Lara 
643ae502d05SPablo de Lara         /* test decrypt direction (single-call API) */
644ae502d05SPablo de Lara         memset(scratch, 0, sizeof(scratch));
645ae502d05SPablo de Lara         memcpy(scratch, v->ciphertext, v->plaintext_size);
646ae502d05SPablo de Lara 
647ae502d05SPablo de Lara         switch (v->cipher_key_size) {
648ae502d05SPablo de Lara         case 16:
64969a73acfSTomasz Kantecki                 _aes_gcm_dec_128(&gkey, &gctx, scratch, scratch, v->plaintext_size, v->cipher_iv,
650ae502d05SPablo de Lara                                  v->aad, v->aad_size, result_tag, v->tag_size);
651ae502d05SPablo de Lara                 break;
652ae502d05SPablo de Lara         case 32:
65369a73acfSTomasz Kantecki                 _aes_gcm_dec_256(&gkey, &gctx, scratch, scratch, v->plaintext_size, v->cipher_iv,
654ae502d05SPablo de Lara                                  v->aad, v->aad_size, result_tag, v->tag_size);
655ae502d05SPablo de Lara                 break;
656ae502d05SPablo de Lara         default:
657ae502d05SPablo de Lara                 /* invalid key size */
658ae502d05SPablo de Lara                 return 0;
659ae502d05SPablo de Lara         }
660ae502d05SPablo de Lara 
661ae502d05SPablo de Lara         /* check for plaintext mismatch */
662ae502d05SPablo de Lara         if (memcmp(scratch, v->plaintext, v->plaintext_size))
663ae502d05SPablo de Lara                 return 0;
664ae502d05SPablo de Lara 
665ae502d05SPablo de Lara         /* check for authentication tag mismatch */
666ae502d05SPablo de Lara         if (memcmp(result_tag, v->tag, v->tag_size))
667ae502d05SPablo de Lara                 return 0;
668ae502d05SPablo de Lara 
669ae502d05SPablo de Lara         /* test decrypt direction (multi-call API) */
670ae502d05SPablo de Lara         memset(scratch, 0, sizeof(scratch));
671ae502d05SPablo de Lara         memcpy(scratch, v->ciphertext, v->plaintext_size);
672ae502d05SPablo de Lara         switch (v->cipher_key_size) {
673ae502d05SPablo de Lara         case 16:
67469a73acfSTomasz Kantecki                 _aes_gcm_init_128(&gkey, &gctx, v->cipher_iv, v->aad, v->aad_size);
67569a73acfSTomasz Kantecki                 _aes_gcm_dec_128_update(&gkey, &gctx, scratch, scratch, v->plaintext_size);
67669a73acfSTomasz Kantecki                 _aes_gcm_dec_128_finalize(&gkey, &gctx, v->tag, v->tag_size);
677ae502d05SPablo de Lara                 break;
678ae502d05SPablo de Lara         case 32:
67969a73acfSTomasz Kantecki                 _aes_gcm_init_256(&gkey, &gctx, v->cipher_iv, v->aad, v->aad_size);
68069a73acfSTomasz Kantecki                 _aes_gcm_dec_256_update(&gkey, &gctx, scratch, scratch, v->plaintext_size);
68169a73acfSTomasz Kantecki                 _aes_gcm_dec_256_finalize(&gkey, &gctx, v->tag, v->tag_size);
682ae502d05SPablo de Lara                 break;
683ae502d05SPablo de Lara         default:
684ae502d05SPablo de Lara                 /* invalid key size */
685ae502d05SPablo de Lara                 return 0;
686ae502d05SPablo de Lara         }
687ae502d05SPablo de Lara 
688ae502d05SPablo de Lara         /* check for plaintext mismatch */
689ae502d05SPablo de Lara         if (memcmp(scratch, v->plaintext, v->plaintext_size))
690ae502d05SPablo de Lara                 return 0;
691ae502d05SPablo de Lara 
692ae502d05SPablo de Lara         /* check for authentication tag mismatch */
693ae502d05SPablo de Lara         if (memcmp(result_tag, v->tag, v->tag_size))
694ae502d05SPablo de Lara                 return 0;
695ae502d05SPablo de Lara 
696ae502d05SPablo de Lara         return 1;
697ae502d05SPablo de Lara }
698ae502d05SPablo de Lara 
699ae502d05SPablo de Lara static int
_aes_gcm_self_test(void)700ae502d05SPablo de Lara _aes_gcm_self_test(void)
701ae502d05SPablo de Lara {
702ae502d05SPablo de Lara         for (unsigned i = 0; i < DIM(gcm_vectors); i++) {
703ae502d05SPablo de Lara                 const struct self_test_gcm_vector *v = &gcm_vectors[i];
704ae502d05SPablo de Lara 
705ae502d05SPablo de Lara                 if (gcm_self_test_vector(v) == 0)
706ae502d05SPablo de Lara                         return 1;
707ae502d05SPablo de Lara         }
708ae502d05SPablo de Lara 
709ae502d05SPablo de Lara         return 0;
710ae502d05SPablo de Lara }
711ae502d05SPablo de Lara 
7125e4dc74cSPablo de Lara int
_aes_self_tests(void)7135e4dc74cSPablo de Lara _aes_self_tests(void)
7145e4dc74cSPablo de Lara {
7155e4dc74cSPablo de Lara         int ret;
7165e4dc74cSPablo de Lara 
7175e4dc74cSPablo de Lara         ret = _aes_cbc_self_test();
718ae502d05SPablo de Lara         ret |= _aes_xts_self_test();
719ae502d05SPablo de Lara         ret |= _aes_gcm_self_test();
7205e4dc74cSPablo de Lara 
7215e4dc74cSPablo de Lara         return ret;
7225e4dc74cSPablo de Lara }
723