Source and identity requirements¶
These requirements cover how a source describes its own services and how GBO activates that description. They also cover how the legal identity of a party follows from its certificate. For the design, see Source onboarding and Identity and trust.
This page has the following parts:
Source metadata and activation requirements¶
These requirements cover how a source publishes its service description, and how GBO validates and activates that description. REQ-64 applies to every GBO-delivered component that must know something per source or per service, in every data flow: EUDI issuance, the ASIP, and the consent facility (toestemmingsvoorziening) of DvTP. REQ-65 and REQ-66 describe activation as the issuance route and the shared Source Registry implement it.
The demo builds the description for two channels. EUDI issuance reads the
eudi capability. Since ICTU/GBO-demo#592,
the ASIP reads the asi capability (schema version 1.1) from the same
Source Registry. In demo v0.9.0, the offer of a source for DvTP is in the
GBO rules. The source does not publish it.
F-57 and F-58 give the background. ADR 0016 records the mechanism.
Evidence links to gbo-demo point at tag v0.9.0.
REQ-64: A GBO component works only with the service description the source publishes itself, after validation¶
A GBO-delivered component MUST take the service description of a source only from what the source publishes itself. The description covers the data service, the query with declared parameters, the mapping, the attestation schema, the validity per attestation type, and the offer. The component MUST NOT keep that description itself, add to it, or carry it per source in code. This applies to every GBO-delivered component that must know something per source or per service, in every data flow. These data flows are issuance, the ASIP, and the consent facility (the offer of the source per data set). A new service or data set of a source MUST be usable without a code change in such a component.
Before use, the component MUST validate the description on schema, origin (the publishing party is the bronhouder of the certificate set), version, validity window, and binding to the contract for the data service. The runtime MUST work only from a validated, activated version (REQ-66). Every request that follows from it goes through the PDP of the source (REQ-44). The description MUST name the read API of the logbook of the source, and the chain MUST fill
dpl.read.nextLogbookIdfrom it.If the answer of the source does not fit the published mapping exactly, or holds more than one result, issuance MUST refuse. It MUST NOT pick a result, and it MUST NOT add or convert a value.
| Case | Outcome |
|---|---|
| Valid description, OIN equal to the certificate set, contracts present | candidate activated |
| OIN in the description differs from the certificate set | not activated: METADATA_INVALID |
| No contract for the data service the description names | not activated: DATA_CONTRACT_NOT_FOUND |
| Query is not exactly one read operation, or unknown mapping profile | not activated: METADATA_INVALID |
Valid for less than one hour, or expires_at not after issued_at |
not activated: METADATA_INVALID |
| Issuance request with parameters outside the published offer | refused (HTTP 400) |
| Answer does not fit the mapping (path missing, other datatype, result not a list) | no attestation (HTTP 502): GBO_SIMPLE_PATH_MISSING, GBO_SIMPLE_TYPE_MISMATCH, GBO_SIMPLE_RESULT_TYPE (code) |
| Answer with more than one result | no attestation (HTTP 502): GBO_SIMPLE_RESULT_AMBIGUOUS (code) |
| Answer without a result | no attestation (HTTP 404) (code) |
| Source without its own endpoint, where the operator maintains the document | admitted as an exception, visible as unauthenticated transport, lapses after expires_at |
| Read API of the logbook in the description | proposal and not built |
- Status: ready for review
Source, evidence and notes
- Source: design:
- PSA S07 ("the bronhouder can in principle add new services through the source-specific GBO configuration")
- PSA S10 ("the bronhouder manages a source-specific GBO configuration that records which data services are available for which data flows, and which schemas, mappings and other processing instructions apply", "central GBO facilities can consult the configuration relevant to them in machine readable form", "the configuration can be validated, versioned and traced")
- PSA S11 (the bronhouder records mapping and attestation schema in its GBO configuration)
- GO ("the mapping happens centrally with the settings from the decentral configuration component")
- Implementing Regulation (EU) 2025/1569, Annex II point 2(b) (verify the identity of the authentic source)
- P-10
- for the exception: D-13
- Addressee: GBO-delivered component: the reconciler and the runtime of the EUDI adapter, the ASIP, and the consent facility. Interface agreement: the form of the publication and the validation rules. What the bronhouder must publish is in AV-07 and AV-08.
- Evidence: PR #219,
PR #224,
PR #242,
PR #318,
PR #463,
#592.
- Publication at
/.well-known/gbo:brp-graphql-server/main.go#L938andgraphql-server/main.go#L360, with the documentgbo-source-metadata.json. - Schema with version 1.0 or 1.1 (1.1 adds
asi):gbo-source-metadata-v1.schema.json#L17-L23. - Origin and contract:
source-registry/onboarding/service.go#L403-L413. - Content: one read operation in
source_metadata.go#L130-L141. The validity window is insource_metadata_cache.go#L29-L41, tested inmain_test.go#L628. - Offer:
source_metadata.go#L272-L296, tested inmain_test.go#L434. - GBO generates the SD-JWT VC Type Metadata from
displayandclaims:type_metadata.go#L64, tested intype_metadata_test.go#L120. - The ASIP reads the active release:
asi-provider/main.go#L101, tested inasi_onboarding_test.go#L152. - Exception without endpoint:
source-metadata/README.mdandservice.go#L18-L28,#L56-L66.
- Publication at
- Related: REQ-44, REQ-57, REQ-65, REQ-66, REQ-67, REQ-72, REQ-77, REQ-78, REQ-116, REQ-121, REQ-124, F-57, F-68, F-71, F-74, Q-14, Q-19, Q-38, ADR 0016, ADR 0017, ADR 0039.
- Notes:
- The requirement is built for EUDI issuance and, since #592, for the
ASIP. The Source Registry is a shared module in
services/source-registry. The ASIP reads the active release every 5 seconds. - The
eudicapability describes each attestation withtype_id,type_version,offers,graphql,mapping_profile,display, andclaims. Each claim has onegbo-simple-v1rule insource, a label, and ansdvalue. GBO derives the mapping and generates the Type Metadata from it. The schema has no separatemapping,attribute_schema, andtype_metadatablocks. - The
asicapability maps source fields onto GBO-catalogued attribute value schemas withpointer,join,const, andeach.gbo-simple-v1applies to theeudicapability only (ADR 0039). - For DvTP, the offer of a source is in the GBO rules
(
dvt0001.rego#L32-L44). The source does not publish it. For DvTP, the requirement covers the supply side. The legal ceiling per service, and whether a data set is mandatory or optional, come from the catalogue (FR-32, F-74, REQ-121, Q-45). - In demo v0.9.0, the origin check is authenticated transport (FSC) plus the OIN from the certificate set. The document itself is not signed.
- The exception for a source without an endpoint follows D-13. The
demo builds the exception as visible (
data_transport_authenticated) and temporary (expires_at). The agreement of the bronhouder is only an instruction in the README (AV-08, F-71). The local compose also has a source over unsecured HTTP. Deployments do not mount it (docker-compose.yml#L1868-L1870). - Not built: the logbook read API in the description. In demo v0.9.0,
the adapter gets it per caller from configuration
(
docker-compose.yml#L1819, F-68). Also not built: a reference to the DCAT-AP-NL description of the data service (S10: "refers to managed objects where possible"). - The content and the interface of the source configuration are an
open decision of PSA S10.
gbo-source-metadata-v1is the proposal of the demo. - The issuance runtime of nl-wallet reads its configuration only at start. That is a product property.
- The requirement is built for EUDI issuance and, since #592, for the
ASIP. The Source Registry is a shared module in
REQ-65: Only an explicit management action takes a source into use, and a valid contract is not enough¶
A valid FSC contract MUST NOT be enough to take a source into use or to publish its offer in the wallet. Taking a source into use MUST be an explicit management action, recorded in configuration apart from the contract. A validated service description MUST apply only after a separate promotion. A component MUST NOT discover and activate a source by itself.
| Case | Outcome |
|---|---|
| Valid metadata contract, no source configuration | nothing activated |
| Source configuration, no metadata contract | source blocked: METADATA_CONTRACT_NOT_FOUND |
| Source configuration, no contract for the data service | source blocked: DATA_CONTRACT_NOT_FOUND |
| Validated candidate without promotion | not active |
- Status: ready for review
Source, evidence and notes
- Source: design: PSA S04 ("participation needs a prior admission decision", "the set-up treats technical identity and admission status apart from the role and authority in a specific interaction") and P-07.
- Addressee: GBO-delivered component: the reconciler of the issuance facility.
- Evidence: PR #237,
PR #247.
- Configuration: one file per source in
sources/configured/, read insource_configuration.go#L16-L28. - No discovery, tested in
fsc_contract_discovery_test.go#L143. - Missing contract in
service.go#L346-L349, tested infsc_contract_discovery_test.go#L201. - Promotion as a separate step in
reconcile_command.go#L134-L151.
- Configuration: one file per source in
- Related: REQ-61, REQ-64, REQ-66, REQ-123, F-58, ADR 0016.
- Notes: design choice: automatic promotion is off by default
(
reconcile_command.go#L197). Compose and the Helm example turn it on (docker-compose.yml#L1865). In that case, adding the configuration file is the management action. Not built: who is allowed to do that action, and how the admission decision is recorded (PSA B-09). The configuration is a file in the repository.
REQ-66: Source metadata fails closed per source, ages within bounds, and can be rolled back¶
Source metadata can fail to validate, fall outside its validity, or fail to refresh within a grace period set in advance. In each of these cases, the metadata MUST fail closed for that source: no issuance follows on that metadata. The failure of one source MUST NOT stop issuance for other sources.
An activated version MUST be immutable, MUST be activated as a whole, and MUST be possible to roll back to an earlier valid version. A version number MUST identify one content. A candidate with the same version but other content MUST NOT be activated. A candidate with a lower version than the last validated candidate of that source MUST NOT be activated either. Only the explicit management action of REQ-65 can go back to an earlier version.
| Case | Outcome |
|---|---|
| Refresh fails, previous version within grace | source stale, and issuance on the previous version |
| Refresh fails, no previous version or grace over | source blocked |
| Active version of a source past grace | issuance for that source refused (HTTP 503) |
| Certificate set of one source missing | that source blocked, the others activated |
| One configured source without a valid version | no new release for any source, and the active release stays (deviates from the requirement, see notes) |
| One source past grace | offer list for all sources HTTP 503 (deviates from the requirement) |
| Roll back to a stored release | active. Automatic promotion does not undo that. |
| Roll back to a release the adapter cannot load | refused |
| Source publishes the same version with other content | not activated (code, no test) |
| Source publishes a lower version than the last validated one | not activated (code, no test) |
- Status: ready for review
Source, evidence and notes
- Source: design: PSA S10 ("the configuration can be validated, versioned and traced"). For the isolation, the requirement is derived. It serves P-15 and D-04. If the configuration of one source fails, issuance for other bronhouders must not fail with it.
- Addressee: GBO-delivered component: the reconciler, the release register, and the runtime of the issuance facility.
- Evidence: PR #205,
PR #276,
PR #463. Not built: the
test for the version rule
(ICTU/GBO-demo#610) and
the per-source isolation of promotion and offer list
(ICTU/GBO-demo#606).
- Grace in
service.go#L463-L476, tested infsc_contract_discovery_test.go#L549. - Refusal per source in
main.go#L221-L225. - Isolation tested in
service_test.go#L130. - Immutable and atomic in
store.go#L300-L390, tested instore_test.go#L94and#L147. - Rollback in
source_registry_command.go#L120-L143, tested insource_registry_command_test.go#L72andregistry_test.go#L116. - Version rule in
source_registry_backend.go#L163-L175.
- Grace in
- Related: REQ-64, REQ-65, REQ-124, F-52, F-59, ADR 0016, ADR 0021.
- Notes:
- Design choice: fresh for at most 15 minutes, one hour of grace, and
at least one hour of validity
(
source_metadata_cache.go#L10-L14). The source states arepending,active,stale,blocked, androllout_required. - Design choice: promotion of a new version needs a valid version of
every configured source. This way, no source drops out of the release
without notice
(
registry.go#L133-L158). As a result, new metadata of other sources waits until the failing source is repaired, or until the operator removes it from the configuration. - The offer list
/eudi-offers.jsontakes the shortest grace of all sources (source_release_runtime.go#L95-L100,#L298-L300). As a result, the list fails for all sources at the same time. That breaks the rule that the failure of one source must not stop issuance for other sources (#606). - Policy bundles do not have this lifecycle (F-52, F-59). PSA S06 asks the same for them ("on failure they fall back in a controlled way", "rollback procedure").
- Design choice: fresh for at most 15 minutes, one hour of grace, and
at least one hour of validity
(
Removed numbers¶
No numbers of this page were removed. The list of all removed numbers is on the requirements overview.
Identity, trust and transport requirements¶
These requirements cover how GBO establishes who an organization is, and how channels reach a source. FSC establishes the identity of the calling organization on every channel. The legal identity of a bronhouder (OIN and name) comes from its certificate. It does not come from configuration that an operator can fill in. Authorization for each request stays a separate layer: see Authorization.
ADR 0003 records FSC as the
transport. ADR 0023 records
the certificate roles. Evidence links to gbo-demo point at tag v0.9.0.
REQ-46: Every channel that calls a source on behalf of an external party does so through FSC, with a valid certificate¶
Every channel that calls a service of a bronhouder on behalf of an external party MUST do so through FSC. A channel MUST NOT enter the service of the bronhouder, or the authorization for it, directly. FSC establishes the identity of the calling organization. The authorization for each request (consent, PID binding, legal basis) stays a separate layer of the channel. If the certificate of the calling party is expired or revoked, the connection MUST be refused. The revocation check MUST NOT be disabled.
| Case | Outcome |
|---|---|
| Certificate of the calling party expired | connection refused |
| Certificate of the calling party revoked | connection refused, after the revocation propagates. Time limit: Q-53 |
| Revocation check disabled in an Inway, Outway or Manager | not allowed (proposal: not checked) |
- Status: ready for review
Source, evidence and notes
- Source: design:
- Addressee: interface agreement for every channel: DvTP, EUDI issuance (PuB-EAA), and the Authentic Source Interface.
-
- the backend of the service provider (dienstverlener)
(
main.go#L82) - the EUDI adapter
(
main.go#L115) - the ASIP
(
main.go#L83-L85)
Evidence: all three channels call through their own FSC Outway:
Nobody checked the revocation behavior.
- the backend of the service provider (dienstverlener)
(
- Notes:
- FSC establishes the organization. That says nothing about what the organization is allowed to do in each request. The regime for each request follows from the evidence that the request carries (REQ-74).
- open-fsc checks revocation with a CRL cache. An operator can switch the check off for each Inway, Outway, and Manager. Without this requirement, that switch is a silent configuration choice.
- The time within which a revocation must take effect is Q-53.
- The consent process blocks through the status in the register (REQ-111), as long as the initiation is not bound to the certificate (Q-60).
REQ-67: The legal identity of a bronhouder comes from its certificate and not from configuration¶
A GBO component can put the legal identity of a bronhouder (OIN and organization name) in an attestation or a decision record. The component MUST then take it from verified certificate material of that bronhouder. A value that an operator can fill in freely MUST NOT be the source for it.
| Case | Outcome |
|---|---|
Certificate with the OIN in serialNumber and exactly one organization name |
OIN and name come from the certificate |
| Configured OIN or name differs from the certificate | refused: the certificate set is not loaded |
| Certificate without a 20-digit OIN, or without exactly one organization name | refused |
- Status: draft
Source, evidence and notes
- Source: design:
- Addressee: GBO-delivered component: the source registration of the EUDI adapter.
- Evidence: PR #242,
PR #247,
PR #321. Code and tests:
- The derivation is in
development_ca_provider.go#L242-L253and#L280-L288, tested indevelopment_ca_provider_test.go#L152. - A set without OIN or name blocks the source:
source-registry/onboarding/service.go#L293-L297. - The organization description goes into the certificate through
onboarding.go#L182.
- The derivation is in
- Related: REQ-58, REQ-64, F-60, Q-06, Q-07, Q-68, ADR 0023.
- Notes:
- It is open whether policy can read the Peer ID of a consumer as its OIN: Q-68.
- In FSC the Peer ID is the
subject.serialNumberof the FSC certificate. If the peer is the bronhouder itself, the Peer ID is the OIN. One peer can offer services of more than one bronhouder. So the source configuration keepsprovider_peer_idapart from the OIN in the certificate (source_configuration.go#L35-L44). - The runtime gets leaf material and public CA certificates. It gets no
CA private keys
(
development_ca_provider_test.go#L128). - Consents are bound to the identity of the consumer. A change of that identity makes them unusable (PR #244, PR #277).
- In the default demo onboarding, RvIG is published through the Belastingdienst peer with the Belastingdienst OIN. That is a demo shortcut, and it does not show one OIN for each bronhouder. The certificate sets still differ for each source.
Removed numbers¶
- REQ-01: removed. Organization attributes from a register described FSC and OpenFTV behavior that no longer exists.
- REQ-02: merged into REQ-61 (admission comes from a register).
- REQ-03: removed. A verified token before each query described code that no longer exists.
The list of all removed numbers is on the requirements overview.