From dd69f716ddce73ff73f6b38ba7199f1e078482ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= Date: Thu, 8 Dec 2022 15:55:29 +0100 Subject: [PATCH] Add command_response tests for PUT DATA --- src/commands.rs | 5 +++- tests/command_response.ron | 41 ++++++++++++++++++++++++++++++ tests/command_response.rs | 52 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 1 deletion(-) diff --git a/src/commands.rs b/src/commands.rs index 36944f6..1566d09 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -273,7 +273,10 @@ impl<'data> TryFrom<&'data [u8]> for PutData<'data> { }; let (tag, inner, rem) = take_do(rem).ok_or_else(|| { - warn!("Failed to parse PUT DATA's second field: {:02x?}", data); + warn!( + "Failed to parse PUT DATA's second field: {:02x?}, {:02x?}", + data, rem + ); Status::IncorrectDataParameter })?; diff --git a/tests/command_response.ron b/tests/command_response.ron index 5c167cb..5044c1c 100644 --- a/tests/command_response.ron +++ b/tests/command_response.ron @@ -85,5 +85,46 @@ output: Len(70), ) ] + ), + IoTest( + name: "PUT DATA", + cmd_resp: [ + GetData( + input: "5C 01 7E", + output: Data("7e 12 4f 0b a000000308000010000100 5f2f 02 4000") + ), + GetData( + input: "5C 03 5FC102", + output: Len(61) + ), + PutData( + input: "5C 03 5FC102 53 10 000102030405060708090A0B0C0D0E0F", + expected_status: SecurityStatusNotSatisfied + ), + GetData( + input: "5C 03 5FC102", + output: Len(61) + ), + AuthenticateManagement( + key: ( + algorithm: Tdes, + key: "0102030405060708 0102030405060708 0102030405060708" + ) + ), + PutData( + input: "5C 03 5FC102 53 10 000102030405060708090A0B0C0D0E0F", + ), + GetData( + input: "5C 03 5FC102", + output: Data("53 10 000102030405060708090A0B0C0D0E0F") + ), + PutData( + input: "5C 01 7E 53 10 000102030405060708090A0B0C0D0E0F", + ), + GetData( + input: "5C 01 7E", + output: Data("7e 10 000102030405060708090A0B0C0D0E0F") + ), + ] ) ] diff --git a/tests/command_response.rs b/tests/command_response.rs index 4526238..62a3629 100644 --- a/tests/command_response.rs +++ b/tests/command_response.rs @@ -258,6 +258,20 @@ enum IoCmd { #[serde(default)] expected_status: Status, }, + GetData { + input: String, + #[serde(default)] + output: OutputMatcher, + #[serde(default)] + expected_status: Status, + }, + PutData { + input: String, + #[serde(default)] + output: OutputMatcher, + #[serde(default)] + expected_status: Status, + }, VerifyDefaultApplicationPin { #[serde(default)] expected_status: Status, @@ -292,6 +306,16 @@ impl IoCmd { output, expected_status, } => Self::run_iodata(input, output, *expected_status, card), + Self::GetData { + input, + output, + expected_status, + } => Self::run_get_data(input, output, *expected_status, card), + Self::PutData { + input, + output, + expected_status, + } => Self::run_put_data(input, output, *expected_status, card), Self::VerifyDefaultApplicationPin { expected_status } => { Self::run_verify_default_application_pin(*expected_status, card) } @@ -373,6 +397,34 @@ impl IoCmd { Self::run_bytes(&parse_hex(input), output, expected_status, card); } + fn run_get_data( + input: &str, + output: &OutputMatcher, + expected_status: Status, + card: &mut setup::Piv, + ) { + Self::run_bytes( + &build_command(0x00, 0xCB, 0x3F, 0xFF, &parse_hex(input), 0), + output, + expected_status, + card, + ); + } + + fn run_put_data( + input: &str, + output: &OutputMatcher, + expected_status: Status, + card: &mut setup::Piv, + ) { + Self::run_bytes( + &build_command(0x00, 0xDB, 0x3F, 0xFF, &parse_hex(input), 0), + output, + expected_status, + card, + ); + } + fn run_authenticate_management( alg: Algorithm, key: &str,