1
1
package main
2
2
3
3
import (
4
- "crypto/ed25519"
5
4
"encoding/base64"
6
5
"encoding/hex"
7
6
"flag"
@@ -20,7 +19,9 @@ import (
20
19
func usage () {
21
20
fmt .Printf ("Usage: %s <command> [options]\n " , os .Args [0 ])
22
21
fmt .Println ("Commands:" )
23
- fmt .Println (" add-log -db <path> -origin <origin> -key <base64-encoded Ed25519 key>" )
22
+ fmt .Println (" add-log -db <path> -origin <origin>" )
23
+ fmt .Println (" add-key -db <path> -origin <origin> -key <verifier key>" )
24
+ fmt .Println (" del-key -db <path> -origin <origin> -key <verifier key>" )
24
25
fmt .Println (" add-sigsum-log -db <path> -key <hex-encoded key>" )
25
26
fmt .Println (" list-logs -db <path>" )
26
27
os .Exit (1 )
@@ -30,39 +31,36 @@ func main() {
30
31
if len (os .Args ) < 2 {
31
32
usage ()
32
33
}
34
+ fs := flag .NewFlagSet (os .Args [0 ], flag .ExitOnError )
35
+ dbFlag := fs .String ("db" , "litewitness.db" , "path to sqlite database" )
33
36
switch os .Args [1 ] {
34
37
case "add-log" :
35
- fs := flag .NewFlagSet ("add-log" , flag .ExitOnError )
36
- dbFlag := fs .String ("db" , "litewitness.db" , "path to sqlite database" )
37
38
originFlag := fs .String ("origin" , "" , "log name" )
38
- keyFlag := fs .String ("key" , "" , "base64-encoded key" )
39
39
fs .Parse (os .Args [2 :])
40
- key , err := base64 .StdEncoding .DecodeString (* keyFlag )
41
- if err != nil {
42
- log .Fatal (err )
43
- }
44
40
db := openDB (* dbFlag )
45
- addLog (db , * originFlag , key )
41
+ addLog (db , * originFlag )
42
+
43
+ case "add-key" :
44
+ originFlag := fs .String ("origin" , "" , "log name" )
45
+ keyFlag := fs .String ("key" , "" , "verifier key" )
46
+ fs .Parse (os .Args [2 :])
47
+ db := openDB (* dbFlag )
48
+ addKey (db , * originFlag , * keyFlag )
49
+
50
+ case "del-key" :
51
+ originFlag := fs .String ("origin" , "" , "log name" )
52
+ keyFlag := fs .String ("key" , "" , "verifier key" )
53
+ fs .Parse (os .Args [2 :])
54
+ db := openDB (* dbFlag )
55
+ delKey (db , * originFlag , * keyFlag )
46
56
47
57
case "add-sigsum-log" :
48
- fs := flag .NewFlagSet ("add-sigsum-log" , flag .ExitOnError )
49
- dbFlag := fs .String ("db" , "litewitness.db" , "path to sqlite database" )
50
58
keyFlag := fs .String ("key" , "" , "hex-encoded key" )
51
59
fs .Parse (os .Args [2 :])
52
- if len (* keyFlag ) != sigsum .PublicKeySize * 2 {
53
- log .Println (* keyFlag )
54
- log .Fatal ("key must be 32 hex-encoded bytes" )
55
- }
56
- var key sigsum.PublicKey
57
- if _ , err := hex .Decode (key [:], []byte (* keyFlag )); err != nil {
58
- log .Fatal (err )
59
- }
60
60
db := openDB (* dbFlag )
61
- addSigsumLog (db , key )
61
+ addSigsumLog (db , * keyFlag )
62
62
63
63
case "list-logs" :
64
- fs := flag .NewFlagSet ("list-logs" , flag .ExitOnError )
65
- dbFlag := fs .String ("db" , "litewitness.db" , "path to sqlite database" )
66
64
fs .Parse (os .Args [2 :])
67
65
db := openDB (* dbFlag )
68
66
listLogs (db )
@@ -75,31 +73,62 @@ func main() {
75
73
func openDB (dbPath string ) * sqlite.Conn {
76
74
db , err := witness .OpenDB (dbPath )
77
75
if err != nil {
78
- log .Fatalf ("opening database: %v" , err )
76
+ log .Fatalf ("Error opening database: %v" , err )
79
77
}
80
78
return db
81
79
}
82
80
83
- func addLog (db * sqlite.Conn , origin string , key ed25519. PublicKey ) {
81
+ func addLog (db * sqlite.Conn , origin string ) {
84
82
treeHash := merkle .HashEmptyTree ()
85
83
if err := sqlitex .Exec (db , "INSERT INTO log (origin, tree_size, tree_hash) VALUES (?, 0, ?)" ,
86
84
nil , origin , base64 .StdEncoding .EncodeToString (treeHash [:])); err != nil {
87
- log .Fatal ( err )
85
+ log .Fatalf ( "Error adding log: %v" , err )
88
86
}
89
- k , err := note .NewEd25519VerifierKey (origin , key [:])
87
+ log .Printf ("Added log %q." , origin )
88
+ }
89
+
90
+ func addKey (db * sqlite.Conn , origin string , vk string ) {
91
+ v , err := note .NewVerifier (vk )
90
92
if err != nil {
91
- log .Fatal ( err )
93
+ log .Fatalf ( "Error parsing verifier key: %v" , err )
92
94
}
93
- if sqlitex . Exec ( db , "INSERT INTO key (origin, key) VALUES (?, ?)" , nil , origin , k ); err != nil {
94
- log .Fatal ( err )
95
+ if v . Name () != origin {
96
+ log .Fatalf ( "Verifier key name %q does not match origin %q." , v . Name (), origin )
95
97
}
96
- log .Printf ("Added log %q." , key )
98
+ err = sqlitex .Exec (db , "INSERT INTO key (origin, key) VALUES (?, ?)" , nil , origin , vk )
99
+ if err != nil {
100
+ log .Fatalf ("Error adding key: %v" , err )
101
+ }
102
+ log .Printf ("Added key %q." , vk )
103
+ }
104
+
105
+ func delKey (db * sqlite.Conn , origin string , vk string ) {
106
+ err := sqlitex .Exec (db , "DELETE FROM key WHERE origin = ? AND key = ?" , nil , origin , vk )
107
+ if err != nil {
108
+ log .Fatalf ("Error deleting key: %v" , err )
109
+ }
110
+ if db .Changes () == 0 {
111
+ log .Fatalf ("Key %q not found." , vk )
112
+ }
113
+ log .Printf ("Deleted key %q." , vk )
97
114
}
98
115
99
- func addSigsumLog (db * sqlite.Conn , key sigsum.PublicKey ) {
116
+ func addSigsumLog (db * sqlite.Conn , keyFlag string ) {
117
+ if len (keyFlag ) != sigsum .PublicKeySize * 2 {
118
+ log .Fatal ("Key must be 32 hex-encoded bytes." )
119
+ }
120
+ var key sigsum.PublicKey
121
+ if _ , err := hex .Decode (key [:], []byte (keyFlag )); err != nil {
122
+ log .Fatalf ("Error decoding key: %v" , err )
123
+ }
100
124
keyHash := sigsum .HashBytes (key [:])
101
125
origin := fmt .Sprintf ("sigsum.org/v1/tree/%x" , keyHash )
102
- addLog (db , origin , key [:])
126
+ vk , err := note .NewEd25519VerifierKey (origin , key [:])
127
+ if err != nil {
128
+ log .Fatalf ("Error computing verifier key: %v" , err )
129
+ }
130
+ addLog (db , origin )
131
+ addKey (db , origin , vk )
103
132
}
104
133
105
134
func listLogs (db * sqlite.Conn ) {
@@ -120,6 +149,6 @@ func listLogs(db *sqlite.Conn) {
120
149
_ , err := fmt .Printf ("%s\n " , stmt .ColumnText (0 ))
121
150
return err
122
151
}); err != nil {
123
- log .Fatal ( err )
152
+ log .Fatalf ( "Error listing logs: %v" , err )
124
153
}
125
154
}
0 commit comments