feat(encryption): HPKE for JWE (draft-ietf-jose-hpke-encrypt, awaiting AD go-ahead)
Los mantenedores suelen responder en 1 día
Evaluación
Este issue todavía no se ha evaluado.
Descripción
Context
draft-ietf-jose-hpke-encrypt (-22, July 2026) is in "Waiting for AD Go-Ahead" — the last step before the RFC Editor queue, so an RFC number is a matter of months. It brings HPKE (RFC 9180) to JWE with fourteen alg values and two header parameters:
- Integrated encryption (HPKE does everything, no
enc):HPKE-0…HPKE-7. - Key encryption (HPKE wraps the CEK,
encas usual):HPKE-0-KE,-1-KE,-2-KE,-3-KE,-5-KE,-7-KE. - Suites:
0DHKEM(P-256)/HKDF-SHA256/AES-128-GCM,1P-384/HKDF-SHA384/AES-256-GCM,2P-521/HKDF-SHA512/AES-256-GCM,3X25519/HKDF-SHA256/AES-128-GCM,4X25519/HKDF-SHA256/ChaCha20-Poly1305,5X448/HKDF-SHA512/AES-256-GCM,6X448/HKDF-SHA512/ChaCha20-Poly1305,7P-256/HKDF-SHA256/AES-256-GCM. - Headers:
ek(base64url encapsulated key) andpsk_id;algandekare bound into the HPKEinfo/ AAD as the draft specifies, which is what makes the integrated mode safe against header tampering.
It is the first key-management addition to JWE since RFC 7518, and the JOSE path to post-quantum encryption (draft-ietf-jose-hpke-pq-pqt and draft-ietf-jose-pqc-kem build on it). The library has nothing HPKE-related; there is no HPKE in PHP core.
Backend: paragonie/hpke implements RFC 9180 in PHP (DHKEM P-256, P-521, X25519, ML-KEM; HKDF-SHA256/512; AES-128/256-GCM, ChaCha20-Poly1305) but has neither P-384 nor X448 KEMs at the time of writing — suites 1, 5 and 6 would be missing. To decide: depend on it and contribute the two KEMs upstream, or carry a minimal HPKE (base mode + PSK is all the draft needs) inside the library, which has all the primitives (ECDH through AbstractECDH, HKDF in ConcatKDF's neighbourhood, AES-GCM and ChaCha20 content encryption). cose-lib does not implement COSE-HPKE either, so a shared spomky-labs/hpke would serve both.
This issue is opened now so the design and the backend question are settled when the RFC lands; the implementation is not to be merged before the RFC number exists (identifiers can still change in AUTH48).
Scope
- Integrated mode: a new
Jose\Component\Encryption\Algorithm\KeyEncryptionkind, since HPKE replaces both key management and content encryption —JWEBuilder/JWEDecrypterneed a branch whereencis absent and the ciphertext / tag come from HPKESeal; check howRecipientSpecand the compact serializer behave with an emptyencrypted_keyand noiv/tag. - Key-encryption mode: fits
KeyEncryptionas it is — HPKESealon the CEK,ekset on the per-recipient header, and multi-recipient JSON serialization works as for ECDH-ES+A*KW. ekandpsk_idknown to the header machinery;psksupplied out of band to the algorithm (constructor orJWK-shaped secret, to design).- Recipient keys are the existing
EC(P-256/384/521) andOKP(X25519 / X448 — X448 requires the OKP work of #724) JWKs; sender ephemeral key generated by the KEM. - Bundle registration for the fourteen aliases; docs (algorithm table, a dedicated HPKE page explaining integrated vs key-encryption and the PSK option); changelog.
Out of scope
- Auth / AuthPSK HPKE modes (the draft uses base and PSK only).
- Post-quantum and hybrid KEMs (draft-ietf-jose-hpke-pq-pqt, draft-ietf-jose-pqc-kem): separate issues once those drafts stabilise.
- Merging before the RFC is published.
Acceptance criteria
- The draft's Appendix test vectors (integrated and key-encryption, compact and JSON) decrypt and re-encrypt with the vector's ephemeral material.
- Round-trip for the eight integrated and six key-encryption identifiers with generated keys, single and multiple recipients where the mode allows it; ChaCha20 suites gated on ext-sodium / OpenSSL availability like
C20Ptoday. - Tampering with
algorekin the protected header makes decryption fail (theinfo/ AAD binding). - A
HPKE-*recipient in a JWE that also carriesenc(integrated mode) is rejected; aHPKE-*-KEwithoutencis rejected.
References
- draft-ietf-jose-hpke-encrypt-22 (identifiers,
ek/psk_id,infoand AAD construction, test vectors) - RFC 9180 (HPKE), RFC 7516 §4.1.2 (
enc) - paragonie/hpke — https://github.com/paragonie/hpke-php
- draft-ietf-jose-hpke-pq-pqt, draft-ietf-jose-pqc-kem (follow-ups)
- Lenguaje dominante
- PHP
- Estrellas
- 954
- Forks
- 119
- Merge medio
- 48 min
- PR fusionados (30 d)
- 17
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de web-token/jwt-framework
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
web-token/jwt-framework#757 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
web-token/jwt-framework#773 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 4/5 3-5 días Aptitud para principiantes 57/100
web-token/jwt-framework#772 ·
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
web-token/jwt-framework#771 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
web-token/jwt-framework#770 ·
Los mantenedores suelen responder en 1 día
Todos los issues de web-token/jwt-framework
Issues similares
-
enhancement priority Sales
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
novalo-dev/Prestashop-MCP-Server#201 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
-
Include flows spanning the full report time windowPosiblemente ocupada @somethingwithproof la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
Cacti/plugin_flowview#306 ·
Los mantenedores suelen responder en 1 día
-
bug origin: upstream priority: low
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
mattytap/Mattytap-Sermons#105 ·
-
priority:low type:bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
crazy-goat/workerman-bundle#1189 ·
Los mantenedores suelen responder en 1 día