Fix numThreads using getAEAD instead of decryptMnemonic (#1859)

* Fix num threads using getAEAD instead of decryptMnemonic

* Use d.NumThread to init bruteforce for num threads in getAEAD

Co-authored-by: Ori Newman <>
This commit is contained in:
Ori Newman 2021-12-06 23:56:00 +02:00 committed by GitHub
parent 32e8e539ac
commit dced1a9376
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -314,11 +314,7 @@ func (d *File) numThreads(password []byte) (uint8, error) {
return defaultNumThreads, nil
}
if d.NumThreads != 0 {
return d.NumThreads, nil
}
numThreads, err := d.detectNumThreads(password, d.EncryptedMnemonics[0].salt)
numThreads, err := d.detectNumThreads(password, d.EncryptedMnemonics[0])
if err != nil {
return 0, err
}
@ -332,30 +328,33 @@ func (d *File) numThreads(password []byte) (uint8, error) {
return numThreads, nil
}
func (d *File) detectNumThreads(password, salt []byte) (uint8, error) {
numCPU := uint8(runtime.NumCPU())
_, err := getAEAD(numCPU, password, salt)
func (d *File) detectNumThreads(password []byte, encryptedMnemonic *EncryptedMnemonic) (uint8, error) {
firstGuessNumThreads := d.NumThreads
if d.NumThreads == 0 {
firstGuessNumThreads = uint8(runtime.NumCPU())
}
_, err := decryptMnemonic(firstGuessNumThreads, encryptedMnemonic, password)
if err != nil {
if !strings.Contains(err.Error(), "message authentication failed") {
return 0, err
}
} else {
return numCPU, nil
return firstGuessNumThreads, nil
}
for i := uint8(1); ; i++ {
if i == numCPU {
for numThreadsGuess := uint8(1); ; numThreadsGuess++ {
if numThreadsGuess == firstGuessNumThreads {
continue
}
_, err := getAEAD(i, password, salt)
_, err := decryptMnemonic(numThreadsGuess, encryptedMnemonic, password)
if err != nil {
const maxTries = 32
if i > maxTries || !strings.Contains(err.Error(), "message authentication failed") {
if numThreadsGuess == maxTries || !strings.Contains(err.Error(), "message authentication failed") {
return 0, err
}
} else {
return i, nil
return numThreadsGuess, nil
}
}
}