數字簽名驗證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目前只包含一個函式

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