• 2.40 MB
  • 2022-04-22 13:37:06 发布

DB11T254.2-2004政务数字证书规范应用接口.pdf

  • 54页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'ICS35.240.30L70备案号:16484-2005DB北京市地方标准DB11/T254.2-2004政务数字证书规范第2部分:应用接口SpecificationofdigitalcertificateforgovernmentaffairPart2:Applicationprogramminginterface2004-12-20发布2005-02-01实施北京市质量技术监督局发布 DB11/T254.2-2004目次前言.................................................................................................................................................................II引言................................................................................................................................................................III1范围..................................................................................................................................................................12规范性引用文件..............................................................................................................................................13术语和定义、缩略语......................................................................................................................................13.1术语和定义...................................................................................................................................................13.2缩略语...........................................................................................................................................................24政务数字证书应用接口..................................................................................................................................24.1数字证书应用接口体系结构.......................................................................................................................24.2数字证书应用接口组成和功能说明...........................................................................................................35政务数字证书应用接口函数定义..................................................................................................................55.1环境函数.......................................................................................................................................................55.2设备管理函数...............................................................................................................................................65.3证书函数.......................................................................................................................................................75.4密码服务函数.............................................................................................................................................125.5消息函数.....................................................................................................................................................30附录A(规范性附录)政务数字证书应用接口宏定义和说明................................................................34A.1类型宏定义................................................................................................................................................34A.2常量宏定义................................................................................................................................................34A.3全局参数....................................................................................................................................................34附录B(规范性附录)政务数字证书应用接口数据结构定义和说明....................................................36附录C(规范性附录)政务数字证书应用接口错误代码定义和说明....................................................37附录D(资料性附录)政务数字证书典型应用框架图............................................................................38D.1典型应用框架图........................................................................................................................................38D.2典型业务流程分析....................................................................................................................................39附录E(资料性附录)政务数字证书典型应用示例................................................................................40E.1程序基本流程............................................................................................................................................40E.2程序示例说明............................................................................................................................................41I DB11/T254.2-2004前言DB11/T254-2004《政务数字证书规范》分为二个部分:——第1部分:格式;——第2部分:应用接口。本部分为DB11/T254-2004的第2部分。本部分从总体上同国家相关标准保持一致,并结合北京市实际工作特点而制定。本部分的附录A、附录B和附录C是规范性附录,附录D和附录E是资料性附录。本部分由北京市信息化工作办公室提出并归口。本部分主要起草单位:北京数字证书认证中心、中国科学院研究生院信息安全国家重点实验室、北京市国家保密局、北京市国密办。本部分主要起草人:阳俊彪、姚世全、陈淑仪、高能、张秀娟、孙永、荆继武、李述胜。II标准分享网www.bzfxw.com免费下载 DB11/T254.2-2004引言信息技术和网络技术在极大地促进了社会的经济、科技、文化、教育和管理等各个方面发展的同时,又带来了巨大的信息安全风险。随着北京市电子政务工程的不断深入和发展,迫切需要在开放的网络环境下建立一个真实、有效的身份信任体制,确认电子政务参与方的各自身份,建立彼此间的信任关系以及保证信息的保密性、完整性和可用性。以PKI为核心的网络身份认证体系和信息加密技术已成为业界广泛认同的一种构造网络身份信任体制的重要方式,并成为信息安全保障体系中极其重要的组成部分之一。数字证书应用接口是PKI技术应用的关键和核心,是电子政务应用系统使用和应用PKI技术的桥梁。为了确保政务数字证书在电子政务信息的应用中能够通用,实现信息系统互联互通,统一数字证书应用接口规范,更好形成统一的网络信任体系。III 标准分享网www.bzfxw.com免费下载 DB11/T254.2-2004政务数字证书规范第2部分:应用接口1范围本部分规定了政务数字证书应用接口体系结构,各个接口函数的函数名称、参数和返回值以及政务数字证书应用接口所需的宏定义、数据结构和错误代码。本部分适用于数字证书认证机构、数字证书认证系统的开发商、电子政务应用部门以及基于数字证书的安全应用开发商进行信息系统建设。应用于电子商务领域的数字证书应用接口,也可参照本部分。本部分不涉及任何具体的密码运算,所有密码运算均在符合国家有关法规的密码设备中进行。本部分凡涉及密码相关内容,按国家有关法规实施。2规范性引用文件下列文件中的条款通过DB11/T254的本部分的引用而成为本部分的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本部分,然而,鼓励根据本部分达成协议的各方研究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本部分。ISO/IEC8825-1:1998,信息技术-ASN.1编码规则:基本编码规则(BER)的规范,正规编码规则(CER)和可区分编码规则(DER)IETFRFC3280InternetX.509PublicKeyInfrastructureCertificateandCertificateRevocationList(CRL)Profile因特网X.509公开密钥基础设施证书与证书撤销列表轮廓PKCS1:RSACryptographyStandardPKCS1:RSA密码标准PKCS7:CryptographicMessageSyntaxStandardPKCS7:密码消息语法标准3术语和定义、缩略语下列术语、定义和缩略语适用于DB11/T254的本部分。3.1术语和定义3.1.1证书认证机构(CA)certificationauthority(CA)受用户信任,负责创建和分配证书的权威机构。3.1.2证书验证certificatevalidation确认证书在给定时间有效的过程,可能包含一个证书认证路径的构造和处理,确保该路径上的所有证书在给定时间有效(即证书没有被撤销或者过期)。3.1.3证书撤销列表(黑名单)certificaterevocationlist(CRL)一个已标识的列表,它指定了一系列证书发布者认为无效的证书。3.1.4数字证书(证书)digitalcertificate由国家认可的、由CA进行数字签名的一个可信的数字化文件。数字证书包含有公开密钥拥有者的信息、公开密钥、签名算法和CA的数字签名。3.1.5政务数字证书governmentaffairdigitalcertificate1 DB11/T254.2-2004用来标识电子政务参与方真实身份的数字证书。根据参与方的不同类别分为政务证书认证机构证书、政务个人证书、政务机构证书、政务设备证书、政务代码签名证书。3.1.6私有密钥(私钥)privatekey(在公钥密码体制中)用户密钥对中仅为该用户所知的密钥。3.1.7公开密钥(公钥)publickey(在公钥密码体制中)用户密钥对中公布给公众的密钥。3.1.8公开密钥基础设施(PKI)publickeyinfrastructure支持公钥管理体制的基础设施,提供鉴别、加密、完整性和不可否认性服务。3.1.9信任trust通常,当一个实体假设另一个实体完全按照前者的期望行动时,则称前者“信任”后者。这种“信任”可能只适用于某些特定功能。本部分中“信任”的关键作用是描述鉴别实体和权威机构之间的关系;鉴别实体应确信它能够“信任”权威机构仅创建有效且可靠的证书。3.2缩略语下列缩略语适用于本部分:API应用程序接口(ApplicationProgrammingInterface),简称应用接口CA证书认证机构(CertificationAuthority)CN通用名(CommonName)CRL证书撤销列表(黑名单)(CertificateRevocationList)CSP加密服务提供者(CryptographicServiceProvider)DER可区分编码规则(DistinguishedEncodingRules)DN可辨别名(DistinguishedName)LDAP轻量级目录访问协议(LightweightDirectoryAccessProtocol)OID对象标识符(ObjectIdentifier)PKCS公钥密码使用标准(thePublic-KeyCryptographyStandard)4政务数字证书应用接口4.1数字证书应用接口体系结构证书数字证书应用接口体系结构,如图1所示:2标准分享网www.bzfxw.com免费下载 DB11/T254.2-2004身份认证保密性完整性不可否认性应用程序应用层政务数字证书应用接口环境函数设备管理函数证书函数消息函数接口层密码服务函数密码设备(加密机、加密卡、智能IC卡和USBKEY等)设备层密钥图1政务数字证书应用接口体系结构政务数字证书应用接口位于应用系统和密码设备之间,应用程序通过调用政务数字证书应用接口实现身份认证、实现信息的保密性、完整性和不可否认性;政务数字证书应用接口通过标准接口,在密码设备中实现具体的密码运算和密钥使用。政务数字证书应用接口通过支持PKCS11和CSP接口方式,屏蔽各类密码设备(加密机、加密卡、智能IC卡和智能USBKEY等)的设备差异性,屏蔽各类密码设备的密码应用接口的差异性,实现应用程序与密码设备无关性。政务数字证书应用接口提供的消息函数符合PKCS7格式。政务数字证书应用接口证书格式按DB11/TXXXX.1-2004执行,证书解码按ISO/IEC8825-1执行,黑名单(CRL)解码按IETFRFC3280执行,公钥加密体系按PKCS1和PKCS7执行。本部分在证书和CRL获取上,支持LDAP方式。本部分中所引用的MD2、MD5、SHA-1和RSA密码算法均为举例说明。4.2数字证书应用接口组成和功能说明数字证书应用接口由以下部分组成:·环境函数·设备管理函数·证书函数·密码服务函数·消息函数4.2.1环境函数3 DB11/T254.2-2004环境函数负责创建和管理安全程序空间,负责创建和管理安全程序空间中所需的各种资源、信号,并确保安全程序空间在应用程序运行期间不会被非法访问,造成信息泄漏。环境函数负责完成与密码设备的安全连接,确保后续的安全操作是在安全、可信的程序空间中进行。应用程序在使用政务数字证书应用接口时,要首先调用初始化环境函数(PKI_Initialize)创建和初始化安全的应用程序空间,完成与密码设备连接和初始化工作。在中止应用程序之前,应调用清除环境函数(PKI_Finalize),中止与密码设备的连接,销毁所创建的安全程序空间,防止由于内存残留所带来的安全风险。4.2.2设备管理函数设备管理函数负责在用户与密码设备之间创建和管理安全访问令牌。设备管理函数支持创建两种类型的用户安全访问令牌,一种是普通用户,该类型的安全访问令牌标识该用户是普通用户,只能访问密码设备中属于私有的信息和数据;另一类是超级用户(或安全官员),该类型的安全访问令牌标识该用户是超级用户(安全官员),可以访问密码设备中的公有信息,设置和修改普通用户的PIN。应用程序在调用任何密码服务函数,进行任何密码运算之前都必须首先调用设备管理函数的用户登录函数(PKI_Login),建立安全访问令牌。建立了安全访问令牌后,则可以调用任何密码服务函数。在不再调用任何密码服务函数,应调用注销登录函数(PKI_Logout)注销安全访问令牌,确保密码设备不被非法访问。另外,用户可以定期通过调用修改PIN函数(PKI_ChangePin),修改创建安全访问令牌时所需提供的PIN,确保密码设备不被非法使用。4.2.3证书函数证书函数主要是设置各类数字证书到应用接口会话环境中、验证用户证书和获取数字证书或黑名单,提供了包括证书获取、黑名单(CRL)获取、可信根CA证书设置、用户证书验证和用户证书信息获取等一系列具体函数。应用程序通过调用证书函数,可以很方便地实现基于数字证书的身份认证,从证书中获取有关信息,实现授权管理、访问控制等安全机制。证书函数在具体使用中,要先通过调用证书和CRL获取函数或其他途径,获取相关证书和黑名单(CRL),然后调用相关的证书设置函数:添加信任的CA根证书、添加CA证书、设置用户证书等设置证书应用环境。在此基础上,调用相关函数进行证书验证,实现用户身份认证;调用取证书信息和取证书扩展信息获取证书中有关信息,实现授权管理和访问控制等安全机制。4.2.4密码服务函数密码服务函数负责具体与密码设备交互实现具体地密码运算,并将密码运算后地结果返回给应用程序,是应用程序实现数据保密性、完整性和不可否认性等安全机制的基础。密码服务函数提供包括BASE64编解码、随机数生成、数字摘要以及各种对称和非对称密码运算等共39个具体的函数。密码服务函数支持定长数据和不定长数据的密码运算,对于定长数据可以直接调用相关函数进行处理;对于不定长数据,需要先创建相应的密码运算对象,然后调用相应的函数对数据进行持续处理。当数据处理完时,要调用相应的函数表示数据处理完,最后要调用相应函数销毁相应的密码运算对象。密码服务函数在整个政务数字证书应用接口中属于底层函数,并不是所有的密码服务函数都必须在应用程序中使用。4.2.5消息函数消息函数主要是将数据按照PKCS7格式进行封装,实现数据封装格式与应用系统无关性,实现应用系统互联互通和信息共享。4标准分享网www.bzfxw.com免费下载 DB11/T254.2-2004消息函数提供了PKCS7格式的数据编解码、PKCS7格式的签名数据编解码和PKCS7格式的数字信封编解码,能够非常方便应用程序实现身份认证、保密性、完整性和不可否认性等安全措施。5政务数字证书应用接口函数定义以下所定义的函数,除明确说明外,其接口参数都不能为空。5.1环境函数环境函数包括以下具体函数:·初始化环境:PKI_Initialize·清除环境:PKI_Finalize·获取接口版本信息:PKI_GetVersion5.1.1初始化环境PKI_Initialize函数名称PKI_RVPKI_Initialize(unsignedlongproviderType,char*providerParameter,unsignedlongpinSilentFlag,char*devMngApi);功能简介初始化安全应用程序空间参数说明providerType[IN]:密码服务模块类型当providerType==PKI_PROVIDER_CSP时providerParameter:CSP的名称devMngApi:设备管理接口库路径当providerType==PKI_PROVIDER_PKCS11时providerParameter:PKCS11库的路径devMngApi:设备管理接口库路径pinSilentFlag为口令输入静态非静态标识返回值RV_OK:成功其他:失败5.1.2清除环境:PKI_Finalize函数名称PKI_RVPKI_Finalize(void);功能简介清除应用程序空间参数说明无返回值RV_OK:成功其他:失败5 DB11/T254.2-20045.1.3获取接口版本信息:PKI_GetVersion函数名称PKI_RVPKI_GetVersion(unsignedlong*versoin)功能简介取接口版本号参数说明version[OUT]:版本号version的高2字节表示主版本号,低2字节表示次版本号返回值RV_OK:成功其他:失败5.2设备管理函数设备管理函数包括以下具体函数:·用户登录:PKI_Login·修改PIN:PKI_ChangePin·注销登录:PKI_Logout5.2.1用户登录:PKI_Login函数名称PKI_RVPKI_Login(unsignedchar*pin,unsignedlongpinLen)功能简介用户登录密码设备,建立安全令牌。参数说明pin[IN]:设备口令pinLen[IN]:设备口令长度返回值RV_OK:成功其他:失败5.2.2修改PIN:PKI_ChangePin函数名称PKI_RVPKI_ChangePin(unsignedchar*oldPin,unsignedlongoldPinLen,unsignedchar*newPin,unsignedlongnewPinLen);功能简介修改设备PIN参数说明usrType[IN]:用户类型//0:SUPER_LOGIN1:USR_LOGINoldPin[IN]:设备当前口令6 DB11/T254.2-2004oldPinLen[IN]:设备当前口令长度newPin[IN]:设备新口令newPinLen[IN]:设备新口令长度返回值RV_OK:成功其他:失败5.2.3注销登录:PKI_Logout函数名称PKI_RVPKI_Logout(unsignedlongusrType)功能简介设备注销登录参数说明usrType[IN]:用户类型//0:SUPER_LOGIN1:USR_LOGIN返回值RV_OK:成功其他:失败5.3证书函数证书函数包括以下具体函数:·添加信任的CA根证书:PKI_AddTrustedRootCaCertificate·添加CA证书:PKI_AddCaCertificate·添加黑名单:PKI_AddCrl·设置用户证书:PKI_SetUsrCertificate·获取用户证书:PKI_GetUsrCertificate·验证用户证书:PKI_VerifyUsrCertificate·根据CRL文件验证用户证书是否被注销:PKI_VerifyUsrCertificateByCrl·OCSP在线证书状态查询:PKI_OcspVerifyCertificate·通过LDAP方式获取证书:PKI_GetCertFromLdap·通过LDAP方式根据证书获取CRL:PKI_GetCrlFromLdap·取证书信息:PKI_GetCertificateInfo·取证书扩展信息:PKI_GetExtTypeInfo5.3.1添加信任的CA根证书:PKI_AddTrustedRootCaCertificate函数名称PKI_RVPKI_AddTrustedRootCaCertificate(unsignedchar*certificate,unsignedlongcertificateLen);功能简介添加信任的CA根证书参数说明certificate[IN]:DER编码的证书certificateLen[IN]:DER编码的证书长度返回值RV_OK:成功其他:失败7 DB11/T254.2-20045.3.2添加CA证书:PKI_AddCaCertificate函数名称PKI_RVPKI_AddCaCertificate(unsignedchar*certificate,unsignedlongcertificateLen);功能简介添加CA证书参数说明certificate[IN]:DER编码的证书certificateLen[IN]:DER编码的证书长度返回值RV_OK:成功其他:失败5.3.3添加黑名单:PKI_AddCrl函数名称PKI_RVPKI_AddCrl(unsignedchar*derCrl,unsignedlongderCrlLen);功能简介添加黑名单参数说明derCrl[IN]:DER编码的CRLderCrlLen[IN]:DER编码的CRL长度返回值RV_OK:成功其他:失败5.3.4设置用户证书:PKI_SetUsrCertificate函数名称PKI_RVPKI_SetUsrCertificate(unsignedchar*containerName,unsignedlongcontainerLen,unsignedlongkeyUsage,unsignedchar*certificate,unsignedlongcertificateLen);功能简介设置用户证书参数说明containerName[IN]:密钥的容器名containerNameLen[IN]:密钥的容器名长度keyUsage[IN]:密钥用途certificate[IN]:DER编码的证书8 DB11/T254.2-2004certificateLen[IN]:DER编码的证书长度返回值RV_OK:成功其他:失败5.3.5获取用户证书:PKI_GetUsrCertificate函数名称PKI_RVPKI_GetUsrCertificate(unsignedchar*containerName,unsignedlongcontainerLen,unsignedlongkeyUsage,unsignedchar*certificate,unsignedlong*certificateLen);功能简介获取用户证书参数说明containerName[IN]:容器名containerNameLen[IN]:容器名长度keyUsage[IN]:密钥用途certificate[OUT]:DER编码的证书certificateLen[OUT]:DER编码的证书长度返回值RV_OK:成功其他:失败5.3.6验证用户证书:PKI_VerifyUsrCertificate函数名称PKI_RVPKI_VerifyUsrCertificate(unsignedchar*usrCertificate,unsignedlongusrCertificateLen);功能简介验证用户证书参数说明usrCertificate[IN]:DER编码的证书usrCertificateLen[IN]:DER编码的证书长度返回值RV_OK:成功其他:失败5.3.7根据CRL文件验证用户证书是否被注销:PKI_VerifyUsrCertificateByCrl函数名称PKI_RVPKI_VerifyUsrCertificateByCrl(unsignedchar*usrCertificate,9 DB11/T254.2-2004unsignedlongusrCertificateLen,unsignedchar*derCrl,unsignedlongderCrlLen);功能简介根据CRL文件验证用户证书是否被注销参数说明usrCertificate[IN]:DER编码的证书usrCertificateLen[IN]:DER编码的证书长度derCrl[IN]:DER编码的黑名单derCrlLen:DER编码的黑名单长度返回值RV_OK:成功其他:失败5.3.8OCSP在线证书状态查询:PKI_OcspVerifyCertificate函数名称PKI_RVPKI_OcspVerifyCertificate(char*ocspServerIpAddress,unsignedlongocspServerPort,unsignedchar*derRequestCert,unsignedlongderRequestCertLen,unsignedcharneedVerifedCert,unsignedlongneedVerifedCertLen,unsignedlong*certStatus);功能简介通过OCSP验证证书的当前状态参数说明ocspServerIpAddress[IN]:OCSPServerIPocspServerPort[IN]:OCSPServerPortderRequestCert[IN]:发起OCSP申请的用户证书derRequestCertLen[IN]:发起OCSP申请的用户证书长度needVerifedCert[IN]:需要验证的证书needVerifedCertLen[IN]:需要验证的证书长度certStatus[OUT]:返回的证书状态返回值RV_OK:成功其他:失败5.3.9通过LDAP方式获取证书:PKI_GetCertFromLdap函数名称PKI_RVPKI_GetCertFromLdap(Char*ldapHostIp,unsignedlongldapPort,10 DB11/T254.2-2004unsignedchar*SubDN,unsignedlongSubDNLen,unsignedchar*outCert,unsignedlong*outCertLen);功能简介通过LDAP方式获取证书参数说明ldapHostIp[IN]:ldap服务器IP地址ldapPort[IN]:ldap服务器端口SubDN[IN]:需要查找的证书的DNSubDNLen[IN]:需要查找的证书的DN长度outCert[OUT]:找到的DER编码的证书outCertLen[OUT]:找到的DER编码的证书长度返回值RV_OK:成功其他:失败5.3.10通过LDAP方式根据证书获取CRL:PKI_GetCrlFromLdap函数名称PKI_RVPKI_GetCrlFromLdap(char*ldapHostIp,unsignedlongldapPort,unsignedchar*Certificate,unsignedlongCertificateLen,unsignedchar*crlData,unsignedlong*crlDataLen);功能简介通过LDAP方式根据证书获取CRL参数说明ldapHostIp[IN]:ldap服务器IP地址ldapPort[IN]:ldap服务器端口Certificate[IN]:证书CertificateLen[IN]:证书长度crlData[OUT]:找到的DER编码的证书crlDataLen[OUT]:找到的DER编码的证书长度返回值RV_OK:成功其他:失败5.3.11取证书信息:PKI_GetCertificateInfo函数名称PKI_RVPKI_GetCertificateInfo(unsignedchar*certificate,unsignedlongcertificateLen,11 DB11/T254.2-2004unsignedlonginfoType,void*info1,void*info2);功能简介解析证书,获取证书中的信息参数说明certificate[IN]:DER编码的证书certificateLen[IN]:DER编码的证书长度infoType[IN]:证书域的信息类型info1[OUT]:信息1,根据信息类型不同而变化info2[OUT]:信息2,可为NULL返回值RV_OK:成功其他:失败5.3.12取证书扩展信息:PKI_GetExtTypeInfo函数名称PKI_RVPKI_GetExtTypeInfo(unsignedchar*derCertExt,unsignedlongderCertExtLen,unsignedlongInfoType,unsignedchar*priOid,unsignedlongpriOidLen,void*info1,void*info2);功能简介取证书的扩展信息参数说明derCertExt[IN]:全体扩展项derCertExtLen[IN]:全体扩展项长度infoType[IN]:扩展项信息类型priOid[IN]:私有扩展项的OID,如果不是私有扩展项类型,该参数无效priOidLen[IN]:私有扩展项OID长度,如果不是私有扩展项类型,该参数无效info1[OUT]:信息1info2[OUT]:信息2返回值RV_OK:成功其他:失败5.4密码服务函数密码服务函数包括以下具体函数:·BASE64编码:PKI_Base64_Encode12 DB11/T254.2-2004·BASE64解码:PKI_Base64_Decode·创建BASE64对象:PKI_Base64_CreateBase64Obj·删除BASE64对象:PKI_Base64_DestroyBase64Obj·通过BASE64对象继续编码:PKI_Base64_EncodeUpdate·通过BASE64对象编码结束:PKI_Base64_EncodeFinal·通过BASE64对象继续解码:PKI_Base64_DecodeUpdate·通过BASE64对象解码结束:PKI_Base64_DecodeFinal·随机数类函数(PKI_GenRandom)·HASH运算:PKI_Hash·创建HASH对象:PKI_CreateHashObj·删除HASH对象:PKI_DestroyHashObj·通过对象继续HASH运算:PKI_HashUpdate·结束HASH运算:PKI_HashFinal·符合PKCS1的公钥加密运算:PKI_RsaPublicKeyEnc·符合PKCS1的私钥解密运算:PKI_RsaPrivateKeyDec·符合PKCS1的签名运算:PKI_RsaSign·符合PKCS1的验证签名运算:PKI_RsaVerifySign·基于证书的RSA公钥加密:PKI_RsaPublicKeyEncByCert·基于证书的RSA公钥验证:PKI_VerifySignByCert·创建对称算法对象:PKI_CreateSymmAlgoObj·销毁对称算法对象:PKI_DestroySymmAlgoObj·继续加密运算:PKI_SymmEncryptUpdate·结束加密运算:PKI_SymmEncryptFinal·继续解密运算:PKI_SymmDecryptUpdate·结束解密运算:PKI_SymmDecryptFinal·加密运算:PKI_SymmEncrypt·解密运算:PKI_SymmDecrypt·MAC运算:PKI_Mac·继续MAC运算:PKI_MacUpdate·MAC运算结束:PKI_MacFinal·生成RSA密钥对:PKI_GenRsaKeyPair·取RSA公钥:PKI_GetPublicKey·创建列举用户证书的对象:PKI_CreateEnumUsrCertificatesObj·列举用户证书:PKI_EnumUsrCertificates·释放列举用户证书的内存:PKI_EnumUsrCertificatesFree·创建列举用户密钥对的对象:PKI_CreateEnumUsrKeyPairsObj·列举用户的密钥对:PKI_EnumUsrKeyPairs·删除列举用户密钥对的对象:PKI_DestroyEnumUsrKeyPairsObj5.4.1BASE64编码:PKI_Base64_Encode函数名称PKI_RVPKI_Base64_Encode(13 DB11/T254.2-2004unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介对字符串进行BASE64编码参数说明inData[IN]:编码前的数据inDataLen[IN]:编码前的数据长度outData[OUT]:编码后的数据outDataLen[OUT]:编码后的数据长度返回值RV_OK:成功其他:失败5.4.2BASE64解码:PKI_Base64_Decode函数名称PKI_RVPKI_Base64_Decode(unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介对字符串进行BASE64解码参数说明inData[IN]:解码前的数据inDataLen[IN]:解码前的数据长度outData[OUT]:解码后的数据outDataLen[OUT]:解码后的数据长度返回值RV_OK:成功其他:失败5.4.3创建BASE64对象:PKI_Base64_CreateBase64Obj函数名称PKI_RVPKI_Base64_CreateBase64Obj(PKI_OBJ*base64Obj);功能简介创建BASE64编码对象与PKI_Base64_DestroyBase64Obj、PKI_Base64_EncodeUpdate、PKI_Base64_EncodeFinal、PKI_Base64_DecodeUpdate、PKI_Base64_DecodeFinal一起支持不定长数据的BASE64编解码。14 DB11/T254.2-2004参数说明base64Obj[OUT]:创建的BASE64编码对象返回值RV_OK:成功其他:失败5.4.4删除BASE64对象:PKI_Base64_DestroyBase64Obj函数名称PKI_RVPKI_Base64_DestroyBase64Obj(PKI_OBJbase64Obj);功能简介删除BASE64编码对象参数说明base64Obj[IN]:需要删除的BASE64编码对象返回值RV_OK:成功其他:失败5.4.5通过BASE64对象继续编码:PKI_Base64_EncodeUpdate函数名称PKI_RVPKI_Base64_EncodeUpdate(PKI_OBJbase64Obj,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介通过BASE64对象对数据继续BASE64编码参数说明base64Obj[IN]:BASE64编码对象inData[IN]:编码前的数据inDataLen[IN]:编码前的数据长度outData[OUT]:编码后的数据outDataLen[OUT]:返回编码后的数据长度返回值RV_OK:成功其他:失败5.4.6通过BASE64对象编码结束:PKI_Base64_EncodeFinal函数名称PKI_RVPKI_Base64_EncodeFinal(PKI_OBJbase64Obj,unsignedchar*outData,unsignedlong*outDataLen);15 DB11/T254.2-2004功能简介通过BASE64对象对数据编码结束参数说明base64Obj[IN]:BASE64编码对象outData[OUT]:编码后的数据outDataLen[OUT]:返回编码后的数据长度返回值RV_OK:成功其他:失败5.4.7通过BASE64对象继续解码:PKI_Base64_DecodeUpdate函数名称PKI_RVPKI_Base64_DecodeUpdate(PKI_OBJbase64Obj,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介通过BASE64对象对数据继续BASE64解码参数说明base64Obj[IN]:BASE64编码对象inData[IN]:解码前的数据inDataLen[IN]:解码前的数据长度outData[OUT]:解码后的数据outDataLen[OUT]:返回解码后的数据长度返回值RV_OK:成功其他:失败5.4.8通过BASE64对象解码结束:PKI_Base64_DecodeFinal函数名称PKI_RVPKI_Base64_DecodeFinal(PKI_OBJbase64Obj,unsignedchar*outData,unsignedlong*outDataLen);功能简介通过BASE64对象对数据解码结束参数说明base64Obj[IN]:BASE64编码对象outData[OUT]:解码后的数据outDataLen[OUT]:返回解码后的数据长度返回值RV_OK:成功其他:失败16 DB11/T254.2-20045.4.9随机数函数:PKI_GenRandom函数名称PKI_RVPKI_GenRandom(unsignedlongrandLen,unsignedchar*rand);功能简介生成指定长度的随机数参数说明randLen[IN]:随机数长度rand[OUT]:随机数,长度为randLen返回值RV_OK:成功其他:失败5.4.10HASH运算:PKI_Hash函数名称PKI_RVPKI_Hash(unsignedlongalgoType,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介HASH运算,对定长数据的HASH运算参数说明algoType[IN]:HASH算法PKI_ALGO_MD2:MD2算法PKI_ALGO_MD5:MD5算法PKI_ALGO_SHA1_160:SHA1算法inData[IN]:输入数据inDataLen[IN]:输入数据长度outData[OUT]:HASHoutDataLen[OUT]:HASH长度返回值RV_OK:成功其他:失败5.4.11创建HASH对象:PKI_CreateHashObj函数名称PKI_RVPKI_CreateHashObj(PKI_OBJ*hashObj,unsignedlongalgorithmType);17 DB11/T254.2-2004功能简介创建HASH对象,对不定长数据的HASH运算参数说明hashObj[OUT]:创建的HASH对象algorithmType[IN]:HASH算法PKI_ALGO_MD2:MD2算法PKI_ALGO_MD5:MD5算法PKI_ALGO_SHA1_160:SHA1算法返回值RV_OK:成功其他:失败5.4.12删除HASH对象:PKI_DestroyHashObj函数名称PKI_RVPKI_DestroyHashObj(PKI_OBJhashObj);功能简介删除HASH对象参数说明hashObj[IN]:需要删除的HASH对象返回值RV_OK:成功其他:失败5.4.13通过对象继续HASH运算:PKI_HashUpdate函数名称PKI_RVPKI_HashUpdate(PKI_OBJhashObj,unsignedchar*inData,unsignedlonginDataLen);功能简介继续HASH运算参数说明hashObj[IN]:HASH对象inData[IN]:输入数据inDataLen[IN]:输入数据长度返回值RV_OK:成功其他:失败5.4.14结束HASH运算:PKI_HashFinal函数名称PKI_RVPKI_HashFinal(PKI_OBJhashObj,unsignedchar*outData,18 DB11/T254.2-2004unsignedlong*outDataLen);功能简介结束HASH运算参数说明hashObj[IN]:HASH对象outData[OUT]:输出的HASH值outDataLen[OUT]:HASH值的长度返回值RV_OK:成功其他:失败5.4.15符合PKCS1的公钥加密运算:PKI_Pkcs1RsaPublicKeyEnc函数名称PKI_RVPKI_Pkcs1RsaPublicKeyEnc(unsignedchar*publicKey,unsignedlongpublicKeyLen,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介符合PKCS1的公钥加密运算参数说明PublicKey[IN]:DER编码的公钥PublicKeyLen[IN]:DER编码的公钥长度inData[IN]:输入数据inDataLen[IN]:输入数据长度outData[OUT]:输出数据outDataLen[OUT]:输出数据长度,等于RSA模长返回值RV_OK:成功其他:失败5.4.16符合PKCS1的私钥解密运算:PKI_Pkcs1RsaPrivateKeyDec函数名称PKI_RVPKI_Pkcs1RsaPrivateKeyDec(unsignedchar*containerName,unsignedlongcontainerNameLen,unsignedlongkeyUsage,unsignedchar*rsaKeyPairPin,unsignedlongrsaKeyPairPinLen,unsignedchar*inData,unsignedlonginDataLen,19 DB11/T254.2-2004unsignedchar*outData,unsignedlong*outDataLen);功能简介符合PKCS1的私钥解密运算参数说明containerName[IN]:密钥的容器名containerNameLen[IN]:密钥的容器名长度keyUsage[IN]:密钥用途PKI_KEYUSAGE_SIGN:签名PKI_KEYUSAGE_KEYEXCHANGE:密钥交换(加密)rsaKeyPairPin[IN]:设备保护PINrsaKeyPairPinLen[IN]:设备保护PIN的长度inData[IN]:输入数据inDataLen[IN]:输入数据长度outData[OUT]:输出数据outDataLen[OUT]:输出数据长度,等于RSA模长返回值RV_OK:成功其他:失败5.4.17符合PKCS1的签名运算:PKI_RsaSign函数名称PKI_RVPKI_RsaSign(unsignedchar*containerName,unsignedlongcontainerNameLen,unsignedchar*rsaKeyPairPin,unsignedlongrsaKeyPairPinLen,unsignedlonghashAlgorithmType,unsignedchar*inData,,unsignedlonginDataLen,unsignedchar*signData,unsignedlong*signDataLen);功能简介符合PKCS1的签名运算参数说明containerName[IN]:密钥的容器名containerNameLen[IN]:密钥的容器名长度rsaKeyPairPin[IN]:设备保护PINrsaKeyPairPinLen[IN]:设备保护PIN的长度hashAlgorithmType[IN]:HASH算法inData[IN]:原始数据inDataLen[IN]:原始数据的长度20 DB11/T254.2-2004signData[OUT]:输出的签名结果数据signDataLen[OUT]:输出的签名结果数据长度,等于RSA模长返回值RV_OK:成功其他:失败5.4.18符合PKCS1的验证签名运算:PKI_RsaVerifySign函数名称PKI_RVPKI_RsaVerifySign(unsignedlonghashAlgorithmType,unsignedchar*inData,,unsignedlonginDataLen,unsignedchar*publicKey,unsignedlongpublicKeyLen,unsignedchar*signData,unsignedlongsignDataLen);功能简介符合PKCS1的验证签名运算参数说明hashAlgorithmType[IN]:HASH算法inData[IN]:原始数据inDataLen[IN]:原始数据的长度PublicKey[IN]:DER编码的公钥PublicKeyLen[IN]:DER编码的公钥长度signData[IN]:签名数据signDataLen[IN]:签名数据长度,等于RSA模长返回值RV_OK:成功其他:失败5.4.19基于证书的RSA公钥加密:PKI_Pkcs1RsaPublicKeyEncByCert函数名称PKI_RVPKI_Pkcs1RsaPublicKeyEncByCert(unsignedchar*certificate,unsignedlongcertificateLen,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介基于证书的RSA公钥加密参数说明certificate[IN]:DER编码的数字证书21 DB11/T254.2-2004certificateLen[IN]:DER编码的数字证书长度inData[IN]:输入数据inDataLen[IN]:输入数据长度,等于RSA模长outData[OUT]:输出数据outDataLen[OUT]:输出数据长度返回值RV_OK:成功其他:失败5.4.20基于证书的RSA公钥验证:PKI_VerifySignByCert函数名称PKI_RVPKI_VerifySignByCert(unsignedlonghashAlgorithmType,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*certificate,unsignedlongcertificateLen,unsignedchar*signData,unsignedlongsignDataLen);功能简介基于证书的RSA公钥加密参数说明hashAlgorithmType[IN]:HASH算法inData[IN]:原始数据inDataLen[IN]:原始数据的长度certificate[IN]:DER编码的数字证书certificateLen[IN]:DER编码的数字证书长度signData[IN]:签名数据signDataLen[IN]:签名数据长度,等于RSA模长返回值RV_OK:成功其他:失败5.4.21创建对称算法对象:PKI_CreateSymmAlgoObj函数名称PKI_RVPKI_CreateSymmKeyObj(PKI_OBJ*symmKeyObj,unsignedlongalgorithmType,unsignedlongencOrDec,unsignedlongcryptoMode,unsignedchar*key,22 DB11/T254.2-2004unsignedlongkeyLen,unsignedchar*iv);功能简介创建对称算法对象参数说明symmKeyObj[OUT]:对称算法对象algorithmType[IN]:算法类型encOrDec[IN]:1:encrypt0:decryptcryptoMode[IN]:运算模式PKI_MODE_ECBPKI_MODE_CBCPKI_MODE_CFBPKI_MODE_OFBkey[IN]:密钥keyLen[IN]:密钥长度iv[IN]:初始化向量返回值RV_OK:成功其他:失败5.4.22销毁对称算法对象:PKI_DestroySymmAlgoObj函数名称PKI_RVPKI_DestroySymmKeyObj(PKI_OBJsymmKeyObj);功能简介销毁对称算法对象参数说明symmAlgoObj[IN]:对称算法对象返回值RV_OK:成功其他:失败5.4.23加密运算:PKI_SymmEncrypt函数名称PKI_RVPKI_SymmEncrypt(PKI_OBJsymmAlgoObj,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介加密运算参数说明symmAlgoObj[IN]:对称算法对象inData[IN]:输入数据23 DB11/T254.2-2004inDataLen[IN]:输入数据长度outData[OUT]:输出数据outDataLen[OUT]:输出数据长度返回值RV_OK:成功其他:失败5.4.24继续加密运算:PKI_SymmEncryptUpdate函数名称PKI_RVPKI_SymmEncryptUpdate(PKI_OBJsymmAlgoObj,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介继续加密运算参数说明symmAlgoObj[IN]:对称算法对象inData[IN]:输入数据inDataLen[IN]:输入数据长度outData[OUT]:输出数据outDataLen[OUT]:输出数据长度返回值RV_OK:成功其他:失败5.4.25结束加密运算:PKI_SymmEncryptFinal函数名称PKI_RVPKI_SymmEncryptFinal(PKI_OBJsymmAlgoObj,unsignedchar*outData,unsignedlong*outDataLen);功能简介结束加密运算参数说明symmAlgoObj[IN]:对称算法对象outData[OUT]:输出数据outDataLen[OUT]:输出数据长度返回值RV_OK:成功其他:失败5.4.26解密运算:PKI_SymmDecrypt24 DB11/T254.2-2004函数名称PKI_RVPKI_SymmDecrypt(PKI_OBJsymmAlgoObj,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介解密运算参数说明symmAlgoObj[IN]:对称算法对象inData[IN]:输入数据inDataLen[IN]:输入数据长度outData[OUT]:输出数据outDataLen[OUT]:输出数据长度返回值RV_OK:成功其他:失败5.4.27继续解密运算:PKI_SymmDecryptUpdate函数名称PKI_RVPKI_SymmDecryptUpdate(PKI_OBJsymmAlgoObj,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlong*outDataLen);功能简介继续解密运算参数说明symmAlgoObj[IN]:对称算法对象inData[IN]:输入数据inDataLen[IN]:输入数据长度outData[OUT]:输出数据outDataLen[OUT]:输出数据长度返回值RV_OK:成功其他:失败5.4.28结束解密运算:PKI_SymmDecryptFinal函数名称PKI_RVPKI_SymmDecryptFinal(25 DB11/T254.2-2004PKI_OBJsymmAlgoObj,unsignedchar*outData,unsignedlong*outDataLen);功能简介结束解密运算参数说明symmAlgoObj[IN]:对称算法对象outData[OUT]:输出数据outDataLen[OUT]:输出数据长度返回值RV_OK:成功其他:失败5.4.29MAC运算:PKI_Mac函数名称PKI_RVPKI_Mac(PKI_OBJsymmAlgoObj,unsignedchar*inData,unsignedlonginDataLen,unsignedchar*outData,unsignedlongoutDataLen);功能简介MAC运算参数说明symmAlgoObj[IN]:对称算法对象inData[IN]:输入数据inDataLen[IN]:输入数据长度outData[OUT]:输出的MACoutDataLen[OUT]:MAC长度返回值RV_OK:成功其他:失败5.4.30继续MAC运算:PKI_MacUpdate函数名称PKI_RVPKI_MacUpdate(PKI_OBJsymmAlgoObj,unsignedchar*inData,unsignedlonginDataLen);功能简介继续MAC运算参数说明symmAlgoObj[IN]:对称算法对象inData[IN]:输入数据inDataLen[IN]:输入数据长度26 DB11/T254.2-2004返回值RV_OK:成功其他:失败5.4.31MAC运算结束:PKI_MacFinal函数名称PKI_RVPKI_MacFinal(PKI_OBJsymmAlgoObj,unsignedchar*outData,unsignedlongoutDataLen);功能简介MAC运算结束参数说明symmAlgoObj[IN]:对称算法对象outData[OUT]:输出的MACoutDataLen[OUT]:MAC长度返回值RV_OK:成功其他:失败5.4.32生成符合PKCS1的RSA密钥对:PKI_GenRsaKeyPair函数名称PKI_RVPKI_GenRsaKeyPair(unsignedchar*containerName,unsignedlongcontainerLen,unsignedlongmodulusLen,unsignedlongkeyUsage,unsignedlongexportFlag,unsignedchar*rsaKeyPairPin,unsignedlongrsaKeyPairPinLen);功能简介生成符合PKCS1的RSA密钥对参数说明containerName[IN]:密钥的容器名containerLen[IN]:密钥的容器名长度modulusLen[IN]:密钥对模长,可为1024或2048keyUsage[IN]:密钥用途PKI_KEYUSAGE_SIGN:签名PKI_KEYUSAGE_KEYEXCHANGE:密钥交换(加密)exportFlag[IN]:密钥对是否可导出标志rsaKeyPairPin[IN]:密钥对保护口令rsaKeyPairPinLen[IN]:密钥对保护口令长度返回值RV_OK:成功27 DB11/T254.2-2004其他:失败5.4.33取RSA公钥:PKI_GetPublicKey函数名称PKI_RVPKI_GetPublicKey(unsignedchar*containerName,unsignedlongcontainerLen,unsignedlongkeyUsage,unsignedchar*publicKey,unsignedlong*publicKeyLen);功能简介取出符合PKCS1的RSA公钥参数说明containerName[IN]:密钥的容器名containerLen[IN]:密钥的容器名长度keyUsage[IN]:密钥用途:PKI_KEYUSAGE_SIGN:签名PKI_KEYUSAGE_KEYEXCHANGE:密钥交换(加密)publicKey[OUT]:输出的公钥数据publicKeyLen[OUT]:输出公钥数据的长度返回值RV_OK:成功其他:失败5.4.34创建列举用户证书的对象:PKI_CreateEnumUsrCertificatesObj函数名称PKI_RVPKI_CreateEnumUsrCertificatesObj(PKI_OBJ*enumObj);功能简介创建列举用户证书的对象参数说明EnumObj[OUT]:用户证书的对象返回值RV_OK:成功其他:失败5.4.35列举用户证书:PKI_EnumUsrCertificates函数名称PKI_RVPKI_EnumUsrCertificates(PKI_USR_CERT_ENUMLIST*usrCerts);功能简介列举用户证书参数说明usrCerts[OUT]:用户证书信息28 DB11/T254.2-2004返回值RV_OK:成功其他:失败5.4.36释放列举用户证书的内存:PKI_EnumUsrCertificatesFree函数名称PKI_RVPKI_EnumUsrCertificatesFree(PKI_USR_CERT_ENUMLIST*usrCerts);功能简介删除列举用户证书的对象参数说明usrCerts[IN]:用户证书信息返回值RV_OK:成功其他:失败5.4.37创建列举用户密钥对的对象:PKI_CreateEnumUsrKeyPairsObj函数名称PKI_RVPKI_CreateEnumUsrKeyPairsObj(PKI_OBJ*enumObj);功能简介创建列举用户密钥对的对象参数说明enumObj[OUT]:用户密钥对的对象返回值RV_OK:成功其他:失败5.4.38列举用户的密钥对:PKI_EnumUsrKeyPairs函数名称PKI_RVPKI_EnumUsrKeyPairs(PKI_USR_KEYPAIR_ENUMLIST*usrKeyPairs);功能简介列举用户密钥对参数说明usrKeyPairs:[OUT]:用户密钥对返回值RV_OK:成功其他:失败5.4.39删除列举用户密钥对的对象:PKI_DestroyEnumUsrKeyPairsObj函数名称PKI_RVPKI_DestroyEnumUsrKeyPairsObj(PKI_OBJenumObj);功能简介删除列举用户密钥对的对象29 DB11/T254.2-2004参数说明enumObj[OUT]:用户密钥对的对象返回值RV_OK:成功其他:失败5.5消息函数消息函数包含以下具体函数:·编码PKCS7格式的数据:PKI_Pkcs7_EncodeData·解码PKCS7格式的数据:PKI_Pkcs7_DecodeData·编码PKCS7格式的签名数据:PKI_Pkcs7_EncodeSignedData·解码PKCS7格式的签名数据:PKI_Pkcs7_DecodeSignedData·编码PKCS7格式的数字信封数据:PKI_Pkcs7_EncodeEnvelopedData·解码PKCS7格式的数字信封数据:PKI_Pkcs7_DecodeEnvelopedData5.5.1编码PKCS7格式的数据:PKI_Pkcs7_EncodeData函数名称PKI_RVPKI_Pkcs7_EncodeData(unsignedchar*data,unsignedlongdataLen,unsignedchar*derP7Data,unsignedlong*derP7DataLen);功能简介编码PKCS7格式的数据参数说明data[IN]:原始数据dataLen[IN]:原始数据长度derP7Data[OUT]:编码后的数据derP7DataLen[OUT]:编码后的数据长度返回值RV_OK:成功其他:失败5.5.2解码PKCS7格式的数据:PKI_Pkcs7_DecodeData函数名称PKI_RVPKI_Pkcs7_DecodeData(unsignedchar*derP7Data,unsignedlongderP7DataLen,unsignedchar*data,unsignedlong*dataLen);功能简介把PKCS7格式的数据解码为原始数据参数说明derP7Data[IN]:编码后的数据derP7DataLen[IN]:编码后的数据长度30 DB11/T254.2-2004data[OUT]:原始数据dataLen[OUT]:原始数据长度返回值RV_OK:成功其他:失败5.5.3编码PKCS7格式的签名数据:PKI_Pkcs7_EncodeSignedData函数名称PKI_RVPKI_Pkcs7_EncodeSignedData(unsignedchar*signContainerName,unsignedlongsignContainerNameLen,unsignedlongsignKeyUsage,unsignedchar*signerCertificate,unsignedlongsignerCertificateLen,unsignedlongdigestAlgorithms,unsignedchar*data,unsignedlongdataLen,unsignedchar*derP7SignedData,unsignedlong*derP7SignedDataLen);功能简介编码PKCS7格式的签名数据参数说明signContainerName[IN]:签名私钥的容器名signContainerNameLen[IN]:签名私钥的容器名长度signKeyUsage[IN]:私钥的用途signerCertificate[IN]:签名者证书signerCertificateLen[IN]:签名者证书长度digestAlgorithms[IN]:HASH算法data[IN]:需要签名的数据dataLen[IN]:需要签名的数据长度derP7SignedData[OUT]:带签名值的P7数据derP7SignedDataLen[OUT]:带签名值的P7数据长度返回值RV_OK:成功其他:失败5.5.4解码PKCS7格式的签名数据:PKI_Pkcs7_DecodeSignedData函数名称PKI_RVPKI_Pkcs7_DecodeSignedData(unsignedchar*derP7SignedData,unsignedlongderP7SignedDataLen,31 DB11/T254.2-2004unsignedchar*signerCertificate,unsignedlong*signerCertificateLen,unsignedlong*digestAlgorithms,unsignedchar*data,unsignedlong*dataLen,unsignedchar*sign,unsignedlong*signLen);功能简介解码PKCS7格式的签名数据参数说明derP7SignedData[IN]:签名后的数据derP7SignedDataLen[IN]:签名后的数据长度signerCertificate[OUT]:签名者证书signerCertificateLen[OUT]:签名者证书长度digestAlgorithms[OUT]:HASH算法data[OUT]:被签名的数据dataLen[OUT]:被签名的数据长度sign[OUT]:签名值signLen[OUT]:签名值的长度返回值RV_OK:成功其他:失败5.5.5编码PKCS7格式的数字信封数据:PKI_Pkcs7_EncodeEnvelopedData函数名称PKI_RVPKI_Pkcs7_EncodeEnvelopedData(unsignedchar*data,unsignedlongdataLen,unsignedchar*encCertificate,unsignedlongencCertificateLen,unsignedlongsymmAlgorithm,unsignedchar*derP7EnvelopedData,unsignedlong*derP7EnvelopedDataLen);功能简介编码PKCS7格式的数字信封数据参数说明data[IN]:需要签名的数据dataLen[IN]:需要签名的数据长度encCertificate[IN]:接收者证书encCertificateLen[IN]:接收者证书长度symmAlgorithm[IN]:对称算法参数derP7EnvelopedData[OUT]:签名后的数字信封数据32 DB11/T254.2-2004derP7EnvelopedDataLenLen[OUT]:签名后的数字信封数据长度返回值RV_OK:成功其他:失败5.5.6解码PKCS7格式的数字信封:PKI_Pkcs7_DecodeEnvelopedData函数名称PKI_RVPKI_Pkcs7_DecodeEnvelopedData(unsignedchar*decContainerName,unsignedlongdecContainerNameLen,unsignedlongdecKeyUsage,unsignedchar*derP7EnvelopedData,unsignedlongderP7EnvelopedDataLen,unsignedchar*data,unsignedlong*dataLen);功能简介解码PKCS7格式的数字信封数据参数说明decContainerName[IN]:解密用私钥的容器名decContainerNameLen[IN]:解密用私钥的容器名长度decKeyUsage[IN]:解密用私钥的用途derP7SignAndEnvelopedData[IN]:签名后的数字信封数据derP7SignAndEnvelopedDataLen[IN]:签名后的数字信封数据长度data[OUT]:需要签名的数据dataLen[OUT]:需要签名的数据长度返回值RV_OK:成功其他:失败33 DB11/T254.2-2004附录A(规范性附录)政务数字证书应用接口宏定义和说明A.1类型宏定义typedefunsignedcharPKI_UINT8typedefunsignedshortPKI_UINT16typedefunsignedlongPKI_UINT32typedeflongPKI_SINT32typedefintPKI_INTtypedefunsignedintPKI_UINTtypedefintPKI_RVtypedefunsignedlongPKI_OBJA.2常量宏定义typedefPKI_INTPKI_BOOL#definePKI_TRUE1#definePKI_FALSE0A.3全局参数#definePKI_PROVIDER_CSP1//CSP接口#definePKI_PROVIDER_PKCS112//PKCS#11接口#definePKI_ALGO_MD21//MD2算法#definePKI_ALGO_MD52//MD5算法#definePKI_ALGO_SHA1_1603//SHA1算法#definePKI_ALGO_SSF33103//SSF33算法#definePKI_ALGO_RSA200//RSA算法#definePKI_KEYUSAGE_SIGN1//签名/验证的密钥用途#definePKI_KEYUSAGE_KEYEXCHANGE2//加/解密的密钥用途#definePKI_MODE_ECB1//ECB模式#definePKI_MODE_CBC2//CBC模式#definePKI_MODE_CFB3//CFB模式#definePKI_MODE_OFB4//OFB模式#definePKI_KEYINFO_DEV_GENERATE1//设备产生#definePKI_KEYINFO_KEY2//外部输入KEY34 DB11/T254.2-2004#definePKI_KEYINFO_IV3//外部输入IV#definePKI_KEYINFO_PASSWORD_DERIVE_KEY4//通过口令生成KEY//解析数字证书需要的参数定义#definePKI_GET_CERT_VERSION1//证书版本#definePKI_GET_CERT_SERIAL2//证书序列号#definePKI_GET_CERT_ISSUER5//证书颁发者信息#definePKI_GET_CERT_VALID_TIME6//证书有效期#definePKI_GET_CERT_SUBJECT7//证书拥有者信息#definePKI_GET_CERT_DER_PUBLIC_KEY8//证书公钥信息#definePKI_GET_CERT_DER_EXTENSIONS9//证书扩展项信息//解析数字证书扩展项需要的参数定义#definePKI_EXT_AUTHORITYKEYIDENTIFIER_INFO11//颁发者密钥标示符#definePKI_EXT_SUBJECTKEYIDENTIFIER_INFO12//证书持有者密钥标示符#definePKI_EXT_KEYUSAGE_INFO13//密钥用途#definePKI_EXT_PRIVATEKEYUSAGEPERIOD_INFO14//私钥有效期#definePKI_EXT_CERTIFICATEPOLICIES_INFO15//证书策略#definePKI_EXT_POLICYMAPPINGS_INFO16//策略影射#definePKI_EXT_BASICCONSTRAINTS_INFO17//基本限制#definePKI_EXT_POLICYCONSTRAINTS_INFO18//策略限制#definePKI_EXT_EXTKEYUSAGE_INFO19//扩展密钥用途#definePKI_EXT_CRLDISTRIBUTIONPOINTS_INFO20//黑名单发布点#definePKI_EXT_NETSCAPE_CERT_TYPE_INFO21//netscape属性#definePKI_EXT_SELFDEFINED_EXTENSION_INFO22//私有的自定义扩展项//证书状态#definePKI_OCSP_CERTSTATUS_GOOD1//正常#definePKI_OCSP_CERTSTATUS_REVOKED2//作废#definePKI_OCSP_CERTSTATUS_UNKNOWN3//不知#definePKI_MAX_NAME_SIZE128//名称最大长度35 DB11/T254.2-2004附录B(规范性附录)政务数字证书应用接口数据结构定义和说明//用户证书列表,用户列举证书存储区内所有证书及相关信息typedefstructPKI_USR_CERT_ENUMLIST_{unsignedlongcertCount;//证书总数unsignedchar*certificate[PKI_MAX_CONTAINER];//DER编码的数字证书内容unsignedlongcertificateLen[PKI_MAX_CONTAINER];//数字证书的长度unsignedcharcontainerName[PKI_MAX_CONTAINER][300];//容器名称unsignedlongcontainerNameLen[PKI_MAX_CONTAINER];//容器名称的长度unsignedlongkeyUsage[PKI_MAX_CONTAINER];//密钥用途}PKI_USR_CERT_ENUMLIST;//用户密钥列表,用户列举证书存储区内所有密钥及相关信息typedefstructPKI_USR_KEYPAIR_ENUMLIST_{unsignedlongkeyPairCount;//密钥对总数unsignedcharcontainerName[PKI_MAX_CONTAINER][300];//容器名称unsignedlongcontainerNameLen[PKI_MAX_CONTAINER];//容器名称的长度unsignedlongkeyUsage[PKI_MAX_CONTAINER];//密钥用途}PKI_USR_KEYPAIR_ENUMLIST;//证书中DN的结构,定义结构中各类名称及其长度typedefstruct{unsignedchardn_c[2][PKI_MAX_NAME_SIZE];//国家名称数组unsignedlongdn_c_len[2];//国家数组的长度unsignedchardn_s[2][PKI_MAX_NAME_SIZE];//省份或直辖市名称数组unsignedlongdn_s_len[2];//省份或直辖市名称数组的长度unsignedchardn_l[2][PKI_MAX_NAME_SIZE];//城市或地区的名称数组unsignedlongdn_l_len[2];//城市或地区的名称数组的长度unsignedchardn_o[5][PKI_MAX_NAME_SIZE];//机构名称数组unsignedlongdn_o_len[5];//机构名称数组的长度unsignedchardn_ou[5][PKI_MAX_NAME_SIZE];//机构单位名称数组unsignedlongdn_ou_len[5];//机构单位名称数组的长度unsignedchardn_cn[2][PKI_MAX_NAME_SIZE];//证书拥有者名称数组unsignedlongdn_cn_len[2];//证书拥有者名称数组的长度unsignedchardn_email[2][PKI_MAX_NAME_SIZE];//电子邮件数组unsignedlongdn_email_len[2];//电子邮件数组的长度}PKI_NAME_INFO;36 DB11/T254.2-2004附录C(规范性附录)政务数字证书应用接口错误代码定义和说明#defineRV_OK0//成功#defineRV_UnknownErr-1//异常错误#defineRV_NotSupportYetErr-2//不支持的服务#defineRV_FileErr-3//文件操作错误#defineRV_ProviderTypeErr-4//服务提供者参数类型错误#defineRV_LoadProviderErr-5//导入服务提供者接口错误#defineRV_LoadDevMngApiErr-6//导入设备管理接口错误#defineRV_AlgoTypeErr-7//算法类型错误#defineRV_NameLenErr-8//名称长度错误#defineRV_KeyUsageErr-9//密钥用途错误#defineRV_ModulusLenErr-10//模的长度错误#defineRV_NotInitializeErr-11//未初始化#defineRV_ObjErr-12//对象错误#defineRV_MemoryErr-100//内存错误#defineRV_TimeoutErr-101//超时#defineRV_IndataLenErr-200//输入数据长度错误#defineRV_IndataErr-201//输入数据错误#defineRV_GenRandErr-300//生成随机数错误#defineRV_HashObjErr-301//HASH对象错#defineRV_HashErr-302//HASH运算错误#defineRV_GenRsaKeyErr-303//产生RSA密钥错#defineRV_RsaModulusLenErr-304//RSA密钥模长错误#defineRV_CspImprtPubKeyErr-305//CSP服务导入公钥错误#defineRV_RsaEncErr-306//RSA加密错误#defineRV_RsaDecErr-307//RSA解密错误#defineRV_HashNotEqualErr-308//HASH值不相等#defineRV_KeyNotFountErr-309//密钥未发现#defineRV_CertNotFountErr-310//证书未发现#defineRV_NotExportErr-311//对象未导出#defineRV_DecryptPadErr-400//解密时做补丁错误#defineRV_MacLenErr-401//MAC长度错误#defineRV_KeyInfoTypeErr-402//密钥类型错误37 DB11/T254.2-2004附录D(资料性附录)政务数字证书典型应用框架图D.1典型应用框架图客户端1客户端2CertEE1CertEE2和KeyEE1和KeyEE2CertEE2CertEE1CertSrvCertSrv甲乙互联网CertEE1CertEE2证书数据库或CertEEnSerSrvLDAP服务器服务器的加密设备:含KeySrvCA中心应用服务器图D1典型应用框架图在这个典型的体系结构中,主要分成三大组成部分:a)CA中心CA中心负责审批所有网上证书用户的信息,并给他们签发表示其身份的数字证书,同时发布到LDAP服务器或数据库上,为用户(包括个人、单位和服务器)提供各类证书服务。b)应用服务器应用服务器是应用系统所使用的服务器,它是为具体业务系统而存在的。在这个应用服务器上,使用了政务数字证书和数字证书应用接口对相关敏感数据进行安全处理。应用服务器上需要部署所有客户端的终端用户数字证书CertEEx和应用服务器的服务器证书CertSrv,与CertSrv对应的私钥KeySrv应由硬件的加密设备(如加密机或加密卡)生成和存放。c)客户端客户端是指具体使用应用系统的终端用户,客户端拥有自己的证书设备(含自己的密钥和数字证书,如智能USBKEY),同时也可通过不同渠道得到他人或服务器的数字证书,以便进行相关业务操作。38 DB11/T254.2-2004例如图D1中的客户端1(甲)应配置自己的证书设备(含:CertEE1和KeyEE1)、CertEE2(乙的数字证书)和CertSrv(应用服务器证书)。D.2典型业务流程分析政务数字证书应用接口支持基于B/S(Browser/Server,即浏览器/服务器)和C/S(Client/Server,即客户机/服务器)两种分布式网络体系结构。基于B/S和C/S两种模式的应用业务流程基本是类似的,在总体上都是分成客户端和服务器端两大部分,客户端与服务器之间的典型业务流程如图D2所示:1)用户登录请求2)返回校验结果服客3)发送数据(安全处理)务户器4)返回响应(安全处理)端端5)用户注销登录图D2典型业务流程简图1)用户登录请求:用户将自身的证书及其对相关登录信息的数字签名,发送给服务器端。服务器端先对用户证书进行证书验证,确认用户证书真实有效;接着使用用户证书对相关登录信息的数字签名进行验证,确认证书持有人真实有效;然后从证书中解析出有关用户信息,与应用系统中的用户信息进行验证和关联,确保证书持有人是应用系统的合法用户。2)服务器端将上述验证信息、服务器端的服务器证书及其对登录信息的数字签名,返回给客户端。客户端对服务器证书进行证书验证,确认服务器证书的有效性;用服务器证书验证服务器端的数字签名,确认服务器端身份真实性。3)当客户端和服务器端的身份都认证通过后,客户端即可向服务器端发送经过安全处理的业务数据。这里的安全处理包含很多类型,例如:PKCS7格式的数据、PKCS7格式的签名数据、PKCS7格式的签名数字信封数据、PKCS7格式的数字信封数据、PKCS7格式的HASH数据、PKCS7格式的加密数据等。4)服务器端收到客户端的特定编码方式的安全数据后,进行对应的解码操作,并进行服务器端内部的相关业务处理,处理完成后,返回给客户端相应的处理结果。这个处理结果一般也是经过相应安全处理。5)客户端收到服务器端响应后,如果业务处理完成,即可注销登录;如果还有业务需要继续处理,则重复第3步业务处理工作。39 DB11/T254.2-2004附录E(资料性附录)政务数字证书典型应用示例E.1程序基本流程根据典型业务流程分析,下面介绍基于政务数字证书应用接口(如RSA算法的签名和验证,客户端程序用来签名,服务器端程序用来验证)的程序基本流程(如图E1和E2):PKI_Initialize()成功?否非RV_OK,退出输入设备的登录口令是PKI_Login()是成功?否非RV_OK,退出输入新的容器名字,设置好密钥用途,准备好要签名的Hash值和是Hash算法PKI_RsaSign()否非RV_OK,退出是RV_OK,生成了所需要的数据图E1基于客户端的程序流程图40 DB11/T254.2-2004PKI_Initialize()成功?否非RV_OK,退出输入设备的登录口令是PKI_Login()是成功?否非RV_OK,退出输入新的容器名字,设置好密钥用途,准备好要验证的公钥,准备是好要签名的Hash值和Hash算法PKI_RsaVerifySign()否非RV_OK,退出是RV_OK,生成了所需要的数据图E2服务器的程序流程图E.2程序示例说明所列示例均系虚构。根据图E1的程序流程图,下面分别以客户端程序和服务器端程序的事例代码来说明程序基本流程。客户端程序:ClientTest#include#include#include#include"PKI_api.h"intInitEnv;voidT_EnumUsrKeyPairs(void){PKI_USR_KEYPAIR_ENUMLISTusrKeyPairs;unsignedlongi;intrv;41 DB11/T254.2-2004if(!InitEnv){PRINTF("NotPKI_Initialize!PleasePKI_Initializefirst!",0);return;}if(!DevLogIn){PRINTF("NotLogin!Pleaseloginfirst!",0);return;}rv=PKI_EnumUsrKeyPairs(&usrKeyPairs);if(RV_OK!=rv){printf("PKI_EnumUsrKeyPairserror...n");return;}printf("密钥对总数[RSAPairsTotal]:%dn",usrKeyPairs.keyPairCount);printf("列举如下[Listedunder]:nt******************************n");for(i=0;i=0)&&(chosen<(int)usrKeyPairs.keyPairCount))){return-2;}strcpy(KeyPairsContent,usrKeyPairs.containerName[chosen]);*keyUsage=usrKeyPairs.keyUsage[chosen];return0;}voidmain(void){unsignedcharcontainerName[128];unsignedlongcontainerNameLen;unsignedlongkeyUsage;unsignedcharinData[30],signData[128],hashValue[64];unsignedlonginDataLen,signDataLen,hashValueLen;PKI_OBJhashObj;unsignedlongi;PKI_RVrv,chosen;FILE*fp;T_EnumUsrKeyPairs();//列举设备中的用户RSA密钥对printf("请选择密钥对号[chosetheneededKeyPairsNumber]:");scanf("%d",&chosen);rv=Get_EnumUsrKeyPairsFromKey(chosen,containerName,&keyUsage);//获取密钥对if(rv){printf("选择密钥对号错误[ChosenError]!n");return;}printf("ContainerName=[%s]n",containerName);43 DB11/T254.2-2004containerNameLen=strlen(containerName);printf("KeyUsage=[%d]n",keyUsage);for(i=0;i<30;i++){inData[i]=(unsignedchar)i;}inDataLen=30;rv=PKI_CreateHashObj(&hashObj,PKI_ALGO_SHA1_160);if(RV_OK!=rv){printf("PKI_CreateHashObjerror...n");return;}rv=PKI_HashUpdate(hashObj,inData,inDataLen);if(RV_OK!=rv){printf("PKI_HashUpdateerror...n");return;}rv=PKI_HashFinal(hashObj,hashValue,&hashValueLen);if(RV_OK!=rv){printf("PKI_HashUpdateerror...n");return;}//savethehashValuedatafp=fopen("hashValue.dat","wb");if(fp==NULL){printf("不能创建文件[%s]!n","hashValue.dat");return;}fwrite(hashValue,sizeof(char),hashValueLen,fp);fclose(fp);rv=PKI_RsaSign(containerName,44 DB11/T254.2-2004containerNameLen,keyUsage,"",0,PKI_ALGO_SHA1_160,hashValue,hashValueLen,signData,&signDataLen);if(RV_OK!=rv){printf("PKI_RsaSignerror...n");PKI_DestroyHashObj(hashObj);return;}rv=PKI_DestroyHashObj(hashObj);if(RV_OK!=rv){printf("PKI_DestroyHashObjerror...n");return;}printf("生成数据为:n");for(i=0;i#include#include#include"PKI_API.h"intInitEnv;voidmain(void){unsignedcharcontainerName[128],publicKey[500];unsignedlongcontainerNameLen,publicKeyLen;unsignedlongkeyUsage;unsignedcharinData[30],signData[128],hashValue[64];unsignedlonginDataLen,signDataLen,hashValueLen;PKI_OBJhashObj;unsignedlongi;PKI_RVrv,chosen;T_EnumUsrKeyPairs();printf("请选择密钥对号[chosetheneededKeyPairsNumber]:");scanf("%d",&chosen);rv=Get_EnumUsrKeyPairsFromKey(chosen,containerName,&keyUsage);if(rv){printf("选择密钥对号错误[ChosenError]!n");return;}printf("ContainerName=[%s]n",containerName);containerNameLen=strlen(containerName);printf("KeyUsage=[%d]n",keyUsage);for(i=0;i<30;i++){inData[i]=(unsignedchar)i;}inDataLen=30;rv=PKI_CreateHashObj(&hashObj,PKI_ALGO_SHA1_160);if(RV_OK!=rv){printf("PKI_CreateHashObjerror...n");return;46 DB11/T254.2-2004}rv=PKI_HashUpdate(hashObj,inData,inDataLen);if(RV_OK!=rv){printf("PKI_HashUpdateerror...n");return;}rv=PKI_HashFinal(hashObj,hashValue,&hashValueLen);if(RV_OK!=rv){printf("PKI_HashUpdateerror...n");return;}rv=PKI_RsaSign(containerName,containerNameLen,keyUsage,"",0,PKI_ALGO_SHA1_160,hashValue,hashValueLen,signData,&signDataLen);if(RV_OK!=rv){printf("PKI_RsaSignerror...n");PKI_DestroyHashObj(hashObj);return;}rv=PKI_DestroyHashObj(hashObj);if(RV_OK!=rv){printf("PKI_DestroyHashObjerror...n");return;}rv=PKI_GetPubLicKey(containerName,47 DB11/T254.2-2004containerNameLen,keyUsage,publicKey,&publicKeyLen);if(RV_OK!=rv){printf("PKI_GetPubLicKeyerror...n");return;}rv=PKI_RsaVerifySign(PKI_ALGO_SHA1_160,hashValue,hashValueLen,publicKey,publicKeyLen,signData,signDataLen);if(RV_OK!=rv){printf("PKI_RsaVerifySignerror...n");PKI_DestroyHashObj(hashObj);return;}printf("生成数据为:n");for(i=0;i