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