#include "SCardError.h"
#include <Security/cssmerr.h>
namespace Tokend
{
SCardError::SCardError(uint16_t sw) : statusWord(sw)
{
IFDEBUG(debugDiagnose(this));
}
const char *SCardError::what() const throw ()
{ return "SCardError"; }
OSStatus SCardError::osStatus() const
{
switch (statusWord)
{
case SCARD_SUCCESS:
return 0;
case SCARD_FILE_FILLED:
case SCARD_MEMORY_FAILURE:
case SCARD_NO_MEMORY_LEFT:
return CSSM_ERRCODE_MEMORY_ERROR;
case SCARD_AUTHENTICATION_FAILED:
case SCARD_AUTHENTICATION_FAILED_0:
case SCARD_AUTHENTICATION_FAILED_1:
case SCARD_AUTHENTICATION_FAILED_2:
case SCARD_AUTHENTICATION_FAILED_3:
case SCARD_AUTHENTICATION_FAILED_4:
case SCARD_AUTHENTICATION_FAILED_5:
case SCARD_AUTHENTICATION_FAILED_6:
case SCARD_AUTHENTICATION_FAILED_7:
case SCARD_AUTHENTICATION_FAILED_8:
case SCARD_AUTHENTICATION_FAILED_9:
case SCARD_AUTHENTICATION_FAILED_10:
case SCARD_AUTHENTICATION_FAILED_11:
case SCARD_AUTHENTICATION_FAILED_12:
case SCARD_AUTHENTICATION_FAILED_13:
case SCARD_AUTHENTICATION_FAILED_14:
case SCARD_AUTHENTICATION_FAILED_15:
case SCARD_AUTHENTICATION_BLOCKED:
return CSSM_ERRCODE_OPERATION_AUTH_DENIED;
case SCARD_COMMAND_NOT_ALLOWED:
case SCARD_NOT_AUTHORIZED:
case SCARD_USE_CONDITIONS_NOT_MET:
return CSSM_ERRCODE_OBJECT_USE_AUTH_DENIED;
case SCARD_FUNCTION_NOT_SUPPORTED:
case SCARD_INSTRUCTION_CODE_INVALID:
return CSSM_ERRCODE_FUNCTION_NOT_IMPLEMENTED;
case SCARD_FILE_NOT_FOUND:
case SCARD_RECORD_NOT_FOUND:
return CSSMERR_DL_RECORD_NOT_FOUND;
case SCARD_BYTES_LEFT_IN_SW2:
case SCARD_EXECUTION_WARNING:
case SCARD_RETURNED_DATA_CORRUPTED:
case SCARD_END_OF_FILE_REACHED:
case SCARD_FILE_INVALIDATED:
case SCARD_FCI_INVALID:
case SCARD_EXECUTION_ERROR:
case SCARD_CHANGED_ERROR:
case SCARD_LENGTH_INCORRECT:
case SCARD_CLA_UNSUPPORTED:
case SCARD_LOGICAL_CHANNEL_UNSUPPORTED:
case SCARD_SECURE_MESSAGING_UNSUPPORTED:
case SCARD_COMMAND_INCOMPATIBLE:
case SCARD_REFERENCED_DATA_INVALIDATED:
case SCARD_NO_CURRENT_EF:
case SCARD_SM_DATA_OBJECTS_MISSING:
case SCARD_SM_DATA_NOT_ALLOWED:
case SCARD_WRONG_PARAMETER:
case SCARD_DATA_INCORRECT:
case SCARD_LC_INCONSISTENT_TLV:
case SCARD_INCORRECT_P1_P2:
case SCARD_LC_INCONSISTENT_P1_P2:
case SCARD_REFERENCED_DATA_NOT_FOUND:
case SCARD_WRONG_PARAMETER_P1_P2:
case SCARD_LE_IN_SW2:
case SCARD_INSTRUCTION_CLASS_UNSUPPORTED:
case SCARD_UNSPECIFIED_ERROR:
default:
return CSSM_ERRCODE_INTERNAL_ERROR;
}
}
int SCardError::unixError() const
{
switch (statusWord)
{
default:
return -1;
}
}
void SCardError::throwMe(uint16_t sw)
{ throw SCardError(sw); }
#if !defined(NDEBUG)
void SCardError::debugDiagnose(const void *id) const
{
secdebug("exception", "%p Error %s (%04hX)",
id, errorstr(statusWord), statusWord);
}
const char *SCardError::errorstr(uint16_t sw)
{
switch (sw)
{
case SCARD_SUCCESS:
return "Success";
case SCARD_BYTES_LEFT_IN_SW2:
return "SW2 indicates the number of response bytes still available";
case SCARD_EXECUTION_WARNING:
return "Execution warning, state of non-volatile memory unchanged";
case SCARD_RETURNED_DATA_CORRUPTED:
return "Part of returned data may be corrupted.";
case SCARD_END_OF_FILE_REACHED:
return "End of file/record reached before reading Le bytes.";
case SCARD_FILE_INVALIDATED:
return "Selected file invalidated.";
case SCARD_FCI_INVALID:
return "FCI not formatted according to 1.1.5.";
case SCARD_AUTHENTICATION_FAILED:
return "Authentication failed.";
case SCARD_FILE_FILLED:
return "File filled up by the last write.";
case SCARD_AUTHENTICATION_FAILED_0:
return "Authentication failed, 0 retries left.";
case SCARD_AUTHENTICATION_FAILED_1:
return "Authentication failed, 1 retry left.";
case SCARD_AUTHENTICATION_FAILED_2:
return "Authentication failed, 2 retries left.";
case SCARD_AUTHENTICATION_FAILED_3:
return "Authentication failed, 3 retries left.";
case SCARD_AUTHENTICATION_FAILED_4:
return "Authentication failed, 4 retries left.";
case SCARD_AUTHENTICATION_FAILED_5:
return "Authentication failed, 5 retries left.";
case SCARD_AUTHENTICATION_FAILED_6:
return "Authentication failed, 6 retries left.";
case SCARD_AUTHENTICATION_FAILED_7:
return "Authentication failed, 7 retries left.";
case SCARD_AUTHENTICATION_FAILED_8:
return "Authentication failed, 8 retries left.";
case SCARD_AUTHENTICATION_FAILED_9:
return "Authentication failed, 9 retries left.";
case SCARD_AUTHENTICATION_FAILED_10:
return "Authentication failed, 10 retries left.";
case SCARD_AUTHENTICATION_FAILED_11:
return "Authentication failed, 11 retries left.";
case SCARD_AUTHENTICATION_FAILED_12:
return "Authentication failed, 12 retries left.";
case SCARD_AUTHENTICATION_FAILED_13:
return "Authentication failed, 13 retries left.";
case SCARD_AUTHENTICATION_FAILED_14:
return "Authentication failed, 14 retries left.";
case SCARD_AUTHENTICATION_FAILED_15:
return "Authentication failed, 15 retries left.";
case SCARD_EXECUTION_ERROR:
return "Execution error, state of non-volatile memory unchanged.";
case SCARD_CHANGED_ERROR:
return "Execution error, state of non-volatile memory changed.";
case SCARD_MEMORY_FAILURE:
return "Memory failure.";
case SCARD_LENGTH_INCORRECT:
return "The length is incorrect.";
case SCARD_CLA_UNSUPPORTED:
return "Functions in CLA not supported.";
case SCARD_LOGICAL_CHANNEL_UNSUPPORTED:
return "Logical channel not supported.";
case SCARD_SECURE_MESSAGING_UNSUPPORTED:
return "Secure messaging not supported.";
case SCARD_COMMAND_NOT_ALLOWED:
return "Command not allowed.";
case SCARD_COMMAND_INCOMPATIBLE:
return "Command incompatible with file structure.";
case SCARD_NOT_AUTHORIZED:
return "Security status not satisfied.";
case SCARD_AUTHENTICATION_BLOCKED:
return "Authentication method blocked.";
case SCARD_REFERENCED_DATA_INVALIDATED:
return "Referenced data invalidated.";
case SCARD_USE_CONDITIONS_NOT_MET:
return "Conditions of use not satisfied.";
case SCARD_NO_CURRENT_EF:
return "Command not allowed (no current EF).";
case SCARD_SM_DATA_OBJECTS_MISSING:
return "Expected SM data objects missing.";
case SCARD_SM_DATA_NOT_ALLOWED:
return "SM data objects incorrect.";
case SCARD_WRONG_PARAMETER:
return "Wrong parameter.";
case SCARD_DATA_INCORRECT:
return "Incorrect parameters in the data field.";
case SCARD_FUNCTION_NOT_SUPPORTED:
return "Function not supported.";
case SCARD_FILE_NOT_FOUND:
return "File not found.";
case SCARD_RECORD_NOT_FOUND:
return "Record not found.";
case SCARD_NO_MEMORY_LEFT:
return "Not enough memory space in the file.";
case SCARD_LC_INCONSISTENT_TLV:
return "Lc inconsistent with TLV structure.";
case SCARD_INCORRECT_P1_P2:
return "Incorrect parameters P1-P2.";
case SCARD_LC_INCONSISTENT_P1_P2:
return "Lc inconsistent with P1-P2.";
case SCARD_REFERENCED_DATA_NOT_FOUND:
return "Referenced data not found.";
case SCARD_WRONG_PARAMETER_P1_P2:
return "Wrong parameter(s) P1-P2.";
case SCARD_LE_IN_SW2:
return "Wrong length Le: SW2 indicates the exact length";
case SCARD_INSTRUCTION_CODE_INVALID:
return "The instruction code is not programmed or is invalid.";
case SCARD_INSTRUCTION_CLASS_UNSUPPORTED:
return "The card does not support the instruction class.";
case SCARD_UNSPECIFIED_ERROR:
return "No precise diagnostic is given.";
default:
return "Unknown error";
}
}
#endif //NDEBUG
}