1*03f9172cSAndroid Build Coastguard Worker /*
2*03f9172cSAndroid Build Coastguard Worker * RADIUS message processing
3*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2002-2009, 2012, 2014-2022, Jouni Malinen <[email protected]>
4*03f9172cSAndroid Build Coastguard Worker *
5*03f9172cSAndroid Build Coastguard Worker * This software may be distributed under the terms of the BSD license.
6*03f9172cSAndroid Build Coastguard Worker * See README for more details.
7*03f9172cSAndroid Build Coastguard Worker */
8*03f9172cSAndroid Build Coastguard Worker
9*03f9172cSAndroid Build Coastguard Worker #ifndef RADIUS_H
10*03f9172cSAndroid Build Coastguard Worker #define RADIUS_H
11*03f9172cSAndroid Build Coastguard Worker
12*03f9172cSAndroid Build Coastguard Worker /* RFC 2865 - RADIUS */
13*03f9172cSAndroid Build Coastguard Worker
14*03f9172cSAndroid Build Coastguard Worker #ifdef _MSC_VER
15*03f9172cSAndroid Build Coastguard Worker #pragma pack(push, 1)
16*03f9172cSAndroid Build Coastguard Worker #endif /* _MSC_VER */
17*03f9172cSAndroid Build Coastguard Worker
18*03f9172cSAndroid Build Coastguard Worker struct radius_hdr {
19*03f9172cSAndroid Build Coastguard Worker u8 code;
20*03f9172cSAndroid Build Coastguard Worker u8 identifier;
21*03f9172cSAndroid Build Coastguard Worker be16 length; /* including this header */
22*03f9172cSAndroid Build Coastguard Worker u8 authenticator[16];
23*03f9172cSAndroid Build Coastguard Worker /* followed by length-20 octets of attributes */
24*03f9172cSAndroid Build Coastguard Worker } STRUCT_PACKED;
25*03f9172cSAndroid Build Coastguard Worker
26*03f9172cSAndroid Build Coastguard Worker enum { RADIUS_CODE_ACCESS_REQUEST = 1,
27*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_ACCESS_ACCEPT = 2,
28*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_ACCESS_REJECT = 3,
29*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_ACCOUNTING_REQUEST = 4,
30*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_ACCOUNTING_RESPONSE = 5,
31*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_ACCESS_CHALLENGE = 11,
32*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_STATUS_SERVER = 12,
33*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_STATUS_CLIENT = 13,
34*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_DISCONNECT_REQUEST = 40,
35*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_DISCONNECT_ACK = 41,
36*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_DISCONNECT_NAK = 42,
37*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_COA_REQUEST = 43,
38*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_COA_ACK = 44,
39*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_COA_NAK = 45,
40*03f9172cSAndroid Build Coastguard Worker RADIUS_CODE_RESERVED = 255
41*03f9172cSAndroid Build Coastguard Worker };
42*03f9172cSAndroid Build Coastguard Worker
43*03f9172cSAndroid Build Coastguard Worker struct radius_attr_hdr {
44*03f9172cSAndroid Build Coastguard Worker u8 type;
45*03f9172cSAndroid Build Coastguard Worker u8 length; /* including this header */
46*03f9172cSAndroid Build Coastguard Worker /* followed by length-2 octets of attribute value */
47*03f9172cSAndroid Build Coastguard Worker } STRUCT_PACKED;
48*03f9172cSAndroid Build Coastguard Worker
49*03f9172cSAndroid Build Coastguard Worker struct radius_attr_hdr_ext {
50*03f9172cSAndroid Build Coastguard Worker u8 type;
51*03f9172cSAndroid Build Coastguard Worker u8 length; /* including this header */
52*03f9172cSAndroid Build Coastguard Worker u8 ext_type;
53*03f9172cSAndroid Build Coastguard Worker /* followed by length-3 octets of attribute value */
54*03f9172cSAndroid Build Coastguard Worker } STRUCT_PACKED;
55*03f9172cSAndroid Build Coastguard Worker
56*03f9172cSAndroid Build Coastguard Worker #define RADIUS_MAX_ATTR_LEN (255 - sizeof(struct radius_attr_hdr))
57*03f9172cSAndroid Build Coastguard Worker #define RADIUS_MAX_EXT_ATTR_LEN (255 - sizeof(struct radius_attr_hdr_ext))
58*03f9172cSAndroid Build Coastguard Worker
59*03f9172cSAndroid Build Coastguard Worker enum { RADIUS_ATTR_USER_NAME = 1,
60*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_USER_PASSWORD = 2,
61*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_NAS_IP_ADDRESS = 4,
62*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_NAS_PORT = 5,
63*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_SERVICE_TYPE = 6,
64*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_FRAMED_IP_ADDRESS = 8,
65*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_FILTER_ID = 11,
66*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_FRAMED_MTU = 12,
67*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_REPLY_MESSAGE = 18,
68*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_STATE = 24,
69*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_CLASS = 25,
70*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_VENDOR_SPECIFIC = 26,
71*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_SESSION_TIMEOUT = 27,
72*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_IDLE_TIMEOUT = 28,
73*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_TERMINATION_ACTION = 29,
74*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_CALLED_STATION_ID = 30,
75*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_CALLING_STATION_ID = 31,
76*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_NAS_IDENTIFIER = 32,
77*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_PROXY_STATE = 33,
78*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_STATUS_TYPE = 40,
79*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_DELAY_TIME = 41,
80*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_INPUT_OCTETS = 42,
81*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_OUTPUT_OCTETS = 43,
82*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_SESSION_ID = 44,
83*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_AUTHENTIC = 45,
84*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_SESSION_TIME = 46,
85*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_INPUT_PACKETS = 47,
86*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_OUTPUT_PACKETS = 48,
87*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_TERMINATE_CAUSE = 49,
88*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_MULTI_SESSION_ID = 50,
89*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_LINK_COUNT = 51,
90*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_INPUT_GIGAWORDS = 52,
91*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_OUTPUT_GIGAWORDS = 53,
92*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EVENT_TIMESTAMP = 55,
93*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EGRESS_VLANID = 56,
94*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_NAS_PORT_TYPE = 61,
95*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_TUNNEL_TYPE = 64,
96*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_TUNNEL_MEDIUM_TYPE = 65,
97*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_TUNNEL_PASSWORD = 69,
98*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_CONNECT_INFO = 77,
99*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EAP_MESSAGE = 79,
100*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_MESSAGE_AUTHENTICATOR = 80,
101*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_TUNNEL_PRIVATE_GROUP_ID = 81,
102*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ACCT_INTERIM_INTERVAL = 85,
103*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_CHARGEABLE_USER_IDENTITY = 89,
104*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_NAS_IPV6_ADDRESS = 95,
105*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_ERROR_CAUSE = 101,
106*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EAP_KEY_NAME = 102,
107*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_OPERATOR_NAME = 126,
108*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_LOCATION_INFO = 127,
109*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_LOCATION_DATA = 128,
110*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_BASIC_LOCATION_POLICY_RULES = 129,
111*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXTENDED_LOCATION_POLICY_RULES = 130,
112*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_LOCATION_CAPABLE = 131,
113*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_REQUESTED_LOCATION_INFO = 132,
114*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_GSS_ACCEPTOR_SERVICE_NAME = 164,
115*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_GSS_ACCEPTOR_HOST_NAME = 165,
116*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_GSS_ACCEPTOR_SERVICE_SPECIFICS = 166,
117*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_GSS_ACCEPTOR_REALM_NAME = 167,
118*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_MOBILITY_DOMAIN_ID = 177,
119*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_WLAN_HESSID = 181,
120*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_WLAN_REASON_CODE = 185,
121*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_WLAN_PAIRWISE_CIPHER = 186,
122*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_WLAN_GROUP_CIPHER = 187,
123*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_WLAN_AKM_SUITE = 188,
124*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_WLAN_GROUP_MGMT_CIPHER = 189,
125*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXT_TYPE_1 = 241,
126*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXT_TYPE_2 = 242,
127*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXT_TYPE_3 = 243,
128*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXT_TYPE_4 = 244,
129*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_LONG_EXT_TYPE_1 = 245,
130*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_LONG_EXT_TYPE_2 = 246,
131*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXT_VENDOR_SPECIFIC_1 = (241 << 8) | 26,
132*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXT_VENDOR_SPECIFIC_2 = (242 << 8) | 26,
133*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXT_VENDOR_SPECIFIC_3 = (243 << 8) | 26,
134*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXT_VENDOR_SPECIFIC_4 = (244 << 8) | 26,
135*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXT_VENDOR_SPECIFIC_5 = (245 << 8) | 26,
136*03f9172cSAndroid Build Coastguard Worker RADIUS_ATTR_EXT_VENDOR_SPECIFIC_6 = (246 << 8) | 26,
137*03f9172cSAndroid Build Coastguard Worker };
138*03f9172cSAndroid Build Coastguard Worker
139*03f9172cSAndroid Build Coastguard Worker
140*03f9172cSAndroid Build Coastguard Worker /* Service-Type values (RFC 2865, 5.6) */
141*03f9172cSAndroid Build Coastguard Worker #define RADIUS_SERVICE_TYPE_FRAMED 2
142*03f9172cSAndroid Build Coastguard Worker
143*03f9172cSAndroid Build Coastguard Worker /* Termination-Action */
144*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TERMINATION_ACTION_DEFAULT 0
145*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TERMINATION_ACTION_RADIUS_REQUEST 1
146*03f9172cSAndroid Build Coastguard Worker
147*03f9172cSAndroid Build Coastguard Worker /* NAS-Port-Type */
148*03f9172cSAndroid Build Coastguard Worker #define RADIUS_NAS_PORT_TYPE_IEEE_802_11 19
149*03f9172cSAndroid Build Coastguard Worker
150*03f9172cSAndroid Build Coastguard Worker /* Acct-Status-Type */
151*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_STATUS_TYPE_START 1
152*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_STATUS_TYPE_STOP 2
153*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_STATUS_TYPE_INTERIM_UPDATE 3
154*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_STATUS_TYPE_ACCOUNTING_ON 7
155*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_STATUS_TYPE_ACCOUNTING_OFF 8
156*03f9172cSAndroid Build Coastguard Worker
157*03f9172cSAndroid Build Coastguard Worker /* Acct-Authentic */
158*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_AUTHENTIC_RADIUS 1
159*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_AUTHENTIC_LOCAL 2
160*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_AUTHENTIC_REMOTE 3
161*03f9172cSAndroid Build Coastguard Worker
162*03f9172cSAndroid Build Coastguard Worker /* Acct-Terminate-Cause */
163*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_USER_REQUEST 1
164*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_LOST_CARRIER 2
165*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_LOST_SERVICE 3
166*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_IDLE_TIMEOUT 4
167*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_SESSION_TIMEOUT 5
168*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_ADMIN_RESET 6
169*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_ADMIN_REBOOT 7
170*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_PORT_ERROR 8
171*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_NAS_ERROR 9
172*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_NAS_REQUEST 10
173*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_NAS_REBOOT 11
174*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_PORT_UNNEEDED 12
175*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_PORT_PREEMPTED 13
176*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_PORT_SUSPENDED 14
177*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_SERVICE_UNAVAILABLE 15
178*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_CALLBACK 16
179*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_USER_ERROR 17
180*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ACCT_TERMINATE_CAUSE_HOST_REQUEST 18
181*03f9172cSAndroid Build Coastguard Worker
182*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TUNNEL_TAGS 32
183*03f9172cSAndroid Build Coastguard Worker
184*03f9172cSAndroid Build Coastguard Worker /* Tunnel-Type */
185*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TUNNEL_TYPE_PPTP 1
186*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TUNNEL_TYPE_L2TP 3
187*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TUNNEL_TYPE_IPIP 7
188*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TUNNEL_TYPE_GRE 10
189*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TUNNEL_TYPE_VLAN 13
190*03f9172cSAndroid Build Coastguard Worker
191*03f9172cSAndroid Build Coastguard Worker /* Tunnel-Medium-Type */
192*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TUNNEL_MEDIUM_TYPE_IPV4 1
193*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TUNNEL_MEDIUM_TYPE_IPV6 2
194*03f9172cSAndroid Build Coastguard Worker #define RADIUS_TUNNEL_MEDIUM_TYPE_802 6
195*03f9172cSAndroid Build Coastguard Worker
196*03f9172cSAndroid Build Coastguard Worker
197*03f9172cSAndroid Build Coastguard Worker struct radius_attr_vendor {
198*03f9172cSAndroid Build Coastguard Worker u8 vendor_type;
199*03f9172cSAndroid Build Coastguard Worker u8 vendor_length;
200*03f9172cSAndroid Build Coastguard Worker } STRUCT_PACKED;
201*03f9172cSAndroid Build Coastguard Worker
202*03f9172cSAndroid Build Coastguard Worker #define RADIUS_VENDOR_ID_CISCO 9
203*03f9172cSAndroid Build Coastguard Worker #define RADIUS_CISCO_AV_PAIR 1
204*03f9172cSAndroid Build Coastguard Worker
205*03f9172cSAndroid Build Coastguard Worker /* RFC 2548 - Microsoft Vendor-specific RADIUS Attributes */
206*03f9172cSAndroid Build Coastguard Worker #define RADIUS_VENDOR_ID_MICROSOFT 311
207*03f9172cSAndroid Build Coastguard Worker
208*03f9172cSAndroid Build Coastguard Worker enum { RADIUS_VENDOR_ATTR_MS_MPPE_SEND_KEY = 16,
209*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_MS_MPPE_RECV_KEY = 17
210*03f9172cSAndroid Build Coastguard Worker };
211*03f9172cSAndroid Build Coastguard Worker
212*03f9172cSAndroid Build Coastguard Worker /* FreeRADIUS vendor-specific attributes */
213*03f9172cSAndroid Build Coastguard Worker #define RADIUS_VENDOR_ID_FREERADIUS 11344
214*03f9172cSAndroid Build Coastguard Worker /* Extended-Vendor-Specific-5 (245.26; long extended header) */
215*03f9172cSAndroid Build Coastguard Worker enum {
216*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_FREERADIUS_802_1X_ANONCE = 1,
217*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_FREERADIUS_802_1X_EAPOL_KEY_MSG = 2,
218*03f9172cSAndroid Build Coastguard Worker };
219*03f9172cSAndroid Build Coastguard Worker
220*03f9172cSAndroid Build Coastguard Worker /* Hotspot 2.0 - WFA Vendor-specific RADIUS Attributes */
221*03f9172cSAndroid Build Coastguard Worker #define RADIUS_VENDOR_ID_WFA 40808
222*03f9172cSAndroid Build Coastguard Worker
223*03f9172cSAndroid Build Coastguard Worker enum {
224*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_WFA_HS20_SUBSCR_REMEDIATION = 1,
225*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_WFA_HS20_AP_VERSION = 2,
226*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_WFA_HS20_STA_VERSION = 3,
227*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_WFA_HS20_DEAUTH_REQ = 4,
228*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_WFA_HS20_SESSION_INFO_URL = 5,
229*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_WFA_HS20_ROAMING_CONSORTIUM = 6,
230*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_WFA_HS20_T_C_FILENAME = 7,
231*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_WFA_HS20_TIMESTAMP = 8,
232*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_WFA_HS20_T_C_FILTERING = 9,
233*03f9172cSAndroid Build Coastguard Worker RADIUS_VENDOR_ATTR_WFA_HS20_T_C_URL = 10,
234*03f9172cSAndroid Build Coastguard Worker };
235*03f9172cSAndroid Build Coastguard Worker
236*03f9172cSAndroid Build Coastguard Worker #ifdef _MSC_VER
237*03f9172cSAndroid Build Coastguard Worker #pragma pack(pop)
238*03f9172cSAndroid Build Coastguard Worker #endif /* _MSC_VER */
239*03f9172cSAndroid Build Coastguard Worker
240*03f9172cSAndroid Build Coastguard Worker struct radius_ms_mppe_keys {
241*03f9172cSAndroid Build Coastguard Worker u8 *send;
242*03f9172cSAndroid Build Coastguard Worker size_t send_len;
243*03f9172cSAndroid Build Coastguard Worker u8 *recv;
244*03f9172cSAndroid Build Coastguard Worker size_t recv_len;
245*03f9172cSAndroid Build Coastguard Worker };
246*03f9172cSAndroid Build Coastguard Worker
247*03f9172cSAndroid Build Coastguard Worker
248*03f9172cSAndroid Build Coastguard Worker struct radius_msg;
249*03f9172cSAndroid Build Coastguard Worker
250*03f9172cSAndroid Build Coastguard Worker /* Default size to be allocated for new RADIUS messages */
251*03f9172cSAndroid Build Coastguard Worker #define RADIUS_DEFAULT_MSG_SIZE 1024
252*03f9172cSAndroid Build Coastguard Worker
253*03f9172cSAndroid Build Coastguard Worker /* Default size to be allocated for attribute array */
254*03f9172cSAndroid Build Coastguard Worker #define RADIUS_DEFAULT_ATTR_COUNT 16
255*03f9172cSAndroid Build Coastguard Worker
256*03f9172cSAndroid Build Coastguard Worker /* Maximum message length for incoming RADIUS messages, as stated in RFC 2865
257*03f9172cSAndroid Build Coastguard Worker * Section 3 ("Packet Format").*/
258*03f9172cSAndroid Build Coastguard Worker #define RADIUS_MAX_MSG_LEN 4096
259*03f9172cSAndroid Build Coastguard Worker
260*03f9172cSAndroid Build Coastguard Worker /* MAC address ASCII format for IEEE 802.1X use
261*03f9172cSAndroid Build Coastguard Worker * (draft-congdon-radius-8021x-20.txt) */
262*03f9172cSAndroid Build Coastguard Worker #define RADIUS_802_1X_ADDR_FORMAT "%02X-%02X-%02X-%02X-%02X-%02X"
263*03f9172cSAndroid Build Coastguard Worker /* MAC address ASCII format for non-802.1X use */
264*03f9172cSAndroid Build Coastguard Worker #define RADIUS_ADDR_FORMAT "%02x%02x%02x%02x%02x%02x"
265*03f9172cSAndroid Build Coastguard Worker
266*03f9172cSAndroid Build Coastguard Worker struct radius_hdr * radius_msg_get_hdr(struct radius_msg *msg);
267*03f9172cSAndroid Build Coastguard Worker struct wpabuf * radius_msg_get_buf(struct radius_msg *msg);
268*03f9172cSAndroid Build Coastguard Worker struct radius_msg * radius_msg_new(u8 code, u8 identifier);
269*03f9172cSAndroid Build Coastguard Worker void radius_msg_free(struct radius_msg *msg);
270*03f9172cSAndroid Build Coastguard Worker void radius_msg_dump(struct radius_msg *msg);
271*03f9172cSAndroid Build Coastguard Worker u8 * radius_msg_add_msg_auth(struct radius_msg *msg);
272*03f9172cSAndroid Build Coastguard Worker int radius_msg_finish(struct radius_msg *msg, const u8 *secret,
273*03f9172cSAndroid Build Coastguard Worker size_t secret_len);
274*03f9172cSAndroid Build Coastguard Worker int radius_msg_finish_srv(struct radius_msg *msg, const u8 *secret,
275*03f9172cSAndroid Build Coastguard Worker size_t secret_len, const u8 *req_authenticator);
276*03f9172cSAndroid Build Coastguard Worker int radius_msg_finish_das_resp(struct radius_msg *msg, const u8 *secret,
277*03f9172cSAndroid Build Coastguard Worker size_t secret_len,
278*03f9172cSAndroid Build Coastguard Worker const struct radius_hdr *req_hdr);
279*03f9172cSAndroid Build Coastguard Worker void radius_msg_finish_acct(struct radius_msg *msg, const u8 *secret,
280*03f9172cSAndroid Build Coastguard Worker size_t secret_len);
281*03f9172cSAndroid Build Coastguard Worker void radius_msg_finish_acct_resp(struct radius_msg *msg, const u8 *secret,
282*03f9172cSAndroid Build Coastguard Worker size_t secret_len,
283*03f9172cSAndroid Build Coastguard Worker const u8 *req_authenticator);
284*03f9172cSAndroid Build Coastguard Worker int radius_msg_verify_acct_req(struct radius_msg *msg, const u8 *secret,
285*03f9172cSAndroid Build Coastguard Worker size_t secret_len);
286*03f9172cSAndroid Build Coastguard Worker int radius_msg_verify_das_req(struct radius_msg *msg, const u8 *secret,
287*03f9172cSAndroid Build Coastguard Worker size_t secret_len,
288*03f9172cSAndroid Build Coastguard Worker int require_message_authenticator);
289*03f9172cSAndroid Build Coastguard Worker struct radius_attr_hdr * radius_msg_add_attr(struct radius_msg *msg, u16 type,
290*03f9172cSAndroid Build Coastguard Worker const u8 *data, size_t data_len);
291*03f9172cSAndroid Build Coastguard Worker struct radius_msg * radius_msg_parse(const u8 *data, size_t len);
292*03f9172cSAndroid Build Coastguard Worker int radius_msg_add_eap(struct radius_msg *msg, const u8 *data,
293*03f9172cSAndroid Build Coastguard Worker size_t data_len);
294*03f9172cSAndroid Build Coastguard Worker struct wpabuf * radius_msg_get_eap(struct radius_msg *msg);
295*03f9172cSAndroid Build Coastguard Worker int radius_msg_verify(struct radius_msg *msg, const u8 *secret,
296*03f9172cSAndroid Build Coastguard Worker size_t secret_len, struct radius_msg *sent_msg,
297*03f9172cSAndroid Build Coastguard Worker int auth);
298*03f9172cSAndroid Build Coastguard Worker int radius_msg_verify_msg_auth(struct radius_msg *msg, const u8 *secret,
299*03f9172cSAndroid Build Coastguard Worker size_t secret_len, const u8 *req_auth);
300*03f9172cSAndroid Build Coastguard Worker int radius_msg_copy_attr(struct radius_msg *dst, struct radius_msg *src,
301*03f9172cSAndroid Build Coastguard Worker u8 type);
302*03f9172cSAndroid Build Coastguard Worker int radius_msg_make_authenticator(struct radius_msg *msg);
303*03f9172cSAndroid Build Coastguard Worker struct radius_ms_mppe_keys *
304*03f9172cSAndroid Build Coastguard Worker radius_msg_get_ms_keys(struct radius_msg *msg, struct radius_msg *sent_msg,
305*03f9172cSAndroid Build Coastguard Worker const u8 *secret, size_t secret_len);
306*03f9172cSAndroid Build Coastguard Worker struct radius_ms_mppe_keys *
307*03f9172cSAndroid Build Coastguard Worker radius_msg_get_cisco_keys(struct radius_msg *msg, struct radius_msg *sent_msg,
308*03f9172cSAndroid Build Coastguard Worker const u8 *secret, size_t secret_len);
309*03f9172cSAndroid Build Coastguard Worker int radius_msg_add_mppe_keys(struct radius_msg *msg,
310*03f9172cSAndroid Build Coastguard Worker const u8 *req_authenticator,
311*03f9172cSAndroid Build Coastguard Worker const u8 *secret, size_t secret_len,
312*03f9172cSAndroid Build Coastguard Worker const u8 *send_key, size_t send_key_len,
313*03f9172cSAndroid Build Coastguard Worker const u8 *recv_key, size_t recv_key_len);
314*03f9172cSAndroid Build Coastguard Worker int radius_msg_add_wfa(struct radius_msg *msg, u8 subtype, const u8 *data,
315*03f9172cSAndroid Build Coastguard Worker size_t len);
316*03f9172cSAndroid Build Coastguard Worker int radius_msg_add_ext_vs(struct radius_msg *msg, u16 type, u32 vendor_id,
317*03f9172cSAndroid Build Coastguard Worker u8 vendor_type, const u8 *data, size_t len);
318*03f9172cSAndroid Build Coastguard Worker int radius_user_password_hide(struct radius_msg *msg,
319*03f9172cSAndroid Build Coastguard Worker const u8 *data, size_t data_len,
320*03f9172cSAndroid Build Coastguard Worker const u8 *secret, size_t secret_len,
321*03f9172cSAndroid Build Coastguard Worker u8 *buf, size_t buf_len);
322*03f9172cSAndroid Build Coastguard Worker struct radius_attr_hdr *
323*03f9172cSAndroid Build Coastguard Worker radius_msg_add_attr_user_password(struct radius_msg *msg,
324*03f9172cSAndroid Build Coastguard Worker const u8 *data, size_t data_len,
325*03f9172cSAndroid Build Coastguard Worker const u8 *secret, size_t secret_len);
326*03f9172cSAndroid Build Coastguard Worker int radius_msg_get_attr(struct radius_msg *msg, u8 type, u8 *buf, size_t len);
327*03f9172cSAndroid Build Coastguard Worker int radius_msg_get_vlanid(struct radius_msg *msg, int *untagged, int numtagged,
328*03f9172cSAndroid Build Coastguard Worker int *tagged);
329*03f9172cSAndroid Build Coastguard Worker char * radius_msg_get_tunnel_password(struct radius_msg *msg, int *keylen,
330*03f9172cSAndroid Build Coastguard Worker const u8 *secret, size_t secret_len,
331*03f9172cSAndroid Build Coastguard Worker struct radius_msg *sent_msg, size_t n);
332*03f9172cSAndroid Build Coastguard Worker
radius_msg_add_attr_int32(struct radius_msg * msg,u8 type,u32 value)333*03f9172cSAndroid Build Coastguard Worker static inline int radius_msg_add_attr_int32(struct radius_msg *msg, u8 type,
334*03f9172cSAndroid Build Coastguard Worker u32 value)
335*03f9172cSAndroid Build Coastguard Worker {
336*03f9172cSAndroid Build Coastguard Worker u32 val = htonl(value);
337*03f9172cSAndroid Build Coastguard Worker return radius_msg_add_attr(msg, type, (u8 *) &val, 4) != NULL;
338*03f9172cSAndroid Build Coastguard Worker }
339*03f9172cSAndroid Build Coastguard Worker
radius_msg_get_attr_int32(struct radius_msg * msg,u8 type,u32 * value)340*03f9172cSAndroid Build Coastguard Worker static inline int radius_msg_get_attr_int32(struct radius_msg *msg, u8 type,
341*03f9172cSAndroid Build Coastguard Worker u32 *value)
342*03f9172cSAndroid Build Coastguard Worker {
343*03f9172cSAndroid Build Coastguard Worker u32 val;
344*03f9172cSAndroid Build Coastguard Worker int res;
345*03f9172cSAndroid Build Coastguard Worker res = radius_msg_get_attr(msg, type, (u8 *) &val, 4);
346*03f9172cSAndroid Build Coastguard Worker if (res != 4)
347*03f9172cSAndroid Build Coastguard Worker return -1;
348*03f9172cSAndroid Build Coastguard Worker
349*03f9172cSAndroid Build Coastguard Worker *value = ntohl(val);
350*03f9172cSAndroid Build Coastguard Worker return 0;
351*03f9172cSAndroid Build Coastguard Worker }
352*03f9172cSAndroid Build Coastguard Worker int radius_msg_get_attr_ptr(struct radius_msg *msg, u8 type, u8 **buf,
353*03f9172cSAndroid Build Coastguard Worker size_t *len, const u8 *start);
354*03f9172cSAndroid Build Coastguard Worker int radius_msg_count_attr(struct radius_msg *msg, u8 type, int min_len);
355*03f9172cSAndroid Build Coastguard Worker
356*03f9172cSAndroid Build Coastguard Worker
357*03f9172cSAndroid Build Coastguard Worker struct radius_attr_data {
358*03f9172cSAndroid Build Coastguard Worker u8 *data;
359*03f9172cSAndroid Build Coastguard Worker size_t len;
360*03f9172cSAndroid Build Coastguard Worker };
361*03f9172cSAndroid Build Coastguard Worker
362*03f9172cSAndroid Build Coastguard Worker struct radius_class_data {
363*03f9172cSAndroid Build Coastguard Worker struct radius_attr_data *attr;
364*03f9172cSAndroid Build Coastguard Worker size_t count;
365*03f9172cSAndroid Build Coastguard Worker };
366*03f9172cSAndroid Build Coastguard Worker
367*03f9172cSAndroid Build Coastguard Worker void radius_free_class(struct radius_class_data *c);
368*03f9172cSAndroid Build Coastguard Worker int radius_copy_class(struct radius_class_data *dst,
369*03f9172cSAndroid Build Coastguard Worker const struct radius_class_data *src);
370*03f9172cSAndroid Build Coastguard Worker
371*03f9172cSAndroid Build Coastguard Worker u8 radius_msg_find_unlisted_attr(struct radius_msg *msg, u8 *attrs);
372*03f9172cSAndroid Build Coastguard Worker
373*03f9172cSAndroid Build Coastguard Worker int radius_gen_session_id(u8 *id, size_t len);
374*03f9172cSAndroid Build Coastguard Worker
375*03f9172cSAndroid Build Coastguard Worker #endif /* RADIUS_H */
376