Guest User

b_cas_card.c

a guest
May 25th, 2012
4,431
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.21 KB | None | 0 0
  1. #include "b_cas_card.h"
  2. #include "b_cas_card_error_code.h"
  3.  
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #include "Global.h"
  8. #include "Decoder.h"
  9. #include "Keys.h"
  10.  
  11. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  12.  inner structures
  13.  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  14. typedef struct {
  15.    
  16.     long               card;
  17.  
  18.     B_CAS_INIT_STATUS  stat;
  19.    
  20. } B_CAS_CARD_PRIVATE_DATA;
  21.  
  22. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  23.  constant values
  24.  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  25. static const uint8_t BCAS_SYSTEM_KEY[] = {
  26.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  27.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  28.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  29.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  30. };
  31.  
  32. static const uint8_t BCAS_INIT_CBC[] = {
  33.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  34. };
  35.  
  36. static const int64_t BCAS_CARD_ID = 0x0000000000;
  37.  
  38. static const int32_t BCAS_CA_SYSTEM_ID = 0x0000;
  39.  
  40. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  41.  function prottypes (interface method)
  42.  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  43. static void release_b_cas_card(void *bcas);
  44. static int init_b_cas_card(void *bcas);
  45. static int get_init_status_b_cas_card(void *bcas, B_CAS_INIT_STATUS *stat);
  46. static int get_id_b_cas_card(void *bcas, B_CAS_ID *dst);
  47. static int get_pwr_on_ctrl_b_cas_card(void *bcas, B_CAS_PWR_ON_CTRL_INFO *dst);
  48. static int proc_ecm_b_cas_card(void *bcas, B_CAS_ECM_RESULT *dst, uint8_t *src, int len);
  49. static int proc_emm_b_cas_card(void *bcas, uint8_t *src, int len);
  50.  
  51. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  52.  global function implementation
  53.  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  54. B_CAS_CARD *create_b_cas_card()
  55. {
  56.     int n;
  57.    
  58.     B_CAS_CARD *r;
  59.     B_CAS_CARD_PRIVATE_DATA *prv;
  60.  
  61.     n = sizeof(B_CAS_CARD) + sizeof(B_CAS_CARD_PRIVATE_DATA);
  62.     prv = (B_CAS_CARD_PRIVATE_DATA *)calloc(1, n);
  63.     if(prv == NULL){
  64.         return NULL;
  65.     }
  66.  
  67.     r = (B_CAS_CARD *)(prv+1);
  68.  
  69.     r->private_data = prv;
  70.  
  71.     r->release = release_b_cas_card;
  72.     r->init = init_b_cas_card;
  73.     r->get_init_status = get_init_status_b_cas_card;
  74.     r->get_id = get_id_b_cas_card;
  75.     r->get_pwr_on_ctrl = get_pwr_on_ctrl_b_cas_card;
  76.     r->proc_ecm = proc_ecm_b_cas_card;
  77.     r->proc_emm = proc_emm_b_cas_card;
  78.  
  79.     return r;
  80. }
  81.  
  82. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  83.  function prottypes (private method)
  84.  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  85. static B_CAS_CARD_PRIVATE_DATA *private_data(void *bcas);
  86. static void teardown(B_CAS_CARD_PRIVATE_DATA *prv);
  87.  
  88. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  89.  interface method implementation
  90.  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  91. static void release_b_cas_card(void *bcas)
  92. {
  93.     B_CAS_CARD_PRIVATE_DATA *prv;
  94.  
  95.     prv = private_data(bcas);
  96.     if(prv == NULL){
  97.         /* do nothing */
  98.         return;
  99.     }
  100.  
  101.     teardown(prv);
  102.     free(prv);
  103. }
  104.  
  105. static int init_b_cas_card(void *bcas)
  106. {
  107.     B_CAS_CARD_PRIVATE_DATA *prv;
  108.  
  109.     prv = private_data(bcas);
  110.     if(prv == NULL){
  111.         return B_CAS_CARD_ERROR_INVALID_PARAMETER;
  112.     }
  113.  
  114.     teardown(prv);
  115.  
  116.     prv->card = 1;
  117.    
  118.     memcpy(prv->stat.system_key, BCAS_SYSTEM_KEY, 32);
  119.     memcpy(prv->stat.init_cbc, BCAS_INIT_CBC, 8);
  120.     prv->stat.bcas_card_id = BCAS_CARD_ID;
  121.     prv->stat.card_status = 0;
  122.     prv->stat.ca_system_id = BCAS_CA_SYSTEM_ID;
  123.  
  124.     BCAS::Keys::RegisterAll();
  125.  
  126.     return 0;
  127. }
  128.  
  129. static int get_init_status_b_cas_card(void *bcas, B_CAS_INIT_STATUS *stat)
  130. {
  131.     B_CAS_CARD_PRIVATE_DATA *prv;
  132.  
  133.     prv = private_data(bcas);
  134.     if( (prv == NULL) || (stat == NULL) ){
  135.         return B_CAS_CARD_ERROR_INVALID_PARAMETER;
  136.     }
  137.  
  138.     if(prv->card == 0){
  139.         return B_CAS_CARD_ERROR_NOT_INITIALIZED;
  140.     }
  141.  
  142.     memcpy(stat, &(prv->stat), sizeof(B_CAS_INIT_STATUS));
  143.  
  144.     return 0;
  145. }
  146.  
  147. static int get_id_b_cas_card(void *bcas, B_CAS_ID *dst)
  148. {
  149.     B_CAS_CARD_PRIVATE_DATA *prv;
  150.  
  151.     prv = private_data(bcas);
  152.     if( (prv == NULL) || (dst == NULL) ){
  153.         return B_CAS_CARD_ERROR_INVALID_PARAMETER;
  154.     }
  155.  
  156.     if(prv->card == 0){
  157.         return B_CAS_CARD_ERROR_NOT_INITIALIZED;
  158.     }
  159.  
  160.     memset(dst, 0, sizeof(B_CAS_ID));
  161.  
  162.     return 0;
  163. }
  164.  
  165. static int get_pwr_on_ctrl_b_cas_card(void *bcas, B_CAS_PWR_ON_CTRL_INFO *dst)
  166. {
  167.     B_CAS_CARD_PRIVATE_DATA *prv;
  168.  
  169.     prv = private_data(bcas);
  170.     if( (prv == NULL) || (dst == NULL) ){
  171.         return B_CAS_CARD_ERROR_INVALID_PARAMETER;
  172.     }
  173.  
  174.     if(prv->card == 0){
  175.         return B_CAS_CARD_ERROR_NOT_INITIALIZED;
  176.     }
  177.  
  178.     memset(dst, 0, sizeof(B_CAS_PWR_ON_CTRL_INFO));
  179.  
  180.     return 0;
  181. }
  182.  
  183. static int proc_ecm_b_cas_card(void *bcas, B_CAS_ECM_RESULT *dst, uint8_t *src, int len)
  184. {
  185.     B_CAS_CARD_PRIVATE_DATA *prv;
  186.  
  187.     prv = private_data(bcas);
  188.     if( (prv == NULL) ||
  189.         (dst == NULL) ||
  190.         (src == NULL) ||
  191.         (len < 1) ){
  192.         return B_CAS_CARD_ERROR_INVALID_PARAMETER;
  193.     }
  194.  
  195.     if(prv->card == 0){
  196.         return B_CAS_CARD_ERROR_NOT_INITIALIZED;
  197.     }
  198.  
  199.     if (BCAS::Decoder::DecodeECM(src, len, dst->scramble_key, NULL) < 0) {
  200.         return B_CAS_CARD_ERROR_TRANSMIT_FAILED;
  201.     }
  202.     dst->return_code = 0x0800;
  203.  
  204.     return 0;
  205. }
  206.  
  207. static int proc_emm_b_cas_card(void *bcas, uint8_t *src, int len)
  208. {
  209.     B_CAS_CARD_PRIVATE_DATA *prv;
  210.  
  211.     prv = private_data(bcas);
  212.     if( (prv == NULL) ||
  213.         (src == NULL) ||
  214.         (len < 1) ){
  215.         return B_CAS_CARD_ERROR_INVALID_PARAMETER;
  216.     }
  217.  
  218.     if(prv->card == 0){
  219.         return B_CAS_CARD_ERROR_NOT_INITIALIZED;
  220.     }
  221.  
  222.     return 0;
  223. }
  224.  
  225. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  226.  private method implementation
  227.  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  228. static B_CAS_CARD_PRIVATE_DATA *private_data(void *bcas)
  229. {
  230.     B_CAS_CARD_PRIVATE_DATA *r;
  231.     B_CAS_CARD *p;
  232.  
  233.     p = (B_CAS_CARD *)bcas;
  234.     if(p == NULL){
  235.         return NULL;
  236.     }
  237.  
  238.     r = (B_CAS_CARD_PRIVATE_DATA *)(p->private_data);
  239.     if( ((void *)(r+1)) != ((void *)p) ){
  240.         return NULL;
  241.     }
  242.  
  243.     return r;
  244. }
  245.  
  246. static void teardown(B_CAS_CARD_PRIVATE_DATA *prv)
  247. {
  248.     if(prv->card != 0){
  249.         prv->card = 0;
  250.     }
  251. }
Advertisement
Add Comment
Please, Sign In to add comment