数字签名验证 API

作者:

Dmitry Kasatkin

日期:

06.10.2011

简介

数字签名验证 API 提供了一种验证数字签名的方法。目前,数字签名被 IMA/EVM 完整性保护子系统使用。

数字签名验证是使用 GnuPG 多精度整数 (MPI) 库的精简内核移植实现的。内核移植提供了内存分配错误处理,已根据内核编码风格进行了重构,并且修复了 checkpatch.pl 报告的错误和警告。

公钥和签名由头部和 MPI 组成

struct pubkey_hdr {
        uint8_t         version;        /* key format version */
        time_t          timestamp;      /* key made, always 0 for now */
        uint8_t         algo;
        uint8_t         nmpi;
        char            mpi[0];
} __packed;

struct signature_hdr {
        uint8_t         version;        /* signature format version */
        time_t          timestamp;      /* signature made */
        uint8_t         algo;
        uint8_t         hash;
        uint8_t         keyid[8];
        uint8_t         nmpi;
        char            mpi[0];
} __packed;

keyid 等于对整个密钥内容进行 SHA1[12-19]。签名头用作生成签名的输入。这种方法确保密钥或签名头不会被更改。它可以保护时间戳不被更改,并可用于回滚保护。

API

API 目前仅包含 1 个函数

digsig_verify() - digital signature verification with public key


/**
* digsig_verify() - digital signature verification with public key
* @keyring:     keyring to search key in
* @sig: digital signature
* @sigen:       length of the signature
* @data:        data
* @datalen:     length of the data
* @return:      0 on success, -EINVAL otherwise
*
* Verifies data integrity against digital signature.
* Currently only RSA is supported.
* Normally hash of the content is used as a data for this function.
*
*/
int digsig_verify(struct key *keyring, const char *sig, int siglen,
                  const char *data, int datalen);

用户空间实用程序

签名和密钥管理实用程序 evm-utils 提供生成签名、将密钥加载到内核密钥环的功能。密钥可以是 PEM 格式或转换为内核格式。当密钥被添加到内核密钥环时,keyid 定义了密钥的名称:在下面的示例中为 5D2B05FC633EE3E8。

这是 keyctl 实用程序的示例输出

$ keyctl show
Session Keyring
-3 --alswrv      0     0  keyring: _ses
603976250 --alswrv      0    -1   \_ keyring: _uid.0
817777377 --alswrv      0     0       \_ user: kmk
891974900 --alswrv      0     0       \_ encrypted: evm-key
170323636 --alswrv      0     0       \_ keyring: _module
548221616 --alswrv      0     0       \_ keyring: _ima
128198054 --alswrv      0     0       \_ keyring: _evm

$ keyctl list 128198054
1 key in keyring:
620789745: --alswrv     0     0 user: 5D2B05FC633EE3E8