1*f6dc9357SAndroid Build Coastguard Worker /* Aes.h -- AES encryption / decryption 2*f6dc9357SAndroid Build Coastguard Worker 2023-04-02 : Igor Pavlov : Public domain */ 3*f6dc9357SAndroid Build Coastguard Worker 4*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_AES_H 5*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_AES_H 6*f6dc9357SAndroid Build Coastguard Worker 7*f6dc9357SAndroid Build Coastguard Worker #include "7zTypes.h" 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker #define AES_BLOCK_SIZE 16 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker /* Call AesGenTables one time before other AES functions */ 14*f6dc9357SAndroid Build Coastguard Worker void AesGenTables(void); 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker /* UInt32 pointers must be 16-byte aligned */ 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker /* 16-byte (4 * 32-bit words) blocks: 1 (IV) + 1 (keyMode) + 15 (AES-256 roundKeys) */ 19*f6dc9357SAndroid Build Coastguard Worker #define AES_NUM_IVMRK_WORDS ((1 + 1 + 15) * 4) 20*f6dc9357SAndroid Build Coastguard Worker 21*f6dc9357SAndroid Build Coastguard Worker /* aes - 16-byte aligned pointer to keyMode+roundKeys sequence */ 22*f6dc9357SAndroid Build Coastguard Worker /* keySize = 16 or 24 or 32 (bytes) */ 23*f6dc9357SAndroid Build Coastguard Worker typedef void (Z7_FASTCALL *AES_SET_KEY_FUNC)(UInt32 *aes, const Byte *key, unsigned keySize); 24*f6dc9357SAndroid Build Coastguard Worker void Z7_FASTCALL Aes_SetKey_Enc(UInt32 *aes, const Byte *key, unsigned keySize); 25*f6dc9357SAndroid Build Coastguard Worker void Z7_FASTCALL Aes_SetKey_Dec(UInt32 *aes, const Byte *key, unsigned keySize); 26*f6dc9357SAndroid Build Coastguard Worker 27*f6dc9357SAndroid Build Coastguard Worker /* ivAes - 16-byte aligned pointer to iv+keyMode+roundKeys sequence: UInt32[AES_NUM_IVMRK_WORDS] */ 28*f6dc9357SAndroid Build Coastguard Worker void AesCbc_Init(UInt32 *ivAes, const Byte *iv); /* iv size is AES_BLOCK_SIZE */ 29*f6dc9357SAndroid Build Coastguard Worker 30*f6dc9357SAndroid Build Coastguard Worker /* data - 16-byte aligned pointer to data */ 31*f6dc9357SAndroid Build Coastguard Worker /* numBlocks - the number of 16-byte blocks in data array */ 32*f6dc9357SAndroid Build Coastguard Worker typedef void (Z7_FASTCALL *AES_CODE_FUNC)(UInt32 *ivAes, Byte *data, size_t numBlocks); 33*f6dc9357SAndroid Build Coastguard Worker 34*f6dc9357SAndroid Build Coastguard Worker extern AES_CODE_FUNC g_AesCbc_Decode; 35*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 36*f6dc9357SAndroid Build Coastguard Worker extern AES_CODE_FUNC g_AesCbc_Encode; 37*f6dc9357SAndroid Build Coastguard Worker extern AES_CODE_FUNC g_AesCtr_Code; 38*f6dc9357SAndroid Build Coastguard Worker #define k_Aes_SupportedFunctions_HW (1 << 2) 39*f6dc9357SAndroid Build Coastguard Worker #define k_Aes_SupportedFunctions_HW_256 (1 << 3) 40*f6dc9357SAndroid Build Coastguard Worker extern UInt32 g_Aes_SupportedFunctions_Flags; 41*f6dc9357SAndroid Build Coastguard Worker #endif 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker 44*f6dc9357SAndroid Build Coastguard Worker #define Z7_DECLARE_AES_CODE_FUNC(funcName) \ 45*f6dc9357SAndroid Build Coastguard Worker void Z7_FASTCALL funcName(UInt32 *ivAes, Byte *data, size_t numBlocks); 46*f6dc9357SAndroid Build Coastguard Worker 47*f6dc9357SAndroid Build Coastguard Worker Z7_DECLARE_AES_CODE_FUNC (AesCbc_Encode) 48*f6dc9357SAndroid Build Coastguard Worker Z7_DECLARE_AES_CODE_FUNC (AesCbc_Decode) 49*f6dc9357SAndroid Build Coastguard Worker Z7_DECLARE_AES_CODE_FUNC (AesCtr_Code) 50*f6dc9357SAndroid Build Coastguard Worker 51*f6dc9357SAndroid Build Coastguard Worker Z7_DECLARE_AES_CODE_FUNC (AesCbc_Encode_HW) 52*f6dc9357SAndroid Build Coastguard Worker Z7_DECLARE_AES_CODE_FUNC (AesCbc_Decode_HW) 53*f6dc9357SAndroid Build Coastguard Worker Z7_DECLARE_AES_CODE_FUNC (AesCtr_Code_HW) 54*f6dc9357SAndroid Build Coastguard Worker 55*f6dc9357SAndroid Build Coastguard Worker Z7_DECLARE_AES_CODE_FUNC (AesCbc_Decode_HW_256) 56*f6dc9357SAndroid Build Coastguard Worker Z7_DECLARE_AES_CODE_FUNC (AesCtr_Code_HW_256) 57*f6dc9357SAndroid Build Coastguard Worker 58*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END 59*f6dc9357SAndroid Build Coastguard Worker 60*f6dc9357SAndroid Build Coastguard Worker #endif 61