密码引擎-加密API研究
任务详情
查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)
总结这些API在编程中的使用方式
列出这些API包含的函数,进行分类,并总结它们的异同
以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
1 研究学习原始文档
1.1 CryptoAPI
Cryptography
CryptoAPI System Architecture
Cryptographic Provider Types
Microsoft Cryptographic Service Providers
Cryptography API: Next Generation
wincrypt.h header
1.2 PKCS#11
1.3 GM/T 0016-2012 智能密码钥匙密码应用接口规范
http://www.gmbz.org.cn/main/viewfile/20180110020423162671.html
1.4 GM/T 0018-2012 密码设备应用接口规范
http://www.gmbz.org.cn/main/viewfile/20180110020642562680.html
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接口。
智能密码钥匙密码应用接口位于智能密码钥匙应用程序和智能密码钥匙设备驱动之间。
1个设备中存在设备认证密钥和多个应用,应用之间相互独立。
应用由管理员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.6 签名和验签函数
函数 功能
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.7 双重目的的加密
函数 功能
C_DigestEncryptUpdate 继续类似的多部分摘要和加密操作
C_DecryptDigestUpdate 继续类似的多部分解密和摘要操作
C_SignEncryptUpdate 继续类似的多部分签名和加密操作
C_DecryptVerifyUpdate 继续类似的多部分解密和鉴定操作
3.2.8 密钥管理函数
函数 功能
C_GenerateKey 产生一个保密密钥
C_GenerateKeyPair 产生一个公共/私钥对
C_WrapKey 加密一个密钥
C_UnwrapKey 解密一个密钥
C_DeriveKey 从基础密钥派生一个密钥
3.2.9 随机数生成函数
函数 功能
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/DxportsesionKey Rs/生成并导出会话密钥
SKF_DxtRs/PubKeyOperation Rs/外来公钥运算
SKF_DxtRs/PriKeyOperation Rs/外来私钥运算
SKF_GenDAAKeyPair 生成 DAA签名密钥对
SKF_ImportDAAKeyPair 导人 DAA加密密钥对
SKF_DAAsignCata DAA签名
SKF_DAAVerify DAA验签
SKF_DAADxportsesionKey DAA生成并导出会话密钥
SKF_DxtDAADncrypt DAA外来公钥加密
SKF_DxtDAACecrypt DAA外来私钥解密
SKF_DxtDAAsign DAA外来私钥签名
SKF_DxtDAAVerify DAA外来公钥验签
SKF_Generate/grementCataWithDAA DAA生成密钥协商参数并输出
SKF_GenerateKeyWithDAA DAA计算会话密钥
SKF_Generate/grementCata/ndKeyWithDAA DAA产生协商数据并计算会话密钥
SKF_DxportPubIicKey 导出公钥
SKF_ImportsesionKey 导人会话密钥
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
https://gitee.com/luhanqi_20191301/linux-coding/tree/master/windows-master/CSP