SOURCES: nfs-utils-1.0.8-CITI_NFS4_ALL-1.dif (NEW) - from http://w...

baggins baggins at pld-linux.org
Mon May 8 17:54:44 CEST 2006


Author: baggins                      Date: Mon May  8 15:54:44 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- from http://www.citi.umich.edu/projects/nfsv4/linux/nfs-utils-patches/1.0.8-1/nfs-utils-1.0.8-CITI_NFS4_ALL-1.dif

---- Files affected:
SOURCES:
   nfs-utils-1.0.8-CITI_NFS4_ALL-1.dif (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/nfs-utils-1.0.8-CITI_NFS4_ALL-1.dif
diff -u /dev/null SOURCES/nfs-utils-1.0.8-CITI_NFS4_ALL-1.dif:1.1
--- /dev/null	Mon May  8 17:54:44 2006
+++ SOURCES/nfs-utils-1.0.8-CITI_NFS4_ALL-1.dif	Mon May  8 17:54:39 2006
@@ -0,0 +1,1026 @@
+
+
+The complete set of CITI nfs-utils patches rolled into one patch.
+
+Changes since 1.0.8-rc4-CITI_NFS4_ALL-3:
+
+ * Update to the final nfs-utils-1.0.8
+ 
+ * Check for problems with the gssapi library in gssd and svcgssd
+   early on, so we can give a good error message and bail out.
+
+ * Add temporary patch to svcgssd to use default values when the
+   mapping of the gss principal to uid/gid fails.  This may need
+   to somehow coordinate with the anonuid/anongid values for the
+   export.
+
+
+---
+
+ nfs-utils-1.0.8-kwc/utils/gssd/context_mit.c  |  507 ++++++++++++++++++++++++--
+ nfs-utils-1.0.8-kwc/utils/gssd/gss_util.c     |   25 +
+ nfs-utils-1.0.8-kwc/utils/gssd/gss_util.h     |    1 
+ nfs-utils-1.0.8-kwc/utils/gssd/gssd.c         |    5 
+ nfs-utils-1.0.8-kwc/utils/gssd/krb5_util.c    |  221 +++++++++--
+ nfs-utils-1.0.8-kwc/utils/gssd/krb5_util.h    |    2 
+ nfs-utils-1.0.8-kwc/utils/gssd/svcgssd.c      |    5 
+ nfs-utils-1.0.8-kwc/utils/gssd/svcgssd_proc.c |   17 
+ nfs-utils-1.0.8-kwc/utils/gssd/write_bytes.h  |   13 
+ 9 files changed, 714 insertions(+), 82 deletions(-)
+
+diff -puN utils/gssd/gssd.c~CITI_NFS4_ALL utils/gssd/gssd.c
+--- nfs-utils-1.0.8/utils/gssd/gssd.c~CITI_NFS4_ALL	2006-04-20 12:41:15.668400000 -0400
++++ nfs-utils-1.0.8-kwc/utils/gssd/gssd.c	2006-04-20 12:41:16.486965000 -0400
+@@ -145,6 +145,9 @@ main(int argc, char *argv[])
+ 			    "support setting debug level\n");
+ #endif
+ 
++	if (gssd_check_mechs() != 0)
++		errx(1, "Problem with gssapi library");
++
+ 	if (!fg && daemon(0, 0) < 0)
+ 		errx(1, "fork");
+ 
+@@ -154,6 +157,8 @@ main(int argc, char *argv[])
+ 
+ 	/* Process keytab file and get machine credentials */
+ 	gssd_refresh_krb5_machine_creds();
++	/* Determine Kerberos information from the kernel */
++	gssd_obtain_kernel_krb5_info();
+ 
+ 	gssd_run();
+ 	printerr(0, "gssd_run returned!\n");
+diff -puN utils/gssd/gss_util.c~CITI_NFS4_ALL utils/gssd/gss_util.c
+--- nfs-utils-1.0.8/utils/gssd/gss_util.c~CITI_NFS4_ALL	2006-04-20 12:41:15.770298000 -0400
++++ nfs-utils-1.0.8-kwc/utils/gssd/gss_util.c	2006-04-20 12:41:16.001067000 -0400
+@@ -224,3 +224,28 @@ gssd_acquire_cred(char *server_name)
+ 
+ 	return (maj_stat == GSS_S_COMPLETE);
+ }
++
++int gssd_check_mechs(void)
++{
++	u_int32_t maj_stat, min_stat;
++	gss_OID_set supported_mechs = GSS_C_NO_OID_SET;
++	int retval = -1;
++
++	maj_stat = gss_indicate_mechs(&min_stat, &supported_mechs);
++	if (maj_stat != GSS_S_COMPLETE) {
++		printerr(0, "Unable to obtain list of supported mechanisms. "
++			 "Check that gss library is properly configured.\n");
++		goto out;
++	}
++	if (supported_mechs == GSS_C_NO_OID_SET ||
++	    supported_mechs->count == 0) {
++		printerr(0, "Unable to obtain list of supported mechanisms. "
++			 "Check that gss library is properly configured.\n");
++		goto out;
++	}
++	maj_stat = gss_release_oid_set(&min_stat, &supported_mechs);
++	retval = 0;
++out:
++	return retval;
++}
++
+diff -puN utils/gssd/gss_util.h~CITI_NFS4_ALL utils/gssd/gss_util.h
+--- nfs-utils-1.0.8/utils/gssd/gss_util.h~CITI_NFS4_ALL	2006-04-20 12:41:15.865203000 -0400
++++ nfs-utils-1.0.8-kwc/utils/gssd/gss_util.h	2006-04-20 12:41:16.011057000 -0400
+@@ -40,5 +40,6 @@ extern gss_cred_id_t	gssd_creds;
+ int gssd_acquire_cred(char *server_name);
+ void pgsserr(char *msg, u_int32_t maj_stat, u_int32_t min_stat,
+ 	const gss_OID mech);
++int gssd_check_mechs(void);
+ 
+ #endif /* _GSS_UTIL_H_ */
+diff -puN utils/gssd/svcgssd.c~CITI_NFS4_ALL utils/gssd/svcgssd.c
+--- nfs-utils-1.0.8/utils/gssd/svcgssd.c~CITI_NFS4_ALL	2006-04-20 12:41:15.961107000 -0400
++++ nfs-utils-1.0.8-kwc/utils/gssd/svcgssd.c	2006-04-20 12:41:16.021047000 -0400
+@@ -204,6 +204,11 @@ main(int argc, char *argv[])
+ 			    "support setting debug level\n");
+ #endif
+ 
++	if (gssd_check_mechs() != 0) {
++		printerr(0, "ERROR: Problem with gssapi library\n");
++		exit(1);
++	}
++
+ 	if (!fg)
+ 		mydaemon(0, 0);
+ 
+diff -puN utils/gssd/krb5_util.c~CITI_NFS4_ALL utils/gssd/krb5_util.c
+--- nfs-utils-1.0.8/utils/gssd/krb5_util.c~CITI_NFS4_ALL	2006-04-20 12:41:16.230965000 -0400
++++ nfs-utils-1.0.8-kwc/utils/gssd/krb5_util.c	2006-04-20 12:41:16.503965000 -0400
+@@ -97,6 +97,7 @@
+ #include "config.h"
+ #include <sys/param.h>
+ #include <rpc/rpc.h>
++#include <sys/types.h>
+ #include <sys/stat.h>
+ #include <sys/socket.h>
+ #include <arpa/inet.h>
+@@ -105,6 +106,7 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <dirent.h>
++#include <fcntl.h>
+ #include <errno.h>
+ #include <time.h>
+ #include <gssapi/gssapi.h>
+@@ -123,6 +125,10 @@
+ /* Global list of principals/cache file names for machine credentials */
+ struct gssd_k5_kt_princ *gssd_k5_kt_princ_list = NULL;
+ 
++/* Encryption types supported by the kernel rpcsec_gss code */
++int num_krb5_enctypes = 0;
++krb5_enctype *krb5_enctypes = NULL;
++
+ /*==========================*/
+ /*===  Internal routines ===*/
+ /*==========================*/
+@@ -261,51 +267,6 @@ gssd_find_existing_krb5_ccache(uid_t uid
+ }
+ 
+ 
+-#ifdef HAVE_SET_ALLOWABLE_ENCTYPES
+-/*
+- * this routine obtains a credentials handle via gss_acquire_cred()
+- * then calls gss_krb5_set_allowable_enctypes() to limit the encryption
+- * types negotiated.
+- *
+- * XXX Should call some function to determine the enctypes supported
+- * by the kernel. (Only need to do that once!)
+- *
+- * Returns:
+- *	0 => all went well
+- *     -1 => there was an error
+- */
+-
+-int
+-limit_krb5_enctypes(struct rpc_gss_sec *sec, uid_t uid)
+-{
+-	u_int maj_stat, min_stat;
+-	gss_cred_id_t credh;
+-	krb5_enctype enctypes[] = { ENCTYPE_DES_CBC_CRC };
+-	int num_enctypes = sizeof(enctypes) / sizeof(enctypes[0]);
+-
+-	maj_stat = gss_acquire_cred(&min_stat, NULL, 0,
+-				    GSS_C_NULL_OID_SET, GSS_C_INITIATE,
+-				    &credh, NULL, NULL);
+-
+-	if (maj_stat != GSS_S_COMPLETE) {
+-		pgsserr("gss_acquire_cred",
+-			maj_stat, min_stat, &krb5oid);
+-		return -1;
+-	}
+-
+-	maj_stat = gss_set_allowable_enctypes(&min_stat, credh, &krb5oid,
+-					     num_enctypes, &enctypes);
+-	if (maj_stat != GSS_S_COMPLETE) {
+-		pgsserr("gss_set_allowable_enctypes",
+-			maj_stat, min_stat, &krb5oid);
+-		return -1;
+-	}
+-	sec->cred = credh;
+-
+-	return 0;
+-}
+-#endif	/* HAVE_SET_ALLOWABLE_ENCTYPES */
+-
+ /*
+  * Obtain credentials via a key in the keytab given
+  * a keytab handle and a gssd_k5_kt_princ structure.
+@@ -603,6 +564,56 @@ gssd_set_krb5_ccache_name(char *ccname)
+ #endif
+ }
+ 
++/*
++ * Parse the supported encryption type information
++ */
++static int
++parse_enctypes(char *enctypes)
++{
++	int n = 0;
++	char *curr, *comma;
++	int i;
++
++	/* Just in case this ever gets called more than once */
++	if (krb5_enctypes != NULL) {
++		free(krb5_enctypes);
++		krb5_enctypes = NULL;
++		num_krb5_enctypes = 0;
++	}
++
++	/* count the number of commas */
++	for (curr = enctypes; curr && *curr != '\0'; curr = ++comma) {
++		comma = strchr(curr, ',');
++		if (comma != NULL)
++			n++;
++		else
++			break;
++	}
++	/* If no more commas and we're not at the end, there's one more value */
++	if (*curr != '\0')
++		n++;
++
++	/* Empty string, return an error */
++	if (n == 0)
++		return ENOENT;
++
++	/* Allocate space for enctypes array */
++	if ((krb5_enctypes = (int *) calloc(n, sizeof(int))) == NULL) {
++		return ENOMEM;
++	}
++
++	/* Now parse each value into the array */
++	for (curr = enctypes, i = 0; curr && *curr != '\0'; curr = ++comma) {
++		krb5_enctypes[i++] = atoi(curr);
++		comma = strchr(curr, ',');
++		if (comma == NULL)
++			break;
++	}
++
++	num_krb5_enctypes = n;
++	return 0;
++}
++
+ /*==========================*/
+ /*===  External routines ===*/
+ /*==========================*/
+@@ -854,3 +865,123 @@ gssd_destroy_krb5_machine_creds(void)
+ 	krb5_free_context(context);
+ }
+ 
++#ifdef HAVE_SET_ALLOWABLE_ENCTYPES
++/*
++ * this routine obtains a credentials handle via gss_acquire_cred()
++ * then calls gss_krb5_set_allowable_enctypes() to limit the encryption
++ * types negotiated.
++ *
++ * Returns:
++ *	0 => all went well
++ *     -1 => there was an error
++ */
++
++int
++limit_krb5_enctypes(struct rpc_gss_sec *sec, uid_t uid)
++{
++	u_int maj_stat, min_stat;
++	gss_cred_id_t credh;
++	gss_OID_set_desc  desired_mechs;
++	krb5_enctype enctypes[] = {ENCTYPE_DES_CBC_CRC};
++	int num_enctypes = sizeof(enctypes) / sizeof(enctypes[0]);
++
++	/* We only care about getting a krb5 cred */
++	desired_mechs.count = 1;
++	desired_mechs.elements = &krb5oid;
++
++	maj_stat = gss_acquire_cred(&min_stat, NULL, 0,
++				    &desired_mechs, GSS_C_INITIATE,
++				    &credh, NULL, NULL);
++
++	if (maj_stat != GSS_S_COMPLETE) {
++		pgsserr("gss_acquire_cred",
++			maj_stat, min_stat, &krb5oid);
++		return -1;
++	}
++
++	/*
++	 * If we failed for any reason to produce global
++	 * list of supported enctypes, use local default here.
++	 */
++	if (krb5_enctypes == NULL)
++		maj_stat = gss_set_allowable_enctypes(&min_stat, credh,
++					&krb5oid, num_enctypes, &enctypes);
++	else
++		maj_stat = gss_set_allowable_enctypes(&min_stat, credh,
++					&krb5oid, num_krb5_enctypes,
++					krb5_enctypes);
++	if (maj_stat != GSS_S_COMPLETE) {
++		pgsserr("gss_set_allowable_enctypes",
++			maj_stat, min_stat, &krb5oid);
++		return -1;
++	}
++	sec->cred = credh;
++
++	return 0;
++}
++#endif	/* HAVE_SET_ALLOWABLE_ENCTYPES */
++
++/*
++ * Obtain supported enctypes from kernel.
++ * Set defaults if info is not available.
++ */
++void
++gssd_obtain_kernel_krb5_info(void)
++{
++	char enctype_file_name[128];
++	char buf[1024];
++	char enctypes[128];
++	char extrainfo[1024];
++	int fd;
++	int use_default_enctypes = 0;
++	int nbytes, numfields;
++	char default_enctypes[] = "1,3,2";
++	int code;
++
++	snprintf(enctype_file_name, sizeof(enctype_file_name),
++		 "%s/%s", pipefsdir, "krb5_info");
++
++	if ((fd = open(enctype_file_name, O_RDONLY)) == -1) {
++		printerr(1, "WARNING: gssd_obtain_kernel_krb5_info: "
++			 "Unable to open '%s'. Unable to determine "
++			 "Kerberos encryption types supported by the "
++			 "kernel; using defaults (%s).\n",
++			 enctype_file_name, default_enctypes);
++		use_default_enctypes = 1;
++		goto do_the_parse;
++	}
++	if ((nbytes = read(fd, buf, sizeof(buf))) == -1) {
++		printerr(0, "WARNING: gssd_obtain_kernel_krb5_info: "
++			 "Error reading Kerberos encryption type "
++			 "information file '%s'; using defaults (%s).\n",
++			 enctype_file_name, default_enctypes);
++		use_default_enctypes = 1;
++		goto do_the_parse;
++	}
++	numfields = sscanf(buf, "enctypes: %s\n%s", enctypes, extrainfo);
++	if (numfields < 1) {
++		printerr(0, "WARNING: gssd_obtain_kernel_krb5_info: "
++			 "error parsing Kerberos encryption type "
++			 "information from file '%s'; using defaults (%s).\n",
++			 enctype_file_name, default_enctypes);
++		use_default_enctypes = 1;
++		goto do_the_parse;
++	}
++	if (numfields > 1) {
++		printerr(0, "WARNING: gssd_obtain_kernel_krb5_info: "
++			 "Extra information, '%s', from '%s' is ignored\n",
++			 enctype_file_name, extrainfo);
++		use_default_enctypes = 1;
++		goto do_the_parse;
++	}
++  do_the_parse:
++  	if (use_default_enctypes)
++		strcpy(enctypes, default_enctypes);
++
++	if ((code = parse_enctypes(enctypes)) != 0) {
++		printerr(0, "ERROR: gssd_obtain_kernel_krb5_info: "
++			 "parse_enctypes%s failed with code %d\n",
++			 use_default_enctypes ? " (with default enctypes)" : "",
++			 code);
++	}
++}
+diff -puN utils/gssd/krb5_util.h~CITI_NFS4_ALL utils/gssd/krb5_util.h
+--- nfs-utils-1.0.8/utils/gssd/krb5_util.h~CITI_NFS4_ALL	2006-04-20 12:41:16.461965000 -0400
++++ nfs-utils-1.0.8-kwc/utils/gssd/krb5_util.h	2006-04-20 12:41:16.513965000 -0400
+@@ -22,6 +22,8 @@ int  gssd_refresh_krb5_machine_creds(voi
+ void gssd_free_krb5_machine_cred_list(char **list);
+ void gssd_setup_krb5_machine_gss_ccache(char *servername);
+ void gssd_destroy_krb5_machine_creds(void);
++void gssd_obtain_kernel_krb5_info(void);
++
+ 
+ #ifdef HAVE_SET_ALLOWABLE_ENCTYPES
+ int limit_krb5_enctypes(struct rpc_gss_sec *sec, uid_t uid);
+diff -puN utils/gssd/context_mit.c~CITI_NFS4_ALL utils/gssd/context_mit.c
+--- nfs-utils-1.0.8/utils/gssd/context_mit.c~CITI_NFS4_ALL	2006-04-20 12:41:16.770847000 -0400
++++ nfs-utils-1.0.8-kwc/utils/gssd/context_mit.c	2006-04-20 12:41:16.894723000 -0400
+@@ -32,6 +32,7 @@
+ #include <stdio.h>
+ #include <syslog.h>
+ #include <string.h>
++#include <errno.h>
+ #include <gssapi/gssapi.h>
+ #include <rpc/rpc.h>
+ #include <rpc/auth_gss.h>
+@@ -43,9 +44,53 @@
+ #ifdef HAVE_KRB5
+ #include <krb5.h>
+ 
++/* for 3DES */
++#define KG_USAGE_SEAL 22
++#define KG_USAGE_SIGN 23
++#define KG_USAGE_SEQ  24
++
++/* for rfc???? */
++#define KG_USAGE_ACCEPTOR_SEAL  22
++#define KG_USAGE_ACCEPTOR_SIGN  23
++#define KG_USAGE_INITIATOR_SEAL 24
++#define KG_USAGE_INITIATOR_SIGN 25
++
++/* Lifted from mit src/lib/gssapi/krb5/gssapiP_krb5.h */
++enum seal_alg {
++  SEAL_ALG_NONE            = 0xffff,
++  SEAL_ALG_DES             = 0x0000,
++  SEAL_ALG_1               = 0x0001, /* not published */
++  SEAL_ALG_MICROSOFT_RC4   = 0x0010, /* microsoft w2k;  */
++  SEAL_ALG_DES3KD          = 0x0002
++};
++
++#define KEY_USAGE_SEED_ENCRYPTION	0xAA
++#define KEY_USAGE_SEED_INTEGRITY	0x55
++#define KEY_USAGE_SEED_CHECKSUM		0x99
++#define K5CLENGTH 5
++
++/* Flags for version 2 context flags */
++#define KRB5_CTX_FLAG_INITIATOR		0x00000001
++#define KRB5_CTX_FLAG_CFX		0x00000002
++#define KRB5_CTX_FLAG_ACCEPTOR_SUBKEY	0x00000004
++
++/*
++ * XXX Hack alert.  We don't have "legal" access to these
++ * structures located in libk5crypto
++ */
++extern void krb5int_enc_arcfour;
++extern void krb5int_enc_des3;
++extern void krb5int_enc_aes128;
++extern void krb5int_enc_aes256;
++extern int krb5_derive_key();
++
++void *get_enc_provider();
++
+ /* XXX spkm3 seems to actually want it this big, yipes. */
+ #define MAX_CTX_LEN 4096
+ 
++
++
+ #ifdef HAVE_LUCID_CONTEXT_SUPPORT
+ 
+ /* Don't use the private structure, use the exported lucid structure */
+@@ -144,6 +189,96 @@ write_lucid_keyblock(char **p, char *end
+ 	return 0;
+ }
+ 
++static void
++key_lucid_to_krb5(const gss_krb5_lucid_key_t *lin, krb5_keyblock *kout)
++{
++	memset(kout, '\0', sizeof(kout));
++	kout->enctype = lin->type;
++	kout->length = lin->length;
++	kout->contents = lin->data;
++}
++
++static void
++key_krb5_to_lucid(const krb5_keyblock *kin, gss_krb5_lucid_key_t *lout)
++{
++	memset(lout, '\0', sizeof(lout));
++	lout->type = kin->enctype;
++	lout->length = kin->length;
++	lout->data = kin->contents;
++}
++
++/*
++ * Function to derive a new key from a given key and given constant data.
++ */
++static krb5_error_code
++derive_key_lucid(const gss_krb5_lucid_key_t *in, gss_krb5_lucid_key_t *out,
++		 int usage, char extra)
++{
++	krb5_error_code code;
++	unsigned char constant_data[K5CLENGTH];
++	krb5_data datain;
++	int keylength;
++	void *enc;
++	krb5_keyblock kin, kout;  /* must send krb5_keyblock, not lucid! */
++
++	/*
++	 * XXX Hack alert.  We don't have "legal" access to these
++	 * values and structures located in libk5crypto
++	 */
++	switch (in->type) {
++	case ENCTYPE_DES3_CBC_RAW:
++		keylength = 24;
++		enc = &krb5int_enc_des3;
++		break;
++	case ENCTYPE_AES128_CTS_HMAC_SHA1_96:
++		keylength = 16;
++		enc = &krb5int_enc_aes128;
++		break;
++	case ENCTYPE_AES256_CTS_HMAC_SHA1_96:
++		keylength = 32;
++		enc = &krb5int_enc_aes256;
++		break;
++	default:
++		code = KRB5_BAD_ENCTYPE;
++		goto out;
++	}
++
++	/* allocate memory for output key */
++	if ((out->data = malloc(keylength)) == NULL) {
++		code = ENOMEM;
++		goto out;
++	}
++	out->length = keylength;
++	out->type = in->type;
++
++	/* Convert to correct format for call to krb5_derive_key */
++	key_lucid_to_krb5(in, &kin);
++	key_lucid_to_krb5(out, &kout);
++
++	datain.data = (char *) constant_data;
++	datain.length = K5CLENGTH;
++
++	datain.data[0] = (usage>>24)&0xff;
++	datain.data[1] = (usage>>16)&0xff;
++	datain.data[2] = (usage>>8)&0xff;
++	datain.data[3] = usage&0xff;
++
++	datain.data[4] = (char) extra;
++
++	if ((code = krb5_derive_key(enc, &kin, &kout, &datain))) {
++		free(out->data);
++		out->data = NULL;
++		goto out;
++	}
++	key_krb5_to_lucid(&kout, out);
++
++  out:
++  	if (code)
++		printerr(0, "ERROR: derive_key_lucid returning error %d (%s)\n",
++			 code, error_message(code));
++	return (code);
++}
++
+ static int
+ prepare_krb5_rfc1964_buffer(gss_krb5_lucid_context_v1_t *lctx,
+ 	gss_buffer_desc *buf)
+@@ -183,7 +318,7 @@ prepare_krb5_rfc1964_buffer(gss_krb5_luc
+ 	if (WRITE_BYTES(&p, end, lctx->endtime)) goto out_err;
+ 	word_send_seq = lctx->send_seq;	/* XXX send_seq is 64-bit */
+ 	if (WRITE_BYTES(&p, end, word_send_seq)) goto out_err;
+-	if (write_buffer(&p, end, (gss_buffer_desc*)&krb5oid)) goto out_err;
++	if (write_oid(&p, end, &krb5oid)) goto out_err;
+ 
+ 	printerr(2, "prepare_krb5_rfc1964_buffer: serializing keys with "
+ 		 "enctype %d and length %d\n",
+@@ -212,17 +347,180 @@ prepare_krb5_rfc1964_buffer(gss_krb5_luc
+ 	return 0;
+ out_err:
+ 	printerr(0, "ERROR: failed serializing krb5 context for kernel\n");
+-	if (buf->value) free(buf->value);
++	if (buf->value) {
++		free(buf->value);
++		buf->value = NULL;
++	}
+ 	buf->length = 0;
+-	if (enc_key.data) free(enc_key.data);
++	if (enc_key.data) {
++		free(enc_key.data);
++		enc_key.data = NULL;
++	}
+ 	return -1;
+ }
+ 
++/*
++ * Prepare a new-style buffer to send to the kernel for newer encryption
++ * types -- or for DES3.
++ *
++ * The new format is:
++ *
++ *	u32 version;          This is two (2)
++ *	s32 endtime;
++ *	u32 flags;
++ *	#define KRB5_CTX_FLAG_INITIATOR		0x00000001
++ *	#define KRB5_CTX_FLAG_CFX		0x00000002
++ *	#define KRB5_CTX_FLAG_ACCEPTOR_SUBKEY	0x00000004
++ *	u64 seq_send;
++ *	u32  enctype;			( encrption type of keys )
++ *	u32  size_of_each_key;		( size of each key in bytes )
++ *	u32  number_of_keys;		( N -- should always be 3 for now )
++ *	keydata-1;                      ( Ke )
++ *	keydata-2;                      ( Ki )
<<Diff was trimmed, longer than 597 lines>>


More information about the pld-cvs-commit mailing list