Castell · SkyV2X

ETSI TS 102 941 · trust & privacy

The spec that ties
every cert in C-ITS together.

ETSI TS 102 941 is the trust and privacy management protocol for cooperative ITS. It defines who issues what, how enrolment turns into pseudonyms, and how revocation reaches the network. Castell implements it as a live, hittable testbed.

The TS 102 941 trust model implemented by Castell TLM trust list manager attests Root CA inventory ECTL signed trust list GET /getectl Root CA anchors every chain AD7B90E1EB12A0F9 EA enrolment authority long-term identity AA authorization authority issues pseudonyms (AT) MA misbehaviour authority audits the network Vehicle / ITS station issues CA cert issues CA cert POST /ec-request POST /at-request submits MR
TLM attests · Root CA issues · EA enrols · AA pseudonyms · MA audits.

What ETSI TS 102 941 specifies

TS 102 941 sits inside the broader ETSI security architecture defined by TS 102 940. Where TS 102 940 says "there shall be an Enrolment Authority and an Authorization Authority", TS 102 941 specifies what they actually do, in what message format, with what crypto, and under what trust framework.

The spec covers four mechanisms, all glued together by a Root CA at the top and a Trust List Manager (TLM) overseeing the Root CA inventory:

The wire format is COER (Canonical OER), an ASN.1 binary encoding suitable for the size-constrained ITS-G5 channel. Outer signatures use IEEE 1609.2 SignedData wrappers, inner content uses TS 102 941-specific InnerEc and InnerAt structures.

EA and AA — the role split

The separation between Enrolment Authority and Authorization Authority is the privacy mechanism of the entire system. The EA knows the long-term identity of every station; the AA hands out pseudonyms. Neither alone can correlate a CAM seen on the wire to a real-world identity. Both together, in principle, can — which is why their physical separation (different operators, different data jurisdictions) is part of the trust model.

In testbed deployments the same operator typically runs both. Castell runs an EA, an AA and a MA (Misbehaviour Authority) from one stack, while keeping their crypto material logically separated.

How Castell implements TS 102 941

Versions and conformance

Castell declares compliance under TS 102 941 as v1.3.1 wire OER + v2.2.1 protocol semantics. The wire encoding follows the stable v1.3.1 format that the rest of the deployed ITS-G5 ecosystem still expects; the protocol behaviour, accepted CHOICE values, error responses and butterfly-vs-single signalling follow the more recent v2.2.1 semantics. This is the same hybrid most C-ITS testbeds adopt during the v1.3.1 → v2.x transition.

Decoding endpoints expose this distinction explicitly: POST /v221/ec-request-decode and POST /v221/at-request-decode parse incoming requests with v2.2.1-strict ASN.1, which makes it possible to verify conformance proofs against a known-good TS 102 941 v2.2.1 fixture without ambiguity.

Authorization mode

TS 102 941 v2.2.1 defines two ways a station can request an AT: single authorization — one AT per request, used when the station picks up a fresh pseudonym every few minutes — and butterfly key authorization — a batch of ATs derived from one expansion key, used in fleet contexts to minimise round-trips. The spec treats them as alternatives; supporting one is sufficient for conformance.

Castell supports single authorization. Butterfly is not implemented and not on the roadmap: single is sufficient for the integrator workflows the testbed serves, and butterfly's batching machinery adds significant complexity for marginal benefit outside fleet operations. The choice is exposed machine-readably under /capabilities.authorization_modes.

EC and AT request endpoints

# Enrolment Credential request — TS 102 941 §6.2.3.2
POST /ec-request
Content-Type: application/x-its-request

<COER-encoded EnrolmentRequest>

# Authorization Ticket request — TS 102 941 §6.2.3.3
POST /at-request
Content-Type: application/x-its-request

<COER-encoded AuthorizationRequest>

Both endpoints respond with a COER-encoded signed message wrapping the issued credential, addressed back to the requester's canonical pubkey by HashedId8. The integration walkthrough shows the full Python flow including request construction.

CTL / ECTL

The Trust List Manager publishes the ECTL (European Certificate Trust List) per §6.4. In Castell this is at GET /getectl — see the ECTL landing for the full format details.

Per Root CA, a CTL listing the EAs and AAs subordinate to that Root is also published — Castell exposes this at GET /getctl/{hashedId8} with delta support at GET /getctl/{hashedId8}/{seq}.

TLM rotation

TS 102 941 §6.4.2.1 specifies that when the TLM is rotated, the outgoing TLM signs a link certificate attesting to the incoming TLM's public key. Stations bootstrap trust in the new TLM by verifying the link certificate against the old one they already pinned.

Castell implements this endpoint at GET /gettlmlinkcertificate[/{hashedId8}]. As of this writing the current TLM (74534B8C394779F4) is the first deployed; no rotation has occurred, so the endpoint returns a structured 404 with the rationale. The /capabilities.tlm_rotation field exposes this state machine-readably.

Related material