Skip to content

Commit 0293e62

Browse files
Merge pull request #81 from Nitrokey/command-response
Expand command-response tests
2 parents 56c4620 + 44e7d1d commit 0293e62

File tree

7 files changed

+759
-253
lines changed

7 files changed

+759
-253
lines changed
Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,40 @@
11
// Copyright (C) 2022 Nitrokey GmbH
22
// SPDX-License-Identifier: LGPL-3.0-only
33

4-
mod card;
4+
use openpgp_card::StatusBytes;
55
use test_log::test;
66

7+
mod card;
8+
79
use card::{error_to_retries, with_card};
810
use opcard::{DEFAULT_ADMIN_PIN, DEFAULT_USER_PIN};
911

12+
macro_rules! assert_checks {
13+
($tx:expr, $sign:expr, $user:expr, $admin:expr) => {{
14+
let sign_expected = $sign;
15+
let sign_retries = error_to_retries($tx.check_pw1_sign());
16+
assert_eq!(
17+
sign_retries, sign_expected,
18+
"Incorrect sign retries. Expected {:?}, got {:?}",
19+
sign_expected, sign_retries
20+
);
21+
let user_expected = $user;
22+
let user_retries = error_to_retries($tx.check_pw1_user());
23+
assert_eq!(
24+
user_retries, user_expected,
25+
"Incorrect user retries. Expected {:?}, got {:?}",
26+
user_expected, user_retries
27+
);
28+
let admin_expected = $admin;
29+
let admin_retries = error_to_retries($tx.check_pw3());
30+
assert_eq!(
31+
admin_retries, admin_expected,
32+
"Incorrect admin retries. Expected {:?}, got {:?}",
33+
admin_expected, admin_retries
34+
);
35+
}};
36+
}
37+
1038
#[test]
1139
fn change() {
1240
with_card(|mut card| {
@@ -71,6 +99,58 @@ fn change() {
7199
assert!(tx.verify_pw3(b"new pin2").is_ok());
72100
assert!(tx.verify_pw3(DEFAULT_ADMIN_PIN).is_err());
73101
assert!(tx.verify_pw3(b"new pin2").is_ok());
102+
103+
tx.set_resetting_code(&[0; 127]).unwrap();
104+
tx.set_resetting_code(&[0; 128]).unwrap_err();
105+
});
106+
card.reset();
107+
card.with_tx(|mut tx| {
108+
tx.reset_retry_counter_pw1(b"123456", Some(&[0; 127]))
109+
.unwrap();
110+
assert_checks!(tx, Some(3), Some(3), Some(3));
111+
tx.verify_pw1_user(b"123456").unwrap();
112+
});
113+
card.reset();
114+
card.with_tx(|mut tx| {
115+
assert!(tx.reset_retry_counter_pw1(b"new code", None).is_err());
116+
assert!(tx.verify_pw1_user(b"new code").is_err());
117+
assert_eq!(
118+
error_to_retries(tx.reset_retry_counter_pw1(b"new code", Some(b"12345678"))),
119+
Some(2)
120+
);
121+
let short_reset = tx.reset_retry_counter_pw1(b"short", Some(&[0; 127]));
122+
assert!(
123+
matches!(
124+
short_reset,
125+
Err(openpgp_card::Error::CardStatus(
126+
StatusBytes::IncorrectParametersCommandDataField
127+
))
128+
),
129+
"Got: {short_reset:?}"
130+
);
131+
assert_eq!(
132+
error_to_retries(tx.reset_retry_counter_pw1(b"new code", Some(b"12345678"))),
133+
Some(2)
134+
);
135+
assert!(tx.verify_pw1_user(b"new code").is_err());
136+
assert_eq!(
137+
error_to_retries(tx.reset_retry_counter_pw1(b"new code", Some(b"12345678"))),
138+
Some(1)
139+
);
140+
assert!(tx.verify_pw1_user(b"new code").is_err());
141+
assert_eq!(
142+
error_to_retries(tx.reset_retry_counter_pw1(b"new code", Some(b"12345678"))),
143+
Some(0)
144+
);
145+
assert!(tx.verify_pw1_user(b"new code").is_err());
146+
assert_eq!(
147+
error_to_retries(tx.reset_retry_counter_pw1(b"new code", Some(b"12345678"))),
148+
Some(0)
149+
);
150+
assert!(tx.verify_pw1_user(b"new code").is_err());
151+
tx.reset_retry_counter_pw1(b"123456", Some(b"1234567890"))
152+
.unwrap_err();
153+
assert!(tx.verify_pw1_user(b"new code").is_err());
74154
});
75155
});
76156
}

