LCOV - code coverage report
Current view: top level - externals/mbedtls/library - aes.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 72 171 42.1 %
Date: 2024-09-16 20:15:30 Functions: 5 7 71.4 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 10 30 33.3 %

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

Generated by: LCOV version 1.14