1 /* obsolete.c --- Obsolete functions kept around for backwards compatibility.
2 * Copyright (C) 2002-2021 Simon Josefsson
3 *
4 * This file is part of GNU SASL Library.
5 *
6 * GNU SASL Library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation; either version 2.1 of
9 * the License, or (at your option) any later version.
10 *
11 * GNU SASL Library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License License along with GNU SASL Library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 *
21 */
22
23 #include "internal.h"
24
25 #if USE_DIGEST_MD5
26 #include "qop.h"
27 #endif
28
29 /**
30 * gsasl_client_listmech:
31 * @ctx: libgsasl handle.
32 * @out: output character array.
33 * @outlen: input maximum size of output character array, on output
34 * contains actual length of output array.
35 *
36 * Write SASL names, separated by space, of mechanisms supported by
37 * the libgsasl client to the output array. To find out how large the
38 * output array must be, call this function with a NULL @out
39 * parameter.
40 *
41 * Return value: Returns %GSASL_OK if successful, or error code.
42 *
43 * Deprecated: Use gsasl_client_mechlist() instead.
44 **/
45 int
gsasl_client_listmech(Gsasl * ctx,char * out,size_t * outlen)46 gsasl_client_listmech (Gsasl * ctx, char *out, size_t *outlen)
47 {
48 char *tmp;
49 int rc;
50
51 rc = gsasl_client_mechlist (ctx, &tmp);
52
53 if (rc == GSASL_OK)
54 {
55 size_t tmplen = strlen (tmp);
56
57 if (tmplen >= *outlen)
58 {
59 free (tmp);
60 return GSASL_TOO_SMALL_BUFFER;
61 }
62
63 if (out)
64 strcpy (out, tmp);
65 *outlen = tmplen + 1;
66 free (tmp);
67 }
68
69 return rc;
70 }
71
72 /**
73 * gsasl_server_listmech:
74 * @ctx: libgsasl handle.
75 * @out: output character array.
76 * @outlen: input maximum size of output character array, on output
77 * contains actual length of output array.
78 *
79 * Write SASL names, separated by space, of mechanisms supported by
80 * the libgsasl server to the output array. To find out how large the
81 * output array must be, call this function with a NULL @out
82 * parameter.
83 *
84 * Return value: Returns %GSASL_OK if successful, or error code.
85 *
86 * Deprecated: Use gsasl_server_mechlist() instead.
87 **/
88 int
gsasl_server_listmech(Gsasl * ctx,char * out,size_t * outlen)89 gsasl_server_listmech (Gsasl * ctx, char *out, size_t *outlen)
90 {
91 char *tmp;
92 int rc;
93
94 rc = gsasl_server_mechlist (ctx, &tmp);
95
96 if (rc == GSASL_OK)
97 {
98 size_t tmplen = strlen (tmp);
99
100 if (tmplen >= *outlen)
101 {
102 free (tmp);
103 return GSASL_TOO_SMALL_BUFFER;
104 }
105
106 if (out)
107 strcpy (out, tmp);
108 *outlen = tmplen + 1;
109 free (tmp);
110 }
111
112 return rc;
113 }
114
115 static int
_gsasl_step(Gsasl_session * sctx,const char * input,size_t input_len,char * output,size_t * output_len)116 _gsasl_step (Gsasl_session * sctx,
117 const char *input, size_t input_len,
118 char *output, size_t *output_len)
119 {
120 char *tmp;
121 size_t tmplen;
122 int rc;
123
124 rc = gsasl_step (sctx, input, input_len, &tmp, &tmplen);
125
126 if (rc == GSASL_OK || rc == GSASL_NEEDS_MORE)
127 {
128 if (tmplen >= *output_len)
129 {
130 free (tmp);
131 /* XXX We lose the step token here, don't we? */
132 return GSASL_TOO_SMALL_BUFFER;
133 }
134
135 if (output)
136 memcpy (output, tmp, tmplen);
137 *output_len = tmplen;
138 free (tmp);
139 }
140
141 return rc;
142 }
143
144 /**
145 * gsasl_client_step:
146 * @sctx: libgsasl client handle.
147 * @input: input byte array.
148 * @input_len: size of input byte array.
149 * @output: output byte array.
150 * @output_len: size of output byte array.
151 *
152 * Perform one step of SASL authentication in client. This reads data
153 * from server (specified with input and input_len), processes it
154 * (potentially invoking callbacks to the application), and writes
155 * data to server (into variables output and output_len).
156 *
157 * The contents of the output buffer is unspecified if this functions
158 * returns anything other than %GSASL_NEEDS_MORE.
159 *
160 * Return value: Returns %GSASL_OK if authenticated terminated
161 * successfully, %GSASL_NEEDS_MORE if more data is needed, or error
162 * code.
163 *
164 * Deprecated: Use gsasl_step() instead.
165 **/
166 int
gsasl_client_step(Gsasl_session * sctx,const char * input,size_t input_len,char * output,size_t * output_len)167 gsasl_client_step (Gsasl_session * sctx,
168 const char *input,
169 size_t input_len, char *output, size_t *output_len)
170 {
171 return _gsasl_step (sctx, input, input_len, output, output_len);
172 }
173
174 /**
175 * gsasl_server_step:
176 * @sctx: libgsasl server handle.
177 * @input: input byte array.
178 * @input_len: size of input byte array.
179 * @output: output byte array.
180 * @output_len: size of output byte array.
181 *
182 * Perform one step of SASL authentication in server. This reads data
183 * from client (specified with input and input_len), processes it
184 * (potentially invoking callbacks to the application), and writes
185 * data to client (into variables output and output_len).
186 *
187 * The contents of the output buffer is unspecified if this functions
188 * returns anything other than %GSASL_NEEDS_MORE.
189 *
190 * Return value: Returns %GSASL_OK if authenticated terminated
191 * successfully, %GSASL_NEEDS_MORE if more data is needed, or error
192 * code.
193 *
194 * Deprecated: Use gsasl_step() instead.
195 **/
196 int
gsasl_server_step(Gsasl_session * sctx,const char * input,size_t input_len,char * output,size_t * output_len)197 gsasl_server_step (Gsasl_session * sctx,
198 const char *input,
199 size_t input_len, char *output, size_t *output_len)
200 {
201 return _gsasl_step (sctx, input, input_len, output, output_len);
202 }
203
204 static int
_gsasl_step64(Gsasl_session * sctx,const char * b64input,char * b64output,size_t b64output_len)205 _gsasl_step64 (Gsasl_session * sctx,
206 const char *b64input, char *b64output, size_t b64output_len)
207 {
208 char *tmp;
209 int rc;
210
211 rc = gsasl_step64 (sctx, b64input, &tmp);
212
213 if (rc == GSASL_OK || rc == GSASL_NEEDS_MORE)
214 {
215 if (b64output_len <= strlen (tmp))
216 {
217 free (tmp);
218 /* XXX We lose the step token here, don't we? */
219 return GSASL_TOO_SMALL_BUFFER;
220 }
221
222 if (b64output)
223 strcpy (b64output, tmp);
224 free (tmp);
225 }
226
227 return rc;
228 }
229
230 /**
231 * gsasl_client_step_base64:
232 * @sctx: libgsasl client handle.
233 * @b64input: input base64 encoded byte array.
234 * @b64output: output base64 encoded byte array.
235 * @b64output_len: size of output base64 encoded byte array.
236 *
237 * This is a simple wrapper around gsasl_client_step() that base64
238 * decodes the input and base64 encodes the output.
239 *
240 * Return value: See gsasl_client_step().
241 *
242 * Deprecated: Use gsasl_step64() instead.
243 **/
244 int
gsasl_client_step_base64(Gsasl_session * sctx,const char * b64input,char * b64output,size_t b64output_len)245 gsasl_client_step_base64 (Gsasl_session * sctx,
246 const char *b64input,
247 char *b64output, size_t b64output_len)
248 {
249 return _gsasl_step64 (sctx, b64input, b64output, b64output_len);
250 }
251
252 /**
253 * gsasl_server_step_base64:
254 * @sctx: libgsasl server handle.
255 * @b64input: input base64 encoded byte array.
256 * @b64output: output base64 encoded byte array.
257 * @b64output_len: size of output base64 encoded byte array.
258 *
259 * This is a simple wrapper around gsasl_server_step() that base64
260 * decodes the input and base64 encodes the output.
261 *
262 * Return value: See gsasl_server_step().
263 *
264 * Deprecated: Use gsasl_step64() instead.
265 **/
266 int
gsasl_server_step_base64(Gsasl_session * sctx,const char * b64input,char * b64output,size_t b64output_len)267 gsasl_server_step_base64 (Gsasl_session * sctx,
268 const char *b64input,
269 char *b64output, size_t b64output_len)
270 {
271 return _gsasl_step64 (sctx, b64input, b64output, b64output_len);
272 }
273
274 /**
275 * gsasl_client_finish:
276 * @sctx: libgsasl client handle.
277 *
278 * Destroy a libgsasl client handle. The handle must not be used with
279 * other libgsasl functions after this call.
280 *
281 * Deprecated: Use gsasl_finish() instead.
282 **/
283 void
gsasl_client_finish(Gsasl_session * sctx)284 gsasl_client_finish (Gsasl_session * sctx)
285 {
286 gsasl_finish (sctx);
287 }
288
289 /**
290 * gsasl_server_finish:
291 * @sctx: libgsasl server handle.
292 *
293 * Destroy a libgsasl server handle. The handle must not be used with
294 * other libgsasl functions after this call.
295 *
296 * Deprecated: Use gsasl_finish() instead.
297 **/
298 void
gsasl_server_finish(Gsasl_session * sctx)299 gsasl_server_finish (Gsasl_session * sctx)
300 {
301 gsasl_finish (sctx);
302 }
303
304 /**
305 * gsasl_client_ctx_get:
306 * @sctx: libgsasl client handle
307 *
308 * Get the libgsasl handle given a libgsasl client handle.
309 *
310 * Return value: Returns the libgsasl handle given a libgsasl client handle.
311 *
312 * Deprecated: This function is not useful with the new 0.2.0 API.
313 **/
314 Gsasl *
gsasl_client_ctx_get(Gsasl_session * sctx)315 gsasl_client_ctx_get (Gsasl_session * sctx)
316 {
317 return sctx->ctx;
318 }
319
320 /**
321 * gsasl_client_application_data_set:
322 * @sctx: libgsasl client handle.
323 * @application_data: opaque pointer to application specific data.
324 *
325 * Store application specific data in the libgsasl client handle. The
326 * application data can be later (for instance, inside a callback) be
327 * retrieved by calling gsasl_client_application_data_get(). It is
328 * normally used by the application to maintain state between the main
329 * program and the callback.
330 *
331 * Deprecated: Use gsasl_callback_hook_set() or
332 * gsasl_session_hook_set() instead.
333 **/
334 void
gsasl_client_application_data_set(Gsasl_session * sctx,void * application_data)335 gsasl_client_application_data_set (Gsasl_session * sctx,
336 void *application_data)
337 {
338 gsasl_appinfo_set (sctx, application_data);
339 }
340
341 /**
342 * gsasl_client_application_data_get:
343 * @sctx: libgsasl client handle.
344 *
345 * Retrieve application specific data from libgsasl client handle. The
346 * application data is set using gsasl_client_application_data_set().
347 * It is normally used by the application to maintain state between
348 * the main program and the callback.
349 *
350 * Return value: Returns the application specific data, or NULL.
351 *
352 * Deprecated: Use gsasl_callback_hook_get() or
353 * gsasl_session_hook_get() instead.
354 **/
355 void *
gsasl_client_application_data_get(Gsasl_session * sctx)356 gsasl_client_application_data_get (Gsasl_session * sctx)
357 {
358 return gsasl_appinfo_get (sctx);
359 }
360
361 /**
362 * gsasl_server_ctx_get:
363 * @sctx: libgsasl server handle
364 *
365 * Get the libgsasl handle given a libgsasl server handle.
366 *
367 * Return value: Returns the libgsasl handle given a libgsasl server handle.
368 *
369 * Deprecated: This function is not useful with the new 0.2.0 API.
370 **/
371 Gsasl *
gsasl_server_ctx_get(Gsasl_session * sctx)372 gsasl_server_ctx_get (Gsasl_session * sctx)
373 {
374 return sctx->ctx;
375 }
376
377 /**
378 * gsasl_server_application_data_set:
379 * @sctx: libgsasl server handle.
380 * @application_data: opaque pointer to application specific data.
381 *
382 * Store application specific data in the libgsasl server handle. The
383 * application data can be later (for instance, inside a callback) be
384 * retrieved by calling gsasl_server_application_data_get(). It is
385 * normally used by the application to maintain state between the main
386 * program and the callback.
387 *
388 * Deprecated: Use gsasl_callback_hook_set() or
389 * gsasl_session_hook_set() instead.
390 **/
391 void
gsasl_server_application_data_set(Gsasl_session * sctx,void * application_data)392 gsasl_server_application_data_set (Gsasl_session * sctx,
393 void *application_data)
394 {
395 gsasl_appinfo_set (sctx, application_data);
396 }
397
398 /**
399 * gsasl_server_application_data_get:
400 * @sctx: libgsasl server handle.
401 *
402 * Retrieve application specific data from libgsasl server handle. The
403 * application data is set using gsasl_server_application_data_set().
404 * It is normally used by the application to maintain state between
405 * the main program and the callback.
406 *
407 * Return value: Returns the application specific data, or NULL.
408 *
409 * Deprecated: Use gsasl_callback_hook_get() or
410 * gsasl_session_hook_get() instead.
411 **/
412 void *
gsasl_server_application_data_get(Gsasl_session * sctx)413 gsasl_server_application_data_get (Gsasl_session * sctx)
414 {
415 return gsasl_appinfo_get (sctx);
416 }
417
418 /**
419 * gsasl_randomize:
420 * @strong: 0 iff operation should not block, non-0 for very strong randomness.
421 * @data: output array to be filled with random data.
422 * @datalen: size of output array.
423 *
424 * Store cryptographically random data of given size in the provided
425 * buffer.
426 *
427 * Return value: Returns %GSASL_OK iff successful.
428 *
429 * Deprecated: Use gsasl_random() or gsasl_nonce() instead.
430 **/
431 int
gsasl_randomize(int strong,char * data,size_t datalen)432 gsasl_randomize (int strong, char *data, size_t datalen)
433 {
434 if (strong)
435 return gsasl_random (data, datalen);
436 return gsasl_nonce (data, datalen);
437 }
438
439 /**
440 * gsasl_ctx_get:
441 * @sctx: libgsasl session handle
442 *
443 * Get the libgsasl handle given a libgsasl session handle.
444 *
445 * Return value: Returns the libgsasl handle given a libgsasl session handle.
446 *
447 * Deprecated: This function is not useful with the new 0.2.0 API.
448 **/
449 Gsasl *
gsasl_ctx_get(Gsasl_session * sctx)450 gsasl_ctx_get (Gsasl_session * sctx)
451 {
452 return sctx->ctx;
453 }
454
455 /**
456 * gsasl_encode_inline:
457 * @sctx: libgsasl session handle.
458 * @input: input byte array.
459 * @input_len: size of input byte array.
460 * @output: output byte array.
461 * @output_len: size of output byte array.
462 *
463 * Encode data according to negotiated SASL mechanism. This might mean
464 * that data is integrity or privacy protected.
465 *
466 * Return value: Returns %GSASL_OK if encoding was successful,
467 * otherwise an error code.
468 *
469 * Deprecated: Use gsasl_encode() instead.
470 *
471 * Since: 0.2.0
472 **/
473 int
gsasl_encode_inline(Gsasl_session * sctx,const char * input,size_t input_len,char * output,size_t * output_len)474 gsasl_encode_inline (Gsasl_session * sctx,
475 const char *input, size_t input_len,
476 char *output, size_t *output_len)
477 {
478 char *tmp;
479 size_t tmplen;
480 int res;
481
482 res = gsasl_encode (sctx, input, input_len, &tmp, &tmplen);
483 if (res == GSASL_OK)
484 {
485 if (*output_len < tmplen)
486 return GSASL_TOO_SMALL_BUFFER;
487 *output_len = tmplen;
488 memcpy (output, tmp, tmplen);
489 free (output);
490 }
491
492 return res;
493 }
494
495 /**
496 * gsasl_decode_inline:
497 * @sctx: libgsasl session handle.
498 * @input: input byte array.
499 * @input_len: size of input byte array.
500 * @output: output byte array.
501 * @output_len: size of output byte array.
502 *
503 * Decode data according to negotiated SASL mechanism. This might mean
504 * that data is integrity or privacy protected.
505 *
506 * Return value: Returns %GSASL_OK if encoding was successful,
507 * otherwise an error code.
508 *
509 * Deprecated: Use gsasl_decode() instead.
510 *
511 * Since: 0.2.0
512 **/
513 int
gsasl_decode_inline(Gsasl_session * sctx,const char * input,size_t input_len,char * output,size_t * output_len)514 gsasl_decode_inline (Gsasl_session * sctx,
515 const char *input, size_t input_len,
516 char *output, size_t *output_len)
517 {
518 char *tmp;
519 size_t tmplen;
520 int res;
521
522 res = gsasl_decode (sctx, input, input_len, &tmp, &tmplen);
523 if (res == GSASL_OK)
524 {
525 if (*output_len < tmplen)
526 return GSASL_TOO_SMALL_BUFFER;
527 *output_len = tmplen;
528 memcpy (output, tmp, tmplen);
529 free (output);
530 }
531
532 return res;
533 }
534
535 /**
536 * gsasl_application_data_set:
537 * @ctx: libgsasl handle.
538 * @appdata: opaque pointer to application specific data.
539 *
540 * Store application specific data in the libgsasl handle. The
541 * application data can be later (for instance, inside a callback) be
542 * retrieved by calling gsasl_application_data_get(). It is normally
543 * used by the application to maintain state between the main program
544 * and the callback.
545 *
546 * Deprecated: Use gsasl_callback_hook_set() instead.
547 **/
548 void
gsasl_application_data_set(Gsasl * ctx,void * appdata)549 gsasl_application_data_set (Gsasl * ctx, void *appdata)
550 {
551 ctx->application_hook = appdata;
552 }
553
554 /**
555 * gsasl_application_data_get:
556 * @ctx: libgsasl handle.
557 *
558 * Retrieve application specific data from libgsasl handle. The
559 * application data is set using gsasl_application_data_set(). It is
560 * normally used by the application to maintain state between the main
561 * program and the callback.
562 *
563 * Return value: Returns the application specific data, or NULL.
564 *
565 * Deprecated: Use gsasl_callback_hook_get() instead.
566 **/
567 void *
gsasl_application_data_get(Gsasl * ctx)568 gsasl_application_data_get (Gsasl * ctx)
569 {
570 return ctx->application_hook;
571 }
572
573 /**
574 * gsasl_appinfo_set:
575 * @sctx: libgsasl session handle.
576 * @appdata: opaque pointer to application specific data.
577 *
578 * Store application specific data in the libgsasl session handle.
579 * The application data can be later (for instance, inside a callback)
580 * be retrieved by calling gsasl_appinfo_get(). It is normally used
581 * by the application to maintain state between the main program and
582 * the callback.
583 *
584 * Deprecated: Use gsasl_callback_hook_set() instead.
585 **/
586 void
gsasl_appinfo_set(Gsasl_session * sctx,void * appdata)587 gsasl_appinfo_set (Gsasl_session * sctx, void *appdata)
588 {
589 sctx->application_data = appdata;
590 }
591
592 /**
593 * gsasl_appinfo_get:
594 * @sctx: libgsasl session handle.
595 *
596 * Retrieve application specific data from libgsasl session
597 * handle. The application data is set using gsasl_appinfo_set(). It
598 * is normally used by the application to maintain state between the
599 * main program and the callback.
600 *
601 * Return value: Returns the application specific data, or NULL.
602 *
603 * Deprecated: Use gsasl_callback_hook_get() instead.
604 **/
605 void *
gsasl_appinfo_get(Gsasl_session * sctx)606 gsasl_appinfo_get (Gsasl_session * sctx)
607 {
608 return sctx->application_data;
609 }
610
611 /**
612 * gsasl_server_suggest_mechanism:
613 * @ctx: libgsasl handle.
614 * @mechlist: input character array with SASL mechanism names,
615 * separated by invalid characters (e.g. SPC).
616 *
617 * Get name of "best" SASL mechanism supported by the libgsasl server
618 * which is present in the input string.
619 *
620 * Return value: Returns name of "best" SASL mechanism supported by
621 * the libgsasl server which is present in the input string.
622 *
623 * Deprecated: This function was never useful, since it is the client
624 * that chose which mechanism to use.
625 **/
626 const char *
gsasl_server_suggest_mechanism(Gsasl * ctx _GL_UNUSED,const char * mechlist _GL_UNUSED)627 gsasl_server_suggest_mechanism (Gsasl * ctx _GL_UNUSED,
628 const char *mechlist _GL_UNUSED)
629 {
630 return NULL; /* This function is just silly. */
631 }
632
633 /**
634 * gsasl_client_callback_authentication_id_set:
635 * @ctx: libgsasl handle.
636 * @cb: callback function
637 *
638 * Specify the callback function to use in the client to set the
639 * authentication identity. The function can be later retrieved using
640 * gsasl_client_callback_authentication_id_get().
641 *
642 * Deprecated: This function is part of the old callback interface.
643 * The new interface uses gsasl_callback_set() to set the application
644 * callback, and uses gsasl_callback() or gsasl_property_get() to
645 * invoke the callback for certain properties.
646 **/
647 void
gsasl_client_callback_authentication_id_set(Gsasl * ctx,Gsasl_client_callback_authentication_id cb)648 gsasl_client_callback_authentication_id_set (Gsasl * ctx,
649 Gsasl_client_callback_authentication_id
650 cb)
651 {
652 ctx->cbc_authentication_id = cb;
653 }
654
655 /**
656 * gsasl_client_callback_authentication_id_get:
657 * @ctx: libgsasl handle.
658 *
659 * Get the callback earlier set by calling
660 * gsasl_client_callback_authentication_id_set().
661 *
662 * Return value: Returns the callback earlier set by calling
663 * gsasl_client_callback_authentication_id_set().
664 *
665 * Deprecated: This function is part of the old callback interface.
666 * The new interface uses gsasl_callback_set() to set the application
667 * callback, and uses gsasl_callback() or gsasl_property_get() to
668 * invoke the callback for certain properties.
669 **/
670 Gsasl_client_callback_authentication_id
gsasl_client_callback_authentication_id_get(Gsasl * ctx)671 gsasl_client_callback_authentication_id_get (Gsasl * ctx)
672 {
673 return ctx ? ctx->cbc_authentication_id : NULL;
674 }
675
676 /**
677 * gsasl_client_callback_authorization_id_set:
678 * @ctx: libgsasl handle.
679 * @cb: callback function
680 *
681 * Specify the callback function to use in the client to set the
682 * authorization identity. The function can be later retrieved using
683 * gsasl_client_callback_authorization_id_get().
684 *
685 * Deprecated: This function is part of the old callback interface.
686 * The new interface uses gsasl_callback_set() to set the application
687 * callback, and uses gsasl_callback() or gsasl_property_get() to
688 * invoke the callback for certain properties.
689 **/
690 void
gsasl_client_callback_authorization_id_set(Gsasl * ctx,Gsasl_client_callback_authorization_id cb)691 gsasl_client_callback_authorization_id_set (Gsasl * ctx,
692 Gsasl_client_callback_authorization_id
693 cb)
694 {
695 ctx->cbc_authorization_id = cb;
696 }
697
698 /**
699 * gsasl_client_callback_authorization_id_get:
700 * @ctx: libgsasl handle.
701 *
702 * Get the callback earlier set by calling
703 * gsasl_client_callback_authorization_id_set().
704 *
705 * Return value: Returns the callback earlier set by calling
706 * gsasl_client_callback_authorization_id_set().
707 *
708 * Deprecated: This function is part of the old callback interface.
709 * The new interface uses gsasl_callback_set() to set the application
710 * callback, and uses gsasl_callback() or gsasl_property_get() to
711 * invoke the callback for certain properties.
712 **/
713 Gsasl_client_callback_authorization_id
gsasl_client_callback_authorization_id_get(Gsasl * ctx)714 gsasl_client_callback_authorization_id_get (Gsasl * ctx)
715 {
716 return ctx ? ctx->cbc_authorization_id : NULL;
717 }
718
719 /**
720 * gsasl_client_callback_password_set:
721 * @ctx: libgsasl handle.
722 * @cb: callback function
723 *
724 * Specify the callback function to use in the client to set the
725 * password. The function can be later retrieved using
726 * gsasl_client_callback_password_get().
727 *
728 * Deprecated: This function is part of the old callback interface.
729 * The new interface uses gsasl_callback_set() to set the application
730 * callback, and uses gsasl_callback() or gsasl_property_get() to
731 * invoke the callback for certain properties.
732 **/
733 void
gsasl_client_callback_password_set(Gsasl * ctx,Gsasl_client_callback_password cb)734 gsasl_client_callback_password_set (Gsasl * ctx,
735 Gsasl_client_callback_password cb)
736 {
737 ctx->cbc_password = cb;
738 }
739
740
741 /**
742 * gsasl_client_callback_password_get:
743 * @ctx: libgsasl handle.
744 *
745 * Get the callback earlier set by calling
746 * gsasl_client_callback_password_set().
747 *
748 * Return value: Returns the callback earlier set by calling
749 * gsasl_client_callback_password_set().
750 *
751 * Deprecated: This function is part of the old callback interface.
752 * The new interface uses gsasl_callback_set() to set the application
753 * callback, and uses gsasl_callback() or gsasl_property_get() to
754 * invoke the callback for certain properties.
755 **/
756 Gsasl_client_callback_password
gsasl_client_callback_password_get(Gsasl * ctx)757 gsasl_client_callback_password_get (Gsasl * ctx)
758 {
759 return ctx ? ctx->cbc_password : NULL;
760 }
761
762 /**
763 * gsasl_client_callback_passcode_set:
764 * @ctx: libgsasl handle.
765 * @cb: callback function
766 *
767 * Specify the callback function to use in the client to set the
768 * passcode. The function can be later retrieved using
769 * gsasl_client_callback_passcode_get().
770 *
771 * Deprecated: This function is part of the old callback interface.
772 * The new interface uses gsasl_callback_set() to set the application
773 * callback, and uses gsasl_callback() or gsasl_property_get() to
774 * invoke the callback for certain properties.
775 **/
776 void
gsasl_client_callback_passcode_set(Gsasl * ctx,Gsasl_client_callback_passcode cb)777 gsasl_client_callback_passcode_set (Gsasl * ctx,
778 Gsasl_client_callback_passcode cb)
779 {
780 ctx->cbc_passcode = cb;
781 }
782
783
784 /**
785 * gsasl_client_callback_passcode_get:
786 * @ctx: libgsasl handle.
787 *
788 * Get the callback earlier set by calling
789 * gsasl_client_callback_passcode_set().
790 *
791 * Return value: Returns the callback earlier set by calling
792 * gsasl_client_callback_passcode_set().
793 *
794 * Deprecated: This function is part of the old callback interface.
795 * The new interface uses gsasl_callback_set() to set the application
796 * callback, and uses gsasl_callback() or gsasl_property_get() to
797 * invoke the callback for certain properties.
798 **/
799 Gsasl_client_callback_passcode
gsasl_client_callback_passcode_get(Gsasl * ctx)800 gsasl_client_callback_passcode_get (Gsasl * ctx)
801 {
802 return ctx ? ctx->cbc_passcode : NULL;
803 }
804
805 /**
806 * gsasl_client_callback_pin_set:
807 * @ctx: libgsasl handle.
808 * @cb: callback function
809 *
810 * Specify the callback function to use in the client to chose a new
811 * pin, possibly suggested by the server, for the SECURID mechanism.
812 * This is not normally invoked, but only when the server requests it.
813 * The function can be later retrieved using
814 * gsasl_client_callback_pin_get().
815 *
816 * Deprecated: This function is part of the old callback interface.
817 * The new interface uses gsasl_callback_set() to set the application
818 * callback, and uses gsasl_callback() or gsasl_property_get() to
819 * invoke the callback for certain properties.
820 **/
821 void
gsasl_client_callback_pin_set(Gsasl * ctx,Gsasl_client_callback_pin cb)822 gsasl_client_callback_pin_set (Gsasl * ctx, Gsasl_client_callback_pin cb)
823 {
824 ctx->cbc_pin = cb;
825 }
826
827
828 /**
829 * gsasl_client_callback_pin_get:
830 * @ctx: libgsasl handle.
831 *
832 * Get the callback earlier set by calling
833 * gsasl_client_callback_pin_set().
834 *
835 * Return value: Returns the callback earlier set by calling
836 * gsasl_client_callback_pin_set().
837 *
838 * Deprecated: This function is part of the old callback interface.
839 * The new interface uses gsasl_callback_set() to set the application
840 * callback, and uses gsasl_callback() or gsasl_property_get() to
841 * invoke the callback for certain properties.
842 **/
843 Gsasl_client_callback_pin
gsasl_client_callback_pin_get(Gsasl * ctx)844 gsasl_client_callback_pin_get (Gsasl * ctx)
845 {
846 return ctx ? ctx->cbc_pin : NULL;
847 }
848
849 /**
850 * gsasl_client_callback_service_set:
851 * @ctx: libgsasl handle.
852 * @cb: callback function
853 *
854 * Specify the callback function to use in the client to set the name
855 * of the service. The service buffer should be a registered GSSAPI
856 * host-based service name, hostname the name of the server.
857 * Servicename is used by DIGEST-MD5 and should be the name of generic
858 * server in case of a replicated service. The function can be later
859 * retrieved using gsasl_client_callback_service_get().
860 *
861 * Deprecated: This function is part of the old callback interface.
862 * The new interface uses gsasl_callback_set() to set the application
863 * callback, and uses gsasl_callback() or gsasl_property_get() to
864 * invoke the callback for certain properties.
865 **/
866 void
gsasl_client_callback_service_set(Gsasl * ctx,Gsasl_client_callback_service cb)867 gsasl_client_callback_service_set (Gsasl * ctx,
868 Gsasl_client_callback_service cb)
869 {
870 ctx->cbc_service = cb;
871 }
872
873 /**
874 * gsasl_client_callback_service_get:
875 * @ctx: libgsasl handle.
876 *
877 * Get the callback earlier set by calling
878 * gsasl_client_callback_service_set().
879 *
880 * Return value: Returns the callback earlier set by calling
881 * gsasl_client_callback_service_set().
882 *
883 * Deprecated: This function is part of the old callback interface.
884 * The new interface uses gsasl_callback_set() to set the application
885 * callback, and uses gsasl_callback() or gsasl_property_get() to
886 * invoke the callback for certain properties.
887 **/
888 Gsasl_client_callback_service
gsasl_client_callback_service_get(Gsasl * ctx)889 gsasl_client_callback_service_get (Gsasl * ctx)
890 {
891 return ctx ? ctx->cbc_service : NULL;
892 }
893
894 /**
895 * gsasl_client_callback_anonymous_set:
896 * @ctx: libgsasl handle.
897 * @cb: callback function
898 *
899 * Specify the callback function to use in the client to set the
900 * anonymous token, which usually is the users email address. The
901 * function can be later retrieved using
902 * gsasl_client_callback_anonymous_get().
903 *
904 * Deprecated: This function is part of the old callback interface.
905 * The new interface uses gsasl_callback_set() to set the application
906 * callback, and uses gsasl_callback() or gsasl_property_get() to
907 * invoke the callback for certain properties.
908 **/
909 void
gsasl_client_callback_anonymous_set(Gsasl * ctx,Gsasl_client_callback_anonymous cb)910 gsasl_client_callback_anonymous_set (Gsasl * ctx,
911 Gsasl_client_callback_anonymous cb)
912 {
913 ctx->cbc_anonymous = cb;
914 }
915
916 /**
917 * gsasl_client_callback_anonymous_get:
918 * @ctx: libgsasl handle.
919 *
920 * Get the callback earlier set by calling
921 * gsasl_client_callback_anonymous_set().
922 *
923 * Return value: Returns the callback earlier set by calling
924 * gsasl_client_callback_anonymous_set().
925 *
926 * Deprecated: This function is part of the old callback interface.
927 * The new interface uses gsasl_callback_set() to set the application
928 * callback, and uses gsasl_callback() or gsasl_property_get() to
929 * invoke the callback for certain properties.
930 **/
931 Gsasl_client_callback_anonymous
gsasl_client_callback_anonymous_get(Gsasl * ctx)932 gsasl_client_callback_anonymous_get (Gsasl * ctx)
933 {
934 return ctx ? ctx->cbc_anonymous : NULL;
935 }
936
937 /**
938 * gsasl_client_callback_qop_set:
939 * @ctx: libgsasl handle.
940 * @cb: callback function
941 *
942 * Specify the callback function to use in the client to determine the
943 * qop to use after looking at what the server offered. The function
944 * can be later retrieved using gsasl_client_callback_qop_get().
945 *
946 * Deprecated: This function is part of the old callback interface.
947 * The new interface uses gsasl_callback_set() to set the application
948 * callback, and uses gsasl_callback() or gsasl_property_get() to
949 * invoke the callback for certain properties.
950 **/
951 void
gsasl_client_callback_qop_set(Gsasl * ctx,Gsasl_client_callback_qop cb)952 gsasl_client_callback_qop_set (Gsasl * ctx, Gsasl_client_callback_qop cb)
953 {
954 ctx->cbc_qop = cb;
955 }
956
957 /**
958 * gsasl_client_callback_qop_get:
959 * @ctx: libgsasl handle.
960 *
961 * Get the callback earlier set by calling
962 * gsasl_client_callback_qop_set().
963 *
964 * Return value: Returns the callback earlier set by calling
965 * gsasl_client_callback_qop_set().
966 *
967 * Deprecated: This function is part of the old callback interface.
968 * The new interface uses gsasl_callback_set() to set the application
969 * callback, and uses gsasl_callback() or gsasl_property_get() to
970 * invoke the callback for certain properties.
971 **/
972 Gsasl_client_callback_qop
gsasl_client_callback_qop_get(Gsasl * ctx)973 gsasl_client_callback_qop_get (Gsasl * ctx)
974 {
975 return ctx ? ctx->cbc_qop : NULL;
976 }
977
978 /**
979 * gsasl_client_callback_maxbuf_set:
980 * @ctx: libgsasl handle.
981 * @cb: callback function
982 *
983 * Specify the callback function to use in the client to inform the
984 * server of the largest buffer the client is able to receive when
985 * using the DIGEST-MD5 "auth-int" or "auth-conf" Quality of
986 * Protection (qop). If this directive is missing, the default value
987 * 65536 will be assumed. The function can be later retrieved using
988 * gsasl_client_callback_maxbuf_get().
989 *
990 * Deprecated: This function is part of the old callback interface.
991 * The new interface uses gsasl_callback_set() to set the application
992 * callback, and uses gsasl_callback() or gsasl_property_get() to
993 * invoke the callback for certain properties.
994 **/
995 void
gsasl_client_callback_maxbuf_set(Gsasl * ctx,Gsasl_client_callback_maxbuf cb)996 gsasl_client_callback_maxbuf_set (Gsasl * ctx,
997 Gsasl_client_callback_maxbuf cb)
998 {
999 ctx->cbc_maxbuf = cb;
1000 }
1001
1002 /**
1003 * gsasl_client_callback_maxbuf_get:
1004 * @ctx: libgsasl handle.
1005 *
1006 * Get the callback earlier set by calling
1007 * gsasl_client_callback_maxbuf_set().
1008 *
1009 * Return value: Returns the callback earlier set by calling
1010 * gsasl_client_callback_maxbuf_set().
1011 *
1012 * Deprecated: This function is part of the old callback interface.
1013 * The new interface uses gsasl_callback_set() to set the application
1014 * callback, and uses gsasl_callback() or gsasl_property_get() to
1015 * invoke the callback for certain properties.
1016 **/
1017 Gsasl_client_callback_maxbuf
gsasl_client_callback_maxbuf_get(Gsasl * ctx)1018 gsasl_client_callback_maxbuf_get (Gsasl * ctx)
1019 {
1020 return ctx ? ctx->cbc_maxbuf : NULL;
1021 }
1022
1023 /**
1024 * gsasl_client_callback_realm_set:
1025 * @ctx: libgsasl handle.
1026 * @cb: callback function
1027 *
1028 * Specify the callback function to use in the client to know which
1029 * realm it belongs to. The realm is used by the server to determine
1030 * which username and password to use. The function can be later
1031 * retrieved using gsasl_client_callback_realm_get().
1032 *
1033 * Deprecated: This function is part of the old callback interface.
1034 * The new interface uses gsasl_callback_set() to set the application
1035 * callback, and uses gsasl_callback() or gsasl_property_get() to
1036 * invoke the callback for certain properties.
1037 **/
1038 void
gsasl_client_callback_realm_set(Gsasl * ctx,Gsasl_client_callback_realm cb)1039 gsasl_client_callback_realm_set (Gsasl * ctx, Gsasl_client_callback_realm cb)
1040 {
1041 ctx->cbc_realm = cb;
1042 }
1043
1044 /**
1045 * gsasl_client_callback_realm_get:
1046 * @ctx: libgsasl handle.
1047 *
1048 * Get the callback earlier set by calling
1049 * gsasl_client_callback_realm_set().
1050 *
1051 * Return value: Returns the callback earlier set by calling
1052 * gsasl_client_callback_realm_set().
1053 *
1054 * Deprecated: This function is part of the old callback interface.
1055 * The new interface uses gsasl_callback_set() to set the application
1056 * callback, and uses gsasl_callback() or gsasl_property_get() to
1057 * invoke the callback for certain properties.
1058 **/
1059 Gsasl_client_callback_realm
gsasl_client_callback_realm_get(Gsasl * ctx)1060 gsasl_client_callback_realm_get (Gsasl * ctx)
1061 {
1062 return ctx ? ctx->cbc_realm : NULL;
1063 }
1064
1065 /**
1066 * gsasl_server_callback_validate_set:
1067 * @ctx: libgsasl handle.
1068 * @cb: callback function
1069 *
1070 * Specify the callback function to use in the server for deciding if
1071 * user is authenticated using authentication identity, authorization
1072 * identity and password. The function can be later retrieved using
1073 * gsasl_server_callback_validate_get().
1074 *
1075 * Deprecated: This function is part of the old callback interface.
1076 * The new interface uses gsasl_callback_set() to set the application
1077 * callback, and uses gsasl_callback() or gsasl_property_get() to
1078 * invoke the callback for certain properties.
1079 **/
1080 void
gsasl_server_callback_validate_set(Gsasl * ctx,Gsasl_server_callback_validate cb)1081 gsasl_server_callback_validate_set (Gsasl * ctx,
1082 Gsasl_server_callback_validate cb)
1083 {
1084 ctx->cbs_validate = cb;
1085 }
1086
1087 /**
1088 * gsasl_server_callback_validate_get:
1089 * @ctx: libgsasl handle.
1090 *
1091 * Get the callback earlier set by calling
1092 * gsasl_server_callback_validate_set().
1093 *
1094 * Return value: Returns the callback earlier set by calling
1095 * gsasl_server_callback_validate_set().
1096 *
1097 * Deprecated: This function is part of the old callback interface.
1098 * The new interface uses gsasl_callback_set() to set the application
1099 * callback, and uses gsasl_callback() or gsasl_property_get() to
1100 * invoke the callback for certain properties.
1101 **/
1102 Gsasl_server_callback_validate
gsasl_server_callback_validate_get(Gsasl * ctx)1103 gsasl_server_callback_validate_get (Gsasl * ctx)
1104 {
1105 return ctx ? ctx->cbs_validate : NULL;
1106 }
1107
1108 /**
1109 * gsasl_server_callback_retrieve_set:
1110 * @ctx: libgsasl handle.
1111 * @cb: callback function
1112 *
1113 * Specify the callback function to use in the server for deciding if
1114 * user is authenticated using authentication identity, authorization
1115 * identity and password. The function can be later retrieved using
1116 * gsasl_server_callback_retrieve_get().
1117 *
1118 * Deprecated: This function is part of the old callback interface.
1119 * The new interface uses gsasl_callback_set() to set the application
1120 * callback, and uses gsasl_callback() or gsasl_property_get() to
1121 * invoke the callback for certain properties.
1122 **/
1123 void
gsasl_server_callback_retrieve_set(Gsasl * ctx,Gsasl_server_callback_retrieve cb)1124 gsasl_server_callback_retrieve_set (Gsasl * ctx,
1125 Gsasl_server_callback_retrieve cb)
1126 {
1127 ctx->cbs_retrieve = cb;
1128 }
1129
1130 /**
1131 * gsasl_server_callback_retrieve_get:
1132 * @ctx: libgsasl handle.
1133 *
1134 * Get the callback earlier set by calling
1135 * gsasl_server_callback_retrieve_set().
1136 *
1137 * Return value: Returns the callback earlier set by calling
1138 * gsasl_server_callback_retrieve_set().
1139 *
1140 * Deprecated: This function is part of the old callback interface.
1141 * The new interface uses gsasl_callback_set() to set the application
1142 * callback, and uses gsasl_callback() or gsasl_property_get() to
1143 * invoke the callback for certain properties.
1144 **/
1145 Gsasl_server_callback_retrieve
gsasl_server_callback_retrieve_get(Gsasl * ctx)1146 gsasl_server_callback_retrieve_get (Gsasl * ctx)
1147 {
1148 return ctx ? ctx->cbs_retrieve : NULL;
1149 }
1150
1151 /**
1152 * gsasl_server_callback_cram_md5_set:
1153 * @ctx: libgsasl handle.
1154 * @cb: callback function
1155 *
1156 * Specify the callback function to use in the server for deciding if
1157 * user is authenticated using CRAM-MD5 challenge and response. The
1158 * function can be later retrieved using
1159 * gsasl_server_callback_cram_md5_get().
1160 *
1161 * Deprecated: This function is part of the old callback interface.
1162 * The new interface uses gsasl_callback_set() to set the application
1163 * callback, and uses gsasl_callback() or gsasl_property_get() to
1164 * invoke the callback for certain properties.
1165 **/
1166 void
gsasl_server_callback_cram_md5_set(Gsasl * ctx,Gsasl_server_callback_cram_md5 cb)1167 gsasl_server_callback_cram_md5_set (Gsasl * ctx,
1168 Gsasl_server_callback_cram_md5 cb)
1169 {
1170 ctx->cbs_cram_md5 = cb;
1171 }
1172
1173 /**
1174 * gsasl_server_callback_cram_md5_get:
1175 * @ctx: libgsasl handle.
1176 *
1177 * Get the callback earlier set by calling
1178 * gsasl_server_callback_cram_md5_set().
1179 *
1180 * Return value: Returns the callback earlier set by calling
1181 * gsasl_server_callback_cram_md5_set().
1182 *
1183 * Deprecated: This function is part of the old callback interface.
1184 * The new interface uses gsasl_callback_set() to set the application
1185 * callback, and uses gsasl_callback() or gsasl_property_get() to
1186 * invoke the callback for certain properties.
1187 **/
1188 Gsasl_server_callback_cram_md5
gsasl_server_callback_cram_md5_get(Gsasl * ctx)1189 gsasl_server_callback_cram_md5_get (Gsasl * ctx)
1190 {
1191 return ctx ? ctx->cbs_cram_md5 : NULL;
1192 }
1193
1194 /**
1195 * gsasl_server_callback_digest_md5_set:
1196 * @ctx: libgsasl handle.
1197 * @cb: callback function
1198 *
1199 * Specify the callback function to use in the server for retrieving
1200 * the secret hash of the username, realm and password for use in the
1201 * DIGEST-MD5 mechanism. The function can be later retrieved using
1202 * gsasl_server_callback_digest_md5_get().
1203 *
1204 * Deprecated: This function is part of the old callback interface.
1205 * The new interface uses gsasl_callback_set() to set the application
1206 * callback, and uses gsasl_callback() or gsasl_property_get() to
1207 * invoke the callback for certain properties.
1208 **/
1209 void
gsasl_server_callback_digest_md5_set(Gsasl * ctx,Gsasl_server_callback_digest_md5 cb)1210 gsasl_server_callback_digest_md5_set (Gsasl * ctx,
1211 Gsasl_server_callback_digest_md5 cb)
1212 {
1213 ctx->cbs_digest_md5 = cb;
1214 }
1215
1216 /**
1217 * gsasl_server_callback_digest_md5_get:
1218 * @ctx: libgsasl handle.
1219 *
1220 * Get the callback earlier set by calling
1221 * gsasl_server_callback_digest_md5_set().
1222 *
1223 * Return value: Return the callback earlier set by calling
1224 * gsasl_server_callback_digest_md5_set().
1225 *
1226 * Deprecated: This function is part of the old callback interface.
1227 * The new interface uses gsasl_callback_set() to set the application
1228 * callback, and uses gsasl_callback() or gsasl_property_get() to
1229 * invoke the callback for certain properties.
1230 **/
1231 Gsasl_server_callback_digest_md5
gsasl_server_callback_digest_md5_get(Gsasl * ctx)1232 gsasl_server_callback_digest_md5_get (Gsasl * ctx)
1233 {
1234 return ctx->cbs_digest_md5;
1235 }
1236
1237 /**
1238 * gsasl_server_callback_external_set:
1239 * @ctx: libgsasl handle.
1240 * @cb: callback function
1241 *
1242 * Specify the callback function to use in the server for deciding if
1243 * user is authenticated out of band. The function can be later
1244 * retrieved using gsasl_server_callback_external_get().
1245 *
1246 * Deprecated: This function is part of the old callback interface.
1247 * The new interface uses gsasl_callback_set() to set the application
1248 * callback, and uses gsasl_callback() or gsasl_property_get() to
1249 * invoke the callback for certain properties.
1250 **/
1251 void
gsasl_server_callback_external_set(Gsasl * ctx,Gsasl_server_callback_external cb)1252 gsasl_server_callback_external_set (Gsasl * ctx,
1253 Gsasl_server_callback_external cb)
1254 {
1255 ctx->cbs_external = cb;
1256 }
1257
1258 /**
1259 * gsasl_server_callback_external_get:
1260 * @ctx: libgsasl handle.
1261 *
1262 * Get the callback earlier set by calling
1263 * gsasl_server_callback_external_set().
1264 *
1265 * Return value: Returns the callback earlier set by calling
1266 * gsasl_server_callback_external_set().
1267 *
1268 * Deprecated: This function is part of the old callback interface.
1269 * The new interface uses gsasl_callback_set() to set the application
1270 * callback, and uses gsasl_callback() or gsasl_property_get() to
1271 * invoke the callback for certain properties.
1272 **/
1273 Gsasl_server_callback_external
gsasl_server_callback_external_get(Gsasl * ctx)1274 gsasl_server_callback_external_get (Gsasl * ctx)
1275 {
1276 return ctx ? ctx->cbs_external : NULL;
1277 }
1278
1279 /**
1280 * gsasl_server_callback_anonymous_set:
1281 * @ctx: libgsasl handle.
1282 * @cb: callback function
1283 *
1284 * Specify the callback function to use in the server for deciding if
1285 * user is permitted anonymous access. The function can be later
1286 * retrieved using gsasl_server_callback_anonymous_get().
1287 *
1288 * Deprecated: This function is part of the old callback interface.
1289 * The new interface uses gsasl_callback_set() to set the application
1290 * callback, and uses gsasl_callback() or gsasl_property_get() to
1291 * invoke the callback for certain properties.
1292 **/
1293 void
gsasl_server_callback_anonymous_set(Gsasl * ctx,Gsasl_server_callback_anonymous cb)1294 gsasl_server_callback_anonymous_set (Gsasl * ctx,
1295 Gsasl_server_callback_anonymous cb)
1296 {
1297 ctx->cbs_anonymous = cb;
1298 }
1299
1300 /**
1301 * gsasl_server_callback_anonymous_get:
1302 * @ctx: libgsasl handle.
1303 *
1304 * Get the callback earlier set by calling
1305 * gsasl_server_callback_anonymous_set().
1306 *
1307 * Return value: Returns the callback earlier set by calling
1308 * gsasl_server_callback_anonymous_set().
1309 *
1310 * Deprecated: This function is part of the old callback interface.
1311 * The new interface uses gsasl_callback_set() to set the application
1312 * callback, and uses gsasl_callback() or gsasl_property_get() to
1313 * invoke the callback for certain properties.
1314 **/
1315 Gsasl_server_callback_anonymous
gsasl_server_callback_anonymous_get(Gsasl * ctx)1316 gsasl_server_callback_anonymous_get (Gsasl * ctx)
1317 {
1318 return ctx ? ctx->cbs_anonymous : NULL;
1319 }
1320
1321 /**
1322 * gsasl_server_callback_realm_set:
1323 * @ctx: libgsasl handle.
1324 * @cb: callback function
1325 *
1326 * Specify the callback function to use in the server to know which
1327 * realm it serves. The realm is used by the user to determine which
1328 * username and password to use. The function can be later retrieved
1329 * using gsasl_server_callback_realm_get().
1330 *
1331 * Deprecated: This function is part of the old callback interface.
1332 * The new interface uses gsasl_callback_set() to set the application
1333 * callback, and uses gsasl_callback() or gsasl_property_get() to
1334 * invoke the callback for certain properties.
1335 **/
1336 void
gsasl_server_callback_realm_set(Gsasl * ctx,Gsasl_server_callback_realm cb)1337 gsasl_server_callback_realm_set (Gsasl * ctx, Gsasl_server_callback_realm cb)
1338 {
1339 ctx->cbs_realm = cb;
1340 }
1341
1342 /**
1343 * gsasl_server_callback_realm_get:
1344 * @ctx: libgsasl handle.
1345 *
1346 * Get the callback earlier set by calling
1347 * gsasl_server_callback_realm_set().
1348 *
1349 * Return value: Returns the callback earlier set by calling
1350 * gsasl_server_callback_realm_set().
1351 *
1352 * Deprecated: This function is part of the old callback interface.
1353 * The new interface uses gsasl_callback_set() to set the application
1354 * callback, and uses gsasl_callback() or gsasl_property_get() to
1355 * invoke the callback for certain properties.
1356 **/
1357 Gsasl_server_callback_realm
gsasl_server_callback_realm_get(Gsasl * ctx)1358 gsasl_server_callback_realm_get (Gsasl * ctx)
1359 {
1360 return ctx ? ctx->cbs_realm : NULL;
1361 }
1362
1363 /**
1364 * gsasl_server_callback_qop_set:
1365 * @ctx: libgsasl handle.
1366 * @cb: callback function
1367 *
1368 * Specify the callback function to use in the server to know which
1369 * quality of protection it accepts. The quality of protection
1370 * eventually used is selected by the client though. It is currently
1371 * used by the DIGEST-MD5 mechanism. The function can be later
1372 * retrieved using gsasl_server_callback_qop_get().
1373 *
1374 * Deprecated: This function is part of the old callback interface.
1375 * The new interface uses gsasl_callback_set() to set the application
1376 * callback, and uses gsasl_callback() or gsasl_property_get() to
1377 * invoke the callback for certain properties.
1378 **/
1379 void
gsasl_server_callback_qop_set(Gsasl * ctx,Gsasl_server_callback_qop cb)1380 gsasl_server_callback_qop_set (Gsasl * ctx, Gsasl_server_callback_qop cb)
1381 {
1382 ctx->cbs_qop = cb;
1383 }
1384
1385 /**
1386 * gsasl_server_callback_qop_get:
1387 * @ctx: libgsasl handle.
1388 *
1389 * Get the callback earlier set by calling
1390 * gsasl_server_callback_qop_set().
1391 *
1392 * Return value: Returns the callback earlier set by calling
1393 * gsasl_server_callback_qop_set().
1394 *
1395 * Deprecated: This function is part of the old callback interface.
1396 * The new interface uses gsasl_callback_set() to set the application
1397 * callback, and uses gsasl_callback() or gsasl_property_get() to
1398 * invoke the callback for certain properties.
1399 **/
1400 Gsasl_server_callback_qop
gsasl_server_callback_qop_get(Gsasl * ctx)1401 gsasl_server_callback_qop_get (Gsasl * ctx)
1402 {
1403 return ctx ? ctx->cbs_qop : NULL;
1404 }
1405
1406 /**
1407 * gsasl_server_callback_maxbuf_set:
1408 * @ctx: libgsasl handle.
1409 * @cb: callback function
1410 *
1411 * Specify the callback function to use in the server to inform the
1412 * client of the largest buffer the server is able to receive when
1413 * using the DIGEST-MD5 "auth-int" or "auth-conf" Quality of
1414 * Protection (qop). If this directive is missing, the default value
1415 * 65536 will be assumed. The function can be later retrieved using
1416 * gsasl_server_callback_maxbuf_get().
1417 *
1418 * Deprecated: This function is part of the old callback interface.
1419 * The new interface uses gsasl_callback_set() to set the application
1420 * callback, and uses gsasl_callback() or gsasl_property_get() to
1421 * invoke the callback for certain properties.
1422 **/
1423 void
gsasl_server_callback_maxbuf_set(Gsasl * ctx,Gsasl_server_callback_maxbuf cb)1424 gsasl_server_callback_maxbuf_set (Gsasl * ctx,
1425 Gsasl_server_callback_maxbuf cb)
1426 {
1427 ctx->cbs_maxbuf = cb;
1428 }
1429
1430 /**
1431 * gsasl_server_callback_maxbuf_get:
1432 * @ctx: libgsasl handle.
1433 *
1434 * Get the callback earlier set by calling
1435 * gsasl_server_callback_maxbuf_set().
1436 *
1437 * Return value: Returns the callback earlier set by calling
1438 * gsasl_server_callback_maxbuf_set().
1439 *
1440 * Deprecated: This function is part of the old callback interface.
1441 * The new interface uses gsasl_callback_set() to set the application
1442 * callback, and uses gsasl_callback() or gsasl_property_get() to
1443 * invoke the callback for certain properties.
1444 **/
1445 Gsasl_server_callback_maxbuf
gsasl_server_callback_maxbuf_get(Gsasl * ctx)1446 gsasl_server_callback_maxbuf_get (Gsasl * ctx)
1447 {
1448 return ctx ? ctx->cbs_maxbuf : NULL;
1449 }
1450
1451 /**
1452 * gsasl_server_callback_cipher_set:
1453 * @ctx: libgsasl handle.
1454 * @cb: callback function
1455 *
1456 * Specify the callback function to use in the server to inform the
1457 * client of the cipher suites supported. The DES and 3DES ciphers
1458 * must be supported for interoperability. It is currently used by
1459 * the DIGEST-MD5 mechanism. The function can be later retrieved
1460 * using gsasl_server_callback_cipher_get().
1461 *
1462 * Deprecated: This function is part of the old callback interface.
1463 * The new interface uses gsasl_callback_set() to set the application
1464 * callback, and uses gsasl_callback() or gsasl_property_get() to
1465 * invoke the callback for certain properties.
1466 **/
1467 void
gsasl_server_callback_cipher_set(Gsasl * ctx,Gsasl_server_callback_cipher cb)1468 gsasl_server_callback_cipher_set (Gsasl * ctx,
1469 Gsasl_server_callback_cipher cb)
1470 {
1471 ctx->cbs_cipher = cb;
1472 }
1473
1474 /**
1475 * gsasl_server_callback_cipher_get:
1476 * @ctx: libgsasl handle.
1477 *
1478 * Get the callback earlier set by calling
1479 * gsasl_server_callback_cipher_set().
1480 *
1481 * Return value: Returns the callback earlier set by calling
1482 * gsasl_server_callback_cipher_set().
1483 *
1484 * Deprecated: This function is part of the old callback interface.
1485 * The new interface uses gsasl_callback_set() to set the application
1486 * callback, and uses gsasl_callback() or gsasl_property_get() to
1487 * invoke the callback for certain properties.
1488 **/
1489 Gsasl_server_callback_cipher
gsasl_server_callback_cipher_get(Gsasl * ctx)1490 gsasl_server_callback_cipher_get (Gsasl * ctx)
1491 {
1492 return ctx ? ctx->cbs_cipher : NULL;
1493 }
1494
1495 /**
1496 * gsasl_server_callback_securid_set:
1497 * @ctx: libgsasl handle.
1498 * @cb: callback function
1499 *
1500 * Specify the callback function to use in the server for validating a
1501 * user via the SECURID mechanism. The function should return
1502 * GSASL_OK if user authenticated successfully,
1503 * GSASL_SECURID_SERVER_NEED_ADDITIONAL_PASSCODE if it wants another
1504 * passcode, GSASL_SECURID_SERVER_NEED_NEW_PIN if it wants a PIN
1505 * change, or an error. When (and only when)
1506 * GSASL_SECURID_SERVER_NEED_NEW_PIN is returned, suggestpin can be
1507 * populated with a PIN code the server suggests, and suggestpinlen
1508 * set to the length of the PIN. The function can be later retrieved
1509 * using gsasl_server_callback_securid_get().
1510 *
1511 * Deprecated: This function is part of the old callback interface.
1512 * The new interface uses gsasl_callback_set() to set the application
1513 * callback, and uses gsasl_callback() or gsasl_property_get() to
1514 * invoke the callback for certain properties.
1515 **/
1516 void
gsasl_server_callback_securid_set(Gsasl * ctx,Gsasl_server_callback_securid cb)1517 gsasl_server_callback_securid_set (Gsasl * ctx,
1518 Gsasl_server_callback_securid cb)
1519 {
1520 ctx->cbs_securid = cb;
1521 }
1522
1523 /**
1524 * gsasl_server_callback_securid_get:
1525 * @ctx: libgsasl handle.
1526 *
1527 * Get the callback earlier set by calling
1528 * gsasl_server_callback_securid_set().
1529 *
1530 * Return value: Returns the callback earlier set by calling
1531 * gsasl_server_callback_securid_set().
1532 *
1533 * Deprecated: This function is part of the old callback interface.
1534 * The new interface uses gsasl_callback_set() to set the application
1535 * callback, and uses gsasl_callback() or gsasl_property_get() to
1536 * invoke the callback for certain properties.
1537 **/
1538 Gsasl_server_callback_securid
gsasl_server_callback_securid_get(Gsasl * ctx)1539 gsasl_server_callback_securid_get (Gsasl * ctx)
1540 {
1541 return ctx ? ctx->cbs_securid : NULL;
1542 }
1543
1544 /**
1545 * gsasl_server_callback_gssapi_set:
1546 * @ctx: libgsasl handle.
1547 * @cb: callback function
1548 *
1549 * Specify the callback function to use in the server for checking if
1550 * a GSSAPI user is authorized for username (by, e.g., calling
1551 * krb5_kuserok). The function should return GSASL_OK if the user
1552 * should be permitted access, or an error code such as
1553 * GSASL_AUTHENTICATION_ERROR on failure. The function can be later
1554 * retrieved using gsasl_server_callback_gssapi_get().
1555 *
1556 * Deprecated: This function is part of the old callback interface.
1557 * The new interface uses gsasl_callback_set() to set the application
1558 * callback, and uses gsasl_callback() or gsasl_property_get() to
1559 * invoke the callback for certain properties.
1560 **/
1561 void
gsasl_server_callback_gssapi_set(Gsasl * ctx,Gsasl_server_callback_gssapi cb)1562 gsasl_server_callback_gssapi_set (Gsasl * ctx,
1563 Gsasl_server_callback_gssapi cb)
1564 {
1565 ctx->cbs_gssapi = cb;
1566 }
1567
1568 /**
1569 * gsasl_server_callback_gssapi_get:
1570 * @ctx: libgsasl handle.
1571 *
1572 * Get the callback earlier set by calling
1573 * gsasl_server_callback_gssapi_set().
1574 *
1575 * Return value: Returns the callback earlier set by calling
1576 * gsasl_server_callback_gssapi_set().
1577 *
1578 * Deprecated: This function is part of the old callback interface.
1579 * The new interface uses gsasl_callback_set() to set the application
1580 * callback, and uses gsasl_callback() or gsasl_property_get() to
1581 * invoke the callback for certain properties.
1582 **/
1583 Gsasl_server_callback_gssapi
gsasl_server_callback_gssapi_get(Gsasl * ctx)1584 gsasl_server_callback_gssapi_get (Gsasl * ctx)
1585 {
1586 return ctx ? ctx->cbs_gssapi : NULL;
1587 }
1588
1589 /**
1590 * gsasl_server_callback_service_set:
1591 * @ctx: libgsasl handle.
1592 * @cb: callback function
1593 *
1594 * Specify the callback function to use in the server to set the name
1595 * of the service. The service buffer should be a registered GSSAPI
1596 * host-based service name, hostname the name of the server. The
1597 * function can be later retrieved using
1598 * gsasl_server_callback_service_get().
1599 *
1600 * Deprecated: This function is part of the old callback interface.
1601 * The new interface uses gsasl_callback_set() to set the application
1602 * callback, and uses gsasl_callback() or gsasl_property_get() to
1603 * invoke the callback for certain properties.
1604 **/
1605 void
gsasl_server_callback_service_set(Gsasl * ctx,Gsasl_server_callback_service cb)1606 gsasl_server_callback_service_set (Gsasl * ctx,
1607 Gsasl_server_callback_service cb)
1608 {
1609 ctx->cbs_service = cb;
1610 }
1611
1612 /**
1613 * gsasl_server_callback_service_get:
1614 * @ctx: libgsasl handle.
1615 *
1616 * Get the callback earlier set by calling
1617 * gsasl_server_callback_service_set().
1618 *
1619 * Return value: Returns the callback earlier set by calling
1620 * gsasl_server_callback_service_set().
1621 *
1622 * Deprecated: This function is part of the old callback interface.
1623 * The new interface uses gsasl_callback_set() to set the application
1624 * callback, and uses gsasl_callback() or gsasl_property_get() to
1625 * invoke the callback for certain properties.
1626 **/
1627 Gsasl_server_callback_service
gsasl_server_callback_service_get(Gsasl * ctx)1628 gsasl_server_callback_service_get (Gsasl * ctx)
1629 {
1630 return ctx ? ctx->cbs_service : NULL;
1631 }
1632
1633 #if HAVE_LIBIDN
1634 #include <stringprep.h>
1635 #endif
1636
1637 /**
1638 * gsasl_stringprep_nfkc:
1639 * @in: a UTF-8 encoded string.
1640 * @len: length of @str, in bytes, or -1 if @str is nul-terminated.
1641 *
1642 * Converts a string into canonical form, standardizing such issues as
1643 * whether a character with an accent is represented as a base
1644 * character and combining accent or as a single precomposed
1645 * character.
1646 *
1647 * The normalization mode is NFKC (ALL COMPOSE). It standardizes
1648 * differences that do not affect the text content, such as the
1649 * above-mentioned accent representation. It standardizes the
1650 * "compatibility" characters in Unicode, such as SUPERSCRIPT THREE to
1651 * the standard forms (in this case DIGIT THREE). Formatting
1652 * information may be lost but for most text operations such
1653 * characters should be considered the same. It returns a result with
1654 * composed forms rather than a maximally decomposed form.
1655 *
1656 * Return value: Return a newly allocated string, that is the NFKC
1657 * normalized form of @str, or NULL on error.
1658 *
1659 * Deprecated: No replacement functionality in GNU SASL, use GNU
1660 * Libidn instead. Note that in SASL, you most likely want to use
1661 * SASLprep and not bare NFKC, see gsasl_saslprep().
1662 **/
1663 char *
gsasl_stringprep_nfkc(const char * in,ssize_t len)1664 gsasl_stringprep_nfkc (const char *in, ssize_t len)
1665 {
1666 char *out = NULL;
1667
1668 #if HAVE_LIBIDN
1669 out = stringprep_utf8_nfkc_normalize (in, len);
1670 #endif
1671
1672 return out;
1673 }
1674
1675 /**
1676 * gsasl_stringprep_saslprep:
1677 * @in: input ASCII or UTF-8 string with data to prepare according to SASLprep.
1678 * @stringprep_rc: pointer to output variable with stringprep error code,
1679 * or NULL to indicate that you don't care about it.
1680 *
1681 * Process a Unicode string for comparison, according to the
1682 * "SASLprep" stringprep profile. This function is intended to be
1683 * used by Simple Authentication and Security Layer (SASL) mechanisms
1684 * (such as PLAIN, CRAM-MD5, and DIGEST-MD5) as well as other
1685 * protocols exchanging user names and/or passwords.
1686 *
1687 * Return value: Return a newly allocated string that is the
1688 * "SASLprep" processed form of the input string, or NULL on error,
1689 * in which case @stringprep_rc contain the stringprep library error
1690 * code.
1691 *
1692 * Deprecated: Use gsasl_saslprep() instead.
1693 **/
1694 char *
gsasl_stringprep_saslprep(const char * in,int * stringprep_rc)1695 gsasl_stringprep_saslprep (const char *in, int *stringprep_rc)
1696 {
1697 char *out = NULL;
1698 #if HAVE_LIBIDN
1699 int rc;
1700
1701 rc = stringprep_profile (in, &out, "SASLprep", 0);
1702 if (stringprep_rc)
1703 *stringprep_rc = rc;
1704 if (rc != STRINGPREP_OK)
1705 out = NULL;
1706 #endif
1707
1708 return out;
1709 }
1710
1711 /**
1712 * gsasl_stringprep_trace:
1713 * @in: input ASCII or UTF-8 string with data to prepare according to "trace".
1714 * @stringprep_rc: pointer to output variable with stringprep error code,
1715 * or NULL to indicate that you don't care about it.
1716 *
1717 * Process a Unicode string for use as trace information, according to
1718 * the "trace" stringprep profile. The profile is designed for use
1719 * with the SASL ANONYMOUS Mechanism.
1720 *
1721 * Return value: Return a newly allocated string that is the "trace"
1722 * processed form of the input string, or NULL on error, in which
1723 * case @stringprep_rc contain the stringprep library error code.
1724 *
1725 * Deprecated: No replacement functionality in GNU SASL, use GNU
1726 * Libidn instead.
1727 **/
1728 char *
gsasl_stringprep_trace(const char * in,int * stringprep_rc)1729 gsasl_stringprep_trace (const char *in, int *stringprep_rc)
1730 {
1731 char *out = NULL;
1732 #if HAVE_LIBIDN
1733 int rc;
1734
1735 rc = stringprep_profile (in, &out, "trace", 0);
1736 if (stringprep_rc)
1737 *stringprep_rc = rc;
1738 if (rc != STRINGPREP_OK)
1739 out = NULL;
1740 #endif
1741
1742 return out;
1743 }
1744
1745 /**
1746 * gsasl_md5pwd_get_password:
1747 * @filename: filename of file containing passwords.
1748 * @username: username string.
1749 * @key: output character array.
1750 * @keylen: input maximum size of output character array, on output
1751 * contains actual length of output array.
1752 *
1753 * Retrieve password for user from specified file. To find out how
1754 * large the output array must be, call this function with out=NULL.
1755 *
1756 * The file should be on the UoW "MD5 Based Authentication" format,
1757 * which means it is in text format with comments denoted by # first
1758 * on the line, with user entries looking as "usernameTABpassword".
1759 * This function removes CR and LF at the end of lines before
1760 * processing. TAB, CR, and LF denote ASCII values 9, 13, and 10,
1761 * respectively.
1762 *
1763 * Return value: Return GSASL_OK if output buffer contains the
1764 * password, GSASL_AUTHENTICATION_ERROR if the user could not be
1765 * found, or other error code.
1766 *
1767 * Deprecated: Use gsasl_simple_getpass() instead.
1768 **/
1769 int
gsasl_md5pwd_get_password(const char * filename,const char * username,char * key,size_t * keylen)1770 gsasl_md5pwd_get_password (const char *filename,
1771 const char *username, char *key, size_t *keylen)
1772 {
1773 char *tmp;
1774 size_t tmplen;
1775 int res;
1776 FILE *fh;
1777
1778 fh = fopen (filename, "r");
1779 if (fh == NULL)
1780 return GSASL_FOPEN_ERROR;
1781 fclose (fh);
1782
1783 res = gsasl_simple_getpass (filename, username, &tmp);
1784 if (res != GSASL_OK)
1785 return res;
1786
1787 tmplen = strlen (tmp);
1788
1789 if (*keylen < tmplen + 1)
1790 {
1791 free (tmp);
1792 return GSASL_TOO_SMALL_BUFFER;
1793 }
1794
1795 *keylen = tmplen;
1796
1797 if (key)
1798 memcpy (key, tmp, tmplen);
1799
1800 free (tmp);
1801
1802 return GSASL_OK;
1803 }
1804
1805 #include <minmax.h>
1806
1807 /**
1808 * gsasl_base64_encode:
1809 * @src: input byte array
1810 * @srclength: size of input byte array
1811 * @target: output byte array
1812 * @targsize: size of output byte array
1813 *
1814 * Encode data as base64. Converts characters, three at a time,
1815 * starting at src into four base64 characters in the target area
1816 * until the entire input buffer is encoded.
1817 *
1818 * Return value: Returns the number of data bytes stored at the
1819 * target, or -1 on error.
1820 *
1821 * Deprecated: Use gsasl_base64_to() instead.
1822 **/
1823 int
gsasl_base64_encode(char const * src,size_t srclength,char * target,size_t targsize)1824 gsasl_base64_encode (char const *src,
1825 size_t srclength, char *target, size_t targsize)
1826 {
1827 int rc;
1828 char *out;
1829 size_t outlen;
1830 int copied;
1831
1832 rc = gsasl_base64_to (src, srclength, &out, &outlen);
1833 if (rc)
1834 return -1;
1835
1836 copied = MIN (outlen, targsize);
1837 memcpy (target, out, copied);
1838 free (out);
1839
1840 return copied;
1841 }
1842
1843 /**
1844 * gsasl_base64_decode:
1845 * @src: input byte array
1846 * @target: output byte array
1847 * @targsize: size of output byte array
1848 *
1849 * Decode Base64 data. Skips all whitespace anywhere. Converts
1850 * characters, four at a time, starting at (or after) src from Base64
1851 * numbers into three 8 bit bytes in the target area.
1852 *
1853 * Return value: Returns the number of data bytes stored at the
1854 * target, or -1 on error.
1855 *
1856 * Deprecated: Use gsasl_base64_from() instead.
1857 **/
1858 int
gsasl_base64_decode(char const * src,char * target,size_t targsize)1859 gsasl_base64_decode (char const *src, char *target, size_t targsize)
1860 {
1861 int rc;
1862 char *out;
1863 size_t outlen;
1864 int copied;
1865
1866 rc = gsasl_base64_from (src, strlen (src), &out, &outlen);
1867 if (rc)
1868 return -1;
1869
1870 copied = MIN (outlen, targsize);
1871 memcpy (target, out, copied);
1872 free (out);
1873
1874 return copied;
1875 }
1876
1877 static const char *
pmap(Gsasl_session * sctx,Gsasl_property prop,char * buf,size_t buflen)1878 pmap (Gsasl_session * sctx, Gsasl_property prop, char *buf, size_t buflen)
1879 {
1880 int res;
1881
1882 buf[0] = '\0';
1883
1884 /* Translate obsolete callbacks to modern properties. */
1885
1886 switch (prop)
1887 {
1888 case GSASL_SERVICE:
1889 {
1890 Gsasl_client_callback_service cb_service
1891 = gsasl_client_callback_service_get (sctx->ctx);
1892 if (!cb_service)
1893 break;
1894 res = cb_service (sctx, buf, &buflen, NULL, 0, NULL, 0);
1895 if (res != GSASL_OK)
1896 break;
1897 buf[buflen] = '\0';
1898 gsasl_property_set (sctx, prop, buf);
1899 break;
1900 }
1901
1902 case GSASL_HOSTNAME:
1903 {
1904 Gsasl_client_callback_service cb_service
1905 = gsasl_client_callback_service_get (sctx->ctx);
1906 if (!cb_service)
1907 break;
1908 res = cb_service (sctx, NULL, 0, buf, &buflen, NULL, 0);
1909 if (res != GSASL_OK)
1910 break;
1911 buf[buflen] = '\0';
1912 gsasl_property_set (sctx, prop, buf);
1913 break;
1914 }
1915
1916 case GSASL_ANONYMOUS_TOKEN:
1917 {
1918 Gsasl_client_callback_anonymous cb_anonymous
1919 = gsasl_client_callback_anonymous_get (sctx->ctx);
1920 if (!cb_anonymous)
1921 break;
1922 res = cb_anonymous (sctx, buf, &buflen);
1923 if (res != GSASL_OK)
1924 break;
1925 buf[buflen] = '\0';
1926 gsasl_property_set (sctx, prop, buf);
1927 break;
1928 }
1929
1930 case GSASL_AUTHID:
1931 {
1932 Gsasl_client_callback_authentication_id cb_authentication_id
1933 = gsasl_client_callback_authentication_id_get (sctx->ctx);
1934 if (!cb_authentication_id)
1935 break;
1936 res = cb_authentication_id (sctx, buf, &buflen);
1937 if (res != GSASL_OK)
1938 break;
1939 buf[buflen] = '\0';
1940 gsasl_property_set (sctx, prop, buf);
1941 break;
1942 }
1943
1944 case GSASL_AUTHZID:
1945 {
1946 Gsasl_client_callback_authorization_id cb_authorization_id
1947 = gsasl_client_callback_authorization_id_get (sctx->ctx);
1948 if (!cb_authorization_id)
1949 break;
1950 res = cb_authorization_id (sctx, buf, &buflen);
1951 if (res != GSASL_OK)
1952 break;
1953 buf[buflen] = '\0';
1954 gsasl_property_set (sctx, prop, buf);
1955 break;
1956 }
1957
1958 case GSASL_PASSWORD:
1959 {
1960 Gsasl_client_callback_password cb_password
1961 = gsasl_client_callback_password_get (sctx->ctx);
1962 if (!cb_password)
1963 break;
1964 res = cb_password (sctx, buf, &buflen);
1965 if (res != GSASL_OK)
1966 break;
1967 buf[buflen] = '\0';
1968 gsasl_property_set (sctx, prop, buf);
1969 break;
1970 }
1971
1972 case GSASL_PASSCODE:
1973 {
1974 Gsasl_client_callback_passcode cb_passcode
1975 = gsasl_client_callback_passcode_get (sctx->ctx);
1976 if (!cb_passcode)
1977 break;
1978 res = cb_passcode (sctx, buf, &buflen);
1979 if (res != GSASL_OK)
1980 break;
1981 buf[buflen] = '\0';
1982 gsasl_property_set (sctx, prop, buf);
1983 break;
1984 }
1985
1986 case GSASL_PIN:
1987 {
1988 Gsasl_client_callback_pin cb_pin
1989 = gsasl_client_callback_pin_get (sctx->ctx);
1990 if (!cb_pin)
1991 break;
1992 res = cb_pin (sctx, sctx->suggestedpin, buf, &buflen);
1993 if (res != GSASL_OK)
1994 break;
1995 buf[buflen] = '\0';
1996 gsasl_property_set (sctx, prop, buf);
1997 break;
1998 }
1999
2000 case GSASL_REALM:
2001 {
2002 Gsasl_client_callback_realm cb_realm
2003 = gsasl_client_callback_realm_get (sctx->ctx);
2004 if (!cb_realm)
2005 break;
2006 res = cb_realm (sctx, buf, &buflen);
2007 if (res != GSASL_OK)
2008 break;
2009 buf[buflen] = '\0';
2010 gsasl_property_set (sctx, prop, buf);
2011 break;
2012 }
2013
2014 #if USE_DIGEST_MD5
2015 case GSASL_QOP:
2016 {
2017 Gsasl_client_callback_qop cb_qop
2018 = gsasl_client_callback_qop_get (sctx->ctx);
2019 int serverqops;
2020 Gsasl_qop qop;
2021 if (!cb_qop)
2022 break;
2023 serverqops = digest_md5_qopstr2qops (sctx->qops);
2024 if (serverqops == -1)
2025 return NULL;
2026 qop = cb_qop (sctx, serverqops);
2027 if (qop & 0x07)
2028 gsasl_property_set (sctx, prop, digest_md5_qops2qopstr (qop));
2029 break;
2030 }
2031 break;
2032 #endif
2033
2034 default:
2035 break;
2036 }
2037
2038 return gsasl_property_fast (sctx, prop);
2039 }
2040
2041 const char *
_gsasl_obsolete_property_map(Gsasl_session * sctx,Gsasl_property prop)2042 _gsasl_obsolete_property_map (Gsasl_session * sctx, Gsasl_property prop)
2043 {
2044 const char *ret;
2045 char *buf;
2046
2047 buf = malloc (BUFSIZ);
2048 if (!buf)
2049 return NULL;
2050
2051 ret = pmap (sctx, prop, buf, BUFSIZ - 1);
2052
2053 free (buf);
2054
2055 return ret;
2056 }
2057
2058 int
_gsasl_obsolete_callback(Gsasl * ctx _GL_UNUSED,Gsasl_session * sctx,Gsasl_property prop)2059 _gsasl_obsolete_callback (Gsasl * ctx _GL_UNUSED,
2060 Gsasl_session * sctx, Gsasl_property prop)
2061 {
2062 int res;
2063
2064 /* Call obsolete callbacks. */
2065
2066 switch (prop)
2067 {
2068 case GSASL_VALIDATE_ANONYMOUS:
2069 {
2070 Gsasl_server_callback_anonymous cb_anonymous;
2071 if (!sctx->anonymous_token)
2072 break;
2073 cb_anonymous = gsasl_server_callback_anonymous_get (sctx->ctx);
2074 if (!cb_anonymous)
2075 break;
2076 res = cb_anonymous (sctx, sctx->anonymous_token);
2077 return res;
2078 break;
2079 }
2080
2081 case GSASL_VALIDATE_EXTERNAL:
2082 {
2083 Gsasl_server_callback_external cb_external
2084 = gsasl_server_callback_external_get (sctx->ctx);
2085 if (!cb_external)
2086 break;
2087 res = cb_external (sctx);
2088 return res;
2089 break;
2090 }
2091
2092 case GSASL_VALIDATE_SECURID:
2093 {
2094 Gsasl_server_callback_securid cb_securid
2095 = gsasl_server_callback_securid_get (sctx->ctx);
2096 #define MAX_SECURID 32 /* See RFC 2808. */
2097 char buf[MAX_SECURID + 1];
2098 size_t buflen = MAX_SECURID;
2099 if (!cb_securid)
2100 break;
2101 res = cb_securid (sctx, sctx->authid, sctx->authzid, sctx->passcode,
2102 sctx->pin, buf, &buflen);
2103 if (buflen > 0 && buflen < MAX_SECURID)
2104 {
2105 buf[buflen] = '\0';
2106 gsasl_property_set (sctx, GSASL_SUGGESTED_PIN, buf);
2107 }
2108 return res;
2109 break;
2110 }
2111
2112 case GSASL_VALIDATE_GSSAPI:
2113 {
2114 Gsasl_server_callback_gssapi cb_gssapi
2115 = gsasl_server_callback_gssapi_get (sctx->ctx);
2116 if (!cb_gssapi)
2117 break;
2118 res = cb_gssapi (sctx, sctx->gssapi_display_name, sctx->authzid);
2119 return res;
2120 break;
2121 }
2122
2123 case GSASL_VALIDATE_SIMPLE:
2124 {
2125 Gsasl_server_callback_validate cb_validate
2126 = gsasl_server_callback_validate_get (sctx->ctx);
2127 if (!cb_validate)
2128 break;
2129 res = cb_validate (sctx, sctx->authzid, sctx->authid, sctx->password);
2130 return res;
2131 break;
2132 }
2133
2134 case GSASL_PASSWORD:
2135 {
2136 Gsasl_server_callback_retrieve cb_retrieve
2137 = gsasl_server_callback_retrieve_get (sctx->ctx);
2138 char *buf;
2139 size_t buflen = BUFSIZ - 1;
2140 if (!cb_retrieve)
2141 break;
2142 buf = malloc (BUFSIZ);
2143 if (!buf)
2144 return GSASL_MALLOC_ERROR;
2145 res = cb_retrieve (sctx, sctx->authid, sctx->authzid,
2146 sctx->hostname, buf, &buflen);
2147 if (res == GSASL_OK)
2148 gsasl_property_set_raw (sctx, GSASL_PASSWORD, buf, buflen);
2149 /* FIXME else if (res == GSASL_TOO_SMALL_BUFFER)... */
2150 free (buf);
2151 return res;
2152 break;
2153 }
2154
2155 #if USE_DIGEST_MD5
2156 case GSASL_QOPS:
2157 {
2158 Gsasl_server_callback_qop cb_qop
2159 = gsasl_server_callback_qop_get (sctx->ctx);
2160 Gsasl_qop qops;
2161 if (!cb_qop)
2162 break;
2163 qops = cb_qop (sctx);
2164 if (qops & 0x07)
2165 gsasl_property_set (sctx, GSASL_QOPS,
2166 digest_md5_qops2qopstr (qops));
2167 return GSASL_OK;
2168 break;
2169 }
2170 #endif
2171
2172 default:
2173 break;
2174 }
2175
2176 return GSASL_NO_CALLBACK;
2177 }
2178
2179 #include "gc.h"
2180
2181 /**
2182 * gsasl_md5:
2183 * @in: input character array of data to hash.
2184 * @inlen: length of input character array of data to hash.
2185 * @out: newly allocated 16-byte character array with hash of data.
2186 *
2187 * Compute hash of data using MD5. The @out buffer must be
2188 * deallocated by the caller.
2189 *
2190 * Return value: Returns %GSASL_OK iff successful.
2191 *
2192 * Deprecated: Use a crypto library.
2193 **/
2194 int
gsasl_md5(const char * in,size_t inlen,char * out[])2195 gsasl_md5 (const char *in, size_t inlen, char *out[])
2196 {
2197 *out = malloc (GC_MD5_DIGEST_SIZE);
2198 if (!*out)
2199 return GSASL_MALLOC_ERROR;
2200 return gc_md5 (in, inlen, *out);
2201 }
2202
2203 /**
2204 * gsasl_hmac_md5:
2205 * @key: input character array with key to use.
2206 * @keylen: length of input character array with key to use.
2207 * @in: input character array of data to hash.
2208 * @inlen: length of input character array of data to hash.
2209 * @outhash: newly allocated 16-byte character array with keyed hash of data.
2210 *
2211 * Compute keyed checksum of data using HMAC-MD5. The @outhash buffer
2212 * must be deallocated by the caller.
2213 *
2214 * Return value: Returns %GSASL_OK iff successful.
2215 *
2216 * Deprecated: Use a crypto library.
2217 **/
2218 int
gsasl_hmac_md5(const char * key,size_t keylen,const char * in,size_t inlen,char * outhash[])2219 gsasl_hmac_md5 (const char *key, size_t keylen,
2220 const char *in, size_t inlen, char *outhash[])
2221 {
2222 *outhash = malloc (GC_MD5_DIGEST_SIZE);
2223 if (!*outhash)
2224 return GSASL_MALLOC_ERROR;
2225 return gc_hmac_md5 (key, keylen, in, inlen, *outhash);
2226 }
2227
2228 /**
2229 * gsasl_sha1:
2230 * @in: input character array of data to hash.
2231 * @inlen: length of input character array of data to hash.
2232 * @out: newly allocated 20-byte character array with hash of data.
2233 *
2234 * Compute hash of data using SHA1. The @out buffer must be
2235 * deallocated by the caller.
2236 *
2237 * Return value: Returns %GSASL_OK iff successful.
2238 *
2239 * Since: 1.3
2240 *
2241 * Deprecated: Use a crypto library.
2242 **/
2243 int
gsasl_sha1(const char * in,size_t inlen,char * out[])2244 gsasl_sha1 (const char *in, size_t inlen, char *out[])
2245 {
2246 *out = malloc (GC_SHA1_DIGEST_SIZE);
2247 if (!*out)
2248 return GSASL_MALLOC_ERROR;
2249 return gc_sha1 (in, inlen, *out);
2250 }
2251
2252 /**
2253 * gsasl_hmac_sha1:
2254 * @key: input character array with key to use.
2255 * @keylen: length of input character array with key to use.
2256 * @in: input character array of data to hash.
2257 * @inlen: length of input character array of data to hash.
2258 * @outhash: newly allocated 20-byte character array with keyed hash of data.
2259 *
2260 * Compute keyed checksum of data using HMAC-SHA1. The @outhash buffer
2261 * must be deallocated by the caller.
2262 *
2263 * Return value: Returns %GSASL_OK iff successful.
2264 *
2265 * Since: 1.3
2266 *
2267 * Deprecated: Use a crypto library.
2268 **/
2269 int
gsasl_hmac_sha1(const char * key,size_t keylen,const char * in,size_t inlen,char * outhash[])2270 gsasl_hmac_sha1 (const char *key, size_t keylen,
2271 const char *in, size_t inlen, char *outhash[])
2272 {
2273 *outhash = malloc (GC_SHA1_DIGEST_SIZE);
2274 if (!*outhash)
2275 return GSASL_MALLOC_ERROR;
2276 return gc_hmac_sha1 (key, keylen, in, inlen, *outhash);
2277 }
2278