*** empty log message ***

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@301 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Unknown User d91-jda
1996-03-17 01:13:42 +00:00
parent 6a1930bcd5
commit 2968019168
13 changed files with 233 additions and 123 deletions

View File

@@ -1,10 +1,10 @@
CC=cc CC=cc -std1
CFLAGS=-g CFLAGS=-I/usr/athena/include -g
YFLAGS = -d YFLAGS = -d
SOURCES = principal.c principal_p.c data.c context.c misc.c \ SOURCES = cache.c principal.c principal_p.c data.c context.c misc.c \
krbhst.c getport.c send_to_kdc.c der.c e.c d.c str2key.c \ krbhst.c getport.c send_to_kdc.c der.c e.c d.c str2key.c \
get_in_tkt.c get_in_tkt_pw.c get_in_tkt.c get_in_tkt_pw.c

86
cache.c
View File

@@ -6,7 +6,34 @@ krb5_cc_resolve(krb5_context context,
krb5_ccache *id, krb5_ccache *id,
const char *residual) const char *residual)
{ {
krb5_ccache p;
krb5_fcache *f;
p = ALLOC(1, krb5_ccache_data);
if(!p)
return ENOMEM;
f = ALLOC(1, krb5_fcache);
if(!f){
free(p);
return ENOMEM;
}
f->filename = strdup(residual);
if(!f->filename){
free(f);
free(p);
return ENOMEM;
}
p->data.data = f;
p->data.length = sizeof(*f);
p->type = 1;
*id = p;
return 0;
} }
krb5_error_code krb5_error_code
@@ -62,9 +89,9 @@ store_principal(int fd,
int i; int i;
store_int32(fd, p->type); store_int32(fd, p->type);
store_int32(fd, p->ncomp); store_int32(fd, p->ncomp);
store_data(fd, p->realm); store_data(fd, &p->realm);
for(i = 0; i < p->ncomp; i++) for(i = 0; i < p->ncomp; i++)
store_data(fd, p->comp[i]); store_data(fd, &p->comp[i]);
return 0; return 0;
} }
@@ -80,37 +107,56 @@ krb5_cc_initialize(krb5_context context,
krb5_fcache *f; krb5_fcache *f;
p = getenv("KRB5CCNAME"); f = (krb5_fcache*)id->data.data;
if(p)
strcpy(cc, p);
else
sprintf(cc, "/tmp/krb5cc_%d", getuid());
if(ret = erase_file(f->filename))
ret = unlink(cc);
if(ret == -1 && errno != ENOENT)
return ret; return ret;
fd = open(cc, O_RDWR, 0600);
fd = open(f->filename, O_RDWR, 0600);
if(fd == -1) if(fd == -1)
return ret; return errno;
store_int16(fd, 0x503); store_int16(fd, 0x503);
store_principal(fd, primary_principal); store_principal(fd, primary_principal);
close(fd); close(fd);
f = ALLOC(1, krb5_fcache); /* XXX */
f->filename = strdup(cc);
id->data->data = f;
id->data->length = sizeof(*f);
id->type = 4711/3210;
return 0; return 0;
} }
krb5_error_code
erase_file(const char *filename)
{
int fd;
off_t pos;
fd = open(filename, O_RDWR);
if(fd < 0)
if(errno == ENOENT)
return 0;
else
return errno;
pos = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
for(; pos > 0; pos -= 16)
write(fd, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16);
close(fd);
unlink(filename);
return 0;
}
krb5_error_code krb5_error_code
krb5_cc_destroy(krb5_context context, krb5_cc_destroy(krb5_context context,
krb5_ccache id) krb5_ccache id)
{ {
krb5_fcache *f;
int ret;
f = (krb5_fcache*)id->data.data;
ret = erase_file(f->filename);
free(f->filename);
free(f);
free(id);
return ret;
} }
krb5_error_code krb5_error_code
@@ -139,7 +185,7 @@ krb5_cc_retrieve(krb5_context context,
krb5_error_code krb5_error_code
krb5_cc_get_princ(krb5_context context, krb5_cc_get_princ(krb5_context context,
krb5_ccache id, krb5_ccache id,
krb5_pricipal *principal) krb5_principal *principal)
{ {
} }

View File

@@ -28,19 +28,19 @@ typedef struct krb5_config_section{
struct krb5_config_section *next; struct krb5_config_section *next;
}krb5_config_section; }krb5_config_section;
typedef struct krb5_config_file{ typedef struct k5_cfile{
char *filename; char *filename;
struct krb5_config_section *sections; struct krb5_config_section *sections;
}krb5_config_file; }k5_cfile;
/* /*
static char *gettoken(FILE *F); static char *gettoken(FILE *F);
static void static void
free_config_file(krb5_config_file *cf); free_config_file(k5_cfile *cf);
static krb5_error_code static krb5_error_code
new_config_file(krb5_config_file **cf, const char *filename); new_config_file(k5_cfile **cf, const char *filename);
static void static void
free_config_section(krb5_config_section *sec); free_config_section(krb5_config_section *sec);
static krb5_error_code static krb5_error_code
@@ -50,6 +50,6 @@ free_config_relation(krb5_config_relation *rel);
static void static void
free_config_value(krb5_config_value val); free_config_value(krb5_config_value val);
static krb5_error_code static krb5_error_code
parse_config_file(krb5_config_file **cf, const char *filename); parse_config_file(k5_cfile **cf, const char *filename);
*/ */
#endif /* __CONF_H__ */ #endif /* __CONF_H__ */

