UNPKG

2.67 kBJavaScriptView Raw
1var libPubkey = require('./pubkey')
2 , assert = require('assert')
3 , writeHeader = require('../utils/writeHeader')
4 , printHeader = require('../utils/printHeader')
5 , crypto = require('crypto')
6 , bs58 = require('bs58')
7
8function parseHeader (headerStr, noTranslate) {
9 var header = Object.create(null)
10 if (toString.call(headerStr) === '[object Object]') {
11 Object.keys(headerStr).forEach(function (k) {
12 header[k] = headerStr[k]
13 })
14 }
15 else {
16 var stop = false
17 headerStr.trim().split('\n').forEach(function (line) {
18 if (stop || !line) return
19 var parts = line.split(':')
20 if (parts.length !== 2) return stop = true
21 header[parts[0].trim().toLowerCase()] = parts[1].trim()
22 })
23 }
24 assert(header['hash'], 'no alg field')
25 return {
26 validate: function (hash) {
27 var from_pubkey, to_pubkey
28 if (header['from-salty-id']) {
29 try {
30 from_pubkey = libPubkey.parse(header['from-salty-id'])
31 }
32 catch (e) {
33 throw new Error('invalid from-salty-id')
34 }
35 }
36 if (header['to-salty-id'] && header['to-salty-id'] !== 'self') {
37 try {
38 to_pubkey = libPubkey.parse(header['to-salty-id'])
39 }
40 catch (e) {
41 throw new Error('invalid to-salty-id')
42 }
43 }
44 assert.strictEqual(header['hash'], hash.toString('hex'), 'wrong hash')
45 if (header['signature']) {
46 assert(from_pubkey)
47 var signedBuf = this.getSignedBuf()
48 //console.log('signed', crypto.createHash('sha1').update(signedBuf).digest('hex'))
49 //console.log('sig', crypto.createHash('sha1').update(Buffer(bs58.decode(header['signature']))).digest('hex'))
50 var ok = from_pubkey.verify(Buffer(bs58.decode(header['signature'])), signedBuf)
51 assert(ok, 'bad signature')
52 if (!noTranslate) {
53 header['signature'] += ' (verified)'
54 }
55 }
56 else if (header['from-salty-id']) {
57 throw new Error('from-salty-id header requires signature')
58 }
59 else if (header['to-salty-id']) {
60 throw new Error('to-salty-id header requires signature')
61 }
62 return this
63 },
64 getSignedBuf: function () {
65 var headerCopy = Object.create(null)
66 Object.keys(header).forEach(function (k) {
67 headerCopy[k] = header[k]
68 })
69 delete headerCopy['signature']
70 return Buffer(this.toString(headerCopy))
71 },
72 toString: function (h) {
73 return writeHeader(h || header)
74 },
75 print: function () {
76 return printHeader(header)
77 },
78 toObject: function () {
79 return header
80 }
81 }
82}
83module.exports = {
84 parse: parseHeader
85}
\No newline at end of file