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

57 lines
1.3 KiB
C++

/*!
* 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();
if (mReturnCode != CardReturnCode::OK)
{
return;
}
if (mCardConnectionWorker->getReaderInfo().getRetryCounter() != 0 || mCardConnectionWorker->getReaderInfo().isPinDeactivated())
{
mReturnCode = CardReturnCode::PIN_NOT_BLOCKED;
return;
}
EstablishPACEChannelOutput output;
mReturnCode = mCardConnectionWorker->establishPaceChannel(PACE_PIN_ID::PACE_PUK, mPuk, output);
if (mReturnCode != CardReturnCode::OK)
{
return;
}
// unblock PIN (reset retry counter)
ResponseApdu response;
mReturnCode = mCardConnectionWorker->transmit(ResetRetryCounterBuilder().build(), response);
if (mReturnCode == CardReturnCode::OK && response.getSW1() == Enum<SW1>::getValue(SW1::ERROR_COMMAND_NOT_ALLOWED))
{
mCardConnectionWorker->setPukInoperative();
mReturnCode = CardReturnCode::PUK_INOPERATIVE;
}
}