1 | var 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 |
|
8 | function 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 |
|
49 |
|
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 | }
|
83 | module.exports = {
|
84 | parse: parseHeader
|
85 | } |
\ | No newline at end of file |