密码引擎API研究

发布时间 2023-04-03 19:19:43作者: 201230RookieHacker

密码引擎API研究

标准文档

API使用方式

  • CryptoAPI
    • C语言编程中(hash举例):

      首先包含必要的API的头文件

      #include <windows.h> 
      #include <wincrypt.h> 
      

      获取要使用的加密服务提供程序(CSP)的句柄:

      HCRYPTPROV hProv;
      if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
      // 处理错误
      }
      

      这里,PROV_RSA_FULL指定要获取的提供程序类型。根据需要,您也可以使用其他提供程序类型。
      创建哈希对象:

      HCRYPTHASH hHash;
      if(!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) {
      // 处理错误
      }
      

      这里,CALG_SHA_256指定要使用的哈希算法。根据需要,也可以使用其他哈希算法。
      向哈希对象添加数据:

      BYTE pbData[] = "Hello, world!";
      DWORD dwDataLen = sizeof(pbData);
      if(!CryptHashData(hHash, pbData, dwDataLen, 0)) {
      // 处理错误
      }
      

      这里,pbData是要哈希的数据,dwDataLen是数据的长度。
      完成哈希:

      BYTE pbHash[32];
      DWORD dwHashLen = sizeof(pbHash);
      if(!CryptGetHashParam(hHash, HP_HASHVAL, pbHash, &dwHashLen, 0)) {
       // 处理错误
      }
      

      这里,pbHash是用于接收哈希值的缓冲区,dwHashLen是缓冲区的长度。HP_HASHVAL指定要检索的哈希值参数。
      释放哈希对象:

      if(hHash) {
      CryptDestroyHash(hHash);
      }
      

      释放CSP句柄:

      if(hProv) {
      CryptReleaseContext(hProv, 0);
      } 
      
    • java语言编程中(hash举例):

      导入必要的类:

      import java.security.Provider;
      import java.security.Security;
      import java.security.MessageDigest;
      

      添加Microsoft CryptoAPI提供程序:

      Provider provider = new sun.security.pkcs11.SunPKCS11("path/to/cryptoki.cfg");
      Security.addProvider(provider);
      

      这里,path/to/cryptoki.cfg是包含Microsoft CryptoAPI提供程序信息的配置文件的路径。
      创建哈希对象:

      MessageDigest md = MessageDigest.getInstance("SHA-256", provider);
      

      这里,SHA-256指定要使用的哈希算法。根据需要,您也可以使用其他哈希算法。
      向哈希对象添加数据:

       byte[] data = "Hello, world!".getBytes();
       md.update(data);
      

      这里,data是要哈希的数据。
      完成哈希:

       byte[] hash = md.digest();
      

      这里,hash是哈希值。

  • PKCS#11接口调用
    • C语言编程中:

      包含必要的头文件
      #include <pkcs11.h>
      加载PKCS#11库:

      CK_FUNCTION_LIST_PTR pFunctionList;
      CK_C_GetFunctionList pC_GetFunctionList;
      CK_RV rv;
      rv = C_GetFunctionList(NULL, &pFunctionList);
      if(rv != CKR_OK) {
      // 处理错误
      }
      pC_GetFunctionList = pFunctionList->C_GetFunctionList;
      

      这里,C_GetFunctionList是PKCS#11库提供的一个函数,用于返回一个结构体指针,该结构体包含所有PKCS#11函数的指针。
      初始化PKCS#11库:

      CK_C_INITIALIZE_ARGS initArgs;
      CK_RV rv;
      initArgs.flags = CKF_OS_LOCKING_OK;
      rv = pC_GetFunctionList()->C_Initialize(&initArgs);
      if(rv != CKR_OK) {
      // 处理错误
      }
      

      这里,CKF_OS_LOCKING_OK指定PKCS#11库可以使用操作系统锁定机制。
      与PKCS#11令牌建立会话:

      CK_SESSION_HANDLE hSession;
      CK_RV rv;
      rv = pC_GetFunctionList()->C_OpenSession(0, CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL, NULL, &hSession);
      if(rv != CKR_OK) {
      // 处理错误
      }
      

      这里,CKF_SERIAL_SESSION指定会话是串行会话,CKF_RW_SESSION指定会话是读写会话。
      登录PKCS#11令牌:

      CK_RV rv;
      rv = pC_GetFunctionList()->C_Login(hSession, CKU_USER, "password", strlen("password"));
      if(rv != CKR_OK) {
      // 处理错误
      }
      

      这里,CKU_USER指定用户类型,"password"是用户的密码。
      执行PKCS#11操作:

      CK_RV rv;
      // 在此
      
    • java语言编程中:

      导入必要的类

      import java.security.Provider;
      import java.security.Security;
      import java.security.MessageDigest;
      

      添加PKCS#11提供程序:

      Provider provider = new sun.security.pkcs11.SunPKCS11("path/to/pkcs11.cfg");
      Security.addProvider(provider);
      

      这里,path/to/pkcs11.cfg是包含PKCS#11提供程序信息的配置文件的路径。
      创建哈希对象:

      MessageDigest md = MessageDigest.getInstance("SHA-256", provider);
      

      这里,SHA-256指定要使用的哈希算法。根据需要,也可以使用其他哈希算法。
      向哈希对象添加数据:

      byte[] data = "Hello, world!".getBytes();
      md.update(data);
      

      这里,data是要哈希的数据。
      完成哈希:

      byte[] hash = md.digest();
      

      这里,hash是哈希值。

  • GMT 0016-2012接口
    • C语言编程(hash举例):

      包含必要的头文件

      #include <gmt0016.h>
      

      初始化GMT 0016-2012库:

      if(!GMT0016_Initialize()) {
      // 处理错误
      }
      

      创建hash对象

      GMT0016_HASH_HANDLE hHash;
      if(!GMT0016_CreateHash(GMT0016_ALGORITHM_SHA256, &hHash)) {
      // 处理错误
      }
      

      这里,GMT0016_ALGORITHM_SHA256指定要使用的哈希算法。根据需要,您也可以使用其他哈希算法。
      向哈希对象添加数据:

      BYTE pbData[] = "Hello, world!";
      DWORD dwDataLen = sizeof(pbData);
      if(!GMT0016_HashData(hHash, pbData, dwDataLen)) {
       // 处理错误
      }
      

      这里,pbData是要哈希的数据,dwDataLen是数据的长度。
      完成哈希:

      BYTE pbHash[32];
      DWORD dwHashLen = sizeof(pbHash);
      if(!GMT0016_GetHashValue(hHash, pbHash, &dwHashLen)) {
          // 处理错误
      }
      

      这里,pbHash是用于接收哈希值的缓冲区,dwHashLen是缓冲区的长度。
      销毁哈希对象:

      if(hHash) {
      GMT0016_DestroyHash(hHash);
      }
      

      终止GMT 0016-2012库:
      GMT0016_Finalize();

  • GMT 0018-2012接口调用
    • C语言编程:

      包含必要的头文件
      c #include <gmt0018.h>
      初始化GMT 0018-2012库:

      if(!GMT0018_Initialize()) {
      // 处理错误
      }
      

      创建签名对象

      GMT0018_SIGN_HANDLE hSign;
      if(!GMT0018_CreateSign(GMT0018_ALGORITHM_SM2, &hSign)) {
      // 处理错误
      }
      

      这里,GMT0018_ALGORITHM_SM2指定要使用的签名算法。根据需要,您也可以使用其他签名算法。
      设置签名密钥:

      if(!GMT0018_SetSignKey(hSign, pbPrivateKey, dwPrivateKeyLen)) {
      // 处理错误
      }
      

      这里,pbPrivateKey是签名密钥的数据,dwPrivateKeyLen是数据的长度。
      设置签名参数:

      GMT0018_SIGN_PARAM signParam;
      signParam.dwFlags = GMT0018_SIGN_PARAM_FLAG_DEFAULT;
      if(!GMT0018_SetSignParam(hSign, &signParam)) {
      // 处理错误
      }
      

      这里,GMT0018_SIGN_PARAM_FLAG_DEFAULT指定要使用的签名参数。根据需要,您也可以使用其他签名参数。
      对数据进行签名:

      BYTE pbData[] = "Hello, world!";
      DWORD dwDataLen = sizeof(pbData);
      BYTE pbSignature[64];
      DWORD dwSignatureLen = sizeof(pbSignature);
      if(!GMT0018_SignData(hSign, pbData, dwDataLen, pbSignature, &dwSignatureLen)) {
      // 处理错误
      }
      

      这里,pbData是要签名的数据,dwDataLen是数据的长度,pbSignature是用于接收签名值的缓冲区,dwSignatureLen是缓冲区的长度。
      验证签名:

      if(!GMT0018_VerifySign(hSign, pbData, dwDataLen, pbSignature, dwSignature)){
          //处理
      }
      

