{"id":18985545,"url":"https://github.com/gematik/lib-vau","last_synced_at":"2025-04-19T20:26:46.439Z","repository":{"id":234146355,"uuid":"788256932","full_name":"gematik/lib-vau","owner":"gematik","description":"This repository serves as a sample implementation in JAVA and implements the cryptographic part of the specification of the VAU protocol for ePA for all (gemSpec_Crypto Chapter 7).","archived":false,"fork":false,"pushed_at":"2025-01-22T14:13:40.000Z","size":82,"stargazers_count":17,"open_issues_count":0,"forks_count":4,"subscribers_count":19,"default_branch":"main","last_synced_at":"2025-03-29T12:51:24.964Z","etag":null,"topics":["epa","miscellaneous"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gematik.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-18T04:20:55.000Z","updated_at":"2025-01-22T14:13:38.000Z","dependencies_parsed_at":"2024-06-19T00:43:27.028Z","dependency_job_id":"e5294765-815e-441a-8a44-7be4aa791fb7","html_url":"https://github.com/gematik/lib-vau","commit_stats":null,"previous_names":["gematik/lib-vau"],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gematik%2Flib-vau","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gematik%2Flib-vau/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gematik%2Flib-vau/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gematik%2Flib-vau/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gematik","download_url":"https://codeload.github.com/gematik/lib-vau/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249250817,"owners_count":21237961,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["epa","miscellaneous"],"created_at":"2024-11-08T16:27:09.952Z","updated_at":"2025-04-16T14:32:20.389Z","avatar_url":"https://github.com/gematik.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# VAU Library (lib-vau)\n\nDieses Repository dient als Beispielimplementierung in JAVA und implementiert den kryptografischen Teil der Spezifikation des VAU-Protokolls für ePA für alle ([gemSpec_Krypt Kaptiel 7](https://gemspec.gematik.de/docs/gemSpec/gemSpec_Krypt/latest/#7)). \n\n## Einschränkungen \u0026 Hinweise\n\n- Es werden keine Zertifikate geprüft. \n- Es beinhaltet außerdem nur ECC, kein RSA.\n- Der Transport der Daten der Public Keys geschieht über die binäre Codierung CBOR.\n- Die kryptografischen Abhängigkeiten sind neben java.security auch Bouncy Castle.\n\n\u003e [!IMPORTANT]\n\u003e Die Implementierung mit BouncyCastle beinhaltet auch ein Workaround, welcher [implementiert](src/main/java/de/gematik/vau/lib/crypto/KyberEncoding.java) werden musste, damit diese kompatibel mit der Spezifikation wie in [Kapitel 7.1] beschrieben ist. Dies betrifft die Erzeugung von Kyber Schlüssel nach dem Kyber Release v3.0.2. In BouncyCastle wurde bereits die Draft Implementierung FIPS 203 umgesetzt, welche inkompatibel mit diesem Kyber Release ist. Dieser Workaround ist auf der folgenden Seite beschrieben worden:\n\u003e https://words.filippo.io/dispatches/mlkem768/#bonus-track-using-a-ml-kem-implementation-as-kyber-v3\n\n## VAU Handshake\nIn der Datei [VauHandshakeTest.java](src/test/java/de/gematik/vau/VauHandshakeTest.java) befindet sich eine Beispielimplementierung des gesamten Handshakes wie er in der Spezifikation im [Kapitel 7.1](https://gemspec.gematik.de/docs/gemSpec/gemSpec_Krypt/latest/#7.1) beschrieben ist:\n\n### VauMessage 1:\nDer Client erzeugt die ECDH und Kyber KeyPairs. Diese werden in Message 1 gepackt und zum Server geschickt.\n\n### VauMessage 2:\nDer Server nimmt die VauMessage 1 entgegen. Die PublicKeys des Clients und seinen eigenen PrivateKeys nutzt er,\num die ECDH und Kyber Shared Secrets mitsamt Ciphertexts (KdfMessage) zu erstellen. Daraus erstellt er den ersten Schlüssel KdfKey1.\nDiesen nutzt er, um seine signierten PublicKeys zu verschlüsseln. In VauMessage 2 werden die Ciphertexts der Shared\nSecrets sowie die verschlüsselten signierten PublicKeys gespeichert und diese Nachricht wird zurück zum Client geschickt.\n\n### VauMessage 3:\nDer Client erhält VauMessage 2. Mithilfe der Ciphertexts des Servers und den eigenen PrivateKey erstellt er seine\neigenen Shared Secrets, mit welchen er den gleichen KdfKey1 wie der Server herleitet. Damit entschlüsselt er die signierten\nPublicKeys des Servers. Mit diesen PublicKeys und den eigenen PrivateKeys erstellt der Client weitere Shared Secrets\nmit zugehörigen Ciphertexts. Mit den Shared Secrets aus beiden Vorgängen wird nun ein KdfKey2 generiert, welcher für das\nVer-/Entschlüsseln zwischen Client und Server nach dem Handshake genutzt wird. Die Ciphertexts für den KdfKey2 werden mit\ndem KdfKey1 verschlüsselt. Ein Transcript, was aus den bisherigen codierten Nachrichten besteht, wird in SHA-256 (=Hash) und dann mit\ndem KdfKey2 verschlüsselt (=Ciphertext-KeyConfirmation). Die VauMessage 3 besteht aus den Ciphertexts und der Ciphertext-KeyConfirmation. Diese wird\nzum Server zurückgeschickt.\n\n### VauMessage 4:\nDer Server öffnet VauMessage 4 und erhält mit seinem KdfKey1 die Ciphertexts. Mit diesen kann er nun seinen eigenen Shared Secrets\nerstellen. Mit allen Shared Secrets leitet er, wie der Client zuvor, den KdfKey2 her. Um den Vorgang zu validieren, überprüft der\nServer die Hash des Clients: Er entschlüsselt die Ciphertext-KeyConfirmation mit dem KdfKey2 und erhält den Client-Hash. \nDiese vergleicht er mit dem SHA-256 verschlüsselten eigenen Transcript. Den eigenen Hash verschlüsselt er mit dem KdfKey2 (=Ciphertext-KeyConfirmation).\nDiese wird in VauMessage 4 gespeichert und zurück zum Client geschickt.\n\nDer Client öffnet die Nachricht, entschlüsselt die Ciphertext-KeyConfirmation und vergleicht wieder den erhalten Hash mit selbst berechneten.\nErst dann ist der Handshake abgeschlossen.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgematik%2Flib-vau","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgematik%2Flib-vau","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgematik%2Flib-vau/lists"}