prototype of password based key derivation

This commit is contained in:
ansuz 2016-08-22 11:43:41 +02:00
parent 848f16e8f5
commit dcebb9597f
2 changed files with 142 additions and 0 deletions

20
www/login/index.html Normal file
View File

@ -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>

122
www/login/main.js Normal file
View File

@ -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);
});
});
});