API包含函数的分类和对比

CryptoAPI

  • 基本加密函数
    • 服务提供者函数
      应用程序使用服务提供者函数来连接和断开一个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 安装的却省上下文

    • 密钥的产生和交换函数

      函数 功能
      CryptAcquireCertificatePrivateKey 对于指定证书上下文得到一个HCRYPTPROV句柄和dwKeySpec
      CryptDeriveKey 从一个密码中派生一个密钥
      CryptDestoryKey 销毁密钥
      CryptDuplicateKey 制作一个密钥和密钥状态的精确复制
      CryptExportKey 把CSP 的密钥做成BLOB 传送到应用程序的内存空间中
      CryptGenKey 创建一个随机密钥
      CryptGenRandom 产生一个随机数
      CryptGetKeyParam 得到密钥的参数
      CryptGetUserKey 得到一个密钥交换或签名密钥的句柄
      CryptImportKey 把一个密钥BLOB 传送到CSP中
      CryptSetKeyParam 指定一个密钥的参数

    • 编码/解码函数

      函数 函数功能
      CryptDecodeObject 对lpszStructType 结构进行解码
      CryptDecodeObjectEx 对lpszStructType 结构进行解码,此函数支持内存分配选项
      CryptEncodeObject 对lpszStructType 结构进行编码
      CyptEncodeObjectEx 对lpszStructType 结构进行编码,此函数支持内存分配选项

    • 数据加密/解密函数

      函数 功能
      CryptDecrypt 使用指定加密密钥来解密一段密文
      CryptEncrypt 使用指定加密密钥来加密一段明文
      CryptProtectData 执行对DATA_BLOB 结构的加密
      CryptUnprotectData 执行对DATA_BLOB 结构的完整性验证和解密

    • 哈希和数字签名函数

      函数 功能
      CryptCreateHash 创建一个空哈希对象
      CryptDestoryHash 销毁一个哈希对象
      CryptDuplicateHash 复制一个哈希对象
      CryptGetHashParam 得到一个哈希对象参数
      CryptHashData 对一块数据进行哈希,把它加到指定的哈希对象中
      CryptHashSessionKey 对一个会话密钥进行哈希,把它加到指定的哈希对象中
      CryptSetHashParam 设置一个哈希对象的参数
      CryptSignHash 对一个哈希对象进行签名
      CryptVerifySignature 校验一个数字签名

  • 证书和证书库函数
    • 证书库函数

      函数 功能
      CertAddStoreToCollection 在证书库中增加一个证书
      CertCloseStore 关闭一个证书库句柄
      CertControlStore 如果证书缓冲区和证书本身内容不相符时,允许给应用程序发一个通知
      CertDuplicateStore 通过增加引用计数来复制证书库句柄
      CertEnumPhysicalStore 对于指定系统库枚举物理库
      CertEnumSystemStore 枚举所有可用的系统库
      CertEnumSystemStoreLocation 枚举可用系统库的所有位置
      CertGetStoreProperty 得到一个库的属性
      CertOpenStore 使用指定库类型来打开证书库
      CertOpenSystemStore 打开一个系统证书库
      CertRegisterPhysicalStore 在一个注册系统库里增加一个物理库
      CertRegisterSystemStore 注册一个系统库
      CertRemoveStoreFromCollection 从一个库集合里删除证书库
      CertSaveStore 保存证书库
      CertSetStoreProperty 设置证书属性
      CertUnregisterPhysicalStore 从系统库中删除一个物理库
      CertUnregisterSystemStore 反注册一个指定系统库

    • 维护函数

      函数 功能
      CertAddSerializeElementToStore 在库中增加一系列证书或CRL
      CertCreateContext 从编码字节中创建指定上下文
      CertEnumSubjectInSortedCTL 在CTL 库中枚举信任主题
      CertFindSubjectInCTL 在CTL 中寻找指定主题
      CertFindSubjectInSortedCTL 在分类CTL 中寻找指定主题

    • 证书函数

      函数 功能
      CertAddCertificateContextToStore 在证书库里增加一个证书上下文
      CertAddCertificateLinkToStore 在证书库里增加一个对不同库里的证书上下文的链接
      CertAddEncodedCertificateToStore 把编码证书转换成证书上下文并且把它加到证书库里
      CertCreateCertificateContext 从编码证书中创建一个证书上下文。但这个上下文并不放到证书库里
      CertCreateSelfSignCertificate 创建一个自签名证书
      CertDeleteCertificateFromStore 从证书库里删除一个证书
      CertDuplicateCertificate 通过增加引用计数来复制证书上下文
      CertEnumCertificateInStore 在证书库里枚举证书上下文
      CertFindCertificateInStore 在证书库里寻找证书上下文
      CertFreeCertificateContext 释放一个证书上下文
      CertGetIssuerCertificateFromStore 在证书库里得到指定主题证书的发行者
      CertGetSubjectCertificateFromStore 获得主题证书的上下文
      CertGetValidUsages 返回所有证书的用法
      CertSerializeCertificateStoreElement 串行化编码证书的证书上下文
      CertVerifySubjectCertificateContext 使用发行者来验证主题证书
      CryptUIDlgViewContext 显示证书、CRL 或CTL
      CryptUIDlgSelectCertificateFromStore 从指定库中显示对话框,可以从中选择证书

    • 证书撤销列表函数

      函数 功能
      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 和它的属性

    • 证书信任列表函数

      函数 功能
      CertAddCTLContextToStore 把一个CTL 上下文加入到证书库里
      CertAddCTLLinkToStore 给不同库里的CRL 上下文添加链接
      CertAddEncodedCTLToStore 把编码CTL 转化成CTL 上下文并且把它加到证书库里
      CertCreateCTLContext 从编码CTL 中创建CTL 上下文
      CertDeleteCTLFromStore 从证书库里删除CTL
      CertDuplicateCTLContext 通过增加引用计数来复制CTL 上下文
      CertEnumCTLsInStore 在证书库里枚举CTL 上下文
      CertFindCTLInStore 在证书库里查找CTL 上下文
      CertFreeCTLContext 释放CTL 上下文
      CertSerializeCTLStoreElement 串行化CTL 上下文的编码CTL 和属性

    • 扩展属性函数

      函数 功能
      CertEnumCertificateContextProperties 枚举指定证书上下文的属性
      CertEnumCRLContextProperties 枚举指定CRL 上下文的属性
      CertEnumCTLContextProperties 枚举指定CTL 上下文的属性
      CertGetCertificateContextProperty 得到证书属性
      CertGetCRLContextProperty 得到CRL 属性
      CertGetCTLContextProperty 得到CTL 属性
      CertSetCertificateContextProperty 设置证书属性
      CertSetCRLContextProperty 设置CRL 属性
      CertSetCTLContextProperty 设置CTL 属性

  • 证书验证函数
    • 使用CTL的函数

      函数 功能
      CertVerifyCTLUsage 验证CTL 用法
      CryptMsgEncodeAndSignCTL 编码和验证CTL
      CryptMsgGetAndVerifySigner 从一个消息中获得和验证CTL
      CryptMsgSignCTL 对包含CTL 的消息进行签名

    • 证书链验证函数

      函数 功能
      CertCreateCertificateChainEngine 为应用程序创建一个新的非却省的链引擎
      CertCreateCTLEntryFromCertificateContextProperties 创建一个CTL 入口
      CertDuplicateCertificateChain 通过增加引用计数来复制证书链
      CertFindChainInStore 在证书库里查找证书链
      CertFreeCertificateChain 释放证书链
      CertFreeCertificateChainEngine 释放证书链引擎
      CertGetCertificateChain 从最后一个证书建立一个上下文链表
      CertSetCertificateContextPropertiesFromCTLEntry 通过CTL 入口属性来设置证书上下文的属性
      CertIsValidCRLForCertificate 通过检查CRL 来确定CRL 是否包括指定被撤销的证书
      CertVerifyCertificateChainPolicy 通过检查证书链来确定它的完整性

  • 消息函数
    • 低级消息函数

      函数 功能
      CryptMsgCalculateEncodedLength 计算加密消息的长度
      CryptMsgClose 关闭加密消息的句柄
      CryptMsgControl 执行指定的控制函数
      CryptMsgCountersign 标记消息中已存在的签名
      CryptMsgCountersignEncoded 标记已存在的签名
      CryptMsgDuplicate 通过增加引用计数来复制加密消息句柄
      CryptMsgGetParam 对加密消息进行编码或者解码后得到的参数
      CryptMsgOpenToDecode 打开加密消息进行解码
      CryptMsgOpenToEncode 打开加密消息进行编码
      CryptMsgUpdate 更新加密消息的内容
      CryptMsgVerifyCountersignatureEncoded 验证SignerInfo 结构中标记时间
      CryptMsgVerifyCountersignatureEncodedEx 验证SignerInfo 结构中标记时间签名者可以是CERT_PUBLIC_KEY_INFO 结构

    • 简化消息函数

      函数 功能
      CryptDecodeMessage 对加密消息进行解码
      CryptDecryptAndVerifyMessageSignature 对指定消息进行解密并且验证签名者
      CryptDecryptMessage 解密指定消息
      CryptEncryptMessage 加密指定消息
      CryptGetMessageCertificates 返回包含消息的证书和CRL 的证书库
      CryptGetMessageSignatureCount 返回签名消息的签名者数量
      CryptHashMessage 创建消息的哈希
      CryptSignAndEncryptMessage 对消息进行签名并且加密
      CryptSignMessage 对消息进行签名
      CryptVerifyDetachedMessageHash 验证包含已解邦定哈希的哈希消息
      CryptVerifyDetachedMessageSignature 验证包含已解邦定签名的签名消息
      CryptVerifyMessageHash 验证一个哈希消息
      CryptVerifyMessageSignature 验证一个签名消息

  • 辅助函数
    • 数据管理函数

      函数 功能
      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 的签名进行验证

    • 数据转换函数

      函数 功能
      CertAlgIdToOID 把CSP 算法标示符转换成OID
      CertGetNameString 得到证书的主题或颁发者名称并且把它转换成字符串
      CertNameToStr 把证书名称BLOB 转换成字符串
      CertOIDToAlgId 把OID 转换成CSP 算法表示符
      CertRDNValueToStr 把名称值转换成字符串
      CertStrToName 把字符串转换成编码证书名称
      CryptBinaryToString 把二进制序列转换成字符串
      CryptFormatObject 格式化编码数据,返回Unicode 字符串
      CryptStringToBinary 把格式化的字符串转换成二进制序列

    • 增强密钥用法函数

      函数 功能
      CertAddEnhancedKeyUsageIdentifier 在证书EKU 属性中增加一个用法标示符
      CertGetEnhancedKeyUsage 获得证书的EKU 扩展或属性信息
      CertRemoveEnhancedKeyUsageIdentifier 从证书EKU 扩展属性中删除用法标示符OID
      CertSetEnhancedKeyUsage 设置证书的EKU 属性

    • 密钥标示函数

      函数 功能
      CryptCreateKeyIdentifierFromCSP 创建CSP 公钥的密钥标示符
      CryptEnumKeyIdentifierProperties 枚举标示符和其属性
      CryptGetKeyIdentifierProperty 从指定密钥标示符中获得指定属性
      CryptSetKeyIdentifierProperty 设置指定密钥标示符的属性

    • 证书库回调函数

      函数 功能
      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

