Skip to content

Commit eede95d

Browse files
Merge pull request #342 from dgarske/infineon_fw_recovery
Add Infineon firmware update recovery support
2 parents 6a5316f + 4a2e250 commit eede95d

File tree

4 files changed

+79
-42
lines changed

4 files changed

+79
-42
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,6 @@ Connection: close
874874
* Add support for Endorsement certificates (EK Credential Profile).
875875
* Update to v1.59 of specification (adding CertifyX509).
876876
* Inner wrap support for SensitiveToPrivate.
877-
* Firmware upgrade support on TPM's.
878877
* Add support for IRQ (interrupt line)
879878

880879
## Support

examples/firmware/ifx_fw_update.c

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -94,35 +94,26 @@ static const char* TPM2_IFX_GetOpModeStr(int opMode)
9494
return opModeStr;
9595
}
9696

97-
static int TPM2_IFX_PrintInfo(WOLFTPM2_DEV* dev)
97+
static void TPM2_IFX_PrintInfo(WOLFTPM2_CAPS* caps)
9898
{
99-
int rc;
100-
WOLFTPM2_CAPS caps;
101-
rc = wolfTPM2_GetCapabilities(dev, &caps);
102-
if (rc == TPM_RC_SUCCESS) {
103-
printf("Mfg %s (%d), Vendor %s, Fw %u.%u (0x%x)\n",
104-
caps.mfgStr, caps.mfg, caps.vendorStr, caps.fwVerMajor,
105-
caps.fwVerMinor, caps.fwVerVendor);
106-
printf("Operational mode: %s (0x%x)\n",
107-
TPM2_IFX_GetOpModeStr(caps.opMode), caps.opMode);
108-
printf("KeyGroupId 0x%x, FwCounter %d (%d same)\n",
109-
caps.keyGroupId, caps.fwCounter, caps.fwCounterSame);
110-
if (caps.keyGroupId == 0) {
111-
printf("Error getting key group id from TPM!\n");
112-
rc = -1;
113-
}
114-
}
115-
return rc;
99+
printf("Mfg %s (%d), Vendor %s, Fw %u.%u (0x%x)\n",
100+
caps->mfgStr, caps->mfg, caps->vendorStr, caps->fwVerMajor,
101+
caps->fwVerMinor, caps->fwVerVendor);
102+
printf("Operational mode: %s (0x%x)\n",
103+
TPM2_IFX_GetOpModeStr(caps->opMode), caps->opMode);
104+
printf("KeyGroupId 0x%x, FwCounter %d (%d same)\n",
105+
caps->keyGroupId, caps->fwCounter, caps->fwCounterSame);
116106
}
117107

118108
int TPM2_IFX_Firmware_Update(void* userCtx, int argc, char *argv[])
119109
{
120110
int rc;
121111
WOLFTPM2_DEV dev;
112+
WOLFTPM2_CAPS caps;
122113
const char* manifest_file = NULL;
123114
const char* firmware_file = NULL;
124115
fw_info_t fwinfo;
125-
int abandon = 0;
116+
int abandon = 0, recovery = 0;
126117

127118
XMEMSET(&fwinfo, 0, sizeof(fwinfo));
128119

@@ -156,10 +147,18 @@ int TPM2_IFX_Firmware_Update(void* userCtx, int argc, char *argv[])
156147
goto exit;
157148
}
158149

