/* CMD : POWER RESET */ static int card_power_rst(int CARD) { int ret; struct card_send_buf *send_buf; struct card_res_buf *res_buf; send_buf = prepare_cmd(CARD, CARD_RST_CMD, 0, NULL); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; if (res_buf->res_buf.data[0] != 0x3B && res_buf->res_buf.data[1] != 0x7A) return -ETAX_BAD_SW; return SUCCESS; }
/* * CMD : ISSUE INVOICE * -- This is a specical command for fiscal card */ static int card_issue_invoice(struct issue_invoice *info, struct issue_invoice_res * res) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0xC0; cmd_buf.INS = 0xF2; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = 0x2C; memcpy(cmd_buf.cond_body + 1, (uchar *)info, sizeof(*info)); cmd_buf.cond_body[0x2C + 1] = 0x08; cmd_size = 6 + sizeof(*info); send_buf = prepare_cmd(FISCAL_CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 61 6A 93 * SW2 08 82 03 */ if (res_buf->res_buf.sw1 != 0x61 && res_buf->res_buf.sw2 != 0x08) { if (res_buf->res_buf.sw1 == 0x6A && res_buf->res_buf.sw2 == 0x82) return -ETAX_NO_CARD_FILE; if (res_buf->res_buf.sw1 == 0x93 && res_buf->res_buf.sw2 == 0x03) return -ETAX_FC_PIN_LOCK; if (res_buf->res_buf.sw1 == 0x94 && res_buf->res_buf.sw2 == 0x01) return -ETAX_MON_OUT_RANG; return -ETAX_BAD_SW; } /* save respon data */ int i; for (i = 0; i < 8; i++) { res->half_top[i] = res_buf->res_buf.data[i]; // Be careful with this code } return SUCCESS; }
/* * CMD : READ_BINARY * Notice this: * -- Read Binnary in GB can select file by short file ID with P1 set as 0x8x; * but we were not going to support this function. * So, whenever you want to use this function, plz select the file you want * to read before invoke it. * */ static int card_read_binary(int CARD, int offset, int size, uchar *res) { int ret; int cmd_size; assert(res_buf != NULL); struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; /* We were not intend to support select file by short file ID */ /* reand current file */ cmd_buf.CLA = 0x00; cmd_buf.INS = 0xB0; offset &= 0xFFFF; cmd_buf.P1 = (uchar)(offset >> 8); cmd_buf.P2 = (uchar)offset; cmd_buf.cond_body[0] = (uchar)size; cmd_size = 5; send_buf = prepare_cmd(CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 90 * SW2 00 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) { if (res_buf->res_buf.sw1 == 0x6A && res_buf->res_buf.sw2 == 0x82) return -ETAX_NO_CARD_FILE; return -ETAX_BAD_SW; } /* copy data to recive buffer */ memcpy(res_buf, res_buf->res_buf.data, size); return SUCCESS; }
/* * CMD : TERMINAL REGISTER * -- This is a specical command for fiscal card */ static int card_terminal_register(struct register_info * info) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0xC0; cmd_buf.INS = 0xF1; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = 0x04; memcpy(cmd_buf.cond_body + 1, info->mac2, 4); cmd_buf.cond_body[5] = 0x08; cmd_size = 10; send_buf = prepare_cmd(FISCAL_CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 90 6A 93 * SW2 00 82 03 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) { if (res_buf->res_buf.sw1 == 0x6A && res_buf->res_buf.sw2 == 0x82) return -ETAX_NO_CARD_FILE; if (res_buf->res_buf.sw1 == 0x93 && res_buf->res_buf.sw2 == 0x03) return -ETAX_FC_PIN_LOCK; return -ETAX_BAD_SW; } /* Save user password*/ int i; for (i = 0; i < 8; i++) { info->pin[i] = res_buf->res_buf.data[i]; } return SUCCESS; }
F8RES_API __int get_res_int( const f8_uuid * id, const char * key, __int defvalue ) { char * buf; buf = get_res_buf(id, 0, key); if(!buf){ return defvalue; } return atoi(buf); }
/* * CMD : VERIFY_FISCAL_PIN * -- This is special command fur fiscal card */ static int card_verify_fiscal_pin(uchar *old_pin, uchar * new_pin) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0xC0; cmd_buf.INS = 0xF9; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = 0x08; memcpy(cmd_buf.cond_body + 1, old_pin, 8); cmd_buf.cond_body[0x08 + 1] = 0x8E; cmd_size = 6 + 0x08; send_buf = prepare_cmd(FISCAL_CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 90 69 * SW2 00 83 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) { if (res_buf->res_buf.sw1 == 0x69 && res_buf->res_buf.sw2 == 0x83) return -ETAX_FC_PIN_LOCK; else return -ETAX_BAD_SW; } /* save new pin*/ int i; for (i = 0; i < 8; i++) new_pin[i] = res_buf->res_buf.data[i]; return SUCCESS; }
/* * CMD : GET_REGISTER_NB * -- This is a specical command for fiscal card */ static int card_get_register_nb(struct register_info * info) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0xC0; cmd_buf.INS = 0xF0; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = 0x10; cmd_size = 5; send_buf = prepare_cmd(FISCAL_CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 90 6A 93 * SW2 00 82 03 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) { if (res_buf->res_buf.sw1 == 0x6A && res_buf->res_buf.sw2 == 0x82) return -ETAX_NO_CARD_FILE; if (res_buf->res_buf.sw1 == 0x93 && res_buf->res_buf.sw2 == 0x03) return -ETAX_FC_PIN_LOCK; return -ETAX_BAD_SW; } memcpy(info->random, res_buf->res_buf.data, 4); memcpy(info->card_nb, res_buf->res_buf.data + 4, 8); memcpy(info->mac1, res_buf->res_buf.data + 12, 4); return SUCCESS; }
/* CMD : SELECT FILE */ static int card_select_file_by_df(int CARD, const char *file_name) { int ret; int cmd_size; if (!file_name) return -ETAX_WR_FILENAME; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0x00; cmd_buf.INS = 0xA4; cmd_buf.P1 = 0x04; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = strlen(file_name); memcpy(cmd_buf.cond_body + 1, file_name, cmd_buf.cond_body[0]); cmd_size = cmd_buf.cond_body[0] + 5; send_buf = prepare_cmd(CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 : 90 6A 6A 6A * SW2 : 00 81 82 86 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) { if (res_buf->res_buf.sw1 == 0x6A && res_buf->res_buf.sw2 == 0x81) return -ETAX_CARD_PIN_LOCK; if (res_buf->res_buf.sw1 == 0x6A && res_buf->res_buf.sw2 == 0x82) return -ETAX_NO_CARD_FILE; return -ETAX_BAD_SW; } return SUCCESS; }
F8RES_API char * get_res_buf_v( const f8_uuid * id, int *length, const char * keyFormat, ... ) { char key[128]; va_list args; va_start(args, keyFormat); _vsnprintf(key, sizeof(key), keyFormat, args); va_end(args); return get_res_buf(id, length, key); }
/* * CMD : REGISTER_SIGN * -- This is a special command for user card */ static int card_register_sign(struct register_info * info) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0xC0; cmd_buf.INS = 0xE4; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = 0x10; memcpy(cmd_buf.cond_body + 1, info->random, 4); memcpy(cmd_buf.cond_body + 5, info->card_nb, 8); memcpy(cmd_buf.cond_body + 13,info->mac1, 4); cmd_buf.cond_body[17] = 0x04; cmd_size = 18; send_buf = prepare_cmd(USER_CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 0x61 * SW2 0x04 */ if (res_buf->res_buf.sw1 != 0x61 && res_buf->res_buf.sw2 != 0x04) return -ETAX_BAD_SW; /* save mac2 */ info->mac2[0] = res_buf->res_buf.data[0]; info->mac2[1] = res_buf->res_buf.data[1]; info->mac2[2] = res_buf->res_buf.data[2]; info->mac2[3] = res_buf->res_buf.data[3]; return SUCCESS; }
/* * CMD : DISTRIBUTE_INVOICE_NB * -- This is a special command for user card */ static int card_distribute_invoice_nb(struct invoice_roll_info * info) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0xC0; cmd_buf.INS = 0xE9; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = 0x00; cmd_buf.cond_body[1] = 0x16; cmd_size = 6; send_buf = prepare_cmd(USER_CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 0x90 * SW2 0x00 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) { if (res_buf->res_buf.sw1 == 0x94 && res_buf->res_buf.sw2 != 0x01) return -ETAX_UC_EMPTY; return -ETAX_BAD_SW; } /* save invoice information */ int i; for (i = 0; i < sizeof(*info); i++) info->invoice_code[i] = res_buf->res_buf.data[i]; return SUCCESS; }
/* CMD : SELECT FILE */ static int card_select_file_by_id(int CARD, int file_id) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0x00; cmd_buf.INS = 0xA4; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = 2; cmd_buf.cond_body[1] = (uchar)(file_id >> 8); cmd_buf.cond_body[2] = (uchar)(file_id); cmd_size = cmd_buf.cond_body[0] + 5; send_buf = prepare_cmd(CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 : 90 6A 6A 6A * SW2 : 00 81 82 86 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) { if (res_buf->res_buf.sw1 == 0x6A && res_buf->res_buf.sw2 == 0x81) return -ETAX_CARD_PIN_LOCK; if (res_buf->res_buf.sw1 == 0x6A && res_buf->res_buf.sw2 == 0x82) return -ETAX_NO_CARD_FILE; return -ETAX_BAD_SW; } return SUCCESS; }
/* * CMD : READ_RECORD * Notice this: * -- Read Binnary in GB can select file by short file ID with P1 set as 0x8x; * but we were not going to support this function. * So, whenever you want to use this function, plz select the file you want * to read before invoke it. */ static int card_read_record(int CARD, uchar record_nb, int size, uchar *res) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0x00; cmd_buf.INS = 0xB2; cmd_buf.P1 = record_nb; cmd_buf.P2 = 0x04; cmd_buf.cond_body[0] = (uchar)size; cmd_size = 4 + size; send_buf = prepare_cmd(CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 90 * SW2 00 */ if (!(res_buf->res_buf.sw1 == 0x90 && res_buf->res_buf.sw2 == 0x00)) { if (res_buf->res_buf.sw1 == 0x6A && res_buf->res_buf.sw2 == 0x83) return -ETAX_NO_CARD_REC; return -ETAX_BAD_SW; } memcpy(res_buf, res_buf->res_buf.data, size); return SUCCESS; }
/* * CMD : GET CHALLENGE */ static int card_get_challenge(int CARD, uchar size, uchar *randon) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0x00; cmd_buf.INS = 0x84; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = size; cmd_size = 5; send_buf = prepare_cmd(CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 90 * SW2 00 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) return -ETAX_BAD_SW; int i; for (i = 0; i < size; i++) *randon++ = res_buf->res_buf.data[i]; return SUCCESS; }
static __bool _alloc_var_proc(ITreeNode * nd, __bool firstVisit, __uint context) { IBlk * b; ICBlk * cb; struct blk_var_t *v, var; int len, i; CRegRequirementList * req; req = (CRegRequirementList*)context; b = __dcast__(ITreeNode, IBlk, nd); if(b->h.magic != CBLK_MAGIC){ return __true; } // // // now unpack the variable definitions // // cb = __dcast__(IBlk, ICBlk, b); v = (struct blk_var_t*)get_res_buf(&b->h.uuid, &len, "variables"); if(!v){ return __true; } if(len % sizeof(struct blk_var_t)){ req->m_errcode = F8_INVALID_DATA; return __false; } len /= sizeof(struct blk_var_t); for(i=0; i<len; i++, v++){ var = *v; var.blk = b; var.comment = get_res_buf_v(&b->h.uuid, 0, "!v%d!comment", i); var.addr.section = MEM_SECTION_INVALID; create_f8_uuid(&var.uuid); if(!req->Alloc(&var)){ return __false; } } return __true; }
/* * CMD : DATA_COLLECT * -- This is a special command for user card */ static int card_data_collect(struct data_collect * info) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0xC0; cmd_buf.INS = 0xE6; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = 0xDC; memcpy(cmd_buf.cond_body + 1, (uchar *)info, sizeof(*info)); cmd_size = 5 + sizeof(*info); send_buf = prepare_cmd(USER_CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 0x90 * SW2 0x00 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) return -ETAX_BAD_SW; return SUCCESS; }
/* CMD : POWER ON */ static int card_power_on(int CARD) { int ret; struct card_send_buf *send_buf; struct card_res_buf *res_buf; struct fiscal_card * card; if (CARD == FISCAL_CARD) { card = get_fiscal_card(); } else if (CARD == USER_CARD) { card = (struct fiscal_card *)get_user_card(); } else { return -ETAX_BAD_CARD_TYPE; } if (card->power_mark == POSITIVE) return SUCCESS; send_buf = prepare_cmd(CARD, CARD_PWR_ON_CMD, 0, NULL); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* set card power mark */ card->power_mark = POSITIVE; return SUCCESS; }
/* * CMD : INPUT_INVOICE_NB * -- This is special command fur fiscal card */ static int card_input_invoice_nb(struct invoice_roll_info * info) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0xC0; cmd_buf.INS = 0xF7; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = 0x16; memcpy(cmd_buf.cond_body + 1, (uchar *)info, sizeof(*info)); cmd_size = 5 + sizeof(*info); send_buf = prepare_cmd(FISCAL_CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 90 * SW2 00 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) return -ETAX_BAD_SW; return SUCCESS; }
/* * CMD : EXTERNAL_AUTHENTICATION */ static int card_external_authentication(int CARD, uchar key_id, uchar *serect) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0x00; cmd_buf.INS = 0x82; cmd_buf.P1 = 0x00; cmd_buf.P2 = key_id; cmd_buf.cond_body[0] = 0x08; memcpy(cmd_buf.cond_body + 1, serect, 8); cmd_size = 5 + 0x08; send_buf = prepare_cmd(CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 90 * SW2 00 */ if (res_buf->res_buf.sw1 != 0x90 && res_buf->res_buf.sw2 != 0x00) return -ETAX_BAD_SW; return SUCCESS; }
/* * CMD : DATA_COLLECT_SIGN * fiscal card commond */ static int card_data_collect_sign(struct data_collect * info, struct daily_collect_res * res) { #if 0 int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0xC0; cmd_buf.INS = 0xFB; cmd_buf.P1 = 0x00; #ifdef CONFIG_CARD_DEBUG assert(info != NULL); assert(res != NULL); #else if (!sign) return -ETAX_NUL_SEND_BUF; if (!res) return -ETAX_NUL_RES_BUF; #endif /* CONFIG_CARD_DEBUG */ cmd_buf.P2 = 0x01; cmd_buf.cond_body[0] = 0x81; memcpy(cmd_buf.cond_body + 1, sign, 128 + 1); cmd_buf.cond_body[0x81 + 1] = 0x81; cmd_size = 6 + 128 + 1; send_buf = prepare_cmd(FISCAL_CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 61 * SW2 81 */ if (res_buf->res_buf.sw1 != 0x61 && res_buf->res_buf.sw2 != 0x81) return -ETAX_BAD_SW; /*check xor */ uchar xor_value = 0; int i; for (i = 0; i < 0x81 - 1; i++) { xor_value ^= res_buf->res_buf.data[i]; } if (xor_value != res_buf->res_buf.data[i]) return -ETAX_BAD_XOR; /* save respon data */ for (i = 0; i < 0x81; i++) { res->sign[i] = res_buf->res_buf.data[i]; // Be careful with this code } #endif return SUCCESS; }
F8RES_API const char * get_res_name( const f8_uuid * id ) { return get_res_buf(id, 0, "name"); }
static void dumpCblk(IBlk * b, __bool firstVisit, FILE * of) { const char * name; char path[F8_MAX_PATH]; char buf[1024]; char idName[128]; struct blk_ent_t be; if(firstVisit){ name = IBlk_name(b); IBlk_path_by_blk(parent_blk(b), path, sizeof(path)); if(parent_blk(b) && !(parent_blk(b)->h.flags & BLK_F_READONLY)){ if(b->h.flags & BLK_F_READONLY){ if(blklib_query(&b->h.uuid, &be)){ sprintf(buf, "mount path=\"%s\" type=\"%s.%s\" name=\"%s\"", path, be.dir, be.name, name); }else{ f8_uuid_to_string(&b->h.uuid, idName, sizeof(idName)); sprintf(buf, "mount path=\"%s\" id=%s name=\"%s\"", path, idName, name); } if(of==stdout) utils_trace("%s\n",buf); else fprintf(of, "%s\n", buf); return; }else{ sprintf(buf, "mount path=\"%s\" file=blank.blk name=\"%s\" rw", path, name); } if (of==stdout) utils_trace("%s\n",buf); else fprintf(of, "%s\n", buf); IBlk_path_by_blk(b, path, sizeof(path)); sprintf(buf, "place block \"%s\" (%d,%d)", path, get_res_int(&b->uuid, "x", 0), get_res_int(&b->uuid, "y", 0)); if(of==stdout) utils_trace("%s\n",buf); else fprintf(of, "%s\n", buf); } enum_variables(b, defineVariable, (__uint)of); }else{ /* dump links positions/export pins */ if(b->h.flags & BLK_F_READONLY){ return; } ICBlk * cb = __dcast__(IBlk, ICBlk, b); struct cblk_link_t * l; for(l=ICBlk_first_link(cb); l; l=ICBlk_next_link(l)){ char p1[F8_MAX_PATH]; char p2[F8_MAX_PATH]; IBlk_path_by_pin(l->s.pin, p1, sizeof(p1)); IBlk_path_by_pin(l->t.pin, p2, sizeof(p2)); sprintf(buf, "link \"%s\" \"%s\"", p1, p2); if(of==stdout) utils_trace("%s\n",buf); else fprintf(of, "%s\n", buf); TLinkMetrics *m; m = (TLinkMetrics *)get_res_buf(&l->uuid, 0, "metrics"); if(m){ char *p; p = buf; p += sprintf(p, "place link \"%s\" %d ", p2, m->count); int i; for(i=0; i<m->count; i++){ p += sprintf(p, "(%d,%d) ", m->coord[i].x, m->coord[i].y); } if(of==stdout) utils_trace("%s\n",buf); else fprintf(of, "%s\n", buf); } } } }
/* * CMD : DECLARE_DUTY * -- This is special command fur fiscal card */ static int card_declare_duty(struct declare_duty * info, struct declare_res * res) { int ret; int cmd_size; struct apdu_cmd_send cmd_buf; struct card_send_buf *send_buf; struct card_res_buf *res_buf; cmd_buf.CLA = 0xC0; cmd_buf.INS = 0xF4; cmd_buf.P1 = 0x00; cmd_buf.P2 = 0x00; cmd_buf.cond_body[0] = 0x47; memcpy(cmd_buf.cond_body + 1, (uchar *)info, sizeof(*info)); cmd_buf.cond_body[0x47 + 1] = 0x8E; cmd_size = 6 + sizeof(*info); send_buf = prepare_cmd(FISCAL_CARD, CARD_OS_CMD, cmd_size, &cmd_buf); if (send_buf == NULL) return -ETAX_NUL_SEND_BUF; ret = card_send_cmd(send_buf); if (ret < 0) return ret; res_buf = get_res_buf(); ret = card_get_res(res_buf); if (ret < 0) return ret; /* * SW1 61 * SW2 8E */ if (res_buf->res_buf.sw1 != 0x61 && res_buf->res_buf.sw2 != 0x8E) { if (res_buf->res_buf.sw1 == 0x6A && res_buf->res_buf.sw2 == 0x82) return -ETAX_NO_CARD_FILE; if (res_buf->res_buf.sw1 == 0x93 && res_buf->res_buf.sw2 == 0x03) return -ETAX_FC_PIN_LOCK; return -ETAX_BAD_SW; } /*check xor */ uchar xor_value = 0; int i; for (i = 0; i < 0x8E - 1; i++) { xor_value ^= res_buf->res_buf.data[i]; } if (xor_value != res_buf->res_buf.data[i]) return -ETAX_BAD_XOR; /* save respon data */ for (i = 0; i < 0x8E; i++) { res->total_valid[i] = res_buf->res_buf.data[i]; // Be careful with this code } return SUCCESS; }