react native support (#5)

* WIP: use isomorphic-webcrypto for RN

* WIP: expo friendly exports

* WIP: buffer for RN

* WIP: textencoder for RN

* WIP: aeskey from jwk instead of raw for RN

* fix: missing taglength for msrcrypto

* add: update isomorphic-webcrypto

* add: match isocrypto api

* add: failing test for 4e2 as 400

* fix: remove extra atob btoa

* add: sea unbuild

* refactor: according to mhelander review

* refactor: shorter require

* fix: make bug test pass, capitlize bug test.

* fix: npm ci + sea test

* add: restore old browser export and add react-native friendly exports

* fix: import buffer into correct global/window

* fix: bad comparison

* fix: only include buffer if no btoa/atob
This commit is contained in:
sirpy 2019-12-08 17:41:26 +02:00 committed by GitHub
parent af1590cf60
commit 29ed57e955
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 320 additions and 155 deletions

1
.prettierignore Normal file
View File

@ -0,0 +1 @@
*

2
browser.android.js Normal file
View File

@ -0,0 +1,2 @@
module.exports.Gun = require('./gun.js')
module.exports.SEA = require('./sea.js')

2
browser.ios.js Normal file
View File

@ -0,0 +1,2 @@
module.exports.Gun = require('./gun.js')
module.exports.SEA = require('./sea.js')

1
browser.js Normal file
View File

@ -0,0 +1 @@
module.exports = require('./gun.js')

279
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "gun", "name": "gun",
"version": "0.2019.910", "version": "0.2019.915",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -35,18 +35,6 @@
"pvtsutils": "^1.0.6", "pvtsutils": "^1.0.6",
"tslib": "^1.10.0", "tslib": "^1.10.0",
"webcrypto-core": "^1.0.14" "webcrypto-core": "^1.0.14"
},
"dependencies": {
"webcrypto-core": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.0.14.tgz",
"integrity": "sha512-iGZQcH/o3Jv6mpvCbzan6uAcUcLTTnUCil6RVYakcNh5/QXIKRRC06EFxHru9lHgVKucZy3gG4OBiup0IsOr0g==",
"optional": true,
"requires": {
"pvtsutils": "^1.0.4",
"tslib": "^1.10.0"
}
}
} }
}, },
"@types/node": { "@types/node": {
@ -54,6 +42,26 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.18.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.18.tgz",
"integrity": "sha512-ryO3Q3++yZC/+b8j8BdKd/dn9JlzlHBPdm80656xwYUdmPkpTGTjkAdt6BByiNupGPE8w0FhBgvYy/fX9hRNGQ==" "integrity": "sha512-ryO3Q3++yZC/+b8j8BdKd/dn9JlzlHBPdm80656xwYUdmPkpTGTjkAdt6BByiNupGPE8w0FhBgvYy/fX9hRNGQ=="
}, },
"@unimodules/core": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@unimodules/core/-/core-3.0.2.tgz",
"integrity": "sha512-EMZjVp+yrtoPKpDBPvj4+hyDWALl7gvpWeUsDz2Nb9MMBPLnhag1uNk3KC98StJdnjbSXKSdKrCMMidOXnyKcg==",
"optional": true,
"requires": {
"compare-versions": "^3.4.0"
}
},
"@unimodules/react-native-adapter": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-3.0.0.tgz",
"integrity": "sha512-zkFFE0HQ2Flfx/aY3hBKDgMvQ1meUm3H6vMIacY1KywexCuKW8ivBobkOsHIet4jf7km0Eklt6WtB3LqQVw5yw==",
"optional": true,
"requires": {
"invariant": "^2.2.4",
"lodash": "^4.5.0",
"prop-types": "^15.6.1"
}
},
"addressparser": { "addressparser": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz", "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz",
@ -102,6 +110,12 @@
"integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=",
"dev": true "dev": true
}, },
"asmcrypto.js": {
"version": "0.22.0",
"resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-0.22.0.tgz",
"integrity": "sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA==",
"optional": true
},
"asn1js": { "asn1js": {
"version": "2.0.26", "version": "2.0.26",
"resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.26.tgz", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.26.tgz",
@ -111,14 +125,14 @@
} }
}, },
"async-limiter": { "async-limiter": {
"version": "1.0.0", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
}, },
"aws-sdk": { "aws-sdk": {
"version": "2.238.1", "version": "2.528.0",
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.238.1.tgz", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.528.0.tgz",
"integrity": "sha1-o1/ewSLtkV2kkIQOiCgzbaW+Tn8=", "integrity": "sha512-WBgavPqKHvYcIhD7LhmLLYOKtG/SUdNY6hMB0N/Jxaolzx4sOa7xegiZ8sdkAUq/vUEs1frnBF9hNmeIszUWCg==",
"dev": true, "dev": true,
"requires": { "requires": {
"buffer": "4.9.1", "buffer": "4.9.1",
@ -128,9 +142,38 @@
"querystring": "0.2.0", "querystring": "0.2.0",
"sax": "1.2.1", "sax": "1.2.1",
"url": "0.10.3", "url": "0.10.3",
"uuid": "3.1.0", "uuid": "3.3.2",
"xml2js": "0.4.17", "xml2js": "0.4.19"
"xmlbuilder": "4.2.1" },
"dependencies": {
"buffer": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
"integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
"dev": true,
"requires": {
"base64-js": "^1.0.2",
"ieee754": "^1.1.4",
"isarray": "^1.0.0"
}
}
}
},
"b64-lite": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/b64-lite/-/b64-lite-1.3.1.tgz",
"integrity": "sha512-A3n/YWszeQeUeKKy+XRfsDW/s/+1cvD110HYA4uXtkNswNLd1MxrNblYt2lgKisUS3UfPPTaXhvFegD+l4YuOA==",
"requires": {
"base-64": "^0.1.0"
}
},
"b64u-lite": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/b64u-lite/-/b64u-lite-1.0.1.tgz",
"integrity": "sha512-4E6rqyrCnrAdzayWUS8XwFC/vRTBbmR7fgqb/IuHXRM2z63VH/tNxtzDWZhgCXCORTiwy2mIhCtmHyc9TMBj7Q==",
"optional": true,
"requires": {
"b64-lite": "^1.1.1"
} }
}, },
"backo2": { "backo2": {
@ -145,6 +188,11 @@
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true "dev": true
}, },
"base-64": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz",
"integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs="
},
"base64-arraybuffer": { "base64-arraybuffer": {
"version": "0.1.5", "version": "0.1.5",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
@ -154,8 +202,7 @@
"base64-js": { "base64-js": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
"integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw=="
"dev": true
}, },
"base64id": { "base64id": {
"version": "1.0.0", "version": "1.0.0",
@ -201,14 +248,12 @@
"dev": true "dev": true
}, },
"buffer": { "buffer": {
"version": "4.9.1", "version": "5.4.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
"integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
"dev": true,
"requires": { "requires": {
"base64-js": "^1.0.2", "base64-js": "^1.0.2",
"ieee754": "^1.1.4", "ieee754": "^1.1.4"
"isarray": "^1.0.0"
} }
}, },
"callsite": { "callsite": {
@ -277,6 +322,12 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true "dev": true
}, },
"compare-versions": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz",
"integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==",
"optional": true
},
"component-bind": { "component-bind": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
@ -578,6 +629,15 @@
"strip-eof": "^1.0.0" "strip-eof": "^1.0.0"
} }
}, },
"expo-random": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/expo-random/-/expo-random-6.0.0.tgz",
"integrity": "sha512-nXWmopErqgwkGGfaKPG8v4BNqTXZH4oA/4aAnn6zkTVFdeWBDpWn+Ena3/jnM3raMR3pMNI39YNLqNrut81HvA==",
"optional": true,
"requires": {
"base64-js": "^1.3.0"
}
},
"find-up": { "find-up": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
@ -696,8 +756,7 @@
"ieee754": { "ieee754": {
"version": "1.1.8", "version": "1.1.8",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
"integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q="
"dev": true
}, },
"indexof": { "indexof": {
"version": "0.0.1", "version": "0.0.1",
@ -721,6 +780,15 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true "dev": true
}, },
"invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"optional": true,
"requires": {
"loose-envify": "^1.0.0"
}
},
"invert-kv": { "invert-kv": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
@ -799,12 +867,36 @@
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true "dev": true
}, },
"isomorphic-webcrypto": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/isomorphic-webcrypto/-/isomorphic-webcrypto-2.3.2.tgz",
"integrity": "sha512-XbUC6ZwVvJfts2FYfAuNRU99tt89EzTknZcKZjxx6/6hxNeLgF6sIDbA/RdA3spbcNrXYyPOHa90khbUgZWarw==",
"optional": true,
"requires": {
"@peculiar/webcrypto": "^1.0.19",
"@unimodules/core": "*",
"@unimodules/react-native-adapter": "*",
"asmcrypto.js": "^0.22.0",
"b64-lite": "^1.3.1",
"b64u-lite": "^1.0.1",
"expo-random": "*",
"msrcrypto": "^1.5.6",
"react-native-securerandom": "^0.1.1",
"str2buf": "^1.3.0",
"webcrypto-shim": "^0.1.4"
}
},
"jmespath": { "jmespath": {
"version": "0.15.0", "version": "0.15.0",
"resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz",
"integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=",
"dev": true "dev": true
}, },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"js-yaml": { "js-yaml": {
"version": "3.13.1", "version": "3.13.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
@ -841,10 +933,10 @@
} }
}, },
"lodash": { "lodash": {
"version": "4.17.10", "version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
"dev": true "optional": true
}, },
"log-symbols": { "log-symbols": {
"version": "2.2.0", "version": "2.2.0",
@ -855,6 +947,14 @@
"chalk": "^2.0.1" "chalk": "^2.0.1"
} }
}, },
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"map-age-cleaner": { "map-age-cleaner": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
@ -957,6 +1057,12 @@
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"dev": true "dev": true
}, },
"msrcrypto": {
"version": "1.5.7",
"resolved": "https://registry.npmjs.org/msrcrypto/-/msrcrypto-1.5.7.tgz",
"integrity": "sha512-vH/uVdMPgdtLrDCdR2gWps2fB10EYWjXYi67W9RzNSd5Jch3noWGUvNUXSIJA87VTDaE+wvjS7yRSN4gALTslg==",
"optional": true
},
"negotiator": { "negotiator": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
@ -1202,6 +1308,25 @@
"integrity": "sha1-SSIQiSM1vTExwKCN2i2T7DVD5CM=", "integrity": "sha1-SSIQiSM1vTExwKCN2i2T7DVD5CM=",
"dev": true "dev": true
}, },
"prop-types": {
"version": "15.7.2",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
"integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
"optional": true,
"requires": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.8.1"
},
"dependencies": {
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"optional": true
}
}
},
"pump": { "pump": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@ -1244,6 +1369,21 @@
"integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==",
"optional": true "optional": true
}, },
"react-is": {
"version": "16.9.0",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz",
"integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==",
"optional": true
},
"react-native-securerandom": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/react-native-securerandom/-/react-native-securerandom-0.1.1.tgz",
"integrity": "sha1-8TBiOkEsM4sK+t7bwgTFy7i/IHA=",
"optional": true,
"requires": {
"base64-js": "*"
}
},
"require-directory": { "require-directory": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@ -1443,6 +1583,12 @@
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true "dev": true
}, },
"str2buf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/str2buf/-/str2buf-1.3.0.tgz",
"integrity": "sha512-xIBmHIUHYZDP4HyoXGHYNVmxlXLXDrtFHYT0eV6IOdEj3VO9ccaF1Ejl9Oq8iFjITllpT8FhaXb4KsNmw+3EuA==",
"optional": true
},
"string-width": { "string-width": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
@ -1521,19 +1667,19 @@
"integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
}, },
"uglify-js": { "uglify-js": {
"version": "3.3.24", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.24.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz",
"integrity": "sha512-hS7+TDiqIqvWScCcKRybCQzmMnEzJ4ryl9ErRmW4GFyG48p0/dKZiy/5mVLbsFzU8CCnCgQdxMiJzZythvLzCg==", "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==",
"dev": true, "dev": true,
"requires": { "requires": {
"commander": "~2.15.0", "commander": "~2.20.0",
"source-map": "~0.6.1" "source-map": "~0.6.1"
}, },
"dependencies": { "dependencies": {
"commander": { "commander": {
"version": "2.15.1", "version": "2.20.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
"dev": true "dev": true
} }
} }
@ -1549,11 +1695,27 @@
} }
}, },
"uuid": { "uuid": {
"version": "3.1.0", "version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
"dev": true "dev": true
}, },
"webcrypto-core": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.0.14.tgz",
"integrity": "sha512-iGZQcH/o3Jv6mpvCbzan6uAcUcLTTnUCil6RVYakcNh5/QXIKRRC06EFxHru9lHgVKucZy3gG4OBiup0IsOr0g==",
"optional": true,
"requires": {
"pvtsutils": "^1.0.4",
"tslib": "^1.10.0"
}
},
"webcrypto-shim": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/webcrypto-shim/-/webcrypto-shim-0.1.4.tgz",
"integrity": "sha512-I2lnL+K2oPNE9ryVHwo42oDnt8XQ9E1KKMGCmcT7OXaAKPmUeCi/G0nUgLR6M6Ztj05ZCxLMGf5bXNaSo+wURg==",
"optional": true
},
"which": { "which": {
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@ -1632,9 +1794,9 @@
"dev": true "dev": true
}, },
"ws": { "ws": {
"version": "7.1.0", "version": "7.1.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz",
"integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==", "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==",
"requires": { "requires": {
"async-limiter": "^1.0.0" "async-limiter": "^1.0.0"
} }
@ -1646,23 +1808,20 @@
"dev": true "dev": true
}, },
"xml2js": { "xml2js": {
"version": "0.4.17", "version": "0.4.19",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
"integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"sax": ">=0.6.0", "sax": ">=0.6.0",
"xmlbuilder": "^4.1.0" "xmlbuilder": "~9.0.1"
} }
}, },
"xmlbuilder": { "xmlbuilder": {
"version": "4.2.1", "version": "9.0.7",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
"integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
"dev": true, "dev": true
"requires": {
"lodash": "^4.0.0"
}
}, },
"xmlhttprequest-ssl": { "xmlhttprequest-ssl": {
"version": "1.5.3", "version": "1.5.3",

View File

@ -3,7 +3,9 @@
"version": "0.2019.1120", "version": "0.2019.1120",
"description": "A realtime, decentralized, offline-first, graph data synchronization engine.", "description": "A realtime, decentralized, offline-first, graph data synchronization engine.",
"main": "index.js", "main": "index.js",
"browser": "gun.js", "browser": "browser.js",
"ios": "browser.ios.js",
"android": "browser.android.js",
"scripts": { "scripts": {
"start": "node examples/http.js", "start": "node examples/http.js",
"https": "HTTPS_KEY=test/https/server.key HTTPS_CERT=test/https/server.crt npm start", "https": "HTTPS_KEY=test/https/server.key HTTPS_CERT=test/https/server.crt npm start",
@ -52,19 +54,20 @@
"node": ">=0.8.4" "node": ">=0.8.4"
}, },
"dependencies": { "dependencies": {
"ws": "~>7.1.0" "buffer": "^5.4.3",
"ws": "^7.1.2"
}, },
"optionalDependencies": { "optionalDependencies": {
"@peculiar/webcrypto": "^1.0.19", "text-encoding": "^0.7.0",
"emailjs": "^2.2.0", "isomorphic-webcrypto": "^2.3.2",
"text-encoding": "^0.7.0" "emailjs": "^2.2.0"
}, },
"devDependencies": { "devDependencies": {
"aws-sdk": ">=2.153.0", "aws-sdk": "^2.528.0",
"ip": "^1.1.5", "ip": "^1.1.5",
"mocha": "^6.2.0", "mocha": "^6.2.0",
"panic-manager": "^1.2.0", "panic-manager": "^1.2.0",
"panic-server": "^1.1.1", "panic-server": "^1.1.1",
"uglify-js": ">=2.8.22" "uglify-js": "^3.6.0"
} }
} }

