#include #include "utility.h" #include #include char hexchar PROTOTYPE((const unsigned int digit)); asn1_error_code asn1_krb5_data_unparse(DECLARG(const krb5_data *, code), DECLARG(char **, s)) OLDDECLARG(const krb5_data *, code) OLDDECLARG(char **, s) { if(*s != NULL) free(*s); if(code==NULL){ *s = (char*)calloc(strlen("")+1, sizeof(char)); if(*s == NULL) return ENOMEM; strcpy(*s,""); }else if(code->data == NULL || code->length <= 0){ *s = (char*)calloc(strlen("")+1, sizeof(char)); if(*s==NULL) return ENOMEM; strcpy(*s,""); }else{ int i; *s = (char*)calloc(3*(code->length), sizeof(char)); if(*s == NULL) return ENOMEM; for(i = 0; i < code->length; i++){ (*s)[3*i] = hexchar(((code->data)[i]&0xF0)>>4); (*s)[3*i+1] = hexchar((code->data)[i]&0x0F); (*s)[3*i+2] = ' '; } (*s)[3*(code->length)-1] = '\0'; } return 0; } char hexchar(DECLARG(const unsigned int , digit)) OLDDECLARG(const unsigned int , digit) { if(digit<=9) return '0'+digit; else if(digit<=15) return 'A'+digit-10; else return 'X'; } krb5_error_code krb5_data_parse(DECLARG(krb5_data *, d), DECLARG(const char *, s)) OLDDECLARG(krb5_data *, d) OLDDECLARG(const char *, s) { /*if(d->data != NULL){ free(d->data); d->length = 0; }*/ d->data = (char*)calloc(strlen(s),sizeof(char)); if(d->data == NULL) return ENOMEM; d->length = strlen(s); memcpy(d->data,s,strlen(s)); return 0; } krb5_error_code krb5_data_hex_parse(DECLARG(krb5_data *, d), DECLARG(const char *, s)) OLDDECLARG(krb5_data *, d) OLDDECLARG(const char *, s) { int i, digit; char *pos; d->data = (char*)calloc((strlen(s)+1)/3,sizeof(char)); if(d->data == NULL) return ENOMEM; d->length = (strlen(s)+1)/3; for(i=0,pos=(char*)s; ilength; i++,pos+=3){ if(!sscanf(pos,"%x",&digit)) return ASN1_PARSE_ERROR; d->data[i] = (char)digit; } return 0; } void asn1buf_print(DECLARG(const asn1buf *, buf)) OLDDECLARG(const asn1buf *, buf) { asn1buf bufcopy; char *s=NULL; int length; int i; bufcopy.base = bufcopy.next = buf->next; bufcopy.bound = buf->bound; length = asn1buf_len(&bufcopy); s = calloc(3*length, sizeof(char)); if(s == NULL) return; for(i=0; i>4); s[3*i+1] = hexchar((bufcopy.base)[i]&0x0F); s[3*i+2] = ' '; } s[3*length-1] = '\0'; printf("%s\n",s); free(s); }