File pkcs7.h

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

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

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

MBEDTLS_ERR_PKCS7_FEATURE_UNAVAILABLE

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

MBEDTLS_ERR_PKCS7_INVALID_VERSION

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

MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO

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

MBEDTLS_ERR_PKCS7_INVALID_ALG

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

MBEDTLS_ERR_PKCS7_INVALID_CERT

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

MBEDTLS_ERR_PKCS7_INVALID_SIGNATURE

Error parsing the signature

MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO

Error parsing the signer’s info

MBEDTLS_ERR_PKCS7_BAD_INPUT_DATA

Input invalid.

MBEDTLS_ERR_PKCS7_ALLOC_FAILED

Allocation of memory failed.

MBEDTLS_ERR_PKCS7_VERIFY_FAIL

Verification Failed

MBEDTLS_ERR_PKCS7_CERT_DATE_INVALID

The PKCS #7 date issued/expired dates are invalid

PKCS #7 Supported Version

MBEDTLS_PKCS7_SUPPORTED_VERSION
enum mbedtls_pkcs7_type

PKCS #7 types

Values:

enumerator MBEDTLS_PKCS7_NONE
enumerator MBEDTLS_PKCS7_DATA
enumerator MBEDTLS_PKCS7_SIGNED_DATA
enumerator MBEDTLS_PKCS7_ENVELOPED_DATA
enumerator MBEDTLS_PKCS7_SIGNED_AND_ENVELOPED_DATA
enumerator MBEDTLS_PKCS7_DIGESTED_DATA
enumerator MBEDTLS_PKCS7_ENCRYPTED_DATA
typedef mbedtls_asn1_buf mbedtls_pkcs7_buf

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

typedef mbedtls_asn1_named_data mbedtls_pkcs7_name

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

typedef mbedtls_asn1_sequence mbedtls_pkcs7_sequence

Container for a sequence of ASN.1 items

typedef struct mbedtls_pkcs7_signer_info mbedtls_pkcs7_signer_info

Structure holding PKCS #7 signer info

typedef struct mbedtls_pkcs7_signed_data mbedtls_pkcs7_signed_data

Structure holding the signed data section

typedef struct mbedtls_pkcs7 mbedtls_pkcs7

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

void mbedtls_pkcs7_init(mbedtls_pkcs7 *pkcs7)

Initialize mbedtls_pkcs7 structure.

Parameters

pkcs7mbedtls_pkcs7 structure.

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

Parse a single DER formatted PKCS #7 detached signature.

Note

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

Note

Signatures with internal data are not supported.

Parameters
  • 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.

Returns

The mbedtls_pkcs7_type of buf, if successful.

Returns

A negative error code on failure.

int 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.

Note

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

Parameters
  • pkcs7mbedtls_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.

Returns

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

int 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.

Note

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

Parameters
  • 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.

Returns

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

void 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.

Parameters

pkcs7mbedtls_pkcs7 structure to free.

struct mbedtls_pkcs7_signer_info
#include <pkcs7.h>

Structure holding PKCS #7 signer info

Public Members

int private_version
mbedtls_x509_buf private_serial
mbedtls_x509_name private_issuer
mbedtls_x509_buf private_issuer_raw
mbedtls_x509_buf private_alg_identifier
mbedtls_x509_buf private_sig_alg_identifier
mbedtls_x509_buf private_sig
struct mbedtls_pkcs7_signer_info *private_next
struct mbedtls_pkcs7_signed_data
#include <pkcs7.h>

Structure holding the signed data section

Public Members

int private_version
mbedtls_pkcs7_buf private_digest_alg_identifiers
int private_no_of_certs
mbedtls_x509_crt private_certs
int private_no_of_crls
mbedtls_x509_crl private_crl
int private_no_of_signers
mbedtls_pkcs7_signer_info private_signers
struct mbedtls_pkcs7
#include <pkcs7.h>

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

Public Members

mbedtls_pkcs7_buf private_raw
mbedtls_pkcs7_signed_data private_signed_data