summaryrefslogtreecommitdiff
path: root/server/kstuff.c
diff options
context:
space:
mode:
authorGravatar Karl Ramm <kcr@mit.edu>2007-12-28 03:23:47 +0000
committerGravatar Karl Ramm <kcr@mit.edu>2007-12-28 03:23:47 +0000
commitb6a203fa06087c2eb6250dd997aa5d8f6ae94eb7 (patch)
tree1d64b522b76bb26a6dd782d77a8f1d07862a7ba3 /server/kstuff.c
parent92a6bdd61902ebd8ceadf79588845ff9bcc78d38 (diff)
ostensibly accept both sorts of authentication when offering brain dumps, and have a command line switch to choose between the sort you use when getting them
Diffstat (limited to 'server/kstuff.c')
-rw-r--r--server/kstuff.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/server/kstuff.c b/server/kstuff.c
index b26a5d5..dd93288 100644
--- a/server/kstuff.c
+++ b/server/kstuff.c
@@ -122,6 +122,68 @@ SendKerberosData(fd, ticket, service, host)
#endif /* HAVE_KRB4 */
+#if defined(HAVE_KRB5) || defined(HAVE_KRB4)
+Code_t
+ReadKerberosData(int fd, int *size, char **data, int *proto) {
+ char p[20];
+ int i;
+ unsigned char *dst;
+ Code_t retval;
+ int len = 0;
+
+ for (i=0; i<20; i++) {
+ if (read(fd, &p[i], 1) != 1) {
+ p[i] = 0;
+ syslog(LOG_WARNING,"ReadKerberosData: bad read reply len @%d (got \"%s\"", i, p);
+ return(KFAILURE);
+ }
+ if (p[i] == ' ') {
+ p[i] = '\0';
+ break;
+ }
+ }
+
+ if (i == 20) {
+ syslog(LOG_WARNING, "ReadKerberosData: read reply len exceeds buffer");
+ return KFAILURE;
+ }
+
+ if (!strncmp(p, "V5-", 3) && (len = atoi(p+3)) > 0)
+ *proto = 5;
+ else if ((len = atoi(p)) > 0)
+ *proto = 4;
+
+ if (*proto < 4 | *proto > 5) {
+ syslog(LOG_WARNING, "ReadKerberosData: error parsing authenticator length (\"%s\")", p);
+ return KFAILURE;
+ }
+
+ if (len <= 0) {
+ syslog(LOG_WARNING, "ReadKerberosData: read reply len = %d", len);
+ return KFAILURE;
+ }
+
+ *data = malloc(len);
+ if (! *data) {
+ syslog(LOG_WARNING, "ReadKerberosData: failure allocating %d bytes: %m", len);
+ return errno;
+ }
+
+ dst=*data;
+ for (i=0; i < len; i++) {
+ if (read(fd, dst++, 1) != 1) {
+ free(*data);
+ *data = NULL;
+ *size = 0;
+ syslog(LOG_WARNING,"ReadKerberosData: bad read reply string");
+ return ZSRV_PKSHORT;
+ }
+ }
+ *size = len;
+ return 0;
+}
+#endif
+
#ifdef HAVE_KRB5
Code_t
GetKrb5Data(int fd, krb5_data *data) {
@@ -162,6 +224,7 @@ GetKrb5Data(int fd, krb5_data *data) {
}
return 0;
}
+
Code_t
SendKrb5Data(int fd, krb5_data *data) {
char p[32];