git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@839 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1996-10-11 10:27:54 +00:00
parent 5ae252acbc
commit 7c190872e8
2 changed files with 0 additions and 397 deletions

150
der_put.c
View File

@@ -1,150 +0,0 @@
#include <krb5_locl.h>
#include <der.h>
/*
* Functions for generating DER
*/
/*
* All these functions generate the data backwards starting at `ptr'
* and return the length.
*/
unsigned
der_put_integer (unsigned char *ptr, void *v)
{
unsigned char *p = ptr;
unsigned i = *(int *)v;
if (i) {
while(i) {
*p-- = i % 0x100;
i /= 0x100;
}
return ptr - p;
} else {
*p = 0;
return 1;
}
}
unsigned
der_put_length (unsigned char *ptr, unsigned len)
{
unsigned char *p = ptr;
if (len < 0x80) {
*p = len;
return 1;
} else {
unsigned q;
q = der_put_integer (p, &len);
p -= q;
*p = 0x80 | q;
return q + 1;
}
}
unsigned
der_put_octetstring (unsigned char *ptr, void *v)
{
unsigned char *p = ptr;
krb5_data *str = (krb5_data *)v;
int len = str->length;
p -= len;
memcpy (p + 1, str->data, len);
return ptr - p;
}
unsigned
der_put_tag (unsigned char *ptr, Der_class class, Der_type type, unsigned tag)
{
unsigned char o1;
unsigned char *p = ptr;
o1 = (class << 6) | (type << 5);
if (tag < 0x1F)
o1 |= tag;
else {
o1 |= 0x1F;
*p-- = tag % 0x80;
tag /= 0x80;
while(tag) {
*p-- = 0x80 | (tag % 0x80);
tag /= 0x80;
}
}
*p-- = o1;
return ptr - p;
}
unsigned
der_put_type (unsigned char *ptr, Der_class class, Der_type type,
unsigned tag, unsigned len)
{
unsigned char *p = ptr;
p -= der_put_length (p, len);
p -= der_put_tag (p, class, type, tag);
return ptr - p;
}
static unsigned (*put_univ_funcs[])(unsigned char *, void *val) = {
NULL, /* 0 */
NULL, /* 1 */
der_put_integer, /* 2 */
NULL, /* 3 */
der_put_octetstring, /* 4 */
NULL, /* 5 */
NULL, /* 6 */
NULL, /* 7 */
NULL, /* 8 */
NULL, /* 9 */
NULL, /* 10 */
NULL, /* 11 */
NULL, /* 12 */
NULL, /* 13 */
NULL, /* 14 */
NULL, /* 15 */
NULL, /* 16 */
NULL, /* 17 */
NULL, /* 18 */
NULL, /* 19 */
NULL, /* 20 */
NULL, /* 21 */
NULL, /* 22 */
NULL, /* 23 */
der_put_octetstring, /* 24 */
NULL, /* 25 */
NULL, /* 26 */
der_put_octetstring, /* 27 */
};
unsigned
der_put_val (unsigned char *ptr, int type, void *val)
{
return (*(put_univ_funcs[type]))(ptr, val);
}
unsigned
der_put_type_and_value (unsigned char *ptr, int type, void *val)
{
unsigned char *p = ptr;
p -= der_put_val (p, type, val);
p -= der_put_type (p, UNIV, PRIM, type, ptr - p);
return ptr - p;
}
unsigned
der_put_context (unsigned char *ptr, int tag, int type, void *val)
{
unsigned char *p = ptr;
p -= der_put_type_and_value (p, type, val);
p -= der_put_type (p, CONTEXT, CONS, tag, ptr - p);
return ptr - p;
}

247
k5_der.c
View File

