[7150] in Kerberos

home help back first fref pref prev next nref lref last post

Kerberos 5 & X11R6

daemon@ATHENA.MIT.EDU (Tomasz Krupa - Junior System Engin)
Wed Apr 24 04:33:21 1996

From: Tomasz.Krupa@Poland.Sun.COM (Tomasz Krupa - Junior System Engineer - Sun Poland )
To: kerberos@MIT.EDU
Date: Mon, 22 Apr 1996 17:05:21 +0200 (MET DST)
Cc: J.Sobczyk@ia.pw.edu.pl


Subject: K5 BETA 5 & X11R6
Newsgroups: comp.protocols.kerberos
Summary: Kerberos 5 Beta 5 patches for X11R6
Keywords: Kerberos X11R6 
X-Newsreader: TIN [version 1.2 PL2]

Hello,
I made some changes to X11R6 patch level 12 code allowing the use of
Kerberos 5 BETA 5. It seems to work, but it hasn't been tested
extensively yet. I compiled and run it on Solaris 2.5 sparc only.
Note: All the Kerberos libraries must be dynamic.
If you are using Kerberos 4 backward compatibility
libkrb5.so has to be relinked with libkrb4 dependence.

Any comments are highly appreciated.
    Tomasz




diff -ru /tmp/X11R6pl12/xc/config/cf/site.def X11R6/xc/config/cf/site.def
--- /tmp/X11R6pl12/xc/config/cf/site.def	Fri Apr  8 23:02:23 1994
+++ X11R6/xc/config/cf/site.def	Mon Apr 22 16:32:46 1996
@@ -21,6 +21,21 @@
  *                                                                           *
  *****************************************************************************/
 
+/* 2 lines below for debugging only */
+/* #define CcCmd		gcc -g */
+/* #define OptimizedCDebugFlags */ /* -O2 */
+
+/* Local config */
+#define HasGcc2		YES
+#define OSMajorVersion	5
+#define OSMinorVersion	5
+#define SystemV4	YES
+#define HasSecureRPC	YES
+#define HasKrb5		YES
+#define Krb5Includes	-I/usr/local/include
+#define Krb5Libraries	-L/usr/local/lib -lkrb5 -lcrypto -lcom_err
+#define SharedX11Reqs	-L/usr/local/lib -lkrb5 -lcrypto -lcom_err
+
 /* if you want host-specific customization, this is one way to do it */
 /*
 #ifndef SiteIConfigFiles
@@ -47,9 +62,9 @@
 
 #ifdef AfterVendorCF
 
-#define ProjectRoot /usr/X11R6
+#define ProjectRoot /usr/local/X11R6
 
-/* #define HasXdmAuth YES */
+#define HasXdmAuth YES 
 
 /* #define BuildXKB YES */
 
diff -ru /tmp/X11R6pl12/xc/config/cf/sun.cf X11R6/xc/config/cf/sun.cf
--- /tmp/X11R6pl12/xc/config/cf/sun.cf	Mon Apr 22 16:03:21 1996
+++ X11R6/xc/config/cf/sun.cf	Mon Apr 22 16:32:46 1996
@@ -3,28 +3,28 @@
 #ifdef SVR4Architecture
 #ifdef i386Architecture
 #ifndef OSName
-#define OSName            SunOS 5.1 x86
+#define OSName            SunOS 5.4 x86
 #endif
 XCOMM operating system:  OSName
 #ifndef OSMajorVersion
 #define OSMajorVersion    5
 #endif
 #ifndef OSMinorVersion
-#define OSMinorVersion    1
+#define OSMinorVersion    4 
 #endif
 #ifndef	OSTeenyVersion
 #define OSTeenyVersion    0
 #endif
 #else
 #ifndef OSName
-#define OSName            SunOS 5.3
+#define OSName            SunOS 5.4
 #endif
 XCOMM operating system:  OSName
 #ifndef OSMajorVersion
 #define OSMajorVersion    5
 #endif
 #ifndef OSMinorVersion
-#define OSMinorVersion    3
+#define OSMinorVersion    4
 #endif
 #ifndef	OSTeenyVersion
 #define OSTeenyVersion    0
diff -ru /tmp/X11R6pl12/xc/config/cf/sunLib.tmpl X11R6/xc/config/cf/sunLib.tmpl
--- /tmp/X11R6pl12/xc/config/cf/sunLib.tmpl	Mon Apr 22 16:03:21 1996
+++ X11R6/xc/config/cf/sunLib.tmpl	Mon Apr 22 16:32:46 1996
@@ -39,7 +39,7 @@
 
 #if ThreadedX
 #if OSMinorVersion > 3
-#define SharedX11Reqs /**/
+/* #define SharedX11Reqs */ /**/
 #endif
 #endif
 #define SharedXmuReqs $(LDPRELIB) $(XTOOLLIB) $(XLIB)
diff -ru /tmp/X11R6pl12/xc/lib/X11/ConnDis.c X11R6/xc/lib/X11/ConnDis.c
--- /tmp/X11R6pl12/xc/lib/X11/ConnDis.c	Mon Apr 22 16:02:38 1996
+++ X11R6/xc/lib/X11/ConnDis.c	Mon Apr 22 16:32:45 1996
@@ -665,7 +665,7 @@
 #endif
 
 #ifdef K5AUTH
-#include <com_err.h>
+#include <krb5/com_err.h>
 
 extern krb5_flags krb5_kdc_default_options;
 
@@ -686,11 +686,14 @@
     CARD16 plen, tlen;
     krb5_data kbuf;
     krb5_ccache cc;
-    krb5_creds creds;
+    krb5_creds creds, *out_creds;
     krb5_principal cprinc, sprinc;
     krb5_ap_rep_enc_part *repl;
+    krb5_context context;
+    krb5_auth_context *auth_context = NULL;
 
-    krb5_init_ets();
+    krb5_init_context(&context);
+    krb5_init_ets(context);
     /*
      * stage 0: get encoded principal and tgt from server
      */
@@ -742,7 +745,7 @@
 	kbuf.data = buf;
 	kbuf.length = tlen;
     }
-    if (XauKrb5Decode(kbuf, &sprinc))
+    if (XauKrb5Decode(context, kbuf, &sprinc))
     {
 	free(buf);
 	fprintf(stderr, "Xlib: XauKrb5Decode bombed\n");
@@ -752,18 +755,18 @@
     {
 	char *sname, *hostname = NULL;
 
-	sname = (char *)malloc(krb5_princ_component(sprinc, 0)->length + 1);
+	sname = (char *)malloc(krb5_princ_component(context,sprinc, 0)->length + 1);
 	if (sname == NULL)
 	{
 	    free(buf);
-	    krb5_free_principal(sprinc);
+	    krb5_free_principal(context,sprinc);
 	    fprintf(stderr, "Xlib: malloc bombed in Krb5 auth\n");
 	    return -1;
 	}
-	memcpy(sname, krb5_princ_component(sprinc, 0)->data,
-	       krb5_princ_component(sprinc, 0)->length);
-	sname[krb5_princ_component(sprinc, 0)->length] = '\0';
-	krb5_free_principal(sprinc);
+	memcpy(sname, krb5_princ_component(context,sprinc, 0)->data,
+	       krb5_princ_component(context,sprinc, 0)->length);
+	sname[krb5_princ_component(context,sprinc, 0)->length] = '\0';
+	krb5_free_principal(context,sprinc);
 	if (dpy->display_name[0] != ':') /* hunt for a hostname */
 	{
 	    char *t;
@@ -791,7 +794,7 @@
 		t++;
 	    *t = '\0';		/* truncate the dpy number out */
 	}
-	retval = krb5_sname_to_principal(hostname, sname,
+	retval = krb5_sname_to_principal(context, hostname, sname,
 					 KRB5_NT_SRV_HST, &sprinc);
 	free(sname);
 	if (hostname)
@@ -804,20 +807,20 @@
 	    return -1;
 	}
     }
-    if (retval = krb5_cc_default(&cc))
+    if (retval = krb5_cc_default(context,&cc))
     {
 	free(buf);
-	krb5_free_principal(sprinc);
+	krb5_free_principal(context,sprinc);
 	fprintf(stderr, "Xlib: krb5_cc_default failed: %s\n",
 		error_message(retval));
 	return -1;
     }
-    if (retval = krb5_cc_get_principal(cc, &cprinc))
+    if (retval = krb5_cc_get_principal(context,cc, &cprinc))
     {
 	free(buf);
-	krb5_free_principal(sprinc);
+	krb5_free_principal(context,sprinc);
 	fprintf(stderr, "Xlib: cannot get Kerberos principal from \"%s\": %s\n",
-		krb5_cc_default_name(), error_message(retval));
+		krb5_cc_default_name(context), error_message(retval));
 	return -1;
     }
     bzero((char *)&creds, sizeof(creds));
