Changeset 8487
- Timestamp:
- 03/06/13 01:32:17 (11 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/globals.h
r8486 r8487 97 97 98 98 #include "cscrypt/aes.h" 99 #include "cscrypt/bn.h"100 99 101 100 #ifndef uchar … … 1196 1195 char *emmfile; 1197 1196 char pincode[5]; 1198 int32_t ucpk_valid;1199 1197 int8_t logemm; 1200 1198 int8_t cachemm; … … 1202 1200 int8_t card_status; 1203 1201 int8_t deprecated; //if 0 ATR obeyed, if 1 default speed (9600) is chosen; for devices that cannot switch baudrate 1204 int32_t reassemble_emm_len;1205 uint8_t reassemble_emm[512];1206 1202 struct s_module ph; 1207 1203 struct s_cardreader crdr; … … 1289 1285 ////variables from reader-irdeto.c 1290 1286 int32_t acs57; // A flag for the ACS57 ITA DVB-T 1291 ////variables from reader-cryptoworks.c1292 BIGNUM exp;1293 BIGNUM ucpk;1294 1287 #ifdef WITH_LB 1295 1288 int32_t lb_weight; //loadbalance weight factor, if unset, weight=100. The higher the value, the higher the usage-possibility -
trunk/reader-common.c
r8473 r8487 38 38 reader->acs=0; 39 39 reader->nprov=0; 40 reader->reassemble_emm_len=0;41 memset(reader->reassemble_emm, 0, sizeof(reader->reassemble_emm));42 40 cs_clear_entitlement(reader); 43 41 } -
trunk/reader-cryptoworks.c
r8454 r8487 5 5 #include "oscam-emm.h" 6 6 #include "reader-common.h" 7 8 struct cryptoworks_data { 9 BIGNUM exp; 10 BIGNUM ucpk; 11 int32_t ucpk_valid; 12 int32_t reassemble_emm_len; 13 uint8_t reassemble_emm[512]; 14 }; 7 15 8 16 #define CMD_LEN 5 … … 219 227 if ((atr[6]!=0xC4) || (atr[9]!=0x8F) || (atr[10]!=0xF1)) return ERROR; 220 228 229 if (!cs_malloc(&reader->csystem_data, sizeof(struct cryptoworks_data))) 230 return ERROR; 231 struct cryptoworks_data *csystem_data = reader->csystem_data; 232 221 233 rdr_log(reader, "card detected"); 222 234 rdr_log(reader, "type: CryptoWorks"); … … 224 236 reader->caid=0xD00; 225 237 reader->nprov=0; 226 reader->ucpk_valid = 0;227 238 memset(reader->prid, 0, sizeof(reader->prid)); 228 239 … … 263 274 { 264 275 ipk=BN_new(); 265 BN_bin2bn(cwexp, sizeof(cwexp), & reader->exp);276 BN_bin2bn(cwexp, sizeof(cwexp), &csystem_data->exp); 266 277 BN_bin2bn(keybuf, 64, ipk); 267 cw_RSA(reader, cta_res+2, cta_res+2, 0x40, & reader->exp, ipk, 0);278 cw_RSA(reader, cta_res+2, cta_res+2, 0x40, &csystem_data->exp, ipk, 0); 268 279 BN_free(ipk); 269 reader->ucpk_valid =(cta_res[2]==((mfid & 0xFF)>>1));270 if ( reader->ucpk_valid)280 csystem_data->ucpk_valid =(cta_res[2]==((mfid & 0xFF)>>1)); 281 if (csystem_data->ucpk_valid) 271 282 { 272 283 cta_res[2]|=0x80; 273 BN_bin2bn(cta_res+2, 0x40, & reader->ucpk);284 BN_bin2bn(cta_res+2, 0x40, &csystem_data->ucpk); 274 285 rdr_ddump_mask(reader, D_READER, cta_res+2, 0x40, "IPK available -> session-key:"); 275 286 } 276 287 else 277 288 { 278 reader->ucpk_valid =(keybuf[0]==(((mfid & 0xFF)>>1)|0x80));279 if ( reader->ucpk_valid)289 csystem_data->ucpk_valid =(keybuf[0]==(((mfid & 0xFF)>>1)|0x80)); 290 if (csystem_data->ucpk_valid) 280 291 { 281 BN_bin2bn(keybuf, 0x40, & reader->ucpk);292 BN_bin2bn(keybuf, 0x40, &csystem_data->ucpk); 282 293 rdr_ddump_mask(reader, D_READER, keybuf, 0x40, "session-key found:"); 283 294 } … … 319 330 unsigned char insC0[] = { 0xA4,0xC0,0x00,0x00,0x1C }; 320 331 unsigned char nanoD4[10]; 321 int32_t secLen=check_sct_len(er->ecm,-5+(reader->ucpk_valid ? sizeof(nanoD4):0)); 332 struct cryptoworks_data *csystem_data = reader->csystem_data; 333 int32_t secLen=check_sct_len(er->ecm,-5+(csystem_data->ucpk_valid ? sizeof(nanoD4):0)); 322 334 323 335 if(secLen>5) … … 327 339 uchar buff[MAX_LEN]; 328 340 329 if( reader->ucpk_valid)341 if(csystem_data->ucpk_valid) 330 342 { 331 343 memcpy(buff,er->ecm,secLen); … … 339 351 } 340 352 341 ins4C[3]= reader->ucpk_valid ? 2 : 0;353 ins4C[3]=csystem_data->ucpk_valid ? 2 : 0; 342 354 ins4C[4]=secLen-5; 343 355 write_cmd(ins4C, ecm+5); … … 377 389 else if (n==0x40) // camcrypt 378 390 { 379 if( reader->ucpk_valid)391 if(csystem_data->ucpk_valid) 380 392 { 381 cw_RSA(reader, &cta_res[i+2],&cta_res[i+2], n, & reader->exp, &reader->ucpk, 0);393 cw_RSA(reader, &cta_res[i+2],&cta_res[i+2], n, &csystem_data->exp, &csystem_data->ucpk, 0); 382 394 rdr_debug_mask(reader, D_READER, "after camcrypt"); 383 395 r=0; secLen=n-4; n=4; … … 708 720 static bool cryptoworks_reassemble_emm(struct s_reader *reader, EMM_PACKET *ep) 709 721 { 722 struct cryptoworks_data *csystem_data = reader->csystem_data; 710 723 uchar *buffer = ep->emm; 711 724 int16_t *len = &ep->emmlen; … … 728 741 case 0x84: // emm-sh 729 742 cs_debug_mask(D_DVBAPI, "[cryptoworks] shared emm (EMM-SH): %s" , cs_hexdump(0, buffer, *len, dumpbuf, sizeof(dumpbuf))); 730 if (!memcmp( reader->reassemble_emm, buffer, *len)) return 0;731 memcpy( reader->reassemble_emm, buffer, *len);732 reader->reassemble_emm_len=*len;743 if (!memcmp(csystem_data->reassemble_emm, buffer, *len)) return 0; 744 memcpy(csystem_data->reassemble_emm, buffer, *len); 745 csystem_data->reassemble_emm_len=*len; 733 746 // If we return 0 (skip packet) and someone send us already 734 747 // reassembled packet we would miss it. Thats why we return 1 (ok) … … 738 751 case 0x86: // emm-sb 739 752 cs_debug_mask(D_DVBAPI, "[cryptoworks] shared emm (EMM-SB): %s" , cs_hexdump(0, buffer, *len, dumpbuf, sizeof(dumpbuf))); 740 if (! reader->reassemble_emm_len) return 0;753 if (!csystem_data->reassemble_emm_len) return 0; 741 754 742 755 // we keep the first 12 bytes of the 0x84 emm (EMM-SH) … … 750 763 // 751 764 752 emm_len=*len-5 + reader->reassemble_emm_len-12;765 emm_len=*len-5 + csystem_data->reassemble_emm_len-12; 753 766 unsigned char *tmp, *assembled; 754 767 if (!cs_malloc(&tmp, emm_len)) … … 765 778 } 766 779 memcpy(tmp,&buffer[5], *len-5); 767 memcpy(tmp+*len-5,& reader->reassemble_emm[12],reader->reassemble_emm_len-12);768 memcpy(assembled_EMM, reader->reassemble_emm,12);780 memcpy(tmp+*len-5,&csystem_data->reassemble_emm[12],csystem_data->reassemble_emm_len-12); 781 memcpy(assembled_EMM,csystem_data->reassemble_emm,12); 769 782 emm_sort_nanos(assembled_EMM+12,tmp,emm_len); 770 783 … … 779 792 free(assembled_EMM); 780 793 781 reader->reassemble_emm_len = 0;794 csystem_data->reassemble_emm_len = 0; 782 795 783 796 cs_debug_mask(D_DVBAPI, "[cryptoworks] shared emm (assembled): %s", cs_hexdump(0, buffer, emm_len+12, dumpbuf, sizeof(dumpbuf)));
Note:
See TracChangeset
for help on using the changeset viewer.