diff --git a/arch/arm/src/sam34/sam_aes.c b/arch/arm/src/sam34/sam_aes.c old mode 100644 new mode 100755 index 4f3818a228c..c83ef8e3b0e --- a/arch/arm/src/sam34/sam_aes.c +++ b/arch/arm/src/sam34/sam_aes.c @@ -114,7 +114,10 @@ static void aes_encryptblock(void *out, const void *in) while(!(getreg32(SAM_AES_ISR) & AES_ISR_DATRDY)) {} - aes_memcpy(out, (void*)SAM_AES_ODATAR, AES_BLOCK_SIZE); + if (out) + { + aes_memcpy(out, (void*)SAM_AES_ODATAR, AES_BLOCK_SIZE); + } } static int aes_setup_mr(uint32_t keysize, int mode, int encrypt) @@ -152,6 +155,9 @@ static int aes_setup_mr(uint32_t keysize, int mode, int encrypt) case AES_MODE_CTR: regval |= AES_MR_OPMOD_CTR; break; + case AES_MODE_CFB: + regval |= AES_MR_OPMOD_CFB; + break; default: return -EINVAL; } @@ -174,7 +180,7 @@ int aes_cypher(void *out, const void *in, uint32_t size, const void *iv, aes_lock(); - res = aes_setup_mr(keysize, mode, encrypt); + res = aes_setup_mr(keysize, mode & AES_MODE_MASK, encrypt); if (res) { aes_unlock(); @@ -189,8 +195,20 @@ int aes_cypher(void *out, const void *in, uint32_t size, const void *iv, while (size) { - aes_encryptblock(out, in); - out = (char*)out + AES_BLOCK_SIZE; + if ((mode & AES_MODE_MAC) == 0) + { + aes_encryptblock(out, in); + out = (char*)out + AES_BLOCK_SIZE; + } + else if (size == AES_BLOCK_SIZE) + { + aes_encryptblock(out, in); + } + else + { + aes_encryptblock(NULL, in); + } + in = (char*)in + AES_BLOCK_SIZE; size -= AES_BLOCK_SIZE; } diff --git a/include/nuttx/crypto/crypto.h b/include/nuttx/crypto/crypto.h index 51510a0c6ea..631dedd893a 100644 --- a/include/nuttx/crypto/crypto.h +++ b/include/nuttx/crypto/crypto.h @@ -53,8 +53,13 @@ # define AES_MODE_ECB 1 # define AES_MODE_CBC 2 # define AES_MODE_CTR 3 +# define AES_MODE_CFB 4 -# define AES_MODE_MAX 3 +# define AES_MODE_MAX 4 + +# define AES_MODE_MAC 0x80000000 + +# define AES_MODE_MASK 0xffff #endif #define CYPHER_ENCRYPT 1