Replace contents with keyvalue. Prepare for use of asn1-types.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1890 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
1997-06-10 14:25:15 +00:00
parent b03ed317ba
commit de43cd185b
11 changed files with 342 additions and 75 deletions

View File

@@ -10,6 +10,9 @@ krb5_error_code
krb5_principal2principalname (PrincipalName *p, krb5_principal2principalname (PrincipalName *p,
krb5_principal from) krb5_principal from)
{ {
#ifdef USE_ASN1_PRINCIPAL
copy_PrincipalName(&from->name, p);
#else
int i; int i;
p->name_type = from->type; p->name_type = from->type;
@@ -21,6 +24,7 @@ krb5_principal2principalname (PrincipalName *p,
strncpy (p->name_string.val[i], from->comp[i].data, len); strncpy (p->name_string.val[i], from->comp[i].data, len);
p->name_string.val[i][len] = '\0'; p->name_string.val[i][len] = '\0';
} }
#endif
return 0; return 0;
} }
@@ -29,9 +33,12 @@ principalname2krb5_principal (krb5_principal *principal,
PrincipalName from, PrincipalName from,
char *realm) char *realm)
{ {
krb5_principal p = malloc(sizeof(*p));
#ifdef USE_ASN1_PRINCIPAL
copy_PrincipalName(&from, &p->name);
p->realm = strdup(realm);
#else
int i; int i;
krb5_principal p;
p = malloc (sizeof(*p));
p->type = from.name_type; p->type = from.name_type;
p->ncomp = from.name_string.len; p->ncomp = from.name_string.len;
p->comp = malloc (p->ncomp * sizeof(*p->comp)); p->comp = malloc (p->ncomp * sizeof(*p->comp));
@@ -42,6 +49,7 @@ principalname2krb5_principal (krb5_principal *principal,
} }
p->realm.data = strdup(realm); p->realm.data = strdup(realm);
p->realm.length = strlen(realm); p->realm.length = strlen(realm);
#endif
*principal = p; *principal = p;
return 0; return 0;
} }

View File

