Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit bbfb00c

Browse files
committed
refactor: use async/await instead of callbacks
1 parent 70c33c2 commit bbfb00c

File tree

9 files changed

+454
-658
lines changed

9 files changed

+454
-658
lines changed

package.json

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,13 @@
1212
"test:browser": "aegir test -t browser",
1313
"release": "aegir release",
1414
"release-minor": "aegir release --type minor",
15-
"release-major": "aegir release --type major",
16-
"coverage": "aegir coverage",
17-
"coverage-publish": "aegir coverage publish"
15+
"release-major": "aegir release --type major"
1816
},
1917
"pre-push": [
2018
"lint"
2119
],
2220
"engines": {
23-
"node": ">=6.0.0",
21+
"node": ">=10.0.0",
2422
"npm": ">=3.0.0"
2523
},
2624
"repository": {
@@ -41,26 +39,25 @@
4139
},
4240
"homepage": "https://github.com/libp2p/js-libp2p-keychain#readme",
4341
"dependencies": {
44-
"async": "^2.6.2",
45-
"err-code": "^1.1.2",
46-
"interface-datastore": "~0.6.0",
47-
"libp2p-crypto": "~0.16.1",
42+
"err-code": "^2.0.0",
43+
"interface-datastore": "^0.7.0",
44+
"libp2p-crypto": "^0.17.0",
4845
"merge-options": "^1.0.1",
49-
"node-forge": "~0.7.6",
50-
"pull-stream": "^3.6.9",
46+
"node-forge": "^0.8.5",
47+
"promisify-es6": "^1.0.3",
5148
"sanitize-filename": "^1.6.1"
5249
},
5350
"devDependencies": {
54-
"aegir": "^18.2.1",
51+
"aegir": "^20.0.0",
5552
"chai": "^4.2.0",
53+
"chai-as-promised": "^7.1.1",
5654
"chai-string": "^1.5.0",
57-
"datastore-fs": "~0.8.0",
58-
"datastore-level": "~0.10.0",
55+
"datastore-fs": "^0.9.0",
56+
"datastore-level": "^0.12.1",
5957
"dirty-chai": "^2.0.1",
60-
"level-js": "^4.0.1",
61-
"mocha": "^5.2.0",
62-
"multihashes": "~0.4.14",
63-
"peer-id": "~0.12.2",
58+
"level": "^5.0.1",
59+
"multihashes": "^0.4.15",
60+
"peer-id": "^0.13.2",
6461
"rimraf": "^2.6.3"
6562
},
6663
"contributors": [

src/cms.js

Lines changed: 39 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
'use strict'
22

3-
const setImmediate = require('async/setImmediate')
4-
const series = require('async/series')
5-
const detect = require('async/detect')
6-
const waterfall = require('async/waterfall')
73
require('node-forge/lib/pkcs7')
84
require('node-forge/lib/pbe')
95
const forge = require('node-forge/lib/forge')
10-
const util = require('./util')
6+
const { certificateForKey, findAsync } = require('./util')
117
const errcode = require('err-code')
128

139
/**
@@ -40,44 +36,29 @@ class CMS {
4036
*
4137
* @param {string} name - The local key name.
4238
* @param {Buffer} plain - The data to encrypt.
43-
* @param {function(Error, Buffer)} callback
4439
* @returns {undefined}
4540
*/
46-
encrypt (name, plain, callback) {
41+
async encrypt (name, plain) {
4742
const self = this
48-
const done = (err, result) => setImmediate(() => callback(err, result))
4943

5044
if (!Buffer.isBuffer(plain)) {
51-
return done(errcode(new Error('Plain data must be a Buffer'), 'ERR_INVALID_PARAMS'))
45+
throw errcode(new Error('Plain data must be a Buffer'), 'ERR_INVALID_PARAMS')
5246
}
5347

54-
series([
55-
(cb) => self.keychain.findKeyByName(name, cb),
56-
(cb) => self.keychain._getPrivateKey(name, cb)
57-
], (err, results) => {
58-
if (err) return done(err)
48+
const key = await self.keychain.findKeyByName(name)
49+
const pem = await self.keychain._getPrivateKey(name)
50+
const privateKey = forge.pki.decryptRsaPrivateKey(pem, self.keychain._())
51+
const certificate = await certificateForKey(key, privateKey)
5952

60-
let key = results[0]
61-
let pem = results[1]
62-
try {
63-
const privateKey = forge.pki.decryptRsaPrivateKey(pem, self.keychain._())
64-
util.certificateForKey(key, privateKey, (err, certificate) => {
65-
if (err) return callback(err)
66-
67-
// create a p7 enveloped message
68-
const p7 = forge.pkcs7.createEnvelopedData()
69-
p7.addRecipient(certificate)
70-
p7.content = forge.util.createBuffer(plain)
71-
p7.encrypt()
53+
// create a p7 enveloped message
54+
const p7 = forge.pkcs7.createEnvelopedData()
55+
p7.addRecipient(certificate)
56+
p7.content = forge.util.createBuffer(plain)
57+
p7.encrypt()
7258

73-
// convert message to DER
74-
const der = forge.asn1.toDer(p7.toAsn1()).getBytes()
75-
done(null, Buffer.from(der, 'binary'))
76-
})
77-
} catch (err) {
78-
done(err)
79-
}
80-
})
59+
// convert message to DER
60+
const der = forge.asn1.toDer(p7.toAsn1()).getBytes()
61+
return Buffer.from(der, 'binary')
8162
}
8263

8364
/**
@@ -87,14 +68,11 @@ class CMS {
8768
* exists, an Error is returned with the property 'missingKeys'. It is array of key ids.
8869
*
8970
* @param {Buffer} cmsData - The CMS encrypted data to decrypt.
90-
* @param {function(Error, Buffer)} callback
9171
* @returns {undefined}
9272
*/
93-
decrypt (cmsData, callback) {
94-
const done = (err, result) => setImmediate(() => callback(err, result))
95-
73+
async decrypt (cmsData) {
9674
if (!Buffer.isBuffer(cmsData)) {
97-
return done(errcode(new Error('CMS data is required'), 'ERR_INVALID_PARAMS'))
75+
throw errcode(new Error('CMS data is required'), 'ERR_INVALID_PARAMS')
9876
}
9977

10078
const self = this
@@ -104,7 +82,7 @@ class CMS {
10482
const obj = forge.asn1.fromDer(buf)
10583
cms = forge.pkcs7.messageFromAsn1(obj)
10684
} catch (err) {
107-
return done(errcode(new Error('Invalid CMS: ' + err.message), 'ERR_INVALID_CMS'))
85+
throw errcode(new Error('Invalid CMS: ' + err.message), 'ERR_INVALID_CMS')
10886
}
10987

11088
// Find a recipient whose key we hold. We only deal with recipient certs
@@ -118,31 +96,29 @@ class CMS {
11896
keyId: r.issuer.find(a => a.shortName === 'CN').value
11997
}
12098
})
121-
detect(
122-
recipients,
123-
(r, cb) => self.keychain.findKeyById(r.keyId, (err, info) => cb(null, !err && info)),
124-
(err, r) => {
125-
if (err) return done(err)
126-
if (!r) {
127-
const missingKeys = recipients.map(r => r.keyId)
128-
err = errcode(new Error('Decryption needs one of the key(s): ' + missingKeys.join(', ')), 'ERR_MISSING_KEYS', {
129-
missingKeys
130-
})
131-
return done(err)
132-
}
133-
134-
waterfall([
135-
(cb) => self.keychain.findKeyById(r.keyId, cb),
136-
(key, cb) => self.keychain._getPrivateKey(key.name, cb)
137-
], (err, pem) => {
138-
if (err) return done(err)
13999

140-
const privateKey = forge.pki.decryptRsaPrivateKey(pem, self.keychain._())
141-
cms.decrypt(r.recipient, privateKey)
142-
done(null, Buffer.from(cms.content.getBytes(), 'binary'))
143-
})
100+
const r = await findAsync(recipients, async (recipient) => {
101+
try {
102+
const key = await self.keychain.findKeyById(recipient.keyId)
103+
if (key) return true
104+
} catch (err) {
105+
return false
144106
}
145-
)
107+
return false
108+
})
109+
110+
if (!r) {
111+
const missingKeys = recipients.map(r => r.keyId)
112+
throw errcode(new Error('Decryption needs one of the key(s): ' + missingKeys.join(', ')), 'ERR_MISSING_KEYS', {
113+
missingKeys
114+
})
115+
}
116+
117+
const key = await self.keychain.findKeyById(r.keyId)
118+
const pem = await self.keychain._getPrivateKey(key.name)
119+
const privateKey = forge.pki.decryptRsaPrivateKey(pem, self.keychain._())
120+
cms.decrypt(r.recipient, privateKey)
121+
return Buffer.from(cms.content.getBytes(), 'binary')
146122
}
147123
}
148124

0 commit comments

Comments
 (0)