goto issuer_dn_error;
node = node->next;
node_str = node->data;
- if (node_str == NULL
- || !(node_str->type == ASN1_PRINTSTRING
- || node_str->type == ASN1_IA5STRING
- || node_str->type == ASN1_T61STRING))
+ if (node_str == NULL || node_str->str == NULL)
goto issuer_dn_error;
- strlcat(buffer, shortname, length);
- strlcat(buffer, "=", length);
- strlcat(buffer, node_str->str, length);
+ switch (node_str->type) {
+ case ASN1_PRINTSTRING:
+ case ASN1_IA5STRING:
+ case ASN1_T61STRING:
+ case ASN1_UTF8STRING:
+ case ASN1_OCTETSTRING:
+ strlcat(buffer, shortname, length);
+ strlcat(buffer, "=", length);
+ strlcat(buffer, node_str->str, length);
+ break;
+ default:
+ SCLogInfo("Unsupported 'string' type:'%d'", node_str->type);
+ goto issuer_dn_error;
+ }
+
if (strcmp(shortname,"CN")==0)
separator = "/";
if (it->next != NULL)
goto subject_dn_error;
node = node->next;
node_str = node->data;
- if (node_str == NULL
- || !(node_str->type == ASN1_PRINTSTRING
- || node_str->type == ASN1_IA5STRING
- || node_str->type == ASN1_T61STRING))
+ if (node_str == NULL || node_str->str == NULL)
goto subject_dn_error;
- strlcat(buffer, shortname, length);
- strlcat(buffer, "=", length);
- strlcat(buffer, node_str->str, length);
+ switch (node_str->type) {
+ case ASN1_PRINTSTRING:
+ case ASN1_IA5STRING:
+ case ASN1_T61STRING:
+ case ASN1_UTF8STRING:
+ case ASN1_OCTETSTRING:
+ strlcat(buffer, shortname, length);
+ strlcat(buffer, "=", length);
+ strlcat(buffer, node_str->str, length);
+ break;
+ default:
+ SCLogInfo("Unsupported 'string' type:'%d'", node_str->type);
+ goto subject_dn_error;
+ }
+
if (strcmp(shortname,"CN")==0)
separator = "/";
if (it->next != NULL)
strlcat(buffer, separator, length);
it = it->next;
}
+ SCLogDebug("read subject:'%s'", buffer);
rc = 0;
subject_dn_error:
static Asn1Generic * DecodeAsn1DerInteger(const unsigned char *buffer, uint32_t size, uint8_t depth);
static Asn1Generic * DecodeAsn1DerNull(const unsigned char *buffer, uint32_t size, uint8_t depth);
static Asn1Generic * DecodeAsn1DerOctetString(const unsigned char *buffer, uint32_t size, uint8_t depth);
+static Asn1Generic * DecodeAsn1DerUTF8String(const unsigned char *buffer, uint32_t max_size, uint8_t depth);
static Asn1Generic * DecodeAsn1DerOid(const unsigned char *buffer, uint32_t size, uint8_t depth);
static Asn1Generic * DecodeAsn1DerPrintableString(const unsigned char *buffer, uint32_t size, uint8_t depth);
static Asn1Generic * DecodeAsn1DerSequence(const unsigned char *buffer, uint32_t size, uint8_t depth);
case ASN1_OCTETSTRING:
child = DecodeAsn1DerOctetString(d_ptr, el_max_size, depth+1);
break;
+ case ASN1_UTF8STRING:
+ child = DecodeAsn1DerUTF8String(d_ptr, el_max_size, depth+1);
+ break;
case ASN1_PRINTSTRING:
child = DecodeAsn1DerPrintableString(d_ptr, el_max_size, depth+1);
break;
return a;
}
+static Asn1Generic * DecodeAsn1DerUTF8String(const unsigned char *buffer, uint32_t max_size, uint8_t depth)
+{
+ Asn1Generic *a = DecodeAsn1DerOctetString(buffer, max_size, depth);
+ if (a != NULL)
+ a->type = ASN1_UTF8STRING;
+ return a;
+}
+
static Asn1Generic * DecodeAsn1DerPrintableString(const unsigned char *buffer, uint32_t max_size, uint8_t depth)
{
const unsigned char *d_ptr = buffer;