00001
00002
00003
00004
00005
00006
00007 #include <ccid.h>
00008 #include <errno.h>
00009 #include <list.h>
00010 #include <emv.h>
00011 #include <ber.h>
00012 #include "emv-internal.h"
00013
00014 void _emv_sys_error(struct _emv *e)
00015 {
00016 e->e_err = (EMV_ERR_SYSTEM << EMV_ERR_TYPE_SHIFT) |
00017 (errno & EMV_ERR_CODE_MASK);
00018 }
00019
00020 void _emv_ccid_error(struct _emv *e)
00021 {
00022 e->e_err = (EMV_ERR_CCID << EMV_ERR_TYPE_SHIFT);
00023 }
00024
00025 void _emv_icc_error(struct _emv *e)
00026 {
00027 e->e_err = (EMV_ERR_ICC << EMV_ERR_TYPE_SHIFT) |
00028 (_emv_sw1(e) << 8) |
00029 _emv_sw2(e);
00030 }
00031
00032 void _emv_error(struct _emv *e, unsigned int code)
00033 {
00034 e->e_err = (EMV_ERR_EMV << EMV_ERR_TYPE_SHIFT) |
00035 (code & EMV_ERR_CODE_MASK);
00036 }
00037
00038 emv_err_t emv_error(emv_t e)
00039 {
00040 return e->e_err;
00041 }
00042
00043 void _emv_success(struct _emv *e)
00044 {
00045 e->e_err = 0;
00046 }
00047
00048 unsigned int emv_error_type(emv_err_t e)
00049 {
00050 return e >> EMV_ERR_TYPE_SHIFT;
00051 }
00052
00053 unsigned int emv_error_additional(emv_err_t e)
00054 {
00055 return e & EMV_ERR_CODE_MASK;
00056 }
00057
00058 static const struct {
00059 uint16_t code;
00060 const char * const str;
00061 }icc_errs[] = {
00062 {0x6283, "Selected file not found"},
00063 {0x6700, "Wrong length >:)"},
00064 {0x6985, "Conditions of use not satisfied"},
00065 {0x6a81, "Selected function not supported"},
00066 {0x6a83, "Record not found"},
00067 {0x6a84, "Not enough memory space in file"},
00068 {0x6a85, "Lc inconsistent with TLV structure"},
00069 {0x6a86, "Incorrect parameters P1-P2"},
00070 {0x6a88, "Referenced data not found"},
00071 {0x6b00, "Bad parameters P1-P2"},
00072 {0x6c00, "Wrong Le field"},
00073 {0x6d00, "Bad INS"},
00074 {0x6e00, "Bad CLA"},
00075 };
00076 static const char *icc_err_string(uint32_t code)
00077 {
00078 unsigned int i;
00079 for(i = 0; i < sizeof(icc_errs)/sizeof(*icc_errs); i++)
00080 if ( icc_errs[i].code == code )
00081 return icc_errs[i].str;
00082 return NULL;
00083 }
00084
00085 static const char * const emv_errs[] = {
00086 [ EMV_ERR_SUCCESS ] "Success",
00087 [ EMV_ERR_DATA_ELEMENT_NOT_FOUND ] "Data element not found",
00088 [ EMV_ERR_BAD_PIN_FORMAT ] "Bad PIN format",
00089 [ EMV_ERR_FUNC_NOT_SUPPORTED ] "Function not supported",
00090 [ EMV_ERR_KEY_NOT_FOUND ] "Key not found",
00091 [ EMV_ERR_KEY_SIZE_MISMATCH ] "Key size mismatch",
00092 [ EMV_ERR_RSA_RECOVERY ] "RSA Recovery failed on message",
00093 [ EMV_ERR_CERTIFICATE ] "Invalid issuer public key certificate",
00094 [ EMV_ERR_SSA_SIGNATURE ] "Invald SSA data signature",
00095 [ EMV_ERR_BAD_PIN ] "Wrong PIN",
00096 [ EMV_ERR_BER_DECODE ] "Malformed BER TLV data",
00097 [ EMV_ERR_APP_NOT_SELECTED ] "No application selected",
00098 };
00099
00100 static const char *err_string(uint32_t code)
00101 {
00102 if ( code < sizeof(emv_errs)/sizeof(*emv_errs) )
00103 return emv_errs[code];
00104 return "oops";
00105 }
00106
00107 const char *emv_error_string(emv_err_t err)
00108 {
00109 switch ( err >> EMV_ERR_TYPE_SHIFT ) {
00110 case EMV_ERR_SYSTEM:
00111 return strerror(err & EMV_ERR_CODE_MASK);
00112 case EMV_ERR_CCID:
00113 return "Communication with ICC interrupted";
00114 case EMV_ERR_ICC:
00115 return icc_err_string(err & EMV_ERR_CODE_MASK);
00116 case EMV_ERR_EMV:
00117 return err_string(err & EMV_ERR_CODE_MASK);
00118 default:
00119 return "Error in error code...heh";
00120 }
00121 }