diff --git a/docs/manual/Reticulum Manual.epub b/docs/manual/Reticulum Manual.epub
index a609a35..ca4eda4 100644
Binary files a/docs/manual/Reticulum Manual.epub and b/docs/manual/Reticulum Manual.epub differ
diff --git a/docs/manual/Reticulum Manual.pdf b/docs/manual/Reticulum Manual.pdf
index fc5e98a..1f51906 100644
Binary files a/docs/manual/Reticulum Manual.pdf and b/docs/manual/Reticulum Manual.pdf differ
diff --git a/docs/manual/_sources/examples.rst.txt b/docs/manual/_sources/examples.rst.txt
index 739e9d2..b0887eb 100644
--- a/docs/manual/_sources/examples.rst.txt
+++ b/docs/manual/_sources/examples.rst.txt
@@ -125,4 +125,18 @@ interface to efficiently pass files of any size over a Reticulum :ref:`Link`_.
\ No newline at end of file
+This example can also be found at ``_.
+
+.. _example-custominterface:
+
+Custom Interfaces
+=================
+
+The *ExampleInterface* demonstrates creating custom interfaces for Reticulum.
+Any number of custom interfaces can be loaded and utilised by Reticulum, and
+will be fully on-par with natively included interfaces, including all supported
+:ref:`interface modes` and :ref:`common configuration options`.
+
+.. literalinclude:: ../../Examples/ExampleInterface.py
+
+This example can also be found at ``_.
\ No newline at end of file
diff --git a/docs/manual/_sources/gettingstartedfast.rst.txt b/docs/manual/_sources/gettingstartedfast.rst.txt
index e2bc637..4237f2a 100644
--- a/docs/manual/_sources/gettingstartedfast.rst.txt
+++ b/docs/manual/_sources/gettingstartedfast.rst.txt
@@ -27,9 +27,14 @@ and install them offline using ``pip``:
pip install ./rns-0.5.1-py3-none-any.whl
+For more detailed installation instructions, please see the
+:ref:`Platform-Specific Install Notes` section.
+
+After installation is complete, it might be helpful to refer to the
+:ref:`Using Reticulum on Your System` chapter.
Resolving Dependency & Installation Issues
-=============================================
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
On some platforms, there may not be binary packages available for all dependencies, and
``pip`` installation may fail with an error message. In these cases, the issue can usually
be resolved by installing the development essentials packages for your platform:
@@ -100,10 +105,12 @@ You can install Nomad Network via pip:
# ... and run
nomadnet
-**Please Note**: If this is the very first time you use pip to install a program
-on your system, you might need to reboot your system for your program to become
-available. If you get a "command not found" error or similar when running the
-program, reboot your system and try again.
+.. note::
+ If this is the very first time you use ``pip`` to install a program
+ on your system, you might need to reboot your system for your program to become
+ available. If you get a "command not found" error or similar when running the
+ program, reboot your system and try again. In some cases, you may even need to
+ manually add the ``pip`` install path to your ``PATH`` environment variable.
Sideband
^^^^^^^^
@@ -305,6 +312,20 @@ you are welcome to head over to the `GitHub discussion pages ` chapter.
+
+
Develop a Program with Reticulum
===========================================
If you want to develop programs that use Reticulum, the easiest way to get
@@ -318,14 +339,8 @@ The above command will install Reticulum and dependencies, and you will be
ready to import and use RNS in your own programs. The next step will most
likely be to look at some :ref:`Example Programs`.
-For extended functionality, you can install optional dependencies:
-
-.. code::
-
- pip install pyserial
-
-
-Further information can be found in the :ref:`API Reference`.
+The entire Reticulum API is documented in the :ref:`API Reference`
+chapter of this manual.
Participate in Reticulum Development
@@ -373,6 +388,7 @@ your first pull request, it is probably a good idea to introduce yourself on
the `disucssion forum on GitHub `_,
or ask one of the developers or maintainers for a good place to start.
+.. _install-guides:
Platform-Specific Install Notes
==============================================
@@ -451,7 +467,7 @@ here at a later point. Until then you can use the `Sideband source code `_
+Python manually.
+
+When Python and ``pip`` is available on your system, simply open a terminal window
+and use one of the following commands:
+
+.. code::
+
+ # Install Reticulum and utilities with pip:
+ pip3 install rns
+
+ # On some versions, you may need to use the
+ # flag --break-system-packages to install:
+ pip3 install rns --break-system-packages
+
+.. note::
+ The ``--break-system-packages`` directive is a somewhat misleading choice
+ of words. Setting it will of course not break any system packages, but will simply
+ allow installing ``pip`` packages user- and system-wide. While this *could* in rare
+ cases lead to version conflicts, it does not generally pose any problems, especially
+ not in the case of installing Reticulum.
+
+Additionally, some version combinations of macOS and Python require you to
+manually add your installed ``pip`` packages directory to your `PATH` environment
+variable, before you can use installed commands in your terminal. Usually, adding
+the following line to your shell init script (for example ``~/.zshrc``) will be enough:
+
+.. code::
+
+ export PATH=$PATH:~/Library/Python/3.9/bin
+
+Adjust Python version and shell init script location according to your system.
+
+
+OpenWRT
+^^^^^^^^^^^^^^^^^^^^^^^^^
+On OpenWRT systems with sufficient storage and memory, you can easily install
+Reticulum and related utilities using the `opkg` package manager and `pip`.
+
+.. code::
+
+ # Install dependencies
+ opkg install python3 python3-pip python3-cryptography python3-pyserial
+
+ # Install Reticulum
+ pip install rns
+
+ # Start rnsd with debug logging enabled
+ rnsd -vvv
+
+.. note::
+
+ The above instructions have been verified and tested on OpenWRT 21.02 only.
+ It is likely that other versions may require slightly altered installation
+ commands or package names. You will also need enough free space in your
+ overlay FS, and enough free RAM to actually run Reticulum and any related
+ programs and utilities.
+
+Depending on your device configuration, you may need to adjust firewall rules
+for Reticulum connectivity to and from your device to work. Please also note
+that the `AutoInterface` requires link-local IPv6 addresses to be enabled for
+any Ethernet and WiFi devices you intend to use. If ``ip a`` shows an address
+starting with ``fe80::`` for the device in question, ``AutoInterface`` should
+work for that device.
+
+Raspberry Pi
+^^^^^^^^^^^^^^^^^^^^^^^^^
+It is currently recommended to use a 64-bit version of the Raspberry Pi OS
+if you want to run Reticulum on Raspberry Pi computers, since 32-bit versions
+don't always have packages available for some dependencies. If Python and the
+`pip` package manager is not already installed, do that first, and then
+install Reticulum using `pip`.
+
+.. code::
+
+ # Install dependencies
+ sudo apt install python3 python3-pip python3-cryptography python3-pyserial
+
+ # Install Reticulum
+ pip install rns --break-system-packages
+
+.. note::
+ The ``--break-system-packages`` directive is a somewhat misleading choice
+ of words. Setting it will of course not break any system packages, but will simply
+ allow installing ``pip`` packages user- and system-wide. While this *could* in rare
+ cases lead to version conflicts, it does not generally pose any problems, especially
+ not in the case of installing Reticulum.
+
+While it is possible to install and run Reticulum on 32-bit Rasperry Pi OSes,
+it will require manually configuring and installing required build dependencies,
+and is not detailed in this manual.
+
+
+RISC-V
+^^^^^^^^^^^^^^^^^^^^^^^^
+On some architectures, including RISC-V, not all dependencies have precompiled
+binaries. On such systems, you may need to install ``python3-dev`` (or similar) before
+installing Reticulum or programs that depend on Reticulum.
+
+.. code::
+
+ # Install Python and development packages
+ sudo apt update
+ sudo apt install python3 python3-pip python3-dev
+
+ # Install Reticulum
+ python3 -m pip install rns
+
+With these packages installed, ``pip`` will be able to build any missing dependencies
+on your system locally.
Ubuntu Lunar
@@ -537,10 +673,42 @@ following section:
[global]
break-system-packages = true
-Please note that the "break-system-packages" directive is a somewhat misleading choice
-of words. Setting it will of course not break any system packages, but will simply
-allow installing ``pip`` packages user- and system-wide. While this _could_ in rare
-cases lead to version conflicts, it does not generally pose any problems.
+For a one-shot installation of Reticulum, without globally enabling the ``break-system-packages``
+option, you can use the following command:
+
+.. code:: text
+
+ pip install rns --break-system-packages
+
+.. note::
+ The ``--break-system-packages`` directive is a somewhat misleading choice
+ of words. Setting it will of course not break any system packages, but will simply
+ allow installing ``pip`` packages user- and system-wide. While this *could* in rare
+ cases lead to version conflicts, it does not generally pose any problems, especially
+ not in the case of installing Reticulum.
+
+Windows
+^^^^^^^^^^^^^^^^^^^^^^^^^
+On Windows operating systems, the easiest way to install Reticulum is by using the
+``pip`` package manager from the command line (either the command prompt or Windows
+Powershell).
+
+If you don't already have Python installed, `download and install Python `_.
+At the time of publication of this manual, the recommended version is `Python 3.12.7 `_.
+
+**Important!** When asked by the installer, make sure to add the Python program to
+your PATH environment variables. If you don't do this, you will not be able to
+use the ``pip`` installer, or run the included Reticulum utility programs (such as
+``rnsd`` and ``rnstatus``) from the command line.
+
+After installing Python, open the command prompt or Windows Powershell, and type:
+
+.. code::
+
+ pip install rns
+
+You can now use Reticulum and all included utility programs directly from your
+preferred command line interface.
Pure-Python Reticulum
==============================================
@@ -559,7 +727,8 @@ on a system that cannot support ``pyserial``, it is perfectly possible to do so
the `rnspure` package, but Reticulum will not be able to use serial-based interfaces.
All other available modules will still be loaded when needed.
-**Please Note!** If you use the `rnspure` package to run Reticulum on systems that
-do not support `PyCA/cryptography `_, it is
-important that you read and understand the :ref:`Cryptographic Primitives `
-section of this manual.
+.. warning::
+ If you use the ``rnspure`` package to run Reticulum on systems that
+ do not support `PyCA/cryptography `_, it is
+ important that you read and understand the :ref:`Cryptographic Primitives `
+ section of this manual.
\ No newline at end of file
diff --git a/docs/manual/_sources/hardware.rst.txt b/docs/manual/_sources/hardware.rst.txt
index 1ec1565..a662194 100644
--- a/docs/manual/_sources/hardware.rst.txt
+++ b/docs/manual/_sources/hardware.rst.txt
@@ -75,8 +75,8 @@ completely from scratch, to your exact desired specifications, this chapter
will explain the easiest possible approach to creating RNodes: Using common
LoRa development boards. This approach can be boiled down to two simple steps:
-1. Obtain one or more supported development boards
-2. Install the RNode firmware with the automated installer
+1. Obtain one or more :ref:`supported development boards`
+2. Install the RNode firmware with the :ref:`automated installer`
Once the firmware has been installed and provisioned by the install script, it
is ready to use with any software that supports RNodes, including Reticulum.
@@ -85,8 +85,8 @@ to the configuration.
.. _rnode-supported:
-Supported Boards
-^^^^^^^^^^^^^^^^
+Supported Boards and Devices
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
To create one or more RNodes, you will need to obtain supported development
boards. The following boards are supported by the auto-installer.
diff --git a/docs/manual/_sources/interfaces.rst.txt b/docs/manual/_sources/interfaces.rst.txt
index b34ded0..bdb160d 100644
--- a/docs/manual/_sources/interfaces.rst.txt
+++ b/docs/manual/_sources/interfaces.rst.txt
@@ -19,6 +19,16 @@ types, have a look at the :ref:`Building Networks` chapter of thi
manual.
+.. _interfaces-custom:
+
+Custom Interfaces
+=================
+
+In addition to the built-in interface types, Reticulum is **fully extensible** with
+custom, user- or community-supplied interfaces, and creating custom interface
+modules is straightforward. Please see the :ref:`custom interface`
+example for basic interface code to build upon.
+
.. _interfaces-auto:
Auto Interface
@@ -152,11 +162,12 @@ It can take anywhere from a few seconds to a few minutes to establish
I2P connections to the desired peers, so Reticulum handles the process
in the background, and will output relevant events to the log.
-**Please Note!** While the I2P interface is the simplest way to use
-Reticulum over I2P, it is also possible to tunnel the TCP server and
-client interfaces over I2P manually. This can be useful in situations
-where more control is needed, but requires manual tunnel setup through
-the I2P daemon configuration.
+.. note::
+ While the I2P interface is the simplest way to use
+ Reticulum over I2P, it is also possible to tunnel the TCP server and
+ client interfaces over I2P manually. This can be useful in situations
+ where more control is needed, but requires manual tunnel setup through
+ the I2P daemon configuration.
It is important to note that the two methods are *interchangably compatible*.
You can use the I2PInterface to connect to a TCPServerInterface that
@@ -171,7 +182,7 @@ TCP Server Interface
====================
The TCP Server interface is suitable for allowing other peers to connect over
-the Internet or private IP networks. When a TCP server interface has been
+the Internet or private IPv4 and IPv6 networks. When a TCP server interface has been
configured, other Reticulum peers can connect to it with a TCP Client interface.
.. code::
@@ -200,8 +211,37 @@ configured, other Reticulum peers can connect to it with a TCP Client interface.
# device = eth0
# port = 4242
-**Please Note!** The TCP interfaces support tunneling over I2P, but to do so reliably,
-you must use the i2p_tunneled option:
+If you are using the interface on a device which has both IPv4 and IPv6 addresses available,
+you can use the ``prefer_ipv6`` option to bind to the IPv6 address:
+
+.. code::
+
+ # This example demonstrates a TCP server interface.
+ # It will listen for incoming connections on the
+ # specified IP address and port number.
+
+ [[TCP Server Interface]]
+ type = TCPServerInterface
+ interface_enabled = True
+
+ device = eth0
+ port = 4242
+ prefer_ipv6 = True
+
+To use the TCP Server Interface over `Yggdrasil `_, you
+can simply specify the Yggdrasil ``tun`` device and a listening port, like so:
+
+.. code::
+
+ [[Yggdrasil TCP Server Interface]]
+ type = TCPServerInterface
+ interface_enabled = yes
+ device = tun0
+ listen_port = 4343
+
+.. note::
+ The TCP interfaces support tunneling over I2P, but to do so reliably,
+ you must use the i2p_tunneled option:
.. code::
@@ -231,7 +271,7 @@ and restore connectivity after a failure, once the other end of a TCP interface
.. code::
# Here's an example of a TCP Client interface. The
- # target_host can either be an IP address or a hostname.
+ # target_host can be a hostname or an IPv4 or IPv6 address.
[[TCP Client Interface]]
type = TCPClientInterface
@@ -239,6 +279,17 @@ and restore connectivity after a failure, once the other end of a TCP interface
target_host = 127.0.0.1
target_port = 4242
+To use the TCP Client Interface over `Yggdrasil `_, simply
+specify the target Yggdrasil IPv6 address and port, like so:
+
+.. code::
+
+ [[Yggdrasil TCP Client Interface]]
+ type = TCPClientInterface
+ interface_enabled = yes
+ target_host = 201:5d78:af73:5caf:a4de:a79f:3278:71e5
+ target_port = 4343
+
It is also possible to use this interface type to connect via other programs
or hardware devices that expose a KISS interface on a TCP port, for example
software-based soundmodems. To do this, use the ``kiss_framing`` option:
@@ -262,8 +313,9 @@ never enable ``kiss_framing``, since this will disable internal reliability and
recovery mechanisms that greatly improves performance over unreliable and
intermittent TCP links.
-**Please Note!** The TCP interfaces support tunneling over I2P, but to do so reliably,
-you must use the i2p_tunneled option:
+.. note::
+ The TCP interfaces support tunneling over I2P, but to do so reliably,
+ you must use the i2p_tunneled option:
.. code::
@@ -285,11 +337,12 @@ private and the internet. It can also allow broadcast communication
over IP networks, so it can provide an easy way to enable connectivity
with all other peers on a local area network.
-*Please Note!* Using broadcast UDP traffic has performance implications,
-especially on WiFi. If your goal is simply to enable easy communication
-with all peers in your local Ethernet broadcast domain, the
-:ref:`Auto Interface` performs better, and is even
-easier to use.
+.. warning::
+ Using broadcast UDP traffic has performance implications,
+ especially on WiFi. If your goal is simply to enable easy communication
+ with all peers in your local Ethernet broadcast domain, the
+ :ref:`Auto Interface` performs better, and is even
+ easier to use.
.. code::
@@ -344,6 +397,11 @@ RNode LoRa Interface
To use Reticulum over LoRa, the `RNode `_ interface
can be used, and offers full control over LoRa parameters.
+.. warning::
+ Radio frequency spectrum is a legally controlled resource, and legislation
+ varies widely around the world. It is your responsibility to be aware of any
+ relevant regulation for your location, and to make decisions accordingly.
+
.. code::
# Here's an example of how to add a LoRa interface
@@ -431,6 +489,11 @@ RNode Multi Interface
For RNodes that support multiple LoRa transceivers, the RNode
Multi interface can be used to configure sub-interfaces individually.
+.. warning::
+ Radio frequency spectrum is a legally controlled resource, and legislation
+ varies widely around the world. It is your responsibility to be aware of any
+ relevant regulation for your location, and to make decisions accordingly.
+
.. code::
# Here's an example of how to add an RNode Multi interface
@@ -454,89 +517,89 @@ Multi interface can be used to configure sub-interfaces individually.
# id_interval = 600
# A subinterface
- [[[HIGHDATARATE]]]
- # Subinterfaces can be enabled and disabled in of themselves
- interface_enabled = True
+ [[[High Datarate]]]
+ # Subinterfaces can be enabled and disabled in of themselves
+ interface_enabled = True
- # Set frequency to 2.4GHz
- frequency = 2400000000
+ # Set frequency to 2.4GHz
+ frequency = 2400000000
- # Set LoRa bandwidth to 1625 KHz
- bandwidth = 1625000
+ # Set LoRa bandwidth to 1625 KHz
+ bandwidth = 1625000
- # Set TX power to 0 dBm (0.12 mW)
- txpower = 0
+ # Set TX power to 0 dBm (0.12 mW)
+ txpower = 0
- # The virtual port, only the manufacturer
- # or the person who wrote the board config
- # can tell you what it will be for which
- # physical hardware interface
- vport = 1
+ # The virtual port, only the manufacturer
+ # or the person who wrote the board config
+ # can tell you what it will be for which
+ # physical hardware interface
+ vport = 1
- # Select spreading factor 5. Valid
- # range is 5 through 12, with 5
- # being the fastest and 12 having
- # the longest range.
- spreadingfactor = 5
+ # Select spreading factor 5. Valid
+ # range is 5 through 12, with 5
+ # being the fastest and 12 having
+ # the longest range.
+ spreadingfactor = 5
- # Select coding rate 5. Valid range
- # is 5 throough 8, with 5 being the
- # fastest, and 8 the longest range.
- codingrate = 5
+ # Select coding rate 5. Valid range
+ # is 5 throough 8, with 5 being the
+ # fastest, and 8 the longest range.
+ codingrate = 5
- # It is possible to limit the airtime
- # utilisation of an RNode by using the
- # following two configuration options.
- # The short-term limit is applied in a
- # window of approximately 15 seconds,
- # and the long-term limit is enforced
- # over a rolling 60 minute window. Both
- # options are specified in percent.
+ # It is possible to limit the airtime
+ # utilisation of an RNode by using the
+ # following two configuration options.
+ # The short-term limit is applied in a
+ # window of approximately 15 seconds,
+ # and the long-term limit is enforced
+ # over a rolling 60 minute window. Both
+ # options are specified in percent.
- # airtime_limit_long = 100
- # airtime_limit_short = 100
+ # airtime_limit_long = 100
+ # airtime_limit_short = 100
- [[[LOWDATARATE]]]
- # Subinterfaces can be enabled and disabled in of themselves
- interface_enabled = True
+ [[[Low Datarate]]]
+ # Subinterfaces can be enabled and disabled in of themselves
+ interface_enabled = True
- # Set frequency to 865.6 MHz
- frequency = 865600000
+ # Set frequency to 865.6 MHz
+ frequency = 865600000
- # The virtual port, only the manufacturer
- # or the person who wrote the board config
- # can tell you what it will be for which
- # physical hardware interface
- vport = 0
+ # The virtual port, only the manufacturer
+ # or the person who wrote the board config
+ # can tell you what it will be for which
+ # physical hardware interface
+ vport = 0
- # Set LoRa bandwidth to 125 KHz
- bandwidth = 125000
+ # Set LoRa bandwidth to 125 KHz
+ bandwidth = 125000
- # Set TX power to 0 dBm (0.12 mW)
- txpower = 0
+ # Set TX power to 0 dBm (0.12 mW)
+ txpower = 0
- # Select spreading factor 7. Valid
- # range is 5 through 12, with 5
- # being the fastest and 12 having
- # the longest range.
- spreadingfactor = 7
+ # Select spreading factor 7. Valid
+ # range is 5 through 12, with 5
+ # being the fastest and 12 having
+ # the longest range.
+ spreadingfactor = 7
- # Select coding rate 5. Valid range
- # is 5 throough 8, with 5 being the
- # fastest, and 8 the longest range.
- codingrate = 5
+ # Select coding rate 5. Valid range
+ # is 5 throough 8, with 5 being the
+ # fastest, and 8 the longest range.
+ codingrate = 5
- # It is possible to limit the airtime
- # utilisation of an RNode by using the
- # following two configuration options.
- # The short-term limit is applied in a
- # window of approximately 15 seconds,
- # and the long-term limit is enforced
- # over a rolling 60 minute window. Both
- # options are specified in percent.
+ # It is possible to limit the airtime
+ # utilisation of an RNode by using the
+ # following two configuration options.
+ # The short-term limit is applied in a
+ # window of approximately 15 seconds,
+ # and the long-term limit is enforced
+ # over a rolling 60 minute window. Both
+ # options are specified in percent.
- # airtime_limit_long = 100
- # airtime_limit_short = 100
+ # airtime_limit_long = 100
+ # airtime_limit_short = 100
.. _interfaces-serial:
@@ -598,6 +661,11 @@ radio modems and TNCs, including `OpenModem `_.
KISS interfaces can also be configured to periodically send out beacons
for station identification purposes.
+.. warning::
+ Radio frequency spectrum is a legally controlled resource, and legislation
+ varies widely around the world. It is your responsibility to be aware of any
+ relevant regulation for your location, and to make decisions accordingly.
+
.. code::
[[Packet Radio KISS Interface]]
@@ -661,6 +729,11 @@ encapsulate in AX.25.
A more efficient way is to use the plain KISS interface with the
beaconing functionality described above.
+.. warning::
+ Radio frequency spectrum is a legally controlled resource, and legislation
+ varies widely around the world. It is your responsibility to be aware of any
+ relevant regulation for your location, and to make decisions accordingly.
+
.. code::
[[Packet Radio AX.25 KISS Interface]]
diff --git a/docs/manual/_sources/support.rst.txt b/docs/manual/_sources/support.rst.txt
index a8e0470..3f0af03 100644
--- a/docs/manual/_sources/support.rst.txt
+++ b/docs/manual/_sources/support.rst.txt
@@ -32,7 +32,9 @@ Provide Feedback
================
All feedback on the usage, functioning and potential dysfunctioning of any and
all components of the system is very valuable to the continued development and
-improvement of Reticulum. Absolutely no automated analytics, telemetry, error
+improvement of Reticulum.
+
+Absolutely no automated analytics, telemetry, error
reporting or statistics is collected and reported by Reticulum under any
circumstances, so we rely on old-fashioned human feedback.
diff --git a/docs/manual/_sources/understanding.rst.txt b/docs/manual/_sources/understanding.rst.txt
index e458ebf..31e32c9 100644
--- a/docs/manual/_sources/understanding.rst.txt
+++ b/docs/manual/_sources/understanding.rst.txt
@@ -868,13 +868,17 @@ both on general-purpose CPUs and on microcontrollers. The necessary primitives a
* HKDF for key derivation
-* Modified Fernet for encrypted tokens
+* Encrypted tokens are based on the Fernet spec
- * AES-128 in CBC mode
+ * Ephemeral keys derived from an ECDH key exchange on Curve25519
- * HMAC for message authentication
+ * AES-128 in CBC mode with PKCS7 padding
- * No Version and Timestamp metadata included
+ * HMAC using SHA256 for message authentication
+
+ * IVs are generated through os.urandom()
+
+ * No Fernet version and timestamp metadata fields
* SHA-256
@@ -884,12 +888,12 @@ In the default installation configuration, the ``X25519``, ``Ed25519`` and ``AES
primitives are provided by `OpenSSL `_ (via the `PyCA/cryptography `_
package). The hashing functions ``SHA-256`` and ``SHA-512`` are provided by the standard
Python `hashlib `_. The ``HKDF``, ``HMAC``,
-``Fernet`` primitives, and the ``PKCS7`` padding function are always provided by the
+``Token`` primitives, and the ``PKCS7`` padding function are always provided by the
following internal implementations:
- ``RNS/Cryptography/HKDF.py``
- ``RNS/Cryptography/HMAC.py``
-- ``RNS/Cryptography/Fernet.py``
+- ``RNS/Cryptography/Token.py``
- ``RNS/Cryptography/PKCS7.py``
@@ -900,6 +904,7 @@ with the OpenSSL backend being *much* faster. The most important consequence how
potential loss of security by using primitives that has not seen the same amount of scrutiny,
testing and review as those from OpenSSL.
-If you want to use the internal pure-python primitives, it is **highly advisable** that you
-have a good understanding of the risks that this pose, and make an informed decision on whether
-those risks are acceptable to you.
+.. warning::
+ If you want to use the internal pure-python primitives, it is **highly advisable** that you
+ have a good understanding of the risks that this pose, and make an informed decision on whether
+ those risks are acceptable to you.
\ No newline at end of file
diff --git a/docs/manual/_sources/whatis.rst.txt b/docs/manual/_sources/whatis.rst.txt
index 03149f6..fb67b19 100644
--- a/docs/manual/_sources/whatis.rst.txt
+++ b/docs/manual/_sources/whatis.rst.txt
@@ -17,7 +17,7 @@ Reticulum enables secure digital communication that cannot be subjected to
outside control, manipulation or censorship.
Reticulum enables the construction of both small and potentially planetary-scale
-networks, without any need for hierarchical or beaureucratic structures to control
+networks, without any need for hierarchical or bureaucratic structures to control
or manage them, while ensuring individuals and communities full sovereignty
over their own network segments.
@@ -43,19 +43,30 @@ considered complete and stable at the moment, but could change if absolutely war
What does Reticulum Offer?
==========================
+
* Coordination-less globally unique addressing and identification
-* Fully self-configuring multi-hop routing
+* Fully self-configuring multi-hop routing over heterogeneous carriers
-* Complete initiator anonymity, communicate without revealing your identity
+* Flexible scalability over heterogeneous topologies
-* Asymmetric encryption based on X25519, and Ed25519 signatures as a basis for all communication
+ * Reticulum can carry data over any mixture of physical mediums and topologies
-* Forward Secrecy by using ephemeral Elliptic Curve Diffie-Hellman keys on Curve25519
+ * Low-bandwidth networks can co-exist and interoperate with large, high-bandwidth networks
-* Reticulum uses a modified version of the `Fernet `_ specification for on-the-wire / over-the-air encryption
+* Initiator anonymity, communicate without revealing your identity
- * Keys are ephemeral and derived from an ECDH key exchange on Curve25519
+ * Reticulum does not include source addresses on any packets
+
+* Asymmetric X25519 encryption and Ed25519 signatures as a basis for all communication
+
+ * The foundational Reticulum Identity Keys are 512-bit Elliptic Curve keysets
+
+* Forward Secrecy is available for all communication types, both for single packets and over links
+
+* Reticulum uses the following format for encrypted tokens:
+
+ * Ephemeral per-packet and link keys and derived from an ECDH key exchange on Curve25519
* AES-128 in CBC mode with PKCS7 padding
@@ -63,13 +74,33 @@ What does Reticulum Offer?
* IVs are generated through os.urandom()
- * No Version and Timestamp metadata included
-
* Unforgeable packet delivery confirmations
-* A variety of supported interface types
+* Flexible and extensible interface system
-* An intuitive and developer-friendly API
+ * Reticulum includes a large variety of built-in interface types
+
+ * Ability to load and utilise custom user- or community-supplied interface types
+
+ * Easily create your own custom interfaces for communicating over anything
+
+* Authentication and virtual network segmentation on all supported interface types
+
+* An intuitive and easy-to-use API
+
+ * Simpler and easier to use than sockets APIs and simpler, but more powerful
+
+ * Makes building distributed and decentralised applications much simpler
+
+* Reliable and efficient transfer of arbitrary amounts of data
+
+ * Reticulum can handle a few bytes of data or files of many gigabytes
+
+ * Sequencing, compression, transfer coordination and checksumming are automatic
+
+ * The API is very easy to use, and provides transfer progress
+
+* Lightweight, flexible and expandable Request/Response mechanism
* Efficient link establishment
@@ -77,17 +108,7 @@ What does Reticulum Offer?
* Low cost of keeping links open at only 0.44 bits per second
-* Reliable and efficient transfer of arbitrary amounts of data
-
- * Reticulum can handle a few bytes of data or files of many gigabytes
-
- * Sequencing, transfer coordination and checksumming is automatic
-
- * The API is very easy to use, and provides transfer progress
-
-* Authentication and virtual network segmentation on all supported interface types
-
-* Flexible scalability allowing extremely low-bandwidth networks to co-exist and interoperate with large, high-bandwidth networks
+* Reliable sequential delivery with Channel and Buffer mechanisms
Where can Reticulum be Used?
@@ -118,7 +139,7 @@ network, and vice versa.
Interface Types and Devices
===========================
-Reticulum implements a range of generalised interface types that covers the communications hardware that Reticulum can run over. If your hardware is not supported, it's relatively simple to implement an interface class. Currently, Reticulum can use the following devices and communication mediums:
+Reticulum implements a range of generalised interface types that covers the communications hardware that Reticulum can run over. If your hardware is not supported, it's simple to :ref:`implement an interface class`. Currently, Reticulum can use the following devices and communication mediums:
* Any Ethernet device
@@ -168,4 +189,4 @@ such. While it has been built with cryptography best-practices very foremost in
mind, it has not yet been externally security audited, and there could very well be
privacy-breaking bugs. To be considered secure, Reticulum needs a thorough
security review by independent cryptographers and security researchers. If you
-want to help out with this, or can help sponsor an audit, please do get in touch.
+want to help out with this, or can help sponsor an audit, please do get in touch.
\ No newline at end of file
diff --git a/docs/manual/_static/documentation_options.js b/docs/manual/_static/documentation_options.js
index 19fceab..3215a21 100644
--- a/docs/manual/_static/documentation_options.js
+++ b/docs/manual/_static/documentation_options.js
@@ -1,6 +1,6 @@
var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
- VERSION: '0.8.5 beta',
+ VERSION: '0.8.6 beta',
LANGUAGE: 'en',
COLLAPSE_INDEX: false,
BUILDER: 'html',
diff --git a/docs/manual/examples.html b/docs/manual/examples.html
index 836350d..92102e7 100644
--- a/docs/manual/examples.html
+++ b/docs/manual/examples.html
@@ -6,7 +6,7 @@
- Code Examples - Reticulum Network Stack 0.8.5 beta documentation
+ Code Examples - Reticulum Network Stack 0.8.6 beta documentation
@@ -141,7 +141,7 @@
On some platforms, there may not be binary packages available for all dependencies, and
pip installation may fail with an error message. In these cases, the issue can usually
be resolved by installing the development essentials packages for your platform:
@@ -261,6 +264,7 @@ be resolved by installing the development essentials packages for your platform:
dependencies from source, and complete installation even on platforms that don’t have pre-
compiled packages available.
If you simply want to try using a program built with Reticulum, a few different
@@ -300,10 +304,14 @@ for the messaging and information-sharing protocol
nomadnet
-
Please Note: If this is the very first time you use pip to install a program
+
+
Note
+
If this is the very first time you use pip to install a program
on your system, you might need to reboot your system for your program to become
available. If you get a “command not found” error or similar when running the
-program, reboot your system and try again.
+program, reboot your system and try again. In some cases, you may even need to
+manually add the pip install path to your PATH environment variable.
+
@@ -456,6 +464,16 @@ refer to these additional external resources:
you are welcome to head over to the GitHub discussion pages
and propose adding an interface for the hardware.
+
+
While Reticulum includes a flexible and broad range of built-in interfaces, these
+will not cover every conceivable type of communications hardware that Reticulum
+can potentially use to communicate.
+
It is therefore possible to easily write your own interface modules, that can be
+loaded at run-time and used on-par with any of the built-in interface types.
+
For more information on this subject, and code examples to build on, please see
+the Configuring Interfaces chapter.
If you want to develop programs that use Reticulum, the easiest way to get
@@ -466,11 +484,8 @@ started is to install the latest release of Reticulum via pip:
The above command will install Reticulum and dependencies, and you will be
ready to import and use RNS in your own programs. The next step will most
likely be to look at some Example Programs.
-
For extended functionality, you can install optional dependencies:
-
pipinstallpyserial
-
-
-
Further information can be found in the API Reference.
+
The entire Reticulum API is documented in the API Reference
+chapter of this manual.
On some architectures, including ARM64, not all dependencies have precompiled
-binaries. On such systems, you may need to install python3-dev before
+binaries. On such systems, you may need to install python3-dev (or similar) before
installing Reticulum or programs that depend on Reticulum.
# Install Python and development packagessudoaptupdate
@@ -591,15 +606,8 @@ installing Reticulum or programs that depend on Reticulum.
python3-mpipinstallrns
It is currently recommended to use a 64-bit version of the Raspberry Pi OS
-if you want to run Reticulum on Raspberry Pi computers, since 32-bit versions
-don’t always have packages available for some dependencies.
-
While it is possible to install and run Reticulum on 32-bit Rasperry Pi OSes,
-it will require manually configuring and installing some packages, and is not
-detailed in this manual.
+
With these packages installed, pip will be able to build any missing dependencies
+on your system locally.
@@ -625,10 +633,125 @@ following section:
break-system-packages = true
-
Please note that the “break-system-packages” directive is a somewhat misleading choice
+
For a one-shot installation of Reticulum, without globally enabling the break-system-packages
+option, you can use the following command:
+
pip install rns --break-system-packages
+
+
+
+
Note
+
The --break-system-packages directive is a somewhat misleading choice
of words. Setting it will of course not break any system packages, but will simply
allow installing pip packages user- and system-wide. While this could in rare
-cases lead to version conflicts, it does not generally pose any problems.
+cases lead to version conflicts, it does not generally pose any problems, especially
+not in the case of installing Reticulum.
+
To install Reticulum on macOS, you will need to have Python and the pip package
+manager installed.
+
Systems running macOS can vary quite widely in whether or not Python is pre-installed,
+and if it is, which version is installed, and whether the pip package manager is
+also installed and set up. If in doubt, you can download and install
+Python manually.
+
When Python and pip is available on your system, simply open a terminal window
+and use one of the following commands:
+
# Install Reticulum and utilities with pip:
+pip3installrns
+
+# On some versions, you may need to use the
+# flag --break-system-packages to install:
+pip3installrns--break-system-packages
+
+
+
+
Note
+
The --break-system-packages directive is a somewhat misleading choice
+of words. Setting it will of course not break any system packages, but will simply
+allow installing pip packages user- and system-wide. While this could in rare
+cases lead to version conflicts, it does not generally pose any problems, especially
+not in the case of installing Reticulum.
+
+
Additionally, some version combinations of macOS and Python require you to
+manually add your installed pip packages directory to your PATH environment
+variable, before you can use installed commands in your terminal. Usually, adding
+the following line to your shell init script (for example ~/.zshrc) will be enough:
+
export PATH=$PATH:~/Library/Python/3.9/bin
+
+
+
Adjust Python version and shell init script location according to your system.
The above instructions have been verified and tested on OpenWRT 21.02 only.
+It is likely that other versions may require slightly altered installation
+commands or package names. You will also need enough free space in your
+overlay FS, and enough free RAM to actually run Reticulum and any related
+programs and utilities.
+
+
Depending on your device configuration, you may need to adjust firewall rules
+for Reticulum connectivity to and from your device to work. Please also note
+that the AutoInterface requires link-local IPv6 addresses to be enabled for
+any Ethernet and WiFi devices you intend to use. If ipa shows an address
+starting with fe80:: for the device in question, AutoInterface should
+work for that device.
It is currently recommended to use a 64-bit version of the Raspberry Pi OS
+if you want to run Reticulum on Raspberry Pi computers, since 32-bit versions
+don’t always have packages available for some dependencies. If Python and the
+pip package manager is not already installed, do that first, and then
+install Reticulum using pip.
The --break-system-packages directive is a somewhat misleading choice
+of words. Setting it will of course not break any system packages, but will simply
+allow installing pip packages user- and system-wide. While this could in rare
+cases lead to version conflicts, it does not generally pose any problems, especially
+not in the case of installing Reticulum.
+
+
While it is possible to install and run Reticulum on 32-bit Rasperry Pi OSes,
+it will require manually configuring and installing required build dependencies,
+and is not detailed in this manual.
On some architectures, including RISC-V, not all dependencies have precompiled
+binaries. On such systems, you may need to install python3-dev (or similar) before
+installing Reticulum or programs that depend on Reticulum.
+
# Install Python and development packages
+sudoaptupdate
+sudoaptinstallpython3python3-pippython3-dev
+
+# Install Reticulum
+python3-mpipinstallrns
+
+
+
With these packages installed, pip will be able to build any missing dependencies
+on your system locally.
@@ -654,10 +777,37 @@ following section:
break-system-packages = true
-
Please note that the “break-system-packages” directive is a somewhat misleading choice
+
For a one-shot installation of Reticulum, without globally enabling the break-system-packages
+option, you can use the following command:
+
pip install rns --break-system-packages
+
+
+
+
Note
+
The --break-system-packages directive is a somewhat misleading choice
of words. Setting it will of course not break any system packages, but will simply
-allow installing pip packages user- and system-wide. While this _could_ in rare
-cases lead to version conflicts, it does not generally pose any problems.
+allow installing pip packages user- and system-wide. While this could in rare
+cases lead to version conflicts, it does not generally pose any problems, especially
+not in the case of installing Reticulum.
+
On Windows operating systems, the easiest way to install Reticulum is by using the
+pip package manager from the command line (either the command prompt or Windows
+Powershell).
Important! When asked by the installer, make sure to add the Python program to
+your PATH environment variables. If you don’t do this, you will not be able to
+use the pip installer, or run the included Reticulum utility programs (such as
+rnsd and rnstatus) from the command line.
+
After installing Python, open the command prompt or Windows Powershell, and type:
+
pipinstallrns
+
+
+
You can now use Reticulum and all included utility programs directly from your
+preferred command line interface.
@@ -675,10 +825,13 @@ only if they are needed and available. If for example you want
on a system that cannot support pyserial, it is perfectly possible to do so using
the rnspure package, but Reticulum will not be able to use serial-based interfaces.
All other available modules will still be loaded when needed.
-
Please Note! If you use the rnspure package to run Reticulum on systems that
+
+
Warning
+
If you use the rnspure package to run Reticulum on systems that
do not support PyCA/cryptography, it is
important that you read and understand the Cryptographic Primitives
section of this manual.