diff options
Diffstat (limited to 'networking/tls_aes.c')
-rw-r--r-- | networking/tls_aes.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/networking/tls_aes.c b/networking/tls_aes.c index c137442e9..cf6b5fe3d 100644 --- a/networking/tls_aes.c +++ b/networking/tls_aes.c | |||
@@ -326,8 +326,11 @@ static void InvMixColumns(unsigned astate[16]) | |||
326 | } | 326 | } |
327 | } | 327 | } |
328 | 328 | ||
329 | static void aes_encrypt_1(unsigned astate[16], unsigned rounds, const uint32_t *RoundKey) | 329 | static void aes_encrypt_1(struct tls_aes *aes, unsigned astate[16]) |
330 | { | 330 | { |
331 | unsigned rounds = aes->rounds; | ||
332 | const uint32_t *RoundKey = aes->key; | ||
333 | |||
331 | for (;;) { | 334 | for (;;) { |
332 | AddRoundKey(astate, RoundKey); | 335 | AddRoundKey(astate, RoundKey); |
333 | RoundKey += 4; | 336 | RoundKey += 4; |
@@ -340,8 +343,12 @@ static void aes_encrypt_1(unsigned astate[16], unsigned rounds, const uint32_t * | |||
340 | AddRoundKey(astate, RoundKey); | 343 | AddRoundKey(astate, RoundKey); |
341 | } | 344 | } |
342 | 345 | ||
343 | #if 0 // UNUSED | 346 | void FAST_FUNC aes_setkey(struct tls_aes *aes, const void *key, unsigned key_len) |
344 | static void aes_encrypt_one_block(unsigned rounds, const uint32_t *RoundKey, const void *data, void *dst) | 347 | { |
348 | aes->rounds = KeyExpansion(aes->key, key, key_len); | ||
349 | } | ||
350 | |||
351 | void FAST_FUNC aes_encrypt_one_block(struct tls_aes *aes, const void *data, void *dst) | ||
345 | { | 352 | { |
346 | unsigned astate[16]; | 353 | unsigned astate[16]; |
347 | unsigned i; | 354 | unsigned i; |
@@ -351,23 +358,19 @@ static void aes_encrypt_one_block(unsigned rounds, const uint32_t *RoundKey, con | |||
351 | 358 | ||
352 | for (i = 0; i < 16; i++) | 359 | for (i = 0; i < 16; i++) |
353 | astate[i] = pt[i]; | 360 | astate[i] = pt[i]; |
354 | aes_encrypt_1(astate, rounds, RoundKey); | 361 | aes_encrypt_1(aes, astate); |
355 | for (i = 0; i < 16; i++) | 362 | for (i = 0; i < 16; i++) |
356 | ct[i] = astate[i]; | 363 | ct[i] = astate[i]; |
357 | } | 364 | } |
358 | #endif | ||
359 | 365 | ||
360 | void aes_cbc_encrypt(const void *key, int klen, void *iv, const void *data, size_t len, void *dst) | 366 | void FAST_FUNC aes_cbc_encrypt(struct tls_aes *aes, void *iv, const void *data, size_t len, void *dst) |
361 | { | 367 | { |
362 | uint32_t RoundKey[60]; | ||
363 | uint8_t iv2[16]; | 368 | uint8_t iv2[16]; |
364 | unsigned rounds; | ||
365 | 369 | ||
366 | const uint8_t *pt = data; | 370 | const uint8_t *pt = data; |
367 | uint8_t *ct = dst; | 371 | uint8_t *ct = dst; |
368 | 372 | ||
369 | memcpy(iv2, iv, 16); | 373 | memcpy(iv2, iv, 16); |
370 | rounds = KeyExpansion(RoundKey, key, klen); | ||
371 | while (len > 0) { | 374 | while (len > 0) { |
372 | { | 375 | { |
373 | /* almost aes_encrypt_one_block(rounds, RoundKey, pt, ct); | 376 | /* almost aes_encrypt_one_block(rounds, RoundKey, pt, ct); |
@@ -378,7 +381,7 @@ void aes_cbc_encrypt(const void *key, int klen, void *iv, const void *data, size | |||
378 | unsigned astate[16]; | 381 | unsigned astate[16]; |
379 | for (i = 0; i < 16; i++) | 382 | for (i = 0; i < 16; i++) |
380 | astate[i] = pt[i] ^ iv2[i]; | 383 | astate[i] = pt[i] ^ iv2[i]; |
381 | aes_encrypt_1(astate, rounds, RoundKey); | 384 | aes_encrypt_1(aes, astate); |
382 | for (i = 0; i < 16; i++) | 385 | for (i = 0; i < 16; i++) |
383 | iv2[i] = ct[i] = astate[i]; | 386 | iv2[i] = ct[i] = astate[i]; |
384 | } | 387 | } |
@@ -388,8 +391,11 @@ void aes_cbc_encrypt(const void *key, int klen, void *iv, const void *data, size | |||
388 | } | 391 | } |
389 | } | 392 | } |
390 | 393 | ||
391 | static void aes_decrypt_1(unsigned astate[16], unsigned rounds, const uint32_t *RoundKey) | 394 | static void aes_decrypt_1(struct tls_aes *aes, unsigned astate[16]) |
392 | { | 395 | { |
396 | unsigned rounds = aes->rounds; | ||
397 | const uint32_t *RoundKey = aes->key; | ||
398 | |||
393 | RoundKey += rounds * 4; | 399 | RoundKey += rounds * 4; |
394 | AddRoundKey(astate, RoundKey); | 400 | AddRoundKey(astate, RoundKey); |
395 | for (;;) { | 401 | for (;;) { |
@@ -404,8 +410,10 @@ static void aes_decrypt_1(unsigned astate[16], unsigned rounds, const uint32_t * | |||
404 | } | 410 | } |
405 | 411 | ||
406 | #if 0 //UNUSED | 412 | #if 0 //UNUSED |
407 | static void aes_decrypt_one_block(unsigned rounds, const uint32_t *RoundKey, const void *data, void *dst) | 413 | static void aes_decrypt_one_block(struct tls_aes *aes, const void *data, void *dst) |
408 | { | 414 | { |
415 | unsigned rounds = aes->rounds; | ||
416 | const uint32_t *RoundKey = aes->key; | ||
409 | unsigned astate[16]; | 417 | unsigned astate[16]; |
410 | unsigned i; | 418 | unsigned i; |
411 | 419 | ||
@@ -414,25 +422,22 @@ static void aes_decrypt_one_block(unsigned rounds, const uint32_t *RoundKey, con | |||
414 | 422 | ||
415 | for (i = 0; i < 16; i++) | 423 | for (i = 0; i < 16; i++) |
416 | astate[i] = ct[i]; | 424 | astate[i] = ct[i]; |
417 | aes_decrypt_1(astate, rounds, RoundKey); | 425 | aes_decrypt_1(aes, astate); |
418 | for (i = 0; i < 16; i++) | 426 | for (i = 0; i < 16; i++) |
419 | pt[i] = astate[i]; | 427 | pt[i] = astate[i]; |
420 | } | 428 | } |
421 | #endif | 429 | #endif |
422 | 430 | ||
423 | void aes_cbc_decrypt(const void *key, int klen, void *iv, const void *data, size_t len, void *dst) | 431 | void FAST_FUNC aes_cbc_decrypt(struct tls_aes *aes, void *iv, const void *data, size_t len, void *dst) |
424 | { | 432 | { |
425 | uint32_t RoundKey[60]; | ||
426 | uint8_t iv2[16]; | 433 | uint8_t iv2[16]; |
427 | uint8_t iv3[16]; | 434 | uint8_t iv3[16]; |
428 | unsigned rounds; | ||
429 | uint8_t *ivbuf; | 435 | uint8_t *ivbuf; |
430 | uint8_t *ivnext; | 436 | uint8_t *ivnext; |
431 | 437 | ||
432 | const uint8_t *ct = data; | 438 | const uint8_t *ct = data; |
433 | uint8_t *pt = dst; | 439 | uint8_t *pt = dst; |
434 | 440 | ||
435 | rounds = KeyExpansion(RoundKey, key, klen); | ||
436 | ivbuf = memcpy(iv2, iv, 16); | 441 | ivbuf = memcpy(iv2, iv, 16); |
437 | while (len) { | 442 | while (len) { |
438 | ivnext = (ivbuf==iv2) ? iv3 : iv2; | 443 | ivnext = (ivbuf==iv2) ? iv3 : iv2; |
@@ -444,7 +449,7 @@ void aes_cbc_decrypt(const void *key, int klen, void *iv, const void *data, size | |||
444 | unsigned astate[16]; | 449 | unsigned astate[16]; |
445 | for (i = 0; i < 16; i++) | 450 | for (i = 0; i < 16; i++) |
446 | ivnext[i] = astate[i] = ct[i]; | 451 | ivnext[i] = astate[i] = ct[i]; |
447 | aes_decrypt_1(astate, rounds, RoundKey); | 452 | aes_decrypt_1(aes, astate); |
448 | for (i = 0; i < 16; i++) | 453 | for (i = 0; i < 16; i++) |
449 | pt[i] = astate[i] ^ ivbuf[i]; | 454 | pt[i] = astate[i] ^ ivbuf[i]; |
450 | } | 455 | } |