@@ -1,247 +0,0 @@
#include <krb5_locl.h>
#include <k5_der.h>
static void
time2generalizedtime (krb5_data *s, time_t t)
{
struct tm *tm;
s->data = malloc(16);
s->length = 15;
tm = gmtime (&t);
sprintf (s->data, "%04d%02d%02d%02d%02d%02dZ", tm->tm_year + 1900,
tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min,
tm->tm_sec);
}
unsigned
der_put_context_etypes (unsigned char *ptr, int tag,
krb5_enctype *etypes, unsigned num_etypes)
{
unsigned char *p = ptr;
int i;
for (i = num_etypes - 1; i >= 0; --i)
p -= der_put_type_and_value (p, UT_Integer, &etypes[i]);
p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
p -= der_put_type (p, CONTEXT, CONS, tag, ptr - p);
return ptr - p;
}
unsigned
der_put_context_principalname (unsigned char *ptr, int tag,
krb5_principal name)
{
unsigned char *p = ptr;
int i;
if (name == NULL)
return 0;
for (i = name->ncomp - 1; i >= 0; --i)
p -= der_put_type_and_value (p, UT_GeneralString,
&name->comp[i]);
p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
p -= der_put_type (p, CONTEXT, CONS, 1, ptr - p);
p -= der_put_context (p, 0, UT_Integer, &name->type);
p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
p -= der_put_type (p, CONTEXT, CONS, tag, ptr - p);
return ptr - p;
}
unsigned
der_put_context_kdcoptions (unsigned char *ptr, int tag, KdcOptions *k)
{
unsigned char *p = ptr;
/* XXX */
*p-- = '\0';
*p-- = '\0';
*p-- = '\0';
*p-- = '\0';
*p-- = '\0';
*p-- = 5;
*p-- = 3;
p -= der_put_type (p, CONTEXT, CONS, tag, ptr - p);
return ptr - p;
}
unsigned
der_put_context_hostaddresses (unsigned char *ptr, int tag,
krb5_addresses addrs)
{
unsigned char *p = ptr;
int i;
for(i = addrs.number - 1; i >= 0; --i) {
p -= der_put_context (p, 1, UT_OctetString,
&addrs.addrs[i].address);
p -= der_put_context (p, 0, UT_Integer,
&addrs.addrs[i].type);
}
p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
p -= der_put_type (p, CONTEXT, CONS, tag, ptr - p);
return ptr - p;
}
unsigned
der_put_kdc_req_body (unsigned char *ptr, Kdc_Req *k)
{
unsigned char *p = ptr;
/* additional-tickets[11] SEQUENCE OF Ticket OPTIONAL */
/* enc-authorization-data[10] EncryptedData OPTIONAL */
p -= der_put_context_hostaddresses (p, 9, k->addrs);
/* addresses[9] HostAddresses OPTIONAL */
p -= der_put_context_etypes (p, 8, k->etypes, k->num_etypes);
p -= der_put_context (p, 7, UT_Integer, &k->nonce);
/* rtime[6] KerberosTime OPTIONAL */
{
krb5_data t;
time2generalizedtime (&t, k->till);
p -= der_put_context (p, 5, UT_GeneralizedTime, &t);
string_free (t);
}
/* from[4] KerberosTime OPTIONAL */
p -= der_put_context_principalname (p, 3, k->sname);
p -= der_put_context (p, 2, UT_GeneralString, &k->realm);
p -= der_put_context_principalname (p, 1, k->cname);
p -= der_put_context_kdcoptions (p, 0, &k->kdc_options);
p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
return ptr - p;
}
unsigned
der_put_kdc_req (unsigned char *ptr, int msg_type, Kdc_Req *k)
{
unsigned char *p = ptr;
p -= der_put_kdc_req_body (p, k);
p -= der_put_type (p, CONTEXT, CONS, 4, ptr - p);
/* padata[3] SEQUENCE OF PA-DATA OPTIONAL */
p -= der_put_context (p, 2, UT_Integer, &k->msg_type);
p -= der_put_context (p, 1, UT_Integer, &k->pvno);
p -= der_put_type (p, UNIV, CONS, UT_Sequence, ptr - p);
return ptr - p;
}
unsigned
der_put_as_req (unsigned char *ptr, As_Req *a)
{
unsigned char *p = ptr;
p -= der_put_kdc_req (p, a->msg_type, a);
p -= der_put_type (p, APPL, CONS, a->msg_type, ptr - p);
return ptr - p;
}
#if 0
/*
* Get functions
*/
int
der_get_principalname (unsigned char *ptr, Principalname *name)
{
unsigned char *p = ptr;
unsigned char *p0;
int tlen, tlen2;
len = der_match_type (p, UNIV, CONS, UT_Sequence, &tlen);
if (len < 0)
return len;
else
p += len;
p0 = p;
len = der_match_context (p, 0, UT_Integer, &name->name_type);
if (len < 0)
return len;
else
p += len;
len = der_match_type (p, CONTEXT, CONS, 1, &tlen2);
if (len < 0)
return len;
else
p =+ len;
len = der_match_type ()
while(p < p0 + tlen) {
}
return ptr - p;
}
int
der_get_kdc_rep (unsigned char *ptr, unsigned mylen, int msg_type,
krb5_kdc_rep *k)
{
unsigned char *p = ptr;
unsigned tlen, slen;
int len;
unsigned kvno, msg1;
unsigned tag;
int type;
len = der_match_type (p, UNIV, CONS, UT_Sequence, &tlen);
if (len < 0)
return len;
else
p += len;
len = der_match_context (p, 0, UT_Integer, &kvno);
if (len < 0)
return len;
else
p += len;
if (kvno != 5)
return -1;
len = der_match_context (p, 1, UT_Integer, &msg1);
if (len < 0)
return len;
else
p += len;
if (msg1 != msg_type)
return -1;
len = der_get_context (p, &tag, &type, &tlen);
if (len < 0)
return len;
else
p += len;
if (tag == 2)
abort (); /* XXX */
else if (tag == 3) {
p += der_get_val (p, UT_GeneralString, tlen, &k->realm);
}
len = der_get_context (p, &tag, &type, &tlen);
if (len < 0)
return len;
else
p += len;
der_get_principalname
return p - ptr;
}
int
der_get_as_rep (unsigned char *ptr, As_Rep *a)
{
unsigned char *p = ptr;
int len;
unsigned tlen;
len = der_match_type (p, APPL, CONS, KRB_AS_REP, &tlen);
if(len < 0)
return len;
else
p += len;
len = der_get_kdc_rep (p, tlen, KRB_AS_REP, a);
if (len < 0)
return len;
else
p += len;
return p - ptr;
}
#endif