On 8/22/2012 1:53 PM, Andreas Schwier wrote:
> Yes, that's basically what our patch is all about. There are actually
> two places in minidriver.c where the tokeninfo->serial_number value is
> copied. We propose to change both as you can see in [1].

Looks good.

>
> Andreas
>
> [1]
> https://github.com/CardContact/OpenSC/commit/724cdd06e23ecd2e822bd1f138d9c3fbdafe9324
>
> Am 22.08.2012 20:30, schrieb Douglas E. Engert:
>>
>> On 8/22/2012 11:24 AM, Andreas Schwier (ML) wrote:
>>> Hi Douglas,
>>>
>>> see below.
>>>
>>> Am 22.08.2012 18:00, schrieb Douglas E. Engert:
>>>> On 8/22/2012 10:09 AM, Andreas Schwier wrote:
>>>>> Hi Douglas,
>>>>>
>>>>> thanks for your infos.
>>>>>
>>>>> The minidriver.c already ensures that the cardid file is always 16 byte.
>>>>> It does this by repeating the token serial number until 16 bytes are 
>>>>> filled.
>>>> Unfortunately that gives OpenbSC 16 bytes but does not improve the 
>>>> uniqunness.
>>>>
>>>> Fortunately the uniqueness today only needs to extend over all the cards
>>>> as seen on a single machine which may be only a hand full. the cardid
>>>> is not sent to AD for example.  But it also means that if the certificates
>>>> or keys on a card are changed, the cardid should also change.
>>>>
>>>>> We can ensure uniqueness of the serial number for our cards, but no
>>>>> uniqueness among all other card vendors. There remains a (very) little
>>>>> probability that a hexadecimal encoded serial number of another vendor's
>>>>> card resembles one of our ASCII serial numbers.
>>>>>
>>>>> Our serial numbers are based on the numbering scheme for machine
>>>>> readable travel documents, a 2 digit country code followed by up to 9
>>>>> ASCII digits (e.g. UTTM1234567 equals 5554544D313233343536375554544D31
>>>>> in cardid).
>>>> You did not say what was the minimum number of digits are, and
>>>> in you example the first 4 "ACSII digits" are letters not numbers that
>>>> introduce more uniqueness then numbers. Also for a single machine would
>>>> it always see the same country code?
>>> The serial number is always 11 characters (0-9, A-Z). The country code
>>> is the country of the card issuer, within a country the card issuer gets
>>> a 2-character prefix and will define the remaining 7 character.
>> OK, so you are looking at how to handle the failure
>> in minidriver.c at line 1071,  not on getting a printable string to show up.
>>
>> 1069                 rv = 
>> sc_hex_to_bin(vs->p15card->tokeninfo->serial_number, sn_bin, &sn_len);
>> 1070                 if (rv)
>> 1071                         return SCARD_E_INVALID_VALUE;
>>
>>    by change to something like:
>>
>>      rv = sc_hex_to_bin(vs->p15card->tokeninfo->serial_number, sn_bin, 
>> &sn_len);
>>      if (rv) {
>>              strncpy(s_bin, vs->p15card->tokeninfo->serial_number, 
>> sizeof(sn_bin));
>>              sn_len = strlen(vs->p15card->tokeninfo->serial_number);
>>              if (sn_len < 2) /* really too short to use as a cardid */
>>                      return SCARD_E_INVALID_VALUE;
>>              if (sn_len > sizeof(sn_bin)) sn_len = sizeof(sn_bin);
>>      }
>>
>> I have not tried this.
>>
>> Since this fails, in your case, I don't have any objection to adding 
>> something
>> like the above.
>>
>>>> If you have 9 ASCII characters that should introduce enough uniqueness
>>>> to avoid conflicts with your other cards and other vendors cards.
>>>>
>>>> One point I am trying to make is the cardid value is not really seen
>>>> by the user, thus it does not have to be printable, and it could
>>>> hold more uniqueness then a printable string. But if there is not
>>>> enough unique data on the card to populate the cardid you have to use
>>>> whatever you have.
>>> Yes, I understand. I'm just concerned about the serial number visible to
>>> the user at the PKCS#15 and PKCS#11 level. There it would be nice to see
>>> the same serial number as the one printed on the card. My point is, that
>>> currently the minidriver silently assumes that the
>>> tokeninfo->serial_number contains a string with hexadecimal characters.
>>>>> Our proposed change (see [1]) will not alter the current behaviour with
>>>>> existing cards. It will just allow a card that uses a ASCII serial
>>>>> number to work as well.
>>>>>
>>>>> An alternative approach - and probably more invasive - would be to use
>>>>> the result of SC_CARDCTL_GET_SERIALNR in minidriver.c as input for the
>>>>> cardid file. This way we could still have our human readable serial
>>>>> number at the PKCS#11 und PKCS#15 level and a little more uniqueness in
>>>>> the cardid file.
>>>> On some cards whewre there is no serial readable form the card the
>>>> SC_CARDCTL_GET_SERIALNR does similar tricts to come up with a "serial 
>>>> number"
>>>> from what ever data it can use on the card.
>>>>
>>>>
>>>>> This will however break existing installations, as the
>>>>> content of the cardid file might change with the driver update.
>>>>>
>>>> Yes it might break existing installations, as it would look like  a new 
>>>> card
>>>> to the application, but with the same certificate on two cards. This could 
>>>> be
>>>> an issue if Windows searches the cert store for a certificate, then asks 
>>>> the
>>>> user to insert the matching card. i.e. the old card, not the new one.
>>>>
>>>> As long as you have 6 digits or characters in your printable string that 
>>>> should
>>>> be fine.
>>>>
>>>>> Andreas
>>>>>
>>>>> [1]
>>>>> https://github.com/CardContact/OpenSC/commit/724cdd06e23ecd2e822bd1f138d9c3fbdafe9324
>>>>>
>>>>> Am 22.08.2012 16:29, schrieb Douglas E. Engert:
>>>>>> On 8/22/2012 5:28 AM, Andreas Schwier (ML) wrote:
>>>>>>> Hi everyone,
>>>>>>>
>>>>>>> we've come across an issue with the minidriver which assumes the card
>>>>>>> serial number to be a hex string.
>>>>>>>
>>>>>>> In our card the serial number is a string composed of ASCII characters.
>>>>>>> This works well with pkcs15-tool and the PKCS#11 library, however it
>>>>>>> fails with the current minidriver when it tries to convert the hex
>>>>>>> string into binary data for the cardid file.
>>>>>>>
>>>>>>> Neither in PKCS#11 spec nor in ISO 7816-15 I can find a definition for
>>>>>>> encoding the serial number as hex string.
>>>>>> The minidriver does not use the PKCS#11 standards, it is the Microsoft
>>>>>> definition of what it expects in the cardid file that counts.
>>>>>>
>>>>>> http://www.microsoft.com/whdc/device/input/smartcard/sc-minidriver.mspx
>>>>>>
>>>>>> Section 5.4.1 says:
>>>>>>
>>>>>>      "The logical name for this file is “CardId”. It is in the root 
>>>>>> directory."
>>>>>>
>>>>>>      "The file is organized as a 16-byte array. It should be treated as 
>>>>>> opaque binary data."
>>>>>>
>>>>>>      "This value is assigned by Microsoft software to assure that a 
>>>>>> unique value is
>>>>>>       generated for the card. It is unrelated to the serial number that 
>>>>>> may or may not
>>>>>>       be assigned to the card during manufacture."
>>>>>>
>>>>>> In other places it calls it as a GUID.
>>>>>>
>>>>>> This also means that when displayed, it maybe displayed as a GUID as hex 
>>>>>> digits
>>>>>> with "{", "}" "," and "-"  added for readability, and some bytes 
>>>>>> reversed in little
>>>>>> endian machines. So it may not be recognizable as your serial number.
>>>>>>
>>>>>> That said, since the minidriver is emulating a card that should have a 
>>>>>> cardid file,
>>>>>> the data to populate the emulated cardid file has to come from the card 
>>>>>> and be the same
>>>>>> at every use,  and unique across all cards not just one site or one card 
>>>>>> vendor.
>>>>>>
>>>>>> The value or its derivatives are stored in the certificate store and used
>>>>>> to associate cards with data previously cached.
>>>>>>
>>>>>>> I therefore propose to change the code in minidriver.c to do the 
>>>>>>> following:
>>>>>>>
>>>>>>> 1. try parsing tokeninfo->serial_number as hex string
>>>>>>> 2. if that fails copy serial_number as is with the length being the
>>>>>>> length of the ASCII encoded string
>>>>>> It must be 16 bytes.
>>>>>>
>>>>>>> This should not interfere with current card drivers which all use a hex
>>>>>>> string as serial number.
>>>>>>>
>>>>>>> Any objections ?
>>>>>> If you can show that your method has enough uniqueness, to not cause 
>>>>>> problems
>>>>>> with other cards, then no.
>>>>>>
>>>>>>> Andreas
>>>>>>>
>>>
>
>

-- 

  Douglas E. Engert  <deeng...@anl.gov>
  Argonne National Laboratory
  9700 South Cass Avenue
  Argonne, Illinois  60439
  (630) 252-5444


_______________________________________________
opensc-devel mailing list
opensc-devel@lists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to