@@ -11,37 +11,37 @@ krb5_build_ap_req (krb5_context context,
{ {
AP_REQ ap; AP_REQ ap;
Ticket t; Ticket t;
unsigned char buf[1024];
int len;
ap.pvno = 5; ap.pvno = 5;
ap.msg_type = krb_ap_req; ap.msg_type = krb_ap_req;
memset(&ap.ap_options, 0, sizeof(ap.ap_options)); memset(&ap.ap_options, 0, sizeof(ap.ap_options));
if (ap_options & AP_OPTS_USE_SESSION_KEY) ap.ap_options.use_session_key = (ap_options & AP_OPTS_USE_SESSION_KEY) > 0;
ap.ap_options.use_session_key = 1; ap.ap_options.mutual_required = (ap_options & AP_OPTS_MUTUAL_REQUIRED) > 0;
if (ap_options & AP_OPTS_MUTUAL_REQUIRED)
ap.ap_options.mutual_required = 1;
ap.ticket.tkt_vno = 5; ap.ticket.tkt_vno = 5;
#ifdef USE_ASN1_PRINCIPAL
copy_Realm(&cred->server->realm, &ap.ticket.realm);
copy_PrincipalName(&cred->server->name, &ap.ticket.sname);
#else
ap.ticket.realm = malloc(cred->server->realm.length + 1); ap.ticket.realm = malloc(cred->server->realm.length + 1);
strncpy(ap.ticket.realm, cred->server->realm.data, strncpy(ap.ticket.realm, cred->server->realm.data,
cred->server->realm.length); cred->server->realm.length);
ap.ticket.realm[cred->server->realm.length] = '\0'; ap.ticket.realm[cred->server->realm.length] = '\0';
krb5_principal2principalname(&ap.ticket.sname, cred->server); krb5_principal2principalname(&ap.ticket.sname, cred->server);
#endif
decode_Ticket(cred->ticket.data, cred->ticket.length, &t); decode_Ticket(cred->ticket.data, cred->ticket.length, &t);
copy_EncryptedData(&t.enc_part, &ap.ticket.enc_part);
ap.ticket.enc_part = t.enc_part; free_Ticket(&t);
ap.authenticator.etype = ap.ticket.enc_part.etype; ap.authenticator.etype = ap.ticket.enc_part.etype;
ap.authenticator.kvno = NULL; ap.authenticator.kvno = NULL;
ap.authenticator.cipher = authenticator; ap.authenticator.cipher = authenticator;
ret->length = encode_AP_REQ(buf + sizeof(buf) - 1, sizeof(buf), &ap); ret->length = length_AP_REQ(&ap);
free (ap.ticket.realm);
ret->data = malloc(ret->length); ret->data = malloc(ret->length);
memcpy (ret->data, buf + sizeof(buf) - ret->length, ret->length); encode_AP_REQ(ret->data + ret->length - 1, ret->length, &ap);
free_AP_REQ(&ap);
return 0; return 0;
} }

View File

@@ -18,10 +18,15 @@ krb5_build_authenticator (krb5_context context,
int32_t seq_number; int32_t seq_number;
auth->authenticator_vno = 5; auth->authenticator_vno = 5;
#ifdef USE_ASN1_PRINCIPAL
copy_Realm(&cred->client->realm, &auth->crealm);
copy_PrincipalName(&cred->client->name, &auth->cname);
#else
auth->crealm = malloc(cred->client->realm.length + 1); auth->crealm = malloc(cred->client->realm.length + 1);
strncpy(auth->crealm, cred->client->realm.data, cred->client->realm.length); strncpy(auth->crealm, cred->client->realm.data, cred->client->realm.length);
auth->crealm[cred->client->realm.length] = '\0'; auth->crealm[cred->client->realm.length] = '\0';
krb5_principal2principalname(&auth->cname, cred->client); krb5_principal2principalname(&auth->cname, cred->client);
#endif
gettimeofday(&tv, NULL); gettimeofday(&tv, NULL);
auth->cusec = tv.tv_usec; auth->cusec = tv.tv_usec;

View File

@@ -94,6 +94,11 @@ krb5_get_credentials (krb5_context context,
*/ */
/* a.kdc_options */ /* a.kdc_options */
#ifdef USE_ASN1_PRINCIPAL
copy_Realm(&in_creds->server->realm, &a.req_body.realm);
a.req_body.sname = malloc(sizeof(*a.req_body.sname));
copy_PrincipalName(&in_creds->server->name, a.req_body.sname);
#else
a.req_body.realm = malloc(in_creds->server->realm.length + 1); a.req_body.realm = malloc(in_creds->server->realm.length + 1);
strncpy (a.req_body.realm, in_creds->server->realm.data, strncpy (a.req_body.realm, in_creds->server->realm.data,
in_creds->server->realm.length); in_creds->server->realm.length);
@@ -101,6 +106,7 @@ krb5_get_credentials (krb5_context context,
a.req_body.sname = malloc(sizeof(*a.req_body.sname)); a.req_body.sname = malloc(sizeof(*a.req_body.sname));
krb5_principal2principalname(a.req_body.sname, in_creds->server); krb5_principal2principalname(a.req_body.sname, in_creds->server);
#endif
a.req_body.from = NULL; a.req_body.from = NULL;
a.req_body.till = in_creds->times.endtime; a.req_body.till = in_creds->times.endtime;
a.req_body.rtime = NULL; a.req_body.rtime = NULL;

View File

@@ -65,10 +65,10 @@ krb5_kt_read_service_key(krb5_context context,
return r; return r;
*key = malloc(sizeof(**key)); *key = malloc(sizeof(**key));
(*key)->keytype = entry.keyblock.keytype; (*key)->keytype = entry.keyblock.keytype;
(*key)->contents.length = 0; (*key)->keyvalue.length = 0;
(*key)->contents.data = NULL; (*key)->keyvalue.data = NULL;
krb5_data_copy(&(*key)->contents, entry.keyblock.contents.data, krb5_data_copy(&(*key)->keyvalue, entry.keyblock.keyvalue.data,
entry.keyblock.contents.length); entry.keyblock.keyvalue.length);
krb5_kt_close (context, keytab); krb5_kt_close (context, keytab);
return r; return r;
@@ -172,6 +172,22 @@ krb5_kt_ret_data(krb5_storage *sp,
return 0; return 0;
} }
static krb5_error_code
krb5_kt_ret_string(krb5_storage *sp,
general_string *data)
{
int ret;
int16_t size;
ret = krb5_ret_int16(sp, &size);
if(ret)
return ret;
*data = malloc(size + 1);
ret = sp->fetch(sp, *data, size);
if(ret != size)
return (ret < 0)? errno : KRB5_CC_END;
return 0;
}
static krb5_error_code static krb5_error_code
krb5_kt_ret_principal(krb5_storage *sp, krb5_kt_ret_principal(krb5_storage *sp,
krb5_principal *princ) krb5_principal *princ)
@@ -186,12 +202,27 @@ krb5_kt_ret_principal(krb5_storage *sp,
return ENOMEM; return ENOMEM;
p->type = KRB5_NT_SRV_HST;
ret = krb5_ret_int16(sp, &tmp); ret = krb5_ret_int16(sp, &tmp);
if(ret) return ret; if(ret) return ret;
p->ncomp = tmp; #ifdef USE_ASN1_PRINCIPAL
ret = krb5_kt_ret_data(sp, &p->realm); p->name.name_type = KRB5_NT_SRV_HST;
p->name.name_string.len = tmp;
ret = krb5_kt_ret_string(sp, &p->realm);
if(ret) return ret; if(ret) return ret;
p->name.name_string.val = calloc(p->name.name_string.len,
sizeof(*p->name.name_string.val));
if(p->name.name_string.val == NULL)
return ENOMEM;
for(i = 0; i < p->name.name_string.len; i++){
ret = krb5_kt_ret_string(sp, p->name.name_string.val + i);
if(ret) return ret;
}
#else
p->type = KRB5_NT_SRV_HST;
p->ncomp = tmp;
ret = krb5_kt_ret_data(sp, &realm);
if(ret) return ret;
p->realm = realm;
p->comp = ALLOC(p->ncomp, krb5_data); p->comp = ALLOC(p->ncomp, krb5_data);
if(p->comp == NULL){ if(p->comp == NULL){
return ENOMEM; return ENOMEM;
@@ -200,6 +231,7 @@ krb5_kt_ret_principal(krb5_storage *sp,
ret = krb5_kt_ret_data(sp, &p->comp[i]); ret = krb5_kt_ret_data(sp, &p->comp[i]);
if(ret) return ret; if(ret) return ret;
} }
#endif
*princ = p; *princ = p;
return 0; return 0;
} }
@@ -213,7 +245,7 @@ krb5_kt_ret_keyblock(krb5_storage *sp, krb5_keyblock *p)
ret = krb5_ret_int16(sp, &tmp); /* keytype + etype */ ret = krb5_ret_int16(sp, &tmp); /* keytype + etype */
if(ret) return ret; if(ret) return ret;
p->keytype = tmp; p->keytype = tmp;
ret = krb5_kt_ret_data(sp, &p->contents); ret = krb5_kt_ret_data(sp, &p->keyvalue);
return ret; return ret;
} }
@@ -234,6 +266,24 @@ krb5_kt_store_data(krb5_storage *sp,
return 0; return 0;
} }
static krb5_error_code
krb5_kt_store_string(krb5_storage *sp,
general_string data)
{
int ret;
size_t len = strlen(data);
ret = krb5_store_int16(sp, len);
if(ret < 0)
return ret;
ret = sp->store(sp, data, len);
if(ret != len){
if(ret < 0)
return errno;
return KRB5_CC_END;
}
return 0;
}
static krb5_error_code static krb5_error_code
krb5_kt_store_keyblock(krb5_storage *sp, krb5_kt_store_keyblock(krb5_storage *sp,
krb5_keyblock *p) krb5_keyblock *p)
@@ -242,7 +292,7 @@ krb5_kt_store_keyblock(krb5_storage *sp,
ret = krb5_store_int16(sp, p->keytype); /* keytype + etype */ ret = krb5_store_int16(sp, p->keytype); /* keytype + etype */
if(ret) return ret; if(ret) return ret;
ret = krb5_kt_store_data(sp, p->contents); ret = krb5_kt_store_data(sp, p->keyvalue);
return ret; return ret;
} }
@@ -255,14 +305,25 @@ krb5_kt_store_principal(krb5_storage *sp,
int ret; int ret;
int16_t tmp; int16_t tmp;
#ifdef USE_ASN1_PRINCIPAL
ret = krb5_store_int16(sp, p->name.name_string.len);
if(ret) return ret;
ret = krb5_kt_store_string(sp, p->realm);
if(ret) return ret;
for(i = 0; i < p->name.name_string.len; i++){
ret = krb5_kt_store_string(sp, p->name.name_string.val[i]);
if(ret) return ret;
}
#else
ret = krb5_store_int16(sp, p->ncomp); ret = krb5_store_int16(sp, p->ncomp);
if(ret) return ret; if(ret) return ret;
ret = krb5_kt_store_data(sp, p->realm); ret = krb5_kt_store_string(sp, p->realm);
if(ret) return ret; if(ret) return ret;
for(i = 0; i < p->ncomp; i++){ for(i = 0; i < p->ncomp; i++){
ret = krb5_kt_store_data(sp, p->comp[i]); ret = krb5_kt_store_data(sp, p->comp[i]);
if(ret) return ret; if(ret) return ret;
} }
#endif
return 0; return 0;
} }
@@ -292,7 +353,11 @@ krb5_kt_add_entry(krb5_context context,
if (ret) return ret; if (ret) return ret;
ret = krb5_kt_store_principal (sp, entry->principal); ret = krb5_kt_store_principal (sp, entry->principal);
if (ret) return ret; if (ret) return ret;
#ifdef USE_ASN1_PRINCIPAL
ret = krb5_store_int32 (sp, entry->principal->name.name_type);
#else
ret = krb5_store_int32 (sp, entry->principal->type); ret = krb5_store_int32 (sp, entry->principal->type);
#endif
if (ret) return ret; if (ret) return ret;
ret = krb5_store_int32 (sp, time(NULL)); ret = krb5_store_int32 (sp, time(NULL));
if (ret) return ret; if (ret) return ret;
@@ -322,7 +387,11 @@ krb5_kt_next_entry(krb5_context context,
ret = krb5_kt_ret_principal (cursor->sp, &entry->principal); ret = krb5_kt_ret_principal (cursor->sp, &entry->principal);
if (ret) if (ret)
return ret; return ret;
#ifdef USE_ASN1_PRINCIPAL
ret = krb5_ret_int32(cursor->sp, &entry->principal->name.name_type);
#else
ret = krb5_ret_int32(cursor->sp, &entry->principal->type); ret = krb5_ret_int32(cursor->sp, &entry->principal->type);
#endif
if (ret) if (ret)
return ret; return ret;
ret = krb5_ret_int32(cursor->sp, &timestamp); ret = krb5_ret_int32(cursor->sp, &timestamp);

View File

@@ -55,7 +55,7 @@ krb5_getportbyname (const char *service,
krb5_error_code krb5_error_code
krb5_sendto_kdc (krb5_context context, krb5_sendto_kdc (krb5_context context,
const krb5_data *send, const krb5_data *send,
const krb5_data *realm, const krb5_realm *realm,
krb5_data *receive); krb5_data *receive);
krb5_error_code krb5_error_code

View File

@@ -17,7 +17,11 @@ krb5_mk_error(krb5_principal princ,
msg.msg_type = krb_error; msg.msg_type = krb_error;
msg.stime = time(0); msg.stime = time(0);
msg.error_code = error_code; msg.error_code = error_code;
#ifdef USE_ASN1_PRINCIPAL
msg.realm = princ->realm;
#else
msg.realm = princ->realm.data; msg.realm = princ->realm.data;
#endif
krb5_principal2principalname(&msg.sname, princ); krb5_principal2principalname(&msg.sname, princ);
if (e_text) if (e_text)
msg.e_text = &e_text; msg.e_text = &e_text;

View File

@@ -4,15 +4,27 @@ RCSID("$Id$");
/* Public principal handling functions */ /* Public principal handling functions */
#ifdef USE_ASN1_PRINCIPAL
#define num_components(P) ((P)->name.name_string.len)
#define princ_type(P) ((P)->name.name_type)
#else
#define num_components(P) ((P)->ncomp)
#define princ_type(P) ((P)->type)
#endif
void void
krb5_free_principal(krb5_context context, krb5_free_principal(krb5_context context,
krb5_principal p) krb5_principal p)
{ {
#ifdef USE_ASN1_PRINCIPAL
free_Principal(p);
#else
int i; int i;
for(i = 0; i < p->ncomp; i++) for(i = 0; i < num_components(p); i++)
krb5_data_free(&p->comp[i]); krb5_data_free(&p->comp[i]);
free(p->comp); free(p->comp);
krb5_data_free(&p->realm); krb5_data_free(&p->realm);
#endif
free(p); free(p);
} }
@@ -22,9 +34,14 @@ krb5_parse_name(krb5_context context,
krb5_principal *principal) krb5_principal *principal)
{ {
#ifdef USE_ASN1_PRINCIPAL
general_string *comp;
general_string realm;
#else
krb5_data *comp; krb5_data *comp;
int ncomp;
krb5_data realm; krb5_data realm;
#endif
int ncomp;
char *p; char *p;
char *q; char *q;
@@ -45,7 +62,11 @@ krb5_parse_name(krb5_context context,
} else if(*p == '/') } else if(*p == '/')
ncomp++; ncomp++;
} }
#ifdef USE_ASN1_PRINCIPAL
comp = calloc(ncomp, sizeof(*comp));
#else
comp = ALLOC(ncomp, krb5_data); comp = ALLOC(ncomp, krb5_data);
#endif
n = 0; n = 0;
start = q = p = s = strdup(name); start = q = p = s = strdup(name);
@@ -63,15 +84,27 @@ krb5_parse_name(krb5_context context,
c = '\0'; c = '\0';
}else if(c == '/' || c == '@'){ }else if(c == '/' || c == '@'){
if(got_realm){ if(got_realm){
while(n>0) exit:
while(n>0){
#ifdef USE_ASN1_PRINCIPAL
free(comp[--n]);
#else
free(comp[--n].data); free(comp[--n].data);
#endif
}
free(comp); free(comp);
free(s); free(s);
return KRB5_PARSE_MALFORMED; return KRB5_PARSE_MALFORMED;
}else{ }else{
#ifdef USE_ASN1_PRINCIPAL
comp[n] = malloc(q - start + 1);
strncpy(comp[n], start, q - start);
comp[n][q - start] = 0;
#else
comp[n].length = q - start; comp[n].length = q - start;
comp[n].data = (krb5_pointer)malloc(comp[n].length); comp[n].data = (krb5_pointer)malloc(comp[n].length);
memmove(comp[n].data, start, comp[n].length); memmove(comp[n].data, start, comp[n].length);
#endif
n++; n++;
} }
if(c == '@') if(c == '@')
@@ -79,30 +112,42 @@ krb5_parse_name(krb5_context context,
start = q; start = q;
continue; continue;
} }
if(got_realm && (c == ':' || c == '/' || c == '\0')){ if(got_realm && (c == ':' || c == '/' || c == '\0'))
while(n>0) goto exit;
free(comp[--n].data);
free(comp);
free(s);
return KRB5_PARSE_MALFORMED;
}
*q++ = c; *q++ = c;
} }
if(got_realm){ if(got_realm){
#ifdef USE_ASN1_PRINCIPAL
realm = malloc(q - start + 1);
strncpy(realm, start, q - start);
realm[q - start] = 0;
#else
realm.length = q - start; realm.length = q - start;
realm.data = (krb5_pointer)malloc(realm.length); realm.data = (krb5_pointer)malloc(realm.length);
memmove(realm.data, start, realm.length); memmove(realm.data, start, realm.length);
#endif
}else{ }else{
#ifdef USE_ASN1_PRINCIPAL
comp[n] = malloc(q - start + 1);
strncpy(comp[n], start, q - start);
comp[n][q - start] = 0;
#else
comp[n].length = q - start; comp[n].length = q - start;
comp[n].data = (krb5_pointer)malloc(comp[n].length); comp[n].data = (krb5_pointer)malloc(comp[n].length);
memmove(comp[n].data, start, comp[n].length); memmove(comp[n].data, start, comp[n].length);
#endif
n++; n++;
} }
*principal = ALLOC(1, krb5_principal_data); *principal = malloc(sizeof(**principal));
#ifdef USE_ASN1_PRINCIPAL
(*principal)->name.name_type = KRB5_NT_PRINCIPAL;
(*principal)->name.name_string.val = comp;
#else
(*principal)->type = KRB5_NT_PRINCIPAL; (*principal)->type = KRB5_NT_PRINCIPAL;
(*principal)->realm = realm;
(*principal)->comp = comp; (*principal)->comp = comp;
(*principal)->ncomp = n; #endif
num_components(*principal) = n;
(*principal)->realm = realm;
free(s); free(s);
return 0; return 0;
} }
@@ -112,6 +157,9 @@ static void quote_string(char *s, int len, char **out)
char *q; char *q;
char *p = *out; char *p = *out;
int c=0; int c=0;
#ifdef USE_ASN1_PRINCIPAL
len = strlen(s);
#endif
for(q = s; q < s + len; q++){ for(q = s; q < s + len; q++){
if(*q == '\n') if(*q == '\n')
c = 'n'; c = 'n';
@@ -141,24 +189,40 @@ krb5_unparse_name(krb5_context context,
krb5_principal principal, krb5_principal principal,
char **name) char **name)
{ {
int size = 0; int size;
char *p; char *p;
char *s; char *s;
int i; int i;
for(i = 0; i < principal->ncomp; i++) int ncomp = num_components(principal);
size += 2*principal->comp[i].length + 1; #ifdef USE_ASN1_PRINCIPAL
size += 2*principal->realm.length + 1; size = 2 * strlen(principal->realm) + 1;
s = ALLOC(size, char); for (i = 0; i < ncomp; i++)
size += 2 * strlen(principal->name.name_string.val[i]) + 1;
#else
size = 2 * principal->realm.length + 1;
for(i = 0; i < ncomp; i++)
size += 2 * principal->comp[i].length + 1;
#endif
s = malloc(size);
p = s; p = s;
for(i = 0; i < principal->ncomp; i++){ for(i = 0; i < ncomp; i++){
if(i) *p++ = '/'; if(i) *p++ = '/';
quote_string(principal->comp[i].data, principal->comp[i].length, &p); quote_string(
#ifdef USE_ASN1_PRINCIPAL
principal->name.name_string.val[i], 0,
#else
principal->comp[i].data, principal->comp[i].length,
#endif
&p);
} }
*p++ = '@'; *p++ = '@';
#ifdef USE_ASN1_PRINCIPAL
quote_string(principal->realm, 0, &p);
#else
quote_string(principal->realm.data, principal->realm.length, &p); quote_string(principal->realm.data, principal->realm.length, &p);
#endif
*p = 0; *p = 0;
*name = strdup(s); *name = s;
free(s);
return 0; return 0;
} }
@@ -174,7 +238,7 @@ krb5_unparse_name_ext(krb5_context context,
} }
krb5_data* krb5_realm*
krb5_princ_realm(krb5_context context, krb5_princ_realm(krb5_context context,
krb5_principal principal) krb5_principal principal)
{ {
@@ -185,7 +249,7 @@ krb5_princ_realm(krb5_context context,
void void
krb5_princ_set_realm(krb5_context context, krb5_princ_set_realm(krb5_context context,
krb5_principal principal, krb5_principal principal,
krb5_data *realm) krb5_realm *realm)
{ {
principal->realm = *realm; principal->realm = *realm;
} }
@@ -210,21 +274,36 @@ krb5_error_code
krb5_principal_set_component(krb5_context context, krb5_principal p, krb5_principal_set_component(krb5_context context, krb5_principal p,
int n, void *data, size_t len) int n, void *data, size_t len)
{ {
krb5_data *tmp; #ifdef USE_ASN1_PRINCIPAL
if(p->ncomp <= n){ general_string *tmp = p->name.name_string.val;
#else
krb5_data *tmp = p->comp;
#endif
if(num_components(p) <= n){
int s = n + 10; int s = n + 10;
if(p->comp) tmp = realloc(tmp, s * sizeof(*tmp));
tmp = (krb5_data*)realloc(p->comp, s * sizeof(krb5_data));
else
tmp = ALLOC(s, krb5_data);
if(!tmp) if(!tmp)
return ENOMEM; return ENOMEM;
memset(tmp + num_components(p), 0,
(s - num_components(p)) * sizeof(*tmp));
#ifdef USE_ASN1_PRINCIPAL
p->name.name_string.val = tmp;
#else
p->comp = tmp; p->comp = tmp;
p->ncomp = s; #endif
num_components(p)= s;
} }
#ifdef USE_ASN1_PRINCIPAL
if(p->name.name_string.val[n])
free(p->name.name_string.val[n]);
p->name.name_string.val[n] = malloc(len + 1);
strncpy(p->name.name_string.val[n], data, len);
p->name.name_string.val[n][len] = 0;
#else
p->comp[n].length = 0; p->comp[n].length = 0;
p->comp[n].data = NULL; p->comp[n].data = NULL;
krb5_data_copy(&p->comp[n], data, len); krb5_data_copy(&p->comp[n], data, len);
#endif
return 0; return 0;
} }
@@ -242,7 +321,7 @@ va_ext_princ(krb5_context context, krb5_principal p, va_list ap)
krb5_principal_set_component(context, p, n, s, len); krb5_principal_set_component(context, p, n, s, len);
n++; n++;
} }
p->ncomp = n; num_components(p) = n;
} }
static void static void
@@ -259,7 +338,7 @@ va_princ(krb5_context context, krb5_principal p, va_list ap)
krb5_principal_set_component(context, p, n, s, len); krb5_principal_set_component(context, p, n, s, len);
n++; n++;
} }
p->ncomp = n; num_components(p) = n;
} }
@@ -277,12 +356,20 @@ build_principal(krb5_context context,
p = calloc(1, sizeof(*p)); p = calloc(1, sizeof(*p));
if (p == NULL) if (p == NULL)
return ENOMEM; return ENOMEM;
p->type = KRB5_NT_PRINCIPAL; princ_type(p) = KRB5_NT_PRINCIPAL;
#ifdef USE_ASN1_PRINCIPAL
p->realm = strdup(realm);
if(p->realm == NULL){
free(p);
return ENOMEM;
}
#else
if(krb5_data_copy(&p->realm, (void*)realm, rlen)){ if(krb5_data_copy(&p->realm, (void*)realm, rlen)){
free(p); free(p);
return ENOMEM; return ENOMEM;
} }
#endif
(*func)(context, p, ap); (*func)(context, p, ap);
*principal = p; *principal = p;
@@ -337,7 +424,11 @@ krb5_copy_principal(krb5_context context,
p = calloc(1, sizeof(*p)); p = calloc(1, sizeof(*p));
if (p == NULL) if (p == NULL)
return ENOMEM; return ENOMEM;
p->type = inprinc->type; #ifdef USE_ASN1_PRINCIPAL
copy_PrincipalName(&inprinc->name, &p->name);
copy_Realm(&inprinc->realm, &p->realm);
#else
princ_type(p) = princ_type(inprinc);
if(krb5_data_copy(&p->realm, inprinc->realm.data, inprinc->realm.length)){ if(krb5_data_copy(&p->realm, inprinc->realm.data, inprinc->realm.length)){
krb5_free_principal(context, p); krb5_free_principal(context, p);
return ENOMEM; return ENOMEM;
@@ -357,6 +448,7 @@ krb5_copy_principal(krb5_context context,
} }
p->ncomp = i+1; p->ncomp = i+1;
} }
#endif
*outprinc = p; *outprinc = p;
return 0; return 0;
} }
@@ -370,14 +462,20 @@ krb5_principal_compare(krb5_context context,
int i; int i;
if(!krb5_realm_compare(context, princ1, princ2)) if(!krb5_realm_compare(context, princ1, princ2))
return FALSE; return FALSE;
if(princ1->ncomp != princ2->ncomp) if(num_components(princ1) != num_components(princ2))
return FALSE; return FALSE;
for(i=0; i<princ1->ncomp; i++){ for(i = 0; i < num_components(princ1); i++){
#ifdef USE_ASN1_PRINCIPAL
if(strcmp(princ1->name.name_string.val[i],
princ2->name.name_string.val[i]) != 0)
return FALSE;
#else
if(princ1->comp[i].length != princ2->comp[i].length) if(princ1->comp[i].length != princ2->comp[i].length)
return FALSE; return FALSE;
if(memcmp(princ1->comp[i].data, princ2->comp[i].data, if(memcmp(princ1->comp[i].data, princ2->comp[i].data,
princ1->comp[i].length)) princ1->comp[i].length))
return FALSE; return FALSE;
#endif
} }
return TRUE; return TRUE;
} }
@@ -388,11 +486,15 @@ krb5_realm_compare(krb5_context context,
krb5_const_principal princ1, krb5_const_principal princ1,
krb5_const_principal princ2) krb5_const_principal princ2)
{ {
#ifdef USE_ASN1_PRINCIPAL
return strcmp(princ1->realm, princ2->realm) == 0;
#else
if(princ1->realm.length != princ2->realm.length) if(princ1->realm.length != princ2->realm.length)
return FALSE; return FALSE;
if(memcmp(princ1->realm.data, princ2->realm.data, princ1->realm.length)) if(memcmp(princ1->realm.data, princ2->realm.data, princ1->realm.length))
return FALSE; return FALSE;
return TRUE; return TRUE;
#endif
} }

