int32_t ICC_Async_Activate(struct s_reader *reader, ATR *atr, uint16_t deprecated) { rdr_debug_mask(reader, D_IFD, "Activating card"); reader->current_baudrate = DEFAULT_BAUDRATE; if(reader->atr[0] != 0 && !reader->ins7e11_fast_reset) { rdr_log(reader, "Using ATR from reader config"); ATR_InitFromArray(atr, reader->atr, ATR_MAX_SIZE); } else { call(reader->crdr.activate(reader, atr)); if(reader->crdr.skip_extra_atr_parsing) { return OK; } } unsigned char atrarr[ATR_MAX_SIZE]; uint32_t atr_size; ATR_GetRaw(atr, atrarr, &atr_size); char tmp[atr_size * 3 + 1]; rdr_log(reader, "ATR: %s", cs_hexdump(1, atrarr, atr_size, tmp, sizeof(tmp))); memcpy(reader->card_atr, atrarr, atr_size); reader->card_atr_length = atr_size; /* Get ICC reader->convention */ if(ATR_GetConvention(atr, &(reader->convention)) != ATR_OK) { rdr_log(reader, "ERROR: Could not read reader->convention"); reader->convention = 0; reader->protocol_type = 0; return ERROR; } reader->protocol_type = ATR_PROTOCOL_TYPE_T0; // Parse_ATR and InitCard need to be included in lock because they change parity of serial port if(reader->crdr.lock) { reader->crdr.lock(reader); } int32_t ret = Parse_ATR(reader, atr, deprecated); if(reader->crdr.unlock) { reader->crdr.unlock(reader); } if(ret) { rdr_log(reader, "ERROR: Parse_ATR returned error"); } if(ret) { return ERROR; } rdr_debug_mask(reader, D_IFD, "Card succesfully activated"); return OK; }
int32_t ICC_Async_Activate (struct s_reader *reader, ATR * atr, uint16_t deprecated) { cs_debug_mask (D_IFD, "IFD: Activating card in reader %s\n", reader->label); reader->current_baudrate = DEFAULT_BAUDRATE; //this is needed for all readers to calculate work_etu for timings if (reader->atr[0] != 0) { cs_log("using ATR from reader config"); ATR_InitFromArray(atr, reader->atr, ATR_MAX_SIZE); } else { if (reader->crdr.active==1 && reader->crdr.activate) { call(reader->crdr.activate(reader, atr)); } else { switch(reader->typ) { case R_MP35: case R_DB2COM1: case R_DB2COM2: case R_SC8in1: case R_MOUSE: LOCK_SC8IN1; int32_t ret = Phoenix_Reset(reader, atr); UNLOCK_SC8IN1; if (ret) { cs_debug_mask(D_TRACE, "ERROR, function call Phoenix_Reset returns error."); return ERROR; } break; #if defined(LIBUSB) case R_SMART: call (SR_Reset(reader, atr)); break; #endif case R_INTERNAL: #if defined(SCI_DEV) call (Sci_Activate(reader)); call (Sci_Reset(reader, atr)); #elif defined(COOL) call (Cool_Reset(atr)); #elif defined(WITH_STAPI) call (STReader_Reset(reader->stsmart_handle, atr)); #elif defined(AZBOX) call (Azbox_Reset(reader, atr)); #endif break; #ifdef HAVE_PCSC case R_PCSC: { unsigned char atrarr[ATR_MAX_SIZE]; uint16_t atr_size = 0; if (pcsc_activate_card(reader, atrarr, &atr_size)) { if (ATR_InitFromArray (atr, atrarr, atr_size) == ATR_OK) return OK; else return ERROR; } else return ERROR; } break; #endif default: cs_log("ERROR ICC_Async_Activate: unknow reader type %i",reader->typ); return ERROR; } } } unsigned char atrarr[ATR_MAX_SIZE]; uint32_t atr_size; ATR_GetRaw(atr, atrarr, &atr_size); char tmp[atr_size*3+1]; cs_ri_log(reader, "ATR: %s", cs_hexdump(1, atrarr, atr_size, tmp, sizeof(tmp))); /* Get ICC reader->convention */ if (ATR_GetConvention (atr, &(reader->convention)) != ATR_OK) { cs_log("ERROR: Could not read reader->convention"); reader->convention = 0; reader->protocol_type = 0; return ERROR; } reader->protocol_type = ATR_PROTOCOL_TYPE_T0; LOCK_SC8IN1; int32_t ret = Parse_ATR(reader, atr, deprecated); UNLOCK_SC8IN1; //Parse_ATR and InitCard need to be included in lock because they change parity of serial port if (ret) cs_log("ERROR: Parse_ATR returned error"); if (ret) return ERROR; cs_debug_mask (D_IFD, "IFD: Card in reader %s succesfully activated\n", reader->label); return OK; }
int32_t ICC_Async_Activate(struct s_reader *reader, ATR *atr, uint16_t deprecated) { rdr_debug_mask(reader, D_IFD, "Activating card"); reader->current_baudrate = DEFAULT_BAUDRATE; if(reader->atr[0] != 0 && !reader->ins7e11_fast_reset) { rdr_log(reader, "Using ATR from reader config"); ATR_InitFromArray(atr, reader->atr, ATR_MAX_SIZE); } else { call(reader->crdr.activate(reader, atr)); if(reader->crdr.skip_extra_atr_parsing) { return OK; } } unsigned char atrarr[ATR_MAX_SIZE]; uint32_t atr_size; ATR_GetRaw(atr, atrarr, &atr_size); char tmp[atr_size * 3 + 1]; // dirty hack for seca cards on Golden Interstar Xspeed internal reader char *hack_golden_interstar = cs_hexdump(1, atrarr, atr_size, tmp, sizeof(tmp)); int result = strncmp(hack_golden_interstar, "18 40 D8 ", sizeof(tmp)); if (!result) { rdr_log(reader, "Disabling rom rev detection. Golden Star internal reader dirty hack"); reader->ins7e11_fast_reset = 2; } // end dirty hack If a solution to the stb's sci driver is found remove this hack rdr_log(reader, "ATR: %s", cs_hexdump(1, atrarr, atr_size, tmp, sizeof(tmp))); memcpy(reader->card_atr, atrarr, atr_size); reader->card_atr_length = atr_size; /* Get ICC reader->convention */ if(ATR_GetConvention(atr, &(reader->convention)) != ATR_OK) { rdr_log(reader, "ERROR: Could not read reader->convention"); reader->convention = 0; reader->protocol_type = 0; return ERROR; } reader->protocol_type = ATR_PROTOCOL_TYPE_T0; // Parse_ATR and InitCard need to be included in lock because they change parity of serial port if(reader->crdr.lock) { reader->crdr.lock(reader); } int32_t ret = Parse_ATR(reader, atr, deprecated); if(reader->crdr.unlock) { reader->crdr.unlock(reader); } if(ret) { rdr_log(reader, "ERROR: Parse_ATR returned error"); } if(ret) { return ERROR; } rdr_debug_mask(reader, D_IFD, "Card succesfully activated"); return OK; }