Esempio n. 1
0
/* 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;
}
Esempio n. 2
0
/*
 * 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;
}
Esempio n. 3
0
/*
 * 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;
}
Esempio n. 4
0
/*
 * 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;
}
Esempio n. 5
0
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);
}
Esempio n. 6
0
/*
 * 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;
}
Esempio n. 7
0
/*
 * 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;
}
Esempio n. 8
0
/* 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;
}
Esempio n. 9
0
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);
}
Esempio n. 10
0
/*
 * 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;
}
Esempio n. 11
0
/*
 * 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;
}
Esempio n. 12
0
/* 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;
}
Esempio n. 13
0
/*
 * 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;
}
Esempio n. 14
0
/*
 * 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;
}
Esempio n. 15
0
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;
}
Esempio n. 16
0
/*
 * 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;
}
Esempio n. 17
0
/* 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;
}
Esempio n. 18
0
/*
 * 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; 
}
Esempio n. 19
0
/*
 * 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;
}
Esempio n. 20
0
/*
 * 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; 
}
Esempio n. 21
0
F8RES_API const char * get_res_name(
	const f8_uuid * id
	)
{
	return get_res_buf(id, 0, "name");
}
Esempio n. 22
0
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);
			}
		}
	}
}
Esempio n. 23
0
/*
 * 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; 
}