-
微軟的Crypto API
-
RAS公司的PKCS#11標准
-
中國商用密碼標准:GMT 0016-2012 智能密碼鑰匙密碼應用接口規范,GMT 0018-2012密碼設備應用接口規范等
1 Crypto API
微軟的CryptoAPI是Win32平台下為應用程序開發者提供的數據加密和安全的編碼接口。CryptoAPI函數集包含了基本的ASN.1的編碼、解碼,散列,數據加密和解密,數字證書管理等重要的密碼學應用功能。數據的加密、解密支持對稱和非對稱兩類算法。CryptoAPI是所有微軟的Win32的應用程序以及第三方廠商應有程序使用的數據加密接口,諸如Internet Explorer、OutLook、Adobe等應用都是基於CryptoAPI開發的。
Crypto API
CryptoAPI本身不實現密碼運算相關操作,而是操作系統通過調用CryptoSPI函數接口相應的加密服務提供者函數(CSP)來實現。CryptoAPI函數使用“加密服務提供者”(CSP)完成數據加密、解密以及密鑰的存儲管理、所有的CSP都是相互獨立的模塊。理論上,CSP應該獨立於特定的應用程序,也就是說所有的應用程序可以使用任何一個CSP。但是,實際上有些應用程序只能與特定的CSP協作。CSP與應用程序之間的關系類似於Windows GDI模型。CSP就類似於圖形硬件驅動程序。

