Changeset 1926 for trunk/reader-viaccess.c
- Timestamp:
- 04/02/10 16:21:14 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/reader-viaccess.c
r1899 r1926 42 42 } 43 43 44 static void show_class( const char *p, const uchar *b, int l)44 static void show_class(struct s_reader * reader, const char *p, const uchar *b, int l) 45 45 { 46 46 int i, j; … … 64 64 vd.year_e+1980, vd.month_e, vd.day_e); 65 65 else 66 cs_ri_log( "class: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", cls,66 cs_ri_log(reader, "class: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", cls, 67 67 vd.year_s+1980, vd.month_s, vd.day_s, 68 68 vd.year_e+1980, vd.month_e, vd.day_e); … … 70 70 } 71 71 72 static void show_subs( const uchar *emm)72 static void show_subs(struct s_reader * reader, const uchar *emm) 73 73 { 74 74 // emm -> A9, A6, B6 … … 77 77 { 78 78 case 0xA9: 79 show_class( "nano A9: ", emm+2, emm[1]);79 show_class(reader, "nano A9: ", emm+2, emm[1]); 80 80 break; 81 81 /* … … 129 129 } 130 130 131 static int chk_prov( uchar *id, uchar keynr)131 static int chk_prov(struct s_reader * reader, uchar *id, uchar keynr) 132 132 { 133 133 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))134 for (rc=i=0; (!rc) && (i<reader->nprov); i++) 135 if(!memcmp(&reader->prid[i][1], id, 3)) 136 136 for (j=0; (!rc) && (j<16); j++) 137 if (reader [ridx].availkeys[i][j]==keynr)137 if (reader->availkeys[i][j]==keynr) 138 138 rc=1; 139 139 return(rc); … … 142 142 #define write_cmd(cmd, data) \ 143 143 { \ 144 if (card_write( cmd, data)) return ERROR; \144 if (card_write(reader, cmd, data)) return ERROR; \ 145 145 } 146 146 147 147 #define read_cmd(cmd, data) \ 148 148 { \ 149 if (card_write( cmd, NULL)) return ERROR; \150 } 151 152 int viaccess_card_init( ATR newatr)149 if (card_write(reader, cmd, NULL)) return ERROR; \ 150 } 151 152 int viaccess_card_init(struct s_reader * reader, ATR newatr) 153 153 { 154 154 get_atr; … … 177 177 // } 178 178 179 reader [ridx].caid[0]=0x500;180 memset(reader [ridx].prid, 0xff, sizeof(reader[ridx].prid));179 reader->caid[0]=0x500; 180 memset(reader->prid, 0xff, sizeof(reader->prid)); 181 181 insac[2]=0xa4; write_cmd(insac, NULL); // request unique id 182 182 insb8[4]=0x07; read_cmd(insb8, NULL); // read unique id 183 memcpy(reader [ridx].hexserial, cta_res+2, 5);183 memcpy(reader->hexserial, cta_res+2, 5); 184 184 // 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));185 cs_ri_log(reader, "type: Viaccess (%sstandard atr), caid: %04X, serial: %llu", 186 atr[9]==0x68?"":"non-",reader->caid[0], b2ll(5, cta_res+2)); 187 187 188 188 i=0; … … 193 193 insc0[4]=0x1a; read_cmd(insc0, NULL); // show provider properties 194 194 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]));195 reader->prid[i][0]=0; 196 memcpy(&reader->prid[i][1], cta_res, 3); 197 memcpy(&reader->availkeys[i][0], cta_res+10, 16); 198 sprintf((char *)buf+strlen((char *)buf), ",%06lX", b2i(3, &reader->prid[i][1])); 199 199 //cs_log("[viaccess-reader] buf: %s", buf); 200 200 201 201 insac[2]=0xa5; write_cmd(insac, NULL); // request sa 202 202 insb8[4]=0x06; read_cmd(insb8, NULL); // read sa 203 memcpy(&reader [ridx].sa[i][0], cta_res+2, 4);203 memcpy(&reader->sa[i][0], cta_res+2, 4); 204 204 205 205 /* … … 216 216 i++; 217 217 } 218 reader [ridx].nprov=i;219 cs_ri_log( "providers: %d (%s)", reader[ridx].nprov, buf+1);218 reader->nprov=i; 219 cs_ri_log(reader, "providers: %d (%s)", reader->nprov, buf+1); 220 220 221 221 /* init the maybe existing aes key */ 222 aes_set_key((char *)reader [ridx].aes_key);222 aes_set_key((char *)reader->aes_key); 223 223 224 224 /* disabling parental lock. assuming pin "0000" */ … … 238 238 } 239 239 240 int viaccess_do_ecm( ECM_REQUEST *er)240 int viaccess_do_ecm(struct s_reader * reader, ECM_REQUEST *er) 241 241 { 242 242 static unsigned char insa4[] = { 0xca,0xa4,0x04,0x00,0x03 }; // set provider id … … 251 251 int hasD2 = 0; 252 252 uchar DE04[256]; 253 254 memset(DE04, 0, sizeof(DE04));255 253 256 254 if(ecm88Data[0]==0xd2) … … 274 272 ident[2]&=0xF0; 275 273 keynr=ecm88Data[4]&0x0F; 276 if (!chk_prov( ident, keynr))274 if (!chk_prov(reader, ident, keynr)) 277 275 { 278 276 cs_debug("[viaccess-reader] EMM: provider or key not found on card"); … … 359 357 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 358 { 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) 359 rdr=rdr; 360 ep->type=UNKNOWN; //FIXME not sure how this maps onto global, unique and shared! 361 return TRUE; //FIXME let it all pass without checking serial or SA, without filling ep->hexserial 362 } 363 364 int viaccess_do_emm(struct s_reader * reader, EMM_PACKET *ep) 381 365 { 382 366 static unsigned char insa4[] = { 0xca,0xa4,0x04,0x00,0x03 }; // set provider id … … 419 403 ident[2]&=0xF0; 420 404 keynr=soid[2]&0x0F; 421 if (chk_prov( ident, keynr)) {405 if (chk_prov(reader, ident, keynr)) { 422 406 provider_ok = 1; 423 407 } else { … … 443 427 uchar *afd; 444 428 445 custwp=reader [ridx].sa[0][3];429 custwp=reader->sa[0][3]; 446 430 afd=(uchar*)emmParsed+2; 447 431 448 432 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]));433 cs_debug("[viaccess-reader] emm for our card %08X", b2i(4, &reader->sa[0][0])); 450 434 else 451 435 return SKIPPED; … … 467 451 } else { 468 452 /* other nanos */ 469 show_subs( emmParsed);453 show_subs(reader, emmParsed); 470 454 471 455 memcpy(ins18Data+ins18Len, emmParsed, emmParsed[1] + 2); … … 588 572 } 589 573 590 int viaccess_card_info( void)574 int viaccess_card_info(struct s_reader * reader) 591 575 { 592 576 int i, l, scls, show_cls; … … 600 584 static uchar pin[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04}; 601 585 602 show_cls=reader [ridx].show_cls;586 show_cls=reader->show_cls; 603 587 memset(&last_geo, 0, sizeof(last_geo)); 604 588 … … 642 626 l=cta_res[1]; 643 627 insb8[4]=l; read_cmd(insb8, NULL); // read geo 644 cs_ri_log( "provider: %d, id: %06X%s, sa: %08X, geo: %s",628 cs_ri_log(reader, "provider: %d, id: %06X%s, sa: %08X, geo: %s", 645 629 i, l_provid, l_name, l_sa, (l<4) ? "empty" : cs_hexdump(1, cta_res, l)); 646 630 … … 662 646 (cta_res[cta_lr-1]==0x00 || cta_res[cta_lr-1]==0x08) ) 663 647 { 664 show_class( NULL, cta_res, cta_lr-2);648 show_class(reader, NULL, cta_res, cta_lr-2); 665 649 scls++; 666 650 }
Note:
See TracChangeset
for help on using the changeset viewer.