PKCS#11 in OP-TEE
目錄
- 1、PCCS#11簡介
- 2、PKCS#11 specifications
- 3、Achievements
- 4、編譯和運行
- 5、libckteec
1、PCCS#11簡介
PKCS#11標準定義了獨立于平臺的的密碼令牌API(如硬件安全模塊(HSM)和智能卡),并將API本身命名為“Cryptoki”(來自“加密令牌接口”,發音為“crypto-key” 。 但是“PKCS#11”通常用于指代API以及定義它的標準)。 API定義了最常用的加密對像類型(RSA密鑰,X.509證書,DES / 三重DES密鑰等)以及使用,創建/生成,修改和刪除這些對象所需的所有功能。
在密碼系統中,PKCS#11是公鑰加密標準(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA實驗室(RSA Laboratories)發布[1],它為加密令牌定義了一組平臺無關的API ,如硬件安全模塊和智能卡。
由于沒有一個真正的標準加密令牌,這個API已經發展成為一個通用的加密令牌的抽象層。 PKCS#11 API定義最常用的加密對象類型( RSA密鑰,X.509證書,DES /三重DES密鑰等)和所有需要使用的功能,創建/生成,修改和刪除這些對象。注意:pkcs#11只提供了接口的定義, 不包括接口的實現,一般接口的實現是由設備提供商提供的,如usbkey的生產廠商會提供 符合PKCS#11接口標準的API的實現。這樣你只要通過接口調用API函數即可實現其功能
廢那么多話干啥!!! PKCS#11就是一個標準,一組API,主要應用場景是智能卡、HSM
2、PKCS#11 specifications
pkcs11-base-v2.40-errata01-os.
pkcs11-base-v3.0
一些標準package也都支持PKCS#11:
| OpenSSH | github.com/OpenSC/OpenSC/wiki/OpenSSH-and-smart-cards-PKCS%2311fossies.org/linux/openssh/ssh-pkcs11-helper.8 | |
| gnuTLS | www.gnutls.org/reference/gnutls-pkcs11.html | |
| OpenSSL | No PKCS#11 engine in native OpenSSL. OpenSC proposes one (RedHat, Ubuntu, …) | |
| python | pypi.org/project/python-pkcs11/ | |
| AWS | Use PKCS#11 for the cryptographic operations control and alternate user authentication | |
| LUKS | 0pointer.net/blog/unlocking-luks2-volumes-with-tpm2-fido2-pkcs11-security-hardware-on-systemd-248.html | |
| OP-TEE | — |
OP-TEE & GPD TEE specifications
(1)、OP-TEE is an enclave that
- 管理隔離的可信應用程序(PKCS#11 令牌不是唯一的安全服務)
- 將安全對象作為安全操作的密鑰進行管理
- 利用平臺功能(硬件加速,…)
- 支持 Arm7/v8 Cortex-A CPU,正在開發 RiscV
- 主要是 2 個條款 BSD 許可條款
- https://github.com/OP-TEE
2014年開始,2018年開始3.x.0系列,最新是3.12.0
(2)、OP-TEE 基于 GPD TEE API
- 不向客戶端公開對象/加密 API 函數
- 客戶端向受信任的應用程序打開/關閉會話。 并調用命令(4 個參數)
- 2017 年,Linaro 對 HKG18-402 上展示的 pkcs11 TA 進行了調研
(3)、Regression tests: pkcs11 testsuite in OP-TEE xtest, hosted in optee_test.git
(4)、參考代碼:
TA:optee_os/ta/pkcs11/src/
CA:optee_client/libckteec/src/
3、Achievements
- 插槽和令牌發現(Slot and token)
- 用戶會話管理
- 用戶認證(PIN & Linux ACL)
- 對象(會話和永久)創建和生成(AES 密鑰和通用機密)
- 密鑰推導(AES 加密)
- 加密(AES:CBC & ECB)
- MAC 計算(SHA*_HMAC)
- 摘要 (SHA*)
- 隨機數生成
- 在 OP-TEE CI 中運行的自制 pkcs11 回歸測試
4、編譯和運行
For Qemu (default.xml)
make run CFG_PKCS11_TA=y
For qemu_v8.xml
make run CFG_PKCS11_TA=y CFG_USER_TA_TARGET_pkcs11=ta_arm64
運行:
sh> pkcs11-tool --list-token-slots
5、libckteec
- 一個Cryptoki API函數對應一個pkcs11 TA command ID
- 序列化客戶端參數以發送給 TA(屬性列表,傳遞的各種結構)
- 反序列化從 TA 發回的數據(檢索對象屬性)
- 不需要復雜的處理:一個精簡的 API 包裝器
在 3.13.0 之前,幾乎所有主要 API 函數都在 pkcs11 TA API支持
C_Initialize() C_Finalize() C_GetInfo() C_GetFunctionList() C_GetSlotList() C_GetSlotInfo() C_GetTokenInfo() C_GetMechanismList() C_GetMechanismInfo() C_InitToken() C_InitPIN() C_SetPIN() C_OpenSession() C_CloseSession() C_CloseAllSessions() C_GetSessionInfo() CK_C_Login() 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_VerifyInit() C_Verify() C_VerifyUpdate() C_VerifyFinal() C_GenerateKey() C_GenerateKeyPair() C_WrapKey() C_UnwrapKey() C_DeriveKey() C_SeedRandom() C_GenerateRandom()但仍有一點點還未支持
C_GetOperationState() C_SetOperationState() C_SignRecoverInit() C_SignRecover() C_VerifyRecoverInit() C_VerifyRecover() C_DigestEncryptUpdate() C_DecryptDigestUpdate() C_SignEncryptUpdate() C_DecryptVerifyUpdate() C_GetFunctionStatus() C_CancelFunction() C_WaitForSlotEvent()總結
以上是生活随笔為你收集整理的PKCS#11 in OP-TEE的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASLR in optee
- 下一篇: optee HSM的实现