我正在尝试找到一种方法来使用 TPM 使用私有认可密钥 (EK) 对数据进行签名。
使用 TSS 中的样本。在 C# 中的 MSR 库,我能够组装一个小程序:
private void ConnectTpmAndSign()
{
// ************************************************************
// Initializes the simulated TPM.
// ************************************************************
const string DefaultSimulatorName = "127.0.0.1";
const int DefaultSimulatorPort = 2321;
var tpmDevice = new TcpTpmDevice(DefaultSimulatorName, DefaultSimulatorPort);
tpmDevice.Connect();
var tpm = new Tpm2(tpmDevice);
tpmDevice.PowerCycle();
tpm.Startup(Su.Clear);
// ****************************************************
// Extracts the public portion of the Endorsement key.
// *****************************************************
var handleEK = new TpmHandle(0x81010001);
TpmPublic EKpub = tpm._AllowErrors().ReadPublic(handleEK, out byte[] _, out byte[] _);
if (!tpm._LastCommandSucceeded())
EKpub = CreateEndorsementKey(tpm, handleEK);
// *********************************************************
// Signs the data with the TPM
// **********************************************************
byte[] dataToSign = new byte[] { 0x01, 0x02, 0x03 };
// --> Fails here <--
var signature = tpm.Sign(handleEK, dataToSign, new SigSchemeRsassa(), TpmHashCheck.Null()) as SignatureRsassa;
...
}
private static TpmPublic CreateEndorsementKey(Tpm2 tpm2, TpmHandle tpmHandle)
{
TpmHandle primary = tpm2.CreatePrimary(
new TpmHandle(TpmHandle.RhEndorsement),
new SensitiveCreate(/*SecretPin, null*/),
new TpmPublic(TpmAlgId.Sha256, ObjectAttr.FixedTPM | ObjectAttr.FixedParent | ObjectAttr.SensitiveDataOrigin | ObjectAttr.AdminWithPolicy | ObjectAttr.Restricted | ObjectAttr.Decrypt, new byte[32]
{
(byte) 131,
(byte) 113,
(byte) 151,
(byte) 103,
(byte) 68,
(byte) 132,
(byte) 179,
(byte) 248,
(byte) 26,
(byte) 144,
(byte) 204,
(byte) 141,
(byte) 70,
(byte) 165,
(byte) 215,
(byte) 36,
(byte) 253,
(byte) 82,
(byte) 215,
(byte) 110,
(byte) 6,
(byte) 82,
(byte) 11,
(byte) 100,
(byte) 242,
(byte) 161,
(byte) 218,
(byte) 27,
(byte) 51,
(byte) 20,
(byte) 105,
(byte) 170
}, (IPublicParmsUnion)new RsaParms(new SymDefObject(TpmAlgId.Aes, (ushort)128, TpmAlgId.Cfb), (IAsymSchemeUnion)new NullAsymScheme(), (ushort)2048, 0U), (IPublicIdUnion)new Tpm2bPublicKeyRsa(new byte[256])), Array.Empty<byte>(), Array.Empty<PcrSelection>(), out TpmPublic tpmPublic, out _, out _, out _);
tpm2.EvictControl(TpmHandle.RhOwner, primary, tpmHandle);
tpm2.FlushContext(primary);
return tpmPublic;
}
该程序连接 TPM 模拟器,确保创建 EK,然后要求 TPM 使用认可密钥对数据进行签名。它失败并显示以下错误:
Tpm2Lib.TpmException: 'Error {AuthUnavailable} was returned for command Sign.
Details:
[Code=TpmRc.AuthUnavailable],
[RawCode=0x12F,303]
[ErrorEntity=Unknown],
[ParmNum=0]
[ParmName=Unknown]'
问题
是否可以使用 EK 对数据进行签名,如果是,我必须执行哪些操作才能使其正常工作?
EK 不能用于对数据进行签名。EK唯一可以用于AIK注册的。
不确定您的用例。但是,如果您打算使用 EK 签名作为身份证明,则可以改用 AIK 来实现这一点。
- 生成 AIK。
- 现在使用 AIK 公共加密一些数据并要求 TPM 对其进行解密。只有生成 AIK 的 TPM 才能解密数据。