159-
rc = TPM2_IFX_PrintInfo(&dev);
160-
if (rc != 0) {
150+
rc = wolfTPM2_GetCapabilities(&dev, &caps);
151+
if (rc != TPM_RC_SUCCESS) {
161152
goto exit;
162153
}
154+
TPM2_IFX_PrintInfo(&caps);
155+
if (caps.keyGroupId == 0) {
156+
printf("Error getting key group id from TPM!\n");
157+
}
158+
if (caps.opMode == 0x02 || (caps.opMode & 0x80)) {
159+
/* if opmode == 2 or 0x8x then we need to use recovery mode */
160+
recovery = 1;
161+
}
163162

164163
if (abandon) {
165164
printf("Firmware Update Abandon:\n");
@@ -188,12 +187,21 @@ int TPM2_IFX_Firmware_Update(void* userCtx, int argc, char *argv[])
188187
&fwinfo.firmware_buf, &fwinfo.firmware_bufSz);
189188
}
190189
if (rc == 0) {
191-
rc = wolfTPM2_FirmwareUpgrade(&dev,
192-
fwinfo.manifest_buf, (uint32_t)fwinfo.manifest_bufSz,
193-
TPM2_IFX_FwData_Cb, &fwinfo);
190+
if (recovery) {
191+
printf("Firmware Update (recovery mode):\n");
192+
rc = wolfTPM2_FirmwareUpgradeRecover(&dev,
193+
fwinfo.manifest_buf, (uint32_t)fwinfo.manifest_bufSz,
194+
TPM2_IFX_FwData_Cb, &fwinfo);
195+
}
196+
else {
197+
printf("Firmware Update (normal mode):\n");
198+
rc = wolfTPM2_FirmwareUpgrade(&dev,
199+
fwinfo.manifest_buf, (uint32_t)fwinfo.manifest_bufSz,
200+
TPM2_IFX_FwData_Cb, &fwinfo);
201+
}
194202
}
195203
if (rc == 0) {
196-
rc = TPM2_IFX_PrintInfo(&dev);
204+
TPM2_IFX_PrintInfo(&caps);
197205
}
198206

199207
exit:

src/tpm2_wrap.c

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7432,18 +7432,13 @@ static int tpm2_ifx_firmware_final(WOLFTPM2_DEV* dev)
74327432
return rc;
74337433
}
74347434