@@ -827,37 +830,56 @@
     {
 	creds.second_ticket.length = tlen - plen - 2;
 	creds.second_ticket.data = buf + 2 + plen;
-	retval = krb5_get_credentials(KRB5_GC_USER_USER |
+	retval = krb5_get_credentials(context, KRB5_GC_USER_USER |
 				      krb5_kdc_default_options,
-				      cc, &creds);
+				      cc, &creds, &out_creds);
+	creds.second_ticket.length = 0; /* to avoid freeing */
+	creds.second_ticket.data = NULL;
     }
     else
-	retval = krb5_get_credentials(krb5_kdc_default_options,
-				      cc, &creds);
+	retval = krb5_get_credentials(context, krb5_kdc_default_options,
+				      cc, &creds, &out_creds);
     if (retval)
     {
 	free(buf);
-	krb5_free_cred_contents(&creds);
+	krb5_free_cred_contents(context, &creds);
 	fprintf(stderr, "Xlib: cannot get Kerberos credentials: %s\n",
 		error_message(retval));
 	return -1;
     }
+
+    krb5_free_cred_contents(context, &creds);
+
+    /*
+     * Prepare auth context (TJK)
+     */
+    if (krb5_auth_con_init(context, &auth_context))
+    {
+	krb5_free_creds(context, out_creds);
+	krb5_auth_con_free(context, auth_context);
+	krb5_free_context(context);
+	fprintf(stderr, "Xlib: krb5_auth_con_init failed: %s\n",
+		error_message(retval));
+	return -1;
+    }
     /*
      * now format the ap_req to send to the server
      */
     if (prefix.reqType == 2)
-	retval = krb5_mk_req_extended(AP_OPTS_USE_SESSION_KEY |
-				      AP_OPTS_MUTUAL_REQUIRED, NULL,
-				      0, 0, NULL, cc,
-				      &creds, NULL, &kbuf);
+	retval = krb5_mk_req_extended(context, &auth_context, 
+				      AP_OPTS_USE_SESSION_KEY |
+				      AP_OPTS_MUTUAL_REQUIRED, 
+				      NULL, out_creds, &kbuf);
     else
-	retval = krb5_mk_req_extended(AP_OPTS_MUTUAL_REQUIRED, NULL,
-				      0, 0, NULL, cc, &creds, NULL,
-				      &kbuf);
+	retval = krb5_mk_req_extended(context, &auth_context,
+				      AP_OPTS_MUTUAL_REQUIRED, 
+				      NULL, out_creds, &kbuf);
     free(buf);
     if (retval)			/* Some manner of Kerberos lossage */
     {
-	krb5_free_cred_contents(&creds);
+	krb5_free_creds(context, out_creds);
+	krb5_auth_con_free(context, auth_context);
+	krb5_free_context(context);
 	fprintf(stderr, "Xlib: krb5_mk_req_extended failed: %s\n",
 		error_message(retval));
 	return -1;
@@ -900,7 +922,17 @@
 	return -1;
     }
     _XRead(dpy, (char *)kbuf.data, kbuf.length);
-    retval = krb5_rd_rep(&kbuf, &creds.keyblock, &repl);
+
+    retval = krb5_auth_con_setuseruserkey(context, auth_context,
+					  &(out_creds->keyblock));
+    if(retval)
+    {
+	free(kbuf.data);
+	fprintf(stderr, "Xlib: krb5_auth_con_setuseruserkey failed: %s\n",
+		error_message(retval));
+	return -1;
+    }
+    retval = krb5_rd_rep(context, auth_context, &kbuf, &repl);
     if (retval)
     {
 	free(kbuf.data);
@@ -916,6 +948,9 @@
     prefix.data = 0;
     prefix.length = sz_xReq >> 2;
     _XSend(dpy, (char *)&prefix, sz_xReq);
+    krb5_free_creds(context, out_creds);
+    krb5_auth_con_free(context, auth_context);
+    krb5_free_context(context);
     return 0;
 }
 #endif /* K5AUTH */
diff -ru /tmp/X11R6pl12/xc/lib/Xau/Xauth.h X11R6/xc/lib/Xau/Xauth.h
--- /tmp/X11R6pl12/xc/lib/Xau/Xauth.h	Mon Apr 18 02:15:47 1994
+++ X11R6/xc/lib/Xau/Xauth.h	Mon Apr 22 16:32:45 1996
@@ -144,13 +144,14 @@
 );
 
 #ifdef K5AUTH
