1// Passkey entry responder, negative reply on responding side:
2// - Test case not present in LMP.TS, but other permutations are described in SP/BV-14-C, SP/BV-15-C
3// - IUT is KeyboardOnly, responder
4// - Lower Tester is Display, initiator
5// - IUT fails passkey entry with User_Passkey_Request_NegativeReply, responds Not Accepted to the SimplePairingConfirm
6sequence! { procedure, context,
7    // ACL Connection Established
8    Lower Tester -> IUT: IoCapabilityReq {
9        transaction_id: 0,
10        io_capabilities: 0x00,
11        oob_authentication_data: 0x00,
12        authentication_requirement: 0x01,
13    }
14    IUT -> Upper Tester: IoCapabilityResponse {
15        bd_addr: context.peer_address(),
16        io_capability: IoCapability::DisplayOnly,
17        oob_data_present: OobDataPresent::NotPresent,
18        authentication_requirements: AuthenticationRequirements::NoBondingMitmProtection,
19    }
20    IUT -> Upper Tester: IoCapabilityRequest {
21        bd_addr: context.peer_address(),
22    }
23    Upper Tester -> IUT: IoCapabilityRequestReply {
24        bd_addr: context.peer_address(),
25        io_capability: IoCapability::KeyboardOnly,
26        oob_present: OobDataPresent::NotPresent,
27        authentication_requirements: AuthenticationRequirements::NoBondingMitmProtection,
28    }
29    IUT -> Upper Tester: IoCapabilityRequestReplyComplete {
30        num_hci_command_packets: 1,
31        status: ErrorCode::Success,
32        bd_addr: context.peer_address(),
33    }
34    IUT -> Lower Tester: IoCapabilityRes {
35        transaction_id: 0,
36        io_capabilities: 0x02,
37        oob_authentication_data: 0x00,
38        authentication_requirement: 0x01,
39    }
40    // Public Key Exchange
41    Lower Tester -> IUT: EncapsulatedHeader {
42        transaction_id: 0,
43        major_type: 1,
44        minor_type: 1,
45        payload_length: 48,
46    }
47    IUT -> Lower Tester: Accepted {
48        transaction_id: 0,
49        accepted_opcode: Opcode::EncapsulatedHeader,
50    }
51    repeat 3 times with (part in peer_p192_public_key()) {
52        Lower Tester -> IUT: EncapsulatedPayload {
53            transaction_id: 0,
54            data: part,
55        }
56        IUT -> Lower Tester: Accepted {
57            transaction_id: 0,
58            accepted_opcode: Opcode::EncapsulatedPayload,
59        }
60    }
61    IUT -> Lower Tester: EncapsulatedHeader {
62        transaction_id: 0,
63        major_type: 1,
64        minor_type: 1,
65        payload_length: 48,
66    }
67    Lower Tester -> IUT: Accepted {
68        transaction_id: 0,
69        accepted_opcode: Opcode::EncapsulatedHeader,
70    }
71    repeat 3 times with (part in local_p192_public_key(&context)) {
72        IUT -> Lower Tester: EncapsulatedPayload {
73            transaction_id: 0,
74            data: part,
75        }
76        Lower Tester -> IUT: Accepted {
77            transaction_id: 0,
78            accepted_opcode: Opcode::EncapsulatedPayload,
79        }
80    }
81    // Authentication Stage 1: Passkey Entry Protocol
82    IUT -> Upper Tester: UserPasskeyRequest {
83        bd_addr: context.peer_address(),
84    }
85    Upper Tester -> IUT: UserPasskeyRequestNegativeReply {
86        bd_addr: context.peer_address(),
87    }
88    IUT -> Upper Tester: UserPasskeyRequestNegativeReplyComplete {
89        num_hci_command_packets: 1,
90        status: ErrorCode::Success,
91        bd_addr: context.peer_address(),
92    }
93    Lower Tester -> IUT: SimplePairingConfirm {
94        transaction_id: 0,
95        commitment_value: [0; 16],
96    }
97    IUT -> Lower Tester: NotAccepted {
98        transaction_id: 0,
99        not_accepted_opcode: Opcode::SimplePairingConfirm,
100        error_code: ErrorCode::AuthenticationFailure.into(),
101    }
102    IUT -> Upper Tester: SimplePairingComplete {
103        status: ErrorCode::AuthenticationFailure,
104        bd_addr: context.peer_address(),
105    }
106}
107