Changeset 8a64320e in mainline for uspace/lib/crypto/aes.c


Ignore:
Timestamp:
2015-04-23T23:40:14Z (10 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
dcba819
Parents:
09044cb
Message:

pre-merge coding style cleanup and code review

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/crypto/aes.c

    r09044cb r8a64320e  
    2828
    2929/** @file aes.c
    30  * 
     30 *
    3131 * Implementation of AES-128 symmetric cipher cryptographic algorithm.
    32  * 
     32 *
    3333 * Based on FIPS 197.
    3434 */
     
    3737#include <errno.h>
    3838#include <mem.h>
    39 
    4039#include "crypto.h"
    4140
    4241/* Number of elements in rows/columns in AES arrays. */
    43 #define ELEMS 4
     42#define ELEMS  4
    4443
    4544/* Number of elements (words) in cipher. */
    46 #define CIPHER_ELEMS 4
     45#define CIPHER_ELEMS  4
    4746
    4847/* Length of AES block. */
    49 #define BLOCK_LEN 16
     48#define BLOCK_LEN  16
    5049
    5150/* Number of iterations in AES algorithm. */
    52 #define ROUNDS 10
    53 
    54 /*
    55  * Irreducible polynomial used in AES algorithm.
    56  *
     51#define ROUNDS  10
     52
     53/** Irreducible polynomial used in AES algorithm.
     54 *
    5755 * NOTE: x^8 + x^4 + x^3 + x + 1.
    58  */
    59 #define AES_IP 0x1B
    60 
    61 /* Precomputed values for AES sub_byte transformation. */
     56 *
     57 */
     58#define AES_IP  0x1b
     59
     60/** Precomputed values for AES sub_byte transformation. */
    6261static const uint8_t sbox[BLOCK_LEN][BLOCK_LEN] = {
    6362        {
    64                 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 
     63                0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
    6564                0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
    6665        },
    6766        {
    68                 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 
     67                0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
    6968                0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
    7069        },
     
    7473        },
    7574        {
    76                 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 
     75                0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
    7776                0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
    7877        },
    7978        {
    80                 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 
     79                0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
    8180                0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
    8281        },
    8382        {
    84                 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 
     83                0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
    8584                0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
    8685        },
    8786        {
    88                 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 
     87                0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
    8988                0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
    9089        },
    9190        {
    92                 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 
     91                0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
    9392                0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
    9493        },
    9594        {
    96                 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 
     95                0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
    9796                0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
    9897        },
    9998        {
    100                 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 
     99                0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
    101100                0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
    102101        },
    103102        {
    104                 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 
     103                0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
    105104                0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
    106105        },
    107106        {
    108                 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 
     107                0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
    109108                0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
    110109        },
    111110        {
    112                 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 
     111                0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
    113112                0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
    114113        },
    115114        {
    116                 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 
     115                0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
    117116                0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
    118117        },
    119118        {
    120                 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 
     119                0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
    121120                0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
    122121        },
    123122        {
    124                 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 
     123                0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
    125124                0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
    126125        }
    127126};
    128127
    129 /* Precomputed values for AES inv_sub_byte transformation. */
     128/** Precomputed values for AES inv_sub_byte transformation. */
    130129static uint8_t inv_sbox[BLOCK_LEN][BLOCK_LEN] = {
    131130        {
    132                 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 
     131                0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
    133132                0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
    134133        },
    135134        {
    136                 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 
     135                0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
    137136                0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
    138137        },
    139138        {
    140                 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 
     139                0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
    141140                0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
    142141        },
    143142        {
    144                 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 
     143                0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
    145144                0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
    146145        },
    147146        {
    148                 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 
     147                0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
    149148                0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
    150149        },
    151150        {
    152                 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 
     151                0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
    153152                0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
    154153        },
    155154        {
    156                 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 
     155                0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
    157156                0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
    158157        },
    159158        {
    160                 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 
     159                0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
    161160                0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
    162161        },
    163162        {
    164                 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 
     163                0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
    165164                0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
    166165        },
    167166        {
    168                 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 
     167                0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
    169168                0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
    170169        },
    171170        {
    172                 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 
     171                0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
    173172                0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
    174173        },
    175174        {
    176                 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 
     175                0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
    177176                0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
    178177        },
    179178        {
    180                 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 
     179                0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
    181180                0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
    182181        },
    183182        {
    184                 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 
     183                0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
    185184                0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
    186185        },
    187186        {
    188                 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 
     187                0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
    189188                0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
    190189        },
    191190        {
    192                 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 
     191                0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
    193192                0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
    194193        }
    195194};
    196195
    197 /* Precomputed values of powers of 2 in GF(2^8) left shifted by 24b. */
     196/** Precomputed values of powers of 2 in GF(2^8) left shifted by 24b. */
    198197static const uint32_t r_con_array[] = {
    199         0x01000000, 0x02000000, 0x04000000, 0x08000000,
     198        0x01000000, 0x02000000, 0x04000000, 0x08000000,
    200199        0x10000000, 0x20000000, 0x40000000, 0x80000000,
    201         0x1B000000, 0x36000000
     200        0x1b000000, 0x36000000
    202201};
    203202
    204 /**
    205  * Perform substitution transformation on given byte.
    206  *
     203/** Perform substitution transformation on given byte.
     204 *
    207205 * @param byte Input byte.
    208  * @param inv Flag indicating whether to use inverse table.
    209  * 
     206 * @param inv  Flag indicating whether to use inverse table.
     207 *
    210208 * @return Substituted value.
     209 *
    211210 */
    212211static uint8_t sub_byte(uint8_t byte, bool inv)
     
    215214        uint8_t j = byte & 0xF;
    216215       
    217         if(!inv) {
     216        if (!inv)
    218217                return sbox[i][j];
    219         } else {
    220                 return inv_sbox[i][j];
    221         }
    222 }
    223 
    224 /**
    225  * Perform substitution transformation on state table.
    226  *
     218       
     219        return inv_sbox[i][j];
     220}
     221
     222/** Perform substitution transformation on state table.
     223 *
    227224 * @param state State table to be modified.
    228  * @param inv Flag indicating whether to use inverse table.
     225 * @param inv   Flag indicating whether to use inverse table.
     226 *
    229227 */
    230228static void sub_bytes(uint8_t state[ELEMS][ELEMS], bool inv)
     
    232230        uint8_t val;
    233231       
    234         for(size_t i = 0; i < ELEMS; i++) {
    235                 for(size_t j = 0; j < ELEMS; j++) {
     232        for (size_t i = 0; i < ELEMS; i++) {
     233                for (size_t j = 0; j < ELEMS; j++) {
    236234                        val = state[i][j];
    237235                        state[i][j] = sub_byte(val, inv);
     
    240238}
    241239
    242 /**
    243  * Perform shift rows transformation on state table.
    244  *
     240/** Perform shift rows transformation on state table.
     241 *
    245242 * @param state State table to be modified.
     243 *
    246244 */
    247245static void shift_rows(uint8_t state[ELEMS][ELEMS])
     
    249247        uint8_t temp[ELEMS];
    250248       
    251         for(size_t i = 1; i < ELEMS; i++) {
     249        for (size_t i = 1; i < ELEMS; i++) {
    252250                memcpy(temp, state[i], i);
    253251                memcpy(state[i], state[i] + i, ELEMS - i);
     
    256254}
    257255
    258 /**
    259  * Perform inverted shift rows transformation on state table.
    260  *
     256/** Perform inverted shift rows transformation on state table.
     257 *
    261258 * @param state State table to be modified.
     259 *
    262260 */
    263261static void inv_shift_rows(uint8_t state[ELEMS][ELEMS])
     
    265263        uint8_t temp[ELEMS];
    266264       
    267         for(size_t i = 1; i < ELEMS; i++) {
     265        for (size_t i = 1; i < ELEMS; i++) {
    268266                memcpy(temp, state[i], ELEMS - i);
    269267                memcpy(state[i], state[i] + ELEMS - i, i);
     
    272270}
    273271
    274 /**
    275  * Multiplication in GF(2^8).
    276  *
     272/** Multiplication in GF(2^8).
     273 *
    277274 * @param x First factor.
    278275 * @param y Second factor.
    279  * 
     276 *
    280277 * @return Multiplication of given factors in GF(2^8).
    281  */
    282 static uint8_t galois_mult(uint8_t x, uint8_t y) {
    283         uint8_t result = 0;
    284         uint8_t F_bitH;
    285        
    286         for(size_t i = 0; i < 8; i++) {
    287                 if (y & 1)
     278 *
     279 */
     280static uint8_t galois_mult(uint8_t x, uint8_t y)
     281{
     282        uint8_t result = 0;
     283        uint8_t f_bith;
     284       
     285        for (size_t i = 0; i < 8; i++) {
     286                if (y & 1)
    288287                        result ^= x;
    289                 F_bitH = (x & 0x80);
    290                 x <<= 1;
    291                 if (F_bitH)
    292                         x ^= AES_IP;
    293                 y >>= 1;
    294         }
    295        
    296         return result;
    297 }
    298 
    299 /**
    300  * Perform mix columns transformation on state table.
    301  *
     288               
     289                f_bith = (x & 0x80);
     290                x <<= 1;
     291               
     292                if (f_bith)
     293                        x ^= AES_IP;
     294               
     295                y >>= 1;
     296        }
     297       
     298        return result;
     299}
     300
     301/** Perform mix columns transformation on state table.
     302 *
    302303 * @param state State table to be modified.
     304 *
    303305 */
    304306static void mix_columns(uint8_t state[ELEMS][ELEMS])
     
    307309        memcpy(orig_state, state, BLOCK_LEN);
    308310       
    309         for(size_t j = 0; j < ELEMS; j++) {
    310                 state[0][j] =
    311                         galois_mult(0x2, orig_state[0][j]) ^
    312                         galois_mult(0x3, orig_state[1][j]) ^
    313                         orig_state[2][j] ^
    314                         orig_state[3][j];
    315                 state[1][j] =
    316                         orig_state[0][j] ^
    317                         galois_mult(0x2, orig_state[1][j]) ^
    318                         galois_mult(0x3, orig_state[2][j]) ^
    319                         orig_state[3][j];
    320                 state[2][j] =
    321                         orig_state[0][j] ^
    322                         orig_state[1][j] ^
    323                         galois_mult(0x2, orig_state[2][j]) ^
    324                         galois_mult(0x3, orig_state[3][j]);
    325                 state[3][j] =
    326                         galois_mult(0x3, orig_state[0][j]) ^
    327                         orig_state[1][j] ^
    328                         orig_state[2][j] ^
    329                         galois_mult(0x2, orig_state[3][j]);
    330         }
    331 }
    332 
    333 /**
    334  * Perform inverted mix columns transformation on state table.
    335  *
     311        for (size_t j = 0; j < ELEMS; j++) {
     312                state[0][j] =
     313                    galois_mult(0x2, orig_state[0][j]) ^
     314                    galois_mult(0x3, orig_state[1][j]) ^
     315                    orig_state[2][j] ^
     316                    orig_state[3][j];
     317                state[1][j] =
     318                    orig_state[0][j] ^
     319                    galois_mult(0x2, orig_state[1][j]) ^
     320                    galois_mult(0x3, orig_state[2][j]) ^
     321                    orig_state[3][j];
     322                state[2][j] =
     323                    orig_state[0][j] ^
     324                    orig_state[1][j] ^
     325                    galois_mult(0x2, orig_state[2][j]) ^
     326                    galois_mult(0x3, orig_state[3][j]);
     327                state[3][j] =
     328                    galois_mult(0x3, orig_state[0][j]) ^
     329                    orig_state[1][j] ^
     330                    orig_state[2][j] ^
     331                    galois_mult(0x2, orig_state[3][j]);
     332        }
     333}
     334
     335/** Perform inverted mix columns transformation on state table.
     336 *
    336337 * @param state State table to be modified.
     338 *
    337339 */
    338340static void inv_mix_columns(uint8_t state[ELEMS][ELEMS])
     
    341343        memcpy(orig_state, state, BLOCK_LEN);
    342344       
    343         for(size_t j = 0; j < ELEMS; j++) {
    344                 state[0][j] =
    345                         galois_mult(0x0E, orig_state[0][j]) ^
    346                         galois_mult(0x0B, orig_state[1][j]) ^
    347                         galois_mult(0x0D, orig_state[2][j]) ^
    348                         galois_mult(0x09, orig_state[3][j]);
    349                 state[1][j] =
    350                         galois_mult(0x09, orig_state[0][j]) ^
    351                         galois_mult(0x0E, orig_state[1][j]) ^
    352                         galois_mult(0x0B, orig_state[2][j]) ^
    353                         galois_mult(0x0D, orig_state[3][j]);
    354                 state[2][j] =
    355                         galois_mult(0x0D, orig_state[0][j]) ^
    356                         galois_mult(0x09, orig_state[1][j]) ^
    357                         galois_mult(0x0E, orig_state[2][j]) ^
    358                         galois_mult(0x0B, orig_state[3][j]);
    359                 state[3][j] =
    360                         galois_mult(0x0B, orig_state[0][j]) ^
    361                         galois_mult(0x0D, orig_state[1][j]) ^
    362                         galois_mult(0x09, orig_state[2][j]) ^
    363                         galois_mult(0x0E, orig_state[3][j]);
    364         }
    365 }
    366 
    367 /**
    368  * Perform round key transformation on state table.
    369  *
    370  * @param state State table to be modified.
     345        for (size_t j = 0; j < ELEMS; j++) {
     346                state[0][j] =
     347                    galois_mult(0x0e, orig_state[0][j]) ^
     348                    galois_mult(0x0b, orig_state[1][j]) ^
     349                    galois_mult(0x0d, orig_state[2][j]) ^
     350                    galois_mult(0x09, orig_state[3][j]);
     351                state[1][j] =
     352                    galois_mult(0x09, orig_state[0][j]) ^
     353                    galois_mult(0x0e, orig_state[1][j]) ^
     354                    galois_mult(0x0b, orig_state[2][j]) ^
     355                    galois_mult(0x0d, orig_state[3][j]);
     356                state[2][j] =
     357                    galois_mult(0x0d, orig_state[0][j]) ^
     358                    galois_mult(0x09, orig_state[1][j]) ^
     359                    galois_mult(0x0e, orig_state[2][j]) ^
     360                    galois_mult(0x0b, orig_state[3][j]);
     361                state[3][j] =
     362                    galois_mult(0x0b, orig_state[0][j]) ^
     363                    galois_mult(0x0d, orig_state[1][j]) ^
     364                    galois_mult(0x09, orig_state[2][j]) ^
     365                    galois_mult(0x0e, orig_state[3][j]);
     366        }
     367}
     368
     369/** Perform round key transformation on state table.
     370 *
     371 * @param state     State table to be modified.
    371372 * @param round_key Round key to be applied on state table.
     373 *
    372374 */
    373375static void add_round_key(uint8_t state[ELEMS][ELEMS], uint32_t *round_key)
     
    375377        uint8_t byte_round;
    376378        uint8_t shift;
    377         uint32_t mask = 0xFF;
    378        
    379         for(size_t j = 0; j < ELEMS; j++) {
    380                 for(size_t i = 0; i < ELEMS; i++) {
    381                         shift = 24 - 8*i;
     379        uint32_t mask = 0xff;
     380       
     381        for (size_t j = 0; j < ELEMS; j++) {
     382                for (size_t i = 0; i < ELEMS; i++) {
     383                        shift = 24 - 8 * i;
    382384                        byte_round = (round_key[j] & (mask << shift)) >> shift;
    383385                        state[i][j] = state[i][j] ^ byte_round;
     
    386388}
    387389
    388 /**
    389  * Perform substitution transformation on given word.
    390  *
     390/** Perform substitution transformation on given word.
     391 *
    391392 * @param byte Input word.
    392  * 
     393 *
    393394 * @return Substituted word.
     395 *
    394396 */
    395397static uint32_t sub_word(uint32_t word)
     
    398400        uint8_t *start = (uint8_t *) &temp;
    399401       
    400         for(size_t i = 0; i < 4; i++) {
    401                 *(start+i) = sub_byte(*(start+i), false);
    402         }
     402        for (size_t i = 0; i < 4; i++)
     403                *(start + i) = sub_byte(*(start + i), false);
    403404       
    404405        return temp;
    405406}
    406407
    407 /**
    408  * Perform left rotation by one byte on given word.
    409  *
     408/** Perform left rotation by one byte on given word.
     409 *
    410410 * @param byte Input word.
    411  * 
     411 *
    412412 * @return Rotated word.
     413 *
    413414 */
    414415static uint32_t rot_word(uint32_t word)
     
    417418}
    418419
    419 /**
    420  * Key expansion procedure for AES algorithm.
    421  *
    422  * @param key Input key.
     420/** Key expansion procedure for AES algorithm.
     421 *
     422 * @param key     Input key.
    423423 * @param key_exp Result key expansion.
     424 *
    424425 */
    425426static void key_expansion(uint8_t *key, uint32_t *key_exp)
     
    427428        uint32_t temp;
    428429       
    429         for(size_t i = 0; i < CIPHER_ELEMS; i++) {
    430                 key_exp[i] = 
    431                         (key[4*i] << 24) +
    432                         (key[4*i+1] << 16) +
    433                         (key[4*i+2] << 8) +
    434                         (key[4*i+3]);
    435         }
    436        
    437         for(size_t i = CIPHER_ELEMS; i < ELEMS * (ROUNDS + 1); i++) {
    438                 temp = key_exp[i-1];
    439                
    440                 if((i % CIPHER_ELEMS) == 0) {
    441                         temp = sub_word(rot_word(temp)) ^ 
    442                                 r_con_array[i/CIPHER_ELEMS - 1];
     430        for (size_t i = 0; i < CIPHER_ELEMS; i++) {
     431                key_exp[i] =
     432                    (key[4 * i] << 24) +
     433                    (key[4 * i + 1] << 16) +
     434                    (key[4 * i + 2] << 8) +
     435                    (key[4 * i + 3]);
     436        }
     437       
     438        for (size_t i = CIPHER_ELEMS; i < ELEMS * (ROUNDS + 1); i++) {
     439                temp = key_exp[i - 1];
     440               
     441                if ((i % CIPHER_ELEMS) == 0) {
     442                        temp = sub_word(rot_word(temp)) ^
     443                            r_con_array[i / CIPHER_ELEMS - 1];
    443444                }
    444445               
     
    447448}
    448449
    449 /**
    450  * AES-128 encryption algorithm.
    451  *
    452  * @param key Input key.
    453  * @param input Input data sequence to be encrypted.
     450/** AES-128 encryption algorithm.
     451 *
     452 * @param key    Input key.
     453 * @param input  Input data sequence to be encrypted.
    454454 * @param output Encrypted data sequence.
    455  *
    456  * @return EINVAL when input or key not specified, ENOMEM when pointer for
    457  * output is not allocated, otherwise EOK. 
     455 *
     456 * @return EINVAL when input or key not specified,
     457 *         ENOMEM when pointer for output is not allocated,
     458 *         otherwise EOK.
     459 *
    458460 */
    459461int aes_encrypt(uint8_t *key, uint8_t *input, uint8_t *output)
    460462{
    461         if(!key || !input)
     463        if ((!key) || (!input))
    462464                return EINVAL;
    463465       
    464         if(!output)
     466        if (!output)
    465467                return ENOMEM;
    466468       
    467469        /* Create key expansion. */
    468         uint32_t key_exp[ELEMS * (ROUNDS+1)];
     470        uint32_t key_exp[ELEMS * (ROUNDS + 1)];
    469471        key_expansion(key, key_exp);
    470472       
    471473        /* Copy input into state array. */
    472474        uint8_t state[ELEMS][ELEMS];
    473         for(size_t i = 0; i < ELEMS; i++) {
    474                 for(size_t j = 0; j < ELEMS; j++) {
    475                         state[i][j] = input[i + ELEMS*j];
    476                 }
     475        for (size_t i = 0; i < ELEMS; i++) {
     476                for (size_t j = 0; j < ELEMS; j++)
     477                        state[i][j] = input[i + ELEMS * j];
    477478        }
    478479       
     
    480481        add_round_key(state, key_exp);
    481482       
    482         for(size_t k = 1; k <= ROUNDS; k++) {
     483        for (size_t k = 1; k <= ROUNDS; k++) {
    483484                sub_bytes(state, false);
    484485                shift_rows(state);
    485                 if(k < ROUNDS)
     486               
     487                if (k < ROUNDS)
    486488                        mix_columns(state);
    487                 add_round_key(state, key_exp + k*ELEMS);
     489               
     490                add_round_key(state, key_exp + k * ELEMS);
    488491        }
    489492       
    490493        /* Copy state array into output. */
    491         for(size_t i = 0; i < ELEMS; i++) {
    492                 for(size_t j = 0; j < ELEMS; j++) {
    493                         output[i + j*ELEMS] = state[i][j];
    494                 }
     494        for (size_t i = 0; i < ELEMS; i++) {
     495                for (size_t j = 0; j < ELEMS; j++)
     496                        output[i + j * ELEMS] = state[i][j];
    495497        }
    496498       
     
    498500}
    499501
    500 /**
    501  * AES-128 decryption algorithm.
    502  *
    503  * @param key Input key.
    504  * @param input Input data sequence to be decrypted.
     502/** AES-128 decryption algorithm.
     503 *
     504 * @param key    Input key.
     505 * @param input  Input data sequence to be decrypted.
    505506 * @param output Decrypted data sequence.
    506  *
    507  * @return EINVAL when input or key not specified, ENOMEM when pointer for
    508  * output is not allocated, otherwise EOK. 
     507 *
     508 * @return EINVAL when input or key not specified,
     509 *         ENOMEM when pointer for output is not allocated,
     510 *         otherwise EOK.
     511 *
    509512 */
    510513int aes_decrypt(uint8_t *key, uint8_t *input, uint8_t *output)
    511514{
    512         if(!key || !input)
     515        if ((!key) || (!input))
    513516                return EINVAL;
    514517       
    515         if(!output)
     518        if (!output)
    516519                return ENOMEM;
    517520       
    518521        /* Create key expansion. */
    519         uint32_t key_exp[ELEMS * (ROUNDS+1)];
     522        uint32_t key_exp[ELEMS * (ROUNDS + 1)];
    520523        key_expansion(key, key_exp);
    521524       
    522525        /* Copy input into state array. */
    523526        uint8_t state[ELEMS][ELEMS];
    524         for(size_t i = 0; i < ELEMS; i++) {
    525                 for(size_t j = 0; j < ELEMS; j++) {
    526                         state[i][j] = input[i + ELEMS*j];
    527                 }
     527        for (size_t i = 0; i < ELEMS; i++) {
     528                for (size_t j = 0; j < ELEMS; j++)
     529                        state[i][j] = input[i + ELEMS * j];
    528530        }
    529531       
    530532        /* Processing loop. */
    531         add_round_key(state, key_exp + ROUNDS*ELEMS);
    532        
    533         for(int k = ROUNDS - 1; k >= 0; k--) {
     533        add_round_key(state, key_exp + ROUNDS * ELEMS);
     534       
     535        for (int k = ROUNDS - 1; k >= 0; k--) {
    534536                inv_shift_rows(state);
    535537                sub_bytes(state, true);
    536                 add_round_key(state, key_exp + k*ELEMS);
    537                 if(k > 0)
     538                add_round_key(state, key_exp + k * ELEMS);
     539               
     540                if (k > 0)
    538541                        inv_mix_columns(state);
    539542        }
    540543       
    541544        /* Copy state array into output. */
    542         for(size_t i = 0; i < ELEMS; i++) {
    543                 for(size_t j = 0; j < ELEMS; j++) {
    544                         output[i + j*ELEMS] = state[i][j];
    545                 }
     545        for (size_t i = 0; i < ELEMS; i++) {
     546                for (size_t j = 0; j < ELEMS; j++)
     547                        output[i + j * ELEMS] = state[i][j];
    546548        }
    547549       
Note: See TracChangeset for help on using the changeset viewer.