Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "b_cas_card.h"
- #include "b_cas_card_error_code.h"
- #include <stdlib.h>
- #include <string.h>
- #include "Global.h"
- #include "Decoder.h"
- #include "Keys.h"
- /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- inner structures
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
- typedef struct {
- long card;
- B_CAS_INIT_STATUS stat;
- } B_CAS_CARD_PRIVATE_DATA;
- /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- constant values
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
- static const uint8_t BCAS_SYSTEM_KEY[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
- static const uint8_t BCAS_INIT_CBC[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
- static const int64_t BCAS_CARD_ID = 0x0000000000;
- static const int32_t BCAS_CA_SYSTEM_ID = 0x0000;
- /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- function prottypes (interface method)
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
- static void release_b_cas_card(void *bcas);
- static int init_b_cas_card(void *bcas);
- static int get_init_status_b_cas_card(void *bcas, B_CAS_INIT_STATUS *stat);
- static int get_id_b_cas_card(void *bcas, B_CAS_ID *dst);
- static int get_pwr_on_ctrl_b_cas_card(void *bcas, B_CAS_PWR_ON_CTRL_INFO *dst);
- static int proc_ecm_b_cas_card(void *bcas, B_CAS_ECM_RESULT *dst, uint8_t *src, int len);
- static int proc_emm_b_cas_card(void *bcas, uint8_t *src, int len);
- /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- global function implementation
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
- B_CAS_CARD *create_b_cas_card()
- {
- int n;
- B_CAS_CARD *r;
- B_CAS_CARD_PRIVATE_DATA *prv;
- n = sizeof(B_CAS_CARD) + sizeof(B_CAS_CARD_PRIVATE_DATA);
- prv = (B_CAS_CARD_PRIVATE_DATA *)calloc(1, n);
- if(prv == NULL){
- return NULL;
- }
- r = (B_CAS_CARD *)(prv+1);
- r->private_data = prv;
- r->release = release_b_cas_card;
- r->init = init_b_cas_card;
- r->get_init_status = get_init_status_b_cas_card;
- r->get_id = get_id_b_cas_card;
- r->get_pwr_on_ctrl = get_pwr_on_ctrl_b_cas_card;
- r->proc_ecm = proc_ecm_b_cas_card;
- r->proc_emm = proc_emm_b_cas_card;
- return r;
- }
- /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- function prottypes (private method)
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
- static B_CAS_CARD_PRIVATE_DATA *private_data(void *bcas);
- static void teardown(B_CAS_CARD_PRIVATE_DATA *prv);
- /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- interface method implementation
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
- static void release_b_cas_card(void *bcas)
- {
- B_CAS_CARD_PRIVATE_DATA *prv;
- prv = private_data(bcas);
- if(prv == NULL){
- /* do nothing */
- return;
- }
- teardown(prv);
- free(prv);
- }
- static int init_b_cas_card(void *bcas)
- {
- B_CAS_CARD_PRIVATE_DATA *prv;
- prv = private_data(bcas);
- if(prv == NULL){
- return B_CAS_CARD_ERROR_INVALID_PARAMETER;
- }
- teardown(prv);
- prv->card = 1;
- memcpy(prv->stat.system_key, BCAS_SYSTEM_KEY, 32);
- memcpy(prv->stat.init_cbc, BCAS_INIT_CBC, 8);
- prv->stat.bcas_card_id = BCAS_CARD_ID;
- prv->stat.card_status = 0;
- prv->stat.ca_system_id = BCAS_CA_SYSTEM_ID;
- BCAS::Keys::RegisterAll();
- return 0;
- }
- static int get_init_status_b_cas_card(void *bcas, B_CAS_INIT_STATUS *stat)
- {
- B_CAS_CARD_PRIVATE_DATA *prv;
- prv = private_data(bcas);
- if( (prv == NULL) || (stat == NULL) ){
- return B_CAS_CARD_ERROR_INVALID_PARAMETER;
- }
- if(prv->card == 0){
- return B_CAS_CARD_ERROR_NOT_INITIALIZED;
- }
- memcpy(stat, &(prv->stat), sizeof(B_CAS_INIT_STATUS));
- return 0;
- }
- static int get_id_b_cas_card(void *bcas, B_CAS_ID *dst)
- {
- B_CAS_CARD_PRIVATE_DATA *prv;
- prv = private_data(bcas);
- if( (prv == NULL) || (dst == NULL) ){
- return B_CAS_CARD_ERROR_INVALID_PARAMETER;
- }
- if(prv->card == 0){
- return B_CAS_CARD_ERROR_NOT_INITIALIZED;
- }
- memset(dst, 0, sizeof(B_CAS_ID));
- return 0;
- }
- static int get_pwr_on_ctrl_b_cas_card(void *bcas, B_CAS_PWR_ON_CTRL_INFO *dst)
- {
- B_CAS_CARD_PRIVATE_DATA *prv;
- prv = private_data(bcas);
- if( (prv == NULL) || (dst == NULL) ){
- return B_CAS_CARD_ERROR_INVALID_PARAMETER;
- }
- if(prv->card == 0){
- return B_CAS_CARD_ERROR_NOT_INITIALIZED;
- }
- memset(dst, 0, sizeof(B_CAS_PWR_ON_CTRL_INFO));
- return 0;
- }
- static int proc_ecm_b_cas_card(void *bcas, B_CAS_ECM_RESULT *dst, uint8_t *src, int len)
- {
- B_CAS_CARD_PRIVATE_DATA *prv;
- prv = private_data(bcas);
- if( (prv == NULL) ||
- (dst == NULL) ||
- (src == NULL) ||
- (len < 1) ){
- return B_CAS_CARD_ERROR_INVALID_PARAMETER;
- }
- if(prv->card == 0){
- return B_CAS_CARD_ERROR_NOT_INITIALIZED;
- }
- if (BCAS::Decoder::DecodeECM(src, len, dst->scramble_key, NULL) < 0) {
- return B_CAS_CARD_ERROR_TRANSMIT_FAILED;
- }
- dst->return_code = 0x0800;
- return 0;
- }
- static int proc_emm_b_cas_card(void *bcas, uint8_t *src, int len)
- {
- B_CAS_CARD_PRIVATE_DATA *prv;
- prv = private_data(bcas);
- if( (prv == NULL) ||
- (src == NULL) ||
- (len < 1) ){
- return B_CAS_CARD_ERROR_INVALID_PARAMETER;
- }
- if(prv->card == 0){
- return B_CAS_CARD_ERROR_NOT_INITIALIZED;
- }
- return 0;
- }
- /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- private method implementation
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
- static B_CAS_CARD_PRIVATE_DATA *private_data(void *bcas)
- {
- B_CAS_CARD_PRIVATE_DATA *r;
- B_CAS_CARD *p;
- p = (B_CAS_CARD *)bcas;
- if(p == NULL){
- return NULL;
- }
- r = (B_CAS_CARD_PRIVATE_DATA *)(p->private_data);
- if( ((void *)(r+1)) != ((void *)p) ){
- return NULL;
- }
- return r;
- }
- static void teardown(B_CAS_CARD_PRIVATE_DATA *prv)
- {
- if(prv->card != 0){
- prv->card = 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment