基于OpenCryptoki实现国密算法功能的研究*

2018-12-19 01:55魏贵鹏
通信技术 2018年12期
关键词:令牌固件密码

谢 演,刘 陟,魏贵鹏

(成都三零嘉微电子有限公司,四川 成都 610041)

0 引 言

在密码系统中,PKCS#11是公钥加密标准(Public-Key Cryptography Standards,PKCS) 中的一份子,由RSA实验室(RSA Laboratories)发布,为加密令牌定义了一组平台无关的API,如USBKEY、密码TF卡和智能卡等。当前,PKCS#11已经发展成为一个通用的加密令牌的抽象层。OpenCryptoki是PKCS#11标准规范的一个具体实现源码,实现了协议规定的槽管理、对象管理、会话管理、算法功能及密码管理体系等。

为了提高国密算法应用的接口标准化,基于OpenCryptoki将国密算法集成到PKCS#11密码体系中,实现了通过PKCS#11标准接口进行密钥证书管理,可调用支持国密算法的安全硬件设备内部算法资源,使业务和应用得到了国密算法的安全保障。

1 OpenCryptoki说明

1.1 工程架构

OpenCryptoki工程架构为主库和令牌库的双库式架构,业务应用加载主API库libpkcs11.so(以下简称主API库)。根据配置文件,主库自主加载令牌库(libtoken.so),将其作为一个设备令牌挂载在槽[1](slot)上的,最大可支持6个槽,如图1所示。

主API库:实现协议规范的控制和管理,向上层提供标准密码函数接口,向下调用令牌库。

令牌库:实现与硬件密码设备的交互和适配,完成对PKCS#11规范及功能的支撑。

图1 工程架构

1.2 工程体系机制

OpenCryptoki工程自带一套本地机制实现了PKCS#11规范。当在无任何槽挂载条件下,OpenCryptoki使用缺省本地机制(如openssl、软件算法、本地存储等)支持PKCS#11标准规范。如果用户开发新的令牌库完成与对应硬件安全设备适配后,主API库会自主加载用户令牌库,调用用户令牌库实现的功能。由于架构的灵活性,它可以实现管理功能函数功能,使用缺省本地机制。令牌库仅实现其余密码接口功能。

令牌库为用户自行实现,由主API库加载。令牌库可以是纯软件实现的软令牌,也可以是能提供密码安全服务的硬件密码设备(如USBKEY、智能卡、密码TF卡等),且OpenCryptoki已定义了用户扩展能力(VERDOR_DEFINED),可方便基于原架构和体系进行扩展开发,支撑新的密码能力。

2 实现原理及方式

本文以成都三零嘉微公司研制已获得国家密码管理局认证的商用密码TF卡(以下简称密码卡)作为硬件密码设备,并以集成SM2/SM3/SM4和ZUC具体算法为例。

原OpenCryptoki已实现了对PKCS#11规范的体系架构和功能,并且设计了扩展能力来支撑新的密码及功能。因此,基于OpenCryptoki架构可以方便地实现对国密算法的支持。

主体实现策略:密码卡实现和提供国密算法(加解密、摘要、签名验证功能)、PIN和登录功能,以SD接口实现与主机的通信通路,并挂载于主机文件系统下;实现密码卡令牌,完成与密码卡适配,并实现PIN、登陆和国密算法功能,供主API库调用。主API库实现API接口对国密算法的适配,包含国密算法定义扩展、标准接口新增国密功能和重新扩展新国密算法接口。会话管理、对象管理和槽管理使用原OpenCryptoki现成的缺省本地机制,无需重新实现。如图2所示,该方式依托OpenCryptoki扩展能力和缺省本地机制,设计简单,对嵌入式密码卡的CPU和存储资源要求不高,密码设备执行效率高。

图2 实现流程

3 国密算法功能实现

3.1 算法定义扩展

原生OpenCryptoki对算法种类和使用有明确的定义和说明,每种算法由算法类型和算法机制进行描述和定义。国密算法在原生OpenCryptoki中没有定义,因此需要利用用户扩展定义(VERDOR_DEFINED)新增算法定义。