View File

@@ -44,7 +44,7 @@ send_and_recv (int fd,
krb5_error_code krb5_error_code
krb5_sendto_kdc (krb5_context context, krb5_sendto_kdc (krb5_context context,
const krb5_data *send, const krb5_data *send,
const krb5_data *realm, const krb5_realm *realm,
krb5_data *receive) krb5_data *receive)
{ {
krb5_error_code err; krb5_error_code err;

View File

@@ -144,6 +144,34 @@ krb5_ret_data(krb5_storage *sp,
return 0; return 0;
} }
krb5_error_code
krb5_store_string(krb5_storage *sp,
char *s)
{
krb5_data data;
data.length = strlen(s);
data.data = s;
return krb5_store_data(sp, data);
}
krb5_error_code
krb5_ret_string(krb5_storage *sp,
char **string)
{
int ret;
krb5_data data;
ret = krb5_ret_data(sp, &data);
if(ret)
return ret;
*string = realloc(data.data, data.length + 1);
if(*string == NULL){
free(data.data);
return ENOMEM;
}
(*string)[data.length] = 0;
return 0;
}
krb5_error_code krb5_error_code
krb5_store_principal(krb5_storage *sp, krb5_store_principal(krb5_storage *sp,
@@ -151,6 +179,18 @@ krb5_store_principal(krb5_storage *sp,
{ {
int i; int i;
int ret; int ret;
#ifdef USE_ASN1_PRINCIPAL
ret = krb5_store_int32(sp, p->name.name_type);
if(ret) return ret;
ret = krb5_store_int32(sp, p->name.name_string.len);
if(ret) return ret;
ret = krb5_store_string(sp, p->realm);
if(ret) return ret;
for(i = 0; i < p->name.name_string.len; i++){
ret = krb5_store_string(sp, p->name.name_string.val[i]);
if(ret) return ret;
}
#else
ret = krb5_store_int32(sp, p->type); ret = krb5_store_int32(sp, p->type);
if(ret) return ret; if(ret) return ret;
ret = krb5_store_int32(sp, p->ncomp); ret = krb5_store_int32(sp, p->ncomp);
@@ -161,6 +201,7 @@ krb5_store_principal(krb5_storage *sp,
ret = krb5_store_data(sp, p->comp[i]); ret = krb5_store_data(sp, p->comp[i]);
if(ret) return ret; if(ret) return ret;
} }
#endif
return 0; return 0;
} }
@@ -171,15 +212,34 @@ krb5_ret_principal(krb5_storage *sp,
int i; int i;
int ret; int ret;
krb5_principal p; krb5_principal p;
int32_t type;
int32_t ncomp;
p = ALLOC(1, krb5_principal_data); p = calloc(1, sizeof(*p));
if(p == NULL) if(p == NULL)
return ENOMEM; return ENOMEM;
if((ret = krb5_ret_int32(sp, &p->type))) if((ret = krb5_ret_int32(sp, &type)))
return ret; return ret;
ret = krb5_ret_int32(sp, &p->ncomp); if((ret = krb5_ret_int32(sp, &ncomp)))
return ret;
#ifdef USE_ASN1_PRINCIPAL
p->name.name_type = type;
p->name.name_string.len = ncomp;
ret = krb5_ret_string(sp, &p->realm);
if(ret) return ret; if(ret) return ret;
p->name.name_string.val = calloc(ncomp, sizeof(*p->name.name_string.val));
if(p->name.name_string.val == NULL){
free(p->realm);
return ENOMEM;
}
for(i = 0; i < ncomp; i++){
ret = krb5_ret_string(sp, &p->name.name_string.val[i]);
if(ret) return ret; /* XXX */
}
#else
p->type = type;
p->ncomp = ncomp;
ret = krb5_ret_data(sp, &p->realm); ret = krb5_ret_data(sp, &p->realm);
if(ret) return ret; if(ret) return ret;
p->comp = ALLOC(p->ncomp, krb5_data); p->comp = ALLOC(p->ncomp, krb5_data);
@@ -190,6 +250,7 @@ krb5_ret_principal(krb5_storage *sp,
ret = krb5_ret_data(sp, &p->comp[i]); ret = krb5_ret_data(sp, &p->comp[i]);
if(ret) return ret; if(ret) return ret;
} }
#endif
*princ = p; *princ = p;
return 0; return 0;
} }
@@ -200,7 +261,7 @@ krb5_store_keyblock(krb5_storage *sp, krb5_keyblock p)
int ret; int ret;
ret =krb5_store_int32(sp, p.keytype); ret =krb5_store_int32(sp, p.keytype);
if(ret) return ret; if(ret) return ret;
ret = krb5_store_data(sp, p.contents); ret = krb5_store_data(sp, p.keyvalue);
return ret; return ret;
} }
@@ -210,7 +271,7 @@ krb5_ret_keyblock(krb5_storage *sp, krb5_keyblock *p)
int ret; int ret;
ret = krb5_ret_int32(sp, (int32_t*)&p->keytype); /* keytype + etype */ ret = krb5_ret_int32(sp, (int32_t*)&p->keytype); /* keytype + etype */
if(ret) return ret; if(ret) return ret;
ret = krb5_ret_data(sp, &p->contents); ret = krb5_ret_data(sp, &p->keyvalue);
return ret; return ret;
} }

