00001
00002
00003
00004
00005
00006
00007 #include <ccid.h>
00008 #include <list.h>
00009 #include <emv.h>
00010 #include <ber.h>
00011 #include "emv-internal.h"
00012
00013 static int bop_ptc(const uint8_t *ptr, size_t len, void *priv)
00014 {
00015 int *ctr = priv;
00016 assert(1 == len);
00017 *ctr = *ptr;
00018 return 1;
00019 }
00020
00021 static int ptc(struct _emv *e)
00022 {
00023 static const struct ber_tag tags[] = {
00024 { .tag = "\x9f\x17", .tag_len = 2, .op = bop_ptc},
00025 };
00026 const uint8_t *ptr;
00027 size_t len;
00028 int ctr = -1;
00029
00030 if ( !_emv_get_data(e, 0x9f, 0x17) )
00031 return -1;
00032 ptr = xfr_rx_data(e->e_xfr, &len);
00033 if ( NULL == ptr )
00034 return -1;
00035 if ( !ber_decode(tags, sizeof(tags)/sizeof(*tags), ptr, len, &ctr) ) {
00036 _emv_error(e, EMV_ERR_DATA_ELEMENT_NOT_FOUND);
00037 return -1;
00038 }
00039 return ctr;
00040 }
00041
00042 int emv_pin_try_counter(struct _emv *e)
00043 {
00044 return ptc(e);
00045 }
00046
00047 int emv_cvm_pin(emv_t e, const char *pin)
00048 {
00049 emv_pb_t pb;
00050 int try;
00051
00052 if ( !_emv_pin2pb(pin, pb) ) {
00053 _emv_error(e, EMV_ERR_BAD_PIN_FORMAT);
00054 return 0;
00055 }
00056
00057 try = ptc(e);
00058 if ( _emv_verify(e, 0x80, pb, sizeof(pb)) )
00059 return 1;
00060
00061 if ( _emv_sw1(e) == 0x63 )
00062 _emv_error(e, EMV_ERR_BAD_PIN);
00063
00064 return 0;
00065 }