Documentation / translations / zh_CN / security / digsig.rst


Based on kernel version 6.14. Page generated on 2025-04-02 08:20 EST.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_CN.rst

:Original: Documentation/security/digsig.rst

:翻译:
 赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn>

===============
数字签名验证API
===============

:作者: Dmitry Kasatkin
:日期: 2011.06.10


.. 内容

   1.介绍
   2.API
   3.用户空间工具


介绍
====

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

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

公钥和签名由头部和MPIs组成::

	struct pubkey_hdr {
		uint8_t		version;	/* 密钥格式版本 */
		time_t		timestamp;	/* 密钥时间戳,目前为0 */
		uint8_t		algo;
		uint8_t		nmpi;
		char		mpi[0];
	} __packed;

	struct signature_hdr {
		uint8_t		version;	/* 签名格式版本 */
		time_t		timestamp;	/* 签名时间戳 */
		uint8_t		algo;
		uint8_t		hash;
		uint8_t		keyid[8];
		uint8_t		nmpi;
		char		mpi[0];
	} __packed;

keyid等同对整个密钥的内容进行SHA1哈希运算后的第12到19字节。
签名头部用于生成签名的输入。这种方法确保了密钥或签名头部无法更改。
它保护时间戳不被更改,并可以用于回滚保护。

API
===

目前API仅包含一个函数::

	digsig_verify() - 使用公钥进行数字签名验证

	/**
	* digsig_verify() - 使用公钥进行数字签名验证
	* @keyring:   查找密钥的密钥环
	* @sig:       数字签名
	* @sigen:     签名的长度
	* @data:      数据
	* @datalen:   数据的长度
	* @return:    成功时返回0,失败时返回 -EINVAL
	*
	* 验证数据相对于数字签名的完整性。
	* 目前仅支持RSA算法。
	* 通常将内容的哈希值作为此函数的数据。
	*
	*/
	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