60
sea.js
View File

@ -3,6 +3,7 @@
/* UNBUILD */ /* UNBUILD */
var root; var root;
if(typeof window !== "undefined"){ root = window } if(typeof window !== "undefined"){ root = window }
if(typeof global !== "undefined"){ root = global } if(typeof global !== "undefined"){ root = global }
root = root || {}; root = root || {};
var console = root.console || {log: function(){}}; var console = root.console || {log: function(){}};
@ -47,10 +48,12 @@
})(USE, './https'); })(USE, './https');
;USE(function(module){ ;USE(function(module){
if(typeof global !== "undefined"){ if(typeof btoa === "undefined"){
var g = global; if(typeof Buffer === "undefined") {
g.btoa = function (data) { return Buffer.from(data, "binary").toString("base64"); }; root.Buffer = require("buffer").Buffer
g.atob = function (data) { return Buffer.from(data, "base64").toString("binary"); }; }
root.btoa = function (data) { return Buffer.from(data, "binary").toString("base64"); };
root.atob = function (data) { return Buffer.from(data, "base64").toString("binary"); };
} }
})(USE, './base64'); })(USE, './base64');
@ -96,7 +99,7 @@
Object.assign(SafeBuffer, { Object.assign(SafeBuffer, {
// (data, enc) where typeof data === 'string' then enc === 'utf8'|'hex'|'base64' // (data, enc) where typeof data === 'string' then enc === 'utf8'|'hex'|'base64'
from() { from() {
if (!Object.keys(arguments).length) { if (!Object.keys(arguments).length || arguments[0]==null) {
throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
} }
const input = arguments[0] const input = arguments[0]
@ -167,28 +170,26 @@
var o = {}; var o = {};
if(SEA.window){ if(SEA.window){
api.crypto = window.crypto || window.msCrypto; api.crypto = window.crypto || window.msCrypto || require('isomorphic-webcrypto');
api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle; api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle;
api.TextEncoder = window.TextEncoder; api.TextEncoder = window.TextEncoder;
api.TextDecoder = window.TextDecoder; api.TextDecoder = window.TextDecoder;
api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len)))) api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len))));
}
if(!api.TextDecoder)
{
const { TextEncoder, TextDecoder } = require('text-encoding');
api.TextDecoder = TextDecoder;
api.TextEncoder = TextEncoder;
} }
if(!api.crypto){try{ if(!api.crypto){try{
var crypto = USE('crypto', 1); var crypto = USE('crypto', 1);
const { TextEncoder, TextDecoder } = USE('text-encoding', 1)
Object.assign(api, { Object.assign(api, {
crypto, crypto,
//subtle,
TextEncoder,
TextDecoder,
random: (len) => Buffer.from(crypto.randomBytes(len)) random: (len) => Buffer.from(crypto.randomBytes(len))
}); });
//try{ const isocrypto = require('isomorphic-webcrypto');
const { Crypto: WebCrypto } = USE('@peculiar/webcrypto', 1); api.ossl = api.subtle = isocrypto.subtle;
api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH
//}catch(e){
//console.log("node-webcrypto-ossl is optionally needed for ECDH, please install if needed.");
//}
}catch(e){ }catch(e){
console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!"); console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!");
OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED; OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED;
@ -201,7 +202,7 @@
var SEA = USE('./root'); var SEA = USE('./root');
var Buffer = USE('./buffer'); var Buffer = USE('./buffer');
var s = {}; var s = {};
s.pbkdf2 = {hash: 'SHA-256', iter: 100000, ks: 64}; s.pbkdf2 = {hash: {name : 'SHA-256'}, iter: 100000, ks: 64};
s.ecdsa = { s.ecdsa = {
pair: {name: 'ECDSA', namedCurve: 'P-256'}, pair: {name: 'ECDSA', namedCurve: 'P-256'},
sign: {name: 'ECDSA', hash: {name: 'SHA-256'}} sign: {name: 'ECDSA', hash: {name: 'SHA-256'}}
@ -217,6 +218,13 @@
if(d){ jwk.d = d } if(d){ jwk.d = d }
return jwk; return jwk;
}; };
s.keyToJwk = function(keyBytes) {
const keyB64 = keyBytes.toString('base64');
const k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');
return { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };
}
s.recall = { s.recall = {
validity: 12 * 60 * 60, // internally in seconds : 12 hours validity: 12 * 60 * 60, // internally in seconds : 12 hours
hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props) hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props)
@ -492,6 +500,7 @@
;USE(function(module){ ;USE(function(module){
var shim = USE('./shim'); var shim = USE('./shim');
var S = USE('./settings');
var sha256hash = USE('./sha256'); var sha256hash = USE('./sha256');
const importGen = async (key, salt, opt) => { const importGen = async (key, salt, opt) => {
@ -499,7 +508,9 @@
var opt = opt || {}; var opt = opt || {};
const combo = key + (salt || shim.random(8)).toString('utf8'); // new const combo = key + (salt || shim.random(8)).toString('utf8'); // new
const hash = shim.Buffer.from(await sha256hash(combo), 'binary') const hash = shim.Buffer.from(await sha256hash(combo), 'binary')
return await shim.subtle.importKey('raw', new Uint8Array(hash), opt.name || 'AES-GCM', false, ['encrypt', 'decrypt'])
const jwkKey = S.keyToJwk(hash)
return await shim.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])
} }
module.exports = importGen; module.exports = importGen;
})(USE, './aeskey'); })(USE, './aeskey');
@ -563,7 +574,7 @@
bufiv = shim.Buffer.from(json.iv, opt.encode || 'base64'); bufiv = shim.Buffer.from(json.iv, opt.encode || 'base64');
bufct = shim.Buffer.from(json.ct, opt.encode || 'base64'); bufct = shim.Buffer.from(json.ct, opt.encode || 'base64');
var ct = await aeskey(key, buf, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).decrypt({ // Keeping aesKey scope as private as possible... var ct = await aeskey(key, buf, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).decrypt({ // Keeping aesKey scope as private as possible...
name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv) name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128
}, aes, new Uint8Array(bufct))); }, aes, new Uint8Array(bufct)));
}catch(e){ }catch(e){
if('utf8' === opt.encode){ throw "Could not decrypt" } if('utf8' === opt.encode){ throw "Could not decrypt" }
@ -603,9 +614,11 @@
var pubKeyData = keysToEcdhJwk(pub); var pubKeyData = keysToEcdhJwk(pub);
var props = Object.assign({ public: await ecdhSubtle.importKey(...pubKeyData, true, []) },S.ecdh); // Thanks to @sirpy ! var props = Object.assign({ public: await ecdhSubtle.importKey(...pubKeyData, true, []) },S.ecdh); // Thanks to @sirpy !
var privKeyData = keysToEcdhJwk(epub, epriv); var privKeyData = keysToEcdhJwk(epub, epriv);
var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveKey']).then(async (privKey) => { var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => {
// privateKey scope doesn't leak out from here! // privateKey scope doesn't leak out from here!
var derivedKey = await ecdhSubtle.deriveKey(props, privKey, { name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]); var derivedBits = await ecdhSubtle.deriveBits(props, privKey, 256);
var rawBits = new Uint8Array(derivedBits);
var derivedKey = await ecdhSubtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);
return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k); return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k);
}) })
var r = derived; var r = derived;
@ -646,6 +659,7 @@
SEA.verify = USE('./verify'); SEA.verify = USE('./verify');
SEA.encrypt = USE('./encrypt'); SEA.encrypt = USE('./encrypt');
SEA.decrypt = USE('./decrypt'); SEA.decrypt = USE('./decrypt');
SEA.aeskey = USE('./aeskey');
SEA.random = SEA.random || shim.random; SEA.random = SEA.random || shim.random;

