| /* Copyright (c) 2022 Nordic Semiconductor ASA |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef __BT_CRYPTO_H |
| #define __BT_CRYPTO_H |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <zephyr/bluetooth/bluetooth.h> |
| |
| /** |
| * @brief Cypher based Message Authentication Code (CMAC) with AES 128 bit |
| * |
| * Defined in Core Vol. 3, part H 2.2.5. |
| * |
| * @param[in] key 128-bit key |
| * @param[in] in message to be authenticated |
| * @param[in] len length of the message in octets |
| * @param[out] out message authentication code |
| * |
| * @retval 0 Computation was successful. @p res contains the result. |
| * @retval -EIO Computation failed. |
| */ |
| int bt_crypto_aes_cmac(const uint8_t *key, const uint8_t *in, size_t len, uint8_t *out); |
| |
| /** |
| * @brief Cryptographic Toolbox f4 |
| * |
| * Defined in Core Vol. 3, part H 2.2.6. |
| * |
| * @param[in] u 256-bit |
| * @param[in] v 256-bit |
| * @param[in] x 128-bit key |
| * @param[in] z 8-bit |
| * @param[out] res |
| * |
| * @retval 0 Computation was successful. @p res contains the result. |
| * @retval -EIO Computation failed. |
| */ |
| int bt_crypto_f4(const uint8_t *u, const uint8_t *v, const uint8_t *x, uint8_t z, uint8_t res[16]); |
| |
| /** |
| * @brief Cryptographic Toolbox f5 |
| * |
| * Defined in Core Vol. 3, part H 2.2.7. |
| * |
| * @param[in] w 256-bit |
| * @param[in] n1 128-bit |
| * @param[in] n2 128-bit |
| * @param[in] a1 56-bit |
| * @param[in] a2 56-bit |
| * @param[out] mackey most significant 128-bit of the result |
| * @param[out] ltk least significant 128-bit of the result |
| * |
| * @retval 0 Computation was successful. @p res contains the result. |
| * @retval -EIO Computation failed. |
| */ |
| int bt_crypto_f5(const uint8_t *w, const uint8_t *n1, const uint8_t *n2, const bt_addr_le_t *a1, |
| const bt_addr_le_t *a2, uint8_t *mackey, uint8_t *ltk); |
| |
| /** |
| * @brief Cryptographic Toolbox f6 |
| * |
| * Defined in Core Vol. 3, part H 2.2.8. |
| * |
| * @param[in] w 128-bit |
| * @param[in] n1 128-bit |
| * @param[in] n2 128-bit |
| * @param[in] r 128-bit |
| * @param[in] iocap 24-bit |
| * @param[in] a1 56-bit |
| * @param[in] a2 56-bit |
| * @param[out] check |
| * |
| * @retval 0 Computation was successful. @p res contains the result. |
| * @retval -EIO Computation failed. |
| */ |
| int bt_crypto_f6(const uint8_t *w, const uint8_t *n1, const uint8_t *n2, const uint8_t *r, |
| const uint8_t *iocap, const bt_addr_le_t *a1, const bt_addr_le_t *a2, |
| uint8_t *check); |
| |
| /** |
| * @brief Cryptographic Toolbox g2 |
| |
| * Defined in Core Vol. 3, part H 2.2.9. |
| * |
| * @param[in] u 256-bit |
| * @param[in] v 256-bit |
| * @param[in] x 128-bit |
| * @param[in] y 128-bit |
| * @param[out] passkey |
| * |
| * @retval 0 Computation was successful. @p res contains the result. |
| * @retval -EIO Computation failed. |
| */ |
| int bt_crypto_g2(const uint8_t u[32], const uint8_t v[32], const uint8_t x[16], const uint8_t y[16], |
| uint32_t *passkey); |
| |
| /** |
| * @brief Cryptographic Toolbox h6 |
| * |
| * Link key conversion defined in Core Vol. 3, part H 2.2.10. |
| * |
| * @param[in] w 128-bit key |
| * @param[in] key_id 32-bit |
| * @param[out] res 128-bit |
| * |
| * @retval 0 Computation was successful. @p res contains the result. |
| * @retval -EIO Computation failed. |
| */ |
| int bt_crypto_h6(const uint8_t w[16], const uint8_t key_id[4], uint8_t res[16]); |
| |
| /** |
| * @brief Cryptographic Toolbox h7 |
| * |
| * Link key conversion defined in Core Vol. 3, part H 2.2.11. |
| * |
| * @param[in] salt 128-bit key |
| * @param[in] w 128-bit input of the AES-CMAC function |
| * @param[out] res 128-bit |
| * |
| * @retval 0 Computation was successful. @p res contains the result. |
| * @retval -EIO Computation failed. |
| */ |
| int bt_crypto_h7(const uint8_t salt[16], const uint8_t w[16], uint8_t res[16]); |
| |
| /** |
| * @brief Cryptograhic Toolbox function h8 |
| * |
| * Defined in Core Vol. 6, part E 1.1.1. |
| * |
| * @note This function is purely a shorthand for the calculation. The parameters |
| * are therefore intentionally not assigned meaning. |
| * |
| * Pseudocode: `aes_cmac(key=aes_cmac(key=s, plaintext=k), plaintext=key_id)` |
| * |
| * @param[in] k (128-bit number in big endian) |
| * @param[in] s (128-bit number in big endian) |
| * @param[in] key_id (32-bit number in big endian) |
| * @param[out] res (128-bit number in big endian) |
| * |
| * @retval 0 Computation was successful. @p res contains the result. |
| * @retval -EIO Computation failed. |
| */ |
| int bt_crypto_h8(const uint8_t k[16], const uint8_t s[16], const uint8_t key_id[4], |
| uint8_t res[16]); |
| |
| #endif /* __BT_CRYPTO_H */ |