The FreeRADIUS server $Id: f3670dba8951ca10eb4948feb3dc3db9423a334f $
Loading...
Searching...
No Matches
base.c
Go to the documentation of this file.
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or (at
5 * your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
15 */
16
17/**
18 * @file src/lib/eap_aka_sim/base.c
19 * @brief Code common to EAP-SIM/AKA/AKA' clients and servers.
20 *
21 * The development of the EAP-SIM support was funded by Internet Foundation
22 * Austria (http://www.nic.at/ipa).
23 *
24 * @copyright 2003 Michael Richardson <mcr@sandelman.ottawa.on.ca>
25 * @copyright 2003-2016 The FreeRADIUS server project
26 */
27
28RCSID("$Id: dc23b71c4f0c0c52e0b020e985e6019d63fc6a75 $")
29
30#include <freeradius-devel/util/sha1.h>
31
32#include <freeradius-devel/util/debug.h>
33#include <freeradius-devel/server/module.h>
34
35#include <freeradius-devel/tls/base.h>
36
37#include <freeradius-devel/eap/types.h>
38
39#include <freeradius-devel/eap_aka_sim/base.h>
40#include <freeradius-devel/eap_aka_sim/attrs.h>
41
42#include "crypto_priv.h"
43
45
49
52 { .out = &dict_freeradius, .proto = "freeradius" },
53 { .out = &dict_radius, .proto = "radius" },
54 { .out = &dict_eap_aka_sim, .base_dir = "eap/aka-sim", .proto = "eap-aka-sim" },
55
57};
58
106
109
118
121 { .out = &attr_eap_aka_sim_ak, .name = "AK", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
122 { .out = &attr_eap_aka_sim_any_id_req, .name = "Any-ID-Req", .type = FR_TYPE_BOOL, .dict = &dict_eap_aka_sim },
123 { .out = &attr_eap_aka_sim_autn, .name = "AUTN", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
124 { .out = &attr_eap_aka_sim_auts, .name = "AUTS", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
125 { .out = &attr_eap_aka_sim_bidding, .name = "Bidding", .type = FR_TYPE_UINT16, .dict = &dict_eap_aka_sim },
126 { .out = &attr_eap_aka_sim_checkcode, .name = "Checkcode", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
127 { .out = &attr_eap_aka_sim_ck, .name = "CK", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
128 { .out = &attr_eap_aka_sim_ck_prime, .name = "CK-Prime", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
129 { .out = &attr_eap_aka_sim_client_error_code, .name = "Client-Error-Code", .type = FR_TYPE_UINT16, .dict = &dict_eap_aka_sim },
130 { .out = &attr_eap_aka_sim_fullauth_id_req, .name = "Fullauth-ID-Req", .type = FR_TYPE_BOOL, .dict = &dict_eap_aka_sim },
131 { .out = &attr_eap_aka_sim_hmac_extra_request, .name = "HMAC-Extra-Request", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
132 { .out = &attr_eap_aka_sim_hmac_extra_response, .name = "HMAC-Extra-Response", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
133 { .out = &attr_eap_aka_sim_identity, .name = "Identity", .type = FR_TYPE_STRING, .dict = &dict_eap_aka_sim },
134 { .out = &attr_eap_aka_sim_identity_type, .name = "Identity-Type", .type = FR_TYPE_UINT32, .dict = &dict_eap_aka_sim },
135 { .out = &attr_eap_aka_sim_ik, .name = "IK", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
136 { .out = &attr_eap_aka_sim_ik_prime, .name = "IK-Prime", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
137 { .out = &attr_eap_aka_sim_iv, .name = "IV", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
138 { .out = &attr_eap_aka_sim_k_aut, .name = "K-Aut", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
139 { .out = &attr_eap_aka_sim_k_encr, .name = "K-Encr", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
140 { .out = &attr_eap_aka_sim_k_re, .name = "K-Re", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
141 { .out = &attr_eap_aka_sim_kc, .name = "KC", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
142 { .out = &attr_eap_aka_sim_kdf, .name = "KDF", .type = FR_TYPE_UINT16, .dict = &dict_eap_aka_sim },
143 { .out = &attr_eap_aka_sim_kdf_identity, .name = "KDF-Identity", .type = FR_TYPE_STRING, .dict = &dict_eap_aka_sim },
144 { .out = &attr_eap_aka_sim_kdf_input, .name = "KDF-Input", .type = FR_TYPE_STRING, .dict = &dict_eap_aka_sim },
145 { .out = &attr_eap_aka_sim_mac, .name = "MAC", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
146 { .out = &attr_eap_aka_sim_method_hint, .name = "Method-Hint", .type = FR_TYPE_UINT32, .dict = &dict_eap_aka_sim },
147 { .out = &attr_eap_aka_sim_mk, .name = "MK", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
148 { .out = &attr_eap_aka_sim_nonce_mt, .name = "Nonce-MT", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
149 { .out = &attr_eap_aka_sim_notification, .name = "Notification", .type = FR_TYPE_UINT16, .dict = &dict_eap_aka_sim },
150 { .out = &attr_eap_aka_sim_permanent_id_req, .name = "Permanent-Id-Req", .type = FR_TYPE_BOOL, .dict = &dict_eap_aka_sim },
151 { .out = &attr_eap_aka_sim_permanent_identity, .name = "Permanent-Identity", .type = FR_TYPE_STRING, .dict = &dict_eap_aka_sim },
152 { .out = &attr_eap_aka_sim_rand, .name = "RAND", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
153 { .out = &attr_eap_aka_sim_res, .name = "RES", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
154 { .out = &attr_eap_aka_sim_result_ind, .name = "Result-Ind", .type = FR_TYPE_BOOL, .dict = &dict_eap_aka_sim },
155 { .out = &attr_eap_aka_sim_selected_version, .name = "Selected-Version", .type = FR_TYPE_UINT16, .dict = &dict_eap_aka_sim },
156 { .out = &attr_eap_aka_sim_sres, .name = "SRES", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
157 { .out = &attr_eap_aka_sim_subtype, .name = "Subtype", .type = FR_TYPE_UINT32, .dict = &dict_eap_aka_sim },
158 { .out = &attr_eap_aka_sim_version_list, .name = "Version-List", .type = FR_TYPE_UINT16, .dict = &dict_eap_aka_sim },
159 { .out = &attr_eap_aka_sim_xres, .name = "XRES", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
160 { .out = &attr_session_data, .name = "Session-Data", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
161 { .out = &attr_session_id, .name = "Session-Id", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
162
163 { .out = &attr_eap_aka_sim_encr_data, .name = "Encr-Data", .type = FR_TYPE_TLV, .dict = &dict_eap_aka_sim },
164 { .out = &attr_eap_aka_sim_counter, .name = "Encr-Data.Counter", .type = FR_TYPE_UINT16, .dict = &dict_eap_aka_sim },
165 { .out = &attr_eap_aka_sim_nonce_s, .name = "Encr-Data.Nonce-S", .type = FR_TYPE_OCTETS, .dict = &dict_eap_aka_sim },
166 { .out = &attr_eap_aka_sim_next_pseudonym, .name = "Encr-Data.Next-Pseudonym", .type = FR_TYPE_STRING, .dict = &dict_eap_aka_sim },
167 { .out = &attr_eap_aka_sim_next_reauth_id, .name = "Encr-Data.Next-Reauth-ID", .type = FR_TYPE_STRING, .dict = &dict_eap_aka_sim },
168 { .out = &attr_eap_aka_sim_counter_too_small, .name = "Encr-Data.Counter-Too-Small", .type = FR_TYPE_BOOL, .dict = &dict_eap_aka_sim },
169
170 { .out = &attr_ms_mppe_send_key, .name = "Vendor-Specific.Microsoft.MPPE-Send-Key", .type = FR_TYPE_OCTETS, .dict = &dict_radius },
171 { .out = &attr_ms_mppe_recv_key, .name = "Vendor-Specific.Microsoft.MPPE-Recv-Key", .type = FR_TYPE_OCTETS, .dict = &dict_radius },
172
173 /*
174 * Separate from the EAP-AKA-AND-SIM dictionary
175 * as they're outside the notional numberspace.
176 */
177 { .out = &attr_eap_identity, .name = "EAP-Identity", .type = FR_TYPE_STRING, .dict = &dict_freeradius },
178 { .out = &attr_eap_type, .name = "EAP-Type", .type = FR_TYPE_UINT32, .dict = &dict_freeradius },
179
180 { .out = &attr_sim_algo_version, .name = "SIM-Algo-Version", .type = FR_TYPE_UINT32, .dict = &dict_freeradius },
181 { .out = &attr_sim_amf, .name = "SIM-AMF", .type = FR_TYPE_OCTETS, .dict = &dict_freeradius },
182 { .out = &attr_sim_ki, .name = "SIM-Ki", .type = FR_TYPE_OCTETS, .dict = &dict_freeradius },
183 { .out = &attr_sim_op, .name = "SIM-OP", .type = FR_TYPE_OCTETS, .dict = &dict_freeradius },
184 { .out = &attr_sim_opc, .name = "SIM-OPc", .type = FR_TYPE_OCTETS, .dict = &dict_freeradius },
185 { .out = &attr_sim_sqn, .name = "SIM-SQN", .type = FR_TYPE_UINT64, .dict = &dict_freeradius },
187};
188
192
194
197 { .out = &enum_eap_type_sim, .name = "SIM", .attr = &attr_eap_type },
198 { .out = &enum_eap_type_aka, .name = "AKA", .attr = &attr_eap_type },
199 { .out = &enum_eap_type_aka_prime, .name = "AKA-Prime", .attr = &attr_eap_type },
200
201 { .out = &enum_kdf_prime_with_ck_prime_ik_prime, .name = "Prime-With-CK-Prime-IK-Prime", .attr = &attr_eap_aka_sim_kdf },
202
204};
205
206/** SIM AT on-the-wire format attribute sizes
207 *
208 * Holds the min/max sizes of all supported SIM AT attribute values as they
209 * would be found in a SIM AT packet.
210 *
211 * These sizes may be different than the sizes of INTERNAL formats, PRESENTATION
212 * formats and generic NETWORK formats.
213 */
214size_t const fr_aka_sim_attr_sizes[FR_TYPE_MAX + 1][2] = {
215 [FR_TYPE_NULL] = {~0, 0},
216
217 [FR_TYPE_STRING] = {0, ~0},
218 [FR_TYPE_OCTETS] = {0, ~0},
219
220 [FR_TYPE_BOOL] = {2, 2},
221 [FR_TYPE_UINT8] = {1, 1},
222 [FR_TYPE_UINT16] = {2, 2},
223 [FR_TYPE_UINT32] = {4, 4},
224 [FR_TYPE_UINT64] = {8, 8},
225
226 [FR_TYPE_TLV] = {2, ~0},
227
228 [FR_TYPE_MAX] = {~0, 0} //!< Ensure array covers all types.
229};
230
231static int dict_flag_encrypt(fr_dict_attr_t **da_p, char const *value, UNUSED fr_dict_flag_parser_rule_t const *rules)
232{
233 static fr_table_num_sorted_t const encrypted[] = {
234 { L("aes-cbc"), AKA_SIM_FLAG_ENCRYPT_AES_CBC }
235 };
236 static size_t encrypted_len = NUM_ELEMENTS(encrypted);
237
240
242 if (encrypt == AKA_SIM_FLAG_ENCRYPT_INVALID) {
243 fr_strerror_printf("Unknown encryption type '%s'", value);
244 return -1;
245 }
246
247 flags->encrypt = encrypt;
248
249 return 0;
250}
251
253 { L("encrypt"), { .func = dict_flag_encrypt, .needs_value = true} }
254};
255
256/** Return the on-the-wire length of an attribute value
257 *
258 * @param[in] vp to return the length of.
259 * @return the length of the attribute.
260 */
262{
263 switch (vp->vp_type) {
265 return vp->vp_length;
266
268 if (!fr_cond_assert(0)) return 0;
269
270 default:
271 break;
272 }
273
274 return fr_aka_sim_attr_sizes[vp->vp_type][0];
275}
276
277/** Return the number of bytes before the octets value
278 *
279 */
281{
282 if (da->flags.array) return 0; /* Array elements have no padding */
283 if (!da->flags.length) return 2; /* Variable length attributes need length field */
284 if (!(da->flags.length % 4)) return 2; /* Values that are multiples of four have 2 reserved bytes */
285 return 0; /* Everything else has zero padding bytes */
286}
287
289{
290 if (instance_count > 0) {
292 return 0;
293 }
294
296 PERROR("Failed loading libfreeradius-eap-aka-sim dictionaries");
297 return -1;
298 }
300 PERROR("Failed loading libfreeradius-eap-aka-sim attributes");
302 return -1;
303 }
305 PERROR("Failed loading libfreeradius-eap-aka-sim enumerations");
306 return -1;
307 }
308
309 if (fr_openssl_init() < 0) {
310 PERROR("Failed setting up OpenSSL");
311 return -1;
312 }
313
315
316 return 0;
317}
318
320{
321 if (--instance_count > 0) return;
322
324
326
327 fr_openssl_free();
328}
329
332 .name = "eap_aka_sim",
333 .default_type_size = 1,
334 .default_type_length = 1,
335 .attr = {
336 .flags = {
337 .table = eap_aka_sim_flags,
338 .table_len = NUM_ELEMENTS(eap_aka_sim_flags),
339 .len = sizeof(fr_aka_sim_attr_flags_t)
340 }
341 }
342};
#define RCSID(id)
Definition build.h:512
#define L(_str)
Helper for initialising arrays of string literals.
Definition build.h:228
#define UNUSED
Definition build.h:336
#define NUM_ELEMENTS(_t)
Definition build.h:358
EAP-SIM/EAP-AKA Private crypto functions.
#define fr_cond_assert(_x)
Calls panic_action ifndef NDEBUG, else logs error and evaluates to value of _x.
Definition debug.h:131
int fr_dict_enum_autoload(fr_dict_enum_autoload_t const *to_load)
Process a dict_attr_autoload element to load/verify a dictionary attribute.
Definition dict_util.c:4333
#define fr_dict_autofree(_to_free)
Definition dict.h:915
fr_value_box_t const ** out
Enumeration value.
Definition dict.h:281
fr_dict_attr_t const ** out
Where to write a pointer to the resolved fr_dict_attr_t.
Definition dict.h:292
fr_dict_t const ** out
Where to write a pointer to the loaded/resolved fr_dict_t.
Definition dict.h:305
int fr_dict_attr_autoload(fr_dict_attr_autoload_t const *to_load)
Process a dict_attr_autoload element to load/verify a dictionary attribute.
Definition dict_util.c:4372
@ FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC
Protocol specific extensions.
Definition dict.h:190
#define fr_dict_autoload(_to_load)
Definition dict.h:912
#define DICT_AUTOLOAD_TERMINATOR
Definition dict.h:311
char const * name
name of this protocol
Definition dict.h:456
Specifies an attribute which must be present for the module to function.
Definition dict.h:291
Specifies a dictionary which must be loaded/loadable for the module to function.
Definition dict.h:304
Specifies a value which must be present for the module to function.
Definition dict.h:280
Protocol specific custom flag definitnion.
Definition dict.h:425
Protocol-specific callbacks in libfreeradius-PROTOCOL.
Definition dict.h:455
static void * fr_dict_attr_ext(fr_dict_attr_t const *da, fr_dict_attr_ext_t ext)
Definition dict_ext.h:121
Test enumeration values.
Definition dict_test.h:92
fr_aka_sim_attr_flags_encrypt_t
Definition base.h:259
@ AKA_SIM_FLAG_ENCRYPT_AES_CBC
Encrypt attribute RFC 2865 style.
Definition base.h:262
@ AKA_SIM_FLAG_ENCRYPT_INVALID
Invalid encryption flag.
Definition base.h:260
fr_aka_sim_attr_flags_encrypt_t encrypt
Attribute has a tag and is encrypted.
Definition base.h:266
void aka_sim_crypto_cipher_ctx_free(void)
Explicitly free all thread load cipher ctxs.
Definition crypto.c:86
static fr_dict_t const * dict_freeradius
Definition base.c:37
fr_dict_attr_t const * attr_eap_identity
Definition base.c:89
fr_dict_attr_t const * attr_eap_type
Definition base.c:90
fr_dict_t const * dict_radius
Definition base.c:76
fr_dict_attr_t const * attr_ms_mppe_send_key
Definition base.c:99
fr_dict_attr_t const * attr_ms_mppe_recv_key
Definition base.c:100
fr_dict_attr_t const * attr_eap_aka_sim_subtype
Definition base.c:101
fr_dict_attr_t const * attr_eap_aka_sim_permanent_identity
Definition base.c:95
fr_dict_attr_t const * attr_eap_aka_sim_k_aut
Definition base.c:79
fr_dict_attr_t const * attr_eap_aka_sim_next_pseudonym
Definition base.c:89
fr_dict_attr_t const * attr_sim_amf
Definition base.c:113
fr_dict_attr_t const * attr_eap_aka_sim_mk
Definition base.c:88
size_t fr_aka_sim_attr_len(fr_pair_t const *vp)
Return the on-the-wire length of an attribute value.
Definition base.c:261
fr_dict_attr_t const * attr_session_id
Definition base.c:105
fr_dict_attr_t const * attr_eap_aka_sim_hmac_extra_request
Definition base.c:72
fr_dict_protocol_t libfreeradius_eap_aka_sim_dict_protocol
Definition base.c:331
static int dict_flag_encrypt(fr_dict_attr_t **da_p, char const *value, UNUSED fr_dict_flag_parser_rule_t const *rules)
Definition base.c:231
fr_dict_attr_t const * attr_eap_aka_sim_counter_too_small
Definition base.c:69
fr_dict_attr_t const * attr_eap_aka_sim_next_reauth_id
Definition base.c:90
fr_dict_attr_t const * attr_eap_aka_sim_ak
Definition base.c:59
fr_dict_attr_t const * attr_sim_op
Definition base.c:115
fr_dict_attr_t const * attr_eap_aka_sim_kdf
Definition base.c:83
fr_dict_attr_t const * attr_eap_aka_sim_ik
Definition base.c:76
void fr_aka_sim_free(void)
Definition base.c:319
fr_dict_attr_t const * attr_eap_aka_sim_xres
Definition base.c:103
fr_dict_attr_t const * attr_eap_aka_sim_ck
Definition base.c:65
fr_value_box_t const * enum_kdf_prime_with_ck_prime_ik_prime
Definition base.c:193
fr_dict_attr_t const * attr_eap_aka_sim_permanent_id_req
Definition base.c:94
fr_dict_attr_t const * attr_session_data
Definition base.c:104
static uint32_t instance_count
Definition base.c:44
fr_dict_attr_t const * attr_sim_ki
Definition base.c:114
int fr_aka_sim_init(void)
Definition base.c:288
fr_value_box_t const * enum_eap_type_aka
Definition base.c:190
size_t fr_aka_sim_octets_prefix_len(fr_dict_attr_t const *da)
Return the number of bytes before the octets value.
Definition base.c:280
fr_dict_attr_t const * attr_eap_aka_sim_sres
Definition base.c:100
fr_dict_attr_t const * attr_eap_aka_sim_iv
Definition base.c:78
fr_dict_attr_t const * attr_eap_aka_sim_kc
Definition base.c:82
fr_value_box_t const * enum_eap_type_sim
Definition base.c:189
fr_dict_attr_t const * attr_eap_aka_sim_notification
Definition base.c:93
fr_dict_attr_t const * attr_eap_aka_sim_client_error_code
Definition base.c:67
fr_dict_attr_t const * attr_eap_aka_sim_hmac_extra_response
Definition base.c:73
fr_dict_attr_t const * attr_eap_aka_sim_auts
Definition base.c:62
fr_dict_attr_t const * attr_eap_aka_sim_ik_prime
Definition base.c:77
fr_dict_attr_t const * attr_eap_aka_sim_k_re
Definition base.c:81
fr_dict_attr_t const * attr_eap_aka_sim_identity_type
Definition base.c:75
fr_dict_attr_t const * attr_eap_aka_sim_any_id_req
Definition base.c:60
fr_dict_attr_t const * attr_eap_aka_sim_k_encr
Definition base.c:80
fr_dict_attr_t const * attr_sim_sqn
Definition base.c:117
fr_dict_attr_t const * attr_eap_aka_sim_autn
Definition base.c:61
fr_dict_attr_t const * attr_eap_aka_sim_nonce_mt
Definition base.c:91
fr_dict_attr_t const * attr_eap_aka_sim_result_ind
Definition base.c:98
fr_dict_enum_autoload_t libfreeradius_aka_sim_dict_enum[]
Definition base.c:196
fr_dict_attr_t const * attr_eap_aka_sim_bidding
Definition base.c:63
fr_dict_t const * dict_eap_aka_sim
Definition base.c:48
fr_dict_attr_t const * attr_sim_opc
Definition base.c:116
fr_value_box_t const * enum_eap_type_aka_prime
Definition base.c:191
fr_dict_attr_t const * attr_eap_aka_sim_ck_prime
Definition base.c:66
fr_dict_attr_t const * attr_sim_algo_version
Definition base.c:112
fr_dict_attr_t const * attr_eap_aka_sim_version_list
Definition base.c:102
fr_dict_attr_t const * attr_eap_aka_sim_mac
Definition base.c:86
static fr_dict_flag_parser_t const eap_aka_sim_flags[]
Definition base.c:252
fr_dict_autoload_t libfreeradius_aka_sim_dict[]
Definition base.c:51
fr_dict_attr_t const * attr_eap_aka_sim_res
Definition base.c:97
fr_dict_attr_t const * attr_eap_aka_sim_identity
Definition base.c:74
fr_dict_attr_t const * attr_eap_aka_sim_nonce_s
Definition base.c:92
fr_dict_attr_t const * attr_eap_aka_sim_encr_data
Definition base.c:70
fr_dict_attr_t const * attr_eap_aka_sim_counter
Definition base.c:68
fr_dict_attr_t const * attr_eap_aka_sim_selected_version
Definition base.c:99
fr_dict_attr_t const * attr_eap_aka_sim_method_hint
Definition base.c:87
fr_dict_attr_t const * attr_eap_aka_sim_kdf_identity
Definition base.c:84
fr_dict_attr_t const * attr_eap_aka_sim_kdf_input
Definition base.c:85
fr_dict_attr_t const * attr_eap_aka_sim_checkcode
Definition base.c:64
fr_dict_attr_autoload_t libfreeradius_aka_sim_dict_attr[]
Definition base.c:120
fr_dict_attr_t const * attr_eap_aka_sim_rand
Definition base.c:96
fr_dict_attr_t const * attr_eap_aka_sim_fullauth_id_req
Definition base.c:71
size_t const fr_aka_sim_attr_sizes[FR_TYPE_MAX+1][2]
SIM AT on-the-wire format attribute sizes.
Definition base.c:214
#define PERROR(_fmt,...)
Definition log.h:228
@ FR_TYPE_TLV
Contains nested attributes.
@ FR_TYPE_STRING
String of printable characters.
@ FR_TYPE_MAX
Number of defined data types.
@ FR_TYPE_NULL
Invalid (uninitialised) attribute type.
@ FR_TYPE_UINT16
16 Bit unsigned integer.
@ FR_TYPE_UINT8
8 Bit unsigned integer.
@ FR_TYPE_UINT32
32 Bit unsigned integer.
@ FR_TYPE_UINT64
64 Bit unsigned integer.
@ FR_TYPE_BOOL
A truth value.
@ FR_TYPE_OCTETS
Raw octets.
unsigned int uint32_t
fr_pair_t * vp
Stores an attribute, a value and various bits of other data.
Definition pair.h:68
#define fr_table_value_by_str(_table, _name, _def)
Convert a string to a value using a sorted or ordered table.
Definition table.h:685
An element in a lexicographically sorted array of name to num mappings.
Definition table.h:49
#define fr_strerror_printf(_fmt,...)
Log to thread local error buffer.
Definition strerror.h:64
#define FR_TYPE_VARIABLE_SIZE
Definition types.h:311
#define FR_TYPE_STRUCTURAL
Definition types.h:316