blob: f53bde5611f2b8fa9c89f01341b15d7b1e221a21 [file] [log] [blame] [view]
Gilles Peskineceb7b122018-01-18 23:27:47 +01001Mbed TLS sample programs
2========================
3
4This subdirectory mostly contains sample programs that illustrate specific features of the library, as well as a few test and support programs.
5
6## Symmetric cryptography (AES) examples
7
Gilles Peskineceb7b122018-01-18 23:27:47 +01008* [`aes/crypt_and_hash.c`](aes/crypt_and_hash.c): file encryption and authentication, demonstrating the generic cipher interface and the generic hash interface.
9
10## Hash (digest) examples
11
12* [`hash/generic_sum.c`](hash/generic_sum.c): file hash calculator and verifier, demonstrating the message digest (`md`) interface.
13
14* [`hash/hello.c`](hash/hello.c): hello-world program for MD5.
15
16## Public-key cryptography examples
17
18### Generic public-key cryptography (`pk`) examples
19
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020020* [`pkey/gen_key.c`](pkey/gen_key.c): generates a key for any of the supported public-key algorithms (RSA or ECC) and writes it to a file that can be used by the other pk sample programs.
Gilles Peskineceb7b122018-01-18 23:27:47 +010021
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020022* [`pkey/key_app.c`](pkey/key_app.c): loads a PEM or DER public key or private key file and dumps its content.
Gilles Peskineceb7b122018-01-18 23:27:47 +010023
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020024* [`pkey/key_app_writer.c`](pkey/key_app_writer.c): loads a PEM or DER public key or private key file and writes it to a new PEM or DER file.
Gilles Peskineceb7b122018-01-18 23:27:47 +010025
Gilles Peskine27a04602018-08-06 20:09:16 +020026* [`pkey/pk_encrypt.c`](pkey/pk_encrypt.c), [`pkey/pk_decrypt.c`](pkey/pk_decrypt.c): loads a PEM or DER public/private key file and uses the key to encrypt/decrypt a short string through the generic public-key interface.
Gilles Peskineceb7b122018-01-18 23:27:47 +010027
Gilles Peskine27a04602018-08-06 20:09:16 +020028* [`pkey/pk_sign.c`](pkey/pk_sign.c), [`pkey/pk_verify.c`](pkey/pk_verify.c): loads a PEM or DER private/public key file and uses the key to sign/verify a short string.
Gilles Peskineceb7b122018-01-18 23:27:47 +010029
30### ECDSA and RSA signature examples
31
Gilles Peskine0b544192018-08-10 11:32:11 +020032* [`pkey/ecdsa.c`](pkey/ecdsa.c): generates an ECDSA key, signs a fixed message and verifies the signature.
Gilles Peskineceb7b122018-01-18 23:27:47 +010033
Gilles Peskine27a04602018-08-06 20:09:16 +020034* [`pkey/rsa_encrypt.c`](pkey/rsa_encrypt.c), [`pkey/rsa_decrypt.c`](pkey/rsa_decrypt.c): loads an RSA public/private key and uses it to encrypt/decrypt a short string through the low-level RSA interface.
Gilles Peskineceb7b122018-01-18 23:27:47 +010035
Gilles Peskine27a04602018-08-06 20:09:16 +020036* [`pkey/rsa_genkey.c`](pkey/rsa_genkey.c): generates an RSA key and writes it to a file that can be used with the other RSA sample programs.
Gilles Peskineceb7b122018-01-18 23:27:47 +010037
Gilles Peskine27a04602018-08-06 20:09:16 +020038* [`pkey/rsa_sign.c`](pkey/rsa_sign.c), [`pkey/rsa_verify.c`](pkey/rsa_verify.c): loads an RSA private/public key and uses it to sign/verify a short string with the RSA PKCS#1 v1.5 algorithm.
Gilles Peskineceb7b122018-01-18 23:27:47 +010039
Gilles Peskine0b544192018-08-10 11:32:11 +020040* [`pkey/rsa_sign_pss.c`](pkey/rsa_sign_pss.c), [`pkey/rsa_verify_pss.c`](pkey/rsa_verify_pss.c): loads an RSA private/public key and uses it to sign/verify a short string with the RSASSA-PSS algorithm.
Gilles Peskineceb7b122018-01-18 23:27:47 +010041
42### Diffie-Hellman key exchange examples
43
Gilles Peskine27a04602018-08-06 20:09:16 +020044* [`pkey/dh_client.c`](pkey/dh_client.c), [`pkey/dh_server.c`](pkey/dh_server.c): secure channel demonstrators (client, server). This pair of programs illustrates how to set up a secure channel using RSA for authentication and Diffie-Hellman to generate a shared AES session key.
Gilles Peskineceb7b122018-01-18 23:27:47 +010045
46* [`pkey/ecdh_curve25519.c`](pkey/ecdh_curve25519.c): demonstration of a elliptic curve Diffie-Hellman (ECDH) key agreement.
47
48### Bignum (`mpi`) usage examples
49
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020050* [`pkey/dh_genprime.c`](pkey/dh_genprime.c): shows how to use the bignum (`mpi`) interface to generate Diffie-Hellman parameters.
Gilles Peskineceb7b122018-01-18 23:27:47 +010051
52* [`pkey/mpi_demo.c`](pkey/mpi_demo.c): demonstrates operations on big integers.
53
54## Random number generator (RNG) examples
55
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020056* [`random/gen_entropy.c`](random/gen_entropy.c): shows how to use the default entropy sources to generate random data.
57 Note: most applications should only use the entropy generator to seed a cryptographic pseudorandom generator, as illustrated by `random/gen_random_ctr_drbg.c`.
Gilles Peskineceb7b122018-01-18 23:27:47 +010058
Gilles Peskineaa220302018-08-06 20:19:50 +020059* [`random/gen_random_ctr_drbg.c`](random/gen_random_ctr_drbg.c): shows how to use the default entropy sources to seed a pseudorandom generator, and how to use the resulting random generator to generate random data.
Gilles Peskineceb7b122018-01-18 23:27:47 +010060
Gilles Peskineceb7b122018-01-18 23:27:47 +010061## SSL/TLS examples
62
63### SSL/TLS sample applications
64
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020065* [`ssl/dtls_client.c`](ssl/dtls_client.c): a simple DTLS client program, which sends one datagram to the server and reads one datagram in response.
Gilles Peskineceb7b122018-01-18 23:27:47 +010066
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020067* [`ssl/dtls_server.c`](ssl/dtls_server.c): a simple DTLS server program, which expects one datagram from the client and writes one datagram in response. This program supports DTLS cookies for hello verification.
Gilles Peskineceb7b122018-01-18 23:27:47 +010068
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020069* [`ssl/mini_client.c`](ssl/mini_client.c): a minimalistic SSL client, which sends a short string and disconnects. This is primarily intended as a benchmark; for a better example of a typical TLS client, see `ssl/ssl_client1.c`.
Gilles Peskineceb7b122018-01-18 23:27:47 +010070
71* [`ssl/ssl_client1.c`](ssl/ssl_client1.c): a simple HTTPS client that sends a fixed request and displays the response.
72
73* [`ssl/ssl_fork_server.c`](ssl/ssl_fork_server.c): a simple HTTPS server using one process per client to send a fixed response. This program requires a Unix/POSIX environment implementing the `fork` system call.
74
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020075* [`ssl/ssl_mail_client.c`](ssl/ssl_mail_client.c): a simple SMTP-over-TLS or SMTP-STARTTLS client. This client sends an email with fixed content.
Gilles Peskineceb7b122018-01-18 23:27:47 +010076
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020077* [`ssl/ssl_pthread_server.c`](ssl/ssl_pthread_server.c): a simple HTTPS server using one thread per client to send a fixed response. This program requires the pthread library.
Gilles Peskineceb7b122018-01-18 23:27:47 +010078
Gilles Peskineaa220302018-08-06 20:19:50 +020079* [`ssl/ssl_server.c`](ssl/ssl_server.c): a simple HTTPS server that sends a fixed response. It serves a single client at a time.
Gilles Peskineceb7b122018-01-18 23:27:47 +010080
81### SSL/TLS feature demonstrators
82
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020083Note: unlike most of the other programs under the `programs/` directory, these two programs are not intended as a basis for writing an application. They combine most of the features supported by the library, and most applications require only a few features. To write a new application, we recommended that you start with `ssl_client1.c` or `ssl_server.c`, and then look inside `ssl/ssl_client2.c` or `ssl/ssl_server2.c` to see how to use the specific features that your application needs.
Gilles Peskineceb7b122018-01-18 23:27:47 +010084
85* [`ssl/ssl_client2.c`](ssl/ssl_client2.c): an HTTPS client that sends a fixed request and displays the response, with options to select TLS protocol features and Mbed TLS library features.
86
87* [`ssl/ssl_server2.c`](ssl/ssl_server2.c): an HTTPS server that sends a fixed response, with options to select TLS protocol features and Mbed TLS library features.
88
Gilles Peskineaa220302018-08-06 20:19:50 +020089In addition to providing options for testing client-side features, the `ssl_client2` program has options that allow you to trigger certain behaviors in the server. For example, there are options to select ciphersuites, or to force a renegotiation. These options are useful for testing the corresponding features in a TLS server. Likewise, `ssl_server2` has options to activate certain behaviors that are useful for testing a TLS client.
Gilles Peskineceb7b122018-01-18 23:27:47 +010090
91## Test utilities
92
93* [`test/benchmark.c`](test/benchmark.c): benchmark for cryptographic algorithms.
94
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020095* [`test/selftest.c`](test/selftest.c): runs the self-test function in each library module.
Gilles Peskineceb7b122018-01-18 23:27:47 +010096
Gilles Peskine6b9cbb82018-07-30 20:06:19 +020097* [`test/udp_proxy.c`](test/udp_proxy.c): a UDP proxy that can inject certain failures (delay, duplicate, drop). Useful for testing DTLS.
Gilles Peskineceb7b122018-01-18 23:27:47 +010098
Gilles Peskineffbdc612018-08-10 11:48:52 +020099* [`test/zeroize.c`](test/zeroize.c): a test program for `mbedtls_platform_zeroize`, used by [`tests/scripts/test_zeroize.gdb`](tests/scripts/test_zeroize.gdb).
100
Gilles Peskineceb7b122018-01-18 23:27:47 +0100101## Development utilities
102
Gilles Peskine6b9cbb82018-07-30 20:06:19 +0200103* [`util/pem2der.c`](util/pem2der.c): a PEM to DER converter. Mbed TLS can read PEM files directly, but this utility can be useful for interacting with other tools or with minimal Mbed TLS builds that lack PEM support.
Gilles Peskineceb7b122018-01-18 23:27:47 +0100104
Gilles Peskine6b9cbb82018-07-30 20:06:19 +0200105* [`util/strerror.c`](util/strerror.c): prints the error description corresponding to an integer status returned by an Mbed TLS function.
Gilles Peskineceb7b122018-01-18 23:27:47 +0100106
107## X.509 certificate examples
108
Gilles Peskine6b9cbb82018-07-30 20:06:19 +0200109* [`x509/cert_app.c`](x509/cert_app.c): connects to a TLS server and verifies its certificate chain.
Gilles Peskineceb7b122018-01-18 23:27:47 +0100110
Gilles Peskine6b9cbb82018-07-30 20:06:19 +0200111* [`x509/cert_req.c`](x509/cert_req.c): generates a certificate signing request (CSR) for a private key.
Gilles Peskineceb7b122018-01-18 23:27:47 +0100112
Gilles Peskine27a04602018-08-06 20:09:16 +0200113* [`x509/cert_write.c`](x509/cert_write.c): signs a certificate signing request, or self-signs a certificate.
Gilles Peskineceb7b122018-01-18 23:27:47 +0100114
Gilles Peskine6b9cbb82018-07-30 20:06:19 +0200115* [`x509/crl_app.c`](x509/crl_app.c): loads and dumps a certificate revocation list (CRL).
Gilles Peskineceb7b122018-01-18 23:27:47 +0100116
Gilles Peskine6b9cbb82018-07-30 20:06:19 +0200117* [`x509/req_app.c`](x509/req_app.c): loads and dumps a certificate signing request (CSR).
Gilles Peskineceb7b122018-01-18 23:27:47 +0100118