crypto/aesni_mb: support 3DES

Added support for 3DES cipher algorithm which
will support 8, 16 and 24 byte keys, which also has been
added in the v0.50 of the IPSec Multi-buffer lib.

Signed-off-by: Marko Kovacevic <marko.kovacevic@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
This commit is contained in:
Marko Kovacevic 2018-06-08 10:10:01 +01:00 committed by Pablo de Lara
parent 58d3852ef5
commit 06c761d6fb
8 changed files with 166 additions and 12 deletions

View File

@ -27,6 +27,7 @@ Cipher algorithms:
* RTE_CRYPTO_CIPHER_AES256_CTR
* RTE_CRYPTO_CIPHER_AES_DOCSISBPI
* RTE_CRYPTO_CIPHER_DES_CBC
* RTE_CRYPTO_CIPHER_3DES_CBC
* RTE_CRYPTO_CIPHER_DES_DOCSISBPI
Hash algorithms:

View File

@ -24,6 +24,7 @@ AES CTR (192) = Y
AES CTR (256) = Y
AES DOCSIS BPI = Y
DES CBC = Y
3DES CBC = Y
DES DOCSIS BPI = Y
;

View File

@ -74,6 +74,12 @@ New Features
* Add handlers to add/delete VxLAN port number.
* Add devarg to specify ingress VLAN rewrite mode.
* **Updated the AESNI MB PMD.**
The AESNI MB PMD has been updated with additional support for:
* 3DES for 8, 16 and 24 byte keys.
* **Added a new compression PMD using Intel's QuickAssist (QAT) device family.**
Added the new ``QAT`` compression driver, for compression and decompression

View File

