mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2024-10-01 01:26:01 -04:00
YubiKey: Retry to recover hotplugging
* Attempt one retry in the event the event the device was removed and re-inserted. Signed-off-by: Kyle Manna <kyle@kylemanna.com>
This commit is contained in:
parent
faa055010f
commit
f7ee528d41
@ -26,6 +26,8 @@
|
||||
#include "keys/YkChallengeResponseKey.h"
|
||||
#include "keys/drivers/YubiKey.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
YkChallengeResponseKey::YkChallengeResponseKey(int slot,
|
||||
bool blocking)
|
||||
: m_slot(slot),
|
||||
@ -46,11 +48,31 @@ YkChallengeResponseKey* YkChallengeResponseKey::clone() const
|
||||
|
||||
/** Assumes yubikey()->init() was called */
|
||||
bool YkChallengeResponseKey::challenge(const QByteArray& chal)
|
||||
{
|
||||
return challenge(chal, 1);
|
||||
}
|
||||
|
||||
bool YkChallengeResponseKey::challenge(const QByteArray& chal, int retries)
|
||||
{
|
||||
if (YubiKey::instance()->challenge(m_slot, true, chal, m_key) != YubiKey::ERROR) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* If challenge failed, retry to detect YubiKeys int the event the YubiKey
|
||||
* was un-plugged and re-plugged */
|
||||
while (retries > 0) {
|
||||
qDebug() << "Attempt" << retries << "to re-detect YubiKey(s)";
|
||||
retries--;
|
||||
|
||||
if (YubiKey::instance()->init() != true) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (YubiKey::instance()->challenge(m_slot, true, chal, m_key) != YubiKey::ERROR) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,8 @@ public:
|
||||
|
||||
QByteArray rawKey() const;
|
||||
YkChallengeResponseKey* clone() const;
|
||||
bool challenge(const QByteArray& challenge);
|
||||
bool challenge(const QByteArray& chal);
|
||||
bool challenge(const QByteArray& chal, int retries);
|
||||
QString getName() const;
|
||||
bool isBlocking() const;
|
||||
|
||||
|
@ -182,6 +182,11 @@ YubiKey::ChallengeResult YubiKey::challenge(int slot, bool mayBlock,
|
||||
int yk_cmd = (slot == 1) ? SLOT_CHAL_HMAC1 : SLOT_CHAL_HMAC2;
|
||||
QByteArray paddedChal = chal;
|
||||
|
||||
/* Ensure that YubiKey::init() succeeded */
|
||||
if (m_yk == NULL) {
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* yk_challenge_response() insists on 64 byte response buffer */
|
||||
resp.resize(64);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user