Skip to content

feat(xmldsig): complete Merlin interop - #106

Closed
polaz wants to merge 63 commits into
mainfrom
feat/#105-merlin-interop
Closed

feat(xmldsig): complete Merlin interop#106
polaz wants to merge 63 commits into
mainfrom
feat/#105-merlin-interop

Conversation

@polaz

@polaz polaz commented Aug 5, 2026

Copy link
Copy Markdown
Member

Summary

  • complete verification coverage for the tracked Merlin XMLDSig interoperability corpus, including document-level and reference-level assertions
  • add pure-Rust DSA-SHA1 and HMAC-SHA1 verification with strict legacy-algorithm policies and caller-bound HMAC output lengths
  • support bounded caller-provided external resources resolved against effective xml:base, including RFC 3986 normalization, inherited-base bypass for scheme-bearing identities, network-path URIs, and a consistent internal-DTD policy for root and detached XML
  • support namespace-aware X.509 RetrievalMethod resolution, authenticated CRL handling, and bounded manifest references
  • enumerate signature-valid X.509 paths through configured lookup intermediates, stop at explicit trust anchors, validate cross-signed alternatives, and keep unsupported branches from suppressing valid sibling paths
  • bind every X.509 selector category to one signature-valid selected path while preserving legitimate leaf/intermediate/root selector sets
  • enforce typed RFC 5280 ExtendedKeyUsage policy across complete certificate paths, including critical EKU and custom purpose OIDs, while preserving anyExtendedKeyUsage semantics and fail-closed resolver/operation policy intersection
  • preserve OpenSSL/xmlsec1 path compatibility for historical non-critical CA BasicConstraints while enforcing cA and keyCertSign
  • validate AES-KW KEK size before custom-provider dispatch and bound lexical KeySize metadata before integer parsing
  • make resolved X.509 RetrievalMethod resource identities explicit and cover inherited xml:base plus dot-segment normalization
  • enforce RFC 5280 path-length, self-issued rollover, NameConstraints syntax, malformed SAN, duplicate-extension, critical-extension, complete-CRL reason-code, and revocation rules during certificate-path validation
  • enforce RFC 4055 RSASSA-PSS issuer-SPKI parameter presence, hash, MGF, minimum-salt, and trailer restrictions before certificate-signature verification
  • apply legacy RSA-SHA1 policy independently of named, DER, KeyValue, or X.509 key source while preserving backend interoperability capability
  • introduce immutable verify/sign/encrypt/decrypt policy snapshots with typed violations, a shared pre-parse XML document byte ceiling, caller-owned node accounting, and fail-closed resolver trust composition
  • enforce shared typed RSA modulus/exponent policy before outbound signing and OAEP provider dispatch, with a 2048-bit secure default and an absolute 8192-bit implementation ceiling
  • route digest, signature dispatch, typed X.509 algorithms with built-in RSA-PSS/Ed25519 authentication and custom-provider dispatch for modeled OIDs, AES-CBC/GCM, AES-KW, RSA-OAEP, and randomness through an explicit capability-queryable RustCrypto provider without fallback, with ECDSA hash selection independent of the P-256/P-384/P-521 SPKI curve
  • enforce facade-owned cryptographic framing around custom-provider dispatch, including fixed digest and signature outputs plus AES-CBC/GCM, AES-KW, and modulus-sized RSA-OAEP inputs and outputs
  • reject zero typed KeySize values and non-SHA1 MGF configuration for legacy rsa-oaep-mgf1p before resolver or custom-provider dispatch
  • accept direct typed X509Data retrieval without a transform while requiring explicit XPath selection when the dereferenced root is a wrapper
  • separate signed-payload URI policy from key-retrieval URI policy so external key material always requires its own explicit opt-in
  • preserve failed or unsupported advisory RetrievalMethod sources so resolvers can continue to later usable key material while retaining the original failure when no source resolves
  • enforce transform allowlists from the complete terminal data type, share one Reference ceiling across SignedInfo and authenticated Manifests, bound external XML reparsing, and cap canonicalized SignedInfo plus retained pre-digest diagnostics across a signature
  • import the complete required Merlin fixture snapshot through a reproducible curated importer that preserves donor bytes while removing non-fixture prose and normalizing the historical HMAC filename
  • pin reciprocal interoperability to the exact xmlsec1 1.3.13 Git object with source-identity verification, transactional installer rollback, and strict fresh-and-cached version-output validation
  • enforce positive X.509 serial numbers, matching signed and outer signature algorithms, X.520-prepared RFC 4514 issuer/subject matching, and untrusted lookup/intermediate paths that terminate only at explicit trust anchors
  • add SHA-256 X509Digest coverage and a bounded XMLDSig verification fuzz target
  • harden CI with read-only permissions, credential-free checkouts, and an explicit fuzz runtime budget
  • update cryptographic dependency requirements and public documentation for the completed interoperability surface

Testing

  • cargo build
  • cargo build --no-default-features
  • cargo build --all-features
  • cargo clippy --all-targets --all-features -- -D warnings
  • cargo nextest run --all-features
  • cargo test --doc --all-features
  • cargo +nightly fuzz run xmldsig_verify -- -runs=256 -max_len=65536

Closes #105

