attempt at promises..
This commit is contained in:
parent
42f752fe41
commit
202f76d313
14
fido2/u2f.c
14
fido2/u2f.c
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
246
web/js/wallet.js
246
web/js/wallet.js
@ -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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
t2();
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
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){
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
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 ()
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user