Solaris から Linux にいくつかのカーネル ソースを移植しています。同等の実装を行うために必要な 7 つの関数があります。Solaris からは、次のようになります。
int crypto_create_ctx_template(crypto_mechanism_t *mech,
crypto_key_t *key, crypto_ctx_template_t *tmpl, int kmflag)
void crypto_destroy_ctx_template(crypto_ctx_template_t tmpl)
int crypto_mac(crypto_mechanism_t *mech, crypto_data_t *data,
crypto_key_t *key, crypto_ctx_template_t tmpl, crypto_data_t *mac,
crypto_call_req_t *cr)
int crypto_decrypt(crypto_mechanism_t *mech, crypto_data_t *ciphertext,
crypto_key_t *key, crypto_ctx_template_t tmpl,
crypto_data_t *plaintext, crypto_call_req_t *cr)
int crypto_encrypt(crypto_mechanism_t *mech, crypto_data_t *plaintext,
crypto_key_t *key, crypto_ctx_template_t tmpl, crypto_data_t *ciphertext,
crypto_call_req_t *cr)
crypto_mech_type_t crypto_mech2id(crypto_mech_name_t name)
私の推測では、Solaris の crypto API を使用すると、処理するバッファをキューに入れたり、タスクが完了したときのコールバック関数を使用したりできます。
Linux では、最初は _ctx_template を「少し、何もしない」ようにし、暗号化と復号化を直接 (ブロックして) 実装し、CB 自体を呼び出すのが最善の方法だと思います。最終的には、作業を同時に実行するカーネル スレッドを使用します。
以前にカーネル内の暗号化作業を行った人はいますか? cryptodev はユーザーランドの作業用のように見えますか?