forked from wolfSSL/wolfssl
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_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)])],
|
||||||
|
@@ -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);
|
||||||
xorbuf(out, in, AES_BLOCK_SIZE);
|
#ifdef WOLFSSL_AES_OFB
|
||||||
|
if (mode == AES_OFB_MODE) {
|
||||||
XMEMCPY(aes->reg, out, AES_BLOCK_SIZE);
|
XMEMCPY(aes->reg, out, AES_BLOCK_SIZE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
xorbuf(out, in, 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);
|
||||||
|
#ifdef WOLFSSL_AES_CFB
|
||||||
|
if (mode == AES_CFB_MODE) {
|
||||||
XMEMCPY(aes->reg, in, AES_BLOCK_SIZE);
|
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);
|
||||||
|
if (mode == AES_CFB_MODE) {
|
||||||
XMEMCPY(aes->reg, in, sz);
|
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
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user