1*62c56f98SSadaf EbrahimiMbed TLS sample programs 2*62c56f98SSadaf Ebrahimi======================== 3*62c56f98SSadaf Ebrahimi 4*62c56f98SSadaf EbrahimiThis subdirectory mostly contains sample programs that illustrate specific features of the library, as well as a few test and support programs. 5*62c56f98SSadaf Ebrahimi 6*62c56f98SSadaf Ebrahimi## Symmetric cryptography (AES) examples 7*62c56f98SSadaf Ebrahimi 8*62c56f98SSadaf Ebrahimi* [`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*62c56f98SSadaf Ebrahimi 10*62c56f98SSadaf Ebrahimi## Hash (digest) examples 11*62c56f98SSadaf Ebrahimi 12*62c56f98SSadaf Ebrahimi* [`hash/generic_sum.c`](hash/generic_sum.c): file hash calculator and verifier, demonstrating the message digest (`md`) interface. 13*62c56f98SSadaf Ebrahimi 14*62c56f98SSadaf Ebrahimi* [`hash/hello.c`](hash/hello.c): hello-world program for MD5. 15*62c56f98SSadaf Ebrahimi 16*62c56f98SSadaf Ebrahimi## Public-key cryptography examples 17*62c56f98SSadaf Ebrahimi 18*62c56f98SSadaf Ebrahimi### Generic public-key cryptography (`pk`) examples 19*62c56f98SSadaf Ebrahimi 20*62c56f98SSadaf Ebrahimi* [`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. 21*62c56f98SSadaf Ebrahimi 22*62c56f98SSadaf Ebrahimi* [`pkey/key_app.c`](pkey/key_app.c): loads a PEM or DER public key or private key file and dumps its content. 23*62c56f98SSadaf Ebrahimi 24*62c56f98SSadaf Ebrahimi* [`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. 25*62c56f98SSadaf Ebrahimi 26*62c56f98SSadaf Ebrahimi* [`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. 27*62c56f98SSadaf Ebrahimi 28*62c56f98SSadaf Ebrahimi* [`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. 29*62c56f98SSadaf Ebrahimi 30*62c56f98SSadaf Ebrahimi### ECDSA and RSA signature examples 31*62c56f98SSadaf Ebrahimi 32*62c56f98SSadaf Ebrahimi* [`pkey/ecdsa.c`](pkey/ecdsa.c): generates an ECDSA key, signs a fixed message and verifies the signature. 33*62c56f98SSadaf Ebrahimi 34*62c56f98SSadaf Ebrahimi* [`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. 35*62c56f98SSadaf Ebrahimi 36*62c56f98SSadaf Ebrahimi* [`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. 37*62c56f98SSadaf Ebrahimi 38*62c56f98SSadaf Ebrahimi* [`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. 39*62c56f98SSadaf Ebrahimi 40*62c56f98SSadaf Ebrahimi* [`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. 41*62c56f98SSadaf Ebrahimi 42*62c56f98SSadaf Ebrahimi### Diffie-Hellman key exchange examples 43*62c56f98SSadaf Ebrahimi 44*62c56f98SSadaf Ebrahimi* [`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. 45*62c56f98SSadaf Ebrahimi 46*62c56f98SSadaf Ebrahimi* [`pkey/ecdh_curve25519.c`](pkey/ecdh_curve25519.c): demonstration of a elliptic curve Diffie-Hellman (ECDH) key agreement. 47*62c56f98SSadaf Ebrahimi 48*62c56f98SSadaf Ebrahimi### Bignum (`mpi`) usage examples 49*62c56f98SSadaf Ebrahimi 50*62c56f98SSadaf Ebrahimi* [`pkey/dh_genprime.c`](pkey/dh_genprime.c): shows how to use the bignum (`mpi`) interface to generate Diffie-Hellman parameters. 51*62c56f98SSadaf Ebrahimi 52*62c56f98SSadaf Ebrahimi* [`pkey/mpi_demo.c`](pkey/mpi_demo.c): demonstrates operations on big integers. 53*62c56f98SSadaf Ebrahimi 54*62c56f98SSadaf Ebrahimi## Random number generator (RNG) examples 55*62c56f98SSadaf Ebrahimi 56*62c56f98SSadaf Ebrahimi* [`random/gen_entropy.c`](random/gen_entropy.c): shows how to use the default entropy sources to generate random data. 57*62c56f98SSadaf Ebrahimi Note: most applications should only use the entropy generator to seed a cryptographic pseudorandom generator, as illustrated by `random/gen_random_ctr_drbg.c`. 58*62c56f98SSadaf Ebrahimi 59*62c56f98SSadaf Ebrahimi* [`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. 60*62c56f98SSadaf Ebrahimi 61*62c56f98SSadaf Ebrahimi## SSL/TLS examples 62*62c56f98SSadaf Ebrahimi 63*62c56f98SSadaf Ebrahimi### SSL/TLS sample applications 64*62c56f98SSadaf Ebrahimi 65*62c56f98SSadaf Ebrahimi* [`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. 66*62c56f98SSadaf Ebrahimi 67*62c56f98SSadaf Ebrahimi* [`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. 68*62c56f98SSadaf Ebrahimi 69*62c56f98SSadaf Ebrahimi* [`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`. 70*62c56f98SSadaf Ebrahimi 71*62c56f98SSadaf Ebrahimi* [`ssl/ssl_client1.c`](ssl/ssl_client1.c): a simple HTTPS client that sends a fixed request and displays the response. 72*62c56f98SSadaf Ebrahimi 73*62c56f98SSadaf Ebrahimi* [`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*62c56f98SSadaf Ebrahimi 75*62c56f98SSadaf Ebrahimi* [`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. 76*62c56f98SSadaf Ebrahimi 77*62c56f98SSadaf Ebrahimi* [`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. 78*62c56f98SSadaf Ebrahimi 79*62c56f98SSadaf Ebrahimi* [`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. 80*62c56f98SSadaf Ebrahimi 81*62c56f98SSadaf Ebrahimi### SSL/TLS feature demonstrators 82*62c56f98SSadaf Ebrahimi 83*62c56f98SSadaf EbrahimiNote: 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. 84*62c56f98SSadaf Ebrahimi 85*62c56f98SSadaf Ebrahimi* [`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*62c56f98SSadaf Ebrahimi 87*62c56f98SSadaf Ebrahimi* [`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*62c56f98SSadaf Ebrahimi 89*62c56f98SSadaf EbrahimiIn 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. 90*62c56f98SSadaf Ebrahimi 91*62c56f98SSadaf Ebrahimi## Test utilities 92*62c56f98SSadaf Ebrahimi 93*62c56f98SSadaf Ebrahimi* [`test/benchmark.c`](test/benchmark.c): benchmark for cryptographic algorithms. 94*62c56f98SSadaf Ebrahimi 95*62c56f98SSadaf Ebrahimi* [`test/selftest.c`](test/selftest.c): runs the self-test function in each library module. 96*62c56f98SSadaf Ebrahimi 97*62c56f98SSadaf Ebrahimi* [`test/udp_proxy.c`](test/udp_proxy.c): a UDP proxy that can inject certain failures (delay, duplicate, drop). Useful for testing DTLS. 98*62c56f98SSadaf Ebrahimi 99*62c56f98SSadaf Ebrahimi* [`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*62c56f98SSadaf Ebrahimi 101*62c56f98SSadaf Ebrahimi## Development utilities 102*62c56f98SSadaf Ebrahimi 103*62c56f98SSadaf Ebrahimi* [`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. 104*62c56f98SSadaf Ebrahimi 105*62c56f98SSadaf Ebrahimi* [`util/strerror.c`](util/strerror.c): prints the error description corresponding to an integer status returned by an Mbed TLS function. 106*62c56f98SSadaf Ebrahimi 107*62c56f98SSadaf Ebrahimi## X.509 certificate examples 108*62c56f98SSadaf Ebrahimi 109*62c56f98SSadaf Ebrahimi* [`x509/cert_app.c`](x509/cert_app.c): connects to a TLS server and verifies its certificate chain. 110*62c56f98SSadaf Ebrahimi 111*62c56f98SSadaf Ebrahimi* [`x509/cert_req.c`](x509/cert_req.c): generates a certificate signing request (CSR) for a private key. 112*62c56f98SSadaf Ebrahimi 113*62c56f98SSadaf Ebrahimi* [`x509/cert_write.c`](x509/cert_write.c): signs a certificate signing request, or self-signs a certificate. 114*62c56f98SSadaf Ebrahimi 115*62c56f98SSadaf Ebrahimi* [`x509/crl_app.c`](x509/crl_app.c): loads and dumps a certificate revocation list (CRL). 116*62c56f98SSadaf Ebrahimi 117*62c56f98SSadaf Ebrahimi* [`x509/req_app.c`](x509/req_app.c): loads and dumps a certificate signing request (CSR). 118*62c56f98SSadaf Ebrahimi 119