Changeset 10607
- Timestamp:
- 02/28/15 21:43:20 (9 years ago)
- Location:
- trunk
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/globals.h
r10595 r10607 985 985 { 986 986 int16_t emmlen; 987 int32_t provid; 987 988 uint8_t emm[512]; 988 989 }; … … 1016 1017 LLIST *aureader_list; 1017 1018 int8_t autoau; 1018 struct emm_rass *via_rass; // EMM reassembly buffer for viaccess1019 LLIST *ra_buf; // EMM reassembly buffer for viaccess 1019 1020 struct emm_rass *cw_rass; // EMM reassembly buffer for cryptoworks 1020 1021 int8_t monlvl; -
trunk/oscam-client.c
r10565 r10607 733 733 734 734 NULLFREE(cl->cw_rass); 735 NULLFREE(cl->via_rass);735 ll_destroy_data(&cl->ra_buf); 736 736 NULLFREE(cl->aes_keys); 737 737 -
trunk/oscam-reader.c
r10595 r10607 572 572 573 573 /** 574 * add one entitlement item to entitlements of reader. 574 * add or find one entitlement item to entitlements of reader 575 * use add = 0 for find only, or add > 0 to find and add if not found 575 576 **/ 576 void cs_add_entitlement(struct s_reader *rdr, uint16_t caid, uint32_t provid, uint64_t id, uint32_t class, time_t start, time_t end, uint8_t type) 577 { 578 if(!rdr->ll_entitlements) { rdr->ll_entitlements = ll_create("ll_entitlements"); } 579 580 S_ENTITLEMENT *item; 581 if(cs_malloc(&item, sizeof(S_ENTITLEMENT))) 582 { 583 584 // fill item 585 item->caid = caid; 586 item->provid = provid; 587 item->id = id; 588 item->class = class; 589 item->start = start; 590 item->end = end; 591 item->type = type; 592 593 //add item 594 ll_append(rdr->ll_entitlements, item); 595 596 // cs_log_dbg(D_TRACE, "entitlement: Add caid %4X id %4X %s - %s ", item->caid, item->id, item->start, item->end); 597 } 598 577 S_ENTITLEMENT *cs_add_entitlement(struct s_reader *rdr, uint16_t caid, uint32_t provid, uint64_t id, uint32_t class, time_t start, time_t end, uint8_t type, uint8_t add) 578 { 579 if(!rdr->ll_entitlements) 580 { 581 rdr->ll_entitlements = ll_create("ll_entitlements"); 582 } 583 584 S_ENTITLEMENT *item = NULL; 585 LL_ITER it; 586 587 it = ll_iter_create(rdr->ll_entitlements); 588 while((item = ll_iter_next(&it)) != NULL) 589 { 590 if( 591 (caid && item->caid != caid) || 592 (provid && item->provid != provid) || 593 (id && item->id != id) || 594 (class && item->class != class) || 595 (start && item->start != start) || 596 (end && item->end != end) || 597 (type && item->type != type)) 598 { 599 continue; // no match, try next! 600 } 601 break; // match found! 602 } 603 604 if(add && item == NULL) 605 { 606 if(cs_malloc(&item, sizeof(S_ENTITLEMENT))) 607 { 608 // fill item 609 item->caid = caid; 610 item->provid = provid; 611 item->id = id; 612 item->class = class; 613 item->start = start; 614 item->end = end; 615 item->type = type; 616 617 //add item 618 ll_append(rdr->ll_entitlements, item); 619 // cs_log_dbg(D_TRACE, "entitlement: Add caid %4X id %4X %s - %s ", item->caid, item->id, item->start, item->end); 620 } 621 else 622 { 623 cs_log("ERROR: Can't allocate entitlement to reader!"); 624 625 } 626 } 627 628 return item; 599 629 } 600 630 -
trunk/oscam-reader.h
r10581 r10607 10 10 void newcamd_to_hexserial(uchar *source, uchar *dest, uint16_t caid); 11 11 12 void cs_add_entitlement(struct s_reader *rdr, uint16_t caid, uint32_t provid, uint64_t id, uint32_t class, time_t start, time_t end, uint8_t type);12 S_ENTITLEMENT *cs_add_entitlement(struct s_reader *rdr, uint16_t caid, uint32_t provid, uint64_t id, uint32_t class, time_t start, time_t end, uint8_t type, uint8_t add); 13 13 void cs_clear_entitlement(struct s_reader *rdr); 14 14 -
trunk/reader-bulcrypt.c
r10582 r10607 741 741 last_upd_ts, /* start_ts */ 742 742 subs_end_ts, /* end_ts */ 743 4 /* type: Tier */ 743 4, /* type: Tier */ 744 1 /* add */ 744 745 ); 745 746 cs_add_entitlement(reader, 0x5581, … … 749 750 last_upd_ts, /* start_ts */ 750 751 subs_end_ts, /* end_ts */ 751 4 /* type: Tier */ 752 4, /* type: Tier */ 753 1 /* add */ 752 754 ); 753 755 get_tiername(i, 0x4aee, tmp); -
trunk/reader-conax.c
r10582 r10607 502 502 503 503 // add entitlements to list 504 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), provid, cxclass, start_t, end_t, type + 1 );504 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), provid, cxclass, start_t, end_t, type + 1, 1); 505 505 506 506 k = 0; … … 521 521 522 522 // add entitlements to list 523 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), provid, cxclass, start_t, end_t, type + 1 );523 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), provid, cxclass, start_t, end_t, type + 1, 1); 524 524 } 525 525 } -
trunk/reader-cryptoworks.c
r10582 r10607 708 708 cs_add_entitlement(reader, reader->caid, reader->prid[i][3], b2i(2, cta_res + 6), 0, 709 709 chid_date(cta_res + 28, ds, sizeof(ds) - 1), 710 chid_date(cta_res + 30, de, sizeof(de) - 1), 3 );710 chid_date(cta_res + 30, de, sizeof(de) - 1), 3, 1); 711 711 712 712 rdr_log(reader, "chid: %02X%02X, date: %s - %s, name: %s", … … 731 731 cs_add_entitlement(reader, reader->caid, reader->prid[i][3], b2i(2, cta_res + 6), 0, 732 732 chid_date(cta_res + 28, ds, sizeof(ds) - 1), 733 chid_date(cta_res + 30, de, sizeof(de) - 1), 3 );733 chid_date(cta_res + 30, de, sizeof(de) - 1), 3, 1); 734 734 735 735 cta_res[27] = 0; -
trunk/reader-dre.c
r10582 r10607 147 147 rdr_log(reader, "active package %i valid from %04i/%02i/%02i to %04i/%02i/%02i", i, startyear, startmonth, startday, 148 148 endyear, endmonth, endday); 149 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), 0, 0, start, end, 1 );149 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), 0, 0, start, end, 1, 1); 150 150 } 151 151 } -
trunk/reader-irdeto.c
r10589 r10607 1173 1173 1174 1174 // todo: add entitlements to list but produces a warning related to date variable 1175 cs_add_entitlement(reader, reader->caid, b2i(3, &reader->prid[i][1]), chid, 0, start_t, end_t, 3 );1175 cs_add_entitlement(reader, reader->caid, b2i(3, &reader->prid[i][1]), chid, 0, start_t, end_t, 3, 1); 1176 1176 1177 1177 if(first) -
trunk/reader-nagra.c
r10582 r10607 631 631 tier_date(b2i(2, cta_res + 20) - 0x7f7, ds, 15), 632 632 tier_date(b2i(2, cta_res + 13) - 0x7f7, de, 15), 633 4); 633 4, 634 1); 634 635 635 636 … … 994 995 records[i].value, records[i].date1, records[i].date2, euro, get_tiername(records[i].value, reader->caid, tiername)); 995 996 } 996 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), records[i].value, 0, tiger_date2time(records[i].date1), tiger_date2time(records[i].date2)+ 0x1517F, 4 );997 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), records[i].value, 0, tiger_date2time(records[i].date1), tiger_date2time(records[i].date2)+ 0x1517F, 4, 1); 997 998 } 998 999 break; … … 1007 1008 records[i].value, records[i].date2, get_tiername(records[i].value, reader->caid, tiername)); 1008 1009 } 1009 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), records[i].value, 0, tiger_date2time(records[i].date1), tiger_date2time(records[i].date2)+ 0x1517F, 4 );1010 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), records[i].value, 0, tiger_date2time(records[i].date1), tiger_date2time(records[i].date2)+ 0x1517F, 4, 1); 1010 1011 } 1011 1012 break; -
trunk/reader-seca.c
r10582 r10607 122 122 else 123 123 // add entitlement info 124 { cs_add_entitlement(reader, reader->caid, provid, get_pbm(reader, i), 0, 0, mktime(<), (i) ? 6 : 7 ); }124 { cs_add_entitlement(reader, reader->caid, provid, get_pbm(reader, i), 0, 0, mktime(<), (i) ? 6 : 7, 1); } 125 125 126 126 return OK; -
trunk/reader-viaccess.c
r10599 r10607 81 81 // 82 82 //} 83 struct emm_rass *find_rabuf(struct s_client *client, int32_t provid, uint8_t nano, int8_t add) 84 { 85 struct emm_rass *e; 86 LL_ITER it; 87 88 if(!client->ra_buf) 89 { 90 client->ra_buf = ll_create("client->ra_buf"); 91 } 92 93 it = ll_iter_create(client->ra_buf); 94 95 while((e = ll_iter_next(&it)) != NULL) 96 { 97 if(!add && e->provid == provid && e->emmlen != 0) { return e; } 98 if(add && e->provid == provid && e->emm[0] == nano) { return e; } 99 } 100 if(!add) return NULL; 101 102 if(!cs_malloc(&e, sizeof(struct emm_rass))) 103 { return NULL; } 104 e->provid = provid; 105 ll_append(client->ra_buf, e); 106 return e; 107 } 83 108 84 109 static void show_class(struct s_reader *reader, const char *p, uint32_t provid, const uchar *b, int32_t l) … … 100 125 cls = (l - (j + 1)) * 8 + i; 101 126 if(p) 127 { 102 128 rdr_log(reader, "%sclass: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", p, cls, 103 129 vd.year_s + 1980, vd.month_s, vd.day_s, 104 130 vd.year_e + 1980, vd.month_e, vd.day_e); 131 } 105 132 else 106 133 { … … 123 150 end_t = cs_timegm(&tm); 124 151 125 cs_add_entitlement(reader, reader->caid, provid, cls, cls, start_t, end_t, 5); 126 } 127 } 152 cs_add_entitlement(reader, reader->caid, provid, cls, cls, start_t, end_t, 5, 1); 153 } 154 } 155 } 156 157 static int8_t find_class(struct s_reader *reader, uint32_t provid, const uchar *b, int32_t l) 158 { 159 int32_t i, j; 160 161 // b -> via date (4 uint8_ts) 162 b += 4; 163 l -= 4; 164 165 j = l - 1; 166 for(; j >= 0; j--) 167 for(i = 0; i < 8; i++) 168 if(b[j] & (1 << (i & 7))) 169 { 170 uchar cls; 171 cls = (l - (j + 1)) * 8 + i; 172 if(cs_add_entitlement(reader, reader->caid, provid, cls, cls, 0, 0, 5, 0) == NULL) 173 { 174 rdr_log(reader, "provid %06X class %02X not found!", provid, cls); 175 return 0; // class not found! 176 } 177 else 178 { 179 rdr_log(reader, "provid %06X has matching class %02X", provid, cls); 180 } 181 } 182 return 1; // all classes found! 128 183 } 129 184 … … 1284 1339 if(ep->emm[3] == 0x90 && ep->emm[4] == 0x03) 1285 1340 { 1286 provid = ep->emm[5] << 16 | ep->emm[6] << 8 | (ep->emm[7] & 0xFE); 1341 provid = b2i(4, ep->emm+5); 1342 provid &=0xFFFFF0; 1287 1343 i2b_buf(4, provid, ep->provid); 1288 1344 } … … 1295 1351 memcpy(ep->hexserial, ep->emm + 4, 4); 1296 1352 rdr_log_dbg(rdr, D_EMM, "UNIQUE"); 1297 return (!memcmp(rdr->hexserial + 1, ep->hexserial, 4)); 1353 if(!is_network_reader(rdr)) 1354 { 1355 return (!memcmp(rdr->hexserial + 1, ep->hexserial, 4)); // local reader 1356 } 1357 else 1358 { 1359 return 1; // let server decide! 1360 } 1298 1361 1299 1362 case 0x8A: … … 1313 1376 case 0x8E: 1314 1377 ep->type = SHARED; 1378 rdr_log_dbg(rdr, D_EMM, "SHARED"); 1315 1379 memset(ep->hexserial, 0, 8); 1316 1380 memcpy(ep->hexserial, ep->emm + 3, 3); 1317 rdr_log_dbg(rdr, D_EMM, "SHARED"); 1318 1319 //check for provider as serial (cccam only?) 1381 1382 // local reader 1320 1383 int8_t i; 1321 1384 for(i = 0; i < rdr->nprov; i++) 1322 1385 { 1323 if(!memcmp(&rdr->prid[i][ 1], ep->hexserial, 3))1386 if(!memcmp(&rdr->prid[i][2], ep->hexserial+1, 2)) 1324 1387 { return 1; } 1325 } 1326 return (!memcmp(&rdr->sa[0][0], ep->hexserial, 3)); 1388 1389 return (!memcmp(&rdr->sa[0][0], ep->hexserial, 3)); 1390 } 1327 1391 1328 1392 default: … … 1340 1404 int8_t device_emm = ((rdr->deviceemm >0) ? 1 : 0); // set to 1 if device specific emms should be catched too 1341 1405 1342 const unsigned int max_filter_count = 4 + ((device_emm != 0 && !network && rdr->nprov > 0) ? 1:0) + (3 * ((rdr->nprov > 0 && !network) ? (rdr->nprov - 1) : 0));1406 const unsigned int max_filter_count = 4 + ((device_emm != 0 && rdr->nprov > 0) ? 1:0) + (3 * ((rdr->nprov > 0) ? (rdr->nprov - 1) : 0)); 1343 1407 1344 1408 if(!cs_malloc(emm_filters, max_filter_count * sizeof(struct s_csystem_emm_filter))) … … 1351 1415 int32_t prov; 1352 1416 1353 if(rdr->nprov > 0 && !network &&device_emm == 1)1417 if(rdr->nprov > 0 && device_emm == 1) 1354 1418 { 1355 1419 filters[idx].type = EMM_GLOBAL; // 8A or 8B no reassembly needed! … … 1361 1425 idx++; 1362 1426 } 1363 1364 for(prov = 0; (prov < rdr->nprov || prov == 0); prov++) 1365 { 1366 filters[idx].type = EMM_GLOBAL; // 8A or 8B no reassembly needed! 1367 filters[idx].enabled = 1; 1368 filters[idx].filter[0] = 0x8A; 1369 filters[idx].mask[0] = 0xFE; 1370 if(rdr->nprov > 0 && !network) 1371 { 1372 memcpy(&filters[idx].filter[3], &rdr->prid[prov][1], 3); 1373 memset(&filters[idx].mask[3], 0xFF, 2); 1374 filters[idx].mask[5] = 0xF0; // ignore last digit since this is key on card indicator! 1375 } 1376 else if (device_emm == 0) 1377 { 1378 filters[idx].filter[3] = 0x00; // additional filter to cancel device specific emms 1379 filters[idx].mask[3] = 0x80; 1380 } 1381 idx++; 1427 1428 // shared are most important put them on top, define first since viaccess produces a lot of filters! 1429 for(prov = 0; (prov < rdr->nprov); prov++) 1430 { 1431 if((rdr->prid[prov][2] &0xF0) == 0xF0) // skip this not useful provider 1432 { 1433 continue; 1434 } 1382 1435 1383 1436 filters[idx].type = EMM_SHARED; // 8C or 8D always first part of shared, second part delivered by 8E! … … 1385 1438 filters[idx].filter[0] = 0x8C; 1386 1439 filters[idx].mask[0] = 0xFE; 1387 if(rdr->nprov > 0 && !network)1388 { 1389 memcpy(&filters[idx].filter[ 3], &rdr->prid[prov][1], 3);1390 memset(&filters[idx].mask[3], 0xFF, 2);1440 if(rdr->nprov > 0) 1441 { 1442 memcpy(&filters[idx].filter[4], &rdr->prid[prov][2], 2); 1443 filters[idx].mask[4] = 0xFF; 1391 1444 filters[idx].mask[5] = 0xF0; // ignore last digit since this is key on card indicator! 1392 1445 } … … 1397 1450 filters[idx].filter[0] = 0x8E; 1398 1451 filters[idx].mask[0] = 0xFF; 1399 if(rdr->nprov > 0 && !network)1452 if(rdr->nprov > 0) 1400 1453 { 1401 1454 memcpy(&filters[idx].filter[1], &rdr->sa[prov][0], 3); … … 1403 1456 } 1404 1457 idx++; 1458 } 1459 1460 // globals are less important, define last since viaccess produces a lot of filters! 1461 for(prov = 0; (prov < rdr->nprov); prov++) 1462 { 1463 if((rdr->prid[prov][2] &0xF0) == 0xF0) // skip this not useful provider 1464 { 1465 continue; 1466 } 1405 1467 1406 if (network) // for network readers 1 set of generic filters is sufficient so it ends here! 1407 { 1408 break; 1409 } 1410 } 1411 1468 filters[idx].type = EMM_GLOBAL; // 8A or 8B no reassembly needed! 1469 filters[idx].enabled = 1; 1470 filters[idx].filter[0] = 0x8A; 1471 filters[idx].mask[0] = 0xFE; 1472 if(rdr->nprov > 0) 1473 { 1474 memcpy(&filters[idx].filter[4], &rdr->prid[prov][2], 2); 1475 filters[idx].mask[4] = 0xFF; 1476 filters[idx].mask[5] = 0xF0; // ignore last digit since this is key on card indicator! 1477 } 1478 else if (device_emm == 0) 1479 { 1480 filters[idx].filter[3] = 0x00; // additional filter to cancel device specific emms 1481 filters[idx].mask[3] = 0x80; 1482 } 1483 idx++; 1484 } 1485 1412 1486 filters[idx].type = EMM_UNIQUE; 1413 1487 filters[idx].enabled = 1; 1414 1488 filters[idx].filter[0] = 0x88; 1415 1489 filters[idx].mask[0] = 0xFF; 1416 memcpy(&filters[idx].filter[1], rdr->hexserial + 1, 4); 1417 memset(&filters[idx].mask[1], 0xFF, 4); 1490 if(!network) // network has only 3 digits out of 4 1491 { 1492 memcpy(&filters[idx].filter[1], rdr->hexserial + 1, 4); 1493 memset(&filters[idx].mask[1], 0xFF, 4); 1494 } 1495 else 1496 { 1497 memcpy(&filters[idx].filter[1], rdr->hexserial + 1, 3); 1498 memset(&filters[idx].mask[1], 0xFF, 3); 1499 } 1418 1500 idx++; 1419 1501 … … 1465 1547 uchar *emmParsed = ep->emm + emmdatastart; 1466 1548 int32_t provider_ok = 0; 1467 uint32_t emm_provid ;1549 uint32_t emm_provid = 0; 1468 1550 uchar keynr = 0; 1469 1551 int32_t ins18Len = 0; … … 1536 1618 1537 1619 if(afd[31 - custwp / 8] & (1 << (custwp & 7))) 1538 { rdr_log_dbg(reader, D_READER, "emm for our card %08X", b2i(4, &reader->sa[0][0])); } 1620 { 1621 rdr_log_dbg(reader, D_READER, "emm for our card %08X", b2i(4, &reader->sa[0][0])); 1622 } 1539 1623 else 1540 { return SKIPPED; } 1624 { 1625 rdr_log_dbg(reader, D_READER, "emm not suitable for our card %08X", b2i(4, &reader->sa[0][0])); 1626 return SKIPPED; 1627 } 1541 1628 } 1542 1629 … … 1565 1652 /* other nanos */ 1566 1653 show_subs(reader, emmParsed); 1654 if(emmParsed[0] == 0xA9 && ep->type == SHARED) // check on shared (reassembled) emm if all nanos are present on card: if not and written error 90 40 1655 { 1656 if(!emm_provid) 1657 { 1658 rdr_log(reader, "no provid in shared emm -> skipped!"); 1659 return SKIPPED; 1660 } 1661 if(!find_class(reader, emm_provid, emmParsed + 2, emmParsed[1])) 1662 { 1663 rdr_log(reader, "shared emm provid %06X class mismatch -> skipped!", emm_provid); 1664 return SKIPPED; 1665 } 1666 } 1567 1667 1568 1668 memcpy(ins18Data + ins18Len, emmParsed, emmParsed[1] + 2); … … 1826 1926 int32_t pos = 0, i; 1827 1927 int16_t k; 1828 1928 int32_t prov, provid = 0; 1929 struct emm_rass *r_emm = NULL; 1930 1829 1931 // Viaccess 1830 if(*len > 500) { return 0; } 1831 1832 if(!client->via_rass) 1833 { 1834 if(!cs_malloc(&client->via_rass, sizeof(*client->via_rass))) 1835 { 1836 cs_log("[viaccess] ERROR: Can't allocate EMM reassembly buffer."); 1932 if(*len > 500) { return 0; } 1933 1934 switch(buffer[0]) 1935 { 1936 case 0x8c: 1937 case 0x8d: 1938 // emm-s part 1 1939 provid = b2i(3, ep->emm+5); // extract provid from emm 1940 provid &= 0xFFFFF0; // last digit is dont care 1941 r_emm = find_rabuf(client, provid, (uint8_t) buffer[0], 1); 1942 if(!r_emm) 1943 { 1944 cs_log("[viaccess] ERROR: Can't allocate EMM reassembly buffer."); 1945 return 0; 1946 } 1947 if(!memcmp(&r_emm->emm, &buffer[0], *len)) // skip same shared emm, this make sure emmlen isnt replaced. emmlen = 0 means this shared emm has been used for reassembly 1948 { 1949 return 0; 1950 } 1951 memcpy(&r_emm->emm[0], &buffer[0], *len); // put the fresh new shared emm 1952 r_emm->emmlen = *len; // put the emmlen indicating that this shared emm isnt being reassembled 1953 rdr_log_dump_dbg(rdr, D_EMM, r_emm->emm, r_emm->emmlen, "%s: received fresh emm-gh for provid %06X", __func__, provid); 1837 1954 return 0; 1838 } 1839 } 1840 struct emm_rass *r_emm = client->via_rass; 1841 1842 switch(buffer[0]) 1843 { 1844 case 0x8c: 1845 case 0x8d: 1846 // emm-s part 1 1847 if(!memcmp(r_emm->emm, buffer, *len)) 1848 { return 0; } 1849 1850 // copy first part of the emm-s 1851 memcpy(r_emm->emm, buffer, *len); 1852 r_emm->emmlen = *len; 1853 return 0; 1854 1855 case 0x8e: 1856 // emm-s part 2 1857 if(!r_emm->emmlen) { return 0; } 1858 1859 //extract nanos from emm-gh and emm-s 1860 uchar emmbuf[512]; 1861 1862 rdr_log_dbg(rdr, D_EMM, "%s: start extracting nanos", __func__); 1863 //extract from emm-gh 1864 for(i = 3; i < r_emm->emmlen; i += r_emm->emm[i + 1] + 2) 1865 { 1866 //copy nano (length determined by i+1) 1867 memcpy(emmbuf + pos, r_emm->emm + i, r_emm->emm[i + 1] + 2); 1868 pos += r_emm->emm[i + 1] + 2; 1869 } 1870 1871 if(buffer[2] == 0x2c) 1872 { 1873 //add 9E 20 nano + first 32 uint8_ts of emm content 1874 memcpy(emmbuf + pos, "\x9E\x20", 2); 1875 memcpy(emmbuf + pos + 2, buffer + 7, 32); 1876 pos += 34; 1877 1878 //add F0 08 nano + 8 subsequent uint8_ts of emm content 1879 memcpy(emmbuf + pos, "\xF0\x08", 2); 1880 memcpy(emmbuf + pos + 2, buffer + 39, 8); 1881 pos += 10; 1882 } 1883 else 1884 { 1885 //extract from variable emm-s 1886 for(k = 7; k < (*len); k += buffer[k + 1] + 2) 1887 { 1888 //copy nano (length determined by k+1) 1889 memcpy(emmbuf + pos, buffer + k, buffer[k + 1] + 2); 1890 pos += buffer[k + 1] + 2; 1891 } 1892 } 1893 1894 rdr_log_dump_dbg(rdr, D_EMM, buffer, *len, "%s: %s emm-s", __func__, (buffer[2] == 0x2c) ? "fixed" : "variable"); 1895 1896 emm_sort_nanos(buffer + 7, emmbuf, pos); 1897 pos += 7; 1898 1899 //calculate emm length and set it on position 2 1900 buffer[2] = pos - 3; 1901 1902 rdr_log_dump_dbg(rdr, D_EMM, r_emm->emm, r_emm->emmlen, "%s: emm-gh", __func__); 1903 rdr_log_dump_dbg(rdr, D_EMM, buffer, pos, "%s: assembled emm", __func__); 1904 1905 *len = pos; 1906 NULLFREE(client->via_rass); // free reassembly 8c/8d 1907 break; 1955 1956 case 0x8e: 1957 // emm-s part 2 1958 for(prov = 0; prov < rdr->nprov ; prov++) 1959 { 1960 if(!memcmp(&buffer[3], &rdr->sa[prov][0], 3)) 1961 { 1962 //matching sa found! 1963 if(is_network_reader(rdr)) 1964 { 1965 provid = b2i(4, ep->provid); // use provid from emm since we have nothing better! 1966 provid &= 0xFFFFF0; // last digit is dont care 1967 } 1968 else 1969 { 1970 provid = b2i(4, rdr->prid[prov]); // get corresponding provid from reader since there is no provid in emm payload! 1971 provid &= 0xFFFFF0; // last digit is dont care 1972 } 1973 r_emm = find_rabuf(client, provid, 0, 0); // nano = dont care, the shared 8c or 8d not been written gets returned! 1974 if(!r_emm || !r_emm->emmlen) 1975 { 1976 continue; // match but no emm-gh found for this provider 1977 } 1978 else 1979 { 1980 break; // stop searching-> emm-gh found! 1981 } 1982 } 1983 } 1984 if(!r_emm || !r_emm->emmlen) { return 0; } // stop -> no emm-gh found! 1985 1986 //extract nanos from emm-gh and emm-s 1987 uchar emmbuf[512]; 1988 1989 rdr_log_dbg(rdr, D_EMM, "%s: start extracting nanos", __func__); 1990 //extract from emm-gh 1991 for(i = 3; i < r_emm->emmlen; i += r_emm->emm[i + 1] + 2) 1992 { 1993 //copy nano (length determined by i+1) 1994 memcpy(emmbuf + pos, r_emm->emm + i, r_emm->emm[i + 1] + 2); 1995 pos += r_emm->emm[i + 1] + 2; 1996 } 1997 1998 if(buffer[2] == 0x2c) 1999 { 2000 //add 9E 20 nano + first 32 uint8_ts of emm content 2001 memcpy(emmbuf + pos, "\x9E\x20", 2); 2002 memcpy(emmbuf + pos + 2, buffer + 7, 32); 2003 pos += 34; 2004 2005 //add F0 08 nano + 8 subsequent uint8_ts of emm content 2006 memcpy(emmbuf + pos, "\xF0\x08", 2); 2007 memcpy(emmbuf + pos + 2, buffer + 39, 8); 2008 pos += 10; 2009 } 2010 else 2011 { 2012 //extract from variable emm-s 2013 for(k = 7; k < (*len); k += buffer[k + 1] + 2) 2014 { 2015 //copy nano (length determined by k+1) 2016 memcpy(emmbuf + pos, buffer + k, buffer[k + 1] + 2); 2017 pos += buffer[k + 1] + 2; 2018 } 2019 } 2020 2021 rdr_log_dump_dbg(rdr, D_EMM, buffer, *len, "%s: %s emm-s", __func__, (buffer[2] == 0x2c) ? "fixed" : "variable"); 2022 2023 emm_sort_nanos(buffer + 7, emmbuf, pos); 2024 pos += 7; 2025 2026 //calculate emm length and set it on position 2 2027 buffer[2] = pos - 3; 2028 2029 rdr_log_dump_dbg(rdr, D_EMM, r_emm->emm, r_emm->emmlen, "%s: emm-gh provid %06X", __func__, provid); 2030 rdr_log_dump_dbg(rdr, D_EMM, buffer, pos, "%s: assembled emm", __func__); 2031 2032 *len = pos; 2033 r_emm->emmlen = 0; // mark this shared 8c or 8d as being used for reassembly and send to reader! 2034 break; 1908 2035 } 1909 2036 return 1; -
trunk/reader-videoguard1.c
r10582 r10607 91 91 rev_date_calc_tm(&cta_res[4], &timeinfo, csystem_data->card_baseyear); 92 92 char tiername[83]; 93 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, 0, 0, mktime(&timeinfo), 4 );93 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, 0, 0, mktime(&timeinfo), 4, 1); 94 94 rdr_log(reader, "tier: %04x, expiry date: %04d/%02d/%02d-%02d:%02d:%02d %s", tier_id, timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, get_tiername(tier_id, reader->caid, tiername)); 95 95 } -
trunk/reader-videoguard12.c
r10582 r10607 89 89 memset(&timeinfo, 0, sizeof(struct tm)); 90 90 rev_date_calc_tm(&cta_res[4], &timeinfo, csystem_data->card_baseyear); 91 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, 0, 0, mktime(&timeinfo), 4 );91 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, 0, 0, mktime(&timeinfo), 4, 1); 92 92 char tiername[83]; 93 93 rdr_log(reader, "tier: %04x, expiry date: %04d/%02d/%02d-%02d:%02d:%02d %s", tier_id, timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, get_tiername(tier_id, reader->caid, tiername)); -
trunk/reader-videoguard2.c
r10582 r10607 288 288 tier_id = 0; 289 289 tier_id = ((TierClass<<8) + (word<<3) + bitnum); 290 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, TierClass, start_t, end_t, 4 );290 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, TierClass, start_t, end_t, 4, 1); 291 291 rdr_log(reader, "|-- %02x ---|-- %04x --| %04d/%02d/%02d-%02d:%02d:%02d | %s", TierClass, tier_id, timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, get_tiername(tier_id, reader->caid, tiername)); 292 292 } … … 295 295 tier_id = 0; 296 296 tier_id = ((TierClass<<8) + (word<<3) + bitnum + 8); 297 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, TierClass, start_t, end_t, 4 );297 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, TierClass, start_t, end_t, 4, 1); 298 298 rdr_log(reader, "|-- %02x ---|-- %04x --| %04d/%02d/%02d-%02d:%02d:%02d | %s", TierClass, tier_id, timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, get_tiername(tier_id, reader->caid, tiername)); 299 299 } … … 372 372 memset(&timeinfo, 0, sizeof(struct tm)); 373 373 rev_date_calc_tm(&cta_res[4], &timeinfo, csystem_data->card_baseyear); 374 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, 0, 0, mktime(&timeinfo), 4 );374 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, 0, 0, mktime(&timeinfo), 4, 1); 375 375 376 376 if(!stopemptytier)
Note:
See TracChangeset
for help on using the changeset viewer.