Ci interop fixes#11
Merged
Merged
Conversation
wolfSSL-Fenrir-bot
left a comment
There was a problem hiding this comment.
Fenrir Automated Review — PR #11
Scan targets checked: wolfcert-bugs, wolfcert-src
Findings: 1
1 finding(s) posted as inline comments (see file-level comments below)
This review was generated automatically by Fenrir. Findings are non-blocking.
Both interop jobs passed green while doing nothing: the dependency build failed under continue-on-error, so the interop script found no binary in PATH and exited 77 (a neutral skip). - cisco/libest (archived, built for OpenSSL 1.x): its configure now demands an explicit safec choice, and linking fails because OpenSSL 3.0 removed FIPS_mode()/FIPS_mode_set(), which libest still calls. Add --disable-safec and a force-included compat header expanding both symbols to no-ops (defining the function-like macros in a header, not via -D, keeps their parens off gcc's command line). - smallstep/step-ca: cgo-links libpcsclite (PC/SC, for its PIV/YubiKey provisioners); install libpcsclite-dev before go install. Both jobs now build their dependency and exercise the interop for real.
RFC 8894 SCEP is RSA-only: wolfcert_scep_envelop encrypts the pkcsPKIEnvelope to the RA/CA public key with CMS key transport, which wolfSSL only supports for an RSA recipient. An ECC RA cert (e.g. step-ca's default ECDSA chain) otherwise fell through to wolfSSL's key-agreement path and failed deep in the encoder with BAD_KEYWRAP_ALG_E (-239). Check p7->publicKeyOID right after InitWithCert and return WOLFCERT_ERR_UNSUPPORTED with an actionable message instead. Add a test_scep_msg negative test that a self-signed ECC RA cert is rejected while an RSA one still envelops.
est_libest.sh D2 was silently soft-skipping: it guessed estclient's trust-anchor flag (--pem-file / -c) and treated -o as a cert file. Use the real flags - --trustanchor for the server anchor, -o as the output directory - let estclient auto-generate its RSA key, then base64-decode the emitted cert-*.pkcs7 and assert wolfcert-server issued the requested CN. The glob lookup uses `|| true` so the "no cert emitted" guard stays reachable under set -e. est_stepca.sh [2] was a KNOWN-FAIL because step-ca's default ECDSA CA can't be a SCEP decrypter (RFC 8894 is RSA-only). Swap in an RSA root + intermediate after `step ca init` so the intermediate step-ca uses as the SCEP decrypter - and every GetCACert cert - is RSA, set the provisioner to AES-128-CBC, and make [2] a strict pass. Its only remaining failure, verifying the CertRep signature, hits the same wolfSSL PKCS#7 gap as the micromdm interop (ASN_SIG_CONFIRM_E, -229) because step-ca's SCEP is github.com/smallstep/scep (the micromdm library); like micromdm it stays strict-red until wolfSSL PR #10928 lands, then self-heals. Add docs/INTEROP.md documenting the targets, the best-effort skip convention, the libest/step-ca dependency-build notes, and notes 1-6 the scripts reference.
Frauschi
force-pushed
the
ci_interop_dep_fixes
branch
from
July 21, 2026 11:14
ba4f76e to
0b95e6a
Compare
Frauschi
commented
Jul 21, 2026
wolfSSL-Fenrir-bot
left a comment
There was a problem hiding this comment.
Fenrir Automated Review — PR #11
Scan targets checked: wolfcert-bugs, wolfcert-src
No new issues found in the changed files. ✅
philljj
approved these changes
Jul 21, 2026
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary
The nightly
Interopworkflow had two jobs (cisco/libestandsmallstep/step-ca) that were green but testing nothing: their third-party dependency failed to build undercontinue-on-error, so the interop script found no binary inPATHand exited 77 (a neutral skip). This PR fixes both dependency builds, makes the two scripts exercise their peers for real, and cleans up the SCEP recipient handling that the step-ca work exposed.Net effect: 2 of 5 interop targets go from decorative to actually validating wolfCert against a real implementation.
What changed
CI dependency builds (
.github/workflows/interop.yml)configurenow demands an explicit safec choice, and linking fails because OpenSSL 3.0 removedFIPS_mode()/FIPS_mode_set(), which libest still calls. Added--disable-safecand a force-included compat header that expands both symbols to no-ops (defining the function-like macros in a header rather than via-Dkeeps their parens off gcc's command line).libpcsclite(PC/SC, for its PIV/YubiKey provisioners); installlibpcsclite-devbeforego install, or the build aborts at pkg-config.libest D2 now enrolls for real (
tests/interop/est_libest.sh)The
libest estclient -> wolfcert-serverdirection was soft-skipping: it guessed estclient's trust-anchor flag (--pem-file/-c) and treated-oas a cert file. Use the real flags ---trustanchorfor the server anchor,-oas the output directory - let estclient auto-generate its RSA key, then base64-decode the emittedcert-*.pkcs7and assert wolfcert-server issued the requested CN.step-ca gets an RSA SCEP chain (
tests/interop/est_stepca.sh)step-ca's default ECDSA CA cannot be a SCEP decrypter (RFC 8894 is RSA-only). After
step ca init, swap in an RSA root + intermediate (per Smallstep's own guidance) so the intermediate step-ca uses as the SCEP decrypter - and every certGetCACertreturns - is RSA, and set the provisioner to AES-128-CBC for the CertRep.[2]is now a strict assertion.wolfCert: clearer error for a non-RSA RA cert (
src/scep/scep_msg.c,tests/unit/test_scep_msg.c)wolfcert_scep_envelopencrypts the pkcsPKIEnvelope to the RA/CA public key with CMS key transport, which wolfSSL only supports for an RSA recipient. An ECC RA cert (like step-ca's default chain) previously fell through to wolfSSL's key-agreement path and failed deep in the encoder withBAD_KEYWRAP_ALG_E(-239). Checkp7->publicKeyOIDright afterInitWithCertand returnWOLFCERT_ERR_UNSUPPORTEDwith an actionable message. Added atest_scep_msgnegative test: a self-signed ECC RA cert is rejected, an RSA one still envelops.docs (
docs/INTEROP.md)New document the scripts already referenced: the interop targets, the best-effort 77-skip convention (and the caveat that a broken dependency build masquerades as a skip), the libest/step-ca dependency-build notes, and notes 1-6.
Testing
Verified via
workflow_dispatchruns ofinterop.ymlon the fork:cisco/libest- builds clean; both directions PASS ([1] wolfcert-client -> estserver,[2] estclient -> wolfcert-server).smallstep/step-ca- builds clean; the RSA chain swap works end-to-end (the failure moved from-239 BAD_KEYWRAP_ALG_Eto-229, i.e. the pkcsPKIEnvelope now encrypts to step-ca's RSA key and step-ca issues the cert).test_scep_msg(localctest) - new ECC-rejection test passes; full suite 24/24 green.Known-red jobs (self-heal on a pending wolfSSL fix)
Two SCEP jobs stay red until wolfSSL PR #10928 (
pkcs7_fix) reachesmaster, then self-heal to PASS:[2]- after the RSA swap, its only remaining failure is verifying the CertRep signature (VerifySignedData/ASN_SIG_CONFIRM_E,-229). step-ca's SCEP is built ongithub.com/smallstep/scep(the micromdm library), so it hits the exact same PKCS#7 signature gap as micromdm. Kept strict, consistent with the micromdm interop.Both are documented in
docs/INTEROP.mdnotes 3 and 6.