Changeset 1975 for branches/modular/reader-viaccess.c
- Timestamp:
- 04/06/10 17:45:45 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/modular/reader-viaccess.c
r1905 r1975 1 1 #include "globals.h" 2 2 #include "reader-common.h" 3 4 extern uchar cta_res[];5 extern ushort cta_lr;6 3 7 4 struct geo_cache … … 42 39 } 43 40 44 static void show_class( const char *p, const uchar *b, int l)41 static void show_class(struct s_reader * reader, const char *p, const uchar *b, int l) 45 42 { 46 43 int i, j; … … 64 61 vd.year_e+1980, vd.month_e, vd.day_e); 65 62 else 66 cs_ri_log( "class: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", cls,63 cs_ri_log(reader, "class: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", cls, 67 64 vd.year_s+1980, vd.month_s, vd.day_s, 68 65 vd.year_e+1980, vd.month_e, vd.day_e); … … 70 67 } 71 68 72 static void show_subs( const uchar *emm)69 static void show_subs(struct s_reader * reader, const uchar *emm) 73 70 { 74 71 // emm -> A9, A6, B6 … … 77 74 { 78 75 case 0xA9: 79 show_class( "nano A9: ", emm+2, emm[1]);76 show_class(reader, "nano A9: ", emm+2, emm[1]); 80 77 break; 81 78 /* … … 129 126 } 130 127 131 static int chk_prov( uchar *id, uchar keynr)128 static int chk_prov(struct s_reader * reader, uchar *id, uchar keynr) 132 129 { 133 130 int i, j, rc; 134 for (rc=i=0; (!rc) && (i<reader [ridx].nprov); i++)135 if(!memcmp(&reader [ridx].prid[i][1], id, 3))131 for (rc=i=0; (!rc) && (i<reader->nprov); i++) 132 if(!memcmp(&reader->prid[i][1], id, 3)) 136 133 for (j=0; (!rc) && (j<16); j++) 137 if (reader [ridx].availkeys[i][j]==keynr)134 if (reader->availkeys[i][j]==keynr) 138 135 rc=1; 139 136 return(rc); 140 137 } 141 138 142 #define write_cmd(cmd, data) \ 143 { \ 144 if (card_write(cmd, data)) return ERROR; \ 145 } 146 147 #define read_cmd(cmd, data) \ 148 { \ 149 if (card_write(cmd, NULL)) return ERROR; \ 150 } 151 152 int viaccess_card_init(ATR newatr) 153 { 154 get_atr; 139 int viaccess_card_init(struct s_reader * reader, ATR newatr) 140 { 141 get_atr; 142 def_resp; 155 143 int i; 156 144 uchar buf[256]; … … 177 165 // } 178 166 179 reader [ridx].caid[0]=0x500;180 memset(reader [ridx].prid, 0xff, sizeof(reader[ridx].prid));167 reader->caid[0]=0x500; 168 memset(reader->prid, 0xff, sizeof(reader->prid)); 181 169 insac[2]=0xa4; write_cmd(insac, NULL); // request unique id 182 insb8[4]=0x07; read_cmd(insb8, NULL); // read unique id183 memcpy(reader [ridx].hexserial, cta_res+2, 5);170 insb8[4]=0x07; write_cmd(insb8, NULL); // read unique id 171 memcpy(reader->hexserial, cta_res+2, 5); 184 172 // cs_log("[viaccess-reader] type: Viaccess, ver: %s serial: %llu", ver, b2ll(5, cta_res+2)); 185 cs_ri_log( "type: Viaccess (%sstandard atr), caid: %04X, serial: %llu",186 atr[9]==0x68?"":"non-",reader [ridx].caid[0], b2ll(5, cta_res+2));173 cs_ri_log(reader, "type: Viaccess (%sstandard atr), caid: %04X, serial: %llu", 174 atr[9]==0x68?"":"non-",reader->caid[0], b2ll(5, cta_res+2)); 187 175 188 176 i=0; … … 191 179 while((cta_res[cta_lr-2]==0x90) && (cta_res[cta_lr-1]==0)) 192 180 { 193 insc0[4]=0x1a; read_cmd(insc0, NULL); // show provider properties181 insc0[4]=0x1a; write_cmd(insc0, NULL); // show provider properties 194 182 cta_res[2]&=0xF0; 195 reader [ridx].prid[i][0]=0;196 memcpy(&reader [ridx].prid[i][1], cta_res, 3);197 memcpy(&reader [ridx].availkeys[i][0], cta_res+10, 16);198 sprintf((char *)buf+strlen((char *)buf), ",%06lX", b2i(3, &reader [ridx].prid[i][1]));183 reader->prid[i][0]=0; 184 memcpy(&reader->prid[i][1], cta_res, 3); 185 memcpy(&reader->availkeys[i][0], cta_res+10, 16); 186 sprintf((char *)buf+strlen((char *)buf), ",%06lX", b2i(3, &reader->prid[i][1])); 199 187 //cs_log("[viaccess-reader] buf: %s", buf); 200 188 201 189 insac[2]=0xa5; write_cmd(insac, NULL); // request sa 202 insb8[4]=0x06; read_cmd(insb8, NULL); // read sa203 memcpy(&reader [ridx].sa[i][0], cta_res+2, 4);190 insb8[4]=0x06; write_cmd(insb8, NULL); // read sa 191 memcpy(&reader->sa[i][0], cta_res+2, 4); 204 192 205 193 /* 206 194 insac[2]=0xa7; write_cmd(insac, NULL); // request name 207 insb8[4]=0x02; read_cmd(insb8, NULL); // read name nano + len195 insb8[4]=0x02; write_cmd(insb8, NULL); // read name nano + len 208 196 l=cta_res[1]; 209 insb8[4]=l; read_cmd(insb8, NULL); // read name197 insb8[4]=l; write_cmd(insb8, NULL); // read name 210 198 cta_res[l]=0; 211 199 cs_log("[viaccess-reader] name: %s", cta_res); … … 216 204 i++; 217 205 } 218 reader [ridx].nprov=i;219 cs_ri_log( "providers: %d (%s)", reader[ridx].nprov, buf+1);206 reader->nprov=i; 207 cs_ri_log(reader, "providers: %d (%s)", reader->nprov, buf+1); 220 208 221 209 /* init the maybe existing aes key */ 222 aes_set_key((char *)reader [ridx].aes_key);210 aes_set_key((char *)reader->aes_key); 223 211 224 212 /* disabling parental lock. assuming pin "0000" */ … … 238 226 } 239 227 240 int viaccess_do_ecm(ECM_REQUEST *er) 241 { 228 int viaccess_do_ecm(struct s_reader * reader, ECM_REQUEST *er) 229 { 230 def_resp; 242 231 static unsigned char insa4[] = { 0xca,0xa4,0x04,0x00,0x03 }; // set provider id 243 232 static unsigned char ins88[] = { 0xca,0x88,0x00,0x00,0x00 }; // set ecm … … 274 263 ident[2]&=0xF0; 275 264 keynr=ecm88Data[4]&0x0F; 276 if (!chk_prov( ident, keynr))265 if (!chk_prov(reader, ident, keynr)) 277 266 { 278 267 cs_debug("[viaccess-reader] EMM: provider or key not found on card"); … … 335 324 // 336 325 337 read_cmd(insc0, NULL); // read dcw326 write_cmd(insc0, NULL); // read dcw 338 327 switch(cta_res[0]) 339 328 { … … 359 348 int viaccess_get_emm_type(EMM_PACKET *ep, struct s_reader * rdr) //returns TRUE if shared emm matches SA, unique emm matches serial, or global or unknown 360 349 { 361 rdr=rdr; 362 switch (ep->emm[0]) { 363 case 0x8C: 364 case 0x8D: 365 ep->type=GLOBAL; 366 break; 367 case 0x8E: 368 ep->type=SHARED; 369 break; 370 case 0x88: 371 ep->type=UNIQUE; // ? 372 break; 373 default: 374 ep->type=UNKNOWN; 375 break; 376 } 377 return TRUE; 378 } 379 380 int viaccess_do_emm(EMM_PACKET *ep) 381 { 350 rdr=rdr; 351 ep->type=UNKNOWN; //FIXME not sure how this maps onto global, unique and shared! 352 return TRUE; //FIXME let it all pass without checking serial or SA, without filling ep->hexserial 353 } 354 355 int viaccess_do_emm(struct s_reader * reader, EMM_PACKET *ep) 356 { 357 def_resp; 382 358 static unsigned char insa4[] = { 0xca,0xa4,0x04,0x00,0x03 }; // set provider id 383 359 static unsigned char insf0[] = { 0xca,0xf0,0x00,0x01,0x22 }; // set adf … … 419 395 ident[2]&=0xF0; 420 396 keynr=soid[2]&0x0F; 421 if (chk_prov( ident, keynr)) {397 if (chk_prov(reader, ident, keynr)) { 422 398 provider_ok = 1; 423 399 } else { … … 443 419 uchar *afd; 444 420 445 custwp=reader [ridx].sa[0][3];421 custwp=reader->sa[0][3]; 446 422 afd=(uchar*)emmParsed+2; 447 423 448 424 if( afd[31-custwp/8] & (1 << (custwp & 7)) ) 449 cs_debug("[viaccess-reader] emm for our card %08X", b2i(4, &reader [ridx].sa[0][0]));425 cs_debug("[viaccess-reader] emm for our card %08X", b2i(4, &reader->sa[0][0])); 450 426 else 451 427 return SKIPPED; … … 467 443 } else { 468 444 /* other nanos */ 469 show_subs( emmParsed);445 show_subs(reader, emmParsed); 470 446 471 447 memcpy(ins18Data+ins18Len, emmParsed, emmParsed[1] + 2); … … 548 524 ///cs_log("[viaccess-reader] update error: %02X %02X", cta_res[cta_lr-2], cta_res[cta_lr-1]); 549 525 550 //read_cmd(insc8, insc8Data); this cannot be right, insc8Data would be ignored -- dingo35551 526 write_cmd(insc8, insc8Data); 552 527 if( cta_res[0] != 0x00 || cta_res[1] != 00 || cta_res[cta_lr-2]!=0x90 || cta_res[cta_lr-1]!=0x00 ) { … … 588 563 } 589 564 590 int viaccess_card_info(void) 591 { 565 int viaccess_card_info(struct s_reader * reader) 566 { 567 def_resp; 592 568 int i, l, scls, show_cls; 593 569 static uchar insac[] = { 0xca, 0xac, 0x00, 0x00, 0x00 }; // select data … … 600 576 static uchar pin[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04}; 601 577 602 show_cls=reader [ridx].show_cls;578 show_cls=reader->show_cls; 603 579 memset(&last_geo, 0, sizeof(last_geo)); 604 580 … … 609 585 610 586 insac[2]=0xa4; write_cmd(insac, NULL); // request unique id 611 insb8[4]=0x07; read_cmd(insb8, NULL); // read unique id587 insb8[4]=0x07; write_cmd(insb8, NULL); // read unique id 612 588 cs_log("[viaccess-reader] serial: %llu", b2ll(5, cta_res+2)); 613 589 … … 618 594 ulong l_provid, l_sa; 619 595 uchar l_name[64]; 620 insc0[4]=0x1a; read_cmd(insc0, NULL); // show provider properties596 insc0[4]=0x1a; write_cmd(insc0, NULL); // show provider properties 621 597 cta_res[2]&=0xF0; 622 598 l_provid=b2i(3, cta_res); 623 599 624 600 insac[2]=0xa5; write_cmd(insac, NULL); // request sa 625 insb8[4]=0x06; read_cmd(insb8, NULL); // read sa601 insb8[4]=0x06; write_cmd(insb8, NULL); // read sa 626 602 l_sa=b2i(4, cta_res+2); 627 603 628 604 insac[2]=0xa7; write_cmd(insac, NULL); // request name 629 insb8[4]=0x02; read_cmd(insb8, NULL); // read name nano + len605 insb8[4]=0x02; write_cmd(insb8, NULL); // read name nano + len 630 606 l=cta_res[1]; 631 insb8[4]=l; read_cmd(insb8, NULL); // read name607 insb8[4]=l; write_cmd(insb8, NULL); // read name 632 608 cta_res[l]=0; 633 609 trim((char *)cta_res); … … 639 615 // read GEO 640 616 insac[2]=0xa6; write_cmd(insac, NULL); // request GEO 641 insb8[4]=0x02; read_cmd(insb8, NULL); // read GEO nano + len617 insb8[4]=0x02; write_cmd(insb8, NULL); // read GEO nano + len 642 618 l=cta_res[1]; 643 insb8[4]=l; read_cmd(insb8, NULL); // read geo644 cs_ri_log( "provider: %d, id: %06X%s, sa: %08X, geo: %s",619 insb8[4]=l; write_cmd(insb8, NULL); // read geo 620 cs_ri_log(reader, "provider: %d, id: %06X%s, sa: %08X, geo: %s", 645 621 i, l_provid, l_name, l_sa, (l<4) ? "empty" : cs_hexdump(1, cta_res, l)); 646 622 … … 651 627 while( (cta_res[cta_lr-2]==0x90) && (cta_res[cta_lr-1]==0) ) 652 628 { 653 insb8[4]=0x02; read_cmd(insb8, NULL); // read class subs nano + len629 insb8[4]=0x02; write_cmd(insb8, NULL); // read class subs nano + len 654 630 if( (cta_res[cta_lr-2]==0x90) && (cta_res[cta_lr-1]==0) ) 655 631 { … … 658 634 //fshow=(client[cs_idx].dbglvl==D_DUMP)?1:(scls < show_cls)?1:0; 659 635 fshow=(scls<show_cls); 660 insb8[4]=l; read_cmd(insb8, NULL); // read class subs636 insb8[4]=l; write_cmd(insb8, NULL); // read class subs 661 637 if( (cta_res[cta_lr-2]==0x90) && (fshow) && 662 638 (cta_res[cta_lr-1]==0x00 || cta_res[cta_lr-1]==0x08) ) 663 639 { 664 show_class( NULL, cta_res, cta_lr-2);640 show_class(reader, NULL, cta_res, cta_lr-2); 665 641 scls++; 666 642 }
Note:
See TracChangeset
for help on using the changeset viewer.