Changeset 8a64320e in mainline for uspace/lib/crypto


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

Location:
uspace/lib/crypto
Files:
4 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       
  • uspace/lib/crypto/crypto.c

    r09044cb r8a64320e  
    2828
    2929/** @file crypto.c
    30  * 
     30 *
    3131 * Cryptographic functions library.
    3232 */
     
    3737#include <errno.h>
    3838#include <byteorder.h>
    39 
    4039#include "crypto.h"
    4140
    42 /* Hash function procedure definition. */
    43 typedef void (*HASH_FUNC)(uint32_t*, uint32_t*);
    44 
    45 /* Length of HMAC block. */
    46 #define HMAC_BLOCK_LENGTH 64
    47 
    48 /* Ceiling for UINT32. */
    49 #define ceil_uint32(val) (((val) - (uint32_t)(val)) > 0 ? \
    50         (uint32_t)((val) + 1) : (uint32_t)(val))
    51 
    52 /* Floor for UINT32. */
    53 #define floor_uint32(val) (((val) - (uint32_t)(val)) < 0 ? \
    54         (uint32_t)((val) - 1) : (uint32_t)(val))
    55 
    56 /* Pick value at specified index from array or zero if out of bounds. */
    57 #define get_at(input, size, i) (i < size ? input[i] : 0)
    58 
    59 /* Init values used in SHA1 and MD5 functions. */
     41/** Hash function procedure definition. */
     42typedef void (*hash_fnc_t)(uint32_t *, uint32_t *);
     43
     44/** Length of HMAC block. */
     45#define HMAC_BLOCK_LENGTH  64
     46
     47/** Ceiling for uint32_t. */
     48#define ceil_uint32(val) \
     49        (((val) - (uint32_t) (val)) > 0 ? \
     50        (uint32_t) ((val) + 1) : (uint32_t) (val))
     51
     52/** Floor for uint32_t. */
     53#define floor_uint32(val) \
     54        (((val) - (uint32_t) (val)) < 0 ? \
     55        (uint32_t) ((val) - 1) : (uint32_t) (val))
     56
     57/** Pick value at specified index from array or zero if out of bounds. */
     58#define get_at(input, size, i) \
     59        ((i) < (size) ? (input[i]) : 0)
     60
     61/** Init values used in SHA1 and MD5 functions. */
    6062static const uint32_t hash_init[] = {
    61         0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0
     63        0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
    6264};
    6365
    64 /* Shift amount array for MD5 algorithm. */
     66/** Shift amount array for MD5 algorithm. */
    6567static const uint32_t md5_shift[] = {
    6668        7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,
     
    7072};
    7173
    72 /* Substitution box for MD5 algorithm. */
     74/** Substitution box for MD5 algorithm. */
    7375static const uint32_t md5_sbox[] = {
    7476        0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
     
    9092};
    9193
    92 /**
    93  * Working procedure of MD5 cryptographic hash function.
    94  *
    95  * @param h Working array with interim hash parts values.
     94/** Working procedure of MD5 cryptographic hash function.
     95 *
     96 * @param h         Working array with interim hash parts values.
    9697 * @param sched_arr Input array with scheduled values from input string.
     98 *
    9799 */
    98100static void md5_proc(uint32_t *h, uint32_t *sched_arr)
    99101{
    100102        uint32_t f, g, temp;
    101         uint32_t w[HASH_MD5/4];
    102        
    103         memcpy(w, h, (HASH_MD5/4) * sizeof(uint32_t));
    104        
    105         for(size_t k = 0; k < 64; k++) {
    106                 if(k < 16) {
     103        uint32_t w[HASH_MD5 / 4];
     104       
     105        memcpy(w, h, (HASH_MD5 / 4) * sizeof(uint32_t));
     106       
     107        for (size_t k = 0; k < 64; k++) {
     108                if (k < 16) {
    107109                        f = (w[1] & w[2]) | (~w[1] & w[3]);
    108110                        g = k;
    109                 } else if(k >= 16 && k < 32) {
     111                } else if ((k >= 16) && (k < 32)) {
    110112                        f = (w[1] & w[3]) | (w[2] & ~w[3]);
    111                         g = (5*k + 1) % 16;
    112                 } else if(k >= 32 && k < 48) {
     113                        g = (5 * k + 1) % 16;
     114                } else if ((k >= 32) && (k < 48)) {
    113115                        f = w[1] ^ w[2] ^ w[3];
    114                         g = (3*k + 5) % 16;
     116                        g = (3 * k + 5) % 16;
    115117                } else {
    116118                        f = w[2] ^ (w[1] | ~w[3]);
    117                         g = 7*k % 16;
     119                        g = 7 * k % 16;
    118120                }
     121               
    119122                temp = w[3];
    120123                w[3] = w[2];
    121124                w[2] = w[1];
    122                 w[1] += rotl_uint32(w[0] + f + md5_sbox[k] + 
    123                         uint32_t_byteorder_swap(sched_arr[g]), 
    124                         md5_shift[k]);
     125                w[1] += rotl_uint32(w[0] + f + md5_sbox[k] +
     126                    uint32_t_byteorder_swap(sched_arr[g]),
     127                    md5_shift[k]);
    125128                w[0] = temp;
    126129        }
    127130       
    128         for(uint8_t k = 0; k < HASH_MD5/4; k++)
     131        for (uint8_t k = 0; k < HASH_MD5 / 4; k++)
    129132                h[k] += w[k];
    130133}
    131134
    132 /**
    133  * Working procedure of SHA-1 cryptographic hash function.
    134  *
    135  * @param h Working array with interim hash parts values.
     135/** Working procedure of SHA-1 cryptographic hash function.
     136 *
     137 * @param h         Working array with interim hash parts values.
    136138 * @param sched_arr Input array with scheduled values from input string.
     139 *
    137140 */
    138141static void sha1_proc(uint32_t *h, uint32_t *sched_arr)
    139142{
    140143        uint32_t f, cf, temp;
    141         uint32_t w[HASH_SHA1/4];
    142        
    143         for(size_t k = 16; k < 80; k++) {
     144        uint32_t w[HASH_SHA1 / 4];
     145       
     146        for (size_t k = 16; k < 80; k++) {
    144147                sched_arr[k] = rotl_uint32(
    145                         sched_arr[k-3] ^
    146                         sched_arr[k-8] ^
    147                         sched_arr[k-14] ^
    148                         sched_arr[k-16],
    149                         1);
    150         }
    151 
    152         memcpy(w, h, (HASH_SHA1/4) * sizeof(uint32_t));
    153        
    154         for(size_t k = 0; k < 80; k++) {
    155                 if(k < 20) {
     148                    sched_arr[k-3] ^
     149                    sched_arr[k-8] ^
     150                    sched_arr[k-14] ^
     151                    sched_arr[k-16],
     152                    1);
     153        }
     154       
     155        memcpy(w, h, (HASH_SHA1 / 4) * sizeof(uint32_t));
     156       
     157        for (size_t k = 0; k < 80; k++) {
     158                if (k < 20) {
    156159                        f = (w[1] & w[2]) | (~w[1] & w[3]);
    157160                        cf = 0x5A827999;
    158                 } else if(k >= 20 && k < 40) {
     161                } else if ((k >= 20) && (k < 40)) {
    159162                        f = w[1] ^ w[2] ^ w[3];
    160                         cf = 0x6ED9EBA1;
    161                 } else if(k >= 40 && k < 60) {
     163                        cf = 0x6ed9eba1;
     164                } else if ((k >= 40) && (k < 60)) {
    162165                        f = (w[1] & w[2]) | (w[1] & w[3]) | (w[2] & w[3]);
    163                         cf = 0x8F1BBCDC;
     166                        cf = 0x8f1bbcdc;
    164167                } else {
    165168                        f = w[1] ^ w[2] ^ w[3];
    166                         cf = 0xCA62C1D6;
     169                        cf = 0xca62c1d6;
    167170                }
    168 
     171               
    169172                temp = rotl_uint32(w[0], 5) + f + w[4] + cf + sched_arr[k];
    170 
     173               
    171174                w[4] = w[3];
    172175                w[3] = w[2];
     
    175178                w[0] = temp;
    176179        }
    177 
    178         for(uint8_t k = 0; k < HASH_SHA1/4; k++)
     180       
     181        for (uint8_t k = 0; k < HASH_SHA1 / 4; k++)
    179182                h[k] += w[k];
    180183}
    181184
    182 /**
    183  * Create hash based on selected algorithm.
    184  *
    185  * @param input Input message byte sequence.
     185/** Create hash based on selected algorithm.
     186 *
     187 * @param input      Input message byte sequence.
    186188 * @param input_size Size of message sequence.
    187  * @param output Result hash byte sequence.
    188  * @param hash_sel Hash function selector.
    189  *
    190  * @return EINVAL when input not specified, ENOMEM when pointer for
    191  * output hash result is not allocated, otherwise EOK.
     189 * @param output     Result hash byte sequence.
     190 * @param hash_sel   Hash function selector.
     191 *
     192 * @return EINVAL when input not specified,
     193 *         ENOMEM when pointer for output hash result
     194 *         is not allocated, otherwise EOK.
     195 *
    192196 */
    193197int create_hash(uint8_t *input, size_t input_size, uint8_t *output,
    194         hash_func_t hash_sel)
    195 {
    196         if(!input)
     198    hash_func_t hash_sel)
     199{
     200        if (!input)
    197201                return EINVAL;
    198202       
    199         if(!output)
     203        if (!output)
    200204                return ENOMEM;
    201205       
    202         HASH_FUNC hash_func = (hash_sel == HASH_MD5) ? md5_proc : sha1_proc;
     206        hash_fnc_t hash_func = (hash_sel == HASH_MD5) ? md5_proc : sha1_proc;
    203207       
    204208        /* Prepare scheduled input. */
     
    207211        work_input[input_size] = 0x80;
    208212       
    209         size_t blocks = ceil_uint32((((double)input_size + 1) / 4 + 2) / 16);
     213        // FIXME: double?
     214        size_t blocks = ceil_uint32((((double) input_size + 1) / 4 + 2) / 16);
    210215        uint32_t work_arr[blocks * 16];
    211         for(size_t i = 0; i < blocks; i++) {
    212                 for(size_t j = 0; j < 16; j++) {
    213                         work_arr[i*16 + j] = 
    214                         (get_at(work_input, input_size+1, i*64+j*4) << 24) |
    215                         (get_at(work_input, input_size+1, i*64+j*4+1) << 16) |
    216                         (get_at(work_input, input_size+1, i*64+j*4+2) << 8) |
    217                         get_at(work_input, input_size+1, i*64+j*4+3);
     216        for (size_t i = 0; i < blocks; i++) {
     217                for (size_t j = 0; j < 16; j++) {
     218                        work_arr[i*16 + j] =
     219                            (get_at(work_input, input_size + 1, i * 64 + j * 4) << 24) |
     220                            (get_at(work_input, input_size + 1, i * 64 + j * 4 + 1) << 16) |
     221                            (get_at(work_input, input_size + 1, i * 64 + j * 4 + 2) << 8) |
     222                            get_at(work_input, input_size + 1, i * 64 + j * 4 + 3);
    218223                }
    219224        }
    220225       
    221         uint64_t bits_size = (uint64_t)(input_size * 8);
    222         if(hash_sel == HASH_MD5)
     226        uint64_t bits_size = (uint64_t) (input_size * 8);
     227        if (hash_sel == HASH_MD5)
    223228                bits_size = uint64_t_byteorder_swap(bits_size);
    224229       
    225230        work_arr[(blocks - 1) * 16 + 14] = bits_size >> 32;
    226         work_arr[(blocks - 1) * 16 + 15] = bits_size & 0xFFFFFFFF;
     231        work_arr[(blocks - 1) * 16 + 15] = bits_size & 0xffffffff;
    227232       
    228233        /* Hash computation. */
    229         uint32_t h[hash_sel/4];
    230         memcpy(h, hash_init, (hash_sel/4) * sizeof(uint32_t));
     234        uint32_t h[hash_sel / 4];
     235        memcpy(h, hash_init, (hash_sel / 4) * sizeof(uint32_t));
    231236        uint32_t sched_arr[80];
    232         for(size_t i = 0; i < blocks; i++) {
    233                 for(size_t k = 0; k < 16; k++) {
    234                         sched_arr[k] = work_arr[i*16 + k];
    235                 }
     237        for (size_t i = 0; i < blocks; i++) {
     238                for (size_t k = 0; k < 16; k++)
     239                        sched_arr[k] = work_arr[i * 16 + k];
    236240               
    237241                hash_func(h, sched_arr);
     
    239243       
    240244        /* Copy hash parts into final result. */
    241         for(size_t i = 0; i < hash_sel/4; i++) {
    242                 if(hash_sel == HASH_SHA1)
     245        for (size_t i = 0; i < hash_sel / 4; i++) {
     246                if (hash_sel == HASH_SHA1)
    243247                        h[i] = uint32_t_byteorder_swap(h[i]);
    244                 memcpy(output + i*sizeof(uint32_t), &h[i], sizeof(uint32_t));
     248               
     249                memcpy(output + i * sizeof(uint32_t), &h[i], sizeof(uint32_t));
    245250        }
    246251       
     
    248253}
    249254
    250 /**
    251  * Hash-based message authentication code.
    252  *
    253  * @param key Cryptographic key sequence.
     255/** Hash-based message authentication code.
     256 *
     257 * @param key      Cryptographic key sequence.
    254258 * @param key_size Size of key sequence.
    255  * @param msg Message sequence.
     259 * @param msg      Message sequence.
    256260 * @param msg_size Size of message sequence.
    257  * @param hash Output parameter for result hash.
     261 * @param hash     Output parameter for result hash.
    258262 * @param hash_sel Hash function selector.
    259  *
    260  * @return EINVAL when key or message not specified, ENOMEM when pointer for
    261  * output hash result is not allocated, otherwise EOK.
     263 *
     264 * @return EINVAL when key or message not specified,
     265 *         ENOMEM when pointer for output hash result
     266 *         is not allocated, otherwise EOK.
     267 *
    262268 */
    263269int hmac(uint8_t *key, size_t key_size, uint8_t *msg, size_t msg_size,
    264         uint8_t *hash, hash_func_t hash_sel)
    265 {
    266         if(!key || !msg)
     270    uint8_t *hash, hash_func_t hash_sel)
     271{
     272        if ((!key) || (!msg))
    267273                return EINVAL;
    268274       
    269         if(!hash)
     275        if (!hash)
    270276                return ENOMEM;
    271277       
     
    276282        memset(work_key, 0, HMAC_BLOCK_LENGTH);
    277283       
    278         if(key_size > HMAC_BLOCK_LENGTH) {
     284        if(key_size > HMAC_BLOCK_LENGTH)
    279285                create_hash(key, key_size, work_key, hash_sel);
    280         } else {
     286        else
    281287                memcpy(work_key, key, key_size);
    282         }
    283        
    284         for(size_t i = 0; i < HMAC_BLOCK_LENGTH; i++) {
    285                 o_key_pad[i] = work_key[i] ^ 0x5C;
     288       
     289        for (size_t i = 0; i < HMAC_BLOCK_LENGTH; i++) {
     290                o_key_pad[i] = work_key[i] ^ 0x5c;
    286291                i_key_pad[i] = work_key[i] ^ 0x36;
    287292        }
     
    291296        memcpy(temp_work + HMAC_BLOCK_LENGTH, msg, msg_size);
    292297       
    293         create_hash(temp_work, HMAC_BLOCK_LENGTH + msg_size, temp_hash, 
    294                 hash_sel);
     298        create_hash(temp_work, HMAC_BLOCK_LENGTH + msg_size, temp_hash,
     299            hash_sel);
    295300       
    296301        memcpy(temp_work, o_key_pad, HMAC_BLOCK_LENGTH);
     
    302307}
    303308
    304 /**
    305  * Password-Based Key Derivation Function 2 as defined in RFC 2898,
    306  * using HMAC-SHA1 with 4096 iterations and 32 bytes key result used
    307  * for WPA/WPA2.
    308  * 
    309  * @param pass Password sequence.
     309/** Password-Based Key Derivation Function 2.
     310 *
     311 * As defined in RFC 2898, using HMAC-SHA1 with 4096 iterations
     312 * and 32 bytes key result used for WPA/WPA2.
     313 *
     314 * @param pass      Password sequence.
    310315 * @param pass_size Password sequence length.
    311  * @param salt Salt sequence to be used with password.
     316 * @param salt      Salt sequence to be used with password.
    312317 * @param salt_size Salt sequence length.
    313  * @param hash Output parameter for result hash (32 byte value).
    314  *
    315  * @return EINVAL when pass or salt not specified, ENOMEM when pointer for
    316  * output hash result is not allocated, otherwise EOK.
    317  */
    318 int pbkdf2(uint8_t *pass, size_t pass_size, uint8_t *salt, size_t salt_size,
    319         uint8_t *hash)
    320 {
    321         if(!pass || !salt)
     318 * @param hash      Output parameter for result hash (32 byte value).
     319 *
     320 * @return EINVAL when pass or salt not specified,
     321 *         ENOMEM when pointer for output hash result
     322 *         is not allocated, otherwise EOK.
     323 *
     324 */
     325int pbkdf2(uint8_t *pass, size_t pass_size, uint8_t *salt, size_t salt_size,
     326    uint8_t *hash)
     327{
     328        if ((!pass) || (!salt))
    322329                return EINVAL;
    323330       
    324         if(!hash)
     331        if (!hash)
    325332                return ENOMEM;
    326333       
     
    330337        uint8_t temp_hmac[HASH_SHA1];
    331338        uint8_t xor_hmac[HASH_SHA1];
    332         uint8_t temp_hash[HASH_SHA1*2];
    333        
    334         for(size_t i = 0; i < 2; i++) {
    335                 uint32_t be_i = host2uint32_t_be(i+1);
     339        uint8_t temp_hash[HASH_SHA1 * 2];
     340       
     341        for (size_t i = 0; i < 2; i++) {
     342                uint32_t be_i = host2uint32_t_be(i + 1);
     343               
    336344                memcpy(work_salt + salt_size, &be_i, 4);
    337345                hmac(pass, pass_size, work_salt, salt_size + 4,
    338                         work_hmac, HASH_SHA1);
     346                    work_hmac, HASH_SHA1);
    339347                memcpy(xor_hmac, work_hmac, HASH_SHA1);
    340348               
    341                 for(size_t k = 1; k < 4096; k++) {
     349                for (size_t k = 1; k < 4096; k++) {
    342350                        memcpy(temp_hmac, work_hmac, HASH_SHA1);
    343                         hmac(pass, pass_size, temp_hmac, HASH_SHA1,
    344                                 work_hmac, HASH_SHA1);
    345                         for(size_t t = 0; t < HASH_SHA1; t++) {
     351                        hmac(pass, pass_size, temp_hmac, HASH_SHA1,
     352                            work_hmac, HASH_SHA1);
     353                       
     354                        for (size_t t = 0; t < HASH_SHA1; t++)
    346355                                xor_hmac[t] ^= work_hmac[t];
    347                         }
    348356                }
    349                 memcpy(temp_hash + i*HASH_SHA1, xor_hmac, HASH_SHA1);
     357               
     358                memcpy(temp_hash + i * HASH_SHA1, xor_hmac, HASH_SHA1);
    350359        }
    351360       
  • uspace/lib/crypto/crypto.h

    r09044cb r8a64320e  
    3232#include <sys/types.h>
    3333
    34 #define AES_CIPHER_LENGTH 16
    35 #define PBKDF2_KEY_LENGTH 32
     34#define AES_CIPHER_LENGTH  16
     35#define PBKDF2_KEY_LENGTH  32
    3636
    37 /* Left rotation for UINT32. */
    38 #define rotl_uint32(val, shift) (((val) << shift) | ((val) >> (32 - shift)))
     37/* Left rotation for uint32_t. */
     38#define rotl_uint32(val, shift) \
     39        (((val) << shift) | ((val) >> (32 - shift)))
    3940
    40 /* Right rotation for UINT32. */
    41 #define rotr_uint32(val, shift) (((val) >> shift) | ((val) << (32 - shift)))
     41/* Right rotation for uint32_t. */
     42#define rotr_uint32(val, shift) \
     43        (((val) >> shift) | ((val) << (32 - shift)))
    4244
    4345/** Hash function selector and also result hash length indicator. */
    4446typedef enum {
    45         HASH_MD5 =      16,
    46         HASH_SHA1 =     20
     47        HASH_MD5 =  16,
     48        HASH_SHA1 = 20
    4749} hash_func_t;
    4850
    49 extern int rc4(uint8_t *key, size_t key_size, uint8_t *input, size_t input_size,
    50         size_t skip, uint8_t *output);
    51 extern int aes_encrypt(uint8_t *key, uint8_t *input, uint8_t *output);
    52 extern int aes_decrypt(uint8_t *key, uint8_t *input, uint8_t *output);
    53 extern int create_hash(uint8_t *input, size_t input_size, uint8_t *output,
    54         hash_func_t hash_sel);
    55 extern int hmac(uint8_t *key, size_t key_size, uint8_t *msg, size_t msg_size,
    56         uint8_t *hash, hash_func_t hash_sel);
    57 extern int pbkdf2(uint8_t *pass, size_t pass_size, uint8_t *salt,
    58         size_t salt_size, uint8_t *hash);
     51extern int rc4(uint8_t *, size_t, uint8_t *, size_t, size_t, uint8_t *);
     52extern int aes_encrypt(uint8_t *, uint8_t *, uint8_t *);
     53extern int aes_decrypt(uint8_t *, uint8_t *, uint8_t *);
     54extern int create_hash(uint8_t *, size_t, uint8_t *, hash_func_t);
     55extern int hmac(uint8_t *, size_t, uint8_t *, size_t, uint8_t *, hash_func_t);
     56extern int pbkdf2(uint8_t *, size_t, uint8_t *, size_t, uint8_t *);
    5957
    6058#endif
  • uspace/lib/crypto/rc4.c

    r09044cb r8a64320e  
    2828
    2929/** @file rc4.c
    30  * 
     30 *
    3131 * Implementation of ARC4 symmetric cipher cryptographic algorithm.
    32  * 
     32 *
    3333 */
    3434
    3535#include <errno.h>
    3636#include <mem.h>
    37 
    3837#include "crypto.h"
    3938
    4039/* Sbox table size. */
    41 #define SBOX_SIZE 256
     40#define SBOX_SIZE  256
    4241
    43 /**
    44  * Swap two values in sbox.
    45  *
    46  * @param i First index of value in sbox to be swapped.
    47  * @param j Second index of value in sbox to be swapped.
     42/** Swap two values in sbox.
     43 *
     44 * @param i    First index of value in sbox to be swapped.
     45 * @param j    Second index of value in sbox to be swapped.
    4846 * @param sbox Sbox to be modified.
     47 *
    4948 */
    5049static void swap(size_t i, size_t j, uint8_t *sbox)
     
    5554}
    5655
    57 /**
    58  * Sbox initialization procedure.
    59  *
    60  * @param key Input key.
     56/** Sbox initialization procedure.
     57 *
     58 * @param key      Input key.
    6159 * @param key_size Size of key sequence.
    62  * @param sbox Place for result sbox.
     60 * @param sbox     Place for result sbox.
     61 *
    6362 */
    6463static void create_sbox(uint8_t *key, size_t key_size, uint8_t *sbox)
    6564{
    66         for(size_t i = 0; i < SBOX_SIZE; i++) {
     65        for (size_t i = 0; i < SBOX_SIZE; i++)
    6766                sbox[i] = i;
    68         }
    6967       
    7068        uint8_t j = 0;
    71         for(size_t i = 0; i < SBOX_SIZE; i++) {
     69        for (size_t i = 0; i < SBOX_SIZE; i++) {
    7270                j = j + sbox[i] + key[i % key_size];
    7371                swap(i, j, sbox);
     
    7573}
    7674
    77 /**
    78  * ARC4 encryption/decryption algorithm.
    79  *
    80  * @param key Input key.
    81  * @param key_size Size of key sequence.
    82  * @param input Input data sequence to be processed.
     75/** ARC4 encryption/decryption algorithm.
     76 *
     77 * @param key        Input key.
     78 * @param key_size   Size of key sequence.
     79 * @param input      Input data sequence to be processed.
    8380 * @param input_size Size of input data sequence.
    84  * @param skip Number of bytes to be skipped from the beginning of key stream.
    85  * @param output Result data sequence.
    86  *
    87  * @return EINVAL when input or key not specified, ENOMEM when pointer for
    88  * output is not allocated, otherwise EOK. 
     81 * @param skip       Number of bytes to be skipped from
     82 *                   the beginning of key stream.
     83 * @param output     Result data sequence.
     84 *
     85 * @return EINVAL when input or key not specified,
     86 *         ENOMEM when pointer for output is not allocated,
     87 *         otherwise EOK.
     88 *
    8989 */
    90 int rc4(uint8_t *key, size_t key_size, uint8_t *input, size_t input_size, 
    91         size_t skip, uint8_t *output)
     90int rc4(uint8_t *key, size_t key_size, uint8_t *input, size_t input_size,
     91    size_t skip, uint8_t *output)
    9292{
    93         if(!key || !input)
     93        if ((!key) || (!input))
    9494                return EINVAL;
    9595       
    96         if(!output)
     96        if (!output)
    9797                return ENOMEM;
    9898       
     
    102102       
    103103        /* Skip first x bytes. */
    104         uint8_t i = 0, j = 0;
    105         for(size_t k = 0; k < skip; k++) {
     104        uint8_t i = 0;
     105        uint8_t j = 0;
     106        for (size_t k = 0; k < skip; k++) {
    106107                i = i + 1;
    107108                j = j + sbox[i];
     
    111112        /* Processing loop. */
    112113        uint8_t val;
    113         for(size_t k = 0; k < input_size; k++) {
     114        for (size_t k = 0; k < input_size; k++) {
    114115                i = i + 1;
    115116                j = j + sbox[i];
Note: See TracChangeset for help on using the changeset viewer.