Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers aes_mbedtls.c Source File

aes_mbedtls.c

00001 /*
00002  * Copyright (c) 2006-2017, Arm Limited and affiliates.
00003  * SPDX-License-Identifier: Apache-2.0
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License");
00006  * you may not use this file except in compliance with the License.
00007  * You may obtain a copy of the License at
00008  *
00009  *     http://www.apache.org/licenses/LICENSE-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS,
00013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 
00018 /*
00019  *  FIPS-197 compliant AES implementation
00020  *
00021  *  This file is derived from aes.c in mbed TLS 1.3.10, stripped down to
00022  *  only support 128-bit encryption.
00023  *
00024  *  Subsequently search-and-replaced to match later naming change.
00025  *
00026  *  It is not intended to be used directly; it is conditionally included by
00027  *  aes_common.c, so everything in the file is marked static.
00028  */
00029 
00030 #include <stdint.h>
00031 #include <string.h>
00032 
00033 #define MBEDTLS_AES_ENCRYPT     1
00034 #define MBEDTLS_AES_DECRYPT     0
00035 
00036 #define MBEDTLS_ERR_AES_INVALID_KEY_LENGTH                -0x0020  /**< Invalid key length. */
00037 #define MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH              -0x0022  /**< Invalid data input length. */
00038 #define MBEDTLS_ERR_AES_UNSUPPORTED                       -0x0023  /**< Operation not supported . */
00039 
00040 /**
00041  * \brief          AES context structure
00042  */
00043 typedef struct
00044 {
00045     int nr;                     /*!<  number of rounds  */
00046     uint32_t *rk;               /*!<  AES round keys    */
00047     uint32_t buf[44];           /*!<  unaligned data    */
00048 }
00049 mbedtls_aes_context;
00050 
00051 /* Implementation that should never be optimized out by the compiler */
00052 static void mbedtls_zeroize( void *v, size_t n ) {
00053     volatile unsigned char *p = v; while( n-- ) *p++ = 0;
00054 }
00055 
00056 /*
00057  * 32-bit integer manipulation macros (little endian)
00058  */
00059 #ifndef GET_UINT32_LE
00060 #define GET_UINT32_LE(n,b,i)                            \
00061 {                                                       \
00062     (n) = ( (uint32_t) (b)[(i)    ]       )             \
00063         | ( (uint32_t) (b)[(i) + 1] <<  8 )             \
00064         | ( (uint32_t) (b)[(i) + 2] << 16 )             \
00065         | ( (uint32_t) (b)[(i) + 3] << 24 );            \
00066 }
00067 #endif
00068 
00069 #ifndef PUT_UINT32_LE
00070 #define PUT_UINT32_LE(n,b,i)                                    \
00071 {                                                               \
00072     (b)[(i)    ] = (unsigned char) ( ( (n)       ) & 0xFF );    \
00073     (b)[(i) + 1] = (unsigned char) ( ( (n) >>  8 ) & 0xFF );    \
00074     (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF );    \
00075     (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF );    \
00076 }
00077 #endif
00078 
00079 /*
00080  * Forward S-box
00081  */
00082 static const unsigned char FSb[256] =
00083 {
00084     0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
00085     0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
00086     0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
00087     0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
00088     0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
00089     0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
00090     0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
00091     0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
00092     0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
00093     0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
00094     0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
00095     0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
00096     0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
00097     0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
00098     0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
00099     0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
00100     0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
00101     0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
00102     0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
00103     0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
00104     0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
00105     0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
00106     0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
00107     0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
00108     0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
00109     0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
00110     0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
00111     0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
00112     0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
00113     0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
00114     0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
00115     0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
00116 };
00117 
00118 /*
00119  * Forward tables
00120  */
00121 #define FT \
00122 \
00123     V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
00124     V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
00125     V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
00126     V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
00127     V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
00128     V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
00129     V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
00130     V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
00131     V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
00132     V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
00133     V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
00134     V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
00135     V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
00136     V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
00137     V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
00138     V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
00139     V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
00140     V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
00141     V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
00142     V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
00143     V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
00144     V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
00145     V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
00146     V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
00147     V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
00148     V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
00149     V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
00150     V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
00151     V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
00152     V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
00153     V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
00154     V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
00155     V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
00156     V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
00157     V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
00158     V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
00159     V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
00160     V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
00161     V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
00162     V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
00163     V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
00164     V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
00165     V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
00166     V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
00167     V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
00168     V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
00169     V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
00170     V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
00171     V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
00172     V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
00173     V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
00174     V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
00175     V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
00176     V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
00177     V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
00178     V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
00179     V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
00180     V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
00181     V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
00182     V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
00183     V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
00184     V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
00185     V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
00186     V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
00187 
00188 #define V(a,b,c,d) 0x##a##b##c##d
00189 static const uint32_t FT0[256] = { FT };
00190 #undef V
00191 
00192 #define V(a,b,c,d) 0x##b##c##d##a
00193 static const uint32_t FT1[256] = { FT };
00194 #undef V
00195 
00196 #define V(a,b,c,d) 0x##c##d##a##b
00197 static const uint32_t FT2[256] = { FT };
00198 #undef V
00199 
00200 #define V(a,b,c,d) 0x##d##a##b##c
00201 static const uint32_t FT3[256] = { FT };
00202 #undef V
00203 
00204 #undef FT
00205 
00206 
00207 /*
00208  * Round constants
00209  */
00210 static const uint32_t RCON[10] =
00211 {
00212     0x00000001, 0x00000002, 0x00000004, 0x00000008,
00213     0x00000010, 0x00000020, 0x00000040, 0x00000080,
00214     0x0000001B, 0x00000036
00215 };
00216 
00217 
00218 static void mbedtls_aes_init( mbedtls_aes_context *ctx )
00219 {
00220     memset( ctx, 0, sizeof( mbedtls_aes_context ) );
00221 }
00222 
00223 static void mbedtls_aes_free( mbedtls_aes_context *ctx )
00224 {
00225     if( ctx == NULL )
00226         return;
00227 
00228     mbedtls_zeroize( ctx, sizeof( mbedtls_aes_context ) );
00229 }
00230 
00231 /*
00232  * AES key schedule (encryption)
00233  */
00234 static int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
00235                            unsigned int keysize )
00236 {
00237     unsigned int i;
00238     uint32_t *RK;
00239 
00240     switch( keysize )
00241     {
00242         case 128: ctx->nr  = 10; break;
00243         default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
00244     }
00245 
00246     ctx->rk  = RK = ctx->buf ;
00247 
00248     for( i = 0; i < ( keysize >> 5 ); i++ )
00249     {
00250         GET_UINT32_LE( RK[i], key, i << 2 );
00251     }
00252 
00253     switch( ctx->nr  )
00254     {
00255         case 10:
00256 
00257             for( i = 0; i < 10; i++, RK += 4 )
00258             {
00259                 RK[4]  = RK[0] ^ RCON[i] ^
00260                 ( (uint32_t) FSb[ ( RK[3] >>  8 ) & 0xFF ]       ) ^
00261                 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] <<  8 ) ^
00262                 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
00263                 ( (uint32_t) FSb[ ( RK[3]       ) & 0xFF ] << 24 );
00264 
00265                 RK[5]  = RK[1] ^ RK[4];
00266                 RK[6]  = RK[2] ^ RK[5];
00267                 RK[7]  = RK[3] ^ RK[6];
00268             }
00269             break;
00270     }
00271 
00272     return( 0 );
00273 }
00274 
00275 
00276 #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)     \
00277 {                                               \
00278     X0 = *RK++ ^ FT0[ ( Y0       ) & 0xFF ] ^   \
00279                  FT1[ ( Y1 >>  8 ) & 0xFF ] ^   \
00280                  FT2[ ( Y2 >> 16 ) & 0xFF ] ^   \
00281                  FT3[ ( Y3 >> 24 ) & 0xFF ];    \
00282                                                 \
00283     X1 = *RK++ ^ FT0[ ( Y1       ) & 0xFF ] ^   \
00284                  FT1[ ( Y2 >>  8 ) & 0xFF ] ^   \
00285                  FT2[ ( Y3 >> 16 ) & 0xFF ] ^   \
00286                  FT3[ ( Y0 >> 24 ) & 0xFF ];    \
00287                                                 \
00288     X2 = *RK++ ^ FT0[ ( Y2       ) & 0xFF ] ^   \
00289                  FT1[ ( Y3 >>  8 ) & 0xFF ] ^   \
00290                  FT2[ ( Y0 >> 16 ) & 0xFF ] ^   \
00291                  FT3[ ( Y1 >> 24 ) & 0xFF ];    \
00292                                                 \
00293     X3 = *RK++ ^ FT0[ ( Y3       ) & 0xFF ] ^   \
00294                  FT1[ ( Y0 >>  8 ) & 0xFF ] ^   \
00295                  FT2[ ( Y1 >> 16 ) & 0xFF ] ^   \
00296                  FT3[ ( Y2 >> 24 ) & 0xFF ];    \
00297 }
00298 
00299 /*
00300  * AES-ECB block encryption/decryption
00301  */
00302 static int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
00303                           int mode,
00304                           const unsigned char input[16],
00305                           unsigned char output[16] )
00306 {
00307     int i;
00308     uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
00309 
00310     RK = ctx->rk ;
00311 
00312     GET_UINT32_LE( X0, input,  0 ); X0 ^= *RK++;
00313     GET_UINT32_LE( X1, input,  4 ); X1 ^= *RK++;
00314     GET_UINT32_LE( X2, input,  8 ); X2 ^= *RK++;
00315     GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
00316 
00317     if( mode == MBEDTLS_AES_DECRYPT )
00318     {
00319         return( MBEDTLS_ERR_AES_UNSUPPORTED );
00320     }
00321     else /* MBEDTLS_AES_ENCRYPT */
00322     {
00323         for( i = ( ctx->nr  >> 1 ) - 1; i > 0; i-- )
00324         {
00325             AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00326             AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00327         }
00328 
00329         AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00330 
00331         X0 = *RK++ ^ \
00332                 ( (uint32_t) FSb[ ( Y0       ) & 0xFF ]       ) ^
00333                 ( (uint32_t) FSb[ ( Y1 >>  8 ) & 0xFF ] <<  8 ) ^
00334                 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
00335                 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
00336 
00337         X1 = *RK++ ^ \
00338                 ( (uint32_t) FSb[ ( Y1       ) & 0xFF ]       ) ^
00339                 ( (uint32_t) FSb[ ( Y2 >>  8 ) & 0xFF ] <<  8 ) ^
00340                 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
00341                 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
00342 
00343         X2 = *RK++ ^ \
00344                 ( (uint32_t) FSb[ ( Y2       ) & 0xFF ]       ) ^
00345                 ( (uint32_t) FSb[ ( Y3 >>  8 ) & 0xFF ] <<  8 ) ^
00346                 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
00347                 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
00348 
00349         X3 = *RK++ ^ \
00350                 ( (uint32_t) FSb[ ( Y3       ) & 0xFF ]       ) ^
00351                 ( (uint32_t) FSb[ ( Y0 >>  8 ) & 0xFF ] <<  8 ) ^
00352                 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
00353                 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
00354     }
00355 
00356     PUT_UINT32_LE( X0, output,  0 );
00357     PUT_UINT32_LE( X1, output,  4 );
00358     PUT_UINT32_LE( X2, output,  8 );
00359     PUT_UINT32_LE( X3, output, 12 );
00360 
00361     return( 0 );
00362 }