/ README.txt
README.txt
  1  # Documentation
  2  
  3  The most up-to-date documentation is supposed to be available on the
  4  [BearSSL Web site](https://www.bearssl.org/).
  5  
  6  # Disclaimer
  7  
  8  BearSSL is considered beta-level software. Most planned functionalities
  9  are implemented; new evolution may still break both source and binary
 10  compatibility.
 11  
 12  Using BearSSL for production purposes would be a relatively bold but not
 13  utterly crazy move. BearSSL is free, open-source software, provided
 14  without any guarantee of fitness or reliability. That being said, it
 15  appears to behave properly, and only minor issues have been found (and
 16  fixed) so far. You are encourage to inspect its API and code for
 17  learning, testing and possibly contributing.
 18  
 19  The usage license is explicited in the `LICENSE.txt` file. This is the
 20  "MIT license". It can be summarised in the following way:
 21  
 22   - You can use and reuse the library as you wish, and modify it, and
 23     integrate it in your own code, and distribute it as is or in any
 24     modified form, and so on.
 25  
 26   - The only obligation that the license terms put upon you is that you
 27     acknowledge and make it clear that if anything breaks, it is not my
 28     fault, and I am not liable for anything, regardless of the type and
 29     amount of collateral damage. The license terms say that the copyright
 30     notice "shall be included in all copies or substantial portions of
 31     the Software": this is how the disclaimer is "made explicit".
 32     Basically, I have put it in every source file, so just keep it there.
 33  
 34  # Installation
 35  
 36  Right now, BearSSL is a simple library, along with a few test and debug
 37  command-line tools. There is no installer yet. The library _can_ be
 38  compiled as a shared library on some systems, but since the binary API
 39  is not fully stabilised, this is not a very good idea to do that right
 40  now.
 41  
 42  To compile the code, just type `make`. This will try to use sane
 43  "default" values. On a Windows system with Visual Studio, run a console
 44  with the environment initialised for a specific version of the C compiler,
 45  and type `nmake`.
 46  
 47  To override the default settings, create a custom configuration file in
 48  the `conf` directory, and invoke `make` (or `nmake`) with an explicit
 49  `CONF=` parameter. For instance, to use the provided `samd20.mk`
 50  configuration file (that targets cross-compilation for an Atmel board
 51  that features a Cortex-M0+ CPU), type:
 52  
 53      make CONF=samd20
 54  
 55  The `conf/samd20.mk` file includes the `Unix.mk` file and then overrides
 56  some of the parameters, including the destination directory. Any custom
 57  configuration can be made the same way.
 58  
 59  Some compile-time options can be set through macros, either on the
 60  compiler command-line, or in the `src/config.h` file. See the comments
 61  in that file. Some settings are autodetected but they can still be
 62  explicitly overridden.
 63  
 64  When compilation is done, the library (static and DLL, when appropriate)
 65  and the command-line tools can be found in the designated build
 66  directory (by default named `build`). The public headers (to be used
 67  by applications linked against BearSSL) are in the `inc/` directory.
 68  
 69  To run the tests:
 70  
 71    - `testcrypto all` runs the cryptographic tests (test vectors on all
 72      implemented cryptogaphic functions). It can be slow. You can also
 73      run a selection of the tests by providing their names (run
 74      `testcrypto` without any parameter to see the available names).
 75  
 76    - `testspeed all` runs a number of performance benchmarks, there again
 77      on cryptographic functions. It gives a taste of how things go on the
 78      current platform. As for `testcrypto`, specific named benchmarks can
 79      be executed.
 80  
 81    - `testx509` runs X.509 validation tests. The test certificates are
 82      all in `test/x509/`.
 83  
 84  The `brssl` command-line tool produced in the build directory is a
 85  stand-alone binary. It can exercise some of the functionalities of
 86  BearSSL, in particular running a test SSL client or server. It is not
 87  meant for production purposes (e.g. the SSL client has a mode where it
 88  disregards the inability to validate the server's certificate, which is
 89  inherently unsafe, but convenient for debug).
 90  
 91  **Using the library** means writing some application code that invokes
 92  it, and linking with the static library. The header files are all in the
 93  `inc` directory; copy them wherever makes sense (e.g. in the
 94  `/usr/local/include` directory). The library itself (`libbearssl.a`) is
 95  what you link against.
 96  
 97  Alternatively, you may want to copy the source files directly into your
 98  own application code. This will make integrating ulterior versions of
 99  BearSSL more difficult. If you still want to go down that road, then
100  simply copy all the `*.h` and `*.c` files from the `src` and `inc`
101  directories into your application source code. In the BearSSL source
102  archive, the source files are segregated into various sub-directories,
103  but this is for my convenience only. There is no technical requirement
104  for that, and all files can be dumped together in a simple directory.
105  
106  Dependencies are simple and systematic:
107  
108    - Each `*.c` file includes `inner.h`
109    - `inner.h` includes `config.h` and `bearssl.h`
110    - `bearssl.h` includes the other `bearssl_*.h`
111  
112  # Versioning
113  
114  I follow this simple version numbering scheme:
115  
116   - Version numbers are `x.y` or `x.y.z` where `x`, `y` and `z` are
117     decimal integers (possibly greater than 10). When the `.z` part is
118     missing, it is equivalent to `.0`.
119  
120   - Backward compatibility is maintained, at both source and binary levels,
121     for each major version: this means that if some application code was
122     designed for version `x.y`, then it should compile, link and run
123     properly with any version `x.y'` for any `y'` greater than `y`.
124  
125     The major version `0` is an exception. You shall not expect that any
126     version that starts with `0.` offers any kind of compatibility,
127     either source or binary, with any other `0.` version. (Of course I
128     will try to maintain some decent level of source compatibility, but I
129     make no promise in that respect. Since the API uses caller-allocated
130     context structures, I already know that binary compatibility _will_
131     be broken.)
132  
133   - Sub-versions (the `y` part) are about added functionality. That is,
134     it can be expected that `1.3` will contain some extra functions when
135     compared to `1.2`. The next version level (the `z` part) is for
136     bugfixes that do not add any functionality.