Hoernchen has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/42312?usp=email )
Change subject: ccid: properly reject PC_to_RDR_{ResetParameters,SetParameters} ......................................................................
ccid: properly reject PC_to_RDR_{ResetParameters,SetParameters}
As per CCID 1.1 ch 6.2.3 a reader that does not support these commands can reject them, which we now do, instead of pretending to accept the params.
This requires https://gitlab.com/wireshark/wireshark/-/issues/20107 to be properly decoded in wireshark >= 4.4.8 .
Closes: OS#5380 Change-Id: I4d0671c160e9028097397ec47982bafbfdc24f24 --- M ccid_common/ccid_device.c 1 file changed, 9 insertions(+), 63 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/12/42312/1
diff --git a/ccid_common/ccid_device.c b/ccid_common/ccid_device.c index acee696..fa07097 100644 --- a/ccid_common/ccid_device.c +++ b/ccid_common/ccid_device.c @@ -264,8 +264,9 @@ const struct ccid_pars_decoded *dec_par) { struct msgb *msg = ccid_msgb_alloc(); + size_t len = dec_par ? sizeof(struct ccid_header_in) + sizeof(struct ccid_proto_data_t0) : sizeof(struct ccid_header_in); struct ccid_rdr_to_pc_parameters *par = - (struct ccid_rdr_to_pc_parameters *) msgb_put(msg, sizeof(par->hdr)+sizeof(par->abProtocolData.t0)); + (struct ccid_rdr_to_pc_parameters *) msgb_put(msg, len); uint8_t sts = (cmd_sts & CCID_CMD_STATUS_MASK) | icc_status;
SET_HDR_IN(par, RDR_to_PC_Parameters, slot_nr, seq, sts, err); @@ -286,8 +287,9 @@ const struct ccid_pars_decoded *dec_par) { struct msgb *msg = ccid_msgb_alloc(); + size_t len = dec_par ? sizeof(struct ccid_header_in) + sizeof(struct ccid_proto_data_t1) : sizeof(struct ccid_header_in); struct ccid_rdr_to_pc_parameters *par = - (struct ccid_rdr_to_pc_parameters *) msgb_put(msg, sizeof(par->hdr)+sizeof(par->abProtocolData.t1)); + (struct ccid_rdr_to_pc_parameters *) msgb_put(msg, len); uint8_t sts = (cmd_sts & CCID_CMD_STATUS_MASK) | icc_status;
SET_HDR_IN(par, RDR_to_PC_Parameters, slot_nr, seq, sts, err); @@ -386,7 +388,7 @@ case PC_to_RDR_SetParameters: /* Return RDR_to_PC_Parameters */ resp = ccid_gen_parameters_t0_nr(slot_nr, icc_status, seq, CCID_CMD_STATUS_FAILED, - err_code, NULL); /* FIXME: parameters? */ + err_code, NULL); break;
case PC_to_RDR_Escape: @@ -491,78 +493,22 @@ static int ccid_handle_reset_parameters(struct ccid_slot *cs, struct msgb *msg) { const union ccid_pc_to_rdr *u = msgb_ccid_out(msg); - const struct ccid_header *ch = (const struct ccid_header *) u; uint8_t seq = u->reset_parameters.hdr.bSeq; struct msgb *resp; - int rc;
- /* copy default parameters from somewhere */ - /* FIXME: T=1 */ - - cs->proposed_pars = *cs->default_pars; - - /* validate parameters; abort if they are not supported */ - rc = cs->ci->slot_ops->set_params(cs, seq, CCID_PROTOCOL_NUM_T0, cs->default_pars); - if (rc < 0) { - resp = ccid_gen_parameters_t0(cs, seq, CCID_CMD_STATUS_FAILED, -rc); - goto out; - } - - msgb_free(msg); - /* busy, tdpu like callback */ - return 1; -out: - msgb_free(msg); - ccid_slot_send_unbusy(cs, resp); - return 1; + resp = ccid_gen_parameters_t0_nr(cs->slot_nr, get_icc_status(cs), seq, CCID_CMD_STATUS_FAILED, CCID_ERR_CMD_NOT_SUPPORTED, NULL); + return ccid_slot_send_unbusy(cs, resp); }
/* Section 6.1.7 */ static int ccid_handle_set_parameters(struct ccid_slot *cs, struct msgb *msg) { const union ccid_pc_to_rdr *u = msgb_ccid_out(msg); - const struct ccid_pc_to_rdr_set_parameters *spar = &u->set_parameters; - const struct ccid_header *ch = (const struct ccid_header *) u; uint8_t seq = u->set_parameters.hdr.bSeq; - struct ccid_pars_decoded pars_dec; struct msgb *resp; - int rc;
- switch (spar->bProtocolNum) { - case CCID_PROTOCOL_NUM_T0: - rc = decode_ccid_pars_t0(&pars_dec, &spar->abProtocolData.t0); - break; -// case CCID_PROTOCOL_NUM_T1: -// rc = decode_ccid_pars_t1(&pars_dec, &spar->abProtocolData.t1); -// break; - default: - LOGP(DCCID, LOGL_ERROR, "SetParameters: Invalid Protocol 0x%02x\n",spar->bProtocolNum); - resp = ccid_gen_parameters_t0(cs, seq, CCID_CMD_STATUS_FAILED, 0); - goto out; - } - - if (rc < 0) { - LOGP(DCCID, LOGL_ERROR, "SetParameters: Unable to parse: %d\n", rc); - resp = ccid_gen_parameters_t0(cs, seq, CCID_CMD_STATUS_FAILED, -rc); - goto out; - } - - cs->proposed_pars = pars_dec; - - /* validate parameters; abort if they are not supported */ - rc = cs->ci->slot_ops->set_params(cs, seq, spar->bProtocolNum, &pars_dec); - if (rc < 0) { - resp = ccid_gen_parameters_t0(cs, seq, CCID_CMD_STATUS_FAILED, -rc); - goto out; - } - - msgb_free(msg); - /* busy, tdpu like callback */ - return 1; -out: - msgb_free(msg); - ccid_slot_send_unbusy(cs, resp); - return 1; + resp = ccid_gen_parameters_t0_nr(cs->slot_nr, get_icc_status(cs), seq, CCID_CMD_STATUS_FAILED, CCID_ERR_CMD_NOT_SUPPORTED, NULL); + return ccid_slot_send_unbusy(cs, resp); }
/* Section 6.1.8 */