fix: resolve mnd (magic number) linter errors in agehd and bip85 packages
- Define x25519KeySize constant (32) at package level in agehd - Replace all magic number 32 uses with x25519KeySize constant - Define bech32BitSize8 and bech32BitSize5 constants for bit conversions - Define bip85EntropySize constant (64) for entropy validation - Define BIP39 word count constants (words12-24) with descriptive names
This commit is contained in:
parent
95ba80f618
commit
93a32217e0
@ -21,10 +21,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
purpose = uint32(83696968) // fixed by BIP-85 ("bip")
|
purpose = uint32(83696968) // fixed by BIP-85 ("bip")
|
||||||
vendorID = uint32(592366788) // berlin.sneak
|
vendorID = uint32(592366788) // berlin.sneak
|
||||||
appID = uint32(733482323) // secret
|
appID = uint32(733482323) // secret
|
||||||
hrp = "age-secret-key-" // Bech32 HRP used by age
|
hrp = "age-secret-key-" // Bech32 HRP used by age
|
||||||
|
x25519KeySize = 32 // 256-bit key size for X25519
|
||||||
)
|
)
|
||||||
|
|
||||||
// clamp applies RFC-7748 clamping to a 32-byte scalar.
|
// clamp applies RFC-7748 clamping to a 32-byte scalar.
|
||||||
@ -37,17 +38,20 @@ func clamp(k []byte) {
|
|||||||
// IdentityFromEntropy converts 32 deterministic bytes into an
|
// IdentityFromEntropy converts 32 deterministic bytes into an
|
||||||
// *age.X25519Identity by round-tripping through Bech32.
|
// *age.X25519Identity by round-tripping through Bech32.
|
||||||
func IdentityFromEntropy(ent []byte) (*age.X25519Identity, error) {
|
func IdentityFromEntropy(ent []byte) (*age.X25519Identity, error) {
|
||||||
const x25519KeySize = 32 // 256-bit key size for X25519
|
|
||||||
if len(ent) != x25519KeySize {
|
if len(ent) != x25519KeySize {
|
||||||
return nil, fmt.Errorf("need 32-byte scalar, got %d", len(ent))
|
return nil, fmt.Errorf("need 32-byte scalar, got %d", len(ent))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make a copy to avoid modifying the original
|
// Make a copy to avoid modifying the original
|
||||||
key := make([]byte, 32) // 32 bytes = 256-bit key size for X25519 // 32 bytes = 256-bit key size for X25519
|
key := make([]byte, x25519KeySize)
|
||||||
copy(key, ent)
|
copy(key, ent)
|
||||||
clamp(key)
|
clamp(key)
|
||||||
|
|
||||||
data, err := bech32.ConvertBits(key, 8, 5, true) // Convert from 8-bit to 5-bit encoding for bech32
|
const (
|
||||||
|
bech32BitSize8 = 8 // Standard 8-bit encoding
|
||||||
|
bech32BitSize5 = 5 // Bech32 5-bit encoding
|
||||||
|
)
|
||||||
|
data, err := bech32.ConvertBits(key, bech32BitSize8, bech32BitSize5, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("bech32 convert: %w", err)
|
return nil, fmt.Errorf("bech32 convert: %w", err)
|
||||||
}
|
}
|
||||||
@ -82,7 +86,7 @@ func DeriveEntropy(mnemonic string, n uint32) ([]byte, error) {
|
|||||||
|
|
||||||
// Use BIP85 DRNG to generate deterministic 32 bytes for the age key
|
// Use BIP85 DRNG to generate deterministic 32 bytes for the age key
|
||||||
drng := bip85.NewBIP85DRNG(entropy)
|
drng := bip85.NewBIP85DRNG(entropy)
|
||||||
key := make([]byte, 32) // 32 bytes = 256-bit key size for X25519
|
key := make([]byte, x25519KeySize)
|
||||||
_, err = drng.Read(key)
|
_, err = drng.Read(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to read from DRNG: %w", err)
|
return nil, fmt.Errorf("failed to read from DRNG: %w", err)
|
||||||
@ -111,7 +115,7 @@ func DeriveEntropyFromXPRV(xprv string, n uint32) ([]byte, error) {
|
|||||||
|
|
||||||
// Use BIP85 DRNG to generate deterministic 32 bytes for the age key
|
// Use BIP85 DRNG to generate deterministic 32 bytes for the age key
|
||||||
drng := bip85.NewBIP85DRNG(entropy)
|
drng := bip85.NewBIP85DRNG(entropy)
|
||||||
key := make([]byte, 32) // 32 bytes = 256-bit key size for X25519
|
key := make([]byte, x25519KeySize)
|
||||||
_, err = drng.Read(key)
|
_, err = drng.Read(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to read from DRNG: %w", err)
|
return nil, fmt.Errorf("failed to read from DRNG: %w", err)
|
||||||
|
@ -52,8 +52,9 @@ type DRNG struct {
|
|||||||
|
|
||||||
// NewBIP85DRNG creates a new DRNG seeded with BIP85 entropy
|
// NewBIP85DRNG creates a new DRNG seeded with BIP85 entropy
|
||||||
func NewBIP85DRNG(entropy []byte) *DRNG {
|
func NewBIP85DRNG(entropy []byte) *DRNG {
|
||||||
|
const bip85EntropySize = 64 // 512 bits
|
||||||
// The entropy must be exactly 64 bytes (512 bits)
|
// The entropy must be exactly 64 bytes (512 bits)
|
||||||
if len(entropy) != 64 {
|
if len(entropy) != bip85EntropySize {
|
||||||
panic("DRNG entropy must be 64 bytes")
|
panic("DRNG entropy must be 64 bytes")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,17 +170,26 @@ func DeriveBIP39Entropy(masterKey *hdkeychain.ExtendedKey, language, words, inde
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Determine how many bits of entropy to use based on the words
|
// Determine how many bits of entropy to use based on the words
|
||||||
|
// BIP39 defines specific word counts and their corresponding entropy bits
|
||||||
|
const (
|
||||||
|
words12 = 12 // 128 bits of entropy
|
||||||
|
words15 = 15 // 160 bits of entropy
|
||||||
|
words18 = 18 // 192 bits of entropy
|
||||||
|
words21 = 21 // 224 bits of entropy
|
||||||
|
words24 = 24 // 256 bits of entropy
|
||||||
|
)
|
||||||
|
|
||||||
var bits int
|
var bits int
|
||||||
switch words {
|
switch words {
|
||||||
case 12:
|
case words12:
|
||||||
bits = 128
|
bits = 128
|
||||||
case 15:
|
case words15:
|
||||||
bits = 160
|
bits = 160
|
||||||
case 18:
|
case words18:
|
||||||
bits = 192
|
bits = 192
|
||||||
case 21:
|
case words21:
|
||||||
bits = 224
|
bits = 224
|
||||||
case 24:
|
case words24:
|
||||||
bits = 256
|
bits = 256
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("invalid BIP39 word count: %d", words)
|
return nil, fmt.Errorf("invalid BIP39 word count: %d", words)
|
||||||
|
Loading…
Reference in New Issue
Block a user