diff options
author | Chocobozzz <me@florianbigard.com> | 2019-08-29 16:15:41 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2019-08-29 16:15:41 +0200 |
commit | ad513607a3886cfabe083531c42911bc3c67bdfb (patch) | |
tree | 275af782814ad3aa62da4834ec5696467aacdd87 | |
parent | f0a47bc92aa20b91b46197a4d3fc430aea962848 (diff) | |
download | PeerTube-ad513607a3886cfabe083531c42911bc3c67bdfb.tar.gz PeerTube-ad513607a3886cfabe083531c42911bc3c67bdfb.tar.zst PeerTube-ad513607a3886cfabe083531c42911bc3c67bdfb.zip |
Remove old JSON LD signature implementation
Only PeerTube was compatible with it, and the library has moved on
RsaSignature2018 and removed RsaSignature2017 support. We had to create
a dirty fork of the RsaSignature2017 branch, which is not ideal.
Now we use the Mastodon implementation, that most other AP
implementations that support JSONLD signatures use.
-rw-r--r-- | package.json | 1 | ||||
-rw-r--r-- | server/helpers/custom-jsonld-signature.ts | 5 | ||||
-rw-r--r-- | server/helpers/peertube-crypto.ts | 121 | ||||
-rw-r--r-- | server/middlewares/activitypub.ts | 2 | ||||
-rw-r--r-- | server/tests/api/activitypub/helpers.ts | 13 | ||||
-rw-r--r-- | yarn.lock | 124 |
6 files changed, 61 insertions, 205 deletions
diff --git a/package.json b/package.json index ce689a4b3..0c1ec93d1 100644 --- a/package.json +++ b/package.json | |||
@@ -128,7 +128,6 @@ | |||
128 | "iso-639-3": "^1.0.1", | 128 | "iso-639-3": "^1.0.1", |
129 | "js-yaml": "^3.5.4", | 129 | "js-yaml": "^3.5.4", |
130 | "jsonld": "~1.1.0", | 130 | "jsonld": "~1.1.0", |
131 | "jsonld-signatures": "https://github.com/Chocobozzz/jsonld-signatures#rsa2017", | ||
132 | "lodash": "^4.17.10", | 131 | "lodash": "^4.17.10", |
133 | "lru-cache": "^5.1.1", | 132 | "lru-cache": "^5.1.1", |
134 | "magnet-uri": "^5.1.4", | 133 | "magnet-uri": "^5.1.4", |
diff --git a/server/helpers/custom-jsonld-signature.ts b/server/helpers/custom-jsonld-signature.ts index a3bceb047..cb07fa3b2 100644 --- a/server/helpers/custom-jsonld-signature.ts +++ b/server/helpers/custom-jsonld-signature.ts | |||
@@ -1,6 +1,5 @@ | |||
1 | import * as AsyncLRU from 'async-lru' | 1 | import * as AsyncLRU from 'async-lru' |
2 | import * as jsonld from 'jsonld' | 2 | import * as jsonld from 'jsonld' |
3 | import * as jsig from 'jsonld-signatures' | ||
4 | import { logger } from './logger' | 3 | import { logger } from './logger' |
5 | 4 | ||
6 | const CACHE = { | 5 | const CACHE = { |
@@ -79,6 +78,4 @@ jsonld.documentLoader = (url, cb) => { | |||
79 | lru.get(url, cb) | 78 | lru.get(url, cb) |
80 | } | 79 | } |
81 | 80 | ||
82 | jsig.use('jsonld', jsonld) | 81 | export { jsonld } |
83 | |||
84 | export { jsig, jsonld } | ||
diff --git a/server/helpers/peertube-crypto.ts b/server/helpers/peertube-crypto.ts index 085cd62c9..9eb782302 100644 --- a/server/helpers/peertube-crypto.ts +++ b/server/helpers/peertube-crypto.ts | |||
@@ -1,11 +1,10 @@ | |||
1 | import { Request } from 'express' | 1 | import { Request } from 'express' |
2 | import { BCRYPT_SALT_SIZE, HTTP_SIGNATURE, PRIVATE_RSA_KEY_SIZE } from '../initializers/constants' | 2 | import { BCRYPT_SALT_SIZE, HTTP_SIGNATURE, PRIVATE_RSA_KEY_SIZE } from '../initializers/constants' |
3 | import { ActorModel } from '../models/activitypub/actor' | ||
4 | import { createPrivateKey, getPublicKey, promisify1, promisify2, sha256 } from './core-utils' | 3 | import { createPrivateKey, getPublicKey, promisify1, promisify2, sha256 } from './core-utils' |
5 | import { jsig, jsonld } from './custom-jsonld-signature' | 4 | import { jsonld } from './custom-jsonld-signature' |
6 | import { logger } from './logger' | 5 | import { logger } from './logger' |
7 | import { cloneDeep } from 'lodash' | 6 | import { cloneDeep } from 'lodash' |
8 | import { createVerify } from 'crypto' | 7 | import { createSign, createVerify } from 'crypto' |
9 | import { buildDigest } from '../lib/job-queue/handlers/utils/activitypub-http-utils' | 8 | import { buildDigest } from '../lib/job-queue/handlers/utils/activitypub-http-utils' |
10 | import * as bcrypt from 'bcrypt' | 9 | import * as bcrypt from 'bcrypt' |
11 | import { MActor } from '../typings/models' | 10 | import { MActor } from '../typings/models' |
@@ -57,70 +56,21 @@ function parseHTTPSignature (req: Request, clockSkew?: number) { | |||
57 | 56 | ||
58 | // JSONLD | 57 | // JSONLD |
59 | 58 | ||
60 | async function isJsonLDSignatureVerified (fromActor: MActor, signedDocument: any): Promise<boolean> { | 59 | function isJsonLDSignatureVerified (fromActor: MActor, signedDocument: any): Promise<boolean> { |
61 | if (signedDocument.signature.type === 'RsaSignature2017') { | 60 | if (signedDocument.signature.type === 'RsaSignature2017') { |
62 | // Mastodon algorithm | 61 | return isJsonLDRSA2017Verified(fromActor, signedDocument) |
63 | const res = await isJsonLDRSA2017Verified(fromActor, signedDocument) | ||
64 | // Success? If no, try with our library | ||
65 | if (res === true) return true | ||
66 | } | 62 | } |
67 | 63 | ||
68 | const publicKeyObject = { | 64 | logger.warn('Unknown JSON LD signature %s.', signedDocument.signature.type, signedDocument) |
69 | '@context': jsig.SECURITY_CONTEXT_URL, | ||
70 | id: fromActor.url, | ||
71 | type: 'CryptographicKey', | ||
72 | owner: fromActor.url, | ||
73 | publicKeyPem: fromActor.publicKey | ||
74 | } | ||
75 | |||
76 | const publicKeyOwnerObject = { | ||
77 | '@context': jsig.SECURITY_CONTEXT_URL, | ||
78 | id: fromActor.url, | ||
79 | publicKey: [ publicKeyObject ] | ||
80 | } | ||
81 | 65 | ||
82 | const options = { | 66 | return Promise.resolve(false) |
83 | publicKey: publicKeyObject, | ||
84 | publicKeyOwner: publicKeyOwnerObject | ||
85 | } | ||
86 | |||
87 | return jsig.promises | ||
88 | .verify(signedDocument, options) | ||
89 | .then((result: { verified: boolean }) => result.verified) | ||
90 | .catch(err => { | ||
91 | logger.error('Cannot check signature.', { err }) | ||
92 | return false | ||
93 | }) | ||
94 | } | 67 | } |
95 | 68 | ||
96 | // Backward compatibility with "other" implementations | 69 | // Backward compatibility with "other" implementations |
97 | async function isJsonLDRSA2017Verified (fromActor: MActor, signedDocument: any) { | 70 | async function isJsonLDRSA2017Verified (fromActor: MActor, signedDocument: any) { |
98 | function hash (obj: any): Promise<any> { | ||
99 | return jsonld.promises | ||
100 | .normalize(obj, { | ||
101 | algorithm: 'URDNA2015', | ||
102 | format: 'application/n-quads' | ||
103 | }) | ||
104 | .then(res => sha256(res)) | ||
105 | } | ||
106 | |||
107 | const signatureCopy = cloneDeep(signedDocument.signature) | ||
108 | Object.assign(signatureCopy, { | ||
109 | '@context': [ | ||
110 | 'https://w3id.org/security/v1', | ||
111 | { RsaSignature2017: 'https://w3id.org/security#RsaSignature2017' } | ||
112 | ] | ||
113 | }) | ||
114 | delete signatureCopy.type | ||
115 | delete signatureCopy.id | ||
116 | delete signatureCopy.signatureValue | ||
117 | |||
118 | const docWithoutSignature = cloneDeep(signedDocument) | ||
119 | delete docWithoutSignature.signature | ||
120 | |||
121 | const [ documentHash, optionsHash ] = await Promise.all([ | 71 | const [ documentHash, optionsHash ] = await Promise.all([ |
122 | hash(docWithoutSignature), | 72 | createDocWithoutSignatureHash(signedDocument), |
123 | hash(signatureCopy) | 73 | createSignatureHash(signedDocument.signature) |
124 | ]) | 74 | ]) |
125 | 75 | ||
126 | const toVerify = optionsHash + documentHash | 76 | const toVerify = optionsHash + documentHash |
@@ -131,14 +81,27 @@ async function isJsonLDRSA2017Verified (fromActor: MActor, signedDocument: any) | |||
131 | return verify.verify(fromActor.publicKey, signedDocument.signature.signatureValue, 'base64') | 81 | return verify.verify(fromActor.publicKey, signedDocument.signature.signatureValue, 'base64') |
132 | } | 82 | } |
133 | 83 | ||
134 | function signJsonLDObject (byActor: MActor, data: any) { | 84 | async function signJsonLDObject (byActor: MActor, data: any) { |
135 | const options = { | 85 | const signature = { |
136 | privateKeyPem: byActor.privateKey, | 86 | type: 'RsaSignature2017', |
137 | creator: byActor.url, | 87 | creator: byActor.url, |
138 | algorithm: 'RsaSignature2017' | 88 | created: new Date().toISOString() |
139 | } | 89 | } |
140 | 90 | ||
141 | return jsig.promises.sign(data, options) | 91 | const [ documentHash, optionsHash ] = await Promise.all([ |
92 | createDocWithoutSignatureHash(data), | ||
93 | createSignatureHash(signature) | ||
94 | ]) | ||
95 | |||
96 | const toSign = optionsHash + documentHash | ||
97 | |||
98 | const sign = createSign('RSA-SHA256') | ||
99 | sign.update(toSign, 'utf8') | ||
100 | |||
101 | const signatureValue = sign.sign(byActor.privateKey, 'base64') | ||
102 | Object.assign(signature, { signatureValue }) | ||
103 | |||
104 | return Object.assign(data, { signature }) | ||
142 | } | 105 | } |
143 | 106 | ||
144 | // --------------------------------------------------------------------------- | 107 | // --------------------------------------------------------------------------- |
@@ -155,3 +118,35 @@ export { | |||
155 | } | 118 | } |
156 | 119 | ||
157 | // --------------------------------------------------------------------------- | 120 | // --------------------------------------------------------------------------- |
121 | |||
122 | function hash (obj: any): Promise<any> { | ||
123 | return jsonld.promises | ||
124 | .normalize(obj, { | ||
125 | algorithm: 'URDNA2015', | ||
126 | format: 'application/n-quads' | ||
127 | }) | ||
128 | .then(res => sha256(res)) | ||
129 | } | ||
130 | |||
131 | function createSignatureHash (signature: any) { | ||
132 | const signatureCopy = cloneDeep(signature) | ||
133 | Object.assign(signatureCopy, { | ||
134 | '@context': [ | ||
135 | 'https://w3id.org/security/v1', | ||
136 | { RsaSignature2017: 'https://w3id.org/security#RsaSignature2017' } | ||
137 | ] | ||
138 | }) | ||
139 | |||
140 | delete signatureCopy.type | ||
141 | delete signatureCopy.id | ||
142 | delete signatureCopy.signatureValue | ||
143 | |||
144 | return hash(signatureCopy) | ||
145 | } | ||
146 | |||
147 | function createDocWithoutSignatureHash (doc: any) { | ||
148 | const docWithoutSignature = cloneDeep(doc) | ||
149 | delete docWithoutSignature.signature | ||
150 | |||
151 | return hash(docWithoutSignature) | ||
152 | } | ||
diff --git a/server/middlewares/activitypub.ts b/server/middlewares/activitypub.ts index b1e5b5236..bea213d27 100644 --- a/server/middlewares/activitypub.ts +++ b/server/middlewares/activitypub.ts | |||
@@ -101,6 +101,8 @@ async function checkJsonLDSignature (req: Request, res: Response) { | |||
101 | const verified = await isJsonLDSignatureVerified(actor, req.body) | 101 | const verified = await isJsonLDSignatureVerified(actor, req.body) |
102 | 102 | ||
103 | if (verified !== true) { | 103 | if (verified !== true) { |
104 | logger.warn('Signature not verified.', req.body) | ||
105 | |||
104 | res.sendStatus(403) | 106 | res.sendStatus(403) |
105 | return false | 107 | return false |
106 | } | 108 | } |
diff --git a/server/tests/api/activitypub/helpers.ts b/server/tests/api/activitypub/helpers.ts index 365d0e1ae..0d1f154fe 100644 --- a/server/tests/api/activitypub/helpers.ts +++ b/server/tests/api/activitypub/helpers.ts | |||
@@ -53,19 +53,6 @@ describe('Test activity pub helpers', function () { | |||
53 | expect(result).to.be.false | 53 | expect(result).to.be.false |
54 | }) | 54 | }) |
55 | 55 | ||
56 | it('Should fail with an invalid PeerTube URL', async function () { | ||
57 | const keys = require('./json/peertube/keys.json') | ||
58 | const body = require('./json/peertube/announce-without-context.json') | ||
59 | |||
60 | const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey } | ||
61 | const signedBody = await buildSignedActivity(actorSignature as any, body) | ||
62 | |||
63 | const fromActor = { publicKey: keys.publicKey, url: 'http://localhost:9003/accounts/peertube' } | ||
64 | const result = await isJsonLDSignatureVerified(fromActor as any, signedBody) | ||
65 | |||
66 | expect(result).to.be.false | ||
67 | }) | ||
68 | |||
69 | it('Should succeed with a valid PeerTube signature', async function () { | 56 | it('Should succeed with a valid PeerTube signature', async function () { |
70 | const keys = require('./json/peertube/keys.json') | 57 | const keys = require('./json/peertube/keys.json') |
71 | const body = require('./json/peertube/announce-without-context.json') | 58 | const body = require('./json/peertube/announce-without-context.json') |
@@ -828,24 +828,6 @@ bindings@~1.3.0: | |||
828 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz#21fc7c6d67c18516ec5aaa2815b145ff77b26ea5" | 828 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz#21fc7c6d67c18516ec5aaa2815b145ff77b26ea5" |
829 | integrity sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew== | 829 | integrity sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew== |
830 | 830 | ||
831 | bitcore-lib@^0.13.7: | ||
832 | version "0.13.19" | ||
833 | resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-0.13.19.tgz#48af1e9bda10067c1ab16263472b5add2000f3dc" | ||
834 | integrity sha1-SK8em9oQBnwasWJjRyta3SAA89w= | ||
835 | dependencies: | ||
836 | bn.js "=2.0.4" | ||
837 | bs58 "=2.0.0" | ||
838 | buffer-compare "=1.0.0" | ||
839 | elliptic "=3.0.3" | ||
840 | inherits "=2.0.1" | ||
841 | lodash "=3.10.1" | ||
842 | |||
843 | "bitcore-message@github:CoMakery/bitcore-message#dist": | ||
844 | version "1.0.2" | ||
845 | resolved "https://codeload.github.com/CoMakery/bitcore-message/tar.gz/8799cc327029c3d34fc725f05b2cf981363f6ebf" | ||
846 | dependencies: | ||
847 | bitcore-lib "^0.13.7" | ||
848 | |||
849 | bitfield@^2.0.0: | 831 | bitfield@^2.0.0: |
850 | version "2.0.0" | 832 | version "2.0.0" |
851 | resolved "https://registry.yarnpkg.com/bitfield/-/bitfield-2.0.0.tgz#fbe6767592fe5b4c87ecf1d04126294cc1bfa837" | 833 | resolved "https://registry.yarnpkg.com/bitfield/-/bitfield-2.0.0.tgz#fbe6767592fe5b4c87ecf1d04126294cc1bfa837" |
@@ -968,16 +950,6 @@ bluebird@^3.0.5, bluebird@^3.5.0: | |||
968 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" | 950 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" |
969 | integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== | 951 | integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== |
970 | 952 | ||
971 | bn.js@=2.0.4: | ||
972 | version "2.0.4" | ||
973 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.0.4.tgz#220a7cd677f7f1bfa93627ff4193776fe7819480" | ||
974 | integrity sha1-Igp81nf38b+pNif/QZN3b+eBlIA= | ||
975 | |||
976 | bn.js@^2.0.0: | ||
977 | version "2.2.0" | ||
978 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz#12162bc2ae71fc40a5626c33438f3a875cd37625" | ||
979 | integrity sha1-EhYrwq5x/EClYmwzQ486h1zTdiU= | ||
980 | |||
981 | bn.js@^4.4.0: | 953 | bn.js@^4.4.0: |
982 | version "4.11.8" | 954 | version "4.11.8" |
983 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" | 955 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" |
@@ -1043,11 +1015,6 @@ braces@^3.0.1: | |||
1043 | dependencies: | 1015 | dependencies: |
1044 | fill-range "^7.0.1" | 1016 | fill-range "^7.0.1" |
1045 | 1017 | ||
1046 | brorand@^1.0.1: | ||
1047 | version "1.1.0" | ||
1048 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" | ||
1049 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= | ||
1050 | |||
1051 | browser-stdout@1.3.1: | 1018 | browser-stdout@1.3.1: |
1052 | version "1.3.1" | 1019 | version "1.3.1" |
1053 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" | 1020 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" |
@@ -1058,11 +1025,6 @@ browserify-package-json@^1.0.0: | |||
1058 | resolved "https://registry.yarnpkg.com/browserify-package-json/-/browserify-package-json-1.0.1.tgz#98dde8aa5c561fd6d3fe49bbaa102b74b396fdea" | 1025 | resolved "https://registry.yarnpkg.com/browserify-package-json/-/browserify-package-json-1.0.1.tgz#98dde8aa5c561fd6d3fe49bbaa102b74b396fdea" |
1059 | integrity sha1-mN3oqlxWH9bT/km7qhArdLOW/eo= | 1026 | integrity sha1-mN3oqlxWH9bT/km7qhArdLOW/eo= |
1060 | 1027 | ||
1061 | bs58@=2.0.0: | ||
1062 | version "2.0.0" | ||
1063 | resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.0.tgz#72b713bed223a0ac518bbda0e3ce3f4817f39eb5" | ||
1064 | integrity sha1-crcTvtIjoKxRi72g484/SBfznrU= | ||
1065 | |||
1066 | buffer-alloc-unsafe@^1.1.0: | 1028 | buffer-alloc-unsafe@^1.1.0: |
1067 | version "1.1.0" | 1029 | version "1.1.0" |
1068 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" | 1030 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" |
@@ -1076,16 +1038,6 @@ buffer-alloc@^1.1.0, buffer-alloc@^1.2.0: | |||
1076 | buffer-alloc-unsafe "^1.1.0" | 1038 | buffer-alloc-unsafe "^1.1.0" |
1077 | buffer-fill "^1.0.0" | 1039 | buffer-fill "^1.0.0" |
1078 | 1040 | ||
1079 | buffer-compare@=1.0.0: | ||
1080 | version "1.0.0" | ||
1081 | resolved "https://registry.yarnpkg.com/buffer-compare/-/buffer-compare-1.0.0.tgz#acaa7a966e98eee9fae14b31c39a5f158fb3c4a2" | ||
1082 | integrity sha1-rKp6lm6Y7un64Usxw5pfFY+zxKI= | ||
1083 | |||
1084 | buffer-equal-constant-time@1.0.1: | ||
1085 | version "1.0.1" | ||
1086 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" | ||
1087 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= | ||
1088 | |||
1089 | buffer-equals@^1.0.3, buffer-equals@^1.0.4: | 1041 | buffer-equals@^1.0.3, buffer-equals@^1.0.4: |
1090 | version "1.0.4" | 1042 | version "1.0.4" |
1091 | resolved "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz#0353b54fd07fd9564170671ae6f66b9cf10d27f5" | 1043 | resolved "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz#0353b54fd07fd9564170671ae6f66b9cf10d27f5" |
@@ -2096,13 +2048,6 @@ ecc-jsbn@~0.1.1: | |||
2096 | jsbn "~0.1.0" | 2048 | jsbn "~0.1.0" |
2097 | safer-buffer "^2.1.0" | 2049 | safer-buffer "^2.1.0" |
2098 | 2050 | ||
2099 | ecdsa-sig-formatter@1.0.11: | ||
2100 | version "1.0.11" | ||
2101 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" | ||
2102 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== | ||
2103 | dependencies: | ||
2104 | safe-buffer "^5.0.1" | ||
2105 | |||
2106 | ee-first@1.1.1: | 2051 | ee-first@1.1.1: |
2107 | version "1.1.1" | 2052 | version "1.1.1" |
2108 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" | 2053 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" |
@@ -2113,16 +2058,6 @@ elegant-spinner@^1.0.1: | |||
2113 | resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" | 2058 | resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" |
2114 | integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= | 2059 | integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= |
2115 | 2060 | ||
2116 | elliptic@=3.0.3: | ||
2117 | version "3.0.3" | ||
2118 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-3.0.3.tgz#865c9b420bfbe55006b9f969f97a0d2c44966595" | ||
2119 | integrity sha1-hlybQgv75VAGuflp+XoNLESWZZU= | ||
2120 | dependencies: | ||
2121 | bn.js "^2.0.0" | ||
2122 | brorand "^1.0.1" | ||
2123 | hash.js "^1.0.0" | ||
2124 | inherits "^2.0.1" | ||
2125 | |||
2126 | emoji-regex@^7.0.1: | 2061 | emoji-regex@^7.0.1: |
2127 | version "7.0.3" | 2062 | version "7.0.3" |
2128 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" | 2063 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" |
@@ -3250,14 +3185,6 @@ has@^1.0.1, has@^1.0.3: | |||
3250 | dependencies: | 3185 | dependencies: |
3251 | function-bind "^1.1.1" | 3186 | function-bind "^1.1.1" |
3252 | 3187 | ||
3253 | hash.js@^1.0.0: | ||
3254 | version "1.1.7" | ||
3255 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" | ||
3256 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== | ||
3257 | dependencies: | ||
3258 | inherits "^2.0.3" | ||
3259 | minimalistic-assert "^1.0.1" | ||
3260 | |||
3261 | hashish@~0.0.4: | 3188 | hashish@~0.0.4: |
3262 | version "0.0.4" | 3189 | version "0.0.4" |
3263 | resolved "https://registry.yarnpkg.com/hashish/-/hashish-0.0.4.tgz#6d60bc6ffaf711b6afd60e426d077988014e6554" | 3190 | resolved "https://registry.yarnpkg.com/hashish/-/hashish-0.0.4.tgz#6d60bc6ffaf711b6afd60e426d077988014e6554" |
@@ -3481,11 +3408,6 @@ inherits@2.0.3: | |||
3481 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" | 3408 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" |
3482 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= | 3409 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= |
3483 | 3410 | ||
3484 | inherits@=2.0.1: | ||
3485 | version "2.0.1" | ||
3486 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" | ||
3487 | integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= | ||
3488 | |||
3489 | ini@^1.3.4, ini@~1.3.0: | 3411 | ini@^1.3.4, ini@~1.3.0: |
3490 | version "1.3.5" | 3412 | version "1.3.5" |
3491 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" | 3413 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" |
@@ -4028,25 +3950,6 @@ jsonify@~0.0.0: | |||
4028 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" | 3950 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" |
4029 | integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= | 3951 | integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= |
4030 | 3952 | ||
4031 | "jsonld-signatures@https://github.com/Chocobozzz/jsonld-signatures#rsa2017": | ||
4032 | version "1.2.2-2" | ||
4033 | resolved "https://github.com/Chocobozzz/jsonld-signatures#77660963e722eb4541d2d255f9d9d4216329665f" | ||
4034 | dependencies: | ||
4035 | bitcore-message "github:CoMakery/bitcore-message#dist" | ||
4036 | jsonld "^0.5.12" | ||
4037 | jws "^3.1.4" | ||
4038 | node-forge "^0.7.1" | ||
4039 | |||
4040 | jsonld@^0.5.12: | ||
4041 | version "0.5.21" | ||
4042 | resolved "https://registry.yarnpkg.com/jsonld/-/jsonld-0.5.21.tgz#4d5b78d717eb92bcd1ac9d88e34efad95370c0bf" | ||
4043 | integrity sha512-1dQhaw1Eb3p7Cz5ECE2DNPwLvTmK+f6D45hACBdonJaFKP1bN9zlKLZWbPZQeZtduAc/LNv10J4ML0IiTBVahw== | ||
4044 | dependencies: | ||
4045 | rdf-canonize "^0.2.1" | ||
4046 | request "^2.83.0" | ||
4047 | semver "^5.5.0" | ||
4048 | xmldom "0.1.19" | ||
4049 | |||
4050 | jsonld@~1.1.0: | 3953 | jsonld@~1.1.0: |
4051 | version "1.1.0" | 3954 | version "1.1.0" |
4052 | resolved "https://registry.yarnpkg.com/jsonld/-/jsonld-1.1.0.tgz#afcb168c44557a7bddead4d4513c3cbcae3bc5b9" | 3955 | resolved "https://registry.yarnpkg.com/jsonld/-/jsonld-1.1.0.tgz#afcb168c44557a7bddead4d4513c3cbcae3bc5b9" |
@@ -4082,23 +3985,6 @@ junk@^3.1.0: | |||
4082 | resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" | 3985 | resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" |
4083 | integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== | 3986 | integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== |
4084 | 3987 | ||
4085 | jwa@^1.4.1: | ||
4086 | version "1.4.1" | ||
4087 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" | ||
4088 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== | ||
4089 | dependencies: | ||
4090 | buffer-equal-constant-time "1.0.1" | ||
4091 | ecdsa-sig-formatter "1.0.11" | ||
4092 | safe-buffer "^5.0.1" | ||
4093 | |||
4094 | jws@^3.1.4: | ||
4095 | version "3.2.2" | ||
4096 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" | ||
4097 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== | ||
4098 | dependencies: | ||
4099 | jwa "^1.4.1" | ||
4100 | safe-buffer "^5.0.1" | ||
4101 | |||
4102 | k-bucket@^4.0.0: | 3988 | k-bucket@^4.0.0: |
4103 | version "4.0.1" | 3989 | version "4.0.1" |
4104 | resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-4.0.1.tgz#3fc2e5693f0b7bff90d7b6b476edd6087955d542" | 3990 | resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-4.0.1.tgz#3fc2e5693f0b7bff90d7b6b476edd6087955d542" |
@@ -4335,11 +4221,6 @@ lodash@4.17.4: | |||
4335 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" | 4221 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" |
4336 | integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= | 4222 | integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= |
4337 | 4223 | ||
4338 | lodash@=3.10.1: | ||
4339 | version "3.10.1" | ||
4340 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" | ||
4341 | integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= | ||
4342 | |||
4343 | lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.3.0, lodash@~4.17.10: | 4224 | lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.3.0, lodash@~4.17.10: |
4344 | version "4.17.15" | 4225 | version "4.17.15" |
4345 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" | 4226 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" |
@@ -4638,11 +4519,6 @@ mimic-response@^1.0.0: | |||
4638 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" | 4519 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" |
4639 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== | 4520 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== |
4640 | 4521 | ||
4641 | minimalistic-assert@^1.0.1: | ||
4642 | version "1.0.1" | ||
4643 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" | ||
4644 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== | ||
4645 | |||
4646 | minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: | 4522 | minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: |
4647 | version "3.0.4" | 4523 | version "3.0.4" |
4648 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" | 4524 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" |