libicdlc
library for IC driving license card
|
00001 00099 #include "icdlcard.h" 00100 #include "scard.hpp" 00101 00102 #if defined(_MSC_VER) && 1000 < _MSC_VER 00103 #pragma once 00104 #endif 00105 00106 #ifndef ICDL_9209B7DD_A3F9_4F87_A420_F87EF1E179FD_INCLUDE_GUARD 00107 #define ICDL_9209B7DD_A3F9_4F87_A420_F87EF1E179FD_INCLUDE_GUARD 00108 00113 class icdl 00114 { 00115 static const uint32_t ID_MF = 0x00FF0000; 00116 static const uint32_t ID_DF1 = 0x00010000; 00117 static const uint32_t ID_DF2 = 0x00020000; 00118 static const uint32_t ID_DF3 = 0x00030000; 00119 00120 scard m_scard; 00121 bool m_sending; 00122 uint8_t m_result[2048]; 00123 size_t m_result_length; 00124 00125 00126 class scard_cb_type { 00127 icdl & inst; 00128 scard_cb_type & operator =(const scard_cb_type &); 00129 public: 00130 scard_cb_type(icdl & inst_); 00131 void operator()(const uint8_t* data, size_t length); 00132 }; 00133 00134 #pragma pack(push, 1) 00135 struct { 00136 uint32_t length; 00137 uint8_t * data; 00138 } m_data[0xFFFF]; 00139 #pragma pack(pop) 00140 00141 uint32_t m_selected_file; 00142 00143 bool m_pin_valid; 00144 bool m_prefetched; 00145 00146 char* m_code_buff; 00147 size_t m_code_len; 00148 00149 private: 00150 00151 void update(uint16_t tag, const uint8_t * data, size_t length); 00152 void read_file(uint32_t file_id, uint16_t elementary_file_id, void * buff, size_t * len); 00153 00154 00155 bool select_master_file(); 00156 00157 bool select_dedicated_file(const uint8_t * dedicated_file_id); 00158 00159 bool select_elementary_file(uint16_t elementary_file_id); 00160 00161 bool attestation(uint16_t elementary_file_id, uint16_t pin); 00162 00163 int get_allowed_match_count(uint16_t elementary_file_id); 00164 00165 bool read(uint16_t offset, void * buff, size_t * len); 00166 00167 00168 void prefetch(); 00169 00170 00171 const char * jis208_to_sjis(uint16_t tag, bool concat = false, size_t offset = 0, size_t length = ‾0); 00172 00173 ICDL_DATE_TYPE castDate(uint16_t tag, size_t offset = 0); 00174 00175 ICDL_EUDC_TYPE castEudc(uint16_t tag); 00176 00177 uint32_t castUint(uint16_t tag); 00178 00179 uint64_t castUint64(uint16_t tag); 00180 00181 public: 00182 00184 icdl(); 00185 00187 ‾icdl(); 00188 00195 bool connect(const char * reader_name); 00196 00202 bool disconnect(); 00203 00211 bool pin_auth(uint16_t pin1, uint16_t pin2); 00212 00218 int get_pin1_auth_rest(); 00219 00225 int get_pin2_auth_rest(); 00226 00232 bool connected() const; 00233 00234 00235 const char * get_name_raw() 00236 { prefetch(); return (const char*)m_data[TAG_NAME].data; } 00237 const char * get_name() 00238 { prefetch(); return jis208_to_sjis(TAG_NAME); } 00239 00240 00241 const char * get_phonetic_name_raw() 00242 { prefetch(); return (const char*)m_data[TAG_PHONETIC_NAME].data; } 00243 const char * get_phonetic_name() 00244 { prefetch(); return jis208_to_sjis(TAG_PHONETIC_NAME); } 00245 00246 00247 const char * get_alias_name_raw() 00248 { prefetch(); return (const char*)m_data[TAG_ALIAS_NAME].data; } 00249 const char * get_alias_name() 00250 { prefetch(); return jis208_to_sjis(TAG_ALIAS_NAME); } 00251 00252 00253 const char * get_unified_name_raw() 00254 { prefetch(); return (const char*)m_data[TAG_UNIFIED_NAME].data; } 00255 const char * get_unified_name() 00256 { prefetch(); return jis208_to_sjis(TAG_UNIFIED_NAME); } 00257 00258 00259 ICDL_DATE_TYPE get_birthday() 00260 { prefetch(); return castDate(TAG_BIRTHDAY); } 00261 00262 00263 const char * get_domicile_raw() 00264 { prefetch(); return (const char*)m_data[TAG_DOMICILE].data; } 00265 const char * get_domicile() 00266 { prefetch(); return jis208_to_sjis(TAG_DOMICILE); } 00267 00268 00269 ICDL_DATE_TYPE get_issue_date() 00270 { prefetch(); return castDate(TAG_ISSUE_DATE); } 00271 00272 00273 uint32_t get_reference_number() 00274 { prefetch(); return castUint(TAG_REFERENCE_NUMBER); } 00275 00276 00277 const char * get_license_color_raw() 00278 { prefetch(); return (const char*)m_data[TAG_LICENSE_COLOR].data; } 00279 const char * get_license_color() 00280 { prefetch(); return jis208_to_sjis(TAG_LICENSE_COLOR); } 00281 00282 00283 ICDL_DATE_TYPE get_expiration_date() 00284 { prefetch(); return castDate(TAG_EXPIRATION_DATE); } 00285 00286 00287 const char * get_license_requirement() 00288 { prefetch(); return jis208_to_sjis(TAG_LICENSE_REQUIREMENT1), 00289 jis208_to_sjis(TAG_LICENSE_REQUIREMENT2, true), 00290 jis208_to_sjis(TAG_LICENSE_REQUIREMENT3, true), 00291 jis208_to_sjis(TAG_LICENSE_REQUIREMENT4, true); } 00292 00293 00294 const char * get_license_requirement1_raw() 00295 { prefetch(); return (const char*)m_data[TAG_LICENSE_REQUIREMENT1].data; } 00296 const char * get_license_requirement1() 00297 { prefetch(); return jis208_to_sjis(TAG_LICENSE_REQUIREMENT1); } 00298 00299 00300 const char * get_license_requirement2_raw() 00301 { prefetch(); return (const char*)m_data[TAG_LICENSE_REQUIREMENT2].data; } 00302 const char * get_license_requirement2() 00303 { prefetch(); return jis208_to_sjis(TAG_LICENSE_REQUIREMENT2); } 00304 00305 00306 const char * get_license_requirement3_raw() 00307 { prefetch(); return (const char*)m_data[TAG_LICENSE_REQUIREMENT3].data; } 00308 const char * get_license_requirement3() 00309 { prefetch(); return jis208_to_sjis(TAG_LICENSE_REQUIREMENT3); } 00310 00311 00312 const char * get_license_requirement4_raw() 00313 { prefetch(); return (const char*)m_data[TAG_LICENSE_REQUIREMENT4].data; } 00314 const char * get_license_requirement4() 00315 { prefetch(); return jis208_to_sjis(TAG_LICENSE_REQUIREMENT4); } 00316 00317 00318 const char * get_police_authority_name_raw() 00319 { prefetch(); return (const char*)m_data[TAG_POLICE_AUTHORITY_NAME].data; } 00320 const char * get_police_authority_name() 00321 { prefetch(); return jis208_to_sjis(TAG_POLICE_AUTHORITY_NAME); } 00322 00323 00324 uint64_t get_license_number() 00325 { prefetch(); return castUint64(TAG_LICENSE_NUMBER); } 00326 00327 00328 ICDL_DATE_TYPE get_license_date_motorcycle_or_small_or_moped() 00329 { prefetch(); return castDate(TAG_LICENSE_DATE_MOTORCYCLE_OR_SMALL_OR_MOPED); } 00330 00331 00332 ICDL_DATE_TYPE get_license_date_misc() 00333 { prefetch(); return castDate(TAG_LICENSE_DATE_MISC); } 00334 00335 00336 ICDL_DATE_TYPE get_license_date_class_2() 00337 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2); } 00338 00339 00340 ICDL_DATE_TYPE get_license_date_large_sized_motor_vehicle() 00341 { prefetch(); return castDate(TAG_LICENSE_DATE_LARGE_SIZED_MOTOR_VEHICLE); } 00342 00343 00344 ICDL_DATE_TYPE get_license_date_motor_vehicle() 00345 { prefetch(); return castDate(TAG_LICENSE_DATE_MOTOR_VEHICLE); } 00346 00347 00348 ICDL_DATE_TYPE get_license_date_large_sized_special_motor_vehicle() 00349 { prefetch(); return castDate(TAG_LICENSE_DATE_LARGE_SIZED_SPECIAL_MOTOR_VEHICLE); } 00350 00351 00352 ICDL_DATE_TYPE get_license_date_large_sized_motorcycle() 00353 { prefetch(); return castDate(TAG_LICENSE_DATE_LARGE_SIZED_MOTORCYCLE); } 00354 00355 00356 ICDL_DATE_TYPE get_license_date_motorcycle() 00357 { prefetch(); return castDate(TAG_LICENSE_DATE_MOTORCYCLE); } 00358 00359 00360 ICDL_DATE_TYPE get_license_date_small_sized_special_motor_vehicle() 00361 { prefetch(); return castDate(TAG_LICENSE_DATE_SMALL_SIZED_SPECIAL_MOTOR_VEHICLE); } 00362 00363 00364 ICDL_DATE_TYPE get_license_date_moped() 00365 { prefetch(); return castDate(TAG_LICENSE_DATE_MOPED); } 00366 00367 00368 ICDL_DATE_TYPE get_license_date_towing() 00369 { prefetch(); return castDate(TAG_LICENSE_DATE_TOWING); } 00370 00371 00372 ICDL_DATE_TYPE get_license_date_class_2_large_sized_motor_vehicle() 00373 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2_LARGE_SIZED_MOTOR_VEHICLE); } 00374 00375 00376 ICDL_DATE_TYPE get_license_date_class_2_motor_vehicle() 00377 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2_MOTOR_VEHICLE); } 00378 00379 00380 ICDL_DATE_TYPE get_license_date_class_2_large_sized_special_motor_vehicle() 00381 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2_LARGE_SIZED_SPECIAL_MOTOR_VEHICLE); } 00382 00383 00384 ICDL_DATE_TYPE get_license_date_class_2_towing() 00385 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2_TOWING); } 00386 00387 00388 ICDL_DATE_TYPE get_license_date_midsize_motor_vehicle() 00389 { prefetch(); return castDate(TAG_LICENSE_DATE_MIDSIZE_MOTOR_VEHICLE); } 00390 00391 00392 ICDL_DATE_TYPE get_license_date_class_2_midsize_motor_vehicle() 00393 { prefetch(); return castDate(TAG_LICENSE_DATE_CLASS_2_MIDSIZE_MOTOR_VEHICLE); } 00394 00395 00396 const char * get_registered_domicile_raw() 00397 { prefetch(); return (const char*)m_data[TAG_REGISTERED_DOMICILE].data; } 00398 const char * get_registered_domicile() 00399 { prefetch(); return jis208_to_sjis(TAG_REGISTERED_DOMICILE); } 00400 00401 00402 ICDL_EUDC_TYPE get_eudc(uint16_t index = 0); 00403 00404 const unsigned char * get_photo() 00405 { prefetch(); return m_data[TAG_PHOTO].data; } 00406 size_t get_photo_length() 00407 { prefetch(); return m_data[TAG_PHOTO].length; } 00408 00409 00410 bool is_append_presents() 00411 { prefetch(); return m_data[TAG_APPEND_STATUS].length && 00412 APPEND_STATUS_MARKER == *m_data[TAG_APPEND_STATUS].data; } 00413 00414 00415 const char * get_append_domicile_police_authority_name_raw(uint16_t index = 0) 00416 { prefetch(); if( verify_append_domicile_police_authority_name(index, 1 + 7) ) { return NULL; } 00417 return (const char*)m_data[TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; } 00418 const int get_append_domicile_police_authority_name_jisx(uint16_t index = 0) 00419 { prefetch(); if( verify_append_domicile_police_authority_name(index, 0, 1) ) { return -1; } 00420 return (*m_data[TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 00421 (*m_data[TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index].data & 15); } 00422 ICDL_DATE_TYPE get_append_domicile_police_authority_name_date(uint16_t index = 0) 00423 { prefetch(); if( verify_append_domicile_police_authority_name(index, 1, 7) ) { return ICDL_DATE_TYPE(); } 00424 return castDate(TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index, 1); } 00425 const char * get_append_domicile_police_authority_name(uint16_t index = 0) 00426 { prefetch(); if( verify_append_domicile_police_authority_name(index, 1 + 7) ) { return NULL; } 00427 return jis208_to_sjis(TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7); } 00428 00429 00430 const char * get_append_new_name_raw(uint16_t index = 0) 00431 { prefetch(); if( verify_append_new_name(index, 1 + 7) ) { return NULL; } 00432 return (const char*)m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; } 00433 const int get_append_new_name_jisx(uint16_t index = 0) 00434 { prefetch(); if( verify_append_new_name(index, 0, 1) ) { return -1; } 00435 return (*m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 00436 (*m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); } 00437 ICDL_DATE_TYPE get_append_new_name_date(uint16_t index = 0) 00438 { prefetch(); if( verify_append_new_name(index, 1, 7) ) { return ICDL_DATE_TYPE(); } 00439 return castDate(TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index, 1); } 00440 const char * get_append_new_name(uint16_t index = 0) 00441 { prefetch(); if( verify_append_new_name(index, 1 + 7, m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; } 00442 return jis208_to_sjis(TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7, 00443 m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); } 00444 const char * get_append_new_name_police_authority_name(uint16_t index = 0) 00445 { prefetch(); if( verify_append_new_name(index, m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; } 00446 return jis208_to_sjis(TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index, false, 00447 m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); } 00448 00449 00450 const char * get_append_new_phonetic_name_raw(uint16_t index = 0) 00451 { prefetch(); if( verify_append_new_phonetic_name(index, 1 + 7) ) { return NULL; } 00452 return (const char*)m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; } 00453 const int get_append_new_phonetic_name_jisx(uint16_t index = 0) 00454 { prefetch(); if( verify_append_new_phonetic_name(index, 0, 1) ) { return -1; } 00455 return (*m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 00456 (*m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); } 00457 ICDL_DATE_TYPE get_append_new_phonetic_name_date(uint16_t index = 0) 00458 { prefetch(); if( verify_append_new_phonetic_name(index, 1, 7) ) { return ICDL_DATE_TYPE(); } 00459 return castDate(TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index, 1); } 00460 const char * get_append_new_phonetic_name(uint16_t index = 0) 00461 { prefetch(); if( verify_append_new_phonetic_name(index, 1 + 7, m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; } 00462 return jis208_to_sjis(TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7, 00463 m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); } 00464 const char * get_append_new_phonetic_name_police_authority_name(uint16_t index = 0) 00465 { prefetch(); if( verify_append_new_phonetic_name(index, m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; } 00466 return jis208_to_sjis(TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index, false, 00467 m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); } 00468 00469 00470 const char * get_append_new_domicile_raw(uint16_t index = 0) 00471 { prefetch(); if( verify_append_new_domicile(index, 1 + 7) ) { return NULL; } 00472 return (const char*)m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; } 00473 const int get_append_new_domicile_jisx(uint16_t index = 0) 00474 { prefetch(); if( verify_append_new_domicile(index, 0, 1) ) { return -1; } 00475 return (*m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 00476 (*m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); } 00477 ICDL_DATE_TYPE get_append_new_domicile_date(uint16_t index = 0) 00478 { prefetch(); if( verify_append_new_domicile(index, 1, 7) ) { return ICDL_DATE_TYPE(); } 00479 return castDate(TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, 1); } 00480 const char * get_append_new_domicile(uint16_t index = 0) 00481 { prefetch(); if( verify_append_new_domicile(index, 1 + 7, m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; } 00482 return jis208_to_sjis(TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7, 00483 m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); } 00484 const char * get_append_new_domicile_police_authority_name(uint16_t index = 0) 00485 { prefetch(); if( verify_append_new_domicile(index, m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; } 00486 return jis208_to_sjis(TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, false, 00487 m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); } 00488 00489 00490 const char * get_append_new_license_requirement_raw(uint16_t index = 0) 00491 { prefetch(); if( verify_append_new_license_requirement(index, 1 + 7) ) { return NULL; } 00492 return (const char*)m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; } 00493 const int get_append_new_license_requirement_jisx(uint16_t index = 0) 00494 { prefetch(); if( verify_append_new_license_requirement(index, 0, 1) ) { return -1; } 00495 return (*m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 00496 (*m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); } 00497 ICDL_DATE_TYPE get_append_new_license_requirement_date(uint16_t index = 0) 00498 { prefetch(); if( verify_append_new_license_requirement(index, 1, 7) ) { return ICDL_DATE_TYPE(); } 00499 return castDate(TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index, 1); } 00500 const char * get_append_new_license_requirement(uint16_t index = 0) 00501 { prefetch(); if( verify_append_new_license_requirement(index, 1 + 7, m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; } 00502 return jis208_to_sjis(TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7, 00503 m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); } 00504 const char * get_append_new_license_requirement_police_authority_name(uint16_t index = 0) 00505 { prefetch(); if( verify_append_new_license_requirement(index, m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; } 00506 return jis208_to_sjis(TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index, false, 00507 m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); } 00508 00509 00510 const char * get_append_condition_release_raw(uint16_t index = 0) 00511 { prefetch(); if( verify_append_condition_release(index, 1 + 7) ) { return NULL; } 00512 return (const char*)m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; } 00513 const int get_append_condition_release_jisx(uint16_t index = 0) 00514 { prefetch(); if( verify_append_condition_release(index, 0, 1) ) { return -1; } 00515 return (*m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 00516 (*m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); } 00517 ICDL_DATE_TYPE get_append_condition_release_date(uint16_t index = 0) 00518 { prefetch(); if( verify_append_condition_release(index, 1, 7) ) { return ICDL_DATE_TYPE(); } 00519 return castDate(TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index, 1); } 00520 const char * get_append_condition_release(uint16_t index = 0) 00521 { prefetch(); if( verify_append_condition_release(index, 1 + 7, m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; } 00522 return jis208_to_sjis(TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7, 00523 m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); } 00524 const char * get_append_condition_release_police_authority_name(uint16_t index = 0) 00525 { prefetch(); if( verify_append_condition_release(index, m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; } 00526 return jis208_to_sjis(TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index, false, 00527 m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); } 00528 00529 00530 const char * get_append_remark_raw(uint16_t index = 0) 00531 { prefetch(); if( verify_append_remark(index, 1 + 7) ) { return NULL; } 00532 return (const char*)m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; } 00533 const int get_append_remark_jisx(uint16_t index = 0) 00534 { prefetch(); if( verify_append_remark(index, 0, 1) ) { return -1; } 00535 return (*m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 00536 (*m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); } 00537 ICDL_DATE_TYPE get_append_remark_date(uint16_t index = 0) 00538 { prefetch(); if( verify_append_remark(index, 1, 7) ) { return ICDL_DATE_TYPE(); } 00539 return castDate(TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index, 1); } 00540 const char * get_append_remark(uint16_t index = 0) 00541 { prefetch(); if( verify_append_remark(index, 1 + 7, m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; } 00542 return jis208_to_sjis(TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7, 00543 m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); } 00544 const char * get_append_remark_police_authority_name(uint16_t index = 0) 00545 { prefetch(); if( verify_append_remark(index, m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; } 00546 return jis208_to_sjis(TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index, false, 00547 m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); } 00548 00549 00550 const char * get_append_spare_raw(uint16_t index = 0) 00551 { prefetch(); if( verify_append_spare(index, 1 + 7) ) { return NULL; } 00552 return (const char*)m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; } 00553 const int get_append_spare_jisx(uint16_t index = 0) 00554 { prefetch(); if( verify_append_spare(index, 0, 1) ) { return -1; } 00555 return (*m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 00556 (*m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); } 00557 ICDL_DATE_TYPE get_append_spare_date(uint16_t index = 0) 00558 { prefetch(); if( verify_append_spare(index, 1, 7) ) { return ICDL_DATE_TYPE(); } 00559 return castDate(TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index, 1); } 00560 const char * get_append_spare(uint16_t index = 0) 00561 { prefetch(); if( verify_append_spare(index, 1 + 7, m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; } 00562 return jis208_to_sjis(TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7, 00563 m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); } 00564 const char * get_append_spare_police_authority_name(uint16_t index = 0) 00565 { prefetch(); if( verify_append_spare(index, m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; } 00566 return jis208_to_sjis(TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index, false, 00567 m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); } 00568 00569 00570 bool is_append_registered_domicile_presents() 00571 { prefetch(); return m_data[TAG_REGISTERED_DOMICILE_APPEND_STATUS].length && 00572 APPEND_STATUS_MARKER == *m_data[TAG_REGISTERED_DOMICILE_APPEND_STATUS].data; } 00573 00574 00575 const char * get_append_registered_domicile_raw(uint16_t index = 0) 00576 { prefetch(); if( verify_append_registered_domicile(index, 1 + 7) ) { return NULL; } 00577 return (const char*)m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data + 1 + 7; } 00578 const int get_append_registered_domicile_jisx(uint16_t index = 0) 00579 { prefetch(); if( verify_append_registered_domicile(index, 0, 1) ) { return -1; } 00580 return (*m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data >> 4) * 10 + 00581 (*m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data & 15); } 00582 ICDL_DATE_TYPE get_append_registered_domicile_date(uint16_t index = 0) 00583 { prefetch(); if( verify_append_registered_domicile(index, 1, 7) ) { return ICDL_DATE_TYPE(); } 00584 return castDate(TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, 1); } 00585 const char * get_append_registered_domicile(uint16_t index = 0) 00586 { prefetch(); if( verify_append_registered_domicile(index, 1 + 7, m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7) ) { return NULL; } 00587 return jis208_to_sjis(TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, false, 1 + 7, 00588 m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2-1-7); } 00589 const char * get_append_registered_domicile_police_authority_name(uint16_t index = 0) 00590 { prefetch(); if( verify_append_registered_domicile(index, m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2) ) { return NULL; } 00591 return jis208_to_sjis(TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index, false, 00592 m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length - 5*2); } 00593 00594 00595 const unsigned char * get_check_code() 00596 { prefetch(); return m_data[TAG_CHECK_CODE].data; } 00597 size_t get_check_code_length() 00598 { prefetch(); return m_data[TAG_CHECK_CODE].length; } 00599 00600 00601 const char * get_serial_number() 00602 { prefetch(); return (const char*)m_data[TAG_SERIAL_NUMBER].data; } 00603 00604 00605 const char * get_publisher_name() 00606 { prefetch(); return (const char*)m_data[TAG_PUBLISHER_NAME].data; } 00607 00608 00609 const char * get_principal_name() 00610 { prefetch(); return (const char*)m_data[TAG_PRINCIPAL_NAME].data; } 00611 00612 00613 const unsigned char * get_principal_key_id() 00614 { prefetch(); return m_data[TAG_PRINCIPAL_KEY_ID].data; } 00615 size_t get_principal_key_id_length() 00616 { prefetch(); return m_data[TAG_PRINCIPAL_KEY_ID].length; } 00617 00618 private: 00619 00620 00621 bool verify_append_domicile_police_authority_name(uint16_t index, size_t offset, size_t length = 0) 00622 { return index < TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME8 - TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 && 00623 m_data[TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index].data && 00624 offset + length < m_data[TAG_APPEND_DOMICILE_POLICE_AUTHORITY_NAME1 + index].length; } 00625 00626 bool verify_append_new_name(uint16_t index, size_t offset, size_t length = 0) 00627 { return index < TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 && 00628 m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data && 00629 offset + length < m_data[TAG_APPEND_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length; } 00630 00631 00632 bool verify_append_new_phonetic_name(uint16_t index, size_t offset, size_t length = 0) 00633 { return index < TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 && 00634 m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].data && 00635 offset + length < m_data[TAG_APPEND_PHONETIC_NAME_AND_POLICE_AUTHORITY_NAME1 + index].length; } 00636 00637 00638 bool verify_append_new_domicile(uint16_t index, size_t offset, size_t length = 0) 00639 { return index < TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 && 00640 m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data && 00641 offset + length < m_data[TAG_APPEND_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length; } 00642 00643 00644 bool verify_append_new_license_requirement(uint16_t index, size_t offset, size_t length = 0) 00645 { return index < TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 && 00646 m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].data && 00647 offset + length < m_data[TAG_APPEND_LICENSE_REQUIREMENT_AND_POLICE_AUTHORITY_NAME1 + index].length; } 00648 00649 00650 bool verify_append_condition_release(uint16_t index, size_t offset, size_t length = 0) 00651 { return index < TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 && 00652 m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].data && 00653 offset + length < m_data[TAG_APPEND_CONDITION_RELEASE_AND_POLICE_AUTHORITY_NAME1 + index].length; } 00654 00655 00656 bool verify_append_remark(uint16_t index, size_t offset, size_t length = 0) 00657 { return index < TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 && 00658 m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].data && 00659 offset + length < m_data[TAG_APPEND_REMARK_AND_POLICE_AUTHORITY_NAME1 + index].length; } 00660 00661 00662 bool verify_append_spare(uint16_t index, size_t offset, size_t length = 0) 00663 { return index < TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME8 - TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 && 00664 m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].data && 00665 offset + length < m_data[TAG_APPEND_SPARE_AND_POLICE_AUTHORITY_NAME1 + index].length; } 00666 00667 00668 bool verify_append_registered_domicile(uint16_t index, size_t offset, size_t length = 0) 00669 { return index < TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME5 - TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 && 00670 m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].data && 00671 offset + length < m_data[TAG_APPEND_REGISTERED_DOMICILE_AND_POLICE_AUTHORITY_NAME1 + index].length; } 00672 }; 00673 00674 #endif