1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
-module(plop_test).
-include("plop.hrl").
-include_lib("eunit/include/eunit.hrl").
%% start_stop_test_() ->
%% {"The server can be started, stopped and is regsitered",
%% {setup, fun start/0, fun stop/1, fun is_registered/1}}.
%% "Entries can be added and the STH changes."
%% FIXME: This way, if a test fails, we don't stop plop. The tests
%% must run and be validated in strict order though.
adding_verifying_test() ->
%%Pid = start(),
Pubkey = plop:testing_get_pubkey(),
add_sth_add_sth(Pubkey).
%%stop(Pid).
%% "Entries can be retrieved."
get_entries_test_() ->
Entries = plop:get(1, 2),
[?_assertEqual(2, length(Entries)),
?_assertMatch(#mtl{}, hd(Entries))].
%%% Setup.
%% start() ->
%% {ok, Pid} = plop:start_link("../test/rsakey.pem", "sikrit"),
%% Pid.
%% stop(_) ->
%% plop:stop().
%%% Tests.
%% is_registered(Pid) ->
%% [?_assert(erlang:is_process_alive(Pid)),
%% ?_assertEqual(Pid, whereis(plop))].
%%% Helpers.
add_sth_add_sth(Pubkey) ->
add(0, Pubkey),
STH0 = sth(Pubkey),
add(1, Pubkey),
STH1 = sth(Pubkey),
?assertNotEqual(STH0, STH1).
add(0, Pubkey) ->
Msg = crypto:rand_bytes(32),
Entry = #timestamped_entry{
timestamp = 4711,
entry = #plop_entry{
type = test,
data = Msg}},
DataSigned = <<0:8, 0:8, 4711:64, 2:16, Msg/binary>>,
#spt{
version = Version,
timestamp = Timestamp,
signature = #signature{signature = Signature}
} = plop:add(Entry),
?assertEqual(0, Version),
?assertEqual(4711, Timestamp),
?assert(public_key:verify(DataSigned, sha256, Signature, Pubkey));
add(1, Pubkey) ->
Msg = crypto:rand_bytes(32),
Entry = #timestamped_entry{
timestamp = 4712,
entry = #plop_entry{
type = test,
data = Msg}},
DataSigned = <<0:8, 0:8, 4712:64, 2:16, Msg/binary>>,
#spt{
version = Version,
timestamp = Timestamp,
signature = #signature{signature = Signature}
} = plop:add(Entry),
?assertEqual(0, Version),
?assertEqual(4712, Timestamp),
?assert(public_key:verify(DataSigned, sha256, Signature, Pubkey)).
%% TODO
%% add(2) ->
%% TestVector = <<>>,
%% %% Same data as in 0, should not result in new database entry.
sth(Pubkey) ->
#sth{
treesize = Treesize,
timestamp = Timestamp,
roothash = Roothash,
signature = #signature{signature = Signature}
} = STH = plop:sth(),
Data = list_to_binary([<<0:8, 1:8, Timestamp:64, Treesize:64>>, Roothash]),
?assert(public_key:verify(Data, sha256, Signature, Pubkey)),
STH.
|