139beb93cSSam Lefflerhostapd and Wi-Fi Protected Setup (WPS) 239beb93cSSam Leffler======================================= 339beb93cSSam Leffler 439beb93cSSam LefflerThis document describes how the WPS implementation in hostapd can be 539beb93cSSam Lefflerconfigured and how an external component on an AP (e.g., web UI) is 639beb93cSSam Lefflerused to enable enrollment of client devices. 739beb93cSSam Leffler 839beb93cSSam Leffler 939beb93cSSam LefflerIntroduction to WPS 1039beb93cSSam Leffler------------------- 1139beb93cSSam Leffler 1239beb93cSSam LefflerWi-Fi Protected Setup (WPS) is a mechanism for easy configuration of a 1339beb93cSSam Lefflerwireless network. It allows automated generation of random keys (WPA 1439beb93cSSam Lefflerpassphrase/PSK) and configuration of an access point and client 1539beb93cSSam Lefflerdevices. WPS includes number of methods for setting up connections 1639beb93cSSam Lefflerwith PIN method and push-button configuration (PBC) being the most 1739beb93cSSam Lefflercommonly deployed options. 1839beb93cSSam Leffler 1939beb93cSSam LefflerWhile WPS can enable more home networks to use encryption in the 2039beb93cSSam Lefflerwireless network, it should be noted that the use of the PIN and 2139beb93cSSam Lefflerespecially PBC mechanisms for authenticating the initial key setup is 2239beb93cSSam Lefflernot very secure. As such, use of WPS may not be suitable for 2339beb93cSSam Lefflerenvironments that require secure network access without chance for 2439beb93cSSam Lefflerallowing outsiders to gain access during the setup phase. 2539beb93cSSam Leffler 2639beb93cSSam LefflerWPS uses following terms to describe the entities participating in the 2739beb93cSSam Lefflernetwork setup: 2839beb93cSSam Leffler- access point: the WLAN access point 2939beb93cSSam Leffler- Registrar: a device that control a network and can authorize 3039beb93cSSam Leffler addition of new devices); this may be either in the AP ("internal 3139beb93cSSam Leffler Registrar") or in an external device, e.g., a laptop, ("external 3239beb93cSSam Leffler Registrar") 3339beb93cSSam Leffler- Enrollee: a device that is being authorized to use the network 3439beb93cSSam Leffler 3539beb93cSSam LefflerIt should also be noted that the AP and a client device may change 3639beb93cSSam Lefflerroles (i.e., AP acts as an Enrollee and client device as a Registrar) 3739beb93cSSam Lefflerwhen WPS is used to configure the access point. 3839beb93cSSam Leffler 3939beb93cSSam Leffler 4039beb93cSSam LefflerMore information about WPS is available from Wi-Fi Alliance: 4139beb93cSSam Lefflerhttp://www.wi-fi.org/wifi-protected-setup 4239beb93cSSam Leffler 4339beb93cSSam Leffler 4439beb93cSSam Lefflerhostapd implementation 4539beb93cSSam Leffler---------------------- 4639beb93cSSam Leffler 4739beb93cSSam Lefflerhostapd includes an optional WPS component that can be used as an 4839beb93cSSam Lefflerinternal WPS Registrar to manage addition of new WPS enabled clients 4939beb93cSSam Lefflerto the network. In addition, WPS Enrollee functionality in hostapd can 5039beb93cSSam Lefflerbe used to allow external WPS Registrars to configure the access 5139beb93cSSam Lefflerpoint, e.g., for initial network setup. In addition, hostapd can proxy a 5239beb93cSSam LefflerWPS registration between a wireless Enrollee and an external Registrar 5339beb93cSSam Leffler(e.g., Microsoft Vista or Atheros JumpStart) with UPnP. 5439beb93cSSam Leffler 5539beb93cSSam Leffler 5639beb93cSSam Lefflerhostapd configuration 5739beb93cSSam Leffler--------------------- 5839beb93cSSam Leffler 5939beb93cSSam LefflerWPS is an optional component that needs to be enabled in hostapd build 6039beb93cSSam Lefflerconfiguration (.config). Here is an example configuration that 61*5b9c547cSRui Pauloincludes WPS support and uses nl80211 driver interface: 6239beb93cSSam Leffler 63*5b9c547cSRui PauloCONFIG_DRIVER_NL80211=y 6439beb93cSSam LefflerCONFIG_WPS=y 6539beb93cSSam LefflerCONFIG_WPS_UPNP=y 6639beb93cSSam Leffler 67f05cddf9SRui PauloFollowing parameter can be used to enable support for NFC config method: 68f05cddf9SRui Paulo 69f05cddf9SRui PauloCONFIG_WPS_NFC=y 70f05cddf9SRui Paulo 7139beb93cSSam Leffler 7239beb93cSSam LefflerFollowing section shows an example runtime configuration 7339beb93cSSam Leffler(hostapd.conf) that enables WPS: 7439beb93cSSam Leffler 7539beb93cSSam Leffler# Configure the driver and network interface 76*5b9c547cSRui Paulodriver=nl80211 77*5b9c547cSRui Paulointerface=wlan0 7839beb93cSSam Leffler 7939beb93cSSam Leffler# WPA2-Personal configuration for the AP 8039beb93cSSam Lefflerssid=wps-test 8139beb93cSSam Lefflerwpa=2 8239beb93cSSam Lefflerwpa_key_mgmt=WPA-PSK 8339beb93cSSam Lefflerwpa_pairwise=CCMP 8439beb93cSSam Leffler# Default WPA passphrase for legacy (non-WPS) clients 8539beb93cSSam Lefflerwpa_passphrase=12345678 8639beb93cSSam Leffler# Enable random per-device PSK generation for WPS clients 8739beb93cSSam Leffler# Please note that the file has to exists for hostapd to start (i.e., create an 8839beb93cSSam Leffler# empty file as a starting point). 8939beb93cSSam Lefflerwpa_psk_file=/etc/hostapd.psk 9039beb93cSSam Leffler 9139beb93cSSam Leffler# Enable control interface for PBC/PIN entry 9239beb93cSSam Lefflerctrl_interface=/var/run/hostapd 9339beb93cSSam Leffler 9439beb93cSSam Leffler# Enable internal EAP server for EAP-WSC (part of Wi-Fi Protected Setup) 9539beb93cSSam Lefflereap_server=1 9639beb93cSSam Leffler 9739beb93cSSam Leffler# WPS configuration (AP configured, do not allow external WPS Registrars) 9839beb93cSSam Lefflerwps_state=2 9939beb93cSSam Lefflerap_setup_locked=1 10039beb93cSSam Leffler# If UUID is not configured, it will be generated based on local MAC address. 10139beb93cSSam Leffleruuid=87654321-9abc-def0-1234-56789abc0000 10239beb93cSSam Lefflerwps_pin_requests=/var/run/hostapd.pin-req 10339beb93cSSam Lefflerdevice_name=Wireless AP 10439beb93cSSam Lefflermanufacturer=Company 10539beb93cSSam Lefflermodel_name=WAP 10639beb93cSSam Lefflermodel_number=123 10739beb93cSSam Lefflerserial_number=12345 10839beb93cSSam Lefflerdevice_type=6-0050F204-1 10939beb93cSSam Leffleros_version=01020300 11039beb93cSSam Lefflerconfig_methods=label display push_button keypad 11139beb93cSSam Leffler 11239beb93cSSam Leffler# if external Registrars are allowed, UPnP support could be added: 11339beb93cSSam Leffler#upnp_iface=br0 11439beb93cSSam Leffler#friendly_name=WPS Access Point 11539beb93cSSam Leffler 11639beb93cSSam Leffler 11739beb93cSSam LefflerExternal operations 11839beb93cSSam Leffler------------------- 11939beb93cSSam Leffler 12039beb93cSSam LefflerWPS requires either a device PIN code (usually, 8-digit number) or a 12139beb93cSSam Lefflerpushbutton event (for PBC) to allow a new WPS Enrollee to join the 12239beb93cSSam Lefflernetwork. hostapd uses the control interface as an input channel for 12339beb93cSSam Lefflerthese events. 12439beb93cSSam Leffler 125f05cddf9SRui PauloThe PIN value used in the commands must be processed by an UI to 126f05cddf9SRui Pauloremove non-digit characters and potentially, to verify the checksum 127f05cddf9SRui Paulodigit. "hostapd_cli wps_check_pin <PIN>" can be used to do such 128f05cddf9SRui Pauloprocessing. It returns FAIL if the PIN is invalid, or FAIL-CHECKSUM if 129f05cddf9SRui Paulothe checksum digit is incorrect, or the processed PIN (non-digit 130f05cddf9SRui Paulocharacters removed) if the PIN is valid. 131f05cddf9SRui Paulo 13239beb93cSSam LefflerWhen a client device (WPS Enrollee) connects to hostapd (WPS 13339beb93cSSam LefflerRegistrar) in order to start PIN mode negotiation for WPS, an 13439beb93cSSam Leffleridentifier (Enrollee UUID) is sent. hostapd will need to be configured 13539beb93cSSam Lefflerwith a device password (PIN) for this Enrollee. This is an operation 13639beb93cSSam Lefflerthat requires user interaction (assuming there are no pre-configured 13739beb93cSSam LefflerPINs on the AP for a set of Enrollee). 13839beb93cSSam Leffler 13939beb93cSSam LefflerThe PIN request with information about the device is appended to the 14039beb93cSSam Lefflerwps_pin_requests file (/var/run/hostapd.pin-req in this example). In 14139beb93cSSam Leffleraddition, hostapd control interface event is sent as a notification of 14239beb93cSSam Lefflera new device. The AP could use, e.g., a web UI for showing active 14339beb93cSSam LefflerEnrollees to the user and request a PIN for an Enrollee. 14439beb93cSSam Leffler 14539beb93cSSam LefflerThe PIN request file has one line for every Enrollee that connected to 14639beb93cSSam Lefflerthe AP, but for which there was no PIN. Following information is 14739beb93cSSam Lefflerprovided for each Enrollee (separated with tabulators): 14839beb93cSSam Leffler- timestamp (seconds from 1970-01-01) 14939beb93cSSam Leffler- Enrollee UUID 15039beb93cSSam Leffler- MAC address 15139beb93cSSam Leffler- Device name 15239beb93cSSam Leffler- Manufacturer 15339beb93cSSam Leffler- Model Name 15439beb93cSSam Leffler- Model Number 15539beb93cSSam Leffler- Serial Number 15639beb93cSSam Leffler- Device category 15739beb93cSSam Leffler 15839beb93cSSam LefflerExample line in the /var/run/hostapd.pin-req file: 15939beb93cSSam Leffler1200188391 53b63a98-d29e-4457-a2ed-094d7e6a669c Intel(R) Centrino(R) Intel Corporation Intel(R) Centrino(R) - - 1-0050F204-1 16039beb93cSSam Leffler 16139beb93cSSam LefflerControl interface data: 16239beb93cSSam LefflerWPS-PIN-NEEDED [UUID-E|MAC Address|Device Name|Manufacturer|Model Name|Model Number|Serial Number|Device Category] 16339beb93cSSam LefflerFor example: 16439beb93cSSam Leffler<2>WPS-PIN-NEEDED [53b63a98-d29e-4457-a2ed-094d7e6a669c|02:12:34:56:78:9a|Device|Manuf|Model|Model Number|Serial Number|1-0050F204-1] 16539beb93cSSam Leffler 16639beb93cSSam LefflerWhen the user enters a PIN for a pending Enrollee, e.g., on the web 16739beb93cSSam LefflerUI), hostapd needs to be notified of the new PIN over the control 16839beb93cSSam Lefflerinterface. This can be done either by using the UNIX domain socket 16939beb93cSSam Leffler-based control interface directly (src/common/wpa_ctrl.c provides 17039beb93cSSam Lefflerhelper functions for using the interface) or by calling hostapd_cli. 17139beb93cSSam Leffler 17239beb93cSSam LefflerExample command to add a PIN (12345670) for an Enrollee: 17339beb93cSSam Leffler 17439beb93cSSam Lefflerhostapd_cli wps_pin 53b63a98-d29e-4457-a2ed-094d7e6a669c 12345670 17539beb93cSSam Leffler 17639beb93cSSam LefflerIf the UUID-E is not available (e.g., Enrollee waits for the Registrar 1773157ba21SRui Pauloto be selected before connecting), wildcard UUID may be used to allow 1783157ba21SRui Paulothe PIN to be used once with any UUID: 17939beb93cSSam Leffler 18039beb93cSSam Lefflerhostapd_cli wps_pin any 12345670 18139beb93cSSam Leffler 1823157ba21SRui PauloTo reduce likelihood of PIN being used with other devices or of 1833157ba21SRui Pauloforgetting an active PIN available for potential attackers, expiration 184f05cddf9SRui Paulotime in seconds can be set for the new PIN (value 0 indicates no 185f05cddf9SRui Pauloexpiration): 1863157ba21SRui Paulo 1873157ba21SRui Paulohostapd_cli wps_pin any 12345670 300 1883157ba21SRui Paulo 189f05cddf9SRui PauloIf the MAC address of the enrollee is known, it should be configured 190f05cddf9SRui Pauloto allow the AP to advertise list of authorized enrollees: 191f05cddf9SRui Paulo 192f05cddf9SRui Paulohostapd_cli wps_pin 53b63a98-d29e-4457-a2ed-094d7e6a669c \ 193f05cddf9SRui Paulo 12345670 300 00:11:22:33:44:55 194f05cddf9SRui Paulo 19539beb93cSSam Leffler 19639beb93cSSam LefflerAfter this, the Enrollee can connect to the AP again and complete WPS 19739beb93cSSam Lefflernegotiation. At that point, a new, random WPA PSK is generated for the 19839beb93cSSam Lefflerclient device and the client can then use that key to connect to the 19939beb93cSSam LefflerAP to access the network. 20039beb93cSSam Leffler 20139beb93cSSam Leffler 20239beb93cSSam LefflerIf the AP includes a pushbutton, WPS PBC mode can be used. It is 20339beb93cSSam Lefflerenabled by pushing a button on both the AP and the client at about the 20439beb93cSSam Lefflersame time (2 minute window). hostapd needs to be notified about the AP 20539beb93cSSam Lefflerbutton pushed event over the control interface, e.g., by calling 20639beb93cSSam Lefflerhostapd_cli: 20739beb93cSSam Leffler 20839beb93cSSam Lefflerhostapd_cli wps_pbc 20939beb93cSSam Leffler 21039beb93cSSam LefflerAt this point, the client has two minutes to complete WPS negotiation 21139beb93cSSam Lefflerwhich will generate a new WPA PSK in the same way as the PIN method 21239beb93cSSam Lefflerdescribed above. 21339beb93cSSam Leffler 21439beb93cSSam Leffler 215e28a4053SRui PauloWhen an external Registrar is used, the AP can act as an Enrollee and 216e28a4053SRui Paulouse its AP PIN. A static AP PIN (e.g., one one a label in the AP 217e28a4053SRui Paulodevice) can be configured in hostapd.conf (ap_pin parameter). A more 218e28a4053SRui Paulosecure option is to use hostapd_cli wps_ap_pin command to enable the 219e28a4053SRui PauloAP PIN only based on user action (and even better security by using a 220e28a4053SRui Paulorandom AP PIN for each session, i.e., by using "wps_ap_pin random" 221e28a4053SRui Paulocommand with a timeout value). Following commands are available for 222e28a4053SRui Paulomanaging the dynamic AP PIN operations: 223e28a4053SRui Paulo 224e28a4053SRui Paulohostapd_cli wps_ap_pin disable 225e28a4053SRui Paulo- disable AP PIN (i.e., do not allow external Registrars to use it to 226e28a4053SRui Paulo learn the current AP settings or to reconfigure the AP) 227e28a4053SRui Paulo 228e28a4053SRui Paulohostapd_cli wps_ap_pin random [timeout] 229e28a4053SRui Paulo- generate a random AP PIN and enable it 230e28a4053SRui Paulo- if the optional timeout parameter is given, the AP PIN will be enabled 231e28a4053SRui Paulo for the specified number of seconds 232e28a4053SRui Paulo 233e28a4053SRui Paulohostapd_cli wps_ap_pin get 234e28a4053SRui Paulo- fetch the current AP PIN 235e28a4053SRui Paulo 236e28a4053SRui Paulohostapd_cli wps_ap_pin set <PIN> [timeout] 237e28a4053SRui Paulo- set the AP PIN and enable it 238e28a4053SRui Paulo- if the optional timeout parameter is given, the AP PIN will be enabled 239e28a4053SRui Paulo for the specified number of seconds 240e28a4053SRui Paulo 241f05cddf9SRui Paulohostapd_cli get_config 242f05cddf9SRui Paulo- display the current configuration 243f05cddf9SRui Paulo 244f05cddf9SRui Paulohostapd_cli wps_config <new SSID> <auth> <encr> <new key> 245f05cddf9SRui Pauloexamples: 246f05cddf9SRui Paulo hostapd_cli wps_config testing WPA2PSK CCMP 12345678 247f05cddf9SRui Paulo hostapd_cli wps_config "no security" OPEN NONE "" 248f05cddf9SRui Paulo 249f05cddf9SRui Paulo<auth> must be one of the following: OPEN WPAPSK WPA2PSK 250f05cddf9SRui Paulo<encr> must be one of the following: NONE WEP TKIP CCMP 251f05cddf9SRui Paulo 252e28a4053SRui Paulo 25339beb93cSSam LefflerCredential generation and configuration changes 25439beb93cSSam Leffler----------------------------------------------- 25539beb93cSSam Leffler 25639beb93cSSam LefflerBy default, hostapd generates credentials for Enrollees and processing 25739beb93cSSam LefflerAP configuration updates internally. However, it is possible to 25839beb93cSSam Lefflercontrol these operations from external programs, if desired. 25939beb93cSSam Leffler 26039beb93cSSam LefflerThe internal credential generation can be disabled with 26139beb93cSSam Lefflerskip_cred_build=1 option in the configuration. extra_cred option will 26239beb93cSSam Lefflerthen need to be used to provide pre-configured Credential attribute(s) 26339beb93cSSam Lefflerfor hostapd to use. The exact data from this binary file will be sent, 26439beb93cSSam Leffleri.e., it will have to include valid WPS attributes. extra_cred can 26539beb93cSSam Leffleralso be used to add additional networks if the Registrar is used to 26639beb93cSSam Lefflerconfigure credentials for multiple networks. 26739beb93cSSam Leffler 26839beb93cSSam LefflerProcessing of received configuration updates can be disabled with 26939beb93cSSam Lefflerwps_cred_processing=1 option. When this is used, an external program 27039beb93cSSam Leffleris responsible for creating hostapd configuration files and processing 27139beb93cSSam Lefflerconfiguration updates based on messages received from hostapd over 27239beb93cSSam Lefflercontrol interface. This will also include the initial configuration on 27339beb93cSSam Lefflerfirst successful registration if the AP is initially set in 27439beb93cSSam Lefflerunconfigured state. 27539beb93cSSam Leffler 27639beb93cSSam LefflerFollowing control interface messages are sent out for external programs: 27739beb93cSSam Leffler 27839beb93cSSam LefflerWPS-REG-SUCCESS <Enrollee MAC address <UUID-E> 27939beb93cSSam LefflerFor example: 28039beb93cSSam Leffler<2>WPS-REG-SUCCESS 02:66:a0:ee:17:27 2b7093f1-d6fb-5108-adbb-bea66bb87333 28139beb93cSSam Leffler 282f05cddf9SRui PauloThis can be used to trigger change from unconfigured to configured 28339beb93cSSam Lefflerstate (random configuration based on the first successful WPS 28439beb93cSSam Lefflerregistration). In addition, this can be used to update AP UI about the 28539beb93cSSam Lefflerstatus of WPS registration progress. 28639beb93cSSam Leffler 28739beb93cSSam Leffler 28839beb93cSSam LefflerWPS-NEW-AP-SETTINGS <hexdump of AP Setup attributes> 28939beb93cSSam LefflerFor example: 29039beb93cSSam Leffler<2>WPS-NEW-AP-SETTINGS 10260001011045000c6a6b6d2d7770732d74657374100300020020100f00020008102700403065346230343536633236366665306433396164313535346131663462663731323433376163666462376633393965353466316631623032306164343438623510200006024231cede15101e000844 29139beb93cSSam Leffler 29239beb93cSSam LefflerThis can be used to update the externally stored AP configuration and 29339beb93cSSam Lefflerthen update hostapd configuration (followed by restarting of hostapd). 294f05cddf9SRui Paulo 295f05cddf9SRui Paulo 296f05cddf9SRui PauloWPS with NFC 297f05cddf9SRui Paulo------------ 298f05cddf9SRui Paulo 299f05cddf9SRui PauloWPS can be used with NFC-based configuration method. An NFC tag 300f05cddf9SRui Paulocontaining a password token from the Enrollee can be used to 301f05cddf9SRui Pauloauthenticate the connection instead of the PIN. In addition, an NFC tag 302f05cddf9SRui Paulowith a configuration token can be used to transfer AP settings without 303f05cddf9SRui Paulogoing through the WPS protocol. 304f05cddf9SRui Paulo 305f05cddf9SRui PauloWhen the AP acts as an Enrollee, a local NFC tag with a password token 306f05cddf9SRui Paulocan be used by touching the NFC interface of an external Registrar. The 307f05cddf9SRui Paulowps_nfc_token command is used to manage use of the NFC password token 308f05cddf9SRui Paulofrom the AP. "wps_nfc_token enable" enables the use of the AP's NFC 309f05cddf9SRui Paulopassword token (in place of AP PIN) and "wps_nfc_token disable" disables 310f05cddf9SRui Paulothe NFC password token. 311f05cddf9SRui Paulo 312f05cddf9SRui PauloThe NFC password token that is either pre-configured in the 313f05cddf9SRui Pauloconfiguration file (wps_nfc_dev_pw_id, wps_nfc_dh_pubkey, 314f05cddf9SRui Paulowps_nfc_dh_privkey, wps_nfc_dev_pw) or generated dynamically with 315f05cddf9SRui Paulo"wps_nfc_token <WPS|NDEF>" command. The nfc_pw_token tool from 316f05cddf9SRui Paulowpa_supplicant can be used to generate NFC password tokens during 317f05cddf9SRui Paulomanufacturing (each AP needs to have its own random keys). 318f05cddf9SRui Paulo 319f05cddf9SRui PauloThe "wps_nfc_config_token <WPS/NDEF>" command can be used to build an 320f05cddf9SRui PauloNFC configuration token. The output value from this command is a hexdump 321f05cddf9SRui Pauloof the current AP configuration (WPS parameter requests this to include 322f05cddf9SRui Pauloonly the WPS attributes; NDEF parameter requests additional NDEF 323f05cddf9SRui Pauloencapsulation to be included). This data needs to be written to an NFC 324f05cddf9SRui Paulotag with an external program. Once written, the NFC configuration token 325f05cddf9SRui Paulocan be used to touch an NFC interface on a station to provision the 326f05cddf9SRui Paulocredentials needed to access the network. 327f05cddf9SRui Paulo 328f05cddf9SRui PauloWhen the NFC device on the AP reads an NFC tag with a MIME media type 329f05cddf9SRui Paulo"application/vnd.wfa.wsc", the NDEF message payload (with or without 330f05cddf9SRui PauloNDEF encapsulation) can be delivered to hostapd using the 331f05cddf9SRui Paulofollowing hostapd_cli command: 332f05cddf9SRui Paulo 333f05cddf9SRui Paulowps_nfc_tag_read <hexdump of payload> 334f05cddf9SRui Paulo 335f05cddf9SRui PauloIf the NFC tag contains a password token, the token is added to the 336f05cddf9SRui Paulointernal Registrar. This allows station Enrollee from which the password 337f05cddf9SRui Paulotoken was received to run through WPS protocol to provision the 338f05cddf9SRui Paulocredential. 339*5b9c547cSRui Paulo 340*5b9c547cSRui Paulo"nfc_get_handover_sel <NDEF> <WPS>" command can be used to build the 341*5b9c547cSRui Paulocontents of a Handover Select Message for connection handover when this 342*5b9c547cSRui Paulodoes not depend on the contents of the Handover Request Message. The 343*5b9c547cSRui Paulofirst argument selects the format of the output data and the second 344*5b9c547cSRui Pauloargument selects which type of connection handover is requested (WPS = 345*5b9c547cSRui PauloWi-Fi handover as specified in WSC 2.0). 346*5b9c547cSRui Paulo 347*5b9c547cSRui Paulo"nfc_report_handover <INIT/RESP> WPS <carrier from handover request> 348*5b9c547cSRui Paulo<carrier from handover select>" is used to report completed NFC 349*5b9c547cSRui Pauloconnection handover. The first parameter indicates whether the local 350*5b9c547cSRui Paulodevice initiated or responded to the connection handover and the carrier 351*5b9c547cSRui Paulorecords are the selected carrier from the handover request and select 352*5b9c547cSRui Paulomessages as a hexdump. 353