diff --git a/src/libopensc/card-esteid2018.c b/src/libopensc/card-esteid2018.c index 9de32e8a..21618b75 100644 --- a/src/libopensc/card-esteid2018.c +++ b/src/libopensc/card-esteid2018.c @@ -170,11 +170,11 @@ static int esteid_set_security_env(sc_card_t *card, const sc_security_env_t *env sc_log(card->ctx, "algo: %d operation: %d keyref: %d", env->algorithm, env->operation, env->key_ref[0]); if (env->algorithm == SC_ALGORITHM_EC && env->operation == SC_SEC_OPERATION_SIGN && env->key_ref[0] == 1) { - sc_format_apdu_ex(card, &apdu, 0x22, 0x41, 0xA4, cse_crt_aut, sizeof(cse_crt_aut), NULL, 0); + sc_format_apdu_ex(&apdu, 0x00, 0x22, 0x41, 0xA4, cse_crt_aut, sizeof(cse_crt_aut), NULL, 0); } else if (env->algorithm == SC_ALGORITHM_EC && env->operation == SC_SEC_OPERATION_SIGN && env->key_ref[0] == 2) { - sc_format_apdu_ex(card, &apdu, 0x22, 0x41, 0xB6, cse_crt_sig, sizeof(cse_crt_sig), NULL, 0); + sc_format_apdu_ex(&apdu, 0x00, 0x22, 0x41, 0xB6, cse_crt_sig, sizeof(cse_crt_sig), NULL, 0); } else if (env->algorithm == SC_ALGORITHM_EC && env->operation == SC_SEC_OPERATION_DERIVE && env->key_ref[0] == 1) { - sc_format_apdu_ex(card, &apdu, 0x22, 0x41, 0xB8, cse_crt_dec, sizeof(cse_crt_dec), NULL, 0); + sc_format_apdu_ex(&apdu, 0x00, 0x22, 0x41, 0xB8, cse_crt_dec, sizeof(cse_crt_dec), NULL, 0); } else { LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_SUPPORTED); } @@ -204,10 +204,10 @@ static int esteid_compute_signature(sc_card_t *card, const u8 *data, size_t data switch (env->key_ref[0]) { case 1: /* authentication key */ - sc_format_apdu_ex(card, &apdu, 0x88, 0, 0, sbuf, datalen, out, le); + sc_format_apdu_ex(&apdu, 0x00, 0x88, 0, 0, sbuf, datalen, out, le); break; default: - sc_format_apdu_ex(card, &apdu, 0x2A, 0x9E, 0x9A, sbuf, datalen, out, le); + sc_format_apdu_ex(&apdu, 0x00, 0x2A, 0x9E, 0x9A, sbuf, datalen, out, le); } SC_TRANSMIT_TEST_RET(card, apdu, "PSO CDS/INTERNAL AUTHENTICATE failed"); @@ -232,7 +232,7 @@ static int esteid_get_pin_remaining_tries(sc_card_t *card, int pin_reference) { } get_pin_info[6] = pin_reference & 0x0F; // mask out local/global - sc_format_apdu_ex(card, &apdu, 0xCB, 0x3F, 0xFF, get_pin_info, sizeof(get_pin_info), apdu_resp, sizeof(apdu_resp)); + sc_format_apdu_ex(&apdu, 0x00, 0xCB, 0x3F, 0xFF, get_pin_info, sizeof(get_pin_info), apdu_resp, sizeof(apdu_resp)); SC_TRANSMIT_TEST_RET(card, apdu, "GET DATA(pin info) failed"); if (apdu.resplen < 32) { LOG_FUNC_RETURN(card->ctx, SC_ERROR_INTERNAL); @@ -325,4 +325,4 @@ struct sc_card_driver *sc_get_esteid2018_driver(void) { esteid_ops.pin_cmd = esteid_pin_cmd; return &esteid2018_driver; -} \ No newline at end of file +} diff --git a/src/libopensc/card.c b/src/libopensc/card.c index df2ab3a2..1cc1f395 100644 --- a/src/libopensc/card.c +++ b/src/libopensc/card.c @@ -100,16 +100,17 @@ void sc_format_apdu_cse_lc_le(struct sc_apdu *apdu) } } -void sc_format_apdu_ex(struct sc_card *card, struct sc_apdu *apdu, - u8 ins, u8 p1, u8 p2, const u8 *data, size_t datalen, u8 *resp, size_t resplen) +void sc_format_apdu_ex(struct sc_apdu *apdu, + u8 cla, u8 ins, u8 p1, u8 p2, + const u8 *data, size_t datalen, + u8 *resp, size_t resplen) { if (!apdu) { return; } memset(apdu, 0, sizeof(*apdu)); - if (card) - apdu->cla = (u8) card->cla; + apdu->cla = cla; apdu->ins = ins; apdu->p1 = p1; apdu->p2 = p2; diff --git a/src/libopensc/opensc.h b/src/libopensc/opensc.h index 57f26814..38ad5fa8 100644 --- a/src/libopensc/opensc.h +++ b/src/libopensc/opensc.h @@ -821,9 +821,10 @@ void sc_format_apdu(struct sc_card *card, struct sc_apdu *apdu, * and \a resplen. As result, no chaining or GET RESPONSE will be performed in * sc_format_apdu(). */ -void sc_format_apdu_ex(struct sc_card *card, struct sc_apdu *apdu, - u8 ins, u8 p1, u8 p2, - const u8 *data, size_t datalen, u8 *resp, size_t resplen); +void sc_format_apdu_ex(struct sc_apdu *apdu, + u8 cla, u8 ins, u8 p1, u8 p2, + const u8 *data, size_t datalen, + u8 *resp, size_t resplen); int sc_check_apdu(struct sc_card *, const struct sc_apdu *); diff --git a/src/sm/sm-eac.c b/src/sm/sm-eac.c index 53380194..b1d660cc 100644 --- a/src/sm/sm-eac.c +++ b/src/sm/sm-eac.c @@ -526,7 +526,7 @@ static int eac_mse(sc_card_t *card, chat, &d); if (r < 0) goto err; - sc_format_apdu_ex(card, &apdu, ISO_MSE, p1, p2, + sc_format_apdu_ex(&apdu, 0x00, ISO_MSE, p1, p2, d, r, NULL, 0); r = sc_transmit_apdu(card, &apdu); @@ -626,7 +626,7 @@ static int eac_gen_auth_1_encrypted_nonce(sc_card_t *card, goto err; } - sc_format_apdu_ex(card, &apdu, ISO_GENERAL_AUTHENTICATE, 0x00, 0x00, + sc_format_apdu_ex(&apdu, 0x00, ISO_GENERAL_AUTHENTICATE, 0x00, 0x00, d, r, resp, sizeof resp); apdu.cla = ISO_COMMAND_CHAINING; @@ -712,7 +712,7 @@ static int eac_gen_auth_2_map_nonce(sc_card_t *card, r = SC_ERROR_INTERNAL; goto err; } - sc_format_apdu_ex(card, &apdu, ISO_GENERAL_AUTHENTICATE, 0x00, 0x00, + sc_format_apdu_ex(&apdu, 0x00, ISO_GENERAL_AUTHENTICATE, 0x00, 0x00, d, r, resp, sizeof resp); apdu.cla = ISO_COMMAND_CHAINING; @@ -798,7 +798,7 @@ static int eac_gen_auth_3_perform_key_agreement(sc_card_t *card, r = SC_ERROR_INTERNAL; goto err; } - sc_format_apdu_ex(card, &apdu, ISO_GENERAL_AUTHENTICATE, 0x00, 0x00, + sc_format_apdu_ex(&apdu, 0x00, ISO_GENERAL_AUTHENTICATE, 0x00, 0x00, d, r, resp, sizeof resp); apdu.cla = ISO_COMMAND_CHAINING; @@ -887,7 +887,7 @@ static int eac_gen_auth_4_mutual_authentication(sc_card_t *card, goto err; } - sc_format_apdu_ex(card, &apdu, ISO_GENERAL_AUTHENTICATE, 0x00, 0x00, + sc_format_apdu_ex(&apdu, 0x00, ISO_GENERAL_AUTHENTICATE, 0x00, 0x00, d, r, resp, sizeof resp); sc_debug_hex(card->ctx, SC_LOG_DEBUG_SM, "General authenticate (Perform Key Agreement) command data", apdu.data, apdu.datalen); @@ -1392,7 +1392,7 @@ static int eac_get_challenge(sc_card_t *card, goto err; } - sc_format_apdu_ex(card, &apdu, 0x84, 0x00, 0x00, NULL, 0, challenge, len); + sc_format_apdu_ex(&apdu, 0x00, 0x84, 0x00, 0x00, NULL, 0, challenge, len); r = sc_transmit_apdu(card, &apdu); if (r < 0) @@ -1425,7 +1425,7 @@ static int eac_verify(sc_card_t *card, goto err; } - sc_format_apdu_ex(card, &apdu, 0x2A, 0x00, 0xbe, (unsigned char *) cert, length, NULL, 0); + sc_format_apdu_ex(&apdu, 0x00, 0x2A, 0x00, 0xbe, (unsigned char *) cert, length, NULL, 0); r = sc_transmit_apdu(card, &apdu); if (r < 0) @@ -1449,7 +1449,7 @@ static int eac_external_authenticate(sc_card_t *card, goto err; } - sc_format_apdu_ex(card, &apdu, 0x82, 0x00, 0x00, signature, signature_len, NULL, 0); + sc_format_apdu_ex(&apdu, 0x00, 0x82, 0x00, 0x00, signature, signature_len, NULL, 0); r = sc_transmit_apdu(card, &apdu); if (r < 0) @@ -1689,7 +1689,7 @@ static int eac_gen_auth_ca(sc_card_t *card, const BUF_MEM *eph_pub_key, r = SC_ERROR_INTERNAL; goto err; } - sc_format_apdu_ex(card, &apdu, ISO_GENERAL_AUTHENTICATE, 0, 0, d, r, resp, sizeof resp); + sc_format_apdu_ex(&apdu, 0x00, ISO_GENERAL_AUTHENTICATE, 0, 0, d, r, resp, sizeof resp); sc_debug_hex(card->ctx, SC_LOG_DEBUG_SM, "General authenticate (Perform Key Agreement) command data", apdu.data, apdu.datalen); @@ -2436,7 +2436,7 @@ int eac_pace_get_tries_left(sc_card_t *card, r = eac_mse_set_at_pace(card, 0, pin_id, 0, &sw1, &sw2); #else sc_apdu_t apdu; - sc_format_apdu_ex(card, &apdu, ISO_MSE, 0xC1, 0xA4, NULL, 0, NULL, 0); + sc_format_apdu_ex(&apdu, 0x00, ISO_MSE, 0xC1, 0xA4, NULL, 0, NULL, 0); r = sc_transmit_apdu(card, &apdu); sw1 = apdu.sw1; sw2 = apdu.sw2; diff --git a/src/tools/goid-tool.c b/src/tools/goid-tool.c index 19766e8b..2a4963a8 100644 --- a/src/tools/goid-tool.c +++ b/src/tools/goid-tool.c @@ -114,7 +114,7 @@ soc_info(sc_context_t *ctx, sc_card_t *card) { NULL , 0 , 0 , 0 , NULL , NULL } }; - sc_format_apdu_ex(card, &apdu, 0x61, 0x00, 0x00, NULL, 0, rbuf, sizeof rbuf); + sc_format_apdu_ex(&apdu, 0x00, 0x61, 0x00, 0x00, NULL, 0, rbuf, sizeof rbuf); apdu.cla = 0x80; if (sc_transmit_apdu(card, &apdu) != SC_SUCCESS) { @@ -236,7 +236,7 @@ soc_verify(sc_card_t *card, unsigned char p2) { int ok = 0; sc_apdu_t apdu; - sc_format_apdu_ex(card, &apdu, 0x20, 0x00, p2, NULL, 0, NULL, 0); + sc_format_apdu_ex(&apdu, 0x00, 0x20, 0x00, p2, NULL, 0, NULL, 0); SC_TEST_GOTO_ERR(card->ctx, SC_LOG_DEBUG_VERBOSE_TOOL, sc_transmit_apdu(card, &apdu), "Verification failed"); @@ -272,7 +272,7 @@ soc_change(sc_card_t *card, unsigned char p1, unsigned char p2) { int ok = 0; sc_apdu_t apdu; - sc_format_apdu_ex(card, &apdu, 0x24, p1, p2, NULL, 0, NULL, 0); + sc_format_apdu_ex(&apdu, 0x00, 0x24, p1, p2, NULL, 0, NULL, 0); SC_TEST_GOTO_ERR(card->ctx, SC_LOG_DEBUG_VERBOSE_TOOL, sc_transmit_apdu(card, &apdu), "Changing secret failed"); diff --git a/src/tools/npa-tool.c b/src/tools/npa-tool.c index cca9839c..aea837a7 100644 --- a/src/tools/npa-tool.c +++ b/src/tools/npa-tool.c @@ -156,7 +156,7 @@ static void verify(sc_card_t *card, const char *verify_str, sc_apdu_t apdu; int r; - sc_format_apdu_ex(card, &apdu, ISO_VERIFY, 0x80, 0, data, data_len, NULL, 0); + sc_format_apdu_ex(&apdu, 0x00, ISO_VERIFY, 0x80, 0, data, data_len, NULL, 0); apdu.cla = 0x80; r = sc_transmit_apdu(card, &apdu);