Skip to content

Commit 557cbf5

Browse files
committed
cmd/age-keyserver: hash age public key to prevent log poisoning
1 parent a476a04 commit 557cbf5

4 files changed

Lines changed: 19 additions & 13 deletions

File tree

cmd/age-keylookup/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"crypto/sha256"
45
"encoding/base64"
56
"encoding/json"
67
"fmt"
@@ -138,8 +139,9 @@ func lookupKey(serverURL string, v note.Verifier, vrfKey *vrf.PublicKey, email s
138139
}
139140

140141
// Verify spicy signature
141-
vrfHashB64 := base64.StdEncoding.EncodeToString(vrfHash)
142-
entry := fmt.Appendf(nil, "%s\n%s\n", vrfHashB64, result.Pubkey)
142+
h := sha256.New()
143+
h.Write([]byte(result.Pubkey))
144+
entry := h.Sum(vrfHash) // vrf-r255(email) || SHA-256(pubkey)
143145
if err := torchwood.VerifyProof(v.Name(), func(b []byte) (*note.Note, error) {
144146
return note.Open(b, note.VerifierList(v))
145147
}, tlog.RecordHash(entry), []byte(result.Proof)); err != nil {

cmd/age-keylookup/main_test.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package main
33
import (
44
"context"
55
"crypto/rand"
6-
"encoding/base64"
6+
"crypto/sha256"
77
"encoding/json"
88
"fmt"
99
"html/template"
@@ -150,10 +150,11 @@ func TestCLIDirect(t *testing.T) {
150150

151151
// Compute VRF hash and proof
152152
vrfProof := srv.vrf.Prove([]byte(testEmail))
153-
vrfHash := base64.StdEncoding.EncodeToString(vrfProof.Hash())
154153

155154
// Add to transparency log
156-
entry := tessera.NewEntry(fmt.Appendf(nil, "%s\n%s\n", vrfHash, testKey))
155+
h := sha256.New()
156+
h.Write([]byte(testKey))
157+
entry := tessera.NewEntry(h.Sum(vrfProof.Hash())) // vrf-r255(email) || SHA-256(pubkey)
157158
index, _, err := srv.awaiter.Await(ctx, srv.appender.Add(ctx, entry))
158159
if err != nil {
159160
t.Fatal(err)
@@ -219,10 +220,11 @@ func TestCLIDirect(t *testing.T) {
219220

220221
// Compute VRF hash and proof
221222
vrfProof := srv.vrf.Prove([]byte(email))
222-
vrfHash := base64.StdEncoding.EncodeToString(vrfProof.Hash())
223223

224224
// Add to transparency log
225-
entry := tessera.NewEntry(fmt.Appendf(nil, "%s\n%s\n", vrfHash, testKey))
225+
h := sha256.New()
226+
h.Write([]byte(testKey))
227+
entry := tessera.NewEntry(h.Sum(vrfProof.Hash())) // vrf-r255(email) || SHA-256(pubkey)
226228
index, _, err := srv.awaiter.Await(ctx, srv.appender.Add(ctx, entry))
227229
if err != nil {
228230
t.Fatal(err)
@@ -562,10 +564,11 @@ func insertKeyCmd() script.Cmd {
562564

563565
// Compute VRF hash and proof
564566
vrfProof := globalEnv.server.vrf.Prove([]byte(email))
565-
vrfHash := base64.StdEncoding.EncodeToString(vrfProof.Hash())
566567

567568
// Add to transparency log
568-
entry := tessera.NewEntry(fmt.Appendf(nil, "%s\n%s\n", vrfHash, pubkey))
569+
h := sha256.New()
570+
h.Write([]byte(pubkey))
571+
entry := tessera.NewEntry(h.Sum(vrfProof.Hash())) // vrf-r255(email) || SHA-256(pubkey)
569572
index, _, err := globalEnv.server.awaiter.Await(ctx, globalEnv.server.appender.Add(ctx, entry))
570573
if err != nil {
571574
return nil, fmt.Errorf("failed to add to transparency log: %w", err)

cmd/age-keyserver-keygen/keygen.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ func main() {
2525

2626
vrfKey := vrf.GenerateKey()
2727

28-
fmt.Printf("Private key (for LOG_KEY in keyserver): %s\n", skey)
29-
fmt.Printf("Private VRF key (for VRF_KEY in keyserver): %s\n", base64.StdEncoding.EncodeToString(vrfKey.Bytes()))
28+
fmt.Printf("Private key (for LOG_KEY in age-keyserver): %s\n", skey)
29+
fmt.Printf("Private VRF key (for VRF_KEY in age-keyserver): %s\n", base64.StdEncoding.EncodeToString(vrfKey.Bytes()))
3030
fmt.Printf("Public key (for AGE_KEYSERVER_PUBKEY in age-keylookup): %s\n", vkey)
3131
fmt.Printf("Public VRF key (for AGE_KEYSERVER_VRFKEY in age-keylookup): %s\n", base64.StdEncoding.EncodeToString(vrfKey.PublicKey().Bytes()))
3232
}

cmd/age-keyserver/main.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,11 @@ func (s *Server) handleSetKey(w http.ResponseWriter, r *http.Request) {
332332

333333
// Compute VRF hash and proof
334334
vrfProof := s.vrf.Prove([]byte(email))
335-
vrfHash := base64.StdEncoding.EncodeToString(vrfProof.Hash())
336335

337336
// Add to transparency log
338-
entry := tessera.NewEntry(fmt.Appendf(nil, "%s\n%s\n", vrfHash, pubkey))
337+
h := sha256.New()
338+
h.Write([]byte(pubkey))
339+
entry := tessera.NewEntry(h.Sum(vrfProof.Hash())) // vrf-r255(email) || SHA-256(pubkey)
339340
index, _, err := s.awaiter.Await(r.Context(), s.appender.Add(r.Context(), entry))
340341
if err != nil {
341342
http.Error(w, "Failed to add to transparency log", http.StatusInternalServerError)

0 commit comments

Comments
 (0)