@@ -17,6 +17,7 @@ import (
1717
1818 "filippo.io/keygen"
1919 "filippo.io/sunlight/internal/immutable"
20+ "filippo.io/torchwood"
2021 "golang.org/x/crypto/hkdf"
2122 "golang.org/x/mod/sumdb/note"
2223)
@@ -25,6 +26,7 @@ func main() {
2526 fs := flag .NewFlagSet ("keygen" , flag .ExitOnError )
2627 fileFlag := fs .String ("f" , "" , "path to the seed file" )
2728 prefixFlag := fs .String ("prefix" , "" , "submission prefix for the log, to output a witness verifier key" )
29+ witnessFlag := fs .String ("witness" , "" , "witness name, for generating a witness secret instead" )
2830 fs .Parse (os .Args [1 :])
2931 if fs .NArg () != 0 || * fileFlag == "" {
3032 fmt .Fprintln (os .Stderr , "usage: sunlight-keygen -f <seed file>" )
@@ -57,6 +59,21 @@ func main() {
5759 log .Fatal ("seed file must be exactly 32 bytes" )
5860 }
5961
62+ if * witnessFlag != "" {
63+ ed25519Secret := make ([]byte , ed25519 .SeedSize )
64+ if _ , err := io .ReadFull (hkdf .New (sha256 .New , seed , []byte ("sunlight Ed25519 witness key" ),
65+ []byte (* witnessFlag )), ed25519Secret ); err != nil {
66+ log .Fatal ("failed to derive Ed25519 key:" , err )
67+ }
68+ wk := ed25519 .NewKeyFromSeed (ed25519Secret )
69+ s , err := torchwood .NewCosignatureSigner (* witnessFlag , wk )
70+ if err != nil {
71+ log .Fatal ("failed to create witness signer:" , err )
72+ }
73+ fmt .Printf ("Witness vkey: %s\n " , s .Verifier ())
74+ return
75+ }
76+
6077 ecdsaSecret := make ([]byte , 32 )
6178 if _ , err := io .ReadFull (hkdf .New (sha256 .New , seed , []byte ("sunlight" ), []byte ("ECDSA P-256 log key" )), ecdsaSecret ); err != nil {
6279 log .Fatal ("failed to derive ECDSA secret:" , err )
0 commit comments