PKCS#11

  • 通用接口

    函数 描述
    C_Initialize 初始化 Cryptoki
    C_Finalize 整理各种适合 Cryptoki的资源
    C_GetInfo 获得关于Cryptoki的通用信息
    C_GetFunctionList 获得Cryptoki 库函数的进入点

  • 槽和令牌管理函数

    函数 功能
    C_GetSlotList 获得系统中槽的名单
    C_GetSlotInfo 获得关于特殊槽的信息
    C_GetTokenInfo 获得关于特殊令牌的信息
    C_WaitForSlotEvent 等待槽事件(令牌插入,转移等) 的发生
    C_GetMechanismList 获得由令牌支持的机制的名单
    C_GetMechanismInfo 获得关于特殊机制的信息
    C_InitToken 初始化一个令牌
    C_InitPIN 初始化普通用户的 PIN
    C_SetPIN 改变现在用户的PIN

  • 会话管理函数

    函数 功能
    C_OpenSession 打开一个应用程序和特殊令牌之间的连接或安装一个应用程序呼叫返回令牌插入
    C_CloseSession 关闭一个会话
    C_CloseAllSessions 用令牌关闭所有的会话
    C_GetSessionInfo 获得关于会话的信息
    C_GetOperationState 获得会话的加密操作状态
    C_SetOperationState 设置会话的加密操作状态
    C_Login 注册一个令牌
    C_Logout 从一个令牌注销

  • 对象管理函数

    C_CreateObject 建立一个对象
    C_CopyObject 建立一个对象的拷贝
    C_DestroyObject 销毁一个对象
    C_GetObjectSize 获取字节中一个对象的大小
    C_GetAttributeValue 获取一个对象的属性值
    C_SetAttributeValue 改变一个对象的属性值
    C_FindObjectsInit 初始化一个对象的搜索操作
    C_FindObjects 继续一个对象搜索操作
    C_FindObjectsFinal 完成一个对象搜索操作

  • 加密和解密函数

    函数 功能
    C_EncryptInit 初始化一个加密操作
    C_Encrypt 加密单部分数据
    C_EncryptUpdate 继续一个多部分加密操作
    C_EncryptFinal 完成一个多部分加密操作
    C_DecryptInit 初始化一个解密操作
    C_Decrypt 解密单部分加密数据
    C_DecryptUpdate 继续一个多部分解密操作
    C_DecryptFinal 完成一个多部分解密操作

  • 消息摘要函数

    函数 功能
    C_DigestInit 初始化一个消息摘要操作
    C_Digest 摘要单部分数据
    C_DigestUpdate 继续一个多部分摘要操作
    C_DigestKey 摘要一个密钥
    C_DigestFinal 完成一个多部分摘要操作

  • 签名和验签函数

    函数 功能
    C_SignInit 初始化一个签名操作
    C_Sign 签名单部分数据
    C_SignUpdate 继续一个多部分签名操作
    C_SignFinal 完成一个多部分签名操作
    C_SignRecoverInit 初始化一个签名操作,在操作中数据能从签名中恢复
    C_SignRecover 签名单部分数据,在操作中数据能从签名中恢复
    C_VerifyInit 初始化一个鉴定操作
    C_Verify 在单部分数据上鉴定一个签名
    C_VerifyUpdate 继续一个多部分鉴定操作
    C_VerifyFinal 完成一个多部分鉴定操作
    C_VerifyRecoverInit 初始化一个鉴定操作,在操作中数据能从签名中恢复
    C_VerifyRecover 在单部分数据上鉴定一个签名,在操作中数据能从签名中恢复

  • 双重目的的加密

    函数 功能
    C_DigestEncryptUpdate 继续类似的多部分摘要和加密操作
    C_DecryptDigestUpdate 继续类似的多部分解密和摘要操作
    C_SignEncryptUpdate 继续类似的多部分签名和加密操作
    C_DecryptVerifyUpdate 继续类似的多部分解密和鉴定操作

  • 密钥管理函数

    函数 功能
    C_GenerateKey 产生一个保密密钥
    C_GenerateKeyPair 产生一个公共/私钥对
    C_WrapKey 加密一个密钥
    C_UnwrapKey 解密一个密钥
    C_DeriveKey 从基础密钥派生一个密钥

  • 随机数生成函数

    函数 功能
    C_SeedRandom 把一个附加种子材料加入随机数字生成器
    C_GenerateRandom 生成随机数据

