Changeset a35b458 in mainline for uspace/lib/crypto
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- Location:
- uspace/lib/crypto
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/crypto/aes.c
r3061bc1 ra35b458 213 213 uint8_t i = byte >> 4; 214 214 uint8_t j = byte & 0xF; 215 215 216 216 if (!inv) 217 217 return sbox[i][j]; 218 218 219 219 return inv_sbox[i][j]; 220 220 } … … 229 229 { 230 230 uint8_t val; 231 231 232 232 for (size_t i = 0; i < ELEMS; i++) { 233 233 for (size_t j = 0; j < ELEMS; j++) { … … 246 246 { 247 247 uint8_t temp[ELEMS]; 248 248 249 249 for (size_t i = 1; i < ELEMS; i++) { 250 250 memcpy(temp, state[i], i); … … 262 262 { 263 263 uint8_t temp[ELEMS]; 264 264 265 265 for (size_t i = 1; i < ELEMS; i++) { 266 266 memcpy(temp, state[i], ELEMS - i); … … 282 282 uint8_t result = 0; 283 283 uint8_t f_bith; 284 284 285 285 for (size_t i = 0; i < 8; i++) { 286 286 if (y & 1) 287 287 result ^= x; 288 288 289 289 f_bith = (x & 0x80); 290 290 x <<= 1; 291 291 292 292 if (f_bith) 293 293 x ^= AES_IP; 294 294 295 295 y >>= 1; 296 296 } 297 297 298 298 return result; 299 299 } … … 308 308 uint8_t orig_state[ELEMS][ELEMS]; 309 309 memcpy(orig_state, state, BLOCK_LEN); 310 310 311 311 for (size_t j = 0; j < ELEMS; j++) { 312 312 state[0][j] = … … 342 342 uint8_t orig_state[ELEMS][ELEMS]; 343 343 memcpy(orig_state, state, BLOCK_LEN); 344 344 345 345 for (size_t j = 0; j < ELEMS; j++) { 346 346 state[0][j] = … … 378 378 uint8_t shift; 379 379 uint32_t mask = 0xff; 380 380 381 381 for (size_t j = 0; j < ELEMS; j++) { 382 382 for (size_t i = 0; i < ELEMS; i++) { … … 399 399 uint32_t temp = word; 400 400 uint8_t *start = (uint8_t *) &temp; 401 401 402 402 for (size_t i = 0; i < 4; i++) 403 403 *(start + i) = sub_byte(*(start + i), false); 404 404 405 405 return temp; 406 406 } … … 427 427 { 428 428 uint32_t temp; 429 429 430 430 for (size_t i = 0; i < CIPHER_ELEMS; i++) { 431 431 key_exp[i] = … … 435 435 (key[4 * i + 3]); 436 436 } 437 437 438 438 for (size_t i = CIPHER_ELEMS; i < ELEMS * (ROUNDS + 1); i++) { 439 439 temp = key_exp[i - 1]; 440 440 441 441 if ((i % CIPHER_ELEMS) == 0) { 442 442 temp = sub_word(rot_word(temp)) ^ 443 443 r_con_array[i / CIPHER_ELEMS - 1]; 444 444 } 445 445 446 446 key_exp[i] = key_exp[i - CIPHER_ELEMS] ^ temp; 447 447 } … … 463 463 if ((!key) || (!input)) 464 464 return EINVAL; 465 465 466 466 if (!output) 467 467 return ENOMEM; 468 468 469 469 /* Create key expansion. */ 470 470 uint32_t key_exp[ELEMS * (ROUNDS + 1)]; 471 471 key_expansion(key, key_exp); 472 472 473 473 /* Copy input into state array. */ 474 474 uint8_t state[ELEMS][ELEMS]; … … 477 477 state[i][j] = input[i + ELEMS * j]; 478 478 } 479 479 480 480 /* Processing loop. */ 481 481 add_round_key(state, key_exp); 482 482 483 483 for (size_t k = 1; k <= ROUNDS; k++) { 484 484 sub_bytes(state, false); 485 485 shift_rows(state); 486 486 487 487 if (k < ROUNDS) 488 488 mix_columns(state); 489 489 490 490 add_round_key(state, key_exp + k * ELEMS); 491 491 } 492 492 493 493 /* Copy state array into output. */ 494 494 for (size_t i = 0; i < ELEMS; i++) { … … 496 496 output[i + j * ELEMS] = state[i][j]; 497 497 } 498 498 499 499 return EOK; 500 500 } … … 515 515 if ((!key) || (!input)) 516 516 return EINVAL; 517 517 518 518 if (!output) 519 519 return ENOMEM; 520 520 521 521 /* Create key expansion. */ 522 522 uint32_t key_exp[ELEMS * (ROUNDS + 1)]; 523 523 key_expansion(key, key_exp); 524 524 525 525 /* Copy input into state array. */ 526 526 uint8_t state[ELEMS][ELEMS]; … … 529 529 state[i][j] = input[i + ELEMS * j]; 530 530 } 531 531 532 532 /* Processing loop. */ 533 533 add_round_key(state, key_exp + ROUNDS * ELEMS); 534 534 535 535 for (int k = ROUNDS - 1; k >= 0; k--) { 536 536 inv_shift_rows(state); 537 537 sub_bytes(state, true); 538 538 add_round_key(state, key_exp + k * ELEMS); 539 539 540 540 if (k > 0) 541 541 inv_mix_columns(state); 542 542 } 543 543 544 544 /* Copy state array into output. */ 545 545 for (size_t i = 0; i < ELEMS; i++) { … … 547 547 output[i + j * ELEMS] = state[i][j]; 548 548 } 549 549 550 550 return EOK; 551 551 } -
uspace/lib/crypto/crypto.c
r3061bc1 ra35b458 101 101 uint32_t f, g, temp; 102 102 uint32_t w[HASH_MD5 / 4]; 103 103 104 104 memcpy(w, h, (HASH_MD5 / 4) * sizeof(uint32_t)); 105 105 106 106 for (size_t k = 0; k < 64; k++) { 107 107 if (k < 16) { … … 118 118 g = 7 * k % 16; 119 119 } 120 120 121 121 temp = w[3]; 122 122 w[3] = w[2]; … … 127 127 w[0] = temp; 128 128 } 129 129 130 130 for (uint8_t k = 0; k < HASH_MD5 / 4; k++) 131 131 h[k] += w[k]; … … 142 142 uint32_t f, cf, temp; 143 143 uint32_t w[HASH_SHA1 / 4]; 144 144 145 145 for (size_t k = 16; k < 80; k++) { 146 146 sched_arr[k] = rotl_uint32( … … 151 151 1); 152 152 } 153 153 154 154 memcpy(w, h, (HASH_SHA1 / 4) * sizeof(uint32_t)); 155 155 156 156 for (size_t k = 0; k < 80; k++) { 157 157 if (k < 20) { … … 168 168 cf = 0xca62c1d6; 169 169 } 170 170 171 171 temp = rotl_uint32(w[0], 5) + f + w[4] + cf + sched_arr[k]; 172 172 173 173 w[4] = w[3]; 174 174 w[3] = w[2]; … … 177 177 w[0] = temp; 178 178 } 179 179 180 180 for (uint8_t k = 0; k < HASH_SHA1 / 4; k++) 181 181 h[k] += w[k]; … … 199 199 if (!input) 200 200 return EINVAL; 201 201 202 202 if (!output) 203 203 return ENOMEM; 204 204 205 205 hash_fnc_t hash_func = (hash_sel == HASH_MD5) ? md5_proc : sha1_proc; 206 206 207 207 /* Prepare scheduled input. */ 208 208 uint8_t work_input[input_size + 1]; 209 209 memcpy(work_input, input, input_size); 210 210 work_input[input_size] = 0x80; 211 211 212 212 // FIXME: double? 213 213 size_t blocks = ceil_uint32((((double) input_size + 1) / 4 + 2) / 16); … … 222 222 } 223 223 } 224 224 225 225 uint64_t bits_size = (uint64_t) (input_size * 8); 226 226 if (hash_sel == HASH_MD5) 227 227 bits_size = uint64_t_byteorder_swap(bits_size); 228 228 229 229 work_arr[(blocks - 1) * 16 + 14] = bits_size >> 32; 230 230 work_arr[(blocks - 1) * 16 + 15] = bits_size & 0xffffffff; 231 231 232 232 /* Hash computation. */ 233 233 uint32_t h[hash_sel / 4]; … … 237 237 for (size_t k = 0; k < 16; k++) 238 238 sched_arr[k] = work_arr[i * 16 + k]; 239 239 240 240 hash_func(h, sched_arr); 241 241 } 242 242 243 243 /* Copy hash parts into final result. */ 244 244 for (size_t i = 0; i < hash_sel / 4; i++) { 245 245 if (hash_sel == HASH_SHA1) 246 246 h[i] = uint32_t_byteorder_swap(h[i]); 247 247 248 248 memcpy(output + i * sizeof(uint32_t), &h[i], sizeof(uint32_t)); 249 249 } 250 250 251 251 return EOK; 252 252 } … … 271 271 if ((!key) || (!msg)) 272 272 return EINVAL; 273 273 274 274 if (!hash) 275 275 return ENOMEM; 276 276 277 277 uint8_t work_key[HMAC_BLOCK_LENGTH]; 278 278 uint8_t o_key_pad[HMAC_BLOCK_LENGTH]; … … 280 280 uint8_t temp_hash[hash_sel]; 281 281 memset(work_key, 0, HMAC_BLOCK_LENGTH); 282 282 283 283 if(key_size > HMAC_BLOCK_LENGTH) 284 284 create_hash(key, key_size, work_key, hash_sel); 285 285 else 286 286 memcpy(work_key, key, key_size); 287 287 288 288 for (size_t i = 0; i < HMAC_BLOCK_LENGTH; i++) { 289 289 o_key_pad[i] = work_key[i] ^ 0x5c; 290 290 i_key_pad[i] = work_key[i] ^ 0x36; 291 291 } 292 292 293 293 uint8_t temp_work[HMAC_BLOCK_LENGTH + max(msg_size, hash_sel)]; 294 294 memcpy(temp_work, i_key_pad, HMAC_BLOCK_LENGTH); 295 295 memcpy(temp_work + HMAC_BLOCK_LENGTH, msg, msg_size); 296 296 297 297 create_hash(temp_work, HMAC_BLOCK_LENGTH + msg_size, temp_hash, 298 298 hash_sel); 299 299 300 300 memcpy(temp_work, o_key_pad, HMAC_BLOCK_LENGTH); 301 301 memcpy(temp_work + HMAC_BLOCK_LENGTH, temp_hash, hash_sel); 302 302 303 303 create_hash(temp_work, HMAC_BLOCK_LENGTH + hash_sel, hash, hash_sel); 304 304 305 305 return EOK; 306 306 } … … 327 327 if ((!pass) || (!salt)) 328 328 return EINVAL; 329 329 330 330 if (!hash) 331 331 return ENOMEM; 332 332 333 333 uint8_t work_salt[salt_size + 4]; 334 334 memcpy(work_salt, salt, salt_size); … … 337 337 uint8_t xor_hmac[HASH_SHA1]; 338 338 uint8_t temp_hash[HASH_SHA1 * 2]; 339 339 340 340 for (size_t i = 0; i < 2; i++) { 341 341 uint32_t be_i = host2uint32_t_be(i + 1); 342 342 343 343 memcpy(work_salt + salt_size, &be_i, 4); 344 344 hmac(pass, pass_size, work_salt, salt_size + 4, 345 345 work_hmac, HASH_SHA1); 346 346 memcpy(xor_hmac, work_hmac, HASH_SHA1); 347 347 348 348 for (size_t k = 1; k < 4096; k++) { 349 349 memcpy(temp_hmac, work_hmac, HASH_SHA1); 350 350 hmac(pass, pass_size, temp_hmac, HASH_SHA1, 351 351 work_hmac, HASH_SHA1); 352 352 353 353 for (size_t t = 0; t < HASH_SHA1; t++) 354 354 xor_hmac[t] ^= work_hmac[t]; 355 355 } 356 356 357 357 memcpy(temp_hash + i * HASH_SHA1, xor_hmac, HASH_SHA1); 358 358 } 359 359 360 360 memcpy(hash, temp_hash, PBKDF2_KEY_LENGTH); 361 361 362 362 return EOK; 363 363 } -
uspace/lib/crypto/rc4.c
r3061bc1 ra35b458 65 65 for (size_t i = 0; i < SBOX_SIZE; i++) 66 66 sbox[i] = i; 67 67 68 68 uint8_t j = 0; 69 69 for (size_t i = 0; i < SBOX_SIZE; i++) { … … 93 93 if ((!key) || (!input)) 94 94 return EINVAL; 95 95 96 96 if (!output) 97 97 return ENOMEM; 98 98 99 99 /* Initialize sbox. */ 100 100 uint8_t sbox[SBOX_SIZE]; 101 101 create_sbox(key, key_size, sbox); 102 102 103 103 /* Skip first x bytes. */ 104 104 uint8_t i = 0; … … 109 109 swap(i, j, sbox); 110 110 } 111 111 112 112 /* Processing loop. */ 113 113 uint8_t val; … … 119 119 output[k] = val ^ input[k]; 120 120 } 121 121 122 122 return EOK; 123 123 }
Note:
See TracChangeset
for help on using the changeset viewer.