forked from wolfSSL/wolfssl
SiLabs: add AES-CCM hardware acceleration support
This commit is contained in:
@ -7079,6 +7079,33 @@ int wc_AesCcmCheckTagSize(int sz)
|
|||||||
#elif defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_AES)
|
#elif defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_AES)
|
||||||
/* implemented in wolfcrypt/src/port/caam_aes.c */
|
/* implemented in wolfcrypt/src/port/caam_aes.c */
|
||||||
|
|
||||||
|
#elif defined(WOLFSSL_SILABS_SE_ACCEL)
|
||||||
|
/* implemented in wolfcrypt/src/port/silabs/silabs_hash.c */
|
||||||
|
int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz,
|
||||||
|
const byte* nonce, word32 nonceSz,
|
||||||
|
byte* authTag, word32 authTagSz,
|
||||||
|
const byte* authIn, word32 authInSz)
|
||||||
|
{
|
||||||
|
return wc_AesCcmEncrypt_silabs(
|
||||||
|
aes, out, in, inSz,
|
||||||
|
nonce, nonceSz,
|
||||||
|
authTag, authTagSz,
|
||||||
|
authIn, authInSz);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_AES_DECRYPT
|
||||||
|
int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz,
|
||||||
|
const byte* nonce, word32 nonceSz,
|
||||||
|
const byte* authTag, word32 authTagSz,
|
||||||
|
const byte* authIn, word32 authInSz)
|
||||||
|
{
|
||||||
|
return wc_AesCcmDecrypt_silabs(
|
||||||
|
aes, out, in, inSz,
|
||||||
|
nonce, nonceSz,
|
||||||
|
authTag, authTagSz,
|
||||||
|
authIn, authInSz);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#elif defined(FREESCALE_LTC)
|
#elif defined(FREESCALE_LTC)
|
||||||
|
|
||||||
/* return 0 on success */
|
/* return 0 on success */
|
||||||
|
@ -27,6 +27,10 @@ recommend defining `WOLFSSL_USER_SETTINGS` and adding your own
|
|||||||
`user_settings.h` file. You can find a good reference for this in
|
`user_settings.h` file. You can find a good reference for this in
|
||||||
`IDE/GCC-ARM/Header/user_settings.h`.
|
`IDE/GCC-ARM/Header/user_settings.h`.
|
||||||
|
|
||||||
|
### Caveats
|
||||||
|
|
||||||
|
* AES GCM tags of some lengths do not pass tests.
|
||||||
|
|
||||||
|
|
||||||
### Benchmarks
|
### Benchmarks
|
||||||
|
|
||||||
|
@ -161,4 +161,51 @@ int wc_AesGcmDecrypt_silabs (Aes* aes, byte* out, const byte* in, word32 sz,
|
|||||||
|
|
||||||
#endif /* HAVE_AESGCM */
|
#endif /* HAVE_AESGCM */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_AESCCM
|
||||||
|
int wc_AesCcmEncrypt_silabs (Aes* aes, byte* out, const byte* in, word32 sz,
|
||||||
|
const byte* iv, word32 ivSz,
|
||||||
|
byte* authTag, word32 authTagSz,
|
||||||
|
const byte* authIn, word32 authInSz)
|
||||||
|
{
|
||||||
|
sl_status_t status = sl_se_ccm_encrypt_and_tag(
|
||||||
|
&(aes->ctx.cmd_ctx),
|
||||||
|
&(aes->ctx.key),
|
||||||
|
sz,
|
||||||
|
iv,
|
||||||
|
ivSz,
|
||||||
|
authIn,
|
||||||
|
authInSz,
|
||||||
|
in,
|
||||||
|
out,
|
||||||
|
authTag,
|
||||||
|
authTagSz
|
||||||
|
);
|
||||||
|
|
||||||
|
return (status != SL_STATUS_OK) ? AES_GCM_AUTH_E : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wc_AesCcmDecrypt_silabs (Aes* aes, byte* out, const byte* in, word32 sz,
|
||||||
|
const byte* iv, word32 ivSz,
|
||||||
|
const byte* authTag, word32 authTagSz,
|
||||||
|
const byte* authIn, word32 authInSz)
|
||||||
|
{
|
||||||
|
sl_status_t status = sl_se_ccm_auth_decrypt(
|
||||||
|
&(aes->ctx.cmd_ctx),
|
||||||
|
&(aes->ctx.key),
|
||||||
|
sz,
|
||||||
|
iv,
|
||||||
|
ivSz,
|
||||||
|
authIn,
|
||||||
|
authInSz,
|
||||||
|
in,
|
||||||
|
out,
|
||||||
|
(byte*)authTag,
|
||||||
|
authTagSz);
|
||||||
|
|
||||||
|
return (status != SL_STATUS_OK) ? AES_GCM_AUTH_E : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* HAVE_AESGCM */
|
||||||
|
|
||||||
#endif /* WOLFSSL_SILABS_SE_ACCEL */
|
#endif /* WOLFSSL_SILABS_SE_ACCEL */
|
||||||
|
@ -36,8 +36,9 @@ typedef struct {
|
|||||||
sl_se_key_descriptor_t key;
|
sl_se_key_descriptor_t key;
|
||||||
} silabs_aes_t;
|
} silabs_aes_t;
|
||||||
|
|
||||||
#ifdef HAVE_AESGCM
|
|
||||||
typedef struct Aes Aes;
|
typedef struct Aes Aes;
|
||||||
|
|
||||||
|
#ifdef HAVE_AESGCM
|
||||||
int wc_AesGcmEncrypt_silabs (Aes* aes, byte* out, const byte* in, word32 sz,
|
int wc_AesGcmEncrypt_silabs (Aes* aes, byte* out, const byte* in, word32 sz,
|
||||||
const byte* iv, word32 ivSz,
|
const byte* iv, word32 ivSz,
|
||||||
byte* authTag, word32 authTagSz,
|
byte* authTag, word32 authTagSz,
|
||||||
@ -49,6 +50,18 @@ int wc_AesGcmDecrypt_silabs (Aes* aes, byte* out, const byte* in, word32 sz,
|
|||||||
|
|
||||||
#endif /* HAVE_AESGCM */
|
#endif /* HAVE_AESGCM */
|
||||||
|
|
||||||
|
#ifdef HAVE_AESCCM
|
||||||
|
int wc_AesCcmEncrypt_silabs (Aes* aes, byte* out, const byte* in, word32 sz,
|
||||||
|
const byte* iv, word32 ivSz,
|
||||||
|
byte* authTag, word32 authTagSz,
|
||||||
|
const byte* authIn, word32 authInSz);
|
||||||
|
int wc_AesCcmDecrypt_silabs (Aes* aes, byte* out, const byte* in, word32 sz,
|
||||||
|
const byte* iv, word32 ivSz,
|
||||||
|
const byte* authTag, word32 authTagSz,
|
||||||
|
const byte* authIn, word32 authInSz);
|
||||||
|
|
||||||
|
#endif /* HAVE_AESCCM */
|
||||||
|
|
||||||
#endif /* defined(WOLFSSL_SILABS_SE_ACCEL) */
|
#endif /* defined(WOLFSSL_SILABS_SE_ACCEL) */
|
||||||
|
|
||||||
#endif /* _SILABS_AES_H_ */
|
#endif /* _SILABS_AES_H_ */
|
||||||
|
Reference in New Issue
Block a user