1.2 Crypto API包含的函數
CryptoAPI體系主要由以下幾部分組成:
基本加密函數、證書編碼與解碼函數、證書存儲函數、簡化信息處理函數、底層信息處理函數。
1.2.1 基本加密函數
服務提供者函數
| 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 |
校驗一個數字簽名 |
1.2.2 證書和證書庫函數
這組函數是管理、使用和取得證書、證書撤銷列表和證書信任列表。
證書庫函數:一個用戶站點可以收集許多證書。這些證書是為這個站點的用戶所使用的,證書描述了這個用戶的具體身份。對於每個人,可能有一個以上的證書。證書庫和其相關的函數提供了對庫獲得、枚舉、驗證和使用證書庫里的信息。
| 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 屬性 |
1.2.3 證書驗證函數
證書驗證是通過CTL 和證書列表進行的.
使用CTL的函數
| CertVerifyCTLUsage |
驗證CTL 用法 |
| CryptMsgEncodeAndSignCTL |
編碼和驗證CTL |
| CryptMsgGetAndVerifySigner |
從一個消息中獲得和驗證CTL |
| CryptMsgSignCTL |
對包含CTL 的消息進行簽名 |
證書鏈驗證函數
| CertCreateCertificateChainEngine |
為應用程序創建一個新的非卻省的鏈引擎 |
| CertCreateCTLEntryFromCertificateContextProperties |
創建一個CTL 入口 |
| CertDuplicateCertificateChain |
通過增加引用計數來復制證書鏈 |
| CertFindChainInStore |
在證書庫里查找證書鏈 |
| CertFreeCertificateChain |
釋放證書鏈 |
| CertFreeCertificateChainEngine |
釋放證書鏈引擎 |
| CertGetCertificateChain |
從最后一個證書建立一個上下文鏈表 |
| CertSetCertificateContextPropertiesFromCTLEntry |
通過CTL 入口屬性來設置證書上下文的屬性 |
| CertIsValidCRLForCertificate |
通過檢查CRL 來確定CRL 是否包括指定被撤銷的證書 |
| CertVerifyCertificateChainPolicy |
通過檢查證書鏈來確定它的完整性 |
1.2.4 消息函數
CryptoAPI 消息函數包括兩組:低級消息函數和簡化消息函數。
低級消息函數直接和PKCS#7 消息工作。這些函數對傳輸的PKCS#7 數據進行編碼,對接收到的PKCS#7 數據進行解碼,並且對接收到的消息進行解密和驗證。
簡化消息函數是比較高級的函數,是對幾個低級消息函數和證書函數的封裝,用來執行指定任務。這些函數在完成一個任務時,減少了函數調用的數量,因此簡化了CryptoAPI的使用。
低級消息函數
| 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 |
驗證一個簽名消息 |
1.2.5 輔助函數
數據管理函數
| 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 屬性 |
OID 支持函數
| CryptEnumOIDFuction |
枚舉由編碼類型、函數名和OID 指定注冊的OID 函數 |
| CryptEnumOIDInfo |
枚舉注冊的OID 信息 |
| CryptEnumOIDInfo |
使用指定的密鑰和組查找OID 信息 |
| CryptFreeOIDFuctionAddress |
釋放OID 函數地址句柄 |
| CryptGetDefaultOIDDllList |
對於指定的函數結合和類型獲得卻省注冊的DLL 入口 |
| CryptGetDefaultOIDFuctionAddress |
獲得已安裝的第一次或下一個卻省函數或者加載包含卻省函數的DLL |
| CryptGetOIDFuctionAddress |
搜索匹配指定編碼類型和OID 函數列表,如果沒有找到,就查找注冊表 |
| CryptGetOIDFuctionValue |
獲得指定編碼類型、函數名稱和OID 的值 |
| CryptInitOIDFuctionSet |
初始化OID 函數集合的句柄 |
| CryptInstallOIDFuctionAddress |
安裝可調用的OID 函數地址集合 |
| CryptRegisterDefaultOIDFuction |
注冊包含卻省函數的DLL |
| CryptRegisterOIDFuction |
注冊包含指定函數的DLL |
| CryptRegisterOIDInfo |
注冊由CRYPT_OID_INFO 指定的OID 信息 |
| CryptSetOIDFuctionValue |
設置編碼類型、函數名稱等的值 |
| CryptUnregisterDefaultOIDFunction |
卸載包含卻省函數的DLL |
| CryptUnregisterOIDFuction |
卸載包含函數的DLL |
| CryptUnregisterOIDInfo |
卸載指定OID 的信息 |
遠程對象恢復函數
| CryptGetObjectUrl |
從證書、CTL 或CRL 中取得遠程對象的URL |
| CryptRetrieveObjectByUrl |
由URL 指定位置恢復PKI 對象 |
PFX 函數
| PFXExportCertStore |
從證書庫中導出證書或證書和私鑰 |
| PFXExportCertStoreEx |
從證書庫中導出證書或證書和私鑰 |
| PFXImportCertStore |
從PFX BLOB 導入到指定證書庫 |
| PFXIsPFXBlob |
把外層BLOB 像pfx 包那樣解碼 |
| PFXVerifyPassword |
把外層BLOB 像pfx 包那樣解碼,並且用指定口令解密 |
2 PKCS#11
加密令牌接口標准PKCS#11由RSA Security制定,定義了加密令牌的本機編程接口,例如硬件加密加速器和智能卡。使用JCA和JCE API的現有應用程序可以使用PKCS#11提供程序訪問本機PKCS#11令牌。無需修改應用程序。唯一的要求是正確配置提供程序。
2.1 PKCS#11
在密碼系統中,PKCS#11是公鑰加密標准(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA實驗室(RSA Laboratories)發布,它為加密令牌定義了一組平台無關的API ,如硬件安全模塊和智能卡。 PKCS#11稱為Cyptoki,定義了一套獨立於技術的程序設計接口,USBKey安全應用需要實現的接口。
2.2 PKCS#11包含的函數
2.2.1 通用函數
| C_Initialize | Cryptoki初始化函數 |
| C_Finalize | 結束Cryptoki的操作 |
| C_GetInfo | 獲取C_Finalize的信息 |
| C_GetFunctionList | 獲取函數列表指針 |
2.2.2 Slot/Token 管理函數
| C_GetSlotList | 獲取Slot的列表 |
| C_GetSlotInfo | 獲取Slot的信息 |
| C_GetTokenInfo | 獲取TOKEN的信息 |
| C_WaitForSlotEvent | 等待Slot的事件發生 |
| C_GetMechanismList | 獲取機制列表 |
| C_GetMechanismInfo | 獲取機制信息 |
| C_InitToken | 初始化Token |
| C_SetPIN | 設定PIN |
| C_InitPIN | 初始化PIN |
2.2.3 會話管理函數
| C_OpenSession | 打開會話 |
| C_CloseSession | 關閉會話 |
| C_CloseAllSessions | 關閉所有會話 |
| C_GetSessionInfo | 獲取會話信息 |
| C_GetOperationState | 獲取操作狀態 |
| C_SetOperationState | 設定操作狀態 |
| C_Login | 登錄 |
| C_Logout | 退出登錄 |
2.2.4 對象管理函數
| C_CreateObject | 創建對象 |
| C_CopyObject | 拷貝對象 |
| C_DestroyObject | 刪除對象 |
| C_GetObjectSize | 獲取對象大小 |
| C_GetAttributeValue | 獲取屬性值 |
| C_SetAttributeValue | 設定屬性值 |
| C_FindObjectInit | 查看對象的初始化操作 |
| C_FindObjects | 查找對象 |
| C_FindObjectsFinal | 結束查找對象的操作 |
2.2.5 加密函數
| C_EncryptInit | 加密初始化 |
| C_Encrypt | 加密操作 |
| C_EncryptUpdate | 加密操作 |
| C_EncryptFinal | 結束加密的操作 |
2.2.6 解密函數
| C_DecryptInit | 初始化 |
| C_Decrypt | 解密操作 |
| C_DecryptUpdate | 解密操作 |
| C_DecryptFinal | 結束加密的操作 |
2.2.7 摘要函數
| C_DigestInit | 摘要初始化 |
| C_Digest | 摘要 |
| C_DigestUpdate | 摘要 |
| C_DigestKey | 對KEY進行摘要 |
| C_DigestFinal | 結束摘要操作 |
2.2.8 簽名函數
| C_SignInit | 簽名初始化 |
| C_Sign | 簽名 |
| C_SignUpdate | 簽名 |
| C_SignFinal | 結束簽名操作 |
| C_SignRecoverInit | 可恢復簽名的初始化 |
| C_SignRecover | 可恢復簽名的操作 |
2.2.9 校驗函數
| C_VerifyInit | 校驗初始化 |
| C_Verify | 校驗 |
| C_VerifyUpdate | 校驗 |
| C_VerifyFinal | 結束校驗操作 |
| C_VerifyRecoverInit | 可恢復校驗操作初始化 |
| C_VerifyRecover | 可恢復校驗 |
2.2.10 KEY管理函數
| C_GenerateKey | 生成KEY |
| C_GenerateKeyPair | 生成公私鑰對 |
| C_WrapKey | 對KEY進行打包 |
| C_UnwrapKey | 對KEY進行解包 |
| C_DeriveKey |
派生KEY |
2.2.11 隨機數產生函數
| C_SeedRandom | 設定隨機種子 |
| C_GenerateRandom | 生成隨機數 |
2.2.12 雙效加密函數
| C_DigestEncryptUpdate |
繼續類似的多部分摘要和加密操作 |
| C_DecryptDigestUpdate |
繼續類似的多部分解密和摘要操作 |
| C_SignEncryptUpdate |
繼續類似的多部分簽名和加密操作 |
| C_DecryptVerifyUpdate |
繼續類似的多部分解密和鑒定操作 |
2.2.13 並行功能管理函數
| C_GetFunctionStatus |
已廢棄函數,返回CKR_FUNCTION_NOT_PARALLEL |
| C_CancelFunction |
已廢棄函數,返回CKR_FUNCTION_NOT_PARALLEL |
3 GMT 0016-2012 智能密碼鑰匙密碼應用接口規范
規定了公鑰密碼基礎設施應用技術體系下服務類密碼設備的應用接口標准。
適用於服務類密碼設備的研制、使用,以及基於該類密碼設備的應用開發,也可用於指導該類密碼設備的檢測。
3.1 GMT 0016-2012
調用頭文件以及接口進行使用
3.2 GMT 0016-2012包含的函數
3.2.1 設備管理類函數
| SDF_OpenDevice | 打開設備 |
| SDF_CloseDevice | 關閉設備 |
| SDF_OpenSession | 創建會話 |
| SDF_CloseSession | 關閉會話 |
| SDF_GetDeviceInfo | 獲取設備信息 |
| SDF_GenerateRandom | 產生隨機數 |
| SDF_GetPrivateKeyAccessRight | 獲取私鑰使用權限 |
| SDF_ReleasePrivateKeyAccessRight | 釋放私鑰獲取權限 |
3.2.2 密鑰管理類函數
| SDF_ExportSignPublicKey_RSA | 導出RSA簽名公鑰 |
| SDF_ExportEncPublicKey_RSA | 導出RSA加密公鑰 |
| SDF_GenerateKeyPair_RSA | 產生RSA非對稱密鑰對並輸出 |
| SDF_GenerateKeyWithIPK_RSA | 生成會話密鑰並用內部 RSA公鑰加密輸出 |
| SDF_GenerateKeyWithEPK_RSA | 生成會話密鑰並用外部RSA公鑰加密輸出 |
| SDF_ImportKeyWithISK_RSA | 導入會話密鑰並用內部RSA私鑰解密 |
| SDF_ExchangeDigitEnvelopeIaseOnRSAH | 基於RSA算法的數字信封轉換 |
| SDF_ExportSignPublicKey_ECC | 導出ECC簽名公鑰 |
| SDF_ExportEncPublicKey_ECC | 導出ECC加密公鑰 |
| SDF_GenerateKeyPair_ECC | 產生ECC非對稱密鑰對並輸出 |
| SDF_GenerateKeyWithIPK_ECC | 生成會話密鑰並用內部ECC公鑰加密輸出 |
| SDF_GenerateKeyWithEPK_ECC | 生成會話密鑰並用外部ECC公鑰加密輸出 |
| SDF_ImportKeyWithISKECC | 導入會話密鑰並用內部 ECC私鑰解密 |
| SDF_GenerateAgreementDataWithECC | 生成密鑰協商參數並輸出 |
| SDF_GenerateKeyWihECC | 計算會話密鑰 |
| SDF_GenerateAgreermentDataAndKeyWithECC | 產生協商數據並計算會話密鑰 |
| SDF_ExchangeDigitEnvelopeBaseOnECC | 基於ECC算法的數字信封轉換 |
| SDF_GenerateKeyWithKEK | 生成會話密鑰並用密鑰加密密鑰加密輸出 |
| SDF_ImportKeyWithKEK | SDF_GenerateKey WitlKEK導入會話密鑰並用密鑰加密密鑰解密 |
| SDF_DestroyKey | 銷毀會話密鑰 |
3.2.3 非對稱算法運算類函數
| SDF_ExternalPublicKeyOperation_RSA | 外部公鑰RSA運算 |
| SDF_InternalPublicKeyOperation_RSA | 內部公鑰RSA運算 |
| SDF_InternalPrivateKeyOperation_RSA | 內部私鑰RSA運算 |
| SDF_ExternalVerify_ECC | 外部密鑰ECC驗證 |
| SDF_InternalSign_ECC | 內部密鑰ECC簽名 |
| SDF_InternalVerify_ECC | 內部密鑰ECC驗證 |
| SDFExternalEncrypt_ECC | 外部密鑰EC加密 |
3.2.4 對稱算法運算類函數
| SDF_ Encrypt | 對稱加密 |
| SDF_Dccrypt | 對稱解密 |
| SDF_CalculateMAC | 計算MAC |
3.2.5 雜湊運算類函數
| SDF HashInit | 雜湊運算初始化 |
| SDF HashUpdate | 多包雜湊運算 |
| SDF_HashFinal | 雜湊運算結束 |
3.2.6 用戶文件操作類函數
| SDF_CreateFile | 創建文件 |
| SDF_ReadFile | 讀取文件 |
| SDF_WriteFile | 寫文件 |
| SDF_DeleteFile | 刪除文件 |
4.以龍脈GM3000Key為例,寫出調用不同接口的代碼
4.1 調用Crypto API
