github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/engine/paperkey_primary.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  // PaperKeyPrimary creates the initial paper backup key for a user.  It
     5  // differs from the PaperKey engine in that it already knows the
     6  // signing key and it doesn't offer to revoke any devices, plus it
     7  // uses a different UI call to display the phrase.
     8  package engine
     9  
    10  import (
    11  	"github.com/keybase/client/go/libkb"
    12  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
    13  )
    14  
    15  // PaperKeyPrimary is an engine.
    16  type PaperKeyPrimary struct {
    17  	passphrase libkb.PaperKeyPhrase
    18  	args       *PaperKeyPrimaryArgs
    19  	libkb.Contextified
    20  }
    21  
    22  type PaperKeyPrimaryArgs struct {
    23  	SigningKey     libkb.GenericKey
    24  	EncryptionKey  libkb.NaclDHKeyPair
    25  	Me             *libkb.User
    26  	PerUserKeyring *libkb.PerUserKeyring // optional
    27  }
    28  
    29  // NewPaperKeyPrimary creates a PaperKeyPrimary engine.
    30  func NewPaperKeyPrimary(g *libkb.GlobalContext, args *PaperKeyPrimaryArgs) *PaperKeyPrimary {
    31  	return &PaperKeyPrimary{
    32  		args:         args,
    33  		Contextified: libkb.NewContextified(g),
    34  	}
    35  }
    36  
    37  // Name is the unique engine name.
    38  func (e *PaperKeyPrimary) Name() string {
    39  	return "PaperKeyPrimary"
    40  }
    41  
    42  // GetPrereqs returns the engine prereqs.
    43  func (e *PaperKeyPrimary) Prereqs() Prereqs {
    44  	return Prereqs{
    45  		Device: true,
    46  	}
    47  }
    48  
    49  // RequiredUIs returns the required UIs.
    50  func (e *PaperKeyPrimary) RequiredUIs() []libkb.UIKind {
    51  	return []libkb.UIKind{
    52  		libkb.LoginUIKind,
    53  	}
    54  }
    55  
    56  // SubConsumers returns the other UI consumers for this engine.
    57  func (e *PaperKeyPrimary) SubConsumers() []libkb.UIConsumer {
    58  	return []libkb.UIConsumer{&PaperKeyGen{}}
    59  }
    60  
    61  // Run starts the engine.
    62  func (e *PaperKeyPrimary) Run(m libkb.MetaContext) error {
    63  	var err error
    64  	e.passphrase, err = libkb.MakePaperKeyPhrase(libkb.PaperKeyVersion)
    65  	if err != nil {
    66  		return err
    67  	}
    68  
    69  	kgarg := &PaperKeyGenArg{
    70  		Passphrase:     e.passphrase,
    71  		Me:             e.args.Me,
    72  		SigningKey:     e.args.SigningKey,
    73  		EncryptionKey:  e.args.EncryptionKey,
    74  		PerUserKeyring: e.args.PerUserKeyring,
    75  	}
    76  	kgeng := NewPaperKeyGen(e.G(), kgarg)
    77  	if err := RunEngine2(m, kgeng); err != nil {
    78  		return err
    79  	}
    80  
    81  	// If they refuse to write down their key, don't kill the login flow, just print an
    82  	// ugly warning, which likely they won't see...
    83  	w := m.UIs().LoginUI.DisplayPrimaryPaperKey(m.Ctx(), keybase1.DisplayPrimaryPaperKeyArg{Phrase: e.passphrase.String()})
    84  	if w != nil {
    85  		m.G().Log.Errorf("Display paper key failure: %s", w.Error())
    86  	}
    87  
    88  	return nil
    89  }