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.
|