OPS-13: Additional Authenticated Data bei AES-GCM (F-21) #216

Closed
patrick wants to merge 0 commits from feature/ops-13-aad-aes-gcm into main
pull from: feature/ops-13-aad-aes-gcm
Owner

QA-15-Befund F-21 behoben: AES-GCM Seal/Open in vier Stellen (DMS, Archive, Mail, Core internal/kek) binden jetzt ein Additional Authenticated Data (AAD) an ihren Chiffretext. AAD = jeweils bereits vorhandener Kontext-Parameter (Tenant-Slug/-ID, Ziel-URL, fester Zweck-Bezeichner) -- keine neuen Aufrufer-Signaturen noetig fuer die rund 30 externen Aufrufstellen von DMS/Mail Service.Seal/Open.

Rueckwaertskompatibel: open/unwrap versucht zuerst mit AAD, faellt bei Fehlschlag auf kein-AAD zurueck -- vor dieser Aenderung versiegelte Datensaetze bleiben lesbar.

Pruefungen (alle real durchgefuehrt, siehe docs/OPS-13-PRUEFPROTOKOLL.md):

  • Kontext-Austausch-Erkennung (Pruefung 1) fuer alle vier Stellen: bestanden
  • Ruecklaufkompatibilitaet mit Alt-Daten ohne AAD (Pruefung 2): bestanden
  • Volle Regressionspruefung: DMS internal/crypto (9 Tests) + internal/qa02 End-zu-Ende (6 Tests, echter Postgres, inkl. RewrapDEK-Produktionspfad), Archive internal/backupcrypto (3 Tests), Mail internal/crypto (4 Tests, ARC-08-KEK-Versionsverwaltung), Core internal/kek (17 Tests, echte Rotation), internal/ldapsync (8 Tests), internal/webhook (7 Tests) -- alle gruen, keine Regression.

Bekannte, dokumentierte Grenze: AAD bindet an verfuegbaren Kontext (Mandant/Ziel-URL/Zweck), nicht an eine einzelne Datensatz-ID -- ein Austausch zwischen zwei Datensaetzen DESSELBEN Kontexts bleibt unerkannt. Volle Datensatz-Bindung braeuchte eine ID an ~30 Aufrufstellen bzw. eine Aenderung des modulübergreifend genutzten SecretCipher-Interface (internal/moduletrust) -- bewusst ausserhalb der kleinsten Loesung dieser Kachel, im Pruefprotokoll offen dokumentiert.

Kein Merge, kein Deploy.

🤖 Generated with Claude Code

QA-15-Befund F-21 behoben: AES-GCM Seal/Open in vier Stellen (DMS, Archive, Mail, Core internal/kek) binden jetzt ein Additional Authenticated Data (AAD) an ihren Chiffretext. AAD = jeweils bereits vorhandener Kontext-Parameter (Tenant-Slug/-ID, Ziel-URL, fester Zweck-Bezeichner) -- keine neuen Aufrufer-Signaturen noetig fuer die rund 30 externen Aufrufstellen von DMS/Mail Service.Seal/Open. Rueckwaertskompatibel: open/unwrap versucht zuerst mit AAD, faellt bei Fehlschlag auf kein-AAD zurueck -- vor dieser Aenderung versiegelte Datensaetze bleiben lesbar. **Pruefungen (alle real durchgefuehrt, siehe docs/OPS-13-PRUEFPROTOKOLL.md):** - Kontext-Austausch-Erkennung (Pruefung 1) fuer alle vier Stellen: bestanden - Ruecklaufkompatibilitaet mit Alt-Daten ohne AAD (Pruefung 2): bestanden - Volle Regressionspruefung: DMS internal/crypto (9 Tests) + internal/qa02 End-zu-Ende (6 Tests, echter Postgres, inkl. RewrapDEK-Produktionspfad), Archive internal/backupcrypto (3 Tests), Mail internal/crypto (4 Tests, ARC-08-KEK-Versionsverwaltung), Core internal/kek (17 Tests, echte Rotation), internal/ldapsync (8 Tests), internal/webhook (7 Tests) -- alle gruen, keine Regression. **Bekannte, dokumentierte Grenze:** AAD bindet an verfuegbaren Kontext (Mandant/Ziel-URL/Zweck), nicht an eine einzelne Datensatz-ID -- ein Austausch zwischen zwei Datensaetzen DESSELBEN Kontexts bleibt unerkannt. Volle Datensatz-Bindung braeuchte eine ID an ~30 Aufrufstellen bzw. eine Aenderung des modulübergreifend genutzten SecretCipher-Interface (internal/moduletrust) -- bewusst ausserhalb der kleinsten Loesung dieser Kachel, im Pruefprotokoll offen dokumentiert. Kein Merge, kein Deploy. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
patrick added 2 commits 2026-09-26 22:47:31 +02:00
seal/open (bzw. wrap/unwrap) in allen vier betroffenen Stellen binden
ein Additional Authenticated Data an Chiffretext/DEK-Wrapper: ein
Austausch zwischen zwei Kontexten faellt beim Entschluesseln auf,
statt still zu funktionieren.

