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_atc(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 atc(struct _emv *e, int online)
00022 {
00023 static const struct ber_tag tags[] = {
00024 { .tag = "\x9f\x13", .tag_len = 2, .op = bop_atc},
00025 { .tag = "\x9f\x36", .tag_len = 2, .op = bop_atc},
00026 };
00027 const uint8_t *ptr;
00028 size_t len;
00029 int ctr = -1;
00030
00031 if ( !_emv_get_data(e, 0x9f, (online) ? 0x13 : 0x36) )
00032 return -1;
00033 ptr = xfr_rx_data(e->e_xfr, &len);
00034 if ( NULL == ptr )
00035 return -1;
00036 if ( !ber_decode(tags, sizeof(tags)/sizeof(*tags), ptr, len, &ctr) )
00037 return -1;
00038 return ctr;
00039 }
00040
00041 int emv_trm_last_online_atc(struct _emv *e)
00042 {
00043 return atc(e, 1);
00044 }
00045
00046 int emv_trm_atc(struct _emv *e)
00047 {
00048 return atc(e, 0);
00049 }