// Run starts the engine. func (e *SaltpackDecrypt) Run(ctx *Context) (err error) { defer e.G().Trace("SaltpackDecrypt::Run", func() error { return err })() // We don't load this in the --paperkey case. var me *libkb.User var key libkb.GenericKey if e.arg.Opts.UsePaperKey { // Prompt the user for a paper key. This doesn't require you to be // logged in. keypair, err := getPaperKey(e.G(), ctx) if err != nil { return err } key = keypair.encKey } else { // Load self so that we can get device keys. This does require you to // be logged in. me, err = libkb.LoadMe(libkb.NewLoadUserArg(e.G())) if err != nil { return err } // Get the device encryption key, maybe prompting the user. ska := libkb.SecretKeyArg{ Me: me, KeyType: libkb.DeviceEncryptionKeyType, } e.G().Log.Debug("| GetSecretKeyWithPrompt") key, err = e.G().Keyrings.GetSecretKeyWithPrompt(ctx.SecretKeyPromptArg(ska, "decrypting a message/file")) if err != nil { return err } } kp, ok := key.(libkb.NaclDHKeyPair) if !ok || kp.Private == nil { return libkb.KeyCannotDecryptError{} } hook := func(mki *saltpack.MessageKeyInfo) error { return e.promptForDecrypt(ctx, mki) } e.G().Log.Debug("| SaltpackDecrypt") var mki *saltpack.MessageKeyInfo mki, err = libkb.SaltpackDecrypt(e.G(), e.arg.Source, e.arg.Sink, kp, hook) if err == saltpack.ErrNoDecryptionKey { err = libkb.NoDecryptionKeyError{Msg: "no suitable device key found"} } // It's ok if me is nil here. e.makeMessageInfo(me, mki) return err }
// Run starts the engine. func (e *SaltpackDecrypt) Run(ctx *Context) (err error) { defer e.G().Trace("SaltpackDecrypt::Run", func() error { return err })() var me *libkb.User me, err = libkb.LoadMe(libkb.NewLoadUserArg(e.G())) if err != nil { return err } ska := libkb.SecretKeyArg{ Me: me, KeyType: libkb.DeviceEncryptionKeyType, } e.G().Log.Debug("| GetSecretKeyWithPrompt") key, err := e.G().Keyrings.GetSecretKeyWithPrompt( ctx.LoginContext, ska, ctx.SecretUI, "decrypting a message/file") if err != nil { return err } kp, ok := key.(libkb.NaclDHKeyPair) if !ok || kp.Private == nil { return libkb.KeyCannotDecryptError{} } hook := func(mki *saltpack.MessageKeyInfo) error { return e.promptForDecrypt(ctx, mki) } e.G().Log.Debug("| SaltpackDecrypt") var mki *saltpack.MessageKeyInfo mki, err = libkb.SaltpackDecrypt(e.G(), e.arg.Source, e.arg.Sink, kp, hook) if err == saltpack.ErrNoDecryptionKey { err = libkb.NoDecryptionKeyError{Msg: "no suitable device key found"} } e.makeMessageInfo(me, mki) return err }