diff --git a/lib/krb5/asn1_glue.c b/lib/krb5/asn1_glue.c index db07fbedd..c48885d4a 100644 --- a/lib/krb5/asn1_glue.c +++ b/lib/krb5/asn1_glue.c @@ -10,6 +10,9 @@ krb5_error_code krb5_principal2principalname (PrincipalName *p, krb5_principal from) { +#ifdef USE_ASN1_PRINCIPAL + copy_PrincipalName(&from->name, p); +#else int i; p->name_type = from->type; @@ -21,6 +24,7 @@ krb5_principal2principalname (PrincipalName *p, strncpy (p->name_string.val[i], from->comp[i].data, len); p->name_string.val[i][len] = '\0'; } +#endif return 0; } @@ -29,9 +33,12 @@ principalname2krb5_principal (krb5_principal *principal, PrincipalName from, char *realm) { + krb5_principal p = malloc(sizeof(*p)); +#ifdef USE_ASN1_PRINCIPAL + copy_PrincipalName(&from, &p->name); + p->realm = strdup(realm); +#else int i; - krb5_principal p; - p = malloc (sizeof(*p)); p->type = from.name_type; p->ncomp = from.name_string.len; p->comp = malloc (p->ncomp * sizeof(*p->comp)); @@ -42,6 +49,7 @@ principalname2krb5_principal (krb5_principal *principal, } p->realm.data = strdup(realm); p->realm.length = strlen(realm); +#endif *principal = p; return 0; } diff --git a/lib/krb5/build_ap_req.c b/lib/krb5/build_ap_req.c index 9a59d592b..febd48897 100644 --- a/lib/krb5/build_ap_req.c +++ b/lib/krb5/build_ap_req.c @@ -11,37 +11,37 @@ krb5_build_ap_req (krb5_context context, { AP_REQ ap; Ticket t; - unsigned char buf[1024]; - int len; - + ap.pvno = 5; ap.msg_type = krb_ap_req; memset(&ap.ap_options, 0, sizeof(ap.ap_options)); - if (ap_options & AP_OPTS_USE_SESSION_KEY) - ap.ap_options.use_session_key = 1; - if (ap_options & AP_OPTS_MUTUAL_REQUIRED) - ap.ap_options.mutual_required = 1; + ap.ap_options.use_session_key = (ap_options & AP_OPTS_USE_SESSION_KEY) > 0; + ap.ap_options.mutual_required = (ap_options & AP_OPTS_MUTUAL_REQUIRED) > 0; 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); strncpy(ap.ticket.realm, cred->server->realm.data, cred->server->realm.length); ap.ticket.realm[cred->server->realm.length] = '\0'; krb5_principal2principalname(&ap.ticket.sname, cred->server); +#endif decode_Ticket(cred->ticket.data, cred->ticket.length, &t); - - ap.ticket.enc_part = t.enc_part; + copy_EncryptedData(&t.enc_part, &ap.ticket.enc_part); + free_Ticket(&t); ap.authenticator.etype = ap.ticket.enc_part.etype; ap.authenticator.kvno = NULL; ap.authenticator.cipher = authenticator; - ret->length = encode_AP_REQ(buf + sizeof(buf) - 1, sizeof(buf), &ap); - free (ap.ticket.realm); - + ret->length = length_AP_REQ(&ap); 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; } diff --git a/lib/krb5/build_auth.c b/lib/krb5/build_auth.c index 475ee80b7..619b60f6a 100644 --- a/lib/krb5/build_auth.c +++ b/lib/krb5/build_auth.c @@ -18,10 +18,15 @@ krb5_build_authenticator (krb5_context context, int32_t seq_number; 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); strncpy(auth->crealm, cred->client->realm.data, cred->client->realm.length); auth->crealm[cred->client->realm.length] = '\0'; krb5_principal2principalname(&auth->cname, cred->client); +#endif gettimeofday(&tv, NULL); auth->cusec = tv.tv_usec; diff --git a/lib/krb5/get_cred.c b/lib/krb5/get_cred.c index 68513a55a..215abd5d8 100644 --- a/lib/krb5/get_cred.c +++ b/lib/krb5/get_cred.c @@ -94,6 +94,11 @@ krb5_get_credentials (krb5_context context, */ /* 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); strncpy (a.req_body.realm, in_creds->server->realm.data, 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)); krb5_principal2principalname(a.req_body.sname, in_creds->server); +#endif a.req_body.from = NULL; a.req_body.till = in_creds->times.endtime; a.req_body.rtime = NULL; diff --git a/lib/krb5/keytab.c b/lib/krb5/keytab.c index 858f0a0a6..05d74b032 100644 --- a/lib/krb5/keytab.c +++ b/lib/krb5/keytab.c @@ -65,10 +65,10 @@ krb5_kt_read_service_key(krb5_context context, return r; *key = malloc(sizeof(**key)); (*key)->keytype = entry.keyblock.keytype; - (*key)->contents.length = 0; - (*key)->contents.data = NULL; - krb5_data_copy(&(*key)->contents, entry.keyblock.contents.data, - entry.keyblock.contents.length); + (*key)->keyvalue.length = 0; + (*key)->keyvalue.data = NULL; + krb5_data_copy(&(*key)->keyvalue, entry.keyblock.keyvalue.data, + entry.keyblock.keyvalue.length); krb5_kt_close (context, keytab); return r; @@ -172,6 +172,22 @@ krb5_kt_ret_data(krb5_storage *sp, 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 krb5_kt_ret_principal(krb5_storage *sp, krb5_principal *princ) @@ -186,12 +202,27 @@ krb5_kt_ret_principal(krb5_storage *sp, return ENOMEM; - p->type = KRB5_NT_SRV_HST; ret = krb5_ret_int16(sp, &tmp); if(ret) return ret; - p->ncomp = tmp; - ret = krb5_kt_ret_data(sp, &p->realm); +#ifdef USE_ASN1_PRINCIPAL + 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; + 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); if(p->comp == NULL){ return ENOMEM; @@ -200,6 +231,7 @@ krb5_kt_ret_principal(krb5_storage *sp, ret = krb5_kt_ret_data(sp, &p->comp[i]); if(ret) return ret; } +#endif *princ = p; return 0; } @@ -213,7 +245,7 @@ krb5_kt_ret_keyblock(krb5_storage *sp, krb5_keyblock *p) ret = krb5_ret_int16(sp, &tmp); /* keytype + etype */ if(ret) return ret; p->keytype = tmp; - ret = krb5_kt_ret_data(sp, &p->contents); + ret = krb5_kt_ret_data(sp, &p->keyvalue); return ret; } @@ -234,6 +266,24 @@ krb5_kt_store_data(krb5_storage *sp, 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 krb5_kt_store_keyblock(krb5_storage *sp, krb5_keyblock *p) @@ -242,7 +292,7 @@ krb5_kt_store_keyblock(krb5_storage *sp, ret = krb5_store_int16(sp, p->keytype); /* keytype + etype */ if(ret) return ret; - ret = krb5_kt_store_data(sp, p->contents); + ret = krb5_kt_store_data(sp, p->keyvalue); return ret; } @@ -255,14 +305,25 @@ krb5_kt_store_principal(krb5_storage *sp, int ret; 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); if(ret) return ret; - ret = krb5_kt_store_data(sp, p->realm); + ret = krb5_kt_store_string(sp, p->realm); if(ret) return ret; for(i = 0; i < p->ncomp; i++){ ret = krb5_kt_store_data(sp, p->comp[i]); if(ret) return ret; } +#endif return 0; } @@ -292,7 +353,11 @@ krb5_kt_add_entry(krb5_context context, if (ret) return ret; ret = krb5_kt_store_principal (sp, entry->principal); 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); +#endif if (ret) return ret; ret = krb5_store_int32 (sp, time(NULL)); if (ret) return ret; @@ -322,7 +387,11 @@ krb5_kt_next_entry(krb5_context context, ret = krb5_kt_ret_principal (cursor->sp, &entry->principal); if (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); +#endif if (ret) return ret; ret = krb5_ret_int32(cursor->sp, ×tamp); diff --git a/lib/krb5/krb5_locl.h b/lib/krb5/krb5_locl.h index 5cf4c447b..ab031cef3 100644 --- a/lib/krb5/krb5_locl.h +++ b/lib/krb5/krb5_locl.h @@ -55,7 +55,7 @@ krb5_getportbyname (const char *service, krb5_error_code krb5_sendto_kdc (krb5_context context, const krb5_data *send, - const krb5_data *realm, + const krb5_realm *realm, krb5_data *receive); krb5_error_code diff --git a/lib/krb5/mk_error.c b/lib/krb5/mk_error.c index c1b6a771f..f73389fc2 100644 --- a/lib/krb5/mk_error.c +++ b/lib/krb5/mk_error.c @@ -17,7 +17,11 @@ krb5_mk_error(krb5_principal princ, msg.msg_type = krb_error; msg.stime = time(0); msg.error_code = error_code; +#ifdef USE_ASN1_PRINCIPAL + msg.realm = princ->realm; +#else msg.realm = princ->realm.data; +#endif krb5_principal2principalname(&msg.sname, princ); if (e_text) msg.e_text = &e_text; diff --git a/lib/krb5/principal.c b/lib/krb5/principal.c index be7004528..21095bd08 100644 --- a/lib/krb5/principal.c +++ b/lib/krb5/principal.c @@ -4,15 +4,27 @@ RCSID("$Id$"); /* 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 krb5_free_principal(krb5_context context, krb5_principal p) { +#ifdef USE_ASN1_PRINCIPAL + free_Principal(p); +#else int i; - for(i = 0; i < p->ncomp; i++) + for(i = 0; i < num_components(p); i++) krb5_data_free(&p->comp[i]); free(p->comp); krb5_data_free(&p->realm); +#endif free(p); } @@ -22,9 +34,14 @@ krb5_parse_name(krb5_context context, krb5_principal *principal) { +#ifdef USE_ASN1_PRINCIPAL + general_string *comp; + general_string realm; +#else krb5_data *comp; - int ncomp; krb5_data realm; +#endif + int ncomp; char *p; char *q; @@ -45,7 +62,11 @@ krb5_parse_name(krb5_context context, } else if(*p == '/') ncomp++; } +#ifdef USE_ASN1_PRINCIPAL + comp = calloc(ncomp, sizeof(*comp)); +#else comp = ALLOC(ncomp, krb5_data); +#endif n = 0; start = q = p = s = strdup(name); @@ -63,15 +84,27 @@ krb5_parse_name(krb5_context context, c = '\0'; }else if(c == '/' || c == '@'){ if(got_realm){ - while(n>0) + exit: + while(n>0){ +#ifdef USE_ASN1_PRINCIPAL + free(comp[--n]); +#else free(comp[--n].data); +#endif + } free(comp); free(s); return KRB5_PARSE_MALFORMED; }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].data = (krb5_pointer)malloc(comp[n].length); memmove(comp[n].data, start, comp[n].length); +#endif n++; } if(c == '@') @@ -79,30 +112,42 @@ krb5_parse_name(krb5_context context, start = q; continue; } - if(got_realm && (c == ':' || c == '/' || c == '\0')){ - while(n>0) - free(comp[--n].data); - free(comp); - free(s); - return KRB5_PARSE_MALFORMED; - } + if(got_realm && (c == ':' || c == '/' || c == '\0')) + goto exit; *q++ = c; } 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.data = (krb5_pointer)malloc(realm.length); memmove(realm.data, start, realm.length); +#endif }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].data = (krb5_pointer)malloc(comp[n].length); memmove(comp[n].data, start, comp[n].length); +#endif 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)->realm = realm; (*principal)->comp = comp; - (*principal)->ncomp = n; +#endif + num_components(*principal) = n; + (*principal)->realm = realm; free(s); return 0; } @@ -112,6 +157,9 @@ static void quote_string(char *s, int len, char **out) char *q; char *p = *out; int c=0; +#ifdef USE_ASN1_PRINCIPAL + len = strlen(s); +#endif for(q = s; q < s + len; q++){ if(*q == '\n') c = 'n'; @@ -141,24 +189,40 @@ krb5_unparse_name(krb5_context context, krb5_principal principal, char **name) { - int size = 0; + int size; char *p; char *s; int i; - for(i = 0; i < principal->ncomp; i++) - size += 2*principal->comp[i].length + 1; - size += 2*principal->realm.length + 1; - s = ALLOC(size, char); + int ncomp = num_components(principal); +#ifdef USE_ASN1_PRINCIPAL + size = 2 * strlen(principal->realm) + 1; + 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; - for(i = 0; i < principal->ncomp; i++){ + for(i = 0; i < ncomp; i++){ 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++ = '@'; +#ifdef USE_ASN1_PRINCIPAL + quote_string(principal->realm, 0, &p); +#else quote_string(principal->realm.data, principal->realm.length, &p); +#endif *p = 0; - *name = strdup(s); - free(s); + *name = s; return 0; } @@ -174,7 +238,7 @@ krb5_unparse_name_ext(krb5_context context, } -krb5_data* +krb5_realm* krb5_princ_realm(krb5_context context, krb5_principal principal) { @@ -185,7 +249,7 @@ krb5_princ_realm(krb5_context context, void krb5_princ_set_realm(krb5_context context, krb5_principal principal, - krb5_data *realm) + krb5_realm *realm) { principal->realm = *realm; } @@ -210,21 +274,36 @@ krb5_error_code krb5_principal_set_component(krb5_context context, krb5_principal p, int n, void *data, size_t len) { - krb5_data *tmp; - if(p->ncomp <= n){ +#ifdef USE_ASN1_PRINCIPAL + general_string *tmp = p->name.name_string.val; +#else + krb5_data *tmp = p->comp; +#endif + if(num_components(p) <= n){ int s = n + 10; - if(p->comp) - tmp = (krb5_data*)realloc(p->comp, s * sizeof(krb5_data)); - else - tmp = ALLOC(s, krb5_data); + tmp = realloc(tmp, s * sizeof(*tmp)); if(!tmp) 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->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].data = NULL; krb5_data_copy(&p->comp[n], data, len); +#endif 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); n++; } - p->ncomp = n; + num_components(p) = n; } 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); n++; } - p->ncomp = n; + num_components(p) = n; } @@ -277,12 +356,20 @@ build_principal(krb5_context context, p = calloc(1, sizeof(*p)); if (p == NULL) 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)){ free(p); return ENOMEM; } +#endif (*func)(context, p, ap); *principal = p; @@ -337,7 +424,11 @@ krb5_copy_principal(krb5_context context, p = calloc(1, sizeof(*p)); if (p == NULL) 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)){ krb5_free_principal(context, p); return ENOMEM; @@ -357,6 +448,7 @@ krb5_copy_principal(krb5_context context, } p->ncomp = i+1; } +#endif *outprinc = p; return 0; } @@ -370,14 +462,20 @@ krb5_principal_compare(krb5_context context, int i; if(!krb5_realm_compare(context, princ1, princ2)) return FALSE; - if(princ1->ncomp != princ2->ncomp) + if(num_components(princ1) != num_components(princ2)) return FALSE; - for(i=0; incomp; 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) return FALSE; if(memcmp(princ1->comp[i].data, princ2->comp[i].data, princ1->comp[i].length)) return FALSE; +#endif } return TRUE; } @@ -388,11 +486,15 @@ krb5_realm_compare(krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2) { +#ifdef USE_ASN1_PRINCIPAL + return strcmp(princ1->realm, princ2->realm) == 0; +#else if(princ1->realm.length != princ2->realm.length) return FALSE; if(memcmp(princ1->realm.data, princ2->realm.data, princ1->realm.length)) return FALSE; return TRUE; +#endif } diff --git a/lib/krb5/send_to_kdc.c b/lib/krb5/send_to_kdc.c index e7f8b7155..5a1a68791 100644 --- a/lib/krb5/send_to_kdc.c +++ b/lib/krb5/send_to_kdc.c @@ -44,7 +44,7 @@ send_and_recv (int fd, krb5_error_code krb5_sendto_kdc (krb5_context context, const krb5_data *send, - const krb5_data *realm, + const krb5_realm *realm, krb5_data *receive) { krb5_error_code err; diff --git a/lib/krb5/store.c b/lib/krb5/store.c index cbee3a0fa..ee891b2cb 100644 --- a/lib/krb5/store.c +++ b/lib/krb5/store.c @@ -144,6 +144,34 @@ krb5_ret_data(krb5_storage *sp, 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_store_principal(krb5_storage *sp, @@ -151,6 +179,18 @@ krb5_store_principal(krb5_storage *sp, { int i; 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); if(ret) return ret; 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]); if(ret) return ret; } +#endif return 0; } @@ -171,15 +212,34 @@ krb5_ret_principal(krb5_storage *sp, int i; int ret; krb5_principal p; - - p = ALLOC(1, krb5_principal_data); + int32_t type; + int32_t ncomp; + + p = calloc(1, sizeof(*p)); if(p == NULL) return ENOMEM; - if((ret = krb5_ret_int32(sp, &p->type))) + if((ret = krb5_ret_int32(sp, &type))) 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; + 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); if(ret) return ret; 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]); if(ret) return ret; } +#endif *princ = p; return 0; } @@ -200,7 +261,7 @@ krb5_store_keyblock(krb5_storage *sp, krb5_keyblock p) int ret; ret =krb5_store_int32(sp, p.keytype); if(ret) return ret; - ret = krb5_store_data(sp, p.contents); + ret = krb5_store_data(sp, p.keyvalue); return ret; } @@ -210,7 +271,7 @@ krb5_ret_keyblock(krb5_storage *sp, krb5_keyblock *p) int ret; ret = krb5_ret_int32(sp, (int32_t*)&p->keytype); /* keytype + etype */ if(ret) return ret; - ret = krb5_ret_data(sp, &p->contents); + ret = krb5_ret_data(sp, &p->keyvalue); return ret; } diff --git a/lib/krb5/str2key.c b/lib/krb5/str2key.c index 17b90c20b..cc3aa99f5 100644 --- a/lib/krb5/str2key.c +++ b/lib/krb5/str2key.c @@ -107,7 +107,7 @@ krb5_string_to_key (char *str, p = s = malloc (len); if (p == NULL) return ENOMEM; - err = krb5_data_alloc (&key->contents, sizeof(des_cblock)); + err = krb5_data_alloc (&key->keyvalue, sizeof(des_cblock)); if (err) { free (p); return err; @@ -138,9 +138,9 @@ krb5_string_to_key (char *str, des_set_odd_parity (&tempkey); if (des_is_weak_key (&tempkey)) 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->contents.length = sizeof(tempkey); + key->keyvalue.length = sizeof(tempkey); return 0; } @@ -153,19 +153,31 @@ krb5_get_salt (krb5_principal princ, krb5_error_code err; 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; for (i = 0; i < princ->ncomp; ++i) len += princ->comp[i].length; +#endif err = krb5_data_alloc (salt, len); if (err) return err; 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); p += princ->realm.length; 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; } +#endif return 0; }