Changeset 3024
- Timestamp:
- 09/24/06 16:05:06 (2 years ago)
- Files:
-
- 1 modified
-
trunk/src/libopensc/pkcs15.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/libopensc/pkcs15.c
r2995 r3024 28 28 #include <ltdl.h> 29 29 30 static 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 }; 30 34 31 35 static const struct sc_asn1_entry c_asn1_toki[] = { … … 34 38 { "manufacturerID", SC_ASN1_UTF8STRING, SC_ASN1_TAG_UTF8STRING, SC_ASN1_OPTIONAL, NULL, NULL }, 35 39 { "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 }, 36 42 { "tokenflags", SC_ASN1_BIT_FIELD, SC_ASN1_TAG_BIT_STRING, 0, NULL, NULL }, 37 43 { "seInfo", SC_ASN1_SEQUENCE, SC_ASN1_CONS | SC_ASN1_TAG_SEQUENCE, SC_ASN1_OPTIONAL, NULL, NULL }, … … 64 70 size_t lupdate_len = sizeof(last_update) - 1; 65 71 size_t flags_len = sizeof(ti->flags); 66 struct sc_asn1_entry asn1_toki[1 3], asn1_tokeninfo[3];72 struct sc_asn1_entry asn1_toki[14], asn1_tokeninfo[3], asn1_twlabel[3]; 67 73 u8 preferred_language[3]; 68 74 size_t lang_length = sizeof(preferred_language); 69 75 70 76 memset(last_update, 0, sizeof(last_update)); 77 sc_copy_asn1_entry(c_asn1_twlabel, asn1_twlabel); 71 78 sc_copy_asn1_entry(c_asn1_toki, asn1_toki); 72 79 sc_copy_asn1_entry(c_asn1_tokeninfo, asn1_tokeninfo); 80 sc_format_asn1_entry(asn1_twlabel, label, &label_len, 0); 73 81 sc_format_asn1_entry(asn1_toki + 0, &ti->version, NULL, 0); 74 82 sc_format_asn1_entry(asn1_toki + 1, serial, &serial_len, 0); 75 83 sc_format_asn1_entry(asn1_toki + 2, mnfid, &mnfid_len, 0); 76 84 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); 79 87 sc_format_asn1_entry(asn1_toki + 6, NULL, NULL, 0); 80 88 sc_format_asn1_entry(asn1_toki + 7, NULL, NULL, 0); 81 89 sc_format_asn1_entry(asn1_toki + 8, NULL, NULL, 0); 82 90 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); 85 94 sc_format_asn1_entry(asn1_tokeninfo, asn1_toki, NULL, 0); 86 95 … … 111 120 } 112 121 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) 114 124 ti->label = strdup((char *) label); 115 125 else … … 118 128 return SC_ERROR_OUT_OF_MEMORY; 119 129 } 120 if (asn1_toki[1 0].flags & SC_ASN1_PRESENT) {130 if (asn1_toki[11].flags & SC_ASN1_PRESENT) { 121 131 ti->last_update = strdup((char *)last_update); 122 132 if (ti->last_update == NULL) 123 133 return SC_ERROR_OUT_OF_MEMORY; 124 134 } 125 if (asn1_toki[1 1].flags & SC_ASN1_PRESENT) {135 if (asn1_toki[12].flags & SC_ASN1_PRESENT) { 126 136 preferred_language[2] = 0; 127 137 ti->preferred_language = strdup((char *)preferred_language); … … 140 150 size_t serial_len, mnfid_len, label_len, flags_len, last_upd_len; 141 151 142 struct sc_asn1_entry asn1_toki[1 3], asn1_tokeninfo[2];152 struct sc_asn1_entry asn1_toki[14], asn1_tokeninfo[2]; 143 153 144 154 sc_copy_asn1_entry(c_asn1_toki, asn1_toki); … … 169 179 if (ti->flags) { 170 180 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); 172 182 } 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); 175 184 sc_format_asn1_entry(asn1_toki + 6, NULL, NULL, 0); 176 185 sc_format_asn1_entry(asn1_toki + 7, NULL, NULL, 0); 177 186 sc_format_asn1_entry(asn1_toki + 8, NULL, NULL, 0); 178 187 sc_format_asn1_entry(asn1_toki + 9, NULL, NULL, 0); 188 sc_format_asn1_entry(asn1_toki + 10, NULL, NULL, 0); 179 189 if (ti->last_update != NULL) { 180 190 last_upd_len = strlen(ti->last_update); 181 sc_format_asn1_entry(asn1_toki + 1 0, ti->last_update, &last_upd_len, 1);191 sc_format_asn1_entry(asn1_toki + 11, ti->last_update, &last_upd_len, 1); 182 192 } else 183 sc_format_asn1_entry(asn1_toki + 1 0, NULL, NULL, 0);184 sc_format_asn1_entry(asn1_toki + 1 1, 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); 185 195 sc_format_asn1_entry(asn1_tokeninfo, asn1_toki, NULL, 1); 186 196
