1*d996d56dSShuo Zhao.. SPDX-License-Identifier: GPL-2.0 2*d996d56dSShuo Zhao.. include:: ../disclaimer-zh_CN.rst 3*d996d56dSShuo Zhao 4*d996d56dSShuo Zhao:Original: Documentation/security/digsig.rst 5*d996d56dSShuo Zhao 6*d996d56dSShuo Zhao:翻译: 7*d996d56dSShuo Zhao 赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn> 8*d996d56dSShuo Zhao 9*d996d56dSShuo Zhao=============== 10*d996d56dSShuo Zhao数字签名验证API 11*d996d56dSShuo Zhao=============== 12*d996d56dSShuo Zhao 13*d996d56dSShuo Zhao:作者: Dmitry Kasatkin 14*d996d56dSShuo Zhao:日期: 2011.06.10 15*d996d56dSShuo Zhao 16*d996d56dSShuo Zhao 17*d996d56dSShuo Zhao.. 内容 18*d996d56dSShuo Zhao 19*d996d56dSShuo Zhao 1.介绍 20*d996d56dSShuo Zhao 2.API 21*d996d56dSShuo Zhao 3.用户空间工具 22*d996d56dSShuo Zhao 23*d996d56dSShuo Zhao 24*d996d56dSShuo Zhao介绍 25*d996d56dSShuo Zhao==== 26*d996d56dSShuo Zhao 27*d996d56dSShuo Zhao数字签名验证API提供了一种验证数字签名的方法。 28*d996d56dSShuo Zhao目前,数字签名被IMA/EVM完整性保护子系统使用。 29*d996d56dSShuo Zhao 30*d996d56dSShuo Zhao数字签名验证是通过精简的GnuPG多精度整数(MPI)库的内核移植来实现的。 31*d996d56dSShuo Zhao该内核版本提供了内存分配错误处理,已根据内核编码风格进行重构,并修复 32*d996d56dSShuo Zhao了checkpatch.pl报告的错误和警告。 33*d996d56dSShuo Zhao 34*d996d56dSShuo Zhao公钥和签名由头部和MPIs组成:: 35*d996d56dSShuo Zhao 36*d996d56dSShuo Zhao struct pubkey_hdr { 37*d996d56dSShuo Zhao uint8_t version; /* 密钥格式版本 */ 38*d996d56dSShuo Zhao time_t timestamp; /* 密钥时间戳,目前为0 */ 39*d996d56dSShuo Zhao uint8_t algo; 40*d996d56dSShuo Zhao uint8_t nmpi; 41*d996d56dSShuo Zhao char mpi[0]; 42*d996d56dSShuo Zhao } __packed; 43*d996d56dSShuo Zhao 44*d996d56dSShuo Zhao struct signature_hdr { 45*d996d56dSShuo Zhao uint8_t version; /* 签名格式版本 */ 46*d996d56dSShuo Zhao time_t timestamp; /* 签名时间戳 */ 47*d996d56dSShuo Zhao uint8_t algo; 48*d996d56dSShuo Zhao uint8_t hash; 49*d996d56dSShuo Zhao uint8_t keyid[8]; 50*d996d56dSShuo Zhao uint8_t nmpi; 51*d996d56dSShuo Zhao char mpi[0]; 52*d996d56dSShuo Zhao } __packed; 53*d996d56dSShuo Zhao 54*d996d56dSShuo Zhaokeyid等同对整个密钥的内容进行SHA1哈希运算后的第12到19字节。 55*d996d56dSShuo Zhao签名头部用于生成签名的输入。这种方法确保了密钥或签名头部无法更改。 56*d996d56dSShuo Zhao它保护时间戳不被更改,并可以用于回滚保护。 57*d996d56dSShuo Zhao 58*d996d56dSShuo ZhaoAPI 59*d996d56dSShuo Zhao=== 60*d996d56dSShuo Zhao 61*d996d56dSShuo Zhao目前API仅包含一个函数:: 62*d996d56dSShuo Zhao 63*d996d56dSShuo Zhao digsig_verify() - 使用公钥进行数字签名验证 64*d996d56dSShuo Zhao 65*d996d56dSShuo Zhao /** 66*d996d56dSShuo Zhao * digsig_verify() - 使用公钥进行数字签名验证 67*d996d56dSShuo Zhao * @keyring: 查找密钥的密钥环 68*d996d56dSShuo Zhao * @sig: 数字签名 69*d996d56dSShuo Zhao * @sigen: 签名的长度 70*d996d56dSShuo Zhao * @data: 数据 71*d996d56dSShuo Zhao * @datalen: 数据的长度 72*d996d56dSShuo Zhao * @return: 成功时返回0,失败时返回 -EINVAL 73*d996d56dSShuo Zhao * 74*d996d56dSShuo Zhao * 验证数据相对于数字签名的完整性。 75*d996d56dSShuo Zhao * 目前仅支持RSA算法。 76*d996d56dSShuo Zhao * 通常将内容的哈希值作为此函数的数据。 77*d996d56dSShuo Zhao * 78*d996d56dSShuo Zhao */ 79*d996d56dSShuo Zhao int digsig_verify(struct key *keyring, const char *sig, int siglen, 80*d996d56dSShuo Zhao const char *data, int datalen); 81*d996d56dSShuo Zhao 82*d996d56dSShuo Zhao用户空间工具 83*d996d56dSShuo Zhao============ 84*d996d56dSShuo Zhao 85*d996d56dSShuo Zhao签名和密钥管理实用工具evm-utils提供了生成签名、加载密钥到内核密钥环中的功能。 86*d996d56dSShuo Zhao密钥可以是PEM格式,或转换为内核格式。 87*d996d56dSShuo Zhao当把密钥添加到内核密钥环时,keyid定义该密钥的名称:下面的示例中为5D2B05FC633EE3E8。 88*d996d56dSShuo Zhao 89*d996d56dSShuo Zhao以下是keyctl实用工具的示例输出:: 90*d996d56dSShuo Zhao 91*d996d56dSShuo Zhao $ keyctl show 92*d996d56dSShuo Zhao Session Keyring 93*d996d56dSShuo Zhao -3 --alswrv 0 0 keyring: _ses 94*d996d56dSShuo Zhao 603976250 --alswrv 0 -1 \_ keyring: _uid.0 95*d996d56dSShuo Zhao 817777377 --alswrv 0 0 \_ user: kmk 96*d996d56dSShuo Zhao 891974900 --alswrv 0 0 \_ encrypted: evm-key 97*d996d56dSShuo Zhao 170323636 --alswrv 0 0 \_ keyring: _module 98*d996d56dSShuo Zhao 548221616 --alswrv 0 0 \_ keyring: _ima 99*d996d56dSShuo Zhao 128198054 --alswrv 0 0 \_ keyring: _evm 100*d996d56dSShuo Zhao 101*d996d56dSShuo Zhao $ keyctl list 128198054 102*d996d56dSShuo Zhao 1 key in keyring: 103*d996d56dSShuo Zhao 620789745: --alswrv 0 0 user: 5D2B05FC633EE3E8 104