Linux Crypto(3):使用者层-内核消费者
在Linux Crypto架构中,有部分使用者位于内核,直接调用Crypto API处理安全相关任务。
1 内核 Crypto 使用者表格
| 技术名称 | 功能说明 | 核心技术 | 关键算法/模式 |
|---|---|---|---|
| dm-crypt | 块设备透明加密 (LUKS) | 对称加密 + IV 生成器 | AES-XTS, AES-CBC, Serpent, Twofish; essiv/plain64 IV |
| dm-verity | 块设备完整性验证 | Merkle 树 + 哈希算法 | SHA-256, SHA-512, SHA-1; FEC(前向纠错) |
| fscrypt | 文件系统级加密 (ext4/f2fs) | 文件内容/名加密 + 密钥派生 | AES-256-XTS(内容), AES-256-CBC-CTS(文件名); HKDF-SHA512 |
| IPsec | 网络层安全协议 (VPN/安全通道) | 数据包加密认证 + 密钥交换 | AES-GCM, AES-CCM, SHA256-HMAC; IKEv2(Diffie-Hellman) |
| WireGuard | 现代高性能 VPN | 噪声协议 + 轻量加密 | ChaCha20, Poly1305, BLAKE2s, Curve25519 |
| KTLS | 内核级 TLS 加速 | TLS 记录层卸载 + 零拷贝 | AES-GCM, ChaCha20-Poly1305; 软件/HW 卸载 |
| dm-integrity | 块设备数据完整性保护 | 哈希/HMAC 校验 | HMAC-SHA256, CRC32C |
| ecryptfs | 堆叠式加密文件系统 | 文件级加密 + 密钥派生 | AES-CBC, SHA256; PBKDF2 |
| CIFS/SMB3 | 安全文件共享协议 | 传输加密 + 签名 | AES-CCM, AES-GCM, HMAC-SHA256 |
| mac80211 | 无线网络加密 (WPA2/WPA3) | 帧加密 + 完整性保护 | AES-CCMP (AES-128-CCM), BIP-GMAC |
| BPF 加密扩展 | eBPF 程序加密操作 | BPF 辅助函数 + 受限加密 | ChaCha20, SHA3 (有限支持) |
| IMA/EVM | 系统完整性保护 | 文件度量 + 签名验证 | SHA256, RSA-PSS, ECDSA, HMAC |
| RNG | 密码学安全随机数生成 | 熵收集 + DRBG | SHA-512, ChaCha20 DRBG, jitterentropy |
| Audit | 审计日志完整性 | 日志哈希链 | SHA-256 |
| Module Signature | 内核模块签名验证 | 非对称签名验证 + 哈希 | RSA, ECDSA, SHA-256, SHA-512 |
2 pkcs7验签(dm-verity、module sig、fsverity)
verify_pkcs7_signature使用公钥对签名进行验证:
- 输入数据和签名内容,签名是pkcs7格式数据。
- 指定keyring中公钥用于验签。
- 指定密钥的预期用途。
- 提供回调函数,用于解析签名中嵌套的内容。
verify_pkcs7_signature
pkcs7_parse_message--从pkcs7格式签名中提取struct pkcs7_message结构体内容。
asn1_ber_decoder--asn1_ber_decoder是Linux内核中用于解码BER/DER/CER编码的ASN.1数据结构的核心函数。pkcs7_decoder是pkcs7的解析器。它根据预定义的 ASN.1 模板将二进制数据解析为结构化对象,广泛应用于内核的加密、证书管理(如 X.509)和协议解析(如 PKCS#7)场景。
pkcs7_decoder--解析pkcs7证书,如果证书是自签名的,需要进行验签。
pkcs7_extract_cert
x509_cert_parse
asn1_ber_decoder--调用x509_decoder解码X509证书。
x509_get_sig_params
asymmetric_key_generate_id
x509_check_for_self_signed--如果找到X509中自签名证书,进行验证。
public_key_verify_signature
pkcs7_check_authattrs
verify_pkcs7_message_sig
pkcs7_supply_detached_data
pkcs7_verify--执行PKCS#7消息完整性、签名和证书链验证。
pkcs7_verify_one--处理单个签名者的证书和签名验证。
pkcs7_digest--计算消息哈希值,用于与签名中的摘要比对。对于dm-verity,指的就是root_hash字符串。
pkcs7_find_kkey--在密钥环中查找与签名者证书匹配的公钥。
public_key_verify_signature--使用公钥对签名进行验签。
software_key_determine_akcipher--根据公钥、编码、哈希算法确定适用的非对称加密算法(如RSA)是否有效。
crypto_alloc_sig--根据算法名称分配struct crypto_sig。
crypto_sig_set_pubkey
crypto_akcipher_set_pub_key--调用特定akcipher_alg的set_pub_key函数,设置公钥(用于验签)。
crypto_sig_verify
crypto_akcipher_sync_prep
akcipher_request_set_tfm
sg_init_one--初始化散列(scatterlist)指向待验签数据。
akcipher_request_set_crypt--绑定异步请求与输入/输出数据。
crypto_init_wait--初始化等待队列,用于异步操作同步。
akcipher_request_set_callback--设置异步操作完成后的回调函数。
crypto_req_done--异步操作完成时的回调,唤醒等待队列。
crypto_akcipher_verify--调用特定akcipher_alg的verify函数,执行验签操作。
crypto_akcipher_sync_post
crypto_wait_req--等待异步验签操作完成。
pkcs7_verify_sig_chain--验证签名者的证书链完整性(如证书是否过期)。
public_key_verify_signature--进行证书内部签名验证。
is_key_on_revocation_list--检查证书是否在吊销列表(CRL)中。
pkcs7_validate_trust--验证证书链是否链接到信任锚(如内置根证书)。
pkcs7_validate_trust_one
public_key_verify_signature
pkcs7_free_message--释放 pkcs7_message 结构体及其关联资源。
asn1 decoder(x509_decoder和pkcs7_decoder)
在内核中,x509.asn1 和 pkcs7.asn1 文件是 ASN.1 语法定义文件,它们构成了内核处理数字证书和签名的核心基础设施。
核心功能:
1. 结构定义:提供证书/签名数据的二进制格式蓝图
2. 解析器生成:通过内核构建系统生成解析代码
3. 数据验证:确保 DER 编码符合标准规范
4. 内存转换:将二进制数据转换为内核可操作的结构体
构建时处理流程:

以x509_decoder为例,运行时解析流程:

联系方式:arnoldlu@qq.com
浙公网安备 33010602011771号