pkcs7.h
mbedtls/private_access.h
mbedtls/build_info.h
mbedtls/asn1.h
mbedtls/x509_crt.h
mbedtls/asn1.h
mbedtls/bignum.h
mbedtls/build_info.h
mbedtls/ccm.h
mbedtls/chacha20.h
mbedtls/chachapoly.h
mbedtls/check_config.h
mbedtls/cipher.h
mbedtls/cmac.h
mbedtls/config_adjust_legacy_crypto.h
mbedtls/config_adjust_psa_from_legacy.h
mbedtls/config_adjust_psa_superset_legacy.h
mbedtls/config_adjust_ssl.h
mbedtls/config_adjust_x509.h
mbedtls/config_psa.h
mbedtls/ecdsa.h
mbedtls/ecjpake.h
mbedtls/ecp.h
mbedtls/gcm.h
mbedtls/mbedtls_config.h
mbedtls/md.h
mbedtls/md5.h
mbedtls/pk.h
pkcs7.h
mbedtls/platform_time.h
mbedtls/platform_util.h
mbedtls/poly1305.h
mbedtls/private_access.h
mbedtls/ripemd160.h
mbedtls/rsa.h
mbedtls/sha1.h
mbedtls/sha256.h
mbedtls/sha3.h
mbedtls/sha512.h
mbedtls/threading.h
mbedtls/x509.h
mbedtls/x509_crl.h
mbedtls/x509_crt.h
psa/build_info.h
psa/crypto.h
psa/crypto_adjust_auto_enabled.h
psa/crypto_adjust_config_dependencies.h
psa/crypto_adjust_config_key_pair_types.h
psa/crypto_adjust_config_synonyms.h
psa/crypto_builtin_composites.h
psa/crypto_builtin_key_derivation.h
psa/crypto_builtin_primitives.h
crypto_compat.h
psa/crypto_driver_common.h
psa/crypto_driver_contexts_composites.h
psa/crypto_driver_contexts_key_derivation.h
psa/crypto_driver_contexts_primitives.h
crypto_extra.h
psa/crypto_legacy.h
crypto_platform.h
crypto_sizes.h
crypto_struct.h
crypto_types.h
crypto_values.h
inttypes.h
limits.h
pthread.h
stddef.h
stdint.h
stdio.h
stdlib.h
time.h
mbedtls_pkcs7_signer_info
mbedtls_pkcs7_signed_data
mbedtls_pkcs7
PKCS #7 Module Error codes

Note: For the time being, this implementation of the PKCS #7 cryptographic message syntax is a partial implementation of RFC 2315. Differences include:

- The RFC specifies 6 different content types. The only type currently supported in Mbed TLS is the signed-data content type.

- The only supported PKCS #7 Signed Data syntax version is version 1

- The RFC specifies support for BER. This implementation is limited to DER only.

- The RFC specifies that multiple digest algorithms can be specified in the Signed Data type. Only one digest algorithm is supported in Mbed TLS.

- The RFC specifies the Signed Data type can contain multiple X.509 or PKCS #6 extended certificates. In Mbed TLS, this list can only contain 0 or 1 certificates and they must be in X.509 format.

- The RFC specifies the Signed Data type can contain certificate-revocation lists (CRLs). This implementation has no support for CRLs so it is assumed to be an empty list.

- The RFC allows for SignerInfo structure to optionally contain unauthenticatedAttributes and authenticatedAttributes. In Mbed TLS it is assumed these fields are empty.

- The RFC allows for the signed Data type to contain contentInfo. This implementation assumes the type is DATA and the content is empty.

MBEDTLS_ERR_PKCS7_INVALID_FORMAT
-0x5300

The format is invalid, e.g. different type expected.

MBEDTLS_ERR_PKCS7_FEATURE_UNAVAILABLE
-0x5380

Unavailable feature, e.g. anything other than signed data.

MBEDTLS_ERR_PKCS7_INVALID_VERSION
-0x5400

