Skip to content
Snippets Groups Projects
Commit d94eccfb authored by Millicent Billette's avatar Millicent Billette
Browse files

faster, nicer, with web-worker !

parent 2a3762ce
Branches
No related tags found
No related merge requests found
...@@ -7,9 +7,9 @@ image: node:latest ...@@ -7,9 +7,9 @@ image: node:latest
build-and-clean: build-and-clean:
stage: build stage: build
script: script:
- npm install --production - npm install
- npm run postinstall - npm run postinstall
#- node build.js - npm run build
artifacts: artifacts:
untracked: true untracked: true
paths: paths:
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
"main": "public/index.html", "main": "public/index.html",
"scripts": { "scripts": {
"postinstall": "node build.js", "postinstall": "node build.js",
"build":"rollup public/worker.js --format iife --file public/generated.worker.js",
"test": "echo open public/test.html in your browser" "test": "echo open public/test.html in your browser"
}, },
"repository": { "repository": {
...@@ -18,6 +19,7 @@ ...@@ -18,6 +19,7 @@
"tweetnacl": "^1.0.0" "tweetnacl": "^1.0.0"
}, },
"devDependencies": { "devDependencies": {
"rollup": "^0.58.1",
"jasmine-core": "^3.1.0" "jasmine-core": "^3.1.0"
} }
} }
...@@ -30,6 +30,23 @@ ...@@ -30,6 +30,23 @@
</div> </div>
</header> </header>
<div id="resultat" class="pasEncore"> <div id="resultat" class="pasEncore">
<h2>Ǧ'trouvé ! ǦéLéClé !</h2>
<div class="gift">
<a href="https://cesium.g1.1000i100.fr/#/app/wot/2sZF6j2PkxBDNAqUde7Dgo5x3crkerZpQ4rBqqJGn8QT/1000i100" target="_blank">Ǧ'spère vous avoir été utile.<br/>
Soutenez mon travail avec un don !<br/>
👤 : 1000i100 🔑 : 2sZF6j2P
</a>
</div>
<div class="basic">
<div><span>Identifiant secret : </span><span id="resIdSec"></span></div>
<div><span>Mot de passe : </span><span id="resPass"></span></div>
</div>
<div id="advShow">-- Avancé --</div>
<div id="adv">
<div><span>Clef publique : </span><span id="resPublicKey"></span></div>
<div><span>Clef privée : </span><span id="resSecretKey"></span></div>
<div><span>Graine : </span><span id="resSeed"></span></div>
</div>
</div> </div>
<div id="lists"> <div id="lists">
<fieldset> <fieldset>
......
const cores = navigator.hardwareConcurrency; const workers = [];
import * as crypto from "./crypto.js"; function startWorkers() {
for (let i=0;i<navigator.hardwareConcurrency;i++){
workers[i] = new Worker('generated.worker.js',{type:"module"}); // en attendant un meilleur support des modules et import
workers[i].addEventListener('message', combiTested);
}
}
startWorkers();
let combi;
let tested = 0;
function combiTested(event){
console.log(event.data);
tested++;
document.getElementById("percent").innerHTML = `${Math.round(10000*tested/combi)/100}%`;
if(event.data.match){
document.getElementById("resultat").classList.remove("pasEncore");
document.getElementById("resIdSec").innerText = event.data.idSec;
document.getElementById("resPass").innerText = event.data.password;
document.getElementById("resPublicKey").innerText = event.data.publicKey;
document.getElementById("resSecretKey").innerText = event.data.secretKey;
document.getElementById("resSeed").innerText = event.data.seed;
for (let i=0;i<navigator.hardwareConcurrency;i++) workers[i].terminate();
setTimeout(startWorkers,0);
}
if(tested === combi) document.getElementById("percent").innerHTML = "Fini sans résultats";
}
addEventsListeners(document.querySelectorAll("#salt, #pass"),"change keyup",updateEstimate); addEventsListeners(document.querySelectorAll("#salt, #pass"),"change keyup",updateEstimate);
updateEstimate(); updateEstimate();
...@@ -7,39 +34,23 @@ function updateEstimate(){ ...@@ -7,39 +34,23 @@ function updateEstimate(){
const idSecList = multiLineString2cleanArray(document.getElementById("salt").value); const idSecList = multiLineString2cleanArray(document.getElementById("salt").value);
const passList = multiLineString2cleanArray(document.getElementById("pass").value); const passList = multiLineString2cleanArray(document.getElementById("pass").value);
document.getElementById("combi").innerHTML = idSecList.length*passList.length; document.getElementById("combi").innerHTML = idSecList.length*passList.length;
document.getElementById("temps").innerHTML = (idSecList.length*passList.length)+"s"; document.getElementById("temps").innerHTML = "&lt; "+(idSecList.length*passList.length/10)+"s";
} }
document.getElementById("compute").addEventListener("click", async e=>{ document.getElementById("compute").addEventListener("click", e=>{
const pub = document.getElementById("pubkey").value.trim(); const pub = document.getElementById("pubkey").value.trim();
const pubRaw = crypto.b58.decode(pub);
const idSecList = multiLineString2cleanArray(document.getElementById("salt").value); const idSecList = multiLineString2cleanArray(document.getElementById("salt").value);
const passList = multiLineString2cleanArray(document.getElementById("pass").value); const passList = multiLineString2cleanArray(document.getElementById("pass").value);
const combi = idSecList.length*passList.length; combi = idSecList.length*passList.length;
updateEstimate(); updateEstimate();
document.getElementById("percent").innerHTML = "0%"; document.getElementById("percent").innerHTML = "0%";
tested = 0;
let count = 0; let count = 0;
for(let idSec of idSecList){ for(let idSec of idSecList){
for (let pass of passList){ for (let pass of passList){
const keys = await crypto.idSecPass2cleanKeys(idSec,pass); workers[count%workers.length].postMessage({pub,idSec,pass});
if(pub === keys.publicKey){
const resArea = document.getElementById("resultat");
resArea.classList.remove("pasEncore");
resArea.innerHTML = `<h2>Ǧ'trouvé ! ǦéLéClé !</h2><br/>
Identifiant secret : ${idSec}<br/>
Mot de passe : ${pass}<br/>
-- Avancé --<br/>
Clef publique : ${pub}<br/>
Clef privée : ${keys.secretKey}<br/>
Graine : ${keys.seed}<br/>
`;
document.getElementById("percent").innerHTML = "Trouvé :)";
return;
}
count++; count++;
document.getElementById("percent").innerHTML = `${Math.round(10000*count/combi)/100}%`;
} }
} }
document.getElementById("percent").innerHTML = "Fini sans résultats";
}); });
function addEventsListeners(triggerNodes,events,functions){ function addEventsListeners(triggerNodes,events,functions){
if(!triggerNodes.length) triggerNodes = [triggerNodes]; if(!triggerNodes.length) triggerNodes = [triggerNodes];
......
* {font-family: sans-serif; box-sizing: border-box; margin: 0; padding: 0} * {font-family: sans-serif; box-sizing: border-box; margin: 0; padding: 0}
h1{font-weight: normal; width: 100%; text-align: center; line-height: 70px;} h1{font-weight: normal; width: 100%; text-align: center; line-height: 70px;}
h2 {text-align: center;}
input[type="text"],textarea{border: 0; padding: 5px;} input[type="text"],textarea{border: 0; padding: 5px;}
legend {margin-left: 10px; padding: 0 5px} legend {margin-left: 10px; padding: 0 5px}
em{font-size: 70%} em{font-size: 70%}
...@@ -40,3 +41,10 @@ a:hover {color: #666; text-decoration-style: solid; text-decoration-color: #ccc; ...@@ -40,3 +41,10 @@ a:hover {color: #666; text-decoration-style: solid; text-decoration-color: #ccc;
padding: 20px; padding: 20px;
border: 2px groove grey; border: 2px groove grey;
} }
.gift{
float:right;
text-align: right;
}
.basic {margin-top: 10px;}
#advShow {margin-top: 10px;}
#advShow, #adv {opacity: 0.3;}
import * as crypto from "./crypto.js";
self.addEventListener('message', async function(event){
if(event.data === 'stop') self.close();
const keys = await crypto.idSecPass2cleanKeys(event.data.idSec,event.data.pass);
if(event.data.pub === keys.publicKey){
keys.match = true;
}
postMessage(keys);
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment