quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

aes.c (78798B)


      1 /*
      2  *  FIPS-197 compliant AES implementation
      3  *
      4  *  Copyright The Mbed TLS Contributors
      5  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
      6  */
      7 /*
      8  *  The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
      9  *
     10  *  https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf
     11  *  http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
     12  */
     13 
     14 #include "common.h"
     15 
     16 #if defined(MBEDTLS_AES_C)
     17 
     18 #include <string.h>
     19 
     20 #include "mbedtls/aes.h"
     21 #include "mbedtls/platform.h"
     22 #include "mbedtls/platform_util.h"
     23 #include "mbedtls/error.h"
     24 
     25 #if defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
     26 #if !((defined(MBEDTLS_ARCH_IS_ARMV8_A) && defined(MBEDTLS_AESCE_C)) || \
     27     (defined(MBEDTLS_ARCH_IS_X64)       && defined(MBEDTLS_AESNI_C)) || \
     28     (defined(MBEDTLS_ARCH_IS_X86)       && defined(MBEDTLS_AESNI_C)))
     29 #error "MBEDTLS_AES_USE_HARDWARE_ONLY defined, but not all prerequisites"
     30 #endif
     31 #endif
     32 
     33 #if defined(MBEDTLS_ARCH_IS_X86)
     34 #if defined(MBEDTLS_PADLOCK_C)
     35 #if !defined(MBEDTLS_HAVE_ASM)
     36 #error "MBEDTLS_PADLOCK_C defined, but not all prerequisites"
     37 #endif
     38 #if defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
     39 #error "MBEDTLS_AES_USE_HARDWARE_ONLY cannot be defined when " \
     40     "MBEDTLS_PADLOCK_C is set"
     41 #endif
     42 #endif
     43 #endif
     44 
     45 #if defined(MBEDTLS_PADLOCK_C)
     46 #include "padlock.h"
     47 #endif
     48 #if defined(MBEDTLS_AESNI_C)
     49 #include "aesni.h"
     50 #endif
     51 #if defined(MBEDTLS_AESCE_C)
     52 #include "aesce.h"
     53 #endif
     54 
     55 #include "mbedtls/platform.h"
     56 #include "ctr.h"
     57 
     58 /*
     59  * This is a convenience shorthand macro to check if we need reverse S-box and
     60  * reverse tables. It's private and only defined in this file.
     61  */
     62 #if (!defined(MBEDTLS_AES_DECRYPT_ALT) || \
     63     (!defined(MBEDTLS_AES_SETKEY_DEC_ALT) && !defined(MBEDTLS_AES_USE_HARDWARE_ONLY))) && \
     64     !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
     65 #define MBEDTLS_AES_NEED_REVERSE_TABLES
     66 #endif
     67 
     68 #if !defined(MBEDTLS_AES_ALT)
     69 
     70 #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
     71 static int aes_padlock_ace = -1;
     72 #endif
     73 
     74 #if defined(MBEDTLS_AES_ROM_TABLES)
     75 /*
     76  * Forward S-box
     77  */
     78 MBEDTLS_MAYBE_UNUSED static const unsigned char FSb[256] =
     79 {
     80     0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
     81     0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
     82     0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
     83     0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
     84     0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
     85     0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
     86     0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
     87     0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
     88     0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
     89     0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
     90     0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
     91     0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
     92     0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
     93     0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
     94     0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
     95     0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
     96     0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
     97     0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
     98     0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
     99     0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
    100     0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
    101     0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
    102     0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
    103     0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
    104     0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
    105     0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
    106     0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
    107     0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
    108     0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
    109     0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
    110     0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
    111     0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
    112 };
    113 
    114 /*
    115  * Forward tables
    116  */
    117 #define FT \
    118 \
    119     V(A5, 63, 63, C6), V(84, 7C, 7C, F8), V(99, 77, 77, EE), V(8D, 7B, 7B, F6), \
    120     V(0D, F2, F2, FF), V(BD, 6B, 6B, D6), V(B1, 6F, 6F, DE), V(54, C5, C5, 91), \
    121     V(50, 30, 30, 60), V(03, 01, 01, 02), V(A9, 67, 67, CE), V(7D, 2B, 2B, 56), \
    122     V(19, FE, FE, E7), V(62, D7, D7, B5), V(E6, AB, AB, 4D), V(9A, 76, 76, EC), \
    123     V(45, CA, CA, 8F), V(9D, 82, 82, 1F), V(40, C9, C9, 89), V(87, 7D, 7D, FA), \
    124     V(15, FA, FA, EF), V(EB, 59, 59, B2), V(C9, 47, 47, 8E), V(0B, F0, F0, FB), \
    125     V(EC, AD, AD, 41), V(67, D4, D4, B3), V(FD, A2, A2, 5F), V(EA, AF, AF, 45), \
    126     V(BF, 9C, 9C, 23), V(F7, A4, A4, 53), V(96, 72, 72, E4), V(5B, C0, C0, 9B), \
    127     V(C2, B7, B7, 75), V(1C, FD, FD, E1), V(AE, 93, 93, 3D), V(6A, 26, 26, 4C), \
    128     V(5A, 36, 36, 6C), V(41, 3F, 3F, 7E), V(02, F7, F7, F5), V(4F, CC, CC, 83), \
    129     V(5C, 34, 34, 68), V(F4, A5, A5, 51), V(34, E5, E5, D1), V(08, F1, F1, F9), \
    130     V(93, 71, 71, E2), V(73, D8, D8, AB), V(53, 31, 31, 62), V(3F, 15, 15, 2A), \
    131     V(0C, 04, 04, 08), V(52, C7, C7, 95), V(65, 23, 23, 46), V(5E, C3, C3, 9D), \
    132     V(28, 18, 18, 30), V(A1, 96, 96, 37), V(0F, 05, 05, 0A), V(B5, 9A, 9A, 2F), \
    133     V(09, 07, 07, 0E), V(36, 12, 12, 24), V(9B, 80, 80, 1B), V(3D, E2, E2, DF), \
    134     V(26, EB, EB, CD), V(69, 27, 27, 4E), V(CD, B2, B2, 7F), V(9F, 75, 75, EA), \
    135     V(1B, 09, 09, 12), V(9E, 83, 83, 1D), V(74, 2C, 2C, 58), V(2E, 1A, 1A, 34), \
    136     V(2D, 1B, 1B, 36), V(B2, 6E, 6E, DC), V(EE, 5A, 5A, B4), V(FB, A0, A0, 5B), \
    137     V(F6, 52, 52, A4), V(4D, 3B, 3B, 76), V(61, D6, D6, B7), V(CE, B3, B3, 7D), \
    138     V(7B, 29, 29, 52), V(3E, E3, E3, DD), V(71, 2F, 2F, 5E), V(97, 84, 84, 13), \
    139     V(F5, 53, 53, A6), V(68, D1, D1, B9), V(00, 00, 00, 00), V(2C, ED, ED, C1), \
    140     V(60, 20, 20, 40), V(1F, FC, FC, E3), V(C8, B1, B1, 79), V(ED, 5B, 5B, B6), \
    141     V(BE, 6A, 6A, D4), V(46, CB, CB, 8D), V(D9, BE, BE, 67), V(4B, 39, 39, 72), \
    142     V(DE, 4A, 4A, 94), V(D4, 4C, 4C, 98), V(E8, 58, 58, B0), V(4A, CF, CF, 85), \
    143     V(6B, D0, D0, BB), V(2A, EF, EF, C5), V(E5, AA, AA, 4F), V(16, FB, FB, ED), \
    144     V(C5, 43, 43, 86), V(D7, 4D, 4D, 9A), V(55, 33, 33, 66), V(94, 85, 85, 11), \
    145     V(CF, 45, 45, 8A), V(10, F9, F9, E9), V(06, 02, 02, 04), V(81, 7F, 7F, FE), \
    146     V(F0, 50, 50, A0), V(44, 3C, 3C, 78), V(BA, 9F, 9F, 25), V(E3, A8, A8, 4B), \
    147     V(F3, 51, 51, A2), V(FE, A3, A3, 5D), V(C0, 40, 40, 80), V(8A, 8F, 8F, 05), \
    148     V(AD, 92, 92, 3F), V(BC, 9D, 9D, 21), V(48, 38, 38, 70), V(04, F5, F5, F1), \
    149     V(DF, BC, BC, 63), V(C1, B6, B6, 77), V(75, DA, DA, AF), V(63, 21, 21, 42), \
    150     V(30, 10, 10, 20), V(1A, FF, FF, E5), V(0E, F3, F3, FD), V(6D, D2, D2, BF), \
    151     V(4C, CD, CD, 81), V(14, 0C, 0C, 18), V(35, 13, 13, 26), V(2F, EC, EC, C3), \
    152     V(E1, 5F, 5F, BE), V(A2, 97, 97, 35), V(CC, 44, 44, 88), V(39, 17, 17, 2E), \
    153     V(57, C4, C4, 93), V(F2, A7, A7, 55), V(82, 7E, 7E, FC), V(47, 3D, 3D, 7A), \
    154     V(AC, 64, 64, C8), V(E7, 5D, 5D, BA), V(2B, 19, 19, 32), V(95, 73, 73, E6), \
    155     V(A0, 60, 60, C0), V(98, 81, 81, 19), V(D1, 4F, 4F, 9E), V(7F, DC, DC, A3), \
    156     V(66, 22, 22, 44), V(7E, 2A, 2A, 54), V(AB, 90, 90, 3B), V(83, 88, 88, 0B), \
    157     V(CA, 46, 46, 8C), V(29, EE, EE, C7), V(D3, B8, B8, 6B), V(3C, 14, 14, 28), \
    158     V(79, DE, DE, A7), V(E2, 5E, 5E, BC), V(1D, 0B, 0B, 16), V(76, DB, DB, AD), \
    159     V(3B, E0, E0, DB), V(56, 32, 32, 64), V(4E, 3A, 3A, 74), V(1E, 0A, 0A, 14), \
    160     V(DB, 49, 49, 92), V(0A, 06, 06, 0C), V(6C, 24, 24, 48), V(E4, 5C, 5C, B8), \
    161     V(5D, C2, C2, 9F), V(6E, D3, D3, BD), V(EF, AC, AC, 43), V(A6, 62, 62, C4), \
    162     V(A8, 91, 91, 39), V(A4, 95, 95, 31), V(37, E4, E4, D3), V(8B, 79, 79, F2), \
    163     V(32, E7, E7, D5), V(43, C8, C8, 8B), V(59, 37, 37, 6E), V(B7, 6D, 6D, DA), \
    164     V(8C, 8D, 8D, 01), V(64, D5, D5, B1), V(D2, 4E, 4E, 9C), V(E0, A9, A9, 49), \
    165     V(B4, 6C, 6C, D8), V(FA, 56, 56, AC), V(07, F4, F4, F3), V(25, EA, EA, CF), \
    166     V(AF, 65, 65, CA), V(8E, 7A, 7A, F4), V(E9, AE, AE, 47), V(18, 08, 08, 10), \
    167     V(D5, BA, BA, 6F), V(88, 78, 78, F0), V(6F, 25, 25, 4A), V(72, 2E, 2E, 5C), \
    168     V(24, 1C, 1C, 38), V(F1, A6, A6, 57), V(C7, B4, B4, 73), V(51, C6, C6, 97), \
    169     V(23, E8, E8, CB), V(7C, DD, DD, A1), V(9C, 74, 74, E8), V(21, 1F, 1F, 3E), \
    170     V(DD, 4B, 4B, 96), V(DC, BD, BD, 61), V(86, 8B, 8B, 0D), V(85, 8A, 8A, 0F), \
    171     V(90, 70, 70, E0), V(42, 3E, 3E, 7C), V(C4, B5, B5, 71), V(AA, 66, 66, CC), \
    172     V(D8, 48, 48, 90), V(05, 03, 03, 06), V(01, F6, F6, F7), V(12, 0E, 0E, 1C), \
    173     V(A3, 61, 61, C2), V(5F, 35, 35, 6A), V(F9, 57, 57, AE), V(D0, B9, B9, 69), \
    174     V(91, 86, 86, 17), V(58, C1, C1, 99), V(27, 1D, 1D, 3A), V(B9, 9E, 9E, 27), \
    175     V(38, E1, E1, D9), V(13, F8, F8, EB), V(B3, 98, 98, 2B), V(33, 11, 11, 22), \
    176     V(BB, 69, 69, D2), V(70, D9, D9, A9), V(89, 8E, 8E, 07), V(A7, 94, 94, 33), \
    177     V(B6, 9B, 9B, 2D), V(22, 1E, 1E, 3C), V(92, 87, 87, 15), V(20, E9, E9, C9), \
    178     V(49, CE, CE, 87), V(FF, 55, 55, AA), V(78, 28, 28, 50), V(7A, DF, DF, A5), \
    179     V(8F, 8C, 8C, 03), V(F8, A1, A1, 59), V(80, 89, 89, 09), V(17, 0D, 0D, 1A), \
    180     V(DA, BF, BF, 65), V(31, E6, E6, D7), V(C6, 42, 42, 84), V(B8, 68, 68, D0), \
    181     V(C3, 41, 41, 82), V(B0, 99, 99, 29), V(77, 2D, 2D, 5A), V(11, 0F, 0F, 1E), \
    182     V(CB, B0, B0, 7B), V(FC, 54, 54, A8), V(D6, BB, BB, 6D), V(3A, 16, 16, 2C)
    183 
    184 #define V(a, b, c, d) 0x##a##b##c##d
    185 MBEDTLS_MAYBE_UNUSED static const uint32_t FT0[256] = { FT };
    186 #undef V
    187 
    188 #define V(a, b, c, d) 0x##b##c##d##a
    189 MBEDTLS_MAYBE_UNUSED static const uint32_t FT1[256] = { FT };
    190 #undef V
    191 
    192 #define V(a, b, c, d) 0x##c##d##a##b
    193 MBEDTLS_MAYBE_UNUSED static const uint32_t FT2[256] = { FT };
    194 #undef V
    195 
    196 #define V(a, b, c, d) 0x##d##a##b##c
    197 MBEDTLS_MAYBE_UNUSED static const uint32_t FT3[256] = { FT };
    198 #undef V
    199 
    200 #undef FT
    201 
    202 /*
    203  * Reverse S-box
    204  */
    205 MBEDTLS_MAYBE_UNUSED static const unsigned char RSb[256] =
    206 {
    207     0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
    208     0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
    209     0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
    210     0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
    211     0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
    212     0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
    213     0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
    214     0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
    215     0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
    216     0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
    217     0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
    218     0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
    219     0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
    220     0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
    221     0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
    222     0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
    223     0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
    224     0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
    225     0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
    226     0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
    227     0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
    228     0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
    229     0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
    230     0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
    231     0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
    232     0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
    233     0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
    234     0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
    235     0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
    236     0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
    237     0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
    238     0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
    239 };
    240 
    241 /*
    242  * Reverse tables
    243  */
    244 #define RT \
    245 \
    246     V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
    247     V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
    248     V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
    249     V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
    250     V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
    251     V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
    252     V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
    253     V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
    254     V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
    255     V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
    256     V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
    257     V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
    258     V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
    259     V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
    260     V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
    261     V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
    262     V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
    263     V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
    264     V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
    265     V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
    266     V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
    267     V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
    268     V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
    269     V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
    270     V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
    271     V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
    272     V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
    273     V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
    274     V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
    275     V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
    276     V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
    277     V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
    278     V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
    279     V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
    280     V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
    281     V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
    282     V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
    283     V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
    284     V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
    285     V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
    286     V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
    287     V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
    288     V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
    289     V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
    290     V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
    291     V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
    292     V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
    293     V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
    294     V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
    295     V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
    296     V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
    297     V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
    298     V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
    299     V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
    300     V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
    301     V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
    302     V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
    303     V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
    304     V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
    305     V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
    306     V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
    307     V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
    308     V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
    309     V(61, 84, CB, 7B), V(70, B6, 32, D5), V(74, 5C, 6C, 48), V(42, 57, B8, D0)
    310 
    311 
    312 #define V(a, b, c, d) 0x##a##b##c##d
    313 MBEDTLS_MAYBE_UNUSED static const uint32_t RT0[256] = { RT };
    314 #undef V
    315 
    316 #define V(a, b, c, d) 0x##b##c##d##a
    317 MBEDTLS_MAYBE_UNUSED static const uint32_t RT1[256] = { RT };
    318 #undef V
    319 
    320 #define V(a, b, c, d) 0x##c##d##a##b
    321 MBEDTLS_MAYBE_UNUSED static const uint32_t RT2[256] = { RT };
    322 #undef V
    323 
    324 #define V(a, b, c, d) 0x##d##a##b##c
    325 MBEDTLS_MAYBE_UNUSED static const uint32_t RT3[256] = { RT };
    326 #undef V
    327 
    328 #undef RT
    329 
    330 /*
    331  * Round constants
    332  */
    333 MBEDTLS_MAYBE_UNUSED static const uint32_t round_constants[10] =
    334 {
    335     0x00000001, 0x00000002, 0x00000004, 0x00000008,
    336     0x00000010, 0x00000020, 0x00000040, 0x00000080,
    337     0x0000001B, 0x00000036
    338 };
    339 
    340 #else /* MBEDTLS_AES_ROM_TABLES */
    341 
    342 /*
    343  * Forward S-box & tables
    344  */
    345 MBEDTLS_MAYBE_UNUSED static unsigned char FSb[256];
    346 MBEDTLS_MAYBE_UNUSED static uint32_t FT0[256];
    347 MBEDTLS_MAYBE_UNUSED static uint32_t FT1[256];
    348 MBEDTLS_MAYBE_UNUSED static uint32_t FT2[256];
    349 MBEDTLS_MAYBE_UNUSED static uint32_t FT3[256];
    350 
    351 /*
    352  * Reverse S-box & tables
    353  */
    354 MBEDTLS_MAYBE_UNUSED static unsigned char RSb[256];
    355 
    356 MBEDTLS_MAYBE_UNUSED static uint32_t RT0[256];
    357 MBEDTLS_MAYBE_UNUSED static uint32_t RT1[256];
    358 MBEDTLS_MAYBE_UNUSED static uint32_t RT2[256];
    359 MBEDTLS_MAYBE_UNUSED static uint32_t RT3[256];
    360 
    361 /*
    362  * Round constants
    363  */
    364 MBEDTLS_MAYBE_UNUSED static uint32_t round_constants[10];
    365 
    366 /*
    367  * Tables generation code
    368  */
    369 #define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
    370 #define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
    371 #define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
    372 
    373 MBEDTLS_MAYBE_UNUSED static int aes_init_done = 0;
    374 
    375 MBEDTLS_MAYBE_UNUSED static void aes_gen_tables(void)
    376 {
    377     int i;
    378     uint8_t x, y, z;
    379     uint8_t pow[256];
    380     uint8_t log[256];
    381 
    382     /*
    383      * compute pow and log tables over GF(2^8)
    384      */
    385     for (i = 0, x = 1; i < 256; i++) {
    386         pow[i] = x;
    387         log[x] = (uint8_t) i;
    388         x ^= XTIME(x);
    389     }
    390 
    391     /*
    392      * calculate the round constants
    393      */
    394     for (i = 0, x = 1; i < 10; i++) {
    395         round_constants[i] = x;
    396         x = XTIME(x);
    397     }
    398 
    399     /*
    400      * generate the forward and reverse S-boxes
    401      */
    402     FSb[0x00] = 0x63;
    403 #if defined(MBEDTLS_AES_NEED_REVERSE_TABLES)
    404     RSb[0x63] = 0x00;
    405 #endif
    406 
    407     for (i = 1; i < 256; i++) {
    408         x = pow[255 - log[i]];
    409 
    410         y  = x; y = (y << 1) | (y >> 7);
    411         x ^= y; y = (y << 1) | (y >> 7);
    412         x ^= y; y = (y << 1) | (y >> 7);
    413         x ^= y; y = (y << 1) | (y >> 7);
    414         x ^= y ^ 0x63;
    415 
    416         FSb[i] = x;
    417 #if defined(MBEDTLS_AES_NEED_REVERSE_TABLES)
    418         RSb[x] = (unsigned char) i;
    419 #endif
    420     }
    421 
    422     /*
    423      * generate the forward and reverse tables
    424      */
    425     for (i = 0; i < 256; i++) {
    426         x = FSb[i];
    427         y = XTIME(x);
    428         z = y ^ x;
    429 
    430         FT0[i] = ((uint32_t) y) ^
    431                  ((uint32_t) x <<  8) ^
    432                  ((uint32_t) x << 16) ^
    433                  ((uint32_t) z << 24);
    434 
    435 #if !defined(MBEDTLS_AES_FEWER_TABLES)
    436         FT1[i] = ROTL8(FT0[i]);
    437         FT2[i] = ROTL8(FT1[i]);
    438         FT3[i] = ROTL8(FT2[i]);
    439 #endif /* !MBEDTLS_AES_FEWER_TABLES */
    440 
    441 #if defined(MBEDTLS_AES_NEED_REVERSE_TABLES)
    442         x = RSb[i];
    443 
    444         RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
    445                  ((uint32_t) MUL(0x09, x) <<  8) ^
    446                  ((uint32_t) MUL(0x0D, x) << 16) ^
    447                  ((uint32_t) MUL(0x0B, x) << 24);
    448 
    449 #if !defined(MBEDTLS_AES_FEWER_TABLES)
    450         RT1[i] = ROTL8(RT0[i]);
    451         RT2[i] = ROTL8(RT1[i]);
    452         RT3[i] = ROTL8(RT2[i]);
    453 #endif /* !MBEDTLS_AES_FEWER_TABLES */
    454 #endif /* MBEDTLS_AES_NEED_REVERSE_TABLES */
    455     }
    456 }
    457 
    458 #undef ROTL8
    459 
    460 #endif /* MBEDTLS_AES_ROM_TABLES */
    461 
    462 #if defined(MBEDTLS_AES_FEWER_TABLES)
    463 
    464 #define ROTL8(x)  ((uint32_t) ((x) <<  8) + (uint32_t) ((x) >> 24))
    465 #define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
    466 #define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >>  8))
    467 
    468 #define AES_RT0(idx) RT0[idx]
    469 #define AES_RT1(idx) ROTL8(RT0[idx])
    470 #define AES_RT2(idx) ROTL16(RT0[idx])
    471 #define AES_RT3(idx) ROTL24(RT0[idx])
    472 
    473 #define AES_FT0(idx) FT0[idx]
    474 #define AES_FT1(idx) ROTL8(FT0[idx])
    475 #define AES_FT2(idx) ROTL16(FT0[idx])
    476 #define AES_FT3(idx) ROTL24(FT0[idx])
    477 
    478 #else /* MBEDTLS_AES_FEWER_TABLES */
    479 
    480 #define AES_RT0(idx) RT0[idx]
    481 #define AES_RT1(idx) RT1[idx]
    482 #define AES_RT2(idx) RT2[idx]
    483 #define AES_RT3(idx) RT3[idx]
    484 
    485 #define AES_FT0(idx) FT0[idx]
    486 #define AES_FT1(idx) FT1[idx]
    487 #define AES_FT2(idx) FT2[idx]
    488 #define AES_FT3(idx) FT3[idx]
    489 
    490 #endif /* MBEDTLS_AES_FEWER_TABLES */
    491 
    492 void mbedtls_aes_init(mbedtls_aes_context *ctx)
    493 {
    494     memset(ctx, 0, sizeof(mbedtls_aes_context));
    495 }
    496 
    497 void mbedtls_aes_free(mbedtls_aes_context *ctx)
    498 {
    499     if (ctx == NULL) {
    500         return;
    501     }
    502 
    503     mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
    504 }
    505 
    506 #if defined(MBEDTLS_CIPHER_MODE_XTS)
    507 void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
    508 {
    509     mbedtls_aes_init(&ctx->crypt);
    510     mbedtls_aes_init(&ctx->tweak);
    511 }
    512 
    513 void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
    514 {
    515     if (ctx == NULL) {
    516         return;
    517     }
    518 
    519     mbedtls_aes_free(&ctx->crypt);
    520     mbedtls_aes_free(&ctx->tweak);
    521 }
    522 #endif /* MBEDTLS_CIPHER_MODE_XTS */
    523 
    524 /* Some implementations need the round keys to be aligned.
    525  * Return an offset to be added to buf, such that (buf + offset) is
    526  * correctly aligned.
    527  * Note that the offset is in units of elements of buf, i.e. 32-bit words,
    528  * i.e. an offset of 1 means 4 bytes and so on.
    529  */
    530 #if (defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)) ||        \
    531     (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
    532 #define MAY_NEED_TO_ALIGN
    533 #endif
    534 
    535 MBEDTLS_MAYBE_UNUSED static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
    536 {
    537 #if defined(MAY_NEED_TO_ALIGN)
    538     int align_16_bytes = 0;
    539 
    540 #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
    541     if (aes_padlock_ace == -1) {
    542         aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
    543     }
    544     if (aes_padlock_ace) {
    545         align_16_bytes = 1;
    546     }
    547 #endif
    548 
    549 #if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
    550     if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
    551         align_16_bytes = 1;
    552     }
    553 #endif
    554 
    555     if (align_16_bytes) {
    556         /* These implementations needs 16-byte alignment
    557          * for the round key array. */
    558         unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
    559         if (delta == 0) {
    560             return 0;
    561         } else {
    562             return 4 - delta; // 16 bytes = 4 uint32_t
    563         }
    564     }
    565 #else /* MAY_NEED_TO_ALIGN */
    566     (void) buf;
    567 #endif /* MAY_NEED_TO_ALIGN */
    568 
    569     return 0;
    570 }
    571 
    572 /*
    573  * AES key schedule (encryption)
    574  */
    575 #if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
    576 int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
    577                            unsigned int keybits)
    578 {
    579     uint32_t *RK;
    580 
    581     switch (keybits) {
    582         case 128: ctx->nr = 10; break;
    583 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    584         case 192: ctx->nr = 12; break;
    585         case 256: ctx->nr = 14; break;
    586 #endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
    587         default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
    588     }
    589 
    590 #if !defined(MBEDTLS_AES_ROM_TABLES)
    591     if (aes_init_done == 0) {
    592         aes_gen_tables();
    593         aes_init_done = 1;
    594     }
    595 #endif
    596 
    597     ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
    598     RK = ctx->buf + ctx->rk_offset;
    599 
    600 #if defined(MBEDTLS_AESNI_HAVE_CODE)
    601     if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
    602         return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
    603     }
    604 #endif
    605 
    606 #if defined(MBEDTLS_AESCE_HAVE_CODE)
    607     if (MBEDTLS_AESCE_HAS_SUPPORT()) {
    608         return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
    609     }
    610 #endif
    611 
    612 #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
    613     for (unsigned int i = 0; i < (keybits >> 5); i++) {
    614         RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
    615     }
    616 
    617     switch (ctx->nr) {
    618         case 10:
    619 
    620             for (unsigned int i = 0; i < 10; i++, RK += 4) {
    621                 RK[4]  = RK[0] ^ round_constants[i] ^
    622                          ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
    623                          ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] <<  8) ^
    624                          ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
    625                          ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
    626 
    627                 RK[5]  = RK[1] ^ RK[4];
    628                 RK[6]  = RK[2] ^ RK[5];
    629                 RK[7]  = RK[3] ^ RK[6];
    630             }
    631             break;
    632 
    633 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    634         case 12:
    635 
    636             for (unsigned int i = 0; i < 8; i++, RK += 6) {
    637                 RK[6]  = RK[0] ^ round_constants[i] ^
    638                          ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
    639                          ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] <<  8) ^
    640                          ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
    641                          ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
    642 
    643                 RK[7]  = RK[1] ^ RK[6];
    644                 RK[8]  = RK[2] ^ RK[7];
    645                 RK[9]  = RK[3] ^ RK[8];
    646                 RK[10] = RK[4] ^ RK[9];
    647                 RK[11] = RK[5] ^ RK[10];
    648             }
    649             break;
    650 
    651         case 14:
    652 
    653             for (unsigned int i = 0; i < 7; i++, RK += 8) {
    654                 RK[8]  = RK[0] ^ round_constants[i] ^
    655                          ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
    656                          ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] <<  8) ^
    657                          ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
    658                          ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
    659 
    660                 RK[9]  = RK[1] ^ RK[8];
    661                 RK[10] = RK[2] ^ RK[9];
    662                 RK[11] = RK[3] ^ RK[10];
    663 
    664                 RK[12] = RK[4] ^
    665                          ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
    666                          ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] <<  8) ^
    667                          ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
    668                          ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
    669 
    670                 RK[13] = RK[5] ^ RK[12];
    671                 RK[14] = RK[6] ^ RK[13];
    672                 RK[15] = RK[7] ^ RK[14];
    673             }
    674             break;
    675 #endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
    676     }
    677 
    678     return 0;
    679 #endif /* !MBEDTLS_AES_USE_HARDWARE_ONLY */
    680 }
    681 #endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
    682 
    683 /*
    684  * AES key schedule (decryption)
    685  */
    686 #if !defined(MBEDTLS_AES_SETKEY_DEC_ALT) && !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
    687 int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
    688                            unsigned int keybits)
    689 {
    690 #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
    691     uint32_t *SK;
    692 #endif
    693     int ret;
    694     mbedtls_aes_context cty;
    695     uint32_t *RK;
    696 
    697 
    698     mbedtls_aes_init(&cty);
    699 
    700     ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
    701     RK = ctx->buf + ctx->rk_offset;
    702 
    703     /* Also checks keybits */
    704     if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
    705         goto exit;
    706     }
    707 
    708     ctx->nr = cty.nr;
    709 
    710 #if defined(MBEDTLS_AESNI_HAVE_CODE)
    711     if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
    712         mbedtls_aesni_inverse_key((unsigned char *) RK,
    713                                   (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
    714         goto exit;
    715     }
    716 #endif
    717 
    718 #if defined(MBEDTLS_AESCE_HAVE_CODE)
    719     if (MBEDTLS_AESCE_HAS_SUPPORT()) {
    720         mbedtls_aesce_inverse_key(
    721             (unsigned char *) RK,
    722             (const unsigned char *) (cty.buf + cty.rk_offset),
    723             ctx->nr);
    724         goto exit;
    725     }
    726 #endif
    727 
    728 #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
    729     SK = cty.buf + cty.rk_offset + cty.nr * 4;
    730 
    731     *RK++ = *SK++;
    732     *RK++ = *SK++;
    733     *RK++ = *SK++;
    734     *RK++ = *SK++;
    735     SK -= 8;
    736     for (int i = ctx->nr - 1; i > 0; i--, SK -= 8) {
    737         for (int j = 0; j < 4; j++, SK++) {
    738             *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
    739                     AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
    740                     AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
    741                     AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
    742         }
    743     }
    744 
    745     *RK++ = *SK++;
    746     *RK++ = *SK++;
    747     *RK++ = *SK++;
    748     *RK++ = *SK++;
    749 #endif /* !MBEDTLS_AES_USE_HARDWARE_ONLY */
    750 exit:
    751     mbedtls_aes_free(&cty);
    752 
    753     return ret;
    754 }
    755 #endif /* !MBEDTLS_AES_SETKEY_DEC_ALT && !MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
    756 
    757 #if defined(MBEDTLS_CIPHER_MODE_XTS)
    758 static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
    759                                        unsigned int keybits,
    760                                        const unsigned char **key1,
    761                                        unsigned int *key1bits,
    762                                        const unsigned char **key2,
    763                                        unsigned int *key2bits)
    764 {
    765     const unsigned int half_keybits = keybits / 2;
    766     const unsigned int half_keybytes = half_keybits / 8;
    767 
    768     switch (keybits) {
    769         case 256: break;
    770         case 512: break;
    771         default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
    772     }
    773 
    774     *key1bits = half_keybits;
    775     *key2bits = half_keybits;
    776     *key1 = &key[0];
    777     *key2 = &key[half_keybytes];
    778 
    779     return 0;
    780 }
    781 
    782 int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
    783                                const unsigned char *key,
    784                                unsigned int keybits)
    785 {
    786     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    787     const unsigned char *key1, *key2;
    788     unsigned int key1bits, key2bits;
    789 
    790     ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
    791                                       &key2, &key2bits);
    792     if (ret != 0) {
    793         return ret;
    794     }
    795 
    796     /* Set the tweak key. Always set tweak key for the encryption mode. */
    797     ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
    798     if (ret != 0) {
    799         return ret;
    800     }
    801 
    802     /* Set crypt key for encryption. */
    803     return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
    804 }
    805 
    806 int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
    807                                const unsigned char *key,
    808                                unsigned int keybits)
    809 {
    810     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    811     const unsigned char *key1, *key2;
    812     unsigned int key1bits, key2bits;
    813 
    814     ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
    815                                       &key2, &key2bits);
    816     if (ret != 0) {
    817         return ret;
    818     }
    819 
    820     /* Set the tweak key. Always set tweak key for encryption. */
    821     ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
    822     if (ret != 0) {
    823         return ret;
    824     }
    825 
    826     /* Set crypt key for decryption. */
    827     return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
    828 }
    829 #endif /* MBEDTLS_CIPHER_MODE_XTS */
    830 
    831 #define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3)                 \
    832     do                                                      \
    833     {                                                       \
    834         (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^    \
    835                AES_FT1(MBEDTLS_BYTE_1(Y1)) ^    \
    836                AES_FT2(MBEDTLS_BYTE_2(Y2)) ^    \
    837                AES_FT3(MBEDTLS_BYTE_3(Y3));     \
    838                                                             \
    839         (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^    \
    840                AES_FT1(MBEDTLS_BYTE_1(Y2)) ^    \
    841                AES_FT2(MBEDTLS_BYTE_2(Y3)) ^    \
    842                AES_FT3(MBEDTLS_BYTE_3(Y0));     \
    843                                                             \
    844         (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^    \
    845                AES_FT1(MBEDTLS_BYTE_1(Y3)) ^    \
    846                AES_FT2(MBEDTLS_BYTE_2(Y0)) ^    \
    847                AES_FT3(MBEDTLS_BYTE_3(Y1));     \
    848                                                             \
    849         (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^    \
    850                AES_FT1(MBEDTLS_BYTE_1(Y0)) ^    \
    851                AES_FT2(MBEDTLS_BYTE_2(Y1)) ^    \
    852                AES_FT3(MBEDTLS_BYTE_3(Y2));     \
    853     } while (0)
    854 
    855 #define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3)                 \
    856     do                                                      \
    857     {                                                       \
    858         (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^    \
    859                AES_RT1(MBEDTLS_BYTE_1(Y3)) ^    \
    860                AES_RT2(MBEDTLS_BYTE_2(Y2)) ^    \
    861                AES_RT3(MBEDTLS_BYTE_3(Y1));     \
    862                                                             \
    863         (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^    \
    864                AES_RT1(MBEDTLS_BYTE_1(Y0)) ^    \
    865                AES_RT2(MBEDTLS_BYTE_2(Y3)) ^    \
    866                AES_RT3(MBEDTLS_BYTE_3(Y2));     \
    867                                                             \
    868         (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^    \
    869                AES_RT1(MBEDTLS_BYTE_1(Y1)) ^    \
    870                AES_RT2(MBEDTLS_BYTE_2(Y0)) ^    \
    871                AES_RT3(MBEDTLS_BYTE_3(Y3));     \
    872                                                             \
    873         (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^    \
    874                AES_RT1(MBEDTLS_BYTE_1(Y2)) ^    \
    875                AES_RT2(MBEDTLS_BYTE_2(Y1)) ^    \
    876                AES_RT3(MBEDTLS_BYTE_3(Y0));     \
    877     } while (0)
    878 
    879 /*
    880  * AES-ECB block encryption
    881  */
    882 #if !defined(MBEDTLS_AES_ENCRYPT_ALT)
    883 int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
    884                                  const unsigned char input[16],
    885                                  unsigned char output[16])
    886 {
    887     int i;
    888     uint32_t *RK = ctx->buf + ctx->rk_offset;
    889     struct {
    890         uint32_t X[4];
    891         uint32_t Y[4];
    892     } t;
    893 
    894     t.X[0] = MBEDTLS_GET_UINT32_LE(input,  0); t.X[0] ^= *RK++;
    895     t.X[1] = MBEDTLS_GET_UINT32_LE(input,  4); t.X[1] ^= *RK++;
    896     t.X[2] = MBEDTLS_GET_UINT32_LE(input,  8); t.X[2] ^= *RK++;
    897     t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
    898 
    899     for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
    900         AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
    901         AES_FROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
    902     }
    903 
    904     AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
    905 
    906     t.X[0] = *RK++ ^ \
    907              ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
    908              ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] <<  8) ^
    909              ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
    910              ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
    911 
    912     t.X[1] = *RK++ ^ \
    913              ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
    914              ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] <<  8) ^
    915              ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
    916              ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
    917 
    918     t.X[2] = *RK++ ^ \
    919              ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
    920              ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] <<  8) ^
    921              ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
    922              ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
    923 
    924     t.X[3] = *RK++ ^ \
    925              ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
    926              ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] <<  8) ^
    927              ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
    928              ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
    929 
    930     MBEDTLS_PUT_UINT32_LE(t.X[0], output,  0);
    931     MBEDTLS_PUT_UINT32_LE(t.X[1], output,  4);
    932     MBEDTLS_PUT_UINT32_LE(t.X[2], output,  8);
    933     MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
    934 
    935     mbedtls_platform_zeroize(&t, sizeof(t));
    936 
    937     return 0;
    938 }
    939 #endif /* !MBEDTLS_AES_ENCRYPT_ALT */
    940 
    941 /*
    942  * AES-ECB block decryption
    943  */
    944 #if !defined(MBEDTLS_AES_DECRYPT_ALT) && !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
    945 int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
    946                                  const unsigned char input[16],
    947                                  unsigned char output[16])
    948 {
    949     int i;
    950     uint32_t *RK = ctx->buf + ctx->rk_offset;
    951     struct {
    952         uint32_t X[4];
    953         uint32_t Y[4];
    954     } t;
    955 
    956     t.X[0] = MBEDTLS_GET_UINT32_LE(input,  0); t.X[0] ^= *RK++;
    957     t.X[1] = MBEDTLS_GET_UINT32_LE(input,  4); t.X[1] ^= *RK++;
    958     t.X[2] = MBEDTLS_GET_UINT32_LE(input,  8); t.X[2] ^= *RK++;
    959     t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
    960 
    961     for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
    962         AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
    963         AES_RROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
    964     }
    965 
    966     AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
    967 
    968     t.X[0] = *RK++ ^ \
    969              ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
    970              ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] <<  8) ^
    971              ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
    972              ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
    973 
    974     t.X[1] = *RK++ ^ \
    975              ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
    976              ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] <<  8) ^
    977              ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
    978              ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
    979 
    980     t.X[2] = *RK++ ^ \
    981              ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
    982              ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] <<  8) ^
    983              ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
    984              ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
    985 
    986     t.X[3] = *RK++ ^ \
    987              ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
    988              ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] <<  8) ^
    989              ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
    990              ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
    991 
    992     MBEDTLS_PUT_UINT32_LE(t.X[0], output,  0);
    993     MBEDTLS_PUT_UINT32_LE(t.X[1], output,  4);
    994     MBEDTLS_PUT_UINT32_LE(t.X[2], output,  8);
    995     MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
    996 
    997     mbedtls_platform_zeroize(&t, sizeof(t));
    998 
    999     return 0;
   1000 }
   1001 #endif /* !MBEDTLS_AES_DECRYPT_ALT && !MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
   1002 
   1003 /* VIA Padlock and our intrinsics-based implementation of AESNI require
   1004  * the round keys to be aligned on a 16-byte boundary. We take care of this
   1005  * before creating them, but the AES context may have moved (this can happen
   1006  * if the library is called from a language with managed memory), and in later
   1007  * calls it might have a different alignment with respect to 16-byte memory.
   1008  * So we may need to realign.
   1009  */
   1010 MBEDTLS_MAYBE_UNUSED static void aes_maybe_realign(mbedtls_aes_context *ctx)
   1011 {
   1012     unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
   1013     if (new_offset != ctx->rk_offset) {
   1014         memmove(ctx->buf + new_offset,     // new address
   1015                 ctx->buf + ctx->rk_offset, // current address
   1016                 (ctx->nr + 1) * 16);       // number of round keys * bytes per rk
   1017         ctx->rk_offset = new_offset;
   1018     }
   1019 }
   1020 
   1021 /*
   1022  * AES-ECB block encryption/decryption
   1023  */
   1024 int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
   1025                           int mode,
   1026                           const unsigned char input[16],
   1027                           unsigned char output[16])
   1028 {
   1029     if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
   1030         return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
   1031     }
   1032 
   1033 #if defined(MAY_NEED_TO_ALIGN)
   1034     aes_maybe_realign(ctx);
   1035 #endif
   1036 
   1037 #if defined(MBEDTLS_AESNI_HAVE_CODE)
   1038     if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
   1039         return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
   1040     }
   1041 #endif
   1042 
   1043 #if defined(MBEDTLS_AESCE_HAVE_CODE)
   1044     if (MBEDTLS_AESCE_HAS_SUPPORT()) {
   1045         return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
   1046     }
   1047 #endif
   1048 
   1049 #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
   1050     if (aes_padlock_ace > 0) {
   1051         return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
   1052     }
   1053 #endif
   1054 
   1055 #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
   1056 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1057     if (mode == MBEDTLS_AES_DECRYPT) {
   1058         return mbedtls_internal_aes_decrypt(ctx, input, output);
   1059     } else
   1060 #endif
   1061     {
   1062         return mbedtls_internal_aes_encrypt(ctx, input, output);
   1063     }
   1064 #endif /* !MBEDTLS_AES_USE_HARDWARE_ONLY */
   1065 }
   1066 
   1067 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1068 
   1069 /*
   1070  * AES-CBC buffer encryption/decryption
   1071  */
   1072 int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
   1073                           int mode,
   1074                           size_t length,
   1075                           unsigned char iv[16],
   1076                           const unsigned char *input,
   1077                           unsigned char *output)
   1078 {
   1079     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1080     unsigned char temp[16];
   1081 
   1082     if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
   1083         return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
   1084     }
   1085 
   1086     /* Nothing to do if length is zero. */
   1087     if (length == 0) {
   1088         return 0;
   1089     }
   1090 
   1091     if (length % 16) {
   1092         return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
   1093     }
   1094 
   1095 #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
   1096     if (aes_padlock_ace > 0) {
   1097         if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
   1098             return 0;
   1099         }
   1100 
   1101         // If padlock data misaligned, we just fall back to
   1102         // unaccelerated mode
   1103         //
   1104     }
   1105 #endif
   1106 
   1107     const unsigned char *ivp = iv;
   1108 
   1109     if (mode == MBEDTLS_AES_DECRYPT) {
   1110         while (length > 0) {
   1111             memcpy(temp, input, 16);
   1112             ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
   1113             if (ret != 0) {
   1114                 goto exit;
   1115             }
   1116             /* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
   1117              * the result for the next block in CBC, and the cost of transferring that data from
   1118              * NEON registers, NEON is slower on aarch64. */
   1119             mbedtls_xor_no_simd(output, output, iv, 16);
   1120 
   1121             memcpy(iv, temp, 16);
   1122 
   1123             input  += 16;
   1124             output += 16;
   1125             length -= 16;
   1126         }
   1127     } else {
   1128         while (length > 0) {
   1129             mbedtls_xor_no_simd(output, input, ivp, 16);
   1130 
   1131             ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
   1132             if (ret != 0) {
   1133                 goto exit;
   1134             }
   1135             ivp = output;
   1136 
   1137             input  += 16;
   1138             output += 16;
   1139             length -= 16;
   1140         }
   1141         memcpy(iv, ivp, 16);
   1142     }
   1143     ret = 0;
   1144 
   1145 exit:
   1146     return ret;
   1147 }
   1148 #endif /* MBEDTLS_CIPHER_MODE_CBC */
   1149 
   1150 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1151 
   1152 typedef unsigned char mbedtls_be128[16];
   1153 
   1154 /*
   1155  * GF(2^128) multiplication function
   1156  *
   1157  * This function multiplies a field element by x in the polynomial field
   1158  * representation. It uses 64-bit word operations to gain speed but compensates
   1159  * for machine endianness and hence works correctly on both big and little
   1160  * endian machines.
   1161  */
   1162 #if defined(MBEDTLS_AESCE_C) || defined(MBEDTLS_AESNI_C)
   1163 MBEDTLS_OPTIMIZE_FOR_PERFORMANCE
   1164 #endif
   1165 static inline void mbedtls_gf128mul_x_ble(unsigned char r[16],
   1166                                           const unsigned char x[16])
   1167 {
   1168     uint64_t a, b, ra, rb;
   1169 
   1170     a = MBEDTLS_GET_UINT64_LE(x, 0);
   1171     b = MBEDTLS_GET_UINT64_LE(x, 8);
   1172 
   1173     ra = (a << 1)  ^ 0x0087 >> (8 - ((b >> 63) << 3));
   1174     rb = (a >> 63) | (b << 1);
   1175 
   1176     MBEDTLS_PUT_UINT64_LE(ra, r, 0);
   1177     MBEDTLS_PUT_UINT64_LE(rb, r, 8);
   1178 }
   1179 
   1180 /*
   1181  * AES-XTS buffer encryption/decryption
   1182  *
   1183  * Use of MBEDTLS_OPTIMIZE_FOR_PERFORMANCE here and for mbedtls_gf128mul_x_ble()
   1184  * is a 3x performance improvement for gcc -Os, if we have hardware AES support.
   1185  */
   1186 #if defined(MBEDTLS_AESCE_C) || defined(MBEDTLS_AESNI_C)
   1187 MBEDTLS_OPTIMIZE_FOR_PERFORMANCE
   1188 #endif
   1189 int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
   1190                           int mode,
   1191                           size_t length,
   1192                           const unsigned char data_unit[16],
   1193                           const unsigned char *input,
   1194                           unsigned char *output)
   1195 {
   1196     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1197     size_t blocks = length / 16;
   1198     size_t leftover = length % 16;
   1199     unsigned char tweak[16];
   1200     unsigned char prev_tweak[16];
   1201     unsigned char tmp[16];
   1202 
   1203     if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
   1204         return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
   1205     }
   1206 
   1207     /* Data units must be at least 16 bytes long. */
   1208     if (length < 16) {
   1209         return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
   1210     }
   1211 
   1212     /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
   1213     if (length > (1 << 20) * 16) {
   1214         return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
   1215     }
   1216 
   1217     /* Compute the tweak. */
   1218     ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
   1219                                 data_unit, tweak);
   1220     if (ret != 0) {
   1221         return ret;
   1222     }
   1223 
   1224     while (blocks--) {
   1225         if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
   1226             /* We are on the last block in a decrypt operation that has
   1227              * leftover bytes, so we need to use the next tweak for this block,
   1228              * and this tweak for the leftover bytes. Save the current tweak for
   1229              * the leftovers and then update the current tweak for use on this,
   1230              * the last full block. */
   1231             memcpy(prev_tweak, tweak, sizeof(tweak));
   1232             mbedtls_gf128mul_x_ble(tweak, tweak);
   1233         }
   1234 
   1235         mbedtls_xor(tmp, input, tweak, 16);
   1236 
   1237         ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
   1238         if (ret != 0) {
   1239             return ret;
   1240         }
   1241 
   1242         mbedtls_xor(output, tmp, tweak, 16);
   1243 
   1244         /* Update the tweak for the next block. */
   1245         mbedtls_gf128mul_x_ble(tweak, tweak);
   1246 
   1247         output += 16;
   1248         input += 16;
   1249     }
   1250 
   1251     if (leftover) {
   1252         /* If we are on the leftover bytes in a decrypt operation, we need to
   1253          * use the previous tweak for these bytes (as saved in prev_tweak). */
   1254         unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
   1255 
   1256         /* We are now on the final part of the data unit, which doesn't divide
   1257          * evenly by 16. It's time for ciphertext stealing. */
   1258         size_t i;
   1259         unsigned char *prev_output = output - 16;
   1260 
   1261         /* Copy ciphertext bytes from the previous block to our output for each
   1262          * byte of ciphertext we won't steal. */
   1263         for (i = 0; i < leftover; i++) {
   1264             output[i] = prev_output[i];
   1265         }
   1266 
   1267         /* Copy the remainder of the input for this final round. */
   1268         mbedtls_xor(tmp, input, t, leftover);
   1269 
   1270         /* Copy ciphertext bytes from the previous block for input in this
   1271          * round. */
   1272         mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
   1273 
   1274         ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
   1275         if (ret != 0) {
   1276             return ret;
   1277         }
   1278 
   1279         /* Write the result back to the previous block, overriding the previous
   1280          * output we copied. */
   1281         mbedtls_xor(prev_output, tmp, t, 16);
   1282     }
   1283 
   1284     return 0;
   1285 }
   1286 #endif /* MBEDTLS_CIPHER_MODE_XTS */
   1287 
   1288 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1289 /*
   1290  * AES-CFB128 buffer encryption/decryption
   1291  */
   1292 int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
   1293                              int mode,
   1294                              size_t length,
   1295                              size_t *iv_off,
   1296                              unsigned char iv[16],
   1297                              const unsigned char *input,
   1298                              unsigned char *output)
   1299 {
   1300     int c;
   1301     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1302     size_t n;
   1303 
   1304     if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
   1305         return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
   1306     }
   1307 
   1308     n = *iv_off;
   1309 
   1310     if (n > 15) {
   1311         return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
   1312     }
   1313 
   1314     if (mode == MBEDTLS_AES_DECRYPT) {
   1315         while (length--) {
   1316             if (n == 0) {
   1317                 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
   1318                 if (ret != 0) {
   1319                     goto exit;
   1320                 }
   1321             }
   1322 
   1323             c = *input++;
   1324             *output++ = (unsigned char) (c ^ iv[n]);
   1325             iv[n] = (unsigned char) c;
   1326 
   1327             n = (n + 1) & 0x0F;
   1328         }
   1329     } else {
   1330         while (length--) {
   1331             if (n == 0) {
   1332                 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
   1333                 if (ret != 0) {
   1334                     goto exit;
   1335                 }
   1336             }
   1337 
   1338             iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
   1339 
   1340             n = (n + 1) & 0x0F;
   1341         }
   1342     }
   1343 
   1344     *iv_off = n;
   1345     ret = 0;
   1346 
   1347 exit:
   1348     return ret;
   1349 }
   1350 
   1351 /*
   1352  * AES-CFB8 buffer encryption/decryption
   1353  */
   1354 int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
   1355                            int mode,
   1356                            size_t length,
   1357                            unsigned char iv[16],
   1358                            const unsigned char *input,
   1359                            unsigned char *output)
   1360 {
   1361     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1362     unsigned char c;
   1363     unsigned char ov[17];
   1364 
   1365     if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
   1366         return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
   1367     }
   1368     while (length--) {
   1369         memcpy(ov, iv, 16);
   1370         ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
   1371         if (ret != 0) {
   1372             goto exit;
   1373         }
   1374 
   1375         if (mode == MBEDTLS_AES_DECRYPT) {
   1376             ov[16] = *input;
   1377         }
   1378 
   1379         c = *output++ = (unsigned char) (iv[0] ^ *input++);
   1380 
   1381         if (mode == MBEDTLS_AES_ENCRYPT) {
   1382             ov[16] = c;
   1383         }
   1384 
   1385         memcpy(iv, ov + 1, 16);
   1386     }
   1387     ret = 0;
   1388 
   1389 exit:
   1390     return ret;
   1391 }
   1392 #endif /* MBEDTLS_CIPHER_MODE_CFB */
   1393 
   1394 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1395 /*
   1396  * AES-OFB (Output Feedback Mode) buffer encryption/decryption
   1397  */
   1398 int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
   1399                           size_t length,
   1400                           size_t *iv_off,
   1401                           unsigned char iv[16],
   1402                           const unsigned char *input,
   1403                           unsigned char *output)
   1404 {
   1405     int ret = 0;
   1406     size_t n;
   1407 
   1408     n = *iv_off;
   1409 
   1410     if (n > 15) {
   1411         return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
   1412     }
   1413 
   1414     while (length--) {
   1415         if (n == 0) {
   1416             ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
   1417             if (ret != 0) {
   1418                 goto exit;
   1419             }
   1420         }
   1421         *output++ =  *input++ ^ iv[n];
   1422 
   1423         n = (n + 1) & 0x0F;
   1424     }
   1425 
   1426     *iv_off = n;
   1427 
   1428 exit:
   1429     return ret;
   1430 }
   1431 #endif /* MBEDTLS_CIPHER_MODE_OFB */
   1432 
   1433 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1434 /*
   1435  * AES-CTR buffer encryption/decryption
   1436  */
   1437 int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
   1438                           size_t length,
   1439                           size_t *nc_off,
   1440                           unsigned char nonce_counter[16],
   1441                           unsigned char stream_block[16],
   1442                           const unsigned char *input,
   1443                           unsigned char *output)
   1444 {
   1445     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1446 
   1447     size_t offset = *nc_off;
   1448 
   1449     if (offset > 0x0F) {
   1450         return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
   1451     }
   1452 
   1453     for (size_t i = 0; i < length;) {
   1454         size_t n = 16;
   1455         if (offset == 0) {
   1456             ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
   1457             if (ret != 0) {
   1458                 goto exit;
   1459             }
   1460             mbedtls_ctr_increment_counter(nonce_counter);
   1461         } else {
   1462             n -= offset;
   1463         }
   1464 
   1465         if (n > (length - i)) {
   1466             n = (length - i);
   1467         }
   1468         mbedtls_xor(&output[i], &input[i], &stream_block[offset], n);
   1469         // offset might be non-zero for the last block, but in that case, we don't use it again
   1470         offset = 0;
   1471         i += n;
   1472     }
   1473 
   1474     // capture offset for future resumption
   1475     *nc_off = (*nc_off + length) % 16;
   1476 
   1477     ret = 0;
   1478 
   1479 exit:
   1480     return ret;
   1481 }
   1482 #endif /* MBEDTLS_CIPHER_MODE_CTR */
   1483 
   1484 #endif /* !MBEDTLS_AES_ALT */
   1485 
   1486 #if defined(MBEDTLS_SELF_TEST)
   1487 /*
   1488  * AES test vectors from:
   1489  *
   1490  * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
   1491  */
   1492 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1493 static const unsigned char aes_test_ecb_dec[][16] =
   1494 {
   1495     { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
   1496       0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
   1497 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   1498     { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
   1499       0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
   1500     { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
   1501       0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
   1502 #endif
   1503 };
   1504 #endif
   1505 
   1506 static const unsigned char aes_test_ecb_enc[][16] =
   1507 {
   1508     { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
   1509       0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
   1510 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   1511     { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
   1512       0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
   1513     { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
   1514       0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
   1515 #endif
   1516 };
   1517 
   1518 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1519 static const unsigned char aes_test_cbc_dec[][16] =
   1520 {
   1521     { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
   1522       0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
   1523 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   1524     { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
   1525       0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
   1526     { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
   1527       0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
   1528 #endif
   1529 };
   1530 
   1531 static const unsigned char aes_test_cbc_enc[][16] =
   1532 {
   1533     { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
   1534       0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
   1535 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   1536     { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
   1537       0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
   1538     { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
   1539       0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
   1540 #endif
   1541 };
   1542 #endif /* MBEDTLS_CIPHER_MODE_CBC */
   1543 
   1544 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1545 /*
   1546  * AES-CFB128 test vectors from:
   1547  *
   1548  * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
   1549  */
   1550 static const unsigned char aes_test_cfb128_key[][32] =
   1551 {
   1552     { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
   1553       0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
   1554 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   1555     { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
   1556       0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
   1557       0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
   1558     { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
   1559       0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
   1560       0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
   1561       0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
   1562 #endif
   1563 };
   1564 
   1565 static const unsigned char aes_test_cfb128_iv[16] =
   1566 {
   1567     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   1568     0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
   1569 };
   1570 
   1571 static const unsigned char aes_test_cfb128_pt[64] =
   1572 {
   1573     0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
   1574     0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
   1575     0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
   1576     0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
   1577     0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
   1578     0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
   1579     0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
   1580     0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
   1581 };
   1582 
   1583 static const unsigned char aes_test_cfb128_ct[][64] =
   1584 {
   1585     { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
   1586       0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
   1587       0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
   1588       0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
   1589       0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
   1590       0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
   1591       0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
   1592       0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
   1593 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   1594     { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
   1595       0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
   1596       0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
   1597       0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
   1598       0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
   1599       0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
   1600       0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
   1601       0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
   1602     { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
   1603       0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
   1604       0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
   1605       0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
   1606       0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
   1607       0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
   1608       0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
   1609       0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
   1610 #endif
   1611 };
   1612 #endif /* MBEDTLS_CIPHER_MODE_CFB */
   1613 
   1614 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1615 /*
   1616  * AES-OFB test vectors from:
   1617  *
   1618  * https://csrc.nist.gov/publications/detail/sp/800-38a/final
   1619  */
   1620 static const unsigned char aes_test_ofb_key[][32] =
   1621 {
   1622     { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
   1623       0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
   1624 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   1625     { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
   1626       0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
   1627       0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
   1628     { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
   1629       0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
   1630       0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
   1631       0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
   1632 #endif
   1633 };
   1634 
   1635 static const unsigned char aes_test_ofb_iv[16] =
   1636 {
   1637     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   1638     0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
   1639 };
   1640 
   1641 static const unsigned char aes_test_ofb_pt[64] =
   1642 {
   1643     0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
   1644     0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
   1645     0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
   1646     0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
   1647     0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
   1648     0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
   1649     0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
   1650     0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
   1651 };
   1652 
   1653 static const unsigned char aes_test_ofb_ct[][64] =
   1654 {
   1655     { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
   1656       0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
   1657       0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
   1658       0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
   1659       0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
   1660       0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
   1661       0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
   1662       0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
   1663 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   1664     { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
   1665       0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
   1666       0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
   1667       0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
   1668       0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
   1669       0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
   1670       0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
   1671       0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
   1672     { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
   1673       0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
   1674       0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
   1675       0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
   1676       0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
   1677       0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
   1678       0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
   1679       0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
   1680 #endif
   1681 };
   1682 #endif /* MBEDTLS_CIPHER_MODE_OFB */
   1683 
   1684 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1685 /*
   1686  * AES-CTR test vectors from:
   1687  *
   1688  * http://www.faqs.org/rfcs/rfc3686.html
   1689  */
   1690 
   1691 static const unsigned char aes_test_ctr_key[][16] =
   1692 {
   1693     { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
   1694       0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
   1695     { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
   1696       0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
   1697     { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
   1698       0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
   1699 };
   1700 
   1701 static const unsigned char aes_test_ctr_nonce_counter[][16] =
   1702 {
   1703     { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
   1704       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
   1705     { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
   1706       0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
   1707     { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
   1708       0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
   1709 };
   1710 
   1711 static const unsigned char aes_test_ctr_pt[][48] =
   1712 {
   1713     { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
   1714       0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
   1715     { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   1716       0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
   1717       0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   1718       0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
   1719 
   1720     { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   1721       0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
   1722       0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   1723       0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
   1724       0x20, 0x21, 0x22, 0x23 }
   1725 };
   1726 
   1727 static const unsigned char aes_test_ctr_ct[][48] =
   1728 {
   1729     { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
   1730       0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
   1731     { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
   1732       0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
   1733       0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
   1734       0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
   1735     { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
   1736       0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
   1737       0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
   1738       0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
   1739       0x25, 0xB2, 0x07, 0x2F }
   1740 };
   1741 
   1742 static const int aes_test_ctr_len[3] =
   1743 { 16, 32, 36 };
   1744 #endif /* MBEDTLS_CIPHER_MODE_CTR */
   1745 
   1746 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1747 /*
   1748  * AES-XTS test vectors from:
   1749  *
   1750  * IEEE P1619/D16 Annex B
   1751  * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
   1752  * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
   1753  */
   1754 static const unsigned char aes_test_xts_key[][32] =
   1755 {
   1756     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   1757       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   1758       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   1759       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
   1760     { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
   1761       0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
   1762       0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
   1763       0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
   1764     { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
   1765       0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
   1766       0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
   1767       0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
   1768 };
   1769 
   1770 static const unsigned char aes_test_xts_pt32[][32] =
   1771 {
   1772     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   1773       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   1774       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   1775       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
   1776     { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
   1777       0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
   1778       0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
   1779       0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
   1780     { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
   1781       0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
   1782       0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
   1783       0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
   1784 };
   1785 
   1786 static const unsigned char aes_test_xts_ct32[][32] =
   1787 {
   1788     { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
   1789       0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
   1790       0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
   1791       0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
   1792     { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
   1793       0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
   1794       0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
   1795       0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
   1796     { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
   1797       0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
   1798       0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
   1799       0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
   1800 };
   1801 
   1802 static const unsigned char aes_test_xts_data_unit[][16] =
   1803 {
   1804     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   1805       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
   1806     { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
   1807       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
   1808     { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
   1809       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
   1810 };
   1811 
   1812 #endif /* MBEDTLS_CIPHER_MODE_XTS */
   1813 
   1814 /*
   1815  * Checkup routine
   1816  */
   1817 int mbedtls_aes_self_test(int verbose)
   1818 {
   1819     int ret = 0, i, j, u, mode;
   1820     unsigned int keybits;
   1821     unsigned char key[32];
   1822     unsigned char buf[64];
   1823     const unsigned char *aes_tests;
   1824 #if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
   1825     defined(MBEDTLS_CIPHER_MODE_OFB)
   1826     unsigned char iv[16];
   1827 #endif
   1828 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1829     unsigned char prv[16];
   1830 #endif
   1831 #if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
   1832     defined(MBEDTLS_CIPHER_MODE_OFB)
   1833     size_t offset;
   1834 #endif
   1835 #if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
   1836     int len;
   1837 #endif
   1838 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1839     unsigned char nonce_counter[16];
   1840     unsigned char stream_block[16];
   1841 #endif
   1842     mbedtls_aes_context ctx;
   1843 
   1844     memset(key, 0, 32);
   1845     mbedtls_aes_init(&ctx);
   1846 
   1847     if (verbose != 0) {
   1848 #if defined(MBEDTLS_AES_ALT)
   1849         mbedtls_printf("  AES note: alternative implementation.\n");
   1850 #else /* MBEDTLS_AES_ALT */
   1851 #if defined(MBEDTLS_AESNI_HAVE_CODE)
   1852 #if MBEDTLS_AESNI_HAVE_CODE == 1
   1853         mbedtls_printf("  AES note: AESNI code present (assembly implementation).\n");
   1854 #elif MBEDTLS_AESNI_HAVE_CODE == 2
   1855         mbedtls_printf("  AES note: AESNI code present (intrinsics implementation).\n");
   1856 #else
   1857 #error "Unrecognised value for MBEDTLS_AESNI_HAVE_CODE"
   1858 #endif
   1859         if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
   1860             mbedtls_printf("  AES note: using AESNI.\n");
   1861         } else
   1862 #endif
   1863 #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
   1864         if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
   1865             mbedtls_printf("  AES note: using VIA Padlock.\n");
   1866         } else
   1867 #endif
   1868 #if defined(MBEDTLS_AESCE_HAVE_CODE)
   1869         if (MBEDTLS_AESCE_HAS_SUPPORT()) {
   1870             mbedtls_printf("  AES note: using AESCE.\n");
   1871         } else
   1872 #endif
   1873         {
   1874 #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
   1875             mbedtls_printf("  AES note: built-in implementation.\n");
   1876 #endif
   1877         }
   1878 #endif /* MBEDTLS_AES_ALT */
   1879     }
   1880 
   1881     /*
   1882      * ECB mode
   1883      */
   1884     {
   1885         static const int num_tests =
   1886             sizeof(aes_test_ecb_enc) / sizeof(*aes_test_ecb_enc);
   1887 
   1888         for (i = 0; i < num_tests << 1; i++) {
   1889             u = i >> 1;
   1890             keybits = 128 + u * 64;
   1891             mode = i & 1;
   1892 
   1893             if (verbose != 0) {
   1894                 mbedtls_printf("  AES-ECB-%3u (%s): ", keybits,
   1895                                (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
   1896             }
   1897 #if defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1898             if (mode == MBEDTLS_AES_DECRYPT) {
   1899                 if (verbose != 0) {
   1900                     mbedtls_printf("skipped\n");
   1901                 }
   1902                 continue;
   1903             }
   1904 #endif
   1905 
   1906             memset(buf, 0, 16);
   1907 
   1908 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1909             if (mode == MBEDTLS_AES_DECRYPT) {
   1910                 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
   1911                 aes_tests = aes_test_ecb_dec[u];
   1912             } else
   1913 #endif
   1914             {
   1915                 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
   1916                 aes_tests = aes_test_ecb_enc[u];
   1917             }
   1918 
   1919             /*
   1920              * AES-192 is an optional feature that may be unavailable when
   1921              * there is an alternative underlying implementation i.e. when
   1922              * MBEDTLS_AES_ALT is defined.
   1923              */
   1924             if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
   1925                 mbedtls_printf("skipped\n");
   1926                 continue;
   1927             } else if (ret != 0) {
   1928                 goto exit;
   1929             }
   1930 
   1931             for (j = 0; j < 10000; j++) {
   1932                 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
   1933                 if (ret != 0) {
   1934                     goto exit;
   1935                 }
   1936             }
   1937 
   1938             if (memcmp(buf, aes_tests, 16) != 0) {
   1939                 ret = 1;
   1940                 goto exit;
   1941             }
   1942 
   1943             if (verbose != 0) {
   1944                 mbedtls_printf("passed\n");
   1945             }
   1946         }
   1947 
   1948         if (verbose != 0) {
   1949             mbedtls_printf("\n");
   1950         }
   1951     }
   1952 
   1953 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1954     /*
   1955      * CBC mode
   1956      */
   1957     {
   1958         static const int num_tests =
   1959             sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
   1960 
   1961         for (i = 0; i < num_tests << 1; i++) {
   1962             u = i >> 1;
   1963             keybits = 128 + u * 64;
   1964             mode = i & 1;
   1965 
   1966             if (verbose != 0) {
   1967                 mbedtls_printf("  AES-CBC-%3u (%s): ", keybits,
   1968                                (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
   1969             }
   1970 
   1971             memset(iv, 0, 16);
   1972             memset(prv, 0, 16);
   1973             memset(buf, 0, 16);
   1974 
   1975             if (mode == MBEDTLS_AES_DECRYPT) {
   1976                 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
   1977                 aes_tests = aes_test_cbc_dec[u];
   1978             } else {
   1979                 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
   1980                 aes_tests = aes_test_cbc_enc[u];
   1981             }
   1982 
   1983             /*
   1984              * AES-192 is an optional feature that may be unavailable when
   1985              * there is an alternative underlying implementation i.e. when
   1986              * MBEDTLS_AES_ALT is defined.
   1987              */
   1988             if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
   1989                 mbedtls_printf("skipped\n");
   1990                 continue;
   1991             } else if (ret != 0) {
   1992                 goto exit;
   1993             }
   1994 
   1995             for (j = 0; j < 10000; j++) {
   1996                 if (mode == MBEDTLS_AES_ENCRYPT) {
   1997                     unsigned char tmp[16];
   1998 
   1999                     memcpy(tmp, prv, 16);
   2000                     memcpy(prv, buf, 16);
   2001                     memcpy(buf, tmp, 16);
   2002                 }
   2003 
   2004                 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
   2005                 if (ret != 0) {
   2006                     goto exit;
   2007                 }
   2008 
   2009             }
   2010 
   2011             if (memcmp(buf, aes_tests, 16) != 0) {
   2012                 ret = 1;
   2013                 goto exit;
   2014             }
   2015 
   2016             if (verbose != 0) {
   2017                 mbedtls_printf("passed\n");
   2018             }
   2019         }
   2020 
   2021         if (verbose != 0) {
   2022             mbedtls_printf("\n");
   2023         }
   2024     }
   2025 #endif /* MBEDTLS_CIPHER_MODE_CBC */
   2026 
   2027 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   2028     /*
   2029      * CFB128 mode
   2030      */
   2031     {
   2032         static const int num_tests =
   2033             sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
   2034 
   2035         for (i = 0; i < num_tests << 1; i++) {
   2036             u = i >> 1;
   2037             keybits = 128 + u * 64;
   2038             mode = i & 1;
   2039 
   2040             if (verbose != 0) {
   2041                 mbedtls_printf("  AES-CFB128-%3u (%s): ", keybits,
   2042                                (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
   2043             }
   2044 
   2045             memcpy(iv,  aes_test_cfb128_iv, 16);
   2046             memcpy(key, aes_test_cfb128_key[u], keybits / 8);
   2047 
   2048             offset = 0;
   2049             ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
   2050             /*
   2051              * AES-192 is an optional feature that may be unavailable when
   2052              * there is an alternative underlying implementation i.e. when
   2053              * MBEDTLS_AES_ALT is defined.
   2054              */
   2055             if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
   2056                 mbedtls_printf("skipped\n");
   2057                 continue;
   2058             } else if (ret != 0) {
   2059                 goto exit;
   2060             }
   2061 
   2062             if (mode == MBEDTLS_AES_DECRYPT) {
   2063                 memcpy(buf, aes_test_cfb128_ct[u], 64);
   2064                 aes_tests = aes_test_cfb128_pt;
   2065             } else {
   2066                 memcpy(buf, aes_test_cfb128_pt, 64);
   2067                 aes_tests = aes_test_cfb128_ct[u];
   2068             }
   2069 
   2070             ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
   2071             if (ret != 0) {
   2072                 goto exit;
   2073             }
   2074 
   2075             if (memcmp(buf, aes_tests, 64) != 0) {
   2076                 ret = 1;
   2077                 goto exit;
   2078             }
   2079 
   2080             if (verbose != 0) {
   2081                 mbedtls_printf("passed\n");
   2082             }
   2083         }
   2084 
   2085         if (verbose != 0) {
   2086             mbedtls_printf("\n");
   2087         }
   2088     }
   2089 #endif /* MBEDTLS_CIPHER_MODE_CFB */
   2090 
   2091 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   2092     /*
   2093      * OFB mode
   2094      */
   2095     {
   2096         static const int num_tests =
   2097             sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
   2098 
   2099         for (i = 0; i < num_tests << 1; i++) {
   2100             u = i >> 1;
   2101             keybits = 128 + u * 64;
   2102             mode = i & 1;
   2103 
   2104             if (verbose != 0) {
   2105                 mbedtls_printf("  AES-OFB-%3u (%s): ", keybits,
   2106                                (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
   2107             }
   2108 
   2109             memcpy(iv,  aes_test_ofb_iv, 16);
   2110             memcpy(key, aes_test_ofb_key[u], keybits / 8);
   2111 
   2112             offset = 0;
   2113             ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
   2114             /*
   2115              * AES-192 is an optional feature that may be unavailable when
   2116              * there is an alternative underlying implementation i.e. when
   2117              * MBEDTLS_AES_ALT is defined.
   2118              */
   2119             if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
   2120                 mbedtls_printf("skipped\n");
   2121                 continue;
   2122             } else if (ret != 0) {
   2123                 goto exit;
   2124             }
   2125 
   2126             if (mode == MBEDTLS_AES_DECRYPT) {
   2127                 memcpy(buf, aes_test_ofb_ct[u], 64);
   2128                 aes_tests = aes_test_ofb_pt;
   2129             } else {
   2130                 memcpy(buf, aes_test_ofb_pt, 64);
   2131                 aes_tests = aes_test_ofb_ct[u];
   2132             }
   2133 
   2134             ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
   2135             if (ret != 0) {
   2136                 goto exit;
   2137             }
   2138 
   2139             if (memcmp(buf, aes_tests, 64) != 0) {
   2140                 ret = 1;
   2141                 goto exit;
   2142             }
   2143 
   2144             if (verbose != 0) {
   2145                 mbedtls_printf("passed\n");
   2146             }
   2147         }
   2148 
   2149         if (verbose != 0) {
   2150             mbedtls_printf("\n");
   2151         }
   2152     }
   2153 #endif /* MBEDTLS_CIPHER_MODE_OFB */
   2154 
   2155 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   2156     /*
   2157      * CTR mode
   2158      */
   2159     {
   2160         static const int num_tests =
   2161             sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
   2162 
   2163         for (i = 0; i < num_tests << 1; i++) {
   2164             u = i >> 1;
   2165             mode = i & 1;
   2166 
   2167             if (verbose != 0) {
   2168                 mbedtls_printf("  AES-CTR-128 (%s): ",
   2169                                (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
   2170             }
   2171 
   2172             memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
   2173             memcpy(key, aes_test_ctr_key[u], 16);
   2174 
   2175             offset = 0;
   2176             if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
   2177                 goto exit;
   2178             }
   2179 
   2180             len = aes_test_ctr_len[u];
   2181 
   2182             if (mode == MBEDTLS_AES_DECRYPT) {
   2183                 memcpy(buf, aes_test_ctr_ct[u], len);
   2184                 aes_tests = aes_test_ctr_pt[u];
   2185             } else {
   2186                 memcpy(buf, aes_test_ctr_pt[u], len);
   2187                 aes_tests = aes_test_ctr_ct[u];
   2188             }
   2189 
   2190             ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
   2191                                         stream_block, buf, buf);
   2192             if (ret != 0) {
   2193                 goto exit;
   2194             }
   2195 
   2196             if (memcmp(buf, aes_tests, len) != 0) {
   2197                 ret = 1;
   2198                 goto exit;
   2199             }
   2200 
   2201             if (verbose != 0) {
   2202                 mbedtls_printf("passed\n");
   2203             }
   2204         }
   2205     }
   2206 
   2207     if (verbose != 0) {
   2208         mbedtls_printf("\n");
   2209     }
   2210 #endif /* MBEDTLS_CIPHER_MODE_CTR */
   2211 
   2212 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   2213     /*
   2214      * XTS mode
   2215      */
   2216     {
   2217         static const int num_tests =
   2218             sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
   2219         mbedtls_aes_xts_context ctx_xts;
   2220 
   2221         mbedtls_aes_xts_init(&ctx_xts);
   2222 
   2223         for (i = 0; i < num_tests << 1; i++) {
   2224             const unsigned char *data_unit;
   2225             u = i >> 1;
   2226             mode = i & 1;
   2227 
   2228             if (verbose != 0) {
   2229                 mbedtls_printf("  AES-XTS-128 (%s): ",
   2230                                (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
   2231             }
   2232 
   2233             memset(key, 0, sizeof(key));
   2234             memcpy(key, aes_test_xts_key[u], 32);
   2235             data_unit = aes_test_xts_data_unit[u];
   2236 
   2237             len = sizeof(*aes_test_xts_ct32);
   2238 
   2239             if (mode == MBEDTLS_AES_DECRYPT) {
   2240                 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
   2241                 if (ret != 0) {
   2242                     goto exit;
   2243                 }
   2244                 memcpy(buf, aes_test_xts_ct32[u], len);
   2245                 aes_tests = aes_test_xts_pt32[u];
   2246             } else {
   2247                 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
   2248                 if (ret != 0) {
   2249                     goto exit;
   2250                 }
   2251                 memcpy(buf, aes_test_xts_pt32[u], len);
   2252                 aes_tests = aes_test_xts_ct32[u];
   2253             }
   2254 
   2255 
   2256             ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
   2257                                         buf, buf);
   2258             if (ret != 0) {
   2259                 goto exit;
   2260             }
   2261 
   2262             if (memcmp(buf, aes_tests, len) != 0) {
   2263                 ret = 1;
   2264                 goto exit;
   2265             }
   2266 
   2267             if (verbose != 0) {
   2268                 mbedtls_printf("passed\n");
   2269             }
   2270         }
   2271 
   2272         if (verbose != 0) {
   2273             mbedtls_printf("\n");
   2274         }
   2275 
   2276         mbedtls_aes_xts_free(&ctx_xts);
   2277     }
   2278 #endif /* MBEDTLS_CIPHER_MODE_XTS */
   2279 
   2280     ret = 0;
   2281 
   2282 exit:
   2283     if (ret != 0 && verbose != 0) {
   2284         mbedtls_printf("failed\n");
   2285     }
   2286 
   2287     mbedtls_aes_free(&ctx);
   2288 
   2289     return ret;
   2290 }
   2291 
   2292 #endif /* MBEDTLS_SELF_TEST */
   2293 
   2294 #endif /* MBEDTLS_AES_C */