Skip to content

Commit 4ebc146

Browse files
authored
Heroku deploy (onlykey#32)
* fix for safari, webauthn call on load disabled * fix for safari, webauthn call on load disabled * fix for safari, webauthn call on load disabled
1 parent e76debb commit 4ebc146

3 files changed

Lines changed: 90 additions & 62 deletions

File tree

src/onlykey-fido2/onlykey/onlykey-api.js

Lines changed: 71 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@ module.exports = function(imports) {
2929
ctap_error_codes,
3030
getAllUrlParams,
3131
aesgcm_decrypt,
32+
getBrowser,
3233
// aesgcm_encrypt
3334
} = require("./onlykey.extra.js")(imports);
35+
onlykey_api.extra = require("./onlykey.extra.js")(imports);
36+
3437
onlykey_api.getAllUrlParams = getAllUrlParams; //<-- todo: move to pages plugin
3538

3639

@@ -104,8 +107,8 @@ module.exports = function(imports) {
104107
};
105108
onlykey_api.connect = onlykey_api.initok;
106109

107-
async function OK_CONNECT(callback) {
108-
return new Promise(async function(resolve, reject) {
110+
function OK_CONNECT(callback) {
111+
return new Promise(function(resolve, reject) {
109112

110113
function cb(err, data) {
111114
if (typeof callback === 'function') callback(err, data);
@@ -137,70 +140,75 @@ module.exports = function(imports) {
137140
var env = [onlykey_api.browser.charCodeAt(0), onlykey_api.os.charCodeAt(0)];
138141
Array.prototype.push.apply(message, env);
139142
encryptedkeyHandle = Uint8Array.from(message); // Not encrypted as this is the initial key exchange
140-
await wait(delay * 1000);
141-
var enc_resp = 1;
142-
var ctaphid_response = await ctaphid_via_webauthn(cmd, null, null, null, encryptedkeyHandle, 6000, function(maybe_a_err, data) {
143+
144+
// await wait(delay * 1000); // safari dont like async with webauthn
145+
// setTimeout(function(){ },delay * 1000) /// this fails on safari
146+
147+
var enc_resp = 1;//<----- not used in setting time/initial connection
148+
ctaphid_via_webauthn(cmd, null, null, null, encryptedkeyHandle, 6000, function(maybe_a_err, data) {
143149
console.info("ctaphid_response resp", maybe_a_err, data);
144150

145-
});
146-
147-
imports.app.emit("ok-waiting");
148-
149-
var response;
150-
151-
if (ctaphid_response.data && !ctaphid_response.error)
152-
response = ctaphid_response.data;
153-
154-
if (!response) {
155-
if (onlykey_api.browser == 'Firefox') headermsg("<p class='text-danger'>OnlyKey not connected! Close this tab and open a new one to try again.</p>");
156-
else headermsg("<p class='text-danger'>OnlyKey not connected! Refresh this page to try again.</p>");
157-
imports.app.emit("ok-disconnected");
158-
}
159-
else {
160-
switch (ctaphid_response.status) {
161-
case "CTAP2_ERR_EXTENSION_NOT_SUPPORTED":
162-
break;
163-
case "CTAP1_SUCCESS":
164-
var BREAKING_BETA_8C = !!(bytes2string(response.slice(8, 20)) == "v0.2-beta.8c");
165-
166-
if(!BREAKING_BETA_8C){
167-
okPub = response.slice(0, 32);
151+
}).then(async function(ctaphid_response){
152+
imports.app.emit("ok-waiting");
153+
154+
var response;
155+
156+
if (ctaphid_response.data && !ctaphid_response.error)
157+
response = ctaphid_response.data;
158+
159+
if (!response) {
160+
if (onlykey_api.browser == 'Firefox') headermsg("<p class='text-danger'>OnlyKey not connected! Close this tab and open a new one to try again.</p>");
161+
else headermsg("<p class='text-danger'>OnlyKey not connected! Refresh this page to try again.</p>");
162+
imports.app.emit("ok-disconnected");
163+
}
164+
else {
165+
switch (ctaphid_response.status) {
166+
case "CTAP2_ERR_EXTENSION_NOT_SUPPORTED":
167+
break;
168+
case "CTAP1_SUCCESS":
169+
var BREAKING_BETA_8C = !!(bytes2string(response.slice(8, 20)) == "v0.2-beta.8c");
168170

169-
// Decrypt with transit_key
170-
var transit_key = nacl.box.before(Uint8Array.from(okPub), appKey.secretKey);
171-
console.info("Onlykey transit public", okPub);
172-
console.info("App transit public", appKey.publicKey);
173-
console.info("Transit shared secret", transit_key);
174-
transit_key = await digestBuff(Uint8Array.from(transit_key)); //AES256 key sha256 hash of shared secret
175-
console.info("App AES Key", transit_key);
176-
var encrypted = response.slice(32, response.length);
177-
onlykey_api.FWversion = bytes2string(response.slice(32+8, 32+20));
178-
response = await aesgcm_decrypt(encrypted, transit_key);
179-
onlykey_api.OKversion = response[32+19] == 99 ? 'Color' : 'Go';
180-
onlykey_api.sharedsec = nacl.box.before(Uint8Array.from(okPub), appKey.secretKey);
181-
console.info("Version:",[onlykey_api.OKversion, onlykey_api.FWversion]);
182-
imports.app.emit("ok-connected");
183-
cb(null);
184-
}else{
185-
okPub = response.slice(21, 53);
186-
console.info("OnlyKey Public Key: ", okPub);
187-
onlykey_api.sharedsec = nacl.box.before(Uint8Array.from(okPub), appKey.secretKey);
188-
console.info("NACL shared secret: ", onlykey_api.sharedsec);
189-
onlykey_api.OKversion = response[19] == 99 ? 'Color' : 'Original';
190-
onlykey_api.FWversion = bytes2string(response.slice(8, 20));
191-
console.info("Version:",[onlykey_api.OKversion, onlykey_api.FWversion]);
192-
imports.app.emit("ok-connected");
193-
cb(null);
194-
}
195-
headermsg("<p class='text-success'>OnlyKey " + onlykey_api.FWversion + " Secure Connection Established</p>\n");
196-
break;
197-
default:
198-
imports.app.emit("ok-disconnected");
199-
171+
if(!BREAKING_BETA_8C){
172+
okPub = response.slice(0, 32);
173+
174+
// Decrypt with transit_key
175+
var transit_key = nacl.box.before(Uint8Array.from(okPub), appKey.secretKey);
176+
console.info("Onlykey transit public", okPub);
177+
console.info("App transit public", appKey.publicKey);
178+
console.info("Transit shared secret", transit_key);
179+
transit_key = await digestBuff(Uint8Array.from(transit_key)); //AES256 key sha256 hash of shared secret
180+
console.info("App AES Key", transit_key);
181+
var encrypted = response.slice(32, response.length);
182+
onlykey_api.FWversion = bytes2string(response.slice(32+8, 32+20));
183+
response = await aesgcm_decrypt(encrypted, transit_key);
184+
onlykey_api.OKversion = response[32+19] == 99 ? 'Color' : 'Go';
185+
onlykey_api.sharedsec = nacl.box.before(Uint8Array.from(okPub), appKey.secretKey);
186+
console.info("Version:",[onlykey_api.OKversion, onlykey_api.FWversion]);
187+
imports.app.emit("ok-connected");
188+
cb(null);
189+
}else{
190+
okPub = response.slice(21, 53);
191+
console.info("OnlyKey Public Key: ", okPub);
192+
onlykey_api.sharedsec = nacl.box.before(Uint8Array.from(okPub), appKey.secretKey);
193+
console.info("NACL shared secret: ", onlykey_api.sharedsec);
194+
onlykey_api.OKversion = response[19] == 99 ? 'Color' : 'Original';
195+
onlykey_api.FWversion = bytes2string(response.slice(8, 20));
196+
console.info("Version:",[onlykey_api.OKversion, onlykey_api.FWversion]);
197+
imports.app.emit("ok-connected");
198+
cb(null);
199+
}
200+
headermsg("<p class='text-success'>OnlyKey " + onlykey_api.FWversion + " Secure Connection Established</p>\n");
201+
break;
202+
default:
203+
imports.app.emit("ok-disconnected");
204+
205+
}
206+
cb(null, ctaphid_response.status);
207+
200208
}
201-
cb(null, ctaphid_response.status);
202209

203-
}
210+
});
211+
204212

205213
});
206214
}
@@ -419,7 +427,9 @@ module.exports = function(imports) {
419427
//if(imports.app)
420428
// imports.app.emit("ok-message",s);
421429
//else
430+
try{
422431
id('header_messages').innerHTML += "<br>" + s;
432+
}catch(e){}
423433

424434
}
425435

src/onlykey-fido2/onlykey/onlykey.extra.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,23 @@ module.exports = function(imports) {
163163

164164
return os;
165165
}
166+
167+
168+
$exports.getBrowser = function getBrowser() {
169+
170+
if(typeof window == "undefined"){
171+
browser = "Node";
172+
return browser;
173+
}
174+
var vendor = window.navigator.vendor,
175+
browser = 'Google';
176+
177+
if (vendor.indexOf('Apple') > -1) {
178+
browser = 'Apple';
179+
}
180+
181+
return browser;
182+
}
166183

167184

168185
$exports.ctap_error_codes = {

src/plugins/index/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ module.exports = {
4545
pagesList: pagesList,
4646
init: function() {
4747
// if(document.hasFocus())//firefox fix, firefox aborts onlykey request when not in focus
48-
imports.app.on("start", doSetTime.bind(null, 2000));
48+
if(imports.onlykeyApi.api.extra.getBrowser() !== "Apple")
49+
imports.app.on("start", doSetTime.bind(null, 2000));
4950
// else
5051
// imports.app.on("start",function(){
5152
// if(imports.app.$("#setTime").length == 0)

0 commit comments

Comments
 (0)