LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

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为例,运行时解析流程:

 

posted on 2025-07-22 23:59  ArnoldLu  阅读(145)  评论(0)    收藏  举报

导航