X509_DIGEST(3SSL)

✨ X509_DIGEST ✨ (that's section 3SSL of the OpenSSL manual btw, bestie πŸ’–)

okay so like. you have a certificate, or a CRL, or a public key, or a name, or a request, or… some weird PKCS7 issuer-and-serial thing 🫢 and you want its digest. the fingerprint. the ✨hashing✨. that's literally this whole page. seven little functions, all your faves, all vibing in <openssl/x509.h> and <openssl/pkcs7.h>. no cap.


🌸 SYNOPSIS 🌸

#include <openssl/x509.h>

int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
                unsigned int *len);
ASN1_OCTET_STRING *X509_digest_sig(const X509 *cert,
                                   EVP_MD **md_used, int *md_is_fallback);

int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, unsigned char *md,
                    unsigned int *len);

int X509_pubkey_digest(const X509 *data, const EVP_MD *type,
                       unsigned char *md, unsigned int *len);

int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type,
                    unsigned char *md, unsigned int *len);

int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type,
                     unsigned char *md, unsigned int *len);

#include <openssl/pkcs7.h>

int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data,
                                   const EVP_MD *type, unsigned char *md,
                                   unsigned int *len);

πŸ’… DESCRIPTION πŸ’…

πŸŽ€ the special one: X509_digest_sig()

okay so this is the overachiever of the group. X509_digest_sig() calculates a digest of the given certificate cert using the same hash algorithm as in its signature β€” but only if the digest is an integral part of the certificate signature algorithm identifier. iykyk.

otherwise? fallback time, bestie. the fallback hash algorithm is determined as follows:

  • SHA512 if the signature algorithm is ED25519 πŸ”₯
  • SHAKE256 if it is ED448 πŸ’œ
  • otherwise SHA256 🌈

and now the output params, listen up:

  • unless md_used is NULL, the hash algorithm used is provided in *md_used and must be freed by the caller (if it is not NULL). yes. you. free it. not optional, periodt.
  • unless md_is_fallback is NULL, *md_is_fallback is set to 1 if the hash algorithm used is a fallback, otherwise to 0.

πŸ”‘ X509_pubkey_digest()

X509_pubkey_digest() returns a digest of the DER representation of the public key in the specified X509 data object. just the key, not the whole cert. main character energy but scoped.

πŸ¦‹ everybody else

all the other functions described here return a digest of the DER representation of their entire data objects. the whole thing. no skips.

πŸ“ the shared deets

the type parameter specifies the digest to be used, such as EVP_sha1(). ✨

the md is a pointer to the buffer where the digest will be copied and is assumed to be large enough; the constant EVP_MAX_MD_SIZE is suggested. (ngl, please actually size it right, we're not checking for you 😭)

the len parameter, if not NULL, points to a place where the digest size will be stored. cute.


⭐ RETURN VALUES ⭐

  • X509_digest_sig() returns an ASN1_OCTET_STRING pointer on success, else NULL. so like, always check it, bestie πŸ™ˆ
  • all the other functions described here return 1 for success and 0 for failure.

πŸ‘‘ SEE ALSO πŸ‘‘


🌱 HISTORY 🌱

the X509_digest_sig() function was added in OpenSSL 3.0. glow up era πŸ’–


Copyright 2017-2022 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at https://www.openssl.org/source/license.html.


fr fr that's the whole page. go hash something. 🧚

okay bye bestie, this was OpenSSL 4.0.3, dated 2026-09-29 β€” stay hashing, slay, and don't forget to free your *md_used πŸ’…βœ¨πŸ’–

πŸ“¦ where this page comes from