use draft-josefsson-gss-capsulate-01 if present
[cyrus-sasl.git] / cmulocal / sasl2.m4
1 # sasl2.m4--sasl2 libraries and includes
2 # Rob Siemborski
3 # $Id: sasl2.m4,v 1.52 2006/05/18 19:25:00 murch Exp $
4
5 # SASL2_CRYPT_CHK
6 # ---------------
7 AC_DEFUN([SASL_GSSAPI_CHK],
8 [AC_REQUIRE([SASL2_CRYPT_CHK])
9 AC_REQUIRE([CMU_SOCKETS])
10 AC_ARG_ENABLE([gssapi],
11               [AC_HELP_STRING([--enable-gssapi=<DIR>],
12                               [enable GSSAPI authentication [yes]])],
13               [gssapi=$enableval],
14               [gssapi=yes])
15 AC_ARG_WITH([gss_impl],
16             [AC_HELP_STRING([--with-gss_impl={heimdal|mit|cybersafe|seam|auto}],
17                             [choose specific GSSAPI implementation [[auto]]])],
18             [gss_impl=$withval],
19             [gss_impl=auto])
20
21 if test "$gssapi" != no; then
22   platform=
23   case "${host}" in
24     *-*-linux*)
25       platform=__linux
26       ;;
27     *-*-hpux*)
28       platform=__hpux
29       ;;
30     *-*-irix*)
31       platform=__irix
32       ;;
33     *-*-solaris2*)
34 # When should we use __sunos?
35       platform=__solaris
36       ;;
37     *-*-aix*)
38 ###_AIX
39       platform=__aix
40       ;;
41     *)
42       AC_WARN([The system type is not recognized. If you believe that CyberSafe GSSAPI works on this platform, please update the configure script])
43       if test "$gss_impl" = "cybersafe"; then
44         AC_ERROR([CyberSafe was forced, cannot continue as platform is not supported])
45       fi
46       ;;
47   esac
48
49   cmu_saved_CPPFLAGS=$CPPFLAGS
50
51   if test -d ${gssapi}; then
52     CPPFLAGS="$CPPFLAGS -I$gssapi/include"
53 # We want to keep -I in our CPPFLAGS, but only if we succeed
54     cmu_saved_CPPFLAGS=$CPPFLAGS
55 ### I am not sure how useful is this (and whether this is required at all
56 ### especially when we have to provide two -L flags for new CyberSafe
57     LDFLAGS="$LDFLAGS -L$gssapi/lib"
58
59     if test -n "$platform"; then
60       if test "$gss_impl" = "auto" -o "$gss_impl" = "cybersafe"; then
61         CPPFLAGS="$CPPFLAGS -D$platform"
62         if test -d "${gssapi}/appsec-sdk/include"; then
63           CPPFLAGS="$CPPFLAGS -I${gssapi}/appsec-sdk/include"
64         fi
65       fi
66     fi
67   fi
68   AC_CHECK_HEADER([gssapi.h],
69                   [AC_DEFINE(HAVE_GSSAPI_H,,
70                              [Define if you have the gssapi.h header file])],
71                   [AC_CHECK_HEADER([gssapi/gssapi.h],,
72                                    [AC_WARN([Disabling GSSAPI - no include files found]); gssapi=no])])
73   AC_CHECK_HEADERS(gssapi/gssapi_ext.h)
74   CPPFLAGS=$cmu_saved_CPPFLAGS
75
76 fi
77
78 if test "$gssapi" != no; then
79   # We need to find out which gssapi implementation we are
80   # using. Supported alternatives are: MIT Kerberos 5,
81   # Heimdal Kerberos 5 (http://www.pdc.kth.se/heimdal),
82   # CyberSafe Kerberos 5 (http://www.cybersafe.com/)
83   # and Sun SEAM (http://wwws.sun.com/software/security/kerberos/)
84   #
85   # The choice is reflected in GSSAPIBASE_LIBS
86
87   AC_CHECK_LIB(resolv,res_search)
88   if test -d ${gssapi}; then
89      gssapi_dir="${gssapi}/lib"
90      GSSAPIBASE_LIBS="-L$gssapi_dir"
91      GSSAPIBASE_STATIC_LIBS="-L$gssapi_dir"
92   else
93      # FIXME: This is only used for building cyrus, and then only as
94      # a real hack.  it needs to be fixed.
95      gssapi_dir="/usr/local/lib"
96   fi
97
98   # Check a full link against the Heimdal libraries.
99   # If this fails, check a full link against the MIT libraries.
100   # If this fails, check a full link against the CyberSafe libraries.
101   # If this fails, check a full link against the Solaris 8 and up libgss.
102
103   if test "$gss_impl" = "auto" -o "$gss_impl" = "heimdal"; then
104     gss_failed=0
105     AC_CHECK_LIB(gssapi,gss_unwrap,gss_impl="heimdal",gss_failed=1,
106                  ${GSSAPIBASE_LIBS} -lgssapi -lkrb5 -lasn1 -lroken ${LIB_CRYPT} ${LIB_DES} -lcom_err ${LIB_SOCKET})
107     if test "$gss_impl" != "auto" -a "$gss_failed" = "1"; then
108       gss_impl="failed"
109     fi
110   fi
111
112   if test "$gss_impl" = "auto" -o "$gss_impl" = "mit"; then
113     # check for libkrb5support first
114     AC_CHECK_LIB(krb5support,krb5int_getspecific,K5SUP=-lkrb5support K5SUPSTATIC=$gssapi_dir/libkrb5support.a,,${LIB_SOCKET})
115
116     gss_failed=0
117     AC_CHECK_LIB(gssapi_krb5,gss_unwrap,gss_impl="mit",gss_failed=1,
118                  ${GSSAPIBASE_LIBS} -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err ${K5SUP} ${LIB_SOCKET})
119     if test "$gss_impl" != "auto" -a "$gss_failed" = "1"; then
120       gss_impl="failed"
121     fi
122   fi
123
124   # For Cybersafe one has to set a platform define in order to make compilation work
125   if test "$gss_impl" = "auto" -o "$gss_impl" = "cybersafe"; then
126
127     cmu_saved_CPPFLAGS=$CPPFLAGS
128     cmu_saved_GSSAPIBASE_LIBS=$GSSAPIBASE_LIBS
129 # FIXME - Note that the libraries are in .../lib64 for 64bit kernels
130     if test -d "${gssapi}/appsec-rt/lib"; then
131       GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -L${gssapi}/appsec-rt/lib"
132     fi
133     CPPFLAGS="$CPPFLAGS -D$platform"
134     if test -d "${gssapi}/appsec-sdk/include"; then
135       CPPFLAGS="$CPPFLAGS -I${gssapi}/appsec-sdk/include"
136     fi
137
138     gss_failed=0
139
140 # Check for CyberSafe with two libraries first, than fall back to a single 
141 # library (older CyberSafe)
142
143     unset ac_cv_lib_gss_csf_gss_acq_user
144     AC_CHECK_LIB(gss,csf_gss_acq_user,gss_impl="cybersafe03",
145                  [unset ac_cv_lib_gss_csf_gss_acq_user;
146                   AC_CHECK_LIB(gss,csf_gss_acq_user,gss_impl="cybersafe",
147                                gss_failed=1,$GSSAPIBASE_LIBS -lgss)],
148                  [${GSSAPIBASE_LIBS} -lgss -lcstbk5])
149
150     if test "$gss_failed" = "1"; then
151 # Restore variables
152       GSSAPIBASE_LIBS=$cmu_saved_GSSAPIBASE_LIBS
153       CPPFLAGS=$cmu_saved_CPPFLAGS
154
155       if test "$gss_impl" != "auto"; then
156         gss_impl="failed"
157       fi
158     fi
159   fi
160
161   if test "$gss_impl" = "auto" -o "$gss_impl" = "seam"; then
162     gss_failed=0
163     AC_CHECK_LIB(gss,gss_unwrap,gss_impl="seam",gss_failed=1,-lgss)
164     if test "$gss_impl" != "auto" -a "$gss_failed" = "1"; then
165       gss_impl="failed"
166     fi
167   fi
168
169   if test "$gss_impl" = "mit"; then
170     GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err ${K5SUP}"
171     GSSAPIBASE_STATIC_LIBS="$GSSAPIBASE_LIBS $gssapi_dir/libgssapi_krb5.a $gssapi_dir/libkrb5.a $gssapi_dir/libk5crypto.a $gssapi_dir/libcom_err.a ${K5SUPSTATIC}"
172   elif test "$gss_impl" = "heimdal"; then
173     CPPFLAGS="$CPPFLAGS -DKRB5_HEIMDAL"
174     GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lgssapi -lkrb5 -lasn1 -lroken ${LIB_CRYPT} ${LIB_DES} -lcom_err"
175     GSSAPIBASE_STATIC_LIBS="$GSSAPIBASE_STATIC_LIBS $gssapi_dir/libgssapi.a $gssapi_dir/libkrb5.a $gssapi_dir/libasn1.a $gssapi_dir/libroken.a $gssapi_dir/libcom_err.a ${LIB_CRYPT}"
176   elif test "$gss_impl" = "cybersafe03"; then
177 # Version of CyberSafe with two libraries
178     CPPFLAGS="$CPPFLAGS -D$platform -I${gssapi}/appsec-sdk/include"
179     GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lgss -lcstbk5"
180     # there is no static libgss for CyberSafe
181     GSSAPIBASE_STATIC_LIBS=none
182   elif test "$gss_impl" = "cybersafe"; then
183     CPPFLAGS="$CPPFLAGS -D$platform -I${gssapi}/appsec-sdk/include"
184     GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lgss"
185     # there is no static libgss for CyberSafe
186     GSSAPIBASE_STATIC_LIBS=none
187   elif test "$gss_impl" = "seam"; then
188     GSSAPIBASE_LIBS=-lgss
189     # there is no static libgss on Solaris 8 and up
190     GSSAPIBASE_STATIC_LIBS=none
191   elif test "$gss_impl" = "failed"; then
192     gssapi="no"
193     GSSAPIBASE_LIBS=
194     GSSAPIBASE_STATIC_LIBS=
195     AC_WARN([Disabling GSSAPI - specified library not found])
196   else
197     gssapi="no"
198     GSSAPIBASE_LIBS=
199     GSSAPIBASE_STATIC_LIBS=
200     AC_WARN([Disabling GSSAPI - no library])
201   fi
202 fi
203
204 #
205 # Cybersafe defines both GSS_C_NT_HOSTBASED_SERVICE and GSS_C_NT_USER_NAME
206 # in gssapi\rfckrb5.h
207 #
208 if test "$gssapi" != "no"; then
209   if test "$gss_impl" = "cybersafe" -o "$gss_impl" = "cybersafe03"; then
210     AC_EGREP_CPP(hostbased_service_gss_nt_yes,
211                  [#include <gssapi/gssapi.h>
212                   #ifdef GSS_C_NT_HOSTBASED_SERVICE
213                     hostbased_service_gss_nt_yes
214                   #endif],
215                  [AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE,,
216                             [Define if your GSSAPI implimentation defines GSS_C_NT_HOSTBASED_SERVICE])],
217                  [AC_WARN([Cybersafe define not found])])
218
219   elif test "$ac_cv_header_gssapi_h" = "yes"; then
220     AC_EGREP_HEADER(GSS_C_NT_HOSTBASED_SERVICE, gssapi.h,
221                     [AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE,,
222                                [Define if your GSSAPI implimentation defines GSS_C_NT_HOSTBASED_SERVICE])])
223   elif test "$ac_cv_header_gssapi_gssapi_h"; then
224     AC_EGREP_HEADER(GSS_C_NT_HOSTBASED_SERVICE, gssapi/gssapi.h,
225                     [AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE,,
226                                [Define if your GSSAPI implimentation defines GSS_C_NT_HOSTBASED_SERVICE])])
227   fi
228
229   if test "$gss_impl" = "cybersafe" -o "$gss_impl" = "cybersafe03"; then
230     AC_EGREP_CPP(user_name_yes_gss_nt,
231                  [#include <gssapi/gssapi.h>
232                   #ifdef GSS_C_NT_USER_NAME
233                    user_name_yes_gss_nt
234                   #endif],
235                  [AC_DEFINE(HAVE_GSS_C_NT_USER_NAME,,
236                             [Define if your GSSAPI implimentation defines GSS_C_NT_USER_NAME])],
237                  [AC_WARN([Cybersafe define not found])])
238   elif test "$ac_cv_header_gssapi_h" = "yes"; then
239     AC_EGREP_HEADER(GSS_C_NT_USER_NAME, gssapi.h,
240                     [AC_DEFINE(HAVE_GSS_C_NT_USER_NAME,,
241                                [Define if your GSSAPI implimentation defines GSS_C_NT_USER_NAME])])
242     AC_EGREP_HEADER(gss_inquire_attrs_for_mech, gssapi.h, rfc5587=yes)
243   elif test "$ac_cv_header_gssapi_gssapi_h"; then
244     AC_EGREP_HEADER(GSS_C_NT_USER_NAME, gssapi/gssapi.h,
245                     [AC_DEFINE(HAVE_GSS_C_NT_USER_NAME,,
246                                [Define if your GSSAPI implimentation defines GSS_C_NT_USER_NAME])])
247     AC_EGREP_HEADER(gss_inquire_attrs_for_mech, gssapi/gssapi.h, rfc5587=yes)
248   fi
249 fi
250
251 GSSAPI_LIBS=""
252 AC_MSG_CHECKING([GSSAPI])
253 if test "$gssapi" != no; then
254   AC_MSG_RESULT([with implementation ${gss_impl}])
255   AC_CHECK_LIB(resolv,res_search,GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lresolv")
256   SASL_MECHS="$SASL_MECHS libgssapiv2.la"
257   SASL_STATIC_OBJS="$SASL_STATIC_OBJS gssapi.o"
258   SASL_STATIC_SRCS="$SASL_STATIC_SRCS ../plugins/gssapi.c"
259   if test "$rfc5587" = "yes"; then
260     SASL_MECHS="$SASL_MECHS libgs2.la"
261     SASL_STATIC_OBJS="$SASL_STATIC_OBJS gs2.o"
262     SASL_STATIC_SRCS="$SASL_STATIC_SRCS ../plugins/gs2.c"
263   fi
264   cmu_save_LIBS="$LIBS"
265   LIBS="$LIBS $GSSAPIBASE_LIBS"
266   AC_CHECK_FUNCS(gsskrb5_register_acceptor_identity)
267   AC_CHECK_FUNCS(gss_decapsulate_token)
268   AC_CHECK_FUNCS(gss_encapsulate_token)
269   AC_CHECK_FUNCS(gss_oid_equal)
270   LIBS="$cmu_save_LIBS"
271 else
272   AC_MSG_RESULT([disabled])
273 fi
274 AC_SUBST(GSSAPI_LIBS)
275 AC_SUBST(GSSAPIBASE_LIBS)
276 ])# SASL_GSSAPI_CHK
277
278
279 # SASL_SET_GSSAPI_LIBS
280 # --------------------
281 AC_DEFUN([SASL_SET_GSSAPI_LIBS],
282 [SASL_GSSAPI_LIBS_SET="yes"
283 ])
284
285
286 # CMU_SASL2
287 # ---------
288 # What we want to do here is setup LIB_SASL with what one would
289 # generally want to have (e.g. if static is requested, make it that,
290 # otherwise make it dynamic.
291 #
292 # We also want to create LIB_DYN_SASL and DYNSASLFLAGS.
293 #
294 # Also sets using_static_sasl to "no" "static" or "staticonly"
295 #
296 AC_DEFUN([CMU_SASL2],
297 [AC_REQUIRE([SASL_GSSAPI_CHK])
298
299 AC_ARG_WITH(sasl,
300             [AC_HELP_STRING([--with-sasl=DIR],[Compile with libsasl2 in <DIR>])],
301             with_sasl="$withval",
302             with_sasl="yes")
303
304 AC_ARG_WITH(staticsasl,
305             [AC_HELP_STRING([--with-staticsasl=DIR],
306                             [Compile with staticly linked libsasl2 in <DIR>])],
307             [with_staticsasl="$withval";
308              if test $with_staticsasl != "no"; then
309                using_static_sasl="static"
310              fi],
311             [with_staticsasl="no"; using_static_sasl="no"])
312
313 SASLFLAGS=""
314 LIB_SASL=""
315
316 cmu_saved_CPPFLAGS=$CPPFLAGS
317 cmu_saved_LDFLAGS=$LDFLAGS
318 cmu_saved_LIBS=$LIBS
319
320 if test ${with_staticsasl} != "no"; then
321   if test -d ${with_staticsasl}; then
322     if test -d ${with_staticsasl}/lib64 ; then
323       ac_cv_sasl_where_lib=${with_staticsasl}/lib64
324     else
325       ac_cv_sasl_where_lib=${with_staticsasl}/lib
326     fi
327     ac_cv_sasl_where_lib=${with_staticsasl}/lib
328     ac_cv_sasl_where_inc=${with_staticsasl}/include
329
330     SASLFLAGS="-I$ac_cv_sasl_where_inc"
331     LIB_SASL="-L$ac_cv_sasl_where_lib"
332     CPPFLAGS="${cmu_saved_CPPFLAGS} -I${ac_cv_sasl_where_inc}"
333     LDFLAGS="${cmu_saved_LDFLAGS} -L${ac_cv_sasl_where_lib}"
334   else
335     with_staticsasl="/usr"
336   fi
337
338   AC_CHECK_HEADER(sasl/sasl.h,
339                   [AC_CHECK_HEADER(sasl/saslutil.h,
340                                    [for i42 in lib64 lib; do
341                                       if test -r ${with_staticsasl}/$i42/libsasl2.a; then
342                                         ac_cv_found_sasl=yes
343                                         AC_MSG_CHECKING([for static libsasl])
344                                         LIB_SASL="$LIB_SASL ${with_staticsasl}/$i42/libsasl2.a"
345                                       fi
346                                     done
347                                     if test ! "$ac_cv_found_sasl" = "yes"; then
348                                       AC_MSG_CHECKING([for static libsasl])
349                                       AC_ERROR([Could not find ${with_staticsasl}/lib*/libsasl2.a])
350                                     fi])])
351
352   AC_MSG_RESULT([found])
353
354   if test "x$SASL_GSSAPI_LIBS_SET" = "x"; then
355     LIB_SASL="$LIB_SASL $GSSAPIBASE_STATIC_LIBS"
356   else
357     SASL_GSSAPI_LIBS_SET=""
358     cmu_saved_LIBS="$GSSAPIBASE_STATIC_LIBS $cmu_saved_LIBS" 
359   fi
360 fi
361
362 if test -d ${with_sasl}; then
363   ac_cv_sasl_where_lib=${with_sasl}/lib
364   ac_cv_sasl_where_inc=${with_sasl}/include
365
366   DYNSASLFLAGS="-I$ac_cv_sasl_where_inc"
367   if test "$ac_cv_sasl_where_lib" != ""; then
368     CMU_ADD_LIBPATH_TO($ac_cv_sasl_where_lib, LIB_DYN_SASL)
369   fi
370   LIB_DYN_SASL="$LIB_DYN_SASL -lsasl2"
371   CPPFLAGS="${cmu_saved_CPPFLAGS} -I${ac_cv_sasl_where_inc}"
372   LDFLAGS="${cmu_saved_LDFLAGS} -L${ac_cv_sasl_where_lib}"
373 fi
374
375 # be sure to check for a SASLv2 specific function
376 AC_CHECK_HEADER(sasl/sasl.h,
377                 [AC_CHECK_HEADER(sasl/saslutil.h,
378                                  [AC_CHECK_LIB(sasl2, prop_get, 
379                                                ac_cv_found_sasl=yes,
380                                                ac_cv_found_sasl=no)],
381                                  ac_cv_found_sasl=no)],
382                 ac_cv_found_sasl=no)
383
384 if test "$ac_cv_found_sasl" = "yes"; then
385   if test "$ac_cv_sasl_where_lib" != ""; then
386     CMU_ADD_LIBPATH_TO($ac_cv_sasl_where_lib, DYNLIB_SASL)
387   fi
388   DYNLIB_SASL="$DYNLIB_SASL -lsasl2"
389   if test "$using_static_sasl" != "static"; then
390     LIB_SASL=$DYNLIB_SASL
391     SASLFLAGS=$DYNSASLFLAGS
392   fi
393 else
394   DYNLIB_SASL=""
395   DYNSASLFLAGS=""
396   using_static_sasl="staticonly"
397 fi
398
399 if test "x$SASL_GSSAPI_LIBS_SET" != "x"; then
400   SASL_GSSAPI_LIBS_SET=""
401   cmu_saved_LIBS="$GSSAPIBASE_LIBS $cmu_saved_LIBS" 
402 fi
403
404 LIBS="$cmu_saved_LIBS"
405 LDFLAGS="$cmu_saved_LDFLAGS"
406 CPPFLAGS="$cmu_saved_CPPFLAGS"
407
408 AC_SUBST(LIB_DYN_SASL)
409 AC_SUBST(DYNSASLFLAGS)
410 AC_SUBST(LIB_SASL)
411 AC_SUBST(SASLFLAGS)
412 ])# CMU_SASL2
413
414
415 # CMU_SASL2_REQUIRED
416 # ------------------
417 AC_DEFUN([CMU_SASL2_REQUIRED],
418 [AC_REQUIRE([CMU_SASL2])
419 if test "$ac_cv_found_sasl" != "yes"; then
420   AC_ERROR([Cannot continue without libsasl2.
421 Get it from ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/.])
422 fi])
423
424
425 # CMU_SASL2_REQUIRE_VER
426 # ---------------------
427 AC_DEFUN([CMU_SASL2_REQUIRE_VER],
428 [AC_REQUIRE([CMU_SASL2_REQUIRED])
429
430 cmu_saved_CPPFLAGS=$CPPFLAGS
431 CPPFLAGS="$CPPFLAGS $SASLFLAGS"
432
433 AC_TRY_CPP([
434 #include <sasl/sasl.h>
435
436 #ifndef SASL_VERSION_MAJOR
437 #error SASL_VERSION_MAJOR not defined
438 #endif
439 #ifndef SASL_VERSION_MINOR
440 #error SASL_VERSION_MINOR not defined
441 #endif
442 #ifndef SASL_VERSION_STEP
443 #error SASL_VERSION_STEP not defined
444 #endif
445
446 #if SASL_VERSION_MAJOR < $1 || SASL_VERSION_MINOR < $2 || SASL_VERSION_STEP < $3
447 #error SASL version is less than $1.$2.$3
448 #endif
449 ],,
450            [AC_ERROR([Incorrect SASL headers found.  This package requires SASL $1.$2.$3 or newer.])])
451
452 CPPFLAGS=$cmu_saved_CPPFLAGS
453 ])# CMU_SASL2_REQUIRE_VER
454
455
456 # CMU_SASL2_CHECKAPOP_REQUIRED
457 # ----------------------------
458 AC_DEFUN([CMU_SASL2_CHECKAPOP_REQUIRED],
459 [AC_REQUIRE([CMU_SASL2_REQUIRED])
460
461 cmu_saved_LDFLAGS=$LDFLAGS
462
463 LDFLAGS="$LDFLAGS $LIB_SASL"
464
465 AC_CHECK_LIB(sasl2, sasl_checkapop,
466              [AC_DEFINE(HAVE_APOP,[],[Does SASL support APOP?])],
467              [AC_MSG_ERROR([libsasl2 without working sasl_checkapop.  Cannot continue.])])
468
469 LDFLAGS=$cmu_saved_LDFLAGS
470 ])# CMU_SASL2_CHECKAPOP_REQUIRED
471
472
473 # SASL2_CRYPT_CHK
474 # ---------------
475 AC_DEFUN([SASL2_CRYPT_CHK],
476 [AC_CHECK_FUNC(crypt, cmu_have_crypt=yes,
477                [AC_CHECK_LIB(crypt, crypt,
478                              LIB_CRYPT="-lcrypt"; cmu_have_crypt=yes,
479                              cmu_have_crypt=no)])
480 AC_SUBST(LIB_CRYPT)
481 ])# SASL2_CRYPT_CHK