Use .Fn for function names in some manual pages.
[dragonfly.git] / lib / libradius / libradius.3
1 .\" Copyright 1998 Juniper Networks, Inc.
2 .\" All rights reserved.
3 .\"
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
6 .\" are met:
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\"    notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\"    notice, this list of conditions and the following disclaimer in the
11 .\"    documentation and/or other materials provided with the distribution.
12 .\"
13 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 .\" SUCH DAMAGE.
24 .\"
25 .\" $FreeBSD: src/lib/libradius/libradius.3,v 1.19 2010/08/16 15:18:30 joel Exp $
26 .\"
27 .Dd September 24, 2010
28 .Dt LIBRADIUS 3
29 .Os
30 .Sh NAME
31 .Nm libradius
32 .Nd RADIUS client/server library
33 .Sh LIBRARY
34 .Lb libradius
35 .Sh SYNOPSIS
36 .In radlib.h
37 .In radlib_vs.h
38 .Ft "struct rad_handle *"
39 .Fn rad_acct_open "void"
40 .Ft int
41 .Fn rad_add_server "struct rad_handle *h" "const char *host" "int port" "const char *secret" "int timeout" "int max_tries"
42 .Ft "struct rad_handle *"
43 .Fn rad_auth_open "void"
44 .Ft void
45 .Fn rad_close "struct rad_handle *h"
46 .Ft int
47 .Fn rad_config "struct rad_handle *h" "const char *file"
48 .Ft int
49 .Fn rad_continue_send_request "struct rad_handle *h" "int selected" "int *fd" "struct timeval *tv"
50 .Ft int
51 .Fn rad_create_request "struct rad_handle *h" "int code"
52 .Ft int
53 .Fn rad_create_response "struct rad_handle *h" "int code"
54 .Ft "struct in_addr"
55 .Fn rad_cvt_addr "const void *data"
56 .Ft u_int32_t
57 .Fn rad_cvt_int "const void *data"
58 .Ft char *
59 .Fn rad_cvt_string "const void *data" "size_t len"
60 .Ft int
61 .Fn rad_get_attr "struct rad_handle *h" "const void **data" "size_t *len"
62 .Ft int
63 .Fn rad_get_vendor_attr "u_int32_t *vendor" "const void **data" "size_t *len"
64 .Ft int
65 .Fn rad_init_send_request "struct rad_handle *h" "int *fd" "struct timeval *tv"
66 .Ft int
67 .Fn rad_put_addr "struct rad_handle *h" "int type" "struct in_addr addr"
68 .Ft int
69 .Fn rad_put_attr "struct rad_handle *h" "int type" "const void *data" "size_t len"
70 .Ft int
71 .Fn rad_put_int "struct rad_handle *h" "int type" "u_int32_t value"
72 .Ft int
73 .Fn rad_put_string "struct rad_handle *h" "int type" "const char *str"
74 .Ft int
75 .Fn rad_put_message_authentic "struct rad_handle *h"
76 .Ft int
77 .Fn rad_put_vendor_addr "struct rad_handle *h" "int vendor" "int type" "struct in_addr addr"
78 .Ft int
79 .Fn rad_put_vendor_attr "struct rad_handle *h" "int vendor" "int type" "const void *data" "size_t len"
80 .Ft int
81 .Fn rad_put_vendor_int "struct rad_handle *h" "int vendor" "int type" "u_int32_t value"
82 .Ft int
83 .Fn rad_put_vendor_string "struct rad_handle *h" "int vendor" "int type" "const char *str"
84 .Ft ssize_t
85 .Fn rad_request_authenticator "struct rad_handle *h" "char *buf" "size_t len"
86 .Ft int
87 .Fn rad_receive_request "struct rad_handle *h"
88 .Ft int
89 .Fn rad_send_request "struct rad_handle *h"
90 .Ft int
91 .Fn rad_send_response "struct rad_handle *h"
92 .Ft "struct rad_handle *"
93 .Fn rad_server_open "int fd"
94 .Ft "const char *"
95 .Fn rad_server_secret "struct rad_handle *h"
96 .Ft u_char *
97 .Fn rad_demangle "struct rad_handle *h" "const void *mangled" "size_t mlen"
98 .Ft u_char *
99 .Fn rad_demangle_mppe_key "struct rad_handle *h" "const void *mangled" "size_t mlen" "size_t *len"
100 .Ft "const char *"
101 .Fn rad_strerror "struct rad_handle *h"
102 .Sh DESCRIPTION
103 The
104 .Nm
105 library implements the Remote Authentication Dial In User Service (RADIUS).
106 RADIUS, defined in RFCs 2865 and 2866,
107 allows clients to perform authentication and accounting by means of
108 network requests to remote servers.
109 .Ss Initialization
110 To use the library, an application must first call
111 .Fn rad_auth_open
112 ,
113 .Fn rad_acct_open
114 or
115 .Fn rad_server_open
116 to obtain a
117 .Vt "struct rad_handle *" ,
118 which provides the context for subsequent operations.
119 The former function is used for RADIUS authentication and the
120 latter is used for RADIUS accounting.
121 Calls to
122 .Fn rad_auth_open
123 ,
124 .Fn rad_acct_open
125 and
126 .Fn rad_server_open
127 always succeed unless insufficient virtual memory is available.
128 If
129 the necessary memory cannot be allocated, the functions return
130 .Dv NULL .
131 For compatibility with earlier versions of this library,
132 .Fn rad_open
133 is provided as a synonym for
134 .Fn rad_auth_open .
135 .Pp
136 Before issuing any RADIUS requests, the library must be made aware
137 of the servers it can contact.
138 The easiest way to configure the
139 library is to call
140 .Fn rad_config .
141 .Fn rad_config
142 causes the library to read a configuration file whose format is
143 described in
144 .Xr radius.conf 5 .
145 The pathname of the configuration file is passed as the
146 .Fa file
147 argument to
148 .Fn rad_config .
149 This argument may also be given as
150 .Dv NULL ,
151 in which case the standard configuration file
152 .Pa /etc/radius.conf
153 is used.
154 .Fn rad_config
155 returns 0 on success, or \-1 if an error occurs.
156 .Pp
157 The library can also be configured programmatically by calls to
158 .Fn rad_add_server .
159 The
160 .Fa host
161 parameter specifies the server host, either as a fully qualified
162 domain name or as a dotted-quad IP address in text form.
163 The
164 .Fa port
165 parameter specifies the UDP port to contact on the server.
166 If
167 .Fa port
168 is given as 0, the library looks up the
169 .Ql radius/udp
170 or
171 .Ql radacct/udp
172 service in the network
173 .Xr services 5
174 database, and uses the port found
175 there.
176 If no entry is found, the library uses the standard RADIUS
177 ports, 1812 for authentication and 1813 for accounting.
178 The shared secret for the server host is passed to the
179 .Fa secret
180 parameter.
181 It may be any
182 .Dv NUL Ns -terminated
183 string of bytes.
184 The RADIUS protocol
185 ignores all but the leading 128 bytes of the shared secret.
186 The timeout for receiving replies from the server is passed to the
187 .Fa timeout
188 parameter, in units of seconds.
189 The maximum number of repeated
190 requests to make before giving up is passed into the
191 .Fa max_tries
192 parameter.
193 .Fn rad_add_server
194 returns 0 on success, or \-1 if an error occurs.
195 .Pp
196 .Fn rad_add_server
197 may be called multiple times, and it may be used together with
198 .Fn rad_config .
199 At most 10 servers may be specified.
200 When multiple servers are given, they are tried in round-robin
201 fashion until a valid response is received, or until each server's
202 .Fa max_tries
203 limit has been reached.
204 .Ss Creating a RADIUS Request
205 A RADIUS request consists of a code specifying the kind of request,
206 and zero or more attributes which provide additional information.
207 To
208 begin constructing a new request, call
209 .Fn rad_create_request .
210 In addition to the usual
211 .Vt "struct rad_handle *" ,
212 this function takes a
213 .Fa code
214 parameter which specifies the type of the request.
215 Most often this
216 will be
217 .Dv RAD_ACCESS_REQUEST .
218 .Fn rad_create_request
219 returns 0 on success, or \-1 on if an error occurs.
220 .Pp
221 After the request has been created with
222 .Fn rad_create_request ,
223 attributes can be attached to it.
224 This is done through calls to
225 .Fn rad_put_addr ,
226 .Fn rad_put_int ,
227 and
228 .Fn rad_put_string .
229 Each accepts a
230 .Fa type
231 parameter identifying the attribute, and a value which may be
232 an Internet address, an integer, or a
233 .Dv NUL Ns -terminated
234 string,
235 respectively.
236 Alternatively,
237 .Fn rad_put_vendor_addr ,
238 .Fn rad_put_vendor_int
239 or
240 .Fn rad_put_vendor_string
241 may be used to specify vendor specific attributes.
242 Vendor specific
243 definitions may be found in
244 .In radlib_vs.h
245 .Pp
246 The library also provides a function
247 .Fn rad_put_attr
248 which can be used to supply a raw, uninterpreted attribute.
249 The
250 .Fa data
251 argument points to an array of bytes, and the
252 .Fa len
253 argument specifies its length.
254 .Pp
255 It is possible adding the Message-Authenticator to the request.
256 This is an HMAC-MD5 hash of the entire Access-Request packet (see RFC 3579).
257 This attribute must be present in any packet that includes an EAP-Message
258 attribute.
259 It can be added by using the
260 .Fn rad_put_message_authentic
261 function.
262 The
263 .Nm
264 library
265 calculates the HMAC-MD5 hash implicitly before sending the request.
266 If the Message-Authenticator was found inside the response packet,
267 then the packet is silently dropped, if the validation failed.
268 In order to get this feature, the library should be compiled with
269 OpenSSL support.
270 .Pp
271 The
272 .Fn rad_put_X
273 functions return 0 on success, or \-1 if an error occurs.
274 .Ss Sending the Request and Receiving the Response
275 After the RADIUS request has been constructed, it is sent either by means of
276 .Fn rad_send_request
277 or by a combination of calls to
278 .Fn rad_init_send_request
279 and
280 .Fn rad_continue_send_request .
281 .Pp
282 The
283 .Fn rad_send_request
284 function sends the request and waits for a valid reply,
285 retrying the defined servers in round-robin fashion as necessary.
286 If a valid response is received,
287 .Fn rad_send_request
288 returns the RADIUS code which specifies the type of the response.
289 This will typically be
290 .Dv RAD_ACCESS_ACCEPT ,
291 .Dv RAD_ACCESS_REJECT ,
292 or
293 .Dv RAD_ACCESS_CHALLENGE .
294 If no valid response is received,
295 .Fn rad_send_request
296 returns \-1.
297 .Pp
298 As an alternative, if you do not wish to block waiting for a response,
299 .Fn rad_init_send_request
300 and
301 .Fn rad_continue_send_request
302 may be used instead.
303 If a reply is received from the RADIUS server or a
304 timeout occurs, these functions return a value as described for
305 .Fn rad_send_request .
306 Otherwise, a value of zero is returned and the values pointed to by
307 .Fa fd
308 and
309 .Fa tv
310 are set to the descriptor and timeout that should be passed to
311 .Xr select 2 .
312 .Pp
313 .Fn rad_init_send_request
314 must be called first, followed by repeated calls to
315 .Fn rad_continue_send_request
316 as long as a return value of zero is given.
317 Between each call, the application should call
318 .Xr select 2 ,
319 passing
320 .Fa *fd
321 as a read descriptor and timing out after the interval specified by
322 .Fa tv .
323 When
324 .Xr select 2
325 returns,
326 .Fn rad_continue_send_request
327 should be called with
328 .Fa selected
329 set to a non-zero value if
330 .Xr select 2
331 indicated that the descriptor is readable.
332 .Pp
333 Like RADIUS requests, each response may contain zero or more
334 attributes.
335 After a response has been received successfully by
336 .Fn rad_send_request
337 or
338 .Fn rad_continue_send_request ,
339 its attributes can be extracted one by one using
340 .Fn rad_get_attr .
341 Each time
342 .Fn rad_get_attr
343 is called, it gets the next attribute from the current response, and
344 stores a pointer to the data and the length of the data via the
345 reference parameters
346 .Fa data
347 and
348 .Fa len ,
349 respectively.
350 Note that the data resides in the response itself,
351 and must not be modified.
352 A successful call to
353 .Fn rad_get_attr
354 returns the RADIUS attribute type.
355 If no more attributes remain in the current response,
356 .Fn rad_get_attr
357 returns 0.
358 If an error such as a malformed attribute is detected, \-1 is
359 returned.
360 .Pp
361 If
362 .Fn rad_get_attr
363 returns
364 .Dv RAD_VENDOR_SPECIFIC ,
365 .Fn rad_get_vendor_attr
366 may be called to determine the vendor.
367 The vendor specific RADIUS attribute type is returned.
368 The reference parameters
369 .Fa data
370 and
371 .Fa len
372 (as returned from
373 .Fn rad_get_attr )
374 are passed to
375 .Fn rad_get_vendor_attr ,
376 and are adjusted to point to the vendor specific attribute data.
377 .Pp
378 The common types of attributes can be decoded using
379 .Fn rad_cvt_addr ,
380 .Fn rad_cvt_int ,
381 and
382 .Fn rad_cvt_string .
383 These functions accept a pointer to the attribute data, which should
384 have been obtained using
385 .Fn rad_get_attr
386 and optionally
387 .Fn rad_get_vendor_attr .
388 In the case of
389 .Fn rad_cvt_string ,
390 the length
391 .Fa len
392 must also be given.
393 These functions interpret the attribute as an
394 Internet address, an integer, or a string, respectively, and return
395 its value.
396 .Fn rad_cvt_string
397 returns its value as a
398 .Dv NUL Ns -terminated
399 string in dynamically
400 allocated memory.
401 The application should free the string using
402 .Xr free 3
403 when it is no longer needed.
404 .Pp
405 If insufficient virtual memory is available,
406 .Fn rad_cvt_string
407 returns
408 .Dv NULL .
409 .Fn rad_cvt_addr
410 and
411 .Fn rad_cvt_int
412 cannot fail.
413 .Pp
414 The
415 .Fn rad_request_authenticator
416 function may be used to obtain the Request-Authenticator attribute value
417 associated with the current RADIUS server according to the supplied
418 rad_handle.
419 The target buffer
420 .Fa buf
421 of length
422 .Fa len
423 must be supplied and should be at least 16 bytes.
424 The return value is the number of bytes written to
425 .Fa buf
426 or \-1 to indicate that
427 .Fa len
428 was not large enough.
429 .Pp
430 The
431 .Fn rad_server_secret
432 returns the secret shared with the current RADIUS server according to the
433 supplied rad_handle.
434 .Pp
435 The
436 .Fn rad_demangle
437 function demangles attributes containing passwords and MS-CHAPv1 MPPE-Keys.
438 The return value is
439 .Dv NULL
440 on failure, or the plaintext attribute.
441 This value should be freed using
442 .Xr free 3
443 when it is no longer needed.
444 .Pp
445 The
446 .Fn rad_demangle_mppe_key
447 function demangles the send- and recv-keys when using MPPE (see RFC 2548).
448 The return value is
449 .Dv NULL
450 on failure, or the plaintext attribute.
451 This value should be freed using
452 .Xr free 3
453 when it is no longer needed.
454 .Ss Obtaining Error Messages
455 Those functions which accept a
456 .Vt "struct rad_handle *"
457 argument record an error message if they fail.
458 The error message
459 can be retrieved by calling
460 .Fn rad_strerror .
461 The message text is overwritten on each new error for the given
462 .Vt "struct rad_handle *" .
463 Thus the message must be copied if it is to be preserved through
464 subsequent library calls using the same handle.
465 .Ss Cleanup
466 To free the resources used by the RADIUS library, call
467 .Fn rad_close .
468 .Ss Server operation
469 Server mode operates much alike to client mode, except packet send and receive
470 steps are swapped.
471 To operate as server you should obtain server context with
472 .Fn rad_server_open
473 function, passing opened and bound UDP socket file descriptor as argument.
474 You should define allowed clients and their secrets using
475 .Fn rad_add_server
476 function.
477 port, timeout and max_tries arguments are ignored in server mode.
478 You should call
479 .Fn rad_receive_request
480 function to receive request from client.
481 If you do not want to block on socket read, you are free to use any
482 .Fn poll ,
483 .Fn select
484 or non-blocking sockets for the socket.
485 Received request can be parsed with same parsing functions as for client.
486 To respond to the request you should call
487 .Fn rad_create_response
488 and fill response content with same packet writing functions as for client.
489 When packet is ready, it should be sent with
490 .Fn rad_send_response
491 .Sh RETURN VALUES
492 The following functions return a non-negative value on success.
493 If
494 they detect an error, they return \-1 and record an error message
495 which can be retrieved using
496 .Fn rad_strerror .
497 .Pp
498 .Bl -item -offset indent -compact
499 .It
500 .Fn rad_add_server
501 .It
502 .Fn rad_config
503 .It
504 .Fn rad_create_request
505 .It
506 .Fn rad_create_response
507 .It
508 .Fn rad_get_attr
509 .It
510 .Fn rad_put_addr
511 .It
512 .Fn rad_put_attr
513 .It
514 .Fn rad_put_int
515 .It
516 .Fn rad_put_string
517 .It
518 .Fn rad_put_message_authentic
519 .It
520 .Fn rad_init_send_request
521 .It
522 .Fn rad_continue_send_request
523 .It
524 .Fn rad_send_request
525 .It
526 .Fn rad_send_response
527 .El
528 .Pp
529 The following functions return a
530 .No non- Ns Dv NULL
531 pointer on success.
532 If they are unable to allocate sufficient
533 virtual memory, they return
534 .Dv NULL ,
535 without recording an error message.
536 .Pp
537 .Bl -item -offset indent -compact
538 .It
539 .Fn rad_acct_open
540 .It
541 .Fn rad_auth_open
542 .It
543 .Fn rad_server_open
544 .It
545 .Fn rad_cvt_string
546 .El
547 .Pp
548 The following functions return a
549 .No non- Ns Dv NULL
550 pointer on success.
551 If they fail, they return
552 .Dv NULL ,
553 with recording an error message.
554 .Pp
555 .Bl -item -offset indent -compact
556 .It
557 .Fn rad_demangle
558 .It
559 .Fn rad_demangle_mppe_key
560 .El
561 .Sh FILES
562 .Bl -tag -width indent
563 .It Pa /etc/radius.conf
564 .El
565 .Sh SEE ALSO
566 .Xr radius.conf 5
567 .Rs
568 .%A "C. Rigney, et al"
569 .%T "Remote Authentication Dial In User Service (RADIUS)"
570 .%O "RFC 2865"
571 .Re
572 .Rs
573 .%A "C. Rigney"
574 .%T "RADIUS Accounting"
575 .%O "RFC 2866"
576 .Re
577 .Rs
578 .%A G. Zorn
579 .%T "Microsoft Vendor-specific RADIUS attributes"
580 .%O RFC 2548
581 .Re
582 .Rs
583 .%A C. Rigney, et al
584 .%T "RADIUS extensions"
585 .%O RFC 2869
586 .Re
587 .Sh AUTHORS
588 .An -nosplit
589 This software was originally written by
590 .An John Polstra ,
591 and donated to the
592 .Fx
593 project by Juniper Networks, Inc.
594 .An Oleg Semyonov
595 subsequently added the ability to perform RADIUS
596 accounting.
597 Later additions and changes by
598 .An Michael Bretterklieber .
599 Server mode support was added by
600 .An Alexander Motin .