removeed
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@839 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
150
der_put.c
150
der_put.c
@@ -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
247
k5_der.c
@@ -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
|
||||
|
Reference in New Issue
Block a user