diff -urN openssl-1.0.1m/crypto/x509v3/v3_alt.c openssl-1.0.1m-patched/crypto/x509v3/v3_alt.c --- openssl-1.0.1m/crypto/x509v3/v3_alt.c 2015-03-19 23:19:00.000000000 +1000 +++ openssl-1.0.1m-patched/crypto/x509v3/v3_alt.c 2015-04-05 22:32:51.286111448 +1000 @@ -116,10 +116,53 @@ { unsigned char *p; char oline[256], htmp[5]; + + int rc = 0; + /* see http://www.iti.gov.br/resolucoes/RESOLU__O_13_DE_26_04_2002.PDF + * for the OID definitions and more details + * All content is ASN.1 OCTET STRING + */ + /* person related */ + const char oid_id_pf[] = "2.16.76.1.3.1"; /* person identification data as follows: + * birth date: ddmmyyyy (8) + * CPF number: (11) + * PIS/PASEP number: (11) + * RG number: (11) + * RG emmitter and state: (6) + */ + const char oid_el_pf[] = "2.16.76.1.3.5"; /* Electoral data: + * card number: (11) + * electoral zone: (3) + * electoral section: (4) + * city and state: (22) + */ + /* company related */ + const char oid_pj_id1[] = "2.16.76.1.3.4"; /* info about the person responsible for the company's certificate: + * birth date: ddmmyyyy (8) + * CPF number: (11) + * PIS/PASEP number: (11) + * RG number: (11) + * RG emitter and state: (6) + */ + const char oid_pj_name[] = "2.16.76.1.3.2"; /* Name of the person responsible for the company's certificate */ + const char oid_pj_cnpj[] = "2.16.76.1.3.3"; /* CNPJ number of the company*/ + int i; switch (gen->type) { case GEN_OTHERNAME: - X509V3_add_value("othername", "", &ret); + rc = OBJ_obj2txt(oline, sizeof(oline), gen->d.otherName->type_id, 1); + if (rc) + if ((!strncmp(oline, oid_id_pf, sizeof(oid_id_pf))) || + (!strncmp(oline, oid_el_pf, sizeof(oid_el_pf))) || + (!strncmp(oline, oid_pj_id1, sizeof(oid_pj_id1))) || + (!strncmp(oline, oid_pj_name, sizeof(oid_pj_name))) || + (!strncmp(oline, oid_pj_cnpj, sizeof(oid_pj_cnpj)))) + /* FIXME: is that string always null terminated? */ + X509V3_add_value("othername", gen->d.otherName->value->value.octet_string->data, &ret); + else + X509V3_add_value("othername","", &ret); + else + X509V3_add_value("othername","", &ret); break; case GEN_X400: