Я пытаюсь найти способ использовать доверенный платформенный модуль для подписи данных с помощью закрытого ключа подтверждения (EK).
Используя образцы из библиотеки TSS.MSR в C #, мне удалось собрать небольшую программу:
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 для подписи данных и, если да, что мне нужно сделать, чтобы сделатьэто работает?