add AES-OFB mode

This commit is contained in:
Jacob Barthelmeh
2020-01-21 15:51:12 -08:00
committed by Eric Blankenhorn
parent 65732c2269
commit e837894578
4 changed files with 437 additions and 18 deletions

View File

@@ -130,6 +130,7 @@ then
enable_aesgcm=yes
enable_aesccm=yes
enable_aesctr=yes
enable_aesofb=yes
enable_aescfb=yes
enable_camellia=yes
enable_ripemd=yes
@@ -965,6 +966,19 @@ then
fi
# AES-OFB
AC_ARG_ENABLE([aesofb],
[AS_HELP_STRING([--enable-aesofb],[Enable wolfSSL AES-OFB support (default: disabled)])],
[ ENABLED_AESOFB=$enableval ],
[ ENABLED_AESOFB=no ]
)
if test "$ENABLED_AESOFB" = "yes"
then
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_OFB -DWOLFSSL_AES_DIRECT"
fi
# AES-CFB
AC_ARG_ENABLE([aescfb],
[AS_HELP_STRING([--enable-aescfb],[Enable wolfSSL AES-CFB support (default: disabled)])],

View File

@@ -1964,7 +1964,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
#if !defined(WOLFSSL_STM32_CUBEMX) || defined(STM32_HAL_V2)
ByteReverseWords(rk, rk, keylen);
#endif
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER)
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER) || \
defined(WOLFSSL_AES_OFB)
aes->left = 0;
#endif
@@ -2037,7 +2038,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
if (iv)
XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE);
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER)
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER) || \
defined(WOLFSSL_AES_OFB)
aes->left = 0;
#endif
@@ -2053,7 +2055,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
aes->rounds = keylen/4 + 6;
XMEMCPY(aes->key, userKey, keylen);
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER)
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER) || \
defined(WOLFSSL_AES_OFB)
aes->left = 0;
#endif
@@ -2083,7 +2086,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
if (rk == NULL)
return BAD_FUNC_ARG;
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER)
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER) || \
defined(WOLFSSL_AES_OFB)
aes->left = 0;
#endif
@@ -2150,7 +2154,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
aes->rounds = keylen/4 + 6;
ret = nrf51_aes_set_key(userKey);
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER)
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER) || \
defined(WOLFSSL_AES_OFB)
aes->left = 0;
#endif
@@ -2288,7 +2293,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
#ifdef WOLFSSL_AESNI
aes->use_aesni = 0;
#endif /* WOLFSSL_AESNI */
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER)
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER) || \
defined(WOLFSSL_AES_OFB)
aes->left = 0;
#endif
@@ -2497,7 +2503,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
checkAESNI = 1;
}
if (haveAESNI) {
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) || \
defined(WOLFSSL_AES_OFB)
aes->left = 0;
#endif /* WOLFSSL_AES_COUNTER */
aes->use_aesni = 1;
@@ -7252,43 +7259,64 @@ int wc_AesEcbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
#endif
#endif /* HAVE_AES_ECB */
#ifdef WOLFSSL_AES_CFB
/* CFB 128
#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_OFB)
/* Feedback AES mode
*
* aes structure holding key to use for encryption
* out buffer to hold result of encryption (must be at least as large as input
* buffer)
* in buffer to encrypt
* sz size of input buffer
* pre flag to xor after or before feedback. If 1 then add feedback before xor
*
* returns 0 on success and negative error values on failure
*/
/* Software AES - CFB Encrypt */
int wc_AesCfbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
static int wc_AesFeedbackEncrypt(Aes* aes, byte* out, const byte* in,
word32 sz, byte mode)
{
byte* tmp = NULL;
#ifdef WOLFSSL_AES_CFB
byte* reg = NULL;
#endif
if (aes == NULL || out == NULL || in == NULL) {
return BAD_FUNC_ARG;
}
#ifdef WOLFSSL_AES_CFB
if (aes->left && sz) {
reg = (byte*)aes->reg + AES_BLOCK_SIZE - aes->left;
}
#endif
/* consume any unused bytes left in aes->tmp */
tmp = (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left;
while (aes->left && sz) {
*(out++) = *(reg++) = *(in++) ^ *(tmp++);
*(out) = *(in++) ^ *(tmp++);
#ifdef WOLFSSL_AES_CFB
if (mode == AES_CFB_MODE) {
*(reg++) = *out;
}
#endif
out++;
aes->left--;
sz--;
}
while (sz >= AES_BLOCK_SIZE) {
wc_AesEncryptDirect(aes, out, (byte*)aes->reg);
#ifdef WOLFSSL_AES_OFB
if (mode == AES_OFB_MODE) {
XMEMCPY(aes->reg, out, AES_BLOCK_SIZE);
}
#endif
xorbuf(out, in, AES_BLOCK_SIZE);
XMEMCPY(aes->reg, out, AES_BLOCK_SIZE);
#ifdef WOLFSSL_AES_CFB
if (mode == AES_CFB_MODE) {
XMEMCPY(aes->reg, out, AES_BLOCK_SIZE);
}
#endif
out += AES_BLOCK_SIZE;
in += AES_BLOCK_SIZE;
sz -= AES_BLOCK_SIZE;
@@ -7300,10 +7328,23 @@ int wc_AesCfbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
wc_AesEncryptDirect(aes, (byte*)aes->tmp, (byte*)aes->reg);
aes->left = AES_BLOCK_SIZE;
tmp = (byte*)aes->tmp;
#ifdef WOLFSSL_AES_OFB
if (mode == AES_OFB_MODE) {
XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE);
}
#endif
#ifdef WOLFSSL_AES_CFB
reg = (byte*)aes->reg;
#endif
while (sz--) {
*(out++) = *(reg++) = *(in++) ^ *(tmp++);
*(out) = *(in++) ^ *(tmp++);
#ifdef WOLFSSL_AES_CFB
if (mode == AES_CFB_MODE) {
*(reg++) = *out;
}
#endif
out++;
aes->left--;
}
}
@@ -7324,7 +7365,8 @@ int wc_AesCfbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
* returns 0 on success and negative error values on failure
*/
/* Software AES - CFB Decrypt */
int wc_AesCfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
static int wc_AesFeedbackDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
byte mode)
{
byte* tmp;
@@ -7333,7 +7375,7 @@ int wc_AesCfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
}
/* check if more input needs copied over to aes->reg */
if (aes->left && sz) {
if (aes->left && sz && mode == AES_CFB_MODE) {
int size = min(aes->left, sz);
XMEMCPY((byte*)aes->reg + AES_BLOCK_SIZE - aes->left, in, size);
}
@@ -7348,8 +7390,17 @@ int wc_AesCfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
while (sz > AES_BLOCK_SIZE) {
wc_AesEncryptDirect(aes, out, (byte*)aes->reg);
#ifdef WOLFSSL_AES_OFB
if (mode == AES_OFB_MODE) {
XMEMCPY(aes->reg, out, AES_BLOCK_SIZE);
}
#endif
xorbuf(out, in, AES_BLOCK_SIZE);
XMEMCPY(aes->reg, in, AES_BLOCK_SIZE);
#ifdef WOLFSSL_AES_CFB
if (mode == AES_CFB_MODE) {
XMEMCPY(aes->reg, in, AES_BLOCK_SIZE);
}
#endif
out += AES_BLOCK_SIZE;
in += AES_BLOCK_SIZE;
sz -= AES_BLOCK_SIZE;
@@ -7359,7 +7410,13 @@ int wc_AesCfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
/* decrypt left over data */
if (sz) {
wc_AesEncryptDirect(aes, (byte*)aes->tmp, (byte*)aes->reg);
XMEMCPY(aes->reg, in, sz);
if (mode == AES_CFB_MODE) {
XMEMCPY(aes->reg, in, sz);
}
if (mode == AES_OFB_MODE) {
XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE);
}
aes->left = AES_BLOCK_SIZE;
tmp = (byte*)aes->tmp;
@@ -7374,6 +7431,80 @@ int wc_AesCfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
#endif /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_CFB */
#ifdef WOLFSSL_AES_CFB
/* CFB 128
*
* aes structure holding key to use for encryption
* out buffer to hold result of encryption (must be at least as large as input
* buffer)
* in buffer to encrypt
* sz size of input buffer
*
* returns 0 on success and negative error values on failure
*/
/* Software AES - CFB Encrypt */
int wc_AesCfbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
{
return wc_AesFeedbackEncrypt(aes, out, in, sz, AES_CFB_MODE);
}
#ifdef HAVE_AES_DECRYPT
/* CFB 128
*
* aes structure holding key to use for decryption
* out buffer to hold result of decryption (must be at least as large as input
* buffer)
* in buffer to decrypt
* sz size of input buffer
*
* returns 0 on success and negative error values on failure
*/
/* Software AES - CFB Decrypt */
int wc_AesCfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
{
return wc_AesFeedbackDecrypt(aes, out, in, sz, AES_CFB_MODE);
}
#endif /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_CFB */
#ifdef WOLFSSL_AES_OFB
/* OFB
*
* aes structure holding key to use for encryption
* out buffer to hold result of encryption (must be at least as large as input
* buffer)
* in buffer to encrypt
* sz size of input buffer
*
* returns 0 on success and negative error values on failure
*/
/* Software AES - CFB Encrypt */
int wc_AesOfbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
{
return wc_AesFeedbackEncrypt(aes, out, in, sz, AES_OFB_MODE);
}
#ifdef HAVE_AES_DECRYPT
/* OFB
*
* aes structure holding key to use for decryption
* out buffer to hold result of decryption (must be at least as large as input
* buffer)
* in buffer to decrypt
* sz size of input buffer
*
* returns 0 on success and negative error values on failure
*/
/* Software AES - OFB Decrypt */
int wc_AesOfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
{
return wc_AesFeedbackDecrypt(aes, out, in, sz, AES_OFB_MODE);
}
#endif /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_CFB */
#ifdef HAVE_AES_KEYWRAP

View File

@@ -302,6 +302,7 @@ int des3_test(void);
int aes_test(void);
int aes192_test(void);
int aes256_test(void);
int aesofb_test(void);
int cmac_test(void);
int poly1305_test(void);
int aesgcm_test(void);
@@ -865,6 +866,14 @@ initDefaultName();
else
test_pass("AES256 test passed!\n");
#endif
#ifdef WOLFSSL_AES_OFB
if ( (ret = aesofb_test()) != 0)
return err_sys("AES-OFB test failed!\n", ret);
else
test_pass("AESOFB test passed!\n");
#endif
#ifdef HAVE_AESGCM
#if !defined(WOLFSSL_AFALG) && !defined(WOLFSSL_DEVCRYPTO)
if ( (ret = aesgcm_test()) != 0)
@@ -5856,6 +5865,255 @@ int des3_test(void)
}
#endif /* WOLFSSL_AES_CFB */
#ifdef WOLFSSL_AES_OFB
/* test vector from https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/Block-Ciphers */
int aesofb_test(void)
{
#ifdef WOLFSSL_AES_256
const byte key1[] =
{
0xc4,0xc7,0xfa,0xd6,0x53,0x5c,0xb8,0x71,
0x4a,0x5c,0x40,0x77,0x9a,0x8b,0xa1,0xd2,
0x53,0x3e,0x23,0xb4,0xb2,0x58,0x73,0x2a,
0x5b,0x78,0x01,0xf4,0xe3,0x71,0xa7,0x94
};
const byte iv1[] =
{
0x5e,0xb9,0x33,0x13,0xb8,0x71,0xff,0x16,
0xb9,0x8a,0x9b,0xcb,0x43,0x33,0x0d,0x6f
};
const byte plain1[] =
{
0x6d,0x0b,0xb0,0x79,0x63,0x84,0x71,0xe9,
0x39,0xd4,0x53,0x14,0x86,0xc1,0x4c,0x25,
0x9a,0xee,0xc6,0xf3,0xc0,0x0d,0xfd,0xd6,
0xc0,0x50,0xa8,0xba,0xa8,0x20,0xdb,0x71,
0xcc,0x12,0x2c,0x4e,0x0c,0x17,0x15,0xef,
0x55,0xf3,0x99,0x5a,0x6b,0xf0,0x2a,0x4c
};
const byte cipher1[] =
{
0x0f,0x54,0x61,0x71,0x59,0xd0,0x3f,0xfc,
0x1b,0xfa,0xfb,0x60,0x29,0x30,0xd7,0x00,
0xf4,0xa4,0xa8,0xe6,0xdd,0x93,0x94,0x46,
0x64,0xd2,0x19,0xc4,0xc5,0x4d,0xde,0x1b,
0x04,0x53,0xe1,0x73,0xf5,0x18,0x74,0xae,
0xfd,0x64,0xa2,0xe1,0xe2,0x76,0x13,0xb0
};
#endif /* WOLFSSL_AES_256 */
#ifdef WOLFSSL_AES_128
const byte key2[] =
{
0x10,0xa5,0x88,0x69,0xd7,0x4b,0xe5,0xa3,
0x74,0xcf,0x86,0x7c,0xfb,0x47,0x38,0x59
};
const byte iv2[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
const byte plain2[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
const byte cipher2[] =
{
0x6d,0x25,0x1e,0x69,0x44,0xb0,0x51,0xe0,
0x4e,0xaa,0x6f,0xb4,0xdb,0xf7,0x84,0x65
};
#endif /* WOLFSSL_AES_128 */
#ifdef WOLFSSL_AES_192
const byte key3[] = {
0xd0,0x77,0xa0,0x3b,0xd8,0xa3,0x89,0x73,
0x92,0x8c,0xca,0xfe,0x4a,0x9d,0x2f,0x45,
0x51,0x30,0xbd,0x0a,0xf5,0xae,0x46,0xa9
};
const byte iv3[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
const byte cipher3[] =
{
0xab,0xc7,0x86,0xfb,0x1e,0xdb,0x50,0x45,
0x80,0xc4,0xd8,0x82,0xef,0x29,0xa0,0xc7
};
const byte plain3[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
#endif /* WOLFSSL_AES_192 */
Aes enc;
byte cipher[AES_BLOCK_SIZE * 4];
#ifdef HAVE_AES_DECRYPT
Aes dec;
byte plain [AES_BLOCK_SIZE * 4];
#endif
int ret = 0;
#ifdef WOLFSSL_AES_128
/* 128 key size test */
ret = wc_AesSetKey(&enc, key2, sizeof(key2), iv2, AES_ENCRYPTION);
if (ret != 0)
return -5000;
#ifdef HAVE_AES_DECRYPT
/* decrypt uses AES_ENCRYPTION */
ret = wc_AesSetKey(&dec, key2, sizeof(key2), iv2, AES_ENCRYPTION);
if (ret != 0)
return -5001;
#endif
XMEMSET(cipher, 0, sizeof(cipher));
ret = wc_AesOfbEncrypt(&enc, cipher, plain2, AES_BLOCK_SIZE);
if (ret != 0)
return -5002;
if (XMEMCMP(cipher, cipher2, AES_BLOCK_SIZE))
return -5003;
#ifdef HAVE_AES_DECRYPT
ret = wc_AesOfbDecrypt(&dec, plain, cipher2, AES_BLOCK_SIZE);
if (ret != 0)
return -5004;
if (XMEMCMP(plain, plain2, AES_BLOCK_SIZE))
return -5005;
#endif /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_128 */
#ifdef WOLFSSL_AES_192
/* 192 key size test */
ret = wc_AesSetKey(&enc, key3, sizeof(key3), iv3, AES_ENCRYPTION);
if (ret != 0)
return -5006;
#ifdef HAVE_AES_DECRYPT
/* decrypt uses AES_ENCRYPTION */
ret = wc_AesSetKey(&dec, key3, sizeof(key3), iv3, AES_ENCRYPTION);
if (ret != 0)
return -5007;
#endif
XMEMSET(cipher, 0, sizeof(cipher));
ret = wc_AesOfbEncrypt(&enc, cipher, plain3, AES_BLOCK_SIZE);
if (ret != 0)
return -5008;
if (XMEMCMP(cipher, cipher3, AES_BLOCK_SIZE))
return -5009;
#ifdef HAVE_AES_DECRYPT
ret = wc_AesOfbDecrypt(&dec, plain, cipher3, AES_BLOCK_SIZE);
if (ret != 0)
return -5010;
if (XMEMCMP(plain, plain3, AES_BLOCK_SIZE))
return -5011;
#endif /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_192 */
#ifdef WOLFSSL_AES_256
/* 256 key size test */
ret = wc_AesSetKey(&enc, key1, sizeof(key1), iv1, AES_ENCRYPTION);
if (ret != 0)
return -5012;
#ifdef HAVE_AES_DECRYPT
/* decrypt uses AES_ENCRYPTION */
ret = wc_AesSetKey(&dec, key1, sizeof(key1), iv1, AES_ENCRYPTION);
if (ret != 0)
return -5013;
#endif
XMEMSET(cipher, 0, sizeof(cipher));
ret = wc_AesOfbEncrypt(&enc, cipher, plain1, AES_BLOCK_SIZE);
if (ret != 0)
return -5014;
if (XMEMCMP(cipher, cipher1, AES_BLOCK_SIZE))
return -5015;
ret = wc_AesOfbEncrypt(&enc, cipher + AES_BLOCK_SIZE,
plain1 + AES_BLOCK_SIZE, AES_BLOCK_SIZE);
if (ret != 0)
return -5016;
if (XMEMCMP(cipher + AES_BLOCK_SIZE, cipher1 + AES_BLOCK_SIZE,
AES_BLOCK_SIZE))
return -5017;
#ifdef HAVE_AES_DECRYPT
ret = wc_AesOfbDecrypt(&dec, plain, cipher1, AES_BLOCK_SIZE);
if (ret != 0)
return -5018;
if (XMEMCMP(plain, plain1, AES_BLOCK_SIZE))
return -5019;
ret = wc_AesOfbDecrypt(&dec, plain + AES_BLOCK_SIZE,
cipher1 + AES_BLOCK_SIZE, AES_BLOCK_SIZE);
if (ret != 0)
return -5020;
if (XMEMCMP(plain + AES_BLOCK_SIZE, plain1 + AES_BLOCK_SIZE,
AES_BLOCK_SIZE))
return -5021;
#endif /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_256 */
#ifdef WOLFSSL_AES_256
/* 256 key size test leftover support */
ret = wc_AesSetKey(&enc, key1, sizeof(key1), iv1, AES_ENCRYPTION);
if (ret != 0)
return -5022;
#ifdef HAVE_AES_DECRYPT
/* decrypt uses AES_ENCRYPTION */
ret = wc_AesSetKey(&dec, key1, sizeof(key1), iv1, AES_ENCRYPTION);
if (ret != 0)
return -5023;
#endif
XMEMSET(cipher, 0, sizeof(cipher));
ret = wc_AesOfbEncrypt(&enc, cipher, plain1, 3);
if (ret != 0)
return -5024;
if (XMEMCMP(cipher, cipher1, 3))
return -5025;
ret = wc_AesOfbEncrypt(&enc, cipher + 3, plain1 + 3, AES_BLOCK_SIZE);
if (ret != 0)
return -5026;
if (XMEMCMP(cipher + 3, cipher1 + 3, AES_BLOCK_SIZE))
return -5027;
#ifdef HAVE_AES_DECRYPT
ret = wc_AesOfbDecrypt(&dec, plain, cipher1, 6);
if (ret != 0)
return -5028;
if (XMEMCMP(plain, plain1, 6))
return -5029;
ret = wc_AesOfbDecrypt(&dec, plain + 6, cipher1 + 6, AES_BLOCK_SIZE);
if (ret != 0)
return -5030;
if (XMEMCMP(plain + 6, plain1 + 6, AES_BLOCK_SIZE))
return -5031;
#endif /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_256 */
return 0;
}
#endif /* WOLFSSL_AES_OFB */
static int aes_key_size_test(void)
{
int ret;

View File

@@ -130,6 +130,12 @@ enum {
CCM_NONCE_MAX_SZ = 13,
CTR_SZ = 4,
AES_IV_FIXED_SZ = 4,
#ifdef WOLFSSL_AES_CFB
AES_CFB_MODE = 1,
#endif
#ifdef WOLFSSL_AES_OFB
AES_OFB_MODE = 2,
#endif
#ifdef HAVE_PKCS11
AES_MAX_ID_LEN = 32,
@@ -179,7 +185,8 @@ struct Aes {
#ifdef WOLFSSL_ASYNC_CRYPT
WC_ASYNC_DEV asyncDev;
#endif /* WOLFSSL_ASYNC_CRYPT */
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) || \
defined(WOLFSSL_AES_OFB)
word32 left; /* unused bytes left from last call */
#endif
#ifdef WOLFSSL_XILINX_CRYPT
@@ -273,6 +280,15 @@ WOLFSSL_API int wc_AesCfbDecrypt(Aes* aes, byte* out,
#endif /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_CFB */
#ifdef WOLFSSL_AES_OFB
WOLFSSL_API int wc_AesOfbEncrypt(Aes* aes, byte* out,
const byte* in, word32 sz);
#ifdef HAVE_AES_DECRYPT
WOLFSSL_API int wc_AesOfbDecrypt(Aes* aes, byte* out,
const byte* in, word32 sz);
#endif /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_OFB */
#ifdef HAVE_AES_ECB
WOLFSSL_API int wc_AesEcbEncrypt(Aes* aes, byte* out,
const byte* in, word32 sz);