mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-08-03 20:54:41 +02:00
add AES-OFB mode
This commit is contained in:
committed by
Eric Blankenhorn
parent
65732c2269
commit
e837894578
14
configure.ac
14
configure.ac
@@ -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)])],
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user