Change seed file with a bip39 mnemonic (#207)

* Change seed file with a bip39 mnemonic

* Create helper for bip39 mnemonic

* Prod mode on lamassu-update-to-mnemonic script

* Fix standard styling issues
This commit is contained in:
Rafael Taranto 2018-11-07 15:28:40 -02:00 committed by Josh Harvey
parent 809bf5a2a9
commit d97a33565f
10 changed files with 98 additions and 34 deletions

1
.gitignore vendored
View file

@ -30,6 +30,7 @@ raqia.json
scratch/ scratch/
seeds/ seeds/
mnemonics/
certs/ certs/
lamassu.json lamassu.json

9
bin/bip39 Executable file
View file

@ -0,0 +1,9 @@
#!/usr/bin/env node
'use strict'
const mnemonicHelpers = require('../lib/mnemonic-helpers')
const seed = process.argv[2]
console.log(mnemonicHelpers.fromSeed(seed))

View file

@ -16,12 +16,13 @@ OFAC_DATA_DIR=$CONFIG_DIR/ofac
mkdir -p $CERT_DIR mkdir -p $CERT_DIR
mkdir -p $CONFIG_DIR >> $LOG_FILE 2>&1 mkdir -p $CONFIG_DIR >> $LOG_FILE 2>&1
echo "Generating seed..." echo "Generating mnemonic..."
SEEDS_DIR=seeds MNEMONIC_DIR=$CONFIG_DIR/mnemonics
SEED_FILE=$SEEDS_DIR/seed.txt MNEMONIC_FILE=$MNEMONIC_DIR/mnemonic.txt
mkdir -p $SEEDS_DIR >> $LOG_FILE 2>&1 mkdir -p $MNEMONIC_DIR >> $LOG_FILE 2>&1
SEED=$(openssl rand -hex 32) SEED=$(openssl-1.0 rand -hex 32)
echo $SEED > $SEED_FILE MNEMONIC=$($PWD/bin/bip39 $SEED)
echo "$MNEMONIC" > $MNEMONIC_FILE
echo "Generating SSL certificates..." echo "Generating SSL certificates..."
@ -71,7 +72,7 @@ touch $OFAC_DATA_DIR/etags.json
cat <<EOF > $CONFIG_DIR/lamassu.json cat <<EOF > $CONFIG_DIR/lamassu.json
{ {
"postgresql": "psql://postgres:$POSTGRES_PASS@localhost/lamassu", "postgresql": "psql://postgres:$POSTGRES_PASS@localhost/lamassu",
"seedPath": "$SEED_FILE", "mnemonicPath": "$MNEMONIC_FILE",
"caPath": "$CA_PATH", "caPath": "$CA_PATH",
"certPath": "$SERVER_CERT_PATH", "certPath": "$SERVER_CERT_PATH",
"keyPath": "$SERVER_KEY_PATH", "keyPath": "$SERVER_KEY_PATH",

View file

@ -1,14 +1,8 @@
#!/usr/bin/env node #!/usr/bin/env node
const fs = require('fs') const fs = require('fs')
const bip39 = require('bip39')
const options = require('../lib/options') const options = require('../lib/options')
const seed = fs.readFileSync(options.seedPath, 'utf8').trim() const mnemonic = fs.readFileSync(options.mnemonicPath, 'utf8').trim()
console.log(mnemonic)
const words = bip39.entropyToMnemonic(seed).split(' ')
for (let i = 0; i < words.length; i += 6) {
console.log(words.slice(i, i + 6).join(' '))
}

View file

@ -4,6 +4,8 @@ set -e
export LOG_FILE=/tmp/update.$(date +"%Y%m%d").log export LOG_FILE=/tmp/update.$(date +"%Y%m%d").log
export NPM_BIN=$(npm -g bin) export NPM_BIN=$(npm -g bin)
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
rm -f ${LOG_FILE} rm -f ${LOG_FILE}
decho () { decho () {
@ -55,6 +57,9 @@ decho "running migration"
lamassu-migrate >> ${LOG_FILE} 2>&1 lamassu-migrate >> ${LOG_FILE} 2>&1
lamassu-migrate-config >> ${LOG_FILE} 2>&1 lamassu-migrate-config >> ${LOG_FILE} 2>&1
decho "update to mnemonic"
$SCRIPTPATH/bin/lamassu-update-to-mnemonic --prod
decho "updating supervisor conf" decho "updating supervisor conf"
perl -i -pe 's/command=.*/command=$ENV{NPM_BIN}\/lamassu-server/g' /etc/supervisor/conf.d/lamassu-server.conf >> ${LOG_FILE} 2>&1 perl -i -pe 's/command=.*/command=$ENV{NPM_BIN}\/lamassu-server/g' /etc/supervisor/conf.d/lamassu-server.conf >> ${LOG_FILE} 2>&1
perl -i -pe 's/command=.*/command=$ENV{NPM_BIN}\/lamassu-admin-server/g' /etc/supervisor/conf.d/lamassu-admin-server.conf >> ${LOG_FILE} 2>&1 perl -i -pe 's/command=.*/command=$ENV{NPM_BIN}\/lamassu-admin-server/g' /etc/supervisor/conf.d/lamassu-admin-server.conf >> ${LOG_FILE} 2>&1

30
bin/lamassu-update-to-mnemonic Executable file
View file

@ -0,0 +1,30 @@
#!/usr/bin/env node
'use strict'
const fs = require('fs')
const path = require('path')
const os = require('os')
const mnemonicHelpers = require('../lib/mnemonic-helpers')
const options = require('../lib/options-loader')()
if (!options.opts.mnemonicPath && options.opts.seedPath) {
const seed = fs.readFileSync(options.opts.seedPath, 'utf8').trim()
const mnemonic = mnemonicHelpers.fromSeed(seed)
if (process.argv[2] === '--prod') {
options.opts.mnemonicPath = path.resolve('etc', 'lamassu', 'mnemonics', 'mnemonic.txt')
} else {
options.opts.mnemonicPath = path.resolve(os.homedir(), '.lamassu', 'mnemonics', 'mnemonic.txt')
}
if (!fs.existsSync(path.dirname(options.opts.mnemonicPath))) {
fs.mkdirSync(path.dirname(options.opts.mnemonicPath))
}
if (!fs.existsSync(options.opts.mnemonicPath)) {
fs.writeFileSync(options.opts.mnemonicPath, mnemonic, 'utf8')
}
fs.writeFileSync(options.path, JSON.stringify(options.opts, null, '\t'), 'utf8')
}

View file

@ -1,5 +1,6 @@
{ {
"seedPath": "/etc/lamassu/seeds/seed.txt", "seedPath": "/etc/lamassu/seeds/seed.txt",
"mnemonicPath": "/etc/lamassu/mnemonics/mnemonic.txt",
"caPath": "/etc/ssl/certs/Lamassu_OP_Root_CA.pem", "caPath": "/etc/ssl/certs/Lamassu_OP_Root_CA.pem",
"certPath": "/etc/ssl/certs/Lamassu_OP.pem", "certPath": "/etc/ssl/certs/Lamassu_OP.pem",
"keyPath": "/etc/ssl/private/Lamassu_OP.key", "keyPath": "/etc/ssl/private/Lamassu_OP.key",

View file

@ -6,6 +6,7 @@ const pify = require('pify')
const fs = pify(require('fs')) const fs = pify(require('fs'))
const db = require('../db') const db = require('../db')
const mnemonicHelpers = require('../mnemonic-helpers')
const configManager = require('../config-manager') const configManager = require('../config-manager')
const options = require('../options') const options = require('../options')
const logger = require('../logger') const logger = require('../logger')
@ -129,9 +130,10 @@ function sendRadar (data) {
function mapRecord (info) { function mapRecord (info) {
const timestamp = new Date().toISOString() const timestamp = new Date().toISOString()
return Promise.all([getMachines(info), fs.readFile(options.seedPath, 'utf8')]) return Promise.all([getMachines(info), fs.readFile(options.mnemonicPath, 'utf8')])
.then(([machines, hex]) => ({ .then(([machines, mnemonic]) => {
operatorId: computeOperatorId(Buffer.from(hex.trim(), 'hex')), return {
operatorId: computeOperatorId(mnemonicHelpers.toEntropyBuffer(mnemonic)),
operator: { operator: {
name: null, name: null,
phone: null, phone: null,
@ -139,7 +141,8 @@ function mapRecord (info) {
}, },
timestamp, timestamp,
machines machines
})) }
})
} }
function update (info) { function update (info) {

19
lib/mnemonic-helpers.js Normal file
View file

@ -0,0 +1,19 @@
const bip39 = require('bip39')
const os = require('os')
function fromSeed (seed) {
const words = bip39.entropyToMnemonic(seed).split(' ')
let mnemonic = ''
for (let i = 0; i < words.length; i += 6) {
mnemonic += words.slice(i, i + 6).join(' ') + os.EOL
}
return mnemonic
}
function toEntropyBuffer (mnemonic) {
const hex = bip39.mnemonicToEntropy(mnemonic.split('\n').join(' ').trim())
return Buffer.from(hex.trim(), 'hex')
}
module.exports = { toEntropyBuffer, fromSeed }

View file

@ -6,6 +6,7 @@ const configManager = require('./config-manager')
const pify = require('pify') const pify = require('pify')
const fs = pify(require('fs')) const fs = pify(require('fs'))
const mnemonicHelpers = require('./mnemonic-helpers')
const options = require('./options') const options = require('./options')
const ph = require('./plugin-helper') const ph = require('./plugin-helper')
const layer2 = require('./layer2') const layer2 = require('./layer2')
@ -28,9 +29,9 @@ function computeSeed (masterSeed) {
} }
function fetchWallet (settings, cryptoCode) { function fetchWallet (settings, cryptoCode) {
return fs.readFile(options.seedPath, 'utf8') return fs.readFile(options.mnemonicPath, 'utf8')
.then(hex => { .then(mnemonic => {
const masterSeed = Buffer.from(hex.trim(), 'hex') const masterSeed = mnemonicHelpers.toEntropyBuffer(mnemonic)
const plugin = configManager.cryptoScoped(cryptoCode, settings.config).wallet const plugin = configManager.cryptoScoped(cryptoCode, settings.config).wallet
const wallet = ph.load(ph.WALLET, plugin) const wallet = ph.load(ph.WALLET, plugin)
const rawAccount = settings.accounts[plugin] const rawAccount = settings.accounts[plugin]