| 760 | */ |
| 761 | #if !defined(MBEDTLS_AES_DECRYPT_ALT) |
| 762 | int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx, |
| 763 | const unsigned char input[16], |
| 764 | unsigned char output[16]) { |
| 765 | int i; |
| 766 | uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; |
| 767 | |
| 768 | RK = ctx->rk; |
| 769 | |
| 770 | GET_UINT32_LE(X0, input, 0); |
| 771 | X0 ^= *RK++; |
| 772 | GET_UINT32_LE(X1, input, 4); |
| 773 | X1 ^= *RK++; |
| 774 | GET_UINT32_LE(X2, input, 8); |
| 775 | X2 ^= *RK++; |
| 776 | GET_UINT32_LE(X3, input, 12); |
| 777 | X3 ^= *RK++; |
| 778 | |
| 779 | for (i = (ctx->nr >> 1) - 1; i > 0; i--) { |
| 780 | AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); |
| 781 | AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); |
| 782 | } |
| 783 | |
| 784 | AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); |
| 785 | |
| 786 | X0 = *RK++ ^ ((uint32_t)RSb[(Y0)&0xFF]) ^ |
| 787 | ((uint32_t)RSb[(Y3 >> 8) & 0xFF] << 8) ^ |
| 788 | ((uint32_t)RSb[(Y2 >> 16) & 0xFF] << 16) ^ |
| 789 | ((uint32_t)RSb[(Y1 >> 24) & 0xFF] << 24); |
| 790 | |
| 791 | X1 = *RK++ ^ ((uint32_t)RSb[(Y1)&0xFF]) ^ |
| 792 | ((uint32_t)RSb[(Y0 >> 8) & 0xFF] << 8) ^ |
| 793 | ((uint32_t)RSb[(Y3 >> 16) & 0xFF] << 16) ^ |
| 794 | ((uint32_t)RSb[(Y2 >> 24) & 0xFF] << 24); |
| 795 | |
| 796 | X2 = *RK++ ^ ((uint32_t)RSb[(Y2)&0xFF]) ^ |
| 797 | ((uint32_t)RSb[(Y1 >> 8) & 0xFF] << 8) ^ |
| 798 | ((uint32_t)RSb[(Y0 >> 16) & 0xFF] << 16) ^ |
| 799 | ((uint32_t)RSb[(Y3 >> 24) & 0xFF] << 24); |
| 800 | |
| 801 | X3 = *RK++ ^ ((uint32_t)RSb[(Y3)&0xFF]) ^ |
| 802 | ((uint32_t)RSb[(Y2 >> 8) & 0xFF] << 8) ^ |
| 803 | ((uint32_t)RSb[(Y1 >> 16) & 0xFF] << 16) ^ |
| 804 | ((uint32_t)RSb[(Y0 >> 24) & 0xFF] << 24); |
| 805 | |
| 806 | PUT_UINT32_LE(X0, output, 0); |
| 807 | PUT_UINT32_LE(X1, output, 4); |
| 808 | PUT_UINT32_LE(X2, output, 8); |
| 809 | PUT_UINT32_LE(X3, output, 12); |
| 810 | |
| 811 | return (0); |
| 812 | } |
| 813 | #endif /* !MBEDTLS_AES_DECRYPT_ALT */ |
| 814 | |
| 815 | /* |
no outgoing calls
no test coverage detected