tests/command-response.ron

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// Copyright (C) 2022 Nitrokey GmbH
2+
// SPDX-License-Identifier: LGPL-3.0-only
3+
4+
[
5+
IoTest(
6+
name: "GET CHALLENGE",
7+
cmd_resp: [
8+
IoData(
9+
input: "00 84 0000 0A",
10+
output: And([NonZero, Len(0x0A)])
11+
),
12+
IoData(
13+
input: "00 84 0000 00 0400",
14+
output: And([NonZero, Len(0x0400)])
15+
)
16+
]
17+
),
18+
IoTest(
19+
name: "AES",
20+
cmd_resp: [
21+
VerifyDefaultPw3,
22+
VerifyDefaultPw1,
23+
ImportKey(
24+
key: "FFEEDDCCBBAA00998877665544332211FFEEDDCCBBAA00998877665544332211",
25+
key_kind: Aes,
26+
),
27+
// Encrypt with AES
28+
IoData(
29+
input: "00 2A 86 80 10 00112233445566778899AABBCCDDEEFF 00",
30+
output: Data("02 d9d2ca17e160427aee649db6912dbfad"),
31+
),
32+
Decrypt(
33+
key_kind: Aes,
34+
input: "d9d2ca17e160427aee649db6912dbfad",
35+
output: "00112233445566778899AABBCCDDEEFF"
36+
)
37+
38+
]
39+
),
40+
IoTest(
41+
name: "X25519 import",
42+
cmd_resp: [
43+
VerifyDefaultPw3,
44+
VerifyDefaultPw1,
45+
SetAttributes (key_type: Dec, key_kind: X25519),
46+
ImportKey(
47+
key: "2a2cb91da5fb77b12a99c0eb872f4cdf4566b25172c1163c7da518730a6d0777",
48+
key_type: Dec,
49+
key_kind: X25519,
50+
),
51+
ReadKey(
52+
public_key: "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a",
53+
key_kind: X25519,
54+
key_type: Dec,
55+
),
56+
Decrypt(
57+
key_kind: X25519,
58+
input: "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f",
59+
output: "4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742"
60+
)
61+
]
62+
),
63+
IoTest(
64+
name: "Ed25519 import",
65+
cmd_resp: [
66+
VerifyDefaultPw3,
67+
VerifyDefaultPw1,
68+
SetAttributes (key_type: Sign, key_kind: Ed25519),
69+
ImportKey(
70+
key: "833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42",
71+
key_type: Sign,
72+
key_kind: Ed25519,
73+
),
74+
ReadKey(
75+
public_key: "ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf",
76+
key_kind: Ed25519,
77+
key_type: Sign,
78+
),
79+
]
80+
),
81+
IoTest(
82+
name: "X25519 import",
83+
cmd_resp: [
84+
VerifyDefaultPw3,
85+
VerifyDefaultPw1,
86+
SetAttributes (key_type: Dec, key_kind: X25519),
87+
ImportKey(
88+
key: "56ca9c48fec3ef2874f3e4c39730a7014da61cf77f50af086998957102837b00",
89+
key_type: Dec,
90+
key_kind: X25519,
91+
),
92+
ReadKey(
93+
public_key: "38B64BB09D88839BDC98DB56CF640ED80D3618E5A7EF2FA6EAD6DDDF1D3CB642",
94+
key_kind: X25519,
95+
key_type: Dec,
96+
),
97+
]
98+
),
99+
]

0 commit comments

Comments
 (0)