View File

@ -1,5 +1,6 @@
var shim = require('./shim'); var shim = require('./shim');
var S = require('./settings');
var sha256hash = require('./sha256'); var sha256hash = require('./sha256');
const importGen = async (key, salt, opt) => { const importGen = async (key, salt, opt) => {
@ -7,7 +8,9 @@
var opt = opt || {}; var opt = opt || {};
const combo = key + (salt || shim.random(8)).toString('utf8'); // new const combo = key + (salt || shim.random(8)).toString('utf8'); // new
const hash = shim.Buffer.from(await sha256hash(combo), 'binary') const hash = shim.Buffer.from(await sha256hash(combo), 'binary')
return await shim.subtle.importKey('raw', new Uint8Array(hash), opt.name || 'AES-GCM', false, ['encrypt', 'decrypt'])
const jwkKey = S.keyToJwk(hash)
return await shim.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])
} }
module.exports = importGen; module.exports = importGen;

View File

@ -1,7 +1,9 @@
if(typeof global !== "undefined"){ if(typeof btoa === "undefined"){
var g = global; if(typeof Buffer === "undefined") {
g.btoa = function (data) { return Buffer.from(data, "binary").toString("base64"); }; root.Buffer = require("buffer").Buffer
g.atob = function (data) { return Buffer.from(data, "base64").toString("binary"); }; }
root.btoa = function (data) { return Buffer.from(data, "binary").toString("base64"); };
root.atob = function (data) { return Buffer.from(data, "base64").toString("binary"); };
} }

