make sc_format_apdu_ex agnostic to card properties

This commit is contained in:
Frank Morgner 2019-08-07 23:58:25 +02:00
parent 0c563df0c1
commit b6be87a348
6 changed files with 30 additions and 28 deletions

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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 *);

View File

@ -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;

View File

@ -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");

View File

@ -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);