UNPKG

2.18 kBJavaScriptView Raw
1var libPubkey = require('./pubkey')
2 , assert = require('assert')
3 , writeHeader = require('../utils/writeHeader')
4 , printHeader = require('../utils/printHeader')
5
6function 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}
71module.exports = {
72 parse: parseHeader
73}
\No newline at end of file