@@ -376,18 +376,26 @@ _get_fingerprint(const xmpp_ctx_t *ctx, X509 *err_cert, xmpp_cert_element_t el)
376376{
377377 unsigned char buf [EVP_MAX_MD_SIZE ];
378378 unsigned int len ;
379+ int (* digest_fn )(const X509 * data , const EVP_MD * type , unsigned char * md ,
380+ unsigned int * len );
379381 const EVP_MD * digest ;
380382 switch (el ) {
381383 case XMPP_CERT_FINGERPRINT_SHA1 :
384+ digest_fn = X509_digest ;
382385 digest = EVP_sha1 ();
383386 break ;
384387 case XMPP_CERT_FINGERPRINT_SHA256 :
388+ digest_fn = X509_digest ;
389+ digest = EVP_sha256 ();
390+ break ;
391+ case XMPP_CERT_PUBKEY_FINGERPRINT_SHA256 :
392+ digest_fn = X509_pubkey_digest ;
385393 digest = EVP_sha256 ();
386394 break ;
387395 default :
388396 return NULL ;
389397 }
390- if (X509_digest (err_cert , digest , buf , & len ) != 0 ) {
398+ if (digest_fn (err_cert , digest , buf , & len ) != 0 ) {
391399 char fingerprint [4 * EVP_MAX_MD_SIZE ];
392400 hex_encode (fingerprint , buf , len );
393401 return strophe_strdup (ctx , fingerprint );
@@ -475,6 +483,8 @@ static xmpp_tlscert_t *_x509_to_tlscert(xmpp_ctx_t *ctx, X509 *cert)
475483 _get_fingerprint (ctx , cert , XMPP_CERT_FINGERPRINT_SHA1 );
476484 tlscert -> elements [XMPP_CERT_FINGERPRINT_SHA256 ] =
477485 _get_fingerprint (ctx , cert , XMPP_CERT_FINGERPRINT_SHA256 );
486+ tlscert -> elements [XMPP_CERT_PUBKEY_FINGERPRINT_SHA256 ] =
487+ _get_fingerprint (ctx , cert , XMPP_CERT_PUBKEY_FINGERPRINT_SHA256 );
478488
479489 strophe_snprintf (buf , sizeof (buf ), "%ld" , X509_get_version (cert ) + 1 );
480490 tlscert -> elements [XMPP_CERT_VERSION ] = strophe_strdup (ctx , buf );
0 commit comments