1 | var 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 |
|
9 | module.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 |