make printablestring and ia5string octetstrings
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
|
||||
#include "hx_locl.h"
|
||||
#include <wind.h>
|
||||
#include "char_map.h"
|
||||
|
||||
/**
|
||||
* @page page_name PKIX/X.509 Names
|
||||
@@ -79,11 +80,11 @@ static const struct {
|
||||
};
|
||||
|
||||
static char *
|
||||
quote_string(const char *f, size_t len, size_t *rlen)
|
||||
quote_string(const char *f, size_t len, int flags, size_t *rlen)
|
||||
{
|
||||
size_t i, j, tolen;
|
||||
const char *from = f;
|
||||
char *to;
|
||||
const unsigned char *from = (const unsigned char *)f;
|
||||
unsigned char *to;
|
||||
|
||||
tolen = len * 3 + 1;
|
||||
to = malloc(tolen);
|
||||
@@ -91,26 +92,29 @@ quote_string(const char *f, size_t len, size_t *rlen)
|
||||
return NULL;
|
||||
|
||||
for (i = 0, j = 0; i < len; i++) {
|
||||
if (from[i] == ' ' && i + 1 < len)
|
||||
to[j++] = from[i];
|
||||
else if (from[i] == ',' || from[i] == '=' || from[i] == '+' ||
|
||||
from[i] == '<' || from[i] == '>' || from[i] == '#' ||
|
||||
from[i] == ';' || from[i] == ' ')
|
||||
{
|
||||
unsigned char map = char_map[from[i]] & flags;
|
||||
if (i == 0 && (map & Q_RFC2253_QUOTE_FIRST)) {
|
||||
to[j++] = '\\';
|
||||
to[j++] = from[i];
|
||||
} else if (((unsigned char)from[i]) >= 32 && ((unsigned char)from[i]) <= 127) {
|
||||
} else if ((i + 1) == len && (map & Q_RFC2253_QUOTE_LAST)) {
|
||||
|
||||
to[j++] = '\\';
|
||||
to[j++] = from[i];
|
||||
} else {
|
||||
int l = snprintf(&to[j], tolen - j - 1,
|
||||
} else if (map & Q_RFC2253_QUOTE) {
|
||||
to[j++] = '\\';
|
||||
to[j++] = from[i];
|
||||
} else if (map & Q_RFC2253_HEX) {
|
||||
int l = snprintf((char *)&to[j], tolen - j - 1,
|
||||
"#%02x", (unsigned char)from[i]);
|
||||
j += l;
|
||||
} else {
|
||||
to[j++] = from[i];
|
||||
}
|
||||
}
|
||||
to[j] = '\0';
|
||||
assert(j < tolen);
|
||||
*rlen = j;
|
||||
return to;
|
||||
return (char *)to;
|
||||
}
|
||||
|
||||
|
||||
@@ -121,7 +125,7 @@ append_string(char **str, size_t *total_len, const char *ss,
|
||||
char *s, *qs;
|
||||
|
||||
if (quote)
|
||||
qs = quote_string(ss, len, &len);
|
||||
qs = quote_string(ss, len, Q_RFC2253, &len);
|
||||
else
|
||||
qs = rk_UNCONST(ss);
|
||||
|
||||
@@ -203,7 +207,7 @@ _hx509_Name_to_string(const Name *n, char **str)
|
||||
return ENOMEM;
|
||||
|
||||
for (i = n->u.rdnSequence.len - 1 ; i >= 0 ; i--) {
|
||||
int len;
|
||||
size_t len;
|
||||
|
||||
for (j = 0; j < n->u.rdnSequence.val[i].len; j++) {
|
||||
DirectoryString *ds = &n->u.rdnSequence.val[i].val[j].value;
|
||||
@@ -214,13 +218,16 @@ _hx509_Name_to_string(const Name *n, char **str)
|
||||
|
||||
switch(ds->element) {
|
||||
case choice_DirectoryString_ia5String:
|
||||
ss = ds->u.ia5String;
|
||||
ss = ds->u.ia5String.data;
|
||||
len = ds->u.ia5String.length;
|
||||
break;
|
||||
case choice_DirectoryString_printableString:
|
||||
ss = ds->u.printableString;
|
||||
ss = ds->u.printableString.data;
|
||||
len = ds->u.printableString.length;
|
||||
break;
|
||||
case choice_DirectoryString_utf8String:
|
||||
ss = ds->u.utf8String;
|
||||
len = strlen(ss);
|
||||
break;
|
||||
case choice_DirectoryString_bmpString: {
|
||||
const uint16_t *bmp = ds->u.bmpString.data;
|
||||
@@ -240,10 +247,12 @@ _hx509_Name_to_string(const Name *n, char **str)
|
||||
return ret;
|
||||
}
|
||||
ss[k] = '\0';
|
||||
len = k;
|
||||
break;
|
||||
}
|
||||
case choice_DirectoryString_teletexString:
|
||||
ss = ds->u.teletexString;
|
||||
len = strlen(ss);
|
||||
break;
|
||||
case choice_DirectoryString_universalString: {
|
||||
const uint32_t *uni = ds->u.universalString.data;
|
||||
@@ -263,6 +272,7 @@ _hx509_Name_to_string(const Name *n, char **str)
|
||||
return ret;
|
||||
}
|
||||
ss[k] = '\0';
|
||||
len = k;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -272,10 +282,9 @@ _hx509_Name_to_string(const Name *n, char **str)
|
||||
append_string(str, &total_len, oidname, strlen(oidname), 0);
|
||||
free(oidname);
|
||||
append_string(str, &total_len, "=", 1, 0);
|
||||
len = strlen(ss);
|
||||
append_string(str, &total_len, ss, len, 1);
|
||||
if (ds->element == choice_DirectoryString_universalString ||
|
||||
ds->element == choice_DirectoryString_bmpString)
|
||||
if (ds->element == choice_DirectoryString_bmpString ||
|
||||
ds->element == choice_DirectoryString_universalString)
|
||||
{
|
||||
free(ss);
|
||||
}
|
||||
@@ -330,12 +339,12 @@ dsstringprep(const DirectoryString *ds, uint32_t **rname, size_t *rlen)
|
||||
switch(ds->element) {
|
||||
case choice_DirectoryString_ia5String:
|
||||
flags = WIND_PROFILE_LDAP;
|
||||
COPYCHARARRAY(ds, ia5String, len, name);
|
||||
COPYVOIDARRAY(ds, ia5String, len, name);
|
||||
break;
|
||||
case choice_DirectoryString_printableString:
|
||||
flags = WIND_PROFILE_LDAP;
|
||||
flags |= WIND_PROFILE_LDAP_CASE_EXACT_ATTRIBUTE;
|
||||
COPYCHARARRAY(ds, printableString, len, name);
|
||||
COPYVOIDARRAY(ds, printableString, len, name);
|
||||
break;
|
||||
case choice_DirectoryString_teletexString:
|
||||
flags = WIND_PROFILE_LDAP_CASE;
|
||||
@@ -939,12 +948,14 @@ hx509_general_name_unparse(GeneralName *name, char **str)
|
||||
break;
|
||||
}
|
||||
case choice_GeneralName_rfc822Name:
|
||||
strpool = rk_strpoolprintf(strpool, "rfc822Name: %s\n",
|
||||
name->u.rfc822Name);
|
||||
strpool = rk_strpoolprintf(strpool, "rfc822Name: %.*s\n",
|
||||
(int)name->u.rfc822Name.length,
|
||||
(char *)name->u.rfc822Name.data);
|
||||
break;
|
||||
case choice_GeneralName_dNSName:
|
||||
strpool = rk_strpoolprintf(strpool, "dNSName: %s\n",
|
||||
name->u.dNSName);
|
||||
strpool = rk_strpoolprintf(strpool, "dNSName: %.*s\n",
|
||||
(int)name->u.dNSName.length,
|
||||
(char *)name->u.dNSName.data);
|
||||
break;
|
||||
case choice_GeneralName_directoryName: {
|
||||
Name dir;
|
||||
@@ -961,8 +972,9 @@ hx509_general_name_unparse(GeneralName *name, char **str)
|
||||
break;
|
||||
}
|
||||
case choice_GeneralName_uniformResourceIdentifier:
|
||||
strpool = rk_strpoolprintf(strpool, "URI: %s",
|
||||
name->u.uniformResourceIdentifier);
|
||||
strpool = rk_strpoolprintf(strpool, "URI: %.*s",
|
||||
(int)name->u.uniformResourceIdentifier.length,
|
||||
(char *)name->u.uniformResourceIdentifier.data);
|
||||
break;
|
||||
case choice_GeneralName_iPAddress: {
|
||||
unsigned char *a = name->u.iPAddress.data;
|
||||
|
Reference in New Issue
Block a user