forro

Forro is a end-to-end encrypted contract form based on PGP.
git clone git://git.defalsify.org/forro.git
Log | Files | Refs | LICENSE

commit b52b0a5c7c49d9e658f72f5c6b94c8c3ed3fc68a
Author: lash <dev@holbrook.no>
Date:   Sat, 17 Sep 2022 17:21:51 +0000

Initial commit

Diffstat:
Aindex.html | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Akey.js | 39+++++++++++++++++++++++++++++++++++++++
Alouis.asc | 320+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apackage.json | 6++++++
4 files changed, 450 insertions(+), 0 deletions(-)

diff --git a/index.html b/index.html @@ -0,0 +1,85 @@ +<html> + <head> + <script> +let g_remote_key = undefined; +let g_local_key = undefined; + </script> + <script src="node_modules/openpgp/dist/openpgp.min.js"></script> + <script defer src="/node_modules/alpinejs/dist/cdn.min.js"></script> + <script src="/key.js"></script> + <script> + // https://stackoverflow.com/questions/40031688/javascript-arraybuffer-to-hex + function buf2hex(buffer) { // buffer is an ArrayBuffer + console.log('buf ' + buffer); + return [...new Uint8Array(buffer)] + .map(x => x.toString(16).padStart(2, '0')) + .join(''); + } + async function setUp(o) { + let r = await fetch('louis.asc'); + let remote_key_src = await r.text(); + let remote_key = await openpgp.readKey({ + armoredKey: remote_key_src, + }); + g_remote_key = remote_key; + let k = undefined; + try { + k = await getKey('deadbeef'); + } catch { + k = await generatePGPKey(); + }; + g_local_key = k; + return [k.getKeyID().toHex(), g_remote_key.getKeyID().toHex()]; + } + function foo() { + alert(g_local_key.getKeyID().toHex()); + } + async function dispatch(s) { + let sb = new TextEncoder("utf-8").encode(s); + let digest = await crypto.subtle.digest('SHA-256', sb); + let msg = await openpgp.createMessage({ + text: s, + }); + let enc = g_remote_key; + let m = await openpgp.encrypt({ + encryptionKeys: enc, + format: 'binary', + message: msg, + config: { rejectCurves: new Set() }, + }); + let sig = await openpgp.sign({ + signingKeys: g_local_key, + message: msg, + format: 'binary', + detached: true, + config: { rejectCurves: new Set() }, + }); + let pubkey = g_local_key.toPublic().write(); + let pubkey_str = String.fromCharCode.apply(null, pubkey); + + let sig_str = String.fromCharCode.apply(null, sig); + + let rcpt = buf2hex(digest); + + console.log({sig: btoa(sig_str), pubkey: btoa(pubkey_str), rcpt: rcpt, m: s}); + }; + + </script> + </head> + + <body> + <div x-init="[key, rkey] = await setUp(this);" x-data="{key: '(none)', rkey: '(none)', rcpt: '', content: ''}"> + <h1 >Your identity: + <span x-text="key"></span> + <br/>Their identity: + <span x-text="rkey"></span> + <br/>Your receipt: + <span x-text="rcpt"></span> + </h1> + <textarea x-model="content"> + </textarea> + <button @click="rcpt = await dispatch(content)">sign, encrypt and send</button> + </div> + </body> + +</html> diff --git a/key.js b/key.js @@ -0,0 +1,39 @@ +async function generatePGPKey() { + return new Promise(async (whohoo, doh) => { + console.log(openpgp.generateKey); + let v = await openpgp.generateKey({ + type: 'ecc', + curve: 'secp256k1', + userIDs: [{name: "Ola Nordmann", email: "ola@nordmann.no" }], + passphrase: 'deadbeef', + format: 'armored', + config: { rejectCurves: new Set() }, + }); + console.log('pk ' + v.privateKey ); + console.log('pubk ' + v.publicKey ); + localStorage.setItem('pgp-key', v.privateKey); + let k = openpgp.readKey({ + armoredKey: v.privateKey, + }); + whohoo(k); + }); +} + +async function getKey(pwd) { + return new Promise(async (whohoo, doh) => { + let pk_armor = localStorage.getItem('pgp-key'); + console.log('pk ' + pk_armor); + if (pk_armor === null) { + doh('no key'); + return; + } + let pk = await openpgp.readKey({ + armoredKey: pk_armor, + }); + let k = await openpgp.decryptKey({ + privateKey: pk, + passphrase: pwd, + }); + whohoo(k); + }); +} diff --git a/louis.asc b/louis.asc @@ -0,0 +1,320 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +of3TPGwO6RPliRInl7zk3fKfRGHtC8n+BE2XwyAOp8aMSolL6fqt06MiGdA+DlEI +Un4uRdXuqmiGfcnnmKzdl+s/zaRPuHqiy1ZqP7oCWlQAlzYD16ggpARF73Q47n1f +9f1HSIRfJgH5jN1fwnesQQCZ3hftdZd1fUolSbiyOhcBr1l7dixiXL61pRn/IlCc +/Cpw1c0QWYkCMwQQAQgAHRYhBAgm7aFwLR6HxuKHUSHS57uIwqdGBQJbrV85AAoJ +ECHS57uIwqdGVKYP/11isk8s2Yc3QK+lOhUUP89dAjNi57jkAGczDNojaZBpJzT0 +DQ1f0fhJ3lC39uI7Dl5U/Ozt1psWewXxrw7GuaIb2X8N8yqjNjVXChulC+msPWtM +H7dpvRUbGx7jXinI9xSk6X4Al/eL9O+8PdYQqC41YnvYL3Z/xpTa+BZFfhT9BivI +JJMhmgI5XIcF30AanOKZ2S45//9z4LbPDMRjDDfPSXu+0Tp1jVt2VHmUXaoOP/bR +cd5LaXSReS/eBGke0zg+6ymOcenXup5TrylPRNDx+Djx7xsgwQXDXE3bSsjdyxNB +kTdh/s6bjVnJ+oP+Qm8+PSbwQbBFVeXaGTzQp2WmoHjKN74Q0k3wFd0g5DKcRj5I +ImBt3Y0VH3Z45hQ89vJAwR34K28uhxlAZPa9eJ3jH/WcdUd+wVA/7rUxuoz8xsBL +n7JBNCpLUQPqqlQY92ufiGh9rWh5Ifi7vm5huHrj1bBuGnbgUX+UKnndBBDyxNky +gfYDlVKhnsJxPVFIY91Y1Tz5IiX13F97xAO8DK5WnkkkmiIkjlmY00RUc87jO3qo +GqBy83yfkhlt4kLYxgp2FcLUNVLF9LI+nEbaP1W3JNeMSTsCO9c1LOcHjOcWwFSV +nBUNqAZ56/Do5Dx7zOdamZiTtBcAC2pVXQgmo5pvWTnloM8UJrkSIUfoa7vdiGsE +EBECACsFAlvA+sQFgwHihQAeGmh0dHA6Ly93d3cuY2FjZXJ0Lm9yZy9jcHMucGhw +AAoJENK7DQFl0P1YTZgAn2G/ukYtStIWfdQonxqukm2RTC+2AJwK6tMDJ3SjZ3yt +3Ish+MNOjXY7GYkBMwQQAQgAHRYhBBNp+PDM1pYgwjeCRmfyvG8Lel7GBQJb9z03 +AAoJEGfyvG8Lel7GuN8H/A7ayyIWJnaFNpxnzQ0BXptU4X4gU7viNLcNuxRmt+0f +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 +=0dk5 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/package.json b/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "alpinejs": "~3.10.3", + "openpgp": "5.5.0" + } +}