aes: Implement AES-128-CBC decryption function
authorMarek Vasut <marex@denx.de>
Wed, 5 Mar 2014 18:58:38 +0000 (19:58 +0100)
committerTom Rini <trini@ti.com>
Fri, 21 Mar 2014 20:43:56 +0000 (16:43 -0400)
Implement a compatible AES-128-CBC decryption function as a counterpart
of the encryption function pulled from tegra20-common/crypto.c .

Signed-off-by: Marek Vasut <marex@denx.de>
include/aes.h
lib/aes.c

index d9bb3876140649fd343bc11e67f671c6736e6fac..4897e6faa05e536a374a0603b4ee8b24d30f507e 100644 (file)
@@ -63,4 +63,14 @@ void aes_decrypt(u8 *in, u8 *expkey, u8 *out);
  */
 void aes_cbc_encrypt_blocks(u8 *key_exp, u8 *src, u8 *dst, u32 num_aes_blocks);
 
+/**
+ * Decrypt multiple blocks of data with AES CBC.
+ *
+ * @key_exp            Expanded key to use
+ * @src                        Source data to decrypt
+ * @dst                        Destination buffer
+ * @num_aes_blocks     Number of AES blocks to decrypt
+ */
+void aes_cbc_decrypt_blocks(u8 *key_exp, u8 *src, u8 *dst, u32 num_aes_blocks);
+
 #endif /* _AES_REF_H_ */
index a6648f90db29f714ef52bab78eafecf0bcadbcaa..9dadb22c3ad9b6bb4e738b3b1e91bfd7db6fa846 100644 (file)
--- a/lib/aes.c
+++ b/lib/aes.c
@@ -632,3 +632,31 @@ void aes_cbc_encrypt_blocks(u8 *key_exp, u8 *src, u8 *dst, u32 num_aes_blocks)
                dst += AES_KEY_LENGTH;
        }
 }
+
+void aes_cbc_decrypt_blocks(u8 *key_exp, u8 *src, u8 *dst, u32 num_aes_blocks)
+{
+       u8 tmp_data[AES_KEY_LENGTH], tmp_block[AES_KEY_LENGTH];
+       /* Convenient array of 0's for IV */
+       u8 cbc_chain_data[AES_KEY_LENGTH] = { 0 };
+       u32 i;
+
+       for (i = 0; i < num_aes_blocks; i++) {
+               debug("encrypt_object: block %d of %d\n", i, num_aes_blocks);
+               debug_print_vector("AES Src", AES_KEY_LENGTH, src);
+
+               memcpy(tmp_block, src, AES_KEY_LENGTH);
+
+               /* Decrypt the AES block */
+               aes_decrypt(src, key_exp, tmp_data);
+               debug_print_vector("AES Xor", AES_KEY_LENGTH, tmp_data);
+
+               /* Apply the chain data */
+               apply_cbc_chain_data(cbc_chain_data, tmp_data, dst);
+               debug_print_vector("AES Dst", AES_KEY_LENGTH, dst);
+
+               /* Update pointers for next loop. */
+               memcpy(cbc_chain_data, tmp_block, AES_KEY_LENGTH);
+               src += AES_KEY_LENGTH;
+               dst += AES_KEY_LENGTH;
+       }
+}