diff --git a/package.json b/package.json index e6574e9..96b72a8 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,8 @@ "description": "Decentralized OpenPGP Identity Proofs library in Node.js", "main": "src/index.js", "dependencies": { + "@openpgp/hkp-client": "^0.0.2", + "@openpgp/wkd-client": "^0.0.3", "@xmpp/client": "^0.12.0", "@xmpp/debug": "^0.12.0", "axios": "^0.25.0", @@ -15,7 +17,7 @@ "irc-upd": "^0.11.0", "jsdom": "^16.5.1", "merge-options": "^3.0.3", - "openpgp": "^4.10.9", + "openpgp": "^5.0", "query-string": "^6.14.1", "valid-url": "^1.0.9", "validator": "^13.5.2" diff --git a/src/keys.js b/src/keys.js index a3adb33..989daff 100644 --- a/src/keys.js +++ b/src/keys.js @@ -16,6 +16,8 @@ limitations under the License. const axios = require('axios') const validUrl = require('valid-url') const openpgp = require('openpgp') +const HKP = require('@openpgp/hkp-client') +const WKD = require('@openpgp/wkd-client') const Claim = require('./claim') /** @@ -28,7 +30,7 @@ const Claim = require('./claim') * @function * @param {string} identifier - Fingerprint or email address * @param {string} [keyserverDomain=keys.openpgp.org] - Domain of the keyserver - * @returns {openpgp.key.Key} + * @returns {openpgp.PublicKey} * @example * const key1 = doip.keys.fetchHKP('alice@domain.tld'); * const key2 = doip.keys.fetchHKP('123abc123abc'); @@ -38,26 +40,26 @@ exports.fetchHKP = async (identifier, keyserverDomain) => { ? `https://${keyserverDomain}` : 'https://keys.openpgp.org' - const hkp = new openpgp.HKP(keyserverBaseUrl) + const hkp = new HKP(keyserverBaseUrl) const lookupOpts = { query: identifier } - const publicKey = await hkp.lookup(lookupOpts).catch((error) => { - throw new Error(`Key does not exist or could not be fetched (${error})`) - }) + const publicKey = await hkp + .lookup(lookupOpts) + .catch((error) => { + throw new Error(`Key does not exist or could not be fetched (${error})`) + }) if (!publicKey) { throw new Error('Key does not exist or could not be fetched') } - return await openpgp.key - .readArmored(publicKey) - .then((result) => { - return result.keys[0] - }) + return await openpgp.readKey({ + armoredKey: publicKey + }) .catch((error) => { - throw new Error(`Key does not exist or could not be fetched (${error})`) + throw new Error(`Key could not be read (${error})`) }) } @@ -65,24 +67,32 @@ exports.fetchHKP = async (identifier, keyserverDomain) => { * Fetch a public key using Web Key Directory * @function * @param {string} identifier - Identifier of format 'username@domain.tld` - * @returns {openpgp.key.Key} + * @returns {openpgp.PublicKey} * @example * const key = doip.keys.fetchWKD('alice@domain.tld'); */ exports.fetchWKD = async (identifier) => { - const wkd = new openpgp.WKD() + const wkd = new WKD() const lookupOpts = { email: identifier } - return await wkd + const publicKey = await wkd .lookup(lookupOpts) - .then((result) => { - return result.keys[0] - }) .catch((error) => { throw new Error(`Key does not exist or could not be fetched (${error})`) }) + + if (!publicKey) { + throw new Error('Key does not exist or could not be fetched') + } + + return await openpgp.readKey({ + binaryKey: publicKey + }) + .catch((error) => { + throw new Error(`Key could not be read (${error})`) + }) } /** @@ -90,7 +100,7 @@ exports.fetchWKD = async (identifier) => { * @function * @param {string} username - Keybase username * @param {string} fingerprint - Fingerprint of key - * @returns {openpgp.key.Key} + * @returns {openpgp.PublicKey} * @example * const key = doip.keys.fetchKeybase('alice', '123abc123abc'); */ @@ -114,11 +124,9 @@ exports.fetchKeybase = async (username, fingerprint) => { throw new Error(`Error fetching Keybase key: ${e.message}`) } - return await openpgp.key - .readArmored(rawKeyContent) - .then((result) => { - return result.keys[0] - }) + return await openpgp.readKey({ + armoredKey: rawKeyContent + }) .catch((error) => { throw new Error(`Key does not exist or could not be fetched (${error})`) }) @@ -128,7 +136,7 @@ exports.fetchKeybase = async (username, fingerprint) => { * Get a public key from plaintext data * @function * @param {string} rawKeyContent - Plaintext ASCII-formatted public key data - * @returns {openpgp.key.Key} + * @returns {openpgp.PublicKey} * @example * const plainkey = `-----BEGIN PGP PUBLIC KEY BLOCK----- * @@ -139,7 +147,13 @@ exports.fetchKeybase = async (username, fingerprint) => { * const key = doip.keys.fetchPlaintext(plainkey); */ exports.fetchPlaintext = async (rawKeyContent) => { - const publicKey = (await openpgp.key.readArmored(rawKeyContent)).keys[0] + const publicKey = await openpgp.readKey({ + armoredKey: rawKeyContent + }) + .catch((error) => { + throw new Error(`Key could not be read (${error})`) + }) + return publicKey } @@ -147,7 +161,7 @@ exports.fetchPlaintext = async (rawKeyContent) => { * Fetch a public key using an URI * @function * @param {string} uri - URI that defines the location of the key - * @returns {openpgp.key.Key} + * @returns {openpgp.PublicKey} * @example * const key1 = doip.keys.fetchURI('hkp:alice@domain.tld'); * const key2 = doip.keys.fetchURI('hkp:123abc123abc'); @@ -186,7 +200,7 @@ exports.fetchURI = async (uri) => { /** * Process a public key to get user data and claims * @function - * @param {openpgp.key.Key} publicKey - The public key to process + * @param {openpgp.PublicKey} publicKey - The public key to process * @returns {object} * @example * const key = doip.keys.fetchURI('hkp:alice@domain.tld'); @@ -196,11 +210,11 @@ exports.fetchURI = async (uri) => { * }); */ exports.process = async (publicKey) => { - if (!publicKey || !(publicKey instanceof openpgp.key.Key)) { + if (!publicKey || !(publicKey instanceof openpgp.PublicKey)) { throw new Error('Invalid public key') } - const fingerprint = await publicKey.primaryKey.getFingerprint() + const fingerprint = publicKey.getFingerprint() const primaryUser = await publicKey.getPrimaryUser() const users = publicKey.users const usersOutput = [] @@ -229,7 +243,7 @@ exports.process = async (publicKey) => { ) .map( ({ value }) => - new Claim(openpgp.util.decode_utf8(value), fingerprint) + new Claim(new TextDecoder().decode(value), fingerprint) ) usersOutput[i].userData.isRevoked = selfCertification.revoked diff --git a/src/signatures.js b/src/signatures.js index 9cefe96..14527e2 100644 --- a/src/signatures.js +++ b/src/signatures.js @@ -46,13 +46,14 @@ const process = async (signature) => { } try { - sigData = await openpgp.cleartext.readArmored(signature) + sigData = await openpgp.readCleartextMessage({ + cleartextMessage: signature + }) } catch (error) { - throw new Error('invalid_signature') + throw new Error(`Signature could not be read (${error})`) } - - const issuerKeyId = sigData.signature.packets[0].issuerKeyId.toHex() - const signersUserId = sigData.signature.packets[0].signersUserId + const issuerKeyID = sigData.signature.packets[0].issuerKeyID.toHex() + const signersUserID = sigData.signature.packets[0].signersUserID const preferredKeyServer = sigData.signature.packets[0].preferredKeyServer || 'https://keys.openpgp.org/' @@ -87,9 +88,9 @@ const process = async (signature) => { } catch (e) {} } // Try WKD - if (!result.key.data && signersUserId) { + if (!result.key.data && signersUserID) { try { - result.key.uri = `wkd:${signersUserId}` + result.key.uri = `wkd:${signersUserID}` result.key.data = await keys.fetchURI(result.key.uri) result.key.fetchMethod = 'wkd' } catch (e) {} @@ -98,7 +99,7 @@ const process = async (signature) => { if (!result.key.data) { try { const match = preferredKeyServer.match(/^(.*:\/\/)?([^/]*)(?:\/)?$/i) - result.key.uri = `hkp:${match[2]}:${issuerKeyId || signersUserId}` + result.key.uri = `hkp:${match[2]}:${issuerKeyID || signersUserID}` result.key.data = await keys.fetchURI(result.key.uri) result.key.fetchMethod = 'hkp' } catch (e) { @@ -115,9 +116,9 @@ const process = async (signature) => { const primaryUserData = await result.key.data.getPrimaryUser() let userData - if (signersUserId) { + if (signersUserID) { result.key.data.users.forEach((user) => { - if (user.userId.email === signersUserId) { + if (user.userID.email === signersUserID) { userData = user } }) @@ -127,11 +128,11 @@ const process = async (signature) => { } result.users[0].userData = { - id: userData.userId ? userData.userId.userid : null, - name: userData.userId ? userData.userId.name : null, - email: userData.userId ? userData.userId.email : null, - comment: userData.userId ? userData.userId.comment : null, - isPrimary: primaryUserData.user.userId.userid === userData.userId.userid + id: userData.userID ? userData.userID.userid : null, + name: userData.userID ? userData.userID.name : null, + email: userData.userID ? userData.userID.email : null, + comment: userData.userID ? userData.userID.comment : null, + isPrimary: primaryUserData.user.userID.userid === userData.userID.userid } result.primaryUserIndex = result.users[0].userData.isPrimary ? 0 : null diff --git a/test/keys.test.js b/test/keys.test.js index ff5aeac..bc98ee8 100644 --- a/test/keys.test.js +++ b/test/keys.test.js @@ -99,7 +99,7 @@ describe('keys.fetchURI', () => { it('should return a Key object when provided a hkp: uri', async () => { expect( await doipjs.keys.fetchURI(`hkp:${pubKeyFingerprint}`) - ).to.be.instanceOf(openpgp.key.Key) + ).to.be.instanceOf(openpgp.PublicKey) }).timeout('12s') it('should reject when provided an invalid uri', () => { return expect( @@ -115,12 +115,12 @@ describe('keys.fetchHKP', () => { }) it('should return a Key object when provided a valid fingerprint', async () => { expect(await doipjs.keys.fetchHKP(pubKeyFingerprint)).to.be.instanceOf( - openpgp.key.Key + openpgp.PublicKey ) }) it('should return a Key object when provided a valid email address', async () => { expect(await doipjs.keys.fetchHKP(pubKeyEmail)).to.be.instanceOf( - openpgp.key.Key + openpgp.PublicKey ) }) it('should reject when provided an invalid fingerprint', async () => { @@ -146,7 +146,7 @@ describe('keys.fetchPlaintext', () => { }) it('should return a Key object', async () => { expect(await doipjs.keys.fetchPlaintext(pubKeyPlaintext)).to.be.instanceOf( - openpgp.key.Key + openpgp.PublicKey ) }) }) diff --git a/yarn.lock b/yarn.lock index df779a1..f0b5ac9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@ampproject/remapping@^2.0.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.0.tgz#72becdf17ee44b2d1ac5651fb12f1952c336fe23" - integrity sha512-d5RysTlJ7hmw5Tw4UxgxcY3lkMe92n8sXCcuLPAyIAHK6j8DefDwtGnVVDgOnv+RnEosulDJ9NPKQL27bDId0g== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.1.tgz#7922fb0817bf3166d8d9e258c57477e3fd1c3610" + integrity sha512-Aolwjd7HSC2PyY0fDj/wA/EimQT4HfEnFYNp5s9CQlrdhyvWTtvZ5YzrUPu6R6/1jKiUlxu8bUhkdSnKHNAHMA== dependencies: "@jridgewell/trace-mapping" "^0.3.0" @@ -278,19 +278,19 @@ strip-json-comments "^3.1.1" "@jridgewell/resolve-uri@^3.0.3": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.4.tgz#b876e3feefb9c8d3aa84014da28b5e52a0640d72" - integrity sha512-cz8HFjOFfUBtvN+NXYSFMHYRdxZMaEl0XypVrhzxBgadKIXhIkRd8aMeHhmF56Sl7SuS8OnUpQ73/k9LE4VnLg== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" + integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.10" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.10.tgz#baf57b4e2a690d4f38560171f91783656b7f8186" - integrity sha512-Ht8wIW5v165atIX1p+JvKR5ONzUyF4Ac8DZIQ5kZs9zrb6M8SJNXpx1zn04rn65VjBMygRoMXcyYwNK0fT7bEg== + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== "@jridgewell/trace-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.2.tgz#e051581782a770c30ba219634f2019241c5d3cde" - integrity sha512-9KzzH4kMjA2XmBRHfqG2/Vtl7s92l6uNDd0wW7frDE+EUvQFGqNXhWp0UGJjSkt3v2AYjzOZn1QO9XaTNJIt1Q== + version "0.3.4" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" + integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -321,6 +321,49 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@openpgp/hkp-client@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@openpgp/hkp-client/-/hkp-client-0.0.2.tgz#d8737358efcf6412c8273f89385e020766613e88" + integrity sha512-hA71RhqfLfNltZsy/USTQehE2QAVB3eK4xx8p76XtFJy5Zg6gK2XbZvOC/x/yG8i2Ipbyul1DMTMxH9v8rfPKw== + dependencies: + node-fetch "^2.6.1" + +"@openpgp/wkd-client@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@openpgp/wkd-client/-/wkd-client-0.0.3.tgz#e9f137ed21ee8631451782e22a2740fd781a2534" + integrity sha512-qe+uWtCJetuG78KhfiQyEA+ZciC/qeECXRj+LCm4m0s98qR2wPwYHRI1u8aFbtkN6G4ZMyKN+opY++fJS5l3vg== + dependencies: + "@peculiar/webcrypto" "^1.1.6" + node-fetch "^2.6.1" + +"@peculiar/asn1-schema@^2.0.44": + version "2.0.44" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.0.44.tgz#dcb1b8f84a4dd5f07f674028beade9c3de43cc06" + integrity sha512-uaCnjQ9A9WwQSMuDJcNOCYEPXTahgKbFMvI7eMOMd8lXgx0J1eU7F3BoMsK5PFxa3dVUxjSQbaOjfgGoeHGgoQ== + dependencies: + "@types/asn1js" "^2.0.2" + asn1js "^2.1.1" + pvtsutils "^1.2.1" + tslib "^2.3.0" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.1.6": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.2.3.tgz#79268ef0a8068bed2a40fc33bc68b4d3546fe2cc" + integrity sha512-q7wDfZy3k/tpnsYB23/MyyDkjn6IdHh8w+xwoVMS5cu6CjVoFzngXDZEOOuSE4zus2yO6ciQhhHxd4XkLpwVnQ== + dependencies: + "@peculiar/asn1-schema" "^2.0.44" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.2.1" + tslib "^2.3.1" + webcrypto-core "^1.4.0" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -338,6 +381,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@types/asn1js@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/asn1js/-/asn1js-2.0.2.tgz#bb1992291381b5f06e22a829f2ae009267cdf8c5" + integrity sha512-t4YHCgtD+ERvH0FyxvNlYwJ2ezhqw7t+Ygh4urQ7dJER8i185JPv6oIM3ey5YQmGN6Zp9EMbpohkjZi9t3UxwA== + "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -375,9 +423,9 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": - version "17.0.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.16.tgz#e3733f46797b9df9e853ca9f719c8a6f7b84cd26" - integrity sha512-ydLaGVfQOQ6hI1xK2A5nVh8bl0OGoIfYMxPWHqqYe9bTkWCfqiVvZoh2I/QF2sNSkZzZyROBoTefIEI+PB6iIA== + version "17.0.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.18.tgz#3b4fed5cfb58010e3a2be4b6e74615e4847f1074" + integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA== "@types/parse-json@^4.0.0": version "4.0.0" @@ -846,6 +894,13 @@ asn1.js@^5.0.0, asn1.js@^5.2.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" +asn1js@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-2.2.0.tgz#d890fcdda86b8a005693df14a986bfb2c2069c57" + integrity sha512-oagLNqpfNv7CvmyMoexMDNyVDSiq1rya0AEUgcLlNHdHgNl6U/hi8xY370n5y+ZIFEXOx0J4B1qF2NDjMRxklA== + dependencies: + pvutils latest + assert@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" @@ -1242,9 +1297,9 @@ camelcase@^6.0.0, camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001286: - version "1.0.30001309" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001309.tgz#e0ee78b9bec0704f67304b00ff3c5c0c768a9f62" - integrity sha512-Pl8vfigmBXXq+/yUz1jUwULeq9xhMJznzdc/xwl4WclDAuebcTHVefpz8lE/bMI+UN7TOkSSe7B7RnZd6+dzjA== + version "1.0.30001312" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f" + integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ== catharsis@^0.9.0: version "0.9.0" @@ -1351,9 +1406,9 @@ clean-css@^4.1.6, clean-css@^4.2.3: source-map "~0.6.0" clean-jsdoc-theme@^3.2.4: - version "3.3.1" - resolved "https://registry.yarnpkg.com/clean-jsdoc-theme/-/clean-jsdoc-theme-3.3.1.tgz#fedf8111519773101d6b5610ac6a43ba19ca91ca" - integrity sha512-e2P5PB1YcRpWto5pNgG7CLIlMLuEF+UGCf5CPYNvMsqw5or30VQFITWKfBuKZzD98Q9H0wW2n5aqV6CuT2FhGQ== + version "3.3.2" + resolved "https://registry.yarnpkg.com/clean-jsdoc-theme/-/clean-jsdoc-theme-3.3.2.tgz#e0e8b3d322d31150cc07df804087d19789a35d90" + integrity sha512-NK1R/0Ezo6+yXeFo1zzm4a0Hx566rdTxKZ9lSo+f47HvJkFmTJ1zUdA17TXqgAUcJr1lLGkBiJzjLCuG1CK7UA== dependencies: fs-extra "^9.1.0" @@ -1915,9 +1970,9 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.4.17: - version "1.4.66" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.66.tgz#d7453d363dcd7b06ed1757adcde34d724e27b367" - integrity sha512-f1RXFMsvwufWLwYUxTiP7HmjprKXrqEWHiQkjAYa9DJeVIlZk5v8gBGcaV+FhtXLly6C1OTVzQY+2UQrACiLlg== + version "1.4.71" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz#17056914465da0890ce00351a3b946fd4cd51ff6" + integrity sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw== elliptic@^6.5.3: version "6.5.4" @@ -2717,7 +2772,7 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== @@ -3649,9 +3704,9 @@ loose-envify@^1.4.0: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.3.tgz#5a92027d54cfb6de4c327d3c3b705561d394d3c6" - integrity sha512-krIV4Cf1BIGIx2t1e6tucThhrBemUnIUjMtD2vN4mrMxnxpBvrcosBSpooqunBqP/hOEEV1w/Cr1YskGtqw5Jg== + version "2.3.4" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== dependencies: get-func-name "^2.0.0" @@ -3846,9 +3901,9 @@ minimatch@3.0.4: brace-expansion "^1.1.7" minimatch@^3.0.4: - version "3.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" - integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== + version "3.1.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.1.tgz#879ad447200773912898b46cd516a7abbb5e50b0" + integrity sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A== dependencies: brace-expansion "^1.1.7" @@ -3971,20 +4026,13 @@ node-environment-flags@^1.0.5: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@^2.1.2, node-fetch@^2.6.1: +node-fetch@^2.6.1: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" -node-localstorage@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-1.3.1.tgz#3177ef42837f398aee5dd75e319b281e40704243" - integrity sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ== - dependencies: - write-file-atomic "^1.1.4" - node-releases@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" @@ -4140,14 +4188,12 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -openpgp@^4.10.9: - version "4.10.10" - resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-4.10.10.tgz#65b58d24466c278120c7f2d1ebc88ef9b15d6361" - integrity sha512-Ub48OogGPjNsr0G/wnJ/SyAQzt/tfcXZTWVZdjKFpXCQV1Ca+upFdSPPkBlGG3lb9EQGOKZJ2tzYNH6ZyKMkDQ== +openpgp@^5.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.1.0.tgz#4da3880ad04d9d75b3f0470451f6862d43252568" + integrity sha512-keCno6QPMXWwfjrOOtT8fwZ5XgCcB7vZH80xb44SbJ49qQ11Efl2fFfqHpaie7jTQFjRKxgT8hSFPXJUjogNPw== dependencies: asn1.js "^5.0.0" - node-fetch "^2.1.2" - node-localstorage "~1.3.0" optionator@^0.8.1: version "0.8.3" @@ -4557,6 +4603,18 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" +pvtsutils@^1.2.0, pvtsutils@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.2.1.tgz#8212e846ca9afb21e40cebb0691755649f9f498a" + integrity sha512-Q867jEr30lBR2YSFFLZ0/XsEvpweqH6Kj096wmlRAFXrdRGPCNq2iz9B5Tk085EZ+OBZyYAVA5UhPkjSHGrUzQ== + dependencies: + tslib "^2.3.1" + +pvutils@latest: + version "1.0.17" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.0.17.tgz#ade3c74dfe7178944fe44806626bd2e249d996bf" + integrity sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ== + qs@6.9.6: version "6.9.6" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" @@ -4856,9 +4914,9 @@ run-parallel@^1.1.9: queue-microtask "^1.2.2" rxjs@^7.5.1: - version "7.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.3.tgz#1359f8a4704797bee74357d65a125dbc7d8f4a91" - integrity sha512-6162iC/N7L7K8q3UvdOMWix1ju+esADGrDaPrTu5XJmCv69YNdYoUaop/iatN8GHK+YHOdszPP+qygA0yi04zQ== + version "7.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.4.tgz#3d6bd407e6b7ce9a123e76b1e770dc5761aa368d" + integrity sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ== dependencies: tslib "^2.1.0" @@ -5070,11 +5128,6 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= - source-map-support@^0.5.16, source-map-support@~0.5.12, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -5513,7 +5566,7 @@ tsconfig-paths@^3.11.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^2.0.3, tslib@^2.1.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== @@ -5770,6 +5823,17 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" +webcrypto-core@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.4.0.tgz#9a395920792bcfa4605dc64aaf264156f79e873e" + integrity sha512-HY3Zo0GcRIQUUDnlZ/shGjN+4f7LVMkdJZoGPog+oHhJsJdMz6iM8Za5xZ0t6qg7Fx/JXXz+oBv2J2p982hGTQ== + dependencies: + "@peculiar/asn1-schema" "^2.0.44" + "@peculiar/json-schema" "^1.1.12" + asn1js "^2.1.1" + pvtsutils "^1.2.0" + tslib "^2.3.1" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -5898,15 +5962,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^1.1.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - write-file-atomic@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"