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_jwa_curve448_props).
4
5-include_lib("public_key/include/public_key.hrl").
6
7-include_lib("proper/include/proper.hrl").
8
9% -compile(export_all).
10
11eddsa_secret() ->
12	binary(57).
13
14eddsa_keypair(Secret) ->
15	{PK, SK} = jose_curve448:eddsa_keypair(Secret),
16	{SK, PK}.
17
18x448_secret() ->
19	binary(56).
20
21x448_keypair(Secret) ->
22	{PK, SK} = jose_curve448:x448_keypair(Secret),
23	{SK, PK}.
24
25eddsa_keypair_gen() ->
26	?LET(Secret,
27		eddsa_secret(),
28		eddsa_keypair(Secret)).
29
30prop_eddsa_secret_to_public() ->
31	?FORALL({<< Secret:57/binary, _/binary >>, PK},
32		eddsa_keypair_gen(),
33		begin
34			PK =:= jose_jwa_curve448:eddsa_secret_to_public(Secret)
35		end).
36
37prop_ed448_sign_and_verify() ->
38	?FORALL({{SK, PK}, M},
39		{eddsa_keypair_gen(), binary()},
40		begin
41			S = jose_jwa_curve448:ed448_sign(M, SK),
42			jose_jwa_curve448:ed448_verify(S, M, PK)
43		end).
44
45prop_ed448ph_sign_and_verify() ->
46	?FORALL({{SK, PK}, M},
47		{eddsa_keypair_gen(), binary()},
48		begin
49			S = jose_jwa_curve448:ed448ph_sign(M, SK),
50			jose_jwa_curve448:ed448ph_verify(S, M, PK)
51		end).
52
53x448_keypair_gen() ->
54	?LET(Secret,
55		x448_secret(),
56		x448_keypair(Secret)).
57
58x448_keypairs_gen() ->
59	?LET({AliceSecret, BobSecret},
60		{x448_secret(), x448_secret()},
61		{x448_keypair(AliceSecret), x448_keypair(BobSecret)}).
62
63prop_x448_secret_to_public() ->
64	?FORALL({SK, PK},
65		x448_keypair_gen(),
66		begin
67			PK =:= jose_jwa_curve448:x448_secret_to_public(SK)
68		end).
69
70prop_x448_shared_secret() ->
71	?FORALL({{AliceSK, AlicePK}, {BobSK, BobPK}},
72		x448_keypairs_gen(),
73		begin
74			K = jose_jwa_curve448:x448_shared_secret(AliceSK, BobPK),
75			K =:= jose_jwa_curve448:x448_shared_secret(BobSK, AlicePK)
76		end).
77