CMS_verify(3) OpenSSL CMS_verify(3) NNAAMMEE CMS_verify, CMS_get0_signers - verify a CMS SignedData structure SSYYNNOOPPSSIISS #include 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); DDEESSCCRRIIPPTTIIOONN _C_M_S___v_e_r_i_f_y_(_) verifies a CMS SignedData structure. ccmmss is the CMS_Con- tentInfo structure to verify. cceerrttss is a set of certificates in which to search for the signing certificate(s). ssttoorree is a trusted certifi- cate store used for chain verification. iinnddaattaa is the detached content if the content is not present in ccmmss. The content is written to oouutt if it is not NULL. ffllaaggss is an optional set of flags, which can be used to modify the ver- ify operation. _C_M_S___g_e_t_0___s_i_g_n_e_r_s_(_) retrieves the signing certificate(s) from ccmmss, it must be called after a successful _C_M_S___v_e_r_i_f_y_(_) operation. VVEERRIIFFYY PPRROOCCEESSSS Normally the verify process proceeds as follows. Initially some sanity checks are performed on ccmmss. The type of ccmmss must be SignedData. There must be at least one signature on the data and if the content is detached iinnddaattaa cannot be NNUULLLL. An attempt is made to locate all the signing certificate(s), first looking in the cceerrttss parameter (if it is not NULL) and then looking in any certificates contained in the ccmmss structure itself. If any signing certificate cannot be located the operation fails. Each signing certificate is chain verified using the ssmmiimmeessiiggnn purpose and the supplied trusted certificate store. Any internal certificates in the message are used as untrusted CAs. If CRL checking is enabled in ssttoorree any internal CRLs are used in addition to attempting to look them up in ssttoorree. If any chain verify fails an error code is returned. Finally the signed content is read (and written to oouutt is it is not NULL) and the signature's checked. If all signature's verify correctly then the function is successful. Any of the following flags (ored together) can be passed in the ffllaaggss parameter to change the default verify behaviour. If CCMMSS__NNOOIINNTTEERRNN is set the certificates in the message itself are not searched when locating the signing certificate(s). This means that all the signing certificates must be in the cceerrttss parameter. If CCMMSS__NNOOCCRRLL is set and CRL checking is enabled in ssttoorree then any CRLs in the message itself are ignored. If the CCMMSS__TTEEXXTT flag is set MIME headers for type tteexxtt//ppllaaiinn are deleted from the content. If the content is not of type tteexxtt//ppllaaiinn then an error is returned. If CCMMSS__NNOO__SSIIGGNNEERR__CCEERRTT__VVEERRIIFFYY is set the signing certificates are not verified. If CCMMSS__NNOO__AATTTTRR__VVEERRIIFFYY is set the signed attributes signature is not verified. If CCMMSS__NNOO__CCOONNTTEENNTT__VVEERRIIFFYY is set then the content digest is not checked. NNOOTTEESS One application of CCMMSS__NNOOIINNTTEERRNN is to only accept messages signed by a small number of certificates. The acceptable certificates would be passed in the cceerrttss parameter. In this case if the signer is not one of the certificates supplied in cceerrttss then the verify will fail because the signer cannot be found. 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 verifica- tion. This can be achieved by setting and verifying the signers cer- tificates manually using the signed data utility functions. Care should be taken when modifying the default verify behaviour, for example setting CCMMSS__NNOO__CCOONNTTEENNTT__VVEERRIIFFYY will totally disable all content verification and any modified content will be considered valid. This combination is however useful if one merely wishes to write the content to oouutt and its validity is not considered important. Chain verification should arguably be performed using the signing time rather than the current time. However since the signing time is sup- plied by the signer it cannot be trusted without additional evidence (such as a trusted timestamp). RREETTUURRNN VVAALLUUEESS _C_M_S___v_e_r_i_f_y_(_) returns 1 for a successful verification and zero if an error occurred. _C_M_S___g_e_t_0___s_i_g_n_e_r_s_(_) returns all signers or NULL if an error occurred. The error can be obtained from _E_R_R___g_e_t___e_r_r_o_r(3) BBUUGGSS The trusted certificate store is not searched for the signing certifi- cate, this is primarily due to the inadequacies of the current XX550099__SSTTOORREE functionality. The lack of single pass processing means that the signed content must all be held in memory if it is not detached. SSEEEE AALLSSOO _E_R_R___g_e_t___e_r_r_o_r(3), _C_M_S___s_i_g_n(3) HHIISSTTOORRYY _C_M_S___v_e_r_i_f_y_(_) was added to OpenSSL 0.9.8 1.0.2u 2019-12-20 CMS_verify(3)