View File

@@ -107,7 +107,7 @@ krb5_string_to_key (char *str,
p = s = malloc (len); p = s = malloc (len);
if (p == NULL) if (p == NULL)
return ENOMEM; return ENOMEM;
err = krb5_data_alloc (&key->contents, sizeof(des_cblock)); err = krb5_data_alloc (&key->keyvalue, sizeof(des_cblock));
if (err) { if (err) {
free (p); free (p);
return err; return err;
@@ -138,9 +138,9 @@ krb5_string_to_key (char *str,
des_set_odd_parity (&tempkey); des_set_odd_parity (&tempkey);
if (des_is_weak_key (&tempkey)) if (des_is_weak_key (&tempkey))
xor ((unsigned char *)&tempkey, (unsigned char*)"0x000x000x000x000x000x000x000xF0"); xor ((unsigned char *)&tempkey, (unsigned char*)"0x000x000x000x000x000x000x000xF0");
memcpy (key->contents.data, &tempkey, sizeof(tempkey)); memcpy (key->keyvalue.data, &tempkey, sizeof(tempkey));
key->keytype = KEYTYPE_DES; key->keytype = KEYTYPE_DES;
key->contents.length = sizeof(tempkey); key->keyvalue.length = sizeof(tempkey);
return 0; return 0;
} }
@@ -153,19 +153,31 @@ krb5_get_salt (krb5_principal princ,
krb5_error_code err; krb5_error_code err;
char *p; char *p;
#ifdef USE_ASN1_PRINCIPAL
len = strlen(princ->realm);
for (i = 0; i < princ->name.name_string.len; ++i)
len += strlen(princ->name.name_string.val[i]);
#else
len = princ->realm.length; len = princ->realm.length;
for (i = 0; i < princ->ncomp; ++i) for (i = 0; i < princ->ncomp; ++i)
len += princ->comp[i].length; len += princ->comp[i].length;
#endif
err = krb5_data_alloc (salt, len); err = krb5_data_alloc (salt, len);
if (err) if (err)
return err; return err;
p = salt->data; p = salt->data;
#ifdef USE_ASN1_PRINCIPAL
strcpy (p, princ->realm);
for (i = 0; i < princ->name.name_string.len; ++i)
strcat (p, princ->name.name_string.val[i]);
#else
strncpy (p, princ->realm.data, princ->realm.length); strncpy (p, princ->realm.data, princ->realm.length);
p += princ->realm.length; p += princ->realm.length;
for (i = 0; i < princ->ncomp; ++i) { for (i = 0; i < princ->ncomp; ++i) {
strncpy (p, princ->comp[i].data, princ->comp[i].length); strcat (p, princ->comp[i].data, princ->comp[i].length);
p += princ->comp[i].length; p += princ->comp[i].length;
} }
#endif
return 0; return 0;
} }