+
+ std::shared_ptr<GENERAL_NAMES> gens = std::shared_ptr<GENERAL_NAMES>(
+ sk_GENERAL_NAME_new_null(),
+ []( GENERAL_NAMES * ref ) {
+ if( ref ) {
+ sk_GENERAL_NAME_pop_free( ref, GENERAL_NAME_free );
+ }
+ } );
+
+ for( auto& name : sans ) {
+ GENERAL_NAME* gen = GENERAL_NAME_new();
+
+ if( !gen ) {
+ throw "Malloc failure.";
+ }
+
+ gen->type = name->type == "DNS" ? GEN_DNS : name->type == "email" ? GEN_EMAIL : 0; // GEN_EMAIL;
+
+ if( !gen->type
+ || !( gen->d.ia5 = M_ASN1_IA5STRING_new() )
+ || !ASN1_STRING_set( gen->d.ia5, name->content.data(), name->content.size() ) ) {
+ GENERAL_NAME_free( gen );
+ throw "initing iasting5 failed";
+ }
+
+ sk_GENERAL_NAME_push( gens.get(), gen );
+ }
+
+ X509_EXTENSION* ext = do_ext_i2d( NID_subject_alt_name, 0/*critical*/, ( ASN1_VALUE* )gens.get() );
+
+ X509_add_ext( target.get(), ext, -1 );
+ X509_EXTENSION_free( ext );