-
Notifications
You must be signed in to change notification settings - Fork 74
wolfTPM Support For Das U-Boot Bootloader #398
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 1 commit
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
f319296
Rebase wolfTPM Support For Das U-Boot Bootloader
aidangarske d463f70
Removed options.h not used, added TPM2_GetHierarchyDesc, and fixed in…
aidangarske 0c2b0a4
Fix location for TPM simulator `/tmp`.
dgarske 9c2ada8
Fixes for spelling and debug.
dgarske 985abb5
Updated docs. Add test case for `TPM2_GetAlgId`.
dgarske File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,107 @@ | ||
| # wolfTPM Support For Das U-boot | ||
|
|
||
| wolfTPM provides experimental support for U-Boot with the following key features: | ||
|
|
||
| - Utilizes SOFT SPI driver in U-Boot for TPM communication | ||
| - Implements TPM 2.0 driver functionality through its internal TIS layer | ||
| - Provides native API access to all TPM 2.0 commands | ||
| - Includes wrapper API for common TPM 2.0 operations | ||
| - Supports two integration paths: | ||
| - `__linux__`: Uses existing tpm interface via tpm2_linux.c | ||
| - `__UBOOT__`: Direct SPI communication through tpm_io_uboot.c | ||
|
|
||
| ## wolfTPM U-Boot Commands | ||
|
|
||
| The following commands are available through the `wolftpm` interface: | ||
|
|
||
| ### Basic Commands | ||
|
|
||
| - `help` - Show help text | ||
| - `device [num device]` - Show all devices or set the specified device | ||
| - `info` - Show information about the TPM | ||
| - `state` - Show internal state from the TPM (if available) | ||
| - `autostart` - Initialize the TPM, perform a Startup(clear) and run a full selftest sequence | ||
| - `init` - Initialize the software stack (must be first command) | ||
| - `startup <mode> [<op>]` - Issue a TPM2_Startup command | ||
| - `<mode>`: TPM2_SU_CLEAR (reset state) or TPM2_SU_STATE (preserved state) | ||
| - `[<op>]`: optional shutdown with "off" | ||
| - `self_test <type>` - Test TPM capabilities | ||
| - `<type>`: "full" (all tests) or "continue" (untested tests only) | ||
|
|
||
| ### PCR Operations | ||
|
|
||
| - `pcr_extend <pcr> <digest_addr> [<digest_algo>]` - Extend PCR with digest | ||
| - `pcr_read <pcr> <digest_addr> [<digest_algo>]` - Read PCR to memory | ||
| - `pcr_allocate <algorithm> <on/off> [<password>]` - Reconfig PCR bank algorithm | ||
| - `pcr_setauthpolicy | pcr_setauthvalue <pcr> <key> [<password>]` - Change PCR access key | ||
| - `pcr_print` - Print current PCR state | ||
|
|
||
| ### Security Management | ||
|
|
||
| - `clear <hierarchy>` - Issue TPM2_Clear command | ||
| - `<hierarchy>`: TPM2_RH_LOCKOUT or TPM2_RH_PLATFORM | ||
| - `change_auth <hierarchy> <new_pw> [<old_pw>]` - Change hierarchy password | ||
| - `<hierarchy>`: TPM2_RH_LOCKOUT, TPM2_RH_ENDORSEMENT, TPM2_RH_OWNER, or TPM2_RH_PLATFORM | ||
| - `dam_reset [<password>]` - Reset internal error counter | ||
| - `dam_parameters <max_tries> <recovery_time> <lockout_recovery> [<password>]` - Set DAM parameters | ||
| - `caps` - Show TPM capabilities and info | ||
|
|
||
| ### Firmware Management | ||
|
|
||
| - `firmware_update <manifest_addr> <manifest_sz> <firmware_addr> <firmware_sz>` - Update TPM firmware | ||
| - `firmware_cancel` - Cancel TPM firmware update | ||
|
|
||
| ## Enabling wolfTPM in U-Boot | ||
|
|
||
| Enable wolfTPM support in U-Boot by adding these options to your board's defconfig: | ||
|
|
||
| ``` | ||
| CONFIG_TPM=y | ||
| CONFIG_TPM_V2=y | ||
| CONFIG_TPM_WOLF=y | ||
| CONFIG_CMD_WOLFTPM=y | ||
| ``` | ||
|
|
||
| Or use `make menuconfig` and enable: | ||
| - Device Drivers → TPM → TPM 2.0 Support | ||
| - Device Drivers → TPM → wolfTPM Support | ||
| - Command line interface → Security commands → Enable wolfTPM commands | ||
|
|
||
| ## Building and Running wolfTPM with U-Boot using QEMU | ||
|
|
||
| To build and run wolfTPM with U-Boot using QEMU and a tpm simulator, follow these steps: | ||
|
|
||
| 1. Install swtpm: | ||
| ``` | ||
| git clone [email protected]:stefanberger/swtpm.git | ||
| cd swtpm | ||
| ./autogen.sh | ||
| make | ||
| ``` | ||
|
|
||
| 2. Build U-Boot: | ||
| ``` | ||
| make distclean | ||
| export CROSS_COMPILE=aarch64-linux-gnu- | ||
| export ARCH=aarch64 | ||
| make qemu_arm64_defconfig | ||
| make -j4 | ||
| ``` | ||
|
|
||
| 3. Create TPM directory: | ||
| ``` | ||
| mkdir -p ./tmp/mytpm1 | ||
| ``` | ||
|
|
||
| 4. Start swtpm (in first terminal): | ||
| ``` | ||
| swtpm socket --tpm2 --tpmstate dir=./tmp/mytpm1 --ctrl type=unixio,path=./tmp/mytpm1/swtpm-sock --log level=20 | ||
| ``` | ||
|
|
||
| 5. Start QEMU (in second terminal): | ||
| ``` | ||
| qemu-system-aarch64 -machine virt -nographic -cpu cortex-a57 -bios u-boot.bin -chardev socket,id=chrtpm,path=./tmp/mytpm1/swtpm-sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis-device,tpmdev=tpm0 | ||
| ``` | ||
|
|
||
| 6. Exiting the QEMU: | ||
| Press Ctrl-A followed by X |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| /* examples/u-boot/options.h | ||
| * | ||
| * Copyright (C) 2006-2021 wolfSSL Inc. | ||
| * | ||
| * This file is part of wolfTPM. | ||
| * | ||
| * wolfTPM is free software; you can redistribute it and/or modify | ||
| * it under the terms of the GNU General Public License as published by | ||
| * the Free Software Foundation; either version 2 of the License, or | ||
| * (at your option) any later version. | ||
| * | ||
| * wolfTPM is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with this program; if not, write to the Free Software | ||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA | ||
| */ | ||
|
|
||
| /* Example wolfTPM options.h for U-boot compilation */ | ||
|
|
||
| #ifndef WOLFTPM_OPTIONS_H | ||
| #define WOLFTPM_OPTIONS_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #undef __UBOOT__ | ||
| #define __UBOOT__ | ||
|
|
||
| #undef SIZEOF_LONG | ||
| #define SIZEOF_LONG 8 | ||
|
|
||
| #undef WOLFTPM2_NO_WOLFCRYPT | ||
| #define WOLFTPM2_NO_WOLFCRYPT | ||
|
|
||
| #undef WOLFTPM_AUTODETECT | ||
| #define WOLFTPM_AUTODETECT | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* WOLFTPM_OPTIONS_H */ | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| /* tpm_io_uboot.c | ||
| * | ||
| * Copyright (C) 2006-2025 wolfSSL Inc. | ||
| * | ||
| * This file is part of wolfTPM. | ||
| * | ||
| * wolfTPM is free software; you can redistribute it and/or modify | ||
| * it under the terms of the GNU General Public License as published by | ||
| * the Free Software Foundation; either version 2 of the License, or | ||
| * (at your option) any later version. | ||
| * | ||
| * wolfTPM is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with this program; if not, write to the Free Software | ||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | ||
| */ | ||
|
|
||
| /* This example shows IO interfaces for U-boot */ | ||
|
|
||
| #include <wolftpm/tpm2.h> | ||
| #include <wolftpm/tpm2_tis.h> | ||
| #include "tpm_io.h" | ||
|
|
||
| /******************************************************************************/ | ||
| /* --- BEGIN IO Callback Logic -- */ | ||
| /******************************************************************************/ | ||
|
|
||
| /* Included via tpm_io.c if WOLFTPM_INCLUDE_IO_FILE is defined */ | ||
| #ifdef WOLFTPM_INCLUDE_IO_FILE | ||
|
|
||
| #if ! (defined(WOLFTPM_LINUX_DEV) || \ | ||
| defined(WOLFTPM_SWTPM) || \ | ||
| defined(WOLFTPM_WINAPI) ) | ||
|
|
||
| /* Use the max speed by default - see tpm2_types.h for chip specific max values */ | ||
| #ifndef TPM2_SPI_HZ | ||
| #define TPM2_SPI_HZ TPM2_SPI_MAX_HZ | ||
| #endif | ||
|
|
||
| #if defined(__UBOOT__) | ||
| #include <config.h> | ||
| int TPM2_IoCb_Uboot_SPI(TPM2_CTX* ctx, const byte* txBuf, | ||
| byte* rxBuf, word16 xferSz, void* userCtx) | ||
| { | ||
| int ret = 0; | ||
| struct udevice *dev; | ||
|
|
||
| /* Get the TPM device */ | ||
| if (ret == 0) { | ||
| ret = tcg2_platform_get_tpm2(&dev); | ||
| if ( ret != 0 || dev == NULL) { | ||
| #ifdef DEBUG_WOLFTPM | ||
| printf("Failed to get TPM device with error: %d\n", ret); | ||
| #endif | ||
| return TPM_RC_FAILURE; | ||
| } | ||
| } | ||
|
|
||
| /* Transfer the device data using tpm_xfer */ | ||
| if (ret == 0) { | ||
| ret = tpm_xfer(dev, txBuf, xferSz, rxBuf, &xferSz); | ||
| if (ret != 0) { | ||
| #ifdef DEBUG_WOLFTPM | ||
| printf("tpm_xfer failed with error: %d\n", ret); | ||
| #endif | ||
| return TPM_RC_FAILURE; | ||
| } | ||
| } | ||
|
|
||
| return TPM_RC_SUCCESS; | ||
| } | ||
| #endif /* __UBOOT__ */ | ||
| #endif /* WOLFTPM_LINUX_DEV || WOLFTPM_SWTPM || WOLFTPM_WINAPI */ | ||
| #endif /* WOLFTPM_INCLUDE_IO_FILE */ | ||
|
|
||
| /******************************************************************************/ | ||
| /* --- END IO Callback Logic -- */ | ||
| /******************************************************************************/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.