status-im/status-go

View on GitHub
account/generator/utils.go

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
package generator

import (
    "bytes"
    "errors"

    "github.com/status-im/status-go/eth-node/crypto"
    "github.com/status-im/status-go/eth-node/types"
    "github.com/status-im/status-go/extkeys"
)

var (
    // ErrInvalidKeystoreExtendedKey is returned when the decrypted keystore file
    // contains some old Status keys.
    // The old version used to store the BIP44 account at index 0 as PrivateKey,
    // and the BIP44 account at index 1 as ExtendedKey.
    // The current version stores the same key as PrivateKey and ExtendedKey.
    ErrInvalidKeystoreExtendedKey  = errors.New("PrivateKey and ExtendedKey are different")
    ErrInvalidMnemonicPhraseLength = errors.New("invalid mnemonic phrase length; valid lengths are 12, 15, 18, 21, and 24")
)

// ValidateKeystoreExtendedKey validates the keystore keys, checking that
// ExtendedKey is the extended key of PrivateKey.
func ValidateKeystoreExtendedKey(key *types.Key) error {
    if key.ExtendedKey.IsZeroed() {
        return nil
    }

    if !bytes.Equal(crypto.FromECDSA(key.PrivateKey), crypto.FromECDSA(key.ExtendedKey.ToECDSA())) {
        return ErrInvalidKeystoreExtendedKey
    }

    return nil
}

// MnemonicPhraseLengthToEntropyStrength returns the entropy strength for a given mnemonic length
func MnemonicPhraseLengthToEntropyStrength(length int) (extkeys.EntropyStrength, error) {
    if length < 12 || length > 24 || length%3 != 0 {
        return 0, ErrInvalidMnemonicPhraseLength
    }

    bitsLength := length * 11
    checksumLength := bitsLength % 32

    return extkeys.EntropyStrength(bitsLength - checksumLength), nil
}