2424import java .text .ParseException ;
2525import java .util .Arrays ;
2626import java .util .Base64 ;
27+ import java .util .Collections ;
2728import java .util .HashMap ;
2829import java .util .Map ;
2930import java .util .Objects ;
@@ -296,7 +297,7 @@ public UvfMetadataPayload withStorage(final VaultMetadataJWEBackendDto backend)
296297 */
297298 public static UvfMetadataPayload decryptWithJWK (final String jwe , final JWK jwk ) throws ParseException , JOSEException , JsonProcessingException {
298299 final JWEObjectJSON jweObject = JWEObjectJSON .parse (jwe );
299- jweObject .decrypt (new MultiDecrypter (jwk ));
300+ jweObject .decrypt (new MultiDecrypter (jwk , Collections . singleton ( "uvf.spec.version" ) ));
300301 final Payload payload = jweObject .getPayload ();
301302 return UvfMetadataPayload .fromJWE (payload .toString ());
302303 }
@@ -309,10 +310,16 @@ public static UvfMetadataPayload decryptWithJWK(final String jwe, final JWK jwk)
309310 * @param keys recipient keys for whom to encrypt
310311 */
311312 public String encrypt (final String apiURL , final UUID vaultId , final JWKSet keys ) throws JOSEException {
313+ // spec: https://github.com/encryption-alliance/unified-vault-format/tree/develop/vault%20metadata#jose-header
314+ // web frontend implementation: https://github.com/shift7-ch/katta-server/blob/feature/cipherduck-uvf/frontend/src/common/universalVaultFormat.ts#L343-L346
312315 final JWEObjectJSON builder = new JWEObjectJSON (
313316 new JWEHeader .Builder (EncryptionMethod .A256GCM )
317+ // kid goes into recipient-specific header
314318 .customParam ("origin" , String .format ("%s/vaults/%s/uvf/vault.uvf" , apiURL , vaultId .toString ()))
315319 .jwkURL (URI .create ("jwks.json" ))
320+ .contentType ("json" )
321+ .criticalParams (Collections .singleton ("uvf.spec.version" ))
322+ .customParam ("uvf.spec.version" , "1" )
316323 .build (),
317324 new Payload (new HashMap <String , Object >() {{
318325 put ("fileFormat" , fileFormat );
0 commit comments