The FreeRADIUS server  $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
radius.h
Go to the documentation of this file.
1 #pragma once
2 /*
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation; either version 2 of the License, or
6  * (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
16  */
17 
18 /*
19  * $Id: bead5d6cf7b4b60535611a2c40a5df819d93521b $
20  *
21  * @file protocols/radius/radius.h
22  * @brief Structures and prototypes for base RADIUS functionality.
23  *
24  * @copyright 1999-2017 The FreeRADIUS server project
25  */
26 #include <freeradius-devel/radius/defs.h>
27 #include <freeradius-devel/util/packet.h>
28 #include <freeradius-devel/util/rand.h>
29 #include <freeradius-devel/util/log.h>
30 #include <freeradius-devel/util/dbuff.h>
31 
32 #define RADIUS_AUTH_VECTOR_OFFSET 4
33 #define RADIUS_HEADER_LENGTH 20
34 #define RADIUS_MAX_STRING_LENGTH 253
35 #define RADIUS_MAX_TUNNEL_PASSWORD_LENGTH 249
36 #define RADIUS_AUTH_VECTOR_LENGTH 16
37 #define RADIUS_MESSAGE_AUTHENTICATOR_LENGTH 16
38 #define RADIUS_MAX_PASS_LENGTH 256
39 #define RADIUS_MAX_ATTRIBUTES 255
40 #define RADIUS_MAX_PACKET_SIZE 4096
41 
42 #define RADIUS_VENDORPEC_USR 429
43 #define RADIUS_VENDORPEC_LUCENT 4846
44 #define RADIUS_VENDORPEC_STARENT 8164
45 
46 /*
47  * protocols/radius/base.c
48  */
49 
50 extern char const *fr_radius_packet_name[FR_RADIUS_CODE_MAX];
51 #define FR_RADIUS_PACKET_CODE_VALID(_x) ((_x > 0) && (_x < FR_RADIUS_CODE_MAX))
52 
53 #define AUTH_PASS_LEN (RADIUS_AUTH_VECTOR_LENGTH)
54 
55 #define FR_TUNNEL_FR_ENC_LENGTH(_x) (2 + 1 + _x + PAD(_x + 1, 16))
58 
59 typedef enum {
77 
78 /** subtype values for RADIUS
79  *
80  * Order of the flags is important for the flag_foo() checks.
81  */
82 enum {
83  FLAG_NONE = 0, //!< No extra flags
84  FLAG_EXTENDED_ATTR, //!< the attribute is an extended attribute
85  FLAG_LONG_EXTENDED_ATTR, //!< the attribute is a long extended attribute
86  FLAG_CONCAT, //!< the attribute is concatenated
87  FLAG_HAS_TAG, //!< the attribute has a tag
88  FLAG_ABINARY, //!< the attribute is in "abinary" format
89  FLAG_TAGGED_TUNNEL_PASSWORD, //!< the attribute has a tag and is encrypted
90 
91  FLAG_ENCRYPT_USER_PASSWORD, //!< Encrypt attribute RFC 2865 style.
92  FLAG_ENCRYPT_TUNNEL_PASSWORD, //!< Encrypt attribute RFC 2868 style.
93  FLAG_ENCRYPT_ASCEND_SECRET, //!< Encrypt attribute ascend style.
94 };
95 
96 
97 #define flag_has_tag(_flags) (!(_flags)->extra && (((_flags)->subtype == FLAG_HAS_TAG) || ((_flags)->subtype == FLAG_TAGGED_TUNNEL_PASSWORD)))
98 #define flag_concat(_flags) (!(_flags)->extra && (_flags)->subtype == FLAG_CONCAT)
99 #define flag_abinary(_flags) (!(_flags)->extra && (_flags)->subtype == FLAG_ABINARY)
100 #define flag_encrypted(_flags) (!(_flags)->extra && (_flags)->subtype >= FLAG_TAGGED_TUNNEL_PASSWORD)
101 #define flag_extended(_flags) (!(_flags)->extra && (((_flags)->subtype == FLAG_EXTENDED_ATTR) || (_flags)->subtype == FLAG_LONG_EXTENDED_ATTR))
102 #define flag_long_extended(_flags) (!(_flags)->extra && (_flags)->subtype == FLAG_LONG_EXTENDED_ATTR)
103 #define flag_tunnel_password(_flags) (!(_flags)->extra && (((_flags)->subtype == FLAG_ENCRYPT_TUNNEL_PASSWORD) || ((_flags)->subtype == FLAG_TAGGED_TUNNEL_PASSWORD)))
104 
105 typedef struct {
109 
110 typedef struct {
111  char const *secret;
113 
114  bool add_proxy_state; //!< do we add a Proxy-State?
115  uint64_t my_proxy_state; //!< if so, this is its value
116 
117  uint32_t acct_delay_time; //!< additional time to add to acct_delay_time
118 
119  uint8_t vector[RADIUS_AUTH_VECTOR_LENGTH]; //!< vector for authenticating the reply
121 
122 typedef struct {
124 
126 
127  fr_fast_rand_t rand_ctx; //!< for tunnel passwords
128  int salt_offset; //!< for tunnel passwords
129 
130  uint8_t tag; //!< current tag for encoding
131 
132  bool disallow_tunnel_passwords; //!< not all packets can have tunnel passwords
135 
136 typedef struct {
138 
140 
141  TALLOC_CTX *tmp_ctx; //!< for temporary things cleaned up during decoding
142  uint8_t const *end; //!< end of the packet
143 
144  uint8_t request_code; //!< original code for the request.
145 
146  bool tunnel_password_zeros; //!< check for trailing zeros on decode
147  bool verify; //!< can skip verify for dynamic clients
149 
150  fr_radius_tag_ctx_t **tags; //!< for decoding tagged attributes
151  fr_pair_list_t *tag_root; //!< Where to insert tag attributes.
152  TALLOC_CTX *tag_root_ctx; //!< Where to allocate new tag attributes.
154 
155 /*
156  * protocols/radius/base.c
157  */
158 int fr_radius_allow_reply(int code, bool allowed[static FR_RADIUS_CODE_MAX]);
159 
160 int fr_radius_sign(uint8_t *packet, uint8_t const *vector,
161  uint8_t const *secret, size_t secret_len) CC_HINT(nonnull (1,3));
162 int fr_radius_verify(uint8_t *packet, uint8_t const *vector,
163  uint8_t const *secret, size_t secret_len, bool require_ma) CC_HINT(nonnull (1,3));
164 bool fr_radius_ok(uint8_t const *packet, size_t *packet_len_p,
165  uint32_t max_attributes, bool require_ma, decode_fail_t *reason) CC_HINT(nonnull (1,2));
166 
168  char const *secret, uint8_t const *vector);
169 
170 ssize_t fr_radius_recv_header(int sockfd, fr_ipaddr_t *src_ipaddr, uint16_t *src_port, unsigned int *code);
171 
172 ssize_t fr_radius_encode(uint8_t *packet, size_t packet_len, uint8_t const *original,
173  char const *secret, size_t secret_len, int code, int id, fr_pair_list_t *vps);
174 
176  char const *secret, UNUSED size_t secret_len, int code, int id, fr_pair_list_t *vps);
177 
178 ssize_t fr_radius_decode(TALLOC_CTX *ctx, fr_pair_list_t *out,
179  uint8_t *packet, size_t packet_len,
180  fr_radius_decode_ctx_t *decode_ctx) CC_HINT(nonnull);
181 
183  uint8_t *packet, size_t packet_len,
184  uint8_t const *vector, char const *secret) CC_HINT(nonnull(1,2,3,6));
185 
186 int fr_radius_global_init(void);
187 
188 void fr_radius_global_free(void);
189 
190 /*
191  * protocols/radius/packet.c
192  */
194  fr_packet_t const *original,
195  char const *secret) CC_HINT(nonnull (1,2,4));
196 
197 bool fr_packet_ok(fr_packet_t *packet, uint32_t max_attributes, bool require_ma,
198  decode_fail_t *reason) CC_HINT(nonnull (1));
199 
200 int fr_packet_verify(fr_packet_t *packet, fr_packet_t *original,
201  char const *secret) CC_HINT(nonnull (1,3));
202 int fr_packet_sign(fr_packet_t *packet, fr_packet_t const *original,
203  char const *secret) CC_HINT(nonnull (1,3));
204 
205 fr_packet_t *fr_packet_recv(TALLOC_CTX *ctx, int fd, int flags, uint32_t max_attributes, bool require_ma);
206 int fr_packet_send(fr_packet_t *packet, fr_pair_list_t *list,
207  fr_packet_t const *original, char const *secret) CC_HINT(nonnull (1,2,4));
208 
209 #define fr_packet_log_hex(_log, _packet) _fr_packet_log_hex(_log, _packet, __FILE__, __LINE__)
210 void _fr_packet_log_hex(fr_log_t const *log, fr_packet_t const *packet, char const *file, int line) CC_HINT(nonnull);
211 
212 /*
213  * protocols/radius/abinary.c
214  */
216 
217 ssize_t fr_radius_decode_abinary(fr_pair_t *vp, uint8_t const *data, size_t data_len);
218 
219 /*
220  * protocols/radius/encode.c
221  */
223 
225 
226 /*
227  * protocols/radius/decode.c
228  */
229 int fr_radius_decode_tlv_ok(uint8_t const *data, size_t length, size_t dv_type, size_t dv_length);
230 
231 ssize_t fr_radius_decode_pair_value(TALLOC_CTX *ctx, fr_pair_list_t *list,
232  fr_dict_attr_t const *parent,
233  uint8_t const *data, size_t const attr_len,
234  void *packet_ctx) CC_HINT(nonnull);
235 
236 ssize_t fr_radius_decode_tlv(TALLOC_CTX *ctx, fr_pair_list_t *list,
237  fr_dict_attr_t const *parent,
238  uint8_t const *data, size_t data_len,
239  fr_radius_decode_ctx_t *packet_ctx) CC_HINT(nonnull);
240 
241 ssize_t fr_radius_decode_pair(TALLOC_CTX *ctx, fr_pair_list_t *list,
242  uint8_t const *data, size_t data_len, fr_radius_decode_ctx_t *packet_ctx) CC_HINT(nonnull);
243 
245  uint8_t const *data, size_t data_len) CC_HINT(nonnull);
246 
247 void fr_radius_packet_header_log(fr_log_t const *log, fr_packet_t *packet, bool received);
248 
249 void fr_radius_packet_log(fr_log_t const *log, fr_packet_t *packet, fr_pair_list_t *list, bool received);
int const char * file
Definition: acutest.h:702
int const char int line
Definition: acutest.h:702
#define UNUSED
Definition: build.h:313
@ FR_RADIUS_CODE_MAX
Maximum possible protocol code.
Definition: defs.h:53
static int sockfd
Definition: dhcpclient.c:56
static fr_slen_t in
Definition: dict.h:645
IPv4/6 prefix.
Definition: merged_model.c:272
unsigned short uint16_t
Definition: merged_model.c:31
unsigned int uint32_t
Definition: merged_model.c:33
long int ssize_t
Definition: merged_model.c:24
unsigned char uint8_t
Definition: merged_model.c:30
static fr_internal_encode_ctx_t encode_ctx
static char * secret
Definition: radclient-ng.c:69
ssize_t fr_radius_decode_foreign(TALLOC_CTX *ctx, fr_pair_list_t *out, uint8_t const *data, size_t data_len)
Definition: decode.c:2087
fr_pair_t * parent
Definition: radius.h:106
fr_radius_tag_ctx_t ** tags
for decoding tagged attributes
Definition: radius.h:150
@ FLAG_CONCAT
the attribute is concatenated
Definition: radius.h:86
@ FLAG_NONE
No extra flags.
Definition: radius.h:83
@ FLAG_ENCRYPT_ASCEND_SECRET
Encrypt attribute ascend style.
Definition: radius.h:93
@ FLAG_ENCRYPT_TUNNEL_PASSWORD
Encrypt attribute RFC 2868 style.
Definition: radius.h:92
@ FLAG_ENCRYPT_USER_PASSWORD
Encrypt attribute RFC 2865 style.
Definition: radius.h:91
@ FLAG_TAGGED_TUNNEL_PASSWORD
the attribute has a tag and is encrypted
Definition: radius.h:89
@ FLAG_HAS_TAG
the attribute has a tag
Definition: radius.h:87
@ FLAG_EXTENDED_ATTR
the attribute is an extended attribute
Definition: radius.h:84
@ FLAG_ABINARY
the attribute is in "abinary" format
Definition: radius.h:88
@ FLAG_LONG_EXTENDED_ATTR
the attribute is a long extended attribute
Definition: radius.h:85
fr_fast_rand_t rand_ctx
for tunnel passwords
Definition: radius.h:127
bool fr_radius_ok(uint8_t const *packet, size_t *packet_len_p, uint32_t max_attributes, bool require_ma, decode_fail_t *reason))
See if the data pointed to by PTR is a valid RADIUS packet.
Definition: merged_model.c:259
int fr_radius_verify(uint8_t *packet, uint8_t const *vector, uint8_t const *secret, size_t secret_len, bool require_ma))
Verify a request / response packet.
Definition: base.c:719
bool fr_packet_ok(fr_packet_t *packet, uint32_t max_attributes, bool require_ma, decode_fail_t *reason))
See if the data pointed to by PTR is a valid RADIUS packet.
Definition: packet.c:115
uint64_t my_proxy_state
if so, this is its value
Definition: radius.h:115
ssize_t fr_radius_decode_pair(TALLOC_CTX *ctx, fr_pair_list_t *list, uint8_t const *data, size_t data_len, fr_radius_decode_ctx_t *packet_ctx)
Create a "normal" fr_pair_t from the given data.
Definition: decode.c:1982
uint8_t request_code
original code for the request.
Definition: radius.h:144
ssize_t fr_radius_decode_abinary(fr_pair_t *vp, uint8_t const *data, size_t data_len)
Print an Ascend binary filter attribute to a string,.
Definition: abinary.c:1322
ssize_t fr_radius_decode_simple(TALLOC_CTX *ctx, fr_pair_list_t *out, uint8_t *packet, size_t packet_len, uint8_t const *vector, char const *secret))
Simple wrapper for callers who just need a shared secret.
Definition: base.c:1097
uint8_t const * request_authenticator
Definition: radius.h:139
int fr_packet_sign(fr_packet_t *packet, fr_packet_t const *original, char const *secret))
Sign a previously encoded packet.
Definition: packet.c:160
ssize_t fr_radius_ascend_secret(fr_dbuff_t *dbuff, uint8_t const *in, size_t inlen, char const *secret, uint8_t const *vector)
Do Ascend-Send / Recv-Secret calculation.
Definition: base.c:190
ssize_t fr_radius_decode(TALLOC_CTX *ctx, fr_pair_list_t *out, uint8_t *packet, size_t packet_len, fr_radius_decode_ctx_t *decode_ctx)
Definition: base.c:997
fr_dcursor_t cursor
Definition: radius.h:107
int fr_packet_verify(fr_packet_t *packet, fr_packet_t *original, char const *secret))
Verify the Request/Response Authenticator (and Message-Authenticator if present) of a packet.
Definition: packet.c:139
int fr_radius_sign(uint8_t *packet, uint8_t const *vector, uint8_t const *secret, size_t secret_len))
Sign a previously encoded packet.
Definition: base.c:301
bool add_proxy_state
do we add a Proxy-State?
Definition: radius.h:114
bool disallow_tunnel_passwords
not all packets can have tunnel passwords
Definition: radius.h:132
char const * secret
Definition: radius.h:111
ssize_t fr_radius_decode_tlv(TALLOC_CTX *ctx, fr_pair_list_t *list, fr_dict_attr_t const *parent, uint8_t const *data, size_t data_len, fr_radius_decode_ctx_t *packet_ctx)
Convert TLVs to one or more VPs.
Definition: decode.c:647
uint8_t const * end
end of the packet
Definition: radius.h:142
ssize_t fr_radius_encode(uint8_t *packet, size_t packet_len, uint8_t const *original, char const *secret, size_t secret_len, int code, int id, fr_pair_list_t *vps)
Encode VPS into a raw RADIUS packet.
Definition: base.c:860
int fr_radius_global_init(void)
Definition: base.c:1119
int fr_packet_send(fr_packet_t *packet, fr_pair_list_t *list, fr_packet_t const *original, char const *secret))
Reply to the request.
Definition: packet.c:297
ssize_t fr_radius_encode_pair(fr_dbuff_t *dbuff, fr_dcursor_t *cursor, void *encode_ctx)
Encode a data structure into a RADIUS attribute.
Definition: encode.c:1498
void fr_radius_packet_header_log(fr_log_t const *log, fr_packet_t *packet, bool received)
Definition: packet.c:426
uint8_t const * request_authenticator
Definition: radius.h:125
uint8_t tag
current tag for encoding
Definition: radius.h:130
int fr_radius_decode_tlv_ok(uint8_t const *data, size_t length, size_t dv_type, size_t dv_length)
Check if a set of RADIUS formatted TLVs are OK.
Definition: decode.c:250
bool require_message_authenticator
Definition: radius.h:148
void _fr_packet_log_hex(fr_log_t const *log, fr_packet_t const *packet, char const *file, int line)
Definition: packet.c:355
TALLOC_CTX * tag_root_ctx
Where to allocate new tag attributes.
Definition: radius.h:152
#define RADIUS_AUTH_VECTOR_LENGTH
Definition: radius.h:36
size_t secret_length
Definition: radius.h:112
size_t fr_radius_request_name_table_len
Definition: base.c:92
ssize_t fr_radius_encode_foreign(fr_dbuff_t *dbuff, fr_pair_list_t const *list)
Definition: encode.c:1663
ssize_t fr_radius_decode_pair_value(TALLOC_CTX *ctx, fr_pair_list_t *list, fr_dict_attr_t const *parent, uint8_t const *data, size_t const attr_len, void *packet_ctx)
Create any kind of VP from the attribute contents.
Definition: decode.c:1475
decode_fail_t
Definition: radius.h:59
@ DECODE_FAIL_UNKNOWN
Definition: radius.h:74
@ DECODE_FAIL_INVALID_ATTRIBUTE
Definition: radius.h:66
@ DECODE_FAIL_ATTRIBUTE_UNDERFLOW
Definition: radius.h:70
@ DECODE_FAIL_MIN_LENGTH_FIELD
Definition: radius.h:62
@ DECODE_FAIL_HEADER_OVERFLOW
Definition: radius.h:64
@ DECODE_FAIL_ATTRIBUTE_TOO_SHORT
Definition: radius.h:67
@ DECODE_FAIL_MA_INVALID
Definition: radius.h:73
@ DECODE_FAIL_ATTRIBUTE_OVERFLOW
Definition: radius.h:68
@ DECODE_FAIL_TOO_MANY_ATTRIBUTES
Definition: radius.h:71
@ DECODE_FAIL_NONE
Definition: radius.h:60
@ DECODE_FAIL_MIN_LENGTH_PACKET
Definition: radius.h:61
@ DECODE_FAIL_MIN_LENGTH_MISMATCH
Definition: radius.h:63
@ DECODE_FAIL_MA_INVALID_LENGTH
Definition: radius.h:69
@ DECODE_FAIL_MAX
Definition: radius.h:75
@ DECODE_FAIL_MA_MISSING
Definition: radius.h:72
@ DECODE_FAIL_UNKNOWN_PACKET_CODE
Definition: radius.h:65
bool verify
can skip verify for dynamic clients
Definition: radius.h:147
void fr_radius_global_free(void)
Definition: base.c:1142
uint32_t acct_delay_time
additional time to add to acct_delay_time
Definition: radius.h:117
fr_radius_ctx_t * common
Definition: radius.h:123
ssize_t fr_radius_encode_abinary(fr_pair_t const *vp, fr_dbuff_t *dbuff)
Encode a string to abinary.
Definition: abinary.c:1198
fr_table_num_sorted_t const fr_radius_request_name_table[]
Definition: base.c:83
int salt_offset
for tunnel passwords
Definition: radius.h:128
ssize_t fr_packet_encode(fr_packet_t *packet, fr_pair_list_t *list, fr_packet_t const *original, char const *secret))
Encode a packet.
Definition: packet.c:52
ssize_t fr_radius_encode_dbuff(fr_dbuff_t *dbuff, uint8_t const *original, char const *secret, UNUSED size_t secret_len, int code, int id, fr_pair_list_t *vps)
bool tunnel_password_zeros
check for trailing zeros on decode
Definition: radius.h:146
fr_radius_ctx_t * common
Definition: radius.h:137
bool seen_message_authenticator
Definition: radius.h:133
void fr_radius_packet_log(fr_log_t const *log, fr_packet_t *packet, fr_pair_list_t *list, bool received)
Definition: packet.c:497
char const * fr_radius_packet_name[FR_RADIUS_CODE_MAX]
Definition: base.c:94
fr_packet_t * fr_packet_recv(TALLOC_CTX *ctx, int fd, int flags, uint32_t max_attributes, bool require_ma)
Receive UDP client requests, and fill in the basics of a fr_packet_t structure.
Definition: packet.c:211
ssize_t fr_radius_recv_header(int sockfd, fr_ipaddr_t *src_ipaddr, uint16_t *src_port, unsigned int *code)
Basic validation of RADIUS packet header.
Definition: base.c:228
TALLOC_CTX * tmp_ctx
for temporary things cleaned up during decoding
Definition: radius.h:141
fr_pair_list_t * tag_root
Where to insert tag attributes.
Definition: radius.h:151
int fr_radius_allow_reply(int code, bool allowed[static FR_RADIUS_CODE_MAX])
Definition: base.c:170
Smaller fast random number generator.
Definition: rand.h:54
fr_pair_t * vp
Definition: log.h:96
Stores an attribute, a value and various bits of other data.
Definition: pair.h:68
An element in a lexicographically sorted array of name to num mappings.
Definition: table.h:45
static fr_slen_t parent
Definition: pair.h:844
static fr_slen_t data
Definition: value.h:1259
static size_t char fr_sbuff_t size_t inlen
Definition: value.h:984
int nonnull(2, 5))
static size_t char ** out
Definition: value.h:984