From 8f0277be098dbefc5575c6ba91c678b4fea3ff47 Mon Sep 17 00:00:00 2001
From: Andrej Shadura <andrew.shadura@collabora.co.uk>
Date: Tue, 25 Aug 2020 16:24:20 +0200
Subject: [PATCH] Add TLS stack investigation concept design

Future changes to the licensing of some TLS implementations are
compounding an already uncertain licensing situation. Add a document
describing the situation; an analysis of options to rectify this and
our recommendations.

Signed-off-by: Andrej Shadura <andrew.shadura@collabora.co.uk>
Signed-off-by: Martyn Welch <martyn.welch@collabora.com>
---
 content/concepts/tls-stack.md | 773 ++++++++++++++++++++++++++++++++++
 1 file changed, 773 insertions(+)
 create mode 100644 content/concepts/tls-stack.md

diff --git a/content/concepts/tls-stack.md b/content/concepts/tls-stack.md
new file mode 100644
index 000000000..604d0725a
--- /dev/null
+++ b/content/concepts/tls-stack.md
@@ -0,0 +1,773 @@
+---
+title: License-compliant TLS stack for Apertis targets
+date: 2020-09-10
+weight: 100
+outputs:
+  - html
+  - pdf-in
+---
+
+The Apertis distribution is targeted towards the development of and use in
+electronic devices. In line with this goal, the Apertis project strives to
+provide software components that, where there is intent that they form part of
+the software stack on the devices themselves, are free from licensing
+constraints that may make it unsuitable in certain use cases. An example is
+software licensed under the terms of the GNU
+[GPL-3](https://www.gnu.org/licenses/gpl-3.0.en.html) (General Public License)
+or [LGPL-3](https://www.gnu.org/licenses/lgpl-3.0.en.html) (Lesser General
+Public License) which are known to present a problem as they sometimes
+[conflict with regulatory requirements]({{< ref "license-expectations.md#licensing-constraints" >}})
+and thus Apertis will take measures to avoid such packages being provided as
+part of the "target"
+[package repositories]({{< ref "license-expectations.md#apertis-repository-component-specific-rules" >}}).
+
+Providing suitable and compatible
+[Transport Layer Security](https://en.wikipedia.org/wiki/Transport_Layer_Security)
+(TLS) libraries has already required some measures to be taken to meet the
+licensing expectations of the Apertis project, but changes in the licensing of
+newer versions from the upstream projects now requires a longer term strategy
+to be considered and implemented.
+
+# Overview of the existing situation
+
+The "target" section of Apertis ships a variety of packages which use TLS from a
+provided library.  There are a number of software libraries that provide
+competing TLS implementations and which are provided under various licensing
+terms. However, these projects do not always provide the same programming
+interfaces, thus do not provide a drop in replacement for each other. Whilst
+some users of TLS libraries may provide some level of abstraction to support
+more than one TLS library, others may support only one and thus Apertis
+currently provides [GnuTLS](https://www.gnutls.org/),
+[OpenSSL](https://www.openssl.org/) and
+[NSS](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS).
+
+- **GnuTLS**: Apertis currently provides GnuTLS version 3.4.10. This is an
+  approximately four-year-old version of GnuTLS as shipped in Ubuntu Xenial and
+  thus is currently supported by Ubuntu and is expected to be until 2022.
+  GnuTLS is used directly or indirectly via libcurl in just more than a dozen
+  packages in target. Debian Buster, the current main upstream of Apertis,
+  includes a newer version of GnuTLS (currently 3.6.7) though upgrading to this
+  has already been avoided due to licensing issues that will be discussed
+  below.
+
+- **OpenSSL**: Apertis currently provides OpenSSL version 1.1.1. This is a
+  relatively recent release in the 1.1.1 series and is packaged as part of 
+  Debian Buster. The 1.1.1 series is
+  [currently supported](https://www.openssl.org/policies/releasestrat.html) as
+  an LTS release by the OpenSSL project until September 2023. Support for 
+  Debian Buster [is expected](https://wiki.debian.org/LTS) until June 2024.
+
+- **NSS**: Apertis currently provides NSS version 3.42.1. This version
+  is approximately a year and a half old, and is packaged as part of Debian
+  Buster. As with OpenSSL, support for Debian Buster
+  [is expected](https://wiki.debian.org/LTS) until June 2024.
+ 
+Some of the packages requiring TLS support only support one of the currently
+provided TLS implementations, often due to licensing compatibility.  Other
+packages, most notably libraries, support multiple TLS backends, frequently
+including both GnuTLS and OpenSSL as options. For more information, see the
+detailed analysis in the [Appendix]({{< ref "#appendix" >}}).
+
+# Issue
+
+The TLS libraries used in Apertis today are currently supported, though this
+will not remain the case indefinitely, with Ubuntu dropping support for the
+currently used GnuTLS in 2022 and OpenSSL 1.1 losing support in 2024.
+
+Future releases of Apertis would be expected to be based on newer versions of
+Debian (as covered in the [Apertis Release Flow]({{< ref
+"release-flow.md#apertis-release-flow" >}}). As could be expected, newer
+versions of Debian have integrated newer versions of these TLS libraries.
+Upgrading to newer versions of the GnuTLS or OpenSSL may present issues for
+Apertis:
+
+- **GnuTLS**: Whilst GnuTLS is licensed under the
+[LGPL-2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html), it uses
+[Nettle](https://www.lysator.liu.se/~nisse/nettle/nettle.html) and
+[GMP](https://gmplib.org/). Newer versions of both of these dependencies are
+now licensed as dual GPL-2 and LGPL-3, rather than **L**GPL-2.1. 
+  
+  To avoid including GnuTLS under LGPL-3 terms, should Apertis integrate a
+newer version it would need to be utilized under the GPL-2 terms. This would
+result in the binary GnuTLS library effectively being used under the terms of
+the GPL-2 rather than LGPL-2.1. This would restrict Apertis users from using
+this Apertis provided TLS implementation either directly or indirectly from any
+non-GPL-2 compatible applications they wish to integrate into their systems,
+for example in proprietary applications, where it would have the effect of
+requiring the app to also be GPL-2 licensed.
+
+- **OpenSSL**: The currently used version of OpenSSL is licensed under a custom
+GPL-incompatible license. OpenSSL 3.0 (the next major version of OpenSSL) will
+be licensed under the [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+license, which is compatible with the GPL-3, but not GPL-2. This means that
+GPL-2 tools like `tumbler`, `connman`, `apt` or `systemd-journal-remote` cannot
+use the newer versions of OpenSSL without effectively becoming GPL-3 licensed
+or through these upstream projects applying a license exceptions (for example
+as [OpenVPN](https://spdx.org/licenses/openvpn-openssl-exception.html) has).
+The OpenSSL project do not seem to hold a strong opinion on the compatibility,
+though [suggest](https://www.openssl.org/docs/faq.html#LEGAL2) either not using
+the GPL or applying an exception should you wish to gain some legal certainty.
+
+Given the security sensitive nature of the TLS stack, utilizing unmaintained
+software here would be best avoided. Putting maintenance aside, these versions
+of their respective TLS implementations may not be gaining support for any new
+ciphers and TLS protocol versions, which will severely limit their usefulness as
+time progresses. As well as not gaining newer protocol versions, the libraries
+may not be updated to reflect the frequently changing
+[recommendations regarding minimal protocol versions](https://wiki.mozilla.org/Security/Server_Side_TLS)
+that should be supported, which may result in issues when attempting to access
+sites following the "Modern" recommendation. Additionally, it is likely that
+newer versions of the packages utilizing these TLS implementations will begin
+to require functionality added to newer versions of the TLS libraries thus
+reducing the ability of Apertis to upgrade to these too.
+
+It is therefore imperative that a way forward is agreed upon that is acceptable
+to Apertis' stakeholders.
+
+# Goals and requirements
+
+The broad aim of this proposal is to reach a state where Apertis is able to
+provide TLS functionality not just for the packages contained within its own
+repositories, but to support applications added by those utilizing Apertis as
+well.
+
+- **Requirement:** TLS implementation does not require code covered by licenses
+  that are incompatible with the target repositories rules
+- **Requirement:** TLS implementation is licensed under terms that does not
+  preclude its use from existing target applications
+- **Requirement:** TLS implementation is licensed under terms that does not
+  preclude its use from users proprietary applications
+
+Ideally the solution would also enable Apertis to standardize on a single TLS
+stack. Each TLS implementation has its own quirks, such as different ways to
+manage certificates. Standardizing on a single solution would make the platform
+more coherent and efficient, reducing maintenance by only needing to track
+security issues and deploy updates for a single implementation. While this may
+not be viable for the wide range of software provided by Apertis across all
+repositories, it may be possible to standardize on a single stack for the
+target components. If standardizing on a single TLS implementation would
+require excessive effort, an alternative solution would be to have multiple TLS
+libraries (for example, using GnuTLS only for programs that don't support
+OpenSSL), but to designate one as the recommended solution for use in products.
+
+- **Preference:** Single TLS stack used for components in `target`.
+
+# Alternative SSL solutions
+
+In addition to GnuTLS and OpenSSL, there are a number of other TLS libraries
+available, including:
+
+## BoringSSL
+
+[BoringSSL](https://boringssl.googlesource.com/boringssl/) is a fork of OpenSSL
+being actively maintained by Google for internal use. It currently provides an
+OpenSSL based API, but explicitly states it comes with no API-ABI guarantees,
+users should expect API changes as deemed suitable for Googles internal users.
+BoringSSL maintains the current licensing state, though as it's developed the
+amount of OpenSSL-licensed code is reduced, in part through the removal of
+legacy code.  Googles additions are currently provided under the ISC license.
+
+## LibreSSL
+
+[LibreSSL](https://www.libressl.org/) is maintained by OpenBSD, it is a fork of
+OpenSSL v1.0.1, made as a result of the poor maintenance of OpenSSL at the time
+(but which has since improved). It aims to modernize the code base, improve
+security, and apply best practice development process. As a result of these
+goals a lot of legacy code has been removed.  LibreSSL maintains the current
+licensing state, with new additions provided under the ISC license. LibreSSL
+does not appear to have gained significant adoption which will limit the
+developer attention it receives.
+
+## mbed TLS
+
+[mbed TLS](https://tls.mbed.org/) is a TLS implementation with a small
+footprint, targeting embedded systems.  The mbed TLS library does not provide
+either the OpenSSL or GnuTLS API, it provides an API at a slightly lower level,
+[requiring more manual operations](https://github.com/warmcat/libwebsockets/commit/9da75727858b4d60750cfcefc1673f6783e8719d)
+and thus wrappers or porting effort would be required to use it. It is
+available in two versions, one distributed under the Apache-2.0 license and
+another separately licensed as GPL-2+, though it's understood that it will
+drop the GPL-2+ license in the next major release.
+
+## MesaLink
+
+[MesaLink](https://mesalink.io/) is an OpenSSL-compatible TLS library written
+in [Rust](https://www.rust-lang.org/). With it being implemented in Rust it can
+be assumed to have some resilience due to this languages focus on safety and
+MesaLink recently underwent a third-party security audit with
+[excellent results](https://github.com/ctz/rustls/blob/master/audit/TLS-01-report.pdf).
+However, MesaLink only supports modern TLS standards and thus connectivity
+with older and less secure servers may be impacted. MesaLink is licensed as
+BSD-3-Clause, however it uses a large number of third party libraries, licensed
+as follows:
+
+* base64: Apache-2.0/MIT
+* bitflags: Apache-2.0/MIT
+* env_logger: Apache-2.0/MIT
+* enum_to_u8_slice_derive: BSD-3-Clause
+* libc: Apache-2.0/MIT
+* parking_lot: Apache-2.0/MIT
+* ring: Based on BoringSSL and thus has parts licensed under the ISC and
+        original OpenSSL licensing
+* rustls: Apache-2.0/ISC/MIT
+* sct: Apache-2.0/ISC/MIT
+* webpki, untrusted: ISC
+* webpki-roots: MPL-2.0
+
+## NSS
+
+[Network Security Services](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS)
+(NSS) is a set of security libraries developed by Mozilla. NSS provides its
+own API, which is currently only supported by a few of the applications which
+use TLS in Apertis, thus its use would require wrappers to be created or
+porting effort. It is licensed as
+[MPL-2.0](https://www.mozilla.org/en-US/MPL/2.0/).
+
+## wolfSSL
+
+The [wolfSSL](https://www.wolfssl.com/) cryptographic library provides some
+compatibility with OpenSSL via a compatibility header, which maps a subset of
+the most commonly used OpenSSL commands to its native API.  It provides
+up-to-date standards support. wolfSSL has already been packaged in Debian. It
+is available under a dual license,
+[GPL-2+ and commercial](https://www.wolfssl.com/license/) licensing terms.
+
+# Possible solutions
+
+We have considered the following options to meet Apertis' requirements.
+
+## Single stack solutions
+
+Despite the relatively large number of TLS implementations, the required
+application compatibility and licensing requirements mean that there is not a
+single solution that will work without investing at least some development
+effort.
+
+Attempting to standardize on a TLS implementation, such as by using the single
+stack solutions detailed below would therefore result in Apertis carrying
+significant changes to its packages without any guarantees that these changes
+could be upstreamed. These changes would thus need to be maintained as part of
+Apertis.
+
+### Standardize on GnuTLS, replace use of problematic dependencies
+
+GnuTLS used to use libgcrypt as a cryptographic backend and the code is mostly
+structured to abstract the backend details. Reverting to using libgcrypt would
+result in a LGPL-2.1 licensed solution that may be viable for all desired use
+cases.
+
+A preliminary investigation suggests that GnuTLS may have started to use Nettle
+outside of the abstracted code, which would complicate conversion back to
+libgcrypt. More investigation would be required to confirm this.
+
+If libgcrypt is deemed unsuitable, an alternative may be to port GnuTLS to a
+different cryptographic library such as libtomcrypt (Public Domain) or
+libsodium (ISC). The effort required to achieve this has not been investigated.
+
+It is likely that any resulting changes would need to be maintained as part of
+Apertis. It's not clear the upstream GnuTLS project would be interested in
+maintaining another backend.
+
+### Standardize on an OpenSSL-compatible library
+
+As many of the applications already utilize OpenSSL, another possible approach
+would be writing a wrapper for a library which provides OpenSSL compatibility
+to also provide the GnuTLS API.
+
+As GnuTLS itself comes with a wrapper providing OpenSSL API, it is believed
+that the reverse should also be possible. However, this presents some
+significant effort as the APIs are quite different.
+
+An alternative approach may be to port those apps which only support GnuTLS to
+utilize the OpenSSL API. The effort required to achieve this has not been
+estimated.
+
+Such an approach is of limited benefit as the more widely used and mature
+solutions providing an OpenSSL API are also licensed in such a way as to be
+incompatible with the GPL-2, which happens to be the license used by the most
+critical applications currently using GnuTLS.
+
+### Wrappering a non-GnuTLS/OpenSSL-compatible library to provide both APIs
+
+Standardizing on NSS would fall into this category. This would also be true for
+mbed TLS, but the Apache-2.0 license that it is future version are likely to be
+solely licensed under would be problematic for GPL-2-licensed applications.
+This option would require significant effort (creating wrappers for both GnuTLS
+and OpenSSL APIs) and would be a high risk strategy.
+
+## Multi-stack solutions
+
+Attempting to choose a TLS implementation that is licensed in a manner that
+will work for the GPL-2-licensed applications through to Apertis' users
+proprietary applications massively limits the choice of library. Most of the
+available choices only satisfy one or other end of this spectrum, with NSS and
+MesaLink being the only solutions that may be suitably licensed, but which also
+lacks compatibility with critical applications.
+
+As there does not appear to be any single TLS solutions meeting all use cases
+without significant work, we will consider keeping a multi stack solution as
+currently employed.
+
+In such a scenario, a newer GnuTLS library could be allowed by accepting its
+dependencies under the GPL-2 license and restricting its use to places where
+this license wouldn't be problematic, such as existing GPL-2 software. As the
+existing applications written exclusively to use GnuTLS are GPL-2 or tolerant
+of GPL-2, this is viable.
+
+### Replace OpenSSL with compatible alternative
+
+A number of alternative TLS implementations provide an "OpenSSL-compatible"
+interface of one form or other. Whilst a number of these solutions are not
+compatible with the GPL-2, as this solution would require the continued
+availability of GnuTLS, the choice of replacement can be picked without needing
+to provide GPL-2 compatibility. This would suggest BoringSSL, LibreSSL and
+MesaLink as options (wolfSSL being immediately unsuitable due to licensing).
+
+- **BoringSSL**: Whilst actively maintained by Google for its own products,
+  the lack of API/ABI guarantees make its adoption risky.
+
+- **LibreSSL**: It's use inside OpenBSD suggests this will be maintained at
+  least in the mid-term.
+
+- **MesaLink**: As Rust is good at detecting many security related issues at
+  compile time, its use here brings many advantages, though this needs to be
+  weighed against its lack of support of older TLS standards which may prove problematic
+  in some use cases.
+
+Picking an API-compatible replacement for OpenSSL may provide a solution for the
+mid-term, however with OpenSSL set to release its new version at some point in
+the future, it is likely that we may start to see applications requiring
+compatibility with OpenSSL 3.0 APIs, thus requiring Apertis to
+reconsider its solution. Additionally, while these libraries claim OpenSSL
+compatibility, a different implementation may result in hard to diagnose bugs
+being uncovered in applications expecting OpenSSL.
+
+### Consider OpenSSL to not pose a licensing issue
+
+The compatibility between the current OpenSSL licensing and GPL-2 is based on
+the premise that:
+
+1. The
+   [OpenSSL license](https://www.openssl.org/source/license-openssl-ssleay.txt)
+   contains licensing terms not in the GPL (such as the need to mention use of
+   the software in all advertising material and derivatives not being able to
+   be called OpenSSL).
+2. Linking OpenSSL with a GPL-2 application creates a derivative work formed
+   from the two pieces of code.
+3. The GPL expressly
+   [states](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html#section6)
+   that one can't "impose any further restrictions on the recipients' exercise
+   of the rights granted herein" to the GPL licensed work.
+
+Likewise, the Apache 2.0 license, to which version 3 of OpenSSL will be release
+under, contains clauses such as its
+[patent litigation license termination clause](http://www.apache.org/licenses/LICENSE-2.0#patent).
+
+While the argument made in step (2) is widely held by many, others
+disagree with this interpretation, especially when the library is dynamically
+linked to the application. For instance, it might be
+[claimed](https://lwn.net/Articles/548216/) that a dynamically linked library
+is only truly combined with the application when run, not when distributed, so
+it would only become a derivative at that point, or it
+[might be claimed](https://www.linuxjournal.com/article/6366) as this is the
+intended interface for interacting with a library this is excluded either due
+to fair use laws in some jurisdictions or explicitly allowed by the GPL when it
+[states](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html#section0) "the
+act of running the Program is not restricted".
+
+A further argument is that the GPL
+[states](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html#section3)) "as
+a special exception, the source code distributed need not include anything that
+is normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on which the
+executable runs, unless that component itself accompanies the executable". If
+the library is distributed as part of the OS and can be considered a major
+component of it, then this clause doesn't require the library to be considered
+as part of the software and therefore falls outside of the scope of the
+license.  A counter argument to this is that because the application may also
+be considered to be distributed as part of the operating system this exception
+doesn't apply especially in embedded devices where the software is distributed
+preinstalled as a complete entity.
+
+Different Linux distributions have opposing views on how to handle this, with
+Debian has deciding that a linked library creates a derivative work and all
+the packages it ships should be considered a combined work. Conversely the
+Fedora project have deemed it to be a
+[system library](https://fedoraproject.org/wiki/Licensing:FAQ?rd=Licensing/FAQ#What.27s_the_deal_with_the_OpenSSL_license.3F)
+as defined by the GPL and thus there is no incompatibility. Most distributions
+seem to either ignore this potential issue or do not consider a policy to be
+needed.
+
+# Recommendations
+
+Whilst a single stack solution would present a number of benefits, this would
+require a significant outlay in effort one way or another to align the
+applications to the provided stack and to provide a stack that was licensed in
+an appropriate manner. Such an effort would result in Apertis straying away from
+well-trodden paths. Implementing security is hard, it's easy to make mistakes
+that cause holes. This is especially problematic as the level of review is low,
+which would be the case for a highly-customized solution over existing ones. As
+a result, we feel that the potential risks of implementing a single stack solution
+outweigh the benefits it would bring.
+
+A two-stack approach requires separate solutions for GnuTLS and OpenSSL. The
+breakdown of applications supporting GnuTLS and OpenSSL means that we recommend
+upgrading GnuTLS to a new version for those applications that can use it
+licensed as GPL-2. The one outlier is the printing support in GTK, which ends
+up causing GPL-2 dependencies in GTK. We recommend dropping printing support
+from GTK in order to remove this dependency as we don't feel that this
+functionality is critical to Apertis' aim.
+
+A number of potential alternatives exist for OpenSSL, but some of the
+solutions are impractically licensed (such as wolfSSL dual-licensed under the
+GPL-2 and a commercial license) and the remainder do not improve the licensing
+situation over OpenSSL (they share at least some code with OpenSSL under its
+original license). As a result it is our recommendation to consider OpenSSL as
+a system library and continue utilizing it.
+
+The table below summarizes which libraries each of the identified dependents
+we'd expect to use under the above recommendations. We would expect proprietary
+applications to either utilize the OpenSSL or NSS libraries as deemed
+appropriate by the individual projects.
+
+<table>
+<tr>
+<th rowspan="2">Component</th>
+<th rowspan="2">License</th>
+<th rowspan="2">Via Curl</th>
+<th colspan="3">TLS Library support</th>
+</tr>
+<tr>
+<th>OpenSSL</th>
+<th>GnuTLS</th>
+<th>NSS</th>
+</tr>
+
+<tr>
+<td>apt</td>
+<td>GPL-2+</td>
+<td></td>
+<td></td>
+<td>X</td>
+<td></td>
+</tr>
+
+<tr>
+<td>connman</td>
+<td>GPL-2</td>
+<td></td>
+<td></td>
+<td>X</td>
+<td></td>
+</tr>
+
+<tr>
+<td><strike>cups</strike></td>
+<td><strike>Apache-2.0-with-GPL2-LGPL2-Exception</strike></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+
+<tr>
+<td>curl</td>
+<td>curl and BSD-3-Clause and BSD-4-Clause and ISC</td>
+<td></td>
+<td>X</td>
+<td>X</td>
+<td>X</td>
+</tr>
+
+<tr>
+<td>glib-networking</td>
+<td>LGPL-2+ and LGPL-2.1+ with OpenSSL exception</td>
+<td></td>
+<td>X</td>
+<td></td>
+<td></td>
+</tr>
+
+<tr>
+<td>liboauth</td>
+<td>Expat/MIT</td>
+<td>X</td>
+<td>X</td>
+<td></td>
+<td></td>
+</tr>
+
+<tr>
+<td>libmicrohttpd</td>
+<td>LGPL-2.1+</td>
+<td>X</td>
+<td></td>
+<td>X</td>
+<td></td>
+</tr>
+
+<tr>
+<td>neon27</td>
+<td>GPL-2+</td>
+<td></td>
+<td></td>
+<td>X</td>
+<td></td>
+</tr>
+
+<tr>
+<td>openjpeg</td>
+<td>BSD-2</td>
+<td>X</td>
+<td>X</td>
+<td></td>
+<td></td>
+</tr>
+
+<tr>
+<td>openldap</td>
+<td>BSD-3-Clause</td>
+<td></td>
+<td>X</td>
+<td></td>
+<td></td>
+</tr>
+
+<tr>
+<td>rtmpdump</td>
+<td>GPL-2+ (tools), LGPL-2.1+ (library)</td>
+<td></td>
+<td></td>
+<td>X</td>
+<td></td>
+</tr>
+
+<tr>
+<td>systemd</td>
+<td>LGPL-2.1+ and GPL-2[+] and PD</td>
+<td>X</td>
+<td></td>
+<td>X</td>
+<td></td>
+</tr>
+
+<tr>
+<td>tumbler</td>
+<td>GPL-2+</td>
+<td>X</td>
+<td></td>
+<td>X</td>
+<td></td>
+</tr>
+</table>
+
+# Appendix
+
+## Details of TLS library usage in target
+
+<table>
+<tr>
+<th rowspan="2">Component</th>
+<th rowspan="2">License</th>
+<th colspan="3">TLS Library support</th>
+<th rowspan="2">Notes</th>
+</tr>
+<tr>
+<th>OpenSSL</th>
+<th>GnuTLS</th>
+<th>NSS</th>
+</tr>
+
+<tr>
+<td>apt</td>
+<td>GPL-2+</td>
+<td></td>
+<td>X</td>
+<td></td>
+<td></td>
+</tr>
+
+<tr>
+<td>connman</td>
+<td>GPL-2</td>
+<td></td>
+<td>Optional</td>
+<td></td>
+<td>
+Requires GnuTLS for <a href="https://en.wikipedia.org/wiki/WISPr">WISPr</a>.
+</td>
+</tr>
+
+<tr>
+<td>cups</td>
+<td>Apache-2.0-with-GPL2-LGPL2-Exception</td>
+<td></td>
+<td>X</td>
+<td></td>
+<td></td>
+</tr>
+
+<tr>
+<td>curl</td>
+<td>curl and BSD-3-Clause and BSD-4-Clause and ISC</td>
+<td>X</td>
+<td>X</td>
+<td>X</td>
+<td>
+Curl produces libraries utilizing each of the 3 TLS libraries it supports
+(`libcurl4-openssl`, `libcurl4-gnutls` and `libcurl4-nss`). Various tools in
+Apertis are built against these, with `libcurl4-gnutls` having been preferred.
+Most of these packages can also be built with libcurl4-openssl. For some of
+these packages, the GnuTLS variant was chosen because it has a compatible
+license (tumbler, systemd).  Used by `liboauth0`, `libopenjpip-server`,
+`systemd-container`, `systemd-journal-remote` & `tumbler-plugins-extra`.
+</td>
+</tr>
+
+<tr>
+<td>glib-networking</td>
+<td>LGPL-2+ and LGPL-2.1+ with OpenSSL exception</td>
+<td>X</td>
+<td>X</td>
+<td></td>
+<td></td>
+</tr>
+
+<tr>
+<td>neon27</td>
+<td>GPL-2+</td>
+<td>X</td>
+<td>X</td>
+<td></td>
+<td>
+Used by syncevolution (LGPL-2.1+). Review needed to determine whether
+syncevolution is necessary in target.
+</td>
+</tr>
+
+<tr>
+<td>openldap</td>
+<td>BSD-3-Clause</td>
+<td>X</td>
+<td>X</td>
+<td>X</td>
+<td></td>
+</tr>
+
+<tr>
+<td>rtmpdump</td>
+<td>GPL-2+ (tools), LGPL-2.1+ (library)</td>
+<td>X</td>
+<td>X</td>
+<td></td>
+<td>
+Currently using GnuTLS, Nettle and GMP, though may use OpenSSL instead. This is
+only used by libcurl in target, this functionality may be able to be disabled.
+</td>
+</tr>
+</table>
+
+## Usage of libcurl
+
+<table>
+<tr>
+<th rowspan="2">Component</th>
+<th rowspan="2">License</th>
+<th colspan="3">Expected libcurl variant</th>
+<th rowspan="2">Notes</th>
+</tr>
+<tr>
+<th>OpenSSL</th>
+<th>GnuTLS</th>
+<th>NSS</th>
+</tr>
+
+<tr>
+<td>liboauth</td>
+<td>Expat/MIT</td>
+<td>X</td>
+<td>X</td>
+<td></td>
+<td></td>
+</tr>
+
+<tr>
+<td>libmicrohttpd</td>
+<td>LGPL-2.1+</td>
+<td>X</td>
+<td>X</td>
+<td>X (test suite only)</td>
+<td>
+Used by systemd-journal-remote and systemd-pull. Requires GnuTLS for HTTPS
+support (optional).
+</td>
+</tr>
+
+<tr>
+<td>openjpeg</td>
+<td>BSD-2</td>
+<td>X</td>
+<td>X</td>
+<td></td>
+<td>
+Used by libopenjpip-server.
+</td>
+</tr>
+
+<tr>
+<td>systemd</td>
+<td>LGPL-2.1+ and GPL-2[+] and PD</td>
+<td>X</td>
+<td>X</td>
+<td></td>
+<td>
+Uses libcurl via libmicrohttpd for systemd-journal-remote and systemd-container
+(systemd-pull), see above.
+</td>
+</tr>
+
+<tr>
+<td>tumbler</td>
+<td>GPL-2+</td>
+<td></td>
+<td>X</td>
+<td></td>
+<td></td>
+</tr>
+
+</table>
+
+## Usage of GMP
+
+<table>
+<tr>
+<th>Component</th>
+<th>License</th>
+<th>Notes</th>
+</tr>
+
+<tr>
+<td>dnsmasq</td>
+<td>GPL-2/GPL-3</td>
+<td></td>
+</tr>
+
+<tr>
+<td>gcc</td>
+<td>GPL-3</td>
+<td>
+Already licensed under the GPL-3 with an exception for the runtime libraries,
+uses GMP from the already GPL-3 binaries, not used by the runtime libraries.
+The upgrade of GMP would not affect the effective licensing terms.
+</td>
+</tr>
+
+<tr>
+<td>ruby-google-protobuf</td>
+<td>BSD-3-Clause</td>
+<td>
+Built by the `protobuf` package, nothing actually depends on the ruby bindings
+and thus it may be an option to disable these bindings.
+</td>
+</tr>
+</table>
-- 
GitLab