feat(seal): eID Easy QES sealing — wire types and decision record - #57
Draft
LKSNDRTMLKV wants to merge 1 commit into
Draft
feat(seal): eID Easy QES sealing — wire types and decision record#57LKSNDRTMLKV wants to merge 1 commit into
LKSNDRTMLKV wants to merge 1 commit into
Conversation
Up to standards ✅🟢 Issues
|
| Metric | Results |
|---|---|
| Complexity | 0 |
| Duplication | 0 |
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
Lands the request/response types and the HMAC message helper for eID Easy Cloud Direct e-Sealing, and marks the crate's CSC/JAdES assumptions superseded; the HTTP call is a reserved seat pending sandbox credentials. The provider decision itself is recorded privately as ADR-009, since it carries commercial state.
LKSNDRTMLKV
force-pushed
the
feat/eideasy-qeseal
branch
from
July 28, 2026 11:23
167330b to
31033d0
Compare
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
Draft — parked until eID Easy sandbox credentials arrive. Opened now so the sealing work has a home and stays off every other branch while we wait.
dpp-sealwas built against an assumption — the Cloud Signature Consortium API producing JAdES — that does not match the provider actually being onboarded. This records the corrected decision and lands the wire types for it. No behaviour changes:QtspSealAdapterstill delegates toGhostSeal, and a production node still refuses to boot while the seal port resolves to a ghost.Related issue
None. Decision record lives with the crate:
crates/dpp-seal/DECISION-eideasy-cades.md.Changes
credentials/sign, and not JAdES. The doc separates[verified]facts from[confirm]items still open with the provider.eideasymodule added —EsealRequest/EsealFile/EsealResponse/EsealSignatureOutwire types, andhmac_message(), the pure helper that composesMETHOD + PATH + X-Timestamp + RAW_BODY. Both are unit-tested against the documented example without network or crypto.client.rsis a reserved seat, not an implementation. The HTTP call is deliberately absent until sandbox credentials exist — the module doc carries the full wiring plan so whoever picks it up does not re-derive it.csc/mod.rsis flagged superseded (retained only as a possible alternate-QTSP path),lib.rs's module doc no longer describes CSC/OAuth as the model, andtests.rssays explicitly that itsSealFormat::Jadesis stale and awaiting aCadesvariant indpp_domain.Why CAdES is not a downgrade
eIDAS Art. 35(2) attaches the integrity/origin presumption to a seal being qualified — a qualified certificate from a QTSP — not to the AdES envelope. CAdES, XAdES and PAdES are of equal standing; CAdES is the CMS-based form for arbitrary content, which is exactly digest-sealing. Detached-CAdES-over-hash also fits proof-bound better than enveloped JAdES: only a hash and a detached signature ever leave the node.
Not yet claimable: no public source was found stating the EU DPP registry accepts CAdES specifically. It almost certainly validates the certificate chain rather than the envelope flavour, but until that is confirmed against the registry conformance profile, "registry-conformant CAdES" must not be stated as fact anywhere customer-facing.
What is blocked, and what is not
The sandbox needs no legal entity — it issues developer credentials and seals with eID Easy's own test certificates. The entity, the QTSP document list and the ~2-week registration gate production only. So the entire pipeline can be wired and green-tested before incorporation; going live is then a credential swap against the same code path.
Blocked on: sandbox
client_id+ e-seal HMAC key (account created, approval pending).Checklist
just lintpasses locallyjust fmtappliedjust testpasses (unit) —dpp-seal7/7; no persistence/lifecycle/auth change, so the Docker tiers are unaffectedprintln!/eprintln!/dbg!in service-cratesrc/.envfiles in the diffBefore this leaves draft
client.rsimplemented per the module doc — serialize the body once, HMAC those exact bytes, send those exact bytes.reqwest's.json()re-serializes and silently breaks the HMAC.SealFormat::Cadesadded indpp_domain, andtests.rsswitched offJades.test.eideasy.com, the returned CAdES validated by an independent validator (not our own code), a rotated key producing a clean typed error rather than a panic, andGhostSealfallback still intact.[confirm]items in §9 closed with the provider.