UNPKG

1.83 kBJavaScriptView Raw
1var fs = require('fs')
2 , loadWallet = require('../utils/loadWallet')
3 , makeNonce = require('../utils/makeNonce')
4 , crypto = require('crypto')
5 , Progress = require('progress')
6 , writeHeader = require('../utils/writeHeader')
7 , printHeader = require('../utils/printHeader')
8
9module.exports = function (inFile, outFile, options) {
10 if (!outFile) {
11 outFile = inFile + '.salty-sig'
12 }
13 try {
14 fs.statSync(outFile)
15 if (!options.parent.force) {
16 throw new Error('Refusing to overwrite ' + outFile + '. Use --force to ignore this.')
17 }
18 }
19 catch (err) {
20 if (err && err.code !== 'ENOENT') {
21 throw err
22 }
23 }
24 loadWallet(options.parent.wallet, function (err, wallet) {
25 if (err) throw err
26 var inStat = fs.statSync(inFile)
27 var inStream = fs.createReadStream(inFile)
28 var bar = new Progress(' hashing [:bar] :percent ETA: :etas', { total: inStat.size, width: 80 })
29 inStream.on('data', function (chunk) {
30 bar.tick(chunk.length)
31 })
32 var nonce = makeNonce(32)
33 var hashStream = crypto.createHmac('sha256', nonce)
34 var header = Object.create(null)
35 header['from-salty-id'] = wallet.pubkey.toBuffer().toString('base64')
36 header['nonce'] = nonce.toString('base64')
37 hashStream.once('data', function (hash) {
38 bar.terminate()
39 header['hash'] = hash.toString('base64')
40 var headerStr = writeHeader(header)
41 header['signature'] = wallet.sign(Buffer(headerStr), true).toString('base64')
42 var finalHeader = writeHeader(header)
43 fs.writeFile(outFile, finalHeader, function (err) {
44 if (err) throw err
45 header['from-salty-id'] = wallet.pubkey.toString(true)
46 printHeader(header)
47 console.log('Wrote signature to', outFile)
48 })
49 })
50 inStream.pipe(hashStream)
51 inStream.resume()
52 })
53}
\No newline at end of file