The PKCS #7 version element is invalid or cannot be parsed.

MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO
-0x5480

The PKCS #7 content info is invalid or cannot be parsed.

MBEDTLS_ERR_PKCS7_INVALID_ALG
-0x5500

The algorithm tag or value is invalid or cannot be parsed.

MBEDTLS_ERR_PKCS7_INVALID_CERT
-0x5580

The certificate tag or value is invalid or cannot be parsed.

MBEDTLS_ERR_PKCS7_INVALID_SIGNATURE
-0x5600

Error parsing the signature

MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO
-0x5680

Error parsing the signer's info

MBEDTLS_ERR_PKCS7_BAD_INPUT_DATA
-0x5700

Input invalid.

MBEDTLS_ERR_PKCS7_ALLOC_FAILED
-0x5780

Allocation of memory failed.

MBEDTLS_ERR_PKCS7_VERIFY_FAIL
-0x5800

Verification Failed

MBEDTLS_ERR_PKCS7_CERT_DATE_INVALID
-0x5880

The PKCS #7 date issued/expired dates are invalid

PKCS #7 Supported Version
MBEDTLS_PKCS7_SUPPORTED_VERSION
0x01
mbedtls_pkcs7_type
MBEDTLS_PKCS7_NONE
=0
MBEDTLS_PKCS7_DATA
MBEDTLS_PKCS7_SIGNED_DATA
MBEDTLS_PKCS7_ENVELOPED_DATA
MBEDTLS_PKCS7_SIGNED_AND_ENVELOPED_DATA
MBEDTLS_PKCS7_DIGESTED_DATA
MBEDTLS_PKCS7_ENCRYPTED_DATA

PKCS #7 types

mbedtls_asn1_buf typedef mbedtls_asn1_buf mbedtls_pkcs7_buf mbedtls_pkcs7_buf

Type-length-value structure that allows for ASN.1 using DER.

mbedtls_asn1_named_data typedef mbedtls_asn1_named_data mbedtls_pkcs7_name mbedtls_pkcs7_name

Container for ASN.1 named information objects. It allows for Relative Distinguished Names (e.g. cn=localhost,ou=code,etc.).

mbedtls_asn1_sequence typedef mbedtls_asn1_sequence mbedtls_pkcs7_sequence mbedtls_pkcs7_sequence

Container for a sequence of ASN.1 items

struct mbedtls_pkcs7_signer_info typedef struct mbedtls_pkcs7_signer_info mbedtls_pkcs7_signer_info mbedtls_pkcs7_signer_info

Structure holding PKCS #7 signer info

struct mbedtls_pkcs7_signed_data typedef struct mbedtls_pkcs7_signed_data mbedtls_pkcs7_signed_data mbedtls_pkcs7_signed_data

Structure holding the signed data section

struct mbedtls_pkcs7 typedef struct mbedtls_pkcs7 mbedtls_pkcs7 mbedtls_pkcs7

Structure holding PKCS #7 structure, only signed data for now

void void mbedtls_pkcs7_init (mbedtls_pkcs7 *pkcs7) mbedtls_pkcs7_init mbedtls_pkcs7 * pkcs7

Initialize mbedtls_pkcs7 structure.

pkcs7

mbedtls_pkcs7 structure.

int int mbedtls_pkcs7_parse_der (mbedtls_pkcs7 *pkcs7, const unsigned char *buf, const size_t buflen) mbedtls_pkcs7_parse_der mbedtls_pkcs7 * pkcs7 const unsigned char * buf const size_t buflen

Parse a single DER formatted PKCS #7 detached signature.

pkcs7

The mbedtls_pkcs7 structure to be filled by the parser.

buf

The buffer holding only the DER encoded PKCS #7 content.

buflen

The size in bytes of `buf`. The size must be exactly the length of the DER encoded PKCS #7 content.

