1.. _bluetooth_mesh_provisioning:
2
3Provisioning
4############
5
6Provisioning is the process of adding devices to a mesh network. It requires
7two devices operating in the following roles:
8
9* The *provisioner* represents the network owner, and is responsible for
10  adding new nodes to the mesh network.
11* The *provisionee* is the device that gets added to the network through the
12  Provisioning process. Before the provisioning process starts, the
13  provisionee is an *unprovisioned device*.
14
15The Provisioning module in the Zephyr Bluetooth mesh stack supports both the
16Advertising and GATT Provisioning bearers for the provisionee role, as well as
17the Advertising Provisioning bearer for the provisioner role.
18
19The Provisioning process
20************************
21
22All Bluetooth mesh nodes must be provisioned before they can participate in a
23Bluetooth mesh network. The Provisioning API provides all the functionality
24necessary for a device to become a provisioned mesh node.
25Provisioning is a five-step process, involving the following steps:
26
27* Beaconing
28* Invitation
29* Public key exchange
30* Authentication
31* Provisioning data transfer
32
33Beaconing
34=========
35
36To start the provisioning process, the unprovisioned device must first start
37broadcasting the Unprovisioned Beacon. This makes it visible to nearby
38provisioners, which can initiate the provisioning. To indicate that the device
39needs to be provisioned, call :c:func:`bt_mesh_prov_enable`. The device
40starts broadcasting the Unprovisioned Beacon with the device UUID and the
41``OOB information`` field, as specified in the ``prov`` parameter passed to
42:c:func:`bt_mesh_init`. Additionally, a Uniform Resource Identifier (URI)
43may be specified, which can point the provisioner to the location of some Out
44Of Band information, such as the device's public key or an authentication
45value database. The URI is advertised in a separate beacon, with a URI hash
46included in the unprovisioned beacon, to tie the two together.
47
48
49Uniform Resource Identifier
50---------------------------
51
52The Uniform Resource Identifier shall follow the format specified in the
53Bluetooth Core Specification Supplement. The URI must start with a URI scheme,
54encoded as a single utf-8 data point, or the special ``none`` scheme, encoded
55as ``0x01``. The available schemes are listed on the `Bluetooth website
56<https://www.bluetooth.com/specifications/assigned-numbers/uri-scheme-name-string-mapping/>`_.
57
58Examples of encoded URIs:
59
60.. list-table:: URI encoding examples
61
62  * - URI
63    - Encoded
64  * - ``http://example.com``
65    - ``\x16//example.com``
66  * - ``https://www.zephyrproject.org/``
67    - ``\x17//www.zephyrproject.org/``
68  * - ``just a string``
69    - ``\x01just a string``
70
71Provisioning invitation
72=======================
73
74The provisioner initiates the Provisioning process by sending a Provisioning
75invitation. The invitations prompts the provisionee to call attention to
76itself using the Health Server
77:ref:`bluetooth_mesh_models_health_srv_attention`, if available.
78
79The Unprovisioned device automatically responds to the invite by presenting a
80list of its capabilities, including the supported Out of Band Authentication
81methods.
82
83Public key exchange
84===================
85
86Before the provisioning process can begin, the provisioner and the unprovisioned
87device exchange public keys, either in-band or Out of Band (OOB).
88
89In-band public key exchange is a part of the provisioning process and always
90supported by the unprovisioned device and provisioner.
91
92If the application wants to support public key exchange via OOB, it needs to
93provide public and private keys to the mesh stack. The unprovisioned device
94will reflect this in its capabilities. The provisioner obtains the public key
95via any available OOB mechanism (e.g. the device may advertise a packet
96containing the public key or it can be encoded in a QR code printed on the
97device packaging). Note that even if the unprovisioned device has specified
98the public key for the Out of Band exchange, the provisioner may choose to
99exchange the public key in-band if it can't retrieve the public key via OOB
100mechanism. In this case, a new key pair will be generated by the mesh stack
101for each Provisioning process.
102
103To enable support of OOB public key on the unprovisioned device side,
104:kconfig:`CONFIG_BT_MESH_PROV_OOB_PUBLIC_KEY` needs to be enabled. The
105application must provide public and private keys before the Provisioning
106process is started by initializing pointers to
107:c:member:`bt_mesh_prov.public_key_be`
108and :c:member:`bt_mesh_prov.private_key_be`. The keys needs to be
109provided in big-endian bytes order.
110
111To provide the device's public key obtained via OOB,
112call :c:func:`bt_mesh_prov_remote_pub_key_set` on the provisioner side.
113
114Authentication
115==============
116
117After the initial exchange, the provisioner selects an Out of Band (OOB)
118Authentication method. This allows the user to confirm that the device the
119provisioner connected to is actually the device they intended, and not a
120malicious third party.
121
122The Provisioning API supports the following authentication methods for the
123provisionee:
124
125* **Static OOB:** An authentication value is assigned to the device in
126  production, which the provisioner can query in some application specific
127  way.
128* **Input OOB:** The user inputs the authentication value. The available input
129  actions are listed in :c:enum:`bt_mesh_input_action_t`.
130* **Output OOB:** Show the user the authentication value. The available output
131  actions are listed in :c:enum:`bt_mesh_output_action_t`.
132
133The application must provide callbacks for the supported authentication
134methods in :c:struct:`bt_mesh_prov`, as well as enabling the supported actions
135in :c:member:`bt_mesh_prov.output_actions` and
136:c:member:`bt_mesh_prov.input_actions`.
137
138When an Output OOB action is selected, the authentication value should be
139presented to the user when the output callback is called, and remain until the
140:c:member:`bt_mesh_prov.input_complete` or :c:member:`bt_mesh_prov.complete`
141callback is called. If the action is ``blink``, ``beep`` or ``vibrate``, the
142sequence should be repeated after a delay of three seconds or more.
143
144When an Input OOB action is selected, the user should be prompted when the
145application receives the :c:member:`bt_mesh_prov.input` callback. The user
146response should be fed back to the Provisioning API through
147:c:func:`bt_mesh_input_string` or :c:func:`bt_mesh_input_number`. If
148no user response is recorded within 60 seconds, the Provisioning process is
149aborted.
150
151Data transfer
152=============
153
154After the device has been successfully authenticated, the provisioner
155transfers the Provisioning data:
156
157* Unicast address
158* A network key
159* IV index
160* Network flags
161
162  * Key refresh
163  * IV update
164
165Additionally, a device key is generated for the node. All this data is stored
166by the mesh stack, and the provisioning :c:member:`bt_mesh_prov.complete`
167callback gets called.
168
169Provisioning security
170*********************
171
172Depending on the choice of public key exchange mechanism and authentication method,
173the provisioning process can be secure or insecure.
174
175On May 24th 2021, ANSSI `disclosed <https://kb.cert.org/vuls/id/799380>`_
176a set of vulnerabilities in the Bluetooth mesh provisioning protocol that showcased
177how the low entropy provided by the Blink, Vibrate, Push, Twist and
178Input/Output numeric OOB methods could be exploited in impersonation and MITM
179attacks. In response, the Bluetooth SIG has reclassified these OOB methods as
180insecure in the Mesh Profile specification `erratum 16350 <https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=516072>`_,
181as AuthValue may be brute forced in real time. To ensure secure provisioning, applications
182should use a static OOB value and OOB public key transfer.
183
184API reference
185*************
186
187.. doxygengroup:: bt_mesh_prov
188