- add DSA-SHA1 and HMAC-SHA1 verification paths
- resolve bounded external references and X.509 key retrieval
- cover all Merlin documents, references, and failure policies
- update dependency requirements and public support documentation

Closes #105
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@polaz, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 2 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e2ef7a93-6ccd-4436-b6d4-7877fdb599f5

📥 Commits

Reviewing files that changed from the base of the PR and between f696d66 and 72e9a14.

📒 Files selected for processing (7)
  • docs/xmldsig.md
  • docs/xmlenc.md
  • src/provider.rs
  • src/xmldsig/keys.rs
  • src/xmldsig/signature.rs
  • src/xmldsig/verify.rs
  • src/xmlenc/encrypt.rs
📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added DSA-SHA1 and HMAC-SHA1 verification, including truncated HMAC outputs.
    • Added configurable cryptographic providers and security policies for XML signatures and encryption.
    • Added controlled external resources, X.509 retrieval, certificate-chain validation, and CRL checks.
    • Added policy-aware signing, encryption, and decryption controls.
  • Bug Fixes

    • Improved URI resolution, reference handling, ECDSA verification, namespace processing, and diagnostics.
    • Added safeguards for oversized XML, canonicalized data, external resources, and encrypted content.
  • Documentation

    • Updated XMLDSig and XMLEnc capabilities and security guidance.
  • Tests

    • Expanded interoperability coverage and added XMLDSig fuzz testing.

Walkthrough

This PR adds typed security policies, provider-backed cryptography, bounded XMLDSig and XMLEnc processing, legacy DSA-SHA1 and HMAC-SHA1 verification, X.509 path and CRL validation, Merlin interoperability coverage, XMLSec tooling, and fuzz coverage.

Changes

XMLDSig and XMLEnc security foundations

Layer / File(s) Summary
Policy and provider foundations
src/policy.rs, src/provider.rs, src/hard_limits.rs, src/lib.rs, Cargo.toml
Adds typed policies, hard resource ceilings, provider-neutral cryptographic operations, and a default RustCrypto provider.
Provider-backed signing and encryption
src/xmldsig/sign.rs, src/xmldsig/digest.rs, src/xmlenc/encrypt.rs, src/xmlenc/decrypt.rs, src/xmlenc/parse.rs
Routes digesting, signing, encryption, decryption, key wrapping, and RSA-OAEP through configured providers and policy-aware parsing.

XMLDSig verification and certificate processing

