- git-svn-diff.sh changed permission to 755 (thanks to WXbet)
[oscam.git] / reader-nagra-common.c
blob0b044398a39fb0829eac204732c4bf02e1840c20
1 #include "globals.h"
2 #include "reader-common.h"
3 #include "reader-nagra-common.h"
5 int32_t get_prov_idx(struct s_reader *rdr, const uint8_t *provid)
7 int prov;
8 for(prov = 0; prov < rdr->nprov; prov++) // search for provider index
10 if(!memcmp(provid, &rdr->prid[prov][2], 2))
12 return (prov);
15 return (-1);
18 int32_t nagra_get_emm_type(EMM_PACKET *ep, struct s_reader *rdr)
20 if(rdr->cak7type == 3 || rdr->autype == 1)
22 int i;
24 switch(ep->emm[0])
26 case 0x82:
27 memset(ep->hexserial, 0, 8);
28 memcpy(ep->hexserial, ep->emm + 3, 6);
29 if(!memcmp(rdr->hexserial, ep->hexserial, 6))
31 ep->type = UNIQUE;
32 return 1;
34 else if ((ep->emm[3] == 0x00) && (ep->emm[4] == 0x00) && (ep->emm[5] == 0x00) && (ep->emm[6] == 0x00) && (ep->emm[7] == 0x00) && (ep->emm[8] == 0xD3) && (ep->emm[9] == 0x87))
36 ep->type = GLOBAL;
37 return 1;
39 return 0;
41 case 0x84:
42 ep->type = SHARED;
43 memset(ep->hexserial, 0, 8);
44 memcpy(ep->hexserial, ep->emm + 5, 3);
45 i = get_prov_idx(rdr, ep->emm + 3);
47 if(i == -1)
49 return 0;
52 return (!memcmp(rdr->sa[i], ep->hexserial, 3));
54 case 0x83:
55 ep->type = GLOBAL;
56 uint8_t filtr[] = {0x83, 0x00, 0x74};
57 return (!memcmp(ep->emm, filtr, 3));
59 case 0x90:
60 ep->type = UNIQUE;
61 if(rdr->cwpkcaid_length && rdr->nuid_length)
63 memset(ep->hexserial, 0x00, 0x08);
64 ep->hexserial[0] = ep->emm[5];
65 ep->hexserial[1] = ep->emm[4];
66 ep->hexserial[2] = ep->emm[3];
67 ep->hexserial[3] = ep->emm[6];
68 return (!memcmp(rdr->nuid, ep->hexserial, 4));
70 return 0;
72 default:
73 ep->type = UNKNOWN;
74 return 0;
77 else if(rdr->cak7type == 1)
79 int i;
80 switch(ep->emm[0])
82 case 0x82:
83 ep->type = GLOBAL;
84 if(rdr->emm82 == 1 && ep->emm[3] == 0x00 && ep->emm[4] == 0x00 && ep->emm[5] == 0x00)
86 return 1;
88 return 0;
90 case 0x83:
91 if(ep->emm[7] == 0x10)
93 ep->type = SHARED;
95 for(i = 0; i < rdr->nemm83s; i++)
97 if(!memcmp(rdr->emm83s[i] + 1, ep->emm + 3, 0x03))
99 return 1;
103 else
105 ep->type = UNIQUE;
107 for(i = 0; i < rdr->nemm83u; i++)
109 if(!memcmp(rdr->emm83u[i] + 1, ep->emm + 3, 0x04))
111 return 1;
115 return 0;
117 case 0x84:
118 ep->type = GLOBAL;
120 for(i = 0; i < rdr->nemm84; i++)
122 if(!memcmp(rdr->emm84[i] + 1, ep->emm + 3, 0x02))
124 return 1;
127 return 0;
129 case 0x87:
130 ep->type = SHARED;
132 for(i = 0; i < rdr->nemm87; i++)
134 if(!memcmp(rdr->emm87[i] + 1, ep->emm + 3, 0x04))
136 return 1;
139 return 0;
141 case 0x90:
142 ep->type = UNIQUE;
143 if(rdr->cwpkcaid_length && rdr->nuid_length)
145 memset(ep->hexserial, 0x00, 0x08);
146 ep->hexserial[0] = ep->emm[5];
147 ep->hexserial[1] = ep->emm[4];
148 ep->hexserial[2] = ep->emm[3];
149 ep->hexserial[3] = ep->emm[6];
150 return (!memcmp(rdr->nuid, ep->hexserial, 4));
152 return 0;
154 default:
155 ep->type = UNKNOWN;
156 return 0;
159 else if(rdr->autype == 2)
161 int i;
162 switch(ep->emm[0])
164 case 0x82:
165 ep->type = GLOBAL;
166 if(ep->emm[3] == 0x00 && ep->emm[4] == 0x00 && ep->emm[5] == 0x00)
168 return 1;
170 return 0;
172 case 0x83:
173 memset(ep->hexserial, 0x00, 0x08);
174 ep->hexserial[0] = ep->emm[5];
175 ep->hexserial[1] = ep->emm[4];
176 ep->hexserial[2] = ep->emm[3];
177 if(ep->emm[7] == 0x10)
179 ep->type = SHARED;
181 for(i = 0; i < rdr->nprov; i++)
183 if(!memcmp(rdr->sa[i], "\x00\x00\x00", 3))
185 continue;
188 if(!memcmp(rdr->sa[i], ep->hexserial, 0x03))
190 return 1;
194 else
196 ep->hexserial[3] = ep->emm[6];
197 ep->type = UNIQUE;
199 return (!memcmp(rdr->hexserial + 2, ep->hexserial, 0x04));
201 return 0;
203 case 0x84:
204 ep->type = GLOBAL;
205 return 1;
207 case 0x87:
208 memset(ep->hexserial, 0x00, 0x08);
209 ep->hexserial[0] = ep->emm[5];
210 ep->hexserial[1] = ep->emm[4];
211 ep->hexserial[2] = ep->emm[3];
212 ep->hexserial[3] = ep->emm[6];
213 ep->type = SHARED;
215 for(i = 0; i < rdr->nprov; i++)
217 if(!memcmp(rdr->sa[i], "\x00\x00\x00", 3))
219 continue;
221 if(!memcmp(rdr->sa[i], ep->hexserial, 0x04))
223 return 1;
226 return 0;
228 default:
229 ep->type = UNKNOWN;
230 return 0;
233 else
235 int i;
236 switch(ep->emm[0])
238 case 0x82:
239 memset(ep->hexserial, 0x00, 0x08);
240 ep->hexserial[0] = ep->emm[5];
241 ep->hexserial[1] = ep->emm[6];
242 ep->hexserial[2] = ep->emm[7];
243 ep->hexserial[3] = ep->emm[8];
244 if (!memcmp(rdr->hexserial + 2, ep->hexserial, 0x04))
246 ep->type = UNIQUE;
247 return 1;
249 else if ((ep->emm[3] == 0x00) && (ep->emm[4] == 0x00) && (ep->emm[5] == 0x00) && (ep->emm[6] == 0x00) && (ep->emm[7] == 0x00) && ((ep->emm[8] == 0x04) || (ep->emm[8] == 0xD3)) && ((ep->emm[9] == 0x84) || (ep->emm[9] == 0x8F) || (ep->emm[9] == 0x87)))
251 ep->type = GLOBAL;
252 return 1;
254 return 0;
256 case 0x84:
257 memset(ep->hexserial, 0x00, 0x08);
258 memcpy(ep->hexserial, ep->emm + 5, 3);
259 if ((ep->emm[2] == 0x77) && (ep->emm[3] == 0x00))
261 ep->type = SHARED;
262 i = get_prov_idx(rdr, ep->emm + 3);
264 if(i == -1)
266 return 0;
269 return (!memcmp(rdr->sa[i], ep->hexserial, 3));
271 else if ((ep->emm[3] == 0x00) && ((ep->emm[4] == 0x71) || (ep->emm[4] == 0x32) || (ep->emm[4] == 0xEC)) && (ep->emm[5] == 0x00) && (ep->emm[6] == 0x00) && (ep->emm[7] == 0x00) && (ep->emm[8] == 0x04) && (ep->emm[9] == 0x84))
273 ep->type = GLOBAL;
274 return 1;
276 return 0;
278 case 0x83:
279 memset(ep->hexserial, 0x00, 0x08);
280 ep->hexserial[0] = ep->emm[5];
281 ep->hexserial[1] = ep->emm[4];
282 ep->hexserial[2] = ep->emm[3];
283 ep->hexserial[3] = ep->emm[6];
284 if(ep->emm[7] == 0x10)
286 ep->type = SHARED;
288 for(i = 0; i < rdr->nprov; i++)
290 if(!memcmp(rdr->sa[i], "\x00\x00\x00", 3))
292 continue;
295 if(!memcmp(rdr->sa[i], ep->hexserial, 0x03))
297 return 1;
301 else if (!memcmp(rdr->hexserial + 2, ep->hexserial, 0x04))
303 ep->type = UNIQUE;
304 return 1;
306 else if ((ep->emm[5] == 0x04) && (ep->emm[6] == 0x70))
308 ep->type = GLOBAL;
309 return 1;
311 return 0;
313 case 0x87:
314 memset(ep->hexserial, 0x00, 0x08);
315 ep->hexserial[0] = ep->emm[5];
316 ep->hexserial[1] = ep->emm[4];
317 ep->hexserial[2] = ep->emm[3];
318 ep->hexserial[3] = ep->emm[6];
319 ep->type = SHARED;
321 for(i = 0; i < rdr->nprov; i++)
323 if(!memcmp(rdr->sa[i], "\x00\x00\x00", 3))
325 continue;
327 if(!memcmp(rdr->sa[i], ep->hexserial, 0x03))
329 return 1;
332 return 0;
334 default:
335 ep->type = UNKNOWN;
336 return 0;
341 int32_t nagra_get_emm_filter(struct s_reader *rdr, struct s_csystem_emm_filter **emm_filters, unsigned int *filter_count)
343 if(rdr->cak7type == 3 || rdr->autype == 1)
345 if(*emm_filters == NULL)
347 const unsigned int max_filter_count = 2 + (2 * rdr->nprov);
348 if(!cs_malloc(emm_filters, max_filter_count * sizeof(struct s_csystem_emm_filter)))
350 return ERROR;
353 struct s_csystem_emm_filter *filters = *emm_filters;
354 *filter_count = 0;
356 int32_t idx = 0;
358 filters[idx].type = EMM_UNIQUE;
359 filters[idx].enabled = 1;
360 filters[idx].filter[0] = 0x82;
361 filters[idx].mask[0] = 0xFF;
362 memcpy(&filters[idx].filter[1], rdr->hexserial, 6);
363 memset(&filters[idx].mask[1], 0xFF, 6);
364 idx++;
366 int32_t prov;
367 for(prov = 0; prov < rdr->nprov; prov++)
369 if(!memcmp(rdr->sa[prov], "\x00\x00\x00", 3))
371 continue;
374 filters[idx].type = EMM_GLOBAL;
375 filters[idx].enabled = 1;
376 filters[idx].filter[0] = 0x83;
377 filters[idx].mask[0] = 0xFF;
378 memcpy(&filters[idx].filter[1], &rdr->prid[prov][2], 2);
379 memset(&filters[idx].mask[1], 0xFF, 2);
380 idx++;
382 filters[idx].type = EMM_SHARED;
383 filters[idx].enabled = 1;
384 filters[idx].filter[0] = 0x84;
385 filters[idx].mask[0] = 0xFF;
386 memcpy(&filters[idx].filter[1], &rdr->prid[prov][2], 2);
387 memset(&filters[idx].mask[1], 0xFF, 2);
388 memcpy(&filters[idx].filter[3], &rdr->sa[prov], 3);
389 memset(&filters[idx].mask[3], 0xFF, 3);
390 idx++;
393 if(rdr->cwpkcaid_length && rdr->nuid_length)
395 filters[idx].type = EMM_UNIQUE;
396 filters[idx].enabled = 1;
397 filters[idx].filter[0] = 0x90;
398 filters[idx].filter[1] = rdr->nuid[2];
399 filters[idx].filter[2] = rdr->nuid[1];
400 filters[idx].filter[3] = rdr->nuid[0];
401 filters[idx].filter[4] = rdr->nuid[3];
402 memset(&filters[idx].mask[0], 0xFF, 5);
403 idx++;
406 *filter_count = idx;
409 return OK;
411 else if(rdr->cak7type == 1)
413 if(*emm_filters == NULL)
415 const unsigned int max_filter_count = 2 + (4 * rdr->nprov);
416 if(!cs_malloc(emm_filters, max_filter_count * sizeof(struct s_csystem_emm_filter)))
418 return ERROR;
421 struct s_csystem_emm_filter *filters = *emm_filters;
422 *filter_count = 0;
424 int32_t idx = 0;
426 if(rdr->emm82 == 1)
428 filters[idx].type = EMM_GLOBAL;
429 filters[idx].enabled = 1;
430 filters[idx].filter[0] = 0x82;
431 filters[idx].mask[0] = 0xFF;
432 idx++;
435 int32_t i;
436 for(i = 0; i < rdr->nemm83u; i++)
438 filters[idx].type = EMM_UNIQUE;
439 filters[idx].enabled = 1;
440 memcpy(&filters[idx].filter[0], rdr->emm83u[i], 6);
441 memset(&filters[idx].mask[0], 0xFF, 6);
442 idx++;
445 for(i = 0; i < rdr->nemm83s; i++)
447 filters[idx].type = EMM_SHARED;
448 filters[idx].enabled = 1;
449 memcpy(&filters[idx].filter[0], rdr->emm83s[i], 6);
450 memset(&filters[idx].mask[0], 0xFF, 6);
451 idx++;
454 for(i = 0; i < rdr->nemm84; i++)
456 filters[idx].type = EMM_GLOBAL;
457 filters[idx].enabled = 1;
458 memcpy(&filters[idx].filter[0], rdr->emm84[i], 3);
459 memset(&filters[idx].mask[0], 0xFF, 3);
460 idx++;
463 for(i = 0; i < rdr->nemm87; i++)
465 filters[idx].type = EMM_SHARED;
466 filters[idx].enabled = 1;
467 memcpy(&filters[idx].filter[0], rdr->emm87[i], 6);
468 memset(&filters[idx].mask[0], 0xFF, 6);
469 idx++;
472 if(rdr->cwpkcaid_length && rdr->nuid_length)
474 filters[idx].type = EMM_UNIQUE;
475 filters[idx].enabled = 1;
476 filters[idx].filter[0] = 0x90;
477 filters[idx].filter[1] = rdr->nuid[2];
478 filters[idx].filter[2] = rdr->nuid[1];
479 filters[idx].filter[3] = rdr->nuid[0];
480 filters[idx].filter[4] = rdr->nuid[3];
481 memset(&filters[idx].mask[0], 0xFF, 5);
482 idx++;
485 *filter_count = idx;
488 return OK;
490 else if(rdr->autype == 2)
492 if(*emm_filters == NULL)
494 const unsigned int max_filter_count = 3 + (2 * rdr->nprov);
495 if(!cs_malloc(emm_filters, max_filter_count * sizeof(struct s_csystem_emm_filter)))
497 return ERROR;
500 struct s_csystem_emm_filter *filters = *emm_filters;
501 *filter_count = 0;
503 int32_t idx = 0;
505 filters[idx].type = EMM_GLOBAL;
506 filters[idx].enabled = 1;
507 filters[idx].filter[0] = 0x82;
508 filters[idx].mask[0] = 0xFF;
509 idx++;
511 filters[idx].type = EMM_GLOBAL;
512 filters[idx].enabled = 1;
513 filters[idx].filter[0] = 0x84;
514 filters[idx].mask[0] = 0xFF;
515 idx++;
517 filters[idx].type = EMM_UNIQUE;
518 filters[idx].enabled = 1;
519 filters[idx].filter[0] = 0x83;
520 filters[idx].filter[1] = rdr->hexserial[4];
521 filters[idx].filter[2] = rdr->hexserial[3];
522 filters[idx].filter[3] = rdr->hexserial[2];
523 filters[idx].filter[4] = rdr->hexserial[5];
524 filters[idx].filter[5] = 0x00;
525 memset(&filters[idx].mask[0], 0xFF, 6);
526 idx++;
528 int i;
529 for(i = 0; i < rdr->nprov; i++)
531 if(!memcmp(rdr->sa[i], "\x00\x00\x00", 3))
533 continue;
536 filters[idx].type = EMM_SHARED;
537 filters[idx].enabled = 1;
538 filters[idx].filter[0] = 0x83;
539 filters[idx].filter[1] = rdr->sa[i][2];
540 filters[idx].filter[2] = rdr->sa[i][1];
541 filters[idx].filter[3] = rdr->sa[i][0];
542 filters[idx].filter[4] = 0x00;
543 filters[idx].filter[5] = 0x10;
544 memset(&filters[idx].mask[0], 0xFF, 6);
545 idx++;
547 filters[idx].type = EMM_SHARED;
548 filters[idx].enabled = 1;
549 filters[idx].filter[0] = 0x87;
550 filters[idx].filter[1] = rdr->sa[i][2];
551 filters[idx].filter[2] = rdr->sa[i][1];
552 filters[idx].filter[3] = rdr->sa[i][0];
553 filters[idx].filter[4] = rdr->sa[i][3];
554 filters[idx].filter[5] = 0x00;
555 memset(&filters[idx].mask[0], 0xFF, 6);
556 idx++;
559 *filter_count = idx;
562 return OK;
564 else
566 if(*emm_filters == NULL)
568 const unsigned int max_filter_count = 5 + (3 * rdr->nprov);
569 if(!cs_malloc(emm_filters, max_filter_count * sizeof(struct s_csystem_emm_filter)))
571 return ERROR;
574 struct s_csystem_emm_filter *filters = *emm_filters;
575 *filter_count = 0;
577 int32_t idx = 0;
579 filters[idx].type = EMM_UNIQUE;
580 filters[idx].enabled = 1;
581 filters[idx].filter[0] = 0x82;
582 filters[idx].mask[0] = 0xFF;
583 memcpy(&filters[idx].filter[1], rdr->hexserial, 6);
584 memset(&filters[idx].mask[1], 0xFF, 6);
585 idx++;
587 filters[idx].type = EMM_UNIQUE;
588 filters[idx].enabled = 1;
589 filters[idx].filter[0] = 0x83;
590 filters[idx].filter[1] = rdr->hexserial[4];
591 filters[idx].filter[2] = rdr->hexserial[3];
592 filters[idx].filter[3] = rdr->hexserial[2];
593 filters[idx].filter[4] = rdr->hexserial[5];
594 filters[idx].filter[5] = 0x00;
595 memset(&filters[idx].mask[0], 0xFF, 6);
596 idx++;
598 filters[idx].type = EMM_GLOBAL;
599 filters[idx].enabled = 1;
600 filters[idx].filter[0] = 0x82;
601 filters[idx].mask[0] = 0xFF;
602 idx++;
604 filters[idx].type = EMM_GLOBAL;
605 filters[idx].enabled = 1;
606 filters[idx].filter[0] = 0x84;
607 filters[idx].mask[0] = 0xFF;
608 idx++;
610 filters[idx].type = EMM_GLOBAL;
611 filters[idx].enabled = 1;
612 filters[idx].filter[0] = 0x83;
613 filters[idx].mask[0] = 0xFF;
614 idx++;
616 int32_t prov;
617 for(prov = 0; prov < rdr->nprov; prov++)
619 if(!memcmp(rdr->sa[prov], "\x00\x00\x00", 3))
621 continue;
624 filters[idx].type = EMM_SHARED;
625 filters[idx].enabled = 1;
626 filters[idx].filter[0] = 0x84;
627 filters[idx].mask[0] = 0xFF;
628 memcpy(&filters[idx].filter[1], &rdr->prid[prov][2], 2);
629 memset(&filters[idx].mask[1], 0xFF, 2);
630 memcpy(&filters[idx].filter[3], &rdr->sa[prov], 3);
631 memset(&filters[idx].mask[3], 0xFF, 3);
632 idx++;
634 filters[idx].type = EMM_SHARED;
635 filters[idx].enabled = 1;
636 filters[idx].filter[0] = 0x83;
637 filters[idx].filter[1] = rdr->sa[prov][2];
638 filters[idx].filter[2] = rdr->sa[prov][1];
639 filters[idx].filter[3] = rdr->sa[prov][0];
640 filters[idx].filter[4] = 0x00;
641 filters[idx].filter[5] = 0x10;
642 memset(&filters[idx].mask[0], 0xFF, 6);
643 idx++;
645 filters[idx].type = EMM_SHARED;
646 filters[idx].enabled = 1;
647 filters[idx].filter[0] = 0x87;
648 filters[idx].filter[1] = rdr->sa[prov][2];
649 filters[idx].filter[2] = rdr->sa[prov][1];
650 filters[idx].filter[3] = rdr->sa[prov][0];
651 filters[idx].filter[4] = 0x00;
652 filters[idx].filter[5] = 0x00;
653 memset(&filters[idx].mask[0], 0xFF, 6);
654 idx++;
657 *filter_count = idx;
660 return OK;