AusweisApp2/src/card/base/command/UnblockPinCommand.cpp

57 lines
1.3 KiB
C++
Raw Normal View History

2017-07-03 09:30:10 +02:00
/*!
* UnblockPinCommand.cpp
*
* \copyright Copyright (c) 2014 Governikus GmbH & Co. KG
*/
#include "CardConnection.h"
#include "UnblockPinCommand.h"
using namespace governikus;
UnblockPinCommand::UnblockPinCommand(QSharedPointer<CardConnectionWorker> pCardConnectionWorker, const QString& pPuk)
: BaseCardCommand(pCardConnectionWorker)
, mPuk(pPuk)
{
}
UnblockPinCommand::~UnblockPinCommand()
{
}
void UnblockPinCommand::internalExecute()
{
mReturnCode = mCardConnectionWorker->updateRetryCounter();
2017-07-03 09:33:28 +02:00
if (mReturnCode != CardReturnCode::OK)
2017-07-03 09:30:10 +02:00
{
return;
}
if (mCardConnectionWorker->getReaderInfo().getRetryCounter() != 0 || mCardConnectionWorker->getReaderInfo().isPinDeactivated())
{
2017-07-03 09:33:28 +02:00
mReturnCode = CardReturnCode::PIN_NOT_BLOCKED;
2017-07-03 09:30:10 +02:00
return;
}
EstablishPACEChannelOutput output;
mReturnCode = mCardConnectionWorker->establishPaceChannel(PACE_PIN_ID::PACE_PUK, mPuk, output);
2017-07-03 09:33:28 +02:00
if (mReturnCode != CardReturnCode::OK)
2017-07-03 09:30:10 +02:00
{
return;
}
// unblock PIN (reset retry counter)
ResponseApdu response;
mReturnCode = mCardConnectionWorker->transmit(ResetRetryCounterBuilder().build(), response);
2017-07-03 09:33:28 +02:00
if (mReturnCode == CardReturnCode::OK && response.getSW1() == Enum<SW1>::getValue(SW1::ERROR_COMMAND_NOT_ALLOWED))
2017-07-03 09:30:10 +02:00
{
2017-09-15 10:23:30 +02:00
mCardConnectionWorker->setPukInoperative();
2017-07-03 09:33:28 +02:00
mReturnCode = CardReturnCode::PUK_INOPERATIVE;
2017-07-03 09:30:10 +02:00
}
}