首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 密钥保留服务入门(2)

Linux 密钥保留服务入门(2)

三个新的系统调用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。密钥类型可以是 userkeyring。其他任何密钥类型必须已经通过内核服务向内核注册,然后才能使用。如果密钥是 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);




返回列表