summaryrefslogtreecommitdiff
path: root/test/plop_test.erl
blob: ce2a052ca2fe4208d19b0757170ffb2e16642c91 (plain)
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.