Changeset 3024

Show
Ignore:
Timestamp:
09/24/06 16:05:06 (2 years ago)
Author:
nils
Message:

implement workaround for the Taiwanese id card

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/libopensc/pkcs15.c

    r2995 r3024  
    2828#include <ltdl.h> 
    2929 
     30static const struct sc_asn1_entry c_asn1_twlabel[] = { 
     31        { "twlabel", SC_ASN1_UTF8STRING, SC_ASN1_TAG_UTF8STRING, 0, NULL, NULL }, 
     32        { NULL, 0, 0, 0, NULL, NULL } 
     33}; 
    3034 
    3135static const struct sc_asn1_entry c_asn1_toki[] = { 
     
    3438        { "manufacturerID", SC_ASN1_UTF8STRING,   SC_ASN1_TAG_UTF8STRING, SC_ASN1_OPTIONAL, NULL, NULL }, 
    3539        { "label",          SC_ASN1_UTF8STRING,   SC_ASN1_CTX | 0, SC_ASN1_OPTIONAL, NULL, NULL }, 
     40        /* XXX the Taiwanese ID card erroneously uses explicit tagging */ 
     41        { "label-tw",       SC_ASN1_STRUCT,       SC_ASN1_CTX | 0 | SC_ASN1_CONS, SC_ASN1_OPTIONAL, NULL, NULL }, 
    3642        { "tokenflags",     SC_ASN1_BIT_FIELD,    SC_ASN1_TAG_BIT_STRING, 0, NULL, NULL }, 
    3743        { "seInfo",         SC_ASN1_SEQUENCE,     SC_ASN1_CONS | SC_ASN1_TAG_SEQUENCE, SC_ASN1_OPTIONAL, NULL, NULL }, 
     
    6470        size_t lupdate_len = sizeof(last_update) - 1; 
    6571        size_t flags_len   = sizeof(ti->flags); 
    66         struct sc_asn1_entry asn1_toki[13], asn1_tokeninfo[3]; 
     72        struct sc_asn1_entry asn1_toki[14], asn1_tokeninfo[3], asn1_twlabel[3]; 
    6773        u8 preferred_language[3]; 
    6874        size_t lang_length = sizeof(preferred_language); 
    6975 
    7076        memset(last_update, 0, sizeof(last_update)); 
     77        sc_copy_asn1_entry(c_asn1_twlabel, asn1_twlabel); 
    7178        sc_copy_asn1_entry(c_asn1_toki, asn1_toki); 
    7279        sc_copy_asn1_entry(c_asn1_tokeninfo, asn1_tokeninfo); 
     80        sc_format_asn1_entry(asn1_twlabel, label, &label_len, 0); 
    7381        sc_format_asn1_entry(asn1_toki + 0, &ti->version, NULL, 0); 
    7482        sc_format_asn1_entry(asn1_toki + 1, serial, &serial_len, 0); 
    7583        sc_format_asn1_entry(asn1_toki + 2, mnfid, &mnfid_len, 0); 
    7684        sc_format_asn1_entry(asn1_toki + 3, label, &label_len, 0); 
    77         sc_format_asn1_entry(asn1_toki + 4, &ti->flags, &flags_len, 0); 
    78         sc_format_asn1_entry(asn1_toki + 5, NULL, NULL, 0); 
     85        sc_format_asn1_entry(asn1_toki + 4, asn1_twlabel, NULL, 0); 
     86        sc_format_asn1_entry(asn1_toki + 5, &ti->flags, &flags_len, 0); 
    7987        sc_format_asn1_entry(asn1_toki + 6, NULL, NULL, 0); 
    8088        sc_format_asn1_entry(asn1_toki + 7, NULL, NULL, 0); 
    8189        sc_format_asn1_entry(asn1_toki + 8, NULL, NULL, 0); 
    8290        sc_format_asn1_entry(asn1_toki + 9, NULL, NULL, 0); 
    83         sc_format_asn1_entry(asn1_toki + 10, last_update, &lupdate_len, 0); 
    84         sc_format_asn1_entry(asn1_toki + 11, preferred_language, &lang_length, 0); 
     91        sc_format_asn1_entry(asn1_toki + 10, NULL, NULL, 0); 
     92        sc_format_asn1_entry(asn1_toki + 11, last_update, &lupdate_len, 0); 
     93        sc_format_asn1_entry(asn1_toki + 12, preferred_language, &lang_length, 0); 
    8594        sc_format_asn1_entry(asn1_tokeninfo, asn1_toki, NULL, 0); 
    8695         
     
    111120        } 
    112121        if (ti->label == NULL) { 
    113                 if (asn1_toki[3].flags & SC_ASN1_PRESENT) 
     122                if (asn1_toki[3].flags & SC_ASN1_PRESENT || 
     123                    asn1_toki[4].flags & SC_ASN1_PRESENT) 
    114124                        ti->label = strdup((char *) label); 
    115125                else 
     
    118128                        return SC_ERROR_OUT_OF_MEMORY; 
    119129        } 
    120         if (asn1_toki[10].flags & SC_ASN1_PRESENT) { 
     130        if (asn1_toki[11].flags & SC_ASN1_PRESENT) { 
    121131                ti->last_update = strdup((char *)last_update); 
    122132                if (ti->last_update == NULL) 
    123133                        return SC_ERROR_OUT_OF_MEMORY; 
    124134        } 
    125         if (asn1_toki[11].flags & SC_ASN1_PRESENT) { 
     135        if (asn1_toki[12].flags & SC_ASN1_PRESENT) { 
    126136                preferred_language[2] = 0; 
    127137                ti->preferred_language = strdup((char *)preferred_language); 
     
    140150        size_t serial_len, mnfid_len, label_len, flags_len, last_upd_len; 
    141151         
    142         struct sc_asn1_entry asn1_toki[13], asn1_tokeninfo[2]; 
     152        struct sc_asn1_entry asn1_toki[14], asn1_tokeninfo[2]; 
    143153 
    144154        sc_copy_asn1_entry(c_asn1_toki, asn1_toki); 
     
    169179        if (ti->flags) { 
    170180                flags_len = sizeof(ti->flags); 
    171                 sc_format_asn1_entry(asn1_toki + 4, &ti->flags, &flags_len, 1); 
     181                sc_format_asn1_entry(asn1_toki + 5, &ti->flags, &flags_len, 1); 
    172182        } else 
    173                 sc_format_asn1_entry(asn1_toki + 4, NULL, NULL, 0); 
    174         sc_format_asn1_entry(asn1_toki + 5, NULL, NULL, 0); 
     183                sc_format_asn1_entry(asn1_toki + 5, NULL, NULL, 0); 
    175184        sc_format_asn1_entry(asn1_toki + 6, NULL, NULL, 0); 
    176185        sc_format_asn1_entry(asn1_toki + 7, NULL, NULL, 0); 
    177186        sc_format_asn1_entry(asn1_toki + 8, NULL, NULL, 0); 
    178187        sc_format_asn1_entry(asn1_toki + 9, NULL, NULL, 0); 
     188        sc_format_asn1_entry(asn1_toki + 10, NULL, NULL, 0); 
    179189        if (ti->last_update != NULL) { 
    180190                last_upd_len = strlen(ti->last_update); 
    181                 sc_format_asn1_entry(asn1_toki + 10, ti->last_update, &last_upd_len, 1); 
     191                sc_format_asn1_entry(asn1_toki + 11, ti->last_update, &last_upd_len, 1); 
    182192        } else 
    183                 sc_format_asn1_entry(asn1_toki + 10, NULL, NULL, 0); 
    184         sc_format_asn1_entry(asn1_toki + 11, NULL, NULL, 0); 
     193                sc_format_asn1_entry(asn1_toki + 11, NULL, NULL, 0); 
     194        sc_format_asn1_entry(asn1_toki + 12, NULL, NULL, 0); 
    185195        sc_format_asn1_entry(asn1_tokeninfo, asn1_toki, NULL, 1); 
    186196