151 lines
4.2 KiB
C
151 lines
4.2 KiB
C
/* 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 Cryptographic 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 */
|