企业微信客服
“一对一”解答

PKCS#11标准解读-Cryptoki库如何工作

此为完结篇,介绍Cryptoki库如何工作。

创建人:五台 最近更改时间:2022-01-11 16:00:00
304

PKCS#11是使用非常普遍的密码设备接口,在实际应用中,国密的密码设备应用接口规范GMT0018与之作用相同,在技术体系架构中处于类似的位置。

在密码产品的开发中,按照PKCS#11或者GMT0018接口规范提供相应的接口封装,应用程序无需改动或者微小改动就可以更换底层密码设备。

PKCS#11的标准内容比较多,v2-20版本有400页,相应的,PKCS#11的标准解读,将按照概念及常用接口、角色、会话、对象、机制分别进行,最后介绍应用的调用流程,串起各个概念和接口。

 

此为第四篇,介绍Cryptoki库如何工作,作为此系列的完结篇。机制的部分v2-20版本定义的机制超过200种,还需要跟不同的接口形成对应关系,需要的话直接查阅标准就好了。

 

一、部分常用接口与Cryptoki模型的映射映射关系

在Cryptoki模型中,应用通过集成Cryptoki库来调用密码设备的功能。

Cryptoki库通过slot和token来映射物理密码设备。

Session可以视为在Application和token之间的一个逻辑连接,通过Function访问object和mechanism完成密码相关的功能。

 

 

二、Cryptoki接口工作过程

下图展示了一些常用的Cryptoki接口函数的调用过程。在标准文档的示例中,也有不同接口调用流程的示例,后面或稍微展开做一些解释。

1、C_GetFunctionList 获得一个指向 Cryptoki 库的函数指针表的指针。 所获得的指针可以指入 Cryptoki 库所拥有的存储器,在任何情况下,都不要写入该存储器。C_GetFunctionList 是Cryptoki库初始化之前应用可能会调用的唯一的函数。这样可使应用方便、快速地使用共享 Cryptoki 库和同时使用多个Cryptoki 库。

 

2、C_Initialize初始化Cryptoki库。C_Initialize应当是一个应用所调用的第一个Cryptoki调用。如果几个应用或进程同时使用Cryptoki,则每个应用应当调用C_Initialize,每次调用C_Finalize前,应调用一次C_Initialize。

 

3、调用C_Finalize表明,用Cryptoki库完成了一个应用。它应当是应用所做的最后一个Cryptoki调用。如果几个应用或进程正在使用Cryptoki,则每个应用应当调用C_Finalize,每次调用C_Finalize前,应调用一次C_Initialize。在两个调用中,应用才能调用其他的Cryptoki功能。

 

4、C_OpenSession有两个不同的功能:它能建立一个应用调用,以便当一个令牌被插入一个特定页槽时,会通知一个应用,或者会在一个应用和一个特定槽中的令牌之间打开一个对话。

 

5、C_CloseSession关闭应用和令牌之间的对话,与C_OpenSession 配对使用。当与会话有关的所有操作都执行完后,必须调用C_CloseSession。关闭一个对话时,由该对话建立的所有对话对象都将自动被破坏,即使该应用有其他对话正在“使用”该对象。例如一个函数正在与该对话并行运作,那么该操作将被取消。

 

6、C_Login将某个用户登录到一个令牌,所有与会话相关的操作都必须在C_Login之后执行。如果调用成功,则根据用户的类型,每个应用对话要么进入R/W SO功能状态,要么R/W User功能状态,或者是R/O User功能状态。

 

7、C_Logout将用户从令牌中注销,与C_Login成对使用。如果函数调用成功,每个应用程序根据当前的用户类型进入R/W Public Session状态或R/O Public Session状态。

 

当C_Logout成功执行后,任何返回到专用目标的应用程序句柄就无效了(即使用户以后被返回注册到令牌,那些句柄仍然无效),另外,所有的专用会话目标都被破坏。

 

如果会话中存在任何激活的密码或目标搜寻操作,并且接着执行C_Logout,那么那些操作可能仍在继续进行,因此,注销前应完成一切已激活的操作。

 

8、需要注意在Cryptoki库中,所有密码运算操作(加密解密、签名验签、消息摘要)都有一个预置操作。比如在调用C_Encrypt之前必须调用C_EncryptInit来启动。

 

三、应用集成

Cryptoki库一般由密码设备厂商开发,将设备自身的密码功能转换为符合PKCS#11标准的接口。这样当底层的密码设备进行版本更新或者使用其他厂商的产品进行替代时,应用开发商只需要对比自身引用所需接口功能能够满足,就可以通过更新Cryptoki库的方式完成升级。

 

如果是单机的应用,一般采用设备+驱动+Cryptoki库+应用的集成方式。

 

现实中更多的是网络应用,应用集成的Cryptoki库需要通过网络接口调用密码设备的功能,此时需要采用安全的通信协议进行通信。