mirror of
https://github.com/amark/gun.git
synced 2025-06-07 06:36:46 +00:00
refactor: according to mhelander review
This commit is contained in:
parent
a6fc7fd5c5
commit
8e7a5369cc
39
sea.js
39
sea.js
@ -177,13 +177,13 @@
|
|||||||
api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle;
|
api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle;
|
||||||
api.TextEncoder = window.TextEncoder;
|
api.TextEncoder = window.TextEncoder;
|
||||||
api.TextDecoder = window.TextDecoder;
|
api.TextDecoder = window.TextDecoder;
|
||||||
api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len))))
|
api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len))));
|
||||||
}
|
}
|
||||||
if(!api.TextDecoder)
|
if(!api.TextDecoder)
|
||||||
{
|
{
|
||||||
const { TextEncoder, TextDecoder } = require('text-encoding')
|
const { TextEncoder, TextDecoder } = require('text-encoding');
|
||||||
api.TextDecoder = TextDecoder
|
api.TextDecoder = TextDecoder;
|
||||||
api.TextEncoder = TextEncoder
|
api.TextEncoder = TextEncoder;
|
||||||
}
|
}
|
||||||
if(!api.crypto){try{
|
if(!api.crypto){try{
|
||||||
var crypto = USE('crypto', 1);
|
var crypto = USE('crypto', 1);
|
||||||
@ -191,14 +191,8 @@
|
|||||||
crypto,
|
crypto,
|
||||||
random: (len) => Buffer.from(crypto.randomBytes(len))
|
random: (len) => Buffer.from(crypto.randomBytes(len))
|
||||||
});
|
});
|
||||||
//try{
|
const isocrypto = require('isomorphic-webcrypto');
|
||||||
// const WebCrypto = USE('node-webcrypto-ossl', 1);
|
api.ossl = api.subtle = isocrypto.subtle;
|
||||||
// api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH
|
|
||||||
const isocrypto = require('isomorphic-webcrypto');
|
|
||||||
api.ossl = api.subtle = isocrypto.subtle
|
|
||||||
//}catch(e){
|
|
||||||
//console.log("node-webcrypto-ossl is optionally needed for ECDH, please install if needed.");
|
|
||||||
//}
|
|
||||||
}catch(e){
|
}catch(e){
|
||||||
console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!");
|
console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!");
|
||||||
OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED;
|
OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED;
|
||||||
@ -228,12 +222,12 @@
|
|||||||
return jwk;
|
return jwk;
|
||||||
};
|
};
|
||||||
|
|
||||||
s.keyTojwk = function(keyBytes) {
|
s.keyToJwk = function(keyBytes) {
|
||||||
var jwkKeyString = keyBytes.toString('base64')
|
const keyB64 = keyBytes.toString('base64');
|
||||||
jwkKeyString = jwkKeyString.replace(/\+/g, "-").replace(/\//g, "_").replace(/\=/g, "");
|
const k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');
|
||||||
jwkKeyString = { kty: "oct", k: jwkKeyString, ext: false, alg: "A256GCM"};
|
return { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };
|
||||||
return jwkKeyString
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s.recall = {
|
s.recall = {
|
||||||
validity: 12 * 60 * 60, // internally in seconds : 12 hours
|
validity: 12 * 60 * 60, // internally in seconds : 12 hours
|
||||||
hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props)
|
hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props)
|
||||||
@ -517,8 +511,9 @@
|
|||||||
var opt = opt || {};
|
var opt = opt || {};
|
||||||
const combo = key + (salt || shim.random(8)).toString('utf8'); // new
|
const combo = key + (salt || shim.random(8)).toString('utf8'); // new
|
||||||
const hash = shim.Buffer.from(await sha256hash(combo), 'binary')
|
const hash = shim.Buffer.from(await sha256hash(combo), 'binary')
|
||||||
const jwkHash = S.keyTojwk(hash)
|
|
||||||
return await shim.subtle.importKey('jwk', jwkHash, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])
|
const jwkKey = S.keyToJwk(hash)
|
||||||
|
return await shim.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])
|
||||||
}
|
}
|
||||||
module.exports = importGen;
|
module.exports = importGen;
|
||||||
})(USE, './aeskey');
|
})(USE, './aeskey');
|
||||||
@ -624,9 +619,9 @@
|
|||||||
var privKeyData = keysToEcdhJwk(epub, epriv);
|
var privKeyData = keysToEcdhJwk(epub, epriv);
|
||||||
var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => {
|
var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => {
|
||||||
// privateKey scope doesn't leak out from here!
|
// privateKey scope doesn't leak out from here!
|
||||||
var derivedBits = await ecdhSubtle.deriveBits(props,privKey,256);
|
var derivedBits = await ecdhSubtle.deriveBits(props, privKey, 256);
|
||||||
derivedBits = new Uint8Array(derivedBits);
|
var rawBits = new Uint8Array(derivedBits);
|
||||||
const derivedKey = await ecdhSubtle.importKey("raw",derivedBits,{ name: "AES-GCM", length: 256 },true,["encrypt", "decrypt"]);
|
var derivedKey = await ecdhSubtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);
|
||||||
return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k);
|
return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k);
|
||||||
})
|
})
|
||||||
var r = derived;
|
var r = derived;
|
||||||
|
@ -8,8 +8,9 @@
|
|||||||
var opt = opt || {};
|
var opt = opt || {};
|
||||||
const combo = key + (salt || shim.random(8)).toString('utf8'); // new
|
const combo = key + (salt || shim.random(8)).toString('utf8'); // new
|
||||||
const hash = shim.Buffer.from(await sha256hash(combo), 'binary')
|
const hash = shim.Buffer.from(await sha256hash(combo), 'binary')
|
||||||
const jwkHash = S.keyTojwk(hash)
|
|
||||||
return await shim.subtle.importKey('jwk', jwkHash, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])
|
const jwkKey = S.keyToJwk(hash)
|
||||||
|
return await shim.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])
|
||||||
}
|
}
|
||||||
module.exports = importGen;
|
module.exports = importGen;
|
||||||
|
|
@ -17,9 +17,9 @@
|
|||||||
var privKeyData = keysToEcdhJwk(epub, epriv);
|
var privKeyData = keysToEcdhJwk(epub, epriv);
|
||||||
var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => {
|
var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => {
|
||||||
// privateKey scope doesn't leak out from here!
|
// privateKey scope doesn't leak out from here!
|
||||||
var derivedBits = await ecdhSubtle.deriveBits(props,privKey,256);
|
var derivedBits = await ecdhSubtle.deriveBits(props, privKey, 256);
|
||||||
derivedBits = new Uint8Array(derivedBits);
|
var rawBits = new Uint8Array(derivedBits);
|
||||||
const derivedKey = await ecdhSubtle.importKey("raw",derivedBits,{ name: "AES-GCM", length: 256 },true,["encrypt", "decrypt"]);
|
var derivedKey = await ecdhSubtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);
|
||||||
return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k);
|
return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k);
|
||||||
})
|
})
|
||||||
var r = derived;
|
var r = derived;
|
||||||
|
@ -19,12 +19,12 @@
|
|||||||
return jwk;
|
return jwk;
|
||||||
};
|
};
|
||||||
|
|
||||||
s.keyTojwk = function(keyBytes) {
|
s.keyToJwk = function(keyBytes) {
|
||||||
var jwkKeyString = keyBytes.toString('base64')
|
const keyB64 = keyBytes.toString('base64');
|
||||||
jwkKeyString = jwkKeyString.replace(/\+/g, "-").replace(/\//g, "_").replace(/\=/g, "");
|
const k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');
|
||||||
jwkKeyString = { kty: "oct", k: jwkKeyString, ext: false, alg: "A256GCM"};
|
return { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };
|
||||||
return jwkKeyString
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s.recall = {
|
s.recall = {
|
||||||
validity: 12 * 60 * 60, // internally in seconds : 12 hours
|
validity: 12 * 60 * 60, // internally in seconds : 12 hours
|
||||||
hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props)
|
hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props)
|
||||||
|
20
sea/shim.js
20
sea/shim.js
@ -5,20 +5,20 @@
|
|||||||
var o = {};
|
var o = {};
|
||||||
|
|
||||||
if(SEA.window){
|
if(SEA.window){
|
||||||
api.crypto = window.crypto || window.msCrypto;
|
api.crypto = window.crypto || window.msCrypto || require('isomorphic-webcrypto');
|
||||||
if(!api.crypto) {
|
if(!api.crypto) {
|
||||||
api.crypto = require('isomorphic-webcrypto');
|
api.crypto = require('isomorphic-webcrypto');
|
||||||
}
|
}
|
||||||
api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle;
|
api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle;
|
||||||
api.TextEncoder = window.TextEncoder;
|
api.TextEncoder = window.TextEncoder;
|
||||||
api.TextDecoder = window.TextDecoder;
|
api.TextDecoder = window.TextDecoder;
|
||||||
api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len))))
|
api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len))));
|
||||||
}
|
}
|
||||||
if(!api.TextDecoder)
|
if(!api.TextDecoder)
|
||||||
{
|
{
|
||||||
const { TextEncoder, TextDecoder } = require('text-encoding')
|
const { TextEncoder, TextDecoder } = require('text-encoding');
|
||||||
api.TextDecoder = TextDecoder
|
api.TextDecoder = TextDecoder;
|
||||||
api.TextEncoder = TextEncoder
|
api.TextEncoder = TextEncoder;
|
||||||
}
|
}
|
||||||
if(!api.crypto){try{
|
if(!api.crypto){try{
|
||||||
var crypto = require('crypto', 1);
|
var crypto = require('crypto', 1);
|
||||||
@ -26,14 +26,8 @@
|
|||||||
crypto,
|
crypto,
|
||||||
random: (len) => Buffer.from(crypto.randomBytes(len))
|
random: (len) => Buffer.from(crypto.randomBytes(len))
|
||||||
});
|
});
|
||||||
//try{
|
const isocrypto = require('isomorphic-webcrypto');
|
||||||
// const WebCrypto = require('node-webcrypto-ossl', 1);
|
api.ossl = api.subtle = isocrypto.subtle;
|
||||||
// api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH
|
|
||||||
const isocrypto = require('isomorphic-webcrypto');
|
|
||||||
api.ossl = api.subtle = isocrypto.subtle
|
|
||||||
//}catch(e){
|
|
||||||
//console.log("node-webcrypto-ossl is optionally needed for ECDH, please install if needed.");
|
|
||||||
//}
|
|
||||||
}catch(e){
|
}catch(e){
|
||||||
console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!");
|
console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!");
|
||||||
OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED;
|
OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user