use super::replay;
use crate::{
AppPermissions, FileCommunication, FileIo, FilePermissions, FileSettings, Key, KeyCount,
KeyPermissions, Permissions,
};
const TEST_STRING: &[u8] = b"\
Had I the heavens' embroidered cloths,
Enwrought with golden and silver light,
The blue and the dim and the dark cloths
Of night and light and the half light,
I would spread the cloths under your feet:
But I, being poor, have only my dreams;
I have spread my dreams under your feet;
Tread softly because you tread on my dreams.
";
replay!(file_io, "file_io.replay", |card| {
let mut out = [0; 0xffff];
let mut card = card
.authenticate_with_rnd_a(
0x00,
Key::Des([0; 8]),
Key::Des(hex_literal::hex!("32 c2 8f da fd 39 60 de")),
)
.await
.unwrap();
let key_settings = Permissions {
app: AppPermissions {
can_change_key_settings: true,
can_change_picc_key: true,
anyone_can_delete: false,
anyone_can_list: false,
},
key: KeyPermissions::RequiresPicc,
};
let key_count = KeyCount::Aes(1);
card.create_application([1, 2, 3], key_settings, key_count)
.await
.unwrap();
let card = card.select_application([1, 2, 3]).await.unwrap();
let mut card = card
.authenticate_with_rnd_a(
0x00,
Key::Aes([0; 16]),
Key::Aes(hex_literal::hex!(
"c6 b7 81 42 8d 97 88 37 a6 36 08 99 11 9f 0d a4"
)),
)
.await
.unwrap();
card.create_file(
0x01,
FileSettings::Data {
communication: FileCommunication::Plain,
permissions: FilePermissions {
change: 0x00,
read_write: 0x00,
write: 0x00,
read: 0x00,
},
size: TEST_STRING.len() as u32,
},
)
.await
.unwrap();
card.create_file(
0x02,
FileSettings::Data {
communication: FileCommunication::Cmac,
permissions: FilePermissions {
change: 0x00,
read_write: 0x00,
write: 0x00,
read: 0x00,
},
size: TEST_STRING.len() as u32,
},
)
.await
.unwrap();
card.create_file(
0x03,
FileSettings::Data {
communication: FileCommunication::Encrypted,
permissions: FilePermissions {
change: 0x00,
read_write: 0x00,
write: 0x00,
read: 0x00,
},
size: TEST_STRING.len() as u32,
},
)
.await
.unwrap();
for fid in [0x01, 0x02, 0x03] {
let FileSettings::Data {
communication,
size,
..
} = card.get_file_settings(fid).await.unwrap()
else {
panic!("not a data file?");
};
card.write_file_at(fid, communication, 0, TEST_STRING)
.await
.unwrap();
card.read_file_at(&mut out, fid, communication, 0, size)
.await
.unwrap();
}
});