2009/6/23 Aktiv Co. Aleksey Samsonov <[email protected]>:
> Hi,

Hello,

> I propose the attached patch for iso7816.c.

Can you split the patch is small and independent patches please?
And for each patch explain what the patch does and/or why it is needed.

For example you can create one patch with only the assert() calls, etc.

Thanks

>>> It looks like your patch is correct (according to ISO 7816-4 2003,
>>> page 54, 7.5.11 MANAGE SECURITY ENVIRONMENT command)
>>>
>>> Any objection from other list members?
>>
>> almost every card driver has it's own set_security_env implementation,
>> so this change will not break any card, so it looks good to me.
>>
>> maybe we can obsolete some of those card specific implementations,
>> if the only difference was this value?
>
> Thanks
>
> diff -u -r opensc-trunk-r3695/src/libopensc/iso7816.c
> new/opensc-trunk-r3695/src/libopensc/iso7816.c
> --- opensc-trunk-r3695/src/libopensc/iso7816.c  2008-12-27
> 19:15:30.000000000 +0300
> +++ new/opensc-trunk-r3695/src/libopensc/iso7816.c      2009-06-23
> 15:46:32.000000000 +0400
> @@ -449,7 +449,7 @@
>        } else {
>                apdu.resplen = 0;
>                apdu.le = 0;
> -               apdu.cse = SC_APDU_CASE_3_SHORT;
> +               apdu.cse = (apdu.lc == 0) ? SC_APDU_CASE_1 :
> SC_APDU_CASE_3_SHORT;
>        }
>        r = sc_transmit_apdu(card, &apdu);
>        SC_TEST_RET(card->ctx, r, "APDU transmit failed");
> @@ -463,6 +463,8 @@
>        if (r)
>                SC_FUNC_RETURN(card->ctx, 2, r);
>
> +       if (apdu.resplen <= 1)
> +               SC_FUNC_RETURN(card->ctx, 2,
> SC_ERROR_UNKNOWN_DATA_RECEIVED);
>        switch (apdu.resp[0]) {
>        case 0x6F:
>                file = sc_file_new();
> @@ -473,7 +475,7 @@
>                        sc_file_free(file);
>                        SC_FUNC_RETURN(card->ctx, 2, SC_ERROR_NOT_SUPPORTED);
>                }
> -               if (apdu.resp[1] <= apdu.resplen)
> +               if ((size_t)apdu.resp[1] + 2 <= apdu.resplen)
>                        card->ops->process_fci(card, file, apdu.resp+2,
> apdu.resp[1]);
>                *file_out = file;
>                break;
> @@ -519,17 +521,21 @@
>  {
>        u8 *p = out;
>        u8 buf[64];
> -
> +
> +       if (*outlen < 2)
> +               return SC_ERROR_BUFFER_TOO_SMALL;
>        *p++ = 0x6F;
>        p++;
>
>        buf[0] = (file->size >> 8) & 0xFF;
>        buf[1] = file->size & 0xFF;
> -       sc_asn1_put_tag(0x81, buf, 2, p, 16, &p);
> +       sc_asn1_put_tag(0x81, buf, 2, p, *outlen - (p - out), &p);
>
>        if (file->type_attr_len) {
> +               assert(sizeof(buf) >= file->type_attr_len);
>                memcpy(buf, file->type_attr, file->type_attr_len);
> -               sc_asn1_put_tag(0x82, buf, file->type_attr_len, p, 16, &p);
> +               sc_asn1_put_tag(0x82, buf, file->type_attr_len,
> +                               p, *outlen - (p - out), &p);
>        } else {
>                buf[0] = file->shareable ? 0x40 : 0;
>                switch (file->type) {
> @@ -544,19 +550,23 @@
>                default:
>                        return SC_ERROR_NOT_SUPPORTED;
>                }
> -               sc_asn1_put_tag(0x82, buf, 1, p, 16, &p);
> +               sc_asn1_put_tag(0x82, buf, 1, p, *outlen - (p - out), &p);
>        }
>        buf[0] = (file->id >> 8) & 0xFF;
>        buf[1] = file->id & 0xFF;
> -       sc_asn1_put_tag(0x83, buf, 2, p, 16, &p);
> +       sc_asn1_put_tag(0x83, buf, 2, p, *outlen - (p - out), &p);
>        /* 0x84 = DF name */
>        if (file->prop_attr_len) {
> +               assert(sizeof(buf) >= file->prop_attr_len);
>                memcpy(buf, file->prop_attr, file->prop_attr_len);
> -               sc_asn1_put_tag(0x85, buf, file->prop_attr_len, p, 18, &p);
> +               sc_asn1_put_tag(0x85, buf, file->prop_attr_len,
> +                               p, *outlen - (p - out), &p);
>        }
>        if (file->sec_attr_len) {
> +               assert(sizeof(buf) >= file->sec_attr_len);
>                memcpy(buf, file->sec_attr, file->sec_attr_len);
> -               sc_asn1_put_tag(0x86, buf, file->sec_attr_len, p, 18, &p);
> +               sc_asn1_put_tag(0x86, buf, file->sec_attr_len,
> +                               p, *outlen - (p - out), &p);
>        }
>        out[1] = p - out - 2;
>
> @@ -664,14 +674,12 @@
>        int r, locked = 0;
>
>        assert(card != NULL && env != NULL);
> -       sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT, 0x22, 0, 0);
> +       sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT, 0x22, 0x41, 0);
>        switch (env->operation) {
>        case SC_SEC_OPERATION_DECIPHER:
> -               apdu.p1 = 0x81;
>                apdu.p2 = 0xB8;
>                break;
>        case SC_SEC_OPERATION_SIGN:
> -               apdu.p1 = 0x41;
>                apdu.p2 = 0xB6;
>                break;
>        default:
> @@ -687,6 +695,7 @@
>        if (env->flags & SC_SEC_ENV_FILE_REF_PRESENT) {
>                *p++ = 0x81;
>                *p++ = env->file_ref.len;
> +               assert(sizeof(sbuf) - (p - sbuf) >= env->file_ref.len);
>                memcpy(p, env->file_ref.value, env->file_ref.len);
>                p += env->file_ref.len;
>        }
> @@ -696,6 +705,7 @@
>                else
>                        *p++ = 0x84;
>                *p++ = env->key_ref_len;
> +               assert(sizeof(sbuf) - (p - sbuf) >= env->key_ref_len);
>                memcpy(p, env->key_ref, env->key_ref_len);
>                p += env->key_ref_len;
>        }
> @@ -1024,3 +1034,4 @@
>  {
>        return &iso_driver;
>  }
> +
>
>



-- 
 Dr. Ludovic Rousseau
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to