diff mbox

Retrieve the correct TD byte when checking an ATR.

Message ID 1421679451-9096-1-git-send-email-jwhite@codeweavers.com
State New
Headers show

Commit Message

Jeremy White Jan. 19, 2015, 2:57 p.m. UTC
A physical smartcard with an ATR of
  3B 95 95 40 FF AE 01 0E 00 00
was parsed incorrectly.

The '40' should have been the second TD; instead
the FF is used, incorrectly.

Signed-off-by: Jeremy White <jwhite@codeweavers.com>
---
 hw/usb/ccid-card-passthru.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Marc-André Lureau Jan. 19, 2015, 4:11 p.m. UTC | #1
On Mon, Jan 19, 2015 at 3:57 PM, Jeremy White <jwhite@codeweavers.com> wrote:
> A physical smartcard with an ATR of
>   3B 95 95 40 FF AE 01 0E 00 00
> was parsed incorrectly.
>
> The '40' should have been the second TD; instead
> the FF is used, incorrectly.

The second TD? There is only one here, T0 = 0x95 & 0xf0 >> 4 = b1001

>
> Signed-off-by: Jeremy White <jwhite@codeweavers.com>
> ---
>  hw/usb/ccid-card-passthru.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/hw/usb/ccid-card-passthru.c b/hw/usb/ccid-card-passthru.c
> index 10f1d30..2ae3b81 100644
> --- a/hw/usb/ccid-card-passthru.c
> +++ b/hw/usb/ccid-card-passthru.c
> @@ -168,8 +168,8 @@ static int check_atr(PassthruState *card, uint8_t *data, int len)
>              opt_bytes++;
>          }
>          if (td & 0x8) {
> -            opt_bytes++;
>              td = data[opt_bytes + 2] >> 4;
> +            opt_bytes++;
>          }
>      }
>      if (len < 2 + historical_length + opt_bytes) {
> --
> 1.7.10.4
>
>

That looks correct, opt_bytes before incrementing points to the current TD.

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Jeremy White Jan. 19, 2015, 4:24 p.m. UTC | #2
>> The '40' should have been the second TD; instead
>> the FF is used, incorrectly.
> 
> The second TD? There is only one here, T0 = 0x95 & 0xf0 >> 4 = b1001

Yes, sorry, I should not have capitalized TD in my comment.  The code
uses the variable 'td' to hold the upper 4 bits of T0, and then, if
present, the upper 4 bits of TD1.  So what is read imprecisely is the
upper 4 bits of TD1.

I don't know qemu patch protocol; that seems like a very minor detail in
the comment; does it justify a resubmit?

> 
>>
>> Signed-off-by: Jeremy White <jwhite@codeweavers.com>
>> ---
>>  hw/usb/ccid-card-passthru.c |    2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/hw/usb/ccid-card-passthru.c b/hw/usb/ccid-card-passthru.c
>> index 10f1d30..2ae3b81 100644
>> --- a/hw/usb/ccid-card-passthru.c
>> +++ b/hw/usb/ccid-card-passthru.c
>> @@ -168,8 +168,8 @@ static int check_atr(PassthruState *card, uint8_t *data, int len)
>>              opt_bytes++;
>>          }
>>          if (td & 0x8) {
>> -            opt_bytes++;
>>              td = data[opt_bytes + 2] >> 4;
>> +            opt_bytes++;
>>          }
>>      }
>>      if (len < 2 + historical_length + opt_bytes) {
>> --
>> 1.7.10.4
>>
>>
> 
> That looks correct, opt_bytes before incrementing points to the current TD.
> 
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>
diff mbox

Patch

diff --git a/hw/usb/ccid-card-passthru.c b/hw/usb/ccid-card-passthru.c
index 10f1d30..2ae3b81 100644
--- a/hw/usb/ccid-card-passthru.c
+++ b/hw/usb/ccid-card-passthru.c
@@ -168,8 +168,8 @@  static int check_atr(PassthruState *card, uint8_t *data, int len)
             opt_bytes++;
         }
         if (td & 0x8) {
-            opt_bytes++;
             td = data[opt_bytes + 2] >> 4;
+            opt_bytes++;
         }
     }
     if (len < 2 + historical_length + opt_bytes) {