1 /* 2 * Copyright (c) 2011 The Chromium OS Authors. 3 * (C) Copyright 2010 - 2011 NVIDIA Corporation <www.nvidia.com> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #ifndef _AES_REF_H_ 9 #define _AES_REF_H_ 10 11 #ifdef USE_HOSTCC 12 /* Define compat stuff for use in fw_* tools. */ 13 typedef unsigned char u8; 14 typedef unsigned int u32; 15 #define debug(...) do {} while (0) 16 #endif 17 18 /* 19 * AES encryption library, with small code size, supporting only 128-bit AES 20 * 21 * AES is a stream cipher which works a block at a time, with each block 22 * in this case being AES_KEY_LENGTH bytes. 23 */ 24 25 enum { 26 AES_STATECOLS = 4, /* columns in the state & expanded key */ 27 AES_KEYCOLS = 4, /* columns in a key */ 28 AES_ROUNDS = 10, /* rounds in encryption */ 29 30 AES_KEY_LENGTH = 128 / 8, 31 AES_EXPAND_KEY_LENGTH = 4 * AES_STATECOLS * (AES_ROUNDS + 1), 32 }; 33 34 /** 35 * aes_expand_key() - Expand the AES key 36 * 37 * Expand a key into a key schedule, which is then used for the other 38 * operations. 39 * 40 * @key Key, of length AES_KEY_LENGTH bytes 41 * @expkey Buffer to place expanded key, AES_EXPAND_KEY_LENGTH 42 */ 43 void aes_expand_key(u8 *key, u8 *expkey); 44 45 /** 46 * aes_encrypt() - Encrypt single block of data with AES 128 47 * 48 * @in Input data 49 * @expkey Expanded key to use for encryption (from aes_expand_key()) 50 * @out Output data 51 */ 52 void aes_encrypt(u8 *in, u8 *expkey, u8 *out); 53 54 /** 55 * aes_decrypt() - Decrypt single block of data with AES 128 56 * 57 * @in Input data 58 * @expkey Expanded key to use for decryption (from aes_expand_key()) 59 * @out Output data 60 */ 61 void aes_decrypt(u8 *in, u8 *expkey, u8 *out); 62 63 /** 64 * Apply chain data to the destination using EOR 65 * 66 * Each array is of length AES_KEY_LENGTH. 67 * 68 * @cbc_chain_data Chain data 69 * @src Source data 70 * @dst Destination data, which is modified here 71 */ 72 void aes_apply_cbc_chain_data(u8 *cbc_chain_data, u8 *src, u8 *dst); 73 74 /** 75 * aes_cbc_encrypt_blocks() - Encrypt multiple blocks of data with AES CBC. 76 * 77 * @key_exp Expanded key to use 78 * @iv Initialization vector 79 * @src Source data to encrypt 80 * @dst Destination buffer 81 * @num_aes_blocks Number of AES blocks to encrypt 82 */ 83 void aes_cbc_encrypt_blocks(u8 *key_exp, u8 *iv, u8 *src, u8 *dst, 84 u32 num_aes_blocks); 85 86 /** 87 * Decrypt multiple blocks of data with AES CBC. 88 * 89 * @key_exp Expanded key to use 90 * @iv Initialization vector 91 * @src Source data to decrypt 92 * @dst Destination buffer 93 * @num_aes_blocks Number of AES blocks to decrypt 94 */ 95 void aes_cbc_decrypt_blocks(u8 *key_exp, u8 *iv, u8 *src, u8 *dst, 96 u32 num_aes_blocks); 97 98 #endif /* _AES_REF_H_ */ 99