kiran-authentication-devices/0001-fix-ukey-Fix-the-issue-where-only-one-ukey-can-be-bo.patch
luoqing 0b0d3a5df1 fix(ukey):Fix the issue where only one ukey can be bound to a device;Fix some self-test bugs
- 修复一台设备只能绑一个ukey的问题
  修复一些自测缺陷

Closes #I78P3F
2023-06-02 16:58:45 +08:00

1431 lines
52 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 80f7c120db60ba057a6d3ba673fc3daafe3f2a8b Mon Sep 17 00:00:00 2001
From: luoqing <luoqing@kylinsec.com.cn>
Date: Fri, 26 May 2023 16:01:55 +0800
Subject: [PATCH] fix(ukey):Fix the issue where only one ukey can be bound to a
device;Fix some self-test bugs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 修复一台设备只能绑一个ukey的问题
修复一些自测缺陷
Closes #I78P3F
---
CMakeLists.txt | 18 +-
data/com.kylinsec.Kiran.AuthDevice.Device.xml | 4 +-
src/auth-device-manager.cpp | 116 ++++---
src/context/context.h | 4 -
src/context/finger-vein/fv-sd-context.cpp | 1 -
src/context/fingerprint/fp-zk-context.cpp | 1 -
src/context/multi-function-context.cpp | 2 -
src/context/ukey/ukey-ft-context.cpp | 1 -
src/device/auth-device.cpp | 2 +-
src/device/auth-device.h | 3 +
src/device/bio-device.cpp | 2 +-
src/device/finger-vein/fv-sd-device.cpp | 2 +-
src/device/fingerprint/fp-zk-device.cpp | 2 +-
src/device/ukey/ukey-ft-device.cpp | 321 ++++++++++--------
src/device/ukey/ukey-ft-device.h | 30 +-
.../multi-function/mf-iristar-driver.cpp | 2 +-
src/driver/ukey/ukey-skf-driver.cpp | 149 ++++++--
src/driver/ukey/ukey-skf-driver.h | 10 +-
src/feature-db.cpp | 38 ++-
src/feature-db.h | 24 +-
ukey-manager/ukey-manager.cpp | 26 +-
21 files changed, 460 insertions(+), 298 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e198c84..122d4be 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,11 +1,3 @@
-set(CMAKE_INCLUDE_CURRENT_DIR ON)
-
-set(CMAKE_AUTOUIC ON)
-set(CMAKE_AUTOMOC ON)
-set(CMAKE_AUTORCC ON)
-
-set(CMAKE_CXX_STANDARD 11)
-set(CMAKE_CXX_STANDARD_REQUIRED ON)
cmake_minimum_required(VERSION 3.2)
@@ -17,10 +9,18 @@ find_package(PkgConfig REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Core DBus Sql Concurrent LinguistTools)
pkg_search_module(KLOG_QT5 REQUIRED klog-qt5)
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(CMAKE_AUTOUIC ON)
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
set(TRANSLATION_INSTALL_DIR ${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}/translations)
configure_file(${CMAKE_SOURCE_DIR}/data/config.h.in ${CMAKE_BINARY_DIR}/config.h)
-
add_subdirectory(src)
add_subdirectory(data)
add_subdirectory(ukey-manager)
diff --git a/data/com.kylinsec.Kiran.AuthDevice.Device.xml b/data/com.kylinsec.Kiran.AuthDevice.Device.xml
index ad41a33..9b22600 100644
--- a/data/com.kylinsec.Kiran.AuthDevice.Device.xml
+++ b/data/com.kylinsec.Kiran.AuthDevice.Device.xml
@@ -55,7 +55,7 @@
<description>A number between 0 and 100 to describe the progress of enrolling fingerprint. 0 is failed </description>
</arg>
<arg name="status" type="i">
- <description>Represent the status of the enrollment. Refer to enum DeviceType in file kiran-auth-device-i.h</description>
+ <description>Represent the status of the enrollment. Refer to enum EnrollStatus in file kiran-auth-device-i.h</description>
</arg>
<arg name="message" type="s">
<description>Status description information.</description>
@@ -67,7 +67,7 @@
<description>Feature ID.</description>
</arg>
<arg name="status" type="i">
- <description>Represent the status of the identification. Refer to enum DeviceType in file kiran-auth-device-i.h.</description>
+ <description>Represent the status of the identification. Refer to enum IdentifyStatus in file kiran-auth-device-i.h.</description>
</arg>
<arg name="message" type="s">
<description>Status description information.</description>
diff --git a/src/auth-device-manager.cpp b/src/auth-device-manager.cpp
index ab9a0df..5c7577b 100644
--- a/src/auth-device-manager.cpp
+++ b/src/auth-device-manager.cpp
@@ -25,6 +25,7 @@
#include "kiran-auth-device-i.h"
#include "polkit-proxy.h"
#include "utils.h"
+#include "device/ukey/ukey-ft-device.h"
namespace Kiran
{
@@ -147,11 +148,30 @@ QString AuthDeviceManager::GetDriversByType(int device_type)
void AuthDeviceManager::onRemove(const QDBusMessage& message, const QString& feature_id)
{
+ FeatureInfo featureInfo = FeatureDB::getInstance()->getFeatureInfo(feature_id);
bool result = FeatureDB::getInstance()->deleteFeature(feature_id);
KLOG_DEBUG() << "deleteFeature:" << feature_id
<< "exec:" << result;
auto replyMessage = message.createReply();
QDBusConnection::systemBus().send(replyMessage);
+
+ if (featureInfo.deviceType == DEVICE_TYPE_UKey)
+ {
+ AuthDeviceList deviceList = m_deviceMap.values();
+ for (auto device : deviceList)
+ {
+ if (device->deviceType() != DEVICE_TYPE_UKey)
+ {
+ continue;
+ }
+ auto ukeyDevice = qobject_cast<UKeyFTDevice*>(device);
+ if (ukeyDevice->deviceSerialNumber() != featureInfo.deviceSerialNumber)
+ {
+ continue;
+ }
+ ukeyDevice->resetUkey();
+ }
+ }
}
// TODO:是否需要监听配置文件的改变
@@ -297,27 +317,30 @@ void AuthDeviceManager::handleDeviceDeleted()
int deviceType;
Q_FOREACH (auto busPath, oldBusList)
{
- if (!newBusList.contains(busPath))
+ if (newBusList.contains(busPath))
{
- AuthDevicePtr oldAuthDevice = m_deviceMap.value(busPath);
- deviceID = oldAuthDevice->deviceID();
- deviceType = oldAuthDevice->deviceType();
- m_deviceMap.remove(busPath);
+ continue;
+ }
+
+ AuthDevicePtr oldAuthDevice = m_deviceMap.value(busPath);
+ deviceID = oldAuthDevice->deviceID();
+ deviceType = oldAuthDevice->deviceType();
+ int removeCount = m_deviceMap.remove(busPath);
+ oldAuthDevice.clear();
+ Q_EMIT m_dbusAdaptor->DeviceDeleted(deviceType, deviceID);
- QMapIterator<DeviceInfo, int> i(m_retreyCreateDeviceMap);
- while (i.hasNext())
+ QMapIterator<DeviceInfo, int> i(m_retreyCreateDeviceMap);
+ while (i.hasNext())
+ {
+ i.next();
+ if (i.key().busPath == busPath)
{
- i.next();
- if (i.key().busPath == busPath)
- {
- m_retreyCreateDeviceMap.remove(i.key());
- }
+ m_retreyCreateDeviceMap.remove(i.key());
}
- KLOG_DEBUG() << "device delete: " << busPath;
- break;
}
+ KLOG_DEBUG() << "device delete: " << busPath;
+ break;
}
- Q_EMIT m_dbusAdaptor->DeviceDeleted(deviceType, deviceID);
}
void AuthDeviceManager::handleDeviceReCreate()
@@ -325,43 +348,40 @@ void AuthDeviceManager::handleDeviceReCreate()
if (m_retreyCreateDeviceMap.count() == 0)
{
m_timer.stop();
+ return;
}
- else
+
+ QMapIterator<DeviceInfo, int> i(m_retreyCreateDeviceMap);
+ while (i.hasNext())
{
- QMapIterator<DeviceInfo, int> i(m_retreyCreateDeviceMap);
- while (i.hasNext())
+ i.next();
+ if (i.value() >= 2)
{
- i.next();
- if (i.value() >= 2)
- {
- m_retreyCreateDeviceMap.remove(i.key());
- }
- else
- {
- auto deviceInfo = i.key();
- AuthDeviceList deviceList = m_contextFactory->createDevices(deviceInfo.idVendor, deviceInfo.idProduct);
- if (deviceList.count() != 0)
- {
- Q_FOREACH (auto device, deviceList)
- {
- m_deviceMap.insert(deviceInfo.busPath, device);
- Q_EMIT this->DeviceAdded(device->deviceType(), device->deviceID());
- Q_EMIT m_dbusAdaptor->DeviceAdded(device->deviceType(), device->deviceID());
-
- KLOG_DEBUG() << "device added"
- << "idVendor:" << deviceInfo.idVendor
- << "idProduct:" << deviceInfo.idProduct
- << "bus:" << deviceInfo.busPath;
- }
-
- m_retreyCreateDeviceMap.remove(i.key());
- }
- else
- {
- m_retreyCreateDeviceMap.insert(i.key(), i.value() + 1);
- }
- }
+ m_retreyCreateDeviceMap.remove(i.key());
+ continue;
+ }
+
+ auto deviceInfo = i.key();
+ AuthDeviceList deviceList = m_contextFactory->createDevices(deviceInfo.idVendor, deviceInfo.idProduct);
+ if (deviceList.count() == 0)
+ {
+ m_retreyCreateDeviceMap.insert(i.key(), i.value() + 1);
+ continue;
}
+
+ Q_FOREACH (auto device, deviceList)
+ {
+ m_deviceMap.insert(deviceInfo.busPath, device);
+ Q_EMIT this->DeviceAdded(device->deviceType(), device->deviceID());
+ Q_EMIT m_dbusAdaptor->DeviceAdded(device->deviceType(), device->deviceID());
+
+ KLOG_DEBUG() << "device added"
+ << "idVendor:" << deviceInfo.idVendor
+ << "idProduct:" << deviceInfo.idProduct
+ << "bus:" << deviceInfo.busPath;
+ }
+
+ m_retreyCreateDeviceMap.remove(i.key());
}
}
} // namespace Kiran
diff --git a/src/context/context.h b/src/context/context.h
index 2043f82..fd6a3ff 100644
--- a/src/context/context.h
+++ b/src/context/context.h
@@ -29,11 +29,7 @@ class Context : public QObject
public:
explicit Context(QObject *parent = nullptr);
virtual AuthDevicePtr createDevice(const QString &idVendor, const QString &idProduct) = 0;
- virtual AuthDeviceList getDevices() { return m_deviceMap.values(); };
-protected:
- QMap<QString, AuthDevicePtr> m_deviceMap;
- AuthDevicePtr m_device;
};
} // namespace Kiran
diff --git a/src/context/finger-vein/fv-sd-context.cpp b/src/context/finger-vein/fv-sd-context.cpp
index c417745..6265ba4 100644
--- a/src/context/finger-vein/fv-sd-context.cpp
+++ b/src/context/finger-vein/fv-sd-context.cpp
@@ -59,7 +59,6 @@ AuthDevicePtr FVSDContext::createDevice(const QString& idVendor, const QString&
}
sdDevice->setDeviceName(deviceName);
sdDevice->setDeviceInfo(idVendor, idProduct);
- m_deviceMap.insert(sdDevice->deviceID(), sdDevice);
return sdDevice;
}
} // namespace Kiran
diff --git a/src/context/fingerprint/fp-zk-context.cpp b/src/context/fingerprint/fp-zk-context.cpp
index bde2b02..82bc74a 100644
--- a/src/context/fingerprint/fp-zk-context.cpp
+++ b/src/context/fingerprint/fp-zk-context.cpp
@@ -63,7 +63,6 @@ AuthDevicePtr FPZKContext::createDevice(const QString& idVendor, const QString&
}
zkDevice->setDeviceName(deviceName);
zkDevice->setDeviceInfo(idVendor, idProduct);
- m_deviceMap.insert(zkDevice->deviceID(), zkDevice);
return zkDevice;
}
} // namespace Kiran
diff --git a/src/context/multi-function-context.cpp b/src/context/multi-function-context.cpp
index 750689a..f3b7670 100644
--- a/src/context/multi-function-context.cpp
+++ b/src/context/multi-function-context.cpp
@@ -81,8 +81,6 @@ AuthDevicePtr MultiFunctionContext::createIriStarDevice(const QString& idVendor,
iriStarDevice->setDeviceName(deviceName);
iriStarDevice->setDeviceInfo(idVendor, idProduct);
- m_deviceMap.insert(iriStarDevice->deviceID(), iriStarDevice);
-
return iriStarDevice;
}
diff --git a/src/context/ukey/ukey-ft-context.cpp b/src/context/ukey/ukey-ft-context.cpp
index e363fc1..3b1b859 100644
--- a/src/context/ukey/ukey-ft-context.cpp
+++ b/src/context/ukey/ukey-ft-context.cpp
@@ -58,7 +58,6 @@ AuthDevicePtr UKeyFTContext::createDevice(const QString& idVendor, const QString
}
ftDevice->setDeviceName(deviceName);
ftDevice->setDeviceInfo(idVendor, idProduct);
- m_deviceMap.insert(ftDevice->deviceID(), ftDevice);
return ftDevice;
}
} // namespace Kiran
diff --git a/src/device/auth-device.cpp b/src/device/auth-device.cpp
index 0595fb1..a321723 100644
--- a/src/device/auth-device.cpp
+++ b/src/device/auth-device.cpp
@@ -194,7 +194,7 @@ CHECK_AUTH(AuthDevice, IdentifyStop, onIdentifyStop, AUTH_USER_ADMIN)
QStringList AuthDevice::GetFeatureIDList()
{
- QStringList featureIDs = FeatureDB::getInstance()->getFeatureIDs(m_idVendor, m_idProduct,deviceType());
+ QStringList featureIDs = FeatureDB::getInstance()->getFeatureIDs(m_idVendor, m_idProduct,deviceType(),deviceSerialNumber());
return featureIDs;
}
diff --git a/src/device/auth-device.h b/src/device/auth-device.h
index b943189..8b522d0 100644
--- a/src/device/auth-device.h
+++ b/src/device/auth-device.h
@@ -52,12 +52,14 @@ public:
DeviceStatus deviceStatus() { return m_deviceStatus; };
QString deviceName() { return m_deviceName; };
DeviceInfo deviceInfo();
+ QString deviceSerialNumber() { return m_serialNumber; };
void setDeviceType(DeviceType deviceType) { m_deviceType = deviceType; };
void setDeviceStatus(DeviceStatus deviceStatus) { m_deviceStatus = deviceStatus; };
void setDeviceName(const QString &deviceName) { m_deviceName = deviceName; };
void setDeviceInfo(const QString &idVendor, const QString &idProduct);
void setDeviceDriver(const QString &deviceDriver);
+ void setDeviceSerialNumber(const QString &serialNumber) {m_serialNumber = serialNumber;};
public Q_SLOTS:
virtual void EnrollStart(const QString &extraInfo);
@@ -104,6 +106,7 @@ private:
QString m_deviceName;
QString m_idVendor;
QString m_idProduct;
+ QString m_serialNumber;
QDBusObjectPath m_objectPath;
QSharedPointer<QDBusServiceWatcher> m_serviceWatcher;
diff --git a/src/device/bio-device.cpp b/src/device/bio-device.cpp
index 0b06bae..dd14f0e 100644
--- a/src/device/bio-device.cpp
+++ b/src/device/bio-device.cpp
@@ -36,7 +36,7 @@ void BioDevice::doingEnrollStart(const QString &extraInfo)
{
KLOG_DEBUG() << "biological information enroll start";
// 获取当前保存的特征模板,判断是否达到最大数目
- QByteArrayList saveList = FeatureDB::getInstance()->getFeatures(deviceInfo().idVendor, deviceInfo().idProduct, deviceType());
+ QByteArrayList saveList = FeatureDB::getInstance()->getFeatures(deviceInfo().idVendor, deviceInfo().idProduct, deviceType(),deviceSerialNumber());
if (saveList.count() == TEMPLATE_MAX_NUMBER)
{
QString message = tr("feature has reached the upper limit of %1").arg(TEMPLATE_MAX_NUMBER);
diff --git a/src/device/finger-vein/fv-sd-device.cpp b/src/device/finger-vein/fv-sd-device.cpp
index 55e49c0..6581cf9 100644
--- a/src/device/finger-vein/fv-sd-device.cpp
+++ b/src/device/finger-vein/fv-sd-device.cpp
@@ -399,7 +399,7 @@ QString FVSDDevice::identifyFeature(QByteArray feature, QStringList featureIDs)
DeviceInfo deviceInfo = this->deviceInfo();
if (featureIDs.isEmpty())
{
- saveList = FeatureDB::getInstance()->getFeatures(deviceInfo.idVendor, deviceInfo.idProduct, deviceType());
+ saveList = FeatureDB::getInstance()->getFeatures(deviceInfo.idVendor, deviceInfo.idProduct, deviceType(),deviceSerialNumber());
}
else
{
diff --git a/src/device/fingerprint/fp-zk-device.cpp b/src/device/fingerprint/fp-zk-device.cpp
index 92ff10d..4d8abc0 100644
--- a/src/device/fingerprint/fp-zk-device.cpp
+++ b/src/device/fingerprint/fp-zk-device.cpp
@@ -384,7 +384,7 @@ QString FPZKDevice::identifyFeature(QByteArray fpTemplate, QStringList featureID
DeviceInfo info = this->deviceInfo();
if (featureIDs.isEmpty())
{
- saveList = FeatureDB::getInstance()->getFeatures(info.idVendor, info.idProduct,deviceType());
+ saveList = FeatureDB::getInstance()->getFeatures(info.idVendor, info.idProduct,deviceType(),deviceSerialNumber());
}
else
{
diff --git a/src/device/ukey/ukey-ft-device.cpp b/src/device/ukey/ukey-ft-device.cpp
index a6e1dfc..e8f5070 100644
--- a/src/device/ukey/ukey-ft-device.cpp
+++ b/src/device/ukey/ukey-ft-device.cpp
@@ -23,28 +23,61 @@
namespace Kiran
{
-UKeyFTDevice::UKeyFTDevice(QObject *parent) : AuthDevice{parent},
- m_appHandle(nullptr),
- m_devHandle(nullptr),
- m_containerHandle(nullptr)
+QStringList UKeyFTDevice::m_existingSerialNumber;
+
+UKeyFTDevice::UKeyFTDevice(QObject *parent) : AuthDevice{parent}
{
setDeviceType(DEVICE_TYPE_UKey);
setDeviceDriver(FT_UKEY_DRIVER_LIB);
- m_driver = QSharedPointer<UKeySKFDriver>(new UKeySKFDriver());
+ /**
+ * NOTE:
+ * UKey设备插入时设备可能处在未准备好的状态无法获取到serialNumber
+ * 如果初始化时未获取到serialNumber则开启定时器再次获取
+ */
+ if (!initSerialNumber())
+ {
+ m_reInitSerialNumberTimer.start(1000);
+ }
+ connect(&m_reInitSerialNumberTimer, &QTimer::timeout, this, &UKeyFTDevice::initSerialNumber);
}
UKeyFTDevice::~UKeyFTDevice()
{
+ int index = m_existingSerialNumber.indexOf(deviceSerialNumber());
+ m_existingSerialNumber.removeAt(index);
+ KLOG_DEBUG() << "destory device, serialNumber:" << deviceSerialNumber();
}
bool UKeyFTDevice::initDriver()
{
- if (!m_driver->loadLibrary(FT_UKEY_DRIVER_LIB))
+ return true;
+}
+
+bool UKeyFTDevice::initSerialNumber()
+{
+ UKeySKFDriver driver;
+ driver.loadLibrary(FT_UKEY_DRIVER_LIB);
+ QStringList serialNumberList = driver.enumDevSerialNumber();
+ for (auto serialNumber : serialNumberList)
+ {
+ if (m_existingSerialNumber.contains(serialNumber))
+ {
+ continue;
+ }
+ setDeviceSerialNumber(serialNumber);
+ m_existingSerialNumber << serialNumber;
+ break;
+ }
+ KLOG_DEBUG() << "init serial number:" << deviceSerialNumber();
+ if (deviceSerialNumber().isEmpty())
{
return false;
}
-
- return true;
+ else
+ {
+ m_reInitSerialNumberTimer.stop();
+ return true;
+ }
}
void UKeyFTDevice::doingEnrollStart(const QString &extraInfo)
@@ -52,66 +85,71 @@ void UKeyFTDevice::doingEnrollStart(const QString &extraInfo)
KLOG_DEBUG() << "ukey enroll start";
QJsonValue ukeyValue = Utils::getValueFromJsonString(extraInfo, AUTH_DEVICE_JSON_KEY_UKEY);
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())
+ QString pin = jsonObject.value(AUTH_DEVICE_JSON_KEY_PIN).toString();
+ HANDLE devHandle = nullptr;
+
+ KLOG_DEBUG() << "device serial number:" << deviceSerialNumber();
+ if (pin.isEmpty())
{
QString message = tr("The pin code cannot be empty!");
Q_EMIT m_dbusAdaptor->EnrollStatus("", 0, ENROLL_STATUS_FAIL, message);
KLOG_ERROR() << "The pin code cannot be empty!";
- internalStopEnroll();
- return;
+ goto end;
}
- m_devHandle = m_driver->connectDev();
- if (!m_devHandle)
+ if (isExistBinding())
{
- KLOG_ERROR() << "Connect Dev failed";
- notifyUKeyEnrollProcess(ENROLL_PROCESS_FAIL);
- internalStopEnroll();
- return;
+ notifyUKeyEnrollProcess(ENROLL_PROCESS_REPEATED_ENROLL);
+ goto end;
}
- if (rebinding)
+ m_driver = new UKeySKFDriver();
+ if (!m_driver->loadLibrary(FT_UKEY_DRIVER_LIB))
{
- 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, deviceType());
- Q_FOREACH (auto id, idList)
- {
- FeatureDB::getInstance()->deleteFeature(id);
- }
- bindingUKey();
- }
- else
- {
- KLOG_ERROR() << "rebinding failed";
- }
+ KLOG_ERROR() << "load library failed";
+ notifyUKeyEnrollProcess(ENROLL_PROCESS_FAIL);
+ goto end;
}
- else
+
+ devHandle = m_driver->connectDev(deviceSerialNumber());
+ KLOG_DEBUG() << "devHandle:" << devHandle;
+ if (!devHandle)
{
- bindingUKey();
+ KLOG_ERROR() << "Connect Dev failed";
+ notifyUKeyEnrollProcess(ENROLL_PROCESS_FAIL);
+ goto end;
}
+ bindingUKey(devHandle,pin);
+ m_driver->disConnectDev(devHandle);
+
+end:
internalStopEnroll();
+ return;
}
-void UKeyFTDevice::bindingUKey()
+void UKeyFTDevice::bindingUKey(DEVHANDLE devHandle, const QString &pin)
{
- if (isExistPublicKey())
+ HCONTAINER containerHandle;
+ HAPPLICATION appHandle;
+ ULONG ret = createContainer(pin, devHandle, &appHandle, &containerHandle);
+ if (ret != SAR_OK)
{
- notifyUKeyEnrollProcess(ENROLL_PROCESS_REPEATED_ENROLL);
+ KLOG_ERROR() << "create container failed:" << m_driver->getErrorReason(ret);
+ notifyUKeyEnrollProcess(ENROLL_PROCESS_FAIL, ret);
+ m_driver->closeContainer(containerHandle);
+ m_driver->closeApplication(appHandle);
return;
}
- ECCPUBLICKEYBLOB publicKey = {0};
- ULONG ret = genKeyPair(&publicKey);
+ KLOG_DEBUG() << "create container success";
+ ECCPUBLICKEYBLOB publicKey = {0};
+ ret = m_driver->genECCKeyPair(containerHandle, &publicKey);
if (ret != SAR_OK)
{
KLOG_ERROR() << "gen ecc key pair failed:" << m_driver->getErrorReason(ret);
notifyUKeyEnrollProcess(ENROLL_PROCESS_FAIL, ret);
+ m_driver->closeContainer(containerHandle);
+ m_driver->closeApplication(appHandle);
return;
}
KLOG_DEBUG() << "gen ecc key pair success";
@@ -131,87 +169,62 @@ void UKeyFTDevice::bindingUKey()
QString featureID = QCryptographicHash::hash(keyFeature, QCryptographicHash::Md5).toHex();
DeviceInfo deviceInfo = this->deviceInfo();
- if (FeatureDB::getInstance()->addFeature(featureID, keyFeature, deviceInfo, deviceType()))
+ if (FeatureDB::getInstance()->addFeature(featureID, keyFeature, deviceInfo, deviceType(), deviceSerialNumber()))
{
notifyUKeyEnrollProcess(ENROLL_PROCESS_SUCCESS, SAR_OK, featureID);
}
else
{
- KLOG_DEBUG() << "save feature fail";
+ KLOG_ERROR() << "save feature fail";
notifyUKeyEnrollProcess(ENROLL_PROCESS_FAIL);
}
-}
-bool UKeyFTDevice::isExistPublicKey()
-{
- DeviceInfo deviceInfo = this->deviceInfo();
- auto features = FeatureDB::getInstance()->getFeatures(deviceInfo.idVendor, deviceInfo.idProduct, deviceType());
- if (features.count() != 0)
- {
- return true;
- }
- else
- {
- return false;
- }
+ m_driver->closeContainer(containerHandle);
+ m_driver->closeApplication(appHandle);
}
-ULONG UKeyFTDevice::genKeyPair(ECCPUBLICKEYBLOB *publicKey)
+ULONG UKeyFTDevice::createContainer(const QString &pin, DEVHANDLE devHandle, HAPPLICATION *appHandle, HCONTAINER *containerHandle)
{
- ULONG ulReval;
- if (!isExistsApplication(UKEY_APP_NAME))
- {
- // NOTE:必须通过设备认证后才能在设备内创建和删除应用
- ulReval = m_driver->devAuth(m_devHandle);
- if (ulReval != SAR_OK)
- {
- KLOG_ERROR() << "Device auth failure: " << m_driver->getErrorReason(ulReval);
- return ulReval;
- }
- else
- {
- KLOG_DEBUG() << "device auth success";
- }
- m_driver->deleteAllApplication(m_devHandle);
- ulReval = m_driver->createApplication(m_devHandle, m_pin, UKEY_APP_NAME, &m_appHandle);
- if (ulReval != SAR_OK)
- {
- KLOG_ERROR() << "create application failed:" << m_driver->getErrorReason(ulReval);
- return ulReval;
- }
- KLOG_DEBUG() << "create application suceess";
- ulReval = m_driver->createContainer(m_appHandle, m_pin, UKEY_CONTAINER_NAME, &m_retryCount, &m_containerHandle);
- if (ulReval != SAR_OK)
- {
- KLOG_ERROR() << "create container failed:" << m_driver->getErrorReason(ulReval);
- return ulReval;
- }
- KLOG_DEBUG() << "create new container success";
- }
- ulReval = m_driver->onOpenApplication(m_devHandle, (LPSTR)UKEY_APP_NAME, &m_appHandle);
+ // NOTE:必须通过设备认证后才能在设备内创建和删除应用
+ ULONG ulReval = m_driver->devAuth(devHandle);
if (ulReval != SAR_OK)
{
- KLOG_DEBUG() << "open Application failed:" << m_driver->getErrorReason(ulReval);
+ KLOG_ERROR() << "Device auth failure: " << m_driver->getErrorReason(ulReval);
return ulReval;
}
- KLOG_DEBUG() << "open Application success";
+ KLOG_DEBUG() << "device auth success";
+ m_driver->deleteAllApplication(devHandle);
- ulReval = m_driver->onOpenContainer(m_appHandle, m_pin, UKEY_CONTAINER_NAME, &m_retryCount, &m_containerHandle);
+ ulReval = m_driver->createApplication(devHandle, pin, UKEY_APP_NAME, appHandle);
if (ulReval != SAR_OK)
{
- KLOG_ERROR() << "open container failed:" << m_driver->getErrorReason(ulReval);
+ KLOG_ERROR() << "create application failed:" << m_driver->getErrorReason(ulReval)
+ << " device serial number:" << deviceSerialNumber();
return ulReval;
}
- KLOG_DEBUG() << "open container success";
-
- ulReval = m_driver->genECCKeyPair(m_containerHandle, publicKey);
-
+ KLOG_DEBUG() << "create application suceess";
+ ulReval = m_driver->createContainer(*appHandle, pin, UKEY_CONTAINER_NAME, &m_retryCount, containerHandle);
return ulReval;
}
-bool UKeyFTDevice::isExistsApplication(const QString &appName)
+bool UKeyFTDevice::isExistBinding()
{
- QString appNames = m_driver->enumApplication(m_devHandle);
+ QStringList featureIDs = FeatureDB::getInstance()->getFeatureIDs(deviceInfo().idVendor, deviceInfo().idProduct, deviceType(), deviceSerialNumber());
+ for (auto id : featureIDs)
+ {
+ FeatureInfo info = FeatureDB::getInstance()->getFeatureInfo(id);
+ if (info.deviceSerialNumber == deviceSerialNumber())
+ {
+ KLOG_DEBUG() << QString("Exist Binding: feature id:%1, device serial number: %2").arg(id).arg(deviceSerialNumber());
+ return true;
+ }
+ }
+ return false;
+}
+
+bool UKeyFTDevice::isExistsApplication(DEVHANDLE devHandle, const QString &appName)
+{
+ QString appNames = m_driver->enumApplication(devHandle);
KLOG_DEBUG() << "enum app names:" << appNames;
if (appNames.contains(appName))
{
@@ -225,8 +238,8 @@ void UKeyFTDevice::doingIdentifyStart(const QString &value)
KLOG_DEBUG() << "ukey identify start";
QJsonValue ukeyValue = Utils::getValueFromJsonString(value, AUTH_DEVICE_JSON_KEY_UKEY);
auto jsonObject = ukeyValue.toObject();
- m_pin = jsonObject.value(AUTH_DEVICE_JSON_KEY_PIN).toString();
- if (m_pin.isEmpty())
+ QString pin = jsonObject.value(AUTH_DEVICE_JSON_KEY_PIN).toString();
+ if (pin.isEmpty())
{
QString message = tr("The pin code cannot be empty!");
Q_EMIT m_dbusAdaptor->IdentifyStatus("", IDENTIFY_STATUS_NOT_MATCH, message);
@@ -239,29 +252,38 @@ void UKeyFTDevice::doingIdentifyStart(const QString &value)
DeviceInfo deviceInfo = this->deviceInfo();
if (m_identifyIDs.isEmpty())
{
- saveList = FeatureDB::getInstance()->getFeatures(deviceInfo.idVendor, deviceInfo.idProduct, deviceType());
+ saveList = FeatureDB::getInstance()->getFeatures(deviceInfo.idVendor, deviceInfo.idProduct, deviceType(), deviceSerialNumber());
}
else
{
Q_FOREACH (auto id, m_identifyIDs)
{
QByteArray feature = FeatureDB::getInstance()->getFeature(id);
- if (!feature.isEmpty())
- saveList << feature;
+ saveList << feature;
}
}
- if (saveList.count() != 0)
+ if (saveList.count() == 0)
{
- for (int j = 0; j < saveList.count(); j++)
- {
- auto saveTemplate = saveList.value(j);
- identifyKeyFeature(saveTemplate);
- }
+ KLOG_DEBUG() << "no found feature id";
+ notifyUKeyIdentifyProcess(IDENTIFY_PROCESS_NO_MATCH);
+ internalStopIdentify();
+ return;
}
- else
+
+ m_driver = new UKeySKFDriver();
+ if (!m_driver->loadLibrary(FT_UKEY_DRIVER_LIB))
{
- KLOG_DEBUG() << "no found feature id";
+ KLOG_ERROR() << "load library failed";
+ notifyUKeyEnrollProcess(ENROLL_PROCESS_FAIL);
+ internalStopIdentify();
+ return;
+ }
+
+ for (int j = 0; j < saveList.count(); j++)
+ {
+ auto savedKey = saveList.value(j);
+ identifyKeyFeature(pin,savedKey);
}
internalStopIdentify();
@@ -271,10 +293,14 @@ void UKeyFTDevice::internalStopEnroll()
{
if (deviceStatus() == DEVICE_STATUS_DOING_ENROLL)
{
- closeUkey();
- m_pin.clear();
setDeviceStatus(DEVICE_STATUS_IDLE);
clearWatchedServices();
+ if (m_driver)
+ {
+ KLOG_DEBUG() << "delete m_driver";
+ delete m_driver;
+ m_driver = nullptr;
+ }
KLOG_DEBUG() << "stop Enroll";
}
}
@@ -283,58 +309,48 @@ void UKeyFTDevice::internalStopIdentify()
{
if (deviceStatus() == DEVICE_STATUS_DOING_IDENTIFY)
{
- closeUkey();
m_identifyIDs.clear();
- m_pin.clear();
setDeviceStatus(DEVICE_STATUS_IDLE);
clearWatchedServices();
+ if (m_driver)
+ {
+ delete m_driver;
+ m_driver = nullptr;
+ }
KLOG_DEBUG() << "stopIdentify";
}
}
-void UKeyFTDevice::closeUkey()
+void UKeyFTDevice::resetUkey()
{
- if (!m_driver->isLoaded())
- {
- return;
- }
- if (m_containerHandle)
- {
- m_driver->closeContainer(m_containerHandle);
- m_containerHandle = nullptr;
- }
-
- if (m_appHandle)
- {
- m_driver->closeApplication(m_appHandle);
- m_appHandle = nullptr;
- }
-
- if (m_devHandle)
- {
- m_driver->disConnectDev(m_devHandle);
- m_devHandle = nullptr;
- }
+ UKeySKFDriver driver;
+ driver.loadLibrary(FT_UKEY_DRIVER_LIB);
+ DEVHANDLE devHandle = driver.connectDev(deviceSerialNumber());
+ driver.resetUkey(devHandle);
+ KLOG_DEBUG() << "resetUkey";
}
-void UKeyFTDevice::identifyKeyFeature(QByteArray keyFeature)
+void UKeyFTDevice::identifyKeyFeature(const QString &pin, QByteArray keyFeature)
{
- DEVHANDLE m_devHandle = m_driver->connectDev();
- if (!m_devHandle)
+ DEVHANDLE devHandle = m_driver->connectDev(deviceSerialNumber());
+ if (!devHandle)
{
notifyUKeyIdentifyProcess(IDENTIFY_PROCESS_NO_MATCH);
return;
}
ULONG ret;
- ret = m_driver->onOpenApplication(m_devHandle, (LPSTR)UKEY_APP_NAME, &m_appHandle);
+ HAPPLICATION appHandle;
+ HCONTAINER containerHandle;
+
+ ret = m_driver->onOpenApplication(devHandle, (LPSTR)UKEY_APP_NAME, &appHandle);
if (ret != SAR_OK)
{
notifyUKeyIdentifyProcess(IDENTIFY_PROCESS_NO_MATCH, ret);
return;
}
- ret = m_driver->onOpenContainer(m_appHandle, m_pin, UKEY_CONTAINER_NAME, &m_retryCount, &m_containerHandle);
+ ret = m_driver->onOpenContainer(appHandle, pin, UKEY_CONTAINER_NAME, &m_retryCount, &containerHandle);
if (ret != SAR_OK)
{
notifyUKeyIdentifyProcess(IDENTIFY_PROCESS_NO_MATCH, ret);
@@ -342,7 +358,7 @@ void UKeyFTDevice::identifyKeyFeature(QByteArray keyFeature)
}
ECCSIGNATUREBLOB Signature = {0};
- ret = m_driver->authSignData(m_containerHandle, m_devHandle, Signature);
+ ret = m_driver->authSignData(containerHandle, devHandle, Signature);
if (ret != SAR_OK)
{
KLOG_DEBUG() << "auth sign data failed:" << m_driver->getErrorReason(ret);
@@ -358,7 +374,7 @@ void UKeyFTDevice::identifyKeyFeature(QByteArray keyFeature)
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);
+ ret = m_driver->verifyData(devHandle, Signature, eccPubKey);
if (ret != SAR_OK)
{
KLOG_DEBUG() << "verify data failed:" << m_driver->getErrorReason(ret);
@@ -373,10 +389,15 @@ void UKeyFTDevice::identifyKeyFeature(QByteArray keyFeature)
void UKeyFTDevice::notifyUKeyEnrollProcess(EnrollProcess process, ULONG error, const QString &featureID)
{
- QString message, reason;
+ QString reason;
// 目前只需要返回有关pin码的错误信息
reason = getPinErrorReson(error);
+ if (error != SAR_OK)
+ {
+ KLOG_DEBUG() << "Ukey Error Reason:" << m_driver->getErrorReason(error);
+ }
+ QString message = tr("Binding user failed!");
switch (process)
{
case ENROLL_PROCESS_SUCCESS:
@@ -384,18 +405,16 @@ void UKeyFTDevice::notifyUKeyEnrollProcess(EnrollProcess process, ULONG error, c
Q_EMIT m_dbusAdaptor->EnrollStatus(featureID, 100, ENROLL_STATUS_COMPLETE, message);
break;
case ENROLL_PROCESS_FAIL:
- message = tr("Binding user failed!");
if (!reason.isEmpty())
{
message.append(reason);
}
Q_EMIT m_dbusAdaptor->EnrollStatus("", 0, ENROLL_STATUS_FAIL, message);
- KLOG_DEBUG() << "Ukey Error Reason:" << m_driver->getErrorReason(error);
break;
case ENROLL_PROCESS_REPEATED_ENROLL:
- message = tr("UKey has been bound");
- Q_EMIT m_dbusAdaptor->EnrollStatus("", 0, ENROLL_STATUS_REPEATED, message);
+ message.append(tr("UKey has been bound"));
Q_EMIT m_dbusAdaptor->EnrollStatus("", 0, ENROLL_STATUS_FAIL, message);
+ break;
default:
break;
}
diff --git a/src/device/ukey/ukey-ft-device.h b/src/device/ukey/ukey-ft-device.h
index b74a24e..87d8c45 100644
--- a/src/device/ukey/ukey-ft-device.h
+++ b/src/device/ukey/ukey-ft-device.h
@@ -14,10 +14,11 @@
#pragma once
#include <stdint.h>
+#include <QSharedPointer>
+#include <QTimer>
#include "device/auth-device.h"
#include "driver/ukey/ukey-skf-driver.h"
#include "ukey-skf.h"
-#include <QSharedPointer>
namespace Kiran
{
@@ -30,33 +31,34 @@ public:
bool initDriver() override;
+ void resetUkey();
+
+private Q_SLOTS:
+ bool initSerialNumber();
+
private:
void doingEnrollStart(const QString &extraInfo) override;
void doingIdentifyStart(const QString &value) override;
-
+
void internalStopEnroll() override;
void internalStopIdentify() override;
- void identifyKeyFeature(QByteArray keyFeature);
-
- void bindingUKey();
- ULONG genKeyPair(ECCPUBLICKEYBLOB *publicKey);
- bool isExistPublicKey();
- bool isExistsApplication(const QString &appName);
+ void identifyKeyFeature(const QString &pin, QByteArray keyFeature);
+ void bindingUKey(DEVHANDLE devHandle, const QString &pin);
+ ULONG createContainer(const QString &pin, DEVHANDLE devHandle, HAPPLICATION *appHandle, HCONTAINER *containerHandle);
+ bool isExistsApplication(DEVHANDLE devHandle, const QString &appName);
+ bool isExistBinding();
void notifyUKeyEnrollProcess(EnrollProcess process, ULONG error = SAR_OK, const QString &featureID = QString());
void notifyUKeyIdentifyProcess(IdentifyProcess process, ULONG error = SAR_OK, const QString &featureID = QString());
QString getPinErrorReson(ULONG error);
- void closeUkey();
private:
- DEVHANDLE m_devHandle;
- HAPPLICATION m_appHandle;
- HCONTAINER m_containerHandle;
ULONG m_retryCount = 1000000;
- QString m_pin;
- QSharedPointer<UKeySKFDriver> m_driver;
+ UKeySKFDriver *m_driver = nullptr;
+ static QStringList m_existingSerialNumber;
+ QTimer m_reInitSerialNumberTimer;
};
} // namespace Kiran
diff --git a/src/driver/multi-function/mf-iristar-driver.cpp b/src/driver/multi-function/mf-iristar-driver.cpp
index 298a0e8..ae8a389 100644
--- a/src/driver/multi-function/mf-iristar-driver.cpp
+++ b/src/driver/multi-function/mf-iristar-driver.cpp
@@ -376,7 +376,7 @@ int MFIriStarDriver::startIdentify(QStringList featureIDs)
if (featureIDs.isEmpty())
{
- saveList = FeatureDB::getInstance()->getFeatures(m_idVendor, m_idProduct, (DeviceType)m_currentDeviceType);
+ saveList = FeatureDB::getInstance()->getFeatures(m_idVendor, m_idProduct, (DeviceType)m_currentDeviceType,QString());
}
else
{
diff --git a/src/driver/ukey/ukey-skf-driver.cpp b/src/driver/ukey/ukey-skf-driver.cpp
index dd74772..e1e89d7 100644
--- a/src/driver/ukey/ukey-skf-driver.cpp
+++ b/src/driver/ukey/ukey-skf-driver.cpp
@@ -180,46 +180,123 @@ bool UKeySKFDriver::isLoaded()
return m_driverLib->isLoaded;
}
-DEVHANDLE UKeySKFDriver::connectDev()
+QStringList UKeySKFDriver::enumDevName()
{
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;
+ return QStringList();
}
LPSTR szNameList = (LPSTR)malloc(ulBufSize * sizeof(CHAR));
memset(szNameList, '\0', ulBufSize);
ulReval = m_driverLib->SKF_EnumDev(TRUE, szNameList, &ulBufSize);
- if (ulReval == SAR_OK)
+ if ((ulReval != SAR_OK))
+ {
+ KLOG_DEBUG() << "Enum Dev error:" << getErrorReason(ulReval);
+ free(szNameList);
+ return QStringList();
+ }
+
+ LPSTR pszTemp = szNameList;
+ if (NULL == pszTemp)
+ {
+ KLOG_DEBUG() << "no found ukey device";
+ free(szNameList);
+ return QStringList();
+ }
+
+ QStringList nameList;
+ while ((*pszTemp != '\0') && (*(pszTemp + 1) != '\0'))
{
- LPSTR pszTemp = szNameList;
- if (NULL == pszTemp)
+ nameList << QString::fromLatin1((const char *)pszTemp, strlen((const char *)pszTemp));
+ pszTemp += strlen((const char *)pszTemp) + 1;
+ }
+ KLOG_DEBUG() << "device name list:" << nameList;
+
+ free(szNameList);
+ return nameList;
+}
+
+QStringList UKeySKFDriver::enumDevSerialNumber()
+{
+ QStringList devNameList = enumDevName();
+ QStringList serialNumberList;
+ for (auto devName : devNameList)
+ {
+ DEVHANDLE devHandle;
+ ULONG pulDevState;
+ QByteArray devNameArray = devName.toLatin1();
+ unsigned char *szDevName = (unsigned char *)devNameArray.data();
+ ULONG ulReval = m_driverLib->SKF_ConnectDev(szDevName, &devHandle);
+ if (SAR_OK != ulReval)
{
- KLOG_DEBUG() << "no found ukey device";
- return nullptr;
+ continue;
}
- while (*pszTemp != '\0')
+ DEVINFO devInfo;
+ m_driverLib->SKF_GetDevInfo(devHandle, &devInfo);
+ serialNumberList << QString((const char *)devInfo.SerialNumber);
+ m_driverLib->SKF_DisConnectDev(devHandle);
+ }
+ KLOG_DEBUG() << "dev serial number list:" << serialNumberList;
+ return serialNumberList;
+}
+
+DEVHANDLE UKeySKFDriver::connectDev()
+{
+ QStringList devNameList = enumDevName();
+ for (auto devName : devNameList)
+ {
+ DEVHANDLE devHandle;
+ ULONG pulDevState;
+ QByteArray devNameArray = devName.toLatin1();
+ unsigned char *szDevName = (unsigned char *)devNameArray.data();
+ ULONG ulReval = m_driverLib->SKF_ConnectDev(szDevName, &devHandle);
+ if (SAR_OK == ulReval)
{
- 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;
+ KLOG_DEBUG() << "connect dev success";
+ return devHandle;
+ }
+ else
+ {
+ KLOG_ERROR() << "Connect Dev failed:" << getErrorReason(ulReval);
}
}
- free(szNameList);
+
return nullptr;
}
+DEVHANDLE UKeySKFDriver::connectDev(const QString &serialNumber)
+{
+ QStringList devNameList = enumDevName();
+ for (auto devName : devNameList)
+ {
+ DEVHANDLE devHandle;
+ QByteArray devNameArray = devName.toLatin1();
+ unsigned char *szDevName = (unsigned char *)devNameArray.data();
+ ULONG ulReval = m_driverLib->SKF_ConnectDev(szDevName, &devHandle);
+ if (ulReval != SAR_OK)
+ {
+ KLOG_ERROR() << QString("Connect Dev %1 failed:").arg(devName) << getErrorReason(ulReval);
+ continue;
+ }
+
+ DEVINFO devInfo;
+ m_driverLib->SKF_GetDevInfo(devHandle, &devInfo);
+ if (serialNumber == QString((const char *)devInfo.SerialNumber))
+ {
+ KLOG_DEBUG() << QString("Connect Dev %1 success, SerialNumber: %2").arg(devName).arg(serialNumber);
+ return devHandle;
+ }
+ else
+ {
+ m_driverLib->SKF_DisConnectDev(devHandle);
+ }
+ }
+ return nullptr;
+}
void UKeySKFDriver::deleteAllApplication(DEVHANDLE devHandle)
{
@@ -262,6 +339,23 @@ QString UKeySKFDriver::enumApplication(DEVHANDLE devHandle)
}
}
+bool UKeySKFDriver::isExistPublicKey(HCONTAINER containerHandle)
+{
+ unsigned char *pPubKey = NULL;
+ ULONG ulPubKeyLen = 0;
+ ULONG ret = m_driverLib->SKF_ExportPublicKey(containerHandle, TRUE, pPubKey, &ulPubKeyLen);
+ pPubKey = (unsigned char *)malloc(ulPubKeyLen);
+ ret = m_driverLib->SKF_ExportPublicKey(containerHandle, TRUE, pPubKey, &ulPubKeyLen);
+ if (ret == SAR_OK)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
ULONG UKeySKFDriver::devAuth(DEVHANDLE devHandle)
{
BYTE random[16] = {0};
@@ -340,7 +434,8 @@ void UKeySKFDriver::closeContainer(HCONTAINER containerHandle)
void UKeySKFDriver::disConnectDev(DEVHANDLE devHandle)
{
- m_driverLib->SKF_DisConnectDev(devHandle);
+ ULONG ret = m_driverLib->SKF_DisConnectDev(devHandle);
+ KLOG_DEBUG() << "getErrorReason(ret):" << getErrorReason(ret);
}
ULONG UKeySKFDriver::createApplication(DEVHANDLE devHandle, QString pin, QString appName, HAPPLICATION *appHandle)
@@ -527,6 +622,18 @@ ULONG UKeySKFDriver::unblockPin(DEVHANDLE devHandle, const QString &adminPin, co
return ulReval;
}
+ULONG UKeySKFDriver::resetUkey(DEVHANDLE devHandle)
+{
+ ULONG ulReval = devAuth(devHandle);
+ if (ulReval != SAR_OK)
+ {
+ KLOG_ERROR() << "Device authentication failed";
+ return ulReval;
+ }
+ deleteAllApplication(devHandle);
+ return ulReval;
+}
+
QString UKeySKFDriver::getErrorReason(ULONG error)
{
for (int i = 0; i < sizeof(skf_errors) / sizeof(skf_errors[0]); i++)
diff --git a/src/driver/ukey/ukey-skf-driver.h b/src/driver/ukey/ukey-skf-driver.h
index 0d45c7a..058dc63 100644
--- a/src/driver/ukey/ukey-skf-driver.h
+++ b/src/driver/ukey/ukey-skf-driver.h
@@ -29,10 +29,15 @@ public:
bool isLoaded();
bool loadLibrary(QString libPath);
+ QStringList enumDevName();
+ QStringList enumDevSerialNumber();
DEVHANDLE connectDev();
+ DEVHANDLE connectDev(const QString &serialNumber);
+
void deleteAllApplication(DEVHANDLE devHandle);
QString enumApplication(DEVHANDLE devHandle);
+ bool isExistPublicKey(HCONTAINER containerHandle);
ULONG devAuth(DEVHANDLE devHandle);
ULONG onOpenApplication(DEVHANDLE hDev, LPSTR szAppName, HAPPLICATION *appHandle);
@@ -52,14 +57,15 @@ public:
ULONG changePin(DEVHANDLE devHandle, int userType, const QString &currentPin, const QString &newPin, ULONG *retryCount);
-
-
ULONG unblockPin(DEVHANDLE devHandle, const QString &adminPin, const QString &newUserPin, ULONG *retryCount);
+ ULONG resetUkey(DEVHANDLE devHandle);
+
QString getErrorReason(ULONG error);
QString getDefaultValueFromConf(const QString &key);
+
private:
QSharedPointer<SKFDriverLib> m_driverLib;
HANDLE m_libHandle;
diff --git a/src/feature-db.cpp b/src/feature-db.cpp
index 10d23ca..ee0a4bd 100644
--- a/src/feature-db.cpp
+++ b/src/feature-db.cpp
@@ -72,7 +72,8 @@ bool FeatureDB::createDBConnection()
"feature BLOB NOT NULL,"
"idVendor TEXT,"
"idProduct TEXT,"
- "deviceType INT);");
+ "deviceType INT,"
+ "deviceSerialNumber TEXT);");
if (!query.exec(createTable))
{
@@ -82,15 +83,16 @@ bool FeatureDB::createDBConnection()
return true;
}
-bool FeatureDB::addFeature(const QString &featureID, QByteArray feature, DeviceInfo deviceInfo, DeviceType deviceType)
+bool FeatureDB::addFeature(const QString &featureID, QByteArray feature, DeviceInfo deviceInfo, DeviceType deviceType, const QString &deviceSerialNumber)
{
QSqlQuery query(m_database);
- query.prepare("INSERT into feature(featureID, feature, idVendor, idProduct, deviceType) VALUES(:featureID, :feature,:idVendor, :idProduct, :deviceType) ;");
+ query.prepare("INSERT into feature(featureID, feature, idVendor, idProduct, deviceType, deviceSerialNumber) VALUES(:featureID, :feature,:idVendor, :idProduct, :deviceType, :deviceSerialNumber) ;");
query.bindValue(":featureID", featureID);
query.bindValue(":feature", feature);
query.bindValue(":idVendor", deviceInfo.idVendor);
query.bindValue(":idProduct", deviceInfo.idProduct);
query.bindValue(":deviceType", (int)deviceType);
+ query.bindValue(":deviceSerialNumber", deviceSerialNumber);
return query.exec();
}
@@ -116,13 +118,14 @@ QByteArray FeatureDB::getFeature(const QString &featureID)
return QByteArray();
}
-QList<QByteArray> FeatureDB::getFeatures(const QString &idVendor, const QString &idProduct, DeviceType deviceType)
+QList<QByteArray> FeatureDB::getFeatures(const QString &idVendor, const QString &idProduct, DeviceType deviceType, const QString &deviceSerialNumber)
{
QSqlQuery query(m_database);
- query.prepare("SELECT feature FROM feature WHERE idVendor = :Vid AND idProduct = :Pid AND deviceType = :devType");
+ query.prepare("SELECT feature FROM feature WHERE idVendor = :Vid AND idProduct = :Pid AND deviceType = :devType AND deviceSerialNumber = :serialNumber");
query.bindValue(":Vid", idVendor);
query.bindValue(":Pid", idProduct);
query.bindValue(":devType", (int)deviceType);
+ query.bindValue(":serialNumber", deviceSerialNumber);
query.exec();
QByteArrayList featuresList;
while (query.next())
@@ -147,13 +150,14 @@ QList<QByteArray> FeatureDB::getAllFeatures()
return featuresList;
}
-QStringList FeatureDB::getFeatureIDs(const QString &idVendor, const QString &idProduct, DeviceType deviceType)
+QStringList FeatureDB::getFeatureIDs(const QString &idVendor, const QString &idProduct, DeviceType deviceType, const QString &deviceSerialNumber)
{
QSqlQuery query(m_database);
- query.prepare("SELECT featureID FROM feature WHERE idVendor = :Vid AND idProduct = :Pid AND deviceType = :devType");
+ query.prepare("SELECT featureID FROM feature WHERE idVendor = :Vid AND idProduct = :Pid AND deviceType = :devType AND deviceSerialNumber = :serialNumber");
query.bindValue(":Vid", idVendor);
query.bindValue(":Pid", idProduct);
query.bindValue(":devType", (int)deviceType);
+ query.bindValue(":serialNumber", deviceSerialNumber);
query.exec();
QStringList featureIDs;
while (query.next())
@@ -192,6 +196,24 @@ QStringList FeatureDB::getAllFeatureIDs()
return featureIDs;
}
+FeatureInfo FeatureDB::getFeatureInfo(const QString &featureID)
+{
+ QSqlQuery query(m_database);
+ query.prepare("SELECT idVendor, idProduct, deviceType, deviceSerialNumber FROM feature WHERE featureID = :id");
+ query.bindValue(":id", featureID);
+ query.exec();
+ FeatureInfo featureInfo;
+ if (query.next())
+ {
+ featureInfo.id = featureID;
+ featureInfo.idVendor = query.value("idVendor").toString();
+ featureInfo.idProduct = query.value("idProduct").toString();
+ featureInfo.deviceType = query.value("deviceType").toInt();
+ featureInfo.deviceSerialNumber = query.value("deviceSerialNumber").toString();
+ }
+ return featureInfo;
+}
+
bool FeatureDB::updateFeature(const QString &featureID, QByteArray newFeature)
{
QSqlQuery query(m_database);
@@ -212,7 +234,9 @@ bool FeatureDB::contains(const QString &featureID)
return true;
}
else
+ {
return false;
+ }
}
} // namespace Kiran
diff --git a/src/feature-db.h b/src/feature-db.h
index 8acad2e..2f2623e 100644
--- a/src/feature-db.h
+++ b/src/feature-db.h
@@ -20,26 +20,38 @@
namespace Kiran
{
+struct FeatureInfo
+{
+ QString id;
+ QString idVendor;
+ QString idProduct;
+ int deviceType;
+ QString deviceSerialNumber;
+};
+
class FeatureDB
{
public:
explicit FeatureDB();
~FeatureDB();
- static FeatureDB *getInstance() {return m_instance;};
+ static FeatureDB *getInstance() { return m_instance; };
static void globalInit();
- static void globalDeinit() {delete m_instance;};
-
+ static void globalDeinit() { delete m_instance; };
+
bool createDBConnection();
- bool addFeature(const QString &featureID, QByteArray feature, DeviceInfo deviceInfo, DeviceType deviceType);
+ bool addFeature(const QString &featureID, QByteArray feature,
+ DeviceInfo deviceInfo, DeviceType deviceType,
+ const QString &deviceSerialNumber = QString());
bool deleteFeature(const QString &featureID);
QByteArray getFeature(const QString &featureID);
- QList<QByteArray> getFeatures(const QString &idVendor,const QString &idProduct, DeviceType deviceType);
+ QList<QByteArray> getFeatures(const QString &idVendor, const QString &idProduct, DeviceType deviceType, const QString &deviceSerialNumber);
QList<QByteArray> getAllFeatures();
- QStringList getFeatureIDs(const QString &idVendor,const QString &idProduct, DeviceType deviceType);
+ QStringList getFeatureIDs(const QString &idVendor, const QString &idProduct, DeviceType deviceType, const QString &deviceSerialNumber);
QString getFeatureID(QByteArray feature);
QStringList getAllFeatureIDs();
+ FeatureInfo getFeatureInfo(const QString &featureID);
bool updateFeature(const QString &featureID, QByteArray newFeature);
diff --git a/ukey-manager/ukey-manager.cpp b/ukey-manager/ukey-manager.cpp
index 125374f..cb7a0eb 100644
--- a/ukey-manager/ukey-manager.cpp
+++ b/ukey-manager/ukey-manager.cpp
@@ -59,29 +59,8 @@ bool UkeyManager::initDriver()
ULONG UkeyManager::resetUkey()
{
- ULONG ulReval = m_driver->devAuth(m_devHandle);
- if (ulReval != SAR_OK)
- {
- KLOG_ERROR() << "Device authentication failed";
- return ulReval;
- }
- m_driver->deleteAllApplication(m_devHandle);
-
- ulReval = m_driver->createApplication(m_devHandle, DEFAULT_USER_PINCODE, UKEY_APP_NAME, &m_appHandle);
- if (ulReval != SAR_OK)
- {
- KLOG_ERROR() << "create application failed:" << m_driver->getErrorReason(ulReval);
- return ulReval;
- }
- KLOG_DEBUG() << "create application suceess";
- ulReval = m_driver->createContainer(m_appHandle, DEFAULT_USER_PINCODE, UKEY_CONTAINER_NAME, &m_retryCount, &m_containerHandle);
- if (ulReval != SAR_OK)
- {
- KLOG_ERROR() << "create container failed:" << m_driver->getErrorReason(ulReval);
- return ulReval;
- }
- KLOG_DEBUG() << "create new container success";
-
+ ULONG ulReval = m_driver->resetUkey(m_devHandle);
+ m_driver->disConnectDev(m_devHandle);
return ulReval;
}
@@ -102,7 +81,6 @@ ULONG UkeyManager::changePin(const QString &userType, const QString &currentPin,
std::cout << "invalid user type" << std::endl;
return SAR_FAIL;
}
- KLOG_DEBUG() << "m_appHandle:" << m_appHandle;
KLOG_DEBUG() << "type:" << type;
ULONG ret = m_driver->changePin(m_devHandle, type, currentPin, newPin, retryCount);
return ret;
--
2.33.0