-#include <krb5/krb5.h>
+#include <krb5.h>
 /* 9/93: krb5.h leaks some symbols */
 #undef BITS32
 #undef xfree
 
 int XauKrb5Encode(
 #if NeedFunctionPrototypes
+     krb5_context	/* context */,
      krb5_principal	/* princ */,
      krb5_data *	/* outbuf */
 #endif
@@ -158,6 +159,7 @@
 
 int XauKrb5Decode(
 #if NeedFunctionPrototypes
+     krb5_context	/* context */, 
      krb5_data		/* inbuf */,
      krb5_principal *	/* princ */
 #endif
diff -ru /tmp/X11R6pl12/xc/lib/Xau/k5encode.c X11R6/xc/lib/Xau/k5encode.c
--- /tmp/X11R6pl12/xc/lib/Xau/k5encode.c	Mon Apr 18 02:15:47 1994
+++ X11R6/xc/lib/Xau/k5encode.c	Mon Apr 22 16:32:45 1996
@@ -38,7 +38,7 @@
  * about that later.
  */
 
-#include <krb5/krb5.h>
+#include <krb5.h>
 /* 9/93: krb5.h leaks some symbols */
 #undef BITS32
 #undef xfree
@@ -69,33 +69,36 @@
  * always do the right thing.  Don't have to frob with alignment that way.
  */
 int
-XauKrb5Encode(princ, outbuf)
+XauKrb5Encode(context, princ, outbuf)
+    krb5_context context;	/* Kerberos context */
     krb5_principal princ;	/* principal to encode */
     krb5_data *outbuf;		/* output buffer */
 {
     CARD16 i, numparts, totlen = 0, plen, rlen;
     char *cp, *pdata;
 
-    rlen = krb5_princ_realm(princ)->length;
-    numparts = krb5_princ_size(princ);
+    rlen = krb5_princ_realm(context,princ)->length;
+    numparts = krb5_princ_size(context,princ);
     totlen = 2 + rlen + 2;	/* include room for realm length
 				   and component count */
     for (i = 0; i < numparts; i++)
-	totlen += krb5_princ_component(princ, i)->length + 2;
+	totlen += krb5_princ_component(context,princ, i)->length + 2;
     /* add 2 bytes each time for length */
     if ((outbuf->data = (char *)malloc(totlen)) == NULL)
+    {
 	return -1;
+    }
     cp = outbuf->data;
     *cp++ = (char)((int)(0xff00 & rlen) >> 8);
     *cp++ = (char)(0x00ff & rlen);
-    memcpy(cp, krb5_princ_realm(princ)->data, rlen);
+    memcpy(cp, krb5_princ_realm(context,princ)->data, rlen);
     cp += rlen;
     *cp++ = (char)((int)(0xff00 & numparts) >> 8);
     *cp++ = (char)(0x00ff & numparts);
     for (i = 0; i < numparts; i++)
     {
-	plen = krb5_princ_component(princ, i)->length;
-	pdata = krb5_princ_component(princ, i)->data;
+	plen = krb5_princ_component(context,princ, i)->length;
+	pdata = krb5_princ_component(context,princ, i)->data;
 	*cp++ = (char)((int)(0xff00 & plen) >> 8);
 	*cp++ = (char)(0x00ff & plen);
 	memcpy(cp, pdata, plen);
@@ -111,16 +114,17 @@
  * this function essentially reverses what XauKrb5Encode does
  */
 int
-XauKrb5Decode(inbuf, princ)
+XauKrb5Decode(context, inbuf, princ)
+    krb5_context context;
     krb5_data inbuf;
     krb5_principal *princ;
 {
     CARD16 i, numparts, plen, rlen;
     CARD8 *cp, *pdata;
-    
+
     if (inbuf.length < 4)
     {
-	krb5_free_principal(*princ);
+	/* krb5_free_principal(context,*princ); */
 	return -1;
     }
     *princ = (krb5_principal)malloc(sizeof (krb5_principal_data));
@@ -132,48 +136,48 @@
     rlen |= *cp++;
     if (inbuf.length < 4 + (int)rlen + 2)
     {
-	krb5_free_principal(*princ);
+	krb5_free_principal(context,*princ);
 	return -1;
     }
-    krb5_princ_realm(*princ)->data = (char *)malloc(rlen);
-    if (krb5_princ_realm(*princ)->data == NULL)
+    krb5_princ_realm(context,*princ)->data = (char *)malloc(rlen);
+    if (krb5_princ_realm(context,*princ)->data == NULL)
     {
-	krb5_free_principal(*princ);
+	krb5_free_principal(context,*princ);
 	return -1;
     }
-    krb5_princ_realm(*princ)->length = rlen;
-    memcpy(krb5_princ_realm(*princ)->data, cp, rlen);
+    krb5_princ_realm(context,*princ)->length = rlen;
+    memcpy(krb5_princ_realm(context,*princ)->data, cp, rlen);
     cp += rlen;
     numparts = *cp++ << 8;
     numparts |= *cp++;
-    krb5_princ_name(*princ) =
+    krb5_princ_name(context,*princ) =
 	(krb5_data *)malloc(numparts * sizeof (krb5_data));
-    krb5_princ_size(*princ) = 0;
+    krb5_princ_size(context,*princ) = 0;
     for (i = 0; i < numparts; i++)
     {
 	if (cp + 2 > (CARD8 *)inbuf.data + inbuf.length)
 	{
-	    krb5_free_principal(*princ);
+	    krb5_free_principal(context,*princ);
 	    return -1;
 	}
 	plen = *cp++ << 8;
 	plen |= *cp++;
 	if (cp + plen > (CARD8 *)inbuf.data + inbuf.length)
 	{
-	    krb5_free_principal(*princ);
+	    krb5_free_principal(context,*princ);
 	    return -1;
 	}
 	pdata = (CARD8 *)malloc(plen);
 	if (pdata == NULL)
 	{
-	    krb5_free_principal(*princ);
+	    krb5_free_principal(context,*princ);
 	    return -1;
 	}
-	krb5_princ_component(*princ, i)->data = (char *)pdata;
-	krb5_princ_component(*princ, i)->length = plen;
+	krb5_princ_component(context,*princ, i)->data = (char *)pdata;
+	krb5_princ_component(context,*princ, i)->length = plen;
 	memcpy(pdata, cp, plen);
 	cp += plen;
-	krb5_princ_size(*princ)++;
+	krb5_princ_size(context,*princ)++;
     }
     return 0;
 }
diff -ru /tmp/X11R6pl12/xc/programs/Xserver/os/access.c X11R6/xc/programs/Xserver/os/access.c
--- /tmp/X11R6pl12/xc/programs/Xserver/os/access.c	Mon Apr 22 16:03:06 1996
+++ X11R6/xc/programs/Xserver/os/access.c	Mon Apr 22 16:32:46 1996
@@ -663,6 +663,7 @@
     struct dn_naddr 	dnaddr, *dnaddrp, *dnet_addr();
 #endif
 #ifdef K5AUTH
+    krb5_context	context;
     krb5_principal      princ;
     krb5_data		kbuf;
 #endif
@@ -755,10 +756,12 @@
 #ifdef K5AUTH
 	if (family == FamilyKrb5Principal)
 	{
-            krb5_parse_name(hostname, &princ);
-	    XauKrb5Encode(princ, &kbuf);
+	    krb5_init_context(&context);
+            krb5_parse_name(context, hostname, &princ);
+	    XauKrb5Encode(context, princ, &kbuf);
 	    (void) NewHost(FamilyKrb5Principal, kbuf.data, kbuf.length);
-	    krb5_free_principal(princ);
+	    krb5_free_principal(context, princ);
+	    krb5_free_context(context);
         }
 	else
 #endif
diff -ru /tmp/X11R6pl12/xc/programs/Xserver/os/k5auth.c X11R6/xc/programs/Xserver/os/k5auth.c
--- /tmp/X11R6pl12/xc/programs/Xserver/os/k5auth.c	Mon Apr 22 16:03:07 1996
+++ X11R6/xc/programs/Xserver/os/k5auth.c	Mon Apr 22 16:32:46 1996
@@ -46,7 +46,8 @@
 #include <netdnet/dn.h>
 #endif
 #include <arpa/inet.h>
-#include <krb5/krb5.h>
+#include <krb5.h>
+#include <krb5/auth_con.h>
 /* 9/93: krb5.h leaks some symbols */
 #undef BITS32
 #undef xfree
@@ -57,7 +58,7 @@
 #include "Xproto.h"
 #include "Xfuncs.h"
 #include "dixstruct.h"
-#include <com_err.h>
+#include <krb5/com_err.h>
 #include "Xauth.h"
 
 extern int (*k5_Vector[256])();
@@ -68,23 +69,14 @@
 static krb5_principal srvname = NULL; /* service name */
 static char *ccname = NULL;
 static char *ktname = NULL;	/* key table name */
-static char kerror[256];
+static krb5_context context = NULL; /* krb5_context is already a pointer */
+static char kerror[260];
 
 /*
  * tgt_keyproc:
  *
  * extract session key from a credentials struct
  */
-krb5_error_code tgt_keyproc(keyprocarg, principal, vno, key)
-    krb5_pointer keyprocarg;
-    krb5_principal principal;
-    krb5_kvno vno;
-    krb5_keyblock **key;
-{
-    krb5_creds *creds = (krb5_creds *)keyprocarg;
-    
-    return krb5_copy_keyblock(&creds->keyblock, key);
-}
 
 /*
  * k5_cmpenc:
@@ -132,9 +124,10 @@
 {
     krb5_error_code retval;
     CARD16 tlen;
+    CARD16 plen;
     krb5_principal sprinc, cprinc;
     krb5_ccache cc;
-    krb5_creds *creds;
+    krb5_creds *creds, *new_creds;
     char *outbuf, *cp;
     krb5_data princ;
     register char n;
@@ -144,44 +137,53 @@
 	return ~0L;
     if (!ccname && !srvname)
 	return ~0L;
+
     if (ccname)
     {
 	if ((creds = (krb5_creds *)malloc(sizeof(krb5_creds))) == NULL)
 	    return ~0L;
-	if (retval = krb5_cc_resolve(ccname, &cc))
+	if (retval = krb5_cc_resolve(context, ccname, &cc))
 	    return ~0L;
 	bzero((char*)creds, sizeof (krb5_creds));
-	if (retval = krb5_cc_get_principal(cc, &cprinc))
+	if (retval = krb5_cc_get_principal(context, cc, &cprinc))
 	{
-	    krb5_free_creds(creds);
-	    krb5_cc_close(cc);
+	    krb5_free_creds(context, creds);
+	    krb5_cc_close(context, cc);
 	    return ~0L;
 	}
 	creds->client = cprinc;
 	if (retval =
-	    krb5_build_principal_ext(&sprinc, 
-				     krb5_princ_realm(creds->client)->length,
-				     krb5_princ_realm(creds->client)->data,
+	    krb5_build_principal_ext(context, &sprinc, 
+				     krb5_princ_realm(context, creds->client)->length,
+				     krb5_princ_realm(context, creds->client)->data,
 				     6, "krbtgt",
-				     krb5_princ_realm(creds->client)->length,
-				     krb5_princ_realm(creds->client)->data,
+				     krb5_princ_realm(context, creds->client)->length,
+				     krb5_princ_realm(context, creds->client)->data,
 				     0))
 	{
-	    krb5_free_creds(creds);
-	    krb5_cc_close(cc);
+	    krb5_free_creds(context, creds);
+	    krb5_cc_close(context, cc);
 	    return ~0L;
 	}
 	creds->server = sprinc;
-	retval = krb5_get_credentials(KRB5_GC_CACHED, cc, creds);
-	krb5_cc_close(cc);
+	retval = krb5_get_credentials(context, KRB5_GC_CACHED, cc, 
+		       		      creds, &new_creds);
+	krb5_cc_close(context, cc);
+
+	/* Input creds not needed now replace them with output ones */
+	cprinc = new_creds->client;
+	sprinc = new_creds->server;
+	krb5_free_creds(context, creds);
+	creds = new_creds;
+	
 	if (retval)
 	{
-	    krb5_free_creds(creds);
+	    /* krb5_free_creds(context, creds); */
 	    return ~0L;
 	}
-	if (retval = XauKrb5Encode(cprinc, &princ))
+	if (retval = XauKrb5Encode(context, cprinc, &princ))
 	{
-	    krb5_free_creds(creds);
+	    krb5_free_creds(context, creds);
 	    return ~0L;
 	}
 	tlen = sz_xReq + 2 + princ.length + creds->ticket.length;
@@ -189,7 +191,7 @@
     }
     else if (srvname)
     {
-	if (retval = XauKrb5Encode(srvname, &princ))
+	if (retval = XauKrb5Encode(context, srvname, &princ))
 	{
 	    return ~0L;
 	}
@@ -207,7 +209,7 @@
     {
 	if (ccname)
 	{
-	    krb5_free_creds(creds);
+	    krb5_free_creds(context, creds);
 	}
 	free(princ.data);
 	return ~0L;
@@ -216,7 +218,8 @@
     cp += sz_xReq;
     if (ccname)
     {
-	memcpy(cp, &princ.length, 2);
+	plen = princ.length; /* convert to CARD16 */
+	memcpy(cp, &plen, 2);
 	if (client->swapped)
 	{
 	    swaps((CARD16 *)cp, n);
@@ -232,6 +235,7 @@
     free(outbuf);
     client->requestVector = k5_Vector; /* hack in our dispatch vector */
     client->clientState = ClientStateAuthenticating;
+
     if (ccname)
     {
 	((OsCommPtr)client->osPrivate)->authstate.srvcreds = (pointer)creds; /* save tgt creds */
@@ -245,7 +249,6 @@
 	((OsCommPtr)client->osPrivate)->authstate.srvname = (pointer)srvname;
     }
     ((OsCommPtr)client->osPrivate)->authstate.stageno = 1; /* next stage is 1 */
-    return krb5_id;
 }
 
 /*
@@ -283,17 +286,24 @@
     krb5_creds *creds = (krb5_creds *)((OsCommPtr)client->osPrivate)->authstate.srvcreds;
     krb5_keyblock *skey;
     krb5_address cli_addr, **localaddrs = NULL;
-    krb5_tkt_authent *authdat;
-    krb5_ap_rep_enc_part rep;
-    krb5_int32 ctime, cusec;
+    krb5_auth_context *auth_context = NULL;
+    krb5_ticket *ticket = NULL;
+    /* krb5_tkt_authent *authdat; */
+    /* krb5_ap_rep_enc_part rep; */
+    /* krb5_int32 ctime, cusec; */
+    krb5_keytab keytabid;
+    krb5_flags ap_options;
     krb5_rcache rcache = NULL;
     char *cachename = NULL, *rc_type = NULL, *rc_base = "rcX", *kt = NULL;
     REQUEST(xReq);
 
+    if(context == NULL)
+	return(SendConnSetup(client, "Unexpected NULL Krb5 context"));
+
     if (((OsCommPtr)client->osPrivate)->authstate.stageno != 1)
     {
 	if (creds)
-	    krb5_free_creds(creds);
+	    krb5_free_creds(context, creds);
 	return(SendConnSetup(client, "expected Krb5 stage1 packet"));
     }
     addrlen = sizeof (cli_net_addr);
@@ -301,7 +311,7 @@
 		    &cli_net_addr, &addrlen) == -1)
     {
 	if (creds)
-	    krb5_free_creds(creds);
+	    krb5_free_creds(context, creds);
 	return(SendConnSetup(client, "Krb5 stage1: getpeername failed"));
     }
     if (cli_net_addr.sa_family == AF_UNSPEC
@@ -314,7 +324,7 @@
 	if (!localaddrs || !localaddrs[0])
 	{
 	    if (creds)
-		krb5_free_creds(creds);
+		krb5_free_creds(context, creds);
 	    return(SendConnSetup(client, "Krb5 failed to get localaddrs"));
 	}
 	cli_addr.addrtype = localaddrs[0]->addrtype;
@@ -343,9 +353,9 @@
 #endif
 	default:
 	    if (localaddrs)
-		krb5_free_addresses(localaddrs);
+		krb5_free_addresses(context, localaddrs);
 	    if (creds)
-		krb5_free_creds(creds);
+		krb5_free_creds(context, creds);
 	    sprintf(kerror, "Krb5 stage1: unknown address family %d from getpeername",
 		    cli_net_addr.sa_family);    
 	    return(SendConnSetup(client, kerror));
@@ -354,19 +364,19 @@
     if ((rcache = (krb5_rcache)malloc(sizeof(*rcache))) == NULL)
     {
 	if (localaddrs)
-	    krb5_free_addresses(localaddrs);
+	    krb5_free_addresses(context, localaddrs);
 	if (creds)
-	    krb5_free_creds(creds);
+	    krb5_free_creds(context, creds);
 	return(SendConnSetup(client, "malloc bombed for krb5_rcache"));
     }
-    if ((rc_type = krb5_rc_default_type()) == NULL)
+    if ((rc_type = krb5_rc_default_type(context)) == NULL)
 	rc_type = "dfl";
-    if (retval = krb5_rc_resolve_type(&rcache, rc_type))
+    if (retval = krb5_rc_resolve_type(context, &rcache, rc_type))
     {
 	if (localaddrs)
-	    krb5_free_addresses(localaddrs);
+	    krb5_free_addresses(context, localaddrs);
 	if (creds)
-	    krb5_free_creds(creds);
+	    krb5_free_creds(context, creds);
 	free(rcache);
 	strcpy(kerror, "krb5_rc_resolve_type failed: ");
 	strncat(kerror, error_message(retval), 231);
@@ -376,20 +386,20 @@
 	== NULL)
     {
 	if (localaddrs)
-	    krb5_free_addresses(localaddrs);
+	    krb5_free_addresses(context, localaddrs);
 	if (creds)
-	    krb5_free_creds(creds);
+	    krb5_free_creds(context, creds);
 	free(rcache);
 	return(SendConnSetup(client, "Krb5: malloc bombed for cachename"));
     }
     strcpy(cachename, rc_base);
     strcat(cachename, display);
-    if (retval = krb5_rc_resolve(rcache, cachename))
+    if (retval = krb5_rc_resolve(context, rcache, cachename))
     {
 	if (localaddrs)
-	    krb5_free_addresses(localaddrs);
+	    krb5_free_addresses(context, localaddrs);
 	if (creds)
-	    krb5_free_creds(creds);
+	    krb5_free_creds(context, creds);
 	free(rcache);
 	free(cachename);
 	strcpy(kerror, "krb5_rc_resolve failed: ");
@@ -397,16 +407,16 @@
 	return(SendConnSetup(client, kerror));
     }
     free(cachename);
-    if (krb5_rc_recover(rcache))
+    if (krb5_rc_recover(context, rcache))
     {
 	extern krb5_deltat krb5_clockskew;
-	if (retval = krb5_rc_initialize(rcache, krb5_clockskew))
+	if (retval = krb5_rc_initialize(context, rcache, krb5_clockskew))
 	{
 	    if (localaddrs)
-		krb5_free_addresses(localaddrs);
+		krb5_free_addresses(context, localaddrs);
 	    if (creds)
-		krb5_free_creds(creds);
-	    if (retval2 = krb5_rc_close(rcache))
+		krb5_free_creds(context, creds);
+	    if (retval2 = krb5_rc_close(context, rcache))
 	    {
 		strcpy(kerror, "krb5_rc_close failed: ");
 		strncat(kerror, error_message(retval2), 238);
@@ -418,39 +428,109 @@
 	    return(SendConnSetup(client, kerror));
 	}
     }
+
+    if (retval = krb5_auth_con_init(context, &auth_context))
+    {
+	if (localaddrs)
+	    krb5_free_addresses(context, localaddrs);
+	if (creds)
+	    krb5_free_creds(context, creds);
+	strcpy(kerror, "krb5_auth_con_init failed: ");
+	strncat(kerror, error_message(retval), 233);
+	return(SendConnSetup(client, kerror));
+    }
+
+    if (retval = krb5_auth_con_setaddrs(context, auth_context, 
+					NULL, &cli_addr))
+    {
+	if (localaddrs)
+	    krb5_free_addresses(context, localaddrs);
+	if (creds)
+	    krb5_free_creds(context, creds);
+	krb5_auth_con_free(context, auth_context);
+	strcpy(kerror, "krb5_auth_con_setaddrs failed: ");
+	strncat(kerror, error_message(retval), 229);
+	return(SendConnSetup(client, kerror));
+    }
+
+    if (retval = krb5_auth_con_setflags(context, auth_context, 
+			   		KRB5_AUTH_CONTEXT_DO_SEQUENCE))
+    {
+	if (localaddrs)
+	    krb5_free_addresses(context, localaddrs);
+	if (creds)
+	    krb5_free_creds(context, creds);
+	krb5_auth_con_free(context, auth_context);
+	strcpy(kerror, "krb5_auth_con_setflags failed: ");
+	strncat(kerror, error_message(retval), 229);
+	return(SendConnSetup(client, kerror));
+    }
+
+    if (retval = krb5_auth_con_setrcache(context, auth_context, rcache))
+    {
+	if (localaddrs)
+	    krb5_free_addresses(context, localaddrs);
+	if (creds)
+	    krb5_free_creds(context, creds);
+	krb5_auth_con_free(context, auth_context);
+	strcpy(kerror, "krb5_set_rcache failed: ");
+	strncat(kerror, error_message(retval), 236);
+	return(SendConnSetup(client, kerror));
+    }
+
     buf.length = (stuff->length << 2) - sz_xReq;
     buf.data = (char *)stuff + sz_xReq;
     if (creds)
     {
-	retval = krb5_rd_req(&buf,
-			     NULL, /* don't bother with server name */
-			     &cli_addr,
-			     NULL, /* no fetchfrom */
-			     tgt_keyproc,
-			     creds, /* credentials as arg to
-				       keyproc */
-			     rcache,
-			     &authdat);
-	krb5_free_creds(creds);
+	if (retval = krb5_auth_con_setuseruserkey(context, auth_context,
+						  &creds->keyblock))
+	{
+	    krb5_auth_con_free(context, auth_context);
+	    strcpy(kerror, "krb5_auth_con_setuseruserkey failed: ");
+	    strncat(kerror, error_message(retval), 223);
+	    return(SendConnSetup(client, kerror));
+	}
+
+	retval = krb5_rd_req(context, &auth_context, &buf,
+			     NULL,
+			     NULL,
+			     &ap_options,
+			     &ticket); 
+
+	/* krb5_free_creds(creds); */
     }
     else if (kt = (char *)((OsCommPtr)client->osPrivate)->authstate.ktname)
     {
-	retval = krb5_rd_req(&buf, srvname, &cli_addr, kt, NULL, NULL,
-			     rcache, &authdat);
+	if (retval = krb5_kt_resolve(context, kt, &keytabid))
+	{
+	    krb5_auth_con_free(context, auth_context);
+	    strcpy(kerror, "krb5_kt_resolve failed: ");
+	    strncat(kerror, error_message(retval), 236);
+	    return(SendConnSetup(client, kerror));
+	}
+	retval = krb5_rd_req(context, &auth_context, &buf,
+			     srvname,
+			     keytabid,
+			     &ap_options,
+			     &ticket);
+	/* #TJK# do we need free for keytab ??? */
+
 	((OsCommPtr)client->osPrivate)->authstate.ktname = NULL;
     }
     else
     {
 	if (localaddrs)
-	    krb5_free_addresses(localaddrs);
+	    krb5_free_addresses(context, localaddrs);
+	krb5_auth_con_free(context, auth_context);
 	return(SendConnSetup(client, "Krb5: neither srvcreds nor ktname set"));
     }
     if (localaddrs)
-	krb5_free_addresses(localaddrs);
+	krb5_free_addresses(context, localaddrs);
     if (rcache)
     {
-	if (retval2 = krb5_rc_close(rcache))
+	if (retval2 = krb5_rc_close(context, rcache))
 	{
+	    krb5_auth_con_free(context, auth_context);
 	    strcpy(kerror, "krb5_rc_close failed (2): ");
 	    strncat(kerror, error_message(retval2), 230);
 	    return(SendConnSetup(client, kerror));
@@ -459,15 +539,16 @@
     }
     if (retval)
     {
+	krb5_auth_con_free(context, auth_context);
 	strcpy(kerror, "Krb5: Bad application request: ");
 	strncat(kerror, error_message(retval), 224);
 	return(SendConnSetup(client, kerror));
     }
-    cprinc = authdat->ticket->enc_part2->client;
-    skey = authdat->ticket->enc_part2->session;
-    if (XauKrb5Encode(cprinc, &buf))
+    cprinc = ticket->enc_part2->client;
+    skey = ticket->enc_part2->session;
+    if (XauKrb5Encode(context, cprinc, &buf))
     {
-	krb5_free_tkt_authent(authdat);
+	krb5_auth_con_free(context, auth_context);
 	return(SendConnSetup(client, "XauKrb5Encode bombed"));
     }
     /*
@@ -481,25 +562,28 @@
 	 * achieve mutual authentication.  The client sends back a stage 3
 	 * packet if all is ok.
 	 */
-	if (authdat->ap_options | AP_OPTS_MUTUAL_REQUIRED)
+	if (ap_options & AP_OPTS_MUTUAL_REQUIRED)
 	{
 	    /*
 	     * stage 2: send ap_rep to client
 	     */
-	    if (retval = krb5_us_timeofday(&ctime, &cusec))
+	/* #TJK# Commented out, needed ??? */
+/*
+	    if (retval = krb5_us_timeofday(context, &ctime, &cusec))
 	    {
-		krb5_free_tkt_authent(authdat);
+		krb5_auth_con_free(context, auth_context);
 		strcpy(kerror, "error in krb5_us_timeofday: ");
 		strncat(kerror, error_message(retval), 234);
 		return(SendConnSetup(client, kerror));
 	    }
-	    rep.ctime = ctime;
-	    rep.cusec = cusec;
-	    rep.subkey = NULL;
-	    rep.seq_number = 0;
-	    if (retval = krb5_mk_rep(&rep, skey, &buf))
+	    auth_context->authentp->ctime = ctime;
+	    auth_context->authentp->cusec = cusec;
+	    auth_context->authentp->subkey = NULL;
+	    auth_context->local_seq_number = 0;
+*/
+	    if (retval = krb5_mk_rep(context, auth_context, &buf))
 	    {
-		krb5_free_tkt_authent(authdat);
+		krb5_auth_con_free(context, auth_context);
 		strcpy(kerror, "error in krb5_mk_rep: ");
 		strncat(kerror, error_message(retval), 238);
 		return(SendConnSetup(client, kerror));
@@ -514,14 +598,14 @@
 	    WriteToClient(client, sz_xReq, (char *)&prefix);
 	    WriteToClient(client, buf.length, buf.data);
 	    free(buf.data);
-	    krb5_free_tkt_authent(authdat);
+	    krb5_auth_con_free(context, auth_context);
 	    ((OsCommPtr)client->osPrivate)->authstate.stageno = 3; /* expect stage3 packet */
 	    return(Success);
 	}
 	else
 	{
 	    free(buf.data);
-	    krb5_free_tkt_authent(authdat);
+	    krb5_auth_con_free(context, auth_context);
 	    return(SendConnSetup(client, NULL)); /* success! */
 	}
     }
@@ -529,9 +613,9 @@
     {
 	char *kname;
 	
-	krb5_free_tkt_authent(authdat);
+	krb5_auth_con_free(context, auth_context);
 	free(buf.data);
-	retval = krb5_unparse_name(cprinc, &kname);
+	retval = krb5_unparse_name(context, cprinc, &kname);
 	if (retval == 0)
 	{
 	    sprintf(kerror, "Principal \"%s\" is not authorized to connect",
@@ -574,7 +658,7 @@
     register ClientPtr client;
 {
     if (((OsCommPtr)client->osPrivate)->authstate.srvcreds)
-	krb5_free_creds((krb5_creds *)((OsCommPtr)client->osPrivate)->authstate.srvcreds);
+	krb5_free_creds(context, (krb5_creds *)((OsCommPtr)client->osPrivate)->authstate.srvcreds);
     sprintf(kerror, "unrecognized Krb5 auth packet %d, expecting %d",
 	    ((xReq *)client->requestBuffer)->reqType,
 	    ((OsCommPtr)client->osPrivate)->authstate.stageno);
@@ -598,13 +682,19 @@
     krb5_error_code retval;
     krb5_keytab_entry tmp_entry;
     krb5_keytab keytab;
+    krb5_keytype keytype;
     krb5_kvno kvno = 0;
     krb5_ccache cc;
     char *nbuf, *cp;
     krb5_data kbuf;
     int i, ktlen;
-    
-    krb5_init_ets();		/* can't think of a better place to put it */
+ 
+    if ((context==NULL) && (retval=krb5_init_context(&context)))
+    {
+        ErrorF("K5Add: krb5_init_context failed: %s\n", error_message(retval));
+	return 0;
+    } 
+    krb5_init_ets(context);	/* can't think of a better place to put it */
     krb5_id = ~0L;
     if (data_length < 3)
 	return 0;
@@ -619,7 +709,7 @@
     }
     if (srvname)
     {
-	krb5_free_principal(srvname);
+	krb5_free_principal(context, srvname);
 	srvname = NULL;
     }
     if (ktname)
@@ -629,26 +719,26 @@
     }
     if (!strncmp(data, "UU:", 3))
     {
-	if (retval = krb5_cc_resolve(nbuf, &cc))
+	if (retval = krb5_cc_resolve(context, nbuf, &cc))
 	{
 	    ErrorF("K5Add: krb5_cc_resolve of \"%s\" failed: %s\n",
 		   nbuf, error_message(retval));
 	    free(nbuf);
 	    return 0;
 	}
-	if (cc && !(retval = krb5_cc_get_principal(cc, &princ)))
+	if (cc && !(retval = krb5_cc_get_principal(context, cc, &princ)))
 	{
-	    if (XauKrb5Encode(princ, &kbuf))
+	    if (XauKrb5Encode(context, princ, &kbuf))
 	    {
 		free(nbuf);
-		krb5_free_principal(princ);
-		krb5_cc_close(cc);
+		krb5_free_principal(context, princ);
+		krb5_cc_close(context, cc);
 		return 0;
 	    }
-	    if (krb5_cc_close(cc))
+	    if (krb5_cc_close(context, cc))
 		return 0;
 	    AddHost(NULL, FamilyKrb5Principal, kbuf.length, kbuf.data);
-	    krb5_free_principal(princ);
+	    krb5_free_principal(context, princ);
 	    free(kbuf.data);
 	    ccname = nbuf;
 	    krb5_id = id;
@@ -675,40 +765,50 @@
 	    return 0;
 	}
 	strcpy(ktname, cp + 1);
-	retval = krb5_sname_to_principal(NULL, /* NULL for hostname uses
-						  local host name*/
+	retval = krb5_sname_to_principal(context,
+					 NULL, /* NULL for hostname uses
+						  local host name */
 					 nbuf, KRB5_NT_SRV_HST,
 					 &srvname);
 	free(nbuf);
 	if (retval)
 	{
+	    ErrorF("K5Add: krb5_sname_to_principal \"%s\" sname failed: %s\n",
+                   nbuf, error_message(retval));
 	    free(ktname);
 	    ktname = NULL;
 	    return 0;
 	}
-	if (retval = krb5_kt_resolve(ktname, &keytab))
+	if (retval = krb5_kt_resolve(context, ktname, &keytab))
 	{
+	    ErrorF("K5Add: krb5_kt_resolve \"%s\" ktname failed: %s\n",
+                   ktname, error_message(retval));
 	    free(ktname);
 	    ktname = NULL;
-	    krb5_free_principal(srvname);
+	    krb5_free_principal(context, srvname);
 	    srvname = NULL;
 	    return 0;
 	}
-	retval = krb5_kt_get_entry(keytab, srvname, kvno, &tmp_entry);
-	krb5_kt_free_entry(&tmp_entry);
+	keytype = ETYPE_DES_CBC_CRC; /* #TJK# to be fixed !!! */
+	/* #TJK# commented out, needed ??? */
+/*
+	retval = krb5_kt_get_entry(context, keytab, srvname, kvno, 
+				   keytype, &tmp_entry);
+	krb5_kt_free_entry(context, &tmp_entry);
 	if (retval)
 	{
 	    free(ktname);
 	    ktname = NULL;
-	    krb5_free_principal(srvname);
+	    krb5_free_principal(context, srvname);
 	    srvname = NULL;
 	    return 0;
 	}
-	if (XauKrb5Encode(srvname, &kbuf))
+*/
+	if (XauKrb5Encode(context, srvname, &kbuf))
 	{
 	    free(ktname);
 	    ktname = NULL;
-	    krb5_free_principal(srvname);
+	    krb5_free_principal(context, srvname);
 	    srvname = NULL;
 	    return 0;
 	}
@@ -736,22 +836,22 @@
     krb5_ccache cc;
     krb5_data kbuf;
     int i;
-    
+   
     if (ccname)
     {
-	if (retval = krb5_cc_resolve(ccname, &cc))
+	if (retval = krb5_cc_resolve(context, ccname, &cc))
 	{
 	    free(ccname);
 	    ccname = NULL;
 	}
-	if (cc && !(retval = krb5_cc_get_principal(cc, &princ)))
+	if (cc && !(retval = krb5_cc_get_principal(context, cc, &princ)))
 	{
-	    if (XauKrb5Encode(princ, &kbuf))
+	    if (XauKrb5Encode(context, princ, &kbuf))
 		return 1;
 	    RemoveHost(NULL, FamilyKrb5Principal, kbuf.length, kbuf.data);
-	    krb5_free_principal(princ);
+	    krb5_free_principal(context, princ);
 	    free(kbuf.data);
-	    if (krb5_cc_close(cc))
+	    if (krb5_cc_close(context, cc))
 		return 1;
 	    free(ccname);
 	    ccname = NULL;
@@ -759,10 +859,10 @@
     }
     if (srvname)
     {
-	if (XauKrb5Encode(srvname, &kbuf))
+	if (XauKrb5Encode(context, srvname, &kbuf))
 	    return 1;
 	RemoveHost(NULL, FamilyKrb5Principal, kbuf.length, kbuf.data);
-	krb5_free_principal(srvname);
+	krb5_free_principal(context, srvname);
 	free(kbuf.data);
 	srvname = NULL;
     }
@@ -770,6 +870,11 @@
     {
 	free(ktname);
 	ktname = NULL;
+    }
+    if (context)
+    {
+	krb5_free_context(context);
+	context = NULL;
     }
     krb5_id = ~0L;
     return 0;
diff -ru /tmp/X11R6pl12/xc/programs/xdm/krb5auth.c X11R6/xc/programs/xdm/krb5auth.c
--- /tmp/X11R6pl12/xc/programs/xdm/krb5auth.c	Mon Apr 18 02:03:40 1994
+++ X11R6/xc/programs/xdm/krb5auth.c	Mon Apr 22 16:32:45 1996
@@ -43,15 +43,19 @@
 #include "dm.h"
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <krb5/krb5.h>
+#include <krb5.h>
 #include <krb5/kdb.h>			/* for TGTNAME */
 
+krb5_context k5context = NULL;
+
 /*ARGSUSED*/
 Krb5InitAuth (name_len, name)
     unsigned short  name_len;
     char	    *name;
 {
-    krb5_init_ets();		/* initialize error_message() tables */
+    if (k5context == NULL)
+    	krb5_init_context(&k5context);
+    krb5_init_ets(k5context);		/* initialize error_message() tables */
 }
 
 /*
@@ -88,7 +92,7 @@
     if (!name)
 	return ENOMEM;
     Debug("resolving Kerberos cache %s\n", name);
-    code = krb5_cc_resolve(name, ccache_return);
+    code = krb5_cc_resolve(k5context, name, ccache_return);
     free(name);
     return code;
 }
@@ -154,8 +158,8 @@
     return Krb5GetAuthFor(namelen, name, NULL);
 }
 
-int preauth_search_list[] = {
-	0,			
+krb5_preauthtype preauth_list[] = {
+	0,
 	KRB5_PADATA_ENC_TIMESTAMP,
 	-1
 	};
@@ -176,26 +180,35 @@
     krb5_principal me;
     krb5_creds my_creds;
     krb5_principal server;
-    krb5_address **my_addresses;
+    /* krb5_address **my_addresses; */
     krb5_timestamp now;
+    int options = 0;
     int	i;
 
+    if (k5context == NULL) {
+	if (code = krb5_init_context(&k5context)) {
+	    LogError("%s while initializing Krb5 context\n", 
+		     error_message(code));
+	    return 1;
+	}
+    }
+
     if (code = Krb5DisplayCCache(d->name, &ccache)) {
 	LogError("%s while getting Krb5 ccache for \"%s\"\n",
 		 error_message(code), d->name);
 	return 1;
     }
 
-    if (code = krb5_parse_name (name, &me)) {
+    if (code = krb5_parse_name (k5context, name, &me)) {
 	 LogError("%s while parsing Krb5 name \"%s\"\n",
 		  error_message(code), name);
 	 return 1;
     }
 
-    code = krb5_cc_initialize (ccache, me);
+    code = krb5_cc_initialize (k5context, ccache, me);
     if (code != 0) {
 	LogError("%s while initializing Krb5 cache \"%s\"\n",
-		 error_message(code), krb5_cc_default_name());
+		 error_message(code), krb5_cc_default_name(k5context));
 	return 1;
     }
 
@@ -203,12 +216,12 @@
 
     my_creds.client = me;
 
-    if (code = krb5_build_principal_ext(&server,
-					krb5_princ_realm(me)->length,
-					krb5_princ_realm(me)->data,
+    if (code = krb5_build_principal_ext(k5context, &server,
+					krb5_princ_realm(k5context,me)->length,
+					krb5_princ_realm(k5context,me)->data,
 					6, "krbtgt",
-					krb5_princ_realm(me)->length,
-					krb5_princ_realm(me)->data,
+					krb5_princ_realm(k5context,me)->length,
+					krb5_princ_realm(k5context,me)->data,
 					0)) {
 	LogError("%s while building Krb5 TGT server name\n",
 		 error_message(code));
@@ -217,13 +230,15 @@
 
     my_creds.server = server;
 
-    code = krb5_os_localaddr(&my_addresses);
+/*
+    code = krb5_os_localaddr(k5context, &my_addresses);
     if (code != 0) {
 	LogError("%s while getting my address for Krb5\n",
 		 error_message(code));
 	return 1;
     }
-    if (code = krb5_timeofday(&now)) {
+*/
+    if (code = krb5_timeofday(k5context, &now)) {
 	LogError("%s while getting time of day for Krb5\n",
 		 error_message(code));
 	return 1;
@@ -233,25 +248,18 @@
     my_creds.times.endtime = now + 60*60*8; /* 8 hours */
     my_creds.times.renew_till = 0;
 
-    for (i = 0; preauth_search_list[i] >= 0; i++) {
-	code = krb5_get_in_tkt_with_password(0, my_addresses,
-					     preauth_search_list[i],
-					     ETYPE_DES_CBC_CRC,
-					     KEYTYPE_DES,
-					     passwd,
-					     ccache,
-					     &my_creds, 0);
-	if (code != KRB5KDC_PREAUTH_FAILED &&
-	    code != KRB5KRB_ERR_GENERIC)
-	    break;
-    }
+    code = krb5_get_in_tkt_with_password(k5context, options, 
+					 0, NULL,
+					 /* preauth_list */ NULL,
+					 passwd, ccache,
+					 &my_creds, 0);
 
-    krb5_free_principal(server);
-    krb5_free_addresses(my_addresses);
+    krb5_free_principal(k5context, server);
+    /* krb5_free_addresses(k5context, my_addresses); */
 
     if (code) {
 	char *my_name = NULL;
-	int code2 = krb5_unparse_name(me, &my_name);
+	int code2 = krb5_unparse_name(k5context, me, &my_name);
 	if (code == KRB5KRB_AP_ERR_BAD_INTEGRITY) {
 	    LogError ("password incorrect for Krb5 principal \"%s\"\n",
 		      code2 ? name : my_name);
@@ -263,6 +271,6 @@
 	    free (my_name);
 	return 1;
     }
-    krb5_cc_close(ccache);
+    krb5_cc_close(k5context, ccache);
     return 0;
 }
diff -ru /tmp/X11R6pl12/xc/programs/xdm/session.c X11R6/xc/programs/xdm/session.c
--- /tmp/X11R6pl12/xc/programs/xdm/session.c	Mon Apr 22 16:03:15 1996
+++ X11R6/xc/programs/xdm/session.c	Mon Apr 22 16:32:45 1996
@@ -52,7 +52,7 @@
 # include <rpc/key_prot.h>
 #endif
 #ifdef K5AUTH
-# include <krb5/krb5.h>
+# include <krb5.h>
 #endif
 
 #ifndef GREET_USER_STATIC
@@ -62,6 +62,10 @@
 #endif
 #endif
 
+#ifdef K5AUTH
+extern  krb5_context	k5context; /* Kerberos 5 context */
+#endif
+
 extern	int	PingServer();
 extern	int	SessionPingFailed();
 extern	int	Debug();
@@ -469,7 +473,7 @@
 		LogError("%s while getting Krb5 ccache to destroy\n",
 			 error_message(code));
 	    else {
-		code = krb5_cc_destroy(ccache);
+		code = krb5_cc_destroy(k5context, ccache);
 		if (code) {
 		    if (code == KRB5_FCC_NOFILE) {
 			Debug ("No Kerberos ccache file found to destroy\n");
@@ -478,7 +482,7 @@
 				 error_message(code));
 		} else
 		    Debug ("Kerberos ccache destroyed\n");
-		krb5_cc_close(ccache);
+		krb5_cc_close(k5context, ccache);
 	    }
 	}
 #endif /* K5AUTH */
@@ -564,15 +568,14 @@
 	{
 	    char    netname[MAXNETNAMELEN+1], secretkey[HEXKEYBYTES+1];
 	    int	    nameret, keyret;
-	    int	    len;
 	    int     key_set_ok = 0;
+	    char    shortpasswd[9];
 
 	    nameret = getnetname (netname);
 	    Debug ("User netname: %s\n", netname);
-	    len = strlen (passwd);
-	    if (len > 8)
-		bzero (passwd + 8, len - 8);
-	    keyret = getsecretkey(netname,secretkey,passwd);
+	    strncpy(shortpasswd, passwd, 8);
+	    shortpasswd[8] = '\0'; /* Full passwd required below in Kerberos */
+	    keyret = getsecretkey(netname,secretkey,shortpasswd);
 	    Debug ("getsecretkey returns %d, key length %d\n",
 		    keyret, strlen (secretkey));
 	    /* is there a key, and do we have the right password? */
diff -ru /tmp/X11R6pl12/xc/programs/xhost/xhost.c X11R6/xc/programs/xhost/xhost.c
--- /tmp/X11R6pl12/xc/programs/xhost/xhost.c	Mon Apr 22 16:03:16 1996
+++ X11R6/xc/programs/xhost/xhost.c	Mon Apr 22 16:32:46 1996
@@ -113,6 +113,10 @@
 
 #define NAMESERVER_TIMEOUT 5	/* time to wait for nameserver */
 
+#ifdef K5AUTH
+    krb5_context context;	
+#endif
+
 int nameserver_timedout;
  
 char *ProgramName;
@@ -162,12 +166,19 @@
     struct dn_naddr *nlist, dnaddr, *dnaddrp, *dnet_addr();
     char *cp;
 #endif
- 
+
     ProgramName = argv[0];
 
+#ifdef K5AUTH
+    krb5_init_context(&context);
+#endif
+
     if ((dpy = XOpenDisplay(NULL)) == NULL) {
 	fprintf(stderr, "%s:  unable to open display \"%s\"\n",
 		ProgramName, XDisplayName (NULL));
+#ifdef K5AUTH
+	krb5_free_context(context);
+#endif
 	exit(1);
     }
 
@@ -221,11 +232,17 @@
 	    free(list);
 	    endhostent();
 	}
+#ifdef K5AUTH
+	krb5_free_context(context);
+#endif
 	exit(0);
     }
  
     if (argc == 2 && !strcmp(argv[1], "-help")) {
 	fprintf(stderr, "usage: %s [[+-]hostname ...]\n", argv[0]);
+#ifdef K5AUTH
+	krb5_free_context(context);
+#endif
 	exit(1);
     }
 
@@ -261,6 +278,9 @@
 	}
     }
     XCloseDisplay (dpy);	/* does an XSync first */
+#ifdef K5AUTH
+    krb5_free_context(context);
+#endif
     exit(nfailed);
 }
 
@@ -387,14 +407,14 @@
     if (family == FamilyKrb5Principal) {
 	krb5_error_code retval;
 
-	retval = krb5_parse_name(name, &princ);
+	retval = krb5_parse_name(context, name, &princ);
 	if (retval) {
-	    krb5_init_ets();	/* init krb errs for error_message() */
+	    krb5_init_ets(context);	/* init krb errs for error_message() */
 	    fprintf(stderr, "%s: cannot parse Kerberos name: %s\n",
 		    ProgramName, error_message(retval));
 	    return 0;
 	}
-	XauKrb5Encode(princ, &kbuf);
+	XauKrb5Encode(context, princ, &kbuf);
 	ha.length = kbuf.length;
 	ha.address = kbuf.data;
 	ha.family = family;
@@ -402,7 +422,7 @@
 	    XAddHost(dpy, &ha);
 	else
 	    XRemoveHost(dpy, &ha);
-	krb5_free_principal(princ);
+	krb5_free_principal(context, princ);
 	free(kbuf.data);
 	printf( "%s %s\n", name, add ? add_msg : remove_msg);
 	return 1;
@@ -609,9 +629,9 @@
     if (ha->family == FamilyKrb5Principal) {
 	kbuf.data = ha->address;
 	kbuf.length = ha->length;
-	XauKrb5Decode(kbuf, &princ);
-	krb5_unparse_name(princ, &kname);
-	krb5_free_principal(princ);
+	XauKrb5Decode(context, kbuf, &princ);
+	krb5_unparse_name(context, princ, &kname);
+	krb5_free_principal(context, princ);
 	strncpy(kname_out, kname, sizeof (kname_out));
 	free(kname);
 	return kname_out;

home help back first fref pref prev next nref lref last post