7435-
int wolfTPM2_FirmwareUpgrade(WOLFTPM2_DEV* dev,
7435+
int wolfTPM2_FirmwareUpgradeHash(WOLFTPM2_DEV* dev, TPM_ALG_ID hashAlg,
7436+
uint8_t* manifest_hash, uint32_t manifest_hash_sz,
74367437
uint8_t* manifest, uint32_t manifest_sz,
74377438
wolfTPM2FwDataCb cb, void* cb_ctx)
74387439
{
74397440
int rc;
74407441
WOLFTPM2_CAPS caps;
7441-
TPM_ALG_ID hashAlg;
7442-
uint8_t manifest_hash[TPM_SHA384_DIGEST_SIZE];
7443-
uint32_t manifest_hash_sz = (uint32_t)sizeof(manifest_hash);
7444-
7445-
/* Can use SHA2-384 or SHA2-512 for manifest hash */
7446-
hashAlg = TPM_ALG_SHA384;
74477442

74487443
/* check the operational mode */
74497444
rc = wolfTPM2_GetCapabilities(dev, &caps);
@@ -7456,16 +7451,12 @@ int wolfTPM2_FirmwareUpgrade(WOLFTPM2_DEV* dev,
74567451
return tpm2_ifx_firmware_final(dev);
74577452
}
74587453
}
7459-
7460-
if (rc == TPM_RC_SUCCESS) {
7461-
/* hash the manifest */
7462-
rc = wc_Sha384Hash(manifest, manifest_sz, manifest_hash);
7463-
}
7464-
if (rc == TPM_RC_SUCCESS) {
7454+
if (rc == TPM_RC_SUCCESS && caps.opMode == 0x00) {
74657455
rc = tpm2_ifx_firmware_enable_policy(dev);
7466-
}
7467-
if (rc == TPM_RC_SUCCESS) {
7468-
rc = tpm2_ifx_firmware_start(dev, hashAlg, manifest_hash, manifest_hash_sz);
7456+
if (rc == TPM_RC_SUCCESS) {
7457+
rc = tpm2_ifx_firmware_start(dev, hashAlg,
7458+
manifest_hash, manifest_hash_sz);
7459+
}
74697460
}
74707461
if (rc == TPM_RC_SUCCESS) {
74717462
rc = tpm2_ifx_firmware_manifest(dev, manifest, manifest_sz);
@@ -7485,6 +7476,37 @@ int wolfTPM2_FirmwareUpgrade(WOLFTPM2_DEV* dev,
74857476
return rc;
74867477
}
74877478

7479+
int wolfTPM2_FirmwareUpgrade(WOLFTPM2_DEV* dev,
7480+
uint8_t* manifest, uint32_t manifest_sz,
7481+
wolfTPM2FwDataCb cb, void* cb_ctx)
7482+
{
7483+
int rc;
7484+
uint8_t manifest_hash[TPM_SHA384_DIGEST_SIZE];
7485+
7486+
/* hash the manifest */
7487+
rc = wc_Sha384Hash(manifest, manifest_sz, manifest_hash);
7488+
if (rc == 0) {
7489+
rc = wolfTPM2_FirmwareUpgradeHash(dev, TPM_ALG_SHA384,
7490+
manifest_hash, (uint32_t)sizeof(manifest_hash),
7491+
manifest, manifest_sz, cb, cb_ctx);
7492+
}
7493+
return rc;
7494+
}
7495+
7496+
int wolfTPM2_FirmwareUpgradeRecover(WOLFTPM2_DEV* dev,
7497+
uint8_t* manifest, uint32_t manifest_sz,
7498+
wolfTPM2FwDataCb cb, void* cb_ctx)
7499+
{
7500+
uint8_t manifest_hash[TPM_SHA384_DIGEST_SIZE];
7501+
7502+
/* recovery mode manifest hash is all 0x3C */
7503+
XMEMSET(manifest_hash, 0x3C, sizeof(manifest_hash));
7504+
7505+
return wolfTPM2_FirmwareUpgradeHash(dev, TPM_ALG_SHA384,
7506+
manifest_hash, (uint32_t)sizeof(manifest_hash),
7507+
manifest, manifest_sz, cb, cb_ctx);
7508+
}
7509+
74887510
/* terminate a firmware update */
74897511
int wolfTPM2_FirmwareUpgradeCancel(WOLFTPM2_DEV* dev)
74907512
{

wolftpm/tpm2_wrap.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3578,9 +3578,17 @@ WOLFTPM_LOCAL int GetKeyTemplateECC(TPMT_PUBLIC* publicTemplate,
35783578
typedef int (*wolfTPM2FwDataCb)(
35793579
uint8_t* data, uint32_t data_req_sz, uint32_t offset, void* cb_ctx);
35803580

3581+
WOLFTPM_API int wolfTPM2_FirmwareUpgradeHash(WOLFTPM2_DEV* dev,
3582+
TPM_ALG_ID hashAlg, /* Can use SHA2-384 or SHA2-512 for manifest hash */
3583+
uint8_t* manifest_hash, uint32_t manifest_hash_sz,
3584+
uint8_t* manifest, uint32_t manifest_sz,
3585+
wolfTPM2FwDataCb cb, void* cb_ctx);
35813586
WOLFTPM_API int wolfTPM2_FirmwareUpgrade(WOLFTPM2_DEV* dev,
35823587
uint8_t* manifest, uint32_t manifest_sz,
35833588
wolfTPM2FwDataCb cb, void* cb_ctx);
3589+
WOLFTPM_API int wolfTPM2_FirmwareUpgradeRecover(WOLFTPM2_DEV* dev,
3590+
uint8_t* manifest, uint32_t manifest_sz,
3591+
wolfTPM2FwDataCb cb, void* cb_ctx);
35843592
WOLFTPM_API int wolfTPM2_FirmwareUpgradeCancel(WOLFTPM2_DEV* dev);
35853593

35863594
#endif /* WOLFTPM_FIRMWARE_UPGRADE */

0 commit comments

Comments
 (0)