5 #include "module-gbox.h"
6 #include "module-led.h"
8 #include "oscam-client.h"
10 #include "oscam-emm.h"
11 #include "oscam-net.h"
12 #include "oscam-time.h"
13 #include "oscam-work.h"
14 #include "oscam-reader.h"
15 #include "reader-common.h"
16 //#include "csctapi/atr.h"
17 #include "csctapi/icc_async.h"
18 #include "readers.h" // required by the EMU reader
20 extern const struct s_cardsystem
*cardsystems
[];
21 extern char *RDR_CD_TXT
[];
23 int32_t check_sct_len(const uint8_t *data
, int32_t off
)
25 int32_t len
= SCT_LEN(data
);
26 if(len
+ off
> MAX_LEN
)
28 cs_log_dbg(D_TRACE
| D_READER
, "check_sct_len(): smartcard section too long %d > %d", len
, MAX_LEN
- off
);
34 static void reader_nullcard(struct s_reader
*reader
)
36 reader
->csystem_active
= false;
37 reader
->csystem
= NULL
;
38 memset(reader
->hexserial
, 0, sizeof(reader
->hexserial
));
39 memset(reader
->prid
, 0xFF, sizeof(reader
->prid
));
42 cs_clear_entitlement(reader
);
45 int32_t reader_cmd2icc(struct s_reader
*reader
, const uint8_t *buf
, const int32_t l
, uint8_t *cta_res
, uint16_t *p_cta_lr
)
48 *p_cta_lr
= CTA_RES_LEN
- 1; // FIXME not sure whether this one is necessary
49 rdr_log_dump_dbg(reader
, D_READER
, buf
, l
, "write to cardreader");
50 rc
= ICC_Async_CardWrite(reader
, (uint8_t *)buf
, (uint16_t)l
, cta_res
, p_cta_lr
);
56 int32_t card_write(struct s_reader
*reader
, const uint8_t *cmd
, const uint8_t *data
, uint8_t *response
, uint16_t *response_length
)
58 int32_t datalen
= MAX_ECM_SIZE
; // default datalen is max ecm size defined
59 uint8_t buf
[MAX_ECM_SIZE
+ CMD_LEN
];
60 // always copy to be able to be able to use const buffer without changing all code
61 memcpy(buf
, cmd
, CMD_LEN
); // copy command
69 memcpy(buf
+ CMD_LEN
, data
, datalen
);
70 return (reader_cmd2icc(reader
, buf
, CMD_LEN
+ datalen
, response
, response_length
));
73 { return (reader_cmd2icc(reader
, buf
, CMD_LEN
, response
, response_length
)); }
76 static inline int reader_use_gpio(struct s_reader
*reader
)
78 return reader
->use_gpio
&& reader
->detect
> 4;
81 static int32_t reader_card_inserted(struct s_reader
*reader
)
83 if(!reader_use_gpio(reader
) && (reader
->detect
& 0x7f) > 3)
87 if(ICC_Async_GetStatus(reader
, &card
))
89 rdr_log(reader
, "Error getting card status.");
90 return 0; // corresponds with no card inside!!
95 static int32_t reader_activate_card(struct s_reader
*reader
, ATR
*atr
, uint16_t deprecated
)
99 if(reader
->card_status
!= CARD_NEED_INIT
)
103 for(i
= 0; i
< 3; i
++)
105 ret
= ICC_Async_Activate(reader
, atr
, deprecated
);
108 rdr_log(reader
, "Error activating card.");
109 led_status_card_activation_error();
112 if(ret
) { return (0); }
114 //rdr_log("ATR: %s", cs_hexdump(1, atr, atr_size, tmp, sizeof(tmp))); // FIXME
119 void cardreader_get_card_info(struct s_reader
*reader
)
121 if((reader
->card_status
== CARD_NEED_INIT
) || (reader
->card_status
== CARD_INSERTED
))
123 struct s_client
*cl
= reader
->client
;
125 { cl
->last
= time((time_t *)0); }
127 if(reader
->csystem_active
&& reader
->csystem
&& reader
->csystem
->card_info
)
129 reader
->csystem
->card_info(reader
);
134 void cardreader_poll_status(struct s_reader
*reader
)
136 if (reader
&& reader
->card_status
== CARD_INSERTED
)
138 if (reader
->csystem_active
&& reader
->csystem
&& reader
->csystem
->poll_status
)
139 { reader
->csystem
->poll_status(reader
); }
143 static int32_t reader_get_cardsystem(struct s_reader
*reader
, ATR
*atr
)
148 if(reader
->typ
== R_EMU
)
150 NULLFREE(reader
->csystem_data
);
151 rdr_log(reader
, "found card system %s", reader_emu
.desc
);
152 reader
->csystem
= &reader_emu
;
153 reader
->csystem_active
= true;
154 led_status_found_cardsystem();
155 return (reader
->csystem_active
);
159 for(i
= 0; cardsystems
[i
]; i
++)
161 NULLFREE(reader
->csystem_data
);
162 const struct s_cardsystem
*csystem
= cardsystems
[i
];
163 if(csystem
->card_init(reader
, atr
))
165 rdr_log(reader
, "found card system %s", csystem
->desc
);
166 reader
->csystem
= csystem
;
167 reader
->csystem_active
= true;
168 led_status_found_cardsystem();
173 // On error free allocated card system data if any
174 if(csystem
->card_done
)
175 csystem
->card_done(reader
);
176 NULLFREE(reader
->csystem_data
);
180 if(!reader
->csystem_active
)
182 rdr_log(reader
, "card system not supported");
183 led_status_unsupported_card_system();
186 return (reader
->csystem_active
);
189 void cardreader_do_reset(struct s_reader
*reader
)
191 reader_nullcard(reader
);
196 if (reader
->typ
== R_SMART
&& reader
->smartdev_found
>= 4) j
= 1; else j
= 1; // back to a single start
198 for (i
= 0; i
< j
; i
++)
200 ret
= ICC_Async_Reset(reader
, &atr
, reader_activate_card
, reader_get_cardsystem
);
210 if (reader
->typ
== R_SMART
&& reader
->smartdev_found
>= 4) y
= 2; else y
= 2;
211 //rdr_log(reader, "the restart atempts in deprecated is %u", y);
213 for(deprecated
= reader
->deprecated
; deprecated
< y
; deprecated
++)
215 if(!reader_activate_card(reader
, &atr
, deprecated
)) { break; }
217 ret
= reader_get_cardsystem(reader
, &atr
);
222 { rdr_log(reader
, "Normal mode failed, reverting to Deprecated Mode"); }
228 rdr_log(reader
,"THIS WAS A SUCCESSFUL START ATTEMPT No %u out of max allotted of %u", (i
+ 1), j
);
233 rdr_log(reader
, "THIS WAS A FAILED START ATTEMPT No %u out of max allotted of %u", (i
+ 1), j
);
239 reader
->card_status
= CARD_FAILURE
;
240 rdr_log(reader
, "card initializing error");
241 ICC_Async_DisplayMsg(reader
, "AER");
242 led_status_card_activation_error();
246 cardreader_get_card_info(reader
);
247 reader
->card_status
= CARD_INSERTED
;
248 do_emm_from_file(reader
);
249 ICC_Async_DisplayMsg(reader
, "AOK");
250 gbx_local_card_stat(2, reader
->caid
); // local card up
256 static int32_t cardreader_device_init(struct s_reader
*reader
)
258 int32_t rc
= -1; // FIXME
259 if(ICC_Async_Device_Init(reader
))
260 { rdr_log(reader
, "Cannot open device: %s", reader
->device
); }
263 return ((rc
!= OK
) ? 2 : 0); // exit code 2 means keep retrying, exit code 0 means all OK
266 int32_t cardreader_do_checkhealth(struct s_reader
*reader
)
268 struct s_client
*cl
= reader
->client
;
269 if(reader_card_inserted(reader
))
271 if(reader
->card_status
== NO_CARD
|| reader
->card_status
== UNKNOWN
)
273 rdr_log(reader
, "card detected");
274 led_status_card_detected();
275 reader
->card_status
= CARD_NEED_INIT
;
276 add_job(cl
, ACTION_READER_RESET
, NULL
, 0);
281 rdr_log_dbg(reader
, D_READER
, "%s: !reader_card_inserted", __func__
);
282 if(reader
->card_status
== CARD_INSERTED
|| reader
->card_status
== CARD_NEED_INIT
)
284 rdr_log(reader
, "card ejected");
285 reader_nullcard(reader
);
286 if(reader
->csystem
&& reader
->csystem
->card_done
)
287 reader
->csystem
->card_done(reader
);
288 NULLFREE(reader
->csystem_data
);
295 led_status_card_ejected();
296 gbx_local_card_stat(1, reader
->caid
);
298 reader
->card_status
= NO_CARD
;
300 rdr_log_dbg(reader
, D_READER
, "%s: reader->card_status = %d, ret = %d", __func__
,
301 reader
->card_status
, reader
->card_status
== CARD_INSERTED
);
303 return reader
->card_status
== CARD_INSERTED
;
306 // Check for card inserted or card removed on pysical reader
307 void cardreader_checkhealth(struct s_client
*cl
, struct s_reader
*rdr
)
309 if(!rdr
|| !rdr
->enable
|| !rdr
->active
)
311 add_job(cl
, ACTION_READER_CHECK_HEALTH
, NULL
, 0);
314 void cardreader_reset(struct s_client
*cl
)
316 add_job(cl
, ACTION_READER_RESET
, NULL
, 0);
319 void cardreader_init_locks(void)
321 ICC_Async_Init_Locks();
324 bool cardreader_init(struct s_reader
*reader
)
326 struct s_client
*client
= reader
->client
;
329 set_localhost_ip(&client
->ip
);
331 while((cardreader_device_init(reader
) == 2) && i
< 10)
334 if(!ll_contains(configured_readers
, reader
) || !is_valid_client(client
) || reader
->enable
!= 1)
341 reader
->card_status
= READER_DEVICE_ERROR
;
342 cardreader_close(reader
);
348 if(reader
->typ
== R_INTERNAL
)
350 if(boxtype_is("dm8000") || boxtype_is("dm800") || boxtype_is("dm800se"))
351 {reader
->cardmhz
= 2700;}
353 if(boxtype_is("dm500") || boxtype_is("dm600pvr"))
354 {reader
->cardmhz
= 3150;}
356 if(boxtype_is("dm7025"))
357 {reader
->cardmhz
= 8300;}
359 if((!strncmp(boxtype_get(), "vu", 2 ))||(boxtype_is("ini-8000am")))
360 {reader
->cardmhz
= 2700; reader
->mhz
= 450;} // only one speed for vu+ and Atemio Nemesis due to usage of TDA8024
363 if((reader
->cardmhz
> 2000) && (reader
->typ
!= R_SMART
))
365 rdr_log(reader
, "Reader initialized (device=%s, detect=%s%s, pll max=%.2f MHz, wanted mhz=%.2f MHz)",
367 reader
->detect
& 0x80 ? "!" : "",
368 RDR_CD_TXT
[reader
->detect
& 0x7f],
369 (float)reader
->cardmhz
/ 100,
370 (float)reader
->mhz
/ 100);
371 rdr_log(reader
,"Reader sci internal, detected box type: %s", boxtype_get());
375 if (reader
->typ
== R_SMART
|| is_smargo_reader(reader
))
377 rdr_log_dbg(reader
, D_IFD
, "clocking for smartreader with smartreader or smargo protocol");
378 if (reader
->cardmhz
>= 2000) reader
->cardmhz
= 369; else
379 if (reader
->cardmhz
>= 1600) reader
->cardmhz
= 1600; else
380 if (reader
->cardmhz
>= 1200) reader
->cardmhz
= 1200; else
381 if (reader
->cardmhz
>= 961) reader
->cardmhz
= 961; else
382 if (reader
->cardmhz
>= 800) reader
->cardmhz
= 800; else
383 if (reader
->cardmhz
>= 686) reader
->cardmhz
= 686; else
384 if (reader
->cardmhz
>= 600) reader
->cardmhz
= 600; else
385 if (reader
->cardmhz
>= 534) reader
->cardmhz
= 534; else
386 if (reader
->cardmhz
>= 480) reader
->cardmhz
= 480; else
387 if (reader
->cardmhz
>= 436) reader
->cardmhz
= 436; else
388 if (reader
->cardmhz
>= 400) reader
->cardmhz
= 400; else
389 if (reader
->cardmhz
>= 369) reader
->cardmhz
= 369; else
390 if (reader
->cardmhz
== 357) reader
->cardmhz
= 369; else // 357 not a default smartreader setting
391 if (reader
->cardmhz
>= 343) reader
->cardmhz
= 343; else
392 reader
->cardmhz
= 320;
394 if (reader
->mhz
>= 1600) reader
->mhz
= 1600; else
395 if (reader
->mhz
>= 1200) reader
->mhz
= 1200; else
396 if (reader
->mhz
>= 961) reader
->mhz
= 961; else
397 if (reader
->mhz
>= 900) reader
->mhz
= 900; else
398 if (reader
->mhz
>= 800) reader
->mhz
= 800; else
399 if (reader
->mhz
>= 686) reader
->mhz
= 686; else
400 if (reader
->mhz
>= 600) reader
->mhz
= 600; else
401 if (reader
->mhz
>= 534) reader
->mhz
= 534; else
402 if (reader
->mhz
>= 480) reader
->mhz
= 480; else
403 if (reader
->mhz
>= 436) reader
->mhz
= 436; else
404 if (reader
->mhz
>= 400) reader
->mhz
= 369; else
405 if (reader
->mhz
>= 369) reader
->mhz
= 369; else
406 if (reader
->mhz
== 357) reader
->mhz
= 369; else // 357 not a default smartreader setting
407 if (reader
->mhz
>= 343) reader
->mhz
= 343; else
411 if ((reader
->typ
== R_SMART
|| is_smargo_reader(reader
)) && reader
->autospeed
== 1)
413 rdr_log(reader
, "Reader initialized (device=%s, detect=%s%s, mhz= AUTO, cardmhz=%d)",
415 reader
->detect
& 0x80 ? "!" : "",
416 RDR_CD_TXT
[reader
->detect
& 0x7f],
421 rdr_log(reader
, "Reader initialized (device=%s, detect=%s%s, mhz=%d, cardmhz=%d)",
423 reader
->detect
& 0x80 ? "!" : "",
424 RDR_CD_TXT
[reader
->detect
& 0x7f],
428 if (reader
->typ
== R_INTERNAL
&& !(reader
->cardmhz
> 2000))
429 rdr_log(reader
,"Reader sci internal, detected box type: %s", boxtype_get());
436 void cardreader_close(struct s_reader
*reader
)
438 ICC_Async_Close(reader
);
441 void reader_post_process(struct s_reader
*reader
)
443 // some systems eg. nagra2/3 needs post process after receiving cw from card
444 // To save ECM/CW time we added this function after writing ecm answer
445 if(reader
->csystem_active
&& reader
->csystem
&& reader
->csystem
->post_process
)
447 reader
->csystem
->post_process(reader
);
451 int32_t cardreader_do_ecm(struct s_reader
*reader
, ECM_REQUEST
*er
, struct s_ecm_answer
*ea
)
454 if((rc
= cardreader_do_checkhealth(reader
)))
456 rdr_log_dbg(reader
, D_READER
, "%s: cardreader_do_checkhealth returned rc=%d", __func__
, rc
);
457 struct s_client
*cl
= reader
->client
;
460 cl
->last_srvid
= er
->srvid
;
461 cl
->last_caid
= er
->caid
;
462 cl
->last_provid
= er
->prid
;
463 cl
->last
= time((time_t *)0);
466 if(reader
->csystem_active
&& reader
->csystem
&& reader
->csystem
->do_ecm
)
468 rc
= reader
->csystem
->do_ecm(reader
, er
, ea
);
469 rdr_log_dbg(reader
, D_READER
, "%s: after csystem->do_ecm rc=%d", __func__
, rc
);
474 rdr_log_dbg(reader
, D_READER
, "%s: ret rc=%d", __func__
, rc
);
478 int32_t cardreader_do_emm(struct s_reader
*reader
, EMM_PACKET
*ep
)
482 // check health does not work with new card status check but is actually not needed for emm.
483 if(reader
->typ
== R_SMART
)
490 rc
= cardreader_do_checkhealth(reader
);
495 if((1 << (ep
->emm
[0] % 0x80)) & reader
->b_nano
)
498 if(reader
->csystem_active
&& reader
->csystem
&& reader
->csystem
->do_emm
)
499 { rc
= reader
->csystem
->do_emm(reader
, ep
); }
504 if(rc
> 0) { cs_ftime(&reader
->emm_last
); } // last time emm written is now!
508 void cardreader_process_ecm(struct s_reader
*reader
, struct s_client
*cl
, ECM_REQUEST
*er
)
510 struct timeb tps
, tpe
;
511 struct s_ecm_answer ea
;
512 memset(&ea
, 0, sizeof(struct s_ecm_answer
));
514 #ifdef WITH_EXTENDED_CW
515 // Correct CSA mode is CBC - default to that instead
516 ea
.cw_ex
.algo_mode
= CW_ALGO_MODE_CBC
;
520 int32_t rc
= cardreader_do_ecm(reader
, er
, &ea
);
523 rdr_log_dbg(reader
, D_READER
, "%s: cardreader_do_ecm returned rc=%d (ERROR=%d)", __func__
, rc
, ERROR
);
525 ea
.rc
= E_FOUND
; // default assume found
526 ea
.rcEx
= 0; // no special flag
530 char buf
[CS_SERVICENAME_SIZE
];
531 rdr_log_dbg(reader
, D_READER
, "Error processing ecm for caid %04X, provid %06X, srvid %04X, servicename: %s",
532 er
->caid
, er
->prid
, er
->srvid
, get_servicename(cl
, er
->srvid
, er
->prid
, er
->caid
, buf
, sizeof(buf
)));
535 ICC_Async_DisplayMsg(reader
, "Eer");
540 char buf
[CS_SERVICENAME_SIZE
];
541 rdr_log_dbg(reader
, D_READER
, "Error processing ecm for caid %04X, provid %06X, srvid %04X, servicename: %s",
542 er
->caid
, er
->prid
, er
->srvid
, get_servicename(cl
, er
->srvid
, er
->prid
, er
->caid
, buf
, sizeof(buf
)));
544 ea
.rcEx
= E2_WRONG_CHKSUM
; // flag it as wrong checksum
545 memcpy(ea
.msglog
, "Invalid ecm type for card", 25);
548 write_ecm_answer(reader
, er
, ea
.rc
, ea
.rcEx
, ea
.cw
, ea
.msglog
, ea
.tier
, &ea
.cw_ex
);
550 cl
->lastecm
= time((time_t *)0);
552 cs_hexdump(0, er
->ecmd5
, 16, ecmd5
, sizeof(ecmd5
));
554 rdr_log_dbg(reader
, D_READER
, "ecm hash: %s real time: %"PRId64
" ms", ecmd5
, comp_timeb(&tpe
, &tps
));
556 reader_post_process(reader
);