Skip to content

Commit bf0ace9

Browse files
committed
🔑 Argon2 KDF
1 parent 4ce6b85 commit bf0ace9

10 files changed

+315
-19
lines changed

‎README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,13 @@ chrome://flags/#enable-experimental-web-platform-features
6262
* [Web Serial API](https://web.dev/serial/)
6363
* [Lottie Web](https://github.com/airbnb/lottie-web)
6464
* [Material Design UI components for the web](https://github.com/material-components/material-components-web)
65+
* [SHA-512](http://pajhome.org.uk/crypt/)
66+
* [Argon2](https://github.com/antelle/argon2-browser)
6567

6668

6769
## 📦 Sources
6870

69-
* [JS implementation of SHA-512](http://pajhome.org.uk/crypt/)
71+
* [Load Wasm in manifest-v3](https://groups.google.com/a/chromium.org/g/chromium-extensions/c/sJiaTnFMLHQ/m/y-qT1gplHwAJ)
7072
* [Load favicon images](https://stackoverflow.com/a/15750809/904907)
7173
* [UI of PIN input](https://codepen.io/bradeneast/pen/YzzMoGw)
7274
* [USB Memory Stick Animation](https://lottiefiles.com/20358-usb-memory-stick-animation)
@@ -75,8 +77,7 @@ chrome://flags/#enable-experimental-web-platform-features
7577

7678
## 🔮 Future improvements
7779

78-
- Read NFC Tag ID
79-
- Hash with Argon2
80+
- Read NFC Tag ID with an external reader via USB serial (optional input)
8081

8182

8283
## 📄 License

‎app.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<!-- Github right -->
2525
<a target="_blank" rel="noopener noreferrer" href="https://github.com/TurtlPass/turtlpass-chrome-extension" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#43AA8F; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>
2626

27+
<script type="text/javascript" src="js/kdf.js"></script>
2728
<script type="text/javascript" src="js/sha512.js"></script>
2829
<script type="text/javascript" src="js/app.js"></script>
2930
</body>

‎js/app.js

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ connectButton.addEventListener('click', () => {
3838
anim = bodymovin.loadAnimation(loaderAnimParams);
3939
anim.playSegments(loadingSegment, true);
4040
window.onresize = anim.resize.bind(anim);
41-
connectSerial();
41+
startKdfWorker();
4242
} else {
4343
alert('Error: Web Serial API is not supported by your browser.');
4444
}
@@ -157,14 +157,13 @@ document.addEventListener('DOMContentLoaded', function() {
157157
});
158158

159159
////////////////
160-
// USB Serial //
160+
// KDF Worker //
161161
////////////////
162162

163-
var port, textEncoder, writableStreamClosed, writer;
164-
let keepReading = true;
165-
let reader;
163+
async function startKdfWorker() {
164+
message.style.marginTop = '30px';
165+
message.innerHTML = "Generating hash...";
166166

167-
async function sendSerialLine() {
168167
chrome.storage.local.get('selectedDomain', function(resultDomain) {
169168
if (!chrome.runtime.error && resultDomain.selectedDomain != undefined) {
170169
const domain = resultDomain.selectedDomain;
@@ -174,12 +173,21 @@ async function sendSerialLine() {
174173
try {
175174
const pin = document.getElementById('n1').value += document.getElementById('n2').value += document.getElementById('n3').value += document.getElementById('n4').value += document.getElementById('n5').value += document.getElementById('n6').value;
176175
var data = "";
177-
data += pin; //ex: 123456
178-
data += domain; //ex: "google.com"
179-
data += result[domain]; //ex: "test@ryanamaral.com"
176+
data += domain; //ex: "google"
177+
data += result[domain]; //ex: "web@turtlpass.com"
178+
// console.log(data)
180179
var sha512 = hex_sha512(data);
181-
var dataToSend = "/" + sha512 + "\n";
182-
writer.write(dataToSend);
180+
181+
const params = {
182+
pass: pin,
183+
salt: sha512,
184+
time: 32, // number of iterations
185+
mem: 65536, // 64 MiB memory cost
186+
hashLen: 64,
187+
parallelism: 4, // number of threads in parallel
188+
type: 1 // Argon2Type.Argon2i
189+
};
190+
kdfWorker('simd', params);
183191

184192
} catch (errorMsg) {
185193
alert(errorMsg);
@@ -190,7 +198,55 @@ async function sendSerialLine() {
190198
});
191199
}
192200

193-
async function connectSerial() {
201+
var worker;
202+
function kdfWorker(method, params) {
203+
if (worker) {
204+
if (worker.method === method) {
205+
// Using loaded worker
206+
worker.postMessage({ calc: method, arg: params });
207+
return;
208+
} else {
209+
worker.terminate();
210+
}
211+
}
212+
console.log('Starting worker...');
213+
214+
worker = new Worker('js/kdf-worker.js');
215+
worker.method = method;
216+
var loaded = false;
217+
worker.onmessage = function (e) {
218+
// console.log(e.data.msg);
219+
if (e.data.hash) {
220+
connectSerial(e.data.hash);
221+
} else if (!loaded) {
222+
loaded = true;
223+
worker.postMessage({ calc: method, arg: params });
224+
}
225+
};
226+
}
227+
228+
function loadScript(src, onload, onerror) {
229+
var el = document.createElement('script');
230+
el.src = src;
231+
el.onload = onload;
232+
el.onerror = onerror;
233+
document.body.appendChild(el);
234+
}
235+
236+
function log(msg) {
237+
if (!msg) return;
238+
console.log(msg);
239+
}
240+
241+
////////////////
242+
// USB Serial //
243+
////////////////
244+
245+
var port, textEncoder, writableStreamClosed, writer;
246+
let keepReading = true;
247+
let reader;
248+
249+
async function connectSerial(hash) {
194250
message.style.marginTop = '30px';
195251
message.innerHTML = "Connecting to your TurtlPass device...";
196252

@@ -209,9 +265,12 @@ async function connectSerial() {
209265

210266
writer = textEncoder.writable.getWriter();
211267

212-
sendSerialLine();
268+
var dataToSend = "/" + hash + "\n";
269+
writer.write(dataToSend);
213270

214271
} catch (errorMsg) {
272+
console.log(errorMsg);
273+
215274
if (errorMsg == 'NotFoundError: No port selected by the user.') {
216275
showError('Device not found! Please Try Again');
217276
} else {

0 commit comments

Comments
 (0)