密码引擎-加密API研究
0 任务详情
- 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)
- 总结这些API在编程中的使用方式
- 列出这些API包含的函数,进行分类,并总结它们的异同
- 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
1 研究学习原始文档
1.1 CryptoAPI
1.2 PKCS#11
PKCS #11
1.3 GM/T 0016-2012 智能密码钥匙密码应用接口规范
1.4 GM/T 0018-2012 密码设备应用接口规范
2 总结这些API在编程中的使用方式
2.1 CryptoAPI
2.1.1 体系结构
CryptoAPI体系架构共由五大部分组成:
- 基本加密函数:用于选择CSP、建立CSP连接、产生密钥、交换及传输密钥等操作
- 证书编解码函数:用于数据加密、解密、哈希等操作,创建和校验数字签名操作;实现证书、证书撤销列表、证书请求和证书扩展编码和解码操作。
- 证书库管理函数:用于数字证书及证书管理等操作。这组函数用于管理证书、证书撤销列表和证书信任列表的使用、存储、获取等。
- 简单的消息函数:用于消息处理,比如消息编解码,消息加解密,数字签名及签名验签等操作。它是把多个底层消息函数包装在一起以完成某个特定任务,方便用户使用。
- 底层消息函数:底层消息函数对传输的PKCS#7数据进行编码,对接收到的PKCS#7数据进行解码,并且对接收到的消息进行解码和验证。它可以实现简单消息函数可以实现的所有功能,且提供更大的灵活性,但一般需要更多的函数调用。
2.1.2 基本功能
-
密钥管理
在CryptoAPI中,支持两种类型的密钥:会话密钥、公私钥对。会话密钥也称为对称密钥,用于对称密钥算法。为了保证密钥的安全性,在CryptoAPI中,这些密钥都保存在CSP内部,用户可以通过CryptExportKey以加密密钥形式导出。公私钥用于非对称加密算法。非对称加密算法主要用于加解密会话密钥和数字签名。在CryptoAPI中,一般来说,大多数CSP产生的密钥容器包含两对密钥对,一对用于加密会话密钥,称为交换密钥对,一对用于产生数字签名,称为签名密钥对。在CryptoAPI中所有的密钥都存储在CSP中,CSP负责密钥的创建,销毁,导入导出等操作。
-
数据编解码
CryptoAPI采用的编码方式为ASN.1,编码规则为DER,表示发送数据时先把数据抽象为ASN.1对象,然后使用DER编码规则把ASN.1对象转化为可传输的0,1串;接收方接收到数据后,利用DER解码规则把0,1串转化为ASN.1对象,然后把ASN.1对象转化为具体应用支持的数据对象。
-
数据加解密
在CryptoAPI中约定加密较大数据块时,采用对称密钥算法。通过其封装好的加解密函数来实现数据加解密操作。
-
哈希和数字签名
哈希和数字签名一般用于数据的完整性校验和身份鉴别。CryptoAPI中,通过其封装好的哈希与数字签名函数来实现相关操作。微软公司提供的CSP产生的数字签名遵循RSA标准(PKCS#6)
-
数字证书管理
数字证书主要用于安全通信中的身份鉴别。CryptoAPI中,对数字证书的使用管理函数分为证书与证书库函数、证书验证函数两大部分。
2.2 PKCS#11
PKCS#11是使用非常普遍的密码设备接口,在实际应用中,国密的密码设备应用接口规范GM/T 0018-2012与之作用相同,在技术体系架构中处于类似的位置。PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。PKCS#11主要是应用于智能卡和HSM。
Cryptoki模型
Cryptoki:Cryptographic Token Interface Standard 密码令牌接口标准,应用程序与各种各样便携式密码设备间的一种接口。设备的种类和所支持的能力的种类取决于专用的Cryptoki库。该标准只定义库的接口,不定义库的实现,接口实现由设备商提供。Cryptoki主要目标是一个低级程序接口,将设备的细节抽象化,并把密码设备的通用模型-密码令牌提供给应用程序。第二目标是资源共享,单个设备能为一个以上的应用程序共享。Cryptoki为一个或多个密码设备提供一个接口,这些设备通过大量的槽在系统中运行,密码设备可以按照某一命令集执行某些密码操作,这些命令通常通过标准的设备驱动程序来实现,Cryptoki的作用就是屏蔽这些硬件的差异。
2.3 SKF
针对支持国密算法USB KEY设备的应用,我国颁布一个行业标准《智能密码钥匙应用接口规范》(GM/T 0016-2012)中给出,市面上销售的国密算法的USB KEY设备必须支持这个接口规范。因此,只要根据这个规范开发的应用程序,就可以兼容使用不同厂家及品牌的USB KEY产品。由于此规范中函数名称都以SKF开头,所以我们一般把按照此规范提供的设备开发接口库叫做SKF库或SKF接口。
智能密码钥匙密码应用接口位于智能密码钥匙应用程序和智能密码钥匙设备驱动之间。
一个设备中存在设备认证密钥和多个应用,应用之间相互独立。
应用由管理员PIN,用户PIN、文件和容器组成,可以存在多个文件和多个容器。每个应用维护各自的与管理员PIN和用户PIN相关的权限状态。
容器中存放加密密钥对、签名密钥对和会话密钥。其中加密密钥对用于保护会话密钥,签名密钥对用于数字签名和验证,会话密钥用于数据加解密和MAC运算。容器中也可以存放与加密密钥对对应的加密数字证书和与签名密钥对对应的签名数字证书。其中,签名密钥对由内部产生,加密密钥对由外部产生并安全导入,会话密钥可由内部产生或者由外部产生并安全导入。
3 对这些API包含的函数进行分类和对比
3.1 CryptoAPI
3.1.1 基本加密函数
(1)服务提供者函数
应用程序使用服务提供者函数来连接和断开一个CSP(Cryptographic Service Providers)。
| 函数名 |
函数功能 |
| CryptAcquireContext |
获得指定CSP 的密钥容器的句柄 |
| CryptContextAddRef |
对HCRYPTPROV 句柄增加一个应用计数 |
| CryptEnumProviders |
枚举当前计算机中的CSP |
| CryptEnumProviderTypes |
枚举CSP 的类型 |
| CryptGetDefaultProvider |
对于指定CSP 类型的却省CSP |
| CryptGetProvParam |
得到一个CSP 的属性 |
| CryptInstallDefaultContext |
安装先前得到的HCRYPTPROV 上下文作为当前却省的上下文 |
| CryptReleaseContext |
释放由CryptAcquireContext 得到的句柄 |
| CryptSetProvider|CryptSetProviderEx |
为指定CSP 类型指定一个却省的CSP |
| CryptSetProvParam |
指定一个CSP 的属性 |
| CryptUninstallDefaultContext |
删除先前由CryptInstallDefaultContext 安装的却省上下文 |
(2)密钥的产生和交换函数
密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。
| 函数 |
功能 |
| CryptAcquireCertificatePrivateKey |
对于指定证书上下文得到一个HCRYPTPROV句柄和dwKeySpec |
| CryptDeriveKey |
从一个密码中派生一个密钥 |
| CryptDestoryKey |
销毁密钥 |
| CryptDuplicateKey |
制作一个密钥和密钥状态的精确复制 |
| CryptExportKey |
把CSP 的密钥做成BLOB 传送到应用程序的内存空间中 |
| CryptGenKey |
创建一个随机密钥 |
| CryptGenRandom |
产生一个随机数 |
| CryptGetKeyParam |
得到密钥的参数 |
| CryptGetUserKey |
得到一个密钥交换或签名密钥的句柄 |
| CryptImportKey |
把一个密钥BLOB 传送到CSP中 |
| CryptSetKeyParam |
指定一个密钥的参数 |
(3)编码/解码函数
有一些编码/解码函数,他们可以用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。
| 函数 |
函数功能 |
| CryptDecodeObject |
对lpszStructType 结构进行解码 |
| CryptDecodeObjectEx |
对lpszStructType 结构进行解码,此函数支持内存分配选项 |
| CryptEncodeObject |
对lpszStructType 结构进行编码 |
| CyptEncodeObjectEx |
对lpszStructType 结构进行编码,此函数支持内存分配选项 |
(4)数据加密/解密函数
这些函数支持数据的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。
| 函数 |
功能 |
| CryptDecrypt |
使用指定加密密钥来解密一段密文 |
| CryptEncrypt |
使用指定加密密钥来加密一段明文 |
| CryptProtectData |
执行对DATA_BLOB 结构的加密 |
| CryptUnprotectData |
执行对DATA_BLOB 结构的完整性验证和解密 |
(5)哈希和数字签名函数
这些函数在应用程序中完成计算哈希、创建和校验数字签名。
| 函数 |
功能 |
| CryptCreateHash |
创建一个空哈希对象 |
| CryptDestoryHash |
销毁一个哈希对象 |
| CryptDuplicateHash |
复制一个哈希对象 |
| CryptGetHashParam |
得到一个哈希对象参数 |
| CryptHashData |
对一块数据进行哈希,把它加到指定的哈希对象中 |
| CryptHashSessionKey |
对一个会话密钥进行哈希,把它加到指定的哈希对象中 |
| CryptSetHashParam |
设置一个哈希对象的参数 |
| CryptSignHash |
对一个哈希对象进行签名 |
| CryptVerifySignature |
校验一个数字签名 |
3.1.2 证书和证书库函数
这组函数管理、使用和取得证书、证书撤销列表和证书信任列表。
(1)证书库函数
一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。
| 函数 |
功能 |
| CertAddStoreToCollection |
在证书库中增加一个证书 |
| CertCloseStore |
关闭一个证书库句柄 |
| CertControlStore |
如果证书缓冲区和证书本身内容不相符时,允许给应用程序发一个通知 |
| CertDuplicateStore |
通过增加引用计数来复制证书库句柄 |
| CertEnumPhysicalStore |
对于指定系统库枚举物理库 |
| CertEnumSystemStore |
枚举所有可用的系统库 |
| CertEnumSystemStoreLocation |
枚举可用系统库的所有位置 |
| CertGetStoreProperty |
得到一个库的属性 |
| CertOpenStore |
使用指定库类型来打开证书库 |
| CertOpenSystemStore |
打开一个系统证书库 |
| CertRegisterPhysicalStore |
在一个注册系统库里增加一个物理库 |
| CertRegisterSystemStore |
注册一个系统库 |
| CertRemoveStoreFromCollection |
从一个库集合里删除证书库 |
| CertSaveStore |
保存证书库 |
| CertSetStoreProperty |
设置证书属性 |
| CertUnregisterPhysicalStore |
从系统库中删除一个物理库 |
| CertUnregisterSystemStore |
反注册一个指定系统库 |
(2)维护函数
| 函数 |
功能 |
| CertAddSerializeElementToStore |
在库中增加一系列证书或CRL |
| CertCreateContext |
从编码字节中创建指定上下文 |
| CertEnumSubjectInSortedCTL |
在CTL 库中枚举信任主题 |
| CertFindSubjectInCTL |
在CTL 中寻找指定主题 |
| CertFindSubjectInSortedCTL |
在分类CTL 中寻找指定主题 |
(3)证书函数
下列函数是针对于证书的。大多数函数都是处理CRL 和CTL 的。
| 函数 |
功能 |
| CertAddCertificateContextToStore |
在证书库里增加一个证书上下文 |
| CertAddCertificateLinkToStore |
在证书库里增加一个对不同库里的证书上下文的链接 |
| CertAddEncodedCertificateToStore |
把编码证书转换成证书上下文并且把它加到证书库里 |
| CertCreateCertificateContext |
从编码证书中创建一个证书上下文。但这个上下文并不放到证书库里 |
| CertCreateSelfSignCertificate |
创建一个自签名证书 |
| CertDeleteCertificateFromStore |
从证书库里删除一个证书 |
| CertDuplicateCertificate |
通过增加引用计数来复制证书上下文 |
| CertEnumCertificateInStore |
在证书库里枚举证书上下文 |
| CertFindCertificateInStore |
在证书库里寻找证书上下文 |
| CertFreeCertificateContext |
释放一个证书上下文 |
| CertGetIssuerCertificateFromStore |
在证书库里得到指定主题证书的发行者 |
| CertGetSubjectCertificateFromStore |
获得主题证书的上下文 |
| CertGetValidUsages |
返回所有证书的用法 |
| CertSerializeCertificateStoreElement |
串行化编码证书的证书上下文 |
| CertVerifySubjectCertificateContext |
使用发行者来验证主题证书 |
| CryptUIDlgViewContext |
显示证书、CRL 或CTL |
| CryptUIDlgSelectCertificateFromStore |
从指定库中显示对话框,可以从中选择证书 |
(4)证书撤销列表函数
| 函数 |
功能 |
| CertAddCRLContextToStore |
在证书库里增加一个CRL 上下文 |
| CertAddCRLLinkToStore |
在不同的库里增加一个CRL 上下文链接 |
| CertAddEncodedCRLToStore |
把编码CRL 转化成CRL 上下文然后把它加入到证书库中 |
| CertCreateCRLContext |
从编码CRL 中创建CRL 句柄,但不把它加到库中 |
| CertDeleteCRLFromStore |
从证书库里删除一个CRL |
| CertDuplicateCRLContext |
通过增加引用计数来复制CRL 上下文 |
| CertEnumCRLsInStore |
枚举库里的CRL 句柄 |
| CertFindCertificateInCRL |
从指定证书里寻找CRL 列表 |
| CertFindCRLInStore |
在库里寻找CRL 上下文 |
| CertFreeCRLContext |
释放CRL 上下文 |
| CertGetCRLFromStore |
从库里得到CRL 上下文句柄 |
| CertSerializeCRLStoreElement |
串行化CRL 上下文的编码CRL 和它的属性 |
(5)证书信任列表函数
| 函数 |
功能 |
| CertAddCTLContextToStore |
把一个CTL 上下文加入到证书库里 |
| CertAddCTLLinkToStore |
给不同库里的CRL 上下文添加链接 |
| CertAddEncodedCTLToStore |
把编码CTL 转化成CTL 上下文并且把它加到证书库里 |
| CertCreateCTLContext |
从编码CTL 中创建CTL 上下文 |
| CertDeleteCTLFromStore |
从证书库里删除CTL |
| CertDuplicateCTLContext |
通过增加引用计数来复制CTL 上下文 |
| CertEnumCTLsInStore |
在证书库里枚举CTL 上下文 |
| CertFindCTLInStore |
在证书库里查找CTL 上下文 |
| CertFreeCTLContext |
释放CTL 上下文 |
| CertSerializeCTLStoreElement |
串行化CTL 上下文的编码CTL 和属性 |
(6) 扩展属性函数
| 函数 |
功能 |
| CertEnumCertificateContextProperties |
枚举指定证书上下文的属性 |
| CertEnumCRLContextProperties |
枚举指定CRL 上下文的属性 |
| CertEnumCTLContextProperties |
枚举指定CTL 上下文的属性 |
| CertGetCertificateContextProperty |
得到证书属性 |
| CertGetCRLContextProperty |
得到CRL 属性 |
| CertGetCTLContextProperty |
得到CTL 属性 |
| CertSetCertificateContextProperty |
设置证书属性 |
| CertSetCRLContextProperty |
设置CRL 属性 |
| CertSetCTLContextProperty |
设置CTL 属性 |
3.1.3 证书验证函数
证书验证是通过CTL 和证书列表进行的。
(1)使用CTL的函数
| 函数 |
功能 |
| CertVerifyCTLUsage |
验证CTL 用法 |
| CryptMsgEncodeAndSignCTL |
编码和验证CTL |
| CryptMsgGetAndVerifySigner |
从一个消息中获得和验证CTL |
| CryptMsgSignCTL |
对包含CTL 的消息进行签名 |
(2)证书链验证函数
| 函数 |
功能 |
| CertCreateCertificateChainEngine |
为应用程序创建一个新的非却省的链引擎 |
| CertCreateCTLEntryFromCertificateContextProperties |
创建一个CTL 入口 |
| CertDuplicateCertificateChain |
通过增加引用计数来复制证书链 |
| CertFindChainInStore |
在证书库里查找证书链 |
| CertFreeCertificateChain |
释放证书链 |
| CertFreeCertificateChainEngine |
释放证书链引擎 |
| CertGetCertificateChain |
从最后一个证书建立一个上下文链表 |
| CertSetCertificateContextPropertiesFromCTLEntry |
通过CTL 入口属性来设置证书上下文的属性 |
| CertIsValidCRLForCertificate |
通过检查CRL 来确定CRL 是否包括指定被撤销的证书 |
| CertVerifyCertificateChainPolicy |
通过检查证书链来确定它的完整性 |
3.1.4 消息函数
CryptoAPI 消息函数包括两组:
低级消息函数直接和PKCS#7 消息工作。这些函数对传输的PKCS#7 数据进行编码,对接收到的PKCS#7 数据进行解码,并且对接收到的消息进行解密和验证。简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。这些函数在完成一个任务时,减少了函数调用的数量,因此简化了CryptoAPI的使用。
(1)低级消息函数
| 函数 |
功能 |
| CryptMsgCalculateEncodedLength |
计算加密消息的长度 |
| CryptMsgClose |
关闭加密消息的句柄 |
| CryptMsgControl |
执行指定的控制函数 |
| CryptMsgCountersign |
标记消息中已存在的签名 |
| CryptMsgCountersignEncoded |
标记已存在的签名 |
| CryptMsgDuplicate |
通过增加引用计数来复制加密消息句柄 |
| CryptMsgGetParam |
对加密消息进行编码或者解码后得到的参数 |
| CryptMsgOpenToDecode |
打开加密消息进行解码 |
| CryptMsgOpenToEncode |
打开加密消息进行编码 |
| CryptMsgUpdate |
更新加密消息的内容 |
| CryptMsgVerifyCountersignatureEncoded |
验证SignerInfo 结构中标记时间 |
| CryptMsgVerifyCountersignatureEncodedEx |
验证SignerInfo 结构中标记时间签名者可以是CERT_PUBLIC_KEY_INFO 结构 |
(2) 简化消息函数
| 函数 |
功能 |
| CryptDecodeMessage |
对加密消息进行解码 |
| CryptDecryptAndVerifyMessageSignature |
对指定消息进行解密并且验证签名者 |
| CryptDecryptMessage |
解密指定消息 |
| CryptEncryptMessage |
加密指定消息 |
| CryptGetMessageCertificates |
返回包含消息的证书和CRL 的证书库 |
| CryptGetMessageSignatureCount |
返回签名消息的签名者数量 |
| CryptHashMessage |
创建消息的哈希 |
| CryptSignAndEncryptMessage |
对消息进行签名并且加密 |
| CryptSignMessage |
对消息进行签名 |
| CryptVerifyDetachedMessageHash |
验证包含已解邦定哈希的哈希消息 |
| CryptVerifyDetachedMessageSignature |
验证包含已解邦定签名的签名消息 |
| CryptVerifyMessageHash |
验证一个哈希消息 |
| CryptVerifyMessageSignature |
验证一个签名消息 |
3.1.5 辅助函数
(1)数据管理函数
| 函数 |
功能 |
| CertCompareCertificate |
比较两个证书是否相同 |
| CertCompareCertificateName |
通过比较两个证书名称来决定他们是否相同 |
| CertCompareIntegerBlob |
比较两个整数BLOB |
| CertComparePublicKeyInfo |
通过比较两个证书公钥来决定他们是否相同 |
| CertFindAttribute |
通过OID 来查找属性 |
| CertFindExtension |
通过OID 来查找扩展 |
| CertFindRDNAttr |
通过OID 来查找RDN 属性 |
| CertGetIntendedKeyUsage |
从证书中取得相关密钥用法 |
| CertGetPublicKeyLength |
从公钥BLOB 中取得公钥/私钥长度 |
| CertIsRDNAttrsInCertificateName |
通过指定RDN 数组属性比较证书名称属性来决定证书是否已包含了所有属性 |
| CertVerifyCRLRevocation |
验证主题证书是否在CRL 中 |
| CertVerifyCRLTimeValidity |
验证CRL 的有效时间 |
| CertVerifyRevocation |
验证主题证书是否在CRL 中 |
| CertVerifyTimeValidity |
验证CRL 的有效时间 |
| CertVerifyValidityNesting |
验证主题时间的有效性是否在发行者有效时间内 |
| CryptExportPublicKeyInfo |
导出公钥信息 |
| CryptExportPublicKeyInfoEx |
导出公钥信息(用户可以指定算法) |
| CryptFindCertificateKeyProvInfo |
枚举CSP 和它的密钥容器来查找对应于公钥的相应私钥 |
| CryptFindLocalizedName |
查找指定名字的局部化名称 |
| CryptHashCertificate |
哈希证书内容 |
| CryptHashPublicKeyInfo |
计算公钥信息的哈希 |
| CryptHashToBeSigned |
计算签名内容的信息哈希值 |
| CryptImportPublicKeyInfo |
把公钥信息导入CSP 并且返回它的句柄 |
| CryptImportPublicKeyInfoEx |
把公钥信息导入CSP 并且返回它的句柄 |
| CryptMemAlloc |
分配内存 |
| CryptMemFree |
释放内存 |
| CryptMemRealloc |
重新分配内存 |
| CryptQueryObject |
得到BLOB 或文件的内容信息 |
| CryptSignAndEncodeCertificate |
对信息进行签名并且编码 |
| CryptSignCertificate |
对证书进行签名 |
| CryptVerifyCertificateSignature |
使用公钥信息对主题证书或CRL 的签名进行验证 |
| CryptVerifyCertificateSignatureEx |
使用公钥信息对主题证书或CRL 的签名进行验证 |
(2)数据转换函数
| 函数 |
功能 |
| CertAlgIdToOID |
把CSP 算法标示符转换成OID |
| CertGetNameString |
得到证书的主题或颁发者名称并且把它转换成字符串 |
| CertNameToStr |
把证书名称BLOB 转换成字符串 |
| CertOIDToAlgId |
把OID 转换成CSP 算法表示符 |
| CertRDNValueToStr |
把名称值转换成字符串 |
| CertStrToName |
把字符串转换成编码证书名称 |
| CryptBinaryToString |
把二进制序列转换成字符串 |
| CryptFormatObject |
格式化编码数据,返回Unicode 字符串 |
| CryptStringToBinary |
把格式化的字符串转换成二进制序列 |
(3)增强密钥用法函数
| 函数 |
功能 |
| CertAddEnhancedKeyUsageIdentifier |
在证书EKU 属性中增加一个用法标示符 |
| CertGetEnhancedKeyUsage |
获得证书的EKU 扩展或属性信息 |
| CertRemoveEnhancedKeyUsageIdentifier |
从证书EKU 扩展属性中删除用法标示符OID |
| CertSetEnhancedKeyUsage |
设置证书的EKU 属性 |
(4)密钥标示函数
| 函数 |
功能 |
| CryptCreateKeyIdentifierFromCSP |
创建CSP 公钥的密钥标示符 |
| CryptEnumKeyIdentifierProperties |
枚举标示符和其属性 |
| CryptGetKeyIdentifierProperty |
从指定密钥标示符中获得指定属性 |
| CryptSetKeyIdentifierProperty |
设置指定密钥标示符的属性 |
(5)证书库回调函数
| 函数 |
功能 |
| CertDllOpenStoreProv |
定义库提供者打开函数 |
| CertStoreProvCloseCallback |
决定当证书库引用计数为0 时将发生的动作 |
| CertStoreProvDeleteCertCallback |
决定当从证书库中删除一个证书之前的动作 |
| CertStoreProvDeleteCRLCallback |
决定当从证书库中删除一个CRL 之前的动作 |
| CertStoreProvReadCertCallback |
保留 |
| CertStoreProvReadCRLCallback |
保留 |
| CertStoreProvSetCertPropertyCallback |
决定在CertSetCertificateContextProperty 和CertGetCertificateContext 调用之前的动作 |
| CertStoreProvSetCRLPropertyCallback |
决定在CertSetCRLContextProperty 和CertGetCRLContextProperty 调用之前的动作 |
| CertStoreProvWriteCertCallback |
决定在证书库中加入一个证书前的动作 |
| CertStoreProvWriteCRLCallback |
决定在证书库中加入一个CRL 前的动作 |
| CertStoreProvReadCTL |
读CSP 的CTL 上下文 |
| CertStoreProvWriteCTL |
决定CTL 是否可被加入到证书库中 |
| CertStoreProvDeleteCTL |
决定CTL 是否可被删除 |
| CertStoreProvSetCTLProperty |
决定是否可以设置CTL 的属性 |
| CertStoreProvControl |
当缓冲库和存储库不同时,通知应用程序 |
| CertStoreProvFindCert |
在证书库中查找下一个证书 |
| CertStoreProvFreeFindCert |
释放前一个找到的证书上下文 |
| CertStoreProvGetCertProperty |
得到指定的证书属性 |
| CertStoreProvFindCRL |
查找第一个或下一个匹配的CRL |
| CertStoreProvFreeFindCRL |
释放前一个找到的CRL 上下文 |
| CertStoreProvGetCRLProperty |
得到指定CRL 属性 |
| CertStoreProvFindCTL |
查找第一个或下一个匹配的CTL |
| CertStoreProvFreeFindCTL |
释放前一个找到的CTL 上下文 |
| CertStoreProvGetCTLProperty |
得到指定CTL 属性 |
具体函数和功能参考:CryptoAPI
3.2 PKCS#11
3.2.1 通用接口
| 函数 |
描述 |
| C_Initialize |
初始化 Cryptoki |
| C_Finalize |
整理各种适合 Cryptoki的资源 |
| C_GetInfo |
获得关于Cryptoki的通用信息 |
| C_GetFunctionList |
获得Cryptoki 库函数的进入点 |
3.2.2 槽和令牌管理函数
| 函数 |
功能 |
| C_GetSlotList |
获得系统中槽的名单 |
| C_GetSlotInfo |
获得关于特殊槽的信息 |
| C_GetTokenInfo |
获得关于特殊令牌的信息 |
| C_WaitForSlotEvent |
等待槽事件(令牌插入,转移等) 的发生 |
| C_GetMechanismList |
获得由令牌支持的机制的名单 |
| C_GetMechanismInfo |
获得关于特殊机制的信息 |
| C_InitToken |
初始化一个令牌 |
| C_InitPIN |
初始化普通用户的 PIN |
| C_SetPIN |
改变现在用户的PIN |
3.2.3 会话管理函数
| 函数 |
功能 |
| C_OpenSession |
打开一个应用程序和特殊令牌之间的连接或安装一个应用程序呼叫返回令牌插入 |
| C_CloseSession |
关闭一个会话 |
| C_CloseAllSessions |
用令牌关闭所有的会话 |
| C_GetSessionInfo |
获得关于会话的信息 |
| C_GetOperationState |
获得会话的加密操作状态 |
| C_SetOperationState |
设置会话的加密操作状态 |
| C_Login |
注册一个令牌 |
| C_Logout |
从一个令牌注销 |
3.2.3 对象管理函数
| C_CreateObject |
建立一个对象 |
| C_CopyObject |
建立一个对象的拷贝 |
| C_DestroyObject |
销毁一个对象 |
| C_GetObjectSize |
获取字节中一个对象的大小 |
| C_GetAttributeValue |
获取一个对象的属性值 |
| C_SetAttributeValue |
改变一个对象的属性值 |
| C_FindObjectsInit |
初始化一个对象的搜索操作 |
| C_FindObjects |
继续一个对象搜索操作 |
| C_FindObjectsFinal |
完成一个对象搜索操作 |
3.2.4 加密和解密函数
| 函数 |
功能 |
| C_EncryptInit |
初始化一个加密操作 |
| C_Encrypt |
加密单部分数据 |
| C_EncryptUpdate |
继续一个多部分加密操作 |
| C_EncryptFinal |
完成一个多部分加密操作 |
| C_DecryptInit |
初始化一个解密操作 |
| C_Decrypt |
解密单部分加密数据 |
| C_DecryptUpdate |
继续一个多部分解密操作 |
| C_DecryptFinal |
完成一个多部分解密操作 |
3.2.5 消息摘要函数
| 函数 |
|
| C_DigestInit |
初始化一个消息摘要操作 |
| C_Digest |
摘要单部分数据 |
| C_DigestUpdate |
继续一个多部分摘要操作 |
| C_DigestKey |
摘要一个密钥 |
| C_DigestFinal |
完成一个多部分摘要操作 |
3.2.5 签名和验签函数
| 函数 |
功能 |
| C_SignInit |
初始化一个签名操作 |
| C_Sign |
签名单部分数据 |
| C_SignUpdate |
继续一个多部分签名操作 |
| C_SignFinal |
完成一个多部分签名操作 |
| C_SignRecoverInit |
初始化一个签名操作,在操作中数据能从签名中恢复 |
| C_SignRecover |
签名单部分数据,在操作中数据能从签名中恢复 |
| C_VerifyInit |
初始化一个鉴定操作 |
| C_Verify |
在单部分数据上鉴定一个签名 |
| C_VerifyUpdate |
继续一个多部分鉴定操作 |
| C_VerifyFinal |
完成一个多部分鉴定操作 |
| C_VerifyRecoverInit |
初始化一个鉴定操作,在操作中数据能从签名中恢复 |
| C_VerifyRecover |
在单部分数据上鉴定一个签名,在操作中数据能从签名中恢复 |
3.2.6 双重目的的加密
| 函数 |
功能 |
| C_DigestEncryptUpdate |
继续类似的多部分摘要和加密操作 |
| C_DecryptDigestUpdate |
继续类似的多部分解密和摘要操作 |
| C_SignEncryptUpdate |
继续类似的多部分签名和加密操作 |
| C_DecryptVerifyUpdate |
继续类似的多部分解密和鉴定操作 |
3.2.7 密钥管理函数
| 函数 |
功能 |
| C_GenerateKey |
产生一个保密密钥 |
| C_GenerateKeyPair |
产生一个公共/私钥对 |
| C_WrapKey |
加密一个密钥 |
| C_UnwrapKey |
解密一个密钥 |
| C_DeriveKey |
从基础密钥派生一个密钥 |
3.2.8 随机数生成函数
| 函数 |
功能 |
| C_SeedRandom |
把一个附加种子材料加入随机数字生成器 |
| C_GenerateRandom |
生成随机数据 |
具体函数内容和功能参考:PKCS#11
3.3 SFK
3.3.1 设备管理系列函数
| 函数名称 |
功能 |
| SKF_WaitForDevEvent |
等待设备插拔事件 |
| SKF_CanceIWaitForDevEvent |
取消等待设备插拔事件 |
| SKF_EnumDev |
枚举设备 |
| SKF_ConnectDev |
连接设备 |
| SKF_DisconnectDev |
断开连接 |
| SKF_GetDevState |
获取设备状态 |
| SKF_SetLabeI |
设置设备标签 |
| SKF_GetDevInfo |
获取设备信息 |
| SKF_LockDev |
锁定设备 |
| SKF_UnIockDev |
解锁设备 |
| SKF_Transmit |
设备命令传输 |
3.3.2 访问控制系列函数
| 函数名称 |
功能 |
| SKF_ChangeDevAuthKey |
修改设备认证密钥 |
| SKF_DevAuth |
设备认证 |
| SKF_ChangePIN |
修改 PIN |
| SKF_GetPINInfo |
获得 PIN码信息 |
| SKF_VerifyPIN |
校验 PIN |
| SKF_UnbIockPIN |
解锁 PIN |
| SKF_CIearSecueState |
清除应用安全状态 |
3.3.3 应用管理系列函数
| 函数名称 |
功 能 |
| SKF_CreateApplication |
创建应用 |
| SKF_EnumApplication |
枚举应用 |
| SKF_DeleteApplication |
删除应用 |
| SKF_OpenApplication |
打开应用 |
| SKF_CloseApplication |
关闭应用 |
3.3.4 文件管理系列函数
| 函数名称 |
功能 |
| SKF_CreateFiIe |
创建文件 |
| SKF_DeIeteFiIe |
删除文件 |
| SKF_EnumFiIes |
枚举文件 |
| SKF_GetFiIeInfo |
获取文件信息 |
| SKF_ReadFiIe |
读文件 |
| SKF_WriteFiIe |
写文件 |
3.3.5 容器管理系列函数
| 函数名称 |
功能 |
| SKF_CreateContainer |
创建容器 |
| SKF_DeIeteContainer |
删除容器 |
| SKF_EnumContainer |
枚举容器 |
| SKF_OpenContainer |
打开容器 |
| SKF_CIoseContainer |
关闭容器 |
| SKF_GetContainerType |
获得容器类型 |
| SKF_ImportCertificate |
导人数字证书 |
| SKF_ExportCertificate |
导出数字证书 |
3.3.6 密码服务系列函数
| 函数名称 |
功 能 |
| SKF_GenRandom |
生成随机数 |
| SKF_GenExtRsAKey |
生成外部 RsA密钥对 |
| SKF_GenRsAKeyPair |
生成 RsA签名密钥对 |
| SKF_ImportRsAKeyPair |
导人 RsA加密密钥对 |
| SKF_RsAsignData |
RsA签名 |
| SKF_RsAVerify |
RsA验签 |
| SKF_Rs/Dxportse*s*ionKey |
Rs/生成并导出会话密钥 |
| SKF_DxtRs/PubKeyOperation |
Rs/外来公钥运算 |
| SKF_DxtRs/PriKeyOperation |
Rs/外来私钥运算 |
| SKF_GenDAAKeyPair |
生成 DAA签名密钥对 |
| SKF_ImportDAAKeyPair |
导人 DAA加密密钥对 |
| SKF_DAAsignCata |
DAA签名 |
| SKF_DAAVerify |
DAA验签 |
| SKF_DAADxportse*s*ionKey |
DAA生成并导出会话密钥 |
| SKF_DxtDAADncrypt |
DAA外来公钥加密 |
| SKF_DxtDAACecrypt |
DAA外来私钥解密 |
| SKF_DxtDAAsign |
DAA外来私钥签名 |
| SKF_DxtDAAVerify |
DAA外来公钥验签 |
| SKF_Generate/gr*e*mentCataWithDAA |
DAA生成密钥协商参数并输出 |
| SKF_GenerateKeyWithDAA |
DAA计算会话密钥 |
| SKF_Generate/gr*e*mentCata/ndKeyWithDAA |
DAA产生协商数据并计算会话密钥 |
| SKF_DxportPubIicKey |
导出公钥 |
| SKF_Importse*s*ionKey |
导人会话密钥 |
| SKF_setsymmKey |
明文导人会话密钥 |
| SKF_DncryptInit |
加密初始化 |
| SKF_Dncrypt |
单组数据加密 |
| SKF_DncryptUpdate |
多组数据加密 |
| SKF_DncryptFinaI |
结束加密 |
| SKF_CecryptInit |
解密初始化 |
| SKF_Cecrypt |
单组数据解密 |
| SKF_CecryptUpdate |
多组数据解密 |
| SKF_CecryptFinaI |
结束解密 |
| SKF_CigestInit |
密码杂凑初始化 |
| SKF_Cigest |
单组数据密码杂凑 |
| SKF_CigestUpdate |
多组数据密码杂凑 |
| SKF_CigestFinaI |
结束密码杂凑 |
| SKF_MacInit |
消息鉴别码运算初始化 |
| SKF_Mac |
单组数据消息鉴别码运算 |
| SKF_MacUpdate |
多组数据消息鉴别码运算 |
| SKF_MacFinaI |
结束消息鉴别码运算 |
| SKF_AIoseHandIe |
关闭密码对象句柄 |
4 接口调用(以龙脉GM3000Key为例)
4.1 Crypto API
代码链接:Gitee
4.2 PKCS#11
代码和编译脚本:Gitee
4.3 SFK
代码链接和编译脚本:Gitee