diff --git a/has_json.c b/has_json.c index 1f1cba1..8c37272 100644 --- a/has_json.c +++ b/has_json.c @@ -228,12 +228,13 @@ int has_json_string_decode(char *input, size_t length, } else { if(c == '"') c = '\"'; else if(c == '\\') c = '\\'; + else if(c == '\'') c = '\''; else if(c == 'b') c = '\b'; else if(c == 'f') c = '\f'; else if(c == 'n') c = '\n'; else if(c == 'r') c = '\r'; else if(c == 't') c = '\t'; - else return -1; + else n[written++] = '\\'; /* keep backslash for the other caracters */ processed += 2; n[written++] = c; } @@ -459,8 +460,23 @@ int has_json_string_encode(has_json_serializer_t *s, l = 6; } else if(c > 0x80) { int32_t codepoint = 0; - if(((m = decode_utf8(input + stop, length - stop, &codepoint)) < 0) || - ((l = has_json_encode_unicode(codepoint, unicode)) < 0)) { + + m = decode_utf8(input + stop, length - stop, &codepoint); + if (m < 0) { + /* UTF8 decoding failed, + * let's consider this caracter as high ASCII MSC caracter + */ + char tmp[2] = {0xC0 | (c >> 6), 0x80 | (c & 0x3F)}; + m = decode_utf8(tmp, 2, &codepoint); + if (m==2) + m = 1; + else + m = -1; + } + + if (m >= 0) + l = has_json_encode_unicode(codepoint, unicode); + if (m < 0 || l < 0) { return -1; } add = unicode; diff --git a/has_x509.c b/has_x509.c index dc8a73f..a9e1079 100644 --- a/has_x509.c +++ b/has_x509.c @@ -6,6 +6,7 @@ #include #include #include +#include static const char *hexdigits = "0123456789ABCDEF"; static void hexdump(char *out, unsigned char *in, size_t l) @@ -213,11 +214,43 @@ has_t *has_x509_extensions(STACK_OF(X509_EXTENSION) *exts) for(i = 0; i < j; i++) { has_t *cur = has_hash_new(4); - X509_EXTENSION *ex = sk_X509_EXTENSION_value(exts, i); + X509_EXTENSION *ex = sk_X509_EXTENSION_value(exts, i); + char *str, *ptr, *cp; + int num; + ASN1_OBJECT *obj = X509_EXTENSION_get_object(ex); has_t *critical = has_int_new(X509_EXTENSION_get_critical(ex) ? 1 : 0); has_hash_set_str(cur, "critical", critical); - has_hash_set_str(cur, "value", has_string_new_str_o(ext_dump(ex), 1)); + str = ext_dump(ex); + + /* get number of tokens */ + ptr = strdup(str); + for (num = 0, cp = strtok (ptr, "\n"); cp; num++) + cp = strtok (NULL, "\n"); + free(ptr); + + if (num == 1) { + /* 'string' has element for the unique token */ + has_hash_set_str(cur, "value", has_string_new_str_o(str, 1)); + } + else { + /* array of 'string' elements for the non-unique tokens */ + has_t *value = has_array_new(num); + ptr = strdup(str); + for (cp = strtok (ptr, "\n"); cp; ) { + char *elem = strdup(cp); + + while(isspace(*elem) || isblank(*elem)) + memcpy(elem, elem+1, strlen(elem)); + while(isspace(*(elem + strlen(elem) - 1)) || isblank(*(elem + strlen(elem) - 1))) + *(elem + strlen(elem) - 1) = '\0'; + has_array_push(value, has_string_new_str_o(elem, 1)); + + cp = strtok (NULL, "\n"); + } + free(ptr); + has_hash_set_str(cur, "value", value); + } has_hash_set_str_o(r, oid2string(obj), cur, 1); } return r; @@ -273,8 +306,12 @@ has_t *has_x509_new(X509 *x509) /* Serial number */ if(r) { ASN1_INTEGER *sn = X509_get_serialNumber(x509); - char *serial = calloc(2 * sn->length + 1, 1); - hexdump(serial, sn->data, sn->length); + char *serial = calloc(2 * sn->length + 2, 1); + + *serial = '-'; + hexdump(serial + ((sn->type & V_ASN1_NEG) ? 1 : 0), sn->data, sn->length); + while(*serial == '0' && strlen(serial) > 0) + memcpy(serial, serial+1, strlen(serial)); r = has_hash_set_str(crt, "serial", has_string_new_str_o(serial, 1)); } diff --git a/tests/test_json.c b/tests/test_json.c index c691bc4..730e988 100644 --- a/tests/test_json.c +++ b/tests/test_json.c @@ -18,7 +18,9 @@ int main(int argc, char **argv) "\"delta\": { " "\"echo\": 1.0," "\"foxtrot\": 3.1415," - "\"golf\":\"éé\"" + "\"golf\":\"éé\"," + "\"cn1\":\"'\"," + "\"cn2\":\"\'\"" "}}"; has_t *json1, *json2; char *out1 = NULL, *out2 = NULL;