old changes
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@841 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
6
Makefile
6
Makefile
@@ -6,9 +6,9 @@ CFLAGS=-I. -I/usr/athena/include -g
|
|||||||
YACC=yacc
|
YACC=yacc
|
||||||
|
|
||||||
SOURCES = cache.c 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 get_port.c send_to_kdc.c der.c e.c d.c str2key.c \
|
krbhst.c get_port.c send_to_kdc.c str2key.c \
|
||||||
get_in_tkt.c get_in_tkt_pw.c der_put.c constants.c get_addrs.c \
|
get_in_tkt.c get_in_tkt_pw.c constants.c get_addrs.c \
|
||||||
k5_der.c
|
get_cred.c
|
||||||
|
|
||||||
OBJECTS = $(SOURCES:%.c=%.o) config_file.o
|
OBJECTS = $(SOURCES:%.c=%.o) config_file.o
|
||||||
|
|
||||||
|
21
cache.c
21
cache.c
@@ -102,8 +102,13 @@ static krb5_error_code
|
|||||||
store_int32(int fd,
|
store_int32(int fd,
|
||||||
int32_t value)
|
int32_t value)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
value = htonl(value);
|
value = htonl(value);
|
||||||
return write(fd, &value, sizeof(value));
|
ret = write(fd, &value, sizeof(value));
|
||||||
|
if (ret != sizeof(value))
|
||||||
|
return (ret<0)?errno:-1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
@@ -124,8 +129,13 @@ static krb5_error_code
|
|||||||
store_int16(int fd,
|
store_int16(int fd,
|
||||||
int16_t value)
|
int16_t value)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
value = htons(value);
|
value = htons(value);
|
||||||
return write(fd, &value, sizeof(value));
|
ret = write(fd, &value, sizeof(value));
|
||||||
|
if (ret != sizeof(value))
|
||||||
|
return (ret<0)?errno:-1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
@@ -146,7 +156,12 @@ static krb5_error_code
|
|||||||
store_int8(int fd,
|
store_int8(int fd,
|
||||||
int8_t value)
|
int8_t value)
|
||||||
{
|
{
|
||||||
return write(fd, &value, sizeof(value));
|
int ret;
|
||||||
|
|
||||||
|
ret = write(fd, &value, sizeof(value));
|
||||||
|
if (ret != sizeof(value))
|
||||||
|
return (ret<0)?errno:-1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
|
78
get_cred.c
Normal file
78
get_cred.c
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#include <krb5_locl.h>
|
||||||
|
#include <d.h>
|
||||||
|
#include <k5_der.h>
|
||||||
|
#include <krb5_error.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
krb5_error_code
|
||||||
|
krb5_get_credentials (krb5_context context,
|
||||||
|
krb5_flags options,
|
||||||
|
krb5_ccache ccache,
|
||||||
|
krb5_creds *in_creds,
|
||||||
|
krb5_creds *out_creds)
|
||||||
|
{
|
||||||
|
krb5_error_code err;
|
||||||
|
Tgs_Req a;
|
||||||
|
krb5_kdc_rep rep;
|
||||||
|
krb5_data req, resp;
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
int i;
|
||||||
|
Buffer buffer;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX - Check if cred found in ccache
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prepare Tgs_Req.
|
||||||
|
*/
|
||||||
|
|
||||||
|
err = krb5_get_default_in_tkt_etypes (context, &a.etypes);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
a.num_etypes = 1;
|
||||||
|
|
||||||
|
err = krb5_get_all_client_addrs (&a.addrs);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
a.pvno = 5;
|
||||||
|
a.msg_type = KRB_TGS_REQ;
|
||||||
|
memset (&a.kdc_options, 0, sizeof(a.kdc_options));
|
||||||
|
/* a.kdc_options */
|
||||||
|
a.realm.length = 0;
|
||||||
|
krb5_data_copy (&a.realm, in_creds->server->realm.data,
|
||||||
|
in_creds->server->realm.length);
|
||||||
|
krb5_copy_principal (context, in_creds->server, &a.sname);
|
||||||
|
a.till = in_creds->times.endtime;
|
||||||
|
a.nonce = 17;
|
||||||
|
a.cname = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encode
|
||||||
|
*/
|
||||||
|
|
||||||
|
req.length = der_put_as_req (buf + sizeof (buf) - 1, &a);
|
||||||
|
req.data = buf + sizeof(buf) - req.length;
|
||||||
|
|
||||||
|
for (i = 0; i < a.addrs.number; ++i)
|
||||||
|
krb5_data_free (&a.addrs.addrs[i].address);
|
||||||
|
free (a.addrs.addrs);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send and receive
|
||||||
|
*/
|
||||||
|
|
||||||
|
err = krb5_sendto_kdc (context, &req, &a.realm, &resp);
|
||||||
|
if (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
buf_init (&buffer, resp.data, resp.length);
|
||||||
|
if (der_get_tgs_rep (&buffer, &rep) == -1) {
|
||||||
|
return ASN1_PARSE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -88,6 +88,7 @@ krb5_get_in_tkt(krb5_context context,
|
|||||||
|
|
||||||
a.pvno = 5;
|
a.pvno = 5;
|
||||||
a.msg_type = KRB_AS_REQ;
|
a.msg_type = KRB_AS_REQ;
|
||||||
|
memset (&a.kdc_options, 0, sizeof(a.kdc_options));
|
||||||
/* a.kdc_options */
|
/* a.kdc_options */
|
||||||
a.cname = creds->client;
|
a.cname = creds->client;
|
||||||
a.sname = creds->server;
|
a.sname = creds->server;
|
||||||
|
6
krb5.h
6
krb5.h
@@ -156,7 +156,11 @@ typedef struct krb5_creds {
|
|||||||
|
|
||||||
|
|
||||||
typedef struct krb5_authenticator_data{
|
typedef struct krb5_authenticator_data{
|
||||||
int dummy;
|
int vno;
|
||||||
|
krb5_principal cname;
|
||||||
|
int cusec;
|
||||||
|
krb5_time ctime;
|
||||||
|
int *seq_number;
|
||||||
} krb5_authenticator_data;
|
} krb5_authenticator_data;
|
||||||
|
|
||||||
typedef krb5_authenticator_data *krb5_authenticator;
|
typedef krb5_authenticator_data *krb5_authenticator;
|
||||||
|
@@ -102,8 +102,13 @@ static krb5_error_code
|
|||||||
store_int32(int fd,
|
store_int32(int fd,
|
||||||
int32_t value)
|
int32_t value)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
value = htonl(value);
|
value = htonl(value);
|
||||||
return write(fd, &value, sizeof(value));
|
ret = write(fd, &value, sizeof(value));
|
||||||
|
if (ret != sizeof(value))
|
||||||
|
return (ret<0)?errno:-1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
@@ -124,8 +129,13 @@ static krb5_error_code
|
|||||||
store_int16(int fd,
|
store_int16(int fd,
|
||||||
int16_t value)
|
int16_t value)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
value = htons(value);
|
value = htons(value);
|
||||||
return write(fd, &value, sizeof(value));
|
ret = write(fd, &value, sizeof(value));
|
||||||
|
if (ret != sizeof(value))
|
||||||
|
return (ret<0)?errno:-1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
@@ -146,7 +156,12 @@ static krb5_error_code
|
|||||||
store_int8(int fd,
|
store_int8(int fd,
|
||||||
int8_t value)
|
int8_t value)
|
||||||
{
|
{
|
||||||
return write(fd, &value, sizeof(value));
|
int ret;
|
||||||
|
|
||||||
|
ret = write(fd, &value, sizeof(value));
|
||||||
|
if (ret != sizeof(value))
|
||||||
|
return (ret<0)?errno:-1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
|
78
lib/krb5/get_cred.c
Normal file
78
lib/krb5/get_cred.c
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#include <krb5_locl.h>
|
||||||
|
#include <d.h>
|
||||||
|
#include <k5_der.h>
|
||||||
|
#include <krb5_error.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
krb5_error_code
|
||||||
|
krb5_get_credentials (krb5_context context,
|
||||||
|
krb5_flags options,
|
||||||
|
krb5_ccache ccache,
|
||||||
|
krb5_creds *in_creds,
|
||||||
|
krb5_creds *out_creds)
|
||||||
|
{
|
||||||
|
krb5_error_code err;
|
||||||
|
Tgs_Req a;
|
||||||
|
krb5_kdc_rep rep;
|
||||||
|
krb5_data req, resp;
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
int i;
|
||||||
|
Buffer buffer;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX - Check if cred found in ccache
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prepare Tgs_Req.
|
||||||
|
*/
|
||||||
|
|
||||||
|
err = krb5_get_default_in_tkt_etypes (context, &a.etypes);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
a.num_etypes = 1;
|
||||||
|
|
||||||
|
err = krb5_get_all_client_addrs (&a.addrs);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
a.pvno = 5;
|
||||||
|
a.msg_type = KRB_TGS_REQ;
|
||||||
|
memset (&a.kdc_options, 0, sizeof(a.kdc_options));
|
||||||
|
/* a.kdc_options */
|
||||||
|
a.realm.length = 0;
|
||||||
|
krb5_data_copy (&a.realm, in_creds->server->realm.data,
|
||||||
|
in_creds->server->realm.length);
|
||||||
|
krb5_copy_principal (context, in_creds->server, &a.sname);
|
||||||
|
a.till = in_creds->times.endtime;
|
||||||
|
a.nonce = 17;
|
||||||
|
a.cname = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encode
|
||||||
|
*/
|
||||||
|
|
||||||
|
req.length = der_put_as_req (buf + sizeof (buf) - 1, &a);
|
||||||
|
req.data = buf + sizeof(buf) - req.length;
|
||||||
|
|
||||||
|
for (i = 0; i < a.addrs.number; ++i)
|
||||||
|
krb5_data_free (&a.addrs.addrs[i].address);
|
||||||
|
free (a.addrs.addrs);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send and receive
|
||||||
|
*/
|
||||||
|
|
||||||
|
err = krb5_sendto_kdc (context, &req, &a.realm, &resp);
|
||||||
|
if (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
buf_init (&buffer, resp.data, resp.length);
|
||||||
|
if (der_get_tgs_rep (&buffer, &rep) == -1) {
|
||||||
|
return ASN1_PARSE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -88,6 +88,7 @@ krb5_get_in_tkt(krb5_context context,
|
|||||||
|
|
||||||
a.pvno = 5;
|
a.pvno = 5;
|
||||||
a.msg_type = KRB_AS_REQ;
|
a.msg_type = KRB_AS_REQ;
|
||||||
|
memset (&a.kdc_options, 0, sizeof(a.kdc_options));
|
||||||
/* a.kdc_options */
|
/* a.kdc_options */
|
||||||
a.cname = creds->client;
|
a.cname = creds->client;
|
||||||
a.sname = creds->server;
|
a.sname = creds->server;
|
||||||
|
@@ -156,7 +156,11 @@ typedef struct krb5_creds {
|
|||||||
|
|
||||||
|
|
||||||
typedef struct krb5_authenticator_data{
|
typedef struct krb5_authenticator_data{
|
||||||
int dummy;
|
int vno;
|
||||||
|
krb5_principal cname;
|
||||||
|
int cusec;
|
||||||
|
krb5_time ctime;
|
||||||
|
int *seq_number;
|
||||||
} krb5_authenticator_data;
|
} krb5_authenticator_data;
|
||||||
|
|
||||||
typedef krb5_authenticator_data *krb5_authenticator;
|
typedef krb5_authenticator_data *krb5_authenticator;
|
||||||
|
36
test.c
36
test.c
@@ -4,10 +4,46 @@
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
krb5_error_code err;
|
||||||
|
krb5_context context;
|
||||||
|
krb5_ccache ccache;
|
||||||
|
krb5_creds cred, out_cred;
|
||||||
|
#if 0
|
||||||
k5_cfile *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);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
err = krb5_init_context (&context);
|
||||||
|
if (err)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
err = krb5_cc_default (context, &ccache);
|
||||||
|
if (err)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
err = krb5_build_principal (context,
|
||||||
|
&cred.server,
|
||||||
|
strlen("x-dce.pdc.kth.se"),
|
||||||
|
"x-dce.pdc.kth.se",
|
||||||
|
"host",
|
||||||
|
"sisyphus.pdc.kth.se",
|
||||||
|
NULL);
|
||||||
|
if (err)
|
||||||
|
abort ();
|
||||||
|
cred.server->type = KRB5_NT_SRV_HST;
|
||||||
|
cred.times.endtime = time (NULL) + 4711;
|
||||||
|
|
||||||
|
err = krb5_get_credentials (context,
|
||||||
|
0,
|
||||||
|
ccache,
|
||||||
|
&cred,
|
||||||
|
&out_cred);
|
||||||
|
if (err)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
krb5_free_context ();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user