crypto/aesni_mb: support all truncated CMAC digest sizes

The full digest size of CMAC algorithm is 16 bytes.
However, it is sometimes truncated to a smaller size (such as in IPSec).
This commit allows a user to generate a digest of any size
up to the full size.

Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
Acked-by: Marko Kovacevic <marko.kovacevic@intel.com>
This commit is contained in:
Pablo de Lara 2018-08-14 01:38:47 +01:00 committed by Akhil Goyal
parent 16a3558e0b
commit 035ecca5ea
2 changed files with 27 additions and 3 deletions

View File

@ -141,7 +141,31 @@ aesni_mb_set_session_auth_parameters(const struct aesni_mb_op_fns *mb_ops,
if (xform->auth.algo == RTE_CRYPTO_AUTH_AES_CMAC) {
sess->auth.algo = AES_CMAC;
sess->auth.gen_digest_len = sess->auth.req_digest_len;
uint16_t cmac_digest_len = get_digest_byte_length(AES_CMAC);
if (sess->auth.req_digest_len > cmac_digest_len) {
AESNI_MB_LOG(ERR, "Invalid digest size\n");
return -EINVAL;
}
/*
* Multi-buffer lib supports digest sizes from 4 to 16 bytes
* in version 0.50 and sizes of 12 and 16 bytes,
* in version 0.49.
* If size requested is different, generate the full digest
* (16 bytes) in a temporary location and then memcpy
* the requested number of bytes.
*/
#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)
if (sess->auth.req_digest_len < 4)
#else
uint16_t cmac_trunc_digest_len =
get_truncated_digest_byte_length(AES_CMAC);
if (sess->auth.req_digest_len != cmac_digest_len &&
sess->auth.req_digest_len != cmac_trunc_digest_len)
#endif
sess->auth.gen_digest_len = cmac_digest_len;
else
sess->auth.gen_digest_len = sess->auth.req_digest_len;
(*mb_ops->aux.keyexp.aes_cmac_expkey)(xform->auth.key.data,
sess->auth.cmac.expkey);

View File

@ -358,9 +358,9 @@ static const struct rte_cryptodev_capabilities aesni_mb_pmd_capabilities[] = {
.increment = 0
},
.digest_size = {
.min = 12,
.min = 1,
.max = 16,
.increment = 4
.increment = 1
},
.iv_size = { 0 }
}, }