Advertisement
Guest User

Untitled

a guest
Jan 6th, 2014
1,059
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 34.65 KB | None | 0 0
  1. #include "globals.h"
  2. #ifdef READER_VIDEOGUARD
  3. #include "cscrypt/md5.h"
  4. #include "oscam-work.h"
  5. #include "reader-common.h"
  6. #include "reader-videoguard-common.h"
  7.  
  8. static void dimeno_PostProcess_Decrypt(struct s_reader * reader, unsigned char *rxbuff, unsigned char *cw)
  9. {
  10. struct videoguard_data *csystem_data = reader->csystem_data;
  11. unsigned char tag,len,len2;
  12. bool valid_0x55=0;
  13. unsigned char *body;
  14. unsigned char buffer[0x10];
  15. int32_t a=0x13;
  16. len2=rxbuff[4];
  17. while(a<len2+5-9) // +5 for 5 ins bytes, -9 (body=8 len=1) to prevent memcpy(buffer+8,body,8) from reading past rxbuff
  18. {
  19. tag=rxbuff[a];
  20. len=rxbuff[a+1];
  21. body=rxbuff+a+2;
  22. switch(tag)
  23. {
  24. case 0x55:{
  25. if(body[0]==0x84){ //Tag 0x56 has valid data...
  26. valid_0x55=1;
  27. }
  28. }break;
  29. case 0x56:{
  30. memcpy(buffer+8,body,8);
  31. }break;
  32. }
  33. a+=len+2;
  34. }
  35. if(valid_0x55){
  36. memcpy(buffer,rxbuff+5,8);
  37. AES_decrypt(buffer,buffer,&(csystem_data->astrokey));
  38. memcpy(cw+0,buffer,8); // copy calculated CW in right place
  39. }
  40. }
  41.  
  42. static void do_post_dw_hash(struct s_reader *reader, unsigned char *cw, const unsigned char *ecm_header_data)
  43. {
  44. int32_t i, ecmi, ecm_header_count;
  45. unsigned char buffer[0x85]; //original 0x80 but with 0x7D mask applied +8 bytes cw it was still to small
  46. unsigned char md5tmp[MD5_DIGEST_LENGTH];
  47. static const uint16_t Hash3[] = {0x0123,0x4567,0x89AB,0xCDEF,0xF861,0xCB52};
  48. static const unsigned char Hash4[] = {0x0B,0x04,0x07,0x08,0x05,0x09,0x0B,0x0A,0x07,0x02,0x0A,0x05,0x04,0x08,0x0D,0x0F};
  49. static const uint16_t NdTabB001[0x15][0x20] = {
  50. {0xEAF1, 0x0237, 0x29D0, 0xBAD2, 0xE9D3, 0x8BAE, 0x2D6D, 0xCD1B,
  51. 0x538D, 0xDE6B, 0xA634, 0xF81A, 0x18B5, 0x5087, 0x14EA, 0x672E,
  52. 0xF0FC, 0x055E, 0x62E5, 0xB78F, 0x5D09, 0x0003, 0xE4E8, 0x2DCE,
  53. 0x6BE0, 0xAC4E, 0xF485, 0x6967, 0xF28C, 0x97A0, 0x01EF, 0x0100},
  54. {0xC539, 0xF5B9, 0x9099, 0x013A, 0xD4B9, 0x6AB5, 0xEA67, 0x7EB4,
  55. 0x6C30, 0x4BF0, 0xB810, 0xB0B5, 0xB76D, 0xA751, 0x1AE7, 0x14CA,
  56. 0x4F4F, 0x1586, 0x2608, 0x10B1, 0xE7E1, 0x48BE, 0x7DDD, 0x5ECB,
  57. 0xCFBF, 0x323B, 0x8B31, 0xB131, 0x0F1A, 0x664B, 0x0140, 0x0100},
  58. {0x3C7D, 0xBDC4, 0xFEC7, 0x26A6, 0xB0A0, 0x6E55, 0xF710, 0xF9BF,
  59. 0x0023, 0xE81F, 0x41CA, 0xBE32, 0xB461, 0xE92D, 0xF1AF, 0x409F,
  60. 0xFC85, 0xFE5B, 0x7FCE, 0x17F5, 0x01AB, 0x4A46, 0xEB05, 0xA251,
  61. 0xDC6F, 0xF0C0, 0x10F0, 0x1D51, 0xEFAA, 0xE9BF, 0x0100, 0x0100},
  62. {0x1819, 0x0CAA, 0x9067, 0x607A, 0x7576, 0x1CBC, 0xE51D, 0xBF77,
  63. 0x7EC6, 0x839E, 0xB695, 0xF096, 0xDC10, 0xCB69, 0x4654, 0x8E68,
  64. 0xD62D, 0x4F1A, 0x4227, 0x92AC, 0x9064, 0x6BD1, 0x1E75, 0x2747,
  65. 0x00DA, 0xA6A6, 0x6CF1, 0xD151, 0xBE56, 0x3E33, 0x0128, 0x0100},
  66. {0x4091, 0x09ED, 0xD494, 0x6054, 0x1869, 0x71D5, 0xB572, 0x7BF1,
  67. 0xE925, 0xEE2D, 0xEEDE, 0xA13C, 0x6613, 0x9BAB, 0x122D, 0x7AE4,
  68. 0x5268, 0xE6C9, 0x50CB, 0x79A1, 0xF212, 0xA062, 0x6B48, 0x70B3,
  69. 0xF6B0, 0x06D5, 0xF8AB, 0xECF5, 0x6255, 0xEDD8, 0x79D2, 0x290A},
  70. {0xD3CF, 0x014E, 0xACB3, 0x8F6B, 0x0F2C, 0xA5D8, 0xE8E0, 0x863D,
  71. 0x80D5, 0x5705, 0x658A, 0x8BC2, 0xEE46, 0xD3AE, 0x0199, 0x0100,
  72. 0x4A35, 0xABE4, 0xF976, 0x935A, 0xA8A5, 0xBAE9, 0x24D0, 0x71AA,
  73. 0xB3FE, 0x095E, 0xAB06, 0x4CD5, 0x2F0D, 0x1ACB, 0x59F3, 0x4C50},
  74. {0xFD27, 0x0F8E, 0x191A, 0xEEE7, 0x2F49, 0x3A05, 0x3267, 0x4F88,
  75. 0x38AE, 0xFCE9, 0x9476, 0x18C6, 0xF961, 0x4EF0, 0x39D0, 0x42E6,
  76. 0xB747, 0xE625, 0xB68E, 0x5100, 0xF92A, 0x86FE, 0xE79B, 0xEE91,
  77. 0x21D5, 0x4C3C, 0x683D, 0x5AD1, 0x1B49, 0xF407, 0x0194, 0x0100},
  78. {0x4BF9, 0xDC0D, 0x9478, 0x5174, 0xCB4A, 0x8A89, 0x4D6A, 0xFED8,
  79. 0xF123, 0xA8CD, 0xEEE7, 0xA6D1, 0xB763, 0xF5E2, 0xE085, 0x01EF,
  80. 0xE466, 0x9FA3, 0x2F68, 0x2190, 0x423F, 0x287F, 0x7F3F, 0x09F6,
  81. 0x2111, 0xA963, 0xD0BB, 0x674A, 0xBA72, 0x45F9, 0xF186, 0xB8F5},
  82. {0x0010, 0xD1B9, 0xB164, 0x9E87, 0x1F49, 0x6950, 0x2DBF, 0x38D3,
  83. 0x2EB0, 0x3E8E, 0x91E6, 0xF688, 0x7E41, 0x566E, 0x01B0, 0x0100,
  84. 0x24A1, 0x73D8, 0xA0C3, 0xF71B, 0xA0A5, 0x2A06, 0xBA46, 0xFEC3,
  85. 0xDD4C, 0x52CC, 0xF9BC, 0x3B7E, 0x3812, 0x0666, 0xB74B, 0x40F8},
  86. {0x28F2, 0x7C81, 0xFC92, 0x6FBD, 0x53D6, 0x72A3, 0xBBDF, 0xB6FC,
  87. 0x9CE5, 0x2331, 0xD4F6, 0xC5BB, 0xE8BB, 0x6676, 0x02D9, 0x2F0E,
  88. 0xD009, 0xD136, 0xCD09, 0x7551, 0x1826, 0x9D9B, 0x63EA, 0xFC63,
  89. 0x68CD, 0x3672, 0xCB95, 0xD28E, 0xF1CD, 0x20CA, 0x014C, 0x0100},
  90. {0xE539, 0x55B7, 0x989D, 0x21C4, 0x463A, 0xE68F, 0xF8B5, 0xE5C5,
  91. 0x662B, 0x35BF, 0x3C50, 0x0131, 0xF4BF, 0x38B2, 0x41BC, 0xB829,
  92. 0x02B7, 0x6B8F, 0xA25C, 0xAFD2, 0xD84A, 0x2243, 0x53EB, 0xC6C9,
  93. 0x2E14, 0x181F, 0x8F96, 0xDF0E, 0x0D4C, 0x30F6, 0xFFE1, 0x9DDA},
  94. {0x30B6, 0x777E, 0xDA3D, 0xAF77, 0x205E, 0xC90B, 0x856B, 0xB451,
  95. 0x3BCC, 0x76C2, 0x8ACF, 0xDCB1, 0xA5E5, 0xDD64, 0x0197, 0x0100,
  96. 0xE751, 0xB661, 0x0404, 0xDB4A, 0xE9DD, 0xA400, 0xAF26, 0x3F5E,
  97. 0x904B, 0xA924, 0x09E0, 0xE72B, 0x825B, 0x2C50, 0x6FD0, 0x0D52},
  98. {0x2730, 0xC2BA, 0x9E44, 0x5815, 0xFC47, 0xB21D, 0x67B8, 0xF8B9,
  99. 0x047D, 0xB0AF, 0x9F14, 0x741B, 0x4668, 0xBE54, 0xDE16, 0xDB14,
  100. 0x7CB7, 0xF2B8, 0x0683, 0x762C, 0x09A0, 0x9507, 0x7F92, 0x022C,
  101. 0xBA6A, 0x7D52, 0x0AF4, 0x1BC3, 0xB46A, 0xC4FD, 0x01C2, 0x0100},
  102. {0x7611, 0x66F3, 0xEE87, 0xEDD3, 0xC559, 0xEFD4, 0xDC59, 0xF86B,
  103. 0x6D1C, 0x1C85, 0x9BB1, 0x3373, 0x763F, 0x4EBE, 0x1BF3, 0x99B5,
  104. 0xD721, 0x978F, 0xCF5C, 0xAC51, 0x0984, 0x7462, 0x8F0C, 0x2817,
  105. 0x4AD9, 0xFD41, 0x6678, 0x7C85, 0xD330, 0xC9F8, 0x1D9A, 0xC622},
  106. {0x5AE4, 0xE16A, 0x60F6, 0xFD45, 0x668C, 0x29D6, 0x0285, 0x6B92,
  107. 0x92C2, 0x21DE, 0x45E0, 0xEF3D, 0x8B0D, 0x02CD, 0x0198, 0x0100,
  108. 0x9E6D, 0x4D38, 0xDEF9, 0xE6F2, 0xF72E, 0xB313, 0x14F2, 0x390A,
  109. 0x2D67, 0xC71E, 0xCB69, 0x7F66, 0xD3CF, 0x7F8A, 0x81D9, 0x9DDE},
  110. {0x85E3, 0x8F29, 0x36EB, 0xC968, 0x3696, 0x59F6, 0x7832, 0xA78B,
  111. 0xA1D8, 0xF5CF, 0xAB64, 0x646D, 0x7A2A, 0xBAF8, 0xAA87, 0x41C7,
  112. 0x5120, 0xDE78, 0x738D, 0xDC1A, 0x268D, 0x5DF8, 0xED69, 0x1C8A,
  113. 0xBC85, 0x3DCD, 0xAE30, 0x0F8D, 0xEC89, 0x3ABD, 0x0166, 0x0100},
  114. {0xB8BD, 0x643B, 0x748E, 0xBD63, 0xEC6F, 0xE23A, 0x9493, 0xDD76,
  115. 0x0A62, 0x774F, 0xCD68, 0xA67A, 0x9A23, 0xC8A8, 0xBDE5, 0x9D1B,
  116. 0x2B86, 0x8B36, 0x5428, 0x1DFB, 0xCD1D, 0x0713, 0x29C2, 0x8E8E,
  117. 0x5207, 0xA13F, 0x6005, 0x4F5E, 0x52E0, 0xE7C8, 0x6D1C, 0x3E34},
  118. {0x581D, 0x2BFA, 0x5E1D, 0xA891, 0x1069, 0x1DA4, 0x39A0, 0xBE45,
  119. 0x5B9A, 0x7333, 0x6F3E, 0x8637, 0xA550, 0xC9E9, 0x5C6C, 0x42BA,
  120. 0xA712, 0xC3EA, 0x3808, 0x0910, 0xAA4D, 0x5B25, 0xABCD, 0xE680,
  121. 0x96AD, 0x2CEC, 0x8EBB, 0xA47D, 0x1690, 0xE8FB, 0x01C8, 0x0100},
  122. {0x73B9, 0x82BC, 0x9EBC, 0xB130, 0x0DA5, 0x8617, 0x9F7B, 0x9766,
  123. 0x205D, 0x752D, 0xB05C, 0x2A17, 0xA75C, 0x18EF, 0x8339, 0xFD34,
  124. 0x8DA2, 0x7970, 0xD0B4, 0x70F1, 0x3765, 0x7380, 0x7CAF, 0x570E,
  125. 0x6440, 0xBC44, 0x0743, 0x2D02, 0x0419, 0xA240, 0x2113, 0x1AD4},
  126. {0x1EB5, 0xBBFF, 0x39B1, 0x3209, 0x705F, 0x15F4, 0xD7AD, 0x340B,
  127. 0xC2A6, 0x25CA, 0xF412, 0x9570, 0x0F4F, 0xE4D5, 0x1614, 0xE464,
  128. 0x911A, 0x0F0E, 0x07DA, 0xA929, 0x2379, 0xD988, 0x0AA6, 0x3B57,
  129. 0xBF63, 0x71FB, 0x72D5, 0x26CE, 0xB0AF, 0xCF45, 0x011B, 0x0100},
  130. {0x9999, 0x98FE, 0xA108, 0x6588, 0xF90B, 0x4554, 0xFF38, 0x4642,
  131. 0x8F5F, 0x6CC3, 0x4E8E, 0xFF7E, 0x64C2, 0x50CA, 0x0E7F, 0xAD7D,
  132. 0x6AAB, 0x33C1, 0xE1F4, 0x6165, 0x7894, 0x83B9, 0x0A0C, 0x38AF,
  133. 0x5803, 0x18C0, 0xFA36, 0x592C, 0x4548, 0xABB8, 0x1527, 0xAEE9}
  134. };
  135.  
  136.  
  137. //ecm_header_data = 01 03 b0 01 01
  138. if (!cw_is_valid(cw)) //if cw is all zero, keep it that way
  139. {
  140. return;
  141. }
  142. ecm_header_count = ecm_header_data[0];
  143. for (i = 0, ecmi = 1; i < ecm_header_count; i++)
  144. {
  145. if (ecm_header_data[ecmi + 1] != 0xb0)
  146. {
  147. ecmi += ecm_header_data[ecmi] + 1;
  148. }
  149. else
  150. {
  151. switch (ecm_header_data[ecmi + 2])
  152. { //b0 01
  153. case 1:
  154. {
  155. uint16_t hk[8], r, j, m = 0;
  156. for (r = 0; r < 6; r++)
  157. hk[2 + r] = Hash3[r];
  158. for (r = 0; r < 2; r++)
  159. {
  160. for (j = 0; j < 0x48; j += 2)
  161. {
  162. if (r)
  163. {
  164. hk[0] = ((hk[3] & hk[5]) | ((~hk[5]) & hk[4]));
  165. }
  166. else
  167. {
  168. hk[0] = ((hk[3] & hk[4]) | ((~hk[3]) & hk[5]));
  169. }
  170. if (j < 8)
  171. {
  172. hk[0] = (hk[0] + ((cw[j + 1] << 8) | cw[j]));
  173. }
  174. if (j == 8)
  175. {
  176. hk[0] = (hk[0] + 0x80);
  177. }
  178. hk[0] = (hk[0] + hk[2] + (0xFF & NdTabB001[ecm_header_data[ecmi + 3]][m >> 1] >> ((m & 1) << 3)));
  179. hk[1] = hk[2];
  180. hk[2] = hk[3];
  181. hk[3] = hk[4];
  182. hk[4] = hk[5];
  183. hk[5] = hk[6];
  184. hk[6] = hk[7];
  185. hk[7] = hk[2] + (((hk[0] << Hash4[m & 0xF]) | (hk[0] >> (0x10 - Hash4[m & 0xF]))));
  186. m = (m + 1) & 0x3F;
  187. }
  188. }
  189. for (r = 0; r < 6; r++)
  190. {
  191. hk[2 + r] += Hash3[r];
  192. }
  193. for (r = 0; r < 7; r++)
  194. {
  195. cw[r] = hk[2 + (r >> 1)] >> ((r & 1) << 3);
  196. }
  197. cw[3] = (cw[0] + cw[1] + cw[2]) & 0xFF;
  198. cw[7] = (cw[4] + cw[5] + cw[6]) & 0xFF;
  199. rdr_ddump_mask(reader, D_READER, cw, 8, "Postprocessed Case 1 DW:");
  200. break;
  201. }
  202. case 3:
  203. {
  204. memset(buffer, 0, sizeof(buffer));
  205. memcpy(buffer, cw, 8);
  206. memcpy(buffer + 8, &ecm_header_data[ecmi + 3], ecm_header_data[ecmi]&0x7D);
  207. MD5(buffer, 8 + (ecm_header_data[ecmi]&0x7D), md5tmp);
  208. memcpy(cw, md5tmp, 8);
  209. rdr_ddump_mask(reader, D_READER, cw, 8, "Postprocessed Case 3 DW:");
  210. break;
  211. }
  212. case 2:
  213. {
  214. /* Method 2 left out */
  215. //memcpy(DW_OUTPUT, DW_INPUT, 8);
  216. break;
  217. }
  218. }
  219. }
  220. }
  221. }
  222.  
  223.  
  224. static void vg2_read_tiers(struct s_reader * reader)
  225. {
  226. def_resp;
  227. int32_t l;
  228.  
  229. /* ins2a is not needed and causes an error on some cards eg Sky Italy 09CD
  230. check if ins2a is in command table before running it
  231. */
  232. static const unsigned char ins2a[5] = { 0xD0,0x2a,0x00,0x00,0x00 };
  233. if(cmd_exists(reader,ins2a)) {
  234. l=do_cmd(reader,ins2a,NULL,NULL,cta_res);
  235. if(l<0 || !status_ok(cta_res+l)){
  236. rdr_log(reader, "classD0 ins2a: failed");
  237. return;
  238. }
  239. }
  240.  
  241. static const unsigned char ins40[5] = { 0xD1,0x40,0x00,0x00,0x00 };
  242. if(cmd_exists(reader,ins40)) {
  243. l=do_cmd(reader,ins40,NULL,NULL,cta_res);
  244. if(l<0 || !status_ok(cta_res+l)){
  245. rdr_log(reader, "classD1 ins40: failed");
  246. return;
  247. }
  248. }
  249.  
  250. static const unsigned char ins42[5] = { 0xD1,0x42,0x00,0x00,0x00 };
  251. if(cmd_exists(reader,ins42)) {
  252. l=do_cmd(reader,ins42,NULL,NULL,cta_res);
  253. if(l<0 || !status_ok(cta_res+l)){
  254. rdr_log(reader, "classD1 ins42: failed");
  255. return;
  256. }
  257. }
  258.  
  259. static const unsigned char ins76007f[5] = { 0xD0,0x76,0x00,0x7f,0x02 };
  260. if(!write_cmd_vg(ins76007f,NULL) || !status_ok(cta_res+2)){
  261. rdr_log(reader, "classD0 ins76007f: failed");
  262. return;
  263. }
  264. int32_t num=cta_res[1];
  265.  
  266. int32_t i;
  267. unsigned char ins76[5] = { 0xD0,0x76,0x00,0x00,0x00 };
  268. struct videoguard_data *csystem_data = reader->csystem_data;
  269.  
  270. // some cards start real tiers info in middle of tier info
  271. // and have blank tiers between old tiers and real tiers eg 09AC
  272. int32_t starttier = csystem_data->card_tierstart;
  273. bool stopemptytier = 1;
  274. if (!starttier)
  275. stopemptytier = 0;
  276.  
  277. // check to see if specified start tier is blank and if blank, start at 0 and ignore blank tiers
  278. ins76[2]=starttier;
  279. l=do_cmd(reader,ins76,NULL,NULL,cta_res);
  280. if(l<0 || !status_ok(cta_res+l)) return;
  281. if(cta_res[2]==0 && cta_res[3]==0 ){
  282. stopemptytier = 0;
  283. starttier = 0;
  284. }
  285.  
  286. cs_clear_entitlement(reader); // reset the entitlements
  287.  
  288. for(i=starttier; i<num; i++) {
  289. ins76[2]=i;
  290. l=do_cmd(reader,ins76,NULL,NULL,cta_res);
  291. if(l<0 || !status_ok(cta_res+l)) return;
  292. if(cta_res[2]==0 && cta_res[3]==0 && stopemptytier) return;
  293. if(cta_res[2]!=0 || cta_res[3]!=0) {
  294. char tiername[83];
  295. uint16_t tier_id = (cta_res[2] << 8) | cta_res[3];
  296. // add entitlements to list
  297. struct tm timeinfo;
  298. memset(&timeinfo, 0, sizeof(struct tm));
  299. rev_date_calc_tm(&cta_res[4],&timeinfo,csystem_data->card_baseyear);
  300. cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[0]), tier_id, 0, 0, mktime(&timeinfo), 4);
  301.  
  302. if(!stopemptytier){
  303. rdr_debug_mask(reader, D_READER, "tier: %04x, tier-number: 0x%02x",tier_id,i);
  304. }
  305. 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));
  306. }
  307. }
  308. }
  309.  
  310. static int32_t videoguard2_card_init(struct s_reader * reader, ATR *newatr)
  311. {
  312. get_hist;
  313. if ((hist_size < 7) || (hist[1] != 0xB0) || (hist[4] != 0xFF) || (hist[5] != 0x4A) || (hist[6] != 0x50)){
  314. rdr_debug_mask(reader, D_READER, "failed history check");
  315. return ERROR;
  316. }
  317. rdr_debug_mask(reader, D_READER, "passed history check");
  318.  
  319. get_atr;
  320. def_resp;
  321.  
  322. if (!cs_malloc(&reader->csystem_data, sizeof(struct videoguard_data)))
  323. return ERROR;
  324. struct videoguard_data *csystem_data = reader->csystem_data;
  325.  
  326. /* set information on the card stored in reader-videoguard-common.c */
  327. set_known_card_info(reader,atr,&atr_size);
  328.  
  329. if((reader->ndsversion != NDS2) &&
  330. (((csystem_data->card_system_version != NDS2) && (csystem_data->card_system_version != NDSUNKNOWN)) ||
  331. (reader->ndsversion != NDSAUTO))) {
  332. /* known ATR and not NDS2
  333. or known NDS2 ATR and forced to another NDS version */
  334. return ERROR;
  335. }
  336.  
  337. rdr_debug_mask(reader, D_READER, "type: %s, baseyear: %i", csystem_data->card_desc, csystem_data->card_baseyear);
  338. if(reader->ndsversion == NDS2){
  339. rdr_debug_mask(reader, D_READER, "forced to NDS2");
  340. }
  341.  
  342. //a non videoguard2/NDS2 card will fail on read_cmd_len(ins7401)
  343. //this way unknown videoguard2/NDS2 cards will also pass this check
  344.  
  345. unsigned char ins7401[5] = { 0xD0,0x74,0x01,0x00,0x00 };
  346. int32_t l;
  347. if((l=read_cmd_len(reader,ins7401))<0){ //not a videoguard2/NDS card or communication error
  348. return ERROR;
  349. }
  350. ins7401[4]=l;
  351. if(!write_cmd_vg(ins7401,NULL) || !status_ok(cta_res+l)) {
  352. rdr_log(reader, "classD0 ins7401: failed - cmd list not read");
  353. return ERROR;
  354. }
  355.  
  356. memorize_cmd_table (reader,cta_res,l);
  357.  
  358. unsigned char buff[256];
  359.  
  360. static const unsigned char ins7416[5] = { 0xD0,0x74,0x16,0x00,0x00 };
  361. if(do_cmd(reader,ins7416,NULL,NULL,cta_res)<0) {
  362. rdr_log(reader, "classD0 ins7416: failed");
  363. return ERROR;
  364. }
  365.  
  366. static const unsigned char ins02[5] = { 0xD0,0x02,0x00,0x00,0x08 };
  367. // D0 02 command is not always present in command table but should be supported
  368. // on most cards so do not use do_cmd()
  369. if(!write_cmd_vg(ins02,NULL) || !status_ok(cta_res+8)){
  370. rdr_log(reader, "Unable to get NDS ROM version.");
  371. } else {
  372. int i;
  373. for (i = 0; i < 8; i++) {
  374. if (cta_res[i] <= 0x09) {
  375. cta_res[i] = cta_res[i] + 0x30;
  376. } else if (!isalnum(cta_res[i])) {
  377. cta_res[i] = '*';
  378. }
  379. }
  380. memset(reader->rom, 0, sizeof(reader->rom));
  381. memcpy(reader->rom, cta_res, 4);
  382. reader->rom[4] = '-';
  383. memcpy(reader->rom + 5, cta_res + 4, 4);
  384.  
  385. rdr_log(reader, "Card type: %c%c%c%c", reader->rom[0], reader->rom[1], reader->rom[2],reader->rom[3]);
  386. rdr_log(reader, "Rom version: %c%c%c%c", reader->rom[5], reader->rom[6], reader->rom[7], reader->rom[8]);
  387. }
  388.  
  389.  
  390. unsigned char boxID [4];
  391.  
  392. if (reader->boxid > 0) {
  393. /* the boxid is specified in the config */
  394. int32_t i;
  395. for (i=0; i < 4; i++) {
  396. boxID[i] = (reader->boxid >> (8 * (3 - i))) % 0x100;
  397. }
  398. } else {
  399. unsigned char ins36[5] = { 0xD0,0x36,0x00,0x00,0x00 };
  400. static const unsigned char ins5e[5] = { 0xD0,0x5E,0x00,0x0C,0x02 };
  401.  
  402. /* we can try to get the boxid from the card */
  403. int32_t boxidOK=0;
  404. l=read_cmd_len(reader,ins36);
  405. if(l > 0) {
  406. ins36[4] = l;
  407. }
  408. else if(cmd_exists(reader,ins5e)) {
  409. if(!write_cmd_vg(ins5e,NULL) || !status_ok(cta_res+2)){
  410. rdr_log(reader, "classD0 ins5e: failed");
  411. } else {
  412. ins36[3] = cta_res[0];
  413. ins36[4] = cta_res[1];
  414. }
  415. }
  416. l=ins36[4];
  417. if(!write_cmd_vg(ins36,NULL) || !status_ok(cta_res+l)){
  418. rdr_log(reader, "classD0 ins36: failed");
  419. return ERROR;
  420. }
  421. memcpy(buff,ins36,5);
  422. memcpy(buff+5,cta_res,l);
  423. memcpy(buff+5+l,cta_res+l,2);
  424. if(l<13)
  425. rdr_log(reader, "classD0 ins36: answer too int16");
  426. else if (buff[7] > 0x0F)
  427. rdr_log(reader, "classD0 ins36: encrypted - can't parse");
  428. else {
  429. /* skipping the initial fixed fields: cmdecho (4) + length (1) + encr/rev++ (4) */
  430. int32_t i=9;
  431. int32_t gotUA=0;
  432. while (i<l) {
  433. if (!gotUA && buff[i]<0xF0) { /* then we guess that the next 4 bytes is the UA */
  434. gotUA=1;
  435. i+=4;
  436. } else switch (buff[i]) { /* object length vary depending on type */
  437. case 0x00: /* padding */
  438. i+=1;
  439. break;
  440. case 0xEF: /* card status */
  441. i+=3;
  442. break;
  443. case 0xD1:
  444. i+=4;
  445. break;
  446. case 0xDF: /* next server contact */
  447. i+=5;
  448. break;
  449. case 0xF3: /* boxID */
  450. memcpy(boxID,buff+i+1,sizeof(boxID));
  451. boxidOK=1;
  452. i+=5;
  453. break;
  454. case 0xF6:
  455. i+=6;
  456. break;
  457. case 0x01: /* date & time */
  458. i+=7;
  459. break;
  460. case 0xFA:
  461. i+=9;
  462. break;
  463. case 0x5E:
  464. case 0x67: /* signature */
  465. case 0xDE:
  466. case 0xE2:
  467. case 0xE9: /* tier dates */
  468. case 0xF8: /* Old PPV Event Record */
  469. case 0xFD:
  470. i+=buff[i+1]+2; /* skip length + 2 bytes (type and length) */
  471. break;
  472. default: /* default to assume a length byte */
  473. rdr_log(reader, "classD0 ins36: returned unknown type=0x%02X - parsing may fail", buff[i]);
  474. i+=buff[i+1]+2;
  475. }
  476. }
  477. }
  478.  
  479. if(!boxidOK) {
  480. rdr_log(reader, "no boxID available");
  481. return ERROR;
  482. }
  483. }
  484.  
  485. static const unsigned char ins4C[5] = { 0xD0,0x4C,0x00,0x00,0x09 };
  486. unsigned char payload4C[9] = { 0,0,0,0, 3,0,0,0,4 };
  487. memcpy(payload4C,boxID,4);
  488. if(!write_cmd_vg(ins4C,payload4C) || !status_ok(cta_res+l)) {
  489. rdr_log(reader, "classD0 ins4C: failed - sending boxid failed");
  490. return ERROR;
  491. }
  492.  
  493. //int16_t int32_t SWIRDstatus = cta_res[1];
  494. static const unsigned char ins58[5] = { 0xD0,0x58,0x00,0x00,0x00 };
  495. l=do_cmd(reader,ins58,NULL,NULL,cta_res);
  496. if(l<0) {
  497. rdr_log(reader, "classD0 ins58: failed");
  498. return ERROR;
  499. }
  500. memset(reader->hexserial, 0, 8);
  501. memcpy(reader->hexserial+2, cta_res+3, 4);
  502. memcpy(reader->sa, cta_res+3, 3);
  503. reader->caid = cta_res[24]*0x100+cta_res[25];
  504.  
  505. /* we have one provider, 0x0000 */
  506. reader->nprov = 1;
  507. memset(reader->prid, 0x00, sizeof(reader->prid));
  508.  
  509. /*
  510. rdr_log(reader, "INS58 : Fuse byte=0x%02X, IRDStatus=0x%02X", cta_res[2],SWIRDstatus);
  511. if (SWIRDstatus==4) {
  512. // If swMarriage=4, not married then exchange for BC Key
  513. rdr_log(reader, "Card not married, exchange for BC Keys");
  514. */
  515.  
  516. cCamCryptVG_SetSeed(reader);
  517.  
  518. static const unsigned char insB4[5] = { 0xD0,0xB4,0x00,0x00,0x40 };
  519. unsigned char tbuff[64];
  520. cCamCryptVG_GetCamKey(reader,tbuff);
  521. l=do_cmd(reader,insB4,tbuff,NULL,cta_res);
  522. if(l<0 || !status_ok(cta_res)) {
  523. rdr_log(reader, "classD0 insB4: failed");
  524. return ERROR;
  525. }
  526.  
  527. static const unsigned char insBC[5] = { 0xD0,0xBC,0x00,0x00,0x00 };
  528. l=do_cmd(reader,insBC,NULL,NULL,cta_res);
  529. if(l<0) {
  530. rdr_log(reader, "classD0 insBC: failed");
  531. return ERROR;
  532. }
  533.  
  534. // Class D1/D3 instructions only work after this point
  535.  
  536. static const unsigned char insBE[5] = { 0xD3,0xBE,0x00,0x00,0x00 };
  537. l=do_cmd(reader,insBE,NULL,NULL,cta_res);
  538. if(l<0) {
  539. rdr_log(reader, "classD3 insBE: failed");
  540. return ERROR;
  541. }
  542.  
  543. static const unsigned char ins58a[5] = { 0xD1,0x58,0x00,0x00,0x00 };
  544. l=do_cmd(reader,ins58a,NULL,NULL,cta_res);
  545. if(l<0) {
  546. rdr_log(reader, "classD1 ins58: failed");
  547. return ERROR;
  548. }
  549.  
  550. static const unsigned char ins4Ca[5] = { 0xD1,0x4C,0x00,0x00,0x00 };
  551. l=do_cmd(reader,ins4Ca,payload4C,NULL,cta_res);
  552. if(l<0 || !status_ok(cta_res)) {
  553. rdr_log(reader, "classD1 ins4Ca: failed");
  554. return ERROR;
  555. }
  556.  
  557. if (reader->ins7E[0x1A])
  558. {
  559. static const uint8_t ins7E[5] = { 0xD1,0x7E,0x10,0x00,0x1A };
  560. l=do_cmd(reader,ins7E,reader->ins7E,NULL,cta_res);
  561. if(l<0 || !status_ok(cta_res)) {
  562. rdr_log(reader, "classD1 ins7E: failed");
  563. return ERROR;
  564. }
  565. }
  566.  
  567. if (reader->ins7E11[0x01]) {
  568. unsigned char ins742b[5] = { 0xD0,0x74,0x2b,0x00,0x00 };
  569.  
  570. l=read_cmd_len(reader,ins742b); //get command len for ins742b
  571.  
  572. if(l<2){
  573. rdr_log(reader, "No TA1 change for this card is possible by ins7E11");
  574. } else {
  575. ins742b[4]=l;
  576. bool ta1ok=0;
  577.  
  578. if(!write_cmd_vg(ins742b,NULL) || !status_ok(cta_res+ins742b[4])) { //get supported TA1 bytes
  579. rdr_log(reader, "classD0 ins742b: failed");
  580. return ERROR;
  581. } else {
  582. int32_t i;
  583.  
  584. for (i=2; i < l; i++) {
  585. if (cta_res[i]==reader->ins7E11[0x00]) {
  586. ta1ok=1;
  587. break;
  588. }
  589. }
  590. }
  591. if(ta1ok==0) {
  592. rdr_log(reader, "The value %02X of ins7E11 is not supported,try one between %02X and %02X",reader->ins7E11[0x00],cta_res[2],cta_res[ins742b[4]-1]);
  593. } else {
  594. static const uint8_t ins7E11[5] = { 0xD0,0x7E,0x11,0x00,0x01 };
  595.  
  596. reader->ins7e11_fast_reset = 0;
  597.  
  598. l=do_cmd(reader,ins7E11,reader->ins7E11,NULL,cta_res);
  599.  
  600. if(l<0 || !status_ok(cta_res)) {
  601. rdr_log(reader, "classD0 ins7E11: failed");
  602. return ERROR;
  603. }
  604. else {
  605. unsigned char TA1;
  606.  
  607. if (ATR_GetInterfaceByte (newatr, 1, ATR_INTERFACE_BYTE_TA, &TA1) == ATR_OK) {
  608. if (TA1 != reader->ins7E11[0x00]) {
  609. rdr_log(reader, "classD0 ins7E11: Scheduling card reset for TA1 change from %02X to %02X", TA1, reader->ins7E11[0x00]);
  610. reader->ins7e11_fast_reset = 1;
  611. #ifdef WITH_COOLAPI
  612. if (reader->typ == R_MOUSE || reader->typ == R_SC8in1 || reader->typ == R_SMART || reader->typ == R_INTERNAL) {
  613. #else
  614. if (reader->typ == R_MOUSE || reader->typ == R_SC8in1 || reader->typ == R_SMART) {
  615. #endif
  616. add_job(reader->client, ACTION_READER_RESET_FAST, NULL, 0);
  617. }
  618. else {
  619. add_job(reader->client, ACTION_READER_RESTART, NULL, 0);
  620. }
  621. return OK; // Skip the rest of the init since the card will be reset anyway
  622. }
  623. }
  624. }
  625. }
  626. }
  627. }
  628.  
  629. /* get parental lock settings */
  630. static const unsigned char ins74e[5] = {0xD0,0x74,0x0E,0x00,0x00};
  631. if(cmd_exists(reader,ins74e)) {
  632. l=do_cmd(reader,ins74e,NULL,NULL,cta_res);
  633. if (l<0 || !status_ok(cta_res+l)) {
  634. rdr_log(reader, "classD0 ins74e: failed to get parental lock settings");
  635. } else {
  636. char tmp[l>0?l*3:1];
  637. rdr_log(reader, "parental lock setting: %s",cs_hexdump(1, cta_res+2, l-2, tmp, sizeof(tmp)));
  638. }
  639. }
  640.  
  641. /* disable parental lock */
  642. static const uchar ins2e[5] = {0xD0, 0x2E, 0x00, 0x00, 0x04};
  643. static const uchar payload2e[4] = {0xFF, 0xFF, 0xFF, 0xFF};
  644. if(cfg.ulparent) {
  645. if(cmd_exists(reader,ins74e) && write_cmd_vg(ins2e,payload2e) && status_ok(cta_res+l)) {
  646. rdr_log(reader, "parental lock disabled");
  647. }else{
  648. rdr_log(reader, "cannot disable parental lock");
  649. }
  650. if(cmd_exists(reader,ins74e)) {
  651. l=do_cmd(reader,ins74e,NULL,NULL,cta_res);
  652. if (l<0 || !status_ok(cta_res+l)) {
  653. rdr_log(reader, "classD0 ins74e: failed to get parental lock settings");
  654. } else {
  655. char tmp[l>0?l*3:1];
  656. rdr_log(reader, "parental lock setting after disabling: %s",cs_hexdump(1, cta_res+2, l-2, tmp, sizeof(tmp)));
  657. }
  658. }
  659. }
  660.  
  661. // fix for 09ac cards
  662. unsigned char dimeno_magic[0x10]={0xF9,0xFB,0xCD,0x5A,0x76,0xB5,0xC4,0x5C,0xC8,0x2E,0x1D,0xE1,0xCC,0x5B,0x6B,0x02};
  663. int32_t a;
  664. for(a=0; a<4; a++)
  665. dimeno_magic[a]=dimeno_magic[a]^boxID[a];
  666. AES_set_decrypt_key(dimeno_magic,128,&(csystem_data->astrokey));
  667.  
  668. rdr_log(reader, "type: %s, caid: %04X",
  669. csystem_data->card_desc,
  670. reader->caid);
  671. rdr_log_sensitive(reader, "serial: {%02X%02X%02X%02X}, BoxID: {%02X%02X%02X%02X}, baseyear: %i",
  672. reader->hexserial[2],reader->hexserial[3],reader->hexserial[4],reader->hexserial[5],
  673. boxID[0],boxID[1],boxID[2],boxID[3],
  674. csystem_data->card_baseyear);
  675. rdr_log(reader, "ready for requests");
  676.  
  677. return OK;
  678. }
  679.  
  680. static int32_t videoguard2_do_ecm(struct s_reader * reader, const ECM_REQUEST *er, struct s_ecm_answer *ea)
  681. {
  682. unsigned char cta_res[CTA_RES_LEN];
  683. static const char valid_ecm[] = { 0x00, 0x00, 0x01 };
  684. unsigned char ins40[5] = { 0xD1,0x40,0x00,0x80,0xFF };
  685. static const unsigned char ins54[5] = { 0xD3,0x54,0x00,0x00,0x00};
  686. int32_t posECMpart2=er->ecm[6]+7;
  687. int32_t lenECMpart2=er->ecm[posECMpart2]+1;
  688. unsigned char tbuff[264], rbuff[264];
  689. tbuff[0]=0;
  690.  
  691. memset(ea->cw+0,0,16); //set cw to 0 so client will know it is invalid unless it is overwritten with a valid cw
  692.  
  693. if (memcmp(&(er->ecm[3]), valid_ecm, sizeof(valid_ecm) != 0))
  694. {
  695. rdr_log(reader, "Not a valid ecm");
  696. return ERROR;
  697. }
  698.  
  699. memcpy(tbuff+1,er->ecm+posECMpart2+1,lenECMpart2-1);
  700.  
  701. /*
  702. //log parental lock byte
  703. int32_t j;
  704. for (j = posECMpart2+1; j < lenECMpart2+posECMpart2+1-4; j++){
  705. if (er->ecm[j] == 0x02 && er->ecm[j+3] == 0x02) {
  706. rdr_log(reader, "channel parental lock mask: %02X%02X, channel parental lock byte: %02X",er->ecm[j+1],er->ecm[j+2],er->ecm[j+4]);
  707. break;
  708. }
  709. }
  710.  
  711. //log tiers
  712. int32_t k;
  713. char tiername[83];
  714. for (k = posECMpart2+1; k < lenECMpart2+posECMpart2+1-4; k++){
  715. if (er->ecm[k] == 0x03 && er->ecm[k+3] == 0x80) {
  716. uint16_t vtier_id = (er->ecm[k+1] << 8) | er->ecm[k+2];
  717. get_tiername(vtier_id, reader->caid, tiername);
  718. rdr_log(reader, "valid tier: %04x %s",vtier_id, tiername);
  719. }
  720. }
  721. */
  722.  
  723. int32_t new_len = lenECMpart2;
  724. if (reader->fix_9993 && reader->caid == 0x919 && tbuff[1] == 0x7F)
  725. {
  726. tbuff[1] = 0x47; tbuff[2] = 0x08;
  727. memmove(tbuff+11, tbuff+13, new_len-11);
  728. new_len -= 2;
  729. }
  730. ins40[4]=new_len;
  731. int32_t l;
  732.  
  733. if(reader->caid == 0x9CD){ /* By Viger_uno Patch 23 */
  734. if (tbuff[1] != 0x7D){
  735. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *7D* <----------");
  736. return ERROR;
  737. }
  738. if (tbuff[2] != 0x09){
  739. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *09* <----------");
  740. return ERROR;
  741. }
  742. if (tbuff[3] != 0x44){
  743. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *44* <----------");
  744. return ERROR;
  745. }
  746. if (tbuff[12] != 0x90){
  747. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *90* <----------");
  748. return ERROR;
  749. }
  750. if (tbuff[13] != 0x8A && tbuff[13] != 0x8E){
  751. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *8A 8E* <----------");
  752. return ERROR;
  753. }
  754. if (tbuff[14] != 0xC0){
  755. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *C0* <----------");
  756. return ERROR;
  757. }
  758. if (tbuff[15] != 0x02){
  759. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *02* <----------");
  760. return ERROR;
  761. }
  762. }
  763.  
  764. if(reader->caid == 0x93B){
  765. if (tbuff[1] != 0x7E){
  766. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *7E* <----------");
  767. return ERROR;
  768. }
  769. if (tbuff[2] != 0x0A){
  770. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *0A* <----------");
  771. return ERROR;
  772. }
  773. if (tbuff[11] != 0x00 && tbuff[12] != 0x00){
  774. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *00 00* <----------");
  775. return ERROR;
  776. }
  777. if (tbuff[13] != 0x90){
  778. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *90* <----------");
  779. return ERROR;
  780. }
  781. if (tbuff[14] != 0x89 && tbuff[14] != 0x8D){
  782. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *89 8D* <----------");
  783. return ERROR;
  784. }
  785. if (tbuff[15] != 0xC0){
  786. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *C0* <----------");
  787. return ERROR;
  788. }
  789. if (tbuff[16] != 0x02){
  790. rdr_log(reader, "----------> SKIP INS40 NANO DIVERSO DA *02* <----------");
  791. return ERROR;
  792. }
  793. }
  794.  
  795. l = do_cmd(reader,ins40,tbuff,NULL,cta_res);
  796. if(l<0 || !status_ok(cta_res)) {
  797. rdr_log(reader, "classD0 ins40: (%d) status not ok %02x %02x",l,cta_res[0],cta_res[1]);
  798. rdr_log(reader, "The card is not answering correctly! Restarting reader for safety");
  799. add_job(reader->client, ACTION_READER_RESTART, NULL, 0);
  800. return ERROR;
  801. } else {
  802. l = do_cmd(reader,ins54,NULL,rbuff,cta_res);
  803. if(l<0 || !status_ok(cta_res+l)) {
  804. rdr_log(reader, "classD3 ins54: (%d) status not ok %02x %02x",l,cta_res[0],cta_res[1]);
  805. rdr_log(reader, "The card is not answering correctly! Restarting reader for safety");
  806. add_job(reader->client, ACTION_READER_RESTART, NULL, 0);
  807. return ERROR;
  808. } else {
  809.  
  810. // Log decrypted INS54
  811. rdr_ddump_mask(reader, D_READER, rbuff, 5, "INS54:");
  812. rdr_ddump_mask(reader, D_READER, rbuff + 5, rbuff[4], "Decrypted payload");
  813.  
  814. if (!cw_is_valid(rbuff+5)){ //sky cards report 90 00 = ok but send cw = 00 when channel not subscribed
  815. rdr_log(reader, "classD3 ins54: status 90 00 = ok but cw=00 -> channel not subscribed " );
  816. return ERROR;
  817. }
  818.  
  819. // copy cw1 in place
  820. memcpy(ea->cw+0,rbuff+5,8);
  821.  
  822. // process cw2
  823. unsigned char *payload = rbuff+5;
  824. int32_t payloadLen = rbuff[4];
  825. int32_t ind=8+6; // +8 for CW1, +6 for counter(?)
  826.  
  827. while(ind<payloadLen) {
  828. switch(payload[ind])
  829. {
  830. case 0x25: // CW2
  831. //cs_dump (payload + ind, payload[ind+1]+2, "INS54 - CW2");
  832. memcpy(ea->cw+8,&payload[ind+3],8);
  833. ind += payload[ind+1]+2;
  834. break;
  835.  
  836. default:
  837. //cs_dump (payload + ind, payload[ind+1]+2, "INS54");
  838. ind += payload[ind+1]+2;
  839. break;
  840. }
  841. }
  842.  
  843. if (new_len != lenECMpart2)
  844. {
  845. memcpy(ea->cw, ea->cw+8, 8);
  846. memset(ea->cw+8, 0, 8);
  847. }
  848. // fix for 09ac cards
  849. dimeno_PostProcess_Decrypt(reader, rbuff, ea->cw);
  850.  
  851. //test for postprocessing marker
  852. int32_t posB0 = -1;
  853. int32_t i;
  854. for (i = 6; i < posECMpart2; i++){
  855. if (er->ecm[i-3] == 0x80 && er->ecm[i] == 0xB0 && ((er->ecm[i+1] == 0x01) ||(er->ecm[i+1] == 0x02)||(er->ecm[i+1] == 0x03) ) ) {
  856. posB0 = i;
  857. break;
  858. }
  859. }
  860. if (posB0 != -1) {
  861. do_post_dw_hash(reader, ea->cw+0, &er->ecm[posB0-2]);
  862. do_post_dw_hash(reader, ea->cw+8, &er->ecm[posB0-2]);
  863. }
  864.  
  865. if (reader->caid == 0x0907) { //quickfix: cw2 is not a valid cw, something went wrong before
  866. memset(ea->cw+8, 0, 8);
  867. if (er->ecm[0] & 1) {
  868. memcpy(ea->cw+8, ea->cw, 8);
  869. memset(ea->cw, 0, 8);
  870. }
  871. } else {
  872. if(er->ecm[0]&1) {
  873. unsigned char tmpcw[8];
  874. memcpy(tmpcw,ea->cw+8,8);
  875. memcpy(ea->cw+8,ea->cw+0,8);
  876. memcpy(ea->cw+0,tmpcw,8);
  877. }
  878. }
  879.  
  880. return OK;
  881. }
  882. }
  883. }
  884.  
  885. static int32_t videoguard2_do_emm(struct s_reader * reader, EMM_PACKET *ep)
  886. {
  887. return videoguard_do_emm(reader, ep, 0xD1, vg2_read_tiers, do_cmd);
  888. }
  889.  
  890. static int32_t videoguard2_card_info(struct s_reader * reader)
  891. {
  892. /* info is displayed in init, or when processing info */
  893. struct videoguard_data *csystem_data = reader->csystem_data;
  894. rdr_log(reader, "card detected");
  895. rdr_log(reader, "type: %s", csystem_data->card_desc);
  896. if (reader->ins7e11_fast_reset != 1) {
  897. vg2_read_tiers(reader);
  898. }
  899. return OK;
  900. }
  901.  
  902. void reader_videoguard2(struct s_cardsystem *ph)
  903. {
  904. ph->do_emm=videoguard2_do_emm;
  905. ph->do_ecm=videoguard2_do_ecm;
  906. ph->card_info=videoguard2_card_info;
  907. ph->card_init=videoguard2_card_init;
  908. ph->get_emm_type=videoguard_get_emm_type;
  909. ph->get_emm_filter=videoguard_get_emm_filter;
  910. ph->caids[0]=0x09;
  911. ph->desc="videoguard2";
  912. }
  913. #endif
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930. DC004110 81 70 B4 00 00 01 18 C9 11 50 B1 04 51 00 00 81
  931. 2013/10/17 11:57:00 DC004110 21 84 01 00 01 01 02 FF FF 00 00 03 01 00 76 97
  932. 2013/10/17 11:57:00 DC004110 ####7D 09 44 F1 25 CE B4 EB 1A 43 5E 90 8A C0 02 11
  933. 2013/10/17 11:57:00 DC004110 55 89 B5 96 4B E4 BA FF 08 3D 79 59 CB D8 A1 14
  934. 2013/10/17 11:57:00 DC004110 12 74 42 68 C6 CE 08 C5 FD 79 B7 03 C9 CF 1E 5C
  935. 2013/10/17 11:57:00 DC004110 2A B5 79 4C 22 17 14 24 27 06 B0 07 A1 71 0E CB
  936. 2013/10/17 11:57:00 DC004110 C4 DF 38 F5 90 50 54 A0 92 FF A8 C9 77 63 10 10
  937. 2013/10/17 11:57:00 DC004110 87 42 84 33 B3 16 9B 85 C4 8B CE 20 6D 57 E2 2B
  938. 2013/10/17 11:57:00 DC004110 4B 47 CD E0 AB E0 8A 5A 17 27 29 1C D4 4E 23 90
  939. 2013/10/17 11:57:00 DC004110 B2 23 A7 D7 3F 97 C4 EE 1C EA B1 65 09 01 DF 31
  940. 2013/10/17 11:57:00 DC004110 A8 3B 7F 5B 44 E9 AD 42 25 E4 AC C4 74 E4 98 BE
  941. 2013/10/17 11:57:00 DC004110 87 39 3A A6 8B 34 E7
  942. 2013/10/17 11:57:00 DC004110 r skyit-cinema [videoguard2] write to cardreader
  943. 2013/10/17 11:57:00 DC004110 D1 40 00 80 98 00 7D 09 44 F1 25 CE B4 EB 1A 43
  944. 2013/10/17 11:57:00 DC004110 5E 90 8A C0 02 11 55 89 B5 96 4B E4 BA FF 08 3D
  945. 2013/10/17 11:57:00 DC004110 79 59 CB D8 A1 14 12 74 42 68 C6 CE 08 C5 FD 79
  946. 2013/10/17 11:57:00 DC004110 B7 03 C9 CF 1E 5C 2A B5 79 4C 22 17 14 24 27 06
  947. 2013/10/17 11:57:00 DC004110 B0 07 A1 71 0E CB C4 DF 38 F5 90 50 54 A0 92 FF
  948. 2013/10/17 11:57:00 DC004110 A8 C9 77 63 10 10 87 42 84 33 B3 16 9B 85 C4 8B
  949. 2013/10/17 11:57:00 DC004110 CE 20 6D 57 E2 2B 4B 47 CD E0 AB E0 8A 5A 17 27
  950. 2013/10/17 11:57:00 DC004110 29 1C D4 4E 23 90 B2 23 A7 D7 3F 97 C4 EE 1C EA
  951. 2013/10/17 11:57:00 DC004110 B1 65 09 01 DF 31 A8 3B 7F 5B 44 E9 AD 42 25 E4
  952. 2013/10/17 11:57:00 DC004110 AC C4 74 E4 98 BE 87 39 3A A6 8B 34 E7
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement