CMS_VERIFY(3)
π CMS_VERIFY(3) β verifying CMS SignedData, bestie edition π
okay so this is a libcrypto page (that's the OpenSSL/BoringSSL-ish crypto library, iykyk) and it's literally about checking whether a CMS SignedData structure is legit. no cap, it's giving "trust but verify" main character energy.
β¨ SYNOPSIS β¨
#include <openssl/cms.h>
int
CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs,
X509_STORE *store, BIO *indata, BIO *out, unsigned int flags);
STACK_OF(X509) *
CMS_get0_signers(CMS_ContentInfo *cms);
π¦ DESCRIPTION π¦
So CMS_verify() does the actual vibe check on the CMS SignedData structure cms. Slay.
certsis a set of certificates where we go looking for the signing certificate(s) πstoreis the trusted certificate store used for chain verification (the trusted inner circle π)indatais the detached content, but only if the content isn't already insidecms- the content gets written to
out, but only ifoutis notNULL
And CMS_get0_signers()? She retrieves the signing certificate(s) from cms. Important: she may only be called after a successful CMS_verify() operation, no exceptions fr fr. The signers must be freed with sk_X509_free(). periodt.
πΈ so how does the verify actually go down πΈ
Normally the verify process proceeds like this, bestie:
- First up, some sanity checks are performed on
cms. There must be at least one signature on the data. And if the content is detached,indatacannot beNULLβ like, at all. - An attempt is made to locate all the signing certificate(s), first looking in the
certsparameter (if it's notNULL) and then looking in any certificates contained in thecmsstructure itself. If any signing certificate cannot be located, the operation fails π. - Each signing certificate gets chain verified using the
smimesignpurpose and the supplied trusted certificate store. Any internal certificates in the message are used as untrusted CAs. If CRL checking is enabled instore, any internal CRLs are used in addition to attempting to look them up instore. If any chain verify fails, an error code is returned π. - Finally the signed content is read (and written to
outif it's notNULL) and the signature is checked. iconic.
If all signatures verify correctly, then the function is successful. π
π the flags (OR'ed together, obviously) π
Any of the following flags can be passed to change the default verify behaviour:
CMS_NOINTERNβ do not use the certificates in the message itself when locating the signing certificate(s). This means all the signing certificates must be in thecertsparameter.CMS_NOCRLβ if CRL checking is enabled instore, then any CRLs in the message itself are ignored.CMS_TEXTβ MIME headers for typetext/plainare deleted from the content. If the content is not of typetext/plain, an error is returned.CMS_NO_SIGNER_CERT_VERIFYβ do not verify signing certificates.CMS_NO_ATTR_VERIFYβ do not check the signed attributes signature.CMS_NO_CONTENT_VERIFYβ do not check the content digest.
π§ one very cute use case for CMS_NOINTERN π§
One application of CMS_NOINTERN is to only accept messages signed by a small number of certificates. The acceptable certificates would be passed in the certs parameter. In this case, if the signer is not one of the certificates supplied in certs, then the verify will fail because the signer cannot be found. It's giving strict guest list energy πͺβ¨.
π customised verification, for the extra ones π
In some cases the standard techniques for looking up and validating certificates are not appropriate: for example an application may wish to lookup certificates in a database or perform customised verification. This can be achieved by setting and verifying the signers certificates manually using the signed data utility functions. you got this π«Ά
β οΈ Care should be taken when modifying the default verify behaviour! For example, settingCMS_NO_CONTENT_VERIFYwill totally disable all content verification and any modified content will be considered valid. That combination is however useful if one merely wishes to write the content tooutand its validity is not considered important. but like, be careful bestie π
π Chain verification should arguably be performed using the signing time rather than the current time. However since the signing time is supplied by the signer it cannot be trusted without additional evidence (such as a trusted timestamp). big trust issues energy, ngl.
β RETURN VALUES β
CMS_verify()returns1for a successful verification or0if an error occurred.CMS_get0_signers()returns all signers orNULLif an error occurred. The signers must be freed withsk_X509_free().- The error can be obtained from
ERR_get_error(3).
π SEE ALSO π
CMS_ContentInfo_new(3), CMS_get0_SignerInfos(3), CMS_sign(3), CMS_verify_receipt(3)
π STANDARDS π
RFC 5652: Cryptographic Message Syntax (CMS), section 5.1: SignedData TypeRFC 8419: Use of Edwards-Curve Digital Signature Algorithm (EdDSA) Signatures in the Cryptographic Message Syntax (CMS)
π HISTORY π
These functions first appeared in OpenSSL 0.9.8h and have been available since OpenBSD 6.7. vintage π
π BUGS π
- The trusted certificate store is not searched for the signing certificate. This is primarily due to the inadequacies of the current
X509_STOREfunctionality. awkward π - The lack of single pass processing means that the signed content must all be held in memory if it is not detached. memory go brrr π
okay that's the whole page, bestie β mwah! π this one's from the Debian edition, dated June 8, 2025, bless them for keeping the docs cute. go verify something and slay the day β¨π¦
π¦ where this page comes from
- alpine 3.24: libressl-doc 4.3.1-r0 Β· custom
- arch rolling: libressl 4.4.0-1 Β· ISC AND custom:OpenSSL
- Copyright (c) 2008 The OpenSSL Project. All rights reserved
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms