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_dir_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 19key_size() -> oneof([128, 192, 256]). 20 21key_gen() -> 22 ?LET(KeySize, 23 key_size(), 24 {KeySize, binary(KeySize div 8)}). 25 26jwk_jwe_maps() -> 27 ?LET({KeySize, Key}, 28 key_gen(), 29 begin 30 ALG = <<"dir">>, 31 ENC = list_to_binary("A" ++ integer_to_list(KeySize) ++ "GCM"), 32 JWKMap = #{ 33 <<"kty">> => <<"oct">>, 34 <<"k">> => jose_jwa_base64url:encode(Key) 35 }, 36 JWEMap = #{ 37 <<"alg">> => ALG, 38 <<"enc">> => ENC 39 }, 40 {Key, JWKMap, JWEMap} 41 end). 42 43jwk_jwe_gen() -> 44 ?LET({Key, JWKMap, JWEMap}, 45 jwk_jwe_maps(), 46 {Key, jose_jwk:from_map(JWKMap), jose_jwe:from_map(JWEMap)}). 47 48prop_from_map_and_to_map() -> 49 ?FORALL(JWEMap, 50 ?LET({{_Key, _JWKMap, JWEMap}, Extras}, 51 {jwk_jwe_maps(), binary_map()}, 52 maps:merge(Extras, JWEMap)), 53 begin 54 JWE = jose_jwe:from_map(JWEMap), 55 JWEMap =:= element(2, jose_jwe:to_map(JWE)) 56 end). 57 58prop_key_decrypt() -> 59 ?FORALL({Key, JWK, JWE}, 60 ?LET({Key, JWK, JWE}, 61 jwk_jwe_gen(), 62 {Key, oneof([Key, JWK]), JWE}), 63 begin 64 {DecKey, DecJWE} = jose_jwe:next_cek(JWK, JWE), 65 Key =:= jose_jwe:key_decrypt(JWK, DecKey, DecJWE) 66 end). 67 68prop_key_encrypt() -> 69 ?FORALL({_Key, JWK, JWE}, 70 ?LET({Key, JWK, JWE}, 71 jwk_jwe_gen(), 72 {Key, oneof([Key, JWK]), JWE}), 73 begin 74 {DecKey, DecJWE} = jose_jwe:next_cek(JWK, JWE), 75 {<<>>, DecJWE} =:= jose_jwe:key_encrypt(JWK, DecKey, DecJWE) 76 end). 77 78prop_next_cek() -> 79 ?FORALL({Key, JWK, JWE}, 80 ?LET({Key, JWK, JWE}, 81 jwk_jwe_gen(), 82 {Key, oneof([Key, JWK]), JWE}), 83 begin 84 {DecKey, _DecJWE} = jose_jwe:next_cek(JWK, JWE), 85 Key =:= DecKey 86 end). 87