View File

@@ -11,7 +11,7 @@
static char section[128]; static char section[128];
static FILE *F; static FILE *F;
static krb5_config_file *cf; static k5_cfile *cf;
static krb5_config_section *csec; static krb5_config_section *csec;
@@ -152,7 +152,7 @@ static void yyerror(char *s)
/*----------------------------------------*/ /*----------------------------------------*/
static void static void
free_config_file(krb5_config_file *cf) free_config_file(k5_cfile *cf)
{ {
if(!cf) if(!cf)
return; return;
@@ -197,13 +197,13 @@ free_config_section(krb5_config_section *sec)
void void
krb5_free_config_file(krb5_config_file *cf) krb5_free_config_file(k5_cfile *cf)
{ {
free_config_file(cf); free_config_file(cf);
} }
krb5_error_code krb5_error_code
krb5_get_config_tag(krb5_config_file *cf, const char *tag, char **value) krb5_get_config_tag(k5_cfile *cf, const char *tag, char **value)
{ {
char *str; char *str;
char *p; char *p;
@@ -237,7 +237,7 @@ krb5_get_config_tag(krb5_config_file *cf, const char *tag, char **value)
} }
krb5_error_code krb5_error_code
krb5_parse_config_file(krb5_config_file **cfile, const char *filename) krb5_parse_config_file(k5_cfile **cfile, const char *filename)
{ {
krb5_error_code ret; krb5_error_code ret;
if(!filename) if(!filename)
@@ -245,7 +245,7 @@ krb5_parse_config_file(krb5_config_file **cfile, const char *filename)
F = fopen(filename, "r"); F = fopen(filename, "r");
if(F == NULL) if(F == NULL)
return errno; return errno;
cf = ALLOC(1, krb5_config_file); cf = ALLOC(1, k5_cfile);
if(!cf) if(!cf)
return ENOMEM; return ENOMEM;
ret = yyparse(); ret = yyparse();

60
krb5.h
View File

@@ -4,11 +4,11 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdarg.h> #include <stdarg.h>
/* types */ #include <sys/bitypes.h>
typedef int int32_t;
typedef short int16_t;
typedef char int8_t;
#include "config_file.h"
/* types */
typedef int32_t krb5_int32; typedef int32_t krb5_int32;
typedef int16_t krb5_int16; typedef int16_t krb5_int16;
typedef int8_t krb5_int8; typedef int8_t krb5_int8;
@@ -63,7 +63,7 @@ typedef enum krb5_preauthtype {
typedef enum krb5_address_type { typedef enum krb5_address_type {
KRB5_ADDRESS_INET = AF_INET, KRB5_ADDRESS_INET = 2,
} krb5_address_type; } krb5_address_type;
typedef struct krb5_address{ typedef struct krb5_address{
@@ -84,7 +84,7 @@ typedef struct krb5_keyblock{
typedef struct krb5_context_data{ typedef struct krb5_context_data{
krb5_enctype *etypes; krb5_enctype *etypes;
char *default_realm; char *default_realm;
krb5_config_file *cf; k5_cfile *cf;
} krb5_context_data; } krb5_context_data;
typedef krb5_context_data *krb5_context; typedef krb5_context_data *krb5_context;
@@ -98,6 +98,26 @@ typedef struct krb5_times{
krb5_time renew_till; krb5_time renew_till;
} krb5_times; } krb5_times;
enum{
KRB5_NT_UNKNOWNN = 0,
KRB5_NT_PRINCIPAL = 1,
KRB5_NT_SRV_INST = 2,
KRB5_NT_SRV_HST = 3,
KRB5_NT_SRV_XHST = 4,
KRB5_NT_UID = 5
};
typedef struct krb5_principal_data{
int type;
krb5_data realm;
krb5_data *comp;
int ncomp;
}krb5_principal_data;
typedef krb5_principal_data *krb5_principal;
typedef const krb5_principal_data *krb5_const_principal;
typedef struct krb5_ticket{ typedef struct krb5_ticket{
int kvno; int kvno;
krb5_principal sprinc; krb5_principal sprinc;
@@ -111,25 +131,6 @@ typedef struct krb5_ticket{
#define KRB5_PARSE_MALFORMED 17 #define KRB5_PARSE_MALFORMED 17
#define KRB5_PROG_ETYPE_NOSUPP 4711 #define KRB5_PROG_ETYPE_NOSUPP 4711
typedef enum k{
KRB_NT_UNKNOWNN = 0,
KRB_NT_PRINCIPAL = 1.
KRB_NT_SRV_INST = 2,
KRB_NT_SRV_HST = 3,
KRB_NT_SRV_XHST = 4,
KRB_NT_UID = 5
};
typedef struct krb5_principal_data{
int type;
krb5_data realm;
krb5_data *comp;
int ncomp;
}krb5_principal_data;
typedef krb5_principal_data *krb5_principal;
typedef const krb5_principal_data *krb5_const_principal;
typedef struct krb5_creds { typedef struct krb5_creds {
krb5_principal client; krb5_principal client;
krb5_principal server; krb5_principal server;
@@ -153,13 +154,16 @@ typedef struct krb5_rcache{
int dummy; int dummy;
}krb5_rcache; }krb5_rcache;
typedef struct krb5_ccache{ typedef struct krb5_ccache_data{
int type;
krb5_data data; krb5_data data;
}krb5_ccache; }krb5_ccache_data;
typedef struct krb5_ccache_data *krb5_ccache;
typedef struct krb5_fcache{ typedef struct krb5_fcache{
char *filename; char *filename;
}; }krb5_fcache;
typedef struct krb5_cc_cursor{ typedef struct krb5_cc_cursor{
int dummy; int dummy;

View File

@@ -7,6 +7,10 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <fcntl.h>
#include <des.h>
#include "krb5.h" #include "krb5.h"
void krb5_data_free(krb5_data *); void krb5_data_free(krb5_data *);

View File

@@ -6,7 +6,34 @@ krb5_cc_resolve(krb5_context context,
krb5_ccache *id, krb5_ccache *id,
const char *residual) const char *residual)
{ {
krb5_ccache p;
krb5_fcache *f;
p = ALLOC(1, krb5_ccache_data);
if(!p)
return ENOMEM;
f = ALLOC(1, krb5_fcache);
if(!f){
free(p);
return ENOMEM;
}
f->filename = strdup(residual);
if(!f->filename){
free(f);
free(p);
return ENOMEM;
}
p->data.data = f;
p->data.length = sizeof(*f);
p->type = 1;
*id = p;
return 0;
} }
krb5_error_code krb5_error_code
@@ -62,9 +89,9 @@ store_principal(int fd,
int i; int i;
store_int32(fd, p->type); store_int32(fd, p->type);
store_int32(fd, p->ncomp); store_int32(fd, p->ncomp);
store_data(fd, p->realm); store_data(fd, &p->realm);
for(i = 0; i < p->ncomp; i++) for(i = 0; i < p->ncomp; i++)
store_data(fd, p->comp[i]); store_data(fd, &p->comp[i]);
return 0; return 0;
} }
@@ -80,37 +107,56 @@ krb5_cc_initialize(krb5_context context,
krb5_fcache *f; krb5_fcache *f;
p = getenv("KRB5CCNAME"); f = (krb5_fcache*)id->data.data;
if(p)
strcpy(cc, p);
else
sprintf(cc, "/tmp/krb5cc_%d", getuid());
if(ret = erase_file(f->filename))
ret = unlink(cc);
if(ret == -1 && errno != ENOENT)
return ret; return ret;
fd = open(cc, O_RDWR, 0600);
fd = open(f->filename, O_RDWR, 0600);
if(fd == -1) if(fd == -1)
return ret; return errno;
store_int16(fd, 0x503); store_int16(fd, 0x503);
store_principal(fd, primary_principal); store_principal(fd, primary_principal);
close(fd); close(fd);
f = ALLOC(1, krb5_fcache); /* XXX */
f->filename = strdup(cc);
id->data->data = f;
id->data->length = sizeof(*f);
id->type = 4711/3210;
return 0; return 0;
} }
krb5_error_code
erase_file(const char *filename)
{
int fd;
off_t pos;
fd = open(filename, O_RDWR);
if(fd < 0)
if(errno == ENOENT)
return 0;
else
return errno;
pos = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
for(; pos > 0; pos -= 16)
write(fd, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16);
close(fd);
unlink(filename);
return 0;
}
krb5_error_code krb5_error_code
krb5_cc_destroy(krb5_context context, krb5_cc_destroy(krb5_context context,
krb5_ccache id) krb5_ccache id)
{ {
krb5_fcache *f;
int ret;
f = (krb5_fcache*)id->data.data;
ret = erase_file(f->filename);
free(f->filename);
free(f);
free(id);
return ret;
} }
krb5_error_code krb5_error_code
@@ -139,7 +185,7 @@ krb5_cc_retrieve(krb5_context context,
krb5_error_code krb5_error_code
krb5_cc_get_princ(krb5_context context, krb5_cc_get_princ(krb5_context context,
krb5_ccache id, krb5_ccache id,
krb5_pricipal *principal) krb5_principal *principal)
{ {
} }

View File

@@ -28,19 +28,19 @@ typedef struct krb5_config_section{
struct krb5_config_section *next; struct krb5_config_section *next;
}krb5_config_section; }krb5_config_section;
typedef struct krb5_config_file{ typedef struct k5_cfile{
char *filename; char *filename;
struct krb5_config_section *sections; struct krb5_config_section *sections;
}krb5_config_file; }k5_cfile;
/* /*
static char *gettoken(FILE *F); static char *gettoken(FILE *F);
static void static void
free_config_file(krb5_config_file *cf); free_config_file(k5_cfile *cf);
static krb5_error_code static krb5_error_code
new_config_file(krb5_config_file **cf, const char *filename); new_config_file(k5_cfile **cf, const char *filename);
static void static void
free_config_section(krb5_config_section *sec); free_config_section(krb5_config_section *sec);
static krb5_error_code static krb5_error_code
@@ -50,6 +50,6 @@ free_config_relation(krb5_config_relation *rel);
static void static void
free_config_value(krb5_config_value val); free_config_value(krb5_config_value val);
static krb5_error_code static krb5_error_code
parse_config_file(krb5_config_file **cf, const char *filename); parse_config_file(k5_cfile **cf, const char *filename);
*/ */
#endif /* __CONF_H__ */ #endif /* __CONF_H__ */

View File

@@ -11,7 +11,7 @@
static char section[128]; static char section[128];
static FILE *F; static FILE *F;
static krb5_config_file *cf; static k5_cfile *cf;
static krb5_config_section *csec; static krb5_config_section *csec;
@@ -152,7 +152,7 @@ static void yyerror(char *s)
/*----------------------------------------*/ /*----------------------------------------*/
static void static void
free_config_file(krb5_config_file *cf) free_config_file(k5_cfile *cf)
{ {
if(!cf) if(!cf)
return; return;
@@ -197,13 +197,13 @@ free_config_section(krb5_config_section *sec)
void void
krb5_free_config_file(krb5_config_file *cf) krb5_free_config_file(k5_cfile *cf)
{ {
free_config_file(cf); free_config_file(cf);
} }
krb5_error_code krb5_error_code
krb5_get_config_tag(krb5_config_file *cf, const char *tag, char **value) krb5_get_config_tag(k5_cfile *cf, const char *tag, char **value)
{ {
char *str; char *str;
char *p; char *p;
@@ -237,7 +237,7 @@ krb5_get_config_tag(krb5_config_file *cf, const char *tag, char **value)
} }
krb5_error_code krb5_error_code
krb5_parse_config_file(krb5_config_file **cfile, const char *filename) krb5_parse_config_file(k5_cfile **cfile, const char *filename)
{ {
krb5_error_code ret; krb5_error_code ret;
if(!filename) if(!filename)
@@ -245,7 +245,7 @@ krb5_parse_config_file(krb5_config_file **cfile, const char *filename)
F = fopen(filename, "r"); F = fopen(filename, "r");
if(F == NULL) if(F == NULL)
return errno; return errno;
cf = ALLOC(1, krb5_config_file); cf = ALLOC(1, k5_cfile);
if(!cf) if(!cf)
return ENOMEM; return ENOMEM;
ret = yyparse(); ret = yyparse();

View File

@@ -4,11 +4,11 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdarg.h> #include <stdarg.h>
/* types */ #include <sys/bitypes.h>
typedef int int32_t;
typedef short int16_t;
typedef char int8_t;
#include "config_file.h"
/* types */
typedef int32_t krb5_int32; typedef int32_t krb5_int32;
typedef int16_t krb5_int16; typedef int16_t krb5_int16;
typedef int8_t krb5_int8; typedef int8_t krb5_int8;
@@ -63,7 +63,7 @@ typedef enum krb5_preauthtype {
typedef enum krb5_address_type { typedef enum krb5_address_type {
KRB5_ADDRESS_INET = AF_INET, KRB5_ADDRESS_INET = 2,
} krb5_address_type; } krb5_address_type;
typedef struct krb5_address{ typedef struct krb5_address{
@@ -84,7 +84,7 @@ typedef struct krb5_keyblock{
typedef struct krb5_context_data{ typedef struct krb5_context_data{
krb5_enctype *etypes; krb5_enctype *etypes;
char *default_realm; char *default_realm;
krb5_config_file *cf; k5_cfile *cf;
} krb5_context_data; } krb5_context_data;
typedef krb5_context_data *krb5_context; typedef krb5_context_data *krb5_context;
@@ -98,6 +98,26 @@ typedef struct krb5_times{
krb5_time renew_till; krb5_time renew_till;
} krb5_times; } krb5_times;
enum{
KRB5_NT_UNKNOWNN = 0,
KRB5_NT_PRINCIPAL = 1,
KRB5_NT_SRV_INST = 2,
KRB5_NT_SRV_HST = 3,
KRB5_NT_SRV_XHST = 4,
KRB5_NT_UID = 5
};
typedef struct krb5_principal_data{
int type;
krb5_data realm;
krb5_data *comp;
int ncomp;
}krb5_principal_data;
typedef krb5_principal_data *krb5_principal;
typedef const krb5_principal_data *krb5_const_principal;
typedef struct krb5_ticket{ typedef struct krb5_ticket{
int kvno; int kvno;
krb5_principal sprinc; krb5_principal sprinc;
@@ -111,25 +131,6 @@ typedef struct krb5_ticket{
#define KRB5_PARSE_MALFORMED 17 #define KRB5_PARSE_MALFORMED 17
#define KRB5_PROG_ETYPE_NOSUPP 4711 #define KRB5_PROG_ETYPE_NOSUPP 4711
typedef enum k{
KRB_NT_UNKNOWNN = 0,
KRB_NT_PRINCIPAL = 1.
KRB_NT_SRV_INST = 2,
KRB_NT_SRV_HST = 3,
KRB_NT_SRV_XHST = 4,
KRB_NT_UID = 5
};
typedef struct krb5_principal_data{
int type;
krb5_data realm;
krb5_data *comp;
int ncomp;
}krb5_principal_data;
typedef krb5_principal_data *krb5_principal;
typedef const krb5_principal_data *krb5_const_principal;
typedef struct krb5_creds { typedef struct krb5_creds {
krb5_principal client; krb5_principal client;
krb5_principal server; krb5_principal server;
@@ -153,13 +154,16 @@ typedef struct krb5_rcache{
int dummy; int dummy;
}krb5_rcache; }krb5_rcache;
typedef struct krb5_ccache{ typedef struct krb5_ccache_data{
int type;
krb5_data data; krb5_data data;
}krb5_ccache; }krb5_ccache_data;
typedef struct krb5_ccache_data *krb5_ccache;
typedef struct krb5_fcache{ typedef struct krb5_fcache{
char *filename; char *filename;
}; }krb5_fcache;
typedef struct krb5_cc_cursor{ typedef struct krb5_cc_cursor{
int dummy; int dummy;

View File

@@ -7,6 +7,10 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <fcntl.h>
#include <des.h>
#include "krb5.h" #include "krb5.h"
void krb5_data_free(krb5_data *); void krb5_data_free(krb5_data *);

View File

@@ -41,6 +41,8 @@ mit_des_string_to_key(const krb5_keytype keytype,
unsigned char *key; unsigned char *key;
unsigned char tmp[8]; unsigned char tmp[8];
des_key_schedule sched;
int len; int len;
int i, j; int i, j;
int odd = 0; int odd = 0;
@@ -71,7 +73,7 @@ mit_des_string_to_key(const krb5_keytype keytype,
} }
des_set_odd_parity(key); des_set_odd_parity(key);
des_key_schedule(key, &sched); des_key_sched(key, &sched);
des_cbc_cksum(key, key, 8, &sched, key); des_cbc_cksum(key, key, 8, &sched, key);
des_set_odd_parity(key); des_set_odd_parity(key);
if(des_is_weak_key(key)) if(des_is_weak_key(key))

2
test.c
View File

@@ -4,7 +4,7 @@
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
krb5_config_file *cf; k5_cfile *cf;
char *p; char *p;
krb5_parse_config_file(&cf, "krb5.conf"); krb5_parse_config_file(&cf, "krb5.conf");
krb5_get_config_tag(cf, "realms ATHENA.MIT.EDU v4_instance_convert mit", &p); krb5_get_config_tag(cf, "realms ATHENA.MIT.EDU v4_instance_convert mit", &p);