kiran-authentication-devices/0001-feature-ukey-The-UKey-device-is-adapted.patch

3102 lines
106 KiB
Diff
Raw Normal View History

From 919d46a3371e4770ca13ac25e5ce3fd996710d9e Mon Sep 17 00:00:00 2001
From: luoqing <luoqing@kylinsec.com.cn>
Date: Thu, 13 Apr 2023 15:41:16 +0800
Subject: [PATCH] feature(ukey):The UKey device is adapted
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 完成UKey设备适配
---
data/drivers.conf | 6 +-
include/auth-enum.h | 4 +-
include/kiran-auth-device-i.h | 7 +
include/third-party-device.h | 5 +-
include/ukey-skf.h | 325 +++++++++++
src/CMakeLists.txt | 9 +-
src/auth-device-manager.cpp | 45 +-
src/auth-device-manager.h | 24 +-
src/context/context-factory.cpp | 25 +-
src/context/context-factory.h | 11 +-
src/context/finger-vein/fv-sd-context.cpp | 1 +
src/context/ukey/ukey-ft-context.cpp | 57 ++
src/context/ukey/ukey-ft-context.h | 27 +
src/device/auth-device.cpp | 228 ++++----
src/device/auth-device.h | 65 +--
src/device/bio-device.cpp | 104 ++++
src/device/bio-device.h | 47 ++
src/device/finger-vein/fv-sd-device.cpp | 28 +-
src/device/finger-vein/fv-sd-device.h | 10 +-
src/device/fingerprint/fp-device.cpp | 2 +-
src/device/fingerprint/fp-device.h | 4 +-
src/device/fingerprint/fp-zk-device.cpp | 22 +-
src/device/fingerprint/fp-zk-device.h | 7 +-
src/device/ukey/ukey-ft-device.cpp | 400 ++++++++++++++
src/device/ukey/ukey-ft-device.h | 68 +++
src/driver/ukey/ukey-skf-driver.cpp | 516 ++++++++++++++++++
src/driver/ukey/ukey-skf-driver.h | 62 +++
.../kiran-authentication-devices.zh_CN.ts | 82 ++-
28 files changed, 1916 insertions(+), 275 deletions(-)
create mode 100644 include/ukey-skf.h
create mode 100644 src/context/ukey/ukey-ft-context.cpp
create mode 100644 src/context/ukey/ukey-ft-context.h
create mode 100644 src/device/bio-device.cpp
create mode 100644 src/device/bio-device.h
create mode 100644 src/device/ukey/ukey-ft-device.cpp
create mode 100644 src/device/ukey/ukey-ft-device.h
create mode 100644 src/driver/ukey/ukey-skf-driver.cpp
create mode 100644 src/driver/ukey/ukey-skf-driver.h
diff --git a/data/drivers.conf b/data/drivers.conf
index e2be3f1..ef3f9f8 100644
--- a/data/drivers.conf
+++ b/data/drivers.conf
@@ -8,4 +8,8 @@ Type=0
[sdfv]
Enable=true
-Type=2
\ No newline at end of file
+Type=2
+
+[es_3000gm]
+Enable=true
+Type=5
\ No newline at end of file
diff --git a/include/auth-enum.h b/include/auth-enum.h
index 19f98d1..a29e9b5 100644
--- a/include/auth-enum.h
+++ b/include/auth-enum.h
@@ -93,7 +93,9 @@ enum IdentifyProcess
// 匹配
IDENTIFY_PROCESS_MACTCH,
// 不匹配
- IDENTIFY_PROCESS_NO_MATCH
+ IDENTIFY_PROCESS_NO_MATCH,
+ // PIN码不正确
+ IDENTIFY_PROCESS_PIN_INCORRECT
};
} // namespace Kiran
\ No newline at end of file
diff --git a/include/kiran-auth-device-i.h b/include/kiran-auth-device-i.h
index 8422eaf..89e4000 100644
--- a/include/kiran-auth-device-i.h
+++ b/include/kiran-auth-device-i.h
@@ -26,6 +26,11 @@ extern "C"
#define GENERAL_AUTH_DEVICE_DBUS_OBJECT_PATH "/com/kylinsec/Kiran/AuthDevice/Device"
#define GENERAL_AUTH_DEVICE_DBUS_INTERFACE_NAME "com.kylinsec.Kiran.AuthDevice.Device"
+#define AUTH_DEVICE_JSON_KEY_UKEY "ukey"
+#define AUTH_DEVICE_JSON_KEY_PIN "pin"
+#define AUTH_DEVICE_JSON_KEY_REBINDING "rebinding"
+#define AUTH_DEVICE_JSON_KEY_FEATURE_IDS "feature_ids"
+
// 录入结果
enum EnrollResult
{
@@ -37,6 +42,8 @@ extern "C"
ENROLL_RESULT_PASS,
// 因为扫描质量或者用户扫描过程中发生的问题引起
ENROLL_RESULT_RETRY,
+ // UKey已经存在绑定关系
+ ENROLL_RESULT_UKEY_EXIST_BINDING
};
// 识别结果
diff --git a/include/third-party-device.h b/include/third-party-device.h
index d06a4a2..2b118d3 100644
--- a/include/third-party-device.h
+++ b/include/third-party-device.h
@@ -19,7 +19,7 @@ namespace Kiran
{
#define ZK_ID_VENDOR "1b55"
#define SD_ID_VENDOR "05e3"
-
+#define FT_ID_VENDOR "096e"
static const struct ThirdPartyDeviceSupported
{
@@ -35,7 +35,8 @@ static const struct ThirdPartyDeviceSupported
QString description;
}ThirdPartyDeviceSupportedTable[] = {
{DEVICE_TYPE_FingerPrint,"1b55","0120","","ZK"},
- {DEVICE_TYPE_FingerVein,"05e3","0608","","SD"}
+ {DEVICE_TYPE_FingerVein,"05e3","0608","","SD"},
+ {DEVICE_TYPE_UKey,"096e","0309","","FT"}
};
}
\ No newline at end of file
diff --git a/include/ukey-skf.h b/include/ukey-skf.h
new file mode 100644
index 0000000..d1b6a6f
--- /dev/null
+++ b/include/ukey-skf.h
@@ -0,0 +1,325 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-biometrics is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ *
+ * Author: luoqing <luoqing@kylinsec.com.cn>
+ */
+
+#pragma once
+#include <stdint.h>
+#include <QString>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+typedef int8_t INT8;
+typedef int16_t INT16;
+typedef int32_t INT32;
+typedef unsigned char UINT8;
+typedef uint16_t UINT16;
+typedef uint32_t UINT32;
+typedef long BOOL;
+
+typedef UINT8 BYTE;
+typedef UINT8 CHAR;
+typedef INT16 SHORT;
+typedef UINT16 USHORT;
+typedef INT32 LONG;
+typedef UINT32 ULONG;
+typedef UINT32 UINT;
+typedef UINT16 WORD;
+typedef UINT32 DWORD;
+typedef UINT32 FLAGS;
+typedef CHAR *LPSTR;
+typedef void *HANDLE;
+typedef HANDLE DEVHANDLE;
+typedef HANDLE HAPPLICATION;
+typedef HANDLE HCONTAINER;
+
+#define MAX_RSA_MODULUS_LEN 256
+#define MAX_RSA_EXPONENT_LEN 4
+#define ECC_MAX_XCOORDINATE_BITS_LEN 512
+#define ECC_MAX_YCOORDINATE_BITS_LEN 512
+#define ECC_MAX_MODULUS_BITS_LEN 512
+
+#define MAX_IV_LEN 32
+#define MAX_FILE_NAME_SIZE 32
+#define MAX_FILE_CONTAINER_NAME_SIZE 64
+
+/*Permission type*/
+#define SECURE_NEVER_ACCOUNT 0x00000000
+#define SECURE_ADM_ACCOUNT 0x00000001
+#define SECURE_USER_ACCOUNT 0x00000010
+#define SECURE_ANYONE_ACCOUNT 0x000000FF
+
+#ifndef FALSE
+#define FALSE 0x00000000
+#endif
+
+#ifndef TRUE
+#define TRUE 0x00000001
+#endif
+
+#ifndef ADMIN_TYPE
+#define ADMIN_TYPE 0
+#endif
+
+#ifndef USER_TYPE
+#define USER_TYPE 1
+#endif
+
+/* public key usage */
+#define SGD_PK_SIGN 0x0100
+#define SGD_PK_DH 0x0200
+#define SGD_PK_ENC 0x0400
+
+/* public key types */
+#define SGD_RSA 0x00010000
+#define SGD_RSA_SIGN (SGD_RSA | SGD_PK_SIGN)
+#define SGD_RSA_ENC (SGD_RSA | SGD_PK_ENC)
+#define SGD_SM2 0x00020000
+#define SGD_SM2_1 (SGD_SM2 | SGD_PK_SIGN)
+#define SGD_SM2_2 (SGD_SM2 | SGD_PK_DH)
+#define SGD_SM2_3 (SGD_SM2 | SGD_PK_ENC)
+
+/* hash */
+#define SGD_SM3 0x00000001
+#define SGD_SHA1 0x00000002
+#define SGD_SHA256 0x00000004
+#define SGD_HASH_FROM 0x00000008
+#define SGD_HASH_TO 0x000000FF
+
+/* signatue schemes */
+#define SGD_SM3_RSA (SGD_SM3|SGD_RSA)
+#define SGD_SHA1_RSA (SGD_SHA1|SGD_RSA)
+#define SGD_SHA256_RSA (SGD_SHA256|SGD_RSA)
+#define SGD_SM3_SM2 (SGD_SM3|SGD_SM2)
+#define SGD_SIG_FROM 0x00040000
+#define SGD_SIG_TO 0x800000FF
+
+#pragma pack(1)
+ typedef struct Struct_Version
+ {
+ BYTE major;
+ BYTE minor;
+ } VERSION;
+
+ typedef struct Struct_DEVINFO
+ {
+ VERSION Version;
+ CHAR Manufacturer[64];
+ CHAR Issuer[64];
+ CHAR Label[32];
+ CHAR SerialNumber[32];
+ VERSION HWVersion;
+ VERSION FirmwareVersion;
+ ULONG AlgSymCap;
+ ULONG AlgAsymCap;
+ ULONG AlgHashCap;
+ ULONG DevAuthAlgId;
+ ULONG TotalSpace;
+ ULONG FreeSpace;
+ ULONG MaxECCBufferSize;
+ ULONG MaxBufferSize;
+ BYTE Reserved[64];
+ } DEVINFO, *PDEVINFO;
+
+ typedef struct Struct_RSAPUBLICKEYBLOB
+ {
+ ULONG AlgID;
+ ULONG BitLen;
+ BYTE Modulus[MAX_RSA_MODULUS_LEN];
+ BYTE PublicExponent[MAX_RSA_EXPONENT_LEN];
+ } RSAPUBLICKEYBLOB, *PRSAPUBLICKEYBLOB;
+
+ typedef struct Struct_RSAPRIVATEKEYBLOB
+ {
+ ULONG AlgID;
+ ULONG BitLen;
+ BYTE Modulus[MAX_RSA_MODULUS_LEN];
+ BYTE PublicExponent[MAX_RSA_EXPONENT_LEN];
+ BYTE PrivateExponent[MAX_RSA_MODULUS_LEN];
+ BYTE Prime1[MAX_RSA_MODULUS_LEN / 2];
+ BYTE Prime2[MAX_RSA_MODULUS_LEN / 2];
+ BYTE Prime1Exponent[MAX_RSA_MODULUS_LEN / 2];
+ BYTE Prime2Exponent[MAX_RSA_MODULUS_LEN / 2];
+ BYTE Coefficient[MAX_RSA_MODULUS_LEN / 2];
+ } RSAPRIVATEKEYBLOB, *PRSAPRIVATEKEYBLOB;
+
+ typedef struct Struct_ECCPUBLICKEYBLOB
+ {
+ ULONG BitLen;
+ BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8];
+ BYTE YCoordinate[ECC_MAX_YCOORDINATE_BITS_LEN / 8];
+ } ECCPUBLICKEYBLOB, *PECCPUBLICKEYBLOB;
+
+ typedef struct Struct_ECCPRIVATEKEYBLOB
+ {
+ ULONG BitLen;
+ BYTE PrivateKey[ECC_MAX_MODULUS_BITS_LEN / 8];
+ } ECCPRIVATEKEYBLOB, *PECCPRIVATEKEYBLOB;
+
+ typedef struct Struct_ECCCIPHERBLOB
+ {
+ BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8];
+ BYTE YCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8];
+ BYTE HASH[32];
+ ULONG CipherLen;
+ BYTE Cipher[1];
+ } ECCCIPHERBLOB, *PECCCIPHERBLOB;
+
+ typedef struct Struct_ECCSIGNATUREBLOB
+ {
+ BYTE r[ECC_MAX_XCOORDINATE_BITS_LEN / 8];
+ BYTE s[ECC_MAX_XCOORDINATE_BITS_LEN / 8];
+ } ECCSIGNATUREBLOB, *PECCSIGNATUREBLOB;
+
+ typedef struct Struct_BLOCKCIPHERPARAM
+ {
+ BYTE IV[MAX_IV_LEN];
+ ULONG IVLen;
+ ULONG PaddingType;
+ ULONG FeedBitLen;
+ } BLOCKCIPHERPARAM, *PBLOCKCIPHERPARAM;
+
+ typedef struct SKF_ENVELOPEDKEYBLOB
+ {
+ ULONG Version;
+ ULONG ulSymmAlgID;
+ ULONG ulBits;
+ BYTE cbEncryptedPriKey[64];
+ ECCPUBLICKEYBLOB PubKey;
+ ECCCIPHERBLOB ECCCipherBlob;
+ } ENVELOPEDKEYBLOB, *PENVELOPEDKEYBLOB;
+
+ typedef struct Struct_FILEATTRIBUTE
+ {
+ CHAR FileName[MAX_FILE_NAME_SIZE];
+ ULONG FileSize;
+ ULONG ReadRights;
+ ULONG WriteRights;
+ } FILEATTRIBUTE, *PFILEATTRIBUTE;
+#pragma pack()
+
+#define SAR_OK 0x00000000
+#define SAR_FAIL 0x0A000001
+#define SAR_UNKNOWNERR 0x0A000002
+#define SAR_NOTSUPPORTYETERR 0x0A000003
+#define SAR_FILEERR 0x0A000004
+#define SAR_INVALIDHANDLEERR 0x0A000005
+#define SAR_INVALIDPARAMERR 0x0A000006
+#define SAR_READFILEERR 0x0A000007
+#define SAR_WRITEFILEERR 0x0A000008
+#define SAR_NAMELENERR 0x0A000009
+#define SAR_KEYUSAGEERR 0x0A00000A
+#define SAR_MODULUSLENERR 0x0A00000B
+#define SAR_NOTINITIALIZEERR 0x0A00000C
+#define SAR_OBJERR 0x0A00000D
+#define SAR_MEMORYERR 0x0A00000E
+#define SAR_TIMEOUTERR 0x0A00000F
+#define SAR_INDATALENERR 0x0A000010
+#define SAR_INDATAERR 0x0A000011
+#define SAR_GENRANDERR 0x0A000012
+#define SAR_HASHOBJERR 0x0A000013
+#define SAR_HASHERR 0x0A000014
+#define SAR_GENRSAKEYERR 0x0A000015
+#define SAR_RSAMODULUSLENERR 0x0A000016
+#define SAR_CSPIMPRTPUBKEYERR 0x0A000017
+#define SAR_RSAENCERR 0x0A000018
+#define SAR_RSADECERR 0x0A000019
+#define SAR_HASHNOTEQUALERR 0x0A00001A
+#define SAR_KEYNOTFOUNTERR 0x0A00001B
+#define SAR_CERTNOTFOUNTERR 0x0A00001C
+#define SAR_NOTEXPORTERR 0x0A00001D
+#define SAR_DECRYPTPADERR 0x0A00001E
+#define SAR_MACLENERR 0x0A00001F
+#define SAR_BUFFER_TOO_SMALL 0x0A000020
+#define SAR_KEYINFOTYPEERR 0x0A000021
+#define SAR_NOT_EVENTERR 0x0A000022
+#define SAR_DEVICE_REMOVED 0x0A000023
+#define SAR_PIN_INCORRECT 0x0A000024
+#define SAR_PIN_LOCKED 0x0A000025
+#define SAR_PIN_INVALID 0x0A000026
+#define SAR_PIN_LEN_RANGE 0x0A000027
+#define SAR_USER_ALREADY_LOGGED_IN 0x0A000028
+#define SAR_USER_PIN_NOT_INITIALIZED 0x0A000029
+#define SAR_USER_TYPE_INVALID 0x0A00002A
+#define SAR_APPLICATION_NAME_INVALID 0x0A00002B
+#define SAR_APPLICATION_EXISTS 0x0A00002C
+#define SAR_USER_NOT_LOGGED_IN 0x0A00002D
+#define SAR_APPLICATION_NOT_EXISTS 0x0A00002E
+#define SAR_FILE_ALREADY_EXIST 0x0A00002F
+#define SAR_NO_ROOM 0x0A000030
+#define SAR_FILE_NOT_EXIST 0x0A000031
+#define SAR_REACH_MAX_CONTAINER_COUNT 0x0A000032
+
+typedef struct {
+ ULONG err;
+ QString reason;
+} SKF_ERR_REASON;
+
+static SKF_ERR_REASON skf_errors[] = {
+ { SAR_OK, "success" },
+ { SAR_FAIL, "failure" },
+ { SAR_UNKNOWNERR, "unknown error" },
+ { SAR_NOTSUPPORTYETERR, "operation not supported" },
+ { SAR_FILEERR, "file error" },
+ { SAR_INVALIDHANDLEERR, "invalid handle" },
+ { SAR_INVALIDPARAMERR, "invalid parameter" },
+ { SAR_READFILEERR, "read file failure" },
+ { SAR_WRITEFILEERR, "write file failure" },
+ { SAR_NAMELENERR, "invalid name length" },
+ { SAR_KEYUSAGEERR, "invalid key usage" },
+ { SAR_MODULUSLENERR, "invalid modulus length" },
+ { SAR_NOTINITIALIZEERR, "not initialized" },
+ { SAR_OBJERR, "invalid object" },
+ { SAR_MEMORYERR, "memory error" },
+ { SAR_TIMEOUTERR, "timeout" },
+ { SAR_INDATALENERR, "invalid input length" },
+ { SAR_INDATAERR, "invalid input value" },
+ { SAR_GENRANDERR, "random generation failed" },
+ { SAR_HASHOBJERR, "invalid digest handle" },
+ { SAR_HASHERR, "digest error" },
+ { SAR_GENRSAKEYERR, "rsa key generation failure" },
+ { SAR_RSAMODULUSLENERR, "invalid rsa modulus length" },
+ { SAR_CSPIMPRTPUBKEYERR, "csp import public key error" },
+ { SAR_RSAENCERR, "rsa encryption failure" },
+ { SAR_RSADECERR, "rsa decryption failure" },
+ { SAR_HASHNOTEQUALERR, "hash not equal" },
+ { SAR_KEYNOTFOUNTERR, "key not found" },
+ { SAR_CERTNOTFOUNTERR, "certificate not found" },
+ { SAR_NOTEXPORTERR, "export failed" },
+ { SAR_DECRYPTPADERR, "decrypt invalid padding" },
+ { SAR_MACLENERR, "invalid mac length" },
+ { SAR_BUFFER_TOO_SMALL, "buffer too small" },
+ { SAR_KEYINFOTYPEERR, "invalid key info type" },
+ { SAR_NOT_EVENTERR, "no event" },
+ { SAR_DEVICE_REMOVED, "device removed" },
+ { SAR_PIN_INCORRECT, "pin incorrect" },
+ { SAR_PIN_LOCKED, "pin locked" },
+ { SAR_PIN_INVALID, "invalid pin" },
+ { SAR_PIN_LEN_RANGE, "invalid pin length" },
+ { SAR_USER_ALREADY_LOGGED_IN, "user already logged in" },
+ { SAR_USER_PIN_NOT_INITIALIZED, "user pin not initialized" },
+ { SAR_USER_TYPE_INVALID, "invalid user type" },
+ { SAR_APPLICATION_NAME_INVALID, "invalid application name" },
+ { SAR_APPLICATION_EXISTS, "application already exist" },
+ { SAR_USER_NOT_LOGGED_IN, "user not logged in" },
+ { SAR_APPLICATION_NOT_EXISTS, "application not exist" },
+ { SAR_FILE_ALREADY_EXIST, "file already exist" },
+ { SAR_NO_ROOM, "no space" },
+ { SAR_FILE_NOT_EXIST, "file not exist" },
+};
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 39c8dc5..cac6cb4 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -37,11 +37,14 @@ qt_add_dbus_adaptor(
set(DEVICE_SDK ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}-sdk)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
-set(CMAKE_INSTALL_RPATH ${DEVICE_SDK}/finger-vein/sd:${DEVICE_SDK}/fingerprint/zk)
+set(CMAKE_INSTALL_RPATH ${DEVICE_SDK}/finger-vein/sd:${DEVICE_SDK}/fingerprint/zk:${DEVICE_SDK}/ukey/ft)
set(TS_FILES "${PROJECT_SOURCE_DIR}/translations/${PROJECT_NAME}.zh_CN.ts")
-qt_create_translation(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES})
+qt_create_translation(QM_FILES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${TS_FILES}
+ )
add_executable(${PROJECT_NAME}
${SRC_H_FILES}
@@ -58,7 +61,7 @@ target_include_directories(${PROJECT_NAME} PUBLIC
${KLOG_QT5_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}
)
-
+
target_link_libraries(${PROJECT_NAME}
${KLOG_QT5_LIBRARIES}
${LIBUDEV_LIBRARIES}
diff --git a/src/auth-device-manager.cpp b/src/auth-device-manager.cpp
index 984d3c1..a0ac795 100644
--- a/src/auth-device-manager.cpp
+++ b/src/auth-device-manager.cpp
@@ -18,9 +18,9 @@
#include <QDBusConnection>
#include <QDBusError>
#include <QDBusMessage>
-#include "device/auth-device.h"
#include "auth_device_manager_adaptor.h"
#include "context/context-factory.h"
+#include "device/auth-device.h"
#include "feature-db.h"
#include "kiran-auth-device-i.h"
#include "polkit-proxy.h"
@@ -148,7 +148,7 @@ void AuthDeviceManager::onRemove(const QDBusMessage& message, const QString& fea
{
bool result = FeatureDB::getInstance()->deleteFeature(feature_id);
KLOG_DEBUG() << "deleteFeature:" << feature_id
- << "result" << result;
+ << "exec:" << result;
auto replyMessage = message.createReply();
QDBusConnection::systemBus().send(replyMessage);
}
@@ -192,10 +192,9 @@ CHECK_AUTH_WITH_2ARGS(AuthDeviceManager, SetEnableDriver, onSetEnableDriver, AUT
void AuthDeviceManager::init()
{
- m_dbusAdaptor = new AuthDeviceManagerAdaptor(this);
- m_contextFactory = ContextFactory::instance();
- m_timer = new QTimer(this);
- connect(m_timer, &QTimer::timeout, this, &AuthDeviceManager::handleDeviceReCreate);
+ m_dbusAdaptor = QSharedPointer<AuthDeviceManagerAdaptor>(new AuthDeviceManagerAdaptor(this));
+ m_contextFactory = QSharedPointer<ContextFactory>(ContextFactory::instance());
+ connect(&m_timer, &QTimer::timeout, this, &AuthDeviceManager::handleDeviceReCreate);
QDBusConnection dbusConnection = QDBusConnection::systemBus();
if (!dbusConnection.registerService(AUTH_DEVICE_DBUS_NAME))
@@ -214,14 +213,14 @@ void AuthDeviceManager::init()
KLOG_ERROR() << "Can't register object:" << dbusConnection.lastError();
}
- m_udev = udev_new();
+ m_udev = QSharedPointer<udev> (udev_new());
if (!m_udev)
{
KLOG_ERROR() << "new udev error";
}
- initDeviceMonitor(m_udev);
- auto usbInfoList = enumerateDevices(m_udev);
+ initDeviceMonitor(m_udev.data());
+ auto usbInfoList = enumerateDevices(m_udev.data());
// 枚举设备后,生成设备对象
Q_FOREACH (auto deviceInfo, usbInfoList)
{
@@ -243,16 +242,16 @@ void AuthDeviceManager::init()
void AuthDeviceManager::initDeviceMonitor(struct udev* udev)
{
// 创建一个新的monitor
- m_monitor = udev_monitor_new_from_netlink(udev, "udev");
+ m_monitor = QSharedPointer<udev_monitor> (udev_monitor_new_from_netlink(udev, "udev"));
// 增加一个udev事件过滤器
- udev_monitor_filter_add_match_subsystem_devtype(m_monitor, "usb", nullptr);
+ udev_monitor_filter_add_match_subsystem_devtype(m_monitor.data(), "usb", nullptr);
// 启动监控
- udev_monitor_enable_receiving(m_monitor);
+ udev_monitor_enable_receiving(m_monitor.data());
// 获取该监控的文件描述符fd就代表了这个监控
- m_fd = udev_monitor_get_fd(m_monitor);
+ m_fd = udev_monitor_get_fd(m_monitor.data());
- m_socketNotifierRead = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
- connect(m_socketNotifierRead, &QSocketNotifier::activated, this, &AuthDeviceManager::handleSocketNotifierRead);
+ m_socketNotifierRead = QSharedPointer<QSocketNotifier>(new QSocketNotifier(m_fd, QSocketNotifier::Read, this));
+ connect(m_socketNotifierRead.data(), &QSocketNotifier::activated, this, &AuthDeviceManager::handleSocketNotifierRead);
}
void AuthDeviceManager::handleSocketNotifierRead(int socket)
@@ -274,7 +273,7 @@ void AuthDeviceManager::handleSocketNotifierRead(int socket)
return;
// 获取产生事件的设备映射
- struct udev_device* dev = udev_monitor_receive_device(m_monitor);
+ struct udev_device* dev = udev_monitor_receive_device(m_monitor.data());
if (!dev)
return;
@@ -317,11 +316,11 @@ void AuthDeviceManager::handleSocketNotifierRead(int socket)
QList<DeviceInfo> AuthDeviceManager::enumerateDevices(struct udev* udev)
{
// 创建一个枚举器用于扫描已连接的设备
- struct udev_enumerate* enumerate = udev_enumerate_new(udev);
+ struct udev_enumerate* enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, SUBSYSTEM);
udev_enumerate_scan_devices(enumerate);
// 返回一个存储了设备所有属性信息的链表
- struct udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate);
+ struct udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate);
struct udev_list_entry* entry;
QList<DeviceInfo> usbInfoList;
@@ -329,7 +328,7 @@ QList<DeviceInfo> AuthDeviceManager::enumerateDevices(struct udev* udev)
{
const char* path = udev_list_entry_get_name(entry);
// 创建一个udev设备的映射
- struct udev_device* dev = udev_device_new_from_syspath(udev, path);
+ struct udev_device* dev = udev_device_new_from_syspath(udev, path);
DeviceInfo usbInfo;
usbInfo.idVendor = udev_device_get_sysattr_value(dev, "idVendor");
usbInfo.idProduct = udev_device_get_sysattr_value(dev, "idProduct");
@@ -419,16 +418,16 @@ void AuthDeviceManager::handleDeviceCreateFail(DeviceInfo deviceInfo)
m_retreyCreateDeviceMap.insert(deviceInfo, 0);
if (m_retreyCreateDeviceMap.count() != 0)
{
- if (!m_timer->isActive())
+ if (!m_timer.isActive())
{
- m_timer->start(1000);
+ m_timer.start(1000);
}
}
}
void AuthDeviceManager::handleDeviceDeleted()
{
- QList<DeviceInfo> newUsbInfoList = enumerateDevices(m_udev);
+ QList<DeviceInfo> newUsbInfoList = enumerateDevices(m_udev.data());
QStringList newBusList;
Q_FOREACH (auto newUsbInfo, newUsbInfoList)
{
@@ -468,7 +467,7 @@ void AuthDeviceManager::handleDeviceReCreate()
{
if (m_retreyCreateDeviceMap.count() == 0)
{
- m_timer->stop();
+ m_timer.stop();
}
else
{
diff --git a/src/auth-device-manager.h b/src/auth-device-manager.h
index fcf56bd..0993a55 100644
--- a/src/auth-device-manager.h
+++ b/src/auth-device-manager.h
@@ -15,12 +15,13 @@
#pragma once
#include <libudev.h>
+#include <QDBusContext>
#include <QDBusObjectPath>
#include <QObject>
+#include <QSharedPointer>
#include <QSocketNotifier>
#include <QTimer>
#include "auth-enum.h"
-#include <QDBusContext>
class AuthDeviceManagerAdaptor;
@@ -43,7 +44,7 @@ public:
public Q_SLOTS:
QString GetDevices();
- QString GetDevicesByType(int device_type);
+ QString GetDevicesByType(int device_type);
QDBusObjectPath GetDevice(const QString &device_id);
QStringList GetAllFeatureIDs();
QString GetDriversByType(int device_type);
@@ -64,8 +65,8 @@ private:
void processDevice(struct udev_device *dev);
void deviceSimpleInfo(struct udev_device *dev);
- void onRemove(const QDBusMessage &message,const QString &feature_id);
- void onSetEnableDriver(const QDBusMessage &message,const QString &driver_name, bool enable);
+ void onRemove(const QDBusMessage &message, const QString &feature_id);
+ void onSetEnableDriver(const QDBusMessage &message, const QString &driver_name, bool enable);
Q_SIGNALS:
void DeviceAdded(int device_type, const QString &device_id);
@@ -73,19 +74,18 @@ Q_SIGNALS:
private:
static AuthDeviceManager *m_instance;
- struct udev *m_udev;
- struct udev_monitor *m_monitor;
+ QSharedPointer<udev> m_udev;
+ QSharedPointer<udev_monitor> m_monitor;
int m_fd;
- AuthDeviceManagerAdaptor *m_dbusAdaptor;
- QSocketNotifier *m_socketNotifierRead;
+ QSharedPointer<AuthDeviceManagerAdaptor> m_dbusAdaptor;
+ QSharedPointer<QSocketNotifier> m_socketNotifierRead;
// 总线 -- AuthDevice对象对应
QMap<QString, AuthDevice *> m_deviceMap;
- ContextFactory *m_contextFactory;
-
- QTimer *m_timer;
+ QSharedPointer<ContextFactory> m_contextFactory;
+ QTimer m_timer;
// 设备信息-重试次数
- QMap<DeviceInfo,int> m_retreyCreateDeviceMap;
+ QMap<DeviceInfo, int> m_retreyCreateDeviceMap;
};
} // namespace Kiran
diff --git a/src/context/context-factory.cpp b/src/context/context-factory.cpp
index 82c9c6b..f489d8f 100644
--- a/src/context/context-factory.cpp
+++ b/src/context/context-factory.cpp
@@ -15,11 +15,12 @@
#include "context-factory.h"
#include <qt5-log-i.h>
#include <QMutex>
+#include "finger-vein/fv-sd-context.h"
#include "fingerprint/fp-builtin-context.h"
#include "fingerprint/fp-zk-context.h"
-#include "finger-vein/fv-sd-context.h"
#include "kiran-auth-device-i.h"
#include "third-party-device.h"
+#include "ukey/ukey-ft-context.h"
namespace Kiran
{
@@ -47,9 +48,10 @@ ContextFactory::ContextFactory(QObject* parent)
void ContextFactory::init()
{
- m_fpZKContext = new FPZKContext();
- m_fpBuiltInContext = new FPBuiltInContext();
- m_fvSDContext = new FVSDContext();
+ m_fpZKContext = QSharedPointer<FPZKContext>(new FPZKContext());
+ m_fpBuiltInContext = QSharedPointer<FPBuiltInContext>(new FPBuiltInContext());
+ m_fvSDContext = QSharedPointer<FVSDContext>(new FVSDContext());
+ m_ukeyFTContext = QSharedPointer<UKeyFTContext>(new UKeyFTContext());
}
AuthDevice* ContextFactory::createDevice(const QString& idVendor, const QString& idProduct)
@@ -72,6 +74,9 @@ AuthDevice* ContextFactory::createDevice(const QString& idVendor, const QString&
case DEVICE_TYPE_FingerVein:
device = createFingerVeinDevice(idVendor, idProduct);
break;
+ case DEVICE_TYPE_UKey:
+ device = createUKeyDevice(idVendor, idProduct);
+ break;
default:
break;
}
@@ -120,6 +125,18 @@ AuthDevice* ContextFactory::createFingerVeinDevice(const QString& idVendor, cons
return nullptr;
}
+AuthDevice* ContextFactory::createUKeyDevice(const QString& idVendor, const QString& idProduct)
+{
+ if (idVendor == FT_ID_VENDOR)
+ {
+ return m_ukeyFTContext->createDevice(idVendor, idProduct);
+ }
+ else
+ {
+ return nullptr;
+ };
+}
+
Context* ContextFactory::CreateContext()
{
return nullptr;
diff --git a/src/context/context-factory.h b/src/context/context-factory.h
index f2d510a..5d06839 100644
--- a/src/context/context-factory.h
+++ b/src/context/context-factory.h
@@ -15,13 +15,14 @@
#include <QObject>
#include "context.h"
-
+#include <QSharedPointer>
namespace Kiran
{
class FPZKContext;
class FPBuiltInContext;
class FVSDContext;
+class UKeyFTContext;
class ContextFactory : public QObject
{
@@ -43,11 +44,13 @@ private:
void init();
AuthDevice* createFingerPrintDevice(const QString& idVendor, const QString& idProduct);
AuthDevice* createFingerVeinDevice(const QString& idVendor, const QString& idProduct);
+ AuthDevice* createUKeyDevice(const QString& idVendor, const QString& idProduct);
private:
QStringList m_idVendorList;
- FPZKContext* m_fpZKContext;
- FPBuiltInContext* m_fpBuiltInContext;
- FVSDContext* m_fvSDContext;
+ QSharedPointer<FPZKContext> m_fpZKContext;
+ QSharedPointer<FPBuiltInContext> m_fpBuiltInContext;
+ QSharedPointer<FVSDContext> m_fvSDContext;
+ QSharedPointer<UKeyFTContext> m_ukeyFTContext;
};
} // namespace Kiran
diff --git a/src/context/finger-vein/fv-sd-context.cpp b/src/context/finger-vein/fv-sd-context.cpp
index a2e9dc7..d898564 100644
--- a/src/context/finger-vein/fv-sd-context.cpp
+++ b/src/context/finger-vein/fv-sd-context.cpp
@@ -24,6 +24,7 @@ FVSDContext::FVSDContext(QObject* parent)
{
}
+//TODO:createDevice 流程类似,考虑优化,减少重复代码
// fp-zk-context 需要管理多个so可以生成不同 so的设备
AuthDevice* FVSDContext::createDevice(const QString& idVendor, const QString& idProduct)
{
diff --git a/src/context/ukey/ukey-ft-context.cpp b/src/context/ukey/ukey-ft-context.cpp
new file mode 100644
index 0000000..40e9df3
--- /dev/null
+++ b/src/context/ukey/ukey-ft-context.cpp
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-biometrics is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ *
+ * Author: luoqing <luoqing@kylinsec.com.cn>
+ */
+
+#include "ukey-ft-context.h"
+#include <qt5-log-i.h>
+#include "device/ukey/ukey-ft-device.h"
+#include "utils.h"
+
+namespace Kiran
+{
+UKeyFTContext::UKeyFTContext(QObject* parent)
+ : Context{parent}
+{
+}
+
+AuthDevice* UKeyFTContext::createDevice(const QString& idVendor, const QString& idProduct)
+{
+ auto ftDevice = new UKeyFTDevice();
+ if (!Utils::driverEnabled(ftDevice->deviceDriver()))
+ {
+ KLOG_INFO() << QString("driver %1 is disabled! device %2:%3 can't be used")
+ .arg(ftDevice->deviceDriver())
+ .arg(idVendor)
+ .arg(idProduct);
+ return nullptr;
+ }
+ if (ftDevice->init())
+ {
+ QString deviceName = Utils::getDeviceName(idVendor, idProduct);
+ if (deviceName.isEmpty())
+ {
+ deviceName = "Feitian Technologies";
+ }
+ ftDevice->setDeviceName(deviceName);
+ ftDevice->setDeviceInfo(idVendor, idProduct);
+ m_deviceMap.insert(ftDevice->deviceID(), ftDevice);
+ return ftDevice;
+ }
+ else
+ {
+ KLOG_ERROR() << QString("device %1:%2 init failed!").arg(idVendor).arg(idProduct);
+ ftDevice->deleteLater();
+ return nullptr;
+ }
+}
+} // namespace Kiran
diff --git a/src/context/ukey/ukey-ft-context.h b/src/context/ukey/ukey-ft-context.h
new file mode 100644
index 0000000..48bd40d
--- /dev/null
+++ b/src/context/ukey/ukey-ft-context.h
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-biometrics is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ *
+ * Author: luoqing <luoqing@kylinsec.com.cn>
+ */
+#pragma once
+#include "context/context.h"
+
+namespace Kiran
+{
+class AuthDevice;
+class UKeyFTContext : public Context
+{
+public:
+ explicit UKeyFTContext(QObject *parent = nullptr);
+ AuthDevice* createDevice(const QString& idVendor, const QString& idProduct) override;
+};
+
+} // namespace Kiran
diff --git a/src/device/auth-device.cpp b/src/device/auth-device.cpp
index 0b890ec..d906fd1 100644
--- a/src/device/auth-device.cpp
+++ b/src/device/auth-device.cpp
@@ -42,7 +42,7 @@ bool AuthDevice::init()
{
if (initDevice())
{
- m_dbusAdaptor = new AuthDeviceAdaptor(this);
+ m_dbusAdaptor = QSharedPointer<AuthDeviceAdaptor>(new AuthDeviceAdaptor(this));
m_deviceID = QUuid::createUuid().toString(QUuid::WithoutBraces);
m_deviceStatus = DEVICE_STATUS_IDLE;
registerDBusObject();
@@ -71,17 +71,17 @@ void AuthDevice::registerDBusObject()
void AuthDevice::initFutureWatcher()
{
- m_futureWatcher = new QFutureWatcher<QByteArray>(this);
- connect(m_futureWatcher, &QFutureWatcher<QByteArray>::finished, this, &AuthDevice::handleAcquiredFeature);
+ m_futureWatcher = QSharedPointer<QFutureWatcher<QByteArray>>(new QFutureWatcher<QByteArray>(this));
+ connect(m_futureWatcher.data(), &QFutureWatcher<QByteArray>::finished, this, &AuthDevice::handleAcquiredFeature);
connect(this, &AuthDevice::retry, this, &AuthDevice::handleRetry);
}
void AuthDevice::initServiceWatcher()
{
- m_serviceWatcher = new QDBusServiceWatcher(this);
+ m_serviceWatcher = QSharedPointer<QDBusServiceWatcher>(new QDBusServiceWatcher(this));
this->m_serviceWatcher->setConnection(QDBusConnection::systemBus());
this->m_serviceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
- connect(m_serviceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, &AuthDevice::onNameLost);
+ connect(m_serviceWatcher.data(), &QDBusServiceWatcher::serviceUnregistered, this, &AuthDevice::onNameLost);
}
void AuthDevice::onNameLost(const QString& serviceName)
@@ -110,6 +110,15 @@ void AuthDevice::clearWatchedServices()
}
}
+DeviceInfo AuthDevice::deviceInfo()
+{
+ DeviceInfo deviceInfo;
+ deviceInfo.idVendor = m_idVendor;
+ deviceInfo.idProduct = m_idProduct;
+ deviceInfo.busPath = "";
+ return deviceInfo;
+}
+
void AuthDevice::setDeviceType(DeviceType deviceType)
{
m_deviceType = deviceType;
@@ -153,8 +162,36 @@ void AuthDevice::onEnrollStart(const QDBusMessage& dbusMessage, const QString& e
KLOG_DEBUG() << message;
return;
}
+ QJsonValue ukeyValue = Utils::getValueFromJsonString(extraInfo, AUTH_DEVICE_JSON_KEY_UKEY);
+ if (ukeyValue.isNull())
+ {
+ onBioEnrollStart(dbusMessage);
+ }
+ else
+ {
+ onUKeyEnrollStart(dbusMessage, ukeyValue);
+ }
+}
- // 获取当前保存的指纹模板,判断是否达到最大指纹数目
+void AuthDevice::onEnrollStop(const QDBusMessage& dbusMessage)
+{
+ if (deviceStatus() == DEVICE_STATUS_DOING_ENROLL)
+ {
+ acquireFeatureStop();
+ m_enrollTemplates.clear();
+ setDeviceStatus(DEVICE_STATUS_IDLE);
+ clearWatchedServices();
+ KLOG_DEBUG() << "EnrollStop";
+ }
+
+ auto replyMessage = dbusMessage.createReply();
+ QDBusConnection::systemBus().send(replyMessage);
+}
+
+void AuthDevice::onBioEnrollStart(const QDBusMessage& dbusMessage)
+{
+ QString message;
+ // 获取当前保存的特征模板,判断是否达到最大数目
QByteArrayList saveList = FeatureDB::getInstance()->getFeatures(m_idVendor, m_idProduct);
if (saveList.count() == TEMPLATE_MAX_NUMBER)
{
@@ -163,32 +200,35 @@ void AuthDevice::onEnrollStart(const QDBusMessage& dbusMessage, const QString& e
KLOG_ERROR() << message;
return;
}
-
setDeviceStatus(DEVICE_STATUS_DOING_ENROLL);
- m_doEnroll = true;
-
auto future = QtConcurrent::run(this, &AuthDevice::acquireFeature);
m_futureWatcher->setFuture(future);
m_serviceWatcher->addWatchedService(dbusMessage.service());
-
auto replyMessage = dbusMessage.createReply();
QDBusConnection::systemBus().send(replyMessage);
}
-void AuthDevice::onEnrollStop(const QDBusMessage& dbusMessage)
+void AuthDevice::onUKeyEnrollStart(const QDBusMessage& dbusMessage, QJsonValue ukeyValue)
{
- if (deviceStatus() == DEVICE_STATUS_DOING_ENROLL)
+ QString message;
+ auto jsonObject = ukeyValue.toObject();
+ m_pin = jsonObject.value(AUTH_DEVICE_JSON_KEY_PIN).toString();
+ bool rebinding = jsonObject.value(AUTH_DEVICE_JSON_KEY_REBINDING).toBool();
+ if (m_pin.isEmpty())
{
- acquireFeatureStop();
- m_doEnroll = false;
- m_enrollTemplates.clear();
- setDeviceStatus(DEVICE_STATUS_IDLE);
- clearWatchedServices();
- KLOG_DEBUG() << "EnrollStop";
+ message = tr("The pin code cannot be empty!");
+ Q_EMIT m_dbusAdaptor->EnrollStatus("", 0, ENROLL_RESULT_FAIL, message);
+ KLOG_ERROR() << message;
+ return;
+ }
+ else
+ {
+ setDeviceStatus(DEVICE_STATUS_DOING_ENROLL);
+ doingUKeyEnrollStart(m_pin, rebinding);
+ m_serviceWatcher->addWatchedService(dbusMessage.service());
+ auto replyMessage = dbusMessage.createReply();
+ QDBusConnection::systemBus().send(replyMessage);
}
-
- auto replyMessage = dbusMessage.createReply();
- QDBusConnection::systemBus().send(replyMessage);
}
void AuthDevice::onIdentifyStart(const QDBusMessage& dbusMessage, const QString& value)
@@ -202,10 +242,7 @@ void AuthDevice::onIdentifyStart(const QDBusMessage& dbusMessage, const QString&
return;
}
- setDeviceStatus(DEVICE_STATUS_DOING_IDENTIFY);
- m_doIdentify = true;
-
- QJsonArray jsonArray = Utils::getValueFromJsonString(value, "feature_ids").toArray();
+ QJsonArray jsonArray = Utils::getValueFromJsonString(value, AUTH_DEVICE_JSON_KEY_FEATURE_IDS).toArray();
if (!jsonArray.isEmpty())
{
QVariantList varList = jsonArray.toVariantList();
@@ -214,12 +251,16 @@ void AuthDevice::onIdentifyStart(const QDBusMessage& dbusMessage, const QString&
m_identifyIDs << var.toString();
}
}
- auto future = QtConcurrent::run(this, &AuthDevice::acquireFeature);
- m_futureWatcher->setFuture(future);
- m_serviceWatcher->addWatchedService(dbusMessage.service());
- auto replyMessage = dbusMessage.createReply();
- QDBusConnection::systemBus().send(replyMessage);
+ QJsonValue ukeyValue = Utils::getValueFromJsonString(value, AUTH_DEVICE_JSON_KEY_UKEY);
+ if (ukeyValue.isUndefined())
+ {
+ onBioIdentifyStart(dbusMessage);
+ }
+ else
+ {
+ onUKeyIdentifyStart(dbusMessage, ukeyValue);
+ }
}
void AuthDevice::onIdentifyStop(const QDBusMessage& message)
@@ -227,7 +268,6 @@ void AuthDevice::onIdentifyStop(const QDBusMessage& message)
if (deviceStatus() == DEVICE_STATUS_DOING_IDENTIFY)
{
acquireFeatureStop();
- m_doIdentify = false;
m_identifyIDs.clear();
setDeviceStatus(DEVICE_STATUS_IDLE);
clearWatchedServices();
@@ -237,90 +277,49 @@ void AuthDevice::onIdentifyStop(const QDBusMessage& message)
QDBusConnection::systemBus().send(replyMessage);
}
-CHECK_AUTH_WITH_1ARGS(AuthDevice, EnrollStart, onEnrollStart, AUTH_USER_ADMIN, const QString&)
-CHECK_AUTH_WITH_1ARGS(AuthDevice, IdentifyStart, onIdentifyStart, AUTH_USER_ADMIN, const QString&)
-CHECK_AUTH(AuthDevice, EnrollStop, onEnrollStop, AUTH_USER_ADMIN)
-CHECK_AUTH(AuthDevice, IdentifyStop, onIdentifyStop, AUTH_USER_ADMIN)
-
-QStringList AuthDevice::GetFeatureIDList()
+void AuthDevice::onBioIdentifyStart(const QDBusMessage& dbusMessage)
{
- QStringList featureIDs = FeatureDB::getInstance()->getFeatureIDs(m_idVendor, m_idProduct);
- return featureIDs;
+ setDeviceStatus(DEVICE_STATUS_DOING_IDENTIFY);
+ auto future = QtConcurrent::run(this, &AuthDevice::acquireFeature);
+ m_futureWatcher->setFuture(future);
+
+ m_serviceWatcher->addWatchedService(dbusMessage.service());
+ auto replyMessage = dbusMessage.createReply();
+ QDBusConnection::systemBus().send(replyMessage);
}
-void AuthDevice::doingEnrollProcess(QByteArray feature)
+void AuthDevice::onUKeyIdentifyStart(const QDBusMessage& dbusMessage, QJsonValue ukeyValue)
{
- if (!m_doEnroll)
- {
- return;
- }
QString message;
- if (feature.isEmpty())
- {
- acquireFeatureFail();
- return;
- }
+ auto jsonObject = ukeyValue.toObject();
+ m_pin = jsonObject.value(AUTH_DEVICE_JSON_KEY_PIN).toString();
- int templatesCount = enrollTemplatesFromCache().count();
- if (templatesCount == 0)
+ if (m_pin.isEmpty())
{
- // 第一个指纹模板入录时,检查该指纹是否录入过
- QString featureID = isFeatureEnrolled(feature);
- if (featureID.isEmpty())
- {
- saveEnrollTemplateToCache(feature);
- enrollProcessRetry();
- }
- else
- {
- notifyEnrollProcess(ENROLL_PROCESS_REPEATED_ENROLL, featureID);
- internalStopEnroll();
- }
- }
- else if (templatesCount < needTemplatesCountForEnroll())
- {
- // 判断录入时是否录的是同一根手指
- int matchResult = templateMatch(m_enrollTemplates.value(0), feature);
- if (matchResult == GENERAL_RESULT_OK)
- {
- saveEnrollTemplateToCache(feature);
- }
- else
- {
- notifyEnrollProcess(ENROLL_PROCESS_INCONSISTENT_FEATURE);
- }
- enrollProcessRetry();
- }
- else if (enrollTemplatesFromCache().count() == needTemplatesCountForEnroll())
- {
- enrollTemplateMerge();
- }
-}
-
-void AuthDevice::doingIdentifyProcess(QByteArray feature)
-{
- if (!m_doIdentify)
- {
- KLOG_DEBUG() << "device busy";
- return;
- }
- if (feature.isEmpty())
- {
- acquireFeatureFail();
+ message = tr("The pin code cannot be empty!");
+ Q_EMIT m_dbusAdaptor->IdentifyStatus("", IDENTIFY_RESULT_NOT_MATCH, message);
+ KLOG_ERROR() << message;
return;
}
-
- QString featureID = identifyFeature(feature, m_identifyIDs);
- if (!featureID.isEmpty())
- {
- notifyIdentifyProcess(IDENTIFY_PROCESS_MACTCH,featureID);
- }
else
{
- notifyIdentifyProcess(IDENTIFY_PROCESS_NO_MATCH);
+ setDeviceStatus(DEVICE_STATUS_DOING_IDENTIFY);
+ doingUKeyIdentifyStart(m_pin);
+ m_serviceWatcher->addWatchedService(dbusMessage.service());
+ auto replyMessage = dbusMessage.createReply();
+ QDBusConnection::systemBus().send(replyMessage);
}
+}
+
+CHECK_AUTH_WITH_1ARGS(AuthDevice, EnrollStart, onEnrollStart, AUTH_USER_ADMIN, const QString&)
+CHECK_AUTH_WITH_1ARGS(AuthDevice, IdentifyStart, onIdentifyStart, AUTH_USER_ADMIN, const QString&)
+CHECK_AUTH(AuthDevice, EnrollStop, onEnrollStop, AUTH_USER_ADMIN)
+CHECK_AUTH(AuthDevice, IdentifyStop, onIdentifyStop, AUTH_USER_ADMIN)
- internalStopIdentify();
+QStringList AuthDevice::GetFeatureIDList()
+{
+ QStringList featureIDs = FeatureDB::getInstance()->getFeatureIDs(m_idVendor, m_idProduct);
+ return featureIDs;
}
void AuthDevice::internalStopEnroll()
@@ -328,7 +327,6 @@ void AuthDevice::internalStopEnroll()
if (deviceStatus() == DEVICE_STATUS_DOING_ENROLL)
{
acquireFeatureStop();
- m_doEnroll = false;
m_enrollTemplates.clear();
setDeviceStatus(DEVICE_STATUS_IDLE);
clearWatchedServices();
@@ -341,7 +339,6 @@ void AuthDevice::internalStopIdentify()
if (deviceStatus() == DEVICE_STATUS_DOING_IDENTIFY)
{
acquireFeatureStop();
- m_doIdentify = false;
m_identifyIDs.clear();
setDeviceStatus(DEVICE_STATUS_IDLE);
clearWatchedServices();
@@ -349,28 +346,15 @@ void AuthDevice::internalStopIdentify()
}
}
-void AuthDevice::enrollProcessRetry()
-{
- Q_EMIT this->retry();
-}
-
-void AuthDevice::saveEnrollTemplateToCache(QByteArray enrollTemplate)
+void AuthDevice::handleAcquiredFeature()
{
- if (!enrollTemplate.isEmpty())
+ QByteArray feature = m_futureWatcher->result();
+ if (feature.isEmpty())
{
- m_enrollTemplates << enrollTemplate;
- KLOG_DEBUG() << "enroll template:" << enrollTemplate;
- notifyEnrollProcess(ENROLL_PROCESS_PASS);
+ acquireFeatureFail();
+ return;
}
-}
-
-QByteArrayList AuthDevice::enrollTemplatesFromCache()
-{
- return m_enrollTemplates;
-}
-void AuthDevice::handleAcquiredFeature()
-{
switch (deviceStatus())
{
case DEVICE_STATUS_DOING_ENROLL:
diff --git a/src/device/auth-device.h b/src/device/auth-device.h
index 03997bc..0d9a9c8 100644
--- a/src/device/auth-device.h
+++ b/src/device/auth-device.h
@@ -14,7 +14,6 @@
#pragma once
-// #include "auth_device_adaptor.h"
#include <QDBusContext>
#include <QDBusObjectPath>
#include <QDBusServiceWatcher>
@@ -22,12 +21,13 @@
#include <QObject>
#include "auth-enum.h"
#include "kiran-auth-device-i.h"
+#include <QSharedPointer>
class AuthDeviceAdaptor;
namespace Kiran
{
-typedef void* Handle;
+typedef void *Handle;
class BDriver;
class AuthDevice : public QObject, protected QDBusContext
@@ -40,19 +40,21 @@ class AuthDevice : public QObject, protected QDBusContext
public:
explicit AuthDevice(QObject *parent = nullptr);
+
virtual ~AuthDevice();
bool init();
virtual bool initDevice() = 0;
virtual BDriver *getDriver() = 0;
- QDBusObjectPath getObjectPath() { return m_objectPath; };
+ QDBusObjectPath getObjectPath() { return m_objectPath; };
QString deviceID() { return m_deviceID; };
QString deviceDriver() { return m_deviceDriver; };
int deviceType() { return m_deviceType; };
int deviceStatus() { return m_deviceStatus; }
-
QString deviceName() { return m_deviceName; };
+ DeviceInfo deviceInfo();
+
void setDeviceType(DeviceType deviceType);
void setDeviceStatus(DeviceStatus deviceStatus);
void setDeviceName(const QString &deviceName);
@@ -71,24 +73,6 @@ protected:
virtual void acquireFeatureStop() = 0;
virtual void acquireFeatureFail() = 0;
- virtual void doingEnrollProcess(QByteArray feature);
- virtual void doingIdentifyProcess(QByteArray feature);
-
- virtual void enrollProcessFail(const QString &featureID){};
- virtual void enrollProcessRetry();
- virtual void enrollTemplateMerge() = 0;
-
- virtual QString isFeatureEnrolled(QByteArray fpTemplate) = 0;
- virtual QString identifyFeature(QByteArray feature, QStringList featureIDs) = 0;
- virtual int templateMatch(QByteArray fpTemplate1, QByteArray fpTemplate2) = 0;
-
- virtual void saveEnrollTemplateToCache(QByteArray enrollTemplate);
- QByteArrayList enrollTemplatesFromCache();
-
- virtual void notifyEnrollProcess(EnrollProcess process, const QString &featureID = QString()) = 0;
- virtual void notifyIdentifyProcess(IdentifyProcess process, const QString &featureID = QString()) = 0;
- virtual int needTemplatesCountForEnroll() = 0;
-
private Q_SLOTS:
void onNameLost(const QString &serviceName);
void handleAcquiredFeature();
@@ -96,8 +80,8 @@ private Q_SLOTS:
protected:
void clearWatchedServices();
- void internalStopEnroll();
- void internalStopIdentify();
+ virtual void internalStopEnroll();
+ virtual void internalStopIdentify();
private:
void registerDBusObject();
@@ -106,33 +90,42 @@ private:
void onEnrollStart(const QDBusMessage &message, const QString &extraInfo);
void onEnrollStop(const QDBusMessage &message);
+ void onBioEnrollStart(const QDBusMessage &dbusMessage);
+ void onUKeyEnrollStart(const QDBusMessage &dbusMessage, QJsonValue jsonValue);
+
void onIdentifyStart(const QDBusMessage &message, const QString &value);
void onIdentifyStop(const QDBusMessage &message);
+ void onBioIdentifyStart(const QDBusMessage &dbusMessage);
+ void onUKeyIdentifyStart(const QDBusMessage &dbusMessage, QJsonValue jsonValue);
+
+ virtual void doingEnrollProcess(QByteArray feature){};
+ virtual void doingIdentifyProcess(QByteArray feature){};
+
+ virtual void doingUKeyEnrollStart(const QString &pin, bool rebinding = false){};
+ virtual void doingUKeyIdentifyStart(const QString &pin){};
Q_SIGNALS:
void retry();
protected:
- QString m_deviceID;
QString m_deviceDriver;
+ QSharedPointer<AuthDeviceAdaptor> m_dbusAdaptor;
+ bool m_doAcquire = true;
+ QStringList m_identifyIDs;
+ QByteArrayList m_enrollTemplates;
+ QSharedPointer<QFutureWatcher<QByteArray>> m_futureWatcher;
+ QString m_pin;
+
+private:
+ QString m_deviceID;
int m_deviceType;
int m_deviceStatus;
QString m_deviceName;
QString m_idVendor;
QString m_idProduct;
QDBusObjectPath m_objectPath;
- QDBusServiceWatcher *m_serviceWatcher;
- AuthDeviceAdaptor *m_dbusAdaptor;
+ QSharedPointer<QDBusServiceWatcher> m_serviceWatcher;
- bool m_doAcquire = true;
- bool m_doIdentify = true;
- bool m_doEnroll = true;
- QStringList m_identifyIDs;
- QByteArrayList m_enrollTemplates;
-
- QFutureWatcher<QByteArray> *m_futureWatcher;
-
-private:
/**
* 用于注册com.kylinsec.Kiran.AuthDevice.Device服务时的编号
* 在生成AuthDevice对象注册dbus服务成功后数值加1
diff --git a/src/device/bio-device.cpp b/src/device/bio-device.cpp
new file mode 100644
index 0000000..7342928
--- /dev/null
+++ b/src/device/bio-device.cpp
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-biometrics is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ *
+ * Author: luoqing <luoqing@kylinsec.com.cn>
+ */
+
+#include "bio-device.h"
+#include <qt5-log-i.h>
+namespace Kiran
+{
+BioDevice::BioDevice(QObject *parent) : AuthDevice{parent}
+{
+}
+
+BioDevice::~BioDevice()
+{
+}
+
+void BioDevice::doingEnrollProcess(QByteArray feature)
+{
+ int templatesCount = enrollTemplatesFromCache().count();
+ if (templatesCount == 0)
+ {
+ // 第一个指纹模板入录时,检查该指纹是否录入过
+ QString featureID = isFeatureEnrolled(feature);
+ if (featureID.isEmpty())
+ {
+ saveEnrollTemplateToCache(feature);
+ enrollProcessRetry();
+ }
+ else
+ {
+ notifyEnrollProcess(ENROLL_PROCESS_REPEATED_ENROLL, featureID);
+ internalStopEnroll();
+ }
+ }
+ else if (templatesCount < mergeTemplateCount())
+ {
+ // 判断录入时是否录的是同一根手指
+ int matchResult = templateMatch(m_enrollTemplates.value(0), feature);
+ if (matchResult == GENERAL_RESULT_OK)
+ {
+ saveEnrollTemplateToCache(feature);
+ }
+ else
+ {
+ notifyEnrollProcess(ENROLL_PROCESS_INCONSISTENT_FEATURE);
+ }
+ enrollProcessRetry();
+ }
+ else if (enrollTemplatesFromCache().count() == mergeTemplateCount())
+ {
+ enrollTemplateMerge();
+ }
+}
+
+void BioDevice::doingIdentifyProcess(QByteArray feature)
+{
+ QString featureID = identifyFeature(feature, m_identifyIDs);
+ if (!featureID.isEmpty())
+ {
+ notifyIdentifyProcess(IDENTIFY_PROCESS_MACTCH, featureID);
+ }
+ else
+ {
+ notifyIdentifyProcess(IDENTIFY_PROCESS_NO_MATCH);
+ }
+
+ internalStopIdentify();
+}
+QByteArrayList BioDevice::enrollTemplatesFromCache()
+{
+ return m_enrollTemplates;
+}
+
+void BioDevice::saveEnrollTemplateToCache(QByteArray enrollTemplate)
+{
+ if (!enrollTemplate.isEmpty())
+ {
+ m_enrollTemplates << enrollTemplate;
+ KLOG_DEBUG() << "enroll template:" << enrollTemplate;
+ notifyEnrollProcess(ENROLL_PROCESS_PASS);
+ }
+}
+
+void BioDevice::enrollProcessRetry()
+{
+ Q_EMIT this->retry();
+}
+
+QString BioDevice::isFeatureEnrolled(QByteArray fpTemplate)
+{
+ return identifyFeature(fpTemplate, QStringList());
+}
+
+} // namespace Kiran
\ No newline at end of file
diff --git a/src/device/bio-device.h b/src/device/bio-device.h
new file mode 100644
index 0000000..c55aa84
--- /dev/null
+++ b/src/device/bio-device.h
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-biometrics is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ *
+ * Author: luoqing <luoqing@kylinsec.com.cn>
+ */
+#pragma once
+#include "auth-device.h"
+
+namespace Kiran
+{
+class BioDevice : public AuthDevice
+{
+ Q_OBJECT
+public:
+ explicit BioDevice(QObject *parent = nullptr);
+ ~BioDevice();
+
+protected:
+ void doingEnrollProcess(QByteArray feature) override;
+ void doingIdentifyProcess(QByteArray feature) override;
+
+ virtual void enrollProcessRetry();
+
+ virtual void enrollTemplateMerge() = 0;
+ virtual int templateMatch(QByteArray fpTemplate1, QByteArray fpTemplate2) = 0;
+ virtual QString identifyFeature(QByteArray feature, QStringList featureIDs) = 0;
+
+ virtual int mergeTemplateCount() = 0;
+ virtual void notifyEnrollProcess(EnrollProcess process, const QString &featureID = QString()) = 0;
+ virtual void notifyIdentifyProcess(IdentifyProcess process, const QString &featureID = QString()) = 0;
+
+ QByteArrayList enrollTemplatesFromCache();
+ virtual void saveEnrollTemplateToCache(QByteArray enrollTemplate);
+
+private:
+ virtual QString isFeatureEnrolled(QByteArray fpTemplate);
+};
+
+} // namespace Kiran
diff --git a/src/device/finger-vein/fv-sd-device.cpp b/src/device/finger-vein/fv-sd-device.cpp
index 43faad7..5ae6605 100644
--- a/src/device/finger-vein/fv-sd-device.cpp
+++ b/src/device/finger-vein/fv-sd-device.cpp
@@ -111,7 +111,7 @@ struct DriverLib
TGSetDevLedFunc TGSetDevLed;
};
-FVSDDevice::FVSDDevice(QObject *parent) : AuthDevice{parent},
+FVSDDevice::FVSDDevice(QObject *parent) : BioDevice{parent},
m_driverLib(nullptr),
m_libProcessHandle(nullptr),
m_libComHandle(nullptr)
@@ -125,17 +125,10 @@ FVSDDevice::~FVSDDevice()
if (!deviceID().isEmpty())
{
acquireFeatureStop();
- m_futureWatcher->deleteLater();
KLOG_DEBUG() << "TGGetDevStatus():" << m_driverLib->TGGetDevStatus();
m_driverLib->TGCloseDev();
}
- if (m_driverLib)
- {
- delete m_driverLib;
- m_driverLib = nullptr;
- }
-
if (m_libComHandle)
{
dlclose(m_libComHandle);
@@ -166,7 +159,7 @@ bool FVSDDevice::loadLib()
return false;
}
- m_driverLib = new DriverLib;
+ m_driverLib = QSharedPointer<DriverLib>(new DriverLib);
m_driverLib->TGInitFVProcess = (TGInitFVProcessFunc)dlsym(m_libProcessHandle, "TGInitFVProcess");
m_driverLib->TGImgExtractFeatureVerify = (TGImgExtractFeatureVerifyFunc)dlsym(m_libProcessHandle, "TGImgExtractFeatureVerify");
m_driverLib->TGFeaturesFusionTmpl = (TGFeaturesFusionTmplFunc)dlsym(m_libProcessHandle, "TGFeaturesFusionTmpl");
@@ -221,11 +214,11 @@ bool FVSDDevice::initDevice()
}
KLOG_DEBUG() << "Device opened successfully:" << ret;
- ret = m_driverLib->TGGetDevFW(fw);
+ m_driverLib->TGGetDevFW(fw);
KLOG_DEBUG() << "Get firmware version:" << fw;
- ret = m_driverLib->TGGetDevSN(sn);
+ m_driverLib->TGGetDevSN(sn);
KLOG_DEBUG() << "Obtain device SN number:" << sn;
- ret = m_driverLib->TGPlayDevVoice(VOICE_VOLUME1);
+ m_driverLib->TGPlayDevVoice(VOICE_VOLUME1);
return true;
}
@@ -291,7 +284,7 @@ QByteArray FVSDDevice::acquireFeature()
void FVSDDevice::acquireFeatureStop()
{
m_driverLib->TGCancelGetImage();
- if (m_futureWatcher != nullptr)
+ if (m_futureWatcher.data() != nullptr)
{
m_futureWatcher->waitForFinished();
}
@@ -357,9 +350,7 @@ void FVSDDevice::enrollTemplateMerge()
{
QString id = QCryptographicHash::hash(mergedTemplate, QCryptographicHash::Md5).toHex();
- DeviceInfo deviceInfo;
- deviceInfo.idVendor = m_idVendor;
- deviceInfo.idProduct = m_idProduct;
+ DeviceInfo deviceInfo = this->deviceInfo();
bool save = FeatureDB::getInstance()->addFeature(id, mergedTemplate, deviceInfo);
if (save)
{
@@ -396,9 +387,10 @@ QString FVSDDevice::identifyFeature(QByteArray feature, QStringList featureIDs)
{
QList<QByteArray> saveList;
QString featureID;
+ DeviceInfo deviceInfo = this->deviceInfo();
if (featureIDs.isEmpty())
{
- saveList = FeatureDB::getInstance()->getFeatures(m_idVendor, m_idProduct);
+ saveList = FeatureDB::getInstance()->getFeatures(deviceInfo.idVendor, deviceInfo.idProduct);
}
else
{
@@ -481,7 +473,7 @@ BDriver *FVSDDevice::getDriver()
return nullptr;
}
-int FVSDDevice::needTemplatesCountForEnroll()
+int FVSDDevice::mergeTemplateCount()
{
return TEMPLATE_FV_NUM;
}
diff --git a/src/device/finger-vein/fv-sd-device.h b/src/device/finger-vein/fv-sd-device.h
index d1fa8c7..09b372b 100644
--- a/src/device/finger-vein/fv-sd-device.h
+++ b/src/device/finger-vein/fv-sd-device.h
@@ -14,7 +14,8 @@
#pragma once
#include <QFutureWatcher>
-#include "device/auth-device.h"
+#include "device/bio-device.h"
+#include <QSharedPointer>
namespace Kiran
{
@@ -25,7 +26,7 @@ enum ExtractFeatureMode
};
struct DriverLib;
-class FVSDDevice : public AuthDevice
+class FVSDDevice : public BioDevice
{
Q_OBJECT
public:
@@ -53,13 +54,14 @@ private:
QByteArray getFeatureFromImage(QByteArray image, ExtractFeatureMode mode);
- int needTemplatesCountForEnroll() override;
+ int mergeTemplateCount() override;
int templateMatch(QByteArray fpTemplate1, QByteArray fpTemplate2) override;
void notifyEnrollProcess(EnrollProcess process, const QString &featureID = QString()) override;
void notifyIdentifyProcess(IdentifyProcess process, const QString &featureID = QString()) override;
private:
- DriverLib *m_driverLib;
+ QSharedPointer<DriverLib> m_driverLib;
+
Handle m_libProcessHandle;
Handle m_libComHandle;
};
diff --git a/src/device/fingerprint/fp-device.cpp b/src/device/fingerprint/fp-device.cpp
index d610844..cddaadd 100644
--- a/src/device/fingerprint/fp-device.cpp
+++ b/src/device/fingerprint/fp-device.cpp
@@ -17,7 +17,7 @@
namespace Kiran
{
FPDevice::FPDevice(QObject *parent)
- : AuthDevice{parent}
+ : BioDevice{parent}
{
}
diff --git a/src/device/fingerprint/fp-device.h b/src/device/fingerprint/fp-device.h
index abbbcd1..7a792ba 100644
--- a/src/device/fingerprint/fp-device.h
+++ b/src/device/fingerprint/fp-device.h
@@ -13,11 +13,11 @@
*/
#pragma once
-#include "device/auth-device.h"
+#include "device/bio-device.h"
namespace Kiran
{
-class FPDevice : public AuthDevice
+class FPDevice : public BioDevice
{
public:
explicit FPDevice(QObject *parent = nullptr);
diff --git a/src/device/fingerprint/fp-zk-device.cpp b/src/device/fingerprint/fp-zk-device.cpp
index 1862446..8236787 100644
--- a/src/device/fingerprint/fp-zk-device.cpp
+++ b/src/device/fingerprint/fp-zk-device.cpp
@@ -140,18 +140,15 @@ FPZKDevice::FPZKDevice(QObject* parent)
FPZKDevice::~FPZKDevice()
{
acquireFeatureStop();
- m_futureWatcher->deleteLater();
if (m_hDBCache)
{
m_driverLib->ZKFPM_DBFree(m_hDBCache);
m_hDBCache = NULL;
}
- if (m_driverLib)
+ if (m_driverLib.data())
{
m_driverLib->ZKFPM_Terminate(); // 释放资源
- delete m_driverLib;
- m_driverLib = nullptr;
}
if (m_libHandle)
@@ -193,7 +190,7 @@ bool FPZKDevice::loadLib()
return false;
}
- m_driverLib = new DriverLib;
+ m_driverLib = QSharedPointer<DriverLib>(new DriverLib);
m_driverLib->ZKFPM_Init = (T_ZKFPM_Init)dlsym(m_libHandle, "ZKFPM_Init");
if (NULL == m_driverLib->ZKFPM_Init)
{
@@ -323,7 +320,7 @@ QByteArray FPZKDevice::acquireFeature()
void FPZKDevice::acquireFeatureStop()
{
m_doAcquire = false;
- if (m_futureWatcher != nullptr)
+ if (m_futureWatcher.data() != nullptr)
{
m_futureWatcher->waitForFinished();
}
@@ -374,18 +371,15 @@ int FPZKDevice::templateMatch(QByteArray fpTemplate1, QByteArray fpTemplate2)
return score > 0 ? GENERAL_RESULT_OK : GENERAL_RESULT_FAIL;
}
-QString FPZKDevice::isFeatureEnrolled(QByteArray fpTemplate)
-{
- return identifyFeature(fpTemplate, QStringList());
-}
QString FPZKDevice::identifyFeature(QByteArray fpTemplate, QStringList featureIDs)
{
QList<QByteArray> saveList;
QString featureID;
+ DeviceInfo info = this->deviceInfo();
if (featureIDs.isEmpty())
{
- saveList = FeatureDB::getInstance()->getFeatures(m_idVendor, m_idProduct);
+ saveList = FeatureDB::getInstance()->getFeatures(info.idVendor, info.idProduct);
}
else
{
@@ -416,9 +410,7 @@ QString FPZKDevice::identifyFeature(QByteArray fpTemplate, QStringList featureID
bool FPZKDevice::saveFPrintTemplate(QByteArray fpTemplate, const QString& featureID)
{
- DeviceInfo deviceInfo;
- deviceInfo.idVendor = m_idVendor;
- deviceInfo.idProduct = m_idProduct;
+ DeviceInfo deviceInfo = this->deviceInfo();
bool save = FeatureDB::getInstance()->addFeature(featureID, fpTemplate, deviceInfo);
return save;
}
@@ -469,7 +461,7 @@ void FPZKDevice::enrollTemplateMerge()
internalStopEnroll();
}
-int FPZKDevice::needTemplatesCountForEnroll()
+int FPZKDevice::mergeTemplateCount()
{
return FP_ZK_MEGER_TEMPLATE_COUNT;
}
diff --git a/src/device/fingerprint/fp-zk-device.h b/src/device/fingerprint/fp-zk-device.h
index 30e4e93..3379e2e 100644
--- a/src/device/fingerprint/fp-zk-device.h
+++ b/src/device/fingerprint/fp-zk-device.h
@@ -14,6 +14,7 @@
#pragma once
#include <QFutureWatcher>
+#include <QSharedPointer>
#include "auth-enum.h"
#include "fp-device.h"
@@ -39,8 +40,8 @@ private:
void acquireFeatureStop() override;
void acquireFeatureFail() override;
void enrollTemplateMerge() override;
- int needTemplatesCountForEnroll() override;
- QString isFeatureEnrolled(QByteArray fpTemplate) override;
+ int mergeTemplateCount() override;
+
void notifyEnrollProcess(EnrollProcess process, const QString& featureID = QString()) override;
void notifyIdentifyProcess(IdentifyProcess process, const QString& featureID = QString()) override;
@@ -63,6 +64,6 @@ private:
private:
Handle m_libHandle;
Handle m_hDBCache;
- DriverLib* m_driverLib;
+ QSharedPointer<DriverLib> m_driverLib;
};
} // namespace Kiran
diff --git a/src/device/ukey/ukey-ft-device.cpp b/src/device/ukey/ukey-ft-device.cpp
new file mode 100644
index 0000000..38017c6
--- /dev/null
+++ b/src/device/ukey/ukey-ft-device.cpp
@@ -0,0 +1,400 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-biometrics is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ *
+ * Author: luoqing <luoqing@kylinsec.com.cn>
+ */
+
+#include "ukey-ft-device.h"
+#include <dlfcn.h>
+#include <qt5-log-i.h>
+#include <QCryptographicHash>
+#include "auth-enum.h"
+#include "auth_device_adaptor.h"
+#include "feature-db.h"
+
+namespace Kiran
+{
+#define FT_UKEY_DRIVER_LIB "libes_3000gm.so"
+#define UKEY_APP_NAME "KIRAN-AUTHENTICATION-DEVICES"
+#define UKEY_CONTAINER_NAME "1003-3001"
+
+UKeyFTDevice::UKeyFTDevice(QObject *parent) : AuthDevice{parent},
+ m_libHandle(nullptr),
+ m_appHandle(nullptr),
+ m_devHandle(nullptr),
+ m_containerHandle(nullptr)
+{
+ setDeviceType(DEVICE_TYPE_UKey);
+ setDeviceDriver(FT_UKEY_DRIVER_LIB);
+}
+
+UKeyFTDevice::~UKeyFTDevice()
+{
+ m_driver->closeContainer(m_containerHandle);
+ m_driver->closeApplication(m_appHandle);
+ m_driver->disConnectDev(m_devHandle);
+ m_containerHandle = nullptr;
+ m_appHandle = nullptr;
+ m_devHandle = nullptr;
+}
+
+bool UKeyFTDevice::initDevice()
+{
+ m_driver = QSharedPointer<UKeySKFDriver>(new UKeySKFDriver());
+ if (!m_driver->loadLibrary(FT_UKEY_DRIVER_LIB))
+ {
+ return false;
+ }
+ m_devHandle = m_driver->connectDev();
+ if (!m_devHandle)
+ {
+ KLOG_DEBUG() << "";
+ return false;
+ }
+
+ return true;
+}
+
+BDriver *UKeyFTDevice::getDriver()
+{
+ return nullptr;
+}
+
+void UKeyFTDevice::doingUKeyEnrollStart(const QString &pin, bool rebinding)
+{
+ if (rebinding)
+ {
+ ULONG ulReval = m_driver->devAuth(m_devHandle);
+ if (ulReval == SAR_OK)
+ {
+ m_driver->deleteAllApplication(m_devHandle);
+ DeviceInfo deviceInfo = this->deviceInfo();
+ QStringList idList = FeatureDB::getInstance()->getFeatureIDs(deviceInfo.idVendor, deviceInfo.idProduct);
+ Q_FOREACH (auto id, idList)
+ {
+ FeatureDB::getInstance()->deleteFeature(id);
+ }
+ bindingCurrentUser();
+ }
+ else
+ {
+ KLOG_ERROR() << "rebinding failed";
+ }
+ }
+ else
+ {
+ bindingCurrentUser();
+ }
+ internalStopEnroll();
+}
+
+void UKeyFTDevice::bindingCurrentUser()
+{
+ if (isExistPublicKey())
+ {
+ notifyUKeyEnrollProcess(ENROLL_PROCESS_REPEATED_ENROLL);
+ return;
+ }
+
+ ECCPUBLICKEYBLOB publicKey = genKeyPair();
+ if (publicKey.BitLen != 0)
+ {
+ /**
+ * 存入PublicKey,生成FID并返回FIDFID标识PublicKey
+ * 不用保存PublicKey和systemUser的关系,目前只有一个用户
+ */
+ QByteArray keyFeature;
+ QByteArray xCoordinateArray((char *)publicKey.XCoordinate, 64);
+ QByteArray yCoordinateArray((char *)publicKey.YCoordinate, 64);
+ keyFeature.append(publicKey.BitLen);
+ keyFeature.append(xCoordinateArray);
+ keyFeature.append(yCoordinateArray);
+ KLOG_DEBUG() << "keyFeature:" << keyFeature;
+
+ QString featureID = QCryptographicHash::hash(keyFeature, QCryptographicHash::Md5).toHex();
+ DeviceInfo deviceInfo = this->deviceInfo();
+
+ if (FeatureDB::getInstance()->addFeature(featureID, keyFeature, deviceInfo))
+ {
+ notifyUKeyEnrollProcess(ENROLL_PROCESS_SUCCESS, SAR_OK, featureID);
+ }
+ else
+ {
+ KLOG_DEBUG() << "save feature fail";
+ notifyUKeyEnrollProcess(ENROLL_PROCESS_SAVE_FAIL);
+ }
+ }
+ else
+ {
+ notifyUKeyEnrollProcess(ENROLL_PROCESS_SAVE_FAIL);
+ }
+}
+
+bool UKeyFTDevice::isExistPublicKey()
+{
+ DeviceInfo deviceInfo = this->deviceInfo();
+ auto features = FeatureDB::getInstance()->getFeatures(deviceInfo.idVendor, deviceInfo.idProduct);
+ if (features.count() != 0)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+ECCPUBLICKEYBLOB UKeyFTDevice::genKeyPair()
+{
+ ECCPUBLICKEYBLOB publicKey = {0};
+ if (!isExistsApplication(UKEY_APP_NAME))
+ {
+ // NOTE:必须通过设备认证后才能在设备内创建和删除应用
+ ULONG ulReval = m_driver->devAuth(m_devHandle);
+ if (ulReval != SAR_OK)
+ {
+ KLOG_ERROR() << "Device auth failure: " << m_driver->getErrorReason(ulReval);
+ return publicKey;
+ }
+ else
+ {
+ KLOG_DEBUG() << "device auth success";
+ }
+ m_driver->deleteAllApplication(m_devHandle);
+ KLOG_DEBUG() << "m_devHandle:" << m_devHandle;
+ KLOG_DEBUG() << "m_pin:" << m_pin;
+ m_appHandle = m_driver->createApplication(m_devHandle, m_pin, UKEY_APP_NAME);
+ m_containerHandle = m_driver->createContainer(m_appHandle, m_pin, UKEY_CONTAINER_NAME, &m_retryCount);
+ if (!m_appHandle || !m_containerHandle)
+ {
+ return publicKey;
+ }
+ }
+
+ m_appHandle = m_driver->onOpenApplication(m_devHandle, (LPSTR)UKEY_APP_NAME);
+ m_containerHandle = m_driver->onOpenContainer(m_appHandle, m_pin, UKEY_CONTAINER_NAME, &m_retryCount);
+ if (!m_appHandle || !m_containerHandle)
+ {
+ return publicKey;
+ }
+
+ ULONG ret = m_driver->genECCKeyPair(m_containerHandle, &publicKey);
+ if (ret == SAR_OK)
+ {
+ KLOG_DEBUG() << "gen ecc key pair success";
+ }
+ else
+ {
+ KLOG_ERROR() << "gen ecc key pair failed:" << m_driver->getErrorReason(ret);
+ }
+
+ return publicKey;
+}
+
+bool UKeyFTDevice::isExistsApplication(const QString &appName)
+{
+ QString appNames = m_driver->enumApplication(m_devHandle);
+ KLOG_DEBUG() << "enum app names:" << appNames;
+ if (appNames.contains(appName))
+ {
+ return true;
+ }
+ return false;
+}
+
+void UKeyFTDevice::doingUKeyIdentifyStart(const QString &pin)
+{
+ QList<QByteArray> saveList;
+ DeviceInfo deviceInfo = this->deviceInfo();
+ if (m_identifyIDs.isEmpty())
+ {
+ saveList = FeatureDB::getInstance()->getFeatures(deviceInfo.idVendor, deviceInfo.idProduct);
+ }
+ else
+ {
+ Q_FOREACH (auto id, m_identifyIDs)
+ {
+ QByteArray feature = FeatureDB::getInstance()->getFeature(id);
+ if (!feature.isEmpty())
+ saveList << feature;
+ }
+ }
+
+ if (saveList.count() != 0)
+ {
+ for (int j = 0; j < saveList.count(); j++)
+ {
+ auto saveTemplate = saveList.value(j);
+ identifyKeyFeature(saveTemplate);
+ }
+ }
+ else
+ {
+ KLOG_DEBUG() << "no found feature id";
+ }
+
+ internalStopIdentify();
+}
+
+void UKeyFTDevice::internalStopEnroll()
+{
+ if (deviceStatus() == DEVICE_STATUS_DOING_ENROLL)
+ {
+ m_driver->closeContainer(m_containerHandle);
+ m_driver->closeApplication(m_appHandle);
+ acquireFeatureStop();
+ m_enrollTemplates.clear();
+ setDeviceStatus(DEVICE_STATUS_IDLE);
+ clearWatchedServices();
+ KLOG_DEBUG() << "stop Enroll";
+ }
+}
+
+void UKeyFTDevice::internalStopIdentify()
+{
+ if (deviceStatus() == DEVICE_STATUS_DOING_IDENTIFY)
+ {
+ m_driver->closeContainer(m_containerHandle);
+ m_driver->closeApplication(m_appHandle);
+ acquireFeatureStop();
+ m_identifyIDs.clear();
+ setDeviceStatus(DEVICE_STATUS_IDLE);
+ clearWatchedServices();
+ KLOG_DEBUG() << "stopIdentify";
+ }
+}
+
+void UKeyFTDevice::identifyKeyFeature(QByteArray keyFeature)
+{
+ m_appHandle = m_driver->onOpenApplication(m_devHandle, (LPSTR)UKEY_APP_NAME);
+ if (m_appHandle == nullptr)
+ {
+ notifyUKeyIdentifyProcess(IDENTIFY_PROCESS_NO_MATCH);
+ return;
+ }
+
+ m_containerHandle = m_driver->onOpenContainer(m_appHandle, m_pin, UKEY_CONTAINER_NAME, &m_retryCount);
+ if (m_containerHandle == nullptr)
+ {
+ notifyUKeyIdentifyProcess(IDENTIFY_PROCESS_NO_MATCH);
+ return;
+ }
+
+ ECCSIGNATUREBLOB Signature = {0};
+ ULONG ret = m_driver->authSignData(m_containerHandle, m_devHandle, Signature);
+ if (ret != SAR_OK)
+ {
+ KLOG_DEBUG() << "auth sign data failed:" << m_driver->getErrorReason(ret);
+ notifyUKeyIdentifyProcess(IDENTIFY_PROCESS_NO_MATCH, ret);
+ return;
+ }
+
+ ECCPUBLICKEYBLOB eccPubKey;
+ eccPubKey.BitLen = keyFeature.left(1).at(0);
+ auto xCoordinateArray = keyFeature.mid(1, sizeof(eccPubKey.XCoordinate));
+ auto yCoordinateArray = keyFeature.mid(sizeof(eccPubKey.XCoordinate) + 1);
+
+ memcpy(eccPubKey.XCoordinate, (unsigned char *)xCoordinateArray.data(), ECC_MAX_XCOORDINATE_BITS_LEN / 8);
+ memcpy(eccPubKey.YCoordinate, (unsigned char *)yCoordinateArray.data(), ECC_MAX_YCOORDINATE_BITS_LEN / 8);
+
+ ret = m_driver->verifyData(m_devHandle, Signature, eccPubKey);
+ if (ret != SAR_OK)
+ {
+ KLOG_DEBUG() << "verify data failed:" << m_driver->getErrorReason(ret);
+ notifyUKeyIdentifyProcess(IDENTIFY_PROCESS_NO_MATCH, ret);
+ }
+ else
+ {
+ notifyUKeyIdentifyProcess(IDENTIFY_PROCESS_MACTCH);
+ }
+}
+
+QByteArray UKeyFTDevice::acquireFeature()
+{
+ return QByteArray();
+}
+
+void UKeyFTDevice::acquireFeatureStop()
+{
+}
+void UKeyFTDevice::acquireFeatureFail()
+{
+}
+
+void UKeyFTDevice::notifyUKeyEnrollProcess(EnrollProcess process, ULONG error, const QString &featureID)
+{
+ QString message;
+ switch (process)
+ {
+ case ENROLL_PROCESS_SUCCESS:
+ message = tr("Successed binding user");
+ Q_EMIT m_dbusAdaptor->EnrollStatus(featureID, 100, ENROLL_RESULT_COMPLETE, message);
+ break;
+ case ENROLL_PROCESS_SAVE_FAIL:
+ message = tr("Binding user failed");
+ Q_EMIT m_dbusAdaptor->EnrollStatus("", 0, ENROLL_RESULT_FAIL, message);
+ break;
+ case ENROLL_PROCESS_REPEATED_ENROLL:
+ message = tr("UKey has been bound");
+ Q_EMIT m_dbusAdaptor->EnrollStatus("", 0, ENROLL_RESULT_UKEY_EXIST_BINDING, message);
+ default:
+ break;
+ }
+ if (!message.isEmpty())
+ {
+ if (!featureID.isEmpty())
+ {
+ KLOG_DEBUG() << QString("%1, feature id:%2").arg(message).arg(featureID);
+ }
+ else
+ {
+ KLOG_DEBUG() << message;
+ }
+ }
+}
+
+void UKeyFTDevice::notifyUKeyIdentifyProcess(IdentifyProcess process, ULONG error, const QString &featureID)
+{
+ QString message, reason;
+ if (error != SAR_OK)
+ {
+ reason = m_driver->getErrorReason(error);
+ KLOG_DEBUG() << "fail reason:" << reason;
+ }
+
+ KLOG_DEBUG() << "m_retryCount:" << m_retryCount;
+ switch (process)
+ {
+ case IDENTIFY_PROCESS_NO_MATCH:
+ message = tr("identify fail!");
+ // 目前只需要返回有关pin码的错误信息
+ if (reason.contains("pin"))
+ {
+ message.append(reason);
+ }
+ message.append(QString(",remaining retry count: %1").arg(m_retryCount));
+ Q_EMIT m_dbusAdaptor->IdentifyStatus("", IDENTIFY_RESULT_NOT_MATCH, message);
+ break;
+ case IDENTIFY_PROCESS_MACTCH:
+ message = tr("identify ukey success");
+ Q_EMIT m_dbusAdaptor->IdentifyStatus(featureID, IDENTIFY_RESULT_MATCH, message);
+ break;
+ default:
+ break;
+ }
+
+ if (!message.isEmpty())
+ {
+ KLOG_DEBUG() << QString("%1, feature id:%2").arg(message).arg(featureID);
+ }
+}
+
+} // namespace Kiran
diff --git a/src/device/ukey/ukey-ft-device.h b/src/device/ukey/ukey-ft-device.h
new file mode 100644
index 0000000..901393b
--- /dev/null
+++ b/src/device/ukey/ukey-ft-device.h
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-biometrics is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ *
+ * Author: luoqing <luoqing@kylinsec.com.cn>
+ */
+
+#pragma once
+#include <stdint.h>
+#include "device/auth-device.h"
+#include "driver/ukey/ukey-skf-driver.h"
+#include "ukey-skf.h"
+#include <QSharedPointer>
+
+namespace Kiran
+{
+struct DriverLib;
+
+class UKeyFTDevice : public AuthDevice
+{
+ Q_OBJECT
+public:
+ explicit UKeyFTDevice(QObject *parent = nullptr);
+ ~UKeyFTDevice();
+
+ bool initDevice() override;
+ BDriver *getDriver() override;
+
+private:
+ void doingUKeyEnrollStart(const QString &pin, bool rebinding = false) override;
+ void doingUKeyIdentifyStart(const QString &pin) override;
+
+ void internalStopEnroll() override;
+ void internalStopIdentify() override;
+
+ void identifyKeyFeature(QByteArray keyFeature);
+
+ bool isExistPublicKey();
+ void bindingCurrentUser();
+ ECCPUBLICKEYBLOB genKeyPair();
+
+ bool isExistsApplication(const QString &appName);
+
+ void notifyUKeyEnrollProcess(EnrollProcess process, ULONG error = SAR_OK, const QString &featureID = QString());
+ void notifyUKeyIdentifyProcess(IdentifyProcess process, ULONG error = SAR_OK, const QString &featureID = QString());
+
+ QByteArray acquireFeature() override;
+ void acquireFeatureStop() override;
+ void acquireFeatureFail() override;
+
+private:
+ Handle m_libHandle;
+ DEVHANDLE m_devHandle;
+ HAPPLICATION m_appHandle;
+ HCONTAINER m_containerHandle;
+ ULONG m_retryCount = 1000000;
+
+ QSharedPointer<UKeySKFDriver> m_driver;
+};
+
+} // namespace Kiran
diff --git a/src/driver/ukey/ukey-skf-driver.cpp b/src/driver/ukey/ukey-skf-driver.cpp
new file mode 100644
index 0000000..b81bda4
--- /dev/null
+++ b/src/driver/ukey/ukey-skf-driver.cpp
@@ -0,0 +1,516 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-biometrics is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ *
+ * Author: luoqing <luoqing@kylinsec.com.cn>
+ */
+#include "ukey-skf-driver.h"
+#include <dlfcn.h>
+#include <qt5-log-i.h>
+#include <QFile>
+#include <QSettings>
+
+namespace Kiran
+{
+// 签名者ID
+#define CONF_DEFAULT_KEY_PUC_ID "PucId"
+#define CONF_DEFAULT_KEY_DEV_KEY "DevKey"
+
+#define CONF_DEFAULT_KEY_ADMIN_PINCODE "AdminPinCode"
+#define CONF_DEFAULT_KEY_USER_PINCODE "UserPinCode"
+
+#define SIGN_DATA "kiran-authentication-devices"
+
+#define UKEY_DEFAULT_CONFIG "/etc/kiran-authentication-devices-sdk/ukey-skf.conf"
+#define ADMIN_PIN_RETRY_COUNT 10
+#define USER_PIN_RETRY_COUNT 10
+
+extern "C"
+{
+ typedef ULONG (*SKF_EnumDev_Func)(BOOL bPresent, LPSTR szNameList, ULONG *pulSize);
+ typedef ULONG (*SKF_ConnectDev_Func)(LPSTR szName, DEVHANDLE *phDev);
+ typedef ULONG (*SKF_DisConnectDev_Func)(DEVHANDLE hDev);
+ typedef ULONG (*SKF_GetDevState_Func)(LPSTR szDevName, ULONG *pulDevState);
+ typedef ULONG (*SKF_GetDevInfo_Func)(DEVHANDLE hDev, DEVINFO *pDevInfo);
+ typedef ULONG (*SKF_SetLabel_Func)(DEVHANDLE hDev, LPSTR szLabel);
+ typedef ULONG (*SKF_OpenApplication_Func)(DEVHANDLE hDev, LPSTR szAppName, HAPPLICATION *phApplication);
+ typedef ULONG (*SKF_VerifyPIN_Func)(HAPPLICATION hApplication, ULONG ulPINType, LPSTR szPIN, ULONG *pulRetryCount);
+ typedef ULONG (*SKF_OpenContainer_Func)(HAPPLICATION hApplication, LPSTR szContainerName, HCONTAINER *phContainer);
+ typedef ULONG (*SKF_GenECCKeyPair_Func)(HCONTAINER hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pBlob);
+ typedef ULONG (*SKF_CloseContainer_Func)(HCONTAINER hContainer);
+ typedef ULONG (*SKF_CloseApplication_Func)(HAPPLICATION hApplication);
+ typedef ULONG (*SKF_CreateApplication_Func)(DEVHANDLE hDev, LPSTR szAppName, LPSTR szAdminPin,
+ DWORD dwAdminPinRetryCount, LPSTR szUserPin, DWORD dwUserPinRetryCount,
+ DWORD dwCreateFileRights, HAPPLICATION *phApplication);
+
+ typedef ULONG (*SKF_EnumApplication_Func)(DEVHANDLE hDev, LPSTR szAppName, ULONG *pulSize);
+ typedef ULONG (*SKF_ExportPublicKey_Func)(HCONTAINER hContainer, BOOL bSignFlag, BYTE *pbBlob, ULONG *pulBlobLen);
+ typedef ULONG (*SKF_Digest_Func)(HANDLE hHash, BYTE *pbData, ULONG ulDataLen, BYTE *pbHashData, ULONG *pulHashLen);
+ typedef ULONG (*SKF_DigestInit_Func)(DEVHANDLE hDev, ULONG ulAlgID, ECCPUBLICKEYBLOB *pPubKey,
+ unsigned char *pucID, ULONG ulIDLen, HANDLE *phHash);
+ typedef ULONG (*SKF_ECCSignData_Func)(HCONTAINER hContainer, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature);
+ typedef ULONG (*SKF_ECCVerify_Func)(DEVHANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbData,
+ ULONG ulDataLen, PECCSIGNATUREBLOB pSignature);
+
+ typedef ULONG (*SKF_GenRandom_Func)(DEVHANDLE hDev, BYTE *pbRandom, ULONG ulRandomLen);
+ typedef ULONG (*SKF_SetSymmKey_Func)(DEVHANDLE hDev, BYTE *pbKey, ULONG ulAlgID, HANDLE *phKey);
+ typedef ULONG (*SKF_EncryptInit_Func)(HANDLE hKey, BLOCKCIPHERPARAM EncryptParam);
+ typedef ULONG (*SKF_Encrypt_Func)(HANDLE hKey, BYTE *pbData, ULONG ulDataLen, BYTE *pbEncryptedData, ULONG *pulEncryptedLen);
+ typedef ULONG (*SKF_DevAuth_Func)(DEVHANDLE hDev, BYTE *pbAuthData, ULONG ulLen);
+ typedef ULONG (*SKF_DeleteApplication_Func)(DEVHANDLE hDev, LPSTR szAppName);
+ typedef ULONG (*SKF_CreateContainer_Func)(HAPPLICATION hApplication, LPSTR szContainerName, HCONTAINER *phContainer);
+}
+
+struct DriverLib
+{
+ SKF_EnumDev_Func SKF_EnumDev;
+ SKF_ConnectDev_Func SKF_ConnectDev;
+ SKF_DisConnectDev_Func SKF_DisConnectDev;
+ SKF_GetDevState_Func SKF_GetDevState;
+ SKF_GetDevInfo_Func SKF_GetDevInfo;
+ SKF_SetLabel_Func SKF_SetLabel;
+ SKF_OpenApplication_Func SKF_OpenApplication;
+ SKF_VerifyPIN_Func SKF_VerifyPIN;
+ SKF_OpenContainer_Func SKF_OpenContainer;
+ SKF_GenECCKeyPair_Func SKF_GenECCKeyPair;
+ SKF_CloseContainer_Func SKF_CloseContainer;
+ SKF_CloseApplication_Func SKF_CloseApplication;
+ SKF_CreateApplication_Func SKF_CreateApplication;
+ SKF_EnumApplication_Func SKF_EnumApplication;
+ SKF_ExportPublicKey_Func SKF_ExportPublicKey;
+ SKF_Digest_Func SKF_Digest;
+ SKF_DigestInit_Func SKF_DigestInit;
+ SKF_ECCSignData_Func SKF_ECCSignData;
+ SKF_ECCVerify_Func SKF_ECCVerify;
+ SKF_GenRandom_Func SKF_GenRandom;
+ SKF_SetSymmKey_Func SKF_SetSymmKey;
+ SKF_EncryptInit_Func SKF_EncryptInit;
+ SKF_Encrypt_Func SKF_Encrypt;
+ SKF_DevAuth_Func SKF_DevAuth;
+ SKF_DeleteApplication_Func SKF_DeleteApplication;
+ SKF_CreateContainer_Func SKF_CreateContainer;
+};
+
+UKeySKFDriver::UKeySKFDriver(QObject *parent) : BDriver(parent)
+{
+}
+
+UKeySKFDriver::~UKeySKFDriver()
+{
+ if (m_libHandle)
+ {
+ dlclose(m_libHandle);
+ m_libHandle = NULL;
+ }
+}
+
+QString UKeySKFDriver::getName()
+{
+ return QString();
+}
+QString UKeySKFDriver::getFullName()
+{
+ return QString();
+}
+quint16 UKeySKFDriver::getDriverId()
+{
+ return 0;
+}
+
+bool UKeySKFDriver::loadLibrary(QString libPath)
+{
+ if (!QFile::exists(UKEY_DEFAULT_CONFIG))
+ {
+ return false;
+ }
+
+ m_libHandle = dlopen(libPath.toStdString().c_str(), RTLD_NOW);
+ if (m_libHandle == nullptr)
+ {
+ KLOG_ERROR() << "Load ukey lib failed,error:" << dlerror();
+ return false;
+ }
+
+ m_driverLib = QSharedPointer<DriverLib>(new DriverLib);
+ m_driverLib->SKF_EnumDev = (SKF_EnumDev_Func)dlsym(m_libHandle, "SKF_EnumDev");
+ m_driverLib->SKF_ConnectDev = (SKF_ConnectDev_Func)dlsym(m_libHandle, "SKF_ConnectDev");
+ m_driverLib->SKF_DisConnectDev = (SKF_DisConnectDev_Func)dlsym(m_libHandle, "SKF_DisConnectDev");
+ m_driverLib->SKF_GetDevState = (SKF_GetDevState_Func)dlsym(m_libHandle, "SKF_GetDevState");
+ m_driverLib->SKF_GetDevInfo = (SKF_GetDevInfo_Func)dlsym(m_libHandle, "SKF_GetDevInfo");
+ m_driverLib->SKF_SetLabel = (SKF_SetLabel_Func)dlsym(m_libHandle, "SKF_SetLabel");
+ m_driverLib->SKF_OpenApplication = (SKF_OpenApplication_Func)dlsym(m_libHandle, "SKF_OpenApplication");
+ m_driverLib->SKF_VerifyPIN = (SKF_VerifyPIN_Func)dlsym(m_libHandle, "SKF_VerifyPIN");
+ m_driverLib->SKF_OpenContainer = (SKF_OpenContainer_Func)dlsym(m_libHandle, "SKF_OpenContainer");
+ m_driverLib->SKF_GenECCKeyPair = (SKF_GenECCKeyPair_Func)dlsym(m_libHandle, "SKF_GenECCKeyPair");
+ m_driverLib->SKF_CloseContainer = (SKF_CloseContainer_Func)dlsym(m_libHandle, "SKF_CloseContainer");
+ m_driverLib->SKF_CloseApplication = (SKF_CloseApplication_Func)dlsym(m_libHandle, "SKF_CloseApplication");
+ m_driverLib->SKF_CreateApplication = (SKF_CreateApplication_Func)dlsym(m_libHandle, "SKF_CreateApplication");
+ m_driverLib->SKF_EnumApplication = (SKF_EnumApplication_Func)dlsym(m_libHandle, "SKF_EnumApplication");
+ m_driverLib->SKF_ExportPublicKey = (SKF_ExportPublicKey_Func)dlsym(m_libHandle, "SKF_ExportPublicKey");
+ m_driverLib->SKF_Digest = (SKF_Digest_Func)dlsym(m_libHandle, "SKF_Digest");
+ m_driverLib->SKF_DigestInit = (SKF_DigestInit_Func)dlsym(m_libHandle, "SKF_DigestInit");
+ m_driverLib->SKF_ECCSignData = (SKF_ECCSignData_Func)dlsym(m_libHandle, "SKF_ECCSignData");
+ m_driverLib->SKF_ECCVerify = (SKF_ECCVerify_Func)dlsym(m_libHandle, "SKF_ECCVerify");
+ m_driverLib->SKF_GenRandom = (SKF_GenRandom_Func)dlsym(m_libHandle, "SKF_GenRandom");
+ m_driverLib->SKF_SetSymmKey = (SKF_SetSymmKey_Func)dlsym(m_libHandle, "SKF_SetSymmKey");
+ m_driverLib->SKF_EncryptInit = (SKF_EncryptInit_Func)dlsym(m_libHandle, "SKF_EncryptInit");
+ m_driverLib->SKF_Encrypt = (SKF_Encrypt_Func)dlsym(m_libHandle, "SKF_Encrypt");
+ m_driverLib->SKF_DevAuth = (SKF_DevAuth_Func)dlsym(m_libHandle, "SKF_DevAuth");
+ m_driverLib->SKF_DeleteApplication = (SKF_DeleteApplication_Func)dlsym(m_libHandle, "SKF_DeleteApplication");
+ m_driverLib->SKF_CreateContainer = (SKF_CreateContainer_Func)dlsym(m_libHandle, "SKF_CreateContainer");
+
+ return true;
+}
+
+DEVHANDLE UKeySKFDriver::connectDev()
+{
+ ULONG ulBufSize = 0;
+ ULONG ulReval = m_driverLib->SKF_EnumDev(TRUE, NULL, &ulBufSize);
+
+ if (ulReval != SAR_OK)
+ {
+ KLOG_DEBUG() << "Enum Dev error:" << getErrorReason(ulReval);
+ return nullptr;
+ }
+
+ LPSTR szNameList = (LPSTR)malloc(ulBufSize * sizeof(CHAR));
+ memset(szNameList, '\0', ulBufSize);
+ ulReval = m_driverLib->SKF_EnumDev(TRUE, szNameList, &ulBufSize);
+ if (ulReval == SAR_OK)
+ {
+ LPSTR pszTemp = szNameList;
+ if (NULL == pszTemp)
+ {
+ KLOG_DEBUG() << "no found ukey device";
+ return nullptr;
+ }
+ while (*pszTemp != '\0')
+ {
+ DEVHANDLE devHandle;
+ ulReval = m_driverLib->SKF_ConnectDev(pszTemp, &devHandle);
+ if (SAR_OK == ulReval)
+ {
+ return devHandle;
+ }
+ else
+ {
+ KLOG_ERROR() << "Connect Dev failed:" << getErrorReason(ulReval);
+ }
+ pszTemp += strlen((const char *)pszTemp) + 1;
+ }
+ }
+ free(szNameList);
+ return nullptr;
+}
+
+void UKeySKFDriver::deleteAllApplication(DEVHANDLE devHandle)
+{
+ ULONG ulReval = SAR_FAIL;
+ char szAppNames[256] = {0};
+ ULONG ulSize = 256;
+
+ ulReval = m_driverLib->SKF_EnumApplication(devHandle, (LPSTR)szAppNames, &ulSize);
+ if (SAR_OK == ulReval)
+ {
+ char *pszTemp = szAppNames;
+ if (*pszTemp == '\0')
+ {
+ m_driverLib->SKF_DeleteApplication(devHandle, (LPSTR)pszTemp);
+ }
+
+ while (*pszTemp != '\0')
+ {
+ m_driverLib->SKF_DeleteApplication(devHandle, (LPSTR)pszTemp);
+ pszTemp += strlen((const char *)pszTemp) + 1;
+ }
+ }
+ KLOG_DEBUG() << "clear all application";
+}
+
+QString UKeySKFDriver::enumApplication(DEVHANDLE devHandle)
+{
+ char szAppNames[256] = {0};
+ ULONG ulSize = 256;
+ ULONG ret = m_driverLib->SKF_EnumApplication(devHandle, (LPSTR)szAppNames, &ulSize);
+ if (ret == SAR_OK)
+ {
+ QString appNames(szAppNames);
+ KLOG_DEBUG() << "enum app names:" << appNames;
+ return appNames;
+ }
+ else
+ {
+ return QString();
+ }
+}
+
+ULONG UKeySKFDriver::devAuth(DEVHANDLE devHandle)
+{
+ BYTE random[16] = {0};
+ BYTE devKey[16] = {0};
+ BLOCKCIPHERPARAM param = {0};
+ BYTE devkeyenc[16] = {0};
+ ULONG dwResultLen = 16;
+ ULONG ulReval;
+ DEVINFO devInfo;
+ HANDLE hSessionKey;
+
+ QString defaultDevKey = getDefaultValueFromConf(CONF_DEFAULT_KEY_DEV_KEY);
+ QByteArray byteArray = defaultDevKey.toLatin1();
+ unsigned char *key = (unsigned char *)byteArray.data();
+
+ memcpy(devKey, key, 16);
+
+ ulReval = m_driverLib->SKF_GenRandom(devHandle, random, 8);
+ if (SAR_OK != ulReval)
+ return ulReval;
+
+ ulReval = m_driverLib->SKF_GetDevInfo(devHandle, &devInfo);
+ if (SAR_OK != ulReval)
+ return ulReval;
+
+ ulReval = m_driverLib->SKF_SetSymmKey(devHandle, devKey, devInfo.DevAuthAlgId, &hSessionKey);
+ if (SAR_OK != ulReval)
+ return ulReval;
+
+ ulReval = m_driverLib->SKF_EncryptInit(hSessionKey, param);
+ if (SAR_OK != ulReval)
+ return ulReval;
+
+ ulReval = m_driverLib->SKF_Encrypt(hSessionKey, random, 16, devkeyenc, &dwResultLen);
+ if (SAR_OK != ulReval)
+ return ulReval;
+
+ ulReval = m_driverLib->SKF_DevAuth(devHandle, devkeyenc, 16);
+
+ return ulReval;
+}
+
+HAPPLICATION UKeySKFDriver::onOpenApplication(DEVHANDLE devHandle, LPSTR szAppName)
+{
+ HAPPLICATION phApplication = nullptr;
+ ULONG ret = m_driverLib->SKF_OpenApplication(devHandle, szAppName, &phApplication);
+ if (ret != SAR_OK)
+ {
+ KLOG_DEBUG() << "open Application failed:" << getErrorReason(ret);
+ return nullptr;
+ }
+ return phApplication;
+}
+
+HCONTAINER UKeySKFDriver::onOpenContainer(HAPPLICATION appHandle, const QString &pin, QString containerName, ULONG *retryCount)
+{
+ QByteArray byteArray = pin.toLatin1();
+ unsigned char *szPIN = (unsigned char *)byteArray.data();
+ ULONG ret = m_driverLib->SKF_VerifyPIN(appHandle, USER_TYPE, szPIN, retryCount);
+ if (ret == SAR_OK)
+ {
+ HCONTAINER containerHandle = nullptr;
+ ret = m_driverLib->SKF_OpenContainer(appHandle, (LPSTR)containerName.data(), &containerHandle);
+ if (ret == SAR_OK)
+ {
+ KLOG_DEBUG() << "open container success";
+ return containerHandle;
+ }
+ else
+ {
+ KLOG_ERROR() << "open container failed:" << getErrorReason(ret);
+ }
+ }
+ else
+ {
+ KLOG_DEBUG() << "Verify PIN failed:" << getErrorReason(ret);
+ KLOG_DEBUG() << "Retry Count:" << retryCount;
+ }
+ return nullptr;
+}
+
+void UKeySKFDriver::closeApplication(HAPPLICATION appHandle)
+{
+ m_driverLib->SKF_CloseApplication(appHandle);
+}
+void UKeySKFDriver::closeContainer(HCONTAINER containerHandle)
+{
+ m_driverLib->SKF_CloseContainer(containerHandle);
+}
+
+void UKeySKFDriver::disConnectDev(DEVHANDLE devHandle)
+{
+ m_driverLib->SKF_DisConnectDev(devHandle);
+}
+
+HAPPLICATION UKeySKFDriver::createApplication(DEVHANDLE devHandle, QString pin, QString appName)
+{
+ QByteArray pinArray = pin.toLatin1();
+ unsigned char *userPin = (unsigned char *)pinArray.data();
+
+ QByteArray appNameArray = appName.toLatin1();
+ unsigned char *szAppName = (unsigned char *)appNameArray.data();
+
+ QString defaultAdminPin = getDefaultValueFromConf(CONF_DEFAULT_KEY_ADMIN_PINCODE);
+ QByteArray byteArray = defaultAdminPin.toLatin1();
+ unsigned char *adminPIn = (unsigned char *)byteArray.data();
+
+ HAPPLICATION appHandle = nullptr;
+ ULONG ulReval = m_driverLib->SKF_CreateApplication(devHandle, szAppName, adminPIn,
+ ADMIN_PIN_RETRY_COUNT, userPin, USER_PIN_RETRY_COUNT,
+ SECURE_USER_ACCOUNT, &appHandle);
+ ULONG retryCount;
+ if (ulReval != SAR_OK)
+ {
+ KLOG_ERROR() << "create application failed:" << getErrorReason(ulReval);
+ return nullptr;
+ }
+
+ return appHandle;
+}
+
+HCONTAINER UKeySKFDriver::createContainer(HAPPLICATION appHandle, QString pin, QString containerName, ULONG *retryCount)
+{
+ QByteArray byteArray = pin.toLatin1();
+ unsigned char *userPin = (unsigned char *)byteArray.data();
+ ULONG ulReval = m_driverLib->SKF_VerifyPIN(appHandle, USER_TYPE, userPin, retryCount);
+ if (ulReval != SAR_OK)
+ {
+ KLOG_ERROR() << "verifyPin failed:" << getErrorReason(ulReval);
+ return nullptr;
+ }
+
+ HCONTAINER containerHandle = nullptr;
+ ulReval = m_driverLib->SKF_CreateContainer(appHandle, (LPSTR)containerName.data(), &containerHandle);
+ if (ulReval != SAR_OK)
+ {
+ KLOG_ERROR() << "create container failed:" << getErrorReason(ulReval);
+ return nullptr;
+ }
+ KLOG_DEBUG() << "create new application and container success";
+ return containerHandle;
+}
+
+ULONG UKeySKFDriver::genECCKeyPair(HCONTAINER containerHandle, ECCPUBLICKEYBLOB *pBlob)
+{
+ return m_driverLib->SKF_GenECCKeyPair(containerHandle, SGD_SM2_1, pBlob);
+}
+
+ULONG UKeySKFDriver::authSignData(HCONTAINER containerHandle, DEVHANDLE devHandle, ECCSIGNATUREBLOB &Signature)
+{
+ unsigned char *pPubKey = NULL;
+ ULONG ulPubKeyLen = 0;
+ ECCPUBLICKEYBLOB EccPubKey = {0};
+ unsigned char pucId[32] = {0};
+ ULONG ulIdLen = 16;
+ HANDLE hHash = nullptr;
+ ULONG ulHashLen = 64;
+ int signDataLen = strlen(SIGN_DATA);
+ unsigned char pbHashData[33] = {0};
+
+ QString defaultPucId = getDefaultValueFromConf(CONF_DEFAULT_KEY_PUC_ID);
+ QByteArray byteArray = defaultPucId.toLatin1();
+ unsigned char *PUC_ID = (unsigned char *)byteArray.data();
+
+ ULONG ret = m_driverLib->SKF_ExportPublicKey(containerHandle, TRUE, pPubKey, &ulPubKeyLen);
+ if (ret != SAR_OK)
+ {
+ goto end;
+ }
+
+ pPubKey = (unsigned char *)malloc(ulPubKeyLen);
+ if (pPubKey == NULL)
+ {
+ goto end;
+ }
+
+ ret = m_driverLib->SKF_ExportPublicKey(containerHandle, TRUE, pPubKey, &ulPubKeyLen);
+ if (ret != SAR_OK)
+ {
+ goto end;
+ }
+
+ if (ulPubKeyLen != sizeof(ECCPUBLICKEYBLOB))
+ {
+ goto end;
+ }
+
+ memcpy(&EccPubKey, pPubKey, ulPubKeyLen);
+ memcpy(pucId, PUC_ID, 16);
+
+ ret = m_driverLib->SKF_DigestInit(devHandle, SGD_SM3, &EccPubKey, pucId, ulIdLen, &hHash);
+ if (ret != SAR_OK)
+ {
+ goto end;
+ }
+
+ ret = m_driverLib->SKF_Digest(hHash, (BYTE *)SIGN_DATA, signDataLen, pbHashData, &ulHashLen);
+ if (ret != SAR_OK)
+ {
+ goto end;
+ }
+
+ ret = m_driverLib->SKF_ECCSignData(containerHandle, pbHashData, ulHashLen, &Signature);
+
+end:
+ getErrorReason(ret);
+ return ret;
+}
+
+ULONG UKeySKFDriver::verifyData(DEVHANDLE devHandle, ECCSIGNATUREBLOB &Signature, ECCPUBLICKEYBLOB &publicKey)
+{
+ unsigned char *pbInData = NULL, pbHashData[33] = {0}, pbOutData[256] = {0};
+ ULONG ulInLen = 0, ulOutLen = 0, ulHashLen = 0, ulIdLen = 7;
+ unsigned char pucId[32] = {0};
+ HANDLE hHash;
+ ULONG ulPubKeyLen = 0;
+ int signDataLen = strlen(SIGN_DATA);
+ QString defaultPucId = getDefaultValueFromConf(CONF_DEFAULT_KEY_PUC_ID);
+ QByteArray byteArray = defaultPucId.toLatin1();
+ unsigned char *PUC_ID = (unsigned char *)byteArray.data();
+
+ memcpy(pucId, PUC_ID, 16);
+ ulIdLen = 16;
+ ULONG ulReval = m_driverLib->SKF_DigestInit(devHandle, SGD_SM3, &publicKey, pucId, ulIdLen, &hHash);
+ if (ulReval != SAR_OK)
+ {
+ goto end;
+ }
+
+ ulHashLen = 64;
+ ulReval = m_driverLib->SKF_Digest(hHash, (BYTE *)SIGN_DATA, signDataLen, pbHashData, &ulHashLen);
+ if (ulReval != SAR_OK)
+ {
+ goto end;
+ }
+
+ ulReval = m_driverLib->SKF_ECCVerify(devHandle, &publicKey, pbHashData, ulHashLen, &Signature);
+
+end:
+ getErrorReason(ulReval);
+ return ulReval;
+}
+
+QString UKeySKFDriver::getErrorReason(ULONG error)
+{
+ for (int i = 0; i < sizeof(skf_errors) / sizeof(skf_errors[0]); i++)
+ {
+ if (error == skf_errors[i].err)
+ {
+ return skf_errors[i].reason;
+ }
+ }
+ return QString();
+}
+
+QString UKeySKFDriver::getDefaultValueFromConf(const QString &key)
+{
+ QSettings confSettings(UKEY_DEFAULT_CONFIG, QSettings::NativeFormat);
+ QVariant value = confSettings.value(QString("default/%1").arg(key));
+ return value.toString();
+}
+
+} // namespace Kiran
diff --git a/src/driver/ukey/ukey-skf-driver.h b/src/driver/ukey/ukey-skf-driver.h
new file mode 100644
index 0000000..4952ff6
--- /dev/null
+++ b/src/driver/ukey/ukey-skf-driver.h
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-biometrics is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ *
+ * Author: luoqing <luoqing@kylinsec.com.cn>
+ */
+#pragma once
+#include "driver/driver.h"
+#include "ukey-skf.h"
+#include <QSharedPointer>
+
+namespace Kiran
+{
+struct DriverLib;
+
+class UKeySKFDriver : public BDriver
+{
+public:
+ UKeySKFDriver(QObject *parent = nullptr);
+ ~UKeySKFDriver();
+ QString getName() override;
+ QString getFullName() override;
+ quint16 getDriverId() override;
+
+ bool loadLibrary(QString libPath);
+ DEVHANDLE connectDev();
+ void deleteAllApplication(DEVHANDLE devHandle);
+ QString enumApplication(DEVHANDLE devHandle);
+
+ ULONG devAuth(DEVHANDLE devHandle);
+ HAPPLICATION onOpenApplication(DEVHANDLE hDev, LPSTR szAppName);
+ HCONTAINER onOpenContainer(HAPPLICATION appHandle,const QString &pin,QString containerName,ULONG *retryCount);
+
+ void closeApplication(HAPPLICATION appHandle);
+ void closeContainer(HCONTAINER containerHandle);
+ void disConnectDev(DEVHANDLE devHandle);
+
+ HAPPLICATION createApplication(DEVHANDLE devHandle,QString pin,QString appName);
+ HCONTAINER createContainer(HAPPLICATION appHandle, QString pin,QString containerName,ULONG *retryCount);
+
+ ULONG genECCKeyPair(HCONTAINER containerHandle,ECCPUBLICKEYBLOB *pBlob);
+
+ ULONG authSignData(HCONTAINER containerHandle,DEVHANDLE devHandle,ECCSIGNATUREBLOB &Signature);
+ ULONG verifyData(DEVHANDLE devHandle,ECCSIGNATUREBLOB &Signature, ECCPUBLICKEYBLOB &publicKey);
+
+ QString getErrorReason(ULONG error);
+
+ QString getDefaultValueFromConf(const QString &key);
+
+private:
+ QSharedPointer<DriverLib> m_driverLib;
+ HANDLE m_libHandle;
+};
+
+} // namespace Kiran
\ No newline at end of file
diff --git a/translations/kiran-authentication-devices.zh_CN.ts b/translations/kiran-authentication-devices.zh_CN.ts
index 40aef0a..540aadb 100644
--- a/translations/kiran-authentication-devices.zh_CN.ts
+++ b/translations/kiran-authentication-devices.zh_CN.ts
@@ -4,63 +4,69 @@
<context>
<name>Kiran::AuthDevice</name>
<message>
- <location filename="../src/device/auth-device.cpp" line="150"/>
- <location filename="../src/device/auth-device.cpp" line="198"/>
+ <location filename="../src/device/auth-device.cpp" line="160"/>
+ <location filename="../src/device/auth-device.cpp" line="239"/>
<source>Device Busy</source>
<translation>设备忙</translation>
</message>
<message>
- <location filename="../src/device/auth-device.cpp" line="160"/>
+ <location filename="../src/device/auth-device.cpp" line="198"/>
<source>feature has reached the upper limit of %1</source>
<translation>录入的特征已达上限 %1</translation>
</message>
+ <message>
+ <location filename="../src/device/auth-device.cpp" line="219"/>
+ <location filename="../src/device/auth-device.cpp" line="299"/>
+ <source>The pin code cannot be empty!</source>
+ <translation>pin码不能为空!</translation>
+ </message>
</context>
<context>
<name>Kiran::FPZKDevice</name>
<message>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="393"/>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="449"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="475"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="531"/>
<source>acquire fingerprint fail!</source>
<translation>获取指纹失败!</translation>
</message>
<message>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="397"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="479"/>
<source>Partial fingerprint feature entry</source>
<translation>录入部分指纹特征</translation>
</message>
<message>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="401"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="483"/>
<source>The fingerprint has been enrolled</source>
<translation>指纹重复录入</translation>
</message>
<message>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="405"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="487"/>
<source>Please place the same finger!</source>
<translation>请放置相同的手指!</translation>
</message>
<message>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="410"/>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="422"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="492"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="504"/>
<source>Failed to enroll fingerprint, please enroll again</source>
<translation>录入指纹失败,请重新录入</translation>
</message>
<message>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="414"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="496"/>
<source>Successed save finger</source>
<translation>录入指纹成功</translation>
</message>
<message>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="418"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="500"/>
<source>Save Finger Failed!</source>
<translation>录入指纹失败!</translation>
</message>
<message>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="453"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="535"/>
<source>Fingerprint match</source>
<translation>指纹匹配</translation>
</message>
<message>
- <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="457"/>
+ <location filename="../src/device/fingerprint/fp-zk-device.cpp" line="539"/>
<source>Fingerprint not match, place again</source>
<translation>指纹不匹配,请重试</translation>
</message>
@@ -68,52 +74,52 @@
<context>
<name>Kiran::FVSDDevice</name>
<message>
- <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="377"/>
+ <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="498"/>
<source>Finger vein image not obtained</source>
<translation>未获取到指静脉图像</translation>
</message>
<message>
- <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="382"/>
+ <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="503"/>
<source>Partial finger vein feature entry</source>
<translation>录入部分指静脉特征</translation>
</message>
<message>
- <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="386"/>
+ <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="507"/>
<source>The finger vein has been enrolled</source>
<translation>指静脉重复录入</translation>
</message>
<message>
- <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="390"/>
+ <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="511"/>
<source>Please place the same finger!</source>
<translation>请放置相同的手指!</translation>
</message>
<message>
- <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="394"/>
+ <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="515"/>
<source>Finger vein template merged failed</source>
<translation>指静脉模板融合失败</translation>
</message>
<message>
- <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="398"/>
+ <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="519"/>
<source>Successed save feature</source>
<translation>录入特征成功</translation>
</message>
<message>
- <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="402"/>
+ <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="523"/>
<source>Save Feature Failed!</source>
<translation>录入特征失败!</translation>
</message>
<message>
- <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="429"/>
+ <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="550"/>
<source>timeout, acquire finger vein fail!</source>
<translation>超时,获取指静脉失败!</translation>
</message>
<message>
- <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="433"/>
+ <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="554"/>
<source>Feature Match</source>
<translation>特征匹配</translation>
</message>
<message>
- <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="439"/>
+ <location filename="../src/device/finger-vein/fv-sd-device.cpp" line="560"/>
<source>Feature not match, place again</source>
<translation>特征不匹配,请重试</translation>
</message>
@@ -126,4 +132,32 @@
<translation>授权失败.</translation>
</message>
</context>
+<context>
+ <name>Kiran::UKeyFTDevice</name>
+ <message>
+ <location filename="../src/device/ukey/ukey-ft-device.cpp" line="338"/>
+ <source>Successed binding user</source>
+ <translation>绑定用户成功</translation>
+ </message>
+ <message>
+ <location filename="../src/device/ukey/ukey-ft-device.cpp" line="342"/>
+ <source>Binding user failed</source>
+ <translation>绑定用户失败</translation>
+ </message>
+ <message>
+ <location filename="../src/device/ukey/ukey-ft-device.cpp" line="346"/>
+ <source>UKey has been bound</source>
+ <translation>UKey已经被绑定</translation>
+ </message>
+ <message>
+ <location filename="../src/device/ukey/ukey-ft-device.cpp" line="377"/>
+ <source>identify fail!</source>
+ <translation>认证失败!</translation>
+ </message>
+ <message>
+ <location filename="../src/device/ukey/ukey-ft-device.cpp" line="387"/>
+ <source>identify ukey success</source>
+ <translation>ukey认证成功</translation>
+ </message>
+</context>
</TS>
--
2.33.0