三个新的系统调用Linux 密钥保留服务提供三个新的系统调用,用来在用户空间中操作密钥。第一个是 add_key:
1
2
3
| key_serial_t add_key(const char *type, const char *desc,
const void *payload, size_t plen,
key_serial_t ring);
|
add_key 系统调用用来创建类型为 type、长度为 plen 的密钥。密钥描述由 desc 定义,它的有效内容由 payload 指定。密钥链接到 keyring ring。密钥类型可以是 user 或 keyring。其他任何密钥类型必须已经通过内核服务向内核注册,然后才能使用。如果密钥是 keyring 类型的,有效内容就应该是 NULL,plen 应该是零。
下一个新的系统调用是 request_key:
1
2
3
| key_serial_t request_key(const char *type, const char *desc,
const char *callout_info,
key_serial_t dest_keyring);
|
request_key 系统调用搜索一个进程 keyring,寻找一个密钥。搜索密钥的基本算法见清单 3。
清单 3. request_key 算法1
2
3
4
5
6
7
8
9
10
11
| search_into_each_subscribed_keyrings {
if(key is found){
return(found key);
} else {
if(callout_info is NULL){
return(ERROR);
} else {
Execute /sbin/request-key and pass callout_info as argument;
}
}
}
|
关于 request_key 算法的工作原理的详细信息,请参考 Documentation/keys-request-key.txt(参见 中的链接)。
最后,系统调用 keyctl 提供许多用来管理密钥的函数。可以根据传递给 keyctl 的第一个参数在密钥上执行各种操作。下面列出 keyctl 的一部分操作:
- KEYCTL_DESCRIBE 描述一个密钥。
- KEYCTL_READ 从一个密钥读取有效内容数据。
- KEYCTL_UPDATE 更新指定的密钥。
- KEYCTL_LINK 将一个密钥链接到一个 keyring。
- KEYCTL_UNLINK 将密钥或 keyring 与另一个 keyring 的链接取消。
- KEYCTL_JOIN_SESSION_KEYRING 将一个会话 keyring 替换为新的会话 keyring。
- KEYCTL_REVOKE 取消一个密钥。
- KEYCTL_CHOWN 修改密钥的所有者。
- KEYCTL_SETPERM 修改密钥的权限掩码。
- KEYCTL_CLEAR 清除一个 keyring。
- KEYCTL_SEARCH 在一个 keyring 树中搜索密钥。
- KEYCTL_INSTANTIATE 对部分构造好的密钥进行实例化。
- KEYCTL_NEGATE 取消对部分构造好的密钥的实例化。
关于 keyctl 的原型和 keyctl 可以执行的其他操作的更多信息,请参考 Linux 手册页。
管理密钥的内核 API下面是几个用来管理密钥的最重要的 Linux 内核 API。要想了解更全面的信息,请下载并参考 Linux 密钥实现源代码文件(参见下面的 下载)。
- register_key_type 用来定义新的密钥类型。
- 如果已经存在名称相同的密钥类型,那么 int register_key_type(struct key_type *type) 返回 EEXIT。
- unregister_key_type 用来取消密钥类型的注册:
1
| void unregister_key_type(struct key_type *type);
|
- key_put 发布一个密钥:
1
| void key_put(struct key *key);
|
- request_key 搜索与给定的描述匹配的密钥:
1
2
3
| struct key *request_key(const struct key_type *type,
const char *description,
const char *callout_string);
|
- key_alloc 分配指定类型的密钥:
1
2
3
| struct key *key_alloc(struct key_type *type, const char *desc,
uid_t uid, gid_t gid, struct task_struct *ctx,
key_perm_t perm, unsigned long flags);
|
- key_instantiate_and_link 对密钥进行实例化并将它链接到目标 keyring:
1
2
3
| int key_instantiate_and_link(struct key *key, const void *data,
size_t datalen, struct key *keyring,
struct key *instkey);
|
|