attempt at promises..

This commit is contained in:
Conor Patrick 2018-07-12 00:14:39 -04:00
parent 42f752fe41
commit 202f76d313
3 changed files with 194 additions and 78 deletions

View File

@ -37,9 +37,23 @@ void u2f_request(struct u2f_request_apdu* req, CTAP_RESPONSE * resp)
{ {
if (req->p1 == U2F_AUTHENTICATE_CHECK) if (req->p1 == U2F_AUTHENTICATE_CHECK)
{ {
if (memcmp(auth->chal, CHALLENGE_PIN, 32) == 0) // Pin requests
{
rcode = U2F_SW_CONDITIONS_NOT_SATISFIED;
}
else
{
rcode = U2F_SW_WRONG_DATA;
}
goto end;
} }
else else
{ {
if (memcmp(auth->chal, CHALLENGE_PIN, 32) != 0) // Pin requests
{
rcode = U2F_SW_WRONG_PAYLOAD;
goto end;
}
rcode = bridge_u2f_to_wallet(auth->chal, auth->app, auth->khl, (uint8_t*)&auth->kh); rcode = bridge_u2f_to_wallet(auth->chal, auth->app, auth->khl, (uint8_t*)&auth->kh);
} }
} }

View File

@ -53,21 +53,13 @@ int check_pinhash(uint8_t * pinAuth, uint8_t * msg, uint8_t len)
crypto_sha256_update(msg+ 4 + 16, len - 4 - 16); crypto_sha256_update(msg+ 4 + 16, len - 4 - 16);
crypto_sha256_hmac_final(PIN_TOKEN, PIN_TOKEN_SIZE, hmac); crypto_sha256_hmac_final(PIN_TOKEN, PIN_TOKEN_SIZE, hmac);
printf1(TAG_WALLET, "recalc pinhash:"); dump_hex1(TAG_WALLET, hmac,32);
return (memcmp(pinAuth, hmac, 16) == 0); return (memcmp(pinAuth, hmac, 16) == 0);
} }
/*int16_t wallet_sign(uint8_t alg, uint8_t * chal, uint8_t len, uint8_t * kh, uint8_t kl)*/
/*{*/
/*crypto_sha256_hmac_init(uint8_t * key, uint32_t klen, uint8_t * hmac);*/
/*}*/
void wallet_init() void wallet_init()
{ {
// TODO dont leave this
printf1(TAG_WALLET,"Wallet is ready\n"); printf1(TAG_WALLET,"Wallet is ready\n");
/*ctap_update_pin("1234", 4);*/
} }
int8_t wallet_pin(uint8_t subcmd, uint8_t * pinAuth, uint8_t * arg1, uint8_t * arg2, uint8_t * arg3, int len) int8_t wallet_pin(uint8_t subcmd, uint8_t * pinAuth, uint8_t * arg1, uint8_t * arg2, uint8_t * arg3, int len)
@ -376,6 +368,7 @@ int16_t bridge_u2f_to_wallet(uint8_t * _chal, uint8_t * _appid, uint8_t klen, ui
if ( ! check_pinhash(req->pinAuth, msg_buf, reqlen)) if ( ! check_pinhash(req->pinAuth, msg_buf, reqlen))
{ {
printf1(TAG_WALLET,"pinAuth is NOT valid\n"); printf1(TAG_WALLET,"pinAuth is NOT valid\n");
dump_hex(msg_buf,reqlen);
ret = CTAP2_ERR_PIN_AUTH_INVALID; ret = CTAP2_ERR_PIN_AUTH_INVALID;
goto cleanup; goto cleanup;
} }
@ -385,6 +378,7 @@ int16_t bridge_u2f_to_wallet(uint8_t * _chal, uint8_t * _appid, uint8_t klen, ui
if (ctap_user_presence_test()) if (ctap_user_presence_test())
{ {
printf1(TAG_WALLET,"Reseting device!\n");
ctap_reset(); ctap_reset();
} }
else else

View File

@ -70,6 +70,40 @@ function hex2array(string)
return arr; return arr;
} }
// @key input private key in hex string format
function key2wif(key)
{
//2
key = '0x80' + key;
bin = hex2array(key);
//3
var hash = sha256.create();
hash.update(bin);
bin = hash.array();
//4
hash = sha256.create();
hash.update(bin);
bin = hash.array();
// 5
var chksum = bin.slice(0,4);
// 6
key = key + array2hex(chksum);
// 7
key = hex2array(key);
key = to_b58(key);
return key;
}
function array2hex(buffer) { function array2hex(buffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join(''); return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
} }
@ -161,6 +195,8 @@ var CMD = {
sign: 0x10, sign: 0x10,
register: 0x11, register: 0x11,
pin: 0x12, pin: 0x12,
reset: 0x13,
version: 0x14,
}; };
var PIN = { var PIN = {
@ -242,6 +278,8 @@ function send_msg_u2f(data, func, timeout) {
var appid = window.location.origin; var appid = window.location.origin;
var chal = string2websafe('AABBCC'); var chal = string2websafe('AABBCC');
var chal = array2websafe(hex2array('d1cd7357bcedc03fcec112fe5a7f3f890292ff6f758978928b736ce1e63479e5'));
var keyHandle = array2websafe(data); var keyHandle = array2websafe(data);
var key = { var key = {
@ -279,6 +317,7 @@ if (DEVELOPMENT) {
function formatRequest(cmd, p1, p2, pinAuth, args) { function formatRequest(cmd, p1, p2, pinAuth, args) {
var argslen = 0; var argslen = 0;
var i,j; var i,j;
args = args || [];
for (i = 0; i < args.length; i+=1) { for (i = 0; i < args.length; i+=1) {
argslen += args[i].length + 1 argslen += args[i].length + 1
} }
@ -296,8 +335,10 @@ function formatRequest(cmd, p1, p2, pinAuth, args) {
array[2] = p2 & 0xff; array[2] = p2 & 0xff;
array[3] = (args.length) & 0xff; array[3] = (args.length) & 0xff;
for (i = 0; i < 16; i += 1) { if (pinAuth) {
array[4 + i] = pinAuth[i]; for (i = 0; i < 16; i += 1) {
array[4 + i] = pinAuth[i];
}
} }
var offset = 4 + i; var offset = 4 + i;
@ -325,12 +366,16 @@ function computePinAuth(pinToken, cmd,p1,p2,args)
hmac.update([cmd]); hmac.update([cmd]);
hmac.update([p1]); hmac.update([p1]);
hmac.update([p2]); hmac.update([p2]);
hmac.update([args.length]); if (args && args.length) hmac.update([args.length]);
else hmac.update([0]);
for (i = 0; i < args.length; i++)
{ if (args) {
hmac.update([args[i].length]); for (i = 0; i < args.length; i++)
hmac.update(args[i]); {
hmac.update([args[i].length]);
hmac.update(args[i]);
}
} }
return hmac.array().slice(0,16) return hmac.array().slice(0,16)
@ -471,7 +516,7 @@ var authenticate_ = function(pin, func){
var pinTokenEnc = resp.data; var pinTokenEnc = resp.data;
var pinToken = aesCbc.decrypt(pinTokenEnc); var pinToken = aesCbc.decrypt(pinTokenEnc);
self.pinToken = pinToken; self.pinToken = pinToken;
if (func) func(pinToken); if (func) func({pinToken: pinToken, status: resp.status});
}); });
}; };
@ -531,17 +576,17 @@ var set_pin_ = function(pin, func, failAuth){
var req = pinRequestFormat(subcmd, pinAuth, ourPubkeyBytes, pinEnc); var req = pinRequestFormat(subcmd, pinAuth, ourPubkeyBytes, pinEnc);
send_msg(req, function(resp){ send_msg(req, function(resp){
if (func) func(resp.status); if (func) func(resp);
}); });
} }
var is_pin_set_ = function(func) var is_pin_set_ = function(func)
{ {
this.set_pin('12345', function(stat){ this.set_pin('12345', function(resp){
if (stat == "CTAP2_ERR_NOT_ALLOWED") { if (resp.status == "CTAP2_ERR_NOT_ALLOWED") {
func(true); func(true);
} }
else if (stat == "CTAP2_ERR_PIN_AUTH_INVALID"){ else if (resp.status == "CTAP2_ERR_PIN_AUTH_INVALID"){
func(false); func(false);
} }
else { else {
@ -626,7 +671,57 @@ var register_ = function(wifkey, func){
}); });
}; };
// @note authorization required beforehand if device is not already locked.
var reset_ = function(func){
var pinAuth = undefined;
if (this.pinToken) {
pinAuth = computePinAuth(this.pinToken, CMD.reset, 0, 0);
}
var req = formatRequest(CMD.reset,0,0, pinAuth);
var self = this;
send_msg(req, function(resp){
if (resp.status == "CTAP1_SUCCESS")
{
self.init(function(resp){
if (func)func(resp);
});
}
else {
if (func) func(resp);
}
});
};
function wrap_promise(func)
{
var self = this;
return function (){
var args = arguments;
return new Promise(function(resolve,reject){
var i;
for (i = 0; i < args.length; i++)
{
if (typeof args[i] == 'function')
{
var oldfunc = args[i];
args[i] = function(){
oldfunc.apply(self,arguments);
resolve.apply(self,arguments);
//oldfunc.call(arguments);
//resolve.call(arguments);
};
break;
}
}
func.apply(self,args);
});
}
}
function WalletDevice() { function WalletDevice() {
var self = this; var self = this;
@ -636,11 +731,23 @@ function WalletDevice() {
this.init = function(func){ this.init = function(func){
this.get_shared_secret(function(shared){ self.get_version(function(ver){
self.shared_secret = shared; self.version = ver;
if (func) func(); self.get_shared_secret(function(shared){
self.shared_secret = shared;
if (func) func();
});
}); });
} };
this.get_version = function(func){
var req = formatRequest(CMD.version,0,0);
send_msg(req, function(resp){
var ver = new TextDecoder("utf-8").decode(resp.data);
if (func) func(ver);
});
};
this.get_shared_secret = get_shared_secret_; this.get_shared_secret = get_shared_secret_;
@ -658,74 +765,75 @@ function WalletDevice() {
this.get_retries = get_retries_; this.get_retries = get_retries_;
this.register = register_; this.register = register_;
this.reset = reset_;
//this.init = wrap_promise(this.init);
//this.get_version = wrap_promise(this.get_version);
//this.get_shared_secret = wrap_promise(this.get_shared_secret );
//this.authenticate = wrap_promise(this.authenticate );
//this.sign = wrap_promise(this.sign );
//this.set_pin = wrap_promise(this.set_pin );
//this.is_pin_set = wrap_promise(this.is_pin_set );
//this.change_pin = wrap_promise(this.change_pin );
//this.get_retries = wrap_promise(this.get_retries );
//this.register = wrap_promise(this.register );
//this.reset = wrap_promise(this.reset );
} }
// @key input private key in hex string format async function run_tests() {
function key2wif(key)
{
//2
key = '0x80' + key;
bin = hex2array(key);
//3
var hash = sha256.create();
hash.update(bin);
bin = hash.array();
//4
hash = sha256.create();
hash.update(bin);
bin = hash.array();
// 5
var chksum = bin.slice(0,4);
// 6
key = key + array2hex(chksum);
// 7
key = hex2array(key);
key = to_b58(key);
return key;
}
function run_tests() {
var dev = new WalletDevice(); var dev = new WalletDevice();
var pin = "Conor's pin 👽 ";; var pin = "Conor's pin 👽 ";
var pin2 = "Conor's pin2 😀";; var pin2 = "sogyhdxoh3qwli😀";
dev.init(function(){
console.log('connected.');
dev.is_pin_set(function(bool){ function device_start_over(next)
if (bool) { {
console.log('Pin is set. '); dev.init(function(resp){
//dev.change_pin(pin,pin2,function(succ){
//console.log('Pin set to ' + pin2,succ);
//dev.get_retries(function(num){ console.log('connected. version: ', dev.version);
//console.log("Have "+num+" attempts to get pin right");
//});
//}); dev.is_pin_set(function(bool){
dev.authenticate(pin, function(){ if (bool) {
dev.authenticate(pin, function(resp){
//reset_device(next);
});
}
else {
//reset_device(next);
}
});
});
}
function reset_device(func)
{
dev.reset(function(resp){
console.log("reset: ",resp);
if (func) func();
});
}
function test_pin(next)
{
dev.set_pin(pin, function(resp){
if (resp.status == "CTAP1_SUCCESS"){
console.log('Set pin to ' + pin);
dev.set_pin(pin, function(resp){
t2();
}); });
} }
else { else {
console.log('Pin is NOT set. Setting it to "' + pin + '"'); console.log("Fail set_pin");
dev.set_pin(pin, function(succ){
console.log(succ);
});
} }
}); });
}
}); device_start_over();
function t2 () function t2 ()
{ {