This function makes an internal copy of the PKCS #7 buffer `buf`. In particular, `buf` may be destroyed or reused after this call returns.

Signatures with internal data are not supported.

The `mbedtls_pkcs7_type` of `buf`, if successful.

A negative error code on failure.

int int mbedtls_pkcs7_signed_data_verify (mbedtls_pkcs7 *pkcs7, const mbedtls_x509_crt *cert, const unsigned char *data, size_t datalen) mbedtls_pkcs7_signed_data_verify mbedtls_pkcs7 * pkcs7 const mbedtls_x509_crt * cert const unsigned char * data size_t datalen

Verification of PKCS #7 signature against a caller-supplied certificate.

For each signer in the PKCS structure, this function computes a signature over the supplied data, using the supplied certificate and the same digest algorithm as specified by the signer. It then compares this signature against the signer's signature; verification succeeds if any comparison matches.

This function does not use the certificates held within the PKCS #7 structure itself, and does not check that the certificate is signed by a trusted certification authority.

pkcs7

mbedtls_pkcs7 structure containing signature.

cert

Certificate containing key to verify signature.

data

Plain data on which signature has to be verified.

datalen

Length of the data.

This function internally calculates the hash on the supplied plain data for signature verification.

0 if the signature verifies, or a negative error code on failure.

int int mbedtls_pkcs7_signed_hash_verify (mbedtls_pkcs7 *pkcs7, const mbedtls_x509_crt *cert, const unsigned char *hash, size_t hashlen) mbedtls_pkcs7_signed_hash_verify mbedtls_pkcs7 * pkcs7 const mbedtls_x509_crt * cert const unsigned char * hash size_t hashlen

Verification of PKCS #7 signature against a caller-supplied certificate.

For each signer in the PKCS structure, this function validates a signature over the supplied hash, using the supplied certificate and the same digest algorithm as specified by the signer. Verification succeeds if any signature is good.

This function does not use the certificates held within the PKCS #7 structure itself, and does not check that the certificate is signed by a trusted certification authority.

pkcs7

PKCS #7 structure containing signature.

cert

Certificate containing key to verify signature.

hash

Hash of the plain data on which signature has to be verified.

hashlen

Length of the hash.

This function is different from mbedtls_pkcs7_signed_data_verify() in that it is directly passed the hash of the data.

0 if the signature verifies, or a negative error code on failure.

void void mbedtls_pkcs7_free (mbedtls_pkcs7 *pkcs7) mbedtls_pkcs7_free mbedtls_pkcs7 * pkcs7

Unallocate all PKCS #7 data and zeroize the memory. It doesn't free `pkcs7` itself. This should be done by the caller.

pkcs7

mbedtls_pkcs7 structure to free.

