Skip to content

decoder: skip foreign-OID keys before FIPS CAST#413

Open
ColtonWilley wants to merge 2 commits into
wolfSSL:masterfrom
ColtonWilley:decoder-oid-precheck
Open

decoder: skip foreign-OID keys before FIPS CAST#413
ColtonWilley wants to merge 2 commits into
wolfSSL:masterfrom
ColtonWilley:decoder-oid-precheck

Conversation

@ColtonWilley

Copy link
Copy Markdown
Contributor

In FIPS, loading a key probes every keytype decoder and each instantiates a wolfCrypt key, firing that algorithm's lazy primitive-Z CAST (~150ms+) before any OID check. The decoder now checks the wrapped AlgorithmIdentifier OID and skips instantiation when the key is foreign and the CAST is still cold. Fixes the ~8s FIPS CMS/RSA-sign regression. Includes a FIPS regression test.

A decoder probed with a non-owned key instantiated a wolfCrypt key and fired that algorithm's lazy primitive-Z CAST before any OID check. Check the AlgorithmIdentifier OID and skip instantiation while the CAST is cold. Fixes the ~8s FIPS CMS/RSA-sign regression.
@aidangarske aidangarske self-requested a review June 24, 2026 18:05
@aidangarske aidangarske added the ci:all PR OSP toggle: run all label Jun 24, 2026
aidangarske
aidangarske previously approved these changes Jun 24, 2026
…decode race

Concurrent decoder probing under FIPS races wolfCrypt's lazy, non-thread-safe
CASTs. Two manifestations, both fixed here:

- RSA: wp_rsa_base_new -> wc_InitRsaKey fires the gated RSA CAST from the decode
  path. Serialize it with WP_CHECK_FIPS_ALGO_PTR(WP_CAST_ALGO_RSA) at the top of
  the constructor (inside the is-running guard, mirroring wp_rsa_gen) so the KAT
  runs once under wolfProvider's mutex instead of racing a concurrent decode.

- DH/ECC: a foreign key reaching the wrong decoder is instantiated then freed,
  and the gated free (wc_FreeDhKey / wc_ecc_free) fires the primitive-Z CAST.
  Rework wp_decode_should_skip to treat the AlgorithmIdentifier OID as
  authoritative instead of trusting the decoder's format label: read the OID
  with both the PKCS#8 and SPKI readers, then skip only when it is positively a
  known key type owned by a different decoder (new global wp_known_key_nids[]).
  Raw material with no OID still proceeds, so legitimate type-specific inputs
  load. This is what keeps the DH/ECC primitive-Z CASTs cold during an RSA load.

Because the OID is now authoritative, wp_decode_should_skip no longer consults
the format label; drop the unused format parameter from its signature and the
three call sites.

Also relocate the DH CAST warm from the tops of wp_dh_decode_spki/_pki (which
guarded ungated calls) to immediately before wc_DhAgree, the one gated call on
the DH decode path.

Update the white-box should_skip test to match the new signature and to assert a
well-formed foreign RSA SPKI is skipped regardless of the decoder's format label
(OID over label).

Validated: make test green (incl. decode_oid_precheck), repro_tls 15/15, grpc
client_ssl_test 10/10.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci:all PR OSP toggle: run all

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants