Linux Kernel Crypto API AEAD回调函数未触发及异步执行疑问
Linux Kernel Crypto API 回调与同步/异步执行问题解答
问题1:回调函数为何始终未被调用?
你的回调未触发的核心原因是当前使用的AES-GCM算法实现为同步模式:
- Linux Crypto API中,
crypto_aead_encrypt的行为由算法实现类型决定:同步算法会直接阻塞完成加密操作,函数执行完毕后立即返回,不会触发回调;只有使用异步算法实现时,加密操作才会在后台执行,完成后才会调用回调函数。 - 你的代码里,
crypto_alloc_aead的第三个参数为0,未指定CRYPTO_ALG_ASYNC标志,因此默认分配的是同步算法实例。即便设置了回调,同步模式下也不会走到回调调用的逻辑,和你设置的编译优化选项无关。
问题2:调用crypto_wait_req()前,加解密操作是否是异步执行的?
答案取决于你使用的算法实现类型:
- 异步算法实现:当分配tfm时指定
CRYPTO_ALG_ASYNC标志,或是使用支持异步的硬件加速驱动,调用crypto_aead_encrypt会立即返回,加密操作在后台异步执行。此时在调用crypto_wait_req()之前,操作确实处于异步运行状态,crypto_wait_req()的作用是阻塞等待异步操作完成。 - 同步算法实现:
crypto_aead_encrypt会直接阻塞直到加密完成,函数返回时操作已经结束。这种情况下不存在异步执行阶段,调用crypto_wait_req()没有实际意义。
你的代码使用的是同步算法,所以crypto_aead_encrypt返回时加密已经完成,无需调用crypto_wait_req()。
内容的提问来源于stack exchange,提问作者synthrax
相关产品推荐
相关产品推荐

