Wireshark 4.5.0
The Wireshark network protocol analyzer
Loading...
Searching...
No Matches
packet-rf4ce-secur.h
1/* packet-rf4ce-secur.h
2 * Security related functions and objects for RF4CE dissector
3 * Copyright (C) Atmosic 2023
4 *
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <gerald@wireshark.org>
7 * Copyright 1998 Gerald Combs
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12#ifndef PACKET_RF4CE_SECUR_H
13#define PACKET_RF4CE_SECUR_H
14
15#include <stdbool.h>
16#include "config.h"
17#include <epan/packet.h>
18#include <epan/expert.h>
19#include <epan/uat.h>
20#include <epan/value_string.h>
21
22#define RF4CE_IEEE_ADDR_LEN 8
23#define RF4CE_SHORT_ADDR_LEN 2
24
25#define RF4CE_MIN_NWK_LENGTH 5
26#define RF4CE_MAX_NWK_LENGTH 148
27
28#define RF4CE_VENDOR_SECRET_STORAGE_SIZE 64
29#define RF4CE_NWK_KEY_STORAGE_SIZE 64
30#define RF4CE_ADDR_TABLE_SIZE (RF4CE_NWK_KEY_STORAGE_SIZE * 2)
31
32#define RF4CE_NWK_KEY_SEED_DATA_LENGTH 80
33
34#define RF4CE_CCM_M 4
35#define RF4CE_CCM_L 2
36#define RF4CE_CCM_NONCE_LEN (15 - RF4CE_CCM_L)
37#define RF4CE_SECUR_CONTROL 5
38#define SEC_STR_LEN 16
39#define KEY_LEN SEC_STR_LEN
40
41typedef struct keypair_context_s {
42 uint8_t nwk_key_seed_latest[RF4CE_NWK_KEY_SEED_DATA_LENGTH];
43 uint8_t nwk_key_seed_prev[RF4CE_NWK_KEY_SEED_DATA_LENGTH];
44 uint8_t nwk_key_seed[RF4CE_NWK_KEY_SEED_DATA_LENGTH];
45 uint8_t controller_addr[RF4CE_IEEE_ADDR_LEN];
46 uint8_t target_addr[RF4CE_IEEE_ADDR_LEN];
47 uint8_t nwk_key_exchange_transfer_expected;
48 uint8_t nwk_key_exchange_transfer_received;
50
51#define RF4CE_PROFILE_CMD_KEY_EXCHANGE_RAND_A_LENGTH 8
52#define RF4CE_PROFILE_CMD_KEY_EXCHANGE_RAND_B_LENGTH 8
53
54#define RF4CE_PROFILE_CMD_KEY_EXCHANGE_RAND_AB_LENGTH \
55 (RF4CE_PROFILE_CMD_KEY_EXCHANGE_RAND_A_LENGTH \
56 + RF4CE_PROFILE_CMD_KEY_EXCHANGE_RAND_B_LENGTH)
57
58#define RF4CE_PROFILE_CMD_KEY_EXCHANGE_TAG_A_LENGTH 4
59#define RF4CE_PROFILE_CMD_KEY_EXCHANGE_TAG_B_LENGTH 4
60
61#define RF4CE_KEY_EXCHANGE_CONTEXT_LENGTH 9
62#define RF4CE_KEY_EXCHANGE_LABEL_LENGTH (2 * (RF4CE_IEEE_ADDR_LEN))
63
64#define RF4CE_CMAC_ARG_2_LENGTH \
65 (RF4CE_KEY_EXCHANGE_CONTEXT_LENGTH \
66 + RF4CE_KEY_EXCHANGE_LABEL_LENGTH \
67 + KEY_LEN)
68
69/* RF4CE GDP 2.0 spec, part 7.4.2 Key generation
70 * Context shall be set to the ASCII representation of the nine character string (including a space
71 * after "RF4CE" but without quotes and without null termination) "RF4CE GDP".
72 */
73#define CONTEXT_STR "RF4CE GDP"
74#define CONTEXT_STR_LEN 9
75
76extern uint8_t DEFAULT_SECRET[SEC_STR_LEN];
77
78typedef struct key_exchange_context_s {
79 uint8_t rand_a[RF4CE_PROFILE_CMD_KEY_EXCHANGE_RAND_A_LENGTH];
80 uint8_t rand_b[RF4CE_PROFILE_CMD_KEY_EXCHANGE_RAND_B_LENGTH];
81 uint8_t mac_a[RF4CE_IEEE_ADDR_LEN]; /* target address */
82 uint8_t mac_b[RF4CE_IEEE_ADDR_LEN]; /* controller address */
83 bool is_proc_started;
85
86typedef struct
87#if defined(_MSC_VER)
88# pragma pack(push, 1)
89#else
90__attribute__((__packed__))
91#endif
92rf4ce_key_dk_tag_s
93{
94 uint8_t a[RF4CE_PROFILE_CMD_KEY_EXCHANGE_RAND_A_LENGTH];
95 uint8_t b[RF4CE_PROFILE_CMD_KEY_EXCHANGE_RAND_B_LENGTH];
96} rf4ce_key_dk_tag_t;
97#ifdef _MSC_VER
98# pragma pack(pop)
99#endif
100
101typedef struct
102#if defined(_MSC_VER)
103# pragma pack(push, 1)
104#else
105__attribute__((__packed__))
106#endif
107rf4ce_key_context_s
108{
109 uint8_t context[CONTEXT_STR_LEN];
110 uint8_t mac_a[RF4CE_IEEE_ADDR_LEN];
111 uint8_t mac_b[RF4CE_IEEE_ADDR_LEN];
112 uint8_t pairing_key[KEY_LEN];
113}
114rf4ce_key_context_t;
115#ifdef _MSC_VER
116# pragma pack(pop)
117#endif
118
119void rf4ce_aes_cmac(unsigned char *input, unsigned long length, unsigned char *key, unsigned char *mac_value);
120
121typedef struct addr_entry_s {
122 uint8_t ieee_addr[RF4CE_IEEE_ADDR_LEN];
123 uint16_t short_addr;
124 bool is_used;
126
127typedef struct nwk_key_entry_s {
128 uint8_t nwk_key[KEY_LEN];
129 addr_entry_t *controller_addr_ent;
130 addr_entry_t *target_addr_ent;
131 bool key_from_gui;
132 bool is_used;
133 bool is_pairing_key;
135
136typedef struct vendor_secret_entry_s {
137 uint8_t secret[SEC_STR_LEN];
138 bool is_used;
140
141typedef struct uat_security_record_s {
142 char *sec_str;
143 uint8_t type;
144 char *label;
146
147void keypair_context_init(const uint8_t *controller_ieee, const uint8_t *target_ieee, uint8_t expected_transfer_count);
148void keypair_context_update_seed(uint8_t *seed, uint8_t seed_seqn);
149
150void nwk_key_storage_add_entry(uint8_t *nwk_key, addr_entry_t *controller_addr_ent, addr_entry_t *target_addr_ent, bool key_from_gui, bool is_pairing_key);
151void nwk_key_storage_release_entry(uint8_t *nwk_key, bool key_from_gui);
152
153void rf4ce_addr_table_add_addrs(const void *ieee_addr, uint16_t short_addr);
154bool rf4ce_addr_table_get_ieee_addr(uint8_t *ieee_addr, packet_info *pinfo, bool is_src);
155addr_entry_t *rf4ce_addr_table_get_addr_entry_by_ieee(uint8_t *ieee_addr);
156
157void key_exchange_context_init(void);
158
159void key_exchange_context_start_procedure(void);
160void key_exchange_context_stop_procedure(void);
161bool key_exchange_context_is_procedure_started(void);
162
163void key_exchange_context_set_rand_a(uint8_t *rand_a);
164void key_exchange_context_set_rand_b(uint8_t *rand_b);
165
166void key_exchange_context_set_mac_a(uint8_t *mac_a);
167void key_exchange_context_set_mac_b(uint8_t *mac_b);
168
169void key_exchange_calc_key(uint32_t tag_b_pack);
170
171void vendor_secret_storage_add_entry(uint8_t *secret);
172void vendor_secret_storage_release_entry(uint8_t *secret);
173
174void rf4ce_secur_cleanup(void);
175
176typedef struct
177#if defined(_MSC_VER)
178# pragma pack(push, 1)
179#else
180__attribute__((__packed__))
181#endif
182rf4ce_secur_ccm_nonce_s
183{
184 uint8_t source_address[RF4CE_IEEE_ADDR_LEN];
185 uint32_t frame_counter;
186 uint8_t secur_control;
187} rf4ce_secur_ccm_nonce_t;
188#ifdef _MSC_VER
189# pragma pack(pop)
190#endif
191
192typedef struct
193#if defined(_MSC_VER)
194# pragma pack(push, 1)
195#else
196__attribute__((__packed__))
197#endif
198rf4ce_secur_ccm_auth_s
199{
200 uint8_t frame_control;
201 uint32_t frame_counter;
202 uint8_t dest_address[RF4CE_IEEE_ADDR_LEN];
203} rf4ce_secur_ccm_auth_t;
204#ifdef _MSC_VER
205# pragma pack(pop)
206#endif
207
208bool decrypt_data(
209 const uint8_t *in,
210 uint8_t *out,
211 uint16_t payload_offset,
212 uint16_t *len,
213 uint8_t src_ieee[RF4CE_IEEE_ADDR_LEN],
214 uint8_t dst_ieee[RF4CE_IEEE_ADDR_LEN]);
215
216#endif /* PACKET_RF4CE_SECUR_H */
Definition packet_info.h:43
Definition packet-rf4ce-secur.h:121
Definition packet-isakmp.c:1886
Definition tvbuff_lz77huff.c:32
Definition packet-rf4ce-secur.h:78
Definition packet-rf4ce-secur.h:41
Definition packet-rf4ce-secur.h:127
Definition packet-rf4ce-secur.h:141
Definition packet-rf4ce-secur.h:136