View File

@ -14,7 +14,7 @@
Object.assign(SafeBuffer, { Object.assign(SafeBuffer, {
// (data, enc) where typeof data === 'string' then enc === 'utf8'|'hex'|'base64' // (data, enc) where typeof data === 'string' then enc === 'utf8'|'hex'|'base64'
from() { from() {
if (!Object.keys(arguments).length) { if (!Object.keys(arguments).length || arguments[0]==null) {
throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
} }
const input = arguments[0] const input = arguments[0]

View File

@ -17,7 +17,7 @@
bufiv = shim.Buffer.from(json.iv, opt.encode || 'base64'); bufiv = shim.Buffer.from(json.iv, opt.encode || 'base64');
bufct = shim.Buffer.from(json.ct, opt.encode || 'base64'); bufct = shim.Buffer.from(json.ct, opt.encode || 'base64');
var ct = await aeskey(key, buf, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).decrypt({ // Keeping aesKey scope as private as possible... var ct = await aeskey(key, buf, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).decrypt({ // Keeping aesKey scope as private as possible...
name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv) name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128
}, aes, new Uint8Array(bufct))); }, aes, new Uint8Array(bufct)));
}catch(e){ }catch(e){
if('utf8' === opt.encode){ throw "Could not decrypt" } if('utf8' === opt.encode){ throw "Could not decrypt" }

View File

@ -7,6 +7,7 @@
SEA.verify = require('./verify'); SEA.verify = require('./verify');
SEA.encrypt = require('./encrypt'); SEA.encrypt = require('./encrypt');
SEA.decrypt = require('./decrypt'); SEA.decrypt = require('./decrypt');
SEA.aeskey = require('./aeskey');
SEA.random = SEA.random || shim.random; SEA.random = SEA.random || shim.random;

View File

@ -15,9 +15,11 @@
var pubKeyData = keysToEcdhJwk(pub); var pubKeyData = keysToEcdhJwk(pub);
var props = Object.assign({ public: await ecdhSubtle.importKey(...pubKeyData, true, []) },S.ecdh); // Thanks to @sirpy ! var props = Object.assign({ public: await ecdhSubtle.importKey(...pubKeyData, true, []) },S.ecdh); // Thanks to @sirpy !
var privKeyData = keysToEcdhJwk(epub, epriv); var privKeyData = keysToEcdhJwk(epub, epriv);
var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveKey']).then(async (privKey) => { var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => {
// privateKey scope doesn't leak out from here! // privateKey scope doesn't leak out from here!
var derivedKey = await ecdhSubtle.deriveKey(props, privKey, { name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]); var derivedBits = await ecdhSubtle.deriveBits(props, privKey, 256);
var rawBits = new Uint8Array(derivedBits);
var derivedKey = await ecdhSubtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);
return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k); return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k);
}) })
var r = derived; var r = derived;

