SPDX: Convert all of our single license tags to Linux Kernel style
[platform/kernel/u-boot.git] / lib / aes.c
index 05c97cd..a12a192 100644 (file)
--- a/lib/aes.c
+++ b/lib/aes.c
@@ -1,8 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (c) 2011 The Chromium OS Authors.
  * (C) Copyright 2011 NVIDIA Corporation www.nvidia.com
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /*
@@ -27,7 +26,7 @@
 #else
 #include <string.h>
 #endif
-#include "aes.h"
+#include "uboot_aes.h"
 
 /* forward s-box */
 static const u8 sbox[256] = {
@@ -593,16 +592,7 @@ static void debug_print_vector(char *name, u32 num_bytes, u8 *data)
 #endif
 }
 
-/**
- * Apply chain data to the destination using EOR
- *
- * Each array is of length AES_KEY_LENGTH.
- *
- * @cbc_chain_data     Chain data
- * @src                        Source data
- * @dst                        Destination data, which is modified here
- */
-static void apply_cbc_chain_data(u8 *cbc_chain_data, u8 *src, u8 *dst)
+void aes_apply_cbc_chain_data(u8 *cbc_chain_data, u8 *src, u8 *dst)
 {
        int i;
 
@@ -610,12 +600,11 @@ static void apply_cbc_chain_data(u8 *cbc_chain_data, u8 *src, u8 *dst)
                *dst++ = *src++ ^ *cbc_chain_data++;
 }
 
-void aes_cbc_encrypt_blocks(u8 *key_exp, u8 *src, u8 *dst, u32 num_aes_blocks)
+void aes_cbc_encrypt_blocks(u8 *key_exp, u8 *iv, u8 *src, u8 *dst,
+                           u32 num_aes_blocks)
 {
-       u8 zero_key[AES_KEY_LENGTH] = { 0 };
        u8 tmp_data[AES_KEY_LENGTH];
-       /* Convenient array of 0's for IV */
-       u8 *cbc_chain_data = zero_key;
+       u8 *cbc_chain_data = iv;
        u32 i;
 
        for (i = 0; i < num_aes_blocks; i++) {
@@ -623,7 +612,7 @@ void aes_cbc_encrypt_blocks(u8 *key_exp, u8 *src, u8 *dst, u32 num_aes_blocks)
                debug_print_vector("AES Src", AES_KEY_LENGTH, src);
 
                /* Apply the chain data */
-               apply_cbc_chain_data(cbc_chain_data, src, tmp_data);
+               aes_apply_cbc_chain_data(cbc_chain_data, src, tmp_data);
                debug_print_vector("AES Xor", AES_KEY_LENGTH, tmp_data);
 
                /* Encrypt the AES block */
@@ -637,13 +626,15 @@ void aes_cbc_encrypt_blocks(u8 *key_exp, u8 *src, u8 *dst, u32 num_aes_blocks)
        }
 }
 
-void aes_cbc_decrypt_blocks(u8 *key_exp, u8 *src, u8 *dst, u32 num_aes_blocks)
+void aes_cbc_decrypt_blocks(u8 *key_exp, u8 *iv, 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 };
+       u8 cbc_chain_data[AES_KEY_LENGTH];
        u32 i;
 
+       memcpy(cbc_chain_data, iv, AES_KEY_LENGTH);
        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);
@@ -655,7 +646,7 @@ void aes_cbc_decrypt_blocks(u8 *key_exp, u8 *src, u8 *dst, u32 num_aes_blocks)
                debug_print_vector("AES Xor", AES_KEY_LENGTH, tmp_data);
 
                /* Apply the chain data */
-               apply_cbc_chain_data(cbc_chain_data, tmp_data, dst);
+               aes_apply_cbc_chain_data(cbc_chain_data, tmp_data, dst);
                debug_print_vector("AES Dst", AES_KEY_LENGTH, dst);
 
                /* Update pointers for next loop. */