use crate::command::{build, push, push_lv, BuildError, Capdu};
pub const P2_FIRST_TLV: u8 = 0x02;
pub const P2_NEXT_TLV: u8 = 0x03;
pub fn get_status(p1: u8, aid_qualifier: &[u8]) -> Result<Capdu, BuildError> {
get_status_p2(p1, P2_FIRST_TLV, aid_qualifier)
}
pub fn get_status_p2(p1: u8, p2: u8, aid_qualifier: &[u8]) -> Result<Capdu, BuildError> {
let mut data = Capdu::new();
push(&mut data, &[0x4F])?;
push_lv(&mut data, aid_qualifier)?;
build(0x80, 0xF2, p1, p2, &data, true)
}
#[cfg(test)]
mod tests {
use super::*;
use scll_test_util::HexSlice;
#[test]
fn isd_match_all_is_the_verified_4f00_form() {
let apdu = get_status(0x80, &[]).unwrap();
assert_eq!(
HexSlice(&apdu),
HexSlice([0x80, 0xF2, 0x80, 0x02, 0x02, 0x4F, 0x00, 0x00])
);
}
#[test]
fn qualifier_is_tlv_tagged_under_4f() {
let apdu = get_status(0x40, &[0xA0, 0x00]).unwrap();
assert_eq!(
HexSlice(&apdu),
HexSlice([0x80, 0xF2, 0x40, 0x02, 0x04, 0x4F, 0x02, 0xA0, 0x00, 0x00])
);
}
#[test]
fn oversized_qualifier_overflows_lc() {
let big = [0x11u8; 255];
assert_eq!(get_status(0x80, &big), Err(BuildError::Overflow));
}
#[test]
fn p2_next_form_paginates_with_03() {
let apdu = get_status_p2(0x40, P2_NEXT_TLV, &[]).unwrap();
assert_eq!(
HexSlice(&apdu),
HexSlice([0x80, 0xF2, 0x40, 0x03, 0x02, 0x4F, 0x00, 0x00])
);
}
#[test]
fn get_status_is_the_first_tlv_form_of_p2() {
for p1 in [0x80u8, 0x40, 0x20, 0x10] {
assert_eq!(get_status(p1, &[]), get_status_p2(p1, P2_FIRST_TLV, &[]));
}
}
}