SFK

  • 设备管理系列函数

    函数名称 功能
    SKF_WaitForDevEvent 等待设备插拔事件
    SKF_CanceIWaitForDevEvent 取消等待设备插拔事件
    SKF_EnumDev 枚举设备
    SKF_ConnectDev 连接设备
    SKF_DisconnectDev 断开连接
    SKF_GetDevState 获取设备状态
    SKF_SetLabeI 设置设备标签
    SKF_GetDevInfo 获取设备信息
    SKF_LockDev 锁定设备
    SKF_UnIockDev 解锁设备
    SKF_Transmit 设备命令传输

  • 访问控制系列函数

    函数名称 功能
    SKF_ChangeDevAuthKey 修改设备认证密钥
    SKF_DevAuth 设备认证
    SKF_ChangePIN 修改 PIN
    SKF_GetPINInfo 获得 PIN码信息
    SKF_VerifyPIN 校验 PIN
    SKF_UnbIockPIN 解锁 PIN
    SKF_CIearSecueState 清除应用安全状态

  • 应用管理系列函数

    函数名称 功 能
    SKF_CreateApplication 创建应用
    SKF_EnumApplication 枚举应用
    SKF_DeleteApplication 删除应用
    SKF_OpenApplication 打开应用
    SKF_CloseApplication 关闭应用

  • 文件管理系列函数

    函数名称 功能
    SKF_CreateFiIe 创建文件
    SKF_DeIeteFiIe 删除文件
    SKF_EnumFiIes 枚举文件
    SKF_GetFiIeInfo 获取文件信息
    SKF_ReadFiIe 读文件
    SKF_WriteFiIe 写文件

  • 容器管理系列函数

    函数名称 功能
    SKF_CreateContainer 创建容器
    SKF_DeIeteContainer 删除容器
    SKF_EnumContainer 枚举容器
    SKF_OpenContainer 打开容器
    SKF_CIoseContainer 关闭容器
    SKF_GetContainerType 获得容器类型
    SKF_ImportCertificate 导人数字证书
    SKF_ExportCertificate 导出数字证书

  • 密码服务系列函数

    函数名称 功 能
    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 关闭密码对象句柄

接口调用(以龙脉GM3000Key为例)