算法类型CKK_XXX是对算法种类名称的定义,如DSA、RSA、AES等。算法机制为一个描述组,包含算法模式类型CKM_XXX,是对一种算法的不同模式的定义,如DES_CBC、SHA256_HMAC等;算法可支持的最大和最小密钥长度支持;算法功能CKF_XXX是对该算法模式的加解密,签名多项功能类型的说明,如CKF_ENCRYPT、CKF_SIGN、CKF_DIGEST、CKF_GENERATE_KEY_PAIR等。以集成SM4算法为例,算法类型定义为CKK_SM4,算法模式类型定义为CKM_SM4_CBC、CKM_SM4_EBC、CKM_SM4_OFB[2]等,最大和最小密钥支持均填16,算法功能定义为CKF_ENCRYPT|CKF_DECRYPT|CKF_WARP|CKF_UNWARP(详细WARP描述请参考PKCS#11规范)。完成算法描述扩展后,才能使OpenCryptoki识别一种新的算法。

3.2 密码函数功能扩展

标准PKCS#11整套密码服务功能包括密钥(对)生成、加解密、签名验证和摘要等。密码体系规范除随机数生成。密钥(对)生成功能外加解密、签名验证、摘要均使用三段式(init-update-final)和两段式(init-func)结构。国密算法使用模式可无缝对接,基于算法定义扩展,采用标准密码API函数接口基础上扩展新的功能定义进行支持,无法兼容标准API重新扩展新的API功能函数接口。

3.2.1 标准密码接口扩展国密算法功能

此处以摘要初始化接口扩展国密SM3和ZUCHASH算法举例说明。

标准函数原型:CK_DEFINE_FUNCTION(CK_RV,C_DigestInit)(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism)

参数:

hSession:会话句柄;

pMechanism:机制结构体指针;

mechanism:机制,可使用CKM_ZUC_EIA[3]、CKM_HMAC_SM3[4]和 CKM_HASH_SM3;

pParameter:传入存放IV或WorkKey数据空间指针;

ulParameterLen:传入pParameter所指向空间的数据的长度;

SM3-HASH:不需要任何IV和WorkKey,pParameter为 NULL;

SM3-HMAC:pParameter指 向 WorkKey数 据空间;

ZUC-EIA:pParameter指 向 IV(16B)+WorkKey(16B)(IV在前)的数据空间。

SM3算法和ZUC-HASH算法均可以兼容使用PKCS#11标准摘要密码接口。而对于差异和区分,扩展定义了新算法类型,并对pMechanism机制进行特殊定义以满足参数输入,以此来完成适配。其余加解密、签名验证算法接口适配方式与上同,均使用对应标准密码接口,扩展新功能定义,此处不再累述。

3.2.2 国密算法扩展接口

国密算法点乘[5]功能并没有现成的标准接口可以直接适配,因此需进行新接口扩展,具体扩展说明如下。

扩展函数原型:

CK_DEFINE_FUNCTION(CK_RV,C_PointMultiply)

(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey, CK_BYTE_PTR pOutData,CK_ULONG_PTR pOutLen)

参数:

hSession:会话句柄;

pMechanism:机制结构体指针;

mechanism:CKM_SM2_POINT_MULT;

pParameter:传入公钥;

ulParameterLen:传入公钥长度,即64字节;

hKey:私钥句柄;

pOutData:得到点乘结果;

pOutLen:得到点乘结果长度。

3.3 令牌库实现

3.3.1 实现原理

密码卡通过SD接口挂载于主机,令牌库通过操作SD接口与密码卡进行数据交互,实现PIN管理、登陆以及各类算法业务功能,即可实现向下对密码卡的适配。同时,将已在OpenCryptoki定义好的令牌功能函数(token_specific_xxx)入口地址赋值给库函数列表(结构体指针),供主API初始化即可向上实现套接,不需或未实现的函数指针赋值为NULL,主API调用判断为NULL则使用缺省机制功能,不为NULL则向下调用令牌库功能函数。

3.3.2 结构层级实现

令牌库结构,如图3所示。令牌库位于主机系统的标准文件系统和文件操作之上,分为设备通信层和业务适配层。

图3 令牌库结构

设备通信层以系统文件操作fopen、fwrite、fread、fclose为基础,建立与密码卡的通信通路,设立统一的通信格式,并将各业务交互数据按通信协议封包发送,接收设备处理结果,判定通信状态。

业务适配层主要完成业务数据转接和适配,以约定的业务数据处理格式进行缓存封包处理、参数及安全检查,然后交给通信层获得处理的数据或结果。

3.3.3 函数接口实现

业务适配层函数已由OpenCryptoki工程定义好,具体为token_specific_xxx,不需要重新实现直接使用即可。

设备通信层函数接口:

登录管理类

CK_INT AG_Device_Init(void)

CK_INT AG_Login(CK_BYTE *pinBuf,CK_UINT inLen)

……

密码功能类:

CK_INT AG_SM2_DSA_Init(void)

CK_INT AG_SM2_Sign (CK_BYTE *pinBuf,CK_UINT iLen,CK_BYTE *poutBuf,CK_UINT iOutLen)

……

(由于篇幅此处不累述)

3.4 通信协议帧实现

通信协议帧由两部分组成:业务数据(payload)和控制头(ctrl_head)。业务数据紧跟在控制头之后,业务数据最大仅支持4 096 B,如图4所示。

图4 协议帧

控制头(必须)主要完成主体业务功能定义,结构体内每个字段域意义进行统一的宏定义,库和固件均按该控制头协议及定义进行解析和处理,结构如下:

typedef struct_ctrl_

{

unsigned int direction;//传输方向

unsigned int cmd_id;//业务功能命令码

unsigned int alg_id;//算法类型

unsigned int mode;//算法模式

unsigned int length;//业务数据长度

unsigned int result;//处理结果

unsigned int reserved_1;

unsigned int reserved_2;

}CTRL_INFO;

业务数据(可选)主要完成每个业务具体数据的格式约定。由于PKC11业务功能多,不同业务类型数据含义不一致,因此业务数据也需要约定。

由于篇幅限制,此处以pin码管理的set_pin(设置pin码)举例说明。从用户端输入的新pin和老pin的业务数据按此数据域和顺序组合:oldpinlen(4)+oldpin(pinlen)+newpinlen(4)+newpin(pinlen);固件端解析完控制头协议为set_pin操作命令后,后续业务数据按上述格式进行解析和处理完成set_pin功能,其余业务数据的格式自行约定。

3.5 密码卡固件实现

3.5.1 固件主体结构

密码卡作为从设备的角色来响应主机下发的数据命令,只负责接收主机端的命令数据,协议帧解析,并完成指定的功能和处理,向主机端上传状态、结果、数据等。整个固件设计结构为简单的主循环调用,层级如图5所示。

驱动库直接操作和访问硬件模块寄存器,可提供各硬件模块的驱动接口函数,供业务调用。

业务功能基于模块驱动实现主要业务函数及功能,包含SD通信、初始化配置、pin码设置管理、登录及状态管理、国密算法加解密、签名验证、摘要等处理(SM2/SM3/SM4和ZUC等)、密钥(密钥对)生成和随机数生成等主要功能。

图5 主体结构

主调用即固件主体调度主函数,主要实现初始化及配置,让固件进入正常工作状态,并对下发数据进行协议解析,然后按解析结果调用具体业务函数实现业务功能,并上报结果。

3.5.2 固件处理流程

如图6所示,固件设计采用中断子程序加主循环程序的结构。中断子程序用来处理指定事件,主要是SD通信数据接收和回复,实现与主机的数据交互;主循环程序对接收的数据进行解析和处理,并准备处理后数据或结果数据,主要功能有通信协议解析,对各业务的数据按约定数据域进行分析和处理,调用相对应的算法资源,完成指定安全算法功能,向主机返回处理结果等。设计主循环程序与中断子程序通过一个数据接收标志进行状态转换和调度,数据传递和交互通过定义两个读写RAM空间实现,两个程序分时独立访问和操作管理。

图6 固件处理流程

3.5.3 固件功能函数接口

登录管理类

UINT16 bs_system_init(void)

UINT16 bs_system_finalize(void)

UINT16 bs_user_login(UINT8 *pinbuf,UINT32 length)

……

密码功能类:

UINT16 bs_sm2_dsa_init(void)

UINT16 bs_sm2_signature(UINT8 *pinbuf,

UINT32 length,UINT8 *outbuf,UINT32 *pout_len)

……

(由于篇幅此处不累述)

4 结 语

本文介绍了一种实现方法可以实现PKCS#11接口对国密算法体系的集成和支撑,由库层进行高效管理,嵌入式密码安全设备处理具体安全密码业务,既保证了算法安全性,又对嵌入式密码安全设备要求低,占用资源少,执行高效,且使用统一的接口规范,极大地提高了国密接口友好性和开发者的效率,促使国密算法得到更广泛的推广和应用。

猜你喜欢
令牌固件密码
密码里的爱
称金块
基于路由和QoS令牌桶的集中式限速网关
密码抗倭立奇功
基于SHA1的SCADA系统PLC固件完整性验证方法
密码藏在何处
基于固件的远程身份认证
夺命密码
英特尔发布免费固件引擎
提取ROM固件中的APP