/* Provenance: openssl/openssl GENERAL_NAME_print (fixed). * repo: openssl/openssl * commit: b2b3b9c9936b91315adc0f3254879cb2fd5ca2bd * parent: 1747d4658b3830951068a6a6c1fa2b45c4731fb3 * commit_url: https://github.com/openssl/openssl/commit/b2b3b9c9936b91315adc0f3254879cb2fd5ca2bd * cve: CVE-2021-3712 * license: OpenSSL License * function: GENERAL_NAME_print * relpath: crypto/x509/v3_san.c */ int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen) { char *tmp; int nid; switch (gen->type) { case GEN_OTHERNAME: nid = OBJ_obj2nid(gen->d.otherName->type_id); /* Validate the types are as we expect before we use them */ if ((nid == NID_SRVName && gen->d.otherName->value->type != V_ASN1_IA5STRING) || (nid != NID_SRVName && gen->d.otherName->value->type != V_ASN1_UTF8STRING)) { BIO_printf(out, "othername:"); break; } switch (nid) { case NID_id_on_SmtpUTF8Mailbox: BIO_printf(out, "othername:SmtpUTF8Mailbox:%.*s", gen->d.otherName->value->value.utf8string->length, gen->d.otherName->value->value.utf8string->data); break; case NID_XmppAddr: BIO_printf(out, "othername:XmppAddr:%.*s", gen->d.otherName->value->value.utf8string->length, gen->d.otherName->value->value.utf8string->data); break; case NID_SRVName: BIO_printf(out, "othername:SRVName:%.*s", gen->d.otherName->value->value.ia5string->length, gen->d.otherName->value->value.ia5string->data); break; case NID_ms_upn: BIO_printf(out, "othername:UPN:%.*s", gen->d.otherName->value->value.utf8string->length, gen->d.otherName->value->value.utf8string->data); break; case NID_NAIRealm: BIO_printf(out, "othername:NAIRealm:%.*s", gen->d.otherName->value->value.utf8string->length, gen->d.otherName->value->value.utf8string->data); break; default: BIO_printf(out, "othername:"); break; } break; case GEN_X400: BIO_printf(out, "X400Name:"); break; case GEN_EDIPARTY: /* Maybe fix this: it is supported now */ BIO_printf(out, "EdiPartyName:"); break; case GEN_EMAIL: BIO_printf(out, "email:"); ASN1_STRING_print(out, gen->d.ia5); break; case GEN_DNS: BIO_printf(out, "DNS:"); ASN1_STRING_print(out, gen->d.ia5); break; case GEN_URI: BIO_printf(out, "URI:"); ASN1_STRING_print(out, gen->d.ia5); break; case GEN_DIRNAME: BIO_printf(out, "DirName:"); X509_NAME_print_ex(out, gen->d.dirn, 0, XN_FLAG_ONELINE); break; case GEN_IPADD: tmp = ossl_ipaddr_to_asc(gen->d.ip->data, gen->d.ip->length); if (tmp == NULL) return 0; BIO_printf(out, "IP Address:%s", tmp); OPENSSL_free(tmp); break; case GEN_RID: BIO_printf(out, "Registered ID:"); i2a_ASN1_OBJECT(out, gen->d.rid); break; } return 1; }