diff --git a/package-lock.json b/package-lock.json index bbbfc09..8a832a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1235,6 +1235,16 @@ "upath": "^1.1.1" } }, + "@stablelib/base64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz", + "integrity": "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==" + }, + "@stablelib/utf8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/utf8/-/utf8-1.0.1.tgz", + "integrity": "sha512-FrYD1xadah/TtAP6VJ04lDD5h9rdDj/d8wH/jMYTtHqZBv9z2btdvEU8vTxdjdkFmo1b/BH+t3R1wi/mYhCCNg==" + }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -3873,11 +3883,6 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, - "tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" - }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", diff --git a/package.json b/package.json index f0a2441..d3fa8cd 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,14 @@ "main": "lib/index.js", "dependencies": { "@babel/polyfill": "^7.12.1", + "@stablelib/base64": "^1.0.1", + "@stablelib/utf8": "^1.0.1", "core-js": "^3.16.2", "fast-sha256": "^1.3.0", "pouchdb": "^7.2.2", "pouchdb-find": "^7.2.2", "transform-pouch": "^1.1.5", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" + "tweetnacl": "^1.0.3" }, "devDependencies": { "@babel/cli": "^7.14.8", diff --git a/src/index.js b/src/index.js index 6f90d82..53e1896 100644 --- a/src/index.js +++ b/src/index.js @@ -1,23 +1,25 @@ import nacl from 'tweetnacl'; -import naclUtil from 'tweetnacl-util'; +// import naclUtil from 'tweetnacl-util'; +import {encode as encodeUTF8, decode as decodeUTF8} from '@stablelib/utf8'; +import {decode as decodeBase64, encode as encodeBase64} from '@stablelib/base64'; import sha256 from 'fast-sha256'; import TransformPouch from 'transform-pouch'; import PouchDB from 'pouchdb'; import PouchDBFind from 'pouchdb-find'; -nacl.util = naclUtil; +// nacl.util = naclUtil; function encrypt(text, nonce, key) { - const encText = nacl.secretbox(nacl.util.decodeUTF8(text), nonce, key); - return nacl.util.encodeBase64(encText); + const encText = nacl.secretbox(encodeUTF8(text), nonce, key); + return encodeBase64(encText); } function decrypt(text, nonce, key) { - const decText = nacl.secretbox.open(nacl.util.decodeBase64(text), nonce, key); + const decText = nacl.secretbox.open(decodeBase64(text), nonce, key); if (decText === null) { return undefined; } - return nacl.util.encodeUTF8(decText); + return decodeUTF8(decText); } export function generateNonce() { @@ -25,7 +27,7 @@ export function generateNonce() { } export function keyFromPassphrase(passphrase, salt, rounds = 100000) { - const key = sha256.pbkdf2(nacl.util.decodeUTF8(passphrase), nacl.util.decodeUTF8(salt), rounds, 32); + const key = sha256.pbkdf2(encodeUTF8(passphrase), encodeUTF8(salt), rounds, 32); return key; } @@ -50,7 +52,7 @@ export default class Echidnajs { newDoc[field] = encrypt(doc[field], nonce, key); } }); - newDoc.nonce = nacl.util.encodeBase64(nonce); + newDoc.nonce = encodeBase64(nonce); return Object.assign(doc, newDoc); }, outgoing(doc) { @@ -59,7 +61,7 @@ export default class Echidnajs { let error; keys.forEach((field) => { if (field !== '_id' && field !== '_rev' && field !== 'nonce') { - newDoc[field] = decrypt(doc[field], nacl.util.decodeBase64(doc.nonce), key); + newDoc[field] = decrypt(doc[field], decodeBase64(doc.nonce), key); if (newDoc[field] === undefined) { error = new Error('Failed to decrypt'); } @@ -76,8 +78,8 @@ export default class Echidnajs { } hash(text) { - const hash = nacl.hash(nacl.util.decodeUTF8(text)); - return nacl.util.encodeBase64(hash); + const hash = nacl.hash(encodeUTF8(text)); + return encodeBase64(hash); } close() { diff --git a/test/node-test/setup.js b/test/node-test/setup.js index fe12dc6..cc4627d 100644 --- a/test/node-test/setup.js +++ b/test/node-test/setup.js @@ -1,26 +1,33 @@ var EchidnaDB = require('../../lib').default; +var book = require('../data').book; function Setup() { - return new Promise((resolve, reject) => { - var options = { - username: 'myusername', - passphrase: 'mypassphrase', - salt: 'saltysaltysalty' - }; - var echidna = new EchidnaDB(options); + return new Promise((resolve, reject) => { + var options = { + username: 'myusername', + passphrase: 'mypassphrase', + salt: 'saltysaltysalty', + }; + var echidna = new EchidnaDB(options); - echidna.pouch.info() - .then(result => { - console.log(result); - echidna.pouch.put({ - _id: 'test', - test: 'testdata' - }) - .then(res => resolve(res)) - .catch(error => reject(error)); - }) - .catch(error => reject(error)); - }); + echidna.pouch + .info() + .then((result) => { + console.log(result); + console.time('encrypting book'); + echidna.pouch + .put({ + _id: 'test', + test: book, + }) + .then((res) => { + console.timeEnd('encrypting book'); + return resolve(res); + }) + .catch((error) => reject(error)); + }) + .catch((error) => reject(error)); + }); } -module.exports = Setup; \ No newline at end of file +module.exports = Setup; diff --git a/test/node-test/test.js b/test/node-test/test.js index 0daaa79..349dd5c 100644 --- a/test/node-test/test.js +++ b/test/node-test/test.js @@ -2,31 +2,33 @@ const rimraf = require('rimraf'); const EchidnaDB = require('../../lib').default; const setup = require('./setup'); -function error (error) { - console.log(error); - console.log('<< REMOVING TEST POUCH >>'); - rimraf('echidnadb-myusername', () => console.log('complete')); +function error(error) { + console.log(error); + console.log('<< REMOVING TEST POUCH >>'); + rimraf('echidnadb-myusername', () => console.log('complete')); } setup() -.then(res => { + .then((res) => { const options = { - username: 'myusername', - passphrase: 'mypassphrase', - salt: 'saltysaltysalty' + username: 'myusername', + passphrase: 'mypassphrase', + salt: 'saltysaltysalty', }; console.log('<< CREATING TEST POUCH >>'); const echidna = new EchidnaDB(options); - echidna.pouch.info() - .then(result => { - console.log(result); - echidna.pouch.get('test') - .then(res => { - console.log(res); - console.log('<< REMOVING TEST POUCH >>'); - rimraf('echidnadb-myusername', () => console.log('complete')); - }); + echidna.pouch.info().then((result) => { + console.time('pouch info'); + console.log(result); + console.timeEnd('pouch info'); + console.time('decrypting book'); + echidna.pouch.get('test').then((res) => { + // console.log(res); + console.timeEnd('decrypting book'); + console.log('<< REMOVING TEST POUCH >>'); + rimraf('echidnadb-myusername', () => console.log('complete')); + }); }); -}) -.catch(error); \ No newline at end of file + }) + .catch(error);