@@ -571,7 +571,6 @@ static int wolfssl_dns_entry_othername_to_gn(DNS_entry* dns,
571571 tag = WOLFSSL_V_ASN1_SEQUENCE ;
572572 }
573573
574-
575574 /* Create a WOLFSSL_ASN1_STRING from the DER. */
576575 str = wolfSSL_ASN1_STRING_type_new (tag );
577576 if (str == NULL ) {
@@ -584,15 +583,23 @@ static int wolfssl_dns_entry_othername_to_gn(DNS_entry* dns,
584583 if (type == NULL )
585584 goto err ;
586585 wolfSSL_ASN1_TYPE_set (type , tag , str );
586+ str = NULL ; /* type now owns str */
587+
588+ if (wolfSSL_GENERAL_NAME_set_type (gn , WOLFSSL_GEN_OTHERNAME )
589+ != WOLFSSL_SUCCESS ) {
590+ goto err ;
591+ }
587592
588593 /* Store the object and string in general name. */
589594 gn -> d .otherName -> type_id = obj ;
590595 gn -> d .otherName -> value = type ;
596+ type = NULL ; /* gn->d.otherName owns type */
591597
592598 ret = 1 ;
593599err :
594600 if (ret != 1 ) {
595601 wolfSSL_ASN1_OBJECT_free (obj );
602+ wolfSSL_ASN1_TYPE_free (type );
596603 wolfSSL_ASN1_STRING_free (str );
597604 }
598605 return ret ;
@@ -602,30 +609,32 @@ static int wolfssl_dns_entry_othername_to_gn(DNS_entry* dns,
602609#if defined(OPENSSL_ALL ) || defined(OPENSSL_EXTRA )
603610static int DNS_to_GENERAL_NAME (WOLFSSL_GENERAL_NAME * gn , DNS_entry * dns )
604611{
605- gn -> type = dns -> type ;
606- switch (gn -> type ) {
612+ switch (dns -> type ) {
607613 case WOLFSSL_GEN_OTHERNAME :
608- if (!wolfssl_dns_entry_othername_to_gn (dns , gn )) {
609- WOLFSSL_MSG ("OTHERNAME set failed" );
610- return WOLFSSL_FAILURE ;
611- }
614+ /* Sets gn->type internally */
615+ if (!wolfssl_dns_entry_othername_to_gn (dns , gn )) {
616+ WOLFSSL_MSG ("OTHERNAME set failed" );
617+ return WOLFSSL_FAILURE ;
618+ }
612619 break ;
613620
614621 case WOLFSSL_GEN_EMAIL :
615622 case WOLFSSL_GEN_DNS :
616623 case WOLFSSL_GEN_URI :
617624 case WOLFSSL_GEN_IPADD :
618625 case WOLFSSL_GEN_IA5 :
619- gn -> d .ia5 -> length = dns -> len ;
620- if (wolfSSL_ASN1_STRING_set (gn -> d .ia5 , dns -> name ,
621- gn -> d .ia5 -> length ) != WOLFSSL_SUCCESS ) {
622- WOLFSSL_MSG ("ASN1_STRING_set failed" );
623- return WOLFSSL_FAILURE ;
624- }
625- break ;
626+ gn -> type = dns -> type ;
627+ gn -> d .ia5 -> length = dns -> len ;
628+ if (wolfSSL_ASN1_STRING_set (gn -> d .ia5 , dns -> name ,
629+ gn -> d .ia5 -> length ) != WOLFSSL_SUCCESS ) {
630+ WOLFSSL_MSG ("ASN1_STRING_set failed" );
631+ return WOLFSSL_FAILURE ;
632+ }
633+ break ;
626634
627635
628636 case WOLFSSL_GEN_DIRNAME :
637+ gn -> type = dns -> type ;
629638 /* wolfSSL_GENERAL_NAME_new() mallocs this by default */
630639 wolfSSL_ASN1_STRING_free (gn -> d .ia5 );
631640 gn -> d .ia5 = NULL ;
@@ -636,6 +645,7 @@ static int DNS_to_GENERAL_NAME(WOLFSSL_GENERAL_NAME* gn, DNS_entry* dns)
636645
637646#ifdef WOLFSSL_RID_ALT_NAME
638647 case WOLFSSL_GEN_RID :
648+ gn -> type = dns -> type ;
639649 /* wolfSSL_GENERAL_NAME_new() mallocs this by default */
640650 wolfSSL_ASN1_STRING_free (gn -> d .ia5 );
641651 gn -> d .ia5 = NULL ;
@@ -2310,9 +2320,9 @@ void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
23102320 goto err ;
23112321 }
23122322
2313- gn -> type = dns -> type ;
2314- switch (gn -> type ) {
2323+ switch (dns -> type ) {
23152324 case ASN_DIR_TYPE :
2325+ gn -> type = dns -> type ;
23162326 {
23172327 int localIdx = 0 ;
23182328 unsigned char * n = (unsigned char * )XMALLOC (
@@ -2336,12 +2346,14 @@ void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
23362346 break ;
23372347
23382348 case ASN_OTHER_TYPE :
2349+ /* gn->type set internally */
23392350 if (!wolfssl_dns_entry_othername_to_gn (dns , gn )) {
23402351 goto err ;
23412352 }
23422353 break ;
23432354
23442355 case ASN_IP_TYPE :
2356+ gn -> type = dns -> type ;
23452357 if (wolfSSL_ASN1_STRING_set (gn -> d .iPAddress ,
23462358 dns -> name , dns -> len ) != WOLFSSL_SUCCESS ) {
23472359 WOLFSSL_MSG ("ASN1_STRING_set failed" );
@@ -2350,7 +2362,35 @@ void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
23502362 gn -> d .iPAddress -> type = WOLFSSL_V_ASN1_OCTET_STRING ;
23512363 break ;
23522364
2365+ #ifdef WOLFSSL_RID_ALT_NAME
2366+ case ASN_RID_TYPE :
2367+ gn -> type = dns -> type ;
2368+ /* Free ia5 before using union for registeredID */
2369+ wolfSSL_ASN1_STRING_free (gn -> d .ia5 );
2370+ gn -> d .ia5 = NULL ;
2371+
2372+ gn -> d .registeredID = wolfSSL_ASN1_OBJECT_new ();
2373+ if (gn -> d .registeredID == NULL ) {
2374+ goto err ;
2375+ }
2376+ gn -> d .registeredID -> obj =
2377+ (const unsigned char * )XMALLOC (dns -> len ,
2378+ gn -> d .registeredID -> heap , DYNAMIC_TYPE_ASN1 );
2379+ if (gn -> d .registeredID -> obj == NULL ) {
2380+ goto err ;
2381+ }
2382+ gn -> d .registeredID -> dynamic |=
2383+ WOLFSSL_ASN1_DYNAMIC_DATA ;
2384+ XMEMCPY ((byte * )gn -> d .registeredID -> obj ,
2385+ dns -> ridString , dns -> len );
2386+ gn -> d .registeredID -> objSz = dns -> len ;
2387+ gn -> d .registeredID -> grp = oidCertExtType ;
2388+ gn -> d .registeredID -> nid = WC_NID_registeredAddress ;
2389+ break ;
2390+ #endif /* WOLFSSL_RID_ALT_NAME */
2391+
23532392 default :
2393+ gn -> type = dns -> type ;
23542394 if (wolfSSL_ASN1_STRING_set (gn -> d .dNSName ,
23552395 dns -> name , dns -> len ) != WOLFSSL_SUCCESS ) {
23562396 WOLFSSL_MSG ("ASN1_STRING_set failed" );
@@ -4643,7 +4683,12 @@ int wolfSSL_GENERAL_NAME_set0_othername(WOLFSSL_GENERAL_NAME* gen,
46434683 return WOLFSSL_FAILURE ;
46444684 }
46454685
4646- gen -> type = WOLFSSL_GEN_OTHERNAME ;
4686+ if (wolfSSL_GENERAL_NAME_set_type (gen , WOLFSSL_GEN_OTHERNAME )
4687+ != WOLFSSL_SUCCESS ) {
4688+ wolfSSL_ASN1_OBJECT_free (x );
4689+ return WOLFSSL_FAILURE ;
4690+ }
4691+
46474692 gen -> d .otherName -> type_id = x ;
46484693 gen -> d .otherName -> value = value ;
46494694 return WOLFSSL_SUCCESS ;
@@ -4975,6 +5020,16 @@ int wolfSSL_GENERAL_NAME_set_type(WOLFSSL_GENERAL_NAME* name, int typ)
49755020 if (name -> d .uniformResourceIdentifier == NULL )
49765021 ret = MEMORY_E ;
49775022 break ;
5023+ case WOLFSSL_GEN_OTHERNAME :
5024+ name -> d .otherName = (WOLFSSL_ASN1_OTHERNAME * )XMALLOC (
5025+ sizeof (WOLFSSL_ASN1_OTHERNAME ), NULL , DYNAMIC_TYPE_ASN1 );
5026+ if (name -> d .otherName == NULL ) {
5027+ ret = MEMORY_E ;
5028+ }
5029+ else {
5030+ XMEMSET (name -> d .otherName , 0 , sizeof (WOLFSSL_ASN1_OTHERNAME ));
5031+ }
5032+ break ;
49785033 default :
49795034 name -> type = WOLFSSL_GEN_IA5 ;
49805035 name -> d .ia5 = wolfSSL_ASN1_STRING_new ();
0 commit comments