pax_global_header00006660000000000000000000000064136302407120014510gustar00rootroot0000000000000052 comment=157c4856e741a3b4fefc4f5f27db3bae345bd133 keyto-2.0.0-alpha1/000077500000000000000000000000001363024071200140065ustar00rootroot00000000000000keyto-2.0.0-alpha1/.editorconfig000066400000000000000000000004161363024071200164640ustar00rootroot00000000000000# top-most EditorConfig file root = true # Unix-style newlines with a newline ending every file and trim whitespace [*] end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true [*.{js,json,yml}] charset = utf-8 indent_style = space indent_size = 2 keyto-2.0.0-alpha1/.gitignore000066400000000000000000000016011363024071200157740ustar00rootroot00000000000000# Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* # Runtime data pids *.pid *.seed *.pid.lock # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage # nyc test coverage .nyc_output # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) bower_components # node-waf configuration .lock-wscript # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules/ jspm_packages/ # Typescript v1 declaration files typings/ # Optional npm cache directory .npm # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history # Output of 'npm pack' *.tgz # Yarn Integrity file .yarn-integrity # dotenv environment variables file .env # JSDOC docs keyto-2.0.0-alpha1/.travis.yml000066400000000000000000000002451363024071200161200ustar00rootroot00000000000000sudo: false language: node_js node_js: "6.11.2" before_install: npm i -g npm install: npm i script: npm run coverage after_script: ./node_modules/.bin/codecov keyto-2.0.0-alpha1/LICENSE000066400000000000000000000020571363024071200150170ustar00rootroot00000000000000MIT License Copyright (c) 2017 Greg Linklater Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. keyto-2.0.0-alpha1/README.md000066400000000000000000000102171363024071200152660ustar00rootroot00000000000000# Keyto _(@trust/keyto)_ [![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) [![Build Status](https://travis-ci.org/EternalDeiwos/keyto.svg?branch=master)](https://travis-ci.org/EternalDeiwos/keyto) [![codecov](https://codecov.io/gh/EternalDeiwos/keyto/branch/master/graph/badge.svg)](https://codecov.io/gh/EternalDeiwos/keyto) > A utility for translating cryptographic keys between representations. Keyto is pronounced 'key-to'. Full project documentation is available [here](https://eternaldeiwos.github.io/keyto). ## Table of Contents - [Status](#status) - [Install](#install) - [Usage](#usage) - [API](#api) - [Maintainers](#maintainers) - [Contribute](#contribute) - [License](#license) ## Status ### RSA - [x] PKCS1 - [x] PKCS8 - [x] JWK ### ECDSA - secp256k1 (Blockchain Curve) - [x] PKCS1 (Private Only) - [x] PKCS8 - [x] JWK - [x] BLK (Private Key Hex String) ### ECDSA - secp256r1 (P-256) - [x] PKCS1 (Private Only) - [x] PKCS8 - [x] JWK ### ECDSA - secp384r1 (P-384) - [x] PKCS1 (Private Only) - [x] PKCS8 - [x] JWK ### ECDSA - secp521r1 (P-521) - [x] PKCS1 (Private Only) - [x] PKCS8 - [x] JWK ### EDDSA - ed25519 - [x] PKCS8 - [x] JWK ### EDDSA - ed448 - [ ] PKCS8 - [ ] JWK ## Install ```bash $ npm install @trust/keyto --save ``` ## Usage Translate Private PEM to Public JWK: ```js const keyto = require('@trust/keyto') let pemPrivate = getPrivatePemStringSomehow() let jwk = getPublicJwkSomehow() // String data can either be passed in directly: let key = keyto.from(pemPrivate, 'pem').toJwk('public') // Or can be passed in as an object instead: let key = keyto.from({ key: pemPrivate }, 'pem').toJwk('public') assertEqual(jwk, key) ``` Translate Private Hex (Blockchain) Key to PKCS8 Public PEM: ```js const keyto = require('@trust/keyto') let blk = getPrivateBlockchainHexStringSomehow() let pemPublic = getPublicPemSomehow() let key = keyto.from(blk, 'blk').toString('pem', 'public_pkcs8') assertEqual(pemPublic, key) ``` ## API ### keyto.from(key, format) -> {Key} **args**: * key := (String|JWK) * format := String **format**: Format can be any of these: 'pem', 'jwk' or 'blk'. * format = pem: will parse a PEM encoded string (as per OpenSSL output). * format = jwk: will parse a JWK object or JSON String * format = blk: will parse a hex encoded key string as used on various blockchains (limited to secp256k1 keys). ### {Key}.toJwk(selector = 'public') -> {JWK} **args**: * selector := String **selector**: Selector can be any of these: 'public', 'private'. * selector := public: will produce a public JWK. * selector := private: will produce a private JWK. ### {Key}.toString(format = 'pem', selector = 'public') -> {String} **args**: * format := String * selector := String **format**: Format can be any of these: 'pem', 'jwk' or 'blk'. * format = pem: will produce a PEM encoded string (as per OpenSSL output). * format = jwk: will produce a stringified JWK. * format = blk: will produce a hex encoded key string as used on various blockchains (limited to secp256k1 keys). **selector**: Selector can be any of these: 'public', 'private', 'public_pkcs1', 'public_pkcs8', 'private_pkcs1' or 'private_pkcs8'. * selector = public: will produce a public key. * selector = private: will produce a private key. * selector = public_pkcs1: will produce a public key according to the PKCS1 ASN Schema. Only relevant to DER related encodings. * selector = public_pkcs8: will produce a public key according to the PKCS8 ASN Schema. Only relevant to DER related encodings. * selector = private_pkcs1: will produce a private key according to the PKCS1 ASN Schema. Only relevant to DER related encodings. * selector = private_pkcs8: will produce a private key according to the PKCS8 ASN Schema. Only relevant to DER related encodings. ## Maintainers [@EternalDeiwos](https://github.com/EternalDeiwos) [@thelunararmy](https://github.com/thelunararmy) ## Contribute PRs accepted. Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. ## License MIT © 2017-2020 Greg Linklater keyto-2.0.0-alpha1/jsdoc.json000066400000000000000000000002661363024071200160070ustar00rootroot00000000000000{ "source": { "include": [ "./src" ] }, "opts": { "destination": "./docs/build", "readme": "./README.md" }, "plugins": [ "plugins/markdown" ] } keyto-2.0.0-alpha1/package-lock.json000066400000000000000000002202421363024071200172240ustar00rootroot00000000000000{ "name": "@trust/keyto", "version": "2.0.0-alpha1", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/generator": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { "@babel/types": "^7.4.4", "jsesc": "^2.5.1", "lodash": "^4.17.11", "source-map": "^0.5.0", "trim-right": "^1.0.1" } }, "@babel/helper-function-name": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.0.0", "@babel/template": "^7.1.0", "@babel/types": "^7.0.0" } }, "@babel/helper-get-function-arity": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@babel/helper-split-export-declaration": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, "requires": { "@babel/types": "^7.4.4" } }, "@babel/highlight": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", "dev": true }, "@babel/template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.4.4", "@babel/types": "^7.4.4" } }, "@babel/traverse": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/generator": "^7.4.4", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", "@babel/parser": "^7.4.4", "@babel/types": "^7.4.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.11" }, "dependencies": { "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } }, "@babel/types": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.11", "to-fast-properties": "^2.0.0" } }, "@tootallnate/once": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", "dev": true }, "agent-base": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", "dev": true, "requires": { "debug": "4" }, "dependencies": { "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "append-transform": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { "default-require-extensions": "^2.0.0" } }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "argv": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", "dev": true }, "asn1.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.2.0.tgz", "integrity": "sha512-Q7hnYGGNYbcmGrCPulXfkEw7oW7qjWeM4ZTALmgpuIcZLxyqqKYWxCZg2UBm8bklrnB4m2mGyJPWfoktdORD8A==", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "base64url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" }, "bluebird": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", "dev": true }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "caching-transform": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", "dev": true, "requires": { "hasha": "^3.0.0", "make-dir": "^2.0.0", "package-hash": "^3.0.0", "write-file-atomic": "^2.4.2" } }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "catharsis": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", "dev": true, "requires": { "lodash": "^4.17.14" } }, "chai": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { "assertion-error": "^1.0.1", "check-error": "^1.0.1", "deep-eql": "^3.0.0", "get-func-name": "^2.0.0", "pathval": "^1.0.0", "type-detect": "^4.0.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, "codecov": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.6.5.tgz", "integrity": "sha512-v48WuDMUug6JXwmmfsMzhCHRnhUf8O3duqXvltaYJKrO1OekZWpB/eH6iIoaxMl8Qli0+u3OxptdsBOYiD7VAQ==", "dev": true, "requires": { "argv": "0.0.2", "ignore-walk": "3.0.3", "js-yaml": "3.13.1", "teeny-request": "6.0.1", "urlgrey": "0.4.4" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { "safe-buffer": "~5.1.1" } }, "cp-file": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", "dev": true, "requires": { "graceful-fs": "^4.1.2", "make-dir": "^2.0.0", "nested-error-stacks": "^2.0.0", "pify": "^4.0.1", "safe-buffer": "^5.0.1" } }, "cross-spawn": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" } }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { "type-detect": "^4.0.0" } }, "default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { "strip-bom": "^3.0.0" } }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "elliptic": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" } }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" }, "dependencies": { "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } } } }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" } }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { "cross-spawn": "^4", "signal-exit": "^3.0.0" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" } }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "handlebars": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", "dev": true, "requires": { "neo-async": "^2.6.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "hasha": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", "dev": true, "requires": { "is-stream": "^1.0.1" } }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, "http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { "@tootallnate/once": "1", "agent-base": "6", "debug": "4" }, "dependencies": { "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "https-proxy-agent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "requires": { "agent-base": "5", "debug": "4" }, "dependencies": { "agent-base": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", "dev": true }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "ignore-walk": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "requires": { "minimatch": "^3.0.4" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "istanbul-lib-coverage": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true }, "istanbul-lib-hook": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", "dev": true, "requires": { "append-transform": "^1.0.0" } }, "istanbul-lib-instrument": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { "@babel/generator": "^7.4.0", "@babel/parser": "^7.4.3", "@babel/template": "^7.4.0", "@babel/traverse": "^7.4.3", "@babel/types": "^7.4.0", "istanbul-lib-coverage": "^2.0.5", "semver": "^6.0.0" }, "dependencies": { "semver": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", "dev": true } } }, "istanbul-lib-report": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "requires": { "istanbul-lib-coverage": "^2.0.5", "make-dir": "^2.1.0", "supports-color": "^6.1.0" }, "dependencies": { "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "istanbul-lib-source-maps": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^2.0.5", "make-dir": "^2.1.0", "rimraf": "^2.6.3", "source-map": "^0.6.1" }, "dependencies": { "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "istanbul-reports": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", "dev": true, "requires": { "handlebars": "^4.1.2" } }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "js2xmlparser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.0.tgz", "integrity": "sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==", "dev": true, "requires": { "xmlcreate": "^2.0.0" } }, "jsdoc": { "version": "3.6.3", "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.3.tgz", "integrity": "sha512-Yf1ZKA3r9nvtMWHO1kEuMZTlHOF8uoQ0vyo5eH7SQy5YeIiHM+B0DgKnn+X6y6KDYZcF7G2SPkKF+JORCXWE/A==", "dev": true, "requires": { "@babel/parser": "^7.4.4", "bluebird": "^3.5.4", "catharsis": "^0.8.11", "escape-string-regexp": "^2.0.0", "js2xmlparser": "^4.0.0", "klaw": "^3.0.0", "markdown-it": "^8.4.2", "markdown-it-anchor": "^5.0.2", "marked": "^0.7.0", "mkdirp": "^0.5.1", "requizzle": "^0.2.3", "strip-json-comments": "^3.0.1", "taffydb": "2.6.2", "underscore": "~1.9.1" }, "dependencies": { "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "klaw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", "dev": true, "requires": { "graceful-fs": "^4.1.9" } }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "^2.0.0" } }, "linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "dev": true, "requires": { "uc.micro": "^1.0.1" } }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "dependencies": { "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { "pify": "^4.0.1", "semver": "^5.6.0" } }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" } }, "markdown-it": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", "dev": true, "requires": { "argparse": "^1.0.7", "entities": "~1.1.1", "linkify-it": "^2.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" } }, "markdown-it-anchor": { "version": "5.2.5", "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.5.tgz", "integrity": "sha512-xLIjLQmtym3QpoY9llBgApknl7pxAcN3WDRc2d3rwpl+/YvDZHPmKscGs+L6E05xf2KrCXPBvosWt7MZukwSpQ==", "dev": true }, "marked": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", "dev": true }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, "mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" } }, "merge-source-map": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { "source-map": "^0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" } }, "mocha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, "requires": { "browser-stdout": "1.3.1", "commander": "2.15.1", "debug": "3.1.0", "diff": "3.5.0", "escape-string-regexp": "1.0.5", "glob": "7.1.2", "growl": "1.10.5", "he": "1.1.1", "minimatch": "3.0.4", "mkdirp": "0.5.1", "supports-color": "5.4.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, "nested-error-stacks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", "dev": true }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" } }, "nyc": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", "dev": true, "requires": { "archy": "^1.0.0", "caching-transform": "^3.0.2", "convert-source-map": "^1.6.0", "cp-file": "^6.2.0", "find-cache-dir": "^2.1.0", "find-up": "^3.0.0", "foreground-child": "^1.5.6", "glob": "^7.1.3", "istanbul-lib-coverage": "^2.0.5", "istanbul-lib-hook": "^2.0.7", "istanbul-lib-instrument": "^3.3.0", "istanbul-lib-report": "^2.0.8", "istanbul-lib-source-maps": "^3.0.6", "istanbul-reports": "^2.2.4", "js-yaml": "^3.13.1", "make-dir": "^2.1.0", "merge-source-map": "^1.1.0", "resolve-from": "^4.0.0", "rimraf": "^2.6.3", "signal-exit": "^3.0.2", "spawn-wrap": "^1.4.2", "test-exclude": "^5.2.3", "uuid": "^3.3.2", "yargs": "^13.2.2", "yargs-parser": "^13.0.0" }, "dependencies": { "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true } } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" } }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" } }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", "dev": true }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "package-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", "dev": true, "requires": { "graceful-fs": "^4.1.15", "hasha": "^3.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" }, "dependencies": { "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true } } }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { "pify": "^3.0.0" }, "dependencies": { "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { "find-up": "^3.0.0" } }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" } }, "read-pkg-up": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { "find-up": "^3.0.0", "read-pkg": "^3.0.0" } }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, "requires": { "es6-error": "^4.0.1" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "requizzle": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", "dev": true, "requires": { "lodash": "^4.17.14" } }, "resolve": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { "glob": "^7.1.3" }, "dependencies": { "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } } } }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "spawn-wrap": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", "dev": true, "requires": { "foreground-child": "^1.5.6", "mkdirp": "^0.5.0", "os-homedir": "^1.0.1", "rimraf": "^2.6.2", "signal-exit": "^3.0.2", "which": "^1.3.0" } }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", "dev": true, "requires": { "stubs": "^3.0.0" } }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" } }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-json-comments": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, "stubs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", "dev": true }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "taffydb": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", "dev": true }, "teeny-request": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.1.tgz", "integrity": "sha512-TAK0c9a00ELOqLrZ49cFxvPVogMUFaWY8dUsQc/0CuQPGF+BOxOQzXfE413BAk2kLomwNplvdtMpeaeGWmoc2g==", "dev": true, "requires": { "http-proxy-agent": "^4.0.0", "https-proxy-agent": "^4.0.0", "node-fetch": "^2.2.0", "stream-events": "^1.0.5", "uuid": "^3.3.2" } }, "test-exclude": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", "dev": true, "requires": { "glob": "^7.1.3", "minimatch": "^3.0.4", "read-pkg-up": "^4.0.0", "require-main-filename": "^2.0.0" }, "dependencies": { "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } } } }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, "type-detect": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.7.tgz", "integrity": "sha512-4Rh17pAMVdMWzktddFhISRnUnFIStObtUMNGzDwlA6w/77bmGv3aBbRdCmQR6IjzfkTo9otnW+2K/cDRhKSxDA==", "dev": true }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, "uglify-js": { "version": "3.6.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.9.tgz", "integrity": "sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw==", "dev": true, "optional": true, "requires": { "commander": "~2.20.3", "source-map": "~0.6.1" }, "dependencies": { "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "optional": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } } }, "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", "dev": true }, "urlgrey": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", "dev": true }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, "xmlcreate": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", "dev": true }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yargs": { "version": "13.2.4", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.0" } }, "yargs-parser": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } } keyto-2.0.0-alpha1/package.json000066400000000000000000000021051363024071200162720ustar00rootroot00000000000000{ "name": "@trust/keyto", "version": "2.0.0-alpha1", "description": "A utility for translating cryptographic keys between representations", "main": "src/index.js", "scripts": { "test": "nyc _mocha test", "jsdoc": "jsdoc -c jsdoc.json -r", "coverage": "nyc --reporter=lcov _mocha test" }, "repository": { "type": "git", "url": "git+https://github.com/EternalDeiwos/keyto.git" }, "keywords": [ "PEM", "JWK", "Webcrypto", "JOSE" ], "contributors": [ { "name": "Greg Linklater", "email": "greg@gryphus.io" }, { "name": "JC Bailey", "email": "jcbailey1991@gmail.com" } ], "license": "MIT", "bugs": { "url": "https://github.com/EternalDeiwos/keyto/issues" }, "homepage": "https://github.com/EternalDeiwos/keyto#readme", "devDependencies": { "chai": "^4.0.2", "codecov": "^3.0.2", "glob": "^7.1.2", "jsdoc": "^3.6.3", "mocha": "^5.2.0", "nyc": "^14.1.1" }, "dependencies": { "asn1.js": "^5.2.0", "base64url": "^3.0.1", "elliptic": "^6.5.2" } } keyto-2.0.0-alpha1/src/000077500000000000000000000000001363024071200145755ustar00rootroot00000000000000keyto-2.0.0-alpha1/src/Converter.js000066400000000000000000000045111363024071200171030ustar00rootroot00000000000000'use strict' /** * Dependencies * @ignore */ const asn = require('asn1.js') const base64url = require('base64url') /** * Converter * * @class Converter * * @description * Utility class to convert between different data representations */ class Converter { /** * convert * * @description * Convert between data types. Available data types: raw, uint8_array, hex, base64, base64url and (bn | bignum) * * @throws * If fromType is not one of: raw, uint8_array, hex, base64, base64url or (bn | bignum) * * @throws * If toType is not one of: raw, uint8_array, hex, base64, base64url or (bn | bignum) * * @param {(String|Array|Buffer|BigNumber)} data * @param {String} fromType * @param {String} toType * @return {String|BigNumber} */ static convert(data, fromType, toType) { if (!data) { return undefined } if (fromType === toType) { return data } let buffer if (fromType === 'raw' || data instanceof Buffer) { buffer = data } else if (fromType === 'uint8_array' || Array.isArray(data)) { buffer = Buffer.from(data) } else if (fromType === 'hex') { buffer = Buffer.from(data, 'hex') } else if (fromType === 'base64') { buffer = Buffer.from(data, 'base64') } else if (fromType === 'base64url') { buffer = base64url.toBuffer(data) } else if (fromType === 'bn' || fromType === 'bignum') { buffer = Buffer.from(this.pad(data.toString(16)), 'hex') } else { throw new Error('Invalid fromType') } if (toType === 'raw') { return buffer } else if (toType === 'uint8_array') { return Array.from(buffer) } else if (toType === 'hex') { return buffer.toString('hex') } else if (toType === 'base64') { return buffer.toString('base64') } else if (toType === 'base64url') { return base64url.fromBase64(buffer.toString('base64')) } else if (toType === 'bn' || toType === 'bignum') { return new asn.bignum(buffer) } else { throw new Error('Invalid toType') } } /** * pad * * @description * Pad a hex string for octet parsing * * @param {String} hex * @return {String} */ static pad (hex) { return hex.length % 2 === 1 ? `0${hex}` : hex } } /** * Export * @ignore */ module.exports = Converter keyto-2.0.0-alpha1/src/InvalidOperationError.js000066400000000000000000000010241363024071200214110ustar00rootroot00000000000000'use strict' /** * InvalidOperationError * @ignore */ class InvalidOperationError extends Error { /** * constructor * * @class InvalidOperationError * * @description * Thrown when an operation has not been implemented yet * * @throws "This operation is not supported for this key type" * * @return {InvalidOperationError} */ constructor (msg) { super(msg || 'This operation is not supported for this key type') } } /** * Export * @ignore */ module.exports = InvalidOperationError keyto-2.0.0-alpha1/src/OperationNotSupportedError.js000066400000000000000000000010021363024071200224650ustar00rootroot00000000000000'use strict' /** * OperationNotSupportedError * @ignore */ class OperationNotSupportedError extends Error { /** * constructor * * @class OperationNotSupportedError * * @description * Thrown when an operation has not been implemented yet * * @throws "This has not been implemented yet" * * @return {OperationNotSupportedError} */ constructor() { super(`This has not been implemented yet`) } } /** * Export * @ignore */ module.exports = OperationNotSupportedError keyto-2.0.0-alpha1/src/asn1/000077500000000000000000000000001363024071200154375ustar00rootroot00000000000000keyto-2.0.0-alpha1/src/asn1/AlgorithmIdentifier.js000066400000000000000000000002671363024071200217330ustar00rootroot00000000000000'use strict' module.exports = registry => { return function () { this.seq().obj( this.key('algorithm').objid(), this.key('parameters').optional().any() ) } } keyto-2.0.0-alpha1/src/asn1/ECPrivateKey.js000066400000000000000000000005021363024071200202650ustar00rootroot00000000000000'use strict' module.exports = registry => { return function () { this.seq().obj( this.key('version').int(), this.key('privateKey').octstr(), this.key('parameters').explicit(0).optional().choice({ namedCurve: this.objid() }), this.key('publicKey').explicit(1).optional().bitstr() ) } } keyto-2.0.0-alpha1/src/asn1/OtherPrimeInfos.js000066400000000000000000000002671363024071200210570ustar00rootroot00000000000000'use strict' module.exports = registry => { return function () { this.seq().obj( this.key('ri').int(), this.key('di').int(), this.key('ti').int() ) } } keyto-2.0.0-alpha1/src/asn1/PrivateKeyInfo.js000066400000000000000000000005351363024071200206770ustar00rootroot00000000000000'use strict' module.exports = registry => { let Version = registry.normalize('Version') let AlgorithmIdentifier = registry.normalize('AlgorithmIdentifier') return function () { this.seq().obj( this.key('version').use(Version), this.key('algorithm').use(AlgorithmIdentifier), this.key('privateKey').octstr() ) } } keyto-2.0.0-alpha1/src/asn1/PublicKeyInfo.js000066400000000000000000000004051363024071200204770ustar00rootroot00000000000000'use strict' module.exports = registry => { let AlgorithmIdentifier = registry.normalize('AlgorithmIdentifier') return function () { this.seq().obj( this.key('algorithm').use(AlgorithmIdentifier), this.key('publicKey').bitstr() ) } }keyto-2.0.0-alpha1/src/asn1/RSAPrivateKey.js000066400000000000000000000010141363024071200204220ustar00rootroot00000000000000'use strict' module.exports = registry => { let Version = registry.normalize('Version') let OtherPrimeInfos = registry.normalize('OtherPrimeInfos') return function () { this.seq().obj( this.key('version').use(Version), this.key('n').int(), this.key('e').int(), this.key('d').int(), this.key('p').int(), this.key('q').int(), this.key('dp').int(), this.key('dq').int(), this.key('qi').int(), this.key('other').optional().use(OtherPrimeInfos) ) } } keyto-2.0.0-alpha1/src/asn1/RSAPublicKey.js000066400000000000000000000002311363024071200202260ustar00rootroot00000000000000'use strict' module.exports = registry => { return function () { this.seq().obj( this.key('n').int(), this.key('e').int() ) } } keyto-2.0.0-alpha1/src/asn1/SupportedAsnTypes.js000066400000000000000000000011641363024071200214530ustar00rootroot00000000000000'use strict' /** * Dependencies * @ignore */ const asn = require('asn1.js') /** * SupportedAsnTypes * @ignore */ class SupportedAsnTypes { /** * constructor * * @class SupportedAsnTypes * * @description * A registry for supported asn complex field types */ constructor () { Object.defineProperty(this, '_registry', { value: {} }) } get registry () { return this._registry } define (name, fn) { this._registry[name] = asn.define(name, fn(this)) } normalize (name) { return this.registry[name] } } /** * Export * @ignore */ module.exports = SupportedAsnTypes keyto-2.0.0-alpha1/src/asn1/Version.js000066400000000000000000000002071363024071200174210ustar00rootroot00000000000000'use strict' module.exports = registry => { return function () { this.int({ 0: 'two-prime', 1: 'multi' }) } } keyto-2.0.0-alpha1/src/asn1/index.js000066400000000000000000000016511363024071200171070ustar00rootroot00000000000000'use strict' /** * Module Depdendencies * @ignore */ const SupportedAsnTypes = require('./SupportedAsnTypes') /** * supportedAsnTypes * @ignore */ const supportedAsnTypes = new SupportedAsnTypes() /** * General Types * @ignore */ supportedAsnTypes.define('Version', require('./Version')) supportedAsnTypes.define('OtherPrimeInfos', require('./OtherPrimeInfos')) supportedAsnTypes.define('AlgorithmIdentifier', require('./AlgorithmIdentifier')) supportedAsnTypes.define('PrivateKeyInfo', require('./PrivateKeyInfo')) supportedAsnTypes.define('PublicKeyInfo', require('./PublicKeyInfo')) /** * RSA Types * @ignore */ supportedAsnTypes.define('RSAPrivateKey', require('./RSAPrivateKey')) supportedAsnTypes.define('RSAPublicKey', require('./RSAPublicKey')) /** * ECDSA Types * @ignore */ supportedAsnTypes.define('ECPrivateKey', require('./ECPrivateKey')) /** * Export * @ignore */ module.exports = supportedAsnTypes keyto-2.0.0-alpha1/src/index.js000066400000000000000000000271361363024071200162530ustar00rootroot00000000000000'use strict' /** * Dependencies * @ignore */ /** * Module Dependencies * @ignore */ const InvalidOperationError = require('./InvalidOperationError') const OperationNotSupportedError = require('./OperationNotSupportedError') const types = require('./types') const asn = require('./asn1') const EOL = RegExp('\r?\n', 'g'); /** * JWK * * @typedef {Object} JWK * * @description * A JWK Object */ /** * SerializedFormat * * @typedef {String} SerializableFormat * * @description * Available formats: 'jwk', 'pem', 'blk'. */ /** * KeySelector * * @typedef {String} KeySelector * * @see SerializableFormat * @see BufferFormat * * @description * Available formats: 'public', 'private'. */ /** * PEMKeySelector * * @typedef {String} PEMKeySelector * * @see SerializableFormat * @see BufferFormat * * @description * Available formats: 'public_pkcs1', 'public_pkcs8', 'private_pkcs1', 'private_pkcs8'. * * Note these refer specifically to different ASN encodings for PEM encoded keys * and are not compatible with non-PEM output types. */ /** * Key * @ignore */ class Key { /** * constructor * * @class Key * * @internal For internal use only * * @description * A high level class for accepting and processing keys * * @throws {InvalidOperationError} If key is omitted * * @throws {InvalidOperationError} If required options are omitted * * @param {Object} key * @param {Object} options * @param {SerializableFormat} options.format * @param {String} options.kty - normalized key type name * @param {String} [options.crv] - normalized curve name (EC & ED only) * @param {String} [options.oid] - ASN oid algorithm descriptor * @param {(KeySelector|PEMKeySelector)} options.selector */ constructor (key, options) { if (!key) { throw new InvalidOperationError('key is required') } if (!options) { throw new InvalidOperationError('options are required') } let { kty, format, selector, crv, oid } = options if (!options.kty) { throw new InvalidOperationError('options.kty is required') } if (!options.format) { throw new InvalidOperationError('options.format is required') } if (!options.selector) { throw new InvalidOperationError('options.selector is required') } if (!options.crv && !options.oid) { throw new InvalidOperationError('options.crv or options.oid is required') } this.kty = kty this.format = format this.selector = selector this.crv = crv this.oid = oid this.key = this.parseKey(key) } /** * from * * @description * Import a key * * @example Decode PEM and convert to JWK * const keyto = require('@trust/keyto') * * let pemPrivate = getPrivatePemStringSomehow() * let jwk = getPublicJwkSomehow() * * // String data can either be passed in directly: * let key = keyto.from(pemPrivate, 'pem').toJwk('public') * * // Or can be passed in as an object instead: * let key = keyto.from({ key: pemPrivate }, 'pem').toJwk('public') * assertEqual(jwk, key) * * @example Decode HEX (Blockchain) private key and convert to PEM PKCS8 public key * const keyto = require('@trust/keyto') * * let blk = getPrivateBlockchainHexStringSomehow() * let pemPublic = getPublicPemSomehow() * * let key = keyto.from(blk, 'blk').toString('pem', 'public_pkcs8') * assertEqual(pemPublic, key) * * @throws {InvalidOperationError} * If key is omitted. * * @throws {InvalidOperationError} * If format is omitted. * * @param {(JWK|String)} key * @param {SerializableFormat} format * @return {Key} */ static from (key, format) { // Sanity checking if (!key) { throw new InvalidOperationError('key is required') } if (!format) { throw new InvalidOperationError('format is required') } // JWK if (format === 'jwk') { let jwk // Parse JSON if (typeof key === 'string') { try { jwk = JSON.parse(key) } catch (error) { throw new InvalidOperationError('key is not a valid JWK') } } else if (typeof key === 'object') { jwk = key } let { kty, crv } = jwk let oid // Required properties if (!kty) { throw new InvalidOperationError('kty is required for JWK') } if (kty === 'EC' && !crv) { throw new InvalidOperationError('crv is required for EC JWK') } if (kty === 'RSA') { oid = types.find(param => param.kty === kty).oid } // Key type let selector = jwk.d ? 'private' : 'public' return new Key(jwk, { kty, crv, oid, format, selector }) } // PEM if (format === 'pem') { if (typeof key !== 'string') { throw new InvalidOperationError('key is not a valid PEM string') } // Extract Base64 String let lines = key.split(EOL) let header = lines.splice(0, 1) lines.splice(lines.length - 1, 1) let base64pem = lines.join('') // Extract metadata from header let match = /^-----BEGIN ((RSA|EC) )?(PUBLIC|PRIVATE) KEY-----$/.exec(header) let oid, crv, kty = match ? match[2] : undefined let selector = match ? match[3] : undefined let pem = Buffer.from(base64pem, 'base64') if (!selector) { throw new InvalidOperationError('key is not a valid PEM string') } // PKCS8 if (!kty) { let PrivateKeyInfo = asn.normalize('PrivateKeyInfo') let PublicKeyInfo = asn.normalize('PublicKeyInfo') let decoded if (selector === 'PRIVATE') { selector = 'private_pkcs8' decoded = PrivateKeyInfo.decode(pem, 'der') } else if (selector === 'PUBLIC') { selector = 'public_pkcs8' decoded = PublicKeyInfo.decode(pem, 'der') } let { algorithm: { algorithm, parameters } } = decoded algorithm = algorithm.join('.') // parameters are optional parameters = parameters ? parameters.toString('hex') : undefined // kty might not exist const type = types.find(param => param.oid === algorithm) kty = type ? type.kty : undefined if (!kty) { throw new InvalidOperationError(`${algorithm} is not supported`) } if (kty === 'RSA' || kty === 'OKP') { oid = algorithm } else if (kty === 'EC') { crv = types.find(param => param.algParameters === parameters).crv } } else { // PKCS1 if (kty === 'RSA') { selector = selector === 'PRIVATE' ? 'private_pkcs1' : 'public_pkcs1' oid = types.find(param => param.kty === kty).oid } else if (kty === 'EC') { let decoded if (selector === 'PRIVATE') { let KeyType = asn.normalize(`${kty}PrivateKey`) selector = 'private_pkcs1' decoded = KeyType.decode(pem, 'der') } else if (selector === 'PUBLIC') { let KeyType = asn.normalize(`${kty}PrivateKey`) selector = 'public_pkcs1' decoded = KeyType.decode(pem, 'der') } let { parameters: { value } } = decoded crv = types.find(param => param.namedCurve === value.join('.')).crv } } return new Key(pem, { kty, oid, crv, format, selector }) } // BLK if (format === 'blk') { return new Key(key, { kty: 'EC', crv: 'secp256k1', format, selector: key.length > 64 ? 'public' : 'private' }) } throw new InvalidOperationError(`Invalid format ${format}`) } /** * alg * @ignore * * @internal For internal use only */ get alg () { let { kty, crv, oid } = this if (!this.algorithm) { if (crv) { Object.defineProperty(this, 'algorithm', { value: types.normalize(kty, 'crv', crv) }) } else if (oid) { Object.defineProperty(this, 'algorithm', { value: types.normalize(kty, 'oid', oid) }) } else { throw new Error('Both crv and oid are undefined') } if (!this.algorithm) { throw new Error(`${this.crv || this.oid} is not implemented yet`) } } return this.algorithm } /** * parseKey * @ignore * * @internal For internal use only */ parseKey (key) { let { alg, format, selector } = this // PEM if (format === 'pem') { switch (selector) { case 'public_pkcs1': return alg.fromPublicPKCS1(key) case 'public_pkcs8': return alg.fromPublicPKCS8(key) case 'private_pkcs1': return alg.fromPrivatePKCS1(key) case 'private_pkcs8': return alg.fromPrivatePKCS8(key) default: throw new Error('Invalid selector value') } } // JWK if (format === 'jwk') { return alg.fromJwk(key, selector) } // BLK if (format === 'blk') { switch (selector) { case 'public': return alg.fromPublicBlk(key) case 'private': return alg.fromPrivateBlk(key) } } } /** * toJwk * * @description * Convert a key to JWK. * * @param {KeySelector} selector * * @return {JWK} */ toJwk (selector) { let { key, alg, selector: type } = this switch (selector) { case 'public': return alg.toPublicJwk(key) case 'private': if (type.includes('public')) { throw new InvalidOperationError('Cannot export a private key from a public key') } return alg.toPrivateJwk(key) default: throw new Error('Invalid key selector') } throw new OperationNotSupportedError() } /** * toString * * @description * Serialize a key to the specified format * * @param {SerializableFormat} [format=pem] * @param {(KeySelector|PEMKeySelector)} [selector=public_pkcs8] * @return {String} */ toString (format = 'pem', selector = 'public_pkcs8') { let { key, alg, selector: type } = this // PEM if (format === 'pem') { switch (selector) { case 'public_pkcs1': return alg.toPublicPKCS1(key) case 'public_pkcs8': return alg.toPublicPKCS8(key) case 'private_pkcs1': if (type.includes('public')) { throw new InvalidOperationError('Cannot export a private key from a public key') } return alg.toPrivatePKCS1(key) case 'private_pkcs8': if (type.includes('public')) { throw new InvalidOperationError('Cannot export a private key from a public key') } return alg.toPrivatePKCS8(key) default: throw new Error('Invalid key selector') } } else if (format === 'jwk') { // JWK switch (selector) { case 'public': return JSON.stringify(alg.toPublicJwk(key)) case 'private': if (type.includes('public')) { throw new InvalidOperationError('Cannot export a private key from a public key') } return JSON.stringify(alg.toPrivateJwk(key)) default: throw new Error('Invalid key selector') } } else if (format === 'blk') { // BLK switch (selector) { case 'private': if (type.includes('public')) { throw new InvalidOperationError('Cannot export a private key from a public key') } return alg.toPrivateBlk(key) case 'public': return alg.toPublicBlk(key) default: throw new Error('Invalid key selector') } } throw new OperationNotSupportedError() } } /** * Export * @ignore */ module.exports = Key keyto-2.0.0-alpha1/src/types/000077500000000000000000000000001363024071200157415ustar00rootroot00000000000000keyto-2.0.0-alpha1/src/types/ECDSA.js000066400000000000000000000121351363024071200171200ustar00rootroot00000000000000'use strict' /** * Dependencies * @ignore */ const bignum = require('asn1.js').bignum const EC = require('elliptic').ec const ec = new EC('secp256k1') /** * Module Dependencies * @ignore */ const KeyType = require('./KeyType') const InvalidOperationError = require('../InvalidOperationError') const Converter = require('../Converter') const asn = require('../asn1') /** * ECDSA * @class ECDSA * * @extends {KeyType} * * @description * ECDSA conversion implementation */ class ECDSA extends KeyType { /** * IMPORT * @ignore */ fromPrivatePKCS1 (key) { let ECPrivateKey = asn.normalize('ECPrivateKey') let data = ECPrivateKey.decode(key, 'der') let { privateKey: d, publicKey: { data: publicKey } } = data let hexPoint = Converter.convert(publicKey, 'raw', 'hex') let { x, y } = ECDSA.getPoint(hexPoint) return { d, x, y } } fromPrivatePKCS8 (key) { let PrivateKeyInfo = asn.normalize('PrivateKeyInfo') let ECPrivateKey = asn.normalize('ECPrivateKey') let info = PrivateKeyInfo.decode(key, 'der') let data = ECPrivateKey.decode(info.privateKey, 'der') let { privateKey: d, publicKey: { data: publicKey } } = data let hexPoint = Converter.convert(publicKey, 'raw', 'hex') let { x, y } = ECDSA.getPoint(hexPoint) return { d, x, y } } fromPublicPKCS8 (key) { let PublicKeyInfo = asn.normalize('PublicKeyInfo') let info = PublicKeyInfo.decode(key, 'der') let hexPoint = Converter.convert(info.publicKey.data, 'raw', 'hex') return ECDSA.getPoint(hexPoint) } fromPrivateBlk (key) { let privateKey = ec.keyFromPrivate(key, 'hex') let publicKey = privateKey.getPublic() return { d: Converter.convert(privateKey.priv, 'bn', 'raw'), x: Converter.convert(publicKey.getX(), 'bn', 'raw'), y: Converter.convert(publicKey.getY(), 'bn', 'raw'), } } fromPublicBlk (key) { return ECDSA.getPoint(key) } fromJwk (key) { let { d, x, y } = key return { d: Converter.convert(d, 'base64url', 'raw'), x: Converter.convert(x, 'base64url', 'raw'), y: Converter.convert(y, 'base64url', 'raw'), } } /** * EXPORT * @ignore */ toPrivatePKCS1 (key) { let { namedCurve, keyVersion: version } = this.params let { d, x, y } = key let ECPrivateKey = asn.normalize('ECPrivateKey') let publicKey = ECDSA.makePoint(x, y) let base64pem = ECPrivateKey.encode({ version, privateKey: d, parameters: { type: 'namedCurve', value: namedCurve.split('.') }, publicKey: { unused: 0, data: publicKey } }, 'der').toString('base64') return ECDSA.formatPem(base64pem, 'EC PRIVATE') } toPrivatePKCS8 (key) { let { oid, algParameters, keyVersion: version, infoVersion } = this.params let { d, x, y } = key let PrivateKeyInfo = asn.normalize('PrivateKeyInfo') let ECPrivateKey = asn.normalize('ECPrivateKey') let publicKey = ECDSA.makePoint(x, y) let privateKey = ECPrivateKey.encode({ version, privateKey: d, publicKey: { unused: 0, data: publicKey } }, 'der') let base64pem = PrivateKeyInfo.encode({ version: infoVersion, algorithm: { algorithm: oid.split('.'), parameters: Buffer.from(algParameters, 'hex') }, privateKey }, 'der').toString('base64') return ECDSA.formatPem(base64pem, 'PRIVATE') } toPublicPKCS8 (key) { let { oid, algParameters } = this.params let { x, y } = key let PublicKeyInfo = asn.normalize('PublicKeyInfo') let publicKey = ECDSA.makePoint(x, y) let base64pem = PublicKeyInfo.encode({ algorithm: { algorithm: oid.split('.'), parameters: Buffer.from(algParameters, 'hex') }, publicKey: { unused: 0, data: publicKey } }, 'der').toString('base64') return ECDSA.formatPem(base64pem, 'PUBLIC') } toPrivateBlk (key) { return key.d.toString('hex') } toPublicBlk (key) { return Converter.convert(ECDSA.makePoint(key.x, key.y), 'raw', 'hex') } toPrivateJwk (key) { let { crv, kty } = this.params let { d, x, y } = key return { kty, crv, d: Converter.convert(d, 'raw', 'base64url'), x: Converter.convert(x, 'raw', 'base64url'), y: Converter.convert(y, 'raw', 'base64url'), } } toPublicJwk (key) { let { crv, kty } = this.params let { x, y } = key return { kty, crv, x: Converter.convert(x, 'raw', 'base64url'), y: Converter.convert(y, 'raw', 'base64url'), } } /** * HELPERS * @ignore */ static getPoint (point) { let x = point.slice(2, ((point.length - 2) / 2) + 2) let y = point.slice(((point.length - 2) / 2) + 2) return { x: Converter.convert(x, 'hex', 'raw'), y: Converter.convert(y, 'hex', 'raw'), } } static makePoint (x, y) { let startBuffer = Buffer.from('04', 'hex') return Buffer.concat([ startBuffer, x, y ], startBuffer.length + x.length + y.length) } } /** * Export * @ignore */ module.exports = ECDSA keyto-2.0.0-alpha1/src/types/EdDSA.js000066400000000000000000000057101363024071200171620ustar00rootroot00000000000000'use strict' /** * Dependencies * @ignore */ /** * Module Dependencies * @ignore */ const KeyType = require('./KeyType') const Converter = require('../Converter') const asn = require('../asn1') /** * EdDSA * @ignore */ class EdDSA extends KeyType { /** * IMPORT * @ignore */ fromPrivatePKCS8 (key) { const PrivateKeyInfo = asn.normalize('PrivateKeyInfo') const info = PrivateKeyInfo.decode(key, 'der') const d = info.privateKey.slice(2) const x = this.publicKeyFromPrivate(d) return { d, x } } fromPublicPKCS8 (key) { const PublicKeyInfo = asn.normalize('PublicKeyInfo') const info = PublicKeyInfo.decode(key, 'der') return { x: Converter.convert(info.publicKey.data, 'hex', 'raw'), } } fromJwk (key) { let { d, x } = key return { d: Converter.convert(d, 'base64url', 'raw'), x: Converter.convert(x, 'base64url', 'raw'), } } /** * EXPORT * @ignore */ toPrivatePKCS8 (key) { let { oid, infoVersion } = this.params let { d } = key const PrivateKeyInfo = asn.normalize('PrivateKeyInfo') const privateKey = this.privateKeyPadding(d) let base64pem = PrivateKeyInfo.encode({ version: infoVersion, algorithm: { algorithm: oid.split('.'), }, privateKey, }, 'der').toString('base64') return EdDSA.formatPem(base64pem, 'PRIVATE') } toPublicPKCS8 (key) { let { oid } = this.params let { x } = key let PublicKeyInfo = asn.normalize('PublicKeyInfo') let base64pem = PublicKeyInfo.encode({ algorithm: { algorithm: oid.split('.'), }, publicKey: { unused: 0, data: Converter.convert(x, 'hex', 'raw'), }, }, 'der').toString('base64') return EdDSA.formatPem(base64pem, 'PUBLIC') } toPrivateJwk (key) { let { crv, kty } = this.params let { d, x } = key return { kty, crv, d: Converter.convert(d, 'raw', 'base64url'), x: Converter.convert(x, 'raw', 'base64url'), } } toPublicJwk (key) { let { crv, kty } = this.params let { x } = key return { kty, crv, x: Converter.convert(x, 'raw', 'base64url'), } } /** * HELPERS * @ignore */ privateKeyPadding (d) { let startBuffer switch (this.params.crv) { case 'Ed25519': startBuffer = Buffer.from('0420', 'hex') break default: throw new Error(`${this.params.crv} is an invalid curve for EdDSA`) } return Buffer.concat([ startBuffer, d ], startBuffer.length + d.length) } publicKeyFromPrivate (d) { switch (this.params.crv) { case 'Ed25519': const Ed = require('elliptic').eddsa const ed = new Ed('ed25519') return Buffer.from(ed.keyFromSecret(d).getPublic()) default: throw new Error(`${this.params.crv} is an invalid curve for EdDSA`) } } } /** * Export * @ignore */ module.exports = EdDSA keyto-2.0.0-alpha1/src/types/KeyType.js000066400000000000000000000034341363024071200176750ustar00rootroot00000000000000'use strict' /** * Module Dependencies * @ignore */ const OperationNotSupportedError = require('../OperationNotSupportedError') /** * KeyType * @ignore */ class KeyType { /** * constructor * * @class KeyType * * @internal For internal use only * * @description * Abstract KeyType class */ constructor (params) { this.params = params } /** * IMPORT * @ignore */ fromPrivatePKCS1 (key) { throw new OperationNotSupportedError() } fromPrivatePKCS8 (key) { throw new OperationNotSupportedError() } fromPublicPKCS1 (key) { throw new OperationNotSupportedError() } fromPublicPKCS8 (key) { throw new OperationNotSupportedError() } fromPrivateBlk (key) { throw new OperationNotSupportedError() } fromPublicBlk (key) { throw new OperationNotSupportedError() } fromJwk (key) { throw new OperationNotSupportedError() } /** * EXPORT * @ignore */ toPrivatePKCS1 (key) { throw new OperationNotSupportedError() } toPrivatePKCS8 (key) { throw new OperationNotSupportedError() } toPublicPKCS1 (key) { throw new OperationNotSupportedError() } toPublicPKCS8 (key) { throw new OperationNotSupportedError() } toPrivateBlk (key) { throw new OperationNotSupportedError() } toPublicBlk (key) { throw new OperationNotSupportedError() } toPrivateJwk (key) { throw new OperationNotSupportedError() } toPublicJwk (key) { throw new OperationNotSupportedError() } /** * HELPERS * @ignore */ static formatPem (base64pem, descriptor) { return `-----BEGIN ${descriptor} KEY-----\n` + base64pem.match(/.{1,64}/g).join('\n') + `\n-----END ${descriptor} KEY-----` } } /** * Export * @ignore */ module.exports = KeyType keyto-2.0.0-alpha1/src/types/RSA.js000066400000000000000000000141231363024071200167250ustar00rootroot00000000000000'use strict' /** * Dependencies * @ignore */ /** * Module Dependencies * @ignore */ const KeyType = require('./KeyType') const InvalidOperationError = require('../InvalidOperationError') const Converter = require('../Converter') const asn = require('../asn1') /** * RSA * @class RSA * * @extends {KeyType} * * @description * RSA conversion implementation */ class RSA extends KeyType { /** * IMPORT * @ignore */ fromPrivatePKCS1 (key) { let RSAPrivateKey = asn.normalize('RSAPrivateKey') let { n, e, d, p, q, dp, dq, qi } = RSAPrivateKey.decode(key, 'der') return { n: Converter.convert(n, 'bn', 'raw'), e: Converter.convert(e, 'bn', 'raw'), d: Converter.convert(d, 'bn', 'raw'), p: Converter.convert(p, 'bn', 'raw'), q: Converter.convert(q, 'bn', 'raw'), dp: Converter.convert(dp, 'bn', 'raw'), dq: Converter.convert(dq, 'bn', 'raw'), qi: Converter.convert(qi, 'bn', 'raw'), } } fromPrivatePKCS8 (key) { let PrivateKeyInfo = asn.normalize('PrivateKeyInfo') let RSAPrivateKey = asn.normalize('RSAPrivateKey') let info = PrivateKeyInfo.decode(key, 'der') let { n, e, d, p, q, dp, dq, qi } = RSAPrivateKey.decode(info.privateKey, 'der') return { n: Converter.convert(n, 'bn', 'raw'), e: Converter.convert(e, 'bn', 'raw'), d: Converter.convert(d, 'bn', 'raw'), p: Converter.convert(p, 'bn', 'raw'), q: Converter.convert(q, 'bn', 'raw'), dp: Converter.convert(dp, 'bn', 'raw'), dq: Converter.convert(dq, 'bn', 'raw'), qi: Converter.convert(qi, 'bn', 'raw'), } } fromPublicPKCS1 (key) { let RSAPublicKey = asn.normalize('RSAPublicKey') let { n, e } = RSAPublicKey.decode(key, 'der') return { n: Converter.convert(n, 'bn', 'raw'), e: Converter.convert(e, 'bn', 'raw'), } } fromPublicPKCS8 (key) { let PublicKeyInfo = asn.normalize('PublicKeyInfo') let RSAPublicKey = asn.normalize('RSAPublicKey') let info = PublicKeyInfo.decode(key, 'der') let { n, e } = RSAPublicKey.decode(info.publicKey.data, 'der') return { n: Converter.convert(n, 'bn', 'raw'), e: Converter.convert(e, 'bn', 'raw'), } } fromJwk (key) { let { n, e, d, p, q, dp, dq, qi, alg } = key return { n: Converter.convert(n, 'base64url', 'raw'), e: Converter.convert(e, 'base64url', 'raw'), d: Converter.convert(d, 'base64url', 'raw'), p: Converter.convert(p, 'base64url', 'raw'), q: Converter.convert(q, 'base64url', 'raw'), dp: Converter.convert(dp, 'base64url', 'raw'), dq: Converter.convert(dq, 'base64url', 'raw'), qi: Converter.convert(qi, 'base64url', 'raw'), } } /** * EXPORT * @ignore */ toPrivatePKCS1 (key) { let { n, e, d, p, q, dp, dq, qi } = key let { version } = this.params let RSAPrivateKey = asn.normalize('RSAPrivateKey') let base64pem = RSAPrivateKey.encode({ version, n: Converter.convert(n, 'raw', 'bn'), e: Converter.convert(e, 'raw', 'bn'), d: Converter.convert(d, 'raw', 'bn'), p: Converter.convert(p, 'raw', 'bn'), q: Converter.convert(q, 'raw', 'bn'), dp: Converter.convert(dp, 'raw', 'bn'), dq: Converter.convert(dq, 'raw', 'bn'), qi: Converter.convert(qi, 'raw', 'bn'), }, 'der').toString('base64') return RSA.formatPem(base64pem, 'RSA PRIVATE') } toPrivatePKCS8 (key) { let { n, e, d, p, q, dp, dq, qi } = key let { oid, algParameters, version } = this.params let PrivateKeyInfo = asn.normalize('PrivateKeyInfo') let RSAPrivateKey = asn.normalize('RSAPrivateKey') let privateKey = RSAPrivateKey.encode({ version, n: Converter.convert(n, 'raw', 'bn'), e: Converter.convert(e, 'raw', 'bn'), d: Converter.convert(d, 'raw', 'bn'), p: Converter.convert(p, 'raw', 'bn'), q: Converter.convert(q, 'raw', 'bn'), dp: Converter.convert(dp, 'raw', 'bn'), dq: Converter.convert(dq, 'raw', 'bn'), qi: Converter.convert(qi, 'raw', 'bn'), }, 'der') let base64pem = PrivateKeyInfo.encode({ version, algorithm: { algorithm: oid.split('.'), parameters: Buffer.from(algParameters, 'hex') }, privateKey }, 'der').toString('base64') return RSA.formatPem(base64pem, 'PRIVATE') } toPublicPKCS1 (key) { let { n, e } = key let { version } = this.params let RSAPublicKey = asn.normalize('RSAPublicKey') let base64pem = RSAPublicKey.encode({ version, n: Converter.convert(n, 'raw', 'bn'), e: Converter.convert(e, 'raw', 'bn'), }, 'der').toString('base64') return RSA.formatPem(base64pem, 'RSA PUBLIC') } toPublicPKCS8 (key) { let { n, e } = key let { oid, algParameters } = this.params let PublicKeyInfo = asn.normalize('PublicKeyInfo') let RSAPublicKey = asn.normalize('RSAPublicKey') let data = RSAPublicKey.encode({ n: Converter.convert(n, 'raw', 'bn'), e: Converter.convert(e, 'raw', 'bn'), }, 'der') let base64pem = PublicKeyInfo.encode({ algorithm: { algorithm: oid.split('.'), parameters: Buffer.from(algParameters, 'hex') }, publicKey: { unused: 0, data } }, 'der').toString('base64') return RSA.formatPem(base64pem, 'PUBLIC') } toPrivateJwk (key) { let { n, e, d, p, q, dp, dq, qi } = key let { kty } = this.params return { kty, n: Converter.convert(n, 'raw', 'base64url'), e: Converter.convert(e, 'raw', 'base64url'), d: Converter.convert(d, 'raw', 'base64url'), p: Converter.convert(p, 'raw', 'base64url'), q: Converter.convert(q, 'raw', 'base64url'), dp: Converter.convert(dp, 'raw', 'base64url'), dq: Converter.convert(dq, 'raw', 'base64url'), qi: Converter.convert(qi, 'raw', 'base64url'), } } toPublicJwk (key) { let { n, e } = key let { kty } = this.params return { kty, n: Converter.convert(n, 'raw', 'base64url'), e: Converter.convert(e, 'raw', 'base64url'), } } } /** * Export * @ignore */ module.exports = RSA keyto-2.0.0-alpha1/src/types/SupportedKeyTypes.js000066400000000000000000000023431363024071200217640ustar00rootroot00000000000000'use strict' /** * SupportedKeyTypes * @ignore */ class SupportedKeyTypes { /** * constructor * * @internal * For internal use. * * @class SupportedKeyTypes * * @description * A registry for supported asn key types */ constructor () { this.registry = [] this.classes = {} } /** * find * * @param {Function} fn * @return {Object} */ find (fn) { return this.registry.find(fn) } /** * define * * @param {Object} params * @param {KeyType} cls */ define (params, cls) { params.forEach(param => { let { kty } = param if (!kty) { throw new Error('Invalid type definition') } if (!this.classes[kty]) { this.classes[kty] = cls } this.registry.push(param) }) } /** * normalize * * @param {String} kty * @param {String} field * @param {Any} value * @return {KeyType} */ normalize (kty, field, value) { let type = this.classes[kty] let params = this.find(params => params[field] === value) if (!type || !params) { throw new Error('Invalid type') } return new type(params) } } /** * Export * @ignore */ module.exports = SupportedKeyTypes keyto-2.0.0-alpha1/src/types/index.js000066400000000000000000000027201363024071200174070ustar00rootroot00000000000000'use strict' /** * Module Depdendencies * @ignore */ const SupportedKeyTypes = require('./SupportedKeyTypes') const RSA = require('./RSA') const ECDSA = require('./ECDSA') const EdDSA = require('./EdDSA') /** * supportedKeyTypes * @ignore */ const supportedKeyTypes = new SupportedKeyTypes() // RSA supportedKeyTypes.define([ { kty: 'RSA', oid: '1.2.840.113549.1.1.1', algParameters: '0500', version: 'two-prime', } ], RSA) // ECDSA supportedKeyTypes.define([ { kty: 'EC', crv: 'secp256k1', oid: '1.2.840.10045.2.1', namedCurve: '1.3.132.0.10', algParameters: '06052b8104000a', keyVersion: 1, infoVersion: 'two-prime', }, { kty: 'EC', crv: 'P-256', oid: '1.2.840.10045.2.1', namedCurve: '1.2.840.10045.3.1.7', algParameters: '06082a8648ce3d030107', keyVersion: 1, infoVersion: 'two-prime', }, { kty: 'EC', crv: 'P-384', oid: '1.2.840.10045.2.1', namedCurve: '1.3.132.0.34', algParameters: '06052b81040022', keyVersion: 1, infoVersion: 'two-prime', }, { kty: 'EC', crv: 'P-521', oid: '1.2.840.10045.2.1', namedCurve: '1.3.132.0.35', algParameters: '06052b81040023', keyVersion: 1, infoVersion: 'two-prime', }, ], ECDSA) // EdDSA supportedKeyTypes.define([ { kty: 'OKP', crv: 'Ed25519', oid: '1.3.101.112', infoVersion: 'two-prime', }, ], EdDSA) /** * Export * @ignore */ module.exports = supportedKeyTypes keyto-2.0.0-alpha1/test/000077500000000000000000000000001363024071200147655ustar00rootroot00000000000000keyto-2.0.0-alpha1/test/LibSpec.js000066400000000000000000001066751363024071200166630ustar00rootroot00000000000000/** * Test Dependencies * @ignore */ const cwd = process.cwd() const path = require('path') const chai = require('chai') const expect = chai.expect /** * Assertions * @ignore */ chai.should() /** * Code Under Test * @ignore */ const keyto = require(path.join(cwd, 'src')) /** * Test Consts * @ignore */ const { RSA: { RS256: { publicPKCS1: rsaPublicPKCS1, publicPKCS8: rsaPublicPKCS8, publicJwk: rsaPublicJwk, privatePKCS8: rsaPrivatePKCS8, privatePKCS1: rsaPrivatePKCS1, privateJwk: rsaPrivateJwk } }, ECDSA: { secp256k1: { publicPKCS8: k256PublicPKCS8, publicJwk: k256PublicJwk, privatePKCS8: k256PrivatePKCS8, privatePKCS1: k256PrivatePKCS1, privateJwk: k256PrivateJwk, privateHex: k256PrivateHex, publicHex: k256PublicHex }, P256: { publicPKCS8: p256PublicPKCS8, publicJwk: p256PublicJwk, privatePKCS8: p256PrivatePKCS8, privatePKCS1: p256PrivatePKCS1, privateJwk: p256PrivateJwk, }, P384: { publicPKCS8: p384PublicPKCS8, publicJwk: p384PublicJwk, privatePKCS8: p384PrivatePKCS8, privatePKCS1: p384PrivatePKCS1, privateJwk: p384PrivateJwk, }, P521: { publicPKCS8: p521PublicPKCS8, publicJwk: p521PublicJwk, privatePKCS8: p521PrivatePKCS8, privatePKCS1: p521PrivatePKCS1, privateJwk: p521PrivateJwk, }, }, EdDSA: { ed25519: { publicPKCS8: ed25519PublicPKCS8, publicJwk: ed25519PublicJwk, privatePKCS8: ed25519PrivatePKCS8, privateJwk: ed25519PrivateJwk, }, }, } = require(path.join(cwd, 'test', 'keys')) /** * Tests */ describe('keyto', () => { describe('RSA', () => { describe('publicPKCS8', () => { let key before(() => { key = keyto.from(rsaPublicPKCS8, 'pem') }) it('should convert to publicPKCS1', () => { key.toString('pem', 'public_pkcs1').should.equal(rsaPublicPKCS1) }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(rsaPublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(rsaPublicJwk) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) }) describe('publicJwk', () => { let key before(() => { key = keyto.from(rsaPublicJwk, 'jwk') }) it('should convert to publicPKCS1', () => { key.toString('pem', 'public_pkcs1').should.equal(rsaPublicPKCS1) }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(rsaPublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(rsaPublicJwk) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) }) describe('privatePKCS1', () => { let key before(() => { key = keyto.from(rsaPrivatePKCS1, 'pem') }) it('should convert to publicPKCS1', () => { key.toString('pem', 'public_pkcs1').should.equal(rsaPublicPKCS1) }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(rsaPublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(rsaPublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(rsaPrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(rsaPrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(rsaPrivateJwk) }) }) describe('privatePKCS8', () => { let key before(() => { key = keyto.from(rsaPrivatePKCS8, 'pem') }) it('should convert to publicPKCS1', () => { key.toString('pem', 'public_pkcs1').should.equal(rsaPublicPKCS1) }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(rsaPublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(rsaPublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(rsaPrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(rsaPrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(rsaPrivateJwk) }) }) describe('privateJwk', () => { let key before(() => { key = keyto.from(rsaPrivateJwk, 'jwk') }) it('should convert to publicPKCS1', () => { key.toString('pem', 'public_pkcs1').should.equal(rsaPublicPKCS1) }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(rsaPublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(rsaPublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(rsaPrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(rsaPrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(rsaPrivateJwk) }) }) }) describe('ECDSA secp256k1', () => { describe('publicPKCS8', () => { let key before(() => { key = keyto.from(k256PublicPKCS8, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(k256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(k256PublicJwk) }) it('should convert to publicHex', () => { key.toString('blk', 'public').should.equal(k256PublicHex) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateHex', () => { expect(() => key.toString('blk', 'private')).to.throw('Cannot export a private key from a public key') }) }) describe('publicJwk', () => { let key before(() => { key = keyto.from(k256PublicJwk, 'jwk') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(k256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(k256PublicJwk) }) it('should convert to publicHex', () => { key.toString('blk', 'public').should.equal(k256PublicHex) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateHex', () => { expect(() => key.toString('blk', 'private')).to.throw('Cannot export a private key from a public key') }) }) describe('publicHex', () => { let key before(() => { key = keyto.from(k256PublicHex, 'blk') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(k256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(k256PublicJwk) }) it('should convert to publicHex', () => { key.toString('blk', 'public').should.equal(k256PublicHex) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateHex', () => { expect(() => key.toString('blk', 'private')).to.throw('Cannot export a private key from a public key') }) }) describe('privatePKCS1', () => { let key before(() => { key = keyto.from(k256PrivatePKCS1, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(k256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(k256PublicJwk) }) it('should convert to publicHex', () => { key.toString('blk', 'public').should.equal(k256PublicHex) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(k256PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(k256PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(k256PrivateJwk) }) it('should convert to privateHex', () => { key.toString('blk', 'private').should.equal(k256PrivateHex) }) }) describe('privatePKCS8', () => { let key before(() => { key = keyto.from(k256PrivatePKCS8, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(k256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(k256PublicJwk) }) it('should convert to publicHex', () => { key.toString('blk', 'public').should.equal(k256PublicHex) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(k256PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(k256PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(k256PrivateJwk) }) it('should convert to privateHex', () => { key.toString('blk', 'private').should.equal(k256PrivateHex) }) }) describe('privateJwk', () => { let key before(() => { key = keyto.from(k256PrivateJwk, 'jwk') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(k256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(k256PublicJwk) }) it('should convert to publicHex', () => { key.toString('blk', 'public').should.equal(k256PublicHex) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(k256PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(k256PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(k256PrivateJwk) }) it('should convert to privateHex', () => { key.toString('blk', 'private').should.equal(k256PrivateHex) }) }) describe('privateHex', () => { let key before(() => { key = keyto.from(k256PrivateHex, 'blk') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(k256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(k256PublicJwk) }) it('should convert to publicHex', () => { key.toString('blk', 'public').should.equal(k256PublicHex) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(k256PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(k256PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(k256PrivateJwk) }) it('should convert to privateHex', () => { key.toString('blk', 'private').should.equal(k256PrivateHex) }) }) }) describe('ECDSA prime256v1', () => { describe('publicPKCS8', () => { let key before(() => { key = keyto.from(p256PublicPKCS8, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p256PublicJwk) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) }) describe('publicJwk', () => { let key before(() => { key = keyto.from(p256PublicJwk, 'jwk') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p256PublicJwk) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) }) describe('privatePKCS1', () => { let key before(() => { key = keyto.from(p256PrivatePKCS1, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p256PublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(p256PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(p256PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(p256PrivateJwk) }) }) describe('privatePKCS8', () => { let key before(() => { key = keyto.from(p256PrivatePKCS8, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p256PublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(p256PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(p256PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(p256PrivateJwk) }) }) describe('privateJwk', () => { let key before(() => { key = keyto.from(p256PrivateJwk, 'jwk') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p256PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p256PublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(p256PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(p256PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(p256PrivateJwk) }) }) }) describe('ECDSA secp384r1', () => { describe('publicPKCS8', () => { let key before(() => { key = keyto.from(p384PublicPKCS8, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p384PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p384PublicJwk) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) }) describe('publicJwk', () => { let key before(() => { key = keyto.from(p384PublicJwk, 'jwk') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p384PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p384PublicJwk) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) }) describe('privatePKCS1', () => { let key before(() => { key = keyto.from(p384PrivatePKCS1, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p384PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p384PublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(p384PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(p384PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(p384PrivateJwk) }) }) describe('privatePKCS8', () => { let key before(() => { key = keyto.from(p384PrivatePKCS8, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p384PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p384PublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(p384PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(p384PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(p384PrivateJwk) }) }) describe('privateJwk', () => { let key before(() => { key = keyto.from(p384PrivateJwk, 'jwk') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p384PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p384PublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(p384PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(p384PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(p384PrivateJwk) }) }) }) describe('ECDSA secp521r1', () => { describe('publicPKCS8', () => { let key before(() => { key = keyto.from(p521PublicPKCS8, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p521PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p521PublicJwk) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) }) describe('publicJwk', () => { let key before(() => { key = keyto.from(p521PublicJwk, 'jwk') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p521PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p521PublicJwk) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) }) describe('privatePKCS1', () => { let key before(() => { key = keyto.from(p521PrivatePKCS1, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p521PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p521PublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(p521PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(p521PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(p521PrivateJwk) }) }) describe('privatePKCS8', () => { let key before(() => { key = keyto.from(p521PrivatePKCS8, 'pem') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p521PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p521PublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(p521PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(p521PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(p521PrivateJwk) }) }) describe('privateJwk', () => { let key before(() => { key = keyto.from(p521PrivateJwk, 'jwk') }) it('should convert to publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(p521PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(p521PublicJwk) }) it('should convert to privatePKCS1', () => { key.toString('pem', 'private_pkcs1').should.equal(p521PrivatePKCS1) }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(p521PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(p521PrivateJwk) }) }) }) describe('EdDSA ed25519', () => { describe('publicPKCS8', () => { let key before(() => { key = keyto.from(ed25519PublicPKCS8, 'pem') }) it('should not support publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(ed25519PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(ed25519PublicJwk) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) }) describe('publicJwk', () => { let key before(() => { key = keyto.from(ed25519PublicJwk, 'jwk') }) it('should not support publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(ed25519PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(ed25519PublicJwk) }) it('should not convert to privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privatePKCS8', () => { expect(() => key.toString('pem', 'private_pkcs8')).to.throw('Cannot export a private key from a public key') }) it('should not convert to privateJwk', () => { expect(() => JSON.stringify(key.toJwk('private'), null, 2)).to.throw('Cannot export a private key from a public key') }) }) describe('privatePKCS8', () => { let key before(() => { key = keyto.from(ed25519PrivatePKCS8, 'pem') }) it('should not support publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(ed25519PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(ed25519PublicJwk) }) it('should not support privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(ed25519PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(ed25519PrivateJwk) }) }) describe('privateJwk', () => { let key before(() => { key = keyto.from(ed25519PrivateJwk, 'jwk') }) it('should not support publicPKCS1', () => { expect(() => key.toString('pem', 'public_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to publicPKCS8', () => { key.toString('pem', 'public_pkcs8').should.equal(ed25519PublicPKCS8) }) it('should convert to publicJwk', () => { JSON.stringify(key.toJwk('public'), null, 2).should.equal(ed25519PublicJwk) }) it('should not support privatePKCS1', () => { expect(() => key.toString('pem', 'private_pkcs1')).to.throw('This has not been implemented yet') }) it('should convert to privatePKCS8', () => { key.toString('pem', 'private_pkcs8').should.equal(ed25519PrivatePKCS8) }) it('should convert to privateJwk', () => { JSON.stringify(key.toJwk('private'), null, 2).should.equal(ed25519PrivateJwk) }) }) }) }) keyto-2.0.0-alpha1/test/asn1/000077500000000000000000000000001363024071200156275ustar00rootroot00000000000000keyto-2.0.0-alpha1/test/asn1/SupportedAsnTypesSpec.js000066400000000000000000000007441363024071200224610ustar00rootroot00000000000000/** * Test Dependencies * @ignore */ const cwd = process.cwd() const path = require('path') const chai = require('chai') const expect = chai.expect /** * Assertions * @ignore */ chai.should() /** * Code Under Test * @ignore */ const SupportedAsnTypes = require(path.join(cwd, 'src', 'asn1', 'SupportedAsnTypes')) const supportedAsnTypes = require(path.join(cwd, 'src', 'asn1')) /** * Test Consts * @ignore */ /** * Tests */ describe('SupportedAsnTypes', () => { }) keyto-2.0.0-alpha1/test/keys/000077500000000000000000000000001363024071200157405ustar00rootroot00000000000000keyto-2.0.0-alpha1/test/keys/ECDSA/000077500000000000000000000000001363024071200165575ustar00rootroot00000000000000keyto-2.0.0-alpha1/test/keys/ECDSA/P256.js000066400000000000000000000024111363024071200175470ustar00rootroot00000000000000'use strict' /** * PEM * @ignore */ const privatePKCS1 = `-----BEGIN EC PRIVATE KEY----- MHcCAQEEIN7doxnaLI4GtVJ9+X5sHqFjJIA5jWLB3mKZE2O9O1mBoAoGCCqGSM49 AwEHoUQDQgAEbag3R0FTUvlLJGEM7zEhY2IGJgoEN4Q4UA7eR5Uh7BEIzXBGuT/3 S9cNXKa6mWLTLIcBxEFVLcx1AVQJKrkFXQ== -----END EC PRIVATE KEY-----` const privatePKCS8 = `-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg3t2jGdosjga1Un35 fmweoWMkgDmNYsHeYpkTY707WYGhRANCAARtqDdHQVNS+UskYQzvMSFjYgYmCgQ3 hDhQDt5HlSHsEQjNcEa5P/dL1w1cprqZYtMshwHEQVUtzHUBVAkquQVd -----END PRIVATE KEY-----` const publicPKCS8 = `-----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbag3R0FTUvlLJGEM7zEhY2IGJgoE N4Q4UA7eR5Uh7BEIzXBGuT/3S9cNXKa6mWLTLIcBxEFVLcx1AVQJKrkFXQ== -----END PUBLIC KEY-----` /** * JWK * @ignore */ const privateJwk = `{ "kty": "EC", "crv": "P-256", "d": "3t2jGdosjga1Un35fmweoWMkgDmNYsHeYpkTY707WYE", "x": "bag3R0FTUvlLJGEM7zEhY2IGJgoEN4Q4UA7eR5Uh7BE", "y": "CM1wRrk_90vXDVymupli0yyHAcRBVS3MdQFUCSq5BV0" }` const publicJwk = `{ "kty": "EC", "crv": "P-256", "x": "bag3R0FTUvlLJGEM7zEhY2IGJgoEN4Q4UA7eR5Uh7BE", "y": "CM1wRrk_90vXDVymupli0yyHAcRBVS3MdQFUCSq5BV0" }` /** * Export * @ignore */ module.exports = { privatePKCS1, privatePKCS8, publicPKCS8, privateJwk, publicJwk, } keyto-2.0.0-alpha1/test/keys/ECDSA/P384.js000066400000000000000000000030251363024071200175530ustar00rootroot00000000000000'use strict' /** * PEM * @ignore */ const privatePKCS1 = `-----BEGIN EC PRIVATE KEY----- MIGkAgEBBDBYfv/x6wM9uoKFysiPkzR6ym58a7BYwzWW/8RUj2InDd2HdAusuXQy IDwmjI92nnWgBwYFK4EEACKhZANiAARc3eBrrbfPaa7kF3FZchV4aHOcZsMeyoQp oipMr1GWkLErCtx2hGpoLeqUg/KBw3s1V7LQPx7YqPHWKqB7z4pMIJ3tUyzejqZI +dWN0LqWzqe03v7QzvIU1Q2qH8s8IrM= -----END EC PRIVATE KEY-----` const privatePKCS8 = `-----BEGIN PRIVATE KEY----- MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDBYfv/x6wM9uoKFysiP kzR6ym58a7BYwzWW/8RUj2InDd2HdAusuXQyIDwmjI92nnWhZANiAARc3eBrrbfP aa7kF3FZchV4aHOcZsMeyoQpoipMr1GWkLErCtx2hGpoLeqUg/KBw3s1V7LQPx7Y qPHWKqB7z4pMIJ3tUyzejqZI+dWN0LqWzqe03v7QzvIU1Q2qH8s8IrM= -----END PRIVATE KEY-----` const publicPKCS8 = `-----BEGIN PUBLIC KEY----- MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEXN3ga623z2mu5BdxWXIVeGhznGbDHsqE KaIqTK9RlpCxKwrcdoRqaC3qlIPygcN7NVey0D8e2Kjx1iqge8+KTCCd7VMs3o6m SPnVjdC6ls6ntN7+0M7yFNUNqh/LPCKz -----END PUBLIC KEY-----` /** * JWK * @ignore */ const privateJwk = `{ "kty": "EC", "crv": "P-384", "d": "WH7_8esDPbqChcrIj5M0espufGuwWMM1lv_EVI9iJw3dh3QLrLl0MiA8JoyPdp51", "x": "XN3ga623z2mu5BdxWXIVeGhznGbDHsqEKaIqTK9RlpCxKwrcdoRqaC3qlIPygcN7", "y": "NVey0D8e2Kjx1iqge8-KTCCd7VMs3o6mSPnVjdC6ls6ntN7-0M7yFNUNqh_LPCKz" }` const publicJwk = `{ "kty": "EC", "crv": "P-384", "x": "XN3ga623z2mu5BdxWXIVeGhznGbDHsqEKaIqTK9RlpCxKwrcdoRqaC3qlIPygcN7", "y": "NVey0D8e2Kjx1iqge8-KTCCd7VMs3o6mSPnVjdC6ls6ntN7-0M7yFNUNqh_LPCKz" }` /** * Export * @ignore */ module.exports = { privatePKCS1, privatePKCS8, publicPKCS8, privateJwk, publicJwk, } keyto-2.0.0-alpha1/test/keys/ECDSA/P521.js000066400000000000000000000035351363024071200175520ustar00rootroot00000000000000'use strict' /** * PEM * @ignore */ const privatePKCS1 = `-----BEGIN EC PRIVATE KEY----- MIHcAgEBBEIBp7eAMe6QHQ4Av4tEfeVYFQUn3nWHFFEAfyqOcjSUHzPFmNQpH2kM wFpZu6XPxauBTVTnFW8QAtD1ov1L6V7aHpagBwYFK4EEACOhgYkDgYYABAFHzefo k5MWo1mRqDXvo8zQqUsnb6JeTKyn/kD0tJP92cYFutmHTq3rKQF2Kyvvhv339iKB q11jsNpLjNCVooqDpwEHOpuFthlQH1isX96oQrSo+pxgkMQjUxxeeAF/mIeINu9S 2H/FYFvG7IU/O+0iTiY5GGmyiXPDThv5adXMH3zn6g== -----END EC PRIVATE KEY-----` const privatePKCS8 = `-----BEGIN PRIVATE KEY----- MIHuAgEAMBAGByqGSM49AgEGBSuBBAAjBIHWMIHTAgEBBEIBp7eAMe6QHQ4Av4tE feVYFQUn3nWHFFEAfyqOcjSUHzPFmNQpH2kMwFpZu6XPxauBTVTnFW8QAtD1ov1L 6V7aHpahgYkDgYYABAFHzefok5MWo1mRqDXvo8zQqUsnb6JeTKyn/kD0tJP92cYF utmHTq3rKQF2Kyvvhv339iKBq11jsNpLjNCVooqDpwEHOpuFthlQH1isX96oQrSo +pxgkMQjUxxeeAF/mIeINu9S2H/FYFvG7IU/O+0iTiY5GGmyiXPDThv5adXMH3zn 6g== -----END PRIVATE KEY-----` const publicPKCS8 = `-----BEGIN PUBLIC KEY----- MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBR83n6JOTFqNZkag176PM0KlLJ2+i Xkysp/5A9LST/dnGBbrZh06t6ykBdisr74b99/YigatdY7DaS4zQlaKKg6cBBzqb hbYZUB9YrF/eqEK0qPqcYJDEI1McXngBf5iHiDbvUth/xWBbxuyFPzvtIk4mORhp solzw04b+WnVzB985+o= -----END PUBLIC KEY-----` /** * JWK * @ignore */ const privateJwk = `{ "kty": "EC", "crv": "P-521", "d": "Aae3gDHukB0OAL-LRH3lWBUFJ951hxRRAH8qjnI0lB8zxZjUKR9pDMBaWbulz8WrgU1U5xVvEALQ9aL9S-le2h6W", "x": "AUfN5-iTkxajWZGoNe-jzNCpSydvol5MrKf-QPS0k_3ZxgW62YdOrespAXYrK--G_ff2IoGrXWOw2kuM0JWiioOn", "y": "AQc6m4W2GVAfWKxf3qhCtKj6nGCQxCNTHF54AX-Yh4g271LYf8VgW8bshT877SJOJjkYabKJc8NOG_lp1cwffOfq" }` const publicJwk = `{ "kty": "EC", "crv": "P-521", "x": "AUfN5-iTkxajWZGoNe-jzNCpSydvol5MrKf-QPS0k_3ZxgW62YdOrespAXYrK--G_ff2IoGrXWOw2kuM0JWiioOn", "y": "AQc6m4W2GVAfWKxf3qhCtKj6nGCQxCNTHF54AX-Yh4g271LYf8VgW8bshT877SJOJjkYabKJc8NOG_lp1cwffOfq" }` /** * Export * @ignore */ module.exports = { privatePKCS1, privatePKCS8, publicPKCS8, privateJwk, publicJwk, } keyto-2.0.0-alpha1/test/keys/ECDSA/secp256k1.js000066400000000000000000000031251363024071200205410ustar00rootroot00000000000000'use strict' /** * PEM * @ignore */ const privatePKCS1 = `-----BEGIN EC PRIVATE KEY----- MHQCAQEEIGL+5sun5HcUA38BQrImqe1rf8wW45SjSdK8OUC90kRtoAcGBSuBBAAK oUQDQgAE1EtMpqpgipSE1aOfs0gYj/sSv86VDbuBuR/VPpr2F6ZXqqZEhVCEhann W+64lXnKlR0c69v3A+DOjmF5R9FU5w== -----END EC PRIVATE KEY-----` const privatePKCS8 = `-----BEGIN PRIVATE KEY----- MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgYv7my6fkdxQDfwFCsiap 7Wt/zBbjlKNJ0rw5QL3SRG2hRANCAATUS0ymqmCKlITVo5+zSBiP+xK/zpUNu4G5 H9U+mvYXpleqpkSFUISFqedb7riVecqVHRzr2/cD4M6OYXlH0VTn -----END PRIVATE KEY-----` const publicPKCS1 = `` const publicPKCS8 = `-----BEGIN PUBLIC KEY----- MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1EtMpqpgipSE1aOfs0gYj/sSv86VDbuB uR/VPpr2F6ZXqqZEhVCEhannW+64lXnKlR0c69v3A+DOjmF5R9FU5w== -----END PUBLIC KEY-----` /** * Hex String * @ignore */ const privateHex = `62fee6cba7e47714037f0142b226a9ed6b7fcc16e394a349d2bc3940bdd2446d` const publicHex = `04d44b4ca6aa608a9484d5a39fb348188ffb12bfce950dbb81b91fd53e9af617a657aaa64485508485a9e75beeb89579ca951d1cebdbf703e0ce8e617947d154e7` /** * JWK * @ignore */ const privateJwk = `{ "kty": "EC", "crv": "secp256k1", "d": "Yv7my6fkdxQDfwFCsiap7Wt_zBbjlKNJ0rw5QL3SRG0", "x": "1EtMpqpgipSE1aOfs0gYj_sSv86VDbuBuR_VPpr2F6Y", "y": "V6qmRIVQhIWp51vuuJV5ypUdHOvb9wPgzo5heUfRVOc" }` const publicJwk = `{ "kty": "EC", "crv": "secp256k1", "x": "1EtMpqpgipSE1aOfs0gYj_sSv86VDbuBuR_VPpr2F6Y", "y": "V6qmRIVQhIWp51vuuJV5ypUdHOvb9wPgzo5heUfRVOc" }` /** * Export * @ignore */ module.exports = { privatePKCS1, privatePKCS8, publicPKCS1, publicPKCS8, privateHex, publicHex, privateJwk, publicJwk, } keyto-2.0.0-alpha1/test/keys/EdDSA/000077500000000000000000000000001363024071200166205ustar00rootroot00000000000000keyto-2.0.0-alpha1/test/keys/EdDSA/ed25519.js000066400000000000000000000013361363024071200201570ustar00rootroot00000000000000'use strict' /** * PEM * @ignore */ const privatePKCS8 = `-----BEGIN PRIVATE KEY----- MC4CAQAwBQYDK2VwBCIEIA1zTpIkMpFC2KRrjUzT0d68oxgoIqfMuX4Q6Y3xgNQR -----END PRIVATE KEY-----` const publicPKCS8 = `-----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEA7xpkqtl+XQwlGVg/ScYcFcCiAiJvXcs8NTniluel5qA= -----END PUBLIC KEY-----` /** * JWK * @ignore */ const privateJwk = `{ "kty": "OKP", "crv": "Ed25519", "d": "DXNOkiQykULYpGuNTNPR3ryjGCgip8y5fhDpjfGA1BE", "x": "7xpkqtl-XQwlGVg_ScYcFcCiAiJvXcs8NTniluel5qA" }` const publicJwk = `{ "kty": "OKP", "crv": "Ed25519", "x": "7xpkqtl-XQwlGVg_ScYcFcCiAiJvXcs8NTniluel5qA" }` /** * Export * @ignore */ module.exports = { privatePKCS8, publicPKCS8, privateJwk, publicJwk, } keyto-2.0.0-alpha1/test/keys/RSA/000077500000000000000000000000001363024071200163655ustar00rootroot00000000000000keyto-2.0.0-alpha1/test/keys/RSA/RS256.js000066400000000000000000000300661363024071200175110ustar00rootroot00000000000000'use strict' /** * PEM * @ignore */ const privatePKCS1 = `-----BEGIN RSA PRIVATE KEY----- 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 -----END RSA PRIVATE KEY-----` const privatePKCS8 = `-----BEGIN PRIVATE KEY----- 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 AwPm10d/qtYJUQ71+mTUQoswRSm7 -----END PRIVATE KEY-----` const publicPKCS1 = `-----BEGIN RSA PUBLIC KEY----- MIICCgKCAgEAsgkUfSQXuPIoucywnKzuNBZhAqVNI3zwi4rqWu0RYmdUmjVEmkIY jxbibqz0uKe8WFA28nPfT9ybwOg25RXKMNMoKjJJndKp9pnoiYWUMVGOrDwFuNbN 7xoOzvVWA6Fww8gcLh8vepdyprEfLQhfYADyI9mmMnMm7JAfrloV8DlG4FE60yYC 5xPZnpSoeVknqtk1IPdSnSDz1hBGOqwH9wBWDTcAjwYfgCQbxMSvI3Zs3/8y1KTx 0/4VkqyDqUn6pv+3I+y08OC2XlIy+LCNaDPRMBdY+sm45mlMwF4NpQHzrxgO7LYy rX/tk12ykWZGNkTsA5Xfb9+phKtUhLt5aw3xdgYRz7dAk7EE9APyjKw0B2NHanNp jdIAJ3istwdxITPk3N1X5n8d+fumiACIHicm8JvrjTfdcwtwA7C0kAQ+CwAjxsZ5 OBJDfeGHHe6lMvWJhGZouTca/Tx94C6z+xxzunhEM38nabIZ9Cc4LDootX+w+GRG OXCdQKoz6p+41tmHDnIqqwIifY/z9KgdF1GXMixR0SrLh/HK0GanDfYynM0Hmen/ BucpHFwadlNivFnDGIPWtWl8A5yAnRyjMclYM4S+3+2JlYotNfqMfVFaX9YHFsAW 4KTQlXsOK3KptP5ciPm6relMvPqVDr99F2HVEX5e20Cixo20qMg8HgUCAwEAAQ== -----END RSA PUBLIC KEY-----` const publicPKCS8 = `-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsgkUfSQXuPIoucywnKzu NBZhAqVNI3zwi4rqWu0RYmdUmjVEmkIYjxbibqz0uKe8WFA28nPfT9ybwOg25RXK MNMoKjJJndKp9pnoiYWUMVGOrDwFuNbN7xoOzvVWA6Fww8gcLh8vepdyprEfLQhf YADyI9mmMnMm7JAfrloV8DlG4FE60yYC5xPZnpSoeVknqtk1IPdSnSDz1hBGOqwH 9wBWDTcAjwYfgCQbxMSvI3Zs3/8y1KTx0/4VkqyDqUn6pv+3I+y08OC2XlIy+LCN aDPRMBdY+sm45mlMwF4NpQHzrxgO7LYyrX/tk12ykWZGNkTsA5Xfb9+phKtUhLt5 aw3xdgYRz7dAk7EE9APyjKw0B2NHanNpjdIAJ3istwdxITPk3N1X5n8d+fumiACI Hicm8JvrjTfdcwtwA7C0kAQ+CwAjxsZ5OBJDfeGHHe6lMvWJhGZouTca/Tx94C6z +xxzunhEM38nabIZ9Cc4LDootX+w+GRGOXCdQKoz6p+41tmHDnIqqwIifY/z9Kgd F1GXMixR0SrLh/HK0GanDfYynM0Hmen/BucpHFwadlNivFnDGIPWtWl8A5yAnRyj MclYM4S+3+2JlYotNfqMfVFaX9YHFsAW4KTQlXsOK3KptP5ciPm6relMvPqVDr99 F2HVEX5e20Cixo20qMg8HgUCAwEAAQ== -----END PUBLIC KEY-----` /** * JWK * @ignore */ const privateJwk = `{ "kty": "RSA", "n": "sgkUfSQXuPIoucywnKzuNBZhAqVNI3zwi4rqWu0RYmdUmjVEmkIYjxbibqz0uKe8WFA28nPfT9ybwOg25RXKMNMoKjJJndKp9pnoiYWUMVGOrDwFuNbN7xoOzvVWA6Fww8gcLh8vepdyprEfLQhfYADyI9mmMnMm7JAfrloV8DlG4FE60yYC5xPZnpSoeVknqtk1IPdSnSDz1hBGOqwH9wBWDTcAjwYfgCQbxMSvI3Zs3_8y1KTx0_4VkqyDqUn6pv-3I-y08OC2XlIy-LCNaDPRMBdY-sm45mlMwF4NpQHzrxgO7LYyrX_tk12ykWZGNkTsA5Xfb9-phKtUhLt5aw3xdgYRz7dAk7EE9APyjKw0B2NHanNpjdIAJ3istwdxITPk3N1X5n8d-fumiACIHicm8JvrjTfdcwtwA7C0kAQ-CwAjxsZ5OBJDfeGHHe6lMvWJhGZouTca_Tx94C6z-xxzunhEM38nabIZ9Cc4LDootX-w-GRGOXCdQKoz6p-41tmHDnIqqwIifY_z9KgdF1GXMixR0SrLh_HK0GanDfYynM0Hmen_BucpHFwadlNivFnDGIPWtWl8A5yAnRyjMclYM4S-3-2JlYotNfqMfVFaX9YHFsAW4KTQlXsOK3KptP5ciPm6relMvPqVDr99F2HVEX5e20Cixo20qMg8HgU", "e": "AQAB", "d": "P4bf6btsP5EhGRNB3dYS9UEbAo-rU8NsLc62yxUWg-9tD818GjMFgmFfELDkbdNkcHrG8IKKJ3wHk7EIjXvV9tAR3-SrwgX-ocDPaerhMyvv5eNRA2CagPviVtTSCV-c1i9cZtS3412RCovfHPmE1sPfow0xsYTHWdgfhd4dP-egM8CoZdmFZaD-oQhYiVxXvC3fOFEoCGtOto5-EMd73BYhnnuG1oIP0XCQ_AhWmifSt6bfI2Nr6wIZ_olSPaDpMJfEaKw48E6upD9ecsDE5G7A8RETrgE22fiu62FkKwHkSxEhmjN1J9WjF1dytVEyMoErWigrX0cGvRFJikc_DmxNA6cL4vC-KvJBJayC-l7lqvnlwKcTEoJzT_NopNW4obpsOyLPheaEzuLwTVPtS-AfXUEIzN8ges00h_yk8is6KOhNJbRQ-okAcuC1N7tcQObbl00Y5AwJgST_RFM_fTFJ9_INkEljQ4aJD1qwknEmFHsGKu3E3TiddeEs1w3_6lawIqtXZgV_74dQ2Q2mCc58RjI91DgcbLm7vpQLGtlC61UVFv1i45oCYlEkX0cVbPr9f4P51Eb80Ns0SWJlM-Jsv6uowLqu8o0Xs9CFh0b-pYXKGD7AiSGM9KU44xiVFocESqNGl77Cm-mAJykrH-sujgEUDgX0R7Hg6_0zqO0", "p": "5sDTrL000ixTi_eR86AdqOHh7qW44ixHRu_NW2OSoFJJ9CxiNDTkw6gqBS3YMx0efv_IBgj0Rt-bi_WjkeEgNxArwcwsfDiK4HjeGU07R5s0r7ytYGNVO-Vx8xBZEdpM_v3gWhAV3XeCjN0MZufKUfOGgGg1kSpd1LPurzL149224clohEzqL8eRCpQY5VZdNWroxNYK9zI4XCeGzm2hnsM9dlPzMgxMpKE5vO_ZX5I6KVRt0OXErQ9ARyyum4RbExx--_yGvi0XOm6PrlGbCIzuSlOEXGO8fe_V5vQQ0QlRYT4p3xVvBpG2eEzlP_L7nfklIC6sx0WC4WhH7Txzyw", "q": "xYOuGDi-npxh24IPGUfWirnqhUvULF0w8E4wM17hciDUCnDsFYSEO7WvTJR3wBPUD4Cz0YOOElU2SwmQBfzMGGeYWDAa7OYDeDFraLjHxVR_N-cch9d3LCiwqn33iOETW2twTV6TgCDCKDhXbR29Q7AMRYZ1vDhztwf0vH-UYN_LrcEohh51Q-v5TfdzePVYmQOLdwGe1gxQGOlQL-l6IYicMa9IU6EjaKNb7sce1fb57MuaVrUUEIrCkRkSuJ3Er5egsYWZIjpsVfW_cOY7RLK6C05aj3rfuyJ-ubXvC6MXhMj3Hxk1gAQRk0g7QxBoWSbSaok2wtEOfWegmX6bbw", "dp": "AnJzDDbpc30i2a4jbxj4l4zlr3k0b7mWe-sZG2n_6RFWVW-PDwysjGKhJ3LoAwrBAwnFXkMEDChc5uwQ8wAXLl5OiHyY0CxtVJoTiOMnyMedlGuEzyvegIcbYT-AIk9VV7LriSj4gmO9D69cbU7x91KEz6HLR6HSYuoRkuwQbX0xbk2LfTOvnBgasqkFZpE25dUfaM74SMzQijGlHVVOTHe3lCSpxJMa0Pggu58zh-7uDPgnPfrhzhAGV3ri0yVhLd-0fQmdiDDEOUto3Kli4oFUGZevJKeuHQvJEezurLjTkxtsqD_68G_lJntyRu5VusQkn6W_EVHsZGWNtbdZZw", "dq": "cCerzfk61Jn8P0cFB9fxDWkwsGw0mNR6G5pqaGEyJzpY7WzdwgIzjCxI1HVh4mHgAsWUVh4bqHFWmRle_OdlhV4d9cWrJGYgBjoZwadbWMP4UWgcnU5OT3bzinxo-QLFmR3S8TwJCbKQTYJgsoc2l575-Oi3Jh_wJTiRUhAn0zKBV7LdLftRnzX5pLokicTXgFuw7-ytouHvAZZKgEpVnYETIGtl6IcRsjNA2r-a1OifVkTu6Nl-AT6p6PaR2N9Ndl_lUaiJIhSGu_EFujgh44qRdiYR6nNdY8fcqduTV8pOaoorOS95X63vxPA5JoXEmwseZHxx6gIH9lHHsiFgZQ", "qi": "E97gVqDZB4-aj55Z3E8aStwVLt3ho1ohhvCrwx9Tc8q3eV3je9QI4EQL7pHkvroS0uIkalN-blXPvqXr2gV3e7SBP1Bk5ECtfRW6550l1VOOJeNgo-U8OJapJ4E5rpv5K7Y8JXrGwDaLeIH-XrsjJgrcJ6coYSyFFCfbI3ZKzPO_1upiy1v07u68LpwRRLzlNu0QIEJSEer6--A11g1ilZysXKsrZSvxTNxBl-pypuC9oJIrw8ZmlnMxkNDMhppKlpzdzF-d4vaxVulZK5qo3hnH0FtwgPnSB9O8k38GF-XNymyriG0OUNBH5wMD5tdHf6rWCVEO9fpk1EKLMEUpuw" }` const publicJwk = `{ "kty": "RSA", "n": "sgkUfSQXuPIoucywnKzuNBZhAqVNI3zwi4rqWu0RYmdUmjVEmkIYjxbibqz0uKe8WFA28nPfT9ybwOg25RXKMNMoKjJJndKp9pnoiYWUMVGOrDwFuNbN7xoOzvVWA6Fww8gcLh8vepdyprEfLQhfYADyI9mmMnMm7JAfrloV8DlG4FE60yYC5xPZnpSoeVknqtk1IPdSnSDz1hBGOqwH9wBWDTcAjwYfgCQbxMSvI3Zs3_8y1KTx0_4VkqyDqUn6pv-3I-y08OC2XlIy-LCNaDPRMBdY-sm45mlMwF4NpQHzrxgO7LYyrX_tk12ykWZGNkTsA5Xfb9-phKtUhLt5aw3xdgYRz7dAk7EE9APyjKw0B2NHanNpjdIAJ3istwdxITPk3N1X5n8d-fumiACIHicm8JvrjTfdcwtwA7C0kAQ-CwAjxsZ5OBJDfeGHHe6lMvWJhGZouTca_Tx94C6z-xxzunhEM38nabIZ9Cc4LDootX-w-GRGOXCdQKoz6p-41tmHDnIqqwIifY_z9KgdF1GXMixR0SrLh_HK0GanDfYynM0Hmen_BucpHFwadlNivFnDGIPWtWl8A5yAnRyjMclYM4S-3-2JlYotNfqMfVFaX9YHFsAW4KTQlXsOK3KptP5ciPm6relMvPqVDr99F2HVEX5e20Cixo20qMg8HgU", "e": "AQAB" }` /** * Export * @ignore */ module.exports = { privatePKCS1, privatePKCS8, publicPKCS1, publicPKCS8, privateJwk, publicJwk, } keyto-2.0.0-alpha1/test/keys/index.js000066400000000000000000000013531363024071200174070ustar00rootroot00000000000000'use strict' /** * Dependencies * @ignore */ const path = require('path') const glob = require('glob') /** * Keys * @ignore */ const getKeys = (dir) => { let files = glob.sync(`${dir}/*.js`) let descriptors = files.map(file => { return { name: path.basename(file, '.js'), folder: path.dirname(file) } }) return descriptors.reduce((state, descriptor) => { let { name, folder } = descriptor state[name] = require(path.join(folder, name)) return state }, {}) } /** * Export * @ignore */ module.exports = glob.sync(`${__dirname}/**/`) .filter(dir => dir !== `${__dirname}/`) .reduce((state, dir) => { let name = path.basename(dir) state[name] = getKeys(dir) return state }, {}) keyto-2.0.0-alpha1/test/mocha.opts000066400000000000000000000000251363024071200167600ustar00rootroot00000000000000-R spec --recursive keyto-2.0.0-alpha1/test/types/000077500000000000000000000000001363024071200161315ustar00rootroot00000000000000keyto-2.0.0-alpha1/test/types/RSASpec.js000066400000000000000000000007061363024071200177320ustar00rootroot00000000000000/** * Test Dependencies * @ignore */ const cwd = process.cwd() const path = require('path') const chai = require('chai') const expect = chai.expect /** * Assertions * @ignore */ chai.should() /** * Code Under Test * @ignore */ const RSA = require(path.join(cwd, 'src', 'types', 'RSA')) /** * Test Consts * @ignore */ const { RSA: { RS256 } } = require(path.join(cwd, 'test', 'keys')) /** * Tests */ describe('RSA Key Type', () => { })