1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- var SEA = require('./root');
- var shim = require('./shim');
- var S = require('./settings');
- var u;
- SEA.work = async (data, pair, cb) => { try { // used to be named `proof`
- var salt = pair.epub || pair; // epub not recommended, salt should be random!
- if(salt instanceof Function){
- cb = salt;
- salt = u;
- }
- salt = salt || shim.random(9);
- if (SEA.window) {
- // For browser subtle works fine
- const key = await shim.subtle.importKey(
- 'raw', new shim.TextEncoder().encode(data), { name: 'PBKDF2' }, false, ['deriveBits']
- )
- const result = await shim.subtle.deriveBits({
- name: 'PBKDF2',
- iterations: S.pbkdf2.iter,
- salt: new shim.TextEncoder().encode(salt),
- hash: S.pbkdf2.hash,
- }, key, S.pbkdf2.ks * 8)
- data = shim.random(data.length) // Erase data in case of passphrase
- const r = shim.Buffer.from(result, 'binary').toString('utf8')
- if(cb){ try{ cb(r) }catch(e){console.log(e)} }
- return r;
- }
- // For NodeJS crypto.pkdf2 rocks
- const crypto = shim.crypto;
- const hash = crypto.pbkdf2Sync(
- data,
- new shim.TextEncoder().encode(salt),
- S.pbkdf2.iter,
- S.pbkdf2.ks,
- S.pbkdf2.hash.replace('-', '').toLowerCase()
- )
- data = shim.random(data.length) // Erase passphrase for app
- const r = hash && hash.toString('utf8')
- if(cb){ try{ cb(r) }catch(e){console.log(e)} }
- return r;
- } catch(e) {
- SEA.err = e;
- if(cb){ cb() }
- return;
- }}
- module.exports = SEA.work;
-
|