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