prototype of password based key derivation
parent
848f16e8f5
commit
dcebb9597f
@ -0,0 +1,20 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
|
<script data-main="main" src="/bower_components/requirejs/require.js"></script>
|
||||||
|
<style>
|
||||||
|
html, body{
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<button id="login">login</button>
|
||||||
|
|
||||||
|
|
@ -0,0 +1,122 @@
|
|||||||
|
define([
|
||||||
|
'/api/config?cb=' + Math.random().toString(16).substring(2),
|
||||||
|
'/bower_components/chainpad-listmap/chainpad-listmap.js',
|
||||||
|
'/bower_components/chainpad-crypto/crypto.js',
|
||||||
|
'/common/cryptpad-common.js',
|
||||||
|
'/bower_components/scrypt-async/scrypt-async.min.js',
|
||||||
|
'/bower_components/jquery/dist/jquery.min.js',
|
||||||
|
], function (Config, Listmap, Crypto, Cryptpad) {
|
||||||
|
var $ = window.jQuery;
|
||||||
|
var Scrypt = window.scrypt;
|
||||||
|
|
||||||
|
Cryptpad.styleAlerts();
|
||||||
|
|
||||||
|
var secret = {};
|
||||||
|
|
||||||
|
var module = window.APP = {
|
||||||
|
Cryptpad: Cryptpad,
|
||||||
|
};
|
||||||
|
|
||||||
|
var print = function (S, t) {
|
||||||
|
$('body').append($('<' + (t || 'p') + '>').text(S));
|
||||||
|
};
|
||||||
|
|
||||||
|
var getInputs = function (cb) {
|
||||||
|
Cryptpad.prompt("What is your username?", "", function (name) {
|
||||||
|
if (!name || typeof(name) !== 'string') { return cb('no name'); }
|
||||||
|
setTimeout(function () {
|
||||||
|
Cryptpad.prompt("What is your password?", "", function (pw) {
|
||||||
|
if (!pw || typeof(pw) !== 'string') { return cb('no password'); }
|
||||||
|
cb(void 0, {
|
||||||
|
password: pw,
|
||||||
|
salt: name,
|
||||||
|
});
|
||||||
|
}, {
|
||||||
|
sensitive: true,
|
||||||
|
});
|
||||||
|
}, 1000);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var login = function (cb) {
|
||||||
|
getInputs(function (err, input) {
|
||||||
|
if (err) {
|
||||||
|
Cryptpad.alert(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var time = +new Date();
|
||||||
|
Scrypt(input.password,
|
||||||
|
input.salt,
|
||||||
|
8, // memoryCost (n)
|
||||||
|
1024, // block size parameter (r)
|
||||||
|
48, // dkLen
|
||||||
|
undefined && 200, // interruptStep
|
||||||
|
function (S) {
|
||||||
|
print("Login took " + ((+new Date()) -time )+ "ms");
|
||||||
|
cb(S);
|
||||||
|
},
|
||||||
|
'base64');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var read = function (proxy) {
|
||||||
|
console.log("Proxy ready!");
|
||||||
|
var atime = proxy.atime = ('' + new Date());
|
||||||
|
proxy.ctime = proxy.ctime || atime;
|
||||||
|
proxy.schema = proxy.schema || 'login_data';
|
||||||
|
print(JSON.stringify(proxy, null, 2), 'pre');
|
||||||
|
};
|
||||||
|
|
||||||
|
var change = function (o, n, p) {
|
||||||
|
console.log("change at [%s] %s => %s", p.join(","), o, n);
|
||||||
|
};
|
||||||
|
|
||||||
|
var remove = function (o, p, root) {
|
||||||
|
console.log("removal at [%s]", p.join(','));
|
||||||
|
};
|
||||||
|
|
||||||
|
var ready = function (proxy, next) {
|
||||||
|
//console.log("umm");
|
||||||
|
proxy.on('ready', function (info) {
|
||||||
|
read(proxy);
|
||||||
|
|
||||||
|
proxy.on('change', [], change)
|
||||||
|
.on('remove', [], remove);
|
||||||
|
next();
|
||||||
|
})
|
||||||
|
.on('disconnect', function (info) {
|
||||||
|
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var authenticated = function (password, next) {
|
||||||
|
console.log("Authenticated!");
|
||||||
|
var secret = {};
|
||||||
|
secret.channel = password.slice(0, 32);
|
||||||
|
secret.key = password.slice(32);
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
websocketURL: Config.websocketURL,
|
||||||
|
channel: secret.channel,
|
||||||
|
data: {},
|
||||||
|
crypto: Crypto.createEncryptor(secret.key),
|
||||||
|
loglevel: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log("creating proxy!");
|
||||||
|
var rt = module.rt = Listmap.create(config);
|
||||||
|
|
||||||
|
next(rt.proxy, function () {
|
||||||
|
Cryptpad.log("Ready!");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#login').click(function () {
|
||||||
|
login(function (hash) {
|
||||||
|
print('Your Key', 'h1');
|
||||||
|
print(hash, 'pre');
|
||||||
|
authenticated(hash, ready);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue