1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
|
# Copyright 2022 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
include <uapi/asm/ioctl.h>
include <uapi/linux/fcntl.h>
include <net/nfc/nci.h>
resource fd_nci[fd]
resource nfc_dev_id[int32]
openat$nci(fd const[AT_FDCWD], file ptr[in, string["/dev/virtual_nci"]], flags const[O_RDWR], mode const[0]) fd_nci (automatic_helper)
ioctl$IOCTL_GET_NCIDEV_IDX(fd fd_nci, cmd const[IOCTL_GET_NCIDEV_IDX], arg ptr[out, nfc_dev_id]) (automatic_helper)
read$nci(fd fd_nci, data ptr[out, array[int8]], len bytesize[data])
write$nci(fd fd_nci, data ptr[in, nci_frame], len bytesize[data])
define IOCTL_GET_NCIDEV_IDX 0
define NCI_OP_CORE_RESET_RSP_OID nci_opcode_oid(NCI_OP_CORE_RESET_RSP)
define NCI_OP_CORE_INIT_RSP_OID nci_opcode_oid(NCI_OP_CORE_INIT_RSP)
define NCI_OP_CORE_SET_CONFIG_RSP_OID nci_opcode_oid(NCI_OP_CORE_SET_CONFIG_RSP)
define NCI_OP_CORE_CONN_CREATE_RSP_OID nci_opcode_oid(NCI_OP_CORE_CONN_CREATE_RSP)
define NCI_OP_CORE_CONN_CLOSE_RSP_OID nci_opcode_oid(NCI_OP_CORE_CONN_CLOSE_RSP)
define NCI_OP_RF_DISCOVER_MAP_RSP_OID nci_opcode_oid(NCI_OP_RF_DISCOVER_MAP_RSP)
define NCI_OP_RF_DISCOVER_RSP_OID nci_opcode_oid(NCI_OP_RF_DISCOVER_RSP)
define NCI_OP_RF_DISCOVER_SELECT_RSP_OID nci_opcode_oid(NCI_OP_RF_DISCOVER_SELECT_RSP)
define NCI_OP_RF_DEACTIVATE_RSP_OID nci_opcode_oid(NCI_OP_RF_DEACTIVATE_RSP)
define NCI_OP_NFCEE_DISCOVER_RSP_OID nci_opcode_oid(NCI_OP_NFCEE_DISCOVER_RSP)
define NCI_OP_NFCEE_MODE_SET_RSP_OID nci_opcode_oid(NCI_OP_NFCEE_MODE_SET_RSP)
define NCI_OP_CORE_RESET_NTF_OID nci_opcode_oid(NCI_OP_CORE_RESET_NTF)
define NCI_OP_CORE_CONN_CREDITS_NTF_OID nci_opcode_oid(NCI_OP_CORE_CONN_CREDITS_NTF)
define NCI_OP_CORE_GENERIC_ERROR_NTF_OID nci_opcode_oid(NCI_OP_CORE_GENERIC_ERROR_NTF)
define NCI_OP_CORE_INTF_ERROR_NTF_OID nci_opcode_oid(NCI_OP_CORE_INTF_ERROR_NTF)
define NCI_OP_RF_DISCOVER_NTF_OID nci_opcode_oid(NCI_OP_RF_DISCOVER_NTF)
define NCI_OP_RF_INTF_ACTIVATED_NTF_OID nci_opcode_oid(NCI_OP_RF_INTF_ACTIVATED_NTF)
define NCI_OP_RF_DEACTIVATE_NTF_OID nci_opcode_oid(NCI_OP_RF_DEACTIVATE_NTF)
define NCI_OP_NFCEE_DISCOVER_NTF_OID nci_opcode_oid(NCI_OP_NFCEE_DISCOVER_NTF)
define NCI_OP_RF_NFCEE_ACTION_NTF_OID nci_opcode_oid(NCI_OP_RF_NFCEE_ACTION_NTF)
# The exact error code does not matter much (only ok/not ok).
type nci_status int8[0:1]
nci_frame [
DATA nci_data_hdr
NCI_GID_PROPRIETARY_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_PROPRIETARY, 0, array[int8]]
NCI_OP_CORE_RESET_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_CORE, NCI_OP_CORE_RESET_RSP_OID, nci_core_reset_rsp]
NCI_OP_CORE_INIT_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_CORE, NCI_OP_CORE_INIT_RSP_OID, nci_core_init_rsp]
NCI_OP_CORE_INIT_RSP_V2 nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_CORE, NCI_OP_CORE_INIT_RSP_OID, nci_core_init_rsp_nci_ver2]
NCI_OP_CORE_SET_CONFIG_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_CORE, NCI_OP_CORE_SET_CONFIG_RSP_OID, nci_core_set_config_rsp]
NCI_OP_CORE_CONN_CREATE_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_CORE, NCI_OP_CORE_CONN_CREATE_RSP_OID, nci_core_conn_create_rsp]
NCI_OP_CORE_CONN_CLOSE_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_CORE, NCI_OP_CORE_CONN_CLOSE_RSP_OID, nci_status]
NCI_OP_RF_DISCOVER_MAP_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_RF_MGMT, NCI_OP_RF_DISCOVER_MAP_RSP_OID, nci_status]
NCI_OP_RF_DISCOVER_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_RF_MGMT, NCI_OP_RF_DISCOVER_RSP_OID, nci_status]
NCI_OP_RF_DISCOVER_SELECT_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_RF_MGMT, NCI_OP_RF_DISCOVER_SELECT_RSP_OID, nci_status]
NCI_OP_RF_DEACTIVATE_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_RF_MGMT, NCI_OP_RF_DEACTIVATE_RSP_OID, nci_status]
NCI_OP_NFCEE_DISCOVER_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_NFCEE_MGMT, NCI_OP_NFCEE_DISCOVER_RSP_OID, nci_nfcee_discover_rsp]
NCI_OP_NFCEE_MODE_SET_RSP nci_ctrl_hdr[NCI_MT_RSP_PKT, NCI_GID_NFCEE_MGMT, NCI_OP_NFCEE_MODE_SET_RSP_OID, nci_status]
NCI_GID_PROPRIETARY_NFT nci_ctrl_hdr[NCI_MT_NTF_PKT, NCI_GID_PROPRIETARY, 0, array[int8]]
NCI_OP_CORE_RESET_NTF nci_ctrl_hdr[NCI_MT_NTF_PKT, NCI_GID_CORE, NCI_OP_CORE_RESET_NTF_OID, nci_core_reset_ntf]
NCI_OP_CORE_CONN_CREDITS_NTF nci_ctrl_hdr[NCI_MT_NTF_PKT, NCI_GID_CORE, NCI_OP_CORE_CONN_CREDITS_NTF_OID, nci_core_conn_credit_ntf]
NCI_OP_CORE_GENERIC_ERROR_NTF nci_ctrl_hdr[NCI_MT_NTF_PKT, NCI_GID_CORE, NCI_OP_CORE_GENERIC_ERROR_NTF_OID, nci_status]
NCI_OP_CORE_INTF_ERROR_NTF nci_ctrl_hdr[NCI_MT_NTF_PKT, NCI_GID_CORE, NCI_OP_CORE_INTF_ERROR_NTF_OID, nci_core_intf_error_ntf]
NCI_OP_RF_DISCOVER_NTF nci_ctrl_hdr[NCI_MT_NTF_PKT, NCI_GID_RF_MGMT, NCI_OP_RF_DISCOVER_NTF_OID, nci_rf_discover_ntf_t]
NCI_OP_RF_INTF_ACTIVATED_NTF nci_ctrl_hdr[NCI_MT_NTF_PKT, NCI_GID_RF_MGMT, NCI_OP_RF_INTF_ACTIVATED_NTF_OID, nci_rf_intf_activated_ntf_t]
NCI_OP_RF_DEACTIVATE_NTF nci_ctrl_hdr[NCI_MT_NTF_PKT, NCI_GID_RF_MGMT, NCI_OP_RF_DEACTIVATE_NTF_OID, nci_rf_deactivate_ntf]
NCI_OP_RF_NFCEE_ACTION_NTF nci_ctrl_hdr[NCI_MT_NTF_PKT, NCI_GID_RF_MGMT, NCI_OP_RF_NFCEE_ACTION_NTF_OID, void]
NCI_OP_NFCEE_DISCOVER_NTF nci_ctrl_hdr[NCI_MT_NTF_PKT, NCI_GID_NFCEE_MGMT, NCI_OP_NFCEE_DISCOVER_NTF_OID, nci_nfcee_discover_ntf]
] [varlen]
nci_data_hdr {
conn_id int8:4[0:4]
# NCI_PBF_LAST/NCI_PBF_CONT
pbf int8:1
# This does not seem to be used.
mt const[NCI_MT_DATA_PKT, int8:3]
# This does not seem to be used.
rfu const[0, int8]
# It does not seem to be actually used/verified by the code (only logged), so let's keep random.
plen int8
data array[int8]
} [packed]
type nci_ctrl_hdr[MT, GID, OID, PAYLOAD] {
gid const[GID, int8:4]
# NCI_PBF_LAST/NCI_PBF_CONT
pbf int8:1
mt const[MT, int8:3]
oid const[OID, int8]
# It does not seem to be actually used/verified by the code (only logged), so let's keep random.
plen int8
payload PAYLOAD
} [packed]
nci_core_reset_rsp {
status nci_status
nci_ver flags[nci_ver, int8]
config_status int8
} [packed]
nci_ver = 0, 1, NCI_VER_2_MASK
nci_core_init_rsp {
rsp1 nci_core_init_rsp_1
rsp2 nci_core_init_rsp_2
} [packed]
nci_core_init_rsp_1 {
status nci_status
nfcc_features int32
num_supported_rf_interfaces len[supported_rf_interfaces, int8]
supported_rf_interfaces array[int8]
} [packed]
nci_core_init_rsp_2 {
max_logical_connections int8
max_routing_table_size int16
max_ctrl_pkt_payload_len int8
max_size_for_large_params int16
manufact_id int8
manufact_specific_info int32
} [packed]
nci_core_init_rsp_nci_ver2 {
status nci_status
nfcc_features int32
max_logical_connections int8
max_routing_table_size int16
max_ctrl_pkt_payload_len int8
max_data_pkt_hci_payload_len int8
number_of_hci_credit int8
max_nfc_v_frame_size int16
num_supported_rf_interfaces len[supported_rf_interfaces, int8]
supported_rf_interfaces array[int8]
} [packed]
nci_core_set_config_rsp {
status nci_status
num_params len[params_id, int8]
params_id array[int8]
} [packed]
nci_core_conn_create_rsp {
status nci_status
max_ctrl_pkt_payload_len int8
credits_cnt int8
conn_id int8[0:4]
} [packed]
nci_nfcee_discover_rsp {
status nci_status
num_nfcee int8
} [packed]
nci_core_reset_ntf {
reset_trigger int8
config_status int8
nci_ver flags[nci_ver, int8]
manufact_id int8
manufacturer_specific_len int8
manufact_specific_info int32
} [packed]
nci_core_conn_credit_ntf {
num_entries len[conn_entries, int8]
conn_entries array[conn_credit_entry]
} [packed]
conn_credit_entry {
conn_id int8[0:4]
credits int8
} [packed]
nci_core_intf_error_ntf {
status nci_status
conn_id int8[0:4]
} [packed]
nci_rf_discover_ntf_t [
a nci_rf_discover_ntf[NCI_NFC_A_PASSIVE_POLL_MODE, rf_tech_specific_params_nfca_poll]
b nci_rf_discover_ntf[NCI_NFC_B_PASSIVE_POLL_MODE, rf_tech_specific_params_nfcb_poll]
f nci_rf_discover_ntf[NCI_NFC_F_PASSIVE_POLL_MODE, rf_tech_specific_params_nfcf_poll]
v nci_rf_discover_ntf[NCI_NFC_V_PASSIVE_POLL_MODE, rf_tech_specific_params_nfcv_poll]
] [varlen]
type nci_rf_discover_ntf[MODE, POLL] {
rf_discovery_id int8
rf_protocol flags[nci_rf_protocol, int8]
rf_tech_and_mode const[MODE, int8]
rf_tech_specific_params_len int8
poll POLL
ntf_type flags[nci_discover_ntf_type, int8]
} [packed]
nci_rf_protocol = NCI_RF_PROTOCOL_UNKNOWN, NCI_RF_PROTOCOL_T1T, NCI_RF_PROTOCOL_T2T, NCI_RF_PROTOCOL_T3T, NCI_RF_PROTOCOL_ISO_DEP, NCI_RF_PROTOCOL_NFC_DEP, NCI_RF_PROTOCOL_T5T
rf_tech_specific_params_nfca_poll {
sens_res int8
nfcid1_len len[nfcid1, int8]
nfcid1 array[int8]
sel_res_len int8
sel_res int8
} [packed]
rf_tech_specific_params_nfcb_poll {
sensb_res_len len[sensb_res, int8]
sensb_res array[int8]
} [packed]
rf_tech_specific_params_nfcf_listen {
local_nfcid2_len len[local_nfcid2, int8]
local_nfcid2 array[int8]
} [packed]
rf_tech_specific_params_nfcf_poll {
bit_rate int8
sensf_res_len len[sensf_res, int8]
sensf_res array[int8]
} [packed]
rf_tech_specific_params_nfcv_poll {
res_flags int8
dsfid int8
uid array[int8, NFC_ISO15693_UID_MAXSIZE]
} [packed]
nci_rf_intf_activated_ntf_t [
a nci_rf_intf_activated_ntf[NCI_NFC_A_PASSIVE_POLL_MODE, rf_tech_specific_params_nfca_poll]
b nci_rf_intf_activated_ntf[NCI_NFC_B_PASSIVE_POLL_MODE, rf_tech_specific_params_nfcb_poll]
f nci_rf_intf_activated_ntf[NCI_NFC_F_PASSIVE_POLL_MODE, rf_tech_specific_params_nfcf_poll]
v nci_rf_intf_activated_ntf[NCI_NFC_V_PASSIVE_POLL_MODE, rf_tech_specific_params_nfcv_poll]
a_listen nci_rf_intf_activated_ntf[NCI_NFC_A_PASSIVE_LISTEN_MODE, void]
f_listen nci_rf_intf_activated_ntf[NCI_NFC_F_PASSIVE_LISTEN_MODE, rf_tech_specific_params_nfcf_listen]
] [varlen]
type nci_rf_intf_activated_ntf[MODE, POLL] {
rf_discovery_id int8
rf_interface flags[nci_rf_interface, int8]
rf_protocol flags[nci_rf_protocol, int8]
activation_rf_tech_and_mode const[MODE, int8]
max_data_pkt_payload_size int8
initial_num_credits int8
rf_tech_specific_params_len int8
poll POLL
data_exch_rf_tech_and_mode int8
data_exch_tx_bit_rate int8
data_exch_rx_bit_rate int8
activation_params_len int8
# This is how all of activation_params_nfca_poll_iso_dep, activation_params_nfcb_poll_iso_dep,
# activation_params_poll_nfc_dep and activation_params_listen_nfc_dep look like.
res_len len[res, int8]
res array[int8]
} [packed]
nci_rf_interface = NCI_RF_INTERFACE_NFCEE_DIRECT, NCI_RF_INTERFACE_FRAME, NCI_RF_INTERFACE_ISO_DEP, NCI_RF_INTERFACE_NFC_DEP
nci_rf_deactivate_ntf {
type int8
reason int8
} [packed]
nci_nfcee_discover_ntf {
nfcee_id int8
nfcee_status int8
unused array[int8]
} [packed]
nci_discover_ntf_type = NCI_DISCOVER_NTF_TYPE_LAST, NCI_DISCOVER_NTF_TYPE_LAST_NFCC, NCI_DISCOVER_NTF_TYPE_MORE
|