mirror of
https://github.com/amark/gun.git
synced 2025-03-30 15:08:33 +00:00

* feat: create pair with seed, content addressing with shorter hash * feat: create pair using priv/epriv * optimize SEA.pair * feat: globalThis along with window * white labeling * feat: add WebAuthn example and enhance SEA.sign, SEA.verify, SEA check.pub, for WebAuthn support * feat: enhance WebAuthn integration with new put options and improved signature handling * polish SEA.sign and SEA.verify * feat: localize options in SEA.check.pub to enhance security and prevent attacks * fix: correct destructuring of user object to enhance security in SEA * rebuild SEA * feat: support ArrayBuffer as seed for key pair generation in SEA * test: add unit test for hashing ArrayBuffer in SEA * fix: create deterministic key pair from seed * fix: add missing B parameter for ECC curve and implement point validation * feat: add ArrayBuffer support for hashing in SEA and implement corresponding unit test * fix: convert numeric salt to string in PBKDF2 implementation * fix: convert numeric salt option to string in PBKDF2 implementation * improve hashing tests * improve sea.work * rebuild SEA * improve SEA.work and rebuild SEA * enhance SEA encryption handling and improve test coverage for SEA functions --------- Co-authored-by: noname <x@null.com> Co-authored-by: x <x@mimiza.com> Co-authored-by: x <null> Co-authored-by: noname <no@name.com>
52 lines
2.0 KiB
JavaScript
52 lines
2.0 KiB
JavaScript
;(function(){
|
|
|
|
var SEA = require('./root');
|
|
var shim = require('./shim');
|
|
var S = require('./settings');
|
|
var sha = require('./sha256');
|
|
var u;
|
|
|
|
SEA.work = SEA.work || (async (data, pair, cb, opt) => { try { // used to be named `proof`
|
|
var salt = (pair||{}).epub || pair; // epub not recommended, salt should be random!
|
|
opt = opt || {};
|
|
if(salt instanceof Function){
|
|
cb = salt;
|
|
salt = u;
|
|
}
|
|
// Check if data is an ArrayBuffer, if so use Uint8Array to access the data
|
|
if(data instanceof ArrayBuffer){
|
|
data = new Uint8Array(data);
|
|
data = new shim.TextDecoder("utf-8").decode(data);
|
|
}
|
|
data = (typeof data == 'string') ? data : await shim.stringify(data);
|
|
if('sha' === (opt.name||'').toLowerCase().slice(0,3)){
|
|
var rsha = shim.Buffer.from(await sha(data, opt.name), 'binary').toString(opt.encode || 'base64')
|
|
if(cb){ try{ cb(rsha) }catch(e){console.log(e)} }
|
|
return rsha;
|
|
}
|
|
if (typeof salt === "number") salt = salt.toString();
|
|
if (typeof opt.salt === "number") opt.salt = opt.salt.toString();
|
|
salt = salt || shim.random(9);
|
|
var key = await (shim.ossl || shim.subtle).importKey('raw', new shim.TextEncoder().encode(data), {name: opt.name || 'PBKDF2'}, false, ['deriveBits']);
|
|
var work = await (shim.ossl || shim.subtle).deriveBits({
|
|
name: opt.name || 'PBKDF2',
|
|
iterations: opt.iterations || S.pbkdf2.iter,
|
|
salt: new shim.TextEncoder().encode(opt.salt || salt),
|
|
hash: opt.hash || S.pbkdf2.hash,
|
|
}, key, opt.length || (S.pbkdf2.ks * 8))
|
|
data = shim.random(data.length) // Erase data in case of passphrase
|
|
var r = shim.Buffer.from(work, 'binary').toString(opt.encode || 'base64')
|
|
if(cb){ try{ cb(r) }catch(e){console.log(e)} }
|
|
return r;
|
|
} catch(e) {
|
|
console.log(e);
|
|
SEA.err = e;
|
|
if(SEA.throw){ throw e }
|
|
if(cb){ cb() }
|
|
return;
|
|
}});
|
|
|
|
module.exports = SEA.work;
|
|
|
|
}());
|