github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/engine/secretkeys.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 engine 5 6 import ( 7 "fmt" 8 9 "github.com/keybase/client/go/libkb" 10 keybase1 "github.com/keybase/client/go/protocol/keybase1" 11 ) 12 13 type SecretKeysEngine struct { 14 libkb.Contextified 15 result keybase1.SecretKeys 16 } 17 18 func NewSecretKeysEngine(g *libkb.GlobalContext) *SecretKeysEngine { 19 return &SecretKeysEngine{ 20 Contextified: libkb.NewContextified(g), 21 } 22 } 23 24 func (e *SecretKeysEngine) Name() string { 25 return "SecretKey" 26 } 27 28 func (e *SecretKeysEngine) Prereqs() Prereqs { 29 return Prereqs{ 30 Device: true, 31 } 32 } 33 34 func (e *SecretKeysEngine) RequiredUIs() []libkb.UIKind { 35 return []libkb.UIKind{ 36 libkb.LogUIKind, 37 libkb.SecretUIKind, 38 } 39 } 40 41 func (e *SecretKeysEngine) SubConsumers() []libkb.UIConsumer { 42 return []libkb.UIConsumer{} 43 } 44 45 func (e *SecretKeysEngine) Run(m libkb.MetaContext) (err error) { 46 defer m.Trace("SecretKeysEngine#Run", &err)() 47 48 me, err := libkb.LoadMe(libkb.NewLoadUserArgWithMetaContext(m)) 49 if err != nil { 50 return err 51 } 52 53 // Clear out all the cached secret key state. This forces a password prompt 54 // below. 55 m.ActiveDevice().ClearCaches() 56 57 ska := libkb.SecretKeyArg{ 58 Me: me, 59 KeyType: libkb.DeviceSigningKeyType, 60 } 61 sigKey, err := m.G().Keyrings.GetSecretKeyWithPrompt(m, m.SecretKeyPromptArg(ska, "to revoke another key")) 62 if err != nil { 63 return err 64 } 65 if err = sigKey.CheckSecretKey(); err != nil { 66 return err 67 } 68 sigNaclKey, ok := sigKey.(libkb.NaclSigningKeyPair) 69 if !ok { 70 return fmt.Errorf("Expected a NaCl signing key.") 71 } 72 m.Debug("| got signing key") 73 74 ska.KeyType = libkb.DeviceEncryptionKeyType 75 encKey, err := m.G().Keyrings.GetSecretKeyWithPrompt(m, m.SecretKeyPromptArg(ska, "to revoke another key")) 76 if err != nil { 77 return err 78 } 79 if err = encKey.CheckSecretKey(); err != nil { 80 return err 81 } 82 encNaclKey, ok := encKey.(libkb.NaclDHKeyPair) 83 if !ok { 84 return fmt.Errorf("Expected a NaCl encryption key.") 85 } 86 m.Debug("| got encryption key") 87 88 e.result.Signing = [64]byte(*sigNaclKey.Private) 89 e.result.Encryption = [32]byte(*encNaclKey.Private) 90 91 return nil 92 } 93 94 func (e *SecretKeysEngine) Result() keybase1.SecretKeys { 95 return e.result 96 }