Skip to content

Commit dd6444b

Browse files
committed
x86: zero ATA unlock secret on all sata_unlock_disk exits
F/2588
1 parent 4c0f425 commit dd6444b

1 file changed

Lines changed: 17 additions & 12 deletions

File tree

src/x86/ahci.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -416,36 +416,36 @@ int sata_unlock_disk(int drv, int freeze)
416416
int secret_size = ATA_UNLOCK_DISK_KEY_SZ;
417417
uint8_t secret[ATA_UNLOCK_DISK_KEY_SZ];
418418
enum ata_security_state ata_st;
419-
int r;
419+
int r = -1;
420420

421421
#ifdef WOLFBOOT_ATA_DISABLE_USER_PASSWORD
422422
sata_disable_password(0);
423423
#endif
424424
r = sata_get_unlock_secret(secret, &secret_size);
425425
if (r != 0)
426-
return r;
426+
goto cleanup;
427427
ata_st = ata_security_get_state(drv);
428428
wolfBoot_printf("ATA: Security state SEC%d\r\n", ata_st);
429429
#if defined(TARGET_x86_fsp_qemu)
430430
if (ata_st == ATA_SEC0)
431-
return 0;
431+
goto cleanup;
432432
#endif
433433
if (ata_st == ATA_SEC1) {
434434
AHCI_DEBUG_PRINTF("ATA: calling set passphrase\r\n", r);
435435
r = ata_security_set_password(drv, 0, (char*)secret);
436436
if (r != 0)
437-
return -1;
437+
goto error;
438438
AHCI_DEBUG_PRINTF("ATA: calling freeze lock\r\n", r);
439439
if (freeze) {
440440
r = ata_security_freeze_lock(drv);
441441
AHCI_DEBUG_PRINTF("ATA security freeze lock: returned %d\r\n", r);
442442
if (r != 0)
443-
return -1;
443+
goto error;
444444
}
445445
r = ata_identify_device(drv);
446446
AHCI_DEBUG_PRINTF("ATA identify: returned %d\r\n", r);
447447
if (r != 0)
448-
return -1;
448+
goto error;
449449
ata_st = ata_security_get_state(drv);
450450
wolfBoot_printf("ATA: State SEC%d\r\n", ata_st);
451451
}
@@ -454,11 +454,11 @@ int sata_unlock_disk(int drv, int freeze)
454454
r = ata_security_unlock_device(drv, (char*)secret, 0);
455455
AHCI_DEBUG_PRINTF("ATA device unlock: returned %d\r\n", r);
456456
if (r != 0)
457-
return -1;
457+
goto error;
458458
r = ata_identify_device(drv);
459459
AHCI_DEBUG_PRINTF("ATA identify: returned %d\r\n", r);
460460
if (r != 0)
461-
return -1;
461+
goto error;
462462
ata_st = ata_security_get_state(drv);
463463
if (ata_st == ATA_SEC5) {
464464
if (freeze) {
@@ -467,14 +467,14 @@ int sata_unlock_disk(int drv, int freeze)
467467
AHCI_DEBUG_PRINTF("ATA security freeze lock: returned %d\r\n",
468468
r);
469469
if (r != 0)
470-
return -1;
470+
goto error;
471471
} else {
472472
AHCI_DEBUG_PRINTF("ATA security freeze skipped\r\n");
473473
}
474474
r = ata_identify_device(drv);
475475
AHCI_DEBUG_PRINTF("ATA identify: returned %d\r\n", r);
476476
if (r != 0)
477-
return -1;
477+
goto error;
478478
}
479479
}
480480
ata_st = ata_security_get_state(drv);
@@ -484,8 +484,13 @@ int sata_unlock_disk(int drv, int freeze)
484484
panic();
485485
}
486486
AHCI_DEBUG_PRINTF("ATA: Security enabled. State SEC%d\r\n", ata_st);
487-
488-
return 0;
487+
r = 0;
488+
goto cleanup;
489+
error:
490+
r = -1;
491+
cleanup:
492+
TPM2_ForceZero(secret, sizeof(secret));
493+
return r;
489494
}
490495
#endif /* WOLFBOOT_ATA_DISK_LOCK */
491496

0 commit comments

Comments
 (0)