RFR 8163251 : Hard coded loop limit prevents reading of smart card data greater than 8k

Valerie Peng valerie.peng at oracle.com
Thu Feb 13 05:23:11 UTC 2020


Ignore my earlier comment about fixing the check.

Took a second look at the check and noticed that it's for throwing the 
exception.

Your current webrev is fine.

Regards,
Valerie


On 2/12/2020 8:23 PM, Valerie Peng wrote:
>
> Hi, Ivan,
>
> I share your thought/confusion on the current impl as I am also not 
> familiar with ISO/IEC 7816-4.
>
> Based on my reading of this standard and the CardImpl code, it looks 
> like the while-true loop is for retrieving additional response data. 
> Per the standard and javadoc, max length of the response data is 
> 65536. Given that SW2 is only one byte, it would probably only return 
> at most 256 byte response data at a time. Thus, the iteration count 
> would be at most 256.
>
> So far we are on the same page.
>
> With the latest webrev (webrev.01), it seems that the loop will only 
> be run 255 instead of 256 times as k is incremented before comparison. 
> Thus, I think we should fix the check.
>
> Valerie
>
> On 2/11/2020 12:18 PM, Ivan Gerasimov wrote:
>> Hi Valerie!
>>
>> To be honest, the all these limitations are not quite clear to me.
>>
>> If the command is using an extended Le word to specify the expected 
>> length of the response data, then this length can be at most 65536.
>>
>> If a short Le was used, then the length can be at most 256.
>>
>> However, if we received 0x61 in the SW1, that means that more data 
>> bytes are available and they can be retrieved by issuing another 
>> transmit call with a short Le.  This next call can again potentially 
>> result in 0x61 in SW1, and so on.
>>
>> In the standard, I cannot see any explicit limitations on the number 
>> of retries.  So, I see it as it might be possible to retrieve more 
>> data than 65536 bytes.
>>
>> On the other hand, in the specification for CommandAPDU [1] we have 
>> hardcoded limit for the maximum response length, which is 65536.  So, 
>> even if it were possible to retrieve larger data, there's no point to 
>> try, as the current API prohibits it.
>>
>> Assuming that the 0x61 response can only be received when a short Le 
>> is used, the maximum RESPONSE_ITERATOR should be set to 256, and an 
>> exception should be thrown once that number is exceeded.
>>
>> I've updated the webrev in-place accordingly.
>>
>> [0] http://cr.openjdk.java.net/~igerasim/8163251/01/webrev/
>>
>> [1] 
>> https://docs.oracle.com/en/java/javase/13/docs/api/java.smartcardio/javax/smartcardio/CommandAPDU.html#%3Cinit%3E(int,int,int,int,int)
>>
>> With kind regards,
>>
>> Ivan
>>
>>
>> On 2/10/20 6:40 PM, Valerie Peng wrote:
>>> Hi Ivan,
>>>
>>> You removed the "=", so the actual iteration count is reduced by one.
>>>
>>> Should the iteration count be 256 or 257? If the actual count should 
>>> be 257, then may be the check needs to be changed to k++ from ++k?
>>>
>>> Valerie
>>>
>>> On 2/10/2020 5:07 PM, Ivan Gerasimov wrote:
>>>> Thank you Michael!
>>>>
>>>> It's a good point about maximum length.
>>>>
>>>> Here's the updated webrev with the new System property dropped and 
>>>> the increased number of iterations:
>>>>
>>>> http://cr.openjdk.java.net/~igerasim/8163251/01/webrev/
>>>>
>>>> With kind regards,
>>>> Ivan
>>>>
>>>>
>>>> On 2/10/20 4:18 PM, Michael StJohns wrote:
>>>>> On 2/10/2020 6:49 PM, Ivan Gerasimov wrote:
>>>>>> Hello!
>>>>>>
>>>>>> Current implementation of the method 
>>>>>> javax.smartcardio.CardChannel.transmit() has an internal 
>>>>>> limitation on the maximum allowed amount of the transmitted data.
>>>>>>
>>>>>> This limitation is dictated by the maximum number of iterations 
>>>>>> to transmit data from a card:  Each iteration can transmit up to 
>>>>>> 256 bytes of data, and we have a hardcoded limit of 32 iterations.
>>>>>>
>>>>>> Over time, we've received requests to increase this limit, as 
>>>>>> there are occasions when the effective limit of 8k is not enough.
>>>>>>
>>>>>> Would you please help review a proposal:  First, it is proposed 
>>>>>> to increase the default limit of iteration to 128 (so that up to 
>>>>>> 32k of data can be transmitted); Second, the limit of iterations 
>>>>>> is made configurable via a System property. This limit can be 
>>>>>> increased up to 4096 (so that the total amount of transmitted 
>>>>>> data can be made up to 1m).
>>>>>>
>>>>>> BUGURL: https://bugs.openjdk.java.net/browse/JDK-8163251
>>>>>> WEBREV: http://cr.openjdk.java.net/~igerasim/8163251/00/webrev/
>>>>>>
>>>>>> If there is an agreement on the proposal, I'll file a CSR to 
>>>>>> document a new System property.
>>>>>>
>>>>>> Thanks in advance!
>>>>>>
>>>>> Given that the maximum length for an extended APDU is 64K (65536) 
>>>>> (hmm +7 for the header and +2 for LE), and for its return is 64K + 
>>>>> 2 bytes,  I'm not quite sure why you'd up the number to 4096/1M - 
>>>>> I'd set the default and fixed value to 257 (64K) and leave it at 
>>>>> that.
>>>>>
>>>>> Mike
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/security-dev/attachments/20200212/83d94cfe/attachment.htm>


More information about the security-dev mailing list