github.com/prysmaticlabs/prysm@v1.4.4/validator/keymanager/imported/backup.go (about) 1 package imported 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/google/uuid" 8 "github.com/pkg/errors" 9 "github.com/prysmaticlabs/prysm/shared/bls" 10 "github.com/prysmaticlabs/prysm/shared/bytesutil" 11 "github.com/prysmaticlabs/prysm/validator/keymanager" 12 keystorev4 "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4" 13 ) 14 15 // ExtractKeystores retrieves the secret keys for specified public keys 16 // in the function input, encrypts them using the specified password, 17 // and returns their respective EIP-2335 keystores. 18 func (km *Keymanager) ExtractKeystores( 19 _ context.Context, publicKeys []bls.PublicKey, password string, 20 ) ([]*keymanager.Keystore, error) { 21 lock.Lock() 22 defer lock.Unlock() 23 encryptor := keystorev4.New() 24 keystores := make([]*keymanager.Keystore, len(publicKeys)) 25 for i, pk := range publicKeys { 26 pubKeyBytes := pk.Marshal() 27 secretKey, ok := secretKeysCache[bytesutil.ToBytes48(pubKeyBytes)] 28 if !ok { 29 return nil, fmt.Errorf( 30 "secret key for public key %#x not found in cache", 31 pubKeyBytes, 32 ) 33 } 34 cryptoFields, err := encryptor.Encrypt(secretKey.Marshal(), password) 35 if err != nil { 36 return nil, errors.Wrapf( 37 err, 38 "could not encrypt secret key for public key %#x", 39 pubKeyBytes, 40 ) 41 } 42 id, err := uuid.NewRandom() 43 if err != nil { 44 return nil, err 45 } 46 keystores[i] = &keymanager.Keystore{ 47 Crypto: cryptoFields, 48 ID: id.String(), 49 Pubkey: fmt.Sprintf("%x", pubKeyBytes), 50 Version: encryptor.Version(), 51 Name: encryptor.Name(), 52 } 53 } 54 return keystores, nil 55 }