From b15799e7cbf1d4e650571731223659d0425b125e Mon Sep 17 00:00:00 2001 From: sachaaaaa Date: Wed, 7 Aug 2019 16:19:20 +1000 Subject: [PATCH 1/3] Generate 13 word seeds by default - still accept 25 word seeds. --- libtextsecure/account_manager.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libtextsecure/account_manager.js b/libtextsecure/account_manager.js index 219d8bb7a..2e7b96748 100644 --- a/libtextsecure/account_manager.js +++ b/libtextsecure/account_manager.js @@ -123,7 +123,12 @@ let generateKeypair; if (mnemonic) { generateKeypair = () => { - const seedHex = window.mnemonic.mn_decode(mnemonic, mnemonicLanguage); + let seedHex = window.mnemonic.mn_decode(mnemonic, mnemonicLanguage); + // handle shorter than 32 bytes seeds + if (seedHex.length !== 32 * 2) { + seedHex = seedHex.concat(seedHex); + seedHex = seedHex.substring(0, 32 * 2); + } const privKeyHex = window.mnemonic.sc_reduce32(seedHex); const privKey = dcodeIO.ByteBuffer.wrap( privKeyHex, @@ -517,8 +522,8 @@ }); }, async generateMnemonic(language = 'english') { - const keys = await libsignal.KeyHelper.generateIdentityKeyPair(); - const hex = StringView.arrayBufferToHex(keys.privKey); + const seed = window.Signal.Crypto.getRandomBytes(16); + const hex = StringView.arrayBufferToHex(seed); return mnemonic.mn_encode(hex, language); }, getCurrentMnemonic() { From 16e51a2c7a20aa35ca85228099c5b3e45c5236ca Mon Sep 17 00:00:00 2001 From: sachaaaaa Date: Thu, 8 Aug 2019 10:20:17 +1000 Subject: [PATCH 2/3] use variable for magic number --- libtextsecure/account_manager.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libtextsecure/account_manager.js b/libtextsecure/account_manager.js index 2e7b96748..98621fba1 100644 --- a/libtextsecure/account_manager.js +++ b/libtextsecure/account_manager.js @@ -125,9 +125,10 @@ generateKeypair = () => { let seedHex = window.mnemonic.mn_decode(mnemonic, mnemonicLanguage); // handle shorter than 32 bytes seeds - if (seedHex.length !== 32 * 2) { + const privKeyHexLength = 32 * 2; + if (seedHex.length !== privKeyHexLength) { seedHex = seedHex.concat(seedHex); - seedHex = seedHex.substring(0, 32 * 2); + seedHex = seedHex.substring(0, privKeyHexLength); } const privKeyHex = window.mnemonic.sc_reduce32(seedHex); const privKey = dcodeIO.ByteBuffer.wrap( From 0e61ab8ccc553e1420efc31941d2fa4cb986eb3f Mon Sep 17 00:00:00 2001 From: sachaaaaa Date: Thu, 8 Aug 2019 13:44:46 +1000 Subject: [PATCH 3/3] Better document magic numbers --- libtextsecure/account_manager.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libtextsecure/account_manager.js b/libtextsecure/account_manager.js index 98621fba1..db0c9192a 100644 --- a/libtextsecure/account_manager.js +++ b/libtextsecure/account_manager.js @@ -523,7 +523,10 @@ }); }, async generateMnemonic(language = 'english') { - const seed = window.Signal.Crypto.getRandomBytes(16); + // Note: 4 bytes are converted into 3 seed words, so length 12 seed words + // (13 - 1 checksum) are generated using 12 * 4 / 3 = 16 bytes. + const seedSize = 16; + const seed = window.Signal.Crypto.getRandomBytes(seedSize); const hex = StringView.arrayBufferToHex(seed); return mnemonic.mn_encode(hex, language); },