summaryrefslogtreecommitdiff
path: root/src/plop.erl
blob: 4af3f257ea8a982b88105a1f88461d0b85c8fd28 (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
%%% @doc Server holding log entries in a database and hashes in a Merkle tree.
%%%
%%% When you submit data for insertion in the log, the data and a hash
%%% of it is stored in a way that [mumble FIXME and FIXME]. In return
%%% you will get a proof of your entry being included in the log. This
%%% proof can later, together with the public key of the log, be used
%%% to prove that your entry is indeed present in the log.

-module('plop').
-export([start/0, loop/2]).

-record(plop, {pubkey :: crypto:rsa_public(),
               privkey :: crypt:rsa_private()}).

start(PlopKey) ->
    Tree = ht:create(),
    register(plop, spawn(plop, loop, [PlopKey, Tree])).

log(Format, Data) ->
    io:format(Format, Data).

loop(PlopKey, Tree) ->
    receive
        {From, quit} ->
            From ! {quit, ok};
        {From, Data} ->
            handle_req(From, Tree, Data),
            loop(Tree);
        Unknown ->
            log("DEBUG: Received malformed command: ~p~n", [Unknown]),
            loop(Tree)
    end.

handle_req(From, Tree, Arg) ->
    case Arg of
        {add, Data} ->
            From ! spt(ht:append(Tree, Data));
        %% {diff, Tree2} ->
        %%     From ! ht:diff(Tree, Tree2);
        {sth} ->                                % Signed tree head.
            sth(Tree);
        Unknown ->
            From ! {error, Unknown}
    end.

%% @doc Signed Plop Timestamp.
       %% Signed Timestamp
       %% struct {
       %%     Version sct_version;
       %%     LogID id;
       %%     uint64 timestamp;
       %%     CtExtensions extensions;
       %%     digitally-signed struct {
       %%         Version sct_version;
       %%         SignatureType signature_type = certificate_timestamp;
       %%         uint64 timestamp;
       %%         LogEntryType entry_type;
       %%         select(entry_type) {
       %%             case x509_entry: ASN.1Cert;
       %%             case precert_entry: PreCert;
       %%         } signed_entry;
       %%        CtExtensions extensions;
       %%     };
       %% } SignedCertificateTimestamp;
spt(LogID, Data) ->
    "FIXME: a signed timestamp for " ++ Data.

%% @doc Signed Tree Head
       %% digitally-signed struct {
       %%     Version version;
       %%     SignatureType signature_type = tree_hash;
       %%     uint64 timestamp;
       %%     uint64 tree_size;
       %%     opaque sha256_root_hash[32];
       %% } TreeHeadSignature;
sth(Tree) ->
    "FIXME: signed tree head for " ++ Tree.