1%% -*- mode: erlang; tab-width: 4; indent-tabs-mode: 1; st-rulers: [70] -*- 2%% vim: ts=4 sw=4 ft=erlang noet 3-module(jose_jwe_alg_pbes2_props). 4 5-include_lib("proper/include/proper.hrl"). 6 7% -compile(export_all). 8 9base64url_binary() -> 10 ?LET(Binary, 11 binary(), 12 jose_jwa_base64url:encode(Binary)). 13 14binary_map() -> 15 ?LET(List, 16 list({base64url_binary(), base64url_binary()}), 17 maps:from_list(List)). 18 19alg() -> 20 oneof([ 21 <<"PBES2-HS256+A128GCMKW">>, 22 <<"PBES2-HS384+A192GCMKW">>, 23 <<"PBES2-HS512+A256GCMKW">>, 24 <<"PBES2-HS256+A128KW">>, 25 <<"PBES2-HS384+A192KW">>, 26 <<"PBES2-HS512+A256KW">>, 27 <<"PBES2-HS512+C20PKW">>, 28 <<"PBES2-HS512+XC20PKW">> 29 ]). 30 31alg_map() -> 32 ?LET({ALG, P2C, P2S}, 33 {alg(), integer(1, 256), binary()}, 34 #{ 35 <<"alg">> => ALG, 36 <<"p2c">> => P2C, 37 <<"p2s">> => jose_jwa_base64url:encode(P2S) 38 }). 39 40enc() -> 41 oneof([ 42 <<"A128GCM">>, 43 <<"A192GCM">>, 44 <<"A256GCM">> 45 ]). 46 47jwk_jwe_maps() -> 48 ?LET({ALGMap, ENC, Password}, 49 {alg_map(), enc(), binary()}, 50 begin 51 JWKMap = #{ 52 <<"kty">> => <<"oct">>, 53 <<"k">> => jose_jwa_base64url:encode(Password) 54 }, 55 JWEMap = maps:merge(#{ <<"enc">> => ENC }, ALGMap), 56 {Password, JWKMap, JWEMap} 57 end). 58 59jwk_jwe_gen() -> 60 ?LET({Key, JWKMap, JWEMap}, 61 jwk_jwe_maps(), 62 {Key, jose_jwk:from_map(JWKMap), jose_jwe:from_map(JWEMap)}). 63 64prop_from_map_and_to_map() -> 65 ?FORALL(JWEMap, 66 ?LET({{_Key, _JWKMap, JWEMap}, Extras}, 67 {jwk_jwe_maps(), binary_map()}, 68 maps:merge(Extras, JWEMap)), 69 begin 70 JWE = jose_jwe:from_map(JWEMap), 71 JWEMap =:= element(2, jose_jwe:to_map(JWE)) 72 end). 73 74prop_key_encrypt_and_key_decrypt() -> 75 ?FORALL({_Key, JWK, JWE}, 76 ?LET({Key, JWK, JWE}, 77 jwk_jwe_gen(), 78 {Key, oneof([Key, JWK]), JWE}), 79 begin 80 {DecKey, DecJWE} = jose_jwe:next_cek(JWK, JWE), 81 {EncKey, EncJWE} = jose_jwe:key_encrypt(JWK, DecKey, DecJWE), 82 DecKey =:= jose_jwe:key_decrypt(JWK, EncKey, EncJWE) 83 end). 84