Repository navigation
Conversation
|
Thanks @dgarske, I tested #656 (0d35f1d) against master (d7f73b5) and it resolves #648–#653. #654 is mostly resolved: see the note below. Reproductions. Both servers were built with
End to end. I also ran the tpm2-pkcs11 stack you mention in the PR's notes. That was released tpm2-pkcs11 1.10.1 on tpm2-tss 4.2.0, driven by a C# PKCS#11 suite of 642 cases. It ran on both tpm2-pkcs11 store backends (esysdb and FAPI), and on both the classic and
These results are without any of the local patches I had been applying to fwTPM for #648–#652, so I can drop them. One note on #654. A clear |
|
Hi @AlexLaroche thank you for that feedback! I've pushed updates. Can you take another look? Thanks, David Garske, wolfSSL |
embhorn
left a comment
There was a problem hiding this comment.
Skoll Multi-Scan Review
Modes: review + review-security
Overall recommendation: REQUEST_CHANGES
Findings: 6 total — 6 posted, 0 skipped
6 finding(s) posted as inline comments (see file-level comments below)
Posted findings
- [High] [review] Legacy persistent-object children can no longer be context-saved —
src/fwtpm/fwtpm_command.c:5844-5848 - [High] [review] Any signing failure on a zero digest becomes a parameter error —
src/fwtpm/fwtpm_crypto.c:3990-3995 - [High] [review] RSA SHA-3 schemes silently use MGF1-SHA256 —
src/fwtpm/fwtpm_crypto.c:94-107 - [Medium] [review-security] Fresh TPM reports Clock as unsafe for its first update interval —
src/fwtpm/fwtpm.c:41-47 - [Medium] [review-security] OAEP now selects MGF1 from the scheme hash —
src/fwtpm/fwtpm_crypto.c:85-88 - [Medium] [review-security] SHA-3 RSA falls back to MGF1-SHA256 when its selector is unavailable —
src/fwtpm/fwtpm_crypto.c:94-108
Review generated by Skoll
Thanks @dgarske! I retested #656 at ad2e978, again with no local patches. Everything still holds, and #654 is now fully resolved. Reproductions. As before:
Thanks for the End to end. The C# PKCS#11 suite (642 cases) ran through tpm2-pkcs11, now at master a5156c5, on tpm2-tss 4.2.0. It covered both store backends (esysdb and FAPI) and both the classic and One small note on the new digest-size check in |
|
One more finding on ad2e978, in the same area as #653: object creation with a key size or curve the build doesn't support.
From the code, |
|
Hi @AlexLaroche , thanks for the feedback! Can you review the latest work? Thanks, David Garske, wolfSSL |
embhorn
left a comment
There was a problem hiding this comment.
Skoll Code Review
Scan type: review
Overall recommendation: REQUEST_CHANGES
Findings: 3 total — 3 posted, 0 skipped
3 finding(s) posted as inline comments (see file-level comments below)
Posted findings
- [High] No-NV power cycle reports a rolled-back Clock as safe —
src/fwtpm/fwtpm.c:265-268 - [High] RSA seed operations accept a parent with no usable MGF1 —
src/fwtpm/fwtpm_crypto.c:105-108 - [High] Clock compaction can replace the durable checkpoint with a different RAM value —
src/fwtpm/fwtpm_nv.c:2968-2976
Review generated by Skoll
embhorn
left a comment
There was a problem hiding this comment.
Skoll Code Review
Scan type: review
Overall recommendation: REQUEST_CHANGES
Findings: 2 total — 2 posted, 0 skipped
2 finding(s) posted as inline comments (see file-level comments below)
Posted findings
- [High] Socket polling timeout disconnects valid slow clients —
src/fwtpm/fwtpm_io.c:100-103 - [Medium] HMAC sweep accepts unrelated command errors as proof —
tests/fwtpm_unit_tests.c:17308-17312
Review generated by Skoll
| timeout.tv_sec = FWTPM_CLOCK_POLL_MS / 1000; | ||
| timeout.tv_usec = (FWTPM_CLOCK_POLL_MS % 1000) * 1000; | ||
| #endif | ||
| if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, |
There was a problem hiding this comment.
Socket polling timeout disconnects valid slow clients
The new one-second receive and send timeouts make a pause within a valid TCP frame return a timeout error. SocketRecv and SocketSend treat every non-interruption error as fatal, and the server closes that client. A client that sends part of a command, pauses for over one second, then sends the rest now loses its connection; previously the server waited for the remaining bytes. The clock poll interval does not establish a deadline for completing a client frame.
Suggested fix: Treat socket timeouts as polling events and preserve each client's partial frame while the server continues clock updates; close on EOF or an actual connection error.
Basis: Linux socket(7), SO_RCVTIMEO and SO_SNDTIMEO specifies that a timed-out blocking transfer returns EAGAIN or EWOULDBLOCK, and Microsoft Winsock getsockopt specifies WSAETIMEDOUT for a receive timeout.
| nonceCaller, sizeof(nonceCaller), attrs, authHmac, | ||
| sizeof(authHmac)); | ||
| rspSize = 0; | ||
| FWTPM_ProcessCommand(&ctx, gCmd, pos, gRsp, &rspSize, 0); |
There was a problem hiding this comment.
HMAC sweep accepts unrelated command errors as proof
The new sweep supplies TPM_RH_OWNER for every handle and the same two-byte parameter to every command, then accepts any non-success response. Many commands can reject those handles or parameters before HMAC verification, so the test can pass even if their HMAC checks are bypassed. The single positive control covers only GetRandom.
Suggested fix: Use valid fixtures for command families intended to reach HMAC verification, and assert an authentication error for the corrupted HMAC; consult TPM 2.0 Part 1 §19.6 for the expected authorization behavior.
embhorn
left a comment
There was a problem hiding this comment.
Skoll Code Review
Scan type: review
Overall recommendation: REQUEST_CHANGES
Findings: 2 total — 2 posted, 0 skipped
2 finding(s) posted as inline comments (see file-level comments below)
Posted findings
- [High] Reset the server Time epoch on platform power-on —
src/fwtpm/fwtpm_main.c:340-341 - [Medium] Correct the Clock rollback claim in the new API documentation —
wolftpm/fwtpm/fwtpm.h:1094-1096
Review generated by Skoll
|
|
||
| /* Initialize fwTPM */ | ||
| #ifndef FWTPM_NO_CLOCK | ||
| bootMs = FwtpmHostClockMs(NULL); |
There was a problem hiding this comment.
Reset the server Time epoch on platform power-on
The new host clock HAL subtracts bootMs, but bootMs is set only when the server starts. After a platform POWER_OFF followed by POWER_ON in the same process, FWTPM_Clock_PowerOn() adjusts Clock while the HAL still includes the time spent powered off. The PR now reports that HAL value as Time in ReadClock, PolicyCounterTimer and GetTime attestations. A ReadClock after the power cycle therefore reports Time continuing from the previous power period. The new power-cycle tests check Clock and safe, but do not check Time.
Suggested fix: Reset the standalone HAL's Time epoch on each platform POWER_ON, independently of the durable Clock checkpoint, and test ReadClock across a same-process power cycle.
Basis: TCG TPM 2.0 Library Part 2, §10.10.6 TPMS_TIME_INFO requires Time to reset when power to its circuit is reestablished: https://trustedcomputinggroup.org/wp-content/uploads/Trusted-Platform-Module-2.0-Library-Part-2-Structures_Version-185_pub.pdf
There was a problem hiding this comment.
Fixed in 828271c8: FWTPM_Clock_PowerOn records the HAL value as the Time base, so Time restarts at zero on every POWER_ON for any clock HAL. ReadClock, PolicyCounterTimer and GetTime use it. The power-cycle test now keeps the HAL running across POWER_OFF and checks Time.
| /*! | ||
| \ingroup wolfTPM_fwTPM | ||
| \brief Resume Clock after a platform power cycle that keeps the same | ||
| FWTPM_CTX. Clock restarts from its last NV checkpoint, so powered-off |
There was a problem hiding this comment.
Correct the Clock rollback claim in the new API documentation
The new public API comment says Clock cannot roll back, but the implementation resumes from the last NV checkpoint after an unclean power loss. That checkpoint can precede a value already returned to a caller; the new recovery test explicitly asserts this case. The safe=NO flag communicates the resulting uncertainty, so the unqualified API claim may mislead integrators.
Suggested fix: State that an unclean power loss can make Clock resume below a previously reported value, with safe=NO until recovery.
Basis: TCG TPM 2.0 Library Part 2, §10.10.5 TPMS_CLOCK_INFO defines safe in terms of whether a greater Clock value was previously reported: https://trustedcomputinggroup.org/wp-content/uploads/Trusted-Platform-Module-2.0-Library-Part-2-Structures_Version-185_pub.pdf
Suggestion:
| FWTPM_CTX. Clock restarts from its last NV checkpoint, so powered-off | |
| FWTPM_CTX. Clock resumes from its last NV checkpoint and powered-off | |
| time is not counted. After an unclean shutdown, Clock may roll back | |
| and reports unsafe until the recovery interval has passed. |
There was a problem hiding this comment.
Fixed in 828271c8 with the suggested wording, plus a note that Time restarts at zero.
This PR fixes the fwTPM issues #648-#654, plus related defects in the same code paths. Each fix is its own commit with a regression test:
WC_ALLOW_ECC_ZERO_HASH), as the reference TPM does; otherwise returnTPM_RC_VALUEon the digest parameter instead ofTPM_RC_FAILURE(fwTPM: TPM2_Sign answers TPM_RC_FAILURE for an all-zero ECDSA digest #654).fwtpm_serverbuild defaults to 7 transient object slots for tools that run without a resource manager. An object loaded from a legacy persistent record, whose hierarchy is unknown, saves with a proof bound to both the owner and endorsement seeds.Related fixes:
TPM_CAP_HANDLESincludes hash, HMAC, event, sign and verify sequence handles.wolfTPM2_SignDigestandwolfTPM2_SignSequenceCompletenormalize ECDSA scalars to the curve width, aswolfTPM2_SignHashSchemealready does.Notes:
FWTPM_Clock_PowerOn()for hosts that power cycle within oneFWTPM_CTX. Embedded hosts must callFWTPM_Clock_Update()at least everyFWTPM_CLOCK_POLL_MS.MAX_CONTEXT_SIZEdefaults to 4096 whenMAX_RSA_KEY_BITSexceeds 2048 and to 8192 with PQC, since an object context now carries the private key. Define it to keep a fixed size.fwtpm_server, directly and through tpm2-abrmd, for the classic and v1.85 builds.Fixes #648, Fixes #649, Fixes #650, Fixes #651, Fixes #652, Fixes #653, Fixes #654