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 do_sel(emv_t e, uint8_t p1, uint8_t p2,
00014 const uint8_t *name, size_t nlen)
00015 {
00016 uint8_t sw2;
00017
00018 assert(nlen < 0x100);
00019 xfr_reset(e->e_xfr);
00020 xfr_tx_byte(e->e_xfr, 0x00);
00021 xfr_tx_byte(e->e_xfr, 0xa4);
00022 xfr_tx_byte(e->e_xfr, p1);
00023 xfr_tx_byte(e->e_xfr, p2);
00024 xfr_tx_byte(e->e_xfr, nlen);
00025 xfr_tx_buf(e->e_xfr, name, nlen);
00026
00027 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00028 _emv_ccid_error(e);
00029 return 0;
00030 }
00031
00032 if ( xfr_rx_sw1(e->e_xfr) != 0x61 ) {
00033 _emv_icc_error(e);
00034 return 0;
00035 }
00036 sw2 = xfr_rx_sw2(e->e_xfr);
00037
00038 xfr_reset(e->e_xfr);
00039 xfr_tx_byte(e->e_xfr, 0x00);
00040 xfr_tx_byte(e->e_xfr, 0xc0);
00041 xfr_tx_byte(e->e_xfr, 0);
00042 xfr_tx_byte(e->e_xfr, 0);
00043 xfr_tx_byte(e->e_xfr, sw2);
00044
00045 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00046 _emv_ccid_error(e);
00047 return 0;
00048 }
00049
00050 if ( xfr_rx_sw1(e->e_xfr) != 0x90 ) {
00051 _emv_icc_error(e);
00052 return 0;
00053 }
00054
00055 return 1;
00056 }
00057
00058 int _emv_select(emv_t e, const uint8_t *name, size_t nlen)
00059 {
00060 return do_sel(e, 0x04, 0, name, nlen);
00061 }
00062
00063 int _emv_select_next(emv_t e, const uint8_t *name, size_t nlen)
00064 {
00065 return do_sel(e, 0x04, 0x2, name, nlen);
00066 }
00067
00068 int _emv_read_record(emv_t e, uint8_t sfi, uint8_t record)
00069 {
00070 uint8_t sw2, p2;
00071
00072 p2 = (sfi << 3) | (1 << 2);
00073
00074 xfr_reset(e->e_xfr);
00075 xfr_tx_byte(e->e_xfr, 0x00);
00076 xfr_tx_byte(e->e_xfr, 0xb2);
00077 xfr_tx_byte(e->e_xfr, record);
00078 xfr_tx_byte(e->e_xfr, p2);
00079 xfr_tx_byte(e->e_xfr, 0);
00080
00081 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00082 _emv_ccid_error(e);
00083 return 0;
00084 }
00085
00086 if ( xfr_rx_sw1(e->e_xfr) != 0x6c ) {
00087 _emv_icc_error(e);
00088 return 0;
00089 }
00090 sw2 = xfr_rx_sw2(e->e_xfr);
00091
00092 xfr_reset(e->e_xfr);
00093 xfr_tx_byte(e->e_xfr, 0x00);
00094 xfr_tx_byte(e->e_xfr, 0xb2);
00095 xfr_tx_byte(e->e_xfr, record);
00096 xfr_tx_byte(e->e_xfr, p2);
00097 xfr_tx_byte(e->e_xfr, sw2);
00098
00099 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00100 _emv_ccid_error(e);
00101 return 0;
00102 }
00103
00104 if ( xfr_rx_sw1(e->e_xfr) != 0x90 ) {
00105 _emv_icc_error(e);
00106 return 0;
00107 }
00108
00109 return 1;
00110 }
00111 int _emv_get_data(emv_t e, uint8_t p1, uint8_t p2)
00112 {
00113 uint8_t sw2;
00114
00115 xfr_reset(e->e_xfr);
00116 xfr_tx_byte(e->e_xfr, 0x80);
00117 xfr_tx_byte(e->e_xfr, 0xca);
00118 xfr_tx_byte(e->e_xfr, p1);
00119 xfr_tx_byte(e->e_xfr, p2);
00120 xfr_tx_byte(e->e_xfr, 0);
00121
00122 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00123 _emv_ccid_error(e);
00124 return 0;
00125 }
00126
00127 if ( xfr_rx_sw1(e->e_xfr) != 0x6c ) {
00128 _emv_icc_error(e);
00129 return 0;
00130 }
00131 sw2 = xfr_rx_sw2(e->e_xfr);
00132
00133 xfr_reset(e->e_xfr);
00134 xfr_tx_byte(e->e_xfr, 0x80);
00135 xfr_tx_byte(e->e_xfr, 0xca);
00136 xfr_tx_byte(e->e_xfr, p1);
00137 xfr_tx_byte(e->e_xfr, p2);
00138 xfr_tx_byte(e->e_xfr, sw2);
00139
00140 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00141 _emv_ccid_error(e);
00142 return 0;
00143 }
00144
00145 if ( xfr_rx_sw1(e->e_xfr) != 0x90 ) {
00146 _emv_icc_error(e);
00147 return 0;
00148 }
00149
00150 return 1;
00151 }
00152
00153 int _emv_verify(emv_t e, uint8_t fmt, const uint8_t *pin, uint8_t plen)
00154 {
00155 xfr_reset(e->e_xfr);
00156 xfr_tx_byte(e->e_xfr, 0x00);
00157 xfr_tx_byte(e->e_xfr, 0x20);
00158 xfr_tx_byte(e->e_xfr, 0);
00159 xfr_tx_byte(e->e_xfr, fmt);
00160 xfr_tx_byte(e->e_xfr, plen);
00161 xfr_tx_buf(e->e_xfr, pin, plen);
00162
00163 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00164 _emv_ccid_error(e);
00165 return 0;
00166 }
00167
00168 if ( xfr_rx_sw1(e->e_xfr) != 0x90 ) {
00169 _emv_icc_error(e);
00170 return 0;
00171 }
00172
00173 return 1;
00174 }
00175
00176 int _emv_get_proc_opts(emv_t e, const uint8_t *dol, uint8_t len)
00177 {
00178 uint8_t sw2;
00179
00180 xfr_reset(e->e_xfr);
00181 xfr_tx_byte(e->e_xfr, 0x80);
00182 xfr_tx_byte(e->e_xfr, 0xa8);
00183 xfr_tx_byte(e->e_xfr, 0);
00184 xfr_tx_byte(e->e_xfr, 0);
00185 xfr_tx_byte(e->e_xfr, len);
00186 xfr_tx_buf(e->e_xfr, dol, len);
00187 xfr_tx_byte(e->e_xfr, 0);
00188
00189 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00190 _emv_ccid_error(e);
00191 return 0;
00192 }
00193
00194 if ( xfr_rx_sw1(e->e_xfr) != 0x61 ) {
00195 _emv_icc_error(e);
00196 return 0;
00197 }
00198 sw2 = xfr_rx_sw2(e->e_xfr);
00199
00200 xfr_reset(e->e_xfr);
00201 xfr_tx_byte(e->e_xfr, 0x00);
00202 xfr_tx_byte(e->e_xfr, 0xc0);
00203 xfr_tx_byte(e->e_xfr, 0);
00204 xfr_tx_byte(e->e_xfr, 0);
00205 xfr_tx_byte(e->e_xfr, sw2);
00206
00207 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00208 _emv_ccid_error(e);
00209 return 0;
00210 }
00211
00212 if ( xfr_rx_sw1(e->e_xfr) != 0x90 ) {
00213 _emv_icc_error(e);
00214 return 0;
00215 }
00216
00217 return 1;
00218 }
00219
00220 int _emv_generate_ac(emv_t e, uint8_t ref,
00221 const uint8_t *data, uint8_t len)
00222 {
00223 uint8_t sw2;
00224
00225 xfr_reset(e->e_xfr);
00226 xfr_tx_byte(e->e_xfr, 0x80);
00227 xfr_tx_byte(e->e_xfr, 0xae);
00228 xfr_tx_byte(e->e_xfr, ref);
00229 xfr_tx_byte(e->e_xfr, 0);
00230 xfr_tx_byte(e->e_xfr, len);
00231 xfr_tx_buf(e->e_xfr, data, len);
00232 xfr_tx_byte(e->e_xfr, 0);
00233
00234 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00235 _emv_ccid_error(e);
00236 return 0;
00237 }
00238
00239 if ( xfr_rx_sw1(e->e_xfr) != 0x61 ) {
00240 _emv_icc_error(e);
00241 return 0;
00242 }
00243 sw2 = xfr_rx_sw2(e->e_xfr);
00244
00245 xfr_reset(e->e_xfr);
00246 xfr_tx_byte(e->e_xfr, 0x00);
00247 xfr_tx_byte(e->e_xfr, 0xc0);
00248 xfr_tx_byte(e->e_xfr, 0);
00249 xfr_tx_byte(e->e_xfr, 0);
00250 xfr_tx_byte(e->e_xfr, sw2);
00251
00252 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00253 _emv_ccid_error(e);
00254 return 0;
00255 }
00256
00257 if ( xfr_rx_sw1(e->e_xfr) != 0x90 ) {
00258 _emv_icc_error(e);
00259 return 0;
00260 }
00261
00262 return 1;
00263 }
00264
00265 _private int _emv_int_authenticate(emv_t e, const uint8_t *data, uint8_t len)
00266 {
00267 uint8_t sw2;
00268
00269 xfr_reset(e->e_xfr);
00270 xfr_tx_byte(e->e_xfr, 0x00);
00271 xfr_tx_byte(e->e_xfr, 0x88);
00272 xfr_tx_byte(e->e_xfr, 0);
00273 xfr_tx_byte(e->e_xfr, 0);
00274 xfr_tx_byte(e->e_xfr, len);
00275 xfr_tx_buf(e->e_xfr, data, len);
00276 xfr_tx_byte(e->e_xfr, 0);
00277
00278 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00279 _emv_ccid_error(e);
00280 return 0;
00281 }
00282
00283 if ( xfr_rx_sw1(e->e_xfr) != 0x61 ) {
00284 _emv_icc_error(e);
00285 return 0;
00286 }
00287 sw2 = xfr_rx_sw2(e->e_xfr);
00288
00289 xfr_reset(e->e_xfr);
00290 xfr_tx_byte(e->e_xfr, 0x00);
00291 xfr_tx_byte(e->e_xfr, 0xc0);
00292 xfr_tx_byte(e->e_xfr, 0);
00293 xfr_tx_byte(e->e_xfr, 0);
00294 xfr_tx_byte(e->e_xfr, sw2);
00295
00296 if ( !chipcard_transact(e->e_dev, e->e_xfr) ) {
00297 _emv_ccid_error(e);
00298 return 0;
00299 }
00300
00301 if ( xfr_rx_sw1(e->e_xfr) != 0x90 ) {
00302 _emv_icc_error(e);
00303 return 0;
00304 }
00305
00306 return 1;
00307 }