- dms/internal/crypto/envelope.go + service.go: AAD = Tenant-Slug
  (bereits vorhandener Parameter in Service.Seal/Open, Signatur
  unveraendert -- keine der rund 30 externen Aufrufstellen musste
  angepasst werden)
- archive/internal/backupcrypto/envelope.go + reposecret.go/file.go:
  gleiches Muster, AAD = Tenant-Slug
- mail/internal/crypto/envelope.go + service.go + kekversions.go:
  gleiches Muster, AAD = Tenant-Slug (inkl. ARC-08
  KEK-Versionsverwaltung)
- internal/kek/master.go + store.go: wrap/unwrap sowie
  EncryptWithTenantKEK/DecryptWithTenantKEK binden AAD. Die drei
  echten externen Aufrufer angepasst: ldapsync (Tenant-ID + Zweck),
  webhook (Ziel-URL des Abonnements), account-api modulekeys (fester
  Zweck-Bezeichner -- SecretCipher-Interface aus internal/moduletrust
  reicht keine Datensatz-ID durch, eine Erweiterung wuerde in andere
  Module hineinwirken, bewusst nicht Teil dieser Kachel)

Rueckwaertskompatibel: jedes open/unwrap versucht zuerst mit AAD,
faellt bei Fehlschlag auf kein-AAD zurueck -- vor dieser Aenderung
versiegelte Datensaetze bleiben lesbar.

Bekannte, dokumentierte Grenze: ein Austausch zwischen zwei
Datensaetzen DESSELBEN Mandanten/Kontexts bleibt unerkannt (identisches
AAD) -- volle Bindung an den einzelnen Datensatz braeuchte eine
Datensatz-ID an rund 30 Aufrufstellen, bewusst nicht Teil dieser
kleinstmoeglichen Loesung.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
OPS-13: Prüfprotokoll und neue AAD-Tests (F-21)
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
Archive-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Mail-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
47b85b6522
Neue Tests fuer Archive/Mail/Core-kek (Pruefung 1/2 je Stelle,
identisches Muster wie die bereits vorhandenen DMS-Tests). Alle
Pruefungen real gegen Postgres auf Host 204 durchgefuehrt (siehe
Pruefprotokoll), inkl. vollstaendiger Regression von dms/qa02,
internal/kek, internal/ldapsync, internal/webhook.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Author
Owner

Inhalt bereits in main enthalten (geprueft per merge_all_prs.sh: leerer Merge-Diff). Geschlossen ohne Merge.

Inhalt bereits in main enthalten (geprueft per merge_all_prs.sh: leerer Merge-Diff). Geschlossen ohne Merge.
patrick closed this pull request 2026-10-19 12:29:34 +02:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: scripte/nexarch#216