libthai-idcard 0.2.0

A Rust library for reading Thai National ID smart cards via PC/SC
Documentation
//! APDU command bytes for Thai National ID smart card applets.
//! Reference: <https://github.com/chakphanu/ThaiNationalIDCard/blob/master/APDU.md>

/// APDU commands for the Personal Information applet (AID: A0 00 00 00 54 48 00 01).
pub mod personal {
    pub const SELECT: &[u8] = &[
        0x00, 0xA4, 0x04, 0x00, 0x08, 0xA0, 0x00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01,
    ];
    pub const CID: &[u8] = &[0x80, 0xB0, 0x00, 0x04, 0x02, 0x00, 0x0D];
    pub const NAME_THAI: &[u8] = &[0x80, 0xB0, 0x00, 0x11, 0x02, 0x00, 0x64];
    pub const NAME_EN: &[u8] = &[0x80, 0xB0, 0x00, 0x75, 0x02, 0x00, 0x64];
    pub const DOB: &[u8] = &[0x80, 0xB0, 0x00, 0xD9, 0x02, 0x00, 0x08];
    pub const GENDER: &[u8] = &[0x80, 0xB0, 0x00, 0xE1, 0x02, 0x00, 0x01];
    pub const CARD_ISSUER: &[u8] = &[0x80, 0xB0, 0x00, 0xF6, 0x02, 0x00, 0x64];
    pub const ISSUE_DATE: &[u8] = &[0x80, 0xB0, 0x01, 0x67, 0x02, 0x00, 0x08];
    pub const EXPIRE_DATE: &[u8] = &[0x80, 0xB0, 0x01, 0x6F, 0x02, 0x00, 0x08];
    pub const ADDRESS: &[u8] = &[0x80, 0xB0, 0x15, 0x79, 0x02, 0x00, 0x64];

    /// 20 READ BINARY commands (255 bytes each) to read the JPEG face image starting at offset 0x017B.
    pub const FACE_IMAGE: &[&[u8]; 20] = &[
        &[0x80, 0xB0, 0x01, 0x7B, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x02, 0x7A, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x03, 0x79, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x04, 0x78, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x05, 0x77, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x06, 0x76, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x07, 0x75, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x08, 0x74, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x09, 0x73, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x0A, 0x72, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x0B, 0x71, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x0C, 0x70, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x0D, 0x6F, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x0E, 0x6E, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x0F, 0x6D, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x10, 0x6C, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x11, 0x6B, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x12, 0x6A, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x13, 0x69, 0x02, 0x00, 0xFF],
        &[0x80, 0xB0, 0x14, 0x68, 0x02, 0x00, 0xFF],
    ];
}

/// APDU commands for the NHSO applet (AID: A0 00 00 00 54 48 00 83).
pub mod nhso {
    pub const SELECT: &[u8] = &[
        0x00, 0xA4, 0x04, 0x00, 0x08, 0xA0, 0x00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x83,
    ];
    pub const MAIN_INSCL: &[u8] = &[0x80, 0xB0, 0x00, 0x04, 0x02, 0x00, 0x3C];
    pub const SUB_INSCL: &[u8] = &[0x80, 0xB0, 0x00, 0x40, 0x02, 0x00, 0x64];
    pub const MAIN_HOSPITAL_NAME: &[u8] = &[0x80, 0xB0, 0x00, 0xA4, 0x02, 0x00, 0x50];
    pub const SUB_HOSPITAL_NAME: &[u8] = &[0x80, 0xB0, 0x00, 0xF4, 0x02, 0x00, 0x50];
    pub const PAID_TYPE: &[u8] = &[0x80, 0xB0, 0x01, 0x44, 0x02, 0x00, 0x01];
    pub const ISSUE_DATE: &[u8] = &[0x80, 0xB0, 0x01, 0x45, 0x02, 0x00, 0x08];
    pub const EXPIRE_DATE: &[u8] = &[0x80, 0xB0, 0x01, 0x4D, 0x02, 0x00, 0x08];
    pub const UPDATE_DATE: &[u8] = &[0x80, 0xB0, 0x01, 0x55, 0x02, 0x00, 0x08];
    pub const CHANGE_HOSPITAL_AMOUNT: &[u8] = &[0x80, 0xB0, 0x01, 0x5D, 0x02, 0x00, 0x01];
}

/// APDU commands for the Card Information applet (AID: A0 00 00 00 84 06 00 02).
pub mod card {
    pub const SELECT: &[u8] = &[
        0x00, 0xA4, 0x04, 0x00, 0x08, 0xA0, 0x00, 0x00, 0x00, 0x84, 0x06, 0x00, 0x02,
    ];
    pub const LASER_ID: &[u8] = &[0x80, 0x00, 0x00, 0x00, 0x07];
}