Sleds/libeye.js/libeye.html

523 lines
20 KiB
HTML

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>LibEye Key Generation and Encryption</title>
</head>
<script src="js/forge.min.js"></script>
<script src="eyedrbg.js"></script>
<script src="eyeperms.js"></script>
<script src="test.js"></script>
<script type="text/javascript">
<!--
if(typeof BigInteger === 'undefined') {
var BigInteger = forge.jsbn.BigInteger;
}
function do_status(s) {
document.libeye.status.value = s;
}
function do_init() {
if(document.libeye.clearpassword.value.length == 0)
document.libeye.clearpassword.value = 'madman12';
var fileInput = document.getElementById('keyfile')
fileInput.addEventListener('change', loadKeyring);
fileInput = document.getElementById('pemfile')
fileInput.addEventListener('change', loadPEM);
fileInput = document.getElementById('attachfile')
fileInput.addEventListener('change', loadAttachment);
fileInput = document.getElementById('ionu')
fileInput.addEventListener('change', loadIONU);
}
function do_md5() {
var md = forge.md.md5.create();
var msg = document.libeye.plaintext.value;
md.update(msg);
document.libeye.ciphertext.value = md.digest().toHex();
}
function do_sha1() {
var md = forge.md.sha1.create();
var msg = document.libeye.plaintext.value;
md.update(msg);
document.libeye.ciphertext.value = md.digest().toHex();
}
function do_sha256() {
var md = forge.md.sha256.create();
var msg = document.libeye.plaintext.value;
md.update(msg);
document.libeye.ciphertext.value = md.digest().toHex();
//console.log(md.digest().toHex());
}
function do_hmac() {
var hmac = forge.hmac.create();
hmac.start('sha256', 'madman12');
var msg = document.libeye.plaintext.value;
hmac.update(msg);
document.libeye.ciphertext.value = hmac.digest().toHex();
}
function do_password() {
var password = createAccountCode (8, 32);
document.libeye.clearpassword.value = password;
}
function do_provision() {
var keyring = new Keyring ('challenge', 'test');
//var account = keyring.provisionAccountRSAKey ('test', 'i3gl7puh');
var account = keyring.provisionChallengeRSAKey ('tim', '["000000:tim","favbook::BOB","flame::BOB","kiss::BOB"]', '');
var tim = keyring.getKey ('tim');
console.log (tim.convertPublicToPEM());
//var account = keyring.provisionAccountRSAKey ('me', 'i3gl7puh', '', '["000000:timberes_ca9","favbook::BOB","flame::BOB","kiss::BOB"]');
//var myaccount = keyring.provisionAccountRSAKey ('me', account.code, account.salt, '["000000:timberes_ca9","favbook::BOB","flame::BOB","kiss::BOB"]');
//keyring.provisionChallengeRSAKey ("ch", '["000000:timberes_ca9","favbook::BOB","flame::BOB","kiss::BOB"]', myaccount.salt);
//myaccount = keyring.provisionAccountRSAKey ('me', myaccount.code, myaccount.salt);
//myaccount = keyring.provisionAccountRSAKey ('me', myaccount.code, myaccount.salt, '["000000:timberes_ca9","favbook::HARRY","flame::HARRY","kiss::HARRY"]');
//keyring.provisionChallengeRSAKey ('me', '["000000:timberes_ca9","favbook::HARRY","flame::HARRY","kiss::HARRY"]', myaccount.salt);
//var account = keyring.provisionAccountRSAKey ('test', 'abcdefgh');
//var myaccount = keyring.provisionAccountRSAKey ('me', account.code, account.salt, 'Bob,Bob,Bob');
//keyring.provisionChallengeRSAKey ("ch", 'Bob,Bob,Bob', myaccount.salt);
//myaccount = keyring.provisionAccountRSAKey ('me', myaccount.code, myaccount.salt);
//myaccount = keyring.provisionAccountRSAKey ('me', account.code, account.salt, 'Bob,Bob,Bob');
//myaccount = keyring.provisionAccountRSAKey ('me', account.code, account.salt, 'Bob,Bob,Bob');
//var mcf = deriveKey ('madman12');
//console.log (mcf);
//mcf = deriveKey ('madman12', mcf);
//console.log (mcf);
//mcf = deriveKey ('madman12', '6EVdXfSkSX+I15ZXGCRRH4TnpBnt17ivih5Nd7DxkPQ=');
//console.log (mcf);
//mcf = deriveKey ('madman12', mcf);
//var key = keyring.getKey ('test');
//console.log (key.convertPublicToPEM());
}
function do_slowhash() {
var password = document.libeye.clearpassword.value;
var mcf = document.libeye.mcf.value;
if (mcf.length > 22) {
deriveKey (password, mcf);
}
else {
mcf = deriveKey (password);
document.libeye.mcf.value = mcf;
}
}
function do_fasthash() {
var password = document.libeye.clearpassword.value;
var md = forge.md.sha256.create();
md.update ('CloudGuard half key');
var cghk = md.digest().toHex();
mcf = deriveUserKey (password, cghk);
document.libeye.mcf.value = mcf;
}
function do_pbkdf2() {
var before = new Date();
var hexSalt = '49734f616e6c5574';
var salt = forge.util.hexToBytes (hexSalt);
var key = forge.pkcs5.pbkdf2('madman12', salt, document.libeye.iterations, 32);
var password = document.libeye.clearpassword.value;
var count = document.libeye.iterations.value;
var key = forge.pkcs5.pbkdf2(password, salt, count, 32);
//var key = forge.pkcs5.pbkdf2('madman12', salt, 2500, 32);
var mcf = '$pbkdf2$' + count + '$' + forge.util.encode64 (key) + "$" + forge.util.encode64 (salt);
document.libeye.mcf.value = mcf;
var after = new Date();
do_status("PBKDF2 Generation Time: " + (after - before) + "ms");
}
function do_aes_encrypt() {
// generate a random IV
var iv = forge.random.getBytesSync(16);
document.libeye.iv.value = forge.util.bytesToHex(iv);
var mcf = document.libeye.mcf.value;
var fields = mcf.split('$');
var key;
if (fields.length > 3) {
key = forge.util.decode64(fields[3]);
}
else {
key = forge.util.decode64(mcf);
}
var cipher = forge.cipher.createCipher('AES-CBC', key);
cipher.start({iv: iv});
var msg = document.libeye.plaintext.value;
cipher.update(forge.util.createBuffer(msg));
cipher.finish();
var encrypted = cipher.output;
document.libeye.ciphertext.value = encrypted.toHex();
}
function do_aes_decrypt() {
var iv = forge.util.hexToBytes(document.libeye.iv.value);
var mcf = document.libeye.mcf.value;
var fields = mcf.split('$');
var key;
if (fields.length > 3) {
key = forge.util.decode64(fields[3]);
}
else {
key = forge.util.decode64(mcf);
}
var decipher = forge.cipher.createDecipher('AES-CBC', key);
decipher.start({iv: iv});
var msg = forge.util.hexToBytes(document.libeye.ciphertext.value);
decipher.update(forge.util.createBuffer(msg));
decipher.finish();
var decrypted = decipher.output;
document.libeye.decrypted.value = decrypted;
}
function do_genrsa() {
// generate an RSA key pair synchronously
var key = new Key ('random', 'rsa', IONU_KEY_TYPE_RSA, forge.pki.rsa.generateKeyPair({bits: 2048, e: 0x10001}));
var pem = key.convertPrivateToPEM();
var fp = forge.pki.getPublicKeyFingerprint(key.key.publicKey, {encoding: 'hex', delimiter: ':'});
document.libeye.fingerprint.value = fp;
document.libeye.n.value = key.key.privateKey.n.toString(16);
document.libeye.e.value = key.key.privateKey.e.toString(16);
document.libeye.d.value = key.key.privateKey.d.toString(16);
document.libeye.p.value = key.key.privateKey.p.toString(16);
document.libeye.q.value = key.key.privateKey.q.toString(16);
document.libeye.dP.value = key.key.privateKey.dP.toString(16);
document.libeye.dQ.value = key.key.privateKey.dQ.toString(16);
document.libeye.qInv.value = key.key.privateKey.qInv.toString(16);
var encrypted = key.publicKeyEncrypt('Howdy doooody', 'RSA-OAEP');
var decrypted = key.privateKeyDecrypt(encrypted, 'RSA-OAEP');
console.log (decrypted);
var keyring = new Keyring ('ionu_keyring', 'ring');
keyring.addKey (key);
console.log (keyring.toString());
keyring.saveToLocalStorage ();
//console.log (localStorage.ionu_keyring);
keyring.loadFromLocalStorage ('ionu_keyring');
var lkey = keyring.getKey ('random');
decrypted = lkey.privateKeyDecrypt(encrypted, 'RSA-OAEP');
console.log (decrypted);
}
function do_drbg() {
var before = new Date();
var drbg = new EyeDRBG (document.libeye.challenge.value);
//var bytes = drbg.randBytes (32);
//console.log(forge.util.bytesToHex(bytes));
var key = new Key ('drbg', 'rsa', IONU_KEY_TYPE_RSA, drbg.generateRSAKey());
var fp = key.getPublicKeyFingerprint();
document.libeye.fingerprint.value = fp;
document.libeye.n.value = key.key.privateKey.n.toString(16);
document.libeye.e.value = key.key.privateKey.e.toString(16);
document.libeye.d.value = key.key.privateKey.d.toString(16);
document.libeye.p.value = key.key.privateKey.p.toString(16);
document.libeye.q.value = key.key.privateKey.q.toString(16);
document.libeye.dP.value = key.key.privateKey.dP.toString(16);
document.libeye.dQ.value = key.key.privateKey.dQ.toString(16);
document.libeye.qInv.value = key.key.privateKey.qInv.toString(16);
var encrypted = key.publicKeyEncrypt('Howdy doooody', 'RSA-OAEP');
try {
var decrypted = key.privateKeyDecrypt(encrypted, 'RSA-OAEP');
console.log (decrypted);
}
catch (err) {
console.log (err.message);
}
var after = new Date();
do_status("RSA Generation Time: " + (after - before) + "ms");
}
function do_genrsa_challenge() {
var keyring = new Keyring ('challenge', 'test');
var challenge = '';
var salt = '';
var secret = 'mySecretSauce';
// Generate the secret based seed
var saltedSeed = keyring.generateSaltedChallengeSeed (challenge, secret, salt);
console.log (saltedSeed.seed);
// Generate the challenge + secret seed, returns the salt
challenge = document.libeye.challenge.value;
saltedSeed = keyring.generateSaltedChallengeSeed (challenge, secret, salt);
salt = saltedSeed.salt;
console.log (saltedSeed.seed);
// Generate the challenge + salt seed
secret = '';
saltedSeed = keyring.generateSaltedChallengeSeed (challenge, secret, salt);
console.log (saltedSeed.seed);
saltedSeed = keyring.generateSaltedChallengeSeed (challenge);
console.log (saltedSeed.seed);
//var before = new Date();
//do_status("Challenge Generation Time: " + (after - before) + "ms");
}
function do_rsa_encrypt() {
var e, n;
e = new BigInteger (document.libeye.e.value, 16);
n = new BigInteger (document.libeye.n.value, 16);
var publicKey = forge.pki.rsa.setPublicKey (n, e);
// encrypt data with a public key using RSAES-OAEP
var msg = document.libeye.plaintext.value;
var encrypted = publicKey.encrypt(msg, 'RSA-OAEP');
document.libeye.ciphertext.value = forge.util.bytesToHex(encrypted);
}
function do_rsa_decrypt() {
var n, e, d, p, q, dP, dQ, qInv;
e = new BigInteger (document.libeye.e.value, 16);
n = new BigInteger (document.libeye.n.value, 16);
d = new BigInteger (document.libeye.d.value, 16);
p = new BigInteger (document.libeye.p.value, 16);
q = new BigInteger (document.libeye.q.value, 16);
dP = new BigInteger (document.libeye.dP.value, 16);
dQ = new BigInteger (document.libeye.dQ.value, 16);
var privateKey = forge.pki.setRsaPrivateKey(n, e, d, p, q, dP, dQ, qInv);
// decrypt data with a private key using RSAES-OAEP
var msg = forge.util.hexToBytes(document.libeye.ciphertext.value);
var decrypted = privateKey.decrypt(msg, 'RSA-OAEP');
document.libeye.decrypted.value = decrypted;
}
function do_rsa_sign() {
var n, e, d, p, q, dP, dQ, qInv;
e = new BigInteger (document.libeye.e.value, 16);
n = new BigInteger (document.libeye.n.value, 16);
d = new BigInteger (document.libeye.d.value, 16);
p = new BigInteger (document.libeye.p.value, 16);
q = new BigInteger (document.libeye.q.value, 16);
dP = new BigInteger (document.libeye.dP.value, 16);
dQ = new BigInteger (document.libeye.dQ.value, 16);
var privateKey = forge.pki.setRsaPrivateKey(n, e, d, p, q, dP, dQ, qInv);
// Sign data with private key
var msg = document.libeye.plaintext.value;
var md = forge.md.sha1.create();
md.update(msg);
var signature = privateKey.sign(md);
document.libeye.ciphertext.value = forge.util.bytesToHex(signature);
}
function do_rsa_verify() {
var e, n;
e = new BigInteger (document.libeye.e.value, 16);
n = new BigInteger (document.libeye.n.value, 16);
var publicKey = forge.pki.rsa.setPublicKey (n, e);
// Verify data with public key
var msg = document.libeye.plaintext.value;
var signature = forge.util.hexToBytes(document.libeye.ciphertext.value);
var md = forge.md.sha1.create();
md.update(msg);
var verified = publicKey.verify(md.digest().bytes(), signature);
if (verified === true) {
console.log ("Verfication passed");
}
else {
console.log ("Verfication failed");
}
}
function do_cg_verify() {
var e, n;
e = new BigInteger (document.libeye.e.value, 16);
n = new BigInteger (document.libeye.n.value, 16);
var publicKey = forge.pki.rsa.setPublicKey (n, e);
var msg = forge.util.hexToBytes(document.libeye.ciphertext.value);
var decrypted = forge.pki.rsa.decrypt(msg, publicKey, true);
document.libeye.decrypted.value = decrypted;
}
function do_cg_sign() {
var n, e, d, p, q, dP, dQ, qInv;
e = new BigInteger (document.libeye.e.value, 16);
n = new BigInteger (document.libeye.n.value, 16);
d = new BigInteger (document.libeye.d.value, 16);
p = new BigInteger (document.libeye.p.value, 16);
q = new BigInteger (document.libeye.q.value, 16);
dP = new BigInteger (document.libeye.dP.value, 16);
dQ = new BigInteger (document.libeye.dQ.value, 16);
var privateKey = forge.pki.setRsaPrivateKey(n, e, d, p, q, dP, dQ, qInv);
var msg = document.libeye.plaintext.value;
var encrypted = forge.pki.rsa.encrypt(msg, privateKey, 0x01);
document.libeye.ciphertext.value = forge.util.bytesToHex(encrypted);
}
function do_loadkeyring() {
// read json from file
var reader = new FileReader();
reader.onload = function(e) {
var keydata = reader.result;
}
}
function do_perms() {
var json = JSON.parse (perms2);
var perms = new Permissions (perms2);
console.log (perms.toOrderedString());
console.log (perms.getPathHash());
perms = new Permissions (json);
console.log (perms.getPathHash());
console.log (perms.getOrderedReferences ('urn:ionu:000000:::'));
console.log (perms.getSignature ('urn:ionu:000000:::'));
perms = new Permissions (permissionstoString);
console.log (perms.getOrderedReferences ('urn:ionu:000000:::'));
console.log (perms.getSignature ('urn:ionu:000000:::'));
}
function do_savekeyring() {
var keydata = JSON.stringify(keyring);
// write json to file, which we can't do from browser so create a download link for user
if (window.MSBlobBuilder) { // IE10
var bb = new MSBlobBuilder();
bb.append(strData);
return navigator.msSaveBlob(bb, strFileName);
}
//build download link:
a = document.createElement("a"),
a.href = "data:application/json,charset=utf-8," + escape(keydata);
if ('download' in a) { // FireFox, Chrome, Safari and other modern browsers
a.setAttribute("download", n);
a.innerHTML = "downloading...";
document.body.appendChild(a);
setTimeout(function() {
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
a.dispatchEvent(evt);
document.body.removeChild(a);
}, 66);
return true;
}
// Else something older do iframe dataURL download
var iframe = document.createElement("iframe");
document.body.appendChild(iframe);
iframe.src = "data:application/json," + escape(strData);
setTimeout(function() {
document.body.removeChild(iframe);
}, 333);
return true;
}
function loadKeyring(evt) {
//Retrieve the first (and only!) File from the FileList object
var file = evt.target.files[0];
if (file) {
var reader = new FileReader();
reader.onload = function(e) {
var json = e.target.result;
var mcf = document.libeye.mcf.value;
var fields = mcf.split('$');
var ringkey = forge.util.decode64(fields[3]);
console.log( "Read " + file.name + " " + file.size + " bytes");
var keyring = new Keyring (json);
keyring.unlock (ringkey);
var key = keyring.getKey ('Office');
if (key.type === 'RSA') {
console.log (key.key);
}
keyring.lock (ringkey);
console.log ('hi');
console.log (keyring.toString());
console.log ('hi');
}
reader.readAsText(file);
} else {
console.log("Failed to load file");
}
}
function loadPEM(evt) {
//Retrieve the first (and only!) File from the FileList object
var file = evt.target.files[0];
if (file) {
var reader = new FileReader();
reader.onload = function(e) {
var pem = e.target.result;
console.log( "Read " + file.name + " " + file.size + " bytes");
var privateKey = forge.pki.privateKeyFromPem(pem);
var publicKey = forge.pki.rsa.setPublicKey (privateKey.n, privateKey.e);
var encrypted = publicKey.encrypt('Howdy doooody', 'RSA-OAEP');
console.log (forge.util.encode64(encrypted));
var decrypted = privateKey.decrypt(encrypted, 'RSA-OAEP');
console.log (decrypted);
}
reader.readAsText(file);
} else {
console.log("Failed to load file");
}
var keyring = new Keyring ('ionu_keyring', 'ring');
console.log (keyring.toString());
keyring.saveToLocalStorage ();
console.log (localStorage.ionu_keyring);
keyring.removeFromLocalStorage ();
keyring.loadFromLocalStorage ('ionu_keyring');
}
//-->
</script>
<body onLoad='do_init();'>
<h1>LibEye Key Generation and Encryption</h1>
<form name="libeye" onSubmit='do_encrypt();return false;'>
Password:<br>
<input name="clearpassword" type="text" value="madman12" size=20>
<input name="iterations" type="integer" value="2500" size=8>
<input name="mcf" type="text" value="" size=100>
<br>
<input type="button" value="pbkdf2" onClick="do_pbkdf2();">
<input type="button" value="SlowHash" onClick="do_slowhash();">
<input type="button" value="FastHash" onClick="do_fasthash();">
<input type="button" value="Generate" onClick="do_password();">
<input type="button" value="Provision" onClick="do_provision();">
<input type="button" value="Perms" onClick="do_perms();"><p>
Plaintext (string) and iv (hex):<br>
<input name="iv" type="text" value="" size=48><br>
<input type="button" value="aes encrypt" onClick="do_aes_encrypt();">
<input type="button" value="rsa encrypt" onClick="do_rsa_encrypt();">
<input type="button" value="rsa sign" onClick="do_rsa_sign();">
<input type="button" value="cg sign" onClick="do_cg_encrypt();">
<input type="button" value="md5" onClick="do_md5();">
<input type="button" value="sha1" onClick="do_sha1();">
<input type="button" value="sha256" onClick="do_sha256();"><p>
Ciphertext or digest (hex):<br>
<textarea name="ciphertext" rows=1 cols=80></textarea><br>
<input type="button" value="aes decrypt" onClick="do_aes_decrypt();">
<input type="button" value="rsa decrypt" onClick="do_rsa_decrypt();">
<input type="button" value="rsa verify" onClick="do_rsa_verify();"><p>
<input type="button" value="cg verify" onClick="do_cg_decrypt();">
Decrypted Plaintext (string):<br>
<input name="decrypted" type="text" size=60><p>
Status:<br>
<input name="status" type="text" size=60><p>
<hr>
<h2>RSA key</h2><p>
<input type="button" value="Compute Keys" onClick='do_compute_keys();'>
SL: <input type="file" id="sl">
Attachment: <input type="file" id="attachfile">
<input type="button" value="DRBG" onClick='do_drbg();'>
<input type="button" value="Challenge" onClick='do_genrsa_challenge();'>
answers = <input name="challenge" type="text" value="SL,Bob,Bob,Bob" size=64><br>
<input type="button" value="Random" onClick='do_genrsa();'>
Keyring: <input type="file" id="keyfile">
PEM: <input type="file" id="pemfile">
<p>
Finger Print: <textarea name="fingerprint" type="text" rows=1 cols=60></textarea><p>
N modulus (hex):<br>
<textarea name="n" type="text" rows=1 cols=120></textarea><p>
E public exponent (hex, 65537=0x10001):<br>
<input name="e" type="text" size=20><p>
D private exponent (hex):<br>
<textarea name="d" type="text" rows=1 cols=120></textarea><p>
P (hex):<br>
<textarea name="p" type="text" rows=1 cols=120></textarea><p>
Q (hex):<br>
<textarea name="q" type="text" rows=1 cols=120></textarea><p>
D mod (P-1) (hex):<br>
<textarea name="dP" type="text" rows=1 cols=120></textarea><p>
D mod (Q-1) (hex):<br>
<textarea name="dQ" type="text" rows=1 cols=120></textarea><p>
1/Q mod P (hex):<br>
<textarea name="qInv" type="text" rows=1 cols=120></textarea>
</form>
</body>
</html>