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