Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 1 | =================== |
Manuel Pégourié-Gonnard | b4fe3cb | 2015-01-22 16:11:05 +0000 | [diff] [blame] | 2 | README for mbed TLS |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 3 | =================== |
| 4 | |
Manuel Pégourié-Gonnard | 6cf1164 | 2014-11-14 12:29:59 +0100 | [diff] [blame] | 5 | Configuration |
| 6 | ============= |
| 7 | |
Manuel Pégourié-Gonnard | 7f80997 | 2015-03-09 17:05:11 +0000 | [diff] [blame] | 8 | mbed TLS should build out of the box on most systems. Some platform specific options are available in the fully-documented configuration file *include/mbedtls/config.h*, which is also the place where features can be selected. |
Manuel Pégourié-Gonnard | 6cf1164 | 2014-11-14 12:29:59 +0100 | [diff] [blame] | 9 | This file can be edited manually, or in a more programmatic way using the Perl |
| 10 | script *scripts/config.pl* (use *--help* for usage instructions). |
| 11 | |
| 12 | Compiler options can be set using standard variables such as *CC* and *CFLAGS* when using the Make and CMake build system (see below). |
| 13 | |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 14 | Compiling |
| 15 | ========= |
| 16 | |
Manuel Pégourié-Gonnard | 94f160a | 2015-07-28 15:36:39 +0200 | [diff] [blame] | 17 | There are currently four active build systems within the mbed TLS releases: |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 18 | |
Manuel Pégourié-Gonnard | 94f160a | 2015-07-28 15:36:39 +0200 | [diff] [blame] | 19 | - yotta |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 20 | - Make |
| 21 | - CMake |
Paul Bakker | 5c7bc9c | 2014-05-02 13:11:59 +0200 | [diff] [blame] | 22 | - Microsoft Visual Studio (Visual Studio 6 and Visual Studio 2010) |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 23 | |
Manuel Pégourié-Gonnard | 94f160a | 2015-07-28 15:36:39 +0200 | [diff] [blame] | 24 | The main systems used for development are CMake and yotta. Those systems are always complete and up-to-date. The others should reflect all changes present in the CMake and yotta build system, but some features are not ported there by default. |
| 25 | |
| 26 | Please note that the yotta option is slightly different from the other build systems: |
| 27 | |
| 28 | - a more minimalistic configuration file is used by default |
| 29 | - depending on the yotta target, features of mbed OS will be used in examples and tests |
| 30 | |
| 31 | Yotta |
| 32 | ----- |
| 33 | |
| 34 | `yotta <http://yottabuild.org>` is a package manager and build system developped by mbed; it is the build system of mbed OS. To install it on your platform, please follow the `yotta installation instructions <http://docs.yottabuild.org/#installing>`. |
| 35 | |
| 36 | Once yotta is installed, you can use it to download the latest version of mbed TLS form the yotta registry with:: |
| 37 | |
| 38 | yotta install mbedtls |
| 39 | |
| 40 | and build it with:: |
| 41 | |
| 42 | yotta build |
| 43 | |
| 44 | If, on the other hand, you already have a copy of mbed TLS from a source other than the yotta registry, for example from cloning our github repository, or from downloading a tarball of the standalone edition, then you'll need first need to generate the yotta module by running:: |
| 45 | |
| 46 | yotta/create-module.sh |
| 47 | |
| 48 | from the mbed TLS root directory. This will create the yotta module in the *yotta/module* directory. You can then change to that directory and build as usual:: |
| 49 | |
| 50 | cd yotta/module |
| 51 | yotta build |
| 52 | |
| 53 | In any case, you'll probably want to set the yotta target before building unless it's already set globally; for more information on using yotta, please consult the `yotta documentation <http://docs.yottabuild.org/>`. |
| 54 | |
Manuel Pégourié-Gonnard | 5f9245d | 2015-08-13 16:03:12 +0200 | [diff] [blame] | 55 | The yotta edition of mbed TLS includes a few example programs, some of which demonstrate integration with mbed OS; for more details, please consult the `Readme at the root of the yotta module <https://github.com/ARMmbed/mbedtls/blob/development/yotta/data/README.md>`. |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 56 | |
| 57 | Make |
| 58 | ---- |
| 59 | |
| 60 | We intentionally only use the absolute minimum of **Make** functionality, as we have discovered that a lot of **Make** features are not supported on all different implementations of Make on different platforms. As such, the Makefiles sometimes require some handwork or `export` statements in order to work for your platform. |
| 61 | |
Paul Bakker | 5c7bc9c | 2014-05-02 13:11:59 +0200 | [diff] [blame] | 62 | In order to build the source using Make, just enter at the command line:: |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 63 | |
| 64 | make |
| 65 | |
Paul Bakker | 5c7bc9c | 2014-05-02 13:11:59 +0200 | [diff] [blame] | 66 | In order to run the tests, enter:: |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 67 | |
| 68 | make check |
| 69 | |
Manuel Pégourié-Gonnard | fc10193 | 2015-07-08 22:24:22 +0100 | [diff] [blame] | 70 | The tests need Perl to be built and run. If you don't have Perl installed, you can skip buiding the tests with:: |
| 71 | |
| 72 | make no_test |
| 73 | |
| 74 | You'll still be able to run a much smaller set of tests with:: |
| 75 | |
| 76 | programs/test/selftest |
| 77 | |
| 78 | In order to build for a Windows platform, you should use WINDOWS_BUILD=1 if the target is Windows but the build environment is Unix-like (for instance when cross-compiling, or compiling from an MSYS shell), and WINDOWS=1 if the build environment is a Windows shell (for instance using mingw32-make) (in that case some targets will not be available). |
Manuel Pégourié-Gonnard | ea0184b | 2015-02-16 15:42:16 +0000 | [diff] [blame] | 79 | |
Manuel Pégourié-Gonnard | 40f315a | 2015-03-13 13:49:26 +0000 | [diff] [blame] | 80 | Setting the variable SHARED in your environment will build a shared library in addition to the static library. Setting DEBUG gives you a debug build. You can override CFLAGS and LDFLAGS by setting them in your environment or on the make command line; if you do so, essential parts such as -I will still be preserved. Warning options may be overridden separately using WARNING_CFLAGS. |
| 81 | |
Manuel Pégourié-Gonnard | fe44643 | 2015-03-06 13:17:10 +0000 | [diff] [blame] | 82 | Depending on your platform, you might run into some issues. Please check the Makefiles in *library/*, *programs/* and *tests/* for options to manually add or remove for specific platforms. You can also check `the mbed TLS Knowledge Base <https://tls.mbed.org/kb>`_ for articles on your platform or issue. |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 83 | |
| 84 | In case you find that you need to do something else as well, please let us know what, so we can add it to the KB. |
| 85 | |
| 86 | CMake |
| 87 | ----- |
| 88 | |
Paul Bakker | 5c7bc9c | 2014-05-02 13:11:59 +0200 | [diff] [blame] | 89 | In order to build the source using CMake, just enter at the command line:: |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 90 | |
| 91 | cmake . |
| 92 | |
| 93 | make |
| 94 | |
Manuel Pégourié-Gonnard | fc10193 | 2015-07-08 22:24:22 +0100 | [diff] [blame] | 95 | The test suites need Perl to be built. If you don't have Perl installed, you'll want to disable the test suites with:: |
| 96 | |
| 97 | cmake -DENABLE_TESTING=Off . |
| 98 | |
Manuel Pégourié-Gonnard | ca89d89 | 2014-11-13 13:56:05 +0100 | [diff] [blame] | 99 | There are many different build modes available within the CMake buildsystem. Most of them are available for gcc and clang, though some are compiler-specific: |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 100 | |
| 101 | - Release. |
| 102 | This generates the default code without any unnecessary information in the binary files. |
| 103 | - Debug. |
| 104 | This generates debug information and disables optimization of the code. |
| 105 | - Coverage. |
| 106 | This generates code coverage information in addition to debug information. |
Manuel Pégourié-Gonnard | e306fe0 | 2014-06-25 12:42:46 +0200 | [diff] [blame] | 107 | - ASan. |
| 108 | This instruments the code with AddressSanitizer to check for memory errors. |
Manuel Pégourié-Gonnard | ca89d89 | 2014-11-13 13:56:05 +0100 | [diff] [blame] | 109 | (This includes LeakSanitizer, with recent version of gcc and clang.) |
Reini Urban | 70dbfaa | 2015-02-09 15:24:08 +0100 | [diff] [blame] | 110 | (With recent version of clang, this mode also instruments the code with |
Manuel Pégourié-Gonnard | ca89d89 | 2014-11-13 13:56:05 +0100 | [diff] [blame] | 111 | UndefinedSanitizer to check for undefined behaviour.) |
| 112 | - ASanDbg. |
| 113 | Same as ASan but slower, with debug information and better stack traces. |
| 114 | - MemSan. |
Paul Bakker | 6152b02 | 2015-04-14 15:00:09 +0200 | [diff] [blame] | 115 | This instruments the code with MemorySanitizer to check for uninitialised |
Manuel Pégourié-Gonnard | ca89d89 | 2014-11-13 13:56:05 +0100 | [diff] [blame] | 116 | memory reads. Experimental, needs recent clang on Linux/x86_64. |
| 117 | - MemSanDbg. |
Manuel Pégourié-Gonnard | 814f13b | 2015-07-02 19:34:18 +0200 | [diff] [blame] | 118 | Same as MemSan but slower, with debug information, better stack traces and |
Manuel Pégourié-Gonnard | ca89d89 | 2014-11-13 13:56:05 +0100 | [diff] [blame] | 119 | origin tracking. |
Manuel Pégourié-Gonnard | e306fe0 | 2014-06-25 12:42:46 +0200 | [diff] [blame] | 120 | - Check. |
Reini Urban | 70dbfaa | 2015-02-09 15:24:08 +0100 | [diff] [blame] | 121 | This activates the compiler warnings that depend on optimization and treats |
Manuel Pégourié-Gonnard | ca89d89 | 2014-11-13 13:56:05 +0100 | [diff] [blame] | 122 | all warnings as errors. |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 123 | |
| 124 | Switching build modes in CMake is simple. For debug mode, enter at the command line: |
| 125 | |
| 126 | cmake -D CMAKE_BUILD_TYPE:String="Debug" . |
| 127 | |
Manuel Pégourié-Gonnard | e80083c | 2014-11-14 13:52:32 +0100 | [diff] [blame] | 128 | Note that, with CMake, if you want to change the compiler or its options after you already ran CMake, you need to clear its cache first, eg (using GNU find):: |
| 129 | |
| 130 | find . -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} + |
| 131 | CC=gcc CFLAGS='-fstack-protector-strong -Wa,--noexecstack' cmake . |
| 132 | |
Paul Bakker | 5c7bc9c | 2014-05-02 13:11:59 +0200 | [diff] [blame] | 133 | In order to run the tests, enter:: |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 134 | |
| 135 | make test |
| 136 | |
Manuel Pégourié-Gonnard | fc10193 | 2015-07-08 22:24:22 +0100 | [diff] [blame] | 137 | If you disabled the test suites, but kept the progams enabled, you can still run a much smaller set of tests with:: |
| 138 | |
| 139 | programs/test/selftest |
| 140 | |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 141 | Microsoft Visual Studio |
| 142 | ----------------------- |
| 143 | |
Manuel Pégourié-Gonnard | 22169ec | 2015-07-02 19:43:48 +0200 | [diff] [blame] | 144 | The build files for Microsoft Visual Studio are generated for Visual Studio 2010. |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 145 | |
Manuel Pégourié-Gonnard | fc10193 | 2015-07-08 22:24:22 +0100 | [diff] [blame] | 146 | The solution file 'mbedTLS.sln' contains all the basic projects needed to build the library and all the programs. The files in tests are not generated and compiled, as these need a perl environment as well. However, the `selftest` program in *programs/test/* is still available. |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 147 | |
| 148 | Example programs |
| 149 | ================ |
| 150 | |
| 151 | We've included example programs for a lot of different features and uses in *programs/*. Most programs only focus on a single feature or usage scenario, so keep that in mind when copying parts of the code. |
| 152 | |
| 153 | Tests |
| 154 | ===== |
| 155 | |
Manuel Pégourié-Gonnard | fc10193 | 2015-07-08 22:24:22 +0100 | [diff] [blame] | 156 | mbed TLS includes an elaborate test suite in *tests/* that initially requires Perl to generate the tests files (e.g. *test_suite_mpi.c*). These files are generates from a **function file** (e.g. *suites/test_suite_mpi.function*) and a **data file** (e.g. *suites/test_suite_mpi.data*). The **function file** contains the test functions. The **data file** contains the test cases, specified as parameters that will be passed to the test function. |
Paul Bakker | 5c7bc9c | 2014-05-02 13:11:59 +0200 | [diff] [blame] | 157 | |
Reini Urban | 70dbfaa | 2015-02-09 15:24:08 +0100 | [diff] [blame] | 158 | For machines with a Unix shell and OpenSSL (and optionally GnuTLS) installed, additional test scripts are available: |
Manuel Pégourié-Gonnard | ca89d89 | 2014-11-13 13:56:05 +0100 | [diff] [blame] | 159 | |
| 160 | - *tests/ssl-opt.sh* runs integration tests for various TLS options (renegotiation, resumption, etc.) and tests interoperability of these options with other implementations. |
| 161 | - *tests/compat.sh* tests interoperability of every ciphersuite with other implementations. |
| 162 | - *tests/scripts/test-ref-configs.pl* test builds in various reduced configurations. |
Manuel Pégourié-Gonnard | fc10193 | 2015-07-08 22:24:22 +0100 | [diff] [blame] | 163 | - *tests/scripts/all.sh* runs a combination of the above tests, plus some more, with various build options (such as ASan, full *config.h*, etc). |
Manuel Pégourié-Gonnard | ca89d89 | 2014-11-13 13:56:05 +0100 | [diff] [blame] | 164 | |
Paul Bakker | 5c7bc9c | 2014-05-02 13:11:59 +0200 | [diff] [blame] | 165 | Configurations |
| 166 | ============== |
| 167 | |
| 168 | We provide some non-standard configurations focused on specific use cases in the configs/ directory. You can read more about those in configs/README.txt |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 169 | |
| 170 | Contributing |
| 171 | ============ |
| 172 | |
Paul Bakker | 5c7bc9c | 2014-05-02 13:11:59 +0200 | [diff] [blame] | 173 | We graciously accept bugs and contributions from the community. There are some requirements we need to fulfil in order to be able to integrate contributions in the main code. |
| 174 | |
| 175 | Simple bug fixes to existing code do not contain copyright themselves and we can integrate those without any issue. The same goes for trivial contributions. |
| 176 | |
| 177 | For larger contributions, e.g. a new feature, the code possible falls under copyright law. We then need your consent to share in the ownership of the copyright. We have a form for that, which we will mail to you in case you submit a contribution or pull request that we deem this necessary for. |
| 178 | |
| 179 | Process |
| 180 | ------- |
Manuel Pégourié-Gonnard | fe44643 | 2015-03-06 13:17:10 +0000 | [diff] [blame] | 181 | #. `Check for open issues <https://github.com/ARMmbed/mbedtls/issues>`_ or |
| 182 | `start a discussion <https://tls.mbed.org/discussions>`_ around a feature |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 183 | idea or a bug. |
Manuel Pégourié-Gonnard | fe44643 | 2015-03-06 13:17:10 +0000 | [diff] [blame] | 184 | #. Fork the `mbed TLS repository on Github <https://github.com/ARMmbed/mbedtls>`_ |
Manuel Pégourié-Gonnard | 5597174 | 2015-07-22 18:14:55 +0200 | [diff] [blame] | 185 | to start making your changes. As a general rule, you should use the |
| 186 | "development" branch as a basis. |
Paul Bakker | 6d72f33 | 2013-06-28 10:25:03 +0200 | [diff] [blame] | 187 | #. Write a test which shows that the bug was fixed or that the feature works |
| 188 | as expected. |
| 189 | #. Send a pull request and bug us until it gets merged and published. We will |
| 190 | include your name in the ChangeLog :) |