Changeset 2069
- Timestamp:
- 04/13/10 13:57:22 (14 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/globals.h
r2059 r2069 27 27 28 28 #include <pthread.h> 29 30 //for reader-nagra variables in s_reader: 31 #include "cscrypt/idea.h" 29 32 30 33 #ifndef CS_GLOBALS … … 421 424 FTAB ftab; // user [caid] and ident filter 422 425 CLASSTAB cltab; 426 }; 427 428 //for viaccess var in s_reader: 429 struct geo_cache 430 { 431 ulong provid; 432 uchar geo[256]; 433 uchar geo_len; 423 434 }; 424 435 … … 544 555 ////variables from reader-dre.c 545 556 unsigned char provider; 557 ////variables from reader-nagra.c 558 IDEA_KEY_SCHEDULE ksSession; 559 int is_pure_nagra; 560 int is_tiger; 561 int has_dt08; 562 int swapCW; 563 unsigned char rom[15]; 564 unsigned char plainDT08RSA[64]; 565 unsigned char IdeaCamKey[16]; 566 unsigned char irdId[4]; 567 unsigned char sessi[16]; 568 unsigned char signature[8]; 569 unsigned char cam_state[3]; 570 ////variables from reader-cryptoworks.c 571 BIGNUM exp; 572 BIGNUM ucpk; 573 ////variables from reader-viaccess.c 574 struct geo_cache last_geo; 546 575 }; 547 576 -
trunk/module-cccam.c
r2004 r2069 1413 1413 reader[ridx].device, reader[ridx].r_port, 1414 1414 reader[ridx].cc_version, reader[ridx].cc_build, reader[ridx].cc_maxhop); 1415 cc_cli_connect(); 1416 1417 return(0); 1415 1416 return(cc_cli_connect()); 1418 1417 } 1419 1418 return(-1); -
trunk/reader-common.c
r2068 r2069 67 67 #endif 68 68 69 cs_ddump(buf, l, "write to cardreader %s:",reader->label);70 69 *p_cta_lr=CTA_RES_LEN-1; //FIXME not sure whether this one is necessary 71 70 cs_ptyp_orig=cs_ptyp; … … 76 75 Sc8in1_Selectslot(reader, reader->slot); 77 76 } 77 cs_ddump(buf, l, "write to cardreader %s:",reader->label); 78 78 rc=ICC_Async_CardWrite(reader, buf, (unsigned short)l, cta_res, p_cta_lr); 79 cs_ddump(cta_res, *p_cta_lr, "answer from cardreader %s:", reader->label); 79 80 if (reader->typ == R_SC8in1) { 80 81 cs_debug("SC8in1: unlocked for CardWrite of slot %i", reader->slot); … … 82 83 } 83 84 cs_ptyp=cs_ptyp_orig; 84 cs_ddump(cta_res, *p_cta_lr, "answer from cardreader %s:", reader->label);85 85 return rc; 86 86 } -
trunk/reader-cryptoworks.c
r2020 r2069 1 1 #include "globals.h" 2 2 #include "reader-common.h" 3 4 static BIGNUM exp, ucpk;5 3 6 4 #define CMD_LEN 5 … … 224 222 { 225 223 ipk=BN_new(); 226 BN_bin2bn(cwexp, sizeof(cwexp), & exp);224 BN_bin2bn(cwexp, sizeof(cwexp), &reader->exp); 227 225 BN_bin2bn(keybuf, 64, ipk); 228 RSA(cta_res+2, cta_res+2, 0x40, & exp, ipk, 0);226 RSA(cta_res+2, cta_res+2, 0x40, &reader->exp, ipk, 0); 229 227 BN_free(ipk); 230 228 reader->ucpk_valid =(cta_res[2]==((mfid & 0xFF)>>1)); … … 232 230 { 233 231 cta_res[2]|=0x80; 234 BN_bin2bn(cta_res+2, 0x40, & ucpk);232 BN_bin2bn(cta_res+2, 0x40, &reader->ucpk); 235 233 cs_ddump(cta_res+2, 0x40, "IPK available -> session-key:"); 236 234 } … … 240 238 if (reader->ucpk_valid) 241 239 { 242 BN_bin2bn(keybuf, 0x40, & ucpk);240 BN_bin2bn(keybuf, 0x40, &reader->ucpk); 243 241 cs_ddump(keybuf, 0x40, "session-key found:"); 244 242 } … … 412 410 if(reader->ucpk_valid) 413 411 { 414 RSA(&cta_res[i+2],&cta_res[i+2], n, & exp, &ucpk, 0);412 RSA(&cta_res[i+2],&cta_res[i+2], n, &reader->exp, &reader->ucpk, 0); 415 413 cs_debug("[cryptoworks-reader] after camcrypt "); 416 414 r=0; secLen=n-4; n=4; -
trunk/reader-nagra.c
r2019 r2069 6 6 7 7 IDEA_KEY_SCHEDULE ksSession; 8 int is_pure_nagra=0;9 int is_tiger=0;10 int has_dt08=0;11 int swapCW=0;12 unsigned char rom[15];13 unsigned char plainDT08RSA[64];14 unsigned char IdeaCamKey[16];15 unsigned char irdId[] = {0xff,0xff,0xff,0xff};16 unsigned char sessi[16];17 unsigned char signature[8];18 unsigned char cam_state[3];19 8 20 9 // Card Status checks 21 #define HAS_CW() (( cam_state[2]&6)==6)22 #define RENEW_SESSIONKEY() (( cam_state[0]&128)==128 || (cam_state[0]&64)==64 || (cam_state[0]&32)==32 || (cam_state[2]&8)==8)23 #define SENDDATETIME() ( cam_state[0]&8)10 #define HAS_CW() ((reader->cam_state[2]&6)==6) 11 #define RENEW_SESSIONKEY() ((reader->cam_state[0]&128)==128 || (reader->cam_state[0]&64)==64 || (reader->cam_state[0]&32)==32 || (reader->cam_state[2]&8)==8) 12 #define SENDDATETIME() (reader->cam_state[0]&8) 24 13 // Datatypes 25 14 #define DT01 0x01 … … 72 61 return ERROR; 73 62 } 74 if ( is_pure_nagra==1)63 if (reader->is_pure_nagra==1) 75 64 { 76 65 msg[4]+=1; … … 133 122 if(do_cmd(reader, 0xC0,0x02,0xB0,0x06,NULL,cta_res,&cta_lr)) 134 123 { 135 memcpy( cam_state,cta_res+3,3);136 cs_debug("[nagra-reader] Camstate: %s",cs_hexdump (1, cam_state, 3));124 memcpy(reader->cam_state,cta_res+3,3); 125 cs_debug("[nagra-reader] Camstate: %s",cs_hexdump (1, reader->cam_state, 3)); 137 126 } 138 127 else … … 205 194 206 195 memcpy(reader->hexserial+2, parte_fija+15, 4); 207 memcpy( irdId, parte_fija+19, 4);196 memcpy(reader->irdId, parte_fija+19, 4); 208 197 memcpy(d1_rsa_modulo,parte_fija+23,88); 209 198 … … 230 219 memcpy(sk,&parte_variable[79],8); 231 220 memcpy(sk+8,&parte_variable[79],8); 232 cs_ri_log(reader, "type: NAGRA, caid: %04X, IRD ID: %s",reader->caid[0], cs_hexdump (1, irdId,4));221 cs_ri_log(reader, "type: NAGRA, caid: %04X, IRD ID: %s",reader->caid[0], cs_hexdump (1,reader->irdId,4)); 233 222 cs_ri_log(reader, "ProviderID: %s",cs_hexdump (1,reader->prid[0],4)); 234 223 … … 260 249 if (cta_res[2] == 0x00) 261 250 { 262 memcpy( sessi,sk,16);251 memcpy(reader->sessi,sk,16); 263 252 IDEA_KEY_SCHEDULE ks; 264 idea_set_encrypt_key( sessi,&ks);265 idea_set_decrypt_key(&ks,& ksSession);253 idea_set_encrypt_key(reader->sessi,&ks); 254 idea_set_decrypt_key(&ks,&reader->ksSession); 266 255 cs_debug("[nagra-reader] session key negotiated"); 267 256 return OK; … … 283 272 unsigned char sign2[8]; 284 273 285 if ( is_tiger)274 if (reader->is_tiger) 286 275 { 287 276 if (!NegotiateSessionKey_Tiger(reader)) … … 292 281 return OK; 293 282 } 294 if (! has_dt08) // if we have no valid dt08 calc then we use rsa from config and hexserial for calc of sessionkey295 { 296 memcpy( plainDT08RSA, reader->rsa_mod, 64);297 memcpy( signature,reader->nagra_boxkey, 8);283 if (!reader->has_dt08) // if we have no valid dt08 calc then we use rsa from config and hexserial for calc of sessionkey 284 { 285 memcpy(reader->plainDT08RSA, reader->rsa_mod, 64); 286 memcpy(reader->signature,reader->nagra_boxkey, 8); 298 287 } 299 288 if(!do_cmd(reader, 0x2a,0x02,0xaa,0x42,NULL,cta_res,&cta_lr)) … … 311 300 BIGNUM *bnCT = BN_CTX_get(ctx); 312 301 BIGNUM *bnPT = BN_CTX_get(ctx); 313 BN_bin2bn( plainDT08RSA, 64, bnN);302 BN_bin2bn(reader->plainDT08RSA, 64, bnN); 314 303 BN_bin2bn(vFixed+3, 1, bnE); 315 304 BN_bin2bn(cta_res+2, 64, bnCT); … … 323 312 // build sessionkey 324 313 // first halve is IDEA Hashed in chuncs of 8 bytes using the Signature1 from dt08 calc, CamID-Inv.CamID(16 bytes key) the results are the First 8 bytes of the Session key 325 memcpy(idea1, signature, 8);314 memcpy(idea1, reader->signature, 8); 326 315 memcpy(idea1+8, reader->hexserial+2, 4); 327 316 idea1[12] = ~reader->hexserial[2]; idea1[13] = ~reader->hexserial[3]; idea1[14] = ~reader->hexserial[4]; idea1[15] = ~reader->hexserial[5]; … … 330 319 memcpy(idea2,sign1,8); memcpy(idea2+8,sign1,8); 331 320 Signature(sign2, idea2, tmp, 32); 332 memcpy( sessi,sign1,8); memcpy(sessi+8,sign2,8);321 memcpy(reader->sessi,sign1,8); memcpy(reader->sessi+8,sign2,8); 333 322 334 323 // prepare cmd$2b data … … 342 331 343 332 IDEA_KEY_SCHEDULE ks; 344 idea_set_encrypt_key( sessi,&ks);345 idea_set_decrypt_key(&ks,& ksSession);333 idea_set_encrypt_key(reader->sessi,&ks); 334 idea_set_decrypt_key(&ks,&reader->ksSession); 346 335 347 336 if(!do_cmd(reader, 0x2b,0x42,0xab,0x02, cmd2b+10,cta_res,&cta_lr)) … … 403 392 404 393 // IdeaCamKey 405 memcpy (& IdeaCamKey[0], reader->nagra_boxkey, 8);406 memcpy (& IdeaCamKey[8],irdId, 4);394 memcpy (&reader->IdeaCamKey[0], reader->nagra_boxkey, 8); 395 memcpy (&reader->IdeaCamKey[8], reader->irdId, 4); 407 396 for (i = 0; i < 4; i++) 408 IdeaCamKey[12 + i] = ~irdId[i];397 reader->IdeaCamKey[12 + i] = ~reader->irdId[i]; 409 398 410 399 // now IDEA decrypt 411 400 IDEA_KEY_SCHEDULE ks; 412 idea_set_encrypt_key( IdeaCamKey,&ks);413 idea_set_decrypt_key(&ks,& ksSession);401 idea_set_encrypt_key(reader->IdeaCamKey,&ks); 402 idea_set_decrypt_key(&ks,&reader->ksSession); 414 403 memcpy (&buf[0], static_dt08+1, 64); 415 404 memcpy (&buf[64], static_dt08+65, 8); … … 418 407 idea_cbc_encrypt(buf,static_dt08,72,&ksSession,v,IDEA_DECRYPT); 419 408 420 if ( swapCW==1)409 if (reader->swapCW==1) 421 410 { 422 411 memset(camid,0xff,4); … … 428 417 cs_debug("[nagra-reader] using camid %s for dt08 calc",cs_hexdump (1,camid,4)); 429 418 430 // Calculate signature431 memcpy ( signature, static_dt08, 8);419 // Calculate reader->signature 420 memcpy (reader->signature, static_dt08, 8); 432 421 memset (static_dt08 + 0, 0, 4); 433 422 memcpy (static_dt08 + 4, camid, 4); 434 Signature(sign2, IdeaCamKey,static_dt08,72);435 436 if (memcmp ( signature, sign2, 8)==0)437 { 438 has_dt08=1;439 memcpy ( plainDT08RSA, static_dt08+8, 64);423 Signature(sign2,reader->IdeaCamKey,static_dt08,72); 424 425 if (memcmp (reader->signature, sign2, 8)==0) 426 { 427 reader->has_dt08=1; 428 memcpy (reader->plainDT08RSA, static_dt08+8, 64); 440 429 cs_debug("[nagra-reader] DT08 signature check ok"); 441 430 } 442 431 else 443 432 { 444 has_dt08=0;433 reader->has_dt08=0; 445 434 cs_debug("[nagra-reader] DT08 signature check nok"); 446 435 } … … 484 473 { 485 474 cs_debug("[nagra-reader] detect provider with swap cw!"); 486 swapCW=1;475 reader->swapCW=1; 487 476 } 488 477 … … 495 484 496 485 reader->caid[0] =(SYSTEM_NAGRA|cta_res[11]); 497 memcpy( irdId,cta_res+14,4);498 cs_debug("[nagra-reader] type: NAGRA, caid: %04X, IRD ID: %s",reader->caid[0], cs_hexdump (1, irdId,4));486 memcpy(reader->irdId,cta_res+14,4); 487 cs_debug("[nagra-reader] type: NAGRA, caid: %04X, IRD ID: %s",reader->caid[0], cs_hexdump (1,reader->irdId,4)); 499 488 cs_debug("[nagra-reader] ProviderID: %s",cs_hexdump (1,reader->prid[0],4)); 500 489 return OK; … … 540 529 get_atr; 541 530 def_resp; 542 memset(r om, 0, 15);531 memset(reader->rom, 0, 15); 543 532 reader->nprov = 1; 533 reader->is_pure_nagra = 0; 534 reader->is_tiger = 0; 535 reader->has_dt08 = 0; 536 reader->swapCW = 0; 537 memset(reader->irdId, 0xff, 4); 544 538 memset(reader->hexserial, 0, 8); 545 539 reader->caid[0]=SYSTEM_NAGRA; … … 548 542 { 549 543 cs_ri_log(reader, "detect native NAGRA card T1 protocol"); 550 memcpy(r om,atr+11,15);544 memcpy(reader->rom,atr+11,15); 551 545 } 552 546 else if (memcmp(atr+11, "TIGER", 5)==0 || (memcmp(atr+11, "NCMED", 5)==0)) 553 547 { 554 548 cs_ri_log(reader, "detect NAGRA tiger card"); 555 memcpy(r om,atr+11,15);556 is_tiger=1;549 memcpy(reader->rom,atr+11,15); 550 reader->is_tiger=1; 557 551 } 558 552 else if ((!memcmp(atr+4, "IRDETO", 6)) && ((atr[14]==0x03) && (atr[15]==0x84) && (atr[16]==0x55))) … … 565 559 } 566 560 cs_ri_log(reader, "using NAGRA mode"); 567 is_pure_nagra=1;561 reader->is_pure_nagra=1; 568 562 if(!do_cmd(reader, 0x10,0x02,0x90,0x11,0,cta_res,&cta_lr)) 569 563 { … … 571 565 return ERROR; 572 566 } 573 memcpy(r om,cta_res+2,15);567 memcpy(reader->rom,cta_res+2,15); 574 568 } 575 569 else return ERROR; 576 570 577 if (! is_tiger)571 if (!reader->is_tiger) 578 572 { 579 573 CamStateRequest(reader); … … 599 593 CamStateRequest(reader); 600 594 601 if (!memcmp(r om+5, "181", 3)==0) //dt05 is not supported by rom181595 if (!memcmp(reader->rom+5, "181", 3)==0) //dt05 is not supported by rom181 602 596 { 603 597 cs_ri_log(reader, "-----------------------------------------"); … … 618 612 return ERROR; 619 613 } 620 if ((reader->cardmhz != 368) && ( is_pure_nagra==0))614 if ((reader->cardmhz != 368) && (reader->is_pure_nagra==0)) 621 615 cs_log("WARNING: For NAGRA2 cards you will have to set 'cardmhz = 368' in oscam.server"); 622 616 … … 627 621 { 628 622 int i; 629 cs_ri_log(reader, "ROM: %c %c %c %c %c %c %c %c", r om[0], rom[1], rom[2],rom[3], rom[4], rom[5], rom[6],rom[7]);630 cs_ri_log(reader, "REV: %c %c %c %c %c %c", r om[9], rom[10], rom[11], rom[12], rom[13],rom[14]);623 cs_ri_log(reader, "ROM: %c %c %c %c %c %c %c %c", reader->rom[0], reader->rom[1], reader->rom[2],reader->rom[3], reader->rom[4], reader->rom[5], reader->rom[6], reader->rom[7]); 624 cs_ri_log(reader, "REV: %c %c %c %c %c %c", reader->rom[9], reader->rom[10], reader->rom[11], reader->rom[12], reader->rom[13], reader->rom[14]); 631 625 cs_ri_log(reader, "SER: %s", cs_hexdump (1, reader->hexserial+2, 4)); 632 626 cs_ri_log(reader, "CAID: %04X",reader->caid[0]); … … 642 636 void nagra2_post_process(struct s_reader * reader) 643 637 { 644 if (! is_tiger)638 if (!reader->is_tiger) 645 639 { 646 640 CamStateRequest(reader); … … 653 647 { 654 648 def_resp; 655 if (! is_tiger)649 if (!reader->is_tiger) 656 650 { 657 651 int retry=0; … … 681 675 memset(v,0,sizeof(v)); 682 676 idea_cbc_encrypt(&cta_res[4],er->cw+8,8,&ksSession,v,IDEA_DECRYPT); 683 if ( swapCW==1)677 if (reader->swapCW==1) 684 678 { 685 679 cs_debug("[nagra-reader] swap cws"); … … 785 779 { 786 780 def_resp; 787 if (! is_tiger)781 if (!reader->is_tiger) 788 782 { 789 783 if(!do_cmd(reader, ep->emm[8],ep->emm[9]+2,0x84,0x02,ep->emm+8+2,cta_res,&cta_lr)) … … 793 787 } 794 788 // for slow t14 nagra cards, we must do additional timeout 795 if ( is_pure_nagra==1)789 if (reader->is_pure_nagra==1) 796 790 { 797 791 cs_sleepms(300); -
trunk/reader-viaccess.c
r2068 r2069 1 1 #include "globals.h" 2 2 #include "reader-common.h" 3 4 struct geo_cache5 {6 ulong provid;7 uchar geo[256];8 uchar geo_len;9 };10 11 static struct geo_cache last_geo;12 3 13 4 struct via_date { … … 222 213 223 214 cs_log("[viaccess-reader] ready for requests"); 224 memset(& last_geo, 0, sizeof(last_geo));215 memset(&reader->last_geo, 0, sizeof(reader->last_geo)); 225 216 return OK; 226 217 } … … 279 270 // 280 271 281 if( last_geo.provid != provid )282 { 283 last_geo.provid = provid;284 last_geo.geo_len = 0;285 last_geo.geo[0] = 0;272 if( reader->last_geo.provid != provid ) 273 { 274 reader->last_geo.provid = provid; 275 reader->last_geo.geo_len = 0; 276 reader->last_geo.geo[0] = 0; 286 277 write_cmd(insa4, ident); // set provider 287 278 } … … 298 289 if(ecmf8Len) 299 290 { 300 if( last_geo.geo_len!=ecmf8Len ||301 memcmp( last_geo.geo, ecmf8Data,last_geo.geo_len))291 if( reader->last_geo.geo_len!=ecmf8Len || 292 memcmp(reader->last_geo.geo, ecmf8Data, reader->last_geo.geo_len)) 302 293 { 303 memcpy( last_geo.geo, ecmf8Data, ecmf8Len);304 last_geo.geo_len= ecmf8Len;294 memcpy(reader->last_geo.geo, ecmf8Data, ecmf8Len); 295 reader->last_geo.geo_len= ecmf8Len; 305 296 insf8[3]=keynr; 306 297 insf8[4]=ecmf8Len; … … 576 567 } 577 568 578 memset(& last_geo, 0, sizeof(last_geo));569 memset(&reader->last_geo, 0, sizeof(reader->last_geo)); 579 570 580 571 /* … … 615 606 616 607 show_cls=reader->show_cls; 617 memset(& last_geo, 0, sizeof(last_geo));608 memset(&reader->last_geo, 0, sizeof(reader->last_geo)); 618 609 619 610 cs_log("[viaccess-reader] card detected");
Note:
See TracChangeset
for help on using the changeset viewer.