#include "globals.h" | |
2 | #ifdef READER_VIACCESS |
---|
3 | #include "oscam-aes.h" |
---|
4 | #include "oscam-time.h" |
---|
5 | #include "reader-common.h" |
---|
6 | |
---|
7 | struct via_date { |
---|
8 | uint16_t day_s : 5; |
---|
9 | uint16_t month_s : 4; |
---|
10 | uint16_t year_s : 7; |
---|
11 | |
---|
12 | uint16_t day_e : 5; |
---|
13 | uint16_t month_e : 4; |
---|
14 | uint16_t year_e : 7; |
---|
15 | }; |
---|
16 | |
---|
17 | static void parse_via_date(const uchar *buf, struct via_date *vd, int32_t fend) |
---|
18 | { |
---|
19 | uint16_t date; |
---|
20 | |
---|
21 | date = (buf[0]<<8) | buf[1]; |
---|
22 | vd->day_s = date & 0x1f; |
---|
23 | vd->month_s = (date>>5) & 0x0f; |
---|
24 | vd->year_s = (date>>9) & 0x7f; |
---|
25 | |
---|
26 | if( fend ) |
---|
27 | { |
---|
28 | date = (buf[2]<<8) | buf[3]; |
---|
29 | vd->day_e = date & 0x1f; |
---|
30 | vd->month_e = (date>>5) & 0x0f; |
---|
31 | vd->year_e = (date>>9) & 0x7f; |
---|
32 | } |
---|
33 | } |
---|
34 | |
---|
35 | //static void get_via_data(const uchar *b, int32_t l, time_t *start_t, time_t *end_t, uchar *cls) |
---|
36 | //{ |
---|
37 | // int32_t i, j; |
---|
38 | // struct via_date vd; |
---|
39 | // struct tm tm; |
---|
40 | // memset(&vd, 0, sizeof(struct via_date)); |
---|
41 | // |
---|
42 | // // b -> via date (4 bytes) |
---|
43 | // b+=4; |
---|
44 | // l-=4; |
---|
45 | // |
---|
46 | // j=l-1; |
---|
47 | // for (; j>=0; j--) |
---|
48 | // for (i=0; i<8; i++) |
---|
49 | // if (b[j] & (1 << (i&7))) |
---|
50 | // { |
---|
51 | // parse_via_date(b-4, &vd, 1); |
---|
52 | // *cls=(l-(j+1))*8+i; |
---|
53 | // } |
---|
54 | // |
---|
55 | // memset(&tm, 0, sizeof(struct tm)); |
---|
56 | // tm.tm_year = vd.year_s + 80; //via year starts in 1980, tm_year starts in 1900 |
---|
57 | // tm.tm_mon = vd.month_s - 1; // january is 0 in tm_mon |
---|
58 | // tm.tm_mday = vd.day_s; |
---|
59 | // *start_t = mktime(&tm); |
---|
60 | // |
---|
61 | // tm.tm_year = vd.year_e + 80; |
---|
62 | // tm.tm_mon = vd.month_e - 1; |
---|
63 | // tm.tm_mday = vd.day_e; |
---|
64 | // *end_t = mktime(&tm); |
---|
65 | // |
---|
66 | //} |
---|
67 | |
---|
68 | static void show_class(struct s_reader *reader, const char *p, uint32_t provid, const uchar *b, int32_t l) |
---|
69 | { |
---|
70 | int32_t i, j; |
---|
71 | |
---|
72 | // b -> via date (4 bytes) |
---|
73 | b+=4; |
---|
74 | l-=4; |
---|
75 | |
---|
76 | j=l-1; |
---|
77 | for (; j>=0; j--) |
---|
78 | for (i=0; i<8; i++) |
---|
79 | if (b[j] & (1 << (i&7))) |
---|
80 | { |
---|
81 | uchar cls; |
---|
82 | struct via_date vd; |
---|
83 | parse_via_date(b-4, &vd, 1); |
---|
84 | cls=(l-(j+1))*8+i; |
---|
85 | if (p) |
---|
86 | rdr_log(reader, "%sclass: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", p, cls, |
---|
87 | vd.year_s+1980, vd.month_s, vd.day_s, |
---|
88 | vd.year_e+1980, vd.month_e, vd.day_e); |
---|
89 | else { |
---|
90 | rdr_log(reader, "class: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", cls, |
---|
91 | vd.year_s+1980, vd.month_s, vd.day_s, |
---|
92 | vd.year_e+1980, vd.month_e, vd.day_e); |
---|
93 | |
---|
94 | time_t start_t, end_t; |
---|
95 | struct tm tm; |
---|
96 | //convert time: |
---|
97 | memset(&tm, 0, sizeof(tm)); |
---|
98 | tm.tm_year = vd.year_s+80; //via year starts in 1980, tm_year starts in 1900 |
---|
99 | tm.tm_mon = vd.month_s-1; // january is 0 in tm_mon |
---|
100 | tm.tm_mday = vd.day_s; |
---|
101 | start_t = cs_timegm(&tm); |
---|
102 | |
---|
103 | tm.tm_year = vd.year_e+80; //via year starts in 1980, tm_year starts in 1900 |
---|
104 | tm.tm_mon = vd.month_e-1; // january is 0 in tm_mon |
---|
105 | tm.tm_mday = vd.day_e; |
---|
106 | end_t = cs_timegm(&tm); |
---|
107 | |
---|
108 | cs_add_entitlement(reader, reader->caid, provid, cls, cls, start_t, end_t, 5); |
---|
109 | } |
---|
110 | } |
---|
111 | } |
---|
112 | |
---|
113 | static void show_subs(struct s_reader * reader, const uchar *emm) |
---|
114 | { |
---|
115 | // emm -> A9, A6, B6 |
---|
116 | |
---|
117 | switch( emm[0] ) |
---|
118 | { |
---|
119 | case 0xA9: |
---|
120 | show_class(reader, "nano A9: ", 0, emm+2, emm[1]); |
---|
121 | break; |
---|
122 | /* |
---|
123 | { |
---|
124 | int32_t i, j, byts; |
---|
125 | const uchar *oemm; |
---|
126 | |
---|
127 | oemm = emm; |
---|
128 | byts = emm[1]-4; |
---|
129 | emm+=6; |
---|
130 | |
---|
131 | j=byts-1; |
---|
132 | for( ; j>=0; j-- ) |
---|
133 | for( i=0; i<8; i++ ) |
---|
134 | if( emm[j] & (1 << (i&7)) ) |
---|
135 | { |
---|
136 | uchar cls; |
---|
137 | struct via_date vd; |
---|
138 | parse_via_date(emm-4, &vd, 1); |
---|
139 | cls=(byts-(j+1))*8+i; |
---|
140 | rdr_log(reader, "%sclass %02X: expiry date: %02d/%02d/%04d - %02d/%02d/%04d", |
---|
141 | fnano?"nano A9: ":"", cls, |
---|
142 | vd.day_s, vd.month_s, vd.year_s+1980, |
---|
143 | vd.day_e, vd.month_e, vd.year_e+1980); |
---|
144 | } |
---|
145 | break; |
---|
146 | } |
---|
147 | */ |
---|
148 | case 0xA6: |
---|
149 | { |
---|
150 | char szGeo[256]; |
---|
151 | |
---|
152 | memset(szGeo, 0, 256); |
---|
153 | strncpy(szGeo, (char *)emm+2, emm[1]); |
---|
154 | rdr_log(reader, "nano A6: geo %s", szGeo); |
---|
155 | break; |
---|
156 | } |
---|
157 | case 0xB6: |
---|
158 | { |
---|
159 | uchar m; // modexp |
---|
160 | struct via_date vd; |
---|
161 | |
---|
162 | m=emm[emm[1]+1]; |
---|
163 | parse_via_date(emm+2, &vd, 0); |
---|
164 | rdr_log(reader, "nano B6: modexp %d%d%d%d%d%d: %02d/%02d/%04d", (m&0x20)?1:0, |
---|
165 | (m&0x10)?1:0,(m&0x08)?1:0,(m&0x04)?1:0,(m&0x02)?1:0,(m&0x01)?1:0, |
---|
166 | vd.day_s, vd.month_s, vd.year_s+1980); |
---|
167 | break; |
---|
168 | } |
---|
169 | } |
---|
170 | } |
---|
171 | |
---|
172 | static int32_t chk_prov(struct s_reader * reader, uchar *id, uchar keynr) |
---|
173 | { |
---|
174 | int32_t i, j, rc; |
---|
175 | for (rc=i=0; (!rc) && (i<reader->nprov); i++) |
---|
176 | if(!memcmp(&reader->prid[1], id, 3)) |
---|