mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-15 16:24:28 +08:00
f62350b702
One time test at startup to ensure either kernel version v4.9 or later, *or* that required AES-CCM support has been back-ported. If support not there, daemon will run without providing D-Bus service or attaching to controllers (prevents systemd thrashing).
165 lines
6.7 KiB
C
165 lines
6.7 KiB
C
/*
|
|
*
|
|
* BlueZ - Bluetooth protocol stack for Linux
|
|
*
|
|
* Copyright (C) 2018 Intel Corporation. All rights reserved.
|
|
*
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
*/
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
bool mesh_crypto_aes_ccm_encrypt(const uint8_t nonce[13], const uint8_t key[16],
|
|
const uint8_t *aad, uint16_t aad_len,
|
|
const void *msg, uint16_t msg_len,
|
|
void *out_msg,
|
|
void *out_mic, size_t mic_size);
|
|
bool mesh_crypto_aes_ccm_decrypt(const uint8_t nonce[13], const uint8_t key[16],
|
|
const uint8_t *aad, uint16_t aad_len,
|
|
const void *enc_msg, uint16_t enc_msg_len,
|
|
void *out_msg,
|
|
void *out_mic, size_t mic_size);
|
|
bool mesh_aes_ecb_one(const uint8_t key[16],
|
|
const uint8_t plaintext[16], uint8_t encrypted[16]);
|
|
bool mesh_crypto_nkik(const uint8_t network_key[16], uint8_t identity_key[16]);
|
|
bool mesh_crypto_nkbk(const uint8_t network_key[16], uint8_t beacon_key[16]);
|
|
bool mesh_crypto_nkpk(const uint8_t network_key[16], uint8_t proxy_key[16]);
|
|
bool mesh_crypto_identity(const uint8_t net_key[16], uint16_t addr,
|
|
uint8_t id[16]);
|
|
bool mesh_crypto_beacon_cmac(const uint8_t encryption_key[16],
|
|
const uint8_t network_id[16],
|
|
uint32_t iv_index, bool kr,
|
|
bool iu, uint64_t *cmac);
|
|
bool mesh_crypto_network_nonce(bool frnd, uint8_t ttl, uint32_t seq,
|
|
uint16_t src, uint32_t iv_index,
|
|
uint8_t nonce[13]);
|
|
bool mesh_crypto_network_encrypt(bool ctl, uint8_t ttl,
|
|
uint32_t seq, uint16_t src,
|
|
uint32_t iv_index,
|
|
const uint8_t net_key[16],
|
|
const uint8_t *enc_msg, uint8_t enc_msg_len,
|
|
uint8_t *out, void *net_mic);
|
|
bool mesh_crypto_network_decrypt(bool frnd, uint8_t ttl,
|
|
uint32_t seq, uint16_t src,
|
|
uint32_t iv_index,
|
|
const uint8_t net_key[16],
|
|
const uint8_t *enc_msg, uint8_t enc_msg_len,
|
|
uint8_t *out, void *net_mic, size_t mic_size);
|
|
bool mesh_crypto_application_nonce(uint32_t seq, uint16_t src,
|
|
uint16_t dst, uint32_t iv_index,
|
|
bool aszmic, uint8_t nonce[13]);
|
|
bool mesh_crypto_device_nonce(uint32_t seq, uint16_t src,
|
|
uint16_t dst, uint32_t iv_index,
|
|
bool aszmic, uint8_t nonce[13]);
|
|
bool mesh_crypto_application_encrypt(uint8_t akf, uint32_t seq, uint16_t src,
|
|
uint16_t dst, uint32_t iv_index,
|
|
const uint8_t app_key[16],
|
|
const uint8_t *aad, uint8_t aad_len,
|
|
const uint8_t *msg, uint8_t msg_len,
|
|
uint8_t *out,
|
|
void *app_mic, size_t mic_size);
|
|
bool mesh_crypto_application_decrypt(uint8_t akf, uint32_t seq, uint16_t src,
|
|
uint16_t dst, uint32_t iv_index,
|
|
const uint8_t app_key[16],
|
|
const uint8_t *aad, uint8_t aad_len,
|
|
const uint8_t *enc_msg, uint8_t enc_msg_len,
|
|
uint8_t *out, void *app_mic, size_t mic_size);
|
|
bool mesh_crypto_device_key(const uint8_t secret[32],
|
|
const uint8_t salt[16],
|
|
uint8_t device_key[16]);
|
|
bool mesh_crypto_virtual_addr(const uint8_t virtual_label[16],
|
|
uint16_t *v_addr);
|
|
bool mesh_crypto_nonce(const uint8_t secret[32],
|
|
const uint8_t salt[16],
|
|
uint8_t nonce[13]);
|
|
bool mesh_crypto_k1(const uint8_t ikm[16], const uint8_t salt[16],
|
|
const void *info, size_t info_len, uint8_t okm[16]);
|
|
bool mesh_crypto_k2(const uint8_t n[16], const uint8_t *p, size_t p_len,
|
|
uint8_t net_id[1],
|
|
uint8_t enc_key[16],
|
|
uint8_t priv_key[16]);
|
|
bool mesh_crypto_k3(const uint8_t n[16], uint8_t out64[8]);
|
|
bool mesh_crypto_k4(const uint8_t a[16], uint8_t out5[1]);
|
|
bool mesh_crypto_s1(const void *info, size_t len, uint8_t salt[16]);
|
|
bool mesh_crypto_prov_prov_salt(const uint8_t conf_salt[16],
|
|
const uint8_t prov_rand[16],
|
|
const uint8_t dev_rand[16],
|
|
uint8_t prov_salt[16]);
|
|
bool mesh_crypto_prov_conf_key(const uint8_t secret[32],
|
|
const uint8_t salt[16],
|
|
uint8_t conf_key[16]);
|
|
bool mesh_crypto_session_key(const uint8_t secret[32],
|
|
const uint8_t salt[16],
|
|
uint8_t session_key[16]);
|
|
bool mesh_crypto_privacy_counter(uint32_t iv_index,
|
|
const uint8_t *payload,
|
|
uint8_t privacy_counter[16]);
|
|
bool mesh_crypto_network_obfuscate(const uint8_t privacy_key[16],
|
|
const uint8_t privacy_counter[16],
|
|
bool ctl, uint8_t ttl, uint32_t seq,
|
|
uint16_t src, uint8_t *out);
|
|
bool mesh_crypto_network_clarify(const uint8_t privacy_key[16],
|
|
const uint8_t privacy_counter[16],
|
|
const uint8_t net_hdr[6],
|
|
bool *ctl, uint8_t *ttl,
|
|
uint32_t *seq, uint16_t *src);
|
|
|
|
bool mesh_crypto_packet_build(bool ctl, uint8_t ttl,
|
|
uint32_t seq,
|
|
uint16_t src, uint16_t dst,
|
|
uint8_t opcode,
|
|
bool segmented, uint8_t key_aid,
|
|
bool szmic, bool relay, uint16_t seqZero,
|
|
uint8_t segO, uint8_t segN,
|
|
const uint8_t *payload, uint8_t payload_len,
|
|
uint8_t *packet, uint8_t *packet_len);
|
|
bool mesh_crypto_packet_parse(const uint8_t *packet, uint8_t packet_len,
|
|
bool *ctl, uint8_t *ttl, uint32_t *seq,
|
|
uint16_t *src, uint16_t *dst,
|
|
uint32_t *cookie, uint8_t *opcode,
|
|
bool *segmented, uint8_t *key_aid,
|
|
bool *szmic, bool *relay, uint16_t *seqZero,
|
|
uint8_t *segO, uint8_t *segN,
|
|
const uint8_t **payload, uint8_t *payload_len);
|
|
bool mesh_crypto_payload_encrypt(uint8_t *aad, const uint8_t *payload,
|
|
uint8_t *out, uint16_t payload_len,
|
|
uint16_t src, uint16_t dst, uint8_t key_aid,
|
|
uint32_t seq_num, uint32_t iv_index,
|
|
bool aszmic,
|
|
const uint8_t application_key[16]);
|
|
bool mesh_crypto_payload_decrypt(uint8_t *aad, uint16_t aad_len,
|
|
const uint8_t *payload, uint16_t payload_len,
|
|
bool szmict,
|
|
uint16_t src, uint16_t dst, uint8_t key_aid,
|
|
uint32_t seq_num, uint32_t iv_index,
|
|
uint8_t *out,
|
|
const uint8_t application_key[16]);
|
|
bool mesh_crypto_packet_encode(uint8_t *packet, uint8_t packet_len,
|
|
const uint8_t network_key[16],
|
|
uint32_t iv_index,
|
|
const uint8_t privacy_key[16]);
|
|
bool mesh_crypto_packet_decode(const uint8_t *packet, uint8_t packet_len,
|
|
bool proxy, uint8_t *out, uint32_t iv_index,
|
|
const uint8_t network_key[16],
|
|
const uint8_t privacy_key[16]);
|
|
bool mesh_crypto_packet_label(uint8_t *packet, uint8_t packet_len,
|
|
uint16_t iv_index, uint8_t network_id);
|
|
|
|
uint8_t mesh_crypto_compute_fcs(const uint8_t *packet, uint8_t packet_len);
|
|
bool mesh_crypto_check_fcs(const uint8_t *packet, uint8_t packet_len,
|
|
uint8_t received_fcs);
|
|
bool mesh_crypto_aes_cmac(const uint8_t key[16], const uint8_t *msg,
|
|
size_t msg_len, uint8_t res[16]);
|
|
bool mesh_crypto_check_avail(void);
|