|
|
|
|
@@ -1,12 +1,3 @@
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @file dfido2-lib.js
|
|
|
|
|
* @description FIDO2 library of amipro FIDO2 Server
|
|
|
|
|
* @version 2025-12-12
|
|
|
|
|
* @author Amipro Co., Ltd. (https://www.amipro.me/)
|
|
|
|
|
* @license Copyright (c) Amipro Co., Ltd. All rights reserved.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
const DFIDO2_LIB_LOCALSTG_NAME_USER_SESSION = 'fido2_user_session'
|
|
|
|
|
const DFIDO2_LIB_LOCALSTG_NAME_REGISTERED = 'dfido2_lib_registered'
|
|
|
|
|
const DFIDO2_LIB_LOCALSTG_NAME_SVR_URL = 'dfido2_lib_svr_url'
|
|
|
|
|
@@ -249,65 +240,17 @@ function errMessageFido2(result){
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.timeout:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr103:');
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.invalid_state:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr105:');
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.not_allowed:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr107:');
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.abort:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr108:');
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.not_supported:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr109:');
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.security:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr110:');
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.network:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr111:');
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.constraint:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr112:');
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.not_readable:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr113:');
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.encoding:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr114:');
|
|
|
|
|
break;
|
|
|
|
|
case fido2LibErrCodes.data_error:
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr115:');
|
|
|
|
|
break;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
rtn=result.errorMessage?result.errorMessage:getI18NErrorMessage('Fido2LibErr104:');
|
|
|
|
|
}
|
|
|
|
|
}else if(result.name && "InvalidStateError" === result.name){
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr105:');
|
|
|
|
|
}else if(result.name && "NotAllowedError" === result.name){
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr107:');
|
|
|
|
|
}else if(result.name && "AbortError" === result.name){
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr108:');
|
|
|
|
|
}else if(result.name && "NotSupportedError" === result.name){
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr109:');
|
|
|
|
|
}else if(result.name && "SecurityError" === result.name){
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr110:');
|
|
|
|
|
}else if(result.name && "NetworkError" === result.name){
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr111:');
|
|
|
|
|
}else if(result.name && "ConstraintError" === result.name){
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr112:');
|
|
|
|
|
}else if(result.name && "NotReadableError" === result.name){
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr113:');
|
|
|
|
|
}else if(result.name && "EncodingError" === result.name){
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr114:');
|
|
|
|
|
}else if(result.name && "DataError" === result.name){
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr115:');
|
|
|
|
|
}else if(result.errorMessage){
|
|
|
|
|
const msg = getI18NErrorMessage(result.errorMessage);
|
|
|
|
|
rtn=msg?msg:result.errorMessage;
|
|
|
|
|
}else{
|
|
|
|
|
rtn=getI18NErrorMessage('Fido2LibErr104:');
|
|
|
|
|
rtn=getI18NErrorMessage(i18n_messages, 'Fido2LibErr104:');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rtn;
|
|
|
|
|
@@ -316,17 +259,7 @@ function errMessageFido2(result){
|
|
|
|
|
const fido2LibErrCodes = {
|
|
|
|
|
user_canceled : -101,
|
|
|
|
|
timeout : -102,
|
|
|
|
|
unknown : -999,
|
|
|
|
|
invalid_state : -103,
|
|
|
|
|
not_allowed : -104,
|
|
|
|
|
abort : -105,
|
|
|
|
|
not_supported : -106,
|
|
|
|
|
security : -107,
|
|
|
|
|
network : -108,
|
|
|
|
|
constraint : -109,
|
|
|
|
|
not_readable : -110,
|
|
|
|
|
encoding : -111,
|
|
|
|
|
data_error : -112
|
|
|
|
|
unknown : -999
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const errMsgs = new Map();
|
|
|
|
|
@@ -356,23 +289,11 @@ errMsgs.get(fido2LibErrMsgLanguages.english).set('SvrErr118:', 'Signature is not
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('SvrErr119:', 'No user session!');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('SvrErr120:', 'User has reached the device limit!');
|
|
|
|
|
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr101:', 'Your browser does not support FIDO2/WebAuthn.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr102:', 'The operation was canceled by the user.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr103:', 'The operation timed out.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr104:', 'A system error occurred.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr105:', 'The authenticator contains credentials that are already registered with this website.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr106:', 'Another request is already in progress.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr107:', 'The operation was not allowed.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr108:', 'The operation was aborted.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr109:', 'This operation is not supported on your device.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr110:', 'A security error occurred.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr111:', 'A network error occurred.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr112:', 'The operation failed due to a constraint violation.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr113:', 'Could not read the credential.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr114:', 'The data format is invalid.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr115:', 'A data error occurred.');
|
|
|
|
|
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr106:', 'Another request is already in progress.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr101:', 'Your browser does not support FIDO2.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr102:', 'The user canceled.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr103:', 'The process timeout.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr104:', 'System error.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr105:', 'The same authenticator cannot be registered again.');
|
|
|
|
|
|
|
|
|
|
errMsgs.set(fido2LibErrMsgLanguages.japanese, new Map());
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr101:', '登録されていないエンタープライズ認証デバイス aaguid!');
|
|
|
|
|
@@ -394,23 +315,11 @@ errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr118:', '署名は base6
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr119:', 'ユーザーセッションがありません!');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr120:', 'ユーザーはデバイスの制限数に達しました!');
|
|
|
|
|
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr101:', 'お使いのブラウザは FIDO2/WebAuthn をサポートしていません。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr102:', 'ユーザーによって操作がキャンセルされました。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr103:', '操作がタイムアウトしました。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr104:', 'システムエラーが発生しました。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr105:', 'この認証デバイスには、すでにこの网站に登録されている憑拠が含まれています。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr106:', '別のリクエストがすでに進行中です。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr107:', '操作が許可されませんでした。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr108:', '操作が中止されました。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr109:', 'この機器ではこの操作はサポートされていません。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr110:', 'セキュリティエラーが発生しました。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr111:', 'ネットワークエラーが発生しました。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr112:', '制約違反のため操作に失敗しました。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr113:', '憑拠を読み取れませんでした。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr114:', 'データ形式が無効です。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr115:', 'データエラーが発生しました。');
|
|
|
|
|
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr106:', '別のリクエストがすでに進行中です。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr101:', 'お使いのブラウザは FIDO2 をサポートしていません。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr102:', 'ユーザーがキャンセルしました。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr103:', 'プロセスがタイムアウトしました。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr104:', 'システムエラー。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr105:', '同じ認証デバイスを再登録することはできません。');
|
|
|
|
|
|
|
|
|
|
errMsgs.set(fido2LibErrMsgLanguages.chinese_cn, new Map());
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr101:', '未注册的企业认证器 aaguid!');
|
|
|
|
|
@@ -432,23 +341,11 @@ errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr118:', '签名不是
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr119:', '未建立用户会话!');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr120:', '用户已达到设备限制数!');
|
|
|
|
|
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr106:', '另一个请求正在进行中。');
|
|
|
|
|
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr101:', '您的浏览器不支持FIDO2/WebAuthn。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr102:', '操作已被用户取消。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr101:', '您的浏览器不支持FIDO2.');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr102:', '用户取消了操作。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr103:', '操作超时。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr104:', '发生系统错误。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr105:', '您的认证器包含已在此网站注册的凭据。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr106:', '另一个请求正在进行中。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr107:', '操作不被允许。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr108:', '操作已中止。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr109:', '您的设备不支持此操作。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr110:', '发生安全错误。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr111:', '发生网络错误。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr112:', '由于约束冲突,操作失败。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr113:', '无法读取凭据。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr114:', '数据格式无效。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr115:', '发生数据错误。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr104:', '系统错误。');
|
|
|
|
|
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr105:', '无法再次注册相同的认证器。');
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
@@ -592,7 +489,6 @@ async function doAttestation(username, displayName, rpId, userVerification = 'pr
|
|
|
|
|
} catch (err) {
|
|
|
|
|
var errRtn = {status:'failed', errorMessage: err.message};
|
|
|
|
|
if(err.name) errRtn.name = err.name
|
|
|
|
|
|
|
|
|
|
if(err.name && 'NotAllowedError' === err.name){
|
|
|
|
|
const nowtm = (new Date()).getTime()
|
|
|
|
|
if(nowtm > process_time_limit){
|
|
|
|
|
@@ -600,27 +496,7 @@ async function doAttestation(username, displayName, rpId, userVerification = 'pr
|
|
|
|
|
}else{
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.user_canceled
|
|
|
|
|
}
|
|
|
|
|
} else if(err.name && 'InvalidStateError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.invalid_state
|
|
|
|
|
} else if(err.name && 'AbortError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.abort
|
|
|
|
|
} else if(err.name && 'NotSupportedError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.not_supported
|
|
|
|
|
} else if(err.name && 'SecurityError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.security
|
|
|
|
|
} else if(err.name && 'NetworkError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.network
|
|
|
|
|
} else if(err.name && 'ConstraintError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.constraint
|
|
|
|
|
} else if(err.name && 'NotReadableError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.not_readable
|
|
|
|
|
} else if(err.name && 'EncodingError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.encoding
|
|
|
|
|
} else if(err.name && 'DataError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.data_error
|
|
|
|
|
} else {
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.unknown
|
|
|
|
|
}
|
|
|
|
|
}else errRtn.errCode = fido2LibErrCodes.unknown
|
|
|
|
|
|
|
|
|
|
return errRtn;
|
|
|
|
|
} finally {
|
|
|
|
|
@@ -731,7 +607,6 @@ async function doAssertion(username = null, rpId = null, userVerification = 'pre
|
|
|
|
|
} catch (err) {
|
|
|
|
|
var errRtn = {status:'failed', errorMessage: err.message};
|
|
|
|
|
if(err.name) errRtn.name = err.name
|
|
|
|
|
|
|
|
|
|
if(err.name && 'NotAllowedError' === err.name){
|
|
|
|
|
const nowtm = (new Date()).getTime()
|
|
|
|
|
if(nowtm > process_time_limit){
|
|
|
|
|
@@ -739,27 +614,7 @@ async function doAssertion(username = null, rpId = null, userVerification = 'pre
|
|
|
|
|
}else{
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.user_canceled
|
|
|
|
|
}
|
|
|
|
|
} else if(err.name && 'InvalidStateError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.invalid_state
|
|
|
|
|
} else if(err.name && 'AbortError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.abort
|
|
|
|
|
} else if(err.name && 'NotSupportedError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.not_supported
|
|
|
|
|
} else if(err.name && 'SecurityError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.security
|
|
|
|
|
} else if(err.name && 'NetworkError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.network
|
|
|
|
|
} else if(err.name && 'ConstraintError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.constraint
|
|
|
|
|
} else if(err.name && 'NotReadableError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.not_readable
|
|
|
|
|
} else if(err.name && 'EncodingError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.encoding
|
|
|
|
|
} else if(err.name && 'DataError' === err.name){
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.data_error
|
|
|
|
|
} else {
|
|
|
|
|
errRtn.errCode = fido2LibErrCodes.unknown
|
|
|
|
|
}
|
|
|
|
|
}else errRtn.errCode = fido2LibErrCodes.unknown
|
|
|
|
|
|
|
|
|
|
return errRtn;
|
|
|
|
|
} finally {
|
|
|
|
|
|