mbedtls/docs/architecture/psa-migration/dependencies-x509.md
Manuel Pégourié-Gonnard 0d0a104b2d Add study for TLS/X.509 dependencies on crypto
This is an updated version of the study that was done a few years ago.

The script `syms` was used to list symbols form libmbedtls.a /
libmbedx509.a that are defined externally. It was run with config.py
full minus MBEDTLS_USE_PSA_CRYPTO minus
MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL.

Signed-off-by: Manuel Pégourié-Gonnard <manuel.pegourie-gonnard@arm.com>
2022-01-18 09:13:00 +01:00

5.5 KiB

Dependencies of the X.509 library on the Crypto library

This document is part of the technical study on how to port Mbed TLS to PSA Crypto. It describes the dependencies of libmbedx509.a on libmbedcrypto.a.

More precisely, it describes what functions from libmbedcrypto.a are called from libmbedx509.a - other forms of dependencies such as using static inline functions or types, accessing private struct members, etc., are not listed.

It is based on Mbed TLS 3.0, excluding support for restartble ECP operations.

Non-Crypto dependencies

The X.509 library has a number of dependencies on libmbedcrypto.a that are not cryptographic, hence are unlikely to be covered by the PSA Crypto API.

These involve the following modules:

  • asn1
  • oid
  • pem
  • platform
  • threading

Crypto dependencies (high-level)

The X.509 library depends on the following cryptographic modules:

  • pk
  • md
  • mpi
  • sha1

More specifically, calls are made to the following API functions:

mbedtls_pk_can_do
mbedtls_pk_free
mbedtls_pk_get_bitlen
mbedtls_pk_get_name
mbedtls_pk_get_type
mbedtls_pk_load_file
mbedtls_pk_parse_subpubkey
mbedtls_pk_sign
mbedtls_pk_verify_ext
mbedtls_pk_write_pubkey
mbedtls_pk_write_pubkey_der

mbedtls_md
mbedtls_md_get_name
mbedtls_md_get_size
mbedtls_md_info_from_type

mbedtls_mpi_copy
mbedtls_mpi_free
mbedtls_mpi_init

mbedtls_sha1

Note: the dependency on MPI is because the certificate's serial number is stored as an MPI in struct mbedtls_x509write_cert - the MPI is used purely as a container for bytes. The depencency is embedded in the public API as mbedtls_x509write_crt_set_serial take an argument of type mbedtls_mpi *.

Note: the direct dependency on SHA1 is in x509write_crt.c and makes sense because it's the only hash that can be used to compute key identifiers for the Subject Key Identifier and Authority Key Identifier extensions. Replacing that with an algorithm-agnistic API would or course be easy.

File by file analysis

The X.509 library consists of the following C files and associated headers:

x509.c
x509_create.c
x509_crl.c
x509_crt.c
x509_csr.c
x509write_crt.c
x509write_csr.c

x509.c

  • In mbedtls_x509_sig_alg_gets() call mbedtls_md_info_from_type() and mbedtls_md_get_name() to print out information

x509_crl.c

  • In mbedtls_x509_crl_parse_file() call mbedtls_pk_load_file() to load files if MBEDTLS_FS_IO defined

x509_crt.c

Note: All calls to PK APIs in this file use public (not private) keys.

  • In x509_profile_check_key() call mbedtls_pk_get_type() and mbedtls_pk_get_bitlen()

  • In x509_profile_check_key() call mbedtls_pk_ec() to get the group id

  • In x509_crt_parse_der_core() call mbedtls_pk_parse_subpubkey()

  • In mbedtls_x509_crt_parse_file() call mbedtls_pk_load_file() to load files if MBEDTLS_FS_IO defined

  • In mbedtls_x509_crt_info() call mbedtls_pk_get_name() and mbedtls_pk_get_bitlen() to print out information

  • In x509_crt_verifycrl() call mbedtls_md_info_from_type(), mbedtls_md(), mbedtls_pk_verify_ext() and mbedtls_md_get_size() to verify CRL signature

  • In x509_crt_check_signature() call mbedtls_md_info_from_type(), mbedtls_md_get_size(), mbedtls_md(), then mbedtls_pk_can_do() and mbedtls_pk_verify_ext() to verify certificate signature

  • In x509_crt_verify_restartable_ca_cb() call mbedtls_pk_get_type() to check against profile

  • In mbedtls_x509_crt_free() call mbedtls_pk_free()

x509_csr.c

Note: All calls to PK APIs in this file use public (not private) keys.

  • In mbedtls_x509_csr_parse_der() call mbedtls_pk_parse_subpubkey()

  • In mbedtls_x509_csr_parse_file() call mbedtls_pk_load_file() to load files if MBEDTLS_FS_IO defined

  • In mbedtls_x509_csr_info() call mbedtls_pk_get_name() and mbedtls_pk_get_bitlen() to print out information

  • In mbedtls_x509_csr_free() call mbedtls_pk_free()

x509_create.c

No call to crypto functions - mostly ASN.1 writing and data conversion.

x509write_crt.c

Note: Calls to PK APIs in this file are both on public and private keys.

  • In mbedtls_x509write_crt_init(), resp. mbedtls_x509write_crt_free() call mbedtls_mpi_init(), resp. mbedtls_mpi_free() to manage the serial number

  • In mbedtls_x509write_crt_set_serial() call mbedtls_mpi_copy()

  • In mbedtls_x509write_crt_set_subject_key_identifier() and mbedtls_x509write_crt_set_authority_key_identifier() call mbedtls_pk_write_pubkey() and mbedtls_sha1_ret()

  • In mbedtls_x509write_crt_der() call mbedtls_pk_can_do() on a private key (issuer) to write out correct signature algorithm

  • In mbedtls_x509write_crt_der() call mbedtls_pk_write_pubkey_der() on a public key (subject)

  • In mbedtls_x509write_crt_der() call mbedtls_md_info_from_type() and mbedtls_md() to prepare for signing

  • In mbedtls_x509write_crt_der() call mbedtls_pk_sign() on a private key (issuer) to sign certificate being issued

x509write_csr.c

Note: All calls for PK APIs in this file are on private (not public) keys

  • In mbedtls_x509write_csr_der() call mbedtls_pk_write_pubkey_der()

  • In mbedtls_x509write_csr_der() call mbedtls_md_info_from_type() and mbedtls_md()

  • In mbedtls_x509write_csr_der() call mbedtls_pk_sign()

  • Call mbedtls_pk_can_do() on a private key (writer's) to write out correct signature algorithm