PKCS #7 generic defines and structures https://tools.ietf.org/html/rfc2315.

    /*
    *CopyrightTheMbedTLSContributors
    *SPDX-License-Identifier:Apache-2.0ORGPL-2.0-or-later
    */

    #ifndefMBEDTLS_PKCS7_H
    #defineMBEDTLS_PKCS7_H

    #include"mbedtls/private_access.h"

    #include"mbedtls/build_info.h"

    #include"mbedtls/asn1.h"
    #include"mbedtls/x509_crt.h"

    #defineMBEDTLS_ERR_PKCS7_INVALID_FORMAT-0x5300
    #defineMBEDTLS_ERR_PKCS7_FEATURE_UNAVAILABLE-0x5380
    #defineMBEDTLS_ERR_PKCS7_INVALID_VERSION-0x5400
    #defineMBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO-0x5480
    #defineMBEDTLS_ERR_PKCS7_INVALID_ALG-0x5500
    #defineMBEDTLS_ERR_PKCS7_INVALID_CERT-0x5580
    #defineMBEDTLS_ERR_PKCS7_INVALID_SIGNATURE-0x5600
    #defineMBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO-0x5680
    #defineMBEDTLS_ERR_PKCS7_BAD_INPUT_DATA-0x5700
    #defineMBEDTLS_ERR_PKCS7_ALLOC_FAILED-0x5780
    #defineMBEDTLS_ERR_PKCS7_VERIFY_FAIL-0x5800
    #defineMBEDTLS_ERR_PKCS7_CERT_DATE_INVALID-0x5880
    /*\}name*/

    #defineMBEDTLS_PKCS7_SUPPORTED_VERSION0x01
    /*\}name*/

    #ifdef__cplusplus
    extern"C"{
    #endif

    typedefmbedtls_asn1_bufmbedtls_pkcs7_buf;

    typedefmbedtls_asn1_named_datambedtls_pkcs7_name;

    typedefmbedtls_asn1_sequencembedtls_pkcs7_sequence;

    typedefenum{
    MBEDTLS_PKCS7_NONE=0,
    MBEDTLS_PKCS7_DATA,
    MBEDTLS_PKCS7_SIGNED_DATA,
    MBEDTLS_PKCS7_ENVELOPED_DATA,
    MBEDTLS_PKCS7_SIGNED_AND_ENVELOPED_DATA,
    MBEDTLS_PKCS7_DIGESTED_DATA,
    MBEDTLS_PKCS7_ENCRYPTED_DATA,
    }
    mbedtls_pkcs7_type;

    typedefstructmbedtls_pkcs7_signer_info{
    intMBEDTLS_PRIVATE(version);
    mbedtls_x509_bufMBEDTLS_PRIVATE(serial);
    mbedtls_x509_nameMBEDTLS_PRIVATE(issuer);
    mbedtls_x509_bufMBEDTLS_PRIVATE(issuer_raw);
    mbedtls_x509_bufMBEDTLS_PRIVATE(alg_identifier);
    mbedtls_x509_bufMBEDTLS_PRIVATE(sig_alg_identifier);
    mbedtls_x509_bufMBEDTLS_PRIVATE(sig);
    structmbedtls_pkcs7_signer_info*MBEDTLS_PRIVATE(next);
    }
    mbedtls_pkcs7_signer_info;

    typedefstructmbedtls_pkcs7_signed_data{
    intMBEDTLS_PRIVATE(version);
    mbedtls_pkcs7_bufMBEDTLS_PRIVATE(digest_alg_identifiers);
    intMBEDTLS_PRIVATE(no_of_certs);
    mbedtls_x509_crtMBEDTLS_PRIVATE(certs);
    intMBEDTLS_PRIVATE(no_of_crls);
    mbedtls_x509_crlMBEDTLS_PRIVATE(crl);
    intMBEDTLS_PRIVATE(no_of_signers);
    mbedtls_pkcs7_signer_infoMBEDTLS_PRIVATE(signers);
    }
    mbedtls_pkcs7_signed_data;

    typedefstructmbedtls_pkcs7{
    mbedtls_pkcs7_bufMBEDTLS_PRIVATE(raw);
    mbedtls_pkcs7_signed_dataMBEDTLS_PRIVATE(signed_data);
    }
    mbedtls_pkcs7;

    voidmbedtls_pkcs7_init(mbedtls_pkcs7*pkcs7);

    intmbedtls_pkcs7_parse_der(mbedtls_pkcs7*pkcs7,constunsignedchar*buf,
    constsize_tbuflen);

    intmbedtls_pkcs7_signed_data_verify(mbedtls_pkcs7*pkcs7,
    constmbedtls_x509_crt*cert,
    constunsignedchar*data,
    size_tdatalen);

    intmbedtls_pkcs7_signed_hash_verify(mbedtls_pkcs7*pkcs7,
    constmbedtls_x509_crt*cert,
    constunsignedchar*hash,size_thashlen);

    voidmbedtls_pkcs7_free(mbedtls_pkcs7*pkcs7);

    #ifdef__cplusplus
    }
    #endif

    #endif/*pkcs7.h*/