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_aesgcm=yes
enable_aesccm=yes enable_aesccm=yes
enable_aesctr=yes enable_aesctr=yes
enable_aesofb=yes
enable_aescfb=yes enable_aescfb=yes
enable_camellia=yes enable_camellia=yes
enable_ripemd=yes enable_ripemd=yes
@@ -965,6 +966,19 @@ then
fi 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 # AES-CFB
AC_ARG_ENABLE([aescfb], AC_ARG_ENABLE([aescfb],
[AS_HELP_STRING([--enable-aescfb],[Enable wolfSSL AES-CFB support (default: disabled)])], [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) #if !defined(WOLFSSL_STM32_CUBEMX) || defined(STM32_HAL_V2)
ByteReverseWords(rk, rk, keylen); ByteReverseWords(rk, rk, keylen);
#endif #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; aes->left = 0;
#endif #endif
@@ -2037,7 +2038,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
if (iv) if (iv)
XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE); 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; aes->left = 0;
#endif #endif
@@ -2053,7 +2055,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
aes->rounds = keylen/4 + 6; aes->rounds = keylen/4 + 6;
XMEMCPY(aes->key, userKey, keylen); 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; aes->left = 0;
#endif #endif
@@ -2083,7 +2086,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
if (rk == NULL) if (rk == NULL)
return BAD_FUNC_ARG; 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; aes->left = 0;
#endif #endif
@@ -2150,7 +2154,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
aes->rounds = keylen/4 + 6; aes->rounds = keylen/4 + 6;
ret = nrf51_aes_set_key(userKey); 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; aes->left = 0;
#endif #endif
@@ -2288,7 +2293,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
#ifdef WOLFSSL_AESNI #ifdef WOLFSSL_AESNI
aes->use_aesni = 0; aes->use_aesni = 0;
#endif /* WOLFSSL_AESNI */ #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; aes->left = 0;
#endif #endif
@@ -2497,7 +2503,8 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
checkAESNI = 1; checkAESNI = 1;
} }
if (haveAESNI) { 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; aes->left = 0;
#endif /* WOLFSSL_AES_COUNTER */ #endif /* WOLFSSL_AES_COUNTER */
aes->use_aesni = 1; aes->use_aesni = 1;
@@ -7252,43 +7259,64 @@ int wc_AesEcbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
#endif #endif
#endif /* HAVE_AES_ECB */ #endif /* HAVE_AES_ECB */
#ifdef WOLFSSL_AES_CFB #if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_OFB)
/* CFB 128 /* Feedback AES mode
* *
* aes structure holding key to use for encryption * aes structure holding key to use for encryption
* out buffer to hold result of encryption (must be at least as large as input * out buffer to hold result of encryption (must be at least as large as input
* buffer) * buffer)
* in buffer to encrypt * in buffer to encrypt
* sz size of input buffer * 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 * returns 0 on success and negative error values on failure
*/ */
/* Software AES - CFB Encrypt */ /* 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; byte* tmp = NULL;
#ifdef WOLFSSL_AES_CFB
byte* reg = NULL; byte* reg = NULL;
#endif
if (aes == NULL || out == NULL || in == NULL) { if (aes == NULL || out == NULL || in == NULL) {
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
} }
#ifdef WOLFSSL_AES_CFB
if (aes->left && sz) { if (aes->left && sz) {
reg = (byte*)aes->reg + AES_BLOCK_SIZE - aes->left; reg = (byte*)aes->reg + AES_BLOCK_SIZE - aes->left;
} }
#endif
/* consume any unused bytes left in aes->tmp */ /* consume any unused bytes left in aes->tmp */
tmp = (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left; tmp = (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left;
while (aes->left && sz) { 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--; aes->left--;
sz--; sz--;
} }
while (sz >= AES_BLOCK_SIZE) { while (sz >= AES_BLOCK_SIZE) {
wc_AesEncryptDirect(aes, out, (byte*)aes->reg); 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); 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; out += AES_BLOCK_SIZE;
in += AES_BLOCK_SIZE; in += AES_BLOCK_SIZE;
sz -= 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); wc_AesEncryptDirect(aes, (byte*)aes->tmp, (byte*)aes->reg);
aes->left = AES_BLOCK_SIZE; aes->left = AES_BLOCK_SIZE;
tmp = (byte*)aes->tmp; 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; reg = (byte*)aes->reg;
#endif
while (sz--) { while (sz--) {
*(out++) = *(reg++) = *(in++) ^ *(tmp++); *(out) = *(in++) ^ *(tmp++);
#ifdef WOLFSSL_AES_CFB
if (mode == AES_CFB_MODE) {
*(reg++) = *out;
}
#endif
out++;
aes->left--; 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 * returns 0 on success and negative error values on failure
*/ */
/* Software AES - CFB Decrypt */ /* 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; 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 */ /* 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); int size = min(aes->left, sz);
XMEMCPY((byte*)aes->reg + AES_BLOCK_SIZE - aes->left, in, size); 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) { while (sz > AES_BLOCK_SIZE) {
wc_AesEncryptDirect(aes, out, (byte*)aes->reg); 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); 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; out += AES_BLOCK_SIZE;
in += AES_BLOCK_SIZE; in += AES_BLOCK_SIZE;
sz -= 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 */ /* decrypt left over data */
if (sz) { if (sz) {
wc_AesEncryptDirect(aes, (byte*)aes->tmp, (byte*)aes->reg); 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; aes->left = AES_BLOCK_SIZE;
tmp = (byte*)aes->tmp; 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 /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_CFB */ #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 #ifdef HAVE_AES_KEYWRAP

View File

@@ -302,6 +302,7 @@ int des3_test(void);
int aes_test(void); int aes_test(void);
int aes192_test(void); int aes192_test(void);
int aes256_test(void); int aes256_test(void);
int aesofb_test(void);
int cmac_test(void); int cmac_test(void);
int poly1305_test(void); int poly1305_test(void);
int aesgcm_test(void); int aesgcm_test(void);
@@ -865,6 +866,14 @@ initDefaultName();
else else
test_pass("AES256 test passed!\n"); test_pass("AES256 test passed!\n");
#endif #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 #ifdef HAVE_AESGCM
#if !defined(WOLFSSL_AFALG) && !defined(WOLFSSL_DEVCRYPTO) #if !defined(WOLFSSL_AFALG) && !defined(WOLFSSL_DEVCRYPTO)
if ( (ret = aesgcm_test()) != 0) if ( (ret = aesgcm_test()) != 0)
@@ -5856,6 +5865,255 @@ int des3_test(void)
} }
#endif /* WOLFSSL_AES_CFB */ #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) static int aes_key_size_test(void)
{ {
int ret; int ret;

View File

@@ -130,6 +130,12 @@ enum {
CCM_NONCE_MAX_SZ = 13, CCM_NONCE_MAX_SZ = 13,
CTR_SZ = 4, CTR_SZ = 4,
AES_IV_FIXED_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 #ifdef HAVE_PKCS11
AES_MAX_ID_LEN = 32, AES_MAX_ID_LEN = 32,
@@ -179,7 +185,8 @@ struct Aes {
#ifdef WOLFSSL_ASYNC_CRYPT #ifdef WOLFSSL_ASYNC_CRYPT
WC_ASYNC_DEV asyncDev; WC_ASYNC_DEV asyncDev;
#endif /* WOLFSSL_ASYNC_CRYPT */ #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 */ word32 left; /* unused bytes left from last call */
#endif #endif
#ifdef WOLFSSL_XILINX_CRYPT #ifdef WOLFSSL_XILINX_CRYPT
@@ -273,6 +280,15 @@ WOLFSSL_API int wc_AesCfbDecrypt(Aes* aes, byte* out,
#endif /* HAVE_AES_DECRYPT */ #endif /* HAVE_AES_DECRYPT */
#endif /* WOLFSSL_AES_CFB */ #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 #ifdef HAVE_AES_ECB
WOLFSSL_API int wc_AesEcbEncrypt(Aes* aes, byte* out, WOLFSSL_API int wc_AesEcbEncrypt(Aes* aes, byte* out,
const byte* in, word32 sz); const byte* in, word32 sz);