| 272 | } |
| 273 | |
| 274 | static int |
| 275 | transform_chain_param(struct rte_crypto_sym_xform *xforms, |
| 276 | VhostUserCryptoSessionParam *param) |
| 277 | { |
| 278 | struct rte_crypto_sym_xform *xform_cipher, *xform_auth; |
| 279 | int ret; |
| 280 | |
| 281 | switch (param->chaining_dir) { |
| 282 | case VIRTIO_CRYPTO_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER: |
| 283 | xform_auth = xforms; |
| 284 | xform_cipher = xforms->next; |
| 285 | xform_cipher->cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; |
| 286 | xform_auth->auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; |
| 287 | break; |
| 288 | case VIRTIO_CRYPTO_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH: |
| 289 | xform_cipher = xforms; |
| 290 | xform_auth = xforms->next; |
| 291 | xform_cipher->cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; |
| 292 | xform_auth->auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; |
| 293 | break; |
| 294 | default: |
| 295 | return -VIRTIO_CRYPTO_BADMSG; |
| 296 | } |
| 297 | |
| 298 | /* cipher */ |
| 299 | ret = cipher_algo_transform(param->cipher_algo, |
| 300 | &xform_cipher->cipher.algo); |
| 301 | if (unlikely(ret < 0)) |
| 302 | return ret; |
| 303 | |
| 304 | if (param->cipher_key_len > VHOST_USER_CRYPTO_MAX_CIPHER_KEY_LENGTH) { |
| 305 | VC_LOG_DBG("Invalid cipher key length"); |
| 306 | return -VIRTIO_CRYPTO_BADMSG; |
| 307 | } |
| 308 | |
| 309 | xform_cipher->type = RTE_CRYPTO_SYM_XFORM_CIPHER; |
| 310 | xform_cipher->cipher.key.length = param->cipher_key_len; |
| 311 | xform_cipher->cipher.key.data = param->cipher_key_buf; |
| 312 | ret = get_iv_len(xform_cipher->cipher.algo); |
| 313 | if (unlikely(ret < 0)) |
| 314 | return ret; |
| 315 | xform_cipher->cipher.iv.length = (uint16_t)ret; |
| 316 | xform_cipher->cipher.iv.offset = IV_OFFSET; |
| 317 | |
| 318 | /* auth */ |
| 319 | xform_auth->type = RTE_CRYPTO_SYM_XFORM_AUTH; |
| 320 | ret = auth_algo_transform(param->hash_algo, &xform_auth->auth.algo); |
| 321 | if (unlikely(ret < 0)) |
| 322 | return ret; |
| 323 | |
| 324 | if (param->auth_key_len > VHOST_USER_CRYPTO_MAX_HMAC_KEY_LENGTH) { |
| 325 | VC_LOG_DBG("Invalid auth key length"); |
| 326 | return -VIRTIO_CRYPTO_BADMSG; |
| 327 | } |
| 328 | |
| 329 | xform_auth->auth.digest_length = param->digest_len; |
| 330 | xform_auth->auth.key.length = param->auth_key_len; |
| 331 | xform_auth->auth.key.data = param->auth_key_buf; |
no test coverage detected