@ -182,6 +182,7 @@ aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,
const struct rte_crypto_sym_xform *xform)
{
uint8_t is_aes = 0;
uint8_t is_3DES = 0;
aes_keyexp_t aes_keyexp_fn;
if (xform == NULL) {
@ -227,6 +228,10 @@ aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,
case RTE_CRYPTO_CIPHER_DES_DOCSISBPI:
sess->cipher.mode = DOCSIS_DES;
break;
case RTE_CRYPTO_CIPHER_3DES_CBC:
sess->cipher.mode = DES3;
is_3DES = 1;
break;
default:
AESNI_MB_LOG(ERR, "Unsupported cipher mode parameter");
return -ENOTSUP;
@ -261,6 +266,49 @@ aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,
sess->cipher.expanded_aes_keys.encode,
sess->cipher.expanded_aes_keys.decode);
} else if (is_3DES) {
uint64_t *keys[3] = {sess->cipher.exp_3des_keys.key[0],
sess->cipher.exp_3des_keys.key[1],
sess->cipher.exp_3des_keys.key[2]};
switch (xform->cipher.key.length) {
case 24:
des_key_schedule(keys[0], xform->cipher.key.data);
des_key_schedule(keys[1], xform->cipher.key.data+8);
des_key_schedule(keys[2], xform->cipher.key.data+16);
/* Initialize keys - 24 bytes: [K1-K2-K3] */
sess->cipher.exp_3des_keys.ks_ptr[0] = keys[0];
sess->cipher.exp_3des_keys.ks_ptr[1] = keys[1];
sess->cipher.exp_3des_keys.ks_ptr[2] = keys[2];
break;
case 16:
des_key_schedule(keys[0], xform->cipher.key.data);
des_key_schedule(keys[1], xform->cipher.key.data+8);
/* Initialize keys - 16 bytes: [K1=K1,K2=K2,K3=K1] */
sess->cipher.exp_3des_keys.ks_ptr[0] = keys[0];
sess->cipher.exp_3des_keys.ks_ptr[1] = keys[1];
sess->cipher.exp_3des_keys.ks_ptr[2] = keys[0];
break;
case 8:
des_key_schedule(keys[0], xform->cipher.key.data);
/* Initialize keys - 8 bytes: [K1 = K2 = K3] */
sess->cipher.exp_3des_keys.ks_ptr[0] = keys[0];
sess->cipher.exp_3des_keys.ks_ptr[1] = keys[0];
sess->cipher.exp_3des_keys.ks_ptr[2] = keys[0];
break;
default:
AESNI_MB_LOG(ERR, "Invalid cipher key length");
return -EINVAL;
}
#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)
sess->cipher.key_length_in_bytes = 24;
#else
sess->cipher.key_length_in_bytes = 8;
#endif
} else {
if (xform->cipher.key.length != 8) {
AESNI_MB_LOG(ERR, "Invalid cipher key length");
@ -524,8 +572,20 @@ set_mb_job_params(JOB_AES_HMAC *job, struct aesni_mb_qp *qp,
job->cipher_mode = session->cipher.mode;
job->aes_key_len_in_bytes = session->cipher.key_length_in_bytes;
job->aes_enc_key_expanded = session->cipher.expanded_aes_keys.encode;
job->aes_dec_key_expanded = session->cipher.expanded_aes_keys.decode;
if (job->cipher_mode == DES3) {
job->aes_enc_key_expanded =
session->cipher.exp_3des_keys.ks_ptr;
job->aes_dec_key_expanded =
session->cipher.exp_3des_keys.ks_ptr;
} else {
job->aes_enc_key_expanded =
session->cipher.expanded_aes_keys.encode;
job->aes_dec_key_expanded =
session->cipher.expanded_aes_keys.decode;
}
/* Set authentication parameters */

View File

@ -239,6 +239,26 @@ static const struct rte_cryptodev_capabilities aesni_mb_pmd_capabilities[] = {
}, }
}, }
},
{ /* 3DES CBC */
.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
{.sym = {
.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
{.cipher = {
.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
.block_size = 8,
.key_size = {
.min = 8,
.max = 24,
.increment = 8
},
.iv_size = {
.min = 8,
.max = 8,
.increment = 0
}
}, }
}, }
},
{ /* DES DOCSIS BPI */
.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
{.sym = {

View File

@ -169,12 +169,18 @@ struct aesni_mb_session {
uint64_t key_length_in_bytes;
struct {
uint32_t encode[60] __rte_aligned(16);
/**< encode key */
uint32_t decode[60] __rte_aligned(16);
/**< decode key */
} expanded_aes_keys;
union {
struct {
uint32_t encode[60] __rte_aligned(16);
/**< encode key */
uint32_t decode[60] __rte_aligned(16);
/**< decode key */
} expanded_aes_keys;
struct {
const void *ks_ptr[3];
uint64_t key[3][16];
} exp_3des_keys;
};
/**< Expanded AES keys - Allocating space to
* contain the maximum expanded key size which
* is 240 bytes for 256 bit AES, calculate by:

View File

@ -5020,6 +5020,24 @@ test_DES_cipheronly_mb_all(void)
return TEST_SUCCESS;
}
static int
test_3DES_cipheronly_mb_all(void)
{
struct crypto_testsuite_params *ts_params = &testsuite_params;
int status;
status = test_blockcipher_all_tests(ts_params->mbuf_pool,
ts_params->op_mpool,
ts_params->session_mpool,
ts_params->valid_devs[0],
rte_cryptodev_driver_id_get(
RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
BLKCIPHER_3DES_CIPHERONLY_TYPE);
TEST_ASSERT_EQUAL(status, 0, "Test failed");
return TEST_SUCCESS;
}
static int
test_DES_docsis_mb_all(void)
@ -9032,6 +9050,8 @@ static struct unit_test_suite cryptodev_aesni_mb_testsuite = {
test_DES_cipheronly_mb_all),
TEST_CASE_ST(ut_setup, ut_teardown,
test_DES_docsis_mb_all),
TEST_CASE_ST(ut_setup, ut_teardown,
test_3DES_cipheronly_mb_all),
TEST_CASE_ST(ut_setup, ut_teardown,
test_AES_CCM_authenticated_encryption_test_case_128_1),
TEST_CASE_ST(ut_setup, ut_teardown,

View File

@ -792,6 +792,30 @@ triple_des192cbc_hmac_sha1_test_vector = {
.len = 20
}
};
static const struct blockcipher_test_data
triple_des64cbc_test_vector = {
.crypto_algo = RTE_CRYPTO_CIPHER_3DES_CBC,
.cipher_key = {
.data = {
0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2
},
.len = 8
},
.iv = {
.data = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
},
.len = 8
},
.plaintext = {
.data = plaintext_des,
.len = 512
},
.ciphertext = {
.data = ciphertext512_des,
.len = 512
},
};
static const struct blockcipher_test_data
des_cbc_test_vector = {
@ -1204,6 +1228,18 @@ static const struct blockcipher_test_case triple_des_chain_test_cases[] = {
};
static const struct blockcipher_test_case triple_des_cipheronly_test_cases[] = {
{
.test_descr = "3DES-64-CBC Encryption",
.test_data = &triple_des64cbc_test_vector,
.op_mask = BLOCKCIPHER_TEST_OP_ENCRYPT,
.pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MB
},
{
.test_descr = "3DES-64-CBC Decryption",
.test_data = &triple_des64cbc_test_vector,
.op_mask = BLOCKCIPHER_TEST_OP_DECRYPT,
.pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MB
},
{
.test_descr = "3DES-128-CBC Encryption",
.test_data = &triple_des128cbc_test_vector,
@ -1212,7 +1248,8 @@ static const struct blockcipher_test_case triple_des_cipheronly_test_cases[] = {
BLOCKCIPHER_TEST_TARGET_PMD_QAT |
BLOCKCIPHER_TEST_TARGET_PMD_DPAA2_SEC |
BLOCKCIPHER_TEST_TARGET_PMD_DPAA_SEC |
BLOCKCIPHER_TEST_TARGET_PMD_CCP
BLOCKCIPHER_TEST_TARGET_PMD_CCP |
BLOCKCIPHER_TEST_TARGET_PMD_MB
},
{
.test_descr = "3DES-128-CBC Decryption",
@ -1222,7 +1259,8 @@ static const struct blockcipher_test_case triple_des_cipheronly_test_cases[] = {
BLOCKCIPHER_TEST_TARGET_PMD_QAT |
BLOCKCIPHER_TEST_TARGET_PMD_DPAA2_SEC |
BLOCKCIPHER_TEST_TARGET_PMD_DPAA_SEC |
BLOCKCIPHER_TEST_TARGET_PMD_CCP
BLOCKCIPHER_TEST_TARGET_PMD_CCP |
BLOCKCIPHER_TEST_TARGET_PMD_MB
},
{
.test_descr = "3DES-192-CBC Encryption",
@ -1233,7 +1271,8 @@ static const struct blockcipher_test_case triple_des_cipheronly_test_cases[] = {
BLOCKCIPHER_TEST_TARGET_PMD_DPAA2_SEC |
BLOCKCIPHER_TEST_TARGET_PMD_DPAA_SEC |
BLOCKCIPHER_TEST_TARGET_PMD_MVSAM |
BLOCKCIPHER_TEST_TARGET_PMD_CCP
BLOCKCIPHER_TEST_TARGET_PMD_CCP |
BLOCKCIPHER_TEST_TARGET_PMD_MB
},
{
.test_descr = "3DES-192-CBC Decryption",
@ -1244,7 +1283,8 @@ static const struct blockcipher_test_case triple_des_cipheronly_test_cases[] = {
BLOCKCIPHER_TEST_TARGET_PMD_DPAA2_SEC |
BLOCKCIPHER_TEST_TARGET_PMD_DPAA_SEC |
BLOCKCIPHER_TEST_TARGET_PMD_MVSAM |
BLOCKCIPHER_TEST_TARGET_PMD_CCP
BLOCKCIPHER_TEST_TARGET_PMD_CCP |
BLOCKCIPHER_TEST_TARGET_PMD_MB
},
{
.test_descr = "3DES-128-CTR Encryption",