AES-NI が AES 暗号化操作にもたらす違いを理解しようとしています。Intelが述べているように、AES-CBCで試した後、何も作成されないようです。ただし、AES-CTR および AES-GCM モードでは、Intel は大幅なパフォーマンスの向上を約束しています。rfc3686(ctr(aes)) 暗号アルゴリズムを使用して ESP パケットを復号化しようとしていますが、成功しません。暗号 API のコード スニペットは次のとおりです。
struct ablkcipher_request *req;
struct crypto_ablkcipher *tfm;
uint8_t _key[20] = {0};
int ret;
tfm = crypto_alloc_ablkcipher("rfc3686(ctr(aes))", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm))
return -1;
req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
if (!req) {
return -1;
ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
decrypt_callback, &dc);
crypto_ablkcipher_clear_flags(tfm, ~0);
memcpy(_key, sa->key, sa->len);
ret = crypto_ablkcipher_setkey(tfm, _key, 20);
sg_init_table(sg_in, 1);
sg_init_table(sg_out, 2);
sg_set_buf(sg_in, in_buf, in_buf_len);
sg_set_buf(&sg_out[0], out_buf, out_buf_len);
sg_set_buf(&sg_out[1], pad, sizeof(pad));
ablkcipher_request_set_crypt(req, sg_in, sg_out,
in_buf_len,
iv);
ret = crypto_ablkcipher_decrypt(req);
// ここに、decrypt_callback があります
void decrypt_callback(struct crypto_async_request *req, int err)
{
struct decrypt_data *dc = req->data;
struct callback_data *cb = dc->cb;
printk("err %d\n", err);
if (err == -EINPROGRESS)
return;
ablkcipher_request_free(req);
kfree(dc);
}
現在、パケット処理中に、crypto_ablkcipher_decryptが 0 を返していることがわかりますが、decrypt_callbackは呼び出されません。
また、AES-NI rfc3686(ctr(aes))復号化ルーティングにいくつかのプリントを入れました。これは、AES-CBC 復号化に入れ、AES-CBC アルゴリズムを使用すると表示されます。
何が間違っているのかアドバイスしてください。
ありがとう