github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/libkb/naclgen.go (about) 1 // Copyright 2015 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 package libkb 5 6 import ( 7 "fmt" 8 9 keybase1 "github.com/keybase/client/go/protocol/keybase1" 10 ) 11 12 type NaclKeyPair interface { 13 GenericKey 14 } 15 16 type NaclGenerator func() (NaclKeyPair, error) 17 18 type NaclKeyGenArg struct { 19 Signer GenericKey // who is going to sign us into the Chain 20 ExpiresIn int 21 Generator NaclGenerator 22 Me *User 23 DelegationType DelegationType 24 ExpireIn int // how long it lasts 25 EldestKeyID keybase1.KID // the eldest KID for this epoch 26 Device *Device 27 RevSig string // optional reverse sig. set to nil for autogenerate. 28 } 29 30 type NaclKeyGen struct { 31 arg *NaclKeyGenArg 32 pair NaclKeyPair 33 } 34 35 func NewNaclKeyGen(arg NaclKeyGenArg) *NaclKeyGen { 36 return &NaclKeyGen{arg: &arg} 37 } 38 39 func (g *NaclKeyGen) Generate() (err error) { 40 g.pair, err = g.arg.Generator() 41 return 42 } 43 44 func (g *NaclKeyGen) SaveLKS(m MetaContext, lks *LKSec) error { 45 _, err := WriteLksSKBToKeyring(m, g.pair, lks) 46 return err 47 } 48 49 func (g *NaclKeyGen) Push(m MetaContext, aggregated bool) (d Delegator, err error) { 50 if g.pair == nil { 51 return Delegator{}, fmt.Errorf("cannot Push delegator before Generate") 52 } 53 d = Delegator{ 54 NewKey: g.pair, 55 RevSig: g.arg.RevSig, 56 Device: g.arg.Device, 57 Expire: g.arg.ExpireIn, 58 DelegationType: g.arg.DelegationType, 59 ExistingKey: g.arg.Signer, 60 Me: g.arg.Me, 61 EldestKID: g.arg.EldestKeyID, 62 } 63 64 if aggregated { 65 return 66 } 67 68 err = d.Run(m) 69 return 70 } 71 72 func (g *NaclKeyGen) GetKeyPair() NaclKeyPair { 73 return g.pair 74 } 75 76 func (g *NaclKeyGen) UpdateArg(signer GenericKey, eldestKID keybase1.KID, delegationType DelegationType, user *User) { 77 g.arg.Signer = signer 78 g.arg.EldestKeyID = eldestKID 79 g.arg.DelegationType = delegationType 80 // if a user is passed in, then update the user pointer 81 // this is necessary if the sigchain changed between generation and push. 82 if user != nil { 83 g.arg.Me = user 84 } 85 }