1sequence! { procedure, context,
2    // ACL Connection Established
3    Upper Tester -> IUT: AuthenticationRequested {
4        connection_handle: context.peer_handle()
5    }
6    IUT -> Upper Tester: AuthenticationRequestedStatus {
7       num_hci_command_packets: 1,
8       status: ErrorCode::Success,
9    }
10    IUT -> Upper Tester: LinkKeyRequest {
11        bd_addr: context.peer_address(),
12    }
13    Upper Tester -> IUT: LinkKeyRequestNegativeReply {
14        bd_addr: context.peer_address(),
15    }
16    IUT -> Upper Tester: LinkKeyRequestNegativeReplyComplete {
17       num_hci_command_packets: 1,
18       status: ErrorCode::Success,
19       bd_addr: context.peer_address(),
20    }
21    IUT -> Upper Tester: IoCapabilityRequest {
22        bd_addr: context.peer_address(),
23    }
24    Upper Tester -> IUT: IoCapabilityRequestReply {
25        bd_addr: context.peer_address(),
26        io_capability: IoCapability::KeyboardOnly,
27        oob_present: OobDataPresent::NotPresent,
28        authentication_requirements: AuthenticationRequirements::NoBondingMitmProtection,
29    }
30    IUT -> Upper Tester: IoCapabilityRequestReplyComplete {
31        num_hci_command_packets: 1,
32        status: ErrorCode::Success,
33        bd_addr: context.peer_address(),
34    }
35    IUT -> Lower Tester: IoCapabilityReq {
36        transaction_id: 0,
37        io_capabilities: 0x02,
38        oob_authentication_data: 0x00,
39        authentication_requirement: 0x01,
40    }
41    Lower Tester -> IUT: IoCapabilityRes {
42        transaction_id: 0,
43        io_capabilities: 0x00,
44        oob_authentication_data: 0x00,
45        authentication_requirement: 0x01,
46    }
47    IUT -> Upper Tester: IoCapabilityResponse {
48        bd_addr: context.peer_address(),
49        io_capability: IoCapability::DisplayOnly,
50        oob_data_present: OobDataPresent::NotPresent,
51        authentication_requirements: AuthenticationRequirements::NoBondingMitmProtection,
52    }
53    // Public Key Exchange
54    IUT -> Lower Tester: EncapsulatedHeader {
55        transaction_id: 0,
56        major_type: 1,
57        minor_type: 1,
58        payload_length: 48,
59    }
60    Lower Tester -> IUT: Accepted {
61        transaction_id: 0,
62        accepted_opcode: Opcode::EncapsulatedHeader,
63    }
64    repeat 3 times with (part in local_p192_public_key(&context)) {
65        IUT -> Lower Tester: EncapsulatedPayload {
66            transaction_id: 0,
67            data: part,
68        }
69        Lower Tester -> IUT: Accepted {
70            transaction_id: 0,
71            accepted_opcode: Opcode::EncapsulatedPayload,
72        }
73    }
74    Lower Tester -> IUT: EncapsulatedHeader {
75        transaction_id: 0,
76        major_type: 1,
77        minor_type: 1,
78        payload_length: 48,
79    }
80    IUT -> Lower Tester: Accepted {
81        transaction_id: 0,
82        accepted_opcode: Opcode::EncapsulatedHeader,
83    }
84    repeat 3 times with (part in peer_p192_public_key()) {
85        Lower Tester -> IUT: EncapsulatedPayload {
86            transaction_id: 0,
87            data: part,
88        }
89        IUT -> Lower Tester: Accepted {
90            transaction_id: 0,
91            accepted_opcode: Opcode::EncapsulatedPayload,
92        }
93    }
94    // Authentication Stage 1: Passkey Entry Protocol
95    IUT -> Upper Tester: UserPasskeyRequest {
96        bd_addr: context.peer_address(),
97    }
98    Upper Tester -> IUT: UserPasskeyRequestReply {
99        bd_addr: context.peer_address(),
100        numeric_value: 0,
101    }
102    IUT -> Upper Tester: UserPasskeyRequestReplyComplete {
103        num_hci_command_packets: 1,
104        status: ErrorCode::Success,
105        bd_addr: context.peer_address(),
106    }
107    repeat 20 times {
108        IUT -> Lower Tester: SimplePairingConfirm {
109            transaction_id: 0,
110            commitment_value: [0; 16],
111        }
112        Lower Tester -> IUT: SimplePairingConfirm {
113            transaction_id: 0,
114            commitment_value: [0; 16],
115        }
116        IUT -> Lower Tester: SimplePairingNumber {
117            transaction_id: 0,
118            nonce: [0; 16],
119        }
120        Lower Tester -> IUT: Accepted {
121            transaction_id: 0,
122            accepted_opcode: Opcode::SimplePairingNumber,
123        }
124        Lower Tester -> IUT: SimplePairingNumber {
125            transaction_id: 0,
126            nonce: [0; 16],
127        }
128        IUT -> Lower Tester: Accepted {
129            transaction_id: 0,
130            accepted_opcode: Opcode::SimplePairingNumber,
131        }
132    }
133    // Authentication Stage 2
134    IUT -> Lower Tester: DhkeyCheck {
135        transaction_id: 0,
136        confirmation_value: [0; 16],
137    }
138    Lower Tester -> IUT: Accepted { transaction_id: 0, accepted_opcode: Opcode::DhkeyCheck }
139    Lower Tester -> IUT: DhkeyCheck {
140        transaction_id: 0,
141        confirmation_value: [0; 16],
142    }
143    IUT -> Lower Tester: Accepted { transaction_id: 0, accepted_opcode: Opcode::DhkeyCheck }
144    IUT -> Upper Tester: SimplePairingComplete {
145        status: ErrorCode::Success,
146        bd_addr: context.peer_address(),
147    }
148    // Link Key Calculation
149    IUT -> Lower Tester: AuRand {
150        transaction_id: 0,
151        random_number: [0; 16],
152    }
153    Lower Tester -> IUT: Sres {
154        transaction_id: 0,
155        authentication_rsp: [0; 4],
156    }
157    Lower Tester -> IUT: AuRand {
158        transaction_id: 0,
159        random_number: [0; 16],
160    }
161    IUT -> Lower Tester: Sres {
162        transaction_id: 0,
163        authentication_rsp: [0; 4],
164    }
165    IUT -> Upper Tester: LinkKeyNotification {
166        bd_addr: context.peer_address(),
167        key_type: KeyType::AuthenticatedP192,
168        link_key: [0; 16],
169    }
170    IUT -> Upper Tester: AuthenticationComplete {
171        status: ErrorCode::Success,
172        connection_handle: context.peer_handle(),
173    }
174}
175