View File

@ -2,7 +2,7 @@
var SEA = require('./root'); var SEA = require('./root');
var Buffer = require('./buffer'); var Buffer = require('./buffer');
var s = {}; var s = {};
s.pbkdf2 = {hash: 'SHA-256', iter: 100000, ks: 64}; s.pbkdf2 = {hash: {name : 'SHA-256'}, iter: 100000, ks: 64};
s.ecdsa = { s.ecdsa = {
pair: {name: 'ECDSA', namedCurve: 'P-256'}, pair: {name: 'ECDSA', namedCurve: 'P-256'},
sign: {name: 'ECDSA', hash: {name: 'SHA-256'}} sign: {name: 'ECDSA', hash: {name: 'SHA-256'}}
@ -18,6 +18,13 @@
if(d){ jwk.d = d } if(d){ jwk.d = d }
return jwk; return jwk;
}; };
s.keyToJwk = function(keyBytes) {
const keyB64 = keyBytes.toString('base64');
const k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');
return { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };
}
s.recall = { s.recall = {
validity: 12 * 60 * 60, // internally in seconds : 12 hours validity: 12 * 60 * 60, // internally in seconds : 12 hours
hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props) hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props)

View File

@ -5,28 +5,26 @@
var o = {}; var o = {};
if(SEA.window){ if(SEA.window){
api.crypto = window.crypto || window.msCrypto; api.crypto = window.crypto || window.msCrypto || require('isomorphic-webcrypto');
api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle; api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle;
api.TextEncoder = window.TextEncoder; api.TextEncoder = window.TextEncoder;
api.TextDecoder = window.TextDecoder; api.TextDecoder = window.TextDecoder;
api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len)))) api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len))));
}
if(!api.TextDecoder)
{
const { TextEncoder, TextDecoder } = require('text-encoding');
api.TextDecoder = TextDecoder;
api.TextEncoder = TextEncoder;
} }
if(!api.crypto){try{ if(!api.crypto){try{
var crypto = require('crypto', 1); var crypto = require('crypto', 1);
const { TextEncoder, TextDecoder } = require('text-encoding', 1)
Object.assign(api, { Object.assign(api, {
crypto, crypto,
//subtle,
TextEncoder,
TextDecoder,
random: (len) => Buffer.from(crypto.randomBytes(len)) random: (len) => Buffer.from(crypto.randomBytes(len))
}); });
//try{ const isocrypto = require('isomorphic-webcrypto');
const { Crypto: WebCrypto } = require('@peculiar/webcrypto', 1); api.ossl = api.subtle = isocrypto.subtle;
api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH
//}catch(e){
//console.log("node-webcrypto-ossl is optionally needed for ECDH, please install if needed.");
//}
}catch(e){ }catch(e){
console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!"); console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!");
OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED; OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED;

View File

@ -37,7 +37,12 @@ describe('SEA', function(){
var gun; var gun;
var pub; var pub;
describe('Utility', function(){ describe('Utility', function(){
it('generates aeskey from jwk', function(done) {
SEA.aeskey('x','x').then(k => {
expect(k.data.toString('base64')).to.be('Xd6JaIf2dUybFb/jpEGuSAbfL96UABMR4IvxEGIuC74=')
done()
})
})
it('quickstart', function(done){ it('quickstart', function(done){
SEA.pair(function(pair){ SEA.pair(function(pair){
SEA.encrypt('hello self', pair, function(enc){ SEA.encrypt('hello self', pair, function(enc){
@ -123,50 +128,15 @@ describe('SEA', function(){
});});});});});});});});});});});});});});});});});});});});});});});});});});}); });});});});});});});});});});});});});});});});});});});});});});});});});});});
}) })
it('atypes', function(done){
it('DOESNT DECRYPT SCIENTIFIC NOTATION', function(done){
var pair, s, v; var pair, s, v;
SEA.pair(function(pair){ SEA.pair(function(pair){
SEA.encrypt(null, pair, function(s){ SEA.encrypt('4e2', pair, function(s){
SEA.decrypt(s, pair, function(v){ SEA.decrypt(s, pair, function(v){
expect(null).to.be(v); expect(400).to.be(v);
SEA.encrypt(true, pair, function(s){
SEA.decrypt(s, pair, function(v){
expect(true).to.be(v);
SEA.encrypt(false, pair, function(s){
SEA.decrypt(s, pair, function(v){
expect(false).to.be(v);
SEA.encrypt(0, pair, function(s){
SEA.decrypt(s, pair, function(v){
expect(0).to.be(v);
SEA.encrypt(1, pair, function(s){
SEA.decrypt(s, pair, function(v){
expect(1).to.be(v);
SEA.encrypt(1.01, pair, function(s){
SEA.decrypt(s, pair, function(v){
expect(1.01).to.be(v);
SEA.encrypt('', pair, function(s){
SEA.decrypt(s, pair, function(v){
expect('').to.be(v);
SEA.encrypt('a', pair, function(s){
SEA.decrypt(s, pair, function(v){
expect('a').to.be(v);
SEA.encrypt([], pair, function(s){
SEA.decrypt(s, pair, function(v){
expect([]).to.eql(v);
SEA.encrypt([1], pair, function(s){
SEA.decrypt(s, pair, function(v){
expect([1]).to.eql(v);
SEA.encrypt({}, pair, function(s){
SEA.decrypt(s, pair, function(v){
expect({}).to.eql(v);
SEA.encrypt({a:1}, pair, function(s){
SEA.decrypt(s, pair, function(v){
expect({a:1}).to.eql(v);
SEA.encrypt(JSON.stringify({a:1}), pair, function(s){
SEA.decrypt(s, pair, function(v){
expect({a:1}).to.eql(v);
done(); done();
});});});});});});});});});});});});});});});});});});});});});});});});});});}); });});});
}) })
it('legacy', function(done){ (async function(){ it('legacy', function(done){ (async function(){
@ -364,4 +334,4 @@ describe('SEA', function(){
}) })
}()); }());