resources/codesigning/README.md
This directory contains the trust anchors, intermediates, and CRL data for verifying ownCloud and third-party app signatures across G1 and G2 generations.
resources/codesigning/
├── roots/ # Trust anchors (roots)
│ ├── root-g1.crt # Legacy G1 root (intermediate authority), kept for transition
│ └── root-g2.crt # G2 root anchor (ceremony output)
├── intermediates/ # Intermediate certificates
│ └── intermediate-g2.crt # G2 intermediate issuer (ceremony output)
├── crl/ # Certificate Revocation Lists
│ ├── legacy.crl # Frozen G1 CRL (legacy apps)
│ └── developers.crl # G2 leaf CRL (ceremony output, refreshed via CRL_URL)
└── core.crt # Core leaf certificate (first-party signing, unused in verifier)
TrustStore loads all certificates in roots/ as trust anchors.
root-g1* are tagged generation 'g1' (legacy verification path).root-g2* are tagged generation 'g2' (new verification path).root-g1.crt exists, the roots/ directory is non-empty and legacy G1 apps verify normally.CrlProvider reads CRLs from crl/:
legacy.crl (frozen).developers.crl (expected to be cached or served).The production ownCloud 10.x ecosystem relied on a single flat trust anchor (resources/codesigning/root.crt).
This file was the G1 INTERMEDIATE authority (subject "ownCloud Code Signing Intermediate Authority").
It was the de facto trust anchor for the legacy loadCA() verifier.
Task 13 migrates this to roots/root-g1.crt to preserve exact legacy verification semantics
while establishing the new multi-generation layout. Apps signed with G1 certs continue to verify.
G2 code signing is live. The CA ceremony has produced real, offline-held anchors, and they are bundled here:
roots/root-g2.crt — G2 root anchor (CN "ownCloud Code Signing Root CA G2")intermediates/intermediate-g2.crt — G2 intermediate issuercrl/developers.crl — G2 leaf revocation list (issued by the G2 intermediate)Whether G2 verifies at runtime depends on the bundled CRL validating against the
shipped root, not on these slots being empty. These are genuine ceremony outputs,
not the test-PKI certificates under tests/data/integritycheck/verifier/pki/.
Shipping test certificates as production trust anchors (per Task 10 lesson) would
be a security error, so the two sets are kept strictly separate.