核心模塊
SDK 包含以下兩個核心模塊:
TrustRoot
TrustRoot
是 SDK 的核心驗證模塊,負責驗證可信計算應用的身份和計算行為。當初始化配置信息時,其中的信任根信息會注入到TrustRoot
模塊中。
信任根信息包括 IAS 根證書IASCACert
、可信區(qū)代碼度量值MrEnclave
、可信區(qū)代碼簽發(fā)者公鑰度量值MrSigner
,在您首次初始化客戶端時注入。您可以設置信任等級 TrustLevel
,根據(jù)自身需求選擇驗證級別。
信任等級為 0 時,不校驗 MYTF 身份信息。
信任等級為 1 時,校驗 MrSigner,即驗證該 MYTF 為螞蟻區(qū)塊鏈簽發(fā)的可信計算引擎。
信任等級為 2 時,校驗 MrEnclave,即驗證該 MYTF 可信區(qū)代碼的度量值。
驗證 MYTF 是否可信,實際上是驗證 IAS Intel 遠程驗證服務對 MYTF 的遠程認證報告。Remote Attestation
遠程認證流程會驗證 MYTF 是否為正確的可信執(zhí)行代碼并生成遠程認證報告 AVR。報告中包括 MYTF 代碼信息和所在硬件信息。SDK 在初始化時,會自動獲取 MYTF 的 AVR 報告,并對該 MYTF 進行核身校驗。
參數(shù) | 類型 | 說明 |
trustedMrEnclave | String | 用戶所信任的代碼度量值 |
trustedMrSigner | String | 用戶所信任的 MYTF 簽發(fā)者公鑰度量值 |
trustedIASCert | String | IAS CA 根證書 |
domainName | String | 域名 |
regionName | String | 分區(qū)名 |
使用示例
// 以下場景涉及到三方,第三方服務平臺為用戶提供隱私保護的可信計算服務,將業(yè)務邏輯寫成TAPP,安裝到 C3S 平臺中
// 第三方服務平臺安裝 TAPP 后獲取 MYTFInfo 和 TAPPInfo
MYTFInfo mytfInfo = restClient.getMYTFInfo();
TappInfo tappInfo = restClient.getTappInfo(tappId, tappVersion);
// 第三方服務平臺從 MYTFInfo 和 TAPPInfo 中提取證明并將證明提供給第三方服務平臺的用戶
String providedMYTFProfile = mytfInfo.getMytfProfile();
String providedTAPPProfile = tappInfo.getTappProfile();
// 第三方服務平臺的用戶本地設置信任根和驗證方式
TrustRoot userTrustRoot = new TrustRoot(1, IAS_CA_CERT, MYTF_MRSIGNER, MYTF_MRENCLAVE);
// 第三方服務平臺的用戶驗證服務平臺提供的 MYTFProfile,檢查 MYTFInfo 是否正確以確定第三方服務平臺使用的是正確的 C3S 服務
Assert.assertTrue(userTrustRoot.loadMYTFInfo(providedMYTFProfile));
// 第三方服務平臺的用戶驗證服務平臺提供的 TAPPProfile,檢查 tappInfo 是否正確以確定第三方服務平臺使用的是正確的 TAPP
TappInfo tappInfo1 = userTrustRoot.getTappInfo(providedTAPPProfile);
KeyStore
KeyStore
是 SDK 的密鑰管理模塊,負責管理可信計算過程中所需要的密鑰,并提供加密、解密、簽名、驗簽等接口。當用戶初始化設置配置信息時,其中的密鑰信息會注入到KeyStore
模塊中。
參數(shù) | 類型 | 說明 |
accessKeypair | UserKeyPair | RSA 用戶訪問公私鑰對 |
identityKeypair | ECCKeypair | ECC 用戶身份公私鑰對 |
secretKeypair | Keypair | ECC 用戶隱私公私鑰對 |
使用示例
// 獲取客戶端中的 KeyStore
KeyStore keyStore = restClient.getKeyStore();
// 獲取用戶密鑰
UserKeyPair userAccessKeyPair = restClient.getKeyStore().getAccessKeypair();
UserKeyPair userIdentityKeyPair = restClient.getKeyStore().getIdentityKeypair();
UserKeyPair userSecretKeyPair = restClient.getKeyStore().getSecretKeypair();
// 通過用戶隱私密鑰,構(gòu)造并打開 tappEnvelope
String plainData = "this is test for envelopeOpen & envelopeBuild";
byte[] tappEnvelope = restClient.getKeyStore().buildTappEnvelope(tappInfo, plainData.getBytes());
byte[] envelopeRecoverPlainData = restClient.getKeyStore().openTappEnvelope(tappInfo, tappEnvelope);
// 通過用戶訪問密鑰,進行RSA 簽名、驗簽
String plainData2 = "this is test for RSASign & RSAVerify";
byte[] sig = restClient.getKeyStore().accessKeySign(plainData2.getBytes());
Assert.assertTrue(restClient.getKeyStore().accessKeyVerify(plainData2.getBytes(), sig));