- op = ops + i;
- vnet_crypto_op_init (op, r->op);
- op->iv = r->iv.data;
- op->key = r->key.data;
- op->src = r->data.data;
- op->dst = computed_data + computed_data_total_len;
- op->len = r->data.length;
- op->key_len = r->key.length;
- op->hmac_trunc_len = r->hmac_trunc_len;
- computed_data_total_len += r->expected.length;
+ int t;
+ ad = vec_elt_at_index (cm->algs, r->alg);
+ for (t = 0; t < VNET_CRYPTO_OP_N_TYPES; t++)
+ {
+ vnet_crypto_op_id_t id = ad->op_by_type[t];
+
+ if (id == 0)
+ continue;
+
+ vnet_crypto_op_init (op, id);
+
+ switch (t)
+ {
+ case VNET_CRYPTO_OP_TYPE_ENCRYPT:
+ case VNET_CRYPTO_OP_TYPE_DECRYPT:
+ op->iv = r->iv.data;
+ op->iv_len = r->iv.length;
+ op->key = r->key.data;
+ op->key_len = r->key.length;
+ op->len = r->plaintext.length;
+ op->src = t == VNET_CRYPTO_OP_TYPE_ENCRYPT ?
+ r->plaintext.data : r->ciphertext.data;
+ op->dst = computed_data + computed_data_total_len;
+ computed_data_total_len += r->ciphertext.length;
+ break;
+ case VNET_CRYPTO_OP_TYPE_AEAD_ENCRYPT:
+ case VNET_CRYPTO_OP_TYPE_AEAD_DECRYPT:
+ op->iv = r->iv.data;
+ op->iv_len = r->iv.length;
+ op->key = r->key.data;
+ op->key_len = r->key.length;
+ op->aad = r->aad.data;
+ op->aad_len = r->aad.length;
+ op->len = r->plaintext.length;
+ op->dst = computed_data + computed_data_total_len;
+ computed_data_total_len += r->ciphertext.length;
+ if (t == VNET_CRYPTO_OP_TYPE_AEAD_ENCRYPT)
+ {
+ op->src = r->plaintext.data;
+ op->tag = computed_data + computed_data_total_len;
+ computed_data_total_len += r->tag.length;
+ }
+ else
+ {
+ op->src = r->ciphertext.data;
+ op->tag = r->tag.data;
+ }
+ op->tag_len = r->tag.length;
+ break;
+ case VNET_CRYPTO_OP_TYPE_HMAC:
+ op->key = r->key.data;
+ op->key_len = r->key.length;
+ op->src = r->plaintext.data;
+ op->len = r->plaintext.length;
+ op->digest_len = r->digest.length;
+ op->digest = computed_data + computed_data_total_len;
+ computed_data_total_len += r->digest.length;
+ break;
+ default:
+ break;
+ };
+
+ op->user_data = i;
+ op++;
+ }