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