mirror of
https://github.com/amark/gun.git
synced 2025-03-30 15:08:33 +00:00
50 lines
1.6 KiB
JavaScript
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;
|
|
|