Hoernchen has uploaded this change for review.
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 */
To view, visit change 42312. To unsubscribe, or for help writing mail filters, visit settings.