├── .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 | --------------------------------------------------------------------------------