Repository navigation
Add one-shot HMAC generate and verify API - #12096
AlexLanzano wants to merge 2 commits into
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
Pending crypto callbacks lose their HMAC context and output-buffer lifetime before completion, while negative-length tests reference digest constants that break compilation when algorithms are disabled.
2 open issues
What changed in this PR
Adds one-shot HMAC generation and verification to wolfCrypt, complementing the existing streaming API with full-length tag operations and caller-provided context variants.
Changes:
- Adds
wc_HmacGenerate,wc_HmacVerify, and_exvariants supporting context storage, heap hints, and device IDs. - Shares the hardware async-wait helper between the new APIs and HKDF.
- Adds API documentation and tests for known tags, invalid inputs, digest sizes, and callback fallback.
| File | Description |
|---|---|
wolfssl/wolfcrypt/hmac.h |
Declares the four new public APIs. |
wolfcrypt/src/hmac.c |
Implements generation and constant-time verification; shares async-wait handling. |
tests/api/test_hmac.h |
Registers the new HMAC tests. |
tests/api/test_hmac.c |
Tests one-shot behavior, argument validation, hash types, and callback fallback. |
doc/dox_comments/header_files/hmac.h |
Documents parameters, return values, context ownership, and examples. |
Review effort: Balanced
|
ff3ee47 to
c11a378
Compare
There was a problem hiding this comment.
🟡 Changes recommended
In combined QAT/Cavium and crypto-callback builds, pending HMAC callbacks can be incorrectly polled as hardware requests, potentially returning success without producing an authentication tag.
1 open issue
2 resolved since last review
Review effort: Balanced
bigbrett
left a comment
There was a problem hiding this comment.
Missing adding the oneshot detection and dispatch to the new generate function in cryptocb_test() in wolfcrypt/test/test.c. Look at how CMAC does it and implement the corresponding dispatch plz
|
@AlexLanzano I feel like the cryptographic known answer tests should probably go in the wolfCrypt tests (aka |
c11a378 to
9a8de51
Compare
It looks like this is the standard pattern. the SHA, CMAC, and others implement their API tests this way as well |
| return BUFFER_E; | ||
| } | ||
|
|
||
| ret = wc_HmacInit(hmac, heap, devId); |
There was a problem hiding this comment.
I'd dispatch to the cryptoCb before intializing this. See CMAC.
Add wc_HmacGenerate() and wc_HmacVerify(), plus _ex variants taking caller provided Hmac storage, heap and devId, modeled on the AES-CMAC one-shots. Tags are full length only. Move the async wait macro out of HAVE_HKDF so both can use it. Add docs and API tests.
9a8de51 to
94ce570
Compare

Description
Adds one-shot HMAC generate and verify APIs to wolfCrypt, modeled on the AES-CMAC one-shots (
wc_AesCmacGenerate/wc_AesCmacVerify).New public APIs in
wolfssl/wolfcrypt/hmac.h:Behavior:
typeis any HMAC hash type accepted bywc_HmacSetKey(SHA-1, SHA-2, SHA-3, etc.).*outSzmust be at least the digest size (BUFFER_Eotherwise) and is set to the digest size on success.checkSzmust equal the digest size (BAD_FUNC_ARGotherwise). The tag is compared in constant time and a mismatch returnsMAC_CMP_FAILED_E. The computed tag is zeroed before returning._exvariants take caller providedHmacstorage plus a heap hint and device ID, so they can be used without the heap and with a crypto callback device. The context is initialized and freed inside the call._exvariants allocate the context (heap or stack, perWOLFSSL_SMALL_STACK) and useINVALID_DEVID.keymay be NULL whenkeySzis 0, andinmay be NULL wheninSzis 0.Async and crypto callbacks:
wc_AsyncWait(), so the one-shot completes synchronously.WC_PENDING_E, the context is freed and the code is returned to the caller. Nothing is kept across calls; calling again starts a new operation.HMAC_SUBOP_WAITmacro is moved out of theHAVE_HKDFblock. HKDF behavior is unchanged.The new APIs are not available in FIPS or selftest builds, since those modules are frozen.
Testing
New API tests in
tests/api/test_hmac.c:test_wc_HmacGenerate: RFC 4231 known answer (SHA-256), oversized output buffer, single bit flips rejected, wrong key or message rejected, empty key and message match the streaming API,_exvariants, and bad argument handling.test_wc_HmacGenerate_HashTypes: RFC 4231 known answers for SHA-384 and SHA-512, plus a wrong length tag for each and a short output buffer for SHA-384.test_wc_HmacGenerate_CryptoCb:_exvariants passdevIdto a registered crypto callback and fall back to software when it returnsCRYPTOCB_UNAVAILABLE.Ran the HMAC API tests with the default configure and with
--disable-sha384.