创建人:五台 最近更改时间:2021-12-08 16:00:00
237
PKCS#11是使用非常普遍的密码设备接口,在实际应用中,国密的密码设备应用接口规范GMT0018与之作用相同,在技术体系架构中处于类似的位置。
在密码产品的开发中,按照PKCS#11或者GMT0018接口规范提供相应的接口封装,应用程序无需改动或者微小改动就可以更换底层密码设备。
PKCS#11的标准内容比较多,v2-20版本有400页,相应的,PKCS#11的标准解读,将按照概念及常用接口、角色、会话、对象、机制分别进行,最后介绍应用的调用流程,串起各个概念和接口。
此为第二篇,介绍两种令牌用户类型、应用程序的Cryptoki调用,以及会话。
一、用户
Cryptoki识别两种类型的用户,一种是安全官SO,一种是普通用户。
只有经过授权的普通用户可以访问令牌上的私有对象。有些令牌可能需要在用户执行任意密码运算之前经过授权,不管是否访问私有对象。
SO的作用是初始化令牌和设置普通用户的PIN。在SO设置普通用户的PIN之前,普通用户无法登录。
Cryptoki并不涉及SO和用户团体之间的关系。SO和普通用户可以是同一个人也可以是不同的人。
Cryptoki仅仅假设PIN是下表中字符的子集,不关心PIN如何填充和怎样产生。
二、应用程序调用Cryptoki
1、一个应用程序包含一个单个地址空间和在其中运行的控制线程。
其中一个线程调用C_Initialize完成后,该应用程序就可以调用其他接口函数。所有工作完成后调用C_Finalize结束。
2、Unix系统中子进程与主进程有不同的地址空间,视为分离的应用程序,需要分别调用Cryptoki库。
即使子进程不需要使用Cryptoki,也建议实际调用C_Initialize和C_Finalize。
3、多线程应用程序访问Cryptoki时,需要确定访问特性:
a、确定不会多线程同时访问库,该库不用担心执行任意种类的线程安全的锁定。
b、确定多线程访问库,该库必须使用本机操作系统的同步原语确保线程安全。
c、确定多线程访问库,该库必须提供一套应用程序同步原语确保线程安全。
d、确定多线程访问库,库必须使用本机操作系统同步原语或一组应用程序提供的同步原语确保线程安全。
对于c和d两种情况,Cryptoki提供Mutex对象实现线程安全。
三、会话
1、主要概念
Cryptoki需要用令牌打开一个以上的会话以便使用令牌的对象和函数。会话在应用程序和令牌之间提供一个逻辑连接。
会话可以是读/写(R/W)会话或只读(R/O)会话。读/写和只读指对令牌对象的访问而非会话对象。
在这两种会话类型中,应用程序都可以创建、读取、写入和删除会话、销毁会话对象,并读取令牌对象。
仅在读/写会话中应用程序可以创建、修改和销毁令牌对象。
会话中创建的对象会随着会话的关闭而销毁,即便其他会话正在使用此对象。
Cryptoki在多令牌上支持多个会话。应用程序可以和一个以上的令牌进行一个以上的会话。一个令牌可以和一个以上的应用程序进行多个会话。
2、只读会话状态
R/O公共会话:应用程序已打开一个只读会话。应用程序拥有公共令牌对象的只读权限和公共会话对象的读写权限。
R/O用户函数:普通用户已经通过令牌的身份认证。应用程序拥有对所有令牌对象的只读权限和所有会话对象的读写权限。
3、读/写会话状态
读/写会话状态只能存在于三种状态之一:
如果应用程序没有以前注册的打开的会话,它在“读/写公共会话”状态。
如果应用程序有一个普通用户注册的打开会话,它在“读/写用户函数”状态。
如果应用程序已经有一个SO注册的打开会话,它在“读/写SO功能”状态。
R/W公共会话:应用程序已经打开一个读/写会话。应用程序对所有公共对象进行读/写访问。
R/W SO功能:安全官员已通过令牌的身份验证。应用程序仅对令牌上的公共对象具有读/写访问权限令牌,而不是私有对象。SO可以设置正常用户的PIN。
R/W用户函数:普通用户已经由令牌授权。应用程序对所有对象进行读/写访问。
4、不同类型的会话和对象访问权限表
5、会话事件
在Cryptoki中,给定的应用程序和令牌,所有会话有相同的注册/注销状态。所有会话要么是公共会话,要么是SO会话,要么是用户会话。
当一个应用程序的会话注册一个令牌,该应用程序对应该令牌的所有会话都会注册;
同时,当一个应用程序的一个会话注销一个令牌,该应用程序使用该令牌的所有会话也会注销。
6、会话句柄和对象句柄
会话句柄是用来标识会话的Cryptoki赋值。
一个应用程序的所有线程都可以平等访问所有会话句柄。
对象句柄是用来操作Cryptoki的标识符。对象的可见性对一个应用程序的所有线程都相同。
Cryptoki中的有效地会话句柄和对象句柄都是非零值。
7、会话的能力
一个打开的会话能用来执行三大类操作:
管理操作(如注册),对象管理操作(如在令牌上建立或销毁一个对象),密码操作(如计算消息摘要)
通常一个时间内单个会话只能执行一个操作,所以对于单个应用程序,可能需要单个令牌打开多个会话。
一个应用程序不应该使多个类似函数调用使用通用会话来调动Cryptoki功能,如果有这种需要,应该允许每个线程有自己的会话。
未完待续......