gun/sea/work.js
2018-06-29 17:40:15 -07:00

50 lines
1.6 KiB
JavaScript

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;