Layer / File(s) Summary
Parsing and signature algorithms
src/xmldsig/parse.rs, src/xmldsig/signature.rs, src/xmldsig/keys.rs, src/xmldsig/mod.rs
Adds verify-only DSA-SHA1 and HMAC-SHA1, HMAC output-length validation, DSA key parsing, generic ECDSA hash handling, and public verification exports.
Bounded references and canonicalization
src/xmldsig/verify.rs, src/xmldsig/uri.rs, src/xmldsig/types.rs, src/xmldsig/transforms.rs, src/c14n/*, src/xmldsig/xpath.rs
Adds caller-supplied external resources, RetrievalMethod handling, XML Base budgets, canonicalization limits, controlled DTD parsing, XML node limits, and comment-aware dereferencing.
X.509 trust and path validation
src/xmldsig/keys.rs, src/xmldsig/parse.rs, src/xmldsig/x509.rs, tests/x509_chain_integration.rs
Separates lookup certificates from trust anchors, validates certificate paths and CRLs, normalizes distinguished names, and supports provider-backed certificate algorithms.

Interoperability and validation tooling

Layer / File(s) Summary
Merlin corpus and XMLDSig tests
tests/merlin_interop.rs, tests/donor_full_verification_suite.rs, tests/donor_negative_vectors.rs, tests/fixtures/xmldsig/*, tests/fixtures_smoke.rs
Adds Merlin fixtures and positive and negative coverage for DSA, HMAC, external resources, RetrievalMethod, X.509, CRLs, manifests, and policy failures.
XMLSec installation and CI
scripts/install-xmlsec1.sh, tests/install_xmlsec1.rs, tests/common/xmlsec1.rs, tests/xmlsec1_interop.rs, tests/xmlenc_encrypt_xmlsec1.rs, .github/workflows/ci.yml
Adds pinned XMLSec installation, rollback tests, shared version checks, interoperability commands, and nightly fuzz smoke tests.
Fuzzing, documentation, and repository support
fuzz/*, README.md, docs/*, .gitattributes, .gitignore, scripts/import-donor-fixtures.sh
Adds the fuzz package and corpus, updates documentation, and normalizes imported Merlin fixtures.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant VerifyContext
  participant UriReferenceResolver
  participant KeyResolver
  participant X509Chain
  participant CryptoProvider
  VerifyContext->>UriReferenceResolver: Resolve bounded same-document or caller-supplied external data
  VerifyContext->>KeyResolver: Resolve KeyInfo and RetrievalMethod sources
  KeyResolver->>X509Chain: Build and validate certificate path
  VerifyContext->>CryptoProvider: Digest and verify the signature
  CryptoProvider-->>VerifyContext: Return verification result
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR includes substantial XMLEnc encryption/decryption and generic provider and policy changes not required by #105's Merlin XMLDSig scope. Move unrelated XMLEnc, provider, and policy work to separate pull requests, or link issues that explicitly require those changes.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: completing Merlin XMLDSig interoperability.
Description check ✅ Passed The description directly covers Merlin interoperability, cryptographic support, resource handling, X.509 validation, testing, and documentation changes.
Linked Issues check ✅ Passed The changes address #105 through Merlin coverage, DSA-SHA1 and HMAC-SHA1 verification, bounded resources, RetrievalMethod, X.509, CRL, Manifest, and regression tests.
Docstring Coverage ✅ Passed Docstring coverage is 82.52% which is sufficient. The required threshold is 80.00%.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#105-merlin-interop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 164a9bb4e9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread tests/merlin_interop.rs Outdated
Comment thread src/xmldsig/uri.rs Outdated
Comment thread src/xmldsig/verify.rs
Comment thread src/xmldsig/verify.rs Outdated
Comment thread src/xmldsig/keys.rs Outdated
Comment thread src/xmldsig/keys.rs Outdated
Comment thread src/xmldsig/keys.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/xmldsig/verify.rs (1)

1168-1172: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

The per-signature Reference cap no longer counts unsupported-transform Manifest references.

Line 1168 compares references.len() against MAX_REFERENCES_PER_SIGNATURE. After this change, a reference whose transform chain is unsupported is pushed to invalid at lines 1179-1190 and never to references. A Manifest that contains only such references therefore leaves references empty while invalid grows for every entry, and each entry allocates a ReferenceResult with an owned URI String.

The cap intends to bound the total references one signature may process, as its own message states. Count both collections.

Reachability is limited: Manifest parsing runs only after every SignedInfo reference digest and the SignatureValue validate, so the attacker must already hold a valid signature over the enclosing Object or Manifest. nodes_limit: 100_000 also caps total growth. The check is still wrong relative to its stated intent.

🐛 Proposed fix: apply the cap to parsed and invalid references together
-                if references.len() == MAX_REFERENCES_PER_SIGNATURE {
+                if references.len() + invalid.len() == MAX_REFERENCES_PER_SIGNATURE {
                     return Err(SignatureVerificationPipelineError::InvalidStructure {
                         reason: "signed Manifests exceed the per-signature Reference limit",
                     });
                 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/xmldsig/verify.rs` around lines 1168 - 1172, Update the per-signature
limit check in the Manifest reference-processing logic to count both supported
references in references and unsupported-transform entries in invalid. Enforce
MAX_REFERENCES_PER_SIGNATURE against their combined count before accepting
another entry, while preserving the existing InvalidStructure error and
collection behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/xmldsig.md`:
- Around line 6-7: Update the lead sentence in the XMLDSIG documentation to
remove the outdated “same-document” limitation, aligning its stated scope with
the caller-supplied external references documented later. Preserve the existing
feature list and wording otherwise.

In `@src/xmldsig/keys.rs`:
- Around line 44-66: Update HmacSha1VerificationKey and its VerifyingKey::verify
implementation to bind and enforce a configured expected HMAC-SHA1 output
length, rejecting signature_value lengths that differ before comparison. Remove
the caller-controlled prefix-length behavior while preserving the algorithm
mismatch and invalid-length failure paths.

In `@src/xmldsig/parse.rs`:
- Around line 495-504: Extract the shared “first element child after optional
XMLDSIG Transforms” traversal into a helper near the parsing logic, preserving
the existing missing-element and namespace checks. Update both
parse_reference_with_xpath_budget and reference_digest_method to call this
helper so their Transforms-then-DigestMethod walks remain identical, while
keeping each function’s subsequent parsing and error handling unchanged.
- Around line 796-819: Update parse_dsa_key_value to accept and ignore the
schema-defined optional children J, Seed, and PgenCounter after Y, while
retaining the required P, Q, G, and Y validation and ordering. Consume only
valid trailing elements, including the required Seed/PgenCounter pairing, and
return KeyValueInfo::Dsa for supported inputs instead of rejecting them as extra
children; preserve ParseError handling for malformed required structure.
- Around line 632-679: Update parse_retrieval_method_transforms to validate the
XPath expression by its namespace-resolved QName rather than requiring the
literal dsig prefix. Accept any prefix bound to XMLDSIG_NS while preserving the
ancestor-or-self::X509Data selection requirement, and retain the existing
namespace binding validation behavior.

In `@src/xmldsig/signature.rs`:
- Around line 298-303: Rename minimum_rsa_modulus_bits to reflect that it only
validates or enforces the algorithm in validate_rsa_public_key, and discard its
return value explicitly since minimum_modulus_bits remains the caller-provided
policy. Update the direct call in
ecdsa_algorithms_are_rejected_for_rsa_verification to use the renamed helper.
- Around line 219-228: Update DSA signature handling in VerificationKey::verify
and the DSA arm of verify_with_algorithm so Signature::from_components failures
are treated as a verification miss, returning Ok(false) and ultimately
DsigStatus::Invalid(SignatureMismatch) rather than propagating
InvalidSignatureFormat as DsigError::Crypto. Preserve the existing wrong-length
behavior and ensure malformed r or s components follow the same path.

In `@tests/merlin_interop.rs`:
- Around line 403-414: Replace the bare negative assertions with exact
error-variant matches and remove earlier competing failures: in
tests/merlin_interop.rs lines 403-414, configure UriTypeSet::ALL, provide
external_resources(&resources), and match the ambiguous-ID error; at lines
332-342, build the aggregate map from external_resources() and match the
total-size bound error; at lines 428-446, match the internal-DTD error for the
first assertion, then allow the URI class and provide resources for the
unsupported RetrievalMethod case so it matches the transform-compatibility
error.

---

Outside diff comments:
In `@src/xmldsig/verify.rs`:
- Around line 1168-1172: Update the per-signature limit check in the Manifest
reference-processing logic to count both supported references in references and
unsupported-transform entries in invalid. Enforce MAX_REFERENCES_PER_SIGNATURE
against their combined count before accepting another entry, while preserving
the existing InvalidStructure error and collection behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4f956903-ad41-42c5-bd61-327533d316e1

📥 Commits

Reviewing files that changed from the base of the PR and between 0bf4812 and 164a9bb.

📒 Files selected for processing (15)
  • Cargo.toml
  • README.md
  • docs/xmldsig.md
  • src/xmldsig/keys.rs
  • src/xmldsig/mod.rs
  • src/xmldsig/parse.rs
  • src/xmldsig/signature.rs
  • src/xmldsig/types.rs
  • src/xmldsig/uri.rs
  • src/xmldsig/verify.rs
  • src/xmldsig/x509.rs
  • src/xmldsig/xpath.rs
  • tests/donor_full_verification_suite.rs
  • tests/merlin_interop.rs
  • tests/uri_integration.rs

Comment thread docs/xmldsig.md
Comment thread src/xmldsig/keys.rs
Comment thread src/xmldsig/parse.rs
Comment thread src/xmldsig/parse.rs
Comment thread src/xmldsig/parse.rs
Comment thread src/xmldsig/signature.rs Outdated
Comment thread src/xmldsig/signature.rs Outdated
Comment thread tests/merlin_interop.rs
- track the complete Merlin fixture snapshot for hermetic CI\n- harden HMAC, legacy RSA, X509, RetrievalMethod, and Manifest paths\n- add regression coverage for every reviewed failure mode
@polaz

polaz commented Aug 5, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai Re: outside-diff Manifest reference cap finding — fixed in d9a013c. The aggregate guard now counts both successfully parsed references and unsupported-transform results before accepting another entry. manifest_reference_limit_counts_unsupported_entries covers a Manifest made entirely of unsupported references and proves the shared cap.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

git show --stat --oneline --decorate --no-renames d9a013c
git show --format=fuller --find-renames --find-copies -- src/xmldsig/verify.rs tests/merlin_interop.rs d9a013c

printf '\n--- Manifest limit guard contexts on the PR branch ---\n'
rg -n -C 8 'manifest_reference_limit_counts_unsupported_entries|unsupported.*transform|reference.*limit|Manifest' \
  src/xmldsig/verify.rs tests/merlin_interop.rs

Length of output: 83253


@polaz Confirmed. In src/xmldsig/verify.rs, the guard now counts references and invalid entries before it parses the next Manifest reference. Unsupported-transform references therefore consume the shared per-signature limit.

manifest_reference_limit_counts_unsupported_entries creates one entry beyond MAX_REFERENCES_PER_SIGNATURE using only unsupported transforms. It asserts the expected structural-limit error.


If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

You are interacting with an AI system.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
tests/merlin_interop.rs (1)

480-486: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Negative assertions in rejects_dtd_and_unsupported_retrieval_defaults do not pin the intended failure. Both assertions match an outer error variant only. In each case a different code path can satisfy the match, so the rule under test is not proven. Pin the exact failure at each site.

  • tests/merlin_interop.rs#L480-L486: bind the error and assert DsigError::DisallowedUri { uri } where uri == "http://www.w3.org/TR/xml-stylesheet", because enforce_reference_policies rejects the SignedInfo reference before materialize_retrieval_methods evaluates the RetrievalMethod URI. Add a second case that allows the reference URI class but not the RetrievalMethod URI class to prove that policy.
  • tests/merlin_interop.rs#L458-L472: match the inner ParseKeyInfo error for the unsupported RetrievalMethod transform shape instead of ParseKeyInfo(_).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/merlin_interop.rs` around lines 480 - 486, The negative assertions in
rejects_dtd_and_unsupported_retrieval_defaults must pin the intended failures:
at tests/merlin_interop.rs:480-486, bind DsigError::DisallowedUri and assert uri
equals "http://www.w3.org/TR/xml-stylesheet", then add a case permitting the
reference URI class while rejecting the RetrievalMethod URI class; at
tests/merlin_interop.rs:458-472, match the specific inner ParseKeyInfo error for
the unsupported RetrievalMethod transform rather than accepting any ParseKeyInfo
variant.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/xmldsig/verify.rs`:
- Around line 2429-2459: Extend retrieval-method test coverage for the ambiguous
`(Some, Some)` relation by adding a fixture with an `X509Data` target containing
a descendant `X509Data`, then add a separate test named
`retrieval_method_rejects_ambiguous_x509_data_relation` that expects
`materialize_retrieval_methods` to return `InvalidStructure` with reason
`"X509Data RetrievalMethod selected multiple X509Data elements"`.

In `@tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/Readme.txt`:
- Around line 36-40: Update the key-resolution instructions in the README to
replace the placeholder common name “Xxx” with “Lugh” and replace
“certs/xxx.crt” with the actual certificate filename under certs/ that contains
Lugh’s subject common name.

In
`@tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1-40.tmpl`:
- Line 6: Restore the 40-bit negative HMAC test vector by changing
HMACOutputLength to 40 in both
tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1-40.tmpl:6-6
and
tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1-40.xml:6-14,
then regenerate the XML fixture’s matching SignatureValue to reflect the updated
SignedInfo.

In `@tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature.xml`:
- Around line 143-152: Add a concise code comment at the descendant-selection
branch in materialize_retrieval_methods documenting that this fixture declares
ancestor-or-self::dsig:X509Data while `#object-4` contains X509Data as a
descendant, so the deliberate relaxation must be preserved. Do not alter the
selection behavior.

---

Outside diff comments:
In `@tests/merlin_interop.rs`:
- Around line 480-486: The negative assertions in
rejects_dtd_and_unsupported_retrieval_defaults must pin the intended failures:
at tests/merlin_interop.rs:480-486, bind DsigError::DisallowedUri and assert uri
equals "http://www.w3.org/TR/xml-stylesheet", then add a case permitting the
reference URI class while rejecting the RetrievalMethod URI class; at
tests/merlin_interop.rs:458-472, match the specific inner ParseKeyInfo error for
the unsupported RetrievalMethod transform rather than accepting any ParseKeyInfo
variant.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e72f5e14-8e41-4653-aa57-4fb1e380a5d8

📥 Commits

Reviewing files that changed from the base of the PR and between 164a9bb and d9a013c.

⛔ Files ignored due to path filters (10)
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/badb.pem is excluded by !**/*.pem
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/balor.pem is excluded by !**/*.pem
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/bres.pem is excluded by !**/*.pem
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/ca.pem is excluded by !**/*.pem
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/lugh-cert.pem is excluded by !**/*.pem
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/lugh.pem is excluded by !**/*.pem
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/macha.pem is excluded by !**/*.pem
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/merlin.pem is excluded by !**/*.pem
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/morigu.pem is excluded by !**/*.pem
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/nemain.pem is excluded by !**/*.pem
📒 Files selected for processing (46)
  • .gitattributes
  • docs/xmldsig.md
  • scripts/import-donor-fixtures.sh
  • src/xmldsig/keys.rs
  • src/xmldsig/parse.rs
  • src/xmldsig/signature.rs
  • src/xmldsig/verify.rs
  • src/xmldsig/x509.rs
  • tests/fixtures/xmldsig/external-data/xml-stylesheet-2005
  • tests/fixtures/xmldsig/external-data/xml-stylesheet-2005.b64
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/Readme.txt
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/badb.der
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/balor.der
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/ca.der
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/lugh-cert.der
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/lugh.der
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/macha.der
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/merlin.der
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/certs/nemain.der
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloped-dsa.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-b64-dsa.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-b64-dsa.xml
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-dsa.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-dsa.xml
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1-40.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1-40.xml
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1.xml
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-rsa.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-external-b64-dsa.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-external-b64-dsa.xml
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-external-dsa.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-external-dsa.xml
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-keyname.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-keyname.xml
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-retrievalmethod-rawx509crt.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-retrievalmethod-rawx509crt.xml
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-x509-crt-crl.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-x509-crt.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-x509-is.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-x509-ski.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-x509-sn.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature.xml
  • tests/fixtures_smoke.rs
  • tests/merlin_interop.rs

Comment thread src/xmldsig/verify.rs
Comment thread tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/Readme.txt Outdated
Comment thread tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature.xml

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d9a013c335

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/verify.rs Outdated
Comment thread src/xmldsig/verify.rs Outdated
Comment thread src/xmldsig/parse.rs Outdated
Comment thread src/xmldsig/parse.rs Outdated
- Preserve KeyInfo source order and bound X.509 materialization
- Parse complete simple-content text across XML node splits
- Separate reference and key-retrieval URI policies
- Normalize misleading Merlin donor artifacts reproducibly
@polaz

polaz commented Aug 5, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai Re: the outside-diff negative-assertion finding — fixed. The tests now match the exact unsupported-XPath ParseError and exact disallowed URI, and VerifyContext now separates signed-payload URI policy from RetrievalMethod URI policy so the second test isolates external key retrieval.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- Recent commits ---'
git log -8 --oneline --decorate

printf '%s\n' '--- Candidate files ---'
fd -t f '^(verify|merlin_interop)\.rs$' src tests

printf '%s\n' '--- Module outline ---'
ast-grep outline src/xmldsig/verify.rs --items all --type function,struct,impl --match 'VerifyContext|RetrievalMethod|Uri|URI|verify'

printf '%s\n' '--- Exact assertion and URI policy contexts ---'
rg -n -C 10 -i \
  'unsupported.*xpath|xpath.*unsupported|disallowed.*uri|uri.*disallowed|retrieval.*uri|external.*uri|VerifyContext|RetrievalMethod' \
  src/xmldsig/verify.rs tests/merlin_interop.rs

Length of output: 1584


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- e0ac4b2 patch for relevant files ---'
git show --format=fuller --find-renames --find-copies e0ac4b2 -- \
  src/xmldsig/verify.rs tests/merlin_interop.rs

printf '%s\n' '--- VerifyContext and verification function map ---'
ast-grep outline src/xmldsig/verify.rs --items all --type struct,function --match 'VerifyContext|verify|retrieval|uri|Uri'

printf '%s\n' '--- Relevant implementation and test contexts ---'
rg -n -i -C 12 \
  'unsupported.*xpath|xpath.*unsupported|disallowed.*uri|uri.*disallowed|retrieval.*uri|external.*uri|VerifyContext|RetrievalMethod' \
  src/xmldsig/verify.rs tests/merlin_interop.rs

Length of output: 163989


@polaz Confirmed on e0ac4b2.

tests/merlin_interop.rs now asserts the exact unsupported XPath error:

DsigError::ParseKeyInfo(ParseError::InvalidStructure("unsupported RetrievalMethod XPath selection"))

The test also separates the URI cases. It first asserts rejection of the signed-payload URI. It then allows signed-payload URIs and asserts rejection of the external RetrievalMethod URI.

VerifyContext::allowed_retrieval_method_uri_types is independent from VerifyContext::allowed_uri_types. materialize_retrieval_methods uses the retrieval-method policy. This isolates external key retrieval as required.


✏️ Learnings added
Learnt from: polaz
URL: https://github.com/structured-world/xml-sec/pull/106

Timestamp: 2026-08-05T09:18:02.390Z
Learning: In `src/xmldsig/verify.rs`, `VerifyContext::allowed_uri_types` controls signed-payload `<Reference>` URI classes, while `VerifyContext::allowed_retrieval_method_uri_types` independently controls `<KeyInfo>` `RetrievalMethod` URI classes. External signed payload permission must not implicitly enable external key retrieval.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

You are interacting with an AI system.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e0ac4b2ccf

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/verify.rs Outdated
Comment thread src/xmldsig/x509.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/import-donor-fixtures.sh`:
- Around line 51-55: Update the HMAC rename loop in normalize_imported_snapshot
to verify each signature-enveloping-hmac-sha1-40 source file exists before
calling mv, and fail with an actionable message identifying the changed or
missing donor fixture. Because this function may now return non-zero, update its
caller to propagate the status so cleanup occurs and replace_target is not run
on an incomplete snapshot.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3397fad8-dd2c-426c-a530-5be96c22bd3d

📥 Commits

Reviewing files that changed from the base of the PR and between d9a013c and e0ac4b2.

📒 Files selected for processing (8)
  • docs/xmldsig.md
  • scripts/import-donor-fixtures.sh
  • src/xmldsig/parse.rs
  • src/xmldsig/verify.rs
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1-80.tmpl
  • tests/fixtures/xmldsig/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1-80.xml
  • tests/fixtures_smoke.rs
  • tests/merlin_interop.rs

Comment thread scripts/import-donor-fixtures.sh
- Require external URIs for raw X509 retrieval
- Preserve DSA fallback during rollover validation
- Fail donor fixture normalization without partial installs

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8fd4a488d9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/parse.rs Outdated
Comment thread src/xmldsig/verify.rs Outdated
Comment thread src/xmldsig/keys.rs Outdated
- accept schema-valid partial DSAKeyValue sources without aborting ordered fallback
- share same-document ID parsing across retrieval and manifest paths
- redact HMAC secret material from Debug output

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 155520bf3f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/parse.rs
polaz added 2 commits August 5, 2026 14:05
- Pin the unreleased upstream snapshot by commit and checksum
- Enforce RFC 5280 X.509 serial bounds and XML whitespace rules
- Add SHA-256 X509Digest coverage and a verification fuzz target
- Decode only XML text nodes in CryptoBinary simple content
- Cover comment-split DSA and RSA key parameters

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fbfb5c76af

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/verify.rs Outdated
Comment thread src/xmldsig/parse.rs Outdated
Comment thread src/xmldsig/verify.rs Outdated
Comment thread src/xmldsig/verify.rs Outdated
polaz added 2 commits August 5, 2026 15:25
- enforce transform policy from the terminal data type
- preserve unsupported advisory retrieval methods
- bound external XML parsing and retained diagnostics
- run fuzz smoke explicitly on nightly
Keep cargo-fuzz 0.13.1 pinned while allowing compatible transitive patch releases on current nightly.
@polaz

polaz commented Aug 5, 2026

Copy link
Copy Markdown
Member Author

@codex review

@polaz

polaz commented Aug 5, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/install-xmlsec1.sh`:
- Around line 63-66: Update the installation replacement flow around the
staged-prefix mv to restore work_dir/previous-install to prefix if that move
fails, before the EXIT trap removes the working installation. Preserve the
existing backup move and successful staged installation behavior.

In `@src/xmldsig/parse.rs`:
- Around line 1531-1557: Update the serial conversion logic before
format_x509_serial_value_hex to reject a bytes buffer containing only zeroes,
while preserving existing validation and overflow checks. Extend the relevant
rejection tests to cover zero-valued inputs such as "0" and "000".

In `@tests/common/xmlsec1.rs`:
- Around line 11-22: Update version_supports_interop to locate the xmlsec1
prefix, parse only the immediately following token as the version, and reject
inputs without that prefix or with non-numeric, missing, or extra version
components. Preserve the REQUIRED_VERSION comparison using exactly three numeric
components.

In `@tests/fixtures/xmldsig/README.md`:
- Around line 29-30: Update the README’s algorithm support statements to reflect
that DSA-SHA1 and HMAC-SHA1 verification are supported, while documenting only
the remaining unsupported DSA and HMAC variants as fail-closed. Keep the
surrounding X.509 and signing support descriptions unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 6cc7e228-8650-48c2-83a5-bac724cb8751

📥 Commits

Reviewing files that changed from the base of the PR and between 155520b and fa4a088.

📒 Files selected for processing (21)
  • .github/workflows/ci.yml
  • .gitignore
  • README.md
  • fuzz/Cargo.toml
  • fuzz/corpus/xmldsig_verify/signature.xml
  • fuzz/fuzz_targets/xmldsig_verify.rs
  • scripts/import-donor-fixtures.sh
  • scripts/install-xmlsec1.sh
  • src/hard_limits.rs
  • src/lib.rs
  • src/xmldsig/keys.rs
  • src/xmldsig/parse.rs
  • src/xmldsig/transforms.rs
  • src/xmldsig/verify.rs
  • tests/common/xmlsec1.rs
  • tests/fixtures/xmldsig/README.md
  • tests/fixtures/xmldsig/aleksey-xmldsig-01/enveloped-x509-digest-sha256.xml
  • tests/fixtures/xmlenc/README.md
  • tests/fixtures_smoke.rs
  • tests/xmlenc_encrypt_xmlsec1.rs
  • tests/xmlsec1_interop.rs

Comment thread scripts/install-xmlsec1.sh
Comment thread src/xmldsig/parse.rs Outdated
Comment thread tests/common/xmlsec1.rs Outdated
Comment thread tests/fixtures/xmldsig/README.md

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fa4a088110

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/parse.rs Outdated
Comment thread src/xmldsig/verify.rs Outdated
Comment thread src/xmldsig/parse.rs Outdated
- make xmlsec1 replacement transactional through validation
- enforce ordered X.509 names and positive serials
- support direct typed X509Data retrieval safely
- tighten interop version parsing and fixture documentation
@polaz

polaz commented Aug 6, 2026

Copy link
Copy Markdown
Member Author

@codex review

- Validate EncryptedData IDs with the shared XML NCName grammar
- Reject malformed custom-provider AES framing before serialization
- Document provider-controlled content-key randomness

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 18eb17c8a1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/x509.rs
Comment thread src/xmlenc/encrypt.rs
- Reject empty NameConstraints DER structures before path matching
- Bound complete standalone EncryptedData fragments after serialization
- Document both validation contracts and their regression coverage

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 15e0a81937

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmlenc/encrypt.rs
Enforce RFC 3394 output framing at the XMLEnc facade boundary so malformed custom-provider output cannot be serialized as an interoperable EncryptedKey.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e4d67126d7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/verify.rs Outdated
Comment thread src/xmlenc/decrypt.rs
Comment thread src/xmldsig/x509.rs Outdated
Comment thread src/xmldsig/x509.rs
Comment thread src/xmlenc/parse.rs Outdated
- enforce provider-independent KEK and metadata bounds
- add typed leaf EKU policy with end-to-end coverage
- clarify resolved retrieval identities and CA criticality semantics

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e42d41800a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/keys.rs Outdated
Comment thread src/xmldsig/digest.rs Outdated
Comment thread src/xmldsig/x509.rs Outdated
Comment thread src/xmldsig/x509.rs
Comment thread src/xmlenc/encrypt.rs Outdated
- compose resolver and operation EKU policy across complete X.509 paths
- reject invalid digest, CRL reason, and RSA transport provider output
- add regression coverage and synchronize XMLDSig documentation

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7fab10a481

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/sign.rs
Comment thread src/xmlenc/decrypt.rs
Comment thread src/xmlenc/decrypt.rs
Comment thread src/xmlenc/decrypt.rs

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0448fb03a2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/sign.rs Outdated
Comment thread src/xmlenc/encrypt.rs

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6f8ee3e987

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/policy.rs Outdated
Comment thread src/xmlenc/encrypt.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/xmlenc/encrypt.rs`:
- Around line 572-574: Update the encryption flow around provider.encrypt_data
and validate_ciphertext_framing to require the exact ciphertext length derived
from algorithm and plaintext.len(), rejecting overlong AES-GCM output and
block-aligned overlong AES-CBC output before serialization. Add provider tests
covering both overlong GCM and CBC results.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 8115be1a-83c8-4b1f-af38-e16d28d7b486

📥 Commits

Reviewing files that changed from the base of the PR and between ab23ba6 and 6f8ee3e.

📒 Files selected for processing (24)
  • README.md
  • docs/xmldsig.md
  • docs/xmlenc.md
  • src/hard_limits.rs
  • src/policy.rs
  • src/provider.rs
  • src/xml.rs
  • src/xmldsig/builder.rs
  • src/xmldsig/digest.rs
  • src/xmldsig/keys.rs
  • src/xmldsig/parse.rs
  • src/xmldsig/sign.rs
  • src/xmldsig/signature.rs
  • src/xmldsig/transforms.rs
  • src/xmldsig/verify.rs
  • src/xmldsig/x509.rs
  • src/xmlenc/decrypt.rs
  • src/xmlenc/encrypt.rs
  • src/xmlenc/parse.rs
  • src/xmlenc/types.rs
  • tests/donor_negative_vectors.rs
  • tests/signing_digest.rs
  • tests/x509_chain_integration.rs
  • tests/xmlenc_encrypt_integration.rs

Comment thread src/xmlenc/encrypt.rs
polaz added 2 commits August 12, 2026 12:30
- Measure RSA modulus strength by mathematical bit length
- Bound generated EncryptedData nodes before returning output
- Preserve projected-document and provider-framing coverage
- Derive the exact CBC and GCM wire length from plaintext
- Reject overlong custom-provider output before serialization
- Cover block-aligned CBC and one-byte GCM excess
@polaz

polaz commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3822b334db

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmlenc/decrypt.rs
Comment thread src/policy.rs Outdated
Comment thread src/xmldsig/x509.rs Outdated
Comment thread src/xmldsig/keys.rs Outdated
- validate custom decryption output framing

- accept unsigned RSA exponents with a high bit

- require bounded CRL validity windows

- reject conflicting verification clocks

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 765c6fa1d1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/uri.rs Outdated
Comment thread src/xmlenc/decrypt.rs Outdated
Comment thread src/xmldsig/verify.rs
- bypass inherited xml:base for absolute resource identities
- share XML byte ceilings across signing, verification, and encryption
- exclude internal fragment wrappers from caller node accounting
@polaz

polaz commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 34971e11a4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/sign.rs Outdated
Comment thread src/xmldsig/parse.rs Outdated
Comment thread src/xmldsig/x509.rs
- reject malformed provider digests before ECDSA prehash signing
- align X.509 decimal selectors with sign-padded serials
- validate every revoked-certificate serial in CRLs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/xmlenc.md (1)

37-48: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Scope the explicit MGF claim to the modern RSA-OAEP URI.

The text says xml-sec always emits an explicit xenc11:MGF. It also says that the legacy rsa-oaep-mgf1p URI has no MGF field. These statements conflict.

State that the explicit DigestMethod and MGF claim applies to the XML Encryption 1.1 RSA-OAEP URI. Document the legacy URI exception.

Proposed documentation fix
-`xml-sec` always emits explicit `ds:DigestMethod` and `xenc11:MGF` values rather than relying on
-those implicit legacy defaults. SHA-1 OAEP remains available only through explicit parameters.
+For the XML Encryption 1.1 RSA-OAEP URI, `xml-sec` emits explicit `ds:DigestMethod` and
+`xenc11:MGF` values rather than relying on implicit legacy defaults. The legacy
+`rsa-oaep-mgf1p` URI fixes MGF1 to SHA-1 and has no `xenc11:MGF` field.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/xmlenc.md` around lines 37 - 48, Update the RSA-OAEP documentation
around the explicit DigestMethod and MGF statement to scope it to the XML
Encryption 1.1 RSA-OAEP URI, and explicitly state that the legacy rsa-oaep-mgf1p
URI is an exception because it has no wire-level MGF field. Keep the existing
SHA-1 availability and validation details consistent with this distinction.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/xmlenc.md`:
- Around line 116-117: Update the decryption section in docs/xmlenc.md to
document the two-gate DTD requirement: internal DTD parsing is enabled only when
both EncryptionPolicy::xml.allow_internal_dtd and
DocumentDecryptionOptions::allow_dtd are true. State that the per-call option
cannot weaken the operation policy.

---

Outside diff comments:
In `@docs/xmlenc.md`:
- Around line 37-48: Update the RSA-OAEP documentation around the explicit
DigestMethod and MGF statement to scope it to the XML Encryption 1.1 RSA-OAEP
URI, and explicitly state that the legacy rsa-oaep-mgf1p URI is an exception
because it has no wire-level MGF field. Keep the existing SHA-1 availability and
validation details consistent with this distinction.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 11883530-e1e2-40e2-89f1-60102bbd64ab

📥 Commits

Reviewing files that changed from the base of the PR and between 765c6fa and f696d66.

📒 Files selected for processing (15)
  • docs/xmldsig.md
  • docs/xmlenc.md
  • src/c14n/xml_base.rs
  • src/hard_limits.rs
  • src/policy.rs
  • src/provider.rs
  • src/xmldsig/parse.rs
  • src/xmldsig/sign.rs
  • src/xmldsig/uri.rs
  • src/xmldsig/verify.rs
  • src/xmldsig/x509.rs
  • src/xmlenc/decrypt.rs
  • src/xmlenc/encrypt.rs
  • src/xmlenc/parse.rs
  • tests/signing_digest.rs

Comment thread docs/xmlenc.md

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f696d6669b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/xmldsig/verify.rs
Comment thread src/xmlenc/encrypt.rs Outdated
- validate XMLDSig signature framing before provider dispatch
- exclude temporary fragment wrappers from caller node limits
- clarify OAEP and DTD policy documentation
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(xmldsig): complete Merlin interoperability

1 participant