TPM(Trusted Platform Module)是一種硬體安全晶片,其主要功能是提供安全的密碼和金鑰管理,並支持硬體層面的安全功能,以確保計算機系統的安全性。TPM 主要用於提供硬體級的安全功能,例如保護密碼、存儲敏感數據、驗證系統的完整性等。 TPM(Trusted Platform Module)在計算機安全方面扮演關鍵角色,主要有以下功能。
最常見的 TPM 功能是用於系統完整性測量及金鑰的建立與使用。 在系統開機程序期間,可以測量載入的開機程式碼 (包括韌體和作業系統元件) 並記錄在 TPM 中。 完整性測量可用來證明系統的啟動情況,以及確保只有在使用正確軟體來進行系統開機的情況下,才會使用 TPM 型金鑰。
TPM 可以分為三種類型
AMD Ryzen 系統配置可能會間歇性地在位於主機板上的 SPI 閃存記憶體(SPIROM)中執行擴展 fTPM 相關記憶體事務,這可能導致系統交互或響應暫時暫停,直到事務完成為止。
TCG 在 TPM1.2 的設計中第一次嘗試解決以下產業界常見的問題:
TPM2.0 在 1.2 版本的基礎上又增加了更多:
Cryptography Subsystem 實現 TPM 的加密功能。它可以由 Command Parsing module、Authorization Subsystem 或 Command Execution module呼叫。 TPM 以常規方式採用常規加密操作。這些操作包括:
Hash(哈希或散列)算法,又常被稱為指紋(fingerprint)或摘要(digest)算法,是非常基礎也非常重要的一類算法。可以將任意長度的二進制明文串映射為較短的(通常是固定長度的)二進制串(Hash 值),並且不同的明文很難映射為相同的 Hash 值。
顧名思義,非對稱加密中,加密密鑰和解密密鑰是不同的,分別被稱為公鑰(Public Key)和私鑰(Private Key)。私鑰一般通過隨機數算法生成,公鑰可以根據私鑰生成。 其中,公鑰一般是公開的,他人可獲取的;私鑰則是個人持有並且要嚴密保護,不能被他人獲取。
對稱加密算法,顧名思義,加密和解密過程的密鑰是相同的。該類算法優點是加解密效率(速度快,空間佔用小)和加密強度都很高。
Block Cipher Modes 分組加密(英語:Block cipher),又稱分塊加密或塊密碼,是一種對稱金鑰演算法。 它將明文分成多個等長的模組(block),使用確定的演算法和對稱金鑰對每組分別加密解密,對於如何切分、加密對應不同的工作模式,針對 AES 共有 5 種模式。
Mode | Name | - |
---|---|---|
ECB | Electronic Code Book Mode | 將明文按分組大小切分,然後用同樣的金鑰正常加密切分好的明文分組。 |
CBC | Cipher Block Chaining Mode | 每個明文塊先與前一個密文塊進行互斥或後,再進行加密。為了保證每條訊息的唯一性,在第一個塊中需要使用初始化向量IV。 |
CFB | Cipher Feedback Mode | 與CBC模式類似,但不同的地方在於,CFB模式先生成密碼流字典,然後用密碼字典與明文進行異或操作並最終生成密文。 |
OFB | Output Feedback Mode | OFB模式與CFB模式不同的地方是:生成字典的時候會採用明文參與運算,CFB採用的是密文。 |
CTR | Counter Mode | CTR模式同樣會產生流密碼字典,但同是會引入一個計數,以保證任意長時間均不會產生重複輸出。 |
當選擇對稱分組密碼作為與會話關聯的加密演算法時,將使用 CFB。 當用於參數加密時,金鑰和 Initialization Vector (IV) 是從每個會話金鑰派生的,因此從統計角度來看,重複使用相同的金鑰和 IV 是不太可能的。當物件未儲存在屏蔽位置時,CFB 也用於物件敏感區域的對稱加密。 以這種方式使用時,密鑰和 IV 源自於 secret。 在某些情況下,IV 設定為零。
XOR混淆類似於計數器模式(CTR)塊加密,但它使用一個密鑰派生函數(KDF)作為偽隨機函數,而不是對稱塊加密。XOR混淆將調用方與TPM共享的算法數量減少到一個(哈希),以便以某種程度的保密性和身份驗證使用TPM。該規範中的XOR方案與TPM 1.2中使用的方案不同:它使用不同的公式將輸入輸入到哈希函數中。 TPM2.0 所指的 XOR obfuscation 如下所示:
- data: 包含要混淆的資料的可變大小的緩衝區
- hashAlg: KDF 中使用的雜湊演算法
- key: 包含金鑰的可變大小的值
- contextU: 一個可變大小的值,用於限定操作的一方(通常是隨機數值)
- contextV: 一個可變大小的值,用於限定操作的一方(通常是隨機數值)
XOR() function 會使用 KDFa() 產生 mask,定義如下:
- 然後將 mask 的 8 Bytes 與
data.buffer
的 8 Bytes 進行 XOR。
「擴展」操作用於對摘要值進行增量更新。它對於更新PCR、auditing 和構建 policy 非常有用,也用於擴展具 TPMA_NV_EXTEND
屬性的 NV Index。擴展操作使用 hash 將新數據與現有摘要結合。其表示法為:
- : Extend 操作後的摘要值 (例如 PCR)
- : Hash 函數(例如與特定 PCR bank 相關的雜湊演算法)
- : Extend 操作前的摘要值
- : 可變數量的資料八位元組,與 Hash 產生 Extend 結果
AES也是一種密碼強度很高的對稱密碼演算法,但是如果需要商用的話要向NIST支付授權費用?
密鑰產生產生兩種不同類型的密鑰,
TPM 使用基於雜湊的函數來產生用於多種目的的金鑰。此規範使用兩種不同的方案:一種用於 ECDH,另一種用於 KDF 的所有其他用途。ECDH KDF 來自 SP800-56A。計數器模式 KDF 來自 SP800-108 使用 HMAC 作為偽隨機函數 pseudo-random function (PRF)。它在規範中被稱為 。另外有些演算法具有已知的弱密鑰。如果產生了這樣的金鑰,則必須將其丟棄,並透過 KDF 的另一次迭代重新開始產生新密鑰。
用於除 ECDH 之外,所有需要 KDF 的情況。 使用 SP800-108 的計數器模式,以 HMAC 作為 PRF,根據 SP800-108,規範要求使用此 KDF,它使用對 KDFa() 的函數引用。
- : KDF 內循環的第 迭代
- : HMAC 演算法
- : the secret key
- : 從 1 開始迭代的 32-bit counter
- : 一個八位元組流,指示此 KDF 產生的金鑰的使用
- : 當不存在或的最後一個八位元組不為零時添加
- : 與派生金鑰材料相關的資訊的二進位字串
- : 32-bit值,指示要從 KDF 傳回的位數
- : KDF 中 HMAC 中使用的
TPM_ALG_ID
- : 用作 的可變大小值
- : 用作 的可變大小值
- : 與 contextV 連接用作 的可變大小值
- : 與 contextU 連接用作 的可變大小值
- : 用作 的 32-bit值
用於 ECDH,根據 SP800-56A 為受 ECC 保護的物件產生對稱加密金鑰,使用的 KDF 是“Concatenation Key Derivation Function”,
HMAC(Hash Message Authentication Code),通過特別計算方式之後產生的訊息鑑別碼(MAC),使用密碼雜湊函數,同時結合一個加密金鑰。它可以用來保證資料的完整性,同時可以用來作某個訊息的身分驗證,另外 HMAC 也用於產生密鑰。
HMAC 有時被稱為對稱簽章,因為它們的運作方式類似於數位簽章,但使用單一金鑰進行簽署和驗證。
: XOR
- Key(金鑰)、test(文本)、Hash(SHA家族的任何一個Hash)
- opad跟ipad(填充)
- opad :0x5c5c5c…5c5c。
- ipad :0x363636…3636。
TPM 可以使用非對稱或對稱演算法進行簽署。簽章方法取決於金鑰的類型。對於非對稱演算法,簽章方法取決於演算法(RSA 或 ECC)。對於對稱簽章,定義了 HMAC 和 SMAC 簽章。 TPM 只對經 TPM 運算的消息進行簽署,任何 TPM 產生的資料都有標頭 'TPM_GENERATED_VALUE',當 TPM 進行簽署時會去確認 'TPM_GENERATED_VALUE' 。
TPM2_VerifySignature()
對簽章進行認證TPM_GENERATED_VALUE
開頭的。Tickets 允許將這個狀態存儲在 TPM 之外的某個地方,當稍後將摘要提供給 TPM 進行簽名時,提供 Tickets,使 TPM 能夠驗證待簽名的摘要是安全的。TPMT_TK_CREATION
: 由TPM2_Create()
或TPM2_CreatePrimary()
時生成,在 TPM2_CertifyCreation()
中使用,以便 TPM 能夠證明它創建了一個特定對象以及在創建對象時存在的環境參數(PCR)。這樣可以避免將創建數據的摘要作為對象數據結構的永久部分。TPMT_TK_VERIFIED
: 由TPM2_VerifySignature()
生成,並被TPM2_PolicyAuthorize()
使用。如果簽名是由非對稱密鑰簽署的,那麼簽名驗證可能需要花費時間。如果同一授權將被多次使用(例如用於TPM2_PolicyAuthorize()
的授權),那麼將非對稱授權轉換為使用對稱加密的方式可能會有性能上的優勢,因為對稱密加密通常更快。此 Tickets 是對稱等效授權。TPMT_TK_AUTH
: 由TPM2_PolicySigned()
或TPM2_PolicySecret()
生成,並在TPM2_PolicyTicket()
中使用。策略授權可以與特定的策略會話關聯,或者允許在任何策略中使用。當它可以在任何策略中使用時,它會有一個到期時間(可以是未來的任意時間)。長期有效的授權可能在TPM2_PolicySigned()/TPM2_PolicySecret()
中給出,並生成一個 Tickets ,用於驗證授權參數(已授權內容)和未來到期的授權時間。然後,此票證由TPM2_PolicyTicket()
處理,在 Tickets 到期之前,將對策略摘要計算具有與原始授權相同的效果。TPMT_TK_HASHCHECK
: 用於指示外部數據的摘要是否安全可簽名使用受限制的簽名密鑰。受限制的簽名密鑰只能對由 TPM 生成的摘要進行簽名。如果摘要是從外部提供的數據生成的,則需要有一個指示,表明該數據的開頭並不與在TPM內部生成的數據使用的第一個八位組相同。這可以防止對存證數據的“偽造”。此票證用於提供證據,表明TPM檢查了摘要中使用的數據並且可以安全地進行簽名。假設外部數據是“安全的”,則此類票證由TPM2_Hash()
或TPM2_SequenceComplete()
生成並由TPM2_Sign()
使用。NULL Ticket
: 當回應具有一個 Ticket,但未生成任何 Ticket 時,將生成一個 NULL Ticket。例如使用 TPM2_PolicySecret()
指定過期時間為零,這不會生成 Ticket,因為過期時間為零,授權將立即過期,在這種情況下 TPM 將返回一個 NULL Ticket。當命令需要一個 Ticket,但沒有可用的 Ticket 數據時,也可以將 NULL Ticket 用作輸入參數。RNG 是 TPM 中的亂數產生器。 TPM 在金鑰產生中使用隨機值作為隨機數,並在簽章中使用隨機值 RNG Module 通常包含以下內容
TPM 中的 entropy source 是 entropy collector。顧名思義,熵收集器從熵源收集熵並消除偏差。這些來源可能包括噪音、時鐘變化、空氣流動等事件。 mixing function 可以用偽隨機數產生器(PRNG)來實現。 PRNG 可能會從非隨機輸入(例如計數器)中產生明顯隨機的數字。 TPM 應為內部功能的每次使用提供足夠的隨機性,每次呼叫時應提供 32 Octet 的隨機性。
TPM_ALG_SHA256
、TPM_ALG_SHA384
。對稱和非對稱加密的演算法標識符標識家族,例如RSA、ECC、AES
等。對於這些演算法,需要補充資訊來定義參數如 TPM_ALG_RSA
、TPM_ALG_AES
。數據在斷電會消失,但不保證一定消失。
TPM 就可以用來保存系統啟動過程中系統狀態測量值,PCR 就用來實現這個功能,PCR 中儲存了由軟體計算的一系列 Hash 值,TPM 可以透過使用一個特定的私鑰來簽署這些測量值,然後向外部報告。PCR 有一個單向儲存的特性可以保證內容不被篡改(HashExtend)。 因此,如果PCR中的值與預期的可信值相同,那麼這些值就被認為是可信的。 PCR 可以用於認證,創建的同時讓它們的授權配置與PCR某一個值綁定,只有PCR的值是某一個預期的狀態時才可以使用它們,例如:
TPM 中的 NVRAM 可以配置為單獨控制讀取和寫入功能,這意味著可以向用戶提供某些數據,而不必擔心這些數據會被意外或惡意刪除。具訪問控制的 NVRAM 有許多好處,它可以儲存在機器關閉時不可用的金鑰;比使用公鑰/私鑰對解密更快地存取數據,並提系統不同部分之間傳遞訊息的機制。系統在啟動初期沒辦法存取硬碟,這時 NVRAM 就可以用來儲存這個時候必須要使用的金鑰。 一個明顯的例子是,系統在啟動時在存取自加密硬碟之前必須輸入才密碼能讀寫。
具備NVRAM能夠提供以下功能:
TPM2_PolicySigned()
,則可能需要非對稱演算法。此模組結合平台電源狀態來管理 TPM 電源狀態。TPM 僅支援 ON 和 OFF 電源狀態。任何需要重設 RTM 的系統電源轉換也會導致 TPM 重設 (_TPM_Init),也會導致 RTM 重置。
In most cases, the RTM will be a host CPU.
my_random.c code gcc -o my_random my_random.c -ltss2-esys -ltss2-rc
TPM 2.0 Library , PC Client , PC Client Device Driver Design
tpm2-tools , TPM2-TSS , m$_tpm2.0 , Software TPM Emulator , tpm-js
wiki , Linux 使用 TPM 2.0 產生真實隨機亂數教學與範例 , kernel TPM doc , 初探 TPM 2.0 , TPM 2.0规范解读系列 , TPM分析笔记 , TPM学习笔记 , PTP协议-1 , PTP协议-2 , 檢測TPM , kernel , Using the tpm-elinux , 略談信賴運算(一) , 略談信賴運算(二) , 略談信賴運算(三) , 略談信賴運算(四) , 密碼學簡史 , 可信賴運算(Trusted Computing) , TPM 密钥证明 , TPM Specification Overview , A mobile and portable trusted computing platform , Secure Boot using Trusted Firmware-M , Trusted Platform Module , BIOS Chronomancy : Fixing the Core Root of Trust for Measurement , A Novel Approach for a Flexible and Secure Update of Cryptographic Engines on a Trusted Platform Module , Trusted Platforms UEFI, PI and TCG-based firmware , 基于静态可信根(SRTM)的Bitlocker的工作原理是什么? , 嵌入式設備的基本應用–TPM 2.0 , TPM2.0 Key hierarchies筆記 , TPM 2.0 裝置上的 PCR , Designing in A Designing in A Trusted Platform Module (TPM) Trusted Platform Module (TPM , TPM.dev tutorials , 【可信计算】复习篇 , 【可信计算】第五次课:可信计算规范与标准 , 【TPM2.0原理及应用指南】 1-3章 , 【TPM2.0原理及应用指南】 5、7、8章 , Research on trusted computing and its development , Advanced Trusted Platform Module (TPM) Usage , UEFI Utility to Read TPM 2.0 PCRs , 解碼測量開機記錄以追蹤 PCR 變更 , What's the difference between the endorsement key and the attestation identity key within the TPM? , UEFI安全启动 , Core Root of Trust for Measurement , 代碼範例:使用Intel® Platform Trust Technology , TPM2 Software Stack (TSS2) , The Trusted Platform Module key hierarchy , From TPM 1.2 to 2.0 and some more , Citizen Electronic Identities using TPM 2.0 , Secure the Windows boot process , BIOS Integrity Measurement Guidelines , Platform Firmware Resiliency Guidelines , TCG TRUSTED BOOT CHAIN IN EDK II , Understanding the UEFI Secure Boot Chain , Understanding UEFI Secure Boot and how it helps to secure the Windows 10 boot process , Trusted Computing Overview , A BAD DREAM: SUBVERTING TRUSTED PLATFORM MODULE WHILE YOU ARE SLEEPING , Force firmware code to be measured and attested by Secure Launch on Windows 10 , UEFI Secure Boot
TPM 2.0 Part 1: Architecture 5.2 有縮寫