@@ -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
0 commit comments