- BIGNUM* ser = ASN1_INTEGER_to_BN( target->cert_info->serialNumber, NULL );
- char* serStr = BN_bn2hex( ser );
- res->serial = std::string( serStr );
- OPENSSL_free( serStr );
- BN_free( ser );
+
+ std::shared_ptr<BIGNUM> ser( ASN1_INTEGER_to_BN( X509_get_serialNumber( target.get() ), NULL ), BN_free );
+
+ if( !ser ) {
+ throw std::runtime_error( "Failed to retrieve certificate serial of signed certificate." );
+ }
+
+ std::shared_ptr<char> serStr(
+ BN_bn2hex( ser.get() ),
+ []( char* p ) {
+ OPENSSL_free( p );
+ } ); // OPENSSL_free is a macro...
+ res->serial = serStr ? std::string( serStr.get() ) : "";
+