libsec: x509: convert to UTF8 from BMPString and UNIString, reject \0 bytes
This commit is contained in:
parent
8fd1aa2626
commit
9e08127ba6
|
@ -478,6 +478,7 @@ value_decode(uchar** pp, uchar* pend, int length, int kind, int isconstr, Value*
|
||||||
pval->u.setval = vl;
|
pval->u.setval = vl;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UTF8String:
|
case UTF8String:
|
||||||
case NumericString:
|
case NumericString:
|
||||||
case PrintableString:
|
case PrintableString:
|
||||||
|
@ -491,13 +492,64 @@ value_decode(uchar** pp, uchar* pend, int length, int kind, int isconstr, Value*
|
||||||
case GeneralString:
|
case GeneralString:
|
||||||
case UniversalString:
|
case UniversalString:
|
||||||
case BMPString:
|
case BMPString:
|
||||||
/* TODO: figure out when character set conversion is necessary */
|
|
||||||
err = octet_decode(&p, pend, length, isconstr, &va);
|
err = octet_decode(&p, pend, length, isconstr, &va);
|
||||||
if(err == ASN_OK) {
|
if(err == ASN_OK) {
|
||||||
pval->tag = VString;
|
uchar *s;
|
||||||
pval->u.stringval = (char*)emalloc(va->len+1);
|
char *d;
|
||||||
memmove(pval->u.stringval, va->data, va->len);
|
Rune r;
|
||||||
pval->u.stringval[va->len] = 0;
|
int n;
|
||||||
|
|
||||||
|
switch(kind){
|
||||||
|
case UniversalString:
|
||||||
|
n = va->len / 4;
|
||||||
|
d = emalloc(n*UTFmax+1);
|
||||||
|
pval->u.stringval = d;
|
||||||
|
s = va->data;
|
||||||
|
while(n > 0){
|
||||||
|
r = s[0]<<24 | s[1]<<16 | s[2]<<8 | s[3];
|
||||||
|
if(r == 0)
|
||||||
|
break;
|
||||||
|
n--;
|
||||||
|
s += 4;
|
||||||
|
d += runetochar(d, &r);
|
||||||
|
}
|
||||||
|
*d = 0;
|
||||||
|
break;
|
||||||
|
case BMPString:
|
||||||
|
n = va->len / 2;
|
||||||
|
d = emalloc(n*UTFmax+1);
|
||||||
|
pval->u.stringval = d;
|
||||||
|
s = va->data;
|
||||||
|
while(n > 0){
|
||||||
|
r = s[0]<<8 | s[1];
|
||||||
|
if(r == 0)
|
||||||
|
break;
|
||||||
|
n--;
|
||||||
|
s += 2;
|
||||||
|
d += runetochar(d, &r);
|
||||||
|
}
|
||||||
|
*d = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
n = va->len;
|
||||||
|
d = emalloc(n+1);
|
||||||
|
pval->u.stringval = d;
|
||||||
|
s = va->data;
|
||||||
|
while(n > 0){
|
||||||
|
if((*d = *s) == 0)
|
||||||
|
break;
|
||||||
|
n--;
|
||||||
|
s++;
|
||||||
|
d++;
|
||||||
|
}
|
||||||
|
*d = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(n != 0){
|
||||||
|
err = ASN_EINVAL;
|
||||||
|
free(pval->u.stringval);
|
||||||
|
} else
|
||||||
|
pval->tag = VString;
|
||||||
free(va);
|
free(va);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue