SMIME_READ_CMS(3) | Library Functions Manual | SMIME_READ_CMS(3)

# NAME

`SMIME_read_CMS` — extract CMS ContentInfo from an S/MIME message

# SYNOPSIS

library “libcrypto”
`#include <openssl/cms.h>`

CMS_ContentInfo *
`SMIME_read_CMS`(BIO *in, BIO **bcont);

# DESCRIPTION

`SMIME_read_CMS`() parses a message in S/MIME format from in.

If the message uses cleartext signing, the content is saved in a memory BIO which is written to *bcont and which can then be passed to CMS_verify(3) with the `CMS_DETACHED` flag set. Otherwise, *bcont is set to `NULL` and the type of the returned structure can be determined using CMS_get0_type(3).

To support future functionality if bcont is not `NULL`, *bcont should be initialized to `NULL`, for example:

    BIO *cont = NULL;
    CMS_ContentInfo *cms = SMIME_read_CMS(in, &cont);

# RETURN VALUES

`SMIME_read_CMS`() returns a valid CMS_ContentInfo structure or `NULL` if an error occurred. The error can be obtained from ERR_get_error(3).

# SEE ALSO

BIO_f_base64(3), BIO_new(3), CMS_ContentInfo_new(3), CMS_decrypt(3), CMS_get0_type(3), CMS_verify(3), d2i_CMS_ContentInfo(3), SMIME_read_PKCS7(3), SMIME_text(3), SMIME_write_CMS(3)

# HISTORY

`SMIME_read_CMS`() first appeared in OpenSSL 0.9.8h and has been available since OpenBSD 6.7.

# BUGS

The MIME parser used by `SMIME_read_CMS`() is somewhat primitive. While it will handle most S/MIME messages, more complex compound formats may not work.

The parser assumes that the CMS_ContentInfo structure is always base64 encoded and will not handle the case where it is in binary format or uses quoted printable format.

The use of a memory BIO to hold the signed content limits the size of the message which can be processed due to memory restraints: a streaming single pass option should be available.

June 11, 2025 | Debian