├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── Makefile
├── README.md
├── SIGNED.md
├── lib
├── base.js
├── main.js
├── sodium.js
├── tweetnacl.js
└── util.js
├── package-lock.json
├── package.json
├── src
├── base.iced
├── main.iced
├── sodium.iced
├── tweetnacl.iced
└── util.iced
└── test
├── browser
├── index.html
├── main.iced
└── test.js
├── files
├── 0_sigs.iced
├── 1_encrypt.iced
└── 2_scalarmult.iced
└── run.iced
/.gitignore:
--------------------------------------------------------------------------------
1 | build-stamp
2 | node_modules/
3 | coverage
4 | test-stamp
5 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # v1.1.3 (2020-01-15)
2 |
3 | - upgrade deps
4 |
5 | # v1.1.2 (2019-11-04)
6 |
7 | - sodium is now optional
8 |
9 | # v1.1.1 (2019-07-31)
10 |
11 | - Dep upgrades
12 |
13 | # v1.1.0 (2019-02-18)
14 |
15 | - Use a regular `require("sodium")` rather than indirection. We used to do indirection so that browserify would not include sodium, but that same technique breaks webpack.
16 | - This is a breaking change since now you need to `browserify -i sodium` on all downstream dependencies.
17 |
18 | # v1.0.11 (2019-02-01)
19 |
20 | - module updates
21 | - use Buffer.from, not new Buffer
22 |
23 |
24 | # v1.0.10 (2016-11-02)
25 |
26 | - Expose Curve25519 scalar multiplication (via @zapu's PR #4)
27 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2015, Keybase
2 | All rights reserved.
3 |
4 | Redistribution and use in source and binary forms, with or without
5 | modification, are permitted provided that the following conditions are met:
6 |
7 | * Redistributions of source code must retain the above copyright notice, this
8 | list of conditions and the following disclaimer.
9 |
10 | * Redistributions in binary form must reproduce the above copyright notice,
11 | this list of conditions and the following disclaimer in the documentation
12 | and/or other materials provided with the distribution.
13 |
14 | * Neither the name of node-nacl nor the names of its
15 | contributors may be used to endorse or promote products derived from
16 | this software without specific prior written permission.
17 |
18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 |
29 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | default: build
2 | all: build
3 |
4 | ICED=node_modules/.bin/iced
5 | BUILD_STAMP=build-stamp
6 | TEST_STAMP=test-stamp
7 | UGLIFYJS=node_modules/.bin/uglifyjs
8 | WD=`pwd`
9 | BROWSERIFY=node_modules/.bin/browserify
10 |
11 | BROWSER=browser/nacl.js
12 |
13 | lib/%.js: src/%.iced
14 | $(ICED) -I browserify -c -o `dirname $@` $<
15 |
16 | $(BUILD_STAMP): \
17 | lib/base.js \
18 | lib/main.js \
19 | lib/sodium.js \
20 | lib/tweetnacl.js \
21 | lib/util.js
22 | date > $@
23 |
24 | clean:
25 | find lib -type f -name *.js -exec rm {} \;
26 | rm -rf $(BUILD_STAMP) $(TEST_STAMP) test/browser/test.js
27 |
28 | setup:
29 | npm install -d
30 |
31 | coverage:
32 | ./node_modules/.bin/nyc $(ICED) test/run.iced
33 |
34 | test: test-server test-browser
35 |
36 | build: $(BUILD_STAMP)
37 |
38 | browser: $(BROWSER)
39 |
40 | $(BROWSER): lib/main.js $(BUILD_STAMP)
41 | $(BROWSERIFY) -i sodium -s nacl $< > $@
42 |
43 | test-server: $(BUILD_STAMP)
44 | $(ICED) test/run.iced
45 |
46 | test-browser: $(TEST_STAMP) $(BUILD_STAMP)
47 | @echo "Please visit in your favorite browser --> file://$(WD)/test/browser/index.html"
48 |
49 | $(TEST_STAMP): test/browser/test.js
50 | date > $@
51 |
52 | test/browser/test.js: test/browser/main.iced $(BUILD_STAMP)
53 | $(BROWSERIFY) -i sodium -t icsify $< > $@
54 |
55 | .PHONY: clean setup test test-browser coverage
56 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # node-nacl
2 | NaCl wrapper; uses `sodium` for the server-side and `tweetnacl-js` for the client
3 |
--------------------------------------------------------------------------------
/SIGNED.md:
--------------------------------------------------------------------------------
1 | ##### Signed by https://keybase.io/max
2 | ```
3 | -----BEGIN PGP SIGNATURE-----
4 | Comment: GPGTools - https://gpgtools.org
5 |
6 | iQEcBAABCgAGBQJVWea5AAoJEJgKPw0B/gTfmOsH/1npWV+odUl/uqrHWW5zvI0Q
7 | NWLnQsnPIkMbmATmIH9ixH23RHASKEEbZbgS05/UmumxM+uv+PbMCxO0LCrDvDy5
8 | YtSQU4gmrUMwokWRbSrM7V0uGe31mH7GYcBzk5Tl4julbIU6ySLfiZzGcEEVn+vI
9 | 7RPcUMqz4aJih2/CPNY6jQVhyCpH0+H6E6V9UgFraNzcH7rekZzN2AVDxKFLGUOG
10 | mtox8ypxzpzIYjHtAr4Kf3aMrVnainTR9eEjX4VQ9C/SJJdVh5PV8YEzxqyLKv+u
11 | xNUowEyGc0SYRTdfI8UlV7a9UHHtWu092SuGCHUILgZdcDZGHYoVfv7CSgdi2pI=
12 | =jKmO
13 | -----END PGP SIGNATURE-----
14 |
15 | ```
16 |
17 |
18 |
19 | ### Begin signed statement
20 |
21 | #### Expect
22 |
23 | ```
24 | size exec file contents
25 | ./
26 | 46 .gitignore e446248bb7d6e5c58234de6c127ee27687b1d84304f84bd5f368b4280b0e92db
27 | 1475 LICENSE f8bc12c174a5377c5d2e96c2a9c419ff7b608459bb7615fc305661eca155384d
28 | 1135 Makefile 949e832fcffda80cc6f45c8e7e977a08485fc84a5e0ee83ac0edad4582da3426
29 | 94 README.md 6d45790af19c47d5b2df93405a8a78179913860177841171e1224ed897120f06
30 | lib/
31 | 936 base.js 32741386a25d562b714b247078c916ed925b7209495a76c164bac0e99d24eed5
32 | 1183 main.js 40ce98ce2c8dae28cf56ec50c574509c71661bafa9efee70d2be2f85a9436d20
33 | 2067 sodium.js 49c3469abd276df579e045ccc17c49253630b3e9e26b73e88ed9eec692f209f5
34 | 2075 tweetnacl.js d4da18bf492da3e923890b04659d7c672d0971ec028d9bb7ecca8ec1ea0aa8a1
35 | 645 util.js be2846c96d0fdcd07dd96c86fcb529af94e09ba8d9110ee6b47d433fbef2a963
36 | 793 package.json dffc9b05f4bc6835e7194c9cff2966ecf6b873e99bf9fc886d2d15362ca7631d
37 | src/
38 | 1400 base.iced 71a5c89cb57ff4bc1964910d987f1d914ff9f02e3058438c6a660040024c7530
39 | 1300 main.iced 2f08f4899cf1193c1370c63257be2cd32fc1aacd0a0039074bfb917da983111a
40 | 1828 sodium.iced 6147b59cc4c0b015b9b5e1eb3340e30bfc232a9aacd1cb4b1b1380b36cb3e733
41 | 2019 tweetnacl.iced 4f845affac187a3b01eccadf33494f8a10a3aa7b013456f976afd6219c097703
42 | 376 util.iced 8ae5f3a21f115c41d4ac72420d945cde81683d8690094a440d6dd00572fc7755
43 | test/
44 | browser/
45 | 287 index.html e31387cfd94034901e89af59f0ad29a3e2f494eb7269f1806e757be21b3cf33e
46 | 193 main.iced ba58653bd3407fbaf8237ec01c61668fb0c567d113eed01fb862e946a39000de
47 | 673230 test.js 87f00dae5064138dd0aca2d469577d0773b1d68fd25fcced0117fb4185d640b3
48 | files/
49 | 2320 0_sigs.iced f980c55498dafccb45bc3ebe5af21d7be46c110cbec022fe2eda9d46e192760e
50 | 52 run.iced 8e58458d6f5d0973dbb15d096e5366492add708f3123812b8e65d49a685de71c
51 | ```
52 |
53 | #### Ignore
54 |
55 | ```
56 | /SIGNED.md
57 | ```
58 |
59 | #### Presets
60 |
61 | ```
62 | git # ignore .git and anything as described by .gitignore files
63 | dropbox # ignore .dropbox-cache and other Dropbox-related files
64 | kb # ignore anything as described by .kbignore files
65 | ```
66 |
67 |
68 |
69 | ### End signed statement
70 |
71 |
72 |
73 | #### Notes
74 |
75 | With keybase you can sign any directory's contents, whether it's a git repo,
76 | source code distribution, or a personal documents folder. It aims to replace the drudgery of:
77 |
78 | 1. comparing a zipped file to a detached statement
79 | 2. downloading a public key
80 | 3. confirming it is in fact the author's by reviewing public statements they've made, using it
81 |
82 | All in one simple command:
83 |
84 | ```bash
85 | keybase dir verify
86 | ```
87 |
88 | There are lots of options, including assertions for automating your checks.
89 |
90 | For more info, check out https://keybase.io/docs/command_line/code_signing
--------------------------------------------------------------------------------
/lib/base.js:
--------------------------------------------------------------------------------
1 | // Generated by IcedCoffeeScript 108.0.11
2 | (function() {
3 | var Base, b2u, u2b;
4 |
5 | exports.b2u = b2u = function(b) {
6 | return new Uint8Array(b);
7 | };
8 |
9 | exports.u2b = u2b = function(u) {
10 | return Buffer.from(u);
11 | };
12 |
13 | exports.Base = Base = (function() {
14 | function Base(_arg) {
15 | this.publicKey = _arg.publicKey, this.secretKey = _arg.secretKey, this.lib = _arg.lib;
16 | }
17 |
18 | Base.prototype.genFromSeed = function(_arg) {
19 | var seed, tmp;
20 | seed = _arg.seed;
21 | tmp = this.lib.js.sign.keyPair.fromSeed(b2u(seed));
22 | this.secretKey = u2b(tmp.secretKey);
23 | this.publicKey = u2b(tmp.publicKey);
24 | return {
25 | secretKey: this.secretKey,
26 | publicKey: this.publicKey
27 | };
28 | };
29 |
30 | Base.prototype.genBoxPair = function() {
31 | var tmp;
32 | tmp = this.lib.js.box.keyPair();
33 | this.secretKey = u2b(tmp.secretKey);
34 | this.publicKey = u2b(tmp.publicKey);
35 | return {
36 | secretKey: this.secretKey,
37 | publicKey: this.publicKey
38 | };
39 | };
40 |
41 | Base.prototype.get_secret_key = function() {
42 | return this.secretKey;
43 | };
44 |
45 | Base.prototype.get_public_key = function() {
46 | return this.publicKey;
47 | };
48 |
49 | return Base;
50 |
51 | })();
52 |
53 | }).call(this);
54 |
--------------------------------------------------------------------------------
/lib/main.js:
--------------------------------------------------------------------------------
1 | // Generated by IcedCoffeeScript 108.0.11
2 | (function() {
3 | var Sodium, TweetNaCl, e, nacl_c, nacl_js;
4 |
5 | nacl_js = require('tweetnacl/nacl-fast');
6 |
7 | nacl_c = null;
8 |
9 | Sodium = require('./sodium').Sodium;
10 |
11 | TweetNaCl = require('./tweetnacl').TweetNaCl;
12 |
13 | try {
14 | nacl_c = require("sodium").api;
15 | } catch (_error) {
16 | e = _error;
17 | }
18 |
19 | exports.sign = {
20 | publicKeyLength: nacl_js.sign.publicKeyLength,
21 | secretKeyLength: nacl_js.sign.secretKeyLength,
22 | signatureLength: nacl_js.sign.signatureLength,
23 | seedLength: nacl_js.sign.seedLength
24 | };
25 |
26 | exports.alloc = function(_arg) {
27 | var force_js, publicKey, ret, secretKey;
28 | publicKey = _arg.publicKey, secretKey = _arg.secretKey, force_js = _arg.force_js;
29 | ret = force_js || (nacl_c == null) ? new TweetNaCl({
30 | publicKey: publicKey,
31 | secretKey: secretKey
32 | }) : new Sodium({
33 | publicKey: publicKey,
34 | secretKey: secretKey
35 | });
36 | ret.lib = {
37 | c: nacl_c,
38 | js: nacl_js
39 | };
40 | return ret;
41 | };
42 |
43 | }).call(this);
44 |
--------------------------------------------------------------------------------
/lib/sodium.js:
--------------------------------------------------------------------------------
1 | // Generated by IcedCoffeeScript 108.0.11
2 | (function() {
3 | var Base, Sodium, bufeq_secure,
4 | __hasProp = {}.hasOwnProperty,
5 | __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
6 |
7 | bufeq_secure = require('./util').bufeq_secure;
8 |
9 | Base = require('./base').Base;
10 |
11 | exports.Sodium = Sodium = (function(_super) {
12 | __extends(Sodium, _super);
13 |
14 | function Sodium() {
15 | return Sodium.__super__.constructor.apply(this, arguments);
16 | }
17 |
18 | Sodium.prototype._detach = function(sig) {
19 | var l;
20 | l = this.lib.c.crypto_sign_BYTES;
21 | return {
22 | sig: sig.slice(0, l),
23 | payload: sig.slice(l)
24 | };
25 | };
26 |
27 | Sodium.prototype._pad = function(x) {
28 | return Buffer.concat([Buffer.alloc(16), x]);
29 | };
30 |
31 | Sodium.prototype._unpad = function(x) {
32 | return x.slice(16);
33 | };
34 |
35 | Sodium.prototype.verify = function(_arg) {
36 | var detached, err, msg, payload, r_payload, sig;
37 | payload = _arg.payload, sig = _arg.sig, detached = _arg.detached;
38 | if (detached && (payload == null)) {
39 | err = new Error("in detached mode, you must supply a payload");
40 | return [err, null];
41 | }
42 | msg = detached ? Buffer.concat([sig, payload]) : sig;
43 | r_payload = this.lib.c.crypto_sign_open(msg, this.publicKey);
44 | if (r_payload == null) {
45 | err = new Error("Signature failed to verify");
46 | } else if (detached) {
47 |
48 | } else if (payload == null) {
49 | payload = r_payload;
50 | } else if (!bufeq_secure(r_payload, payload)) {
51 | err = new Error("got unexpected payload");
52 | }
53 | if (err != null) {
54 | payload = null;
55 | }
56 | return [err, payload];
57 | };
58 |
59 | Sodium.prototype.sign = function(_arg) {
60 | var detached, payload, sig;
61 | detached = _arg.detached, payload = _arg.payload;
62 | sig = this.lib.c.crypto_sign(payload, this.secretKey);
63 | if (detached) {
64 | return this._detach(sig).sig;
65 | } else {
66 | return sig;
67 | }
68 | };
69 |
70 | Sodium.prototype.encrypt = function(_arg) {
71 | var nonce, plaintext, pubkey;
72 | plaintext = _arg.plaintext, nonce = _arg.nonce, pubkey = _arg.pubkey;
73 | return this._unpad(this.lib.c.crypto_box(plaintext, nonce, pubkey, this.secretKey));
74 | };
75 |
76 | Sodium.prototype.secretbox = function(_arg) {
77 | var nonce, plaintext;
78 | plaintext = _arg.plaintext, nonce = _arg.nonce;
79 | return this._unpad(this.lib.c.crypto_secretbox(plaintext, nonce, this.secretKey));
80 | };
81 |
82 | Sodium.prototype.decrypt = function(_arg) {
83 | var ciphertext, nonce, opened, pubkey;
84 | ciphertext = _arg.ciphertext, nonce = _arg.nonce, pubkey = _arg.pubkey;
85 | opened = this.lib.c.crypto_box_open(this._pad(ciphertext), nonce, pubkey, this.secretKey);
86 | if (!opened) {
87 | throw new Error('Sodium decrypt failed!');
88 | } else {
89 | return opened;
90 | }
91 | };
92 |
93 | Sodium.prototype.secretbox_open = function(_arg) {
94 | var ciphertext, nonce, opened;
95 | ciphertext = _arg.ciphertext, nonce = _arg.nonce;
96 | opened = this.lib.c.crypto_secretbox_open(this._pad(ciphertext), nonce, this.secretKey);
97 | if (!opened) {
98 | throw new Error('Sodium secretbox_open failed!');
99 | } else {
100 | return opened;
101 | }
102 | };
103 |
104 | Sodium.prototype.box_beforenm = function(_arg) {
105 | var pubkey, seckey;
106 | pubkey = _arg.pubkey, seckey = _arg.seckey;
107 | return this.lib.c.crypto_box_beforenm(pubkey, seckey);
108 | };
109 |
110 | Sodium.prototype.box_open_afternm = function(_arg) {
111 | var ciphertext, nonce, opened, secret;
112 | ciphertext = _arg.ciphertext, nonce = _arg.nonce, secret = _arg.secret;
113 | opened = this.lib.c.crypto_box_open_afternm(this._pad(ciphertext), nonce, secret);
114 | if (!opened) {
115 | throw new Error('Sodium box_open_afternm failed!');
116 | } else {
117 | return opened;
118 | }
119 | };
120 |
121 | Sodium.prototype.scalarmult_base = function(n) {
122 | return Buffer.from(this.lib.c.crypto_scalarmult_base(n));
123 | };
124 |
125 | Sodium.prototype.scalarmult = function(n, P) {
126 | return Buffer.from(this.lib.c.crypto_scalarmult(n, P));
127 | };
128 |
129 | return Sodium;
130 |
131 | })(Base);
132 |
133 | }).call(this);
134 |
--------------------------------------------------------------------------------
/lib/tweetnacl.js:
--------------------------------------------------------------------------------
1 | // Generated by IcedCoffeeScript 108.0.11
2 | (function() {
3 | var Base, TweetNaCl, b2u, bufeq_secure, u2b, _ref,
4 | __hasProp = {}.hasOwnProperty,
5 | __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
6 |
7 | bufeq_secure = require('./util').bufeq_secure;
8 |
9 | _ref = require('./base'), b2u = _ref.b2u, u2b = _ref.u2b, Base = _ref.Base;
10 |
11 | exports.TweetNaCl = TweetNaCl = (function(_super) {
12 | __extends(TweetNaCl, _super);
13 |
14 | function TweetNaCl() {
15 | return TweetNaCl.__super__.constructor.apply(this, arguments);
16 | }
17 |
18 | TweetNaCl.prototype.verify = function(_arg) {
19 | var detached, err, payload, r_payload, sig;
20 | payload = _arg.payload, sig = _arg.sig, detached = _arg.detached;
21 | err = null;
22 | if (detached) {
23 | if (payload == null) {
24 | payload = Buffer.alloc(0);
25 | }
26 | if (!this.lib.js.sign.detached.verify(b2u(payload), b2u(sig), b2u(this.publicKey))) {
27 | err = new Error("Signature failed to verify");
28 | }
29 | } else if ((r_payload = this.lib.js.sign.open(b2u(sig), b2u(this.publicKey))) == null) {
30 | err = new Error("signature didn't verify");
31 | } else if ((r_payload = u2b(r_payload)) == null) {
32 | err = new Error("failed to convert from a Uint8Array to a buffer");
33 | } else if ((payload != null) && !bufeq_secure(r_payload, payload)) {
34 | err = new Error("got unexpected payload");
35 | } else {
36 | payload = r_payload;
37 | }
38 | if (err != null) {
39 | payload = null;
40 | }
41 | return [err, payload];
42 | };
43 |
44 | TweetNaCl.prototype.sign = function(_arg) {
45 | var detached, f, payload;
46 | payload = _arg.payload, detached = _arg.detached;
47 | f = detached ? this.lib.js.sign.detached : this.lib.js.sign;
48 | return u2b(f(b2u(payload), b2u(this.secretKey)));
49 | };
50 |
51 | TweetNaCl.prototype.encrypt = function(_arg) {
52 | var nonce, plaintext, pubkey;
53 | plaintext = _arg.plaintext, nonce = _arg.nonce, pubkey = _arg.pubkey;
54 | return u2b(this.lib.js.box(plaintext, nonce, pubkey, this.secretKey));
55 | };
56 |
57 | TweetNaCl.prototype.secretbox = function(_arg) {
58 | var nonce, plaintext;
59 | plaintext = _arg.plaintext, nonce = _arg.nonce;
60 | return u2b(this.lib.js.secretbox(plaintext, nonce, this.secretKey));
61 | };
62 |
63 | TweetNaCl.prototype.decrypt = function(_arg) {
64 | var ciphertext, nonce, opened, pubkey;
65 | ciphertext = _arg.ciphertext, nonce = _arg.nonce, pubkey = _arg.pubkey;
66 | opened = this.lib.js.box.open(b2u(ciphertext), nonce, pubkey, this.secretKey);
67 | if (!opened) {
68 | throw new Error('TweetNaCl box_open failed!');
69 | } else {
70 | return u2b(opened);
71 | }
72 | };
73 |
74 | TweetNaCl.prototype.secretbox_open = function(_arg) {
75 | var ciphertext, nonce, opened;
76 | ciphertext = _arg.ciphertext, nonce = _arg.nonce;
77 | opened = this.lib.js.secretbox.open(b2u(ciphertext), nonce, this.secretKey);
78 | if (!opened) {
79 | throw new Error('TweetNaCl secretbox_open failed!');
80 | } else {
81 | return u2b(opened);
82 | }
83 | };
84 |
85 | TweetNaCl.prototype.box_beforenm = function(_arg) {
86 | var pubkey, seckey;
87 | pubkey = _arg.pubkey, seckey = _arg.seckey;
88 | return u2b(this.lib.js.box.before(pubkey, seckey));
89 | };
90 |
91 | TweetNaCl.prototype.box_open_afternm = function(_arg) {
92 | var ciphertext, nonce, opened, secret;
93 | ciphertext = _arg.ciphertext, nonce = _arg.nonce, secret = _arg.secret;
94 | opened = this.lib.js.box.open.after(b2u(ciphertext), nonce, secret);
95 | if (!opened) {
96 | throw new Error('TweetNaCl box_open_afternm failed!');
97 | } else {
98 | return u2b(opened);
99 | }
100 | };
101 |
102 | TweetNaCl.prototype.scalarmult_base = function(n) {
103 | return Buffer.from(this.lib.js.scalarMult.base(n));
104 | };
105 |
106 | TweetNaCl.prototype.scalarmult = function(n, P) {
107 | return Buffer.from(this.lib.js.scalarMult(n, P));
108 | };
109 |
110 | return TweetNaCl;
111 |
112 | })(Base);
113 |
114 | }).call(this);
115 |
--------------------------------------------------------------------------------
/lib/util.js:
--------------------------------------------------------------------------------
1 | // Generated by IcedCoffeeScript 108.0.11
2 | (function() {
3 | exports.bufeq_secure = function(x, y) {
4 | var check, i, ret;
5 | ret = (function() {
6 | var _i, _ref;
7 | if ((x == null) && (y == null)) {
8 | return true;
9 | } else if ((x == null) || (y == null)) {
10 | return false;
11 | } else if (x.length !== y.length) {
12 | return false;
13 | } else {
14 | check = 0;
15 | for (i = _i = 0, _ref = x.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
16 | check |= x.readUInt8(i) ^ y.readUInt8(i);
17 | }
18 | return check === 0;
19 | }
20 | })();
21 | return ret;
22 | };
23 |
24 | }).call(this);
25 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "keybase-nacl",
3 | "version": "1.1.3",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.5.5",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
10 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
11 | "dev": true,
12 | "requires": {
13 | "@babel/highlight": "^7.0.0"
14 | }
15 | },
16 | "@babel/generator": {
17 | "version": "7.5.5",
18 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz",
19 | "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==",
20 | "dev": true,
21 | "requires": {
22 | "@babel/types": "^7.5.5",
23 | "jsesc": "^2.5.1",
24 | "lodash": "^4.17.13",
25 | "source-map": "^0.5.0",
26 | "trim-right": "^1.0.1"
27 | }
28 | },
29 | "@babel/helper-function-name": {
30 | "version": "7.1.0",
31 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
32 | "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
33 | "dev": true,
34 | "requires": {
35 | "@babel/helper-get-function-arity": "^7.0.0",
36 | "@babel/template": "^7.1.0",
37 | "@babel/types": "^7.0.0"
38 | }
39 | },
40 | "@babel/helper-get-function-arity": {
41 | "version": "7.0.0",
42 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
43 | "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
44 | "dev": true,
45 | "requires": {
46 | "@babel/types": "^7.0.0"
47 | }
48 | },
49 | "@babel/helper-split-export-declaration": {
50 | "version": "7.4.4",
51 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
52 | "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
53 | "dev": true,
54 | "requires": {
55 | "@babel/types": "^7.4.4"
56 | }
57 | },
58 | "@babel/highlight": {
59 | "version": "7.5.0",
60 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
61 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
62 | "dev": true,
63 | "requires": {
64 | "chalk": "^2.0.0",
65 | "esutils": "^2.0.2",
66 | "js-tokens": "^4.0.0"
67 | }
68 | },
69 | "@babel/parser": {
70 | "version": "7.5.5",
71 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz",
72 | "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==",
73 | "dev": true
74 | },
75 | "@babel/template": {
76 | "version": "7.4.4",
77 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz",
78 | "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==",
79 | "dev": true,
80 | "requires": {
81 | "@babel/code-frame": "^7.0.0",
82 | "@babel/parser": "^7.4.4",
83 | "@babel/types": "^7.4.4"
84 | }
85 | },
86 | "@babel/traverse": {
87 | "version": "7.5.5",
88 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz",
89 | "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==",
90 | "dev": true,
91 | "requires": {
92 | "@babel/code-frame": "^7.5.5",
93 | "@babel/generator": "^7.5.5",
94 | "@babel/helper-function-name": "^7.1.0",
95 | "@babel/helper-split-export-declaration": "^7.4.4",
96 | "@babel/parser": "^7.5.5",
97 | "@babel/types": "^7.5.5",
98 | "debug": "^4.1.0",
99 | "globals": "^11.1.0",
100 | "lodash": "^4.17.13"
101 | }
102 | },
103 | "@babel/types": {
104 | "version": "7.5.5",
105 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz",
106 | "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==",
107 | "dev": true,
108 | "requires": {
109 | "esutils": "^2.0.2",
110 | "lodash": "^4.17.13",
111 | "to-fast-properties": "^2.0.0"
112 | }
113 | },
114 | "JSONStream": {
115 | "version": "1.3.5",
116 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
117 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
118 | "dev": true,
119 | "requires": {
120 | "jsonparse": "^1.2.0",
121 | "through": ">=2.2.7 <3"
122 | }
123 | },
124 | "acorn": {
125 | "version": "6.0.6",
126 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz",
127 | "integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA==",
128 | "dev": true
129 | },
130 | "acorn-dynamic-import": {
131 | "version": "4.0.0",
132 | "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
133 | "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==",
134 | "dev": true
135 | },
136 | "acorn-node": {
137 | "version": "1.6.2",
138 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz",
139 | "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==",
140 | "dev": true,
141 | "requires": {
142 | "acorn": "^6.0.2",
143 | "acorn-dynamic-import": "^4.0.0",
144 | "acorn-walk": "^6.1.0",
145 | "xtend": "^4.0.1"
146 | }
147 | },
148 | "acorn-walk": {
149 | "version": "6.1.1",
150 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
151 | "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==",
152 | "dev": true
153 | },
154 | "ansi-regex": {
155 | "version": "4.1.0",
156 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
157 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
158 | "dev": true
159 | },
160 | "ansi-styles": {
161 | "version": "3.2.1",
162 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
163 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
164 | "dev": true,
165 | "requires": {
166 | "color-convert": "^1.9.0"
167 | }
168 | },
169 | "append-transform": {
170 | "version": "1.0.0",
171 | "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz",
172 | "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==",
173 | "dev": true,
174 | "requires": {
175 | "default-require-extensions": "^2.0.0"
176 | }
177 | },
178 | "archy": {
179 | "version": "1.0.0",
180 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
181 | "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
182 | "dev": true
183 | },
184 | "argparse": {
185 | "version": "1.0.10",
186 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
187 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
188 | "dev": true,
189 | "requires": {
190 | "sprintf-js": "~1.0.2"
191 | }
192 | },
193 | "array-filter": {
194 | "version": "0.0.1",
195 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
196 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
197 | "dev": true
198 | },
199 | "array-map": {
200 | "version": "0.0.0",
201 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
202 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
203 | "dev": true
204 | },
205 | "array-reduce": {
206 | "version": "0.0.0",
207 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
208 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
209 | "dev": true
210 | },
211 | "asn1.js": {
212 | "version": "4.10.1",
213 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
214 | "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
215 | "dev": true,
216 | "requires": {
217 | "bn.js": "^4.0.0",
218 | "inherits": "^2.0.1",
219 | "minimalistic-assert": "^1.0.0"
220 | }
221 | },
222 | "assert": {
223 | "version": "1.4.1",
224 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
225 | "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
226 | "dev": true,
227 | "requires": {
228 | "util": "0.10.3"
229 | },
230 | "dependencies": {
231 | "inherits": {
232 | "version": "2.0.1",
233 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
234 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
235 | "dev": true
236 | },
237 | "util": {
238 | "version": "0.10.3",
239 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
240 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
241 | "dev": true,
242 | "requires": {
243 | "inherits": "2.0.1"
244 | }
245 | }
246 | }
247 | },
248 | "balanced-match": {
249 | "version": "1.0.0",
250 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
251 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
252 | "dev": true
253 | },
254 | "base64-js": {
255 | "version": "1.3.0",
256 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
257 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
258 | "dev": true
259 | },
260 | "bn.js": {
261 | "version": "4.11.8",
262 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
263 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
264 | },
265 | "brace-expansion": {
266 | "version": "1.1.11",
267 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
268 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
269 | "dev": true,
270 | "requires": {
271 | "balanced-match": "^1.0.0",
272 | "concat-map": "0.0.1"
273 | }
274 | },
275 | "brorand": {
276 | "version": "1.1.0",
277 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
278 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
279 | },
280 | "browser-pack": {
281 | "version": "6.1.0",
282 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
283 | "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
284 | "dev": true,
285 | "requires": {
286 | "JSONStream": "^1.0.3",
287 | "combine-source-map": "~0.8.0",
288 | "defined": "^1.0.0",
289 | "safe-buffer": "^5.1.1",
290 | "through2": "^2.0.0",
291 | "umd": "^3.0.0"
292 | }
293 | },
294 | "browser-resolve": {
295 | "version": "1.11.3",
296 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
297 | "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
298 | "dev": true,
299 | "requires": {
300 | "resolve": "1.1.7"
301 | },
302 | "dependencies": {
303 | "resolve": {
304 | "version": "1.1.7",
305 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
306 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
307 | "dev": true
308 | }
309 | }
310 | },
311 | "browserify": {
312 | "version": "16.2.3",
313 | "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz",
314 | "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==",
315 | "dev": true,
316 | "requires": {
317 | "JSONStream": "^1.0.3",
318 | "assert": "^1.4.0",
319 | "browser-pack": "^6.0.1",
320 | "browser-resolve": "^1.11.0",
321 | "browserify-zlib": "~0.2.0",
322 | "buffer": "^5.0.2",
323 | "cached-path-relative": "^1.0.0",
324 | "concat-stream": "^1.6.0",
325 | "console-browserify": "^1.1.0",
326 | "constants-browserify": "~1.0.0",
327 | "crypto-browserify": "^3.0.0",
328 | "defined": "^1.0.0",
329 | "deps-sort": "^2.0.0",
330 | "domain-browser": "^1.2.0",
331 | "duplexer2": "~0.1.2",
332 | "events": "^2.0.0",
333 | "glob": "^7.1.0",
334 | "has": "^1.0.0",
335 | "htmlescape": "^1.1.0",
336 | "https-browserify": "^1.0.0",
337 | "inherits": "~2.0.1",
338 | "insert-module-globals": "^7.0.0",
339 | "labeled-stream-splicer": "^2.0.0",
340 | "mkdirp": "^0.5.0",
341 | "module-deps": "^6.0.0",
342 | "os-browserify": "~0.3.0",
343 | "parents": "^1.0.1",
344 | "path-browserify": "~0.0.0",
345 | "process": "~0.11.0",
346 | "punycode": "^1.3.2",
347 | "querystring-es3": "~0.2.0",
348 | "read-only-stream": "^2.0.0",
349 | "readable-stream": "^2.0.2",
350 | "resolve": "^1.1.4",
351 | "shasum": "^1.0.0",
352 | "shell-quote": "^1.6.1",
353 | "stream-browserify": "^2.0.0",
354 | "stream-http": "^2.0.0",
355 | "string_decoder": "^1.1.1",
356 | "subarg": "^1.0.0",
357 | "syntax-error": "^1.1.1",
358 | "through2": "^2.0.0",
359 | "timers-browserify": "^1.0.1",
360 | "tty-browserify": "0.0.1",
361 | "url": "~0.11.0",
362 | "util": "~0.10.1",
363 | "vm-browserify": "^1.0.0",
364 | "xtend": "^4.0.0"
365 | }
366 | },
367 | "browserify-aes": {
368 | "version": "1.2.0",
369 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
370 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
371 | "dev": true,
372 | "requires": {
373 | "buffer-xor": "^1.0.3",
374 | "cipher-base": "^1.0.0",
375 | "create-hash": "^1.1.0",
376 | "evp_bytestokey": "^1.0.3",
377 | "inherits": "^2.0.1",
378 | "safe-buffer": "^5.0.1"
379 | }
380 | },
381 | "browserify-cipher": {
382 | "version": "1.0.1",
383 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
384 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
385 | "dev": true,
386 | "requires": {
387 | "browserify-aes": "^1.0.4",
388 | "browserify-des": "^1.0.0",
389 | "evp_bytestokey": "^1.0.0"
390 | }
391 | },
392 | "browserify-des": {
393 | "version": "1.0.2",
394 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
395 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
396 | "dev": true,
397 | "requires": {
398 | "cipher-base": "^1.0.1",
399 | "des.js": "^1.0.0",
400 | "inherits": "^2.0.1",
401 | "safe-buffer": "^5.1.2"
402 | }
403 | },
404 | "browserify-rsa": {
405 | "version": "4.0.1",
406 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
407 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
408 | "dev": true,
409 | "requires": {
410 | "bn.js": "^4.1.0",
411 | "randombytes": "^2.0.1"
412 | }
413 | },
414 | "browserify-sign": {
415 | "version": "4.0.4",
416 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
417 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
418 | "dev": true,
419 | "requires": {
420 | "bn.js": "^4.1.1",
421 | "browserify-rsa": "^4.0.0",
422 | "create-hash": "^1.1.0",
423 | "create-hmac": "^1.1.2",
424 | "elliptic": "^6.0.0",
425 | "inherits": "^2.0.1",
426 | "parse-asn1": "^5.0.0"
427 | }
428 | },
429 | "browserify-zlib": {
430 | "version": "0.2.0",
431 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
432 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
433 | "dev": true,
434 | "requires": {
435 | "pako": "~1.0.5"
436 | }
437 | },
438 | "buffer": {
439 | "version": "5.2.1",
440 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
441 | "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
442 | "dev": true,
443 | "requires": {
444 | "base64-js": "^1.0.2",
445 | "ieee754": "^1.1.4"
446 | }
447 | },
448 | "buffer-from": {
449 | "version": "1.1.1",
450 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
451 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
452 | "dev": true
453 | },
454 | "buffer-xor": {
455 | "version": "1.0.3",
456 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
457 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
458 | "dev": true
459 | },
460 | "builtin-status-codes": {
461 | "version": "3.0.0",
462 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
463 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
464 | "dev": true
465 | },
466 | "cached-path-relative": {
467 | "version": "1.0.2",
468 | "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz",
469 | "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==",
470 | "dev": true
471 | },
472 | "caching-transform": {
473 | "version": "3.0.2",
474 | "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz",
475 | "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==",
476 | "dev": true,
477 | "requires": {
478 | "hasha": "^3.0.0",
479 | "make-dir": "^2.0.0",
480 | "package-hash": "^3.0.0",
481 | "write-file-atomic": "^2.4.2"
482 | }
483 | },
484 | "camelcase": {
485 | "version": "5.3.1",
486 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
487 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
488 | "dev": true
489 | },
490 | "chalk": {
491 | "version": "2.4.2",
492 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
493 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
494 | "dev": true,
495 | "requires": {
496 | "ansi-styles": "^3.2.1",
497 | "escape-string-regexp": "^1.0.5",
498 | "supports-color": "^5.3.0"
499 | }
500 | },
501 | "cipher-base": {
502 | "version": "1.0.4",
503 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
504 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
505 | "dev": true,
506 | "requires": {
507 | "inherits": "^2.0.1",
508 | "safe-buffer": "^5.0.1"
509 | }
510 | },
511 | "cliui": {
512 | "version": "5.0.0",
513 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
514 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
515 | "dev": true,
516 | "requires": {
517 | "string-width": "^3.1.0",
518 | "strip-ansi": "^5.2.0",
519 | "wrap-ansi": "^5.1.0"
520 | }
521 | },
522 | "color-convert": {
523 | "version": "1.9.3",
524 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
525 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
526 | "dev": true,
527 | "requires": {
528 | "color-name": "1.1.3"
529 | }
530 | },
531 | "color-name": {
532 | "version": "1.1.3",
533 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
534 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
535 | "dev": true
536 | },
537 | "colors": {
538 | "version": "1.3.3",
539 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
540 | "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==",
541 | "dev": true
542 | },
543 | "combine-source-map": {
544 | "version": "0.8.0",
545 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
546 | "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
547 | "dev": true,
548 | "requires": {
549 | "convert-source-map": "~1.1.0",
550 | "inline-source-map": "~0.6.0",
551 | "lodash.memoize": "~3.0.3",
552 | "source-map": "~0.5.3"
553 | }
554 | },
555 | "commander": {
556 | "version": "2.19.0",
557 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
558 | "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
559 | "dev": true
560 | },
561 | "commondir": {
562 | "version": "1.0.1",
563 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
564 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
565 | "dev": true
566 | },
567 | "concat-map": {
568 | "version": "0.0.1",
569 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
570 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
571 | "dev": true
572 | },
573 | "concat-stream": {
574 | "version": "1.6.2",
575 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
576 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
577 | "dev": true,
578 | "requires": {
579 | "buffer-from": "^1.0.0",
580 | "inherits": "^2.0.3",
581 | "readable-stream": "^2.2.2",
582 | "typedarray": "^0.0.6"
583 | }
584 | },
585 | "console-browserify": {
586 | "version": "1.1.0",
587 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
588 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
589 | "dev": true,
590 | "requires": {
591 | "date-now": "^0.1.4"
592 | }
593 | },
594 | "constants-browserify": {
595 | "version": "1.0.0",
596 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
597 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
598 | "dev": true
599 | },
600 | "convert-source-map": {
601 | "version": "1.1.3",
602 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
603 | "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
604 | "dev": true
605 | },
606 | "core-util-is": {
607 | "version": "1.0.2",
608 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
609 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
610 | "dev": true
611 | },
612 | "cp-file": {
613 | "version": "6.2.0",
614 | "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz",
615 | "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==",
616 | "dev": true,
617 | "requires": {
618 | "graceful-fs": "^4.1.2",
619 | "make-dir": "^2.0.0",
620 | "nested-error-stacks": "^2.0.0",
621 | "pify": "^4.0.1",
622 | "safe-buffer": "^5.0.1"
623 | }
624 | },
625 | "create-ecdh": {
626 | "version": "4.0.3",
627 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
628 | "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
629 | "dev": true,
630 | "requires": {
631 | "bn.js": "^4.1.0",
632 | "elliptic": "^6.0.0"
633 | }
634 | },
635 | "create-hash": {
636 | "version": "1.2.0",
637 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
638 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
639 | "dev": true,
640 | "requires": {
641 | "cipher-base": "^1.0.1",
642 | "inherits": "^2.0.1",
643 | "md5.js": "^1.3.4",
644 | "ripemd160": "^2.0.1",
645 | "sha.js": "^2.4.0"
646 | }
647 | },
648 | "create-hmac": {
649 | "version": "1.1.7",
650 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
651 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
652 | "dev": true,
653 | "requires": {
654 | "cipher-base": "^1.0.3",
655 | "create-hash": "^1.1.0",
656 | "inherits": "^2.0.1",
657 | "ripemd160": "^2.0.0",
658 | "safe-buffer": "^5.0.1",
659 | "sha.js": "^2.4.8"
660 | }
661 | },
662 | "cross-spawn": {
663 | "version": "4.0.2",
664 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
665 | "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
666 | "dev": true,
667 | "requires": {
668 | "lru-cache": "^4.0.1",
669 | "which": "^1.2.9"
670 | }
671 | },
672 | "crypto-browserify": {
673 | "version": "3.12.0",
674 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
675 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
676 | "dev": true,
677 | "requires": {
678 | "browserify-cipher": "^1.0.0",
679 | "browserify-sign": "^4.0.0",
680 | "create-ecdh": "^4.0.0",
681 | "create-hash": "^1.1.0",
682 | "create-hmac": "^1.1.0",
683 | "diffie-hellman": "^5.0.0",
684 | "inherits": "^2.0.1",
685 | "pbkdf2": "^3.0.3",
686 | "public-encrypt": "^4.0.0",
687 | "randombytes": "^2.0.0",
688 | "randomfill": "^1.0.3"
689 | }
690 | },
691 | "date-now": {
692 | "version": "0.1.4",
693 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
694 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
695 | "dev": true
696 | },
697 | "debug": {
698 | "version": "4.1.1",
699 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
700 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
701 | "dev": true,
702 | "requires": {
703 | "ms": "^2.1.1"
704 | }
705 | },
706 | "decamelize": {
707 | "version": "1.2.0",
708 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
709 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
710 | "dev": true
711 | },
712 | "deep-equal": {
713 | "version": "1.0.1",
714 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
715 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
716 | "dev": true
717 | },
718 | "default-require-extensions": {
719 | "version": "2.0.0",
720 | "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
721 | "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
722 | "dev": true,
723 | "requires": {
724 | "strip-bom": "^3.0.0"
725 | }
726 | },
727 | "defined": {
728 | "version": "1.0.0",
729 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
730 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
731 | "dev": true
732 | },
733 | "deps-sort": {
734 | "version": "2.0.0",
735 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
736 | "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=",
737 | "dev": true,
738 | "requires": {
739 | "JSONStream": "^1.0.3",
740 | "shasum": "^1.0.0",
741 | "subarg": "^1.0.0",
742 | "through2": "^2.0.0"
743 | }
744 | },
745 | "des.js": {
746 | "version": "1.0.0",
747 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
748 | "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
749 | "dev": true,
750 | "requires": {
751 | "inherits": "^2.0.1",
752 | "minimalistic-assert": "^1.0.0"
753 | }
754 | },
755 | "detective": {
756 | "version": "5.2.0",
757 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
758 | "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
759 | "dev": true,
760 | "requires": {
761 | "acorn-node": "^1.6.1",
762 | "defined": "^1.0.0",
763 | "minimist": "^1.1.1"
764 | }
765 | },
766 | "diffie-hellman": {
767 | "version": "5.0.3",
768 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
769 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
770 | "dev": true,
771 | "requires": {
772 | "bn.js": "^4.1.0",
773 | "miller-rabin": "^4.0.0",
774 | "randombytes": "^2.0.0"
775 | }
776 | },
777 | "docco": {
778 | "version": "0.6.3",
779 | "resolved": "https://registry.npmjs.org/docco/-/docco-0.6.3.tgz",
780 | "integrity": "sha1-xHtYI9eVY9b8Or1J895ImG5VIu4=",
781 | "dev": true,
782 | "requires": {
783 | "commander": ">= 0.5.2",
784 | "fs-extra": ">= 0.6.0",
785 | "highlight.js": ">= 8.0.x",
786 | "marked": ">= 0.2.7",
787 | "underscore": ">= 1.0.0"
788 | }
789 | },
790 | "domain-browser": {
791 | "version": "1.2.0",
792 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
793 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
794 | "dev": true
795 | },
796 | "duplexer2": {
797 | "version": "0.1.4",
798 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
799 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
800 | "dev": true,
801 | "requires": {
802 | "readable-stream": "^2.0.2"
803 | }
804 | },
805 | "elliptic": {
806 | "version": "6.5.3",
807 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
808 | "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
809 | "requires": {
810 | "bn.js": "^4.4.0",
811 | "brorand": "^1.0.1",
812 | "hash.js": "^1.0.0",
813 | "hmac-drbg": "^1.0.0",
814 | "inherits": "^2.0.1",
815 | "minimalistic-assert": "^1.0.0",
816 | "minimalistic-crypto-utils": "^1.0.0"
817 | }
818 | },
819 | "emoji-regex": {
820 | "version": "7.0.3",
821 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
822 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
823 | "dev": true
824 | },
825 | "error-ex": {
826 | "version": "1.3.2",
827 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
828 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
829 | "dev": true,
830 | "requires": {
831 | "is-arrayish": "^0.2.1"
832 | }
833 | },
834 | "es6-error": {
835 | "version": "4.1.1",
836 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
837 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
838 | "dev": true
839 | },
840 | "escape-string-regexp": {
841 | "version": "1.0.5",
842 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
843 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
844 | "dev": true
845 | },
846 | "esprima": {
847 | "version": "4.0.1",
848 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
849 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
850 | "dev": true
851 | },
852 | "esutils": {
853 | "version": "2.0.3",
854 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
855 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
856 | "dev": true
857 | },
858 | "events": {
859 | "version": "2.1.0",
860 | "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
861 | "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
862 | "dev": true
863 | },
864 | "evp_bytestokey": {
865 | "version": "1.0.3",
866 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
867 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
868 | "dev": true,
869 | "requires": {
870 | "md5.js": "^1.3.4",
871 | "safe-buffer": "^5.1.1"
872 | }
873 | },
874 | "find-cache-dir": {
875 | "version": "2.1.0",
876 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
877 | "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
878 | "dev": true,
879 | "requires": {
880 | "commondir": "^1.0.1",
881 | "make-dir": "^2.0.0",
882 | "pkg-dir": "^3.0.0"
883 | }
884 | },
885 | "find-up": {
886 | "version": "3.0.0",
887 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
888 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
889 | "dev": true,
890 | "requires": {
891 | "locate-path": "^3.0.0"
892 | }
893 | },
894 | "foreground-child": {
895 | "version": "1.5.6",
896 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz",
897 | "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=",
898 | "dev": true,
899 | "requires": {
900 | "cross-spawn": "^4",
901 | "signal-exit": "^3.0.0"
902 | }
903 | },
904 | "fs-extra": {
905 | "version": "7.0.1",
906 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
907 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
908 | "dev": true,
909 | "requires": {
910 | "graceful-fs": "^4.1.2",
911 | "jsonfile": "^4.0.0",
912 | "universalify": "^0.1.0"
913 | }
914 | },
915 | "fs.realpath": {
916 | "version": "1.0.0",
917 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
918 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
919 | "dev": true
920 | },
921 | "function-bind": {
922 | "version": "1.1.1",
923 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
924 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
925 | "dev": true
926 | },
927 | "get-assigned-identifiers": {
928 | "version": "1.2.0",
929 | "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
930 | "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
931 | "dev": true
932 | },
933 | "get-caller-file": {
934 | "version": "2.0.5",
935 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
936 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
937 | "dev": true
938 | },
939 | "glob": {
940 | "version": "7.1.3",
941 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
942 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
943 | "dev": true,
944 | "requires": {
945 | "fs.realpath": "^1.0.0",
946 | "inflight": "^1.0.4",
947 | "inherits": "2",
948 | "minimatch": "^3.0.4",
949 | "once": "^1.3.0",
950 | "path-is-absolute": "^1.0.0"
951 | },
952 | "dependencies": {
953 | "minimatch": {
954 | "version": "3.0.4",
955 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
956 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
957 | "dev": true,
958 | "requires": {
959 | "brace-expansion": "^1.1.7"
960 | }
961 | }
962 | }
963 | },
964 | "globals": {
965 | "version": "11.12.0",
966 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
967 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
968 | "dev": true
969 | },
970 | "graceful-fs": {
971 | "version": "4.1.15",
972 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
973 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
974 | "dev": true
975 | },
976 | "handlebars": {
977 | "version": "4.7.2",
978 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.2.tgz",
979 | "integrity": "sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw==",
980 | "dev": true,
981 | "requires": {
982 | "neo-async": "^2.6.0",
983 | "optimist": "^0.6.1",
984 | "source-map": "^0.6.1",
985 | "uglify-js": "^3.1.4"
986 | },
987 | "dependencies": {
988 | "source-map": {
989 | "version": "0.6.1",
990 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
991 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
992 | "dev": true
993 | }
994 | }
995 | },
996 | "has": {
997 | "version": "1.0.3",
998 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
999 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1000 | "dev": true,
1001 | "requires": {
1002 | "function-bind": "^1.1.1"
1003 | }
1004 | },
1005 | "has-flag": {
1006 | "version": "3.0.0",
1007 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1008 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1009 | "dev": true
1010 | },
1011 | "hash-base": {
1012 | "version": "3.0.4",
1013 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
1014 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
1015 | "dev": true,
1016 | "requires": {
1017 | "inherits": "^2.0.1",
1018 | "safe-buffer": "^5.0.1"
1019 | }
1020 | },
1021 | "hash.js": {
1022 | "version": "1.1.7",
1023 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
1024 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
1025 | "requires": {
1026 | "inherits": "^2.0.3",
1027 | "minimalistic-assert": "^1.0.1"
1028 | }
1029 | },
1030 | "hasha": {
1031 | "version": "3.0.0",
1032 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz",
1033 | "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=",
1034 | "dev": true,
1035 | "requires": {
1036 | "is-stream": "^1.0.1"
1037 | }
1038 | },
1039 | "highlight.js": {
1040 | "version": "9.14.2",
1041 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.14.2.tgz",
1042 | "integrity": "sha512-Nc6YNECYpxyJABGYJAyw7dBAYbXEuIzwzkqoJnwbc1nIpCiN+3ioYf0XrBnLiyyG0JLuJhpPtt2iTSbXiKLoyA==",
1043 | "dev": true
1044 | },
1045 | "hmac-drbg": {
1046 | "version": "1.0.1",
1047 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
1048 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
1049 | "requires": {
1050 | "hash.js": "^1.0.3",
1051 | "minimalistic-assert": "^1.0.0",
1052 | "minimalistic-crypto-utils": "^1.0.1"
1053 | }
1054 | },
1055 | "hosted-git-info": {
1056 | "version": "2.7.1",
1057 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
1058 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
1059 | "dev": true
1060 | },
1061 | "htmlescape": {
1062 | "version": "1.1.1",
1063 | "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
1064 | "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
1065 | "dev": true
1066 | },
1067 | "https-browserify": {
1068 | "version": "1.0.0",
1069 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
1070 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
1071 | "dev": true
1072 | },
1073 | "iced-coffee-script": {
1074 | "version": "108.0.11",
1075 | "resolved": "https://registry.npmjs.org/iced-coffee-script/-/iced-coffee-script-108.0.11.tgz",
1076 | "integrity": "sha1-HXH/k8kElyimRoOFqpvIkf10xY8=",
1077 | "dev": true,
1078 | "requires": {
1079 | "iced-runtime": ">=0.0.1"
1080 | }
1081 | },
1082 | "iced-runtime": {
1083 | "version": "1.0.3",
1084 | "resolved": "https://registry.npmjs.org/iced-runtime/-/iced-runtime-1.0.3.tgz",
1085 | "integrity": "sha1-LU9PuZmreqVDCxk8d6f85BGDGc4="
1086 | },
1087 | "iced-test": {
1088 | "version": "0.0.27",
1089 | "resolved": "https://registry.npmjs.org/iced-test/-/iced-test-0.0.27.tgz",
1090 | "integrity": "sha512-Qm/u3l0rLd97WZvNtBA1V6S3u6klUbNGdyTlwW8hRjUMxpWg4T2FKUboxkO51znbfq+63byFBrbAoWxCIMRCUw==",
1091 | "dev": true,
1092 | "requires": {
1093 | "colors": ">=0.6.2",
1094 | "deep-equal": ">=0.2.1",
1095 | "iced-runtime": "^1.0.3",
1096 | "minimist": ">=0.0.8"
1097 | }
1098 | },
1099 | "icsify": {
1100 | "version": "0.7.0",
1101 | "resolved": "https://registry.npmjs.org/icsify/-/icsify-0.7.0.tgz",
1102 | "integrity": "sha1-DrvHwKsHoneHNaZDknPtwbRFiNQ=",
1103 | "dev": true,
1104 | "requires": {
1105 | "convert-source-map": "~0.3.3",
1106 | "iced-coffee-script": "^1.8.0-a",
1107 | "iced-runtime": "^1.0.2",
1108 | "through": "~2.3.4"
1109 | },
1110 | "dependencies": {
1111 | "convert-source-map": {
1112 | "version": "0.3.5",
1113 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz",
1114 | "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=",
1115 | "dev": true
1116 | },
1117 | "iced-coffee-script": {
1118 | "version": "1.8.0-e",
1119 | "resolved": "https://registry.npmjs.org/iced-coffee-script/-/iced-coffee-script-1.8.0-e.tgz",
1120 | "integrity": "sha1-6dPhe4cPyoF5/Q9iVOJ2GvzloTY=",
1121 | "dev": true,
1122 | "requires": {
1123 | "docco": "~0.6.2",
1124 | "iced-runtime": ">=0.0.1",
1125 | "mkdirp": "~0.3.5"
1126 | }
1127 | },
1128 | "mkdirp": {
1129 | "version": "0.3.5",
1130 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz",
1131 | "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=",
1132 | "dev": true
1133 | }
1134 | }
1135 | },
1136 | "ieee754": {
1137 | "version": "1.1.12",
1138 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
1139 | "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
1140 | "dev": true
1141 | },
1142 | "imurmurhash": {
1143 | "version": "0.1.4",
1144 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1145 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1146 | "dev": true
1147 | },
1148 | "inflight": {
1149 | "version": "1.0.6",
1150 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1151 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1152 | "dev": true,
1153 | "requires": {
1154 | "once": "^1.3.0",
1155 | "wrappy": "1"
1156 | }
1157 | },
1158 | "inherits": {
1159 | "version": "2.0.3",
1160 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1161 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
1162 | },
1163 | "inline-source-map": {
1164 | "version": "0.6.2",
1165 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
1166 | "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
1167 | "dev": true,
1168 | "requires": {
1169 | "source-map": "~0.5.3"
1170 | }
1171 | },
1172 | "insert-module-globals": {
1173 | "version": "7.2.0",
1174 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
1175 | "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
1176 | "dev": true,
1177 | "requires": {
1178 | "JSONStream": "^1.0.3",
1179 | "acorn-node": "^1.5.2",
1180 | "combine-source-map": "^0.8.0",
1181 | "concat-stream": "^1.6.1",
1182 | "is-buffer": "^1.1.0",
1183 | "path-is-absolute": "^1.0.1",
1184 | "process": "~0.11.0",
1185 | "through2": "^2.0.0",
1186 | "undeclared-identifiers": "^1.1.2",
1187 | "xtend": "^4.0.0"
1188 | }
1189 | },
1190 | "is-arrayish": {
1191 | "version": "0.2.1",
1192 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1193 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1194 | "dev": true
1195 | },
1196 | "is-buffer": {
1197 | "version": "1.1.6",
1198 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1199 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
1200 | "dev": true
1201 | },
1202 | "is-fullwidth-code-point": {
1203 | "version": "2.0.0",
1204 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1205 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1206 | "dev": true
1207 | },
1208 | "is-stream": {
1209 | "version": "1.1.0",
1210 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
1211 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
1212 | "dev": true
1213 | },
1214 | "isarray": {
1215 | "version": "1.0.0",
1216 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1217 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1218 | "dev": true
1219 | },
1220 | "isexe": {
1221 | "version": "2.0.0",
1222 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1223 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1224 | "dev": true
1225 | },
1226 | "istanbul-lib-coverage": {
1227 | "version": "2.0.5",
1228 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
1229 | "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
1230 | "dev": true
1231 | },
1232 | "istanbul-lib-hook": {
1233 | "version": "2.0.7",
1234 | "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz",
1235 | "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==",
1236 | "dev": true,
1237 | "requires": {
1238 | "append-transform": "^1.0.0"
1239 | }
1240 | },
1241 | "istanbul-lib-instrument": {
1242 | "version": "3.3.0",
1243 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
1244 | "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
1245 | "dev": true,
1246 | "requires": {
1247 | "@babel/generator": "^7.4.0",
1248 | "@babel/parser": "^7.4.3",
1249 | "@babel/template": "^7.4.0",
1250 | "@babel/traverse": "^7.4.3",
1251 | "@babel/types": "^7.4.0",
1252 | "istanbul-lib-coverage": "^2.0.5",
1253 | "semver": "^6.0.0"
1254 | },
1255 | "dependencies": {
1256 | "semver": {
1257 | "version": "6.3.0",
1258 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1259 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1260 | "dev": true
1261 | }
1262 | }
1263 | },
1264 | "istanbul-lib-report": {
1265 | "version": "2.0.8",
1266 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz",
1267 | "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==",
1268 | "dev": true,
1269 | "requires": {
1270 | "istanbul-lib-coverage": "^2.0.5",
1271 | "make-dir": "^2.1.0",
1272 | "supports-color": "^6.1.0"
1273 | },
1274 | "dependencies": {
1275 | "supports-color": {
1276 | "version": "6.1.0",
1277 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
1278 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
1279 | "dev": true,
1280 | "requires": {
1281 | "has-flag": "^3.0.0"
1282 | }
1283 | }
1284 | }
1285 | },
1286 | "istanbul-lib-source-maps": {
1287 | "version": "3.0.6",
1288 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
1289 | "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
1290 | "dev": true,
1291 | "requires": {
1292 | "debug": "^4.1.1",
1293 | "istanbul-lib-coverage": "^2.0.5",
1294 | "make-dir": "^2.1.0",
1295 | "rimraf": "^2.6.3",
1296 | "source-map": "^0.6.1"
1297 | },
1298 | "dependencies": {
1299 | "source-map": {
1300 | "version": "0.6.1",
1301 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1302 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1303 | "dev": true
1304 | }
1305 | }
1306 | },
1307 | "istanbul-reports": {
1308 | "version": "2.2.6",
1309 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz",
1310 | "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==",
1311 | "dev": true,
1312 | "requires": {
1313 | "handlebars": "^4.1.2"
1314 | }
1315 | },
1316 | "js-tokens": {
1317 | "version": "4.0.0",
1318 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1319 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1320 | "dev": true
1321 | },
1322 | "js-yaml": {
1323 | "version": "3.13.1",
1324 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
1325 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
1326 | "dev": true,
1327 | "requires": {
1328 | "argparse": "^1.0.7",
1329 | "esprima": "^4.0.0"
1330 | }
1331 | },
1332 | "jsesc": {
1333 | "version": "2.5.2",
1334 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
1335 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
1336 | "dev": true
1337 | },
1338 | "json-parse-better-errors": {
1339 | "version": "1.0.2",
1340 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
1341 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
1342 | "dev": true
1343 | },
1344 | "json-stable-stringify": {
1345 | "version": "0.0.1",
1346 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
1347 | "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
1348 | "dev": true,
1349 | "requires": {
1350 | "jsonify": "~0.0.0"
1351 | }
1352 | },
1353 | "jsonfile": {
1354 | "version": "4.0.0",
1355 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
1356 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
1357 | "dev": true,
1358 | "requires": {
1359 | "graceful-fs": "^4.1.6"
1360 | }
1361 | },
1362 | "jsonify": {
1363 | "version": "0.0.0",
1364 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
1365 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
1366 | "dev": true
1367 | },
1368 | "jsonparse": {
1369 | "version": "1.3.1",
1370 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
1371 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
1372 | "dev": true
1373 | },
1374 | "labeled-stream-splicer": {
1375 | "version": "2.0.1",
1376 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz",
1377 | "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==",
1378 | "dev": true,
1379 | "requires": {
1380 | "inherits": "^2.0.1",
1381 | "isarray": "^2.0.4",
1382 | "stream-splicer": "^2.0.0"
1383 | },
1384 | "dependencies": {
1385 | "isarray": {
1386 | "version": "2.0.4",
1387 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz",
1388 | "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==",
1389 | "dev": true
1390 | }
1391 | }
1392 | },
1393 | "load-json-file": {
1394 | "version": "4.0.0",
1395 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
1396 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
1397 | "dev": true,
1398 | "requires": {
1399 | "graceful-fs": "^4.1.2",
1400 | "parse-json": "^4.0.0",
1401 | "pify": "^3.0.0",
1402 | "strip-bom": "^3.0.0"
1403 | },
1404 | "dependencies": {
1405 | "pify": {
1406 | "version": "3.0.0",
1407 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
1408 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
1409 | "dev": true
1410 | }
1411 | }
1412 | },
1413 | "locate-path": {
1414 | "version": "3.0.0",
1415 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
1416 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
1417 | "dev": true,
1418 | "requires": {
1419 | "p-locate": "^3.0.0",
1420 | "path-exists": "^3.0.0"
1421 | }
1422 | },
1423 | "lodash": {
1424 | "version": "4.17.15",
1425 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1426 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
1427 | "dev": true
1428 | },
1429 | "lodash.flattendeep": {
1430 | "version": "4.4.0",
1431 | "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
1432 | "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
1433 | "dev": true
1434 | },
1435 | "lodash.memoize": {
1436 | "version": "3.0.4",
1437 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
1438 | "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
1439 | "dev": true
1440 | },
1441 | "lru-cache": {
1442 | "version": "4.1.5",
1443 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
1444 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
1445 | "dev": true,
1446 | "requires": {
1447 | "pseudomap": "^1.0.2",
1448 | "yallist": "^2.1.2"
1449 | }
1450 | },
1451 | "make-dir": {
1452 | "version": "2.1.0",
1453 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
1454 | "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
1455 | "dev": true,
1456 | "requires": {
1457 | "pify": "^4.0.1",
1458 | "semver": "^5.6.0"
1459 | }
1460 | },
1461 | "marked": {
1462 | "version": "0.7.0",
1463 | "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz",
1464 | "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==",
1465 | "dev": true
1466 | },
1467 | "md5.js": {
1468 | "version": "1.3.5",
1469 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
1470 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
1471 | "dev": true,
1472 | "requires": {
1473 | "hash-base": "^3.0.0",
1474 | "inherits": "^2.0.1",
1475 | "safe-buffer": "^5.1.2"
1476 | }
1477 | },
1478 | "merge-source-map": {
1479 | "version": "1.1.0",
1480 | "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
1481 | "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
1482 | "dev": true,
1483 | "requires": {
1484 | "source-map": "^0.6.1"
1485 | },
1486 | "dependencies": {
1487 | "source-map": {
1488 | "version": "0.6.1",
1489 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1490 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1491 | "dev": true
1492 | }
1493 | }
1494 | },
1495 | "miller-rabin": {
1496 | "version": "4.0.1",
1497 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
1498 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
1499 | "dev": true,
1500 | "requires": {
1501 | "bn.js": "^4.0.0",
1502 | "brorand": "^1.0.1"
1503 | }
1504 | },
1505 | "minimalistic-assert": {
1506 | "version": "1.0.1",
1507 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
1508 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
1509 | },
1510 | "minimalistic-crypto-utils": {
1511 | "version": "1.0.1",
1512 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
1513 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
1514 | },
1515 | "minimatch": {
1516 | "version": "3.0.4",
1517 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1518 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1519 | "dev": true,
1520 | "requires": {
1521 | "brace-expansion": "^1.1.7"
1522 | }
1523 | },
1524 | "minimist": {
1525 | "version": "1.2.0",
1526 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
1527 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
1528 | "dev": true
1529 | },
1530 | "mkdirp": {
1531 | "version": "0.5.1",
1532 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1533 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1534 | "dev": true,
1535 | "requires": {
1536 | "minimist": "0.0.8"
1537 | },
1538 | "dependencies": {
1539 | "minimist": {
1540 | "version": "0.0.8",
1541 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1542 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1543 | "dev": true
1544 | }
1545 | }
1546 | },
1547 | "module-deps": {
1548 | "version": "6.2.0",
1549 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz",
1550 | "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==",
1551 | "dev": true,
1552 | "requires": {
1553 | "JSONStream": "^1.0.3",
1554 | "browser-resolve": "^1.7.0",
1555 | "cached-path-relative": "^1.0.0",
1556 | "concat-stream": "~1.6.0",
1557 | "defined": "^1.0.0",
1558 | "detective": "^5.0.2",
1559 | "duplexer2": "^0.1.2",
1560 | "inherits": "^2.0.1",
1561 | "parents": "^1.0.0",
1562 | "readable-stream": "^2.0.2",
1563 | "resolve": "^1.4.0",
1564 | "stream-combiner2": "^1.1.1",
1565 | "subarg": "^1.0.0",
1566 | "through2": "^2.0.0",
1567 | "xtend": "^4.0.0"
1568 | }
1569 | },
1570 | "ms": {
1571 | "version": "2.1.2",
1572 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1573 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1574 | "dev": true
1575 | },
1576 | "neo-async": {
1577 | "version": "2.6.1",
1578 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
1579 | "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
1580 | "dev": true
1581 | },
1582 | "nested-error-stacks": {
1583 | "version": "2.1.0",
1584 | "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz",
1585 | "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==",
1586 | "dev": true
1587 | },
1588 | "normalize-package-data": {
1589 | "version": "2.5.0",
1590 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
1591 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
1592 | "dev": true,
1593 | "requires": {
1594 | "hosted-git-info": "^2.1.4",
1595 | "resolve": "^1.10.0",
1596 | "semver": "2 || 3 || 4 || 5",
1597 | "validate-npm-package-license": "^3.0.1"
1598 | }
1599 | },
1600 | "nyc": {
1601 | "version": "14.1.1",
1602 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz",
1603 | "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==",
1604 | "dev": true,
1605 | "requires": {
1606 | "archy": "^1.0.0",
1607 | "caching-transform": "^3.0.2",
1608 | "convert-source-map": "^1.6.0",
1609 | "cp-file": "^6.2.0",
1610 | "find-cache-dir": "^2.1.0",
1611 | "find-up": "^3.0.0",
1612 | "foreground-child": "^1.5.6",
1613 | "glob": "^7.1.3",
1614 | "istanbul-lib-coverage": "^2.0.5",
1615 | "istanbul-lib-hook": "^2.0.7",
1616 | "istanbul-lib-instrument": "^3.3.0",
1617 | "istanbul-lib-report": "^2.0.8",
1618 | "istanbul-lib-source-maps": "^3.0.6",
1619 | "istanbul-reports": "^2.2.4",
1620 | "js-yaml": "^3.13.1",
1621 | "make-dir": "^2.1.0",
1622 | "merge-source-map": "^1.1.0",
1623 | "resolve-from": "^4.0.0",
1624 | "rimraf": "^2.6.3",
1625 | "signal-exit": "^3.0.2",
1626 | "spawn-wrap": "^1.4.2",
1627 | "test-exclude": "^5.2.3",
1628 | "uuid": "^3.3.2",
1629 | "yargs": "^13.2.2",
1630 | "yargs-parser": "^13.0.0"
1631 | },
1632 | "dependencies": {
1633 | "convert-source-map": {
1634 | "version": "1.6.0",
1635 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
1636 | "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
1637 | "dev": true,
1638 | "requires": {
1639 | "safe-buffer": "~5.1.1"
1640 | }
1641 | }
1642 | }
1643 | },
1644 | "once": {
1645 | "version": "1.4.0",
1646 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1647 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1648 | "dev": true,
1649 | "requires": {
1650 | "wrappy": "1"
1651 | }
1652 | },
1653 | "optimist": {
1654 | "version": "0.6.1",
1655 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1656 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
1657 | "dev": true,
1658 | "requires": {
1659 | "minimist": "~0.0.1",
1660 | "wordwrap": "~0.0.2"
1661 | },
1662 | "dependencies": {
1663 | "minimist": {
1664 | "version": "0.0.10",
1665 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
1666 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
1667 | "dev": true
1668 | }
1669 | }
1670 | },
1671 | "os-browserify": {
1672 | "version": "0.3.0",
1673 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
1674 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
1675 | "dev": true
1676 | },
1677 | "os-homedir": {
1678 | "version": "1.0.2",
1679 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1680 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
1681 | "dev": true
1682 | },
1683 | "p-limit": {
1684 | "version": "2.2.0",
1685 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
1686 | "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
1687 | "dev": true,
1688 | "requires": {
1689 | "p-try": "^2.0.0"
1690 | }
1691 | },
1692 | "p-locate": {
1693 | "version": "3.0.0",
1694 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
1695 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
1696 | "dev": true,
1697 | "requires": {
1698 | "p-limit": "^2.0.0"
1699 | }
1700 | },
1701 | "p-try": {
1702 | "version": "2.2.0",
1703 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1704 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1705 | "dev": true
1706 | },
1707 | "package-hash": {
1708 | "version": "3.0.0",
1709 | "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz",
1710 | "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==",
1711 | "dev": true,
1712 | "requires": {
1713 | "graceful-fs": "^4.1.15",
1714 | "hasha": "^3.0.0",
1715 | "lodash.flattendeep": "^4.4.0",
1716 | "release-zalgo": "^1.0.0"
1717 | }
1718 | },
1719 | "pako": {
1720 | "version": "1.0.8",
1721 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz",
1722 | "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==",
1723 | "dev": true
1724 | },
1725 | "parents": {
1726 | "version": "1.0.1",
1727 | "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
1728 | "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
1729 | "dev": true,
1730 | "requires": {
1731 | "path-platform": "~0.11.15"
1732 | }
1733 | },
1734 | "parse-asn1": {
1735 | "version": "5.1.3",
1736 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz",
1737 | "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==",
1738 | "dev": true,
1739 | "requires": {
1740 | "asn1.js": "^4.0.0",
1741 | "browserify-aes": "^1.0.0",
1742 | "create-hash": "^1.1.0",
1743 | "evp_bytestokey": "^1.0.0",
1744 | "pbkdf2": "^3.0.3",
1745 | "safe-buffer": "^5.1.1"
1746 | }
1747 | },
1748 | "parse-json": {
1749 | "version": "4.0.0",
1750 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
1751 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
1752 | "dev": true,
1753 | "requires": {
1754 | "error-ex": "^1.3.1",
1755 | "json-parse-better-errors": "^1.0.1"
1756 | }
1757 | },
1758 | "path-browserify": {
1759 | "version": "0.0.1",
1760 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
1761 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
1762 | "dev": true
1763 | },
1764 | "path-exists": {
1765 | "version": "3.0.0",
1766 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1767 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1768 | "dev": true
1769 | },
1770 | "path-is-absolute": {
1771 | "version": "1.0.1",
1772 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1773 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1774 | "dev": true
1775 | },
1776 | "path-parse": {
1777 | "version": "1.0.6",
1778 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1779 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1780 | "dev": true
1781 | },
1782 | "path-platform": {
1783 | "version": "0.11.15",
1784 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
1785 | "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
1786 | "dev": true
1787 | },
1788 | "path-type": {
1789 | "version": "3.0.0",
1790 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
1791 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
1792 | "dev": true,
1793 | "requires": {
1794 | "pify": "^3.0.0"
1795 | },
1796 | "dependencies": {
1797 | "pify": {
1798 | "version": "3.0.0",
1799 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
1800 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
1801 | "dev": true
1802 | }
1803 | }
1804 | },
1805 | "pbkdf2": {
1806 | "version": "3.0.17",
1807 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
1808 | "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
1809 | "dev": true,
1810 | "requires": {
1811 | "create-hash": "^1.1.2",
1812 | "create-hmac": "^1.1.4",
1813 | "ripemd160": "^2.0.1",
1814 | "safe-buffer": "^5.0.1",
1815 | "sha.js": "^2.4.8"
1816 | }
1817 | },
1818 | "pify": {
1819 | "version": "4.0.1",
1820 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
1821 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
1822 | "dev": true
1823 | },
1824 | "pkg-dir": {
1825 | "version": "3.0.0",
1826 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
1827 | "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
1828 | "dev": true,
1829 | "requires": {
1830 | "find-up": "^3.0.0"
1831 | }
1832 | },
1833 | "process": {
1834 | "version": "0.11.10",
1835 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
1836 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
1837 | "dev": true
1838 | },
1839 | "process-nextick-args": {
1840 | "version": "2.0.0",
1841 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
1842 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
1843 | "dev": true
1844 | },
1845 | "pseudomap": {
1846 | "version": "1.0.2",
1847 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
1848 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
1849 | "dev": true
1850 | },
1851 | "public-encrypt": {
1852 | "version": "4.0.3",
1853 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
1854 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
1855 | "dev": true,
1856 | "requires": {
1857 | "bn.js": "^4.1.0",
1858 | "browserify-rsa": "^4.0.0",
1859 | "create-hash": "^1.1.0",
1860 | "parse-asn1": "^5.0.0",
1861 | "randombytes": "^2.0.1",
1862 | "safe-buffer": "^5.1.2"
1863 | }
1864 | },
1865 | "punycode": {
1866 | "version": "1.4.1",
1867 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1868 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
1869 | "dev": true
1870 | },
1871 | "querystring": {
1872 | "version": "0.2.0",
1873 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
1874 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
1875 | "dev": true
1876 | },
1877 | "querystring-es3": {
1878 | "version": "0.2.1",
1879 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
1880 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
1881 | "dev": true
1882 | },
1883 | "randombytes": {
1884 | "version": "2.0.6",
1885 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
1886 | "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
1887 | "dev": true,
1888 | "requires": {
1889 | "safe-buffer": "^5.1.0"
1890 | }
1891 | },
1892 | "randomfill": {
1893 | "version": "1.0.4",
1894 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
1895 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
1896 | "dev": true,
1897 | "requires": {
1898 | "randombytes": "^2.0.5",
1899 | "safe-buffer": "^5.1.0"
1900 | }
1901 | },
1902 | "read-only-stream": {
1903 | "version": "2.0.0",
1904 | "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
1905 | "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
1906 | "dev": true,
1907 | "requires": {
1908 | "readable-stream": "^2.0.2"
1909 | }
1910 | },
1911 | "read-pkg": {
1912 | "version": "3.0.0",
1913 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
1914 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
1915 | "dev": true,
1916 | "requires": {
1917 | "load-json-file": "^4.0.0",
1918 | "normalize-package-data": "^2.3.2",
1919 | "path-type": "^3.0.0"
1920 | }
1921 | },
1922 | "read-pkg-up": {
1923 | "version": "4.0.0",
1924 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
1925 | "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
1926 | "dev": true,
1927 | "requires": {
1928 | "find-up": "^3.0.0",
1929 | "read-pkg": "^3.0.0"
1930 | }
1931 | },
1932 | "readable-stream": {
1933 | "version": "2.3.6",
1934 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1935 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1936 | "dev": true,
1937 | "requires": {
1938 | "core-util-is": "~1.0.0",
1939 | "inherits": "~2.0.3",
1940 | "isarray": "~1.0.0",
1941 | "process-nextick-args": "~2.0.0",
1942 | "safe-buffer": "~5.1.1",
1943 | "string_decoder": "~1.1.1",
1944 | "util-deprecate": "~1.0.1"
1945 | },
1946 | "dependencies": {
1947 | "string_decoder": {
1948 | "version": "1.1.1",
1949 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1950 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1951 | "dev": true,
1952 | "requires": {
1953 | "safe-buffer": "~5.1.0"
1954 | }
1955 | }
1956 | }
1957 | },
1958 | "release-zalgo": {
1959 | "version": "1.0.0",
1960 | "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
1961 | "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
1962 | "dev": true,
1963 | "requires": {
1964 | "es6-error": "^4.0.1"
1965 | }
1966 | },
1967 | "require-directory": {
1968 | "version": "2.1.1",
1969 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1970 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
1971 | "dev": true
1972 | },
1973 | "require-main-filename": {
1974 | "version": "2.0.0",
1975 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
1976 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
1977 | "dev": true
1978 | },
1979 | "resolve": {
1980 | "version": "1.10.0",
1981 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
1982 | "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
1983 | "dev": true,
1984 | "requires": {
1985 | "path-parse": "^1.0.6"
1986 | }
1987 | },
1988 | "resolve-from": {
1989 | "version": "4.0.0",
1990 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1991 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1992 | "dev": true
1993 | },
1994 | "rimraf": {
1995 | "version": "2.6.3",
1996 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
1997 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
1998 | "dev": true,
1999 | "requires": {
2000 | "glob": "^7.1.3"
2001 | }
2002 | },
2003 | "ripemd160": {
2004 | "version": "2.0.2",
2005 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
2006 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
2007 | "dev": true,
2008 | "requires": {
2009 | "hash-base": "^3.0.0",
2010 | "inherits": "^2.0.1"
2011 | }
2012 | },
2013 | "safe-buffer": {
2014 | "version": "5.1.2",
2015 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2016 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2017 | "dev": true
2018 | },
2019 | "semver": {
2020 | "version": "5.7.0",
2021 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
2022 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
2023 | "dev": true
2024 | },
2025 | "set-blocking": {
2026 | "version": "2.0.0",
2027 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
2028 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
2029 | "dev": true
2030 | },
2031 | "sha.js": {
2032 | "version": "2.4.11",
2033 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
2034 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
2035 | "dev": true,
2036 | "requires": {
2037 | "inherits": "^2.0.1",
2038 | "safe-buffer": "^5.0.1"
2039 | }
2040 | },
2041 | "shasum": {
2042 | "version": "1.0.2",
2043 | "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
2044 | "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
2045 | "dev": true,
2046 | "requires": {
2047 | "json-stable-stringify": "~0.0.0",
2048 | "sha.js": "~2.4.4"
2049 | }
2050 | },
2051 | "shell-quote": {
2052 | "version": "1.6.1",
2053 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
2054 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
2055 | "dev": true,
2056 | "requires": {
2057 | "array-filter": "~0.0.0",
2058 | "array-map": "~0.0.0",
2059 | "array-reduce": "~0.0.0",
2060 | "jsonify": "~0.0.0"
2061 | }
2062 | },
2063 | "signal-exit": {
2064 | "version": "3.0.2",
2065 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
2066 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
2067 | "dev": true
2068 | },
2069 | "simple-concat": {
2070 | "version": "1.0.0",
2071 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
2072 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=",
2073 | "dev": true
2074 | },
2075 | "source-map": {
2076 | "version": "0.5.7",
2077 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2078 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
2079 | "dev": true
2080 | },
2081 | "spawn-wrap": {
2082 | "version": "1.4.2",
2083 | "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz",
2084 | "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==",
2085 | "dev": true,
2086 | "requires": {
2087 | "foreground-child": "^1.5.6",
2088 | "mkdirp": "^0.5.0",
2089 | "os-homedir": "^1.0.1",
2090 | "rimraf": "^2.6.2",
2091 | "signal-exit": "^3.0.2",
2092 | "which": "^1.3.0"
2093 | }
2094 | },
2095 | "spdx-correct": {
2096 | "version": "3.1.0",
2097 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
2098 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
2099 | "dev": true,
2100 | "requires": {
2101 | "spdx-expression-parse": "^3.0.0",
2102 | "spdx-license-ids": "^3.0.0"
2103 | }
2104 | },
2105 | "spdx-exceptions": {
2106 | "version": "2.2.0",
2107 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
2108 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
2109 | "dev": true
2110 | },
2111 | "spdx-expression-parse": {
2112 | "version": "3.0.0",
2113 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
2114 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
2115 | "dev": true,
2116 | "requires": {
2117 | "spdx-exceptions": "^2.1.0",
2118 | "spdx-license-ids": "^3.0.0"
2119 | }
2120 | },
2121 | "spdx-license-ids": {
2122 | "version": "3.0.5",
2123 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
2124 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
2125 | "dev": true
2126 | },
2127 | "sprintf-js": {
2128 | "version": "1.0.3",
2129 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2130 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
2131 | "dev": true
2132 | },
2133 | "stream-browserify": {
2134 | "version": "2.0.2",
2135 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
2136 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
2137 | "dev": true,
2138 | "requires": {
2139 | "inherits": "~2.0.1",
2140 | "readable-stream": "^2.0.2"
2141 | }
2142 | },
2143 | "stream-combiner2": {
2144 | "version": "1.1.1",
2145 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
2146 | "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
2147 | "dev": true,
2148 | "requires": {
2149 | "duplexer2": "~0.1.0",
2150 | "readable-stream": "^2.0.2"
2151 | }
2152 | },
2153 | "stream-http": {
2154 | "version": "2.8.3",
2155 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
2156 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
2157 | "dev": true,
2158 | "requires": {
2159 | "builtin-status-codes": "^3.0.0",
2160 | "inherits": "^2.0.1",
2161 | "readable-stream": "^2.3.6",
2162 | "to-arraybuffer": "^1.0.0",
2163 | "xtend": "^4.0.0"
2164 | }
2165 | },
2166 | "stream-splicer": {
2167 | "version": "2.0.0",
2168 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz",
2169 | "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=",
2170 | "dev": true,
2171 | "requires": {
2172 | "inherits": "^2.0.1",
2173 | "readable-stream": "^2.0.2"
2174 | }
2175 | },
2176 | "string-width": {
2177 | "version": "3.1.0",
2178 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2179 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2180 | "dev": true,
2181 | "requires": {
2182 | "emoji-regex": "^7.0.1",
2183 | "is-fullwidth-code-point": "^2.0.0",
2184 | "strip-ansi": "^5.1.0"
2185 | }
2186 | },
2187 | "string_decoder": {
2188 | "version": "1.2.0",
2189 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz",
2190 | "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==",
2191 | "dev": true,
2192 | "requires": {
2193 | "safe-buffer": "~5.1.0"
2194 | }
2195 | },
2196 | "strip-ansi": {
2197 | "version": "5.2.0",
2198 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2199 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2200 | "dev": true,
2201 | "requires": {
2202 | "ansi-regex": "^4.1.0"
2203 | }
2204 | },
2205 | "strip-bom": {
2206 | "version": "3.0.0",
2207 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
2208 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
2209 | "dev": true
2210 | },
2211 | "subarg": {
2212 | "version": "1.0.0",
2213 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
2214 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
2215 | "dev": true,
2216 | "requires": {
2217 | "minimist": "^1.1.0"
2218 | }
2219 | },
2220 | "supports-color": {
2221 | "version": "5.5.0",
2222 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2223 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2224 | "dev": true,
2225 | "requires": {
2226 | "has-flag": "^3.0.0"
2227 | }
2228 | },
2229 | "syntax-error": {
2230 | "version": "1.4.0",
2231 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
2232 | "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
2233 | "dev": true,
2234 | "requires": {
2235 | "acorn-node": "^1.2.0"
2236 | }
2237 | },
2238 | "test-exclude": {
2239 | "version": "5.2.3",
2240 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz",
2241 | "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==",
2242 | "dev": true,
2243 | "requires": {
2244 | "glob": "^7.1.3",
2245 | "minimatch": "^3.0.4",
2246 | "read-pkg-up": "^4.0.0",
2247 | "require-main-filename": "^2.0.0"
2248 | }
2249 | },
2250 | "through": {
2251 | "version": "2.3.8",
2252 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
2253 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
2254 | "dev": true
2255 | },
2256 | "through2": {
2257 | "version": "2.0.5",
2258 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
2259 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
2260 | "dev": true,
2261 | "requires": {
2262 | "readable-stream": "~2.3.6",
2263 | "xtend": "~4.0.1"
2264 | }
2265 | },
2266 | "timers-browserify": {
2267 | "version": "1.4.2",
2268 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
2269 | "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
2270 | "dev": true,
2271 | "requires": {
2272 | "process": "~0.11.0"
2273 | }
2274 | },
2275 | "to-arraybuffer": {
2276 | "version": "1.0.1",
2277 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
2278 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
2279 | "dev": true
2280 | },
2281 | "to-fast-properties": {
2282 | "version": "2.0.0",
2283 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
2284 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
2285 | "dev": true
2286 | },
2287 | "trim-right": {
2288 | "version": "1.0.1",
2289 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
2290 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
2291 | "dev": true
2292 | },
2293 | "tty-browserify": {
2294 | "version": "0.0.1",
2295 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
2296 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
2297 | "dev": true
2298 | },
2299 | "tweetnacl": {
2300 | "version": "0.13.3",
2301 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz",
2302 | "integrity": "sha1-1ii1bzvMPVrnS6nUwacE3vWrS1Y="
2303 | },
2304 | "typedarray": {
2305 | "version": "0.0.6",
2306 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
2307 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
2308 | "dev": true
2309 | },
2310 | "uglify-js": {
2311 | "version": "3.7.5",
2312 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.5.tgz",
2313 | "integrity": "sha512-GFZ3EXRptKGvb/C1Sq6nO1iI7AGcjyqmIyOw0DrD0675e+NNbGO72xmMM2iEBdFbxaTLo70NbjM/Wy54uZIlsg==",
2314 | "dev": true,
2315 | "optional": true,
2316 | "requires": {
2317 | "commander": "~2.20.3",
2318 | "source-map": "~0.6.1"
2319 | },
2320 | "dependencies": {
2321 | "commander": {
2322 | "version": "2.20.3",
2323 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
2324 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
2325 | "dev": true,
2326 | "optional": true
2327 | },
2328 | "source-map": {
2329 | "version": "0.6.1",
2330 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2331 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2332 | "dev": true,
2333 | "optional": true
2334 | }
2335 | }
2336 | },
2337 | "uint64be": {
2338 | "version": "1.0.1",
2339 | "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-1.0.1.tgz",
2340 | "integrity": "sha1-H3FUIC8qG4rzU4cd2mUb80zpPpU="
2341 | },
2342 | "umd": {
2343 | "version": "3.0.3",
2344 | "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
2345 | "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
2346 | "dev": true
2347 | },
2348 | "undeclared-identifiers": {
2349 | "version": "1.1.2",
2350 | "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz",
2351 | "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==",
2352 | "dev": true,
2353 | "requires": {
2354 | "acorn-node": "^1.3.0",
2355 | "get-assigned-identifiers": "^1.2.0",
2356 | "simple-concat": "^1.0.0",
2357 | "xtend": "^4.0.1"
2358 | }
2359 | },
2360 | "underscore": {
2361 | "version": "1.9.1",
2362 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
2363 | "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==",
2364 | "dev": true
2365 | },
2366 | "universalify": {
2367 | "version": "0.1.2",
2368 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
2369 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
2370 | "dev": true
2371 | },
2372 | "url": {
2373 | "version": "0.11.0",
2374 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
2375 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
2376 | "dev": true,
2377 | "requires": {
2378 | "punycode": "1.3.2",
2379 | "querystring": "0.2.0"
2380 | },
2381 | "dependencies": {
2382 | "punycode": {
2383 | "version": "1.3.2",
2384 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
2385 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
2386 | "dev": true
2387 | }
2388 | }
2389 | },
2390 | "util": {
2391 | "version": "0.10.4",
2392 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
2393 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
2394 | "dev": true,
2395 | "requires": {
2396 | "inherits": "2.0.3"
2397 | }
2398 | },
2399 | "util-deprecate": {
2400 | "version": "1.0.2",
2401 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2402 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2403 | "dev": true
2404 | },
2405 | "uuid": {
2406 | "version": "3.3.2",
2407 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
2408 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
2409 | "dev": true
2410 | },
2411 | "validate-npm-package-license": {
2412 | "version": "3.0.4",
2413 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
2414 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
2415 | "dev": true,
2416 | "requires": {
2417 | "spdx-correct": "^3.0.0",
2418 | "spdx-expression-parse": "^3.0.0"
2419 | }
2420 | },
2421 | "vm-browserify": {
2422 | "version": "1.1.0",
2423 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
2424 | "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
2425 | "dev": true
2426 | },
2427 | "which": {
2428 | "version": "1.3.1",
2429 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2430 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2431 | "dev": true,
2432 | "requires": {
2433 | "isexe": "^2.0.0"
2434 | }
2435 | },
2436 | "which-module": {
2437 | "version": "2.0.0",
2438 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
2439 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
2440 | "dev": true
2441 | },
2442 | "wordwrap": {
2443 | "version": "0.0.3",
2444 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
2445 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
2446 | "dev": true
2447 | },
2448 | "wrap-ansi": {
2449 | "version": "5.1.0",
2450 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
2451 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
2452 | "dev": true,
2453 | "requires": {
2454 | "ansi-styles": "^3.2.0",
2455 | "string-width": "^3.0.0",
2456 | "strip-ansi": "^5.0.0"
2457 | }
2458 | },
2459 | "wrappy": {
2460 | "version": "1.0.2",
2461 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2462 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2463 | "dev": true
2464 | },
2465 | "write-file-atomic": {
2466 | "version": "2.4.3",
2467 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
2468 | "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
2469 | "dev": true,
2470 | "requires": {
2471 | "graceful-fs": "^4.1.11",
2472 | "imurmurhash": "^0.1.4",
2473 | "signal-exit": "^3.0.2"
2474 | }
2475 | },
2476 | "xtend": {
2477 | "version": "4.0.1",
2478 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
2479 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
2480 | "dev": true
2481 | },
2482 | "y18n": {
2483 | "version": "4.0.0",
2484 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
2485 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
2486 | "dev": true
2487 | },
2488 | "yallist": {
2489 | "version": "2.1.2",
2490 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
2491 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
2492 | "dev": true
2493 | },
2494 | "yargs": {
2495 | "version": "13.3.0",
2496 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
2497 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
2498 | "dev": true,
2499 | "requires": {
2500 | "cliui": "^5.0.0",
2501 | "find-up": "^3.0.0",
2502 | "get-caller-file": "^2.0.1",
2503 | "require-directory": "^2.1.1",
2504 | "require-main-filename": "^2.0.0",
2505 | "set-blocking": "^2.0.0",
2506 | "string-width": "^3.0.0",
2507 | "which-module": "^2.0.0",
2508 | "y18n": "^4.0.0",
2509 | "yargs-parser": "^13.1.1"
2510 | }
2511 | },
2512 | "yargs-parser": {
2513 | "version": "13.1.1",
2514 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
2515 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
2516 | "dev": true,
2517 | "requires": {
2518 | "camelcase": "^5.0.0",
2519 | "decamelize": "^1.2.0"
2520 | }
2521 | }
2522 | }
2523 | }
2524 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "keybase-nacl",
3 | "version": "1.1.3",
4 | "description": "A small wrapper library to switch between C and JS NaCl depending on the install",
5 | "main": "lib/main.js",
6 | "scripts": {
7 | "test": "make test"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "github.com/keybase/node-nacl"
12 | },
13 | "keywords": [
14 | "NaCl",
15 | "libsodium"
16 | ],
17 | "author": "Maxwell Krohn",
18 | "license": "BSD-3-Clause",
19 | "bugs": {
20 | "url": "https://github.com/keybase/node-nacl/issues"
21 | },
22 | "homepage": "https://github.com/keybase/node-nacl",
23 | "devDependencies": {
24 | "browserify": "^16.2.3",
25 | "iced-coffee-script": "^108.0.11",
26 | "iced-test": "0.0.27",
27 | "icsify": "^0.7.0",
28 | "nyc": "^14.1.1"
29 | },
30 | "optionalDependences": {
31 | "sodium": "^3.0.2"
32 | },
33 | "dependencies": {
34 | "iced-runtime": "^1.0.2",
35 | "tweetnacl": "^0.13.1",
36 | "uint64be": "^1.0.1"
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/base.iced:
--------------------------------------------------------------------------------
1 |
2 | #================================================================
3 |
4 | exports.b2u = b2u = (b) -> new Uint8Array(b)
5 | exports.u2b = u2b = (u) -> Buffer.from u
6 |
7 | #================================================================
8 |
9 | #
10 | # @class Base
11 | #
12 | # Base class for Sodium and TweetNaCl implementations.
13 | #
14 | exports.Base = class Base
15 |
16 | #---------------
17 | #
18 | #
19 | # @param {Buffer} publicKey The public key for this instance.
20 | # @param {Buffer} secretKey The secret key for this instance.
21 | # @param {Object} lib The library implementations to use
22 | #
23 | constructor : ({@publicKey, @secretKey, @lib}) ->
24 |
25 | #---------------
26 | #
27 | # @method genFromSeed
28 | #
29 | # Generate an EdDSA keypair from a deterministic seed.
30 | #
31 | # @param {Buffer} seed The seed
32 | # @return {Object} Contained `publicKey`, `secretKey` buffers
33 | #
34 | #
35 | genFromSeed : ({seed}) ->
36 |
37 | # As of sodium@1.0.13, there is no wrapper for crypto_sign_seed_keypair,
38 | # so use TweetNaCl's for all.
39 | tmp = @lib.js.sign.keyPair.fromSeed b2u seed
40 |
41 | # Note that the tweetnacl library deals with Uint8Arrays,
42 | # and internally, we like node-style Buffers.
43 | @secretKey = u2b tmp.secretKey
44 | @publicKey = u2b tmp.publicKey
45 |
46 | return { @secretKey, @publicKey }
47 |
48 | #---------------------------
49 |
50 | genBoxPair : () ->
51 | tmp = @lib.js.box.keyPair()
52 | @secretKey = u2b(tmp.secretKey)
53 | @publicKey = u2b(tmp.publicKey)
54 | return({@secretKey, @publicKey})
55 |
56 | get_secret_key : () -> @secretKey
57 | get_public_key : () -> @publicKey
58 |
59 | #================================================================
60 |
--------------------------------------------------------------------------------
/src/main.iced:
--------------------------------------------------------------------------------
1 |
2 | nacl_js = require 'tweetnacl/nacl-fast'
3 | nacl_c = null
4 | {Sodium} = require './sodium'
5 | {TweetNaCl} = require './tweetnacl'
6 |
7 | try
8 | nacl_c = require("sodium").api
9 | catch e
10 | # noop
11 |
12 | #================================================================
13 |
14 | exports.sign =
15 | publicKeyLength : nacl_js.sign.publicKeyLength
16 | secretKeyLength : nacl_js.sign.secretKeyLength
17 | signatureLength : nacl_js.sign.signatureLength
18 | seedLength : nacl_js.sign.seedLength
19 |
20 | #================================================================
21 |
22 | #
23 | # alloc
24 | #
25 | # Allocate a new NaCl key wrapper object for the given keys.
26 | # Use compiled sodium code if possible, but if not, or if asked
27 | # to use JS, fall back to TweetNaCl
28 | #
29 | #
30 | # @param {Buffer} publicKey The public key for this instance.
31 | # @param {Buffer} secretKey The secret key for this instance.
32 | # @return {Base} The key wrapper object, a subclass of type `Base`
33 | #
34 | exports.alloc = ({publicKey, secretKey, force_js}) ->
35 | ret = if force_js or not nacl_c? then new TweetNaCl { publicKey, secretKey }
36 | else new Sodium { publicKey, secretKey }
37 |
38 | # pass the libraries through with the code
39 | ret.lib = {c : nacl_c, js : nacl_js }
40 |
41 | return ret
42 |
43 | #================================================================
44 |
--------------------------------------------------------------------------------
/src/sodium.iced:
--------------------------------------------------------------------------------
1 | {bufeq_secure} = require './util'
2 | {Base} = require './base'
3 |
4 | #================================================================
5 |
6 | #
7 | # @class Sodium
8 | #
9 | # A C-based implemenation using the libsodium library
10 | #
11 | exports.Sodium = class Sodium extends Base
12 |
13 | #------
14 |
15 | _detach : (sig) ->
16 | l = @lib.c.crypto_sign_BYTES
17 | { sig: sig[0...l], payload : sig[l...] }
18 |
19 | _pad : (x) -> Buffer.concat([Buffer.alloc(16), x])
20 | _unpad : (x) -> x[16...]
21 |
22 | #------
23 |
24 | #
25 | # @method verify
26 | #
27 | # Verify a signature, given a public key, the signature, and the payload
28 | # (if it's not alread attached).
29 | #
30 | # @param {Bool} detached If this is a detached signature or not.
31 | # @param {Buffer} payload The payload to verify. Optional, might be attached.
32 | # @param {Buffer} sig The signature to verify.
33 | # @return {List} error on a failure, or nil on success. On sucess,
34 | # also return the payload from the buffer.
35 | #
36 | verify : ({payload, sig, detached}) ->
37 | if detached and not payload?
38 | err = new Error "in detached mode, you must supply a payload"
39 | return [ err, null ]
40 | msg = if detached then Buffer.concat([sig, payload]) else sig
41 |
42 | r_payload = @lib.c.crypto_sign_open msg, @publicKey
43 |
44 | if not r_payload?
45 | err = new Error "Signature failed to verify"
46 | else if detached then # noop
47 | else if not payload? then payload = r_payload
48 | else if not bufeq_secure r_payload, payload
49 | err = new Error "got unexpected payload"
50 | if err? then payload = null
51 | return [ err, payload ]
52 |
53 | #
54 | # @method sign
55 | #
56 | # Generate a signature
57 | #
58 | # @param {Buffer} payload The message to sign
59 | # @param {Boolean} detached Whether this is a detached message or not
60 | #
61 | sign : ({detached, payload}) ->
62 | sig = @lib.c.crypto_sign payload, @secretKey
63 | if detached then @_detach(sig).sig else sig
64 |
65 | #
66 | # @method encrypt
67 | # Encrypt a given plaintext
68 | # @param {Buffer} plaintext The plaintext to encrypt
69 | # @param {Buffer} nonce The nonce
70 | # @param {Buffer} pubkey The public key to encrypt for
71 | # @return {Buffer} The encrypted plaintext
72 | encrypt : ({plaintext, nonce, pubkey}) ->
73 | return @_unpad(@lib.c.crypto_box(plaintext, nonce, pubkey, @secretKey))
74 |
75 | #
76 | # @method secretbox
77 | # Secretbox a given plaintext
78 | # @param {Buffer} plaintext The plaintext to encrypt
79 | # @param {Buffer} nonce The nonce
80 | # @return {Buffer} The encrypted plaintext
81 | secretbox : ({plaintext, nonce}) ->
82 | return @_unpad(@lib.c.crypto_secretbox(plaintext, nonce, @secretKey))
83 |
84 | #
85 | # @method decrypt
86 | # @param {Buffer} ciphertext The ciphertext to decrypt
87 | # @param {Buffer} nonce The nonce
88 | # @param {Buffer} pubkey The public key that was used for encryption
89 | # @return {Buffer} The decrypted ciphertext
90 | decrypt : ({ciphertext, nonce, pubkey}) ->
91 | opened = @lib.c.crypto_box_open(@_pad(ciphertext), nonce, pubkey, @secretKey)
92 | if not opened then throw new Error('Sodium decrypt failed!')
93 | else return opened
94 |
95 | #
96 | # @method secretbox_open
97 | # Decrypt a given secretbox
98 | # @param {Buffer} ciphertext The ciphertext to decrypt
99 | # @param {Buffer} nonce The nonce
100 | # @return {Buffer} The decrypted ciphertext
101 | secretbox_open : ({ciphertext, nonce}) ->
102 | opened = @lib.c.crypto_secretbox_open(@_pad(ciphertext), nonce, @secretKey)
103 | if not opened then throw new Error('Sodium secretbox_open failed!')
104 | else return opened
105 |
106 | #
107 | # @method box_beforenm
108 | # Precopmute a shared secret
109 | # @param {Buffer} pubkey The public key to precompute with
110 | # @param {Buffer} seckey The secret key to precompute with
111 | # @return {Buffer} The precomputed shared secret key
112 | box_beforenm : ({pubkey, seckey}) ->
113 | return @lib.c.crypto_box_beforenm(pubkey, seckey)
114 |
115 | #
116 | # @method box_open_afternm
117 | # Precopmute a shared secret
118 | # @param {Buffer} ciphertext The ciphertext to decrypt
119 | # @param {Buffer} nonce The nonce
120 | # @param {Buffer} secret The precomputed secret
121 | # @return {Buffer} The decrypted ciphertext
122 | box_open_afternm : ({ciphertext, nonce, secret}) ->
123 | opened = @lib.c.crypto_box_open_afternm(@_pad(ciphertext), nonce, secret)
124 | if not opened then throw new Error('Sodium box_open_afternm failed!')
125 | else return opened
126 |
127 | #
128 | # @method scalarmult_base
129 | # Compute the scalar product of a standard group element G and
130 | # integer n on curve 25519. Returns resulting group element Q.
131 | # @param {Buffer} n Integer.
132 | # @return {Buffer} Resulting group element.
133 | scalarmult_base : (n) ->
134 | return Buffer.from @lib.c.crypto_scalarmult_base n
135 |
136 | #
137 | # @method scalarmult
138 | # Multiply a group element P by an integer n on curve 25519. Return
139 | # resulting group element Q.
140 | # @param {Buffer} n Integer.
141 | # @param {Buffer} P Group element.
142 | # @return {Buffer} Resulting group element.
143 | scalarmult : (n, P) ->
144 | return Buffer.from @lib.c.crypto_scalarmult n, P
145 |
146 | #================================================================
147 |
--------------------------------------------------------------------------------
/src/tweetnacl.iced:
--------------------------------------------------------------------------------
1 | {bufeq_secure} = require './util'
2 | {b2u,u2b,Base} = require './base'
3 |
4 | #================================================================
5 |
6 | #
7 | # @class TweetNaCl
8 | #
9 | # A pure-JS implemenation using the TweetNaCl library.
10 | #
11 | exports.TweetNaCl = class TweetNaCl extends Base
12 |
13 | #
14 | # @method verify
15 | #
16 | # Verify a signature, given a public key, the signature, and the payload
17 | # (if it's not alread attached).
18 | #
19 | # @param {Bool} detached If this is a detached signature or not.
20 | # @param {Buffer} payload The payload to verify. Optional, might be attached.
21 | # @param {Buffer} sig The signature to verify.
22 | # @return {List} error on a failure, or nil on success. On sucess,
23 | # also return the payload from the buffer.
24 | #
25 | verify : ({payload, sig, detached}) ->
26 | # "Attached" signatures in NaCl are just a concatenation of the signature
27 | # in front of the message.
28 | err = null
29 | if detached
30 | payload = Buffer.alloc(0) if not payload?
31 | if not @lib.js.sign.detached.verify b2u(payload), b2u(sig), b2u(@publicKey)
32 | err = new Error "Signature failed to verify"
33 | else if not (r_payload = @lib.js.sign.open b2u(sig), b2u(@publicKey))?
34 | err = new Error "signature didn't verify"
35 | else if not (r_payload = u2b r_payload)?
36 | err = new Error "failed to convert from a Uint8Array to a buffer"
37 | else if payload? and not bufeq_secure(r_payload, payload)
38 | err = new Error "got unexpected payload"
39 | else
40 | payload = r_payload
41 | if err? then payload = null
42 | return [ err, payload ]
43 |
44 | #
45 | # @method sign
46 | #
47 | # Generate a signature for the given payload, either attached or
48 | # unattached
49 | #
50 | # @param {Bool} detached If this is a detached signature or not.
51 | # @param {Buffer} payload The payload to sign
52 | # @return {Buffer} The signature
53 | #
54 | sign : ({payload, detached}) ->
55 | f = if detached then @lib.js.sign.detached else @lib.js.sign
56 | u2b(f(b2u(payload), b2u(@secretKey)))
57 |
58 | #
59 | # @method encrypt
60 | # Encrypt a given plaintext
61 | # @param {Buffer} plaintext The plaintext to encrypt
62 | # @param {Buffer} nonce The nonce
63 | # @param {Buffer} pubkey The public key to encrypt for
64 | # @return {Buffer} The encrypted plaintext
65 | encrypt : ({plaintext, nonce, pubkey}) ->
66 | return u2b(@lib.js.box(plaintext, nonce, pubkey, @secretKey))
67 |
68 | #
69 | # @method secretbox
70 | # Secretbox a given plaintext
71 | # @param {Buffer} plaintext The plaintext to encrypt
72 | # @param {Buffer} nonce The nonce
73 | # @return {Buffer} The encrypted plaintext
74 | secretbox : ({plaintext, nonce}) ->
75 | return u2b(@lib.js.secretbox(plaintext, nonce, @secretKey))
76 |
77 | #
78 | # @method decrypt
79 | #
80 | # @param {Buffer} ciphertext The ciphertext to decrypt
81 | # @param {Buffer} nonce The nonce
82 | # @param {Buffer} pubkey The public key that was used for encryption
83 | # @return {Buffer} The decrypted ciphertext
84 | decrypt : ({ciphertext, nonce, pubkey}) ->
85 | opened = @lib.js.box.open(b2u(ciphertext), nonce, pubkey, @secretKey)
86 | if not opened then throw new Error('TweetNaCl box_open failed!')
87 | else return u2b(opened)
88 |
89 | #
90 | # @method secretbox_open
91 | # Decrypt a given secretbox
92 | # @param {Buffer} ciphertext The ciphertext to decrypt
93 | # @param {Buffer} nonce The nonce
94 | # @return {Buffer} The decrypted ciphertext
95 | secretbox_open : ({ciphertext, nonce}) ->
96 | opened = @lib.js.secretbox.open(b2u(ciphertext), nonce, @secretKey)
97 | if not opened then throw new Error('TweetNaCl secretbox_open failed!')
98 | else return u2b(opened)
99 |
100 | #
101 | # @method box_beforenm
102 | # Precopmute a shared secret
103 | # @param {Buffer} pubkey The public key to precompute with
104 | # @param {Buffer} seckey The secret key to precompute with
105 | # @return {Buffer} The precomputed shared secret key
106 | box_beforenm : ({pubkey, seckey}) ->
107 | return u2b(@lib.js.box.before(pubkey, seckey))
108 |
109 | #
110 | # @method box_open_afternm
111 | # Precopmute a shared secret
112 | # @param {Buffer} ciphertext The ciphertext to decrypt
113 | # @param {Buffer} nonce The nonce
114 | # @param {Buffer} secret The precomputed secret
115 | # @return {Buffer} The decrypted ciphertext
116 | box_open_afternm : ({ciphertext, nonce, secret}) ->
117 | opened = @lib.js.box.open.after(b2u(ciphertext), nonce, secret)
118 | if not opened then throw new Error('TweetNaCl box_open_afternm failed!')
119 | else return u2b(opened)
120 |
121 | #
122 | # @method scalarmult_base
123 | # Compute the scalar product of a standard group element G and
124 | # integer n on curve 25519. Returns resulting group element Q.
125 | # @param {Buffer} n Integer.
126 | # @return {Buffer} Resulting group element.
127 | scalarmult_base : (n) ->
128 | return Buffer.from @lib.js.scalarMult.base n
129 |
130 | #
131 | # @method scalarmult
132 | # Multiply a group element P by an integer n on curve 25519. Return
133 | # resulting group element Q.
134 | # @param {Buffer} n Integer.
135 | # @param {Buffer} P Group element.
136 | # @return {Buffer} Resulting group element.
137 | scalarmult : (n, P) ->
138 | return Buffer.from @lib.js.scalarMult n, P
139 |
140 | #================================================================
141 |
--------------------------------------------------------------------------------
/src/util.iced:
--------------------------------------------------------------------------------
1 |
2 | #---------------------------------------------------------
3 | # Constant-time buffer comparison
4 | #
5 | exports.bufeq_secure = (x,y) ->
6 | ret = if not x? and not y? then true
7 | else if not x? or not y? then false
8 | else if x.length isnt y.length then false
9 | else
10 | check = 0
11 | for i in [0...x.length]
12 | check |= (x.readUInt8(i) ^ y.readUInt8(i))
13 | (check is 0)
14 | return ret
15 |
--------------------------------------------------------------------------------
/test/browser/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Libkeybase In-Browser Testing Page
5 |
6 |
7 |
8 |
9 | RC:
10 | ??
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/test/browser/main.iced:
--------------------------------------------------------------------------------
1 |
2 | mods =
3 | sigs : require '../files/0_sigs.iced'
4 | encrypt : require '../files/1_encrypt.iced'
5 | scalarmult : require '../files/2_scalarmult.iced'
6 |
7 | {BrowserRunner} = require('iced-test')
8 |
9 | window.onload = () ->
10 | br = new BrowserRunner { log : "log", rc : "rc" }
11 | await br.run mods, defer rc
12 |
--------------------------------------------------------------------------------
/test/files/0_sigs.iced:
--------------------------------------------------------------------------------
1 |
2 | main = require '../../'
3 | {rng} = require 'crypto'
4 |
5 | tweak = (x, pos) ->
6 | pos or= 0
7 | x[pos] ^= 0x1
8 |
9 | msg = new Buffer """The vision of a rock where lightnings whirl'd
10 | Bruising the darkness with their carkling light ;""", "utf8"
11 |
12 | test = (T,detached,signer,verifier,cb) ->
13 | sig = signer.sign { payload: msg, detached }
14 | [err, payload] = verifier.verify { payload : msg, detached, sig }
15 | T.no_error err
16 | tweak msg
17 | [err, payload] = verifier.verify { payload : msg, detached, sig }
18 | T.assert err?, "bad payload"
19 | T.assert not payload?, "no payload came back"
20 | tweak msg
21 | tweak signer.publicKey
22 | [err, payload] = verifier.verify { payload : msg, detached, sig }
23 | T.assert err?, "bad key"
24 | T.assert not payload?, "no payload came back"
25 | tweak signer.publicKey
26 | tweak sig
27 | [err, payload] = verifier.verify { payload : msg, detached, sig }
28 | T.assert err?, "bad sig"
29 | T.assert not payload?, "no payload came back"
30 | if not detached?
31 | tweak sig
32 | tweak sig, main.sign.signatureLength + 3
33 | [err, payload] = verifier.verify { payload : msg, detached, sig }
34 | T.assert err?, "bad sig"
35 | T.assert not payload?, "no payload came back"
36 | cb()
37 |
38 | test_both = (T,sign,verify,cb) ->
39 | await test T, true, sign, verify, defer()
40 | await test T, false, sign, verify, defer()
41 | cb()
42 |
43 | exports.test_sodium_sodium = (T, cb) ->
44 | sodium = main.alloc { force_js : false }
45 | sodium.genFromSeed { seed : rng(main.sign.seedLength) }
46 | await test_both T, sodium, sodium, defer err
47 | cb err
48 |
49 | exports.test_sodium_tweetnacl = (T, cb) ->
50 | sodium = main.alloc { force_js : false }
51 | sodium.genFromSeed { seed : rng(main.sign.seedLength) }
52 | tweetnacl = main.alloc { force_js : true, publicKey : sodium.publicKey, secretKey : sodium.secretKey }
53 | await test_both T, sodium, tweetnacl, defer err
54 | cb err
55 |
56 | exports.test_tweetnacl_tweetnacl = (T, cb) ->
57 | tweetnacl = main.alloc { force_js : true }
58 | tweetnacl.genFromSeed { seed : rng(main.sign.seedLength) }
59 | await test_both T, tweetnacl, tweetnacl, defer err
60 | cb err
61 |
62 | exports.test_tweetnacl_sodium = (T, cb) ->
63 | sodium = main.alloc { force_js : false }
64 | sodium.genFromSeed { seed : rng(main.sign.seedLength) }
65 | tweetnacl = main.alloc { force_js : true, publicKey : sodium.publicKey, secretKey : sodium.secretKey }
66 | await test_both T, tweetnacl, sodium, defer err
67 | cb err
68 |
69 |
--------------------------------------------------------------------------------
/test/files/1_encrypt.iced:
--------------------------------------------------------------------------------
1 | crypto = require('crypto')
2 | prng = crypto.prng
3 | main = require('../..')
4 | util = require('../../lib/util.js')
5 |
6 | msg = Buffer.from("")
7 | for i in [0..1024**2] by 65535
8 | msg = Buffer.concat([msg, prng(65535)])
9 |
10 | test_encrypt_decrypt = (T, encryptor, decryptor, nonce, cb) ->
11 | ciphertext = encryptor.encrypt({plaintext : msg, nonce, pubkey : decryptor.publicKey})
12 | plaintext = decryptor.decrypt({ciphertext : ciphertext, nonce, pubkey : encryptor.publicKey})
13 | T.assert(util.bufeq_secure(msg, plaintext)?, "inconsistency detected: msg=#{msg}, ciphertext=#{ciphertext}, plaintext=#{plaintext}")
14 | cb()
15 |
16 | test_encrypt_encrypt = (T, tweetnacl, sodium, nonce, recipient, cb) ->
17 | twncl_ctext = tweetnacl.encrypt({plaintext : msg, nonce, pubkey : recipient.publicKey})
18 | sodium_ctext = sodium.encrypt({plaintext : msg, nonce, pubkey : recipient.publicKey})
19 | T.assert(util.bufeq_secure(twncl_ctext, sodium_ctext)?, "ciphertexts differ: tweetnacl=#{twncl_ctext}, sodium=#{sodium_ctext}")
20 | cb()
21 |
22 | test_sbox_open = (T, encryptor, decryptor, nonce, cb) ->
23 | ciphertext = encryptor.secretbox({plaintext : msg, nonce})
24 | plaintext = decryptor.secretbox_open({ciphertext, nonce})
25 | T.assert(util.bufeq_secure(msg, plaintext)?, "inconsistency detected: msg=#{msg}, ciphertext=#{ciphertext}, plaintext=#{plaintext}")
26 | cb()
27 |
28 | test_precompute = (T, encryptor, decryptor, nonce, cb) ->
29 | secret = encryptor.box_beforenm({pubkey : decryptor.publicKey, seckey : encryptor.secretKey})
30 | ciphertext = encryptor.encrypt({plaintext : msg, nonce, pubkey : decryptor.publicKey})
31 | plaintext = decryptor.box_open_afternm({ciphertext, nonce, secret})
32 | T.assert(util.bufeq_secure(msg, plaintext)?, "inconsistency detected: msg=#{msg}, ciphertext=#{ciphertext}, plaintext=#{plaintext}")
33 | cb()
34 |
35 | #===============================================================================
36 |
37 | exports.test_tweetnacl_consistency = (T, cb) ->
38 | tweetnacl = main.alloc({force_js : true})
39 | tweetnacl.genBoxPair()
40 | await test_encrypt_decrypt(T, tweetnacl, tweetnacl, prng(24), defer())
41 | cb()
42 |
43 | exports.test_libsodium_consistency = (T, cb) ->
44 | sodium = main.alloc({force_js : false})
45 | sodium.genBoxPair()
46 | await test_encrypt_decrypt(T, sodium, sodium, prng(24), defer())
47 | cb()
48 |
49 | exports.test_cross_consistency = (T, cb) ->
50 | sodium = main.alloc({force_js : false})
51 | sodium.genBoxPair()
52 | tweetnacl = main.alloc({force_js : true})
53 | tweetnacl.genBoxPair()
54 | await test_encrypt_decrypt(T, sodium, tweetnacl, prng(24), defer())
55 | await test_encrypt_decrypt(T, tweetnacl, sodium, prng(24), defer())
56 | cb()
57 |
58 | exports.test_ciphertext_output = (T, cb) ->
59 | tweetnacl = main.alloc({force_js : true})
60 | tweetnacl.genBoxPair()
61 | sodium = main.alloc({force_js : false})
62 | sodium.secretKey = tweetnacl.secretKey
63 | sodium.publicKey = tweetnacl.publicKey
64 | recipient = main.alloc({force_js : true})
65 | recipient.genBoxPair()
66 | await test_encrypt_encrypt(T, tweetnacl, sodium, prng(24), recipient, defer())
67 | cb()
68 |
69 | exports.test_secretbox = (T, cb) ->
70 | tweetnacl = main.alloc({force_js : true})
71 | tweetnacl.genBoxPair()
72 | sodium = main.alloc({force_js : false})
73 | sodium.secretKey = tweetnacl.secretKey
74 | await test_sbox_open(T, tweetnacl, tweetnacl, prng(24), defer())
75 | await test_sbox_open(T, sodium, sodium, prng(24), defer())
76 | await test_sbox_open(T, tweetnacl, sodium, prng(24), defer())
77 | await test_sbox_open(T, sodium, tweetnacl, prng(24), defer())
78 | cb()
79 |
80 | exports.test_before_after = (T, cb) ->
81 | tweetnacl = main.alloc({force_js : true})
82 | tweetnacl.genBoxPair()
83 | sodium = main.alloc({force_js : false})
84 | sodium.secretKey = tweetnacl.secretKey
85 | sodium.publicKey = tweetnacl.publicKey
86 | await test_precompute(T, tweetnacl, tweetnacl, prng(24), defer())
87 | await test_precompute(T, sodium, sodium, prng(24), defer())
88 | await test_precompute(T, tweetnacl, sodium, prng(24), defer())
89 | await test_precompute(T, sodium, tweetnacl, prng(24), defer())
90 | cb()
91 |
--------------------------------------------------------------------------------
/test/files/2_scalarmult.iced:
--------------------------------------------------------------------------------
1 | crypto = require('crypto')
2 | prng = crypto.prng
3 | main = require('../..')
4 | util = require('../../lib/util.js')
5 |
6 | test_scalarmult_ecdh = (T, nacl_priv, nacl_pub, cb) ->
7 | x = prng(32) # priv key
8 | R = nacl_priv.scalarmult_base(x) # pub key
9 |
10 | v = prng(32)
11 | V = nacl_pub.scalarmult_base(v)
12 | S = nacl_pub.scalarmult(v, R)
13 |
14 | S2 = nacl_priv.scalarmult(x, V)
15 |
16 | T.assert(not util.bufeq_secure(x, v), "x == v, prng failure?")
17 | T.assert(not util.bufeq_secure(R, V), "R == V, same G*x for different x")
18 | T.assert(util.bufeq_secure(S, S2), "S != S2 after ecdh routine")
19 | cb()
20 |
21 | exports.test_tweetnacl_ecdh = (T, cb) ->
22 | tweetnacl = main.alloc({force_js : true})
23 | test_scalarmult_ecdh T, tweetnacl, tweetnacl, cb
24 |
25 | exports.test_sodium_ecdh = (T, cb) ->
26 | sodium = main.alloc({force_js : false})
27 | test_scalarmult_ecdh T, sodium, sodium, cb
28 |
29 | exports.test_cross_ecdh = (T, cb) ->
30 | tweetnacl = main.alloc({force_js : true})
31 | sodium = main.alloc({force_js : false})
32 | await test_scalarmult_ecdh T, tweetnacl, sodium, defer()
33 | await test_scalarmult_ecdh T, sodium, tweetnacl, defer()
34 | cb()
35 |
36 |
--------------------------------------------------------------------------------
/test/run.iced:
--------------------------------------------------------------------------------
1 | require('iced-test').main { mainfile : __filename }
2 |
--------------------------------------------------------------------------------