/*************************************************************************************************/ /*! * \file * * \brief Security manager constants and definitions from the Bluetooth specification. * * Copyright (c) 2010-2018 Arm Ltd. * * Copyright (c) 2019 Packetcraft, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*************************************************************************************************/ #ifndef SMP_DEFS_H #define SMP_DEFS_H #ifdef __cplusplus extern "C" { #endif /*! \addtogroup STACK_SMP_API * \{ */ /************************************************************************************************** Macros **************************************************************************************************/ /*! \brief PDU format */ #define SMP_HDR_LEN 1 /*!< \brief Attribute PDU header length. */ /*! \brief Protocol timeout */ #define SMP_TIMEOUT 30 /*!< \brief Protocol timeout in seconds. */ /** \name SMP Encryption Key Size * */ /**@{*/ #define SMP_KEY_SIZE_MAX 16 /*!< \brief Maximum encryption key size. */ #define SMP_KEY_SIZE_MIN 7 /*!< \brief Minimum encryption key size. */ /**@}*/ #define SMP_OOB_LEN 16 /*!< \brief OOB Data length in bytes. */ #define SMP_PIN_LEN 3 /*!< \brief Passkey Pin lenght in bytes. */ /** \name SMP Error Codes * SMP PDU status codes */ /**@{*/ #define SMP_ERR_PASSKEY_ENTRY 0x01 /*!< \brief User input of passkey failed. */ #define SMP_ERR_OOB 0x02 /*!< \brief OOB data is not available. */ #define SMP_ERR_AUTH_REQ 0x03 /*!< \brief Authentication requirements cannot be met. */ #define SMP_ERR_CONFIRM_VALUE 0x04 /*!< \brief Confirm value does not match. */ #define SMP_ERR_PAIRING_NOT_SUP 0x05 /*!< \brief Pairing is not supported by the device. */ #define SMP_ERR_ENC_KEY_SIZE 0x06 /*!< \brief Insufficient encryption key size. */ #define SMP_ERR_COMMAND_NOT_SUP 0x07 /*!< \brief Command not supported. */ #define SMP_ERR_UNSPECIFIED 0x08 /*!< \brief Unspecified reason. */ #define SMP_ERR_ATTEMPTS 0x09 /*!< \brief Repeated attempts. */ #define SMP_ERR_INVALID_PARAM 0x0A /*!< \brief Invalid parameter or command length. */ #define SMP_ERR_DH_KEY_CHECK 0x0B /*!< \brief DH Key check did not match. */ #define SMP_ERR_NUMERIC_COMPARISON 0x0C /*!< \brief Numeric comparison did not match. */ #define SMP_ERR_BR_EDR_IN_PROGRESS 0x0D /*!< \brief BR/EDR in progress. */ #define SMP_ERR_CROSS_TRANSPORT 0x0E /*!< \brief BR/EDR cross transport key generation not allowed. */ /**@}*/ /** \name Proprietary Error Codes * Internal error codes not sent in any SMP PDU. */ /**@{*/ #define SMP_ERR_MEMORY 0xE0 /*!< \brief Out of memory. */ #define SMP_ERR_TIMEOUT 0xE1 /*!< \brief Transaction timeout. */ /**@}*/ /** \name SMP PDU Codes * SMP PDU Code describing command received or sent. */ /**@{*/ #define SMP_CMD_PAIR_REQ 0x01 /*!< \brief Pairing request. */ #define SMP_CMD_PAIR_RSP 0x02 /*!< \brief Pairing response. */ #define SMP_CMD_PAIR_CNF 0x03 /*!< \brief Pairing confirm. */ #define SMP_CMD_PAIR_RAND 0x04 /*!< \brief Pairing random. */ #define SMP_CMD_PAIR_FAIL 0x05 /*!< \brief Pairing failed. */ #define SMP_CMD_ENC_INFO 0x06 /*!< \brief Encryption information. */ #define SMP_CMD_MASTER_ID 0x07 /*!< \brief Master identification. */ #define SMP_CMD_ID_INFO 0x08 /*!< \brief Identity information. */ #define SMP_CMD_ID_ADDR_INFO 0x09 /*!< \brief Identity address information. */ #define SMP_CMD_SIGN_INFO 0x0A /*!< \brief Signing information. */ #define SMP_CMD_SECURITY_REQ 0x0B /*!< \brief Security fequest. */ #define SMP_CMD_PUBLIC_KEY 0x0C /*!< \brief Public Kkey. */ #define SMP_CMD_DHKEY_CHECK 0x0D /*!< \brief DH Key check. */ #define SMP_CMD_KEYPRESS 0x0E /*!< \brief User key press. */ #define SMP_CMD_MAX 0x0F /*!< \brief Command code maximum. */ /**@}*/ /** \name SMP PDU Packet Lengths * Fixed length of the PDU to be sent. */ /**@{*/ #define SMP_PAIR_REQ_LEN 7 /*!< \brief Pairing request message length. */ #define SMP_PAIR_RSP_LEN 7 /*!< \brief Pairing response message length. */ #define SMP_PAIR_CNF_LEN 17 /*!< \brief Pairing confirmation message length. */ #define SMP_PAIR_RAND_LEN 17 /*!< \brief Pairing random message length. */ #define SMP_PAIR_FAIL_LEN 2 /*!< \brief Pairing fail message length. */ #define SMP_ENC_INFO_LEN 17 /*!< \brief Encryption information message length. */ #define SMP_MASTER_ID_LEN 11 /*!< \brief Master identification messagelength. */ #define SMP_ID_INFO_LEN 17 /*!< \brief Identity information message length. */ #define SMP_ID_ADDR_INFO_LEN 8 /*!< \brief Identity address information message length. */ #define SMP_SIGN_INFO_LEN 17 /*!< \brief Signing information message length. */ #define SMP_SECURITY_REQ_LEN 2 /*!< \brief Security request message length. */ #define SMP_PUB_KEY_MSG_LEN (1 + 2*SMP_PUB_KEY_LEN) /*!< \brief Public key message length. */ #define SMP_DHKEY_CHECK_MSG_LEN (1 + SMP_DHKEY_CHECK_LEN) /*!< \brief Diffie-Hellman key check message length. */ #define SMP_KEYPRESS_MSG_LEN 2 /*!< \brief Keypress message length. */ /**@}*/ /** \name SMP I/O Capabilities * I/O capabilities codes to be set for \ref SMP_CMD_PAIR_REQ and \ref SMP_CMD_PAIR_RSP */ /**@{*/ #define SMP_IO_DISP_ONLY 0x00 /*!< \brief Display only. */ #define SMP_IO_DISP_YES_NO 0x01 /*!< \brief Display yes/no. */ #define SMP_IO_KEY_ONLY 0x02 /*!< \brief Keyboard only. */ #define SMP_IO_NO_IN_NO_OUT 0x03 /*!< \brief No input, no output. */ #define SMP_IO_KEY_DISP 0x04 /*!< \brief Keyboard display. */ /**@}*/ /** \name SMP OOB Data Flag * Out-of-Band codes to be set for \ref SMP_CMD_PAIR_REQ and \ref SMP_CMD_PAIR_RSP */ /**@{*/ #define SMP_OOB_DATA_NONE 0x00 /*!< \brief No OOB data from the remote device is present. */ #define SMP_OOB_DATA_PRESENT 0x01 /*!< \brief OOB data from the remote device is present. */ /**@}*/ /** \name SMP Authentication Requirements Flags * Authentication Requirements Flags to be set for \ref SMP_CMD_PAIR_REQ and \ref SMP_CMD_PAIR_RSP. */ /**@{*/ #define SMP_AUTH_BOND_MASK 0x03 /*!< \brief Mask for bonding bits. */ #define SMP_AUTH_BOND_FLAG 0x01 /*!< \brief Bonding requested. */ #define SMP_AUTH_MITM_FLAG 0x04 /*!< \brief MITM (authenticated pairing) requested. */ #define SMP_AUTH_SC_FLAG 0x08 /*!< \brief LE Secure Connections requested. */ #define SMP_AUTH_KP_FLAG 0x10 /*!< \brief Keypress notifications requested. */ /**@}*/ /** \name SMP Key Distribution Flags * Flags of security keys this device is requesting to be distribution once pairing completes. */ /**@{*/ #define SMP_KEY_DIST_ENC 0x01 /*!< \brief Distribute LTK. */ #define SMP_KEY_DIST_ID 0x02 /*!< \brief Distribute IRK. */ #define SMP_KEY_DIST_SIGN 0x04 /*!< \brief Distribute CSRK. */ /*! \brief Key distribution mask. */ #define SMP_KEY_DIST_MASK (SMP_KEY_DIST_ENC | SMP_KEY_DIST_ID | SMP_KEY_DIST_SIGN) /**@}*/ /** \name SMP LE Secure Connection Keypress Codes * Keypress codes found in \ref SMP_CMD_KEYPRESS PDU to be sent on the respective action when * the \ref SMP_AUTH_KP_FLAG is set in both the \ref SMP_CMD_PAIR_REQ and \ref SMP_CMD_PAIR_RSP. */ /**@{*/ #define SMP_PASSKEY_ENTRY_STARTED 0x00 /*!< \brief Passkey entry started keypress type. */ #define SMP_PASSKEY_DIGIT_ENTERED 0x01 /*!< \brief Passkey digit entered keypress type. */ #define SMP_PASSKEY_DIGIT_ERASED 0x02 /*!< \brief Passkey digit erased keypress type. */ #define SMP_PASSKEY_CLEARED 0x03 /*!< \brief Passkey cleared keypress type. */ #define SMP_PASSKEY_ENTRY_COMPLETED 0x04 /*!< \brief Passkey entry complete keypress type. */ /**@}*/ /** \name SMP Value Length Constants * Lengths of various keys and values. */ /**@{*/ #define SMP_RAND_LEN 16 /*!< \brief Random number length. */ #define SMP_CONFIRM_LEN 16 /*!< \brief Confirm number length. */ #define SMP_KEY_LEN 16 /*!< \brief Key length. */ #define SMP_RAND8_LEN 8 /*!< \brief Random 8-byte number length. */ #define SMP_PRIVATE_KEY_LEN 32 /*!< \brief Secure connections private key length. */ #define SMP_PUB_KEY_LEN 32 /*!< \brief Secure connecdtions public key length. */ #define SMP_DHKEY_LEN 32 /*!< \brief Secure connection Diffie-Hellman key length. */ #define SMP_DHKEY_CHECK_LEN 16 /*!< \brief Secure connection Diffie-Hellman key check length. */ /**@}*/ /** \name CMAC Input Lengths Constants * Input lengths of SMP cryptopgraphic toolbox functions. */ /**@{*/ #define SMP_F4_TEXT_LEN (SMP_PUB_KEY_LEN * 2 + 1) /*!< \brief F4 input length. */ #define SMP_G2_TEXT_LEN (SMP_PUB_KEY_LEN * 2 + SMP_RAND_LEN) /*!< \brief G2 input length. */ #define SMP_F5_TKEY_TEXT_LEN (SMP_DHKEY_LEN) /*!< \brief F5 Temporary key input length. */ #define SMP_F5_TEXT_LEN (9 + 2*BDA_ADDR_LEN + 2*SMP_RAND_LEN) /*!< \brief F5 input length. */ #define SMP_F6_TEXT_LEN (2*BDA_ADDR_LEN + 3*SMP_RAND_LEN + 5) /*!< \brief F6 input length. */ /**@}*/ /*! \} */ /* STACK_SMP_API */ #ifdef __cplusplus }; #endif #endif /* SMP_DEFS_H */