From 4bc8a0b69b8b4e5b9c2035b1ed59ff173f98e8b3 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Thu, 5 Sep 2024 15:16:09 +0200 Subject: [PATCH] Updated manual and documentation --- docs/Reticulum Manual.epub | Bin 2569261 -> 2569396 bytes docs/Reticulum Manual.pdf | Bin 2412458 -> 2412688 bytes docs/manual/_sources/understanding.rst.txt | 15 +++++++++------ docs/manual/_sources/whatis.rst.txt | 6 ++++-- docs/manual/searchindex.js | 2 +- docs/manual/understanding.html | 14 ++++++++------ docs/manual/whatis.html | 5 +++-- docs/source/understanding.rst | 15 +++++++++------ docs/source/whatis.rst | 6 ++++-- 9 files changed, 38 insertions(+), 25 deletions(-) diff --git a/docs/Reticulum Manual.epub b/docs/Reticulum Manual.epub index d4c6558871c2ba789c66839d88729b5b94c83f32..5d921761251eb39f0fd587115f06c2e7854364eb 100644 GIT binary patch delta 20693 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 diff --git a/docs/Reticulum Manual.pdf b/docs/Reticulum Manual.pdf index 03f9138921f3ec03a0cc20e9f7ccf839cd4f50bd..7ff4152d3d88d16781feb5ce768d4f94d29582f6 100644 GIT binary patch delta 24023 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 diff --git a/docs/manual/_sources/understanding.rst.txt b/docs/manual/_sources/understanding.rst.txt index fe8eb8a..e458ebf 100644 --- a/docs/manual/_sources/understanding.rst.txt +++ b/docs/manual/_sources/understanding.rst.txt @@ -134,10 +134,11 @@ be sufficient, even far into the future. By default Reticulum encrypts all data using elliptic curve cryptography and AES. Any packet sent to a destination is encrypted with a per-packet derived key. Reticulum can also set up an encrypted channel to a destination, called a *Link*. Both data sent over Links and single packets offer -*Initiator Anonymity*, and links additionally offer *Forward Secrecy* by using an Elliptic Curve -Diffie Hellman key exchange on Curve25519 to derive per-link ephemeral keys. The multi-hop transport, -coordination, verification and reliability layers are fully autonomous and also based on elliptic -curve cryptography. +*Initiator Anonymity*. Links additionally offer *Forward Secrecy* by default, employing an Elliptic Curve +Diffie Hellman key exchange on Curve25519 to derive per-link ephemeral keys. Asymmetric, link-less +packet communication can also provide forward secrecy, with automatic key ratcheting, by enabling +ratchets on a per-destination basis. The multi-hop transport, coordination, verification and reliability +layers are fully autonomous and also based on elliptic curve cryptography. Reticulum also offers symmetric key encryption for group-oriented communications, as well as unencrypted packets for local broadcast purposes. @@ -431,7 +432,7 @@ For exchanges of small amounts of information, Reticulum offers the *Packet* API * | A packet is always created with an associated destination and some payload data. When the packet is sent to a *single* destination type, Reticulum will automatically create an ephemeral encryption key, perform - an ECDH key exchange with the destination's public key, and encrypt the information. + an ECDH key exchange with the destination's public key (or ratchet key, if available), and encrypt the information. * | It is important to note that this key exchange does not require any network traffic. The sender already knows the public key of the destination from an earlier received *announce*, and can thus perform the ECDH @@ -867,12 +868,14 @@ both on general-purpose CPUs and on microcontrollers. The necessary primitives a * HKDF for key derivation -* Fernet for encrypted tokens +* Modified Fernet for encrypted tokens * AES-128 in CBC mode * HMAC for message authentication + * No Version and Timestamp metadata included + * SHA-256 * SHA-512 diff --git a/docs/manual/_sources/whatis.rst.txt b/docs/manual/_sources/whatis.rst.txt index a420b7e..4c2d6ed 100644 --- a/docs/manual/_sources/whatis.rst.txt +++ b/docs/manual/_sources/whatis.rst.txt @@ -53,9 +53,9 @@ What does Reticulum Offer? * Forward Secrecy by using ephemeral Elliptic Curve Diffie-Hellman keys on Curve25519 -* Reticulum uses the `Fernet `_ specification for on-the-wire / over-the-air encryption +* Reticulum uses a modified version of the `Fernet `_ specification for on-the-wire / over-the-air encryption - * All keys are ephemeral and derived from an ECDH key exchange on Curve25519 + * Keys are ephemeral and derived from an ECDH key exchange on Curve25519 * AES-128 in CBC mode with PKCS7 padding @@ -63,6 +63,8 @@ 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 diff --git a/docs/manual/searchindex.js b/docs/manual/searchindex.js index 0b8de11..0ccbeac 100644 --- a/docs/manual/searchindex.js +++ b/docs/manual/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["examples", "forhumans", "gettingstartedfast", "hardware", "index", "interfaces", "networks", "reference", "support", "understanding", "using", "whatis"], "filenames": ["examples.rst", "forhumans.rst", "gettingstartedfast.rst", "hardware.rst", "index.rst", "interfaces.rst", "networks.rst", "reference.rst", "support.rst", "understanding.rst", "using.rst", "whatis.rst"], "titles": ["Code Examples", "An Explanation of Reticulum for Human Beings", "Getting Started Fast", "Communications Hardware", "Reticulum Network Stack Manual", "Configuring Interfaces", "Building Networks", "API Reference", "Support Reticulum", "Understanding Reticulum", "Using Reticulum on Your System", "What is Reticulum?"], "terms": {"A": [0, 2, 5, 6, 7, 9, 10, 11], "number": [0, 2, 5, 6, 7, 9, 10], "ar": [0, 2, 3, 5, 6, 7, 8, 9, 10, 11], "includ": [0, 3, 4, 5, 7, 9], "sourc": [0, 2, 3, 6, 9, 11], "distribut": [0, 2, 6, 7, 9, 10], "reticulum": [0, 5, 6, 7], "you": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "can": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "us": [0, 3, 4, 5, 6, 7, 9], "learn": [0, 2, 8, 9], "how": [0, 2, 3, 5, 6, 9, 10, 11], "write": [0, 2, 5, 7, 9, 10], "your": [0, 2, 3, 4, 5, 6, 8, 9, 11], "own": [0, 2, 6, 7, 9, 10, 11], "program": [0, 3, 4, 5, 7, 9, 11], "The": [0, 2, 3, 4, 5, 6, 7, 11], "demonstr": [0, 5], "bare": [0, 5], "minimum": [0, 5, 6, 7, 9], "setup": [0, 2, 4, 5, 10], "requir": [0, 2, 5, 6, 7, 9, 10, 11], "connect": [0, 3, 4, 5, 6, 7, 9, 10, 11], "network": [0, 3, 5, 7, 9, 10, 11], "from": [0, 2, 3, 5, 6, 7, 9, 10, 11], "In": [0, 2, 3, 5, 6, 7, 9, 10, 11], "about": [0, 2, 3, 5, 6, 7, 9], "five": 0, "line": [0, 2, 4, 5, 6, 9, 10, 11], "have": [0, 2, 3, 5, 6, 7, 9, 10], "stack": [0, 2, 6, 7, 9, 10, 11], "initialis": [0, 7, 10], "readi": [0, 2, 3, 5, 6, 7, 11], "pass": [0, 3, 5, 6, 7, 9, 10], "traffic": [0, 2, 5, 6, 7, 9, 10], "thi": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "rn": [0, 2, 3, 7, 9, 10], "start": [0, 3, 4, 5, 7, 9, 10], "up": [0, 2, 3, 5, 6, 7, 9, 10, 11], "gener": [0, 2, 3, 5, 6, 7, 9, 10, 11], "new": [0, 4, 6, 7, 9, 10], "destin": [0, 2, 4, 6, 7, 10], "let": [0, 2, 5, 6, 9, 10], "user": [0, 2, 5, 6, 9, 10, 11], "send": [0, 5, 7, 9, 10], "an": [0, 2, 3, 5, 6, 7, 9, 10, 11], "import": [0, 2, 3, 5, 6, 7, 8, 9], "argpars": 0, "": [0, 2, 5, 6, 9, 10, 11], "defin": [0, 5, 7, 9, 10], "app": [0, 2, 7, 9], "name": [0, 4, 5, 6, 7], "we": [0, 2, 3, 5, 8, 9], "ll": [0, 2, 11], "all": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "creat": [0, 4, 5, 6, 7, 9, 10, 11], "sinc": [0, 2, 5, 6, 7, 9], "basic": [0, 2, 4, 7, 10], "i": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "part": [0, 5, 6, 7, 9, 10], "rang": [0, 2, 3, 5, 6, 9, 10, 11], "util": [0, 3, 4, 5, 9], "put": [0, 3, 5, 10], "them": [0, 2, 3, 5, 6, 8, 9, 10, 11], "within": [0, 2, 5, 6, 7, 9], "namespac": 0, "example_util": 0, "app_nam": [0, 7], "execut": [0, 2, 5, 7, 10], "when": [0, 2, 3, 5, 6, 7, 9, 10], "def": 0, "program_setup": 0, "configpath": 0, "must": [0, 2, 5, 6, 7, 9, 10], "first": [0, 2, 5, 7, 9, 10], "randomli": [0, 9], "ident": [0, 2, 4, 7, 10, 11], "our": [0, 9], "just": [0, 2, 3, 5, 6, 9, 11], "endpoint": [0, 6, 7, 9], "address": [0, 2, 5, 6, 7, 9, 10, 11], "commun": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11], "also": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "exist": [0, 2, 3, 5, 9, 10, 11], "which": [0, 2, 5, 6, 7, 9, 10], "know": [0, 2, 3, 6, 7, 9, 11], "thei": [0, 2, 5, 6, 7, 9, 10], "reachabl": [0, 2, 5, 6, 7, 9, 10], "automat": [0, 2, 3, 5, 6, 7, 9, 10, 11], "path": [0, 2, 3, 5, 7, 9, 10], "anywher": [0, 5], "els": [0, 2, 6, 9], "IN": [0, 7], "singl": [0, 5, 7, 9, 10, 11], "minimalsampl": 0, "configur": [0, 2, 3, 4, 6, 7, 9, 11], "prove": [0, 9], "packet": [0, 2, 4, 5, 6, 7, 10, 11], "By": [0, 2, 5, 7, 9, 10], "do": [0, 2, 3, 5, 7, 9, 10, 11], "proof": [0, 7, 9, 10], "each": [0, 2, 5, 6, 7, 9, 10], "incom": [0, 5, 7, 10], "transmit": [0, 5, 9], "back": [0, 5, 9, 11], "sender": [0, 2, 6, 9, 10], "anyon": [0, 2, 3, 5, 6, 7, 9, 10], "tri": 0, "whether": [0, 5, 7, 9], "wa": [0, 3, 5, 6, 7, 9, 10, 11], "receiv": [0, 2, 5, 7, 9, 10], "correctli": 0, "set_proof_strategi": [0, 7], "prove_al": [0, 7], "everyth": [0, 6, 9], "hand": 0, "over": [0, 3, 4, 5, 7, 9, 10, 11], "control": [0, 2, 3, 4, 6, 7, 9, 11], "loop": 0, "announceloop": 0, "log": [0, 5, 10], "prettyhexrep": 0, "hash": [0, 2, 7, 9, 10], "run": [0, 2, 3, 5, 6, 7, 9, 10, 11], "hit": 0, "enter": [0, 10], "manual": [0, 2, 5, 6, 7, 10], "ctrl": 0, "c": [0, 6, 10], "quit": 0, "until": [0, 2, 5, 7], "exit": [0, 2, 7, 10], "If": [0, 2, 3, 5, 6, 7, 9, 10, 11], "server": [0, 2, 3, 4, 7, 10], "client": [0, 2, 3, 4, 7, 10], "messag": [0, 2, 7, 9, 10], "direct": [0, 2, 3, 6, 7, 9, 10], "toward": [0, 5, 9], "while": [0, 2, 3, 5, 6, 7, 9, 11], "true": [0, 2, 5, 7, 10], "input": [0, 10], "sent": [0, 2, 7, 9, 10], "startup": [0, 10], "get": [0, 3, 4, 5, 7, 10, 11], "pars": 0, "desir": [0, 3, 5, 9], "mode": [0, 2, 3, 4, 9, 10, 11], "__name__": 0, "__main__": 0, "try": [0, 4, 5, 7], "parser": 0, "argumentpars": 0, "descript": [0, 10], "add_argu": 0, "config": [0, 2, 5, 6, 10], "action": 0, "store": [0, 3, 7, 9, 10], "default": [0, 2, 3, 5, 6, 7, 9, 10], "none": [0, 2, 5, 7, 9, 10], "help": [0, 6, 8, 9, 10, 11], "altern": [0, 2, 5, 10], "directori": [0, 10], "type": [0, 2, 4, 5, 6, 7, 10], "str": 0, "arg": 0, "parse_arg": 0, "configarg": 0, "except": [0, 5, 7], "keyboardinterrupt": 0, "print": [0, 5, 10], "found": [0, 2, 5, 6, 9, 10], "http": [0, 2, 8], "github": [0, 2, 8], "com": [0, 2, 8], "markqvist": [0, 2, 8], "blob": [0, 9], "master": [0, 7], "py": [0, 2, 9, 10], "build": [0, 2, 3, 4, 5, 9, 11], "upon": [0, 9], "previou": 0, "explor": [0, 9, 11], "notif": [0, 7], "relev": [0, 3, 5, 7, 9, 10], "set": [0, 2, 3, 5, 6, 7, 9, 10, 11], "callback": [0, 7], "applic": [0, 2, 5, 6, 7, 9, 10, 11], "arriv": [0, 9], "random": [0, 7, 9], "two": [0, 2, 3, 5, 6, 7, 9], "list": [0, 2, 3, 5, 7, 9, 11], "string": [0, 7], "app_data": [0, 7], "fruit": 0, "peach": 0, "quinc": 0, "date": [0, 2], "tangerin": 0, "pomelo": 0, "carambola": 0, "grape": 0, "noble_gas": 0, "helium": 0, "neon": 0, "argon": 0, "krypton": 0, "xenon": 0, "radon": 0, "oganesson": 0, "announcesampl": 0, "space": [0, 2, 3, 6, 9, 11], "destination_1": 0, "destination_2": 0, "handler": [0, 7], "onli": [0, 2, 3, 5, 6, 7, 9, 10, 11], "ask": [0, 2, 3, 7], "chang": [0, 2, 5, 7, 9, 10, 11], "filter": [0, 6, 9, 10], "see": [0, 2, 5, 6, 7, 9, 10, 11], "what": [0, 2, 4, 5, 7, 9], "happen": [0, 2, 7, 9], "announce_handl": 0, "exampleannouncehandl": 0, "aspect_filt": [0, 7], "regist": [0, 7], "transport": [0, 2, 4, 5, 6, 7, 10, 11], "register_announce_handl": [0, 7], "select": [0, 5], "randint": 0, "0": [0, 2, 5, 7, 9, 10, 11], "len": 0, "1": [0, 2, 5, 7, 9, 10], "data": [0, 2, 3, 4, 5, 6, 7, 9, 11], "encod": [0, 7], "utf": 0, "8": [0, 5, 10], "nobl": 0, "ga": 0, "noble_ga": 0, "need": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "class": [0, 6, 7, 11], "method": [0, 2, 5, 7, 9], "take": [0, 2, 5, 9, 10, 11], "option": [0, 2, 3, 4, 6, 7, 9, 10], "argument": [0, 7, 10], "instanc": [0, 4, 5, 7, 9, 10], "some": [0, 2, 3, 5, 6, 7, 9, 10], "want": [0, 2, 5, 6, 9, 10, 11], "aspect": [0, 3, 5, 7, 9, 10], "__init__": [0, 7], "self": [0, 6, 11], "call": [0, 2, 6, 7, 9, 11], "system": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11], "match": [0, 5, 9, 10], "specif": [0, 3, 4, 5, 7, 10, 11], "cannot": [0, 2, 5, 11], "wildcard": 0, "received_announc": [0, 7], "destination_hash": [0, 7, 10], "announced_ident": [0, 7], "contain": [0, 6, 7, 9, 10], "follow": [0, 2, 3, 5, 7, 8, 9, 10, 11], "decod": 0, "plaintext": [0, 7], "unencrypt": [0, 7, 9], "inform": [0, 2, 4, 5, 6, 7, 9, 10], "ani": [0, 2, 3, 5, 6, 7, 8, 9, 10, 11], "listen": [0, 5, 9, 10], "sy": 0, "did": 0, "one": [0, 2, 3, 5, 6, 7, 9, 10, 11], "public_inform": 0, "ad": [0, 3, 4, 5, 6, 7, 9, 11], "so": [0, 2, 3, 5, 6, 7, 8, 9, 10, 11], "differ": [0, 2, 3, 5, 6, 7, 9, 10, 11], "plain": [0, 3, 5, 7, 9], "uncencrypt": 0, "broadcast_destin": 0, "specifi": [0, 2, 3, 5, 6, 7, 10], "everi": [0, 5, 6, 7, 9], "time": [0, 2, 3, 5, 6, 7, 9, 10], "set_packet_callback": [0, 7], "packet_callback": 0, "main": 0, "broadcastloop": 0, "simpli": [0, 2, 3, 5, 6, 9, 10], "out": [0, 2, 3, 5, 6, 7, 9, 10, 11], "r": [0, 5, 9, 10], "n": [0, 9, 10], "end": [0, 5, 6, 7, 9, 11], "stdout": [0, 5, 10], "flush": 0, "text": [0, 2, 6, 9], "prompt": 0, "channelarg": 0, "between": [0, 5, 6, 7, 9, 10], "interfac": [0, 3, 4, 6, 7, 10], "simpl": [0, 3, 7, 9, 10, 11], "respond": [0, 7, 10], "receipt": [0, 7, 9], "choos": [0, 2, 5, 9], "global": [0, 2, 5, 6, 7, 9, 11], "server_ident": 0, "queri": [0, 2, 7, 10], "abl": [0, 2, 5, 6, 7, 9, 10], "verifi": [0, 7, 9, 10, 11], "repli": [0, 10], "encrypt": [0, 2, 6, 7, 9, 10, 11], "wai": [0, 2, 5, 6, 7, 9, 10], "certain": [0, 5, 6, 8, 9], "than": [0, 2, 5, 6, 7, 9, 10, 11], "read": [0, 2, 5, 7, 9, 10], "echo_destin": 0, "tell": [0, 5], "function": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11], "server_callback": 0, "wait": [0, 5, 9, 10], "go": [0, 2, 5, 9], "handl": [0, 3, 5, 6, 7, 9, 10, 11], "reception_stat": 0, "is_connected_to_shared_inst": 0, "reception_rssi": 0, "get_packet_rssi": 0, "packet_hash": 0, "reception_snr": 0, "get_packet_snr": 0, "rssi": [0, 7, 10], "dbm": [0, 5, 10], "snr": [0, 7, 10], "db": [0, 10], "destination_hexhash": 0, "timeout": [0, 7, 10], "binari": [0, 2, 7, 9, 10], "represent": [0, 7], "command": [0, 2, 5, 10], "dest_len": 0, "truncated_hashlength": [0, 7], "2": [0, 5, 7, 9, 10], "rais": [0, 7], "valueerror": [0, 7], "length": [0, 5, 7, 9], "invalid": [0, 7], "hex": [0, 10], "hexadecim": [0, 9, 10], "charact": 0, "byte": [0, 7, 9, 10, 11], "format": [0, 4, 10, 11], "fromhex": 0, "e": [0, 6, 10], "check": [0, 2, 7, 9, 10], "overrid": 0, "loglevel": [0, 7, 10], "provid": [0, 2, 3, 4, 5, 6, 7, 9, 11], "feedback": [0, 4], "log_info": 0, "doe": [0, 2, 3, 4, 5, 6, 7, 9, 10], "load": [0, 2, 7, 10], "has_path": [0, 7], "To": [0, 2, 3, 5, 6, 9, 10, 11], "public": [0, 4, 5, 7, 10], "kei": [0, 4, 6, 7, 10, 11], "done": [0, 2, 5, 6, 9, 10], "recal": [0, 7, 10], "modul": [0, 2, 3, 9, 10, 11], "known": [0, 5, 7, 9, 10], "return": [0, 7, 10], "outgo": [0, 5, 7, 9, 10], "got": 0, "correct": [0, 9], "convent": 0, "request_destin": 0, "add": [0, 2, 5, 6, 7, 10], "echo_request": 0, "get_random_hash": [0, 7], "successfulli": [0, 7, 9], "packetreceipt": [0, 4, 7], "packet_receipt": [0, 7], "set_timeout": [0, 7], "set_timeout_callback": [0, 7], "packet_timed_out": 0, "deliveri": [0, 2, 7, 11], "set_delivery_callback": [0, 7], "packet_deliv": 0, "yet": [0, 5, 9, 11], "retri": [0, 7, 9], "onc": [0, 2, 3, 5, 6, 7, 9, 10, 11], "request_path": [0, 7], "statu": [0, 2, 4, 5, 7, 9, 10], "deliv": [0, 7], "rtt": [0, 7, 9], "get_rtt": [0, 7], "round": [0, 7, 10], "3": [0, 5, 9, 10, 11], "rttstring": 0, "second": [0, 5, 7, 9, 10, 11], "1000": 0, "millisecond": [0, 10], "proof_packet": 0, "valid": [0, 5, 7, 9, 10], "trip": [0, 7, 10], "fail": [0, 2, 7], "store_tru": 0, "t": [0, 2, 5, 6, 7, 10], "metavar": 0, "float": [0, 7], "narg": 0, "timeoutarg": 0, "print_help": 0, "establish": [0, 2, 5, 6, 7, 11], "remot": [0, 4, 7], "forth": 0, "o": [0, 2, 9, 10, 11], "refer": [0, 2, 4], "latest": [0, 2, 5, 7, 10], "latest_client_link": 0, "server_destin": 0, "linkexampl": 0, "set_link_established_callback": [0, 7], "client_connect": 0, "server_loop": 0, "set_link_closed_callback": [0, 7], "client_disconnect": 0, "server_packet_receiv": 0, "disconnect": [0, 5], "activ": [0, 2, 5, 7, 9], "last": [0, 5, 7], "reply_text": 0, "reply_data": 0, "server_link": 0, "sleep": [0, 10], "begin": [0, 3, 7], "And": 0, "client_packet_receiv": 0, "close": [0, 6, 7, 10], "link_establish": 0, "link_clos": 0, "interact": [0, 2, 7, 9, 10], "client_loop": 0, "becom": [0, 2, 6, 9], "should_quit": 0, "fals": [0, 5, 7, 10], "should": [0, 2, 5, 6, 7, 9, 10, 11], "q": [0, 10], "teardown": [0, 7], "mdu": [0, 7], "size": [0, 2, 5, 7, 9, 10], "exce": [0, 5, 7], "log_error": 0, "error": [0, 2, 8, 10], "ha": [0, 2, 3, 5, 6, 7, 9, 11], "been": [0, 2, 3, 5, 6, 7, 9, 11], "later": [0, 2, 5, 10], "teardown_reason": 0, "now": [0, 2, 6, 9, 10], "elif": 0, "destination_clos": 0, "exit_handl": 0, "5": [0, 2, 5, 7, 9, 10, 11], "_exit": 0, "identifi": [0, 5, 7, 9, 10], "intiat": 0, "initi": [0, 6, 7, 9, 11], "peer": [0, 2, 5, 7, 9, 10], "identifyexampl": 0, "set_remote_identified_callback": [0, 7], "remote_identifi": 0, "origin": [0, 6, 9], "displai": [0, 9, 10], "remote_p": 0, "unidentifi": 0, "get_remote_ident": [0, 7], "client_ident": 0, "sendig": 0, "perform": [0, 2, 5, 6, 7, 9, 10], "random_text_gener": 0, "request_id": [0, 7], "link_id": [0, 7], "remote_ident": [0, 7], "requested_at": [0, 7], "look": [0, 2, 5, 9, 10], "On": [0, 2, 5, 10], "full": [0, 5, 7, 9, 10, 11], "moon": 0, "becki": 0, "upset": 0, "stai": [0, 9, 10], "awai": [0, 5, 6, 9, 10], "pet": 0, "shop": 0, "stock": 0, "requestexampl": 0, "register_request_handl": [0, 7], "response_gener": [0, 7], "allow": [0, 2, 3, 5, 6, 7, 9, 10, 11], "allow_al": [0, 7], "response_callback": [0, 7], "got_respons": 0, "failed_callback": [0, 7], "request_fail": 0, "request_receipt": [0, 7], "request_receiv": 0, "structur": [0, 7, 9, 11], "datetim": 0, "vendor": [0, 3], "umsgpack": 0, "share": [0, 2, 6, 7, 9, 10], "object": [0, 7], "subclass": [0, 7], "messagebas": [0, 4, 7], "ensur": [0, 5, 7, 9, 10, 11], "serial": [0, 2, 4, 9, 11], "deseri": 0, "multiplex": 0, "other": [0, 2, 3, 5, 6, 7, 9, 10], "both": [0, 2, 3, 5, 6, 7, 9, 10, 11], "same": [0, 2, 3, 5, 6, 7, 9, 10], "definit": [0, 9], "note": [0, 3, 4, 5, 7, 9, 10], "wish": [0, 9, 10], "make": [0, 2, 3, 5, 8, 9, 10], "stringmessag": 0, "convei": 0, "timestamp": 0, "msgtype": [0, 7], "variabl": [0, 7], "assign": [0, 9, 10], "integ": 0, "valu": [0, 5, 7, 9], "constructor": 0, "uniqu": [0, 5, 7, 9, 11], "across": [0, 3, 6, 7], "0xf000": [0, 7], "reserv": [0, 7], "0x0101": 0, "callabl": [0, 7], "paramet": [0, 3, 5, 6, 7, 9, 10], "empti": 0, "version": [0, 2, 9, 10], "unpack": [0, 7], "final": [0, 7, 9], "implement": [0, 5, 6, 7, 8, 9, 11], "pack": [0, 7], "raw": [0, 3, 7], "payload": [0, 7, 9, 10], "packag": [0, 2, 5, 9], "bundl": 0, "could": [0, 2, 5, 6, 7, 9, 11], "struct": 0, "python": [0, 4, 7, 9, 10, 11], "more": [0, 2, 3, 5, 6, 7, 9, 10, 11], "fit": 0, "entir": [0, 6, 7, 9, 10], "avail": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "properti": [0, 6, 7], "slightli": [0, 2], "less": [0, 5, 7, 9, 11], "due": [0, 6], "header": [0, 7, 9], "content": [0, 2, 6, 10], "stream": [0, 7, 9], "packb": 0, "unpackb": 0, "channelexampl": 0, "get_channel": [0, 7], "register_message_typ": [0, 7], "add_message_handl": [0, 7], "server_message_receiv": 0, "param": 0, "deserializ": 0, "unless": [0, 2, 5, 7, 9], "preced": 0, "indic": [0, 7], "isinst": 0, "reply_messag": 0, "order": [0, 7, 10], "were": [0, 6], "consid": [0, 5, 7, 9, 11], "subsequ": [0, 9], "skip": 0, "packed_s": 0, "is_ready_to_send": [0, 7], "pleas": [0, 2, 5, 7, 10, 11], "pend": 0, "complet": [0, 2, 3, 5, 6, 7, 9, 10, 11], "client_message_receiv": 0, "reader": [0, 7], "writer": [0, 7], "__future__": 0, "annot": 0, "latest_buff": 0, "bufferexampl": 0, "old": [0, 3, 8, 9], "stream_id": [0, 7], "bit": [0, 2, 5, 7, 9, 10, 11], "like": [0, 2, 3, 5, 6, 7, 9, 10, 11], "file": [0, 2, 3, 5, 6, 7, 9, 10, 11], "descriptor": 0, "actual": [0, 2, 5, 9], "separ": [0, 2, 5, 6, 9, 10], "unidirect": 0, "flow": [0, 5, 6], "opposit": [0, 5], "create_bidirectional_buff": [0, 7], "server_buffer_readi": 0, "ready_byt": [0, 7], "int": [0, 7], "otherwis": [0, 7], "forc": [0, 10], "server_client_connect": 0, "detail": [0, 2, 4, 5, 7, 10, 11], "client_buffer_readi": 0, "termin": [0, 2, 7], "download": [0, 5, 10], "resourc": [0, 2, 4, 7, 8], "effici": [0, 2, 5, 9, 11], "serv": [0, 3, 5, 6, 9, 10], "larg": [0, 3, 5, 6, 7, 9, 11], "transfer": [0, 7, 9, 10, 11], "recommend": [0, 2, 9], "compress": [0, 7, 9], "hashmap": 0, "sequenc": [0, 7, 9, 11], "long": [0, 2, 3, 5, 7, 9], "slow": [0, 5, 9], "cpu": [0, 9], "probabl": [0, 2, 6, 9, 10, 11], "result": [0, 9, 10], "befor": [0, 2, 5, 7, 9, 10], "prepar": [0, 6], "instead": [0, 2, 5, 7, 9, 10], "slice": 0, "chunk": 0, "suitabl": [0, 2, 5, 6, 9, 11], "thread": 0, "app_timeout": 0, "45": [0, 9], "serve_path": 0, "here": [0, 2, 5, 9, 10], "conveni": 0, "list_fil": 0, "entri": [0, 2, 9], "listdir": 0, "isfil": 0, "join": [0, 2, 6, 8, 9], "host": [0, 2, 5, 9, 10], "still": [0, 2, 5, 6, 9, 10], "isdir": 0, "list_packet": 0, "list_receipt": 0, "list_deliv": 0, "list_timeout": 0, "too": [0, 6], "mani": [0, 2, 3, 5, 6, 7, 9, 10, 11], "split": 0, "filelist": 0, "multipl": [0, 5, 6, 9, 10], "hint": 0, "alreadi": [0, 2, 3, 6, 7, 9, 10], "support": [0, 2, 4, 5, 6, 7, 9, 10, 11], "after": [0, 2, 5, 6, 7, 9, 10], "re": [0, 5, 7, 9], "keep": [0, 6, 7, 9, 10, 11], "open": [0, 3, 5, 6, 7, 8, 9, 10, 11], "client_request": 0, "longer": [0, 2, 6, 9, 10], "filenam": 0, "rb": 0, "file_resourc": 0, "resource_sending_conclud": 0, "somethign": 0, "went": 0, "wrong": [0, 5], "don": [0, 2, 6, 7, 10], "unknown": [0, 5, 7, 9, 10], "conclud": [0, 7], "hasattr": 0, "server_fil": 0, "current": [0, 2, 4, 5, 7, 9], "current_download": 0, "current_filenam": 0, "statist": [0, 5, 7, 8], "download_start": 0, "download_finish": 0, "download_tim": 0, "transfer_s": 0, "file_s": 0, "expect": [0, 2, 5, 7, 9, 10], "normal": [0, 2, 5, 7, 10], "accordingli": 0, "filelist_receiv": 0, "advertis": [0, 7], "set_resource_strategi": [0, 7], "accept_al": [0, 7], "set_resource_started_callback": [0, 7], "download_began": 0, "set_resource_concluded_callback": [0, 7], "download_conclud": 0, "menu": 0, "menu_mod": 0, "down": [0, 3, 5, 7], "request_packet": 0, "create_receipt": [0, 7], "print_menu": 0, "25": [0, 4, 11], "user_input": 0, "screen": 0, "variou": [0, 2, 5, 6, 9, 10], "state": 0, "It": [0, 2, 3, 5, 7, 9, 10, 11], "uninterest": 0, "won": 0, "clear_screen": 0, "print_filelist": 0, "percent": [0, 5], "get_progress": [0, 7], "100": [0, 5, 9], "rprogress": 0, "save_error": 0, "disk": [0, 7], "hour": [0, 5], "rem": 0, "divmod": 0, "3600": [0, 5], "minut": [0, 2, 5, 9], "60": [0, 5], "timestr": 0, "05": 0, "2f": 0, "ttime": 0, "taken": [0, 9], "tfile": 0, "size_str": 0, "tdata": 0, "teffect": 0, "rate": [0, 4, 7, 10], "suffix": 0, "b": [0, 6, 10], "ttransfer": 0, "press": 0, "index": [0, 2, 4], "enumer": 0, "filelist_data": 0, "extend": [0, 2, 7], "local": [0, 2, 5, 6, 7, 9, 10, 11], "append": [0, 9], "visibl": 0, "updat": [0, 2, 7, 9, 10], "small": [0, 5, 6, 7, 9, 11], "job": 0, "potenti": [0, 5, 8, 9, 10, 11], "target": [0, 5, 10], "filelist_timeout_job": 0, "daemon": [0, 2, 5, 7, 10], "detect": 0, "shown": 0, "progress": [0, 7, 10, 11], "total_s": 0, "saved_filenam": 0, "counter": 0, "wb": 0, "human": [0, 7, 8, 9], "readabl": [0, 7, 9], "num": 0, "unit": [0, 2, 7, 10], "ki": 0, "mi": 0, "gi": 0, "ti": [0, 9], "pi": [0, 4, 6, 9, 10, 11], "ei": 0, "zi": 0, "last_unit": 0, "yi": 0, "k": [0, 10], "m": [0, 2, 9, 10], "g": [0, 10], "p": [0, 10], "z": 0, "y": 0, "ab": 0, "1024": 0, "clear": [0, 5, 7, 9, 10], "cl": 0, "nt": 0, "dir": 0, "best": [2, 9, 11], "guid": [2, 3, 9], "outlin": [2, 3, 9], "sensibl": [2, 3, 5], "scenario": [2, 4, 9], "relat": 2, "easiest": [2, 3, 5, 9], "via": [2, 3, 5, 8, 9, 10, 11], "pip": [2, 3, 10], "manag": [2, 4, 6, 7, 9, 11], "sudo": [2, 10], "apt": 2, "python3": [2, 3], "pamac": 2, "similar": [2, 3, 5, 6, 7, 10, 11], "dowload": 2, "releas": [2, 5, 9], "wheel": 2, "channel": [2, 4, 5, 6, 7, 8, 9, 11], "offlin": 2, "py3": 2, "whl": 2, "mai": [2, 5, 7, 9, 10], "case": [2, 3, 5, 6, 9, 10], "usual": 2, "essenti": [2, 5, 9], "deriv": [2, 7, 9, 11], "arch": 2, "manjaro": 2, "devel": 2, "fedora": 2, "dnf": 2, "groupinstal": 2, "tool": [2, 3, 9, 10, 11], "librari": 2, "compil": 2, "miss": 2, "even": [2, 5, 6, 7, 9, 10, 11], "pre": [2, 7, 9], "built": [2, 5, 9, 10, 11], "few": [2, 3, 5, 6, 9, 10, 11], "extrem": [2, 9, 10, 11], "low": [2, 3, 5, 6, 9, 11], "bandwidth": [2, 5, 6, 7, 9, 10, 11], "These": [2, 5, 7, 9, 10], "feel": 2, "work": [2, 3, 5, 6, 9, 10, 11], "design": [2, 3, 6, 9, 11], "well": [2, 3, 5, 6, 7, 9, 10, 11], "lora": [2, 3, 4, 9, 11], "link": [2, 3, 4, 5, 6, 7, 10, 11], "wifi": [2, 4, 5, 6, 9, 10, 11], "wire": [2, 3, 4, 5, 11], "ethernet": [2, 4, 5, 6, 9, 11], "combin": [2, 4, 6, 9], "As": [2, 3, 5, 6, 7, 9, 11], "easi": [2, 3, 5, 9, 10, 11], "experi": [2, 9], "without": [2, 3, 5, 6, 9, 10, 11], "transceiv": [2, 3, 5, 9, 11], "infrastructur": [2, 3, 5, 6, 9, 10], "launch": [2, 10], "devic": [2, 4, 5, 6, 7, 9, 10], "enough": [2, 3, 9], "physic": [2, 3, 5, 7, 9, 10], "rnsh": [2, 10], "fulli": [2, 3, 9, 10, 11], "session": [2, 9], "pipe": [2, 4, 11], "ssh": 2, "veri": [2, 3, 5, 6, 7, 8, 9, 10, 11], "facilit": 2, "suit": [2, 3, 9, 10], "featur": [2, 8, 9, 11], "delai": [2, 5, 9, 10], "browser": 2, "page": [2, 4, 9], "dynam": [2, 10], "render": 2, "authent": [2, 5, 6, 7, 9, 10, 11], "face": [2, 5], "protocol": [2, 3, 4, 5, 11], "lxmf": [2, 10], "anoth": [2, 7, 9, 10], "project": 2, "nomadnet": 2, "might": [2, 5, 6, 9, 10], "reboot": 2, "again": [2, 5, 9, 10], "would": [2, 5, 6, 7, 9], "rather": [2, 7], "graphic": 2, "linux": [2, 3, 9], "maco": 2, "window": [2, 5], "peopl": [2, 9], "compat": [2, 3, 5, 7, 9], "i2p": [2, 4, 11], "qr": 2, "paper": 2, "anyth": [2, 3, 5, 9, 10, 11], "interoper": [2, 3, 6, 9, 11], "friendli": [2, 11], "voic": 2, "interest": [2, 9], "cours": [2, 5, 9], "come": [2, 9], "easier": [2, 5, 6, 10], "rnsd": [2, 4], "background": [2, 5], "foreground": 2, "servic": [2, 4, 6], "rnstatu": [2, 4, 5, 9], "rnpath": [2, 4, 5], "rnprobe": [2, 4], "view": [2, 5, 9, 10], "chapter": [2, 3, 5, 6, 7, 9, 10, 11], "locat": [2, 3, 6, 9, 10], "exampl": [2, 3, 4, 5, 7, 9, 10, 11], "exampleconfig": [2, 10], "broadcast": [2, 4, 5, 7, 9], "domain": [2, 5], "further": [2, 4, 5], "tcp": [2, 3, 4, 6, 9, 11], "There": [2, 6, 9, 11], "subnet": [2, 6], "rout": [2, 3, 5, 6, 7, 9, 10, 11], "tabl": [2, 5, 6, 9, 10], "thing": 2, "discov": [2, 5], "topographi": [2, 6, 9], "situat": [2, 3, 5, 6, 9], "where": [2, 3, 4, 5, 6, 7, 9, 10], "utilis": [2, 5, 6, 7, 10, 11], "extern": [2, 5, 7, 11], "often": [2, 5, 6, 9, 10], "suffici": [2, 5, 9, 10], "act": [2, 7, 9, 10], "gatewai": [2, 5, 6, 9], "enabl": [2, 3, 5, 6, 7, 9, 10, 11], "wider": [2, 5, 9, 10], "autointerfac": [2, 3, 5, 10], "possibli": 2, "offer": [2, 4, 5, 7, 9], "carefulli": 2, "tcpserverinterfac": [2, 5], "access": [2, 4, 5, 6, 7, 10], "ip": [2, 3, 5, 9, 10, 11], "faster": [2, 5, 9], "lower": [2, 5, 10], "latenc": [2, 9, 11], "energi": 2, "i2pinterfac": [2, 5], "howev": [2, 6, 9], "leak": 2, "reveal": [2, 7, 9, 11], "who": [2, 5, 9], "inspect": [2, 5, 6, 9, 10], "someon": [2, 5], "determin": [2, 7, 9], "adversari": 2, "record": [2, 9], "metadata": 2, "transmiss": [2, 5, 7, 9], "though": [2, 5, 9], "publicli": [2, 5], "most": [2, 3, 5, 6, 7, 9, 10], "anymor": 2, "through": [2, 3, 5, 6, 7, 9, 10, 11], "invis": [2, 5], "parallel": 2, "For": [2, 3, 5, 6, 7, 9, 10, 11], "alwai": [2, 5, 7, 9, 10], "node": [2, 4, 5, 6, 10, 11], "i2pd": [2, 5], "mix": [2, 5, 6, 10], "hide": 2, "relai": 2, "extra": [2, 5, 6, 10], "comput": [2, 9, 11], "power": [2, 3, 5, 9, 10], "attack": 2, "form": [2, 5, 6, 7, 9], "deep": 2, "much": [2, 5, 6, 9, 10], "difficult": [2, 3], "non": [2, 7, 9], "behind": [2, 9], "firewal": [2, 5], "nat": 2, "preserv": [2, 7], "anonym": [2, 6, 7, 9, 11], "care": [2, 7, 11], "experiment": [2, 11], "made": [2, 7, 9], "amsterdam": 2, "hub": [2, 5], "tcpclientinterfac": [2, 3, 5], "ye": [2, 5, 9, 10], "target_host": [2, 5], "target_port": [2, 5], "4965": [2, 10], "betweenthebord": 2, "4242": [2, 5], "g3br23bvx3lq5uddcsjii74xgmn6y5q325ovrkq2zw2wbzbqgbuq": 2, "b32": [2, 5], "point": [2, 3, 5, 6, 9, 10], "absolut": [2, 8, 11], "usag": [2, 4, 5, 7, 8, 10], "occasion": 2, "test": [2, 9, 10], "failur": [2, 5, 7], "guarante": [2, 9], "weird": 2, "goe": 2, "sai": 2, "hardcod": 2, "ship": 2, "practic": [2, 9, 11], "solut": [2, 9, 10], "leav": [2, 6, 9], "hardwar": [2, 4, 5, 6, 7, 9, 10, 11], "wide": [2, 3, 5, 9, 10, 11], "section": [2, 3, 5, 6, 9, 10], "easili": [2, 5, 6, 9, 10, 11], "cheapli": 2, "rnode": [2, 4, 9, 10, 11], "purpos": [2, 3, 5, 7, 9, 10], "digit": [2, 3, 9, 11], "integr": [2, 6, 9], "yourself": [2, 9, 11], "custom": [2, 5, 7, 9, 11], "firmwar": [2, 3, 9, 10], "board": [2, 4, 5, 9, 11], "auto": [2, 3, 4, 7, 9], "script": [2, 3], "prefer": [2, 9], "purchas": [2, 6, 9, 11], "supplier": 2, "addit": [2, 3, 5, 7, 9, 10, 11], "privat": [2, 5, 7, 8, 9, 10, 11], "secur": [2, 9, 11], "uncensor": 2, "mesh": [2, 5, 6, 11], "think": 2, "welcom": 2, "head": 2, "discuss": [2, 3, 9], "propos": 2, "abov": [2, 3, 5, 9, 10], "next": [2, 6, 7, 9], "step": [2, 3], "pyseri": 2, "api": [2, 4, 9, 11], "associ": [2, 7, 9], "recip": 2, "cryptographi": [2, 9, 11], "clone": 2, "repositori": [2, 8, 9], "git": 2, "move": [2, 5, 9, 10], "folder": 2, "symlink": [2, 10], "cd": 2, "ln": [2, 10], "echo": [2, 4], "ve": 2, "immedi": [2, 5, 10], "necessari": [2, 3, 5, 6, 7, 9], "nano": 2, "repeat": 2, "process": [2, 3, 5, 7, 9], "h": [2, 10], "ping": [2, 10], "replac": [2, 7, 9, 10], "below": [2, 3, 5, 10], "174a64852a75682259ad8b921b8bf416": 2, "filetransf": [2, 4, 7], "understand": [2, 4, 7, 10], "submit": 2, "pull": 2, "request": [2, 4, 5, 7, 9, 10], "good": [2, 3, 6, 9, 10], "idea": [2, 9, 10], "introduc": [2, 9], "disucss": 2, "forum": 2, "maintain": [2, 9], "place": [2, 5, 6, 9, 10], "procedur": [2, 7, 9], "quirk": 2, "worth": 2, "being": [2, 5, 7, 9], "awar": [2, 9], "termux": 2, "f": [2, 10], "droid": 2, "emul": 2, "environ": [2, 6, 9], "abil": [2, 3], "pkg": 2, "sure": [2, 3, 10], "upgrad": [2, 9], "Then": 2, "reason": [2, 5, 9], "attempt": [2, 3, 7], "openssl": [2, 9], "libffi": 2, "rust": 2, "export": 2, "cargo_build_target": 2, "aarch64": 2, "sever": [2, 6, 7, 10], "succe": 2, "softwar": [2, 3, 5, 9, 11], "possibl": [2, 3, 5, 6, 7, 9, 10, 11], "apk": 2, "tutori": 2, "code": [2, 3, 4, 5, 10], "architectur": 2, "precompil": 2, "dev": [2, 5, 10], "64": [2, 9, 10], "32": [2, 7, 9], "rasperri": 2, "os": [2, 5], "april": 2, "2023": [2, 10], "onto": [2, 9], "unfortun": 2, "pipx": 2, "isol": [2, 5, 10], "neg": 2, "affect": [2, 5], "ensurepath": 2, "restor": [2, 5], "behaviour": [2, 5, 10], "edit": [2, 10], "conf": 2, "break": [2, 7, 9, 11], "somewhat": 2, "mislead": 2, "choic": 2, "word": 2, "rare": [2, 5], "lead": [2, 9], "conflict": 2, "pose": [2, 9], "problem": [2, 9], "_could_": 2, "obscur": 2, "rnspure": 2, "No": [2, 5, 9, 10, 11], "matter": [2, 5], "perfectli": 2, "pyca": [2, 9], "cryptograph": [2, 4, 6, 10, 11], "primit": [2, 4], "One": [3, 7], "truli": [3, 9], "valuabl": [3, 8], "almost": [3, 5, 9, 10], "conceiv": 3, "kind": [3, 5, 6, 9], "medium": [3, 5, 6, 7, 9, 11], "flexibl": [3, 5, 11], "cover": [3, 9, 11], "wireless": [3, 6], "decad": 3, "modern": [3, 9], "millimet": 3, "wave": 3, "backhaul": [3, 6], "oper": [3, 5, 6, 7, 9, 10, 11], "chanc": 3, "box": 3, "glue": 3, "littl": [3, 9], "effort": 3, "pipeinterfac": [3, 5], "kiss": [3, 4, 10, 11], "simplyequip": 3, "broad": 3, "abund": 3, "sometim": 3, "especi": [3, 5], "scratch": 3, "real": [3, 6, 11], "world": [3, 6, 11], "minim": [3, 4, 9], "cost": [3, 9, 11], "fundament": [3, 9], "categori": 3, "addition": [3, 5, 9], "common": [3, 4, 6, 9, 10, 11], "briefli": [3, 9], "describ": [3, 5, 7, 9], "emploi": [3, 9], "pattern": [3, 9], "high": [3, 5, 9, 11], "capac": [3, 5, 7, 9], "gain": [3, 7, 9], "antenna": 3, "backbon": 3, "area": [3, 5, 6, 9, 11], "reliabl": [3, 5, 6, 7, 9, 11], "commonli": 3, "either": [3, 5, 6, 7, 9, 10], "expens": 3, "hard": 3, "hungri": 3, "allevi": 3, "particular": 3, "plaform": 3, "depend": [3, 4, 6, 7, 9, 10], "its": [3, 5, 7, 9], "compon": [3, 8, 9], "frequenc": [3, 5, 9, 10], "band": [3, 9], "scheme": 3, "limit": [3, 4, 6, 9], "ism": [3, 9], "avoid": [3, 9, 10], "confus": [3, 9], "layer": [3, 5, 6, 7, 9, 11], "noth": [3, 11], "lorawan": [3, 9], "standard": [3, 9], "central": [3, 6, 9], "iot": 3, "overhead": [3, 5, 9], "level": [3, 5, 9, 10], "directli": [3, 5, 7, 9, 10, 11], "replic": [3, 9], "togeth": [3, 9, 10], "exact": [3, 5, 9], "explain": [3, 7], "approach": [3, 9, 10], "develop": [3, 4, 7, 8, 9, 11], "boil": 3, "obtain": [3, 7, 9], "autom": [3, 8, 9], "provis": [3, 10], "rnodeinterfac": [3, 5, 10], "ic": 3, "semtech": 3, "sx1276": 3, "platform": [3, 4, 9, 10], "esp32": 3, "manufactur": [3, 5], "io": 3, "avr": 3, "atmega1284p": 3, "rnodeconf": [3, 4], "autoinstal": [3, 10], "seri": 3, "question": [3, 5], "port": [3, 4, 5, 6, 9, 11], "air": [3, 11], "id": [3, 5, 7, 9, 10], "itself": [3, 4, 9], "short": [3, 5, 9, 10], "bridg": [3, 4], "behav": 3, "mean": [3, 5, 6, 7, 9, 10], "dhcp": [3, 5, 10], "dn": 3, "least": [3, 5, 9, 10, 11], "transpar": [3, 5, 9, 10], "distanc": [3, 9], "ubiqu": 3, "airmax": 3, "ltu": 3, "mikrotik": 3, "exhaust": [3, 9], "rel": [3, 9, 11], "cheap": [3, 9], "co": [3, 5, 11], "concurr": [3, 9, 10], "switch": [3, 5, 9, 10], "fiber": 3, "optic": [3, 11], "virtual": [3, 5, 6, 9, 10, 11], "adapt": [3, 6], "tun": 3, "tap": 3, "serialinterfac": [3, 5], "usb": [3, 6, 9, 10], "freedv": 3, "tnc": [3, 5, 7, 10, 11], "dire": 3, "wolf": 3, "aim": [4, 9], "particip": [4, 6, 9], "pdf": 4, "epub": 4, "caveat": 4, "emptor": 4, "fast": [4, 5, 7, 9], "standalon": 4, "instal": [4, 5, 6, 9, 10, 11], "resolv": [4, 5, 10], "issu": [4, 6, 8], "base": [4, 5, 6, 7, 9, 10, 11], "shell": [4, 10], "nomad": 4, "sideband": 4, "meshchat": 4, "With": [4, 5, 6, 9, 10], "internet": [4, 5, 9, 11], "testnet": [4, 10], "radio": [4, 5, 6, 7, 9, 10, 11], "android": [4, 10], "arm64": 4, "raspberri": [4, 6, 9, 10, 11], "debian": [4, 9, 10], "bookworm": 4, "ubuntu": [4, 10], "lunar": 4, "pure": [4, 9], "rnid": 4, "rncp": 4, "rnx": 4, "improv": [4, 5, 8], "fix": [4, 9], "motiv": 4, "goal": [4, 5], "introduct": 4, "announc": [4, 7, 10], "mechan": [4, 5], "reach": [4, 5, 6], "prioritis": [4, 5, 6, 7], "propag": [4, 5, 7], "rule": [4, 5], "modem": [4, 5, 6, 7, 9, 11], "udp": [4, 6, 9, 10, 11], "multi": [4, 9, 10, 11], "ax": [4, 11], "concept": [4, 9, 10], "overview": [4, 5, 9], "interconnect": [4, 5, 9], "site": [4, 5], "growth": 4, "converg": [4, 9], "identif": [4, 5, 11], "respons": [4, 7, 9], "buffer": [4, 5, 7], "donat": 4, "contribut": 4, "requestreceipt": [4, 7], "rawchannelread": [4, 7], "rawchannelwrit": [4, 7], "search": 4, "distinct": [5, 9], "topologi": [5, 9], "endless": 5, "give": [5, 9, 10], "respect": [5, 11], "discover": 5, "autoconfigur": [5, 11], "ipv6": [5, 10], "router": [5, 10], "sort": [5, 9, 10], "communica": 5, "tion": 5, "usabl": [5, 9], "interface_en": [5, 10], "spe": 5, "cific": 5, "lan": 5, "group": [5, 7, 9], "group_id": 5, "multicast": 5, "temporari": 5, "perman": [5, 10], "multicast_address_typ": 5, "kernel": [5, 10, 11], "wlan0": 5, "eth1": 5, "Or": [5, 10, 11], "ignor": [5, 7, 9], "ones": [5, 10], "ignored_devic": 5, "tun0": 5, "eth0": 5, "autodiscov": 5, "discoveri": [5, 9, 10], "scope": 5, "admin": 5, "organis": [5, 6, 8], "custom_network_nam": 5, "discovery_scop": 5, "discovery_port": 5, "48555": 5, "data_port": 5, "49555": 5, "frequent": 5, "block": 5, "inbound": [5, 7], "portabl": [5, 9], "persist": [5, 10], "achiev": [5, 7, 9], "geti2p": 5, "net": 5, "websit": 5, "base32": 5, "comma": 5, "5urvjicpzi7q3ybztsef4i5ow2aq4soktfj7zedz53s47r54jnqq": 5, "output": [5, 10], "event": 5, "simplest": [5, 9], "tunnel": [5, 9, 11], "interchang": 5, "degre": 5, "retain": [5, 7], "eas": [5, 9], "simpler": 5, "listen_ip": 5, "listen_port": 5, "bind": 5, "10": [5, 9, 10], "88": 5, "i2p_tunnel": 5, "127": 5, "5001": 5, "dedic": [5, 9], "natur": 5, "toler": 5, "intermitt": 5, "gracefulli": 5, "reappear": 5, "hostnam": 5, "expos": [5, 7], "soundmodem": 5, "kiss_fram": 5, "8001": 5, "caution": 5, "frame": 5, "conjunct": 5, "never": [5, 7, 9], "disabl": [5, 9, 10], "intern": [5, 7, 9], "recoveri": 5, "greatli": 5, "unreli": 5, "implic": 5, "better": 5, "udpinterfac": 5, "forward_ip": 5, "255": [5, 10], "forward_port": 5, "assum": [5, 9], "55": 5, "72": 5, "24": 5, "equival": 5, "forward": [5, 7, 9, 11], "segment": [5, 6, 7, 9, 11], "15": 5, "16": [5, 9, 10], "ttyusb0": [5, 10], "867": 5, "mhz": [5, 9], "867200000": 5, "125": 5, "khz": 5, "125000": 5, "tx": [5, 10], "7": [5, 9, 10], "mw": 5, "txpower": 5, "spread": [5, 10], "factor": [5, 7, 10], "12": [5, 10], "fastest": [5, 9], "longest": 5, "spreadingfactor": 5, "throough": 5, "codingr": 5, "interv": [5, 7, 10], "id_callsign": 5, "mycal": 5, "id_interv": 5, "600": 5, "homebrew": 5, "amount": [5, 6, 7, 9, 11], "ram": 5, "flow_control": 5, "airtim": 5, "term": [5, 6, 9], "appli": [5, 7, 9], "approxim": 5, "enforc": [5, 7], "roll": 5, "airtime_limit_long": 5, "airtime_limit_short": 5, "33": 5, "sub": 5, "individu": [5, 7, 9, 11], "rnodemultiinterfac": 5, "ttyacm0": 5, "subinterfac": 5, "highdatar": 5, "themselv": 5, "4ghz": 5, "2400000000": 5, "1625": 5, "1625000": 5, "person": [5, 9], "wrote": 5, "vport": 5, "lowdatar": 5, "865": 5, "6": [5, 7, 10], "865600000": 5, "pair": [5, 7, 9, 10], "laser": 5, "baud": [5, 10], "speed": [5, 9, 10], "115200": [5, 10], "databit": [5, 10], "pariti": [5, 10], "stopbit": [5, 10], "stdin": [5, 10], "netcat": 5, "l": [5, 10], "5757": 5, "respawn": 5, "respawn_delai": 5, "continu": [5, 7, 8, 11], "scan": 5, "eof": 5, "respawn_interv": 5, "varieti": [5, 9, 10, 11], "openmodem": [5, 11], "period": [5, 7, 9], "beacon": 5, "station": 5, "kissinterfac": [5, 10], "ttyusb1": 5, "preambl": [5, 10], "150": [5, 10], "tail": 5, "txtail": [5, 10], "cdma": 5, "200": [5, 10], "slottim": [5, 10], "20": [5, 9, 10], "elaps": 5, "comment": [5, 10], "amateur": [5, 11], "spectrum": [5, 9], "encapsul": [5, 11], "callsign": 5, "ssid": 5, "realli": [5, 7], "doesn": 5, "incur": 5, "ax25kissinterfac": 5, "no1cll": 5, "ttyusb2": 5, "150m": 5, "increas": [5, 10], "squelch": 5, "rx": [5, 10], "turnaround": 5, "kept": [5, 6, 7, 9], "wast": 5, "bring": 5, "brought": [5, 10], "access_point": 5, "shorthand": [5, 10], "ap": 5, "shorter": 5, "expiri": [5, 7], "mostli": [5, 6, 9], "quiet": [5, 10], "momentarili": 5, "disappear": [5, 10], "network_nam": 5, "passphras": [5, 9], "alon": 5, "ifac_s": 5, "customis": 5, "carri": [5, 7, 9, 10], "512": [5, 7, 9], "announce_cap": [5, 7], "maximum": [5, 7, 9, 10], "alloc": [5, 7, 9, 10], "given": [5, 6, 7, 9, 10], "upkeep": 5, "cap": 5, "queue": [5, 9], "nearbi": 5, "overwhelm": [5, 7], "rapidli": 5, "spam": 5, "effect": 5, "excess": 5, "benefici": [5, 10], "balanc": 5, "necesarri": 5, "bitrat": [5, 7], "report": [5, 7, 8, 10], "guess": 5, "per": [5, 7, 9, 10, 11], "strictli": [5, 9], "complex": [5, 9], "left": [5, 7, 9, 10], "gw": 5, "behalf": 5, "resid": 5, "requestor": 5, "chain": 5, "along": [5, 6, 7, 9, 10], "boundari": 5, "remain": [5, 7, 9], "roam": 5, "mobil": [5, 9], "seen": [5, 9], "perspect": [5, 7, 9, 11], "vehicl": 5, "equip": [5, 6, 9], "side": [5, 11], "expir": 5, "significantli": 5, "impact": [5, 7, 9], "announce_rate_target": 5, "announce_rate_grac": 5, "announce_rate_penalti": 5, "basi": [5, 7, 9, 10, 11], "moder": 5, "violat": 5, "penalti": 5, "7200": 5, "annouce_cap": 5, "mention": [5, 9], "strategi": [5, 7], "decis": [5, 9], "slower": [5, 7, 9], "hop": [5, 6, 7, 9, 10, 11], "right": [5, 6], "tend": 5, "conserv": 5, "span": [5, 9], "seamlessli": 5, "influx": 5, "newli": [5, 6, 7, 9], "previous": [5, 6, 7, 9], "occur": [5, 10, 11], "hold": [5, 7, 9], "interrupt": 5, "burst": 5, "subsid": 5, "held": [5, 10], "decid": [5, 6, 7, 9], "bogu": 5, "retransmit": [5, 9], "ingress": 5, "disrupt": 5, "neccessari": 5, "modifi": [5, 9, 10], "ingress_control": 5, "ic_new_tim": 5, "spawn": 5, "ic_burst_freq_new": 5, "ic_burst_freq": 5, "temporarili": 5, "ic_max_held_announc": 5, "drop": [5, 7, 9, 10], "256": [5, 7, 9, 10], "ic_burst_hold": 5, "threshold": 5, "ic_burst_penalti": 5, "ic_held_release_interv": 5, "30": [5, 7, 10], "knowledg": [6, 9], "tradit": [6, 9], "worri": 6, "coordin": [6, 7, 9, 11], "evolv": 6, "futur": [6, 9], "mind": [6, 11], "autonom": [6, 9], "terminologi": [6, 9], "rest": [6, 11], "billion": [6, 9], "larger": [6, 9, 10], "higher": [6, 11], "discrimin": 6, "ephemer": [6, 7, 9, 11], "ellipt": [6, 7, 9, 11], "curv": [6, 7, 9, 11], "diffi": [6, 9, 11], "hellman": [6, 9, 11], "exchang": [6, 7, 9, 11], "curve25519": [6, 7, 9, 11], "throttl": 6, "thu": [6, 7, 9], "agnost": [6, 9], "equal": [6, 7, 9], "keystor": 6, "degrad": 6, "stationari": [6, 10], "candid": 6, "optim": 6, "intend": [6, 9], "trustless": [6, 9, 11], "free": [6, 8, 11], "unorganis": 6, "manner": 6, "far": [6, 9], "unexplor": 6, "dissolv": 6, "organ": 6, "restrict": [6, 10], "legaci": 6, "unifi": 6, "underli": [6, 11], "carrier": [6, 11], "involv": 6, "hardlin": 6, "illustr": [6, 9], "plan": [6, 9], "member": 6, "mainli": 6, "three": [6, 9], "hill": 6, "top": [6, 9], "chosen": [6, 9], "sight": 6, "becaus": [6, 9], "four": 6, "At": [6, 9], "cabl": 6, "suppli": [6, 7, 9], "grow": 6, "core": [6, 9, 10, 11], "those": [6, 9], "d": [6, 10], "island": 6, "investig": 6, "dori": 6, "willing": 6, "she": 6, "her": 6, "home": [6, 10], "everyon": [6, 9], "vice": [6, 11], "versa": [6, 11], "vhf": [6, 9, 11], "outli": 6, "geograph": 6, "coverag": 6, "dai": [6, 7], "find": [6, 9], "poorli": 6, "outlier": 6, "signatur": [7, 9, 10, 11], "configdir": 7, "logdest": 7, "verbos": [7, 10], "exactli": [7, 9], "independ": [7, 9, 11], "inter": 7, "soon": 7, "kill": [7, 9], "forcibli": [7, 10], "advantag": 7, "demand": 7, "mtu": [7, 9, 11], "500": [7, 9, 11], "adher": 7, "prerequisit": 7, "percentag": 7, "schedul": 7, "queu": [7, 10], "fewer": 7, "distant": 7, "smaller": 7, "eventu": 7, "alter": [7, 9], "minimum_bitr": 7, "static": 7, "get_inst": 7, "should_use_implicit_proof": 7, "explicit": 7, "implicit": [7, 9], "transport_en": 7, "remote_management_en": 7, "create_kei": 7, "decrypt": [7, 9, 10], "verif": [7, 9, 10], "sign": [7, 9, 10], "dh": 7, "keysiz": 7, "x25519": [9, 11], "concaten": 7, "128": [7, 9, 11], "constant": 7, "truncat": [7, 9, 10], "recall_app_data": 7, "heard": [7, 9], "full_hash": 7, "sha": [7, 9], "truncated_hash": 7, "from_byt": 7, "prv_byte": 7, "save": [7, 9], "hazard": 7, "feed": 7, "from_fil": 7, "to_fil": 7, "Be": [7, 10], "get_private_kei": 7, "get_public_kei": 7, "load_private_kei": 7, "load_public_kei": 7, "pub_byt": 7, "ratchet": 7, "ciphertext": 7, "token": [7, 9], "keyerror": 7, "ciphertext_token": 7, "presenc": 7, "ingo": 7, "zero": [7, 11], "expand_nam": 7, "app_and_aspects_from_nam": 7, "full_nam": [7, 10], "tupl": 7, "hash_from_name_and_ident": 7, "adress": [7, 9], "path_respons": 7, "attached_interfac": 7, "tag": 7, "flag": [7, 9], "accepts_link": 7, "accept": [7, 8, 9, 10], "set_proof_requested_callback": 7, "proof_strategi": 7, "prove_non": 7, "prove_app": 7, "proof_requested_callback": 7, "allow_non": 7, "allowed_list": 7, "whatev": [7, 9], "funcion": 7, "allow_list": 7, "deregister_request_handl": 7, "deregist": 7, "symmetr": [7, 9], "typeerror": 7, "incompat": [7, 9], "set_default_app_data": 7, "clear_default_app_data": 7, "ae": [7, 9, 11], "secreci": [7, 9, 11], "instanti": 7, "encrypted_mdu": 7, "383": 7, "plain_mdu": 7, "464": 7, "resend": 7, "get_statu": 7, "cull": 7, "successful": 7, "proven": [7, 9], "established_callback": 7, "closed_callback": 7, "establishment_timeout_per_hop": 7, "keepalive_timeout_factor": 7, "4": [7, 9, 10], "calcul": [7, 9, 10], "stale_grac": 7, "grace": 7, "keepal": [7, 9], "360": 7, "aliv": [7, 9], "stale_tim": 7, "720": 7, "mark": [7, 9], "stale": 7, "torn": 7, "progress_callback": 7, "info": [7, 9, 10], "track_phy_stat": 7, "track": 7, "retriev": 7, "stat": [7, 10], "qualiti": 7, "get_rssi": 7, "signal": [7, 9], "strength": [7, 11], "get_snr": 7, "nois": 7, "ratio": 7, "get_q": 7, "get_establishment_r": 7, "ocur": 7, "get_ag": 7, "no_inbound_for": 7, "no_outbound_for": 7, "outbound": [7, 9], "no_data_for": 7, "travers": [7, 9], "exclud": [7, 9], "inactive_for": 7, "purg": 7, "set_resource_callback": 7, "get_transfer_s": 7, "get_data_s": 7, "get_part": 7, "is_compress": 7, "begun": 7, "resource_strategi": 7, "accept_non": 7, "accept_app": 7, "resource_callback": 7, "unsupport": 7, "get_request_id": 7, "get_respons": 7, "get_response_tim": 7, "auto_compress": 7, "arbitrari": [7, 9, 10, 11], "checksum": [7, 11], "Will": 7, "whenev": [7, 9], "cancel": 7, "total": [7, 9, 11], "get_seg": 7, "divid": 7, "get_hash": 7, "bi": [7, 9], "neither": [7, 9], "constrain": 7, "message_class": 7, "recept": 7, "messagecallbacktyp": 7, "bool": 7, "stop": [7, 11], "remove_message_handl": 7, "remov": [7, 10], "envelop": 7, "thrown": 7, "consum": 7, "adjust": 7, "accommod": [7, 9], "abstract": [7, 9], "greater": [7, 9, 11], "popul": 7, "bufferedread": 7, "bufferedwrit": 7, "bufferedrwpair": 7, "create_read": 7, "ready_callback": 7, "document": [7, 9], "create_writ": 7, "receive_stream_id": 7, "send_stream_id": 7, "rawiobas": 7, "add_ready_callback": 7, "cb": [7, 9], "remove_ready_callback": 7, "pathfinder_m": 7, "attribut": 7, "deregister_announce_handl": 7, "hops_to": 7, "next_hop": 7, "next_hop_interfac": 7, "on_interfac": 7, "recurs": 7, "gratefulli": 8, "monero": 8, "84fpy1qbxhcgdseepynmhthcrgmx4nffbytz2gkytoqhvvhjp8eaw1z1eedrnkd19b3b8nilcgvxzkv17ummmeescrpya5w": 8, "ethereum": 8, "0x81f7b979fea6134ba9fd5c701b3501a2e61e897a": 8, "bitcoin": 8, "3cpmacgm34qyvr6xwlvejmi2ane3pzquuq": 8, "ko": 8, "fi": 8, "roadmap": 8, "realiti": 8, "quickli": [8, 9, 11], "sponsor": [8, 11], "dysfunct": 8, "analyt": 8, "telemetri": 8, "collect": 8, "under": [8, 10, 11], "circumst": [8, 9], "reli": [8, 9], "fashion": 8, "u": [8, 9, 10], "suggest": 8, "overal": 9, "principl": [9, 11], "author": 9, "That": 9, "said": 9, "pretti": 9, "sentiment": 9, "philosophi": 9, "seek": 9, "solv": 9, "primari": 9, "lack": 9, "my": 9, "belief": 9, "highli": 9, "machin": 9, "censorship": [9, 11], "barrier": 9, "todai": 9, "centralis": 9, "trust": [9, 10], "approv": 9, "gatekeep": 9, "inevit": 9, "govern": 9, "censor": 9, "persecut": 9, "unwant": 9, "actor": 9, "imposs": 9, "freeli": 9, "deploi": 9, "enhanc": 9, "agenc": 9, "freedom": 9, "permissionless": 9, "pick": 9, "ghz": 9, "off": [9, 10, 11], "shelf": [9, 11], "ultim": 9, "vast": 9, "myriad": 9, "thousand": 9, "surveil": 9, "disassoci": 9, "oversight": 9, "beings": 9, "useabl": 9, "critic": [9, 10], "agnostic": 9, "shall": 9, "handheld": 9, "strong": 9, "oneself": 9, "unlicens": 9, "licens": 9, "condit": [9, 11], "pmr": 9, "written": 9, "programm": 9, "orient": 9, "multipoint": 9, "recipi": 9, "singular": 9, "_represented_": 9, "characterist": 9, "13425ec15b621c1d928589718000d814": 9, "trade": 9, "simultan": 9, "unlik": 9, "nears": 9, "congest": 9, "galact": 9, "scale": [9, 11], "obvious": 9, "ridicul": 9, "special": [9, 10], "ecdh": [9, 11], "creator": 9, "correspond": 9, "possess": 9, "although": [9, 11], "capabl": 9, "dot": [9, 10], "notat": [9, 10], "repres": 9, "plenti": 9, "environment": 9, "monitor": 9, "measur": 9, "environmentlogg": 9, "remotesensor": 9, "temperatur": 9, "4faf1b2e0a077e6a9d92fa051f256038": 9, "advis": 9, "expand": 9, "recap": 9, "indirectli": 9, "ledger": 9, "therefor": [9, 11], "messeng": 9, "nicknam": 9, "ed25519": [9, 11], "reconstruct": 9, "notic": [9, 10], "piec": 9, "intention": 9, "infer": 9, "throughout": 9, "accord": 9, "around": 9, "topic": 9, "necessarili": 9, "entiti": 9, "robot": 9, "sensor": 9, "someth": 9, "agent": 9, "manipul": [9, 11], "multilater": 9, "creation": [9, 11], "great": 9, "suffic": 9, "cluster": 9, "hear": 9, "But": 9, "lot": 9, "surviv": 9, "overcom": 9, "challeng": 9, "asymmetr": [9, 10, 11], "closer": 9, "distinguish": 9, "contend": 9, "enable_transport": [9, 10], "randomis": 9, "prioriti": 9, "invers": 9, "proport": 9, "count": 9, "insert": 9, "closest": 9, "newer": [7, 9], "newest": 9, "discard": [7, 9], "contact": 9, "shortest": 9, "predict": 9, "constantli": 9, "earlier": 9, "opt": 9, "against": 9, "bidirect": 9, "rememb": [7, 9], "ten": 9, "advanc": 9, "confirm": [9, 11], "insid": 9, "intermediari": 9, "moment": [9, 11], "methodologi": [9, 10], "answer": [9, 10], "malici": 9, "pretend": 9, "recreat": 9, "rotat": [7, 9], "memori": 9, "thereaft": 9, "297": [9, 11], "neglig": 9, "1200": 9, "96": 9, "keypair": 9, "simplic": 9, "explan": [9, 10], "lki": 9, "laid": 9, "had": 9, "construct": [9, 11], "lkr": 9, "chose": 9, "direction": 9, "unequivoc": 9, "retransmiss": 9, "reassembl": 9, "programmat": 9, "satisfi": 9, "half": [9, 11], "duplex": [9, 11], "averag": 9, "throughput": [9, 11], "x": [7, 9, 10], "runtim": 9, "consist": 9, "whereupon": 9, "stabl": [9, 11], "stage": 9, "year": 9, "microcontrol": 9, "430": 9, "868": 9, "900": 9, "recent": [7, 9], "mac": 9, "tailor": 9, "treat": 9, "regard": 9, "preshar": 9, "ifac": [9, 10], "compos": 9, "field": 9, "context": 9, "465": 9, "vari": [9, 10], "unset": 9, "00": [9, 10], "01": 9, "11": 9, "_______": 9, "________________": 9, "________": 9, "______": 9, "__": 9, "_": 9, "01010000": 9, "00000100": 9, "hash1": 9, "hash2": 9, "header_2": 9, "00000000": 9, "00000111": 9, "header_1": 9, "10000000": 9, "51": 9, "167": 9, "83": [9, 10], "115": 9, "99": 9, "conceptu": 9, "hkdf": 9, "fernet": [9, 11], "cbc": [9, 11], "hmac": [9, 11], "hashlib": 9, "pkcs7": [9, 11], "pad": [9, 11], "trivial": [9, 11], "consequ": 9, "backend": 9, "loss": 9, "scrutini": 9, "review": [9, 11], "risk": 9, "driver": [10, 11], "privileg": 10, "light": 10, "weight": 10, "etc": 10, "boot": 10, "ie": 10, "breviti": 10, "socket": 10, "turn": 10, "share_inst": 10, "shared_instance_port": 10, "37428": 10, "instance_control_port": 10, "37429": 10, "rpc": 10, "rpc_kei": 10, "e5c032d3ec4e64a6aca9927ba8ab73336780f6d71790": 10, "panic": 10, "unrecover": 10, "panic_on_interface_error": 10, "probe": 10, "respond_to_prob": 10, "warn": 10, "debug": 10, "unus": 10, "teach": 10, "task": 10, "08": 10, "18": 10, "17": 10, "59": 10, "56": 10, "v": 10, "show": 10, "ifconfig": 10, "gbp": 10, "13": 10, "kb": 10, "86": 10, "mbp": 10, "63": 10, "23": 10, "80": 10, "tcpinterfac": 10, "dublin": 10, "187": 10, "27": 10, "74": 10, "uhf": [10, 11], "kbp": 10, "e702c42ba8": 10, "49": 10, "9": 10, "5245a8efe1788c6a1cd36144a270e13b": 10, "j": 10, "w": 10, "posit": 10, "arx": 10, "atx": 10, "revers": 10, "json": 10, "new_ident": 10, "984b74a3f768bef236af4371e6f248cd": 10, "new_id": 10, "0f4259fef4521ab75a3409e353fe9073eb10783b4912a6a9937c57bf44a62c1": 10, "hidden": 10, "8dd57a738226809646089335a6b03695": 10, "my_fil": 10, "txt": 10, "bc7291552be7a58f361522990465165c": 10, "rfe": 10, "fetch": 10, "30602def3b3506a28ed33db6f60cc6c9": 10, "2b489d06eaf7c543808c76a5332a447d": 10, "my_ident": 10, "2225fdeecaf6e2db4556c3c2d7637294": 10, "decreas": 10, "overwrit": 10, "c89b4da064bf66d280f0e4d8abfd9806": 10, "f53a1c4278e0726bb73fcc623d6ce763": 10, "max": 10, "rnstransport": 10, "2d03725b327348980d570f739a3a5708": 10, "38": 10, "469": 10, "781": 10, "e7536ee90bd4a440e130490b87a25124": 10, "809": 10, "73": 10, "1726dbad538775b5bf9b0ea25a4079c8": 10, "c50cc4e4f7838b6c31f60ab9032cbc62": 10, "allowed_ident": 10, "copi": 10, "tgz": 10, "73cbd378bb0286ed11a707c13447bb1": 10, "allowed_hash": 10, "silent": 10, "jail": 10, "auth": 10, "941bed5e228775e5a8079fc38b1ccf3f": 10, "1b03013c25f1c2ca068a4f080b844a10": 10, "7a55144adf826958a9529a3bcf08b149": 10, "cat": 10, "proc": 10, "cpuinfo": 10, "pseudo": 10, "stderr": 10, "noauth": 10, "noid": 10, "mirror": 10, "fw": 10, "url": 10, "nocheck": 10, "flash": 10, "baud_flash": 10, "addr": 10, "freq": 10, "hz": 10, "bw": 10, "txp": 10, "sf": 10, "cr": 10, "eeprom": 10, "backup": 10, "dump": 10, "wipe": 10, "hexbyt": 10, "firmware_hash": 10, "product": 10, "model": 10, "hwrev": 10, "revis": 10, "attach": 10, "older": 10, "onlin": 10, "extract": 10, "cach": 10, "921600": 10, "bluetooth": 10, "intens": 10, "ff": 10, "consol": 10, "unlock": 10, "bootstrap": 10, "rom": 10, "enable_remote_manag": 10, "remote_management_allow": 10, "9fb6d773498fb3feda407ed8ef2c3229": 10, "2d882c5586e548d79b5af27bca1776dc": 10, "administr": 10, "ftdi_ft230x_basic_uart_43891ckm": 10, "if00": 10, "port0": 10, "plug": 10, "unplug": 10, "systemd": 10, "usr": 10, "bin": 10, "execstartpr": 10, "restart": 10, "restartsec": 10, "usernameher": 10, "execstart": 10, "wantedbi": 10, "systemctl": 10, "whole": 10, "regular": 10, "rns_bin_dir": 10, "eg": 10, "reload": 10, "loginctl": 10, "linger": 10, "readili": 11, "advers": 11, "unforg": 11, "acknowledg": 11, "empow": 11, "autonomi": 11, "sovereignti": 11, "subject": 11, "outsid": [7, 11], "planetari": 11, "hierarch": 11, "beaureucrat": 11, "resili": 11, "userland": 11, "beta": 11, "bug": 11, "warrant": 11, "sha256": 11, "iv": 11, "urandom": 11, "intuit": 11, "44": 11, "gigabyt": 11, "scalabl": 11, "hoc": 11, "transform": 11, "fact": 11, "generalis": 11, "fibr": 11, "popular": 11, "ideal": 11, "stdio": 11, "hack": 11, "foremost": 11, "audit": 11, "privaci": 11, "thorough": 11, "research": 11, "touch": 11, "ratchets": 7, "ratchet_expiri": 7, "2592000": 7, "meantim": 7, "ratchet_count": 7, "ratchet_interv": 7, "1800": 7, "enable_ratchet": 7, "ratchets_path": 7, "set_retained_ratchet": 7, "retained_ratchet": 7, "succeed": 7, "set_ratchet_interv": 7, "25519": 7, "enforce_ratchet": 7}, "objects": {"RNS": [[7, 0, 1, "", "Buffer"], [7, 0, 1, "", "Destination"], [7, 0, 1, "", "Identity"], [7, 0, 1, "", "Link"], [7, 0, 1, "", "MessageBase"], [7, 0, 1, "", "Packet"], [7, 0, 1, "", "PacketReceipt"], [7, 0, 1, "", "RawChannelReader"], [7, 0, 1, "", "RawChannelWriter"], [7, 0, 1, "", "RequestReceipt"], [7, 0, 1, "", "Resource"], [7, 0, 1, "", "Reticulum"], [7, 0, 1, "", "Transport"]], "RNS.Buffer": [[7, 1, 1, "", "create_bidirectional_buffer"], [7, 1, 1, "", "create_reader"], [7, 1, 1, "", "create_writer"]], "RNS.Channel": [[7, 0, 1, "", "Channel"]], "RNS.Channel.Channel": [[7, 2, 1, "", "MDU"], [7, 1, 1, "", "add_message_handler"], [7, 1, 1, "", "is_ready_to_send"], [7, 1, 1, "", "register_message_type"], [7, 1, 1, "", "remove_message_handler"], [7, 1, 1, "", "send"]], "RNS.Destination": [[7, 3, 1, "", "RATCHET_COUNT"], [7, 3, 1, "", "RATCHET_INTERVAL"], [7, 1, 1, "", "accepts_links"], [7, 1, 1, "", "announce"], [7, 1, 1, "", "app_and_aspects_from_name"], [7, 1, 1, "", "clear_default_app_data"], [7, 1, 1, "", "create_keys"], [7, 1, 1, "", "decrypt"], [7, 1, 1, "", "deregister_request_handler"], [7, 1, 1, "", "enable_ratchets"], [7, 1, 1, "", "encrypt"], [7, 1, 1, "", "enforce_ratchets"], [7, 1, 1, "", "expand_name"], [7, 1, 1, "", "get_private_key"], [7, 1, 1, "", "hash"], [7, 1, 1, "", "hash_from_name_and_identity"], [7, 1, 1, "", "load_private_key"], [7, 1, 1, "", "register_request_handler"], [7, 1, 1, "", "set_default_app_data"], [7, 1, 1, "", "set_link_established_callback"], [7, 1, 1, "", "set_packet_callback"], [7, 1, 1, "", "set_proof_requested_callback"], [7, 1, 1, "", "set_proof_strategy"], [7, 1, 1, "", "set_ratchet_interval"], [7, 1, 1, "", "set_retained_ratchets"], [7, 1, 1, "", "sign"]], "RNS.Identity": [[7, 3, 1, "", "CURVE"], [7, 3, 1, "", "KEYSIZE"], [7, 3, 1, "", "RATCHETSIZE"], [7, 3, 1, "", "RATCHET_EXPIRY"], [7, 3, 1, "", "TRUNCATED_HASHLENGTH"], [7, 1, 1, "", "decrypt"], [7, 1, 1, "", "encrypt"], [7, 1, 1, "", "from_bytes"], [7, 1, 1, "", "from_file"], [7, 1, 1, "", "full_hash"], [7, 1, 1, "", "get_private_key"], [7, 1, 1, "", "get_public_key"], [7, 1, 1, "", "get_random_hash"], [7, 1, 1, "", "load_private_key"], [7, 1, 1, "", "load_public_key"], [7, 1, 1, "", "recall"], [7, 1, 1, "", "recall_app_data"], [7, 1, 1, "", "sign"], [7, 1, 1, "", "to_file"], [7, 1, 1, "", "truncated_hash"], [7, 1, 1, "", "validate"]], "RNS.Link": [[7, 3, 1, "", "CURVE"], [7, 3, 1, "", "ESTABLISHMENT_TIMEOUT_PER_HOP"], [7, 3, 1, "", "KEEPALIVE"], [7, 3, 1, "", "KEEPALIVE_TIMEOUT_FACTOR"], [7, 3, 1, "", "STALE_GRACE"], [7, 3, 1, "", "STALE_TIME"], [7, 1, 1, "", "get_age"], [7, 1, 1, "", "get_channel"], [7, 1, 1, "", "get_establishment_rate"], [7, 1, 1, "", "get_q"], [7, 1, 1, "", "get_remote_identity"], [7, 1, 1, "", "get_rssi"], [7, 1, 1, "", "get_snr"], [7, 1, 1, "", "identify"], [7, 1, 1, "", "inactive_for"], [7, 1, 1, "", "no_data_for"], [7, 1, 1, "", "no_inbound_for"], [7, 1, 1, "", "no_outbound_for"], [7, 1, 1, "", "request"], [7, 1, 1, "", "set_link_closed_callback"], [7, 1, 1, "", "set_packet_callback"], [7, 1, 1, "", "set_remote_identified_callback"], [7, 1, 1, "", "set_resource_callback"], [7, 1, 1, "", "set_resource_concluded_callback"], [7, 1, 1, "", "set_resource_started_callback"], [7, 1, 1, "", "set_resource_strategy"], [7, 1, 1, "", "teardown"], [7, 1, 1, "", "track_phy_stats"]], "RNS.MessageBase": [[7, 3, 1, "", "MSGTYPE"], [7, 1, 1, "", "pack"], [7, 1, 1, "", "unpack"]], "RNS.Packet": [[7, 3, 1, "", "ENCRYPTED_MDU"], [7, 3, 1, "", "PLAIN_MDU"], [7, 1, 1, "", "resend"], [7, 1, 1, "", "send"]], "RNS.PacketReceipt": [[7, 1, 1, "", "get_rtt"], [7, 1, 1, "", "get_status"], [7, 1, 1, "", "set_delivery_callback"], [7, 1, 1, "", "set_timeout"], [7, 1, 1, "", "set_timeout_callback"]], "RNS.RawChannelReader": [[7, 1, 1, "", "__init__"], [7, 1, 1, "", "add_ready_callback"], [7, 1, 1, "", "remove_ready_callback"]], "RNS.RawChannelWriter": [[7, 1, 1, "", "__init__"]], "RNS.RequestReceipt": [[7, 1, 1, "", "concluded"], [7, 1, 1, "", "get_progress"], [7, 1, 1, "", "get_request_id"], [7, 1, 1, "", "get_response"], [7, 1, 1, "", "get_response_time"], [7, 1, 1, "", "get_status"]], "RNS.Resource": [[7, 1, 1, "", "advertise"], [7, 1, 1, "", "cancel"], [7, 1, 1, "", "get_data_size"], [7, 1, 1, "", "get_hash"], [7, 1, 1, "", "get_parts"], [7, 1, 1, "", "get_progress"], [7, 1, 1, "", "get_segments"], [7, 1, 1, "", "get_transfer_size"], [7, 1, 1, "", "is_compressed"]], "RNS.Reticulum": [[7, 3, 1, "", "ANNOUNCE_CAP"], [7, 3, 1, "", "MINIMUM_BITRATE"], [7, 3, 1, "", "MTU"], [7, 1, 1, "", "get_instance"], [7, 1, 1, "", "remote_management_enabled"], [7, 1, 1, "", "should_use_implicit_proof"], [7, 1, 1, "", "transport_enabled"]], "RNS.Transport": [[7, 3, 1, "", "PATHFINDER_M"], [7, 1, 1, "", "deregister_announce_handler"], [7, 1, 1, "", "has_path"], [7, 1, 1, "", "hops_to"], [7, 1, 1, "", "next_hop"], [7, 1, 1, "", "next_hop_interface"], [7, 1, 1, "", "register_announce_handler"], [7, 1, 1, "", "request_path"]]}, "objtypes": {"0": "py:class", "1": "py:method", "2": "py:property", "3": "py:attribute"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "method", "Python method"], "2": ["py", "property", "Python property"], "3": ["py", "attribute", "Python attribute"]}, "titleterms": {"code": [0, 8, 9], "exampl": [0, 6], "minim": 0, "announc": [0, 5, 9], "broadcast": 0, "echo": 0, "link": [0, 9], "identif": 0, "request": 0, "respons": 0, "channel": 0, "buffer": 0, "filetransf": 0, "an": 1, "explan": 1, "reticulum": [1, 2, 3, 4, 8, 9, 10, 11], "human": 1, "Beings": 1, "get": [2, 9], "start": 2, "fast": 2, "standalon": 2, "instal": [2, 3], "resolv": 2, "depend": 2, "issu": 2, "try": 2, "us": [2, 10, 11], "base": [2, 3], "program": [2, 10], "remot": [2, 10], "shell": 2, "nomad": 2, "network": [2, 4, 6], "sideband": 2, "meshchat": 2, "includ": [2, 10], "util": [2, 10], "creat": [2, 3], "With": 2, "connect": 2, "instanc": 2, "over": [2, 6], "internet": [2, 6], "public": [2, 9], "testnet": 2, "ad": 2, "radio": [2, 3], "interfac": [2, 5, 9, 11], "develop": 2, "particip": 2, "platform": 2, "specif": [2, 9], "note": 2, "android": 2, "arm64": 2, "raspberri": 2, "pi": 2, "debian": 2, "bookworm": 2, "ubuntu": 2, "lunar": 2, "pure": 2, "python": 2, "commun": 3, "hardwar": 3, "combin": 3, "type": [3, 9, 11], "rnode": [3, 5], "support": [3, 8], "board": 3, "lilygo": 3, "lora32": 3, "v2": 3, "1": 3, "0": 3, "t": 3, "beam": 3, "heltec": 3, "unsign": 3, "x": 3, "v1": 3, "usag": 3, "wifi": 3, "ethernet": 3, "serial": [3, 5, 10], "line": 3, "devic": [3, 11], "packet": [3, 9], "modem": 3, "stack": 4, "manual": 4, "tabl": 4, "Of": 4, "content": 4, "indic": 4, "configur": [5, 10], "auto": 5, "i2p": 5, "tcp": 5, "server": 5, "client": 5, "udp": 5, "lora": [5, 6], "multi": 5, "pipe": 5, "kiss": 5, "ax": 5, "25": 5, "common": 5, "option": 5, "mode": 5, "rate": 5, "control": 5, "new": 5, "destin": [5, 9], "limit": 5, "build": 6, "concept": 6, "overview": 6, "scenario": 6, "interconnect": 6, "site": 6, "bridg": 6, "growth": 6, "converg": 6, "api": 7, "refer": [7, 9], "donat": 8, "provid": 8, "feedback": 8, "contribut": 8, "understand": 9, "motiv": 9, "goal": 9, "introduct": 9, "basic": 9, "function": 9, "name": [9, 10], "kei": 9, "ident": 9, "further": 9, "transport": 9, "node": 9, "The": [9, 10], "mechan": 9, "detail": 9, "reach": 9, "establish": 9, "resourc": 9, "setup": 9, "protocol": 9, "prioritis": 9, "access": 9, "wire": 9, "format": 9, "propag": 9, "rule": 9, "cryptograph": 9, "primit": 9, "your": 10, "system": 10, "data": 10, "rnsd": 10, "rnstatu": 10, "rnid": 10, "rnpath": 10, "rnprobe": 10, "rncp": 10, "rnx": 10, "rnodeconf": 10, "manag": 10, "improv": 10, "fix": 10, "port": 10, "servic": 10, "systemwid": 10, "userspac": 10, "what": 11, "i": 11, "current": 11, "statu": 11, "doe": 11, "offer": 11, "where": 11, "can": 11, "caveat": 11, "emptor": 11}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"Code Examples": [[0, "code-examples"]], "Minimal": [[0, "minimal"]], "Announce": [[0, "announce"]], "Broadcast": [[0, "broadcast"]], "Echo": [[0, "echo"]], "Link": [[0, "link"]], "Identification": [[0, "example-identify"]], "Requests & Responses": [[0, "requests-responses"]], "Channel": [[0, "channel"]], "Buffer": [[0, "buffer"]], "Filetransfer": [[0, "filetransfer"]], "An Explanation of Reticulum for Human Beings": [[1, "an-explanation-of-reticulum-for-human-beings"]], "Getting Started Fast": [[2, "getting-started-fast"]], "Standalone Reticulum Installation": [[2, "standalone-reticulum-installation"]], "Resolving Dependency & Installation Issues": [[2, "resolving-dependency-installation-issues"]], "Try Using a Reticulum-based Program": [[2, "try-using-a-reticulum-based-program"]], "Remote Shell": [[2, "remote-shell"]], "Nomad Network": [[2, "nomad-network"]], "Sideband": [[2, "sideband"]], "MeshChat": [[2, "meshchat"]], "Using the Included Utilities": [[2, "using-the-included-utilities"]], "Creating a Network With Reticulum": [[2, "creating-a-network-with-reticulum"]], "Connecting Reticulum Instances Over the Internet": [[2, "connecting-reticulum-instances-over-the-internet"]], "Connect to the Public Testnet": [[2, "connect-to-the-public-testnet"]], "Adding Radio Interfaces": [[2, "adding-radio-interfaces"]], "Develop a Program with Reticulum": [[2, "develop-a-program-with-reticulum"]], "Participate in Reticulum Development": [[2, "participate-in-reticulum-development"]], "Platform-Specific Install Notes": [[2, "platform-specific-install-notes"]], "Android": [[2, "android"]], "ARM64": [[2, "arm64"]], "Raspberry Pi": [[2, "raspberry-pi"]], "Debian Bookworm": [[2, "debian-bookworm"]], "Ubuntu Lunar": [[2, "ubuntu-lunar"]], "Pure-Python Reticulum": [[2, "pure-python-reticulum"]], "Communications Hardware": [[3, "communications-hardware"]], "Combining Hardware Types": [[3, "combining-hardware-types"]], "RNode": [[3, "rnode"]], "Creating RNodes": [[3, "creating-rnodes"]], "Supported Boards": [[3, "supported-boards"]], "LilyGO LoRa32 v2.1": [[3, "lilygo-lora32-v2-1"]], "LilyGO LoRa32 v2.0": [[3, "lilygo-lora32-v2-0"]], "LilyGO T-Beam": [[3, "lilygo-t-beam"]], "Heltec LoRa32 v2.0": [[3, "heltec-lora32-v2-0"]], "Unsigned RNode v2.x": [[3, "unsigned-rnode-v2-x"]], "Unsigned RNode v1.x": [[3, "unsigned-rnode-v1-x"]], "Installation": [[3, "installation"]], "Usage with Reticulum": [[3, "usage-with-reticulum"]], "WiFi-based Hardware": [[3, "wifi-based-hardware"]], "Ethernet-based Hardware": [[3, "ethernet-based-hardware"]], "Serial Lines & Devices": [[3, "serial-lines-devices"]], "Packet Radio Modems": [[3, "packet-radio-modems"]], "Reticulum Network Stack Manual": [[4, "reticulum-network-stack-manual"]], "Table Of Contents": [[4, "table-of-contents"]], "Indices and Tables": [[4, "indices-and-tables"]], "Configuring Interfaces": [[5, "configuring-interfaces"]], "Auto Interface": [[5, "auto-interface"]], "I2P Interface": [[5, "i2p-interface"]], "TCP Server Interface": [[5, "tcp-server-interface"]], "TCP Client Interface": [[5, "tcp-client-interface"]], "UDP Interface": [[5, "udp-interface"]], "RNode LoRa Interface": [[5, "rnode-lora-interface"]], "RNode Multi Interface": [[5, "rnode-multi-interface"]], "Serial Interface": [[5, "serial-interface"]], "Pipe Interface": [[5, "pipe-interface"]], "KISS Interface": [[5, "kiss-interface"]], "AX.25 KISS Interface": [[5, "ax-25-kiss-interface"]], "Common Interface Options": [[5, "common-interface-options"]], "Interface Modes": [[5, "interface-modes"]], "Announce Rate Control": [[5, "announce-rate-control"]], "New Destination Rate Limiting": [[5, "new-destination-rate-limiting"]], "Building Networks": [[6, "building-networks"]], "Concepts & Overview": [[6, "concepts-overview"]], "Example Scenarios": [[6, "example-scenarios"]], "Interconnected LoRa Sites": [[6, "interconnected-lora-sites"]], "Bridging Over the Internet": [[6, "bridging-over-the-internet"]], "Growth and Convergence": [[6, "growth-and-convergence"]], "Support Reticulum": [[8, "support-reticulum"]], "Donations": [[8, "donations"]], "Provide Feedback": [[8, "provide-feedback"]], "Contribute Code": [[8, "contribute-code"]], "Understanding Reticulum": [[9, "understanding-reticulum"]], "Motivation": [[9, "motivation"]], "Goals": [[9, "goals"]], "Introduction & Basic Functionality": [[9, "introduction-basic-functionality"]], "Destinations": [[9, "destinations"]], "Destination Naming": [[9, "destination-naming"]], "Public Key Announcements": [[9, "public-key-announcements"]], "Identities": [[9, "understanding-identities"]], "Getting Further": [[9, "getting-further"]], "Reticulum Transport": [[9, "reticulum-transport"]], "Node Types": [[9, "node-types"]], "The Announce Mechanism in Detail": [[9, "the-announce-mechanism-in-detail"]], "Reaching the Destination": [[9, "reaching-the-destination"]], "Link Establishment in Detail": [[9, "link-establishment-in-detail"]], "Resources": [[9, "resources"]], "Reference Setup": [[9, "reference-setup"]], "Protocol Specifics": [[9, "protocol-specifics"]], "Packet Prioritisation": [[9, "packet-prioritisation"]], "Interface Access Codes": [[9, "interface-access-codes"]], "Wire Format": [[9, "wire-format"]], "Announce Propagation Rules": [[9, "announce-propagation-rules"]], "Cryptographic Primitives": [[9, "cryptographic-primitives"]], "Using Reticulum on Your System": [[10, "using-reticulum-on-your-system"]], "Configuration & Data": [[10, "configuration-data"]], "Included Utility Programs": [[10, "included-utility-programs"]], "The rnsd Utility": [[10, "the-rnsd-utility"]], "The rnstatus Utility": [[10, "the-rnstatus-utility"]], "The rnid Utility": [[10, "the-rnid-utility"]], "The rnpath Utility": [[10, "the-rnpath-utility"]], "The rnprobe Utility": [[10, "the-rnprobe-utility"]], "The rncp Utility": [[10, "the-rncp-utility"]], "The rnx Utility": [[10, "the-rnx-utility"]], "The rnodeconf Utility": [[10, "the-rnodeconf-utility"]], "Remote Management": [[10, "remote-management"]], "Improving System Configuration": [[10, "improving-system-configuration"]], "Fixed Serial Port Names": [[10, "fixed-serial-port-names"]], "Reticulum as a System Service": [[10, "reticulum-as-a-system-service"]], "Systemwide Service": [[10, "systemwide-service"]], "Userspace Service": [[10, "userspace-service"]], "What is Reticulum?": [[11, "what-is-reticulum"]], "Current Status": [[11, "current-status"]], "What does Reticulum Offer?": [[11, "what-does-reticulum-offer"]], "Where can Reticulum be Used?": [[11, "where-can-reticulum-be-used"]], "Interface Types and Devices": [[11, "interface-types-and-devices"]], "Caveat Emptor": [[11, "caveat-emptor"]], "API Reference": [[7, "api-reference"]]}, "indexentries": {"announce_cap (rns.reticulum attribute)": [[7, "RNS.Reticulum.ANNOUNCE_CAP"]], "buffer (class in rns)": [[7, "RNS.Buffer"]], "curve (rns.identity attribute)": [[7, "RNS.Identity.CURVE"]], "curve (rns.link attribute)": [[7, "RNS.Link.CURVE"]], "channel (class in rns.channel)": [[7, "RNS.Channel.Channel"]], "destination (class in rns)": [[7, "RNS.Destination"]], "encrypted_mdu (rns.packet attribute)": [[7, "RNS.Packet.ENCRYPTED_MDU"]], "establishment_timeout_per_hop (rns.link attribute)": [[7, "RNS.Link.ESTABLISHMENT_TIMEOUT_PER_HOP"]], "identity (class in rns)": [[7, "RNS.Identity"]], "keepalive (rns.link attribute)": [[7, "RNS.Link.KEEPALIVE"]], "keepalive_timeout_factor (rns.link attribute)": [[7, "RNS.Link.KEEPALIVE_TIMEOUT_FACTOR"]], "keysize (rns.identity attribute)": [[7, "RNS.Identity.KEYSIZE"]], "link (class in rns)": [[7, "RNS.Link"]], "mdu (rns.channel.channel property)": [[7, "RNS.Channel.Channel.MDU"]], "minimum_bitrate (rns.reticulum attribute)": [[7, "RNS.Reticulum.MINIMUM_BITRATE"]], "msgtype (rns.messagebase attribute)": [[7, "RNS.MessageBase.MSGTYPE"]], "mtu (rns.reticulum attribute)": [[7, "RNS.Reticulum.MTU"]], "messagebase (class in rns)": [[7, "RNS.MessageBase"]], "pathfinder_m (rns.transport attribute)": [[7, "RNS.Transport.PATHFINDER_M"]], "plain_mdu (rns.packet attribute)": [[7, "RNS.Packet.PLAIN_MDU"]], "packet (class in rns)": [[7, "RNS.Packet"]], "packetreceipt (class in rns)": [[7, "RNS.PacketReceipt"]], "ratchetsize (rns.identity attribute)": [[7, "RNS.Identity.RATCHETSIZE"]], "ratchet_count (rns.destination attribute)": [[7, "RNS.Destination.RATCHET_COUNT"]], "ratchet_expiry (rns.identity attribute)": [[7, "RNS.Identity.RATCHET_EXPIRY"]], "ratchet_interval (rns.destination attribute)": [[7, "RNS.Destination.RATCHET_INTERVAL"]], "rawchannelreader (class in rns)": [[7, "RNS.RawChannelReader"]], "rawchannelwriter (class in rns)": [[7, "RNS.RawChannelWriter"]], "requestreceipt (class in rns)": [[7, "RNS.RequestReceipt"]], "resource (class in rns)": [[7, "RNS.Resource"]], "reticulum (class in rns)": [[7, "RNS.Reticulum"]], "stale_grace (rns.link attribute)": [[7, "RNS.Link.STALE_GRACE"]], "stale_time (rns.link attribute)": [[7, "RNS.Link.STALE_TIME"]], "truncated_hashlength (rns.identity attribute)": [[7, "RNS.Identity.TRUNCATED_HASHLENGTH"]], "transport (class in rns)": [[7, "RNS.Transport"]], "__init__() (rns.rawchannelreader method)": [[7, "RNS.RawChannelReader.__init__"]], "__init__() (rns.rawchannelwriter method)": [[7, "RNS.RawChannelWriter.__init__"]], "accepts_links() (rns.destination method)": [[7, "RNS.Destination.accepts_links"]], "add_message_handler() (rns.channel.channel method)": [[7, "RNS.Channel.Channel.add_message_handler"]], "add_ready_callback() (rns.rawchannelreader method)": [[7, "RNS.RawChannelReader.add_ready_callback"]], "advertise() (rns.resource method)": [[7, "RNS.Resource.advertise"]], "announce() (rns.destination method)": [[7, "RNS.Destination.announce"]], "app_and_aspects_from_name() (rns.destination static method)": [[7, "RNS.Destination.app_and_aspects_from_name"]], "cancel() (rns.resource method)": [[7, "RNS.Resource.cancel"]], "clear_default_app_data() (rns.destination method)": [[7, "RNS.Destination.clear_default_app_data"]], "concluded() (rns.requestreceipt method)": [[7, "RNS.RequestReceipt.concluded"]], "create_bidirectional_buffer() (rns.buffer static method)": [[7, "RNS.Buffer.create_bidirectional_buffer"]], "create_keys() (rns.destination method)": [[7, "RNS.Destination.create_keys"]], "create_reader() (rns.buffer static method)": [[7, "RNS.Buffer.create_reader"]], "create_writer() (rns.buffer static method)": [[7, "RNS.Buffer.create_writer"]], "decrypt() (rns.destination method)": [[7, "RNS.Destination.decrypt"]], "decrypt() (rns.identity method)": [[7, "RNS.Identity.decrypt"]], "deregister_announce_handler() (rns.transport static method)": [[7, "RNS.Transport.deregister_announce_handler"]], "deregister_request_handler() (rns.destination method)": [[7, "RNS.Destination.deregister_request_handler"]], "enable_ratchets() (rns.destination method)": [[7, "RNS.Destination.enable_ratchets"]], "encrypt() (rns.destination method)": [[7, "RNS.Destination.encrypt"]], "encrypt() (rns.identity method)": [[7, "RNS.Identity.encrypt"]], "enforce_ratchets() (rns.destination method)": [[7, "RNS.Destination.enforce_ratchets"]], "expand_name() (rns.destination static method)": [[7, "RNS.Destination.expand_name"]], "from_bytes() (rns.identity static method)": [[7, "RNS.Identity.from_bytes"]], "from_file() (rns.identity static method)": [[7, "RNS.Identity.from_file"]], "full_hash() (rns.identity static method)": [[7, "RNS.Identity.full_hash"]], "get_age() (rns.link method)": [[7, "RNS.Link.get_age"]], "get_channel() (rns.link method)": [[7, "RNS.Link.get_channel"]], "get_data_size() (rns.resource method)": [[7, "RNS.Resource.get_data_size"]], "get_establishment_rate() (rns.link method)": [[7, "RNS.Link.get_establishment_rate"]], "get_hash() (rns.resource method)": [[7, "RNS.Resource.get_hash"]], "get_instance() (rns.reticulum static method)": [[7, "RNS.Reticulum.get_instance"]], "get_parts() (rns.resource method)": [[7, "RNS.Resource.get_parts"]], "get_private_key() (rns.destination method)": [[7, "RNS.Destination.get_private_key"]], "get_private_key() (rns.identity method)": [[7, "RNS.Identity.get_private_key"]], "get_progress() (rns.requestreceipt method)": [[7, "RNS.RequestReceipt.get_progress"]], "get_progress() (rns.resource method)": [[7, "RNS.Resource.get_progress"]], "get_public_key() (rns.identity method)": [[7, "RNS.Identity.get_public_key"]], "get_q() (rns.link method)": [[7, "RNS.Link.get_q"]], "get_random_hash() (rns.identity static method)": [[7, "RNS.Identity.get_random_hash"]], "get_remote_identity() (rns.link method)": [[7, "RNS.Link.get_remote_identity"]], "get_request_id() (rns.requestreceipt method)": [[7, "RNS.RequestReceipt.get_request_id"]], "get_response() (rns.requestreceipt method)": [[7, "RNS.RequestReceipt.get_response"]], "get_response_time() (rns.requestreceipt method)": [[7, "RNS.RequestReceipt.get_response_time"]], "get_rssi() (rns.link method)": [[7, "RNS.Link.get_rssi"]], "get_rtt() (rns.packetreceipt method)": [[7, "RNS.PacketReceipt.get_rtt"]], "get_segments() (rns.resource method)": [[7, "RNS.Resource.get_segments"]], "get_snr() (rns.link method)": [[7, "RNS.Link.get_snr"]], "get_status() (rns.packetreceipt method)": [[7, "RNS.PacketReceipt.get_status"]], "get_status() (rns.requestreceipt method)": [[7, "RNS.RequestReceipt.get_status"]], "get_transfer_size() (rns.resource method)": [[7, "RNS.Resource.get_transfer_size"]], "has_path() (rns.transport static method)": [[7, "RNS.Transport.has_path"]], "hash() (rns.destination static method)": [[7, "RNS.Destination.hash"]], "hash_from_name_and_identity() (rns.destination static method)": [[7, "RNS.Destination.hash_from_name_and_identity"]], "hops_to() (rns.transport static method)": [[7, "RNS.Transport.hops_to"]], "identify() (rns.link method)": [[7, "RNS.Link.identify"]], "inactive_for() (rns.link method)": [[7, "RNS.Link.inactive_for"]], "is_compressed() (rns.resource method)": [[7, "RNS.Resource.is_compressed"]], "is_ready_to_send() (rns.channel.channel method)": [[7, "RNS.Channel.Channel.is_ready_to_send"]], "load_private_key() (rns.destination method)": [[7, "RNS.Destination.load_private_key"]], "load_private_key() (rns.identity method)": [[7, "RNS.Identity.load_private_key"]], "load_public_key() (rns.identity method)": [[7, "RNS.Identity.load_public_key"]], "next_hop() (rns.transport static method)": [[7, "RNS.Transport.next_hop"]], "next_hop_interface() (rns.transport static method)": [[7, "RNS.Transport.next_hop_interface"]], "no_data_for() (rns.link method)": [[7, "RNS.Link.no_data_for"]], "no_inbound_for() (rns.link method)": [[7, "RNS.Link.no_inbound_for"]], "no_outbound_for() (rns.link method)": [[7, "RNS.Link.no_outbound_for"]], "pack() (rns.messagebase method)": [[7, "RNS.MessageBase.pack"]], "recall() (rns.identity static method)": [[7, "RNS.Identity.recall"]], "recall_app_data() (rns.identity static method)": [[7, "RNS.Identity.recall_app_data"]], "register_announce_handler() (rns.transport static method)": [[7, "RNS.Transport.register_announce_handler"]], "register_message_type() (rns.channel.channel method)": [[7, "RNS.Channel.Channel.register_message_type"]], "register_request_handler() (rns.destination method)": [[7, "RNS.Destination.register_request_handler"]], "remote_management_enabled() (rns.reticulum static method)": [[7, "RNS.Reticulum.remote_management_enabled"]], "remove_message_handler() (rns.channel.channel method)": [[7, "RNS.Channel.Channel.remove_message_handler"]], "remove_ready_callback() (rns.rawchannelreader method)": [[7, "RNS.RawChannelReader.remove_ready_callback"]], "request() (rns.link method)": [[7, "RNS.Link.request"]], "request_path() (rns.transport static method)": [[7, "RNS.Transport.request_path"]], "resend() (rns.packet method)": [[7, "RNS.Packet.resend"]], "send() (rns.channel.channel method)": [[7, "RNS.Channel.Channel.send"]], "send() (rns.packet method)": [[7, "RNS.Packet.send"]], "set_default_app_data() (rns.destination method)": [[7, "RNS.Destination.set_default_app_data"]], "set_delivery_callback() (rns.packetreceipt method)": [[7, "RNS.PacketReceipt.set_delivery_callback"]], "set_link_closed_callback() (rns.link method)": [[7, "RNS.Link.set_link_closed_callback"]], "set_link_established_callback() (rns.destination method)": [[7, "RNS.Destination.set_link_established_callback"]], "set_packet_callback() (rns.destination method)": [[7, "RNS.Destination.set_packet_callback"]], "set_packet_callback() (rns.link method)": [[7, "RNS.Link.set_packet_callback"]], "set_proof_requested_callback() (rns.destination method)": [[7, "RNS.Destination.set_proof_requested_callback"]], "set_proof_strategy() (rns.destination method)": [[7, "RNS.Destination.set_proof_strategy"]], "set_ratchet_interval() (rns.destination method)": [[7, "RNS.Destination.set_ratchet_interval"]], "set_remote_identified_callback() (rns.link method)": [[7, "RNS.Link.set_remote_identified_callback"]], "set_resource_callback() (rns.link method)": [[7, "RNS.Link.set_resource_callback"]], "set_resource_concluded_callback() (rns.link method)": [[7, "RNS.Link.set_resource_concluded_callback"]], "set_resource_started_callback() (rns.link method)": [[7, "RNS.Link.set_resource_started_callback"]], "set_resource_strategy() (rns.link method)": [[7, "RNS.Link.set_resource_strategy"]], "set_retained_ratchets() (rns.destination method)": [[7, "RNS.Destination.set_retained_ratchets"]], "set_timeout() (rns.packetreceipt method)": [[7, "RNS.PacketReceipt.set_timeout"]], "set_timeout_callback() (rns.packetreceipt method)": [[7, "RNS.PacketReceipt.set_timeout_callback"]], "should_use_implicit_proof() (rns.reticulum static method)": [[7, "RNS.Reticulum.should_use_implicit_proof"]], "sign() (rns.destination method)": [[7, "RNS.Destination.sign"]], "sign() (rns.identity method)": [[7, "RNS.Identity.sign"]], "teardown() (rns.link method)": [[7, "RNS.Link.teardown"]], "to_file() (rns.identity method)": [[7, "RNS.Identity.to_file"]], "track_phy_stats() (rns.link method)": [[7, "RNS.Link.track_phy_stats"]], "transport_enabled() (rns.reticulum static method)": [[7, "RNS.Reticulum.transport_enabled"]], "truncated_hash() (rns.identity static method)": [[7, "RNS.Identity.truncated_hash"]], "unpack() (rns.messagebase method)": [[7, "RNS.MessageBase.unpack"]], "validate() (rns.identity method)": [[7, "RNS.Identity.validate"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["examples", "forhumans", "gettingstartedfast", "hardware", "index", "interfaces", "networks", "reference", "support", "understanding", "using", "whatis"], "filenames": ["examples.rst", "forhumans.rst", "gettingstartedfast.rst", "hardware.rst", "index.rst", "interfaces.rst", "networks.rst", "reference.rst", "support.rst", "understanding.rst", "using.rst", "whatis.rst"], "titles": ["Code Examples", "An Explanation of Reticulum for Human Beings", "Getting Started Fast", "Communications Hardware", "Reticulum Network Stack Manual", "Configuring Interfaces", "Building Networks", "API Reference", "Support Reticulum", "Understanding Reticulum", "Using Reticulum on Your System", "What is Reticulum?"], "terms": {"A": [0, 2, 5, 6, 7, 9, 10, 11], "number": [0, 2, 5, 6, 7, 9, 10], "ar": [0, 2, 3, 5, 6, 7, 8, 9, 10, 11], "includ": [0, 3, 4, 5, 7, 9, 11], "sourc": [0, 2, 3, 6, 9, 11], "distribut": [0, 2, 6, 7, 9, 10], "reticulum": [0, 5, 6, 7], "you": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "can": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "us": [0, 3, 4, 5, 6, 7, 9], "learn": [0, 2, 8, 9], "how": [0, 2, 3, 5, 6, 9, 10, 11], "write": [0, 2, 5, 7, 9, 10], "your": [0, 2, 3, 4, 5, 6, 8, 9, 11], "own": [0, 2, 6, 7, 9, 10, 11], "program": [0, 3, 4, 5, 7, 9, 11], "The": [0, 2, 3, 4, 5, 6, 7, 11], "demonstr": [0, 5], "bare": [0, 5], "minimum": [0, 5, 6, 7, 9], "setup": [0, 2, 4, 5, 10], "requir": [0, 2, 5, 6, 7, 9, 10, 11], "connect": [0, 3, 4, 5, 6, 7, 9, 10, 11], "network": [0, 3, 5, 7, 9, 10, 11], "from": [0, 2, 3, 5, 6, 7, 9, 10, 11], "In": [0, 2, 3, 5, 6, 7, 9, 10, 11], "about": [0, 2, 3, 5, 6, 7, 9], "five": 0, "line": [0, 2, 4, 5, 6, 9, 10, 11], "have": [0, 2, 3, 5, 6, 7, 9, 10], "stack": [0, 2, 6, 7, 9, 10, 11], "initialis": [0, 7, 10], "readi": [0, 2, 3, 5, 6, 7, 11], "pass": [0, 3, 5, 6, 7, 9, 10], "traffic": [0, 2, 5, 6, 7, 9, 10], "thi": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "rn": [0, 2, 3, 7, 9, 10], "start": [0, 3, 4, 5, 7, 9, 10], "up": [0, 2, 3, 5, 6, 7, 9, 10, 11], "gener": [0, 2, 3, 5, 6, 7, 9, 10, 11], "new": [0, 4, 6, 7, 9, 10], "destin": [0, 2, 4, 6, 7, 10], "let": [0, 2, 5, 6, 9, 10], "user": [0, 2, 5, 6, 9, 10, 11], "send": [0, 5, 7, 9, 10], "an": [0, 2, 3, 5, 6, 7, 9, 10, 11], "import": [0, 2, 3, 5, 6, 7, 8, 9], "argpars": 0, "": [0, 2, 5, 6, 9, 10, 11], "defin": [0, 5, 7, 9, 10], "app": [0, 2, 7, 9], "name": [0, 4, 5, 6, 7], "we": [0, 2, 3, 5, 8, 9], "ll": [0, 2, 11], "all": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "creat": [0, 4, 5, 6, 7, 9, 10, 11], "sinc": [0, 2, 5, 6, 7, 9], "basic": [0, 2, 4, 7, 10], "i": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "part": [0, 5, 6, 7, 9, 10], "rang": [0, 2, 3, 5, 6, 9, 10, 11], "util": [0, 3, 4, 5, 9], "put": [0, 3, 5, 10], "them": [0, 2, 3, 5, 6, 8, 9, 10, 11], "within": [0, 2, 5, 6, 7, 9], "namespac": 0, "example_util": 0, "app_nam": [0, 7], "execut": [0, 2, 5, 7, 10], "when": [0, 2, 3, 5, 6, 7, 9, 10], "def": 0, "program_setup": 0, "configpath": 0, "must": [0, 2, 5, 6, 7, 9, 10], "first": [0, 2, 5, 7, 9, 10], "randomli": [0, 9], "ident": [0, 2, 4, 7, 10, 11], "our": [0, 9], "just": [0, 2, 3, 5, 6, 9, 11], "endpoint": [0, 6, 7, 9], "address": [0, 2, 5, 6, 7, 9, 10, 11], "commun": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11], "also": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "exist": [0, 2, 3, 5, 9, 10, 11], "which": [0, 2, 5, 6, 7, 9, 10], "know": [0, 2, 3, 6, 7, 9, 11], "thei": [0, 2, 5, 6, 7, 9, 10], "reachabl": [0, 2, 5, 6, 7, 9, 10], "automat": [0, 2, 3, 5, 6, 7, 9, 10, 11], "path": [0, 2, 3, 5, 7, 9, 10], "anywher": [0, 5], "els": [0, 2, 6, 9], "IN": [0, 7], "singl": [0, 5, 7, 9, 10, 11], "minimalsampl": 0, "configur": [0, 2, 3, 4, 6, 7, 9, 11], "prove": [0, 9], "packet": [0, 2, 4, 5, 6, 7, 10, 11], "By": [0, 2, 5, 7, 9, 10], "do": [0, 2, 3, 5, 7, 9, 10, 11], "proof": [0, 7, 9, 10], "each": [0, 2, 5, 6, 7, 9, 10], "incom": [0, 5, 7, 10], "transmit": [0, 5, 9], "back": [0, 5, 9, 11], "sender": [0, 2, 6, 9, 10], "anyon": [0, 2, 3, 5, 6, 7, 9, 10], "tri": 0, "whether": [0, 5, 7, 9], "wa": [0, 3, 5, 6, 7, 9, 10, 11], "receiv": [0, 2, 5, 7, 9, 10], "correctli": 0, "set_proof_strategi": [0, 7], "prove_al": [0, 7], "everyth": [0, 6, 9], "hand": 0, "over": [0, 3, 4, 5, 7, 9, 10, 11], "control": [0, 2, 3, 4, 6, 7, 9, 11], "loop": 0, "announceloop": 0, "log": [0, 5, 10], "prettyhexrep": 0, "hash": [0, 2, 7, 9, 10], "run": [0, 2, 3, 5, 6, 7, 9, 10, 11], "hit": 0, "enter": [0, 10], "manual": [0, 2, 5, 6, 7, 10], "ctrl": 0, "c": [0, 6, 10], "quit": 0, "until": [0, 2, 5, 7], "exit": [0, 2, 7, 10], "If": [0, 2, 3, 5, 6, 7, 9, 10, 11], "server": [0, 2, 3, 4, 7, 10], "client": [0, 2, 3, 4, 7, 10], "messag": [0, 2, 7, 9, 10], "direct": [0, 2, 3, 6, 7, 9, 10], "toward": [0, 5, 9], "while": [0, 2, 3, 5, 6, 7, 9, 11], "true": [0, 2, 5, 7, 10], "input": [0, 10], "sent": [0, 2, 7, 9, 10], "startup": [0, 10], "get": [0, 3, 4, 5, 7, 10, 11], "pars": 0, "desir": [0, 3, 5, 9], "mode": [0, 2, 3, 4, 9, 10, 11], "__name__": 0, "__main__": 0, "try": [0, 4, 5, 7], "parser": 0, "argumentpars": 0, "descript": [0, 10], "add_argu": 0, "config": [0, 2, 5, 6, 10], "action": 0, "store": [0, 3, 7, 9, 10], "default": [0, 2, 3, 5, 6, 7, 9, 10], "none": [0, 2, 5, 7, 9, 10], "help": [0, 6, 8, 9, 10, 11], "altern": [0, 2, 5, 10], "directori": [0, 10], "type": [0, 2, 4, 5, 6, 7, 10], "str": 0, "arg": 0, "parse_arg": 0, "configarg": 0, "except": [0, 5, 7], "keyboardinterrupt": 0, "print": [0, 5, 10], "found": [0, 2, 5, 6, 9, 10], "http": [0, 2, 8], "github": [0, 2, 8], "com": [0, 2, 8], "markqvist": [0, 2, 8], "blob": [0, 9], "master": [0, 7], "py": [0, 2, 9, 10], "build": [0, 2, 3, 4, 5, 9, 11], "upon": [0, 9], "previou": 0, "explor": [0, 9, 11], "notif": [0, 7], "relev": [0, 3, 5, 7, 9, 10], "set": [0, 2, 3, 5, 6, 7, 9, 10, 11], "callback": [0, 7], "applic": [0, 2, 5, 6, 7, 9, 10, 11], "arriv": [0, 9], "random": [0, 7, 9], "two": [0, 2, 3, 5, 6, 7, 9], "list": [0, 2, 3, 5, 7, 9, 11], "string": [0, 7], "app_data": [0, 7], "fruit": 0, "peach": 0, "quinc": 0, "date": [0, 2], "tangerin": 0, "pomelo": 0, "carambola": 0, "grape": 0, "noble_gas": 0, "helium": 0, "neon": 0, "argon": 0, "krypton": 0, "xenon": 0, "radon": 0, "oganesson": 0, "announcesampl": 0, "space": [0, 2, 3, 6, 9, 11], "destination_1": 0, "destination_2": 0, "handler": [0, 7], "onli": [0, 2, 3, 5, 6, 7, 9, 10, 11], "ask": [0, 2, 3, 7], "chang": [0, 2, 5, 7, 9, 10, 11], "filter": [0, 6, 9, 10], "see": [0, 2, 5, 6, 7, 9, 10, 11], "what": [0, 2, 4, 5, 7, 9], "happen": [0, 2, 7, 9], "announce_handl": 0, "exampleannouncehandl": 0, "aspect_filt": [0, 7], "regist": [0, 7], "transport": [0, 2, 4, 5, 6, 7, 10, 11], "register_announce_handl": [0, 7], "select": [0, 5], "randint": 0, "0": [0, 2, 5, 7, 9, 10, 11], "len": 0, "1": [0, 2, 5, 7, 9, 10], "data": [0, 2, 3, 4, 5, 6, 7, 9, 11], "encod": [0, 7], "utf": 0, "8": [0, 5, 10], "nobl": 0, "ga": 0, "noble_ga": 0, "need": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "class": [0, 6, 7, 11], "method": [0, 2, 5, 7, 9], "take": [0, 2, 5, 9, 10, 11], "option": [0, 2, 3, 4, 6, 7, 9, 10], "argument": [0, 7, 10], "instanc": [0, 4, 5, 7, 9, 10], "some": [0, 2, 3, 5, 6, 7, 9, 10], "want": [0, 2, 5, 6, 9, 10, 11], "aspect": [0, 3, 5, 7, 9, 10], "__init__": [0, 7], "self": [0, 6, 11], "call": [0, 2, 6, 7, 9, 11], "system": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11], "match": [0, 5, 9, 10], "specif": [0, 3, 4, 5, 7, 10, 11], "cannot": [0, 2, 5, 11], "wildcard": 0, "received_announc": [0, 7], "destination_hash": [0, 7, 10], "announced_ident": [0, 7], "contain": [0, 6, 7, 9, 10], "follow": [0, 2, 3, 5, 7, 8, 9, 10, 11], "decod": 0, "plaintext": [0, 7], "unencrypt": [0, 7, 9], "inform": [0, 2, 4, 5, 6, 7, 9, 10], "ani": [0, 2, 3, 5, 6, 7, 8, 9, 10, 11], "listen": [0, 5, 9, 10], "sy": 0, "did": 0, "one": [0, 2, 3, 5, 6, 7, 9, 10, 11], "public_inform": 0, "ad": [0, 3, 4, 5, 6, 7, 9, 11], "so": [0, 2, 3, 5, 6, 7, 8, 9, 10, 11], "differ": [0, 2, 3, 5, 6, 7, 9, 10, 11], "plain": [0, 3, 5, 7, 9], "uncencrypt": 0, "broadcast_destin": 0, "specifi": [0, 2, 3, 5, 6, 7, 10], "everi": [0, 5, 6, 7, 9], "time": [0, 2, 3, 5, 6, 7, 9, 10], "set_packet_callback": [0, 7], "packet_callback": 0, "main": 0, "broadcastloop": 0, "simpli": [0, 2, 3, 5, 6, 9, 10], "out": [0, 2, 3, 5, 6, 7, 9, 10, 11], "r": [0, 5, 9, 10], "n": [0, 9, 10], "end": [0, 5, 6, 7, 9, 11], "stdout": [0, 5, 10], "flush": 0, "text": [0, 2, 6, 9], "prompt": 0, "channelarg": 0, "between": [0, 5, 6, 7, 9, 10], "interfac": [0, 3, 4, 6, 7, 10], "simpl": [0, 3, 7, 9, 10, 11], "respond": [0, 7, 10], "receipt": [0, 7, 9], "choos": [0, 2, 5, 9], "global": [0, 2, 5, 6, 7, 9, 11], "server_ident": 0, "queri": [0, 2, 7, 10], "abl": [0, 2, 5, 6, 7, 9, 10], "verifi": [0, 7, 9, 10, 11], "repli": [0, 10], "encrypt": [0, 2, 6, 7, 9, 10, 11], "wai": [0, 2, 5, 6, 7, 9, 10], "certain": [0, 5, 6, 8, 9], "than": [0, 2, 5, 6, 7, 9, 10, 11], "read": [0, 2, 5, 7, 9, 10], "echo_destin": 0, "tell": [0, 5], "function": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11], "server_callback": 0, "wait": [0, 5, 9, 10], "go": [0, 2, 5, 9], "handl": [0, 3, 5, 6, 7, 9, 10, 11], "reception_stat": 0, "is_connected_to_shared_inst": 0, "reception_rssi": 0, "get_packet_rssi": 0, "packet_hash": 0, "reception_snr": 0, "get_packet_snr": 0, "rssi": [0, 7, 10], "dbm": [0, 5, 10], "snr": [0, 7, 10], "db": [0, 10], "destination_hexhash": 0, "timeout": [0, 7, 10], "binari": [0, 2, 7, 9, 10], "represent": [0, 7], "command": [0, 2, 5, 10], "dest_len": 0, "truncated_hashlength": [0, 7], "2": [0, 5, 7, 9, 10], "rais": [0, 7], "valueerror": [0, 7], "length": [0, 5, 7, 9], "invalid": [0, 7], "hex": [0, 10], "hexadecim": [0, 9, 10], "charact": 0, "byte": [0, 7, 9, 10, 11], "format": [0, 4, 10, 11], "fromhex": 0, "e": [0, 6, 10], "check": [0, 2, 7, 9, 10], "overrid": 0, "loglevel": [0, 7, 10], "provid": [0, 2, 3, 4, 5, 6, 7, 9, 11], "feedback": [0, 4], "log_info": 0, "doe": [0, 2, 3, 4, 5, 6, 7, 9, 10], "load": [0, 2, 7, 10], "has_path": [0, 7], "To": [0, 2, 3, 5, 6, 9, 10, 11], "public": [0, 4, 5, 7, 10], "kei": [0, 4, 6, 7, 10, 11], "done": [0, 2, 5, 6, 9, 10], "recal": [0, 7, 10], "modul": [0, 2, 3, 9, 10, 11], "known": [0, 5, 7, 9, 10], "return": [0, 7, 10], "outgo": [0, 5, 7, 9, 10], "got": 0, "correct": [0, 9], "convent": 0, "request_destin": 0, "add": [0, 2, 5, 6, 7, 10], "echo_request": 0, "get_random_hash": [0, 7], "successfulli": [0, 7, 9], "packetreceipt": [0, 4, 7], "packet_receipt": [0, 7], "set_timeout": [0, 7], "set_timeout_callback": [0, 7], "packet_timed_out": 0, "deliveri": [0, 2, 7, 11], "set_delivery_callback": [0, 7], "packet_deliv": 0, "yet": [0, 5, 9, 11], "retri": [0, 7, 9], "onc": [0, 2, 3, 5, 6, 7, 9, 10, 11], "request_path": [0, 7], "statu": [0, 2, 4, 5, 7, 9, 10], "deliv": [0, 7], "rtt": [0, 7, 9], "get_rtt": [0, 7], "round": [0, 7, 10], "3": [0, 5, 9, 10, 11], "rttstring": 0, "second": [0, 5, 7, 9, 10, 11], "1000": 0, "millisecond": [0, 10], "proof_packet": 0, "valid": [0, 5, 7, 9, 10], "trip": [0, 7, 10], "fail": [0, 2, 7], "store_tru": 0, "t": [0, 2, 5, 6, 7, 10], "metavar": 0, "float": [0, 7], "narg": 0, "timeoutarg": 0, "print_help": 0, "establish": [0, 2, 5, 6, 7, 11], "remot": [0, 4, 7], "forth": 0, "o": [0, 2, 9, 10, 11], "refer": [0, 2, 4], "latest": [0, 2, 5, 7, 10], "latest_client_link": 0, "server_destin": 0, "linkexampl": 0, "set_link_established_callback": [0, 7], "client_connect": 0, "server_loop": 0, "set_link_closed_callback": [0, 7], "client_disconnect": 0, "server_packet_receiv": 0, "disconnect": [0, 5], "activ": [0, 2, 5, 7, 9], "last": [0, 5, 7], "reply_text": 0, "reply_data": 0, "server_link": 0, "sleep": [0, 10], "begin": [0, 3, 7], "And": 0, "client_packet_receiv": 0, "close": [0, 6, 7, 10], "link_establish": 0, "link_clos": 0, "interact": [0, 2, 7, 9, 10], "client_loop": 0, "becom": [0, 2, 6, 9], "should_quit": 0, "fals": [0, 5, 7, 10], "should": [0, 2, 5, 6, 7, 9, 10, 11], "q": [0, 10], "teardown": [0, 7], "mdu": [0, 7], "size": [0, 2, 5, 7, 9, 10], "exce": [0, 5, 7], "log_error": 0, "error": [0, 2, 8, 10], "ha": [0, 2, 3, 5, 6, 7, 9, 11], "been": [0, 2, 3, 5, 6, 7, 9, 11], "later": [0, 2, 5, 10], "teardown_reason": 0, "now": [0, 2, 6, 9, 10], "elif": 0, "destination_clos": 0, "exit_handl": 0, "5": [0, 2, 5, 7, 9, 10, 11], "_exit": 0, "identifi": [0, 5, 7, 9, 10], "intiat": 0, "initi": [0, 6, 7, 9, 11], "peer": [0, 2, 5, 7, 9, 10], "identifyexampl": 0, "set_remote_identified_callback": [0, 7], "remote_identifi": 0, "origin": [0, 6, 9], "displai": [0, 9, 10], "remote_p": 0, "unidentifi": 0, "get_remote_ident": [0, 7], "client_ident": 0, "sendig": 0, "perform": [0, 2, 5, 6, 7, 9, 10], "random_text_gener": 0, "request_id": [0, 7], "link_id": [0, 7], "remote_ident": [0, 7], "requested_at": [0, 7], "look": [0, 2, 5, 9, 10], "On": [0, 2, 5, 10], "full": [0, 5, 7, 9, 10, 11], "moon": 0, "becki": 0, "upset": 0, "stai": [0, 9, 10], "awai": [0, 5, 6, 9, 10], "pet": 0, "shop": 0, "stock": 0, "requestexampl": 0, "register_request_handl": [0, 7], "response_gener": [0, 7], "allow": [0, 2, 3, 5, 6, 7, 9, 10, 11], "allow_al": [0, 7], "response_callback": [0, 7], "got_respons": 0, "failed_callback": [0, 7], "request_fail": 0, "request_receipt": [0, 7], "request_receiv": 0, "structur": [0, 7, 9, 11], "datetim": 0, "vendor": [0, 3], "umsgpack": 0, "share": [0, 2, 6, 7, 9, 10], "object": [0, 7], "subclass": [0, 7], "messagebas": [0, 4, 7], "ensur": [0, 5, 7, 9, 10, 11], "serial": [0, 2, 4, 9, 11], "deseri": 0, "multiplex": 0, "other": [0, 2, 3, 5, 6, 7, 9, 10], "both": [0, 2, 3, 5, 6, 7, 9, 10, 11], "same": [0, 2, 3, 5, 6, 7, 9, 10], "definit": [0, 9], "note": [0, 3, 4, 5, 7, 9, 10], "wish": [0, 9, 10], "make": [0, 2, 3, 5, 8, 9, 10], "stringmessag": 0, "convei": 0, "timestamp": [0, 9, 11], "msgtype": [0, 7], "variabl": [0, 7], "assign": [0, 9, 10], "integ": 0, "valu": [0, 5, 7, 9], "constructor": 0, "uniqu": [0, 5, 7, 9, 11], "across": [0, 3, 6, 7], "0xf000": [0, 7], "reserv": [0, 7], "0x0101": 0, "callabl": [0, 7], "paramet": [0, 3, 5, 6, 7, 9, 10], "empti": 0, "version": [0, 2, 9, 10, 11], "unpack": [0, 7], "final": [0, 7, 9], "implement": [0, 5, 6, 7, 8, 9, 11], "pack": [0, 7], "raw": [0, 3, 7], "payload": [0, 7, 9, 10], "packag": [0, 2, 5, 9], "bundl": 0, "could": [0, 2, 5, 6, 7, 9, 11], "struct": 0, "python": [0, 4, 7, 9, 10, 11], "more": [0, 2, 3, 5, 6, 7, 9, 10, 11], "fit": 0, "entir": [0, 6, 7, 9, 10], "avail": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "properti": [0, 6, 7], "slightli": [0, 2], "less": [0, 5, 7, 9, 11], "due": [0, 6], "header": [0, 7, 9], "content": [0, 2, 6, 10], "stream": [0, 7, 9], "packb": 0, "unpackb": 0, "channelexampl": 0, "get_channel": [0, 7], "register_message_typ": [0, 7], "add_message_handl": [0, 7], "server_message_receiv": 0, "param": 0, "deserializ": 0, "unless": [0, 2, 5, 7, 9], "preced": 0, "indic": [0, 7], "isinst": 0, "reply_messag": 0, "order": [0, 7, 10], "were": [0, 6], "consid": [0, 5, 7, 9, 11], "subsequ": [0, 9], "skip": 0, "packed_s": 0, "is_ready_to_send": [0, 7], "pleas": [0, 2, 5, 7, 10, 11], "pend": 0, "complet": [0, 2, 3, 5, 6, 7, 9, 10, 11], "client_message_receiv": 0, "reader": [0, 7], "writer": [0, 7], "__future__": 0, "annot": 0, "latest_buff": 0, "bufferexampl": 0, "old": [0, 3, 8, 9], "stream_id": [0, 7], "bit": [0, 2, 5, 7, 9, 10, 11], "like": [0, 2, 3, 5, 6, 7, 9, 10, 11], "file": [0, 2, 3, 5, 6, 7, 9, 10, 11], "descriptor": 0, "actual": [0, 2, 5, 9], "separ": [0, 2, 5, 6, 9, 10], "unidirect": 0, "flow": [0, 5, 6], "opposit": [0, 5], "create_bidirectional_buff": [0, 7], "server_buffer_readi": 0, "ready_byt": [0, 7], "int": [0, 7], "otherwis": [0, 7], "forc": [0, 10], "server_client_connect": 0, "detail": [0, 2, 4, 5, 7, 10, 11], "client_buffer_readi": 0, "termin": [0, 2, 7], "download": [0, 5, 10], "resourc": [0, 2, 4, 7, 8], "effici": [0, 2, 5, 9, 11], "serv": [0, 3, 5, 6, 9, 10], "larg": [0, 3, 5, 6, 7, 9, 11], "transfer": [0, 7, 9, 10, 11], "recommend": [0, 2, 9], "compress": [0, 7, 9], "hashmap": 0, "sequenc": [0, 7, 9, 11], "long": [0, 2, 3, 5, 7, 9], "slow": [0, 5, 9], "cpu": [0, 9], "probabl": [0, 2, 6, 9, 10, 11], "result": [0, 9, 10], "befor": [0, 2, 5, 7, 9, 10], "prepar": [0, 6], "instead": [0, 2, 5, 7, 9, 10], "slice": 0, "chunk": 0, "suitabl": [0, 2, 5, 6, 9, 11], "thread": 0, "app_timeout": 0, "45": [0, 9], "serve_path": 0, "here": [0, 2, 5, 9, 10], "conveni": 0, "list_fil": 0, "entri": [0, 2, 9], "listdir": 0, "isfil": 0, "join": [0, 2, 6, 8, 9], "host": [0, 2, 5, 9, 10], "still": [0, 2, 5, 6, 9, 10], "isdir": 0, "list_packet": 0, "list_receipt": 0, "list_deliv": 0, "list_timeout": 0, "too": [0, 6], "mani": [0, 2, 3, 5, 6, 7, 9, 10, 11], "split": 0, "filelist": 0, "multipl": [0, 5, 6, 9, 10], "hint": 0, "alreadi": [0, 2, 3, 6, 7, 9, 10], "support": [0, 2, 4, 5, 6, 7, 9, 10, 11], "after": [0, 2, 5, 6, 7, 9, 10], "re": [0, 5, 7, 9], "keep": [0, 6, 7, 9, 10, 11], "open": [0, 3, 5, 6, 7, 8, 9, 10, 11], "client_request": 0, "longer": [0, 2, 6, 9, 10], "filenam": 0, "rb": 0, "file_resourc": 0, "resource_sending_conclud": 0, "somethign": 0, "went": 0, "wrong": [0, 5], "don": [0, 2, 6, 7, 10], "unknown": [0, 5, 7, 9, 10], "conclud": [0, 7], "hasattr": 0, "server_fil": 0, "current": [0, 2, 4, 5, 7, 9], "current_download": 0, "current_filenam": 0, "statist": [0, 5, 7, 8], "download_start": 0, "download_finish": 0, "download_tim": 0, "transfer_s": 0, "file_s": 0, "expect": [0, 2, 5, 7, 9, 10], "normal": [0, 2, 5, 7, 10], "accordingli": 0, "filelist_receiv": 0, "advertis": [0, 7], "set_resource_strategi": [0, 7], "accept_al": [0, 7], "set_resource_started_callback": [0, 7], "download_began": 0, "set_resource_concluded_callback": [0, 7], "download_conclud": 0, "menu": 0, "menu_mod": 0, "down": [0, 3, 5, 7], "request_packet": 0, "create_receipt": [0, 7], "print_menu": 0, "25": [0, 4, 11], "user_input": 0, "screen": 0, "variou": [0, 2, 5, 6, 9, 10], "state": 0, "It": [0, 2, 3, 5, 7, 9, 10, 11], "uninterest": 0, "won": 0, "clear_screen": 0, "print_filelist": 0, "percent": [0, 5], "get_progress": [0, 7], "100": [0, 5, 9], "rprogress": 0, "save_error": 0, "disk": [0, 7], "hour": [0, 5], "rem": 0, "divmod": 0, "3600": [0, 5], "minut": [0, 2, 5, 9], "60": [0, 5], "timestr": 0, "05": 0, "2f": 0, "ttime": 0, "taken": [0, 9], "tfile": 0, "size_str": 0, "tdata": 0, "teffect": 0, "rate": [0, 4, 7, 10], "suffix": 0, "b": [0, 6, 10], "ttransfer": 0, "press": 0, "index": [0, 2, 4], "enumer": 0, "filelist_data": 0, "extend": [0, 2, 7], "local": [0, 2, 5, 6, 7, 9, 10, 11], "append": [0, 9], "visibl": 0, "updat": [0, 2, 7, 9, 10], "small": [0, 5, 6, 7, 9, 11], "job": 0, "potenti": [0, 5, 8, 9, 10, 11], "target": [0, 5, 10], "filelist_timeout_job": 0, "daemon": [0, 2, 5, 7, 10], "detect": 0, "shown": 0, "progress": [0, 7, 10, 11], "total_s": 0, "saved_filenam": 0, "counter": 0, "wb": 0, "human": [0, 7, 8, 9], "readabl": [0, 7, 9], "num": 0, "unit": [0, 2, 7, 10], "ki": 0, "mi": 0, "gi": 0, "ti": [0, 9], "pi": [0, 4, 6, 9, 10, 11], "ei": 0, "zi": 0, "last_unit": 0, "yi": 0, "k": [0, 10], "m": [0, 2, 9, 10], "g": [0, 10], "p": [0, 10], "z": 0, "y": 0, "ab": 0, "1024": 0, "clear": [0, 5, 7, 9, 10], "cl": 0, "nt": 0, "dir": 0, "best": [2, 9, 11], "guid": [2, 3, 9], "outlin": [2, 3, 9], "sensibl": [2, 3, 5], "scenario": [2, 4, 9], "relat": 2, "easiest": [2, 3, 5, 9], "via": [2, 3, 5, 8, 9, 10, 11], "pip": [2, 3, 10], "manag": [2, 4, 6, 7, 9, 11], "sudo": [2, 10], "apt": 2, "python3": [2, 3], "pamac": 2, "similar": [2, 3, 5, 6, 7, 10, 11], "dowload": 2, "releas": [2, 5, 9], "wheel": 2, "channel": [2, 4, 5, 6, 7, 8, 9, 11], "offlin": 2, "py3": 2, "whl": 2, "mai": [2, 5, 7, 9, 10], "case": [2, 3, 5, 6, 9, 10], "usual": 2, "essenti": [2, 5, 9], "deriv": [2, 7, 9, 11], "arch": 2, "manjaro": 2, "devel": 2, "fedora": 2, "dnf": 2, "groupinstal": 2, "tool": [2, 3, 9, 10, 11], "librari": 2, "compil": 2, "miss": 2, "even": [2, 5, 6, 7, 9, 10, 11], "pre": [2, 7, 9], "built": [2, 5, 9, 10, 11], "few": [2, 3, 5, 6, 9, 10, 11], "extrem": [2, 9, 10, 11], "low": [2, 3, 5, 6, 9, 11], "bandwidth": [2, 5, 6, 7, 9, 10, 11], "These": [2, 5, 7, 9, 10], "feel": 2, "work": [2, 3, 5, 6, 9, 10, 11], "design": [2, 3, 6, 9, 11], "well": [2, 3, 5, 6, 7, 9, 10, 11], "lora": [2, 3, 4, 9, 11], "link": [2, 3, 4, 5, 6, 7, 10, 11], "wifi": [2, 4, 5, 6, 9, 10, 11], "wire": [2, 3, 4, 5, 11], "ethernet": [2, 4, 5, 6, 9, 11], "combin": [2, 4, 6, 9], "As": [2, 3, 5, 6, 7, 9, 11], "easi": [2, 3, 5, 9, 10, 11], "experi": [2, 9], "without": [2, 3, 5, 6, 9, 10, 11], "transceiv": [2, 3, 5, 9, 11], "infrastructur": [2, 3, 5, 6, 9, 10], "launch": [2, 10], "devic": [2, 4, 5, 6, 7, 9, 10], "enough": [2, 3, 9], "physic": [2, 3, 5, 7, 9, 10], "rnsh": [2, 10], "fulli": [2, 3, 9, 10, 11], "session": [2, 9], "pipe": [2, 4, 11], "ssh": 2, "veri": [2, 3, 5, 6, 7, 8, 9, 10, 11], "facilit": 2, "suit": [2, 3, 9, 10], "featur": [2, 8, 9, 11], "delai": [2, 5, 9, 10], "browser": 2, "page": [2, 4, 9], "dynam": [2, 10], "render": 2, "authent": [2, 5, 6, 7, 9, 10, 11], "face": [2, 5], "protocol": [2, 3, 4, 5, 11], "lxmf": [2, 10], "anoth": [2, 7, 9, 10], "project": 2, "nomadnet": 2, "might": [2, 5, 6, 9, 10], "reboot": 2, "again": [2, 5, 9, 10], "would": [2, 5, 6, 7, 9], "rather": [2, 7], "graphic": 2, "linux": [2, 3, 9], "maco": 2, "window": [2, 5], "peopl": [2, 9], "compat": [2, 3, 5, 7, 9], "i2p": [2, 4, 11], "qr": 2, "paper": 2, "anyth": [2, 3, 5, 9, 10, 11], "interoper": [2, 3, 6, 9, 11], "friendli": [2, 11], "voic": 2, "interest": [2, 9], "cours": [2, 5, 9], "come": [2, 9], "easier": [2, 5, 6, 10], "rnsd": [2, 4], "background": [2, 5], "foreground": 2, "servic": [2, 4, 6], "rnstatu": [2, 4, 5, 9], "rnpath": [2, 4, 5], "rnprobe": [2, 4], "view": [2, 5, 9, 10], "chapter": [2, 3, 5, 6, 7, 9, 10, 11], "locat": [2, 3, 6, 9, 10], "exampl": [2, 3, 4, 5, 7, 9, 10, 11], "exampleconfig": [2, 10], "broadcast": [2, 4, 5, 7, 9], "domain": [2, 5], "further": [2, 4, 5], "tcp": [2, 3, 4, 6, 9, 11], "There": [2, 6, 9, 11], "subnet": [2, 6], "rout": [2, 3, 5, 6, 7, 9, 10, 11], "tabl": [2, 5, 6, 9, 10], "thing": 2, "discov": [2, 5], "topographi": [2, 6, 9], "situat": [2, 3, 5, 6, 9], "where": [2, 3, 4, 5, 6, 7, 9, 10], "utilis": [2, 5, 6, 7, 10, 11], "extern": [2, 5, 7, 11], "often": [2, 5, 6, 9, 10], "suffici": [2, 5, 9, 10], "act": [2, 7, 9, 10], "gatewai": [2, 5, 6, 9], "enabl": [2, 3, 5, 6, 7, 9, 10, 11], "wider": [2, 5, 9, 10], "autointerfac": [2, 3, 5, 10], "possibli": 2, "offer": [2, 4, 5, 7, 9], "carefulli": 2, "tcpserverinterfac": [2, 5], "access": [2, 4, 5, 6, 7, 10], "ip": [2, 3, 5, 9, 10, 11], "faster": [2, 5, 9], "lower": [2, 5, 10], "latenc": [2, 9, 11], "energi": 2, "i2pinterfac": [2, 5], "howev": [2, 6, 9], "leak": 2, "reveal": [2, 7, 9, 11], "who": [2, 5, 9], "inspect": [2, 5, 6, 9, 10], "someon": [2, 5], "determin": [2, 7, 9], "adversari": 2, "record": [2, 9], "metadata": [2, 9, 11], "transmiss": [2, 5, 7, 9], "though": [2, 5, 9], "publicli": [2, 5], "most": [2, 3, 5, 6, 7, 9, 10], "anymor": 2, "through": [2, 3, 5, 6, 7, 9, 10, 11], "invis": [2, 5], "parallel": 2, "For": [2, 3, 5, 6, 7, 9, 10, 11], "alwai": [2, 5, 7, 9, 10], "node": [2, 4, 5, 6, 10, 11], "i2pd": [2, 5], "mix": [2, 5, 6, 10], "hide": 2, "relai": 2, "extra": [2, 5, 6, 10], "comput": [2, 9, 11], "power": [2, 3, 5, 9, 10], "attack": 2, "form": [2, 5, 6, 7, 9], "deep": 2, "much": [2, 5, 6, 9, 10], "difficult": [2, 3], "non": [2, 7, 9], "behind": [2, 9], "firewal": [2, 5], "nat": 2, "preserv": [2, 7], "anonym": [2, 6, 7, 9, 11], "care": [2, 7, 11], "experiment": [2, 11], "made": [2, 7, 9], "amsterdam": 2, "hub": [2, 5], "tcpclientinterfac": [2, 3, 5], "ye": [2, 5, 9, 10], "target_host": [2, 5], "target_port": [2, 5], "4965": [2, 10], "betweenthebord": 2, "4242": [2, 5], "g3br23bvx3lq5uddcsjii74xgmn6y5q325ovrkq2zw2wbzbqgbuq": 2, "b32": [2, 5], "point": [2, 3, 5, 6, 9, 10], "absolut": [2, 8, 11], "usag": [2, 4, 5, 7, 8, 10], "occasion": 2, "test": [2, 9, 10], "failur": [2, 5, 7], "guarante": [2, 9], "weird": 2, "goe": 2, "sai": 2, "hardcod": 2, "ship": 2, "practic": [2, 9, 11], "solut": [2, 9, 10], "leav": [2, 6, 9], "hardwar": [2, 4, 5, 6, 7, 9, 10, 11], "wide": [2, 3, 5, 9, 10, 11], "section": [2, 3, 5, 6, 9, 10], "easili": [2, 5, 6, 9, 10, 11], "cheapli": 2, "rnode": [2, 4, 9, 10, 11], "purpos": [2, 3, 5, 7, 9, 10], "digit": [2, 3, 9, 11], "integr": [2, 6, 9], "yourself": [2, 9, 11], "custom": [2, 5, 7, 9, 11], "firmwar": [2, 3, 9, 10], "board": [2, 4, 5, 9, 11], "auto": [2, 3, 4, 7, 9], "script": [2, 3], "prefer": [2, 9], "purchas": [2, 6, 9, 11], "supplier": 2, "addit": [2, 3, 5, 7, 9, 10, 11], "privat": [2, 5, 7, 8, 9, 10, 11], "secur": [2, 9, 11], "uncensor": 2, "mesh": [2, 5, 6, 11], "think": 2, "welcom": 2, "head": 2, "discuss": [2, 3, 9], "propos": 2, "abov": [2, 3, 5, 9, 10], "next": [2, 6, 7, 9], "step": [2, 3], "pyseri": 2, "api": [2, 4, 9, 11], "associ": [2, 7, 9], "recip": 2, "cryptographi": [2, 9, 11], "clone": 2, "repositori": [2, 8, 9], "git": 2, "move": [2, 5, 9, 10], "folder": 2, "symlink": [2, 10], "cd": 2, "ln": [2, 10], "echo": [2, 4], "ve": 2, "immedi": [2, 5, 10], "necessari": [2, 3, 5, 6, 7, 9], "nano": 2, "repeat": 2, "process": [2, 3, 5, 7, 9], "h": [2, 10], "ping": [2, 10], "replac": [2, 7, 9, 10], "below": [2, 3, 5, 10], "174a64852a75682259ad8b921b8bf416": 2, "filetransf": [2, 4, 7], "understand": [2, 4, 7, 10], "submit": 2, "pull": 2, "request": [2, 4, 5, 7, 9, 10], "good": [2, 3, 6, 9, 10], "idea": [2, 9, 10], "introduc": [2, 9], "disucss": 2, "forum": 2, "maintain": [2, 9], "place": [2, 5, 6, 9, 10], "procedur": [2, 7, 9], "quirk": 2, "worth": 2, "being": [2, 5, 7, 9], "awar": [2, 9], "termux": 2, "f": [2, 10], "droid": 2, "emul": 2, "environ": [2, 6, 9], "abil": [2, 3], "pkg": 2, "sure": [2, 3, 10], "upgrad": [2, 9], "Then": 2, "reason": [2, 5, 9], "attempt": [2, 3, 7], "openssl": [2, 9], "libffi": 2, "rust": 2, "export": 2, "cargo_build_target": 2, "aarch64": 2, "sever": [2, 6, 7, 10], "succe": 2, "softwar": [2, 3, 5, 9, 11], "possibl": [2, 3, 5, 6, 7, 9, 10, 11], "apk": 2, "tutori": 2, "code": [2, 3, 4, 5, 10], "architectur": 2, "precompil": 2, "dev": [2, 5, 10], "64": [2, 9, 10], "32": [2, 7, 9], "rasperri": 2, "os": [2, 5], "april": 2, "2023": [2, 10], "onto": [2, 9], "unfortun": 2, "pipx": 2, "isol": [2, 5, 10], "neg": 2, "affect": [2, 5], "ensurepath": 2, "restor": [2, 5], "behaviour": [2, 5, 10], "edit": [2, 10], "conf": 2, "break": [2, 7, 9, 11], "somewhat": 2, "mislead": 2, "choic": 2, "word": 2, "rare": [2, 5], "lead": [2, 9], "conflict": 2, "pose": [2, 9], "problem": [2, 9], "_could_": 2, "obscur": 2, "rnspure": 2, "No": [2, 5, 9, 10, 11], "matter": [2, 5], "perfectli": 2, "pyca": [2, 9], "cryptograph": [2, 4, 6, 10, 11], "primit": [2, 4], "One": [3, 7], "truli": [3, 9], "valuabl": [3, 8], "almost": [3, 5, 9, 10], "conceiv": 3, "kind": [3, 5, 6, 9], "medium": [3, 5, 6, 7, 9, 11], "flexibl": [3, 5, 11], "cover": [3, 9, 11], "wireless": [3, 6], "decad": 3, "modern": [3, 9], "millimet": 3, "wave": 3, "backhaul": [3, 6], "oper": [3, 5, 6, 7, 9, 10, 11], "chanc": 3, "box": 3, "glue": 3, "littl": [3, 9], "effort": 3, "pipeinterfac": [3, 5], "kiss": [3, 4, 10, 11], "simplyequip": 3, "broad": 3, "abund": 3, "sometim": 3, "especi": [3, 5], "scratch": 3, "real": [3, 6, 11], "world": [3, 6, 11], "minim": [3, 4, 9], "cost": [3, 9, 11], "fundament": [3, 9], "categori": 3, "addition": [3, 5, 9], "common": [3, 4, 6, 9, 10, 11], "briefli": [3, 9], "describ": [3, 5, 7, 9], "emploi": [3, 9], "pattern": [3, 9], "high": [3, 5, 9, 11], "capac": [3, 5, 7, 9], "gain": [3, 7, 9], "antenna": 3, "backbon": 3, "area": [3, 5, 6, 9, 11], "reliabl": [3, 5, 6, 7, 9, 11], "commonli": 3, "either": [3, 5, 6, 7, 9, 10], "expens": 3, "hard": 3, "hungri": 3, "allevi": 3, "particular": 3, "plaform": 3, "depend": [3, 4, 6, 7, 9, 10], "its": [3, 5, 7, 9], "compon": [3, 8, 9], "frequenc": [3, 5, 9, 10], "band": [3, 9], "scheme": 3, "limit": [3, 4, 6, 9], "ism": [3, 9], "avoid": [3, 9, 10], "confus": [3, 9], "layer": [3, 5, 6, 7, 9, 11], "noth": [3, 11], "lorawan": [3, 9], "standard": [3, 9], "central": [3, 6, 9], "iot": 3, "overhead": [3, 5, 9], "level": [3, 5, 9, 10], "directli": [3, 5, 7, 9, 10, 11], "replic": [3, 9], "togeth": [3, 9, 10], "exact": [3, 5, 9], "explain": [3, 7], "approach": [3, 9, 10], "develop": [3, 4, 7, 8, 9, 11], "boil": 3, "obtain": [3, 7, 9], "autom": [3, 8, 9], "provis": [3, 10], "rnodeinterfac": [3, 5, 10], "ic": 3, "semtech": 3, "sx1276": 3, "platform": [3, 4, 9, 10], "esp32": 3, "manufactur": [3, 5], "io": 3, "avr": 3, "atmega1284p": 3, "rnodeconf": [3, 4], "autoinstal": [3, 10], "seri": 3, "question": [3, 5], "port": [3, 4, 5, 6, 9, 11], "air": [3, 11], "id": [3, 5, 7, 9, 10], "itself": [3, 4, 9], "short": [3, 5, 9, 10], "bridg": [3, 4], "behav": 3, "mean": [3, 5, 6, 7, 9, 10], "dhcp": [3, 5, 10], "dn": 3, "least": [3, 5, 9, 10, 11], "transpar": [3, 5, 9, 10], "distanc": [3, 9], "ubiqu": 3, "airmax": 3, "ltu": 3, "mikrotik": 3, "exhaust": [3, 9], "rel": [3, 9, 11], "cheap": [3, 9], "co": [3, 5, 11], "concurr": [3, 9, 10], "switch": [3, 5, 9, 10], "fiber": 3, "optic": [3, 11], "virtual": [3, 5, 6, 9, 10, 11], "adapt": [3, 6], "tun": 3, "tap": 3, "serialinterfac": [3, 5], "usb": [3, 6, 9, 10], "freedv": 3, "tnc": [3, 5, 7, 10, 11], "dire": 3, "wolf": 3, "aim": [4, 9], "particip": [4, 6, 9], "pdf": 4, "epub": 4, "caveat": 4, "emptor": 4, "fast": [4, 5, 7, 9], "standalon": 4, "instal": [4, 5, 6, 9, 10, 11], "resolv": [4, 5, 10], "issu": [4, 6, 8], "base": [4, 5, 6, 7, 9, 10, 11], "shell": [4, 10], "nomad": 4, "sideband": 4, "meshchat": 4, "With": [4, 5, 6, 9, 10], "internet": [4, 5, 9, 11], "testnet": [4, 10], "radio": [4, 5, 6, 7, 9, 10, 11], "android": [4, 10], "arm64": 4, "raspberri": [4, 6, 9, 10, 11], "debian": [4, 9, 10], "bookworm": 4, "ubuntu": [4, 10], "lunar": 4, "pure": [4, 9], "rnid": 4, "rncp": 4, "rnx": 4, "improv": [4, 5, 8], "fix": [4, 9], "motiv": 4, "goal": [4, 5], "introduct": 4, "announc": [4, 7, 10], "mechan": [4, 5], "reach": [4, 5, 6], "prioritis": [4, 5, 6, 7], "propag": [4, 5, 7], "rule": [4, 5], "modem": [4, 5, 6, 7, 9, 11], "udp": [4, 6, 9, 10, 11], "multi": [4, 9, 10, 11], "ax": [4, 11], "concept": [4, 9, 10], "overview": [4, 5, 9], "interconnect": [4, 5, 9], "site": [4, 5], "growth": 4, "converg": [4, 9], "identif": [4, 5, 11], "respons": [4, 7, 9], "buffer": [4, 5, 7], "donat": 4, "contribut": 4, "requestreceipt": [4, 7], "rawchannelread": [4, 7], "rawchannelwrit": [4, 7], "search": 4, "distinct": [5, 9], "topologi": [5, 9], "endless": 5, "give": [5, 9, 10], "respect": [5, 11], "discover": 5, "autoconfigur": [5, 11], "ipv6": [5, 10], "router": [5, 10], "sort": [5, 9, 10], "communica": 5, "tion": 5, "usabl": [5, 9], "interface_en": [5, 10], "spe": 5, "cific": 5, "lan": 5, "group": [5, 7, 9], "group_id": 5, "multicast": 5, "temporari": 5, "perman": [5, 10], "multicast_address_typ": 5, "kernel": [5, 10, 11], "wlan0": 5, "eth1": 5, "Or": [5, 10, 11], "ignor": [5, 7, 9], "ones": [5, 10], "ignored_devic": 5, "tun0": 5, "eth0": 5, "autodiscov": 5, "discoveri": [5, 9, 10], "scope": 5, "admin": 5, "organis": [5, 6, 8], "custom_network_nam": 5, "discovery_scop": 5, "discovery_port": 5, "48555": 5, "data_port": 5, "49555": 5, "frequent": 5, "block": 5, "inbound": [5, 7], "portabl": [5, 9], "persist": [5, 10], "achiev": [5, 7, 9], "geti2p": 5, "net": 5, "websit": 5, "base32": 5, "comma": 5, "5urvjicpzi7q3ybztsef4i5ow2aq4soktfj7zedz53s47r54jnqq": 5, "output": [5, 10], "event": 5, "simplest": [5, 9], "tunnel": [5, 9, 11], "interchang": 5, "degre": 5, "retain": [5, 7], "eas": [5, 9], "simpler": 5, "listen_ip": 5, "listen_port": 5, "bind": 5, "10": [5, 9, 10], "88": 5, "i2p_tunnel": 5, "127": 5, "5001": 5, "dedic": [5, 9], "natur": 5, "toler": 5, "intermitt": 5, "gracefulli": 5, "reappear": 5, "hostnam": 5, "expos": [5, 7], "soundmodem": 5, "kiss_fram": 5, "8001": 5, "caution": 5, "frame": 5, "conjunct": 5, "never": [5, 7, 9], "disabl": [5, 9, 10], "intern": [5, 7, 9], "recoveri": 5, "greatli": 5, "unreli": 5, "implic": 5, "better": 5, "udpinterfac": 5, "forward_ip": 5, "255": [5, 10], "forward_port": 5, "assum": [5, 9], "55": 5, "72": 5, "24": 5, "equival": 5, "forward": [5, 7, 9, 11], "segment": [5, 6, 7, 9, 11], "15": 5, "16": [5, 9, 10], "ttyusb0": [5, 10], "867": 5, "mhz": [5, 9], "867200000": 5, "125": 5, "khz": 5, "125000": 5, "tx": [5, 10], "7": [5, 9, 10], "mw": 5, "txpower": 5, "spread": [5, 10], "factor": [5, 7, 10], "12": [5, 10], "fastest": [5, 9], "longest": 5, "spreadingfactor": 5, "throough": 5, "codingr": 5, "interv": [5, 7, 10], "id_callsign": 5, "mycal": 5, "id_interv": 5, "600": 5, "homebrew": 5, "amount": [5, 6, 7, 9, 11], "ram": 5, "flow_control": 5, "airtim": 5, "term": [5, 6, 9], "appli": [5, 7, 9], "approxim": 5, "enforc": [5, 7], "roll": 5, "airtime_limit_long": 5, "airtime_limit_short": 5, "33": 5, "sub": 5, "individu": [5, 7, 9, 11], "rnodemultiinterfac": 5, "ttyacm0": 5, "subinterfac": 5, "highdatar": 5, "themselv": 5, "4ghz": 5, "2400000000": 5, "1625": 5, "1625000": 5, "person": [5, 9], "wrote": 5, "vport": 5, "lowdatar": 5, "865": 5, "6": [5, 7, 10], "865600000": 5, "pair": [5, 7, 9, 10], "laser": 5, "baud": [5, 10], "speed": [5, 9, 10], "115200": [5, 10], "databit": [5, 10], "pariti": [5, 10], "stopbit": [5, 10], "stdin": [5, 10], "netcat": 5, "l": [5, 10], "5757": 5, "respawn": 5, "respawn_delai": 5, "continu": [5, 7, 8, 11], "scan": 5, "eof": 5, "respawn_interv": 5, "varieti": [5, 9, 10, 11], "openmodem": [5, 11], "period": [5, 7, 9], "beacon": 5, "station": 5, "kissinterfac": [5, 10], "ttyusb1": 5, "preambl": [5, 10], "150": [5, 10], "tail": 5, "txtail": [5, 10], "cdma": 5, "200": [5, 10], "slottim": [5, 10], "20": [5, 9, 10], "elaps": 5, "comment": [5, 10], "amateur": [5, 11], "spectrum": [5, 9], "encapsul": [5, 11], "callsign": 5, "ssid": 5, "realli": [5, 7], "doesn": 5, "incur": 5, "ax25kissinterfac": 5, "no1cll": 5, "ttyusb2": 5, "150m": 5, "increas": [5, 10], "squelch": 5, "rx": [5, 10], "turnaround": 5, "kept": [5, 6, 7, 9], "wast": 5, "bring": 5, "brought": [5, 10], "access_point": 5, "shorthand": [5, 10], "ap": 5, "shorter": 5, "expiri": [5, 7], "mostli": [5, 6, 9], "quiet": [5, 10], "momentarili": 5, "disappear": [5, 10], "network_nam": 5, "passphras": [5, 9], "alon": 5, "ifac_s": 5, "customis": 5, "carri": [5, 7, 9, 10], "512": [5, 7, 9], "announce_cap": [5, 7], "maximum": [5, 7, 9, 10], "alloc": [5, 7, 9, 10], "given": [5, 6, 7, 9, 10], "upkeep": 5, "cap": 5, "queue": [5, 9], "nearbi": 5, "overwhelm": [5, 7], "rapidli": 5, "spam": 5, "effect": 5, "excess": 5, "benefici": [5, 10], "balanc": 5, "necesarri": 5, "bitrat": [5, 7], "report": [5, 7, 8, 10], "guess": 5, "per": [5, 7, 9, 10, 11], "strictli": [5, 9], "complex": [5, 9], "left": [5, 7, 9, 10], "gw": 5, "behalf": 5, "resid": 5, "requestor": 5, "chain": 5, "along": [5, 6, 7, 9, 10], "boundari": 5, "remain": [5, 7, 9], "roam": 5, "mobil": [5, 9], "seen": [5, 9], "perspect": [5, 7, 9, 11], "vehicl": 5, "equip": [5, 6, 9], "side": [5, 11], "expir": 5, "significantli": 5, "impact": [5, 7, 9], "announce_rate_target": 5, "announce_rate_grac": 5, "announce_rate_penalti": 5, "basi": [5, 7, 9, 10, 11], "moder": 5, "violat": 5, "penalti": 5, "7200": 5, "annouce_cap": 5, "mention": [5, 9], "strategi": [5, 7], "decis": [5, 9], "slower": [5, 7, 9], "hop": [5, 6, 7, 9, 10, 11], "right": [5, 6], "tend": 5, "conserv": 5, "span": [5, 9], "seamlessli": 5, "influx": 5, "newli": [5, 6, 7, 9], "previous": [5, 6, 7, 9], "occur": [5, 10, 11], "hold": [5, 7, 9], "interrupt": 5, "burst": 5, "subsid": 5, "held": [5, 10], "decid": [5, 6, 7, 9], "bogu": 5, "retransmit": [5, 9], "ingress": 5, "disrupt": 5, "neccessari": 5, "modifi": [5, 9, 10, 11], "ingress_control": 5, "ic_new_tim": 5, "spawn": 5, "ic_burst_freq_new": 5, "ic_burst_freq": 5, "temporarili": 5, "ic_max_held_announc": 5, "drop": [5, 7, 9, 10], "256": [5, 7, 9, 10], "ic_burst_hold": 5, "threshold": 5, "ic_burst_penalti": 5, "ic_held_release_interv": 5, "30": [5, 7, 10], "knowledg": [6, 9], "tradit": [6, 9], "worri": 6, "coordin": [6, 7, 9, 11], "evolv": 6, "futur": [6, 9], "mind": [6, 11], "autonom": [6, 9], "terminologi": [6, 9], "rest": [6, 11], "billion": [6, 9], "larger": [6, 9, 10], "higher": [6, 11], "discrimin": 6, "ephemer": [6, 7, 9, 11], "ellipt": [6, 7, 9, 11], "curv": [6, 7, 9, 11], "diffi": [6, 9, 11], "hellman": [6, 9, 11], "exchang": [6, 7, 9, 11], "curve25519": [6, 7, 9, 11], "throttl": 6, "thu": [6, 7, 9], "agnost": [6, 9], "equal": [6, 7, 9], "keystor": 6, "degrad": 6, "stationari": [6, 10], "candid": 6, "optim": 6, "intend": [6, 9], "trustless": [6, 9, 11], "free": [6, 8, 11], "unorganis": 6, "manner": 6, "far": [6, 9], "unexplor": 6, "dissolv": 6, "organ": 6, "restrict": [6, 10], "legaci": 6, "unifi": 6, "underli": [6, 11], "carrier": [6, 11], "involv": 6, "hardlin": 6, "illustr": [6, 9], "plan": [6, 9], "member": 6, "mainli": 6, "three": [6, 9], "hill": 6, "top": [6, 9], "chosen": [6, 9], "sight": 6, "becaus": [6, 9], "four": 6, "At": [6, 9], "cabl": 6, "suppli": [6, 7, 9], "grow": 6, "core": [6, 9, 10, 11], "those": [6, 9], "d": [6, 10], "island": 6, "investig": 6, "dori": 6, "willing": 6, "she": 6, "her": 6, "home": [6, 10], "everyon": [6, 9], "vice": [6, 11], "versa": [6, 11], "vhf": [6, 9, 11], "outli": 6, "geograph": 6, "coverag": 6, "dai": [6, 7], "find": [6, 9], "poorli": 6, "outlier": 6, "signatur": [7, 9, 10, 11], "configdir": 7, "logdest": 7, "verbos": [7, 10], "exactli": [7, 9], "independ": [7, 9, 11], "inter": 7, "soon": 7, "kill": [7, 9], "forcibli": [7, 10], "advantag": 7, "demand": 7, "mtu": [7, 9, 11], "500": [7, 9, 11], "adher": 7, "prerequisit": 7, "percentag": 7, "schedul": 7, "queu": [7, 10], "fewer": 7, "distant": 7, "smaller": 7, "eventu": 7, "alter": [7, 9], "minimum_bitr": 7, "static": 7, "get_inst": 7, "should_use_implicit_proof": 7, "explicit": 7, "implicit": [7, 9], "transport_en": 7, "remote_management_en": 7, "create_kei": 7, "decrypt": [7, 9, 10], "verif": [7, 9, 10], "sign": [7, 9, 10], "dh": 7, "keysiz": 7, "x25519": [9, 11], "concaten": 7, "128": [7, 9, 11], "constant": 7, "truncat": [7, 9, 10], "recall_app_data": 7, "heard": [7, 9], "full_hash": 7, "sha": [7, 9], "truncated_hash": 7, "from_byt": 7, "prv_byte": 7, "save": [7, 9], "hazard": 7, "feed": 7, "from_fil": 7, "to_fil": 7, "Be": [7, 10], "get_private_kei": 7, "get_public_kei": 7, "load_private_kei": 7, "load_public_kei": 7, "pub_byt": 7, "ratchet": [7, 9], "ciphertext": 7, "token": [7, 9], "keyerror": 7, "ciphertext_token": 7, "presenc": 7, "ingo": 7, "zero": [7, 11], "expand_nam": 7, "app_and_aspects_from_nam": 7, "full_nam": [7, 10], "tupl": 7, "hash_from_name_and_ident": 7, "adress": [7, 9], "path_respons": 7, "attached_interfac": 7, "tag": 7, "flag": [7, 9], "accepts_link": 7, "accept": [7, 8, 9, 10], "set_proof_requested_callback": 7, "proof_strategi": 7, "prove_non": 7, "prove_app": 7, "proof_requested_callback": 7, "allow_non": 7, "allowed_list": 7, "whatev": [7, 9], "funcion": 7, "allow_list": 7, "deregister_request_handl": 7, "deregist": 7, "symmetr": [7, 9], "typeerror": 7, "incompat": [7, 9], "set_default_app_data": 7, "clear_default_app_data": 7, "ae": [7, 9, 11], "secreci": [7, 9, 11], "instanti": 7, "encrypted_mdu": 7, "383": 7, "plain_mdu": 7, "464": 7, "resend": 7, "get_statu": 7, "cull": 7, "successful": 7, "proven": [7, 9], "established_callback": 7, "closed_callback": 7, "establishment_timeout_per_hop": 7, "keepalive_timeout_factor": 7, "4": [7, 9, 10], "calcul": [7, 9, 10], "stale_grac": 7, "grace": 7, "keepal": [7, 9], "360": 7, "aliv": [7, 9], "stale_tim": 7, "720": 7, "mark": [7, 9], "stale": 7, "torn": 7, "progress_callback": 7, "info": [7, 9, 10], "track_phy_stat": 7, "track": 7, "retriev": 7, "stat": [7, 10], "qualiti": 7, "get_rssi": 7, "signal": [7, 9], "strength": [7, 11], "get_snr": 7, "nois": 7, "ratio": 7, "get_q": 7, "get_establishment_r": 7, "ocur": 7, "get_ag": 7, "no_inbound_for": 7, "no_outbound_for": 7, "outbound": [7, 9], "no_data_for": 7, "travers": [7, 9], "exclud": [7, 9], "inactive_for": 7, "purg": 7, "set_resource_callback": 7, "get_transfer_s": 7, "get_data_s": 7, "get_part": 7, "is_compress": 7, "begun": 7, "resource_strategi": 7, "accept_non": 7, "accept_app": 7, "resource_callback": 7, "unsupport": 7, "get_request_id": 7, "get_respons": 7, "get_response_tim": 7, "auto_compress": 7, "arbitrari": [7, 9, 10, 11], "checksum": [7, 11], "Will": 7, "whenev": [7, 9], "cancel": 7, "total": [7, 9, 11], "get_seg": 7, "divid": 7, "get_hash": 7, "bi": [7, 9], "neither": [7, 9], "constrain": 7, "message_class": 7, "recept": 7, "messagecallbacktyp": 7, "bool": 7, "stop": [7, 11], "remove_message_handl": 7, "remov": [7, 10], "envelop": 7, "thrown": 7, "consum": 7, "adjust": 7, "accommod": [7, 9], "abstract": [7, 9], "greater": [7, 9, 11], "popul": 7, "bufferedread": 7, "bufferedwrit": 7, "bufferedrwpair": 7, "create_read": 7, "ready_callback": 7, "document": [7, 9], "create_writ": 7, "receive_stream_id": 7, "send_stream_id": 7, "rawiobas": 7, "add_ready_callback": 7, "cb": [7, 9], "remove_ready_callback": 7, "pathfinder_m": 7, "attribut": 7, "deregister_announce_handl": 7, "hops_to": 7, "next_hop": 7, "next_hop_interfac": 7, "on_interfac": 7, "recurs": 7, "gratefulli": 8, "monero": 8, "84fpy1qbxhcgdseepynmhthcrgmx4nffbytz2gkytoqhvvhjp8eaw1z1eedrnkd19b3b8nilcgvxzkv17ummmeescrpya5w": 8, "ethereum": 8, "0x81f7b979fea6134ba9fd5c701b3501a2e61e897a": 8, "bitcoin": 8, "3cpmacgm34qyvr6xwlvejmi2ane3pzquuq": 8, "ko": 8, "fi": 8, "roadmap": 8, "realiti": 8, "quickli": [8, 9, 11], "sponsor": [8, 11], "dysfunct": 8, "analyt": 8, "telemetri": 8, "collect": 8, "under": [8, 10, 11], "circumst": [8, 9], "reli": [8, 9], "fashion": 8, "u": [8, 9, 10], "suggest": 8, "overal": 9, "principl": [9, 11], "author": 9, "That": 9, "said": 9, "pretti": 9, "sentiment": 9, "philosophi": 9, "seek": 9, "solv": 9, "primari": 9, "lack": 9, "my": 9, "belief": 9, "highli": 9, "machin": 9, "censorship": [9, 11], "barrier": 9, "todai": 9, "centralis": 9, "trust": [9, 10], "approv": 9, "gatekeep": 9, "inevit": 9, "govern": 9, "censor": 9, "persecut": 9, "unwant": 9, "actor": 9, "imposs": 9, "freeli": 9, "deploi": 9, "enhanc": 9, "agenc": 9, "freedom": 9, "permissionless": 9, "pick": 9, "ghz": 9, "off": [9, 10, 11], "shelf": [9, 11], "ultim": 9, "vast": 9, "myriad": 9, "thousand": 9, "surveil": 9, "disassoci": 9, "oversight": 9, "beings": 9, "useabl": 9, "critic": [9, 10], "agnostic": 9, "shall": 9, "handheld": 9, "strong": 9, "oneself": 9, "unlicens": 9, "licens": 9, "condit": [9, 11], "pmr": 9, "written": 9, "programm": 9, "orient": 9, "multipoint": 9, "recipi": 9, "singular": 9, "_represented_": 9, "characterist": 9, "13425ec15b621c1d928589718000d814": 9, "trade": 9, "simultan": 9, "unlik": 9, "nears": 9, "congest": 9, "galact": 9, "scale": [9, 11], "obvious": 9, "ridicul": 9, "special": [9, 10], "ecdh": [9, 11], "creator": 9, "correspond": 9, "possess": 9, "although": [9, 11], "capabl": 9, "dot": [9, 10], "notat": [9, 10], "repres": 9, "plenti": 9, "environment": 9, "monitor": 9, "measur": 9, "environmentlogg": 9, "remotesensor": 9, "temperatur": 9, "4faf1b2e0a077e6a9d92fa051f256038": 9, "advis": 9, "expand": 9, "recap": 9, "indirectli": 9, "ledger": 9, "therefor": [9, 11], "messeng": 9, "nicknam": 9, "ed25519": [9, 11], "reconstruct": 9, "notic": [9, 10], "piec": 9, "intention": 9, "infer": 9, "throughout": 9, "accord": 9, "around": 9, "topic": 9, "necessarili": 9, "entiti": 9, "robot": 9, "sensor": 9, "someth": 9, "agent": 9, "manipul": [9, 11], "multilater": 9, "creation": [9, 11], "great": 9, "suffic": 9, "cluster": 9, "hear": 9, "But": 9, "lot": 9, "surviv": 9, "overcom": 9, "challeng": 9, "asymmetr": [9, 10, 11], "closer": 9, "distinguish": 9, "contend": 9, "enable_transport": [9, 10], "randomis": 9, "prioriti": 9, "invers": 9, "proport": 9, "count": 9, "insert": 9, "closest": 9, "newer": [7, 9], "newest": 9, "discard": [7, 9], "contact": 9, "shortest": 9, "predict": 9, "constantli": 9, "earlier": 9, "opt": 9, "against": 9, "bidirect": 9, "rememb": [7, 9], "ten": 9, "advanc": 9, "confirm": [9, 11], "insid": 9, "intermediari": 9, "moment": [9, 11], "methodologi": [9, 10], "answer": [9, 10], "malici": 9, "pretend": 9, "recreat": 9, "rotat": [7, 9], "memori": 9, "thereaft": 9, "297": [9, 11], "neglig": 9, "1200": 9, "96": 9, "keypair": 9, "simplic": 9, "explan": [9, 10], "lki": 9, "laid": 9, "had": 9, "construct": [9, 11], "lkr": 9, "chose": 9, "direction": 9, "unequivoc": 9, "retransmiss": 9, "reassembl": 9, "programmat": 9, "satisfi": 9, "half": [9, 11], "duplex": [9, 11], "averag": 9, "throughput": [9, 11], "x": [7, 9, 10], "runtim": 9, "consist": 9, "whereupon": 9, "stabl": [9, 11], "stage": 9, "year": 9, "microcontrol": 9, "430": 9, "868": 9, "900": 9, "recent": [7, 9], "mac": 9, "tailor": 9, "treat": 9, "regard": 9, "preshar": 9, "ifac": [9, 10], "compos": 9, "field": 9, "context": 9, "465": 9, "vari": [9, 10], "unset": 9, "00": [9, 10], "01": 9, "11": 9, "_______": 9, "________________": 9, "________": 9, "______": 9, "__": 9, "_": 9, "01010000": 9, "00000100": 9, "hash1": 9, "hash2": 9, "header_2": 9, "00000000": 9, "00000111": 9, "header_1": 9, "10000000": 9, "51": 9, "167": 9, "83": [9, 10], "115": 9, "99": 9, "conceptu": 9, "hkdf": 9, "fernet": [9, 11], "cbc": [9, 11], "hmac": [9, 11], "hashlib": 9, "pkcs7": [9, 11], "pad": [9, 11], "trivial": [9, 11], "consequ": 9, "backend": 9, "loss": 9, "scrutini": 9, "review": [9, 11], "risk": 9, "driver": [10, 11], "privileg": 10, "light": 10, "weight": 10, "etc": 10, "boot": 10, "ie": 10, "breviti": 10, "socket": 10, "turn": 10, "share_inst": 10, "shared_instance_port": 10, "37428": 10, "instance_control_port": 10, "37429": 10, "rpc": 10, "rpc_kei": 10, "e5c032d3ec4e64a6aca9927ba8ab73336780f6d71790": 10, "panic": 10, "unrecover": 10, "panic_on_interface_error": 10, "probe": 10, "respond_to_prob": 10, "warn": 10, "debug": 10, "unus": 10, "teach": 10, "task": 10, "08": 10, "18": 10, "17": 10, "59": 10, "56": 10, "v": 10, "show": 10, "ifconfig": 10, "gbp": 10, "13": 10, "kb": 10, "86": 10, "mbp": 10, "63": 10, "23": 10, "80": 10, "tcpinterfac": 10, "dublin": 10, "187": 10, "27": 10, "74": 10, "uhf": [10, 11], "kbp": 10, "e702c42ba8": 10, "49": 10, "9": 10, "5245a8efe1788c6a1cd36144a270e13b": 10, "j": 10, "w": 10, "posit": 10, "arx": 10, "atx": 10, "revers": 10, "json": 10, "new_ident": 10, "984b74a3f768bef236af4371e6f248cd": 10, "new_id": 10, "0f4259fef4521ab75a3409e353fe9073eb10783b4912a6a9937c57bf44a62c1": 10, "hidden": 10, "8dd57a738226809646089335a6b03695": 10, "my_fil": 10, "txt": 10, "bc7291552be7a58f361522990465165c": 10, "rfe": 10, "fetch": 10, "30602def3b3506a28ed33db6f60cc6c9": 10, "2b489d06eaf7c543808c76a5332a447d": 10, "my_ident": 10, "2225fdeecaf6e2db4556c3c2d7637294": 10, "decreas": 10, "overwrit": 10, "c89b4da064bf66d280f0e4d8abfd9806": 10, "f53a1c4278e0726bb73fcc623d6ce763": 10, "max": 10, "rnstransport": 10, "2d03725b327348980d570f739a3a5708": 10, "38": 10, "469": 10, "781": 10, "e7536ee90bd4a440e130490b87a25124": 10, "809": 10, "73": 10, "1726dbad538775b5bf9b0ea25a4079c8": 10, "c50cc4e4f7838b6c31f60ab9032cbc62": 10, "allowed_ident": 10, "copi": 10, "tgz": 10, "73cbd378bb0286ed11a707c13447bb1": 10, "allowed_hash": 10, "silent": 10, "jail": 10, "auth": 10, "941bed5e228775e5a8079fc38b1ccf3f": 10, "1b03013c25f1c2ca068a4f080b844a10": 10, "7a55144adf826958a9529a3bcf08b149": 10, "cat": 10, "proc": 10, "cpuinfo": 10, "pseudo": 10, "stderr": 10, "noauth": 10, "noid": 10, "mirror": 10, "fw": 10, "url": 10, "nocheck": 10, "flash": 10, "baud_flash": 10, "addr": 10, "freq": 10, "hz": 10, "bw": 10, "txp": 10, "sf": 10, "cr": 10, "eeprom": 10, "backup": 10, "dump": 10, "wipe": 10, "hexbyt": 10, "firmware_hash": 10, "product": 10, "model": 10, "hwrev": 10, "revis": 10, "attach": 10, "older": 10, "onlin": 10, "extract": 10, "cach": 10, "921600": 10, "bluetooth": 10, "intens": 10, "ff": 10, "consol": 10, "unlock": 10, "bootstrap": 10, "rom": 10, "enable_remote_manag": 10, "remote_management_allow": 10, "9fb6d773498fb3feda407ed8ef2c3229": 10, "2d882c5586e548d79b5af27bca1776dc": 10, "administr": 10, "ftdi_ft230x_basic_uart_43891ckm": 10, "if00": 10, "port0": 10, "plug": 10, "unplug": 10, "systemd": 10, "usr": 10, "bin": 10, "execstartpr": 10, "restart": 10, "restartsec": 10, "usernameher": 10, "execstart": 10, "wantedbi": 10, "systemctl": 10, "whole": 10, "regular": 10, "rns_bin_dir": 10, "eg": 10, "reload": 10, "loginctl": 10, "linger": 10, "readili": 11, "advers": 11, "unforg": 11, "acknowledg": 11, "empow": 11, "autonomi": 11, "sovereignti": 11, "subject": 11, "outsid": [7, 11], "planetari": 11, "hierarch": 11, "beaureucrat": 11, "resili": 11, "userland": 11, "beta": 11, "bug": 11, "warrant": 11, "sha256": 11, "iv": 11, "urandom": 11, "intuit": 11, "44": 11, "gigabyt": 11, "scalabl": 11, "hoc": 11, "transform": 11, "fact": 11, "generalis": 11, "fibr": 11, "popular": 11, "ideal": 11, "stdio": 11, "hack": 11, "foremost": 11, "audit": 11, "privaci": 11, "thorough": 11, "research": 11, "touch": 11, "ratchets": 7, "ratchet_expiri": 7, "2592000": 7, "meantim": 7, "ratchet_count": 7, "ratchet_interv": 7, "1800": 7, "enable_ratchet": 7, "ratchets_path": 7, "set_retained_ratchet": 7, "retained_ratchet": 7, "succeed": 7, "set_ratchet_interv": 7, "25519": 7, "enforce_ratchet": 7}, "objects": {"RNS": [[7, 0, 1, "", "Buffer"], [7, 0, 1, "", "Destination"], [7, 0, 1, "", "Identity"], [7, 0, 1, "", "Link"], [7, 0, 1, "", "MessageBase"], [7, 0, 1, "", "Packet"], [7, 0, 1, "", "PacketReceipt"], [7, 0, 1, "", "RawChannelReader"], [7, 0, 1, "", "RawChannelWriter"], [7, 0, 1, "", "RequestReceipt"], [7, 0, 1, "", "Resource"], [7, 0, 1, "", "Reticulum"], [7, 0, 1, "", "Transport"]], "RNS.Buffer": [[7, 1, 1, "", "create_bidirectional_buffer"], [7, 1, 1, "", "create_reader"], [7, 1, 1, "", "create_writer"]], "RNS.Channel": [[7, 0, 1, "", "Channel"]], "RNS.Channel.Channel": [[7, 2, 1, "", "MDU"], [7, 1, 1, "", "add_message_handler"], [7, 1, 1, "", "is_ready_to_send"], [7, 1, 1, "", "register_message_type"], [7, 1, 1, "", "remove_message_handler"], [7, 1, 1, "", "send"]], "RNS.Destination": [[7, 3, 1, "", "RATCHET_COUNT"], [7, 3, 1, "", "RATCHET_INTERVAL"], [7, 1, 1, "", "accepts_links"], [7, 1, 1, "", "announce"], [7, 1, 1, "", "app_and_aspects_from_name"], [7, 1, 1, "", "clear_default_app_data"], [7, 1, 1, "", "create_keys"], [7, 1, 1, "", "decrypt"], [7, 1, 1, "", "deregister_request_handler"], [7, 1, 1, "", "enable_ratchets"], [7, 1, 1, "", "encrypt"], [7, 1, 1, "", "enforce_ratchets"], [7, 1, 1, "", "expand_name"], [7, 1, 1, "", "get_private_key"], [7, 1, 1, "", "hash"], [7, 1, 1, "", "hash_from_name_and_identity"], [7, 1, 1, "", "load_private_key"], [7, 1, 1, "", "register_request_handler"], [7, 1, 1, "", "set_default_app_data"], [7, 1, 1, "", "set_link_established_callback"], [7, 1, 1, "", "set_packet_callback"], [7, 1, 1, "", "set_proof_requested_callback"], [7, 1, 1, "", "set_proof_strategy"], [7, 1, 1, "", "set_ratchet_interval"], [7, 1, 1, "", "set_retained_ratchets"], [7, 1, 1, "", "sign"]], "RNS.Identity": [[7, 3, 1, "", "CURVE"], [7, 3, 1, "", "KEYSIZE"], [7, 3, 1, "", "RATCHETSIZE"], [7, 3, 1, "", "RATCHET_EXPIRY"], [7, 3, 1, "", "TRUNCATED_HASHLENGTH"], [7, 1, 1, "", "decrypt"], [7, 1, 1, "", "encrypt"], [7, 1, 1, "", "from_bytes"], [7, 1, 1, "", "from_file"], [7, 1, 1, "", "full_hash"], [7, 1, 1, "", "get_private_key"], [7, 1, 1, "", "get_public_key"], [7, 1, 1, "", "get_random_hash"], [7, 1, 1, "", "load_private_key"], [7, 1, 1, "", "load_public_key"], [7, 1, 1, "", "recall"], [7, 1, 1, "", "recall_app_data"], [7, 1, 1, "", "sign"], [7, 1, 1, "", "to_file"], [7, 1, 1, "", "truncated_hash"], [7, 1, 1, "", "validate"]], "RNS.Link": [[7, 3, 1, "", "CURVE"], [7, 3, 1, "", "ESTABLISHMENT_TIMEOUT_PER_HOP"], [7, 3, 1, "", "KEEPALIVE"], [7, 3, 1, "", "KEEPALIVE_TIMEOUT_FACTOR"], [7, 3, 1, "", "STALE_GRACE"], [7, 3, 1, "", "STALE_TIME"], [7, 1, 1, "", "get_age"], [7, 1, 1, "", "get_channel"], [7, 1, 1, "", "get_establishment_rate"], [7, 1, 1, "", "get_q"], [7, 1, 1, "", "get_remote_identity"], [7, 1, 1, "", "get_rssi"], [7, 1, 1, "", "get_snr"], [7, 1, 1, "", "identify"], [7, 1, 1, "", "inactive_for"], [7, 1, 1, "", "no_data_for"], [7, 1, 1, "", "no_inbound_for"], [7, 1, 1, "", "no_outbound_for"], [7, 1, 1, "", "request"], [7, 1, 1, "", "set_link_closed_callback"], [7, 1, 1, "", "set_packet_callback"], [7, 1, 1, "", "set_remote_identified_callback"], [7, 1, 1, "", "set_resource_callback"], [7, 1, 1, "", "set_resource_concluded_callback"], [7, 1, 1, "", "set_resource_started_callback"], [7, 1, 1, "", "set_resource_strategy"], [7, 1, 1, "", "teardown"], [7, 1, 1, "", "track_phy_stats"]], "RNS.MessageBase": [[7, 3, 1, "", "MSGTYPE"], [7, 1, 1, "", "pack"], [7, 1, 1, "", "unpack"]], "RNS.Packet": [[7, 3, 1, "", "ENCRYPTED_MDU"], [7, 3, 1, "", "PLAIN_MDU"], [7, 1, 1, "", "resend"], [7, 1, 1, "", "send"]], "RNS.PacketReceipt": [[7, 1, 1, "", "get_rtt"], [7, 1, 1, "", "get_status"], [7, 1, 1, "", "set_delivery_callback"], [7, 1, 1, "", "set_timeout"], [7, 1, 1, "", "set_timeout_callback"]], "RNS.RawChannelReader": [[7, 1, 1, "", "__init__"], [7, 1, 1, "", "add_ready_callback"], [7, 1, 1, "", "remove_ready_callback"]], "RNS.RawChannelWriter": [[7, 1, 1, "", "__init__"]], "RNS.RequestReceipt": [[7, 1, 1, "", "concluded"], [7, 1, 1, "", "get_progress"], [7, 1, 1, "", "get_request_id"], [7, 1, 1, "", "get_response"], [7, 1, 1, "", "get_response_time"], [7, 1, 1, "", "get_status"]], "RNS.Resource": [[7, 1, 1, "", "advertise"], [7, 1, 1, "", "cancel"], [7, 1, 1, "", "get_data_size"], [7, 1, 1, "", "get_hash"], [7, 1, 1, "", "get_parts"], [7, 1, 1, "", "get_progress"], [7, 1, 1, "", "get_segments"], [7, 1, 1, "", "get_transfer_size"], [7, 1, 1, "", "is_compressed"]], "RNS.Reticulum": [[7, 3, 1, "", "ANNOUNCE_CAP"], [7, 3, 1, "", "MINIMUM_BITRATE"], [7, 3, 1, "", "MTU"], [7, 1, 1, "", "get_instance"], [7, 1, 1, "", "remote_management_enabled"], [7, 1, 1, "", "should_use_implicit_proof"], [7, 1, 1, "", "transport_enabled"]], "RNS.Transport": [[7, 3, 1, "", "PATHFINDER_M"], [7, 1, 1, "", "deregister_announce_handler"], [7, 1, 1, "", "has_path"], [7, 1, 1, "", "hops_to"], [7, 1, 1, "", "next_hop"], [7, 1, 1, "", "next_hop_interface"], [7, 1, 1, "", "register_announce_handler"], [7, 1, 1, "", "request_path"]]}, "objtypes": {"0": "py:class", "1": "py:method", "2": "py:property", "3": "py:attribute"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "method", "Python method"], "2": ["py", "property", "Python property"], "3": ["py", "attribute", "Python attribute"]}, "titleterms": {"code": [0, 8, 9], "exampl": [0, 6], "minim": 0, "announc": [0, 5, 9], "broadcast": 0, "echo": 0, "link": [0, 9], "identif": 0, "request": 0, "respons": 0, "channel": 0, "buffer": 0, "filetransf": 0, "an": 1, "explan": 1, "reticulum": [1, 2, 3, 4, 8, 9, 10, 11], "human": 1, "Beings": 1, "get": [2, 9], "start": 2, "fast": 2, "standalon": 2, "instal": [2, 3], "resolv": 2, "depend": 2, "issu": 2, "try": 2, "us": [2, 10, 11], "base": [2, 3], "program": [2, 10], "remot": [2, 10], "shell": 2, "nomad": 2, "network": [2, 4, 6], "sideband": 2, "meshchat": 2, "includ": [2, 10], "util": [2, 10], "creat": [2, 3], "With": 2, "connect": 2, "instanc": 2, "over": [2, 6], "internet": [2, 6], "public": [2, 9], "testnet": 2, "ad": 2, "radio": [2, 3], "interfac": [2, 5, 9, 11], "develop": 2, "particip": 2, "platform": 2, "specif": [2, 9], "note": 2, "android": 2, "arm64": 2, "raspberri": 2, "pi": 2, "debian": 2, "bookworm": 2, "ubuntu": 2, "lunar": 2, "pure": 2, "python": 2, "commun": 3, "hardwar": 3, "combin": 3, "type": [3, 9, 11], "rnode": [3, 5], "support": [3, 8], "board": 3, "lilygo": 3, "lora32": 3, "v2": 3, "1": 3, "0": 3, "t": 3, "beam": 3, "heltec": 3, "unsign": 3, "x": 3, "v1": 3, "usag": 3, "wifi": 3, "ethernet": 3, "serial": [3, 5, 10], "line": 3, "devic": [3, 11], "packet": [3, 9], "modem": 3, "stack": 4, "manual": 4, "tabl": 4, "Of": 4, "content": 4, "indic": 4, "configur": [5, 10], "auto": 5, "i2p": 5, "tcp": 5, "server": 5, "client": 5, "udp": 5, "lora": [5, 6], "multi": 5, "pipe": 5, "kiss": 5, "ax": 5, "25": 5, "common": 5, "option": 5, "mode": 5, "rate": 5, "control": 5, "new": 5, "destin": [5, 9], "limit": 5, "build": 6, "concept": 6, "overview": 6, "scenario": 6, "interconnect": 6, "site": 6, "bridg": 6, "growth": 6, "converg": 6, "api": 7, "refer": [7, 9], "donat": 8, "provid": 8, "feedback": 8, "contribut": 8, "understand": 9, "motiv": 9, "goal": 9, "introduct": 9, "basic": 9, "function": 9, "name": [9, 10], "kei": 9, "ident": 9, "further": 9, "transport": 9, "node": 9, "The": [9, 10], "mechan": 9, "detail": 9, "reach": 9, "establish": 9, "resourc": 9, "setup": 9, "protocol": 9, "prioritis": 9, "access": 9, "wire": 9, "format": 9, "propag": 9, "rule": 9, "cryptograph": 9, "primit": 9, "your": 10, "system": 10, "data": 10, "rnsd": 10, "rnstatu": 10, "rnid": 10, "rnpath": 10, "rnprobe": 10, "rncp": 10, "rnx": 10, "rnodeconf": 10, "manag": 10, "improv": 10, "fix": 10, "port": 10, "servic": 10, "systemwid": 10, "userspac": 10, "what": 11, "i": 11, "current": 11, "statu": 11, "doe": 11, "offer": 11, "where": 11, "can": 11, "caveat": 11, "emptor": 11}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"Code Examples": [[0, "code-examples"]], "Minimal": [[0, "minimal"]], "Announce": [[0, "announce"]], "Broadcast": [[0, "broadcast"]], "Echo": [[0, "echo"]], "Link": [[0, "link"]], "Identification": [[0, "example-identify"]], "Requests & Responses": [[0, "requests-responses"]], "Channel": [[0, "channel"]], "Buffer": [[0, "buffer"]], "Filetransfer": [[0, "filetransfer"]], "An Explanation of Reticulum for Human Beings": [[1, "an-explanation-of-reticulum-for-human-beings"]], "Getting Started Fast": [[2, "getting-started-fast"]], "Standalone Reticulum Installation": [[2, "standalone-reticulum-installation"]], "Resolving Dependency & Installation Issues": [[2, "resolving-dependency-installation-issues"]], "Try Using a Reticulum-based Program": [[2, "try-using-a-reticulum-based-program"]], "Remote Shell": [[2, "remote-shell"]], "Nomad Network": [[2, "nomad-network"]], "Sideband": [[2, "sideband"]], "MeshChat": [[2, "meshchat"]], "Using the Included Utilities": [[2, "using-the-included-utilities"]], "Creating a Network With Reticulum": [[2, "creating-a-network-with-reticulum"]], "Connecting Reticulum Instances Over the Internet": [[2, "connecting-reticulum-instances-over-the-internet"]], "Connect to the Public Testnet": [[2, "connect-to-the-public-testnet"]], "Adding Radio Interfaces": [[2, "adding-radio-interfaces"]], "Develop a Program with Reticulum": [[2, "develop-a-program-with-reticulum"]], "Participate in Reticulum Development": [[2, "participate-in-reticulum-development"]], "Platform-Specific Install Notes": [[2, "platform-specific-install-notes"]], "Android": [[2, "android"]], "ARM64": [[2, "arm64"]], "Raspberry Pi": [[2, "raspberry-pi"]], "Debian Bookworm": [[2, "debian-bookworm"]], "Ubuntu Lunar": [[2, "ubuntu-lunar"]], "Pure-Python Reticulum": [[2, "pure-python-reticulum"]], "Communications Hardware": [[3, "communications-hardware"]], "Combining Hardware Types": [[3, "combining-hardware-types"]], "RNode": [[3, "rnode"]], "Creating RNodes": [[3, "creating-rnodes"]], "Supported Boards": [[3, "supported-boards"]], "LilyGO LoRa32 v2.1": [[3, "lilygo-lora32-v2-1"]], "LilyGO LoRa32 v2.0": [[3, "lilygo-lora32-v2-0"]], "LilyGO T-Beam": [[3, "lilygo-t-beam"]], "Heltec LoRa32 v2.0": [[3, "heltec-lora32-v2-0"]], "Unsigned RNode v2.x": [[3, "unsigned-rnode-v2-x"]], "Unsigned RNode v1.x": [[3, "unsigned-rnode-v1-x"]], "Installation": [[3, "installation"]], "Usage with Reticulum": [[3, "usage-with-reticulum"]], "WiFi-based Hardware": [[3, "wifi-based-hardware"]], "Ethernet-based Hardware": [[3, "ethernet-based-hardware"]], "Serial Lines & Devices": [[3, "serial-lines-devices"]], "Packet Radio Modems": [[3, "packet-radio-modems"]], "Reticulum Network Stack Manual": [[4, "reticulum-network-stack-manual"]], "Table Of Contents": [[4, "table-of-contents"]], "Indices and Tables": [[4, "indices-and-tables"]], "Configuring Interfaces": [[5, "configuring-interfaces"]], "Auto Interface": [[5, "auto-interface"]], "I2P Interface": [[5, "i2p-interface"]], "TCP Server Interface": [[5, "tcp-server-interface"]], "TCP Client Interface": [[5, "tcp-client-interface"]], "UDP Interface": [[5, "udp-interface"]], "RNode LoRa Interface": [[5, "rnode-lora-interface"]], "RNode Multi Interface": [[5, "rnode-multi-interface"]], "Serial Interface": [[5, "serial-interface"]], "Pipe Interface": [[5, "pipe-interface"]], "KISS Interface": [[5, "kiss-interface"]], "AX.25 KISS Interface": [[5, "ax-25-kiss-interface"]], "Common Interface Options": [[5, "common-interface-options"]], "Interface Modes": [[5, "interface-modes"]], "Announce Rate Control": [[5, "announce-rate-control"]], "New Destination Rate Limiting": [[5, "new-destination-rate-limiting"]], "Building Networks": [[6, "building-networks"]], "Concepts & Overview": [[6, "concepts-overview"]], "Example Scenarios": [[6, "example-scenarios"]], "Interconnected LoRa Sites": [[6, "interconnected-lora-sites"]], "Bridging Over the Internet": [[6, "bridging-over-the-internet"]], "Growth and Convergence": [[6, "growth-and-convergence"]], "Support Reticulum": [[8, "support-reticulum"]], "Donations": [[8, "donations"]], "Provide Feedback": [[8, "provide-feedback"]], "Contribute Code": [[8, "contribute-code"]], "Using Reticulum on Your System": [[10, "using-reticulum-on-your-system"]], "Configuration & Data": [[10, "configuration-data"]], "Included Utility Programs": [[10, "included-utility-programs"]], "The rnsd Utility": [[10, "the-rnsd-utility"]], "The rnstatus Utility": [[10, "the-rnstatus-utility"]], "The rnid Utility": [[10, "the-rnid-utility"]], "The rnpath Utility": [[10, "the-rnpath-utility"]], "The rnprobe Utility": [[10, "the-rnprobe-utility"]], "The rncp Utility": [[10, "the-rncp-utility"]], "The rnx Utility": [[10, "the-rnx-utility"]], "The rnodeconf Utility": [[10, "the-rnodeconf-utility"]], "Remote Management": [[10, "remote-management"]], "Improving System Configuration": [[10, "improving-system-configuration"]], "Fixed Serial Port Names": [[10, "fixed-serial-port-names"]], "Reticulum as a System Service": [[10, "reticulum-as-a-system-service"]], "Systemwide Service": [[10, "systemwide-service"]], "Userspace Service": [[10, "userspace-service"]], "API Reference": [[7, "api-reference"]], "Understanding Reticulum": [[9, "understanding-reticulum"]], "Motivation": [[9, "motivation"]], "Goals": [[9, "goals"]], "Introduction & Basic Functionality": [[9, "introduction-basic-functionality"]], "Destinations": [[9, "destinations"]], "Destination Naming": [[9, "destination-naming"]], "Public Key Announcements": [[9, "public-key-announcements"]], "Identities": [[9, "understanding-identities"]], "Getting Further": [[9, "getting-further"]], "Reticulum Transport": [[9, "reticulum-transport"]], "Node Types": [[9, "node-types"]], "The Announce Mechanism in Detail": [[9, "the-announce-mechanism-in-detail"]], "Reaching the Destination": [[9, "reaching-the-destination"]], "Link Establishment in Detail": [[9, "link-establishment-in-detail"]], "Resources": [[9, "resources"]], "Reference Setup": [[9, "reference-setup"]], "Protocol Specifics": [[9, "protocol-specifics"]], "Packet Prioritisation": [[9, "packet-prioritisation"]], "Interface Access Codes": [[9, "interface-access-codes"]], "Wire Format": [[9, "wire-format"]], "Announce Propagation Rules": [[9, "announce-propagation-rules"]], "Cryptographic Primitives": [[9, "cryptographic-primitives"]], "What is Reticulum?": [[11, "what-is-reticulum"]], "Current Status": [[11, "current-status"]], "What does Reticulum Offer?": [[11, "what-does-reticulum-offer"]], "Where can Reticulum be Used?": [[11, "where-can-reticulum-be-used"]], "Interface Types and Devices": [[11, "interface-types-and-devices"]], "Caveat Emptor": [[11, "caveat-emptor"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/docs/manual/understanding.html b/docs/manual/understanding.html index c9881e1..0246f2e 100644 --- a/docs/manual/understanding.html +++ b/docs/manual/understanding.html @@ -360,10 +360,11 @@ be sufficient, even far into the future.

By default Reticulum encrypts all data using elliptic curve cryptography and AES. Any packet sent to a destination is encrypted with a per-packet derived key. Reticulum can also set up an encrypted channel to a destination, called a Link. Both data sent over Links and single packets offer -Initiator Anonymity, and links additionally offer Forward Secrecy by using an Elliptic Curve -Diffie Hellman key exchange on Curve25519 to derive per-link ephemeral keys. The multi-hop transport, -coordination, verification and reliability layers are fully autonomous and also based on elliptic -curve cryptography.

+Initiator Anonymity. Links additionally offer Forward Secrecy by default, employing an Elliptic Curve +Diffie Hellman key exchange on Curve25519 to derive per-link ephemeral keys. Asymmetric, link-less +packet communication can also provide forward secrecy, with automatic key ratcheting, by enabling +ratchets on a per-destination basis. The multi-hop transport, coordination, verification and reliability +layers are fully autonomous and also based on elliptic curve cryptography.

Reticulum also offers symmetric key encryption for group-oriented communications, as well as unencrypted packets for local broadcast purposes.

Reticulum can connect to a variety of interfaces such as radio modems, data radios and serial ports, @@ -639,7 +640,7 @@ expect. Reticulum offers two ways to do this.

  • A packet is always created with an associated destination and some payload data. When the packet is sent to a single destination type, Reticulum will automatically create an ephemeral encryption key, perform -an ECDH key exchange with the destination’s public key, and encrypt the information.
    +an ECDH key exchange with the destination’s public key (or ratchet key, if available), and encrypt the information.
  • @@ -1068,10 +1069,11 @@ both on general-purpose CPUs and on microcontrollers. The necessary primitives a
  • Ed25519 for signatures

  • X25519 for ECDH key exchanges

  • HKDF for key derivation

  • -
  • Fernet for encrypted tokens

    +
  • Modified Fernet for encrypted tokens

    • AES-128 in CBC mode

    • HMAC for message authentication

    • +
    • No Version and Timestamp metadata included

  • SHA-256

  • diff --git a/docs/manual/whatis.html b/docs/manual/whatis.html index c9acd0e..4bf5519 100644 --- a/docs/manual/whatis.html +++ b/docs/manual/whatis.html @@ -262,12 +262,13 @@ considered complete and stable at the moment, but could change if absolutely war
  • Complete initiator anonymity, communicate without revealing your identity

  • Asymmetric encryption based on X25519, and Ed25519 signatures as a basis for all communication

  • Forward Secrecy by using ephemeral Elliptic Curve Diffie-Hellman keys on Curve25519

  • -
  • Reticulum uses the Fernet specification for on-the-wire / over-the-air encryption

    +
  • Reticulum uses a modified version of the Fernet specification for on-the-wire / over-the-air encryption

      -
    • All keys are ephemeral and derived from an ECDH key exchange on Curve25519

    • +
    • Keys are ephemeral and derived from an ECDH key exchange on Curve25519

    • AES-128 in CBC mode with PKCS7 padding

    • HMAC using SHA256 for authentication

    • IVs are generated through os.urandom()

    • +
    • No Version and Timestamp metadata included

  • Unforgeable packet delivery confirmations

  • diff --git a/docs/source/understanding.rst b/docs/source/understanding.rst index fe8eb8a..e458ebf 100644 --- a/docs/source/understanding.rst +++ b/docs/source/understanding.rst @@ -134,10 +134,11 @@ be sufficient, even far into the future. By default Reticulum encrypts all data using elliptic curve cryptography and AES. Any packet sent to a destination is encrypted with a per-packet derived key. Reticulum can also set up an encrypted channel to a destination, called a *Link*. Both data sent over Links and single packets offer -*Initiator Anonymity*, and links additionally offer *Forward Secrecy* by using an Elliptic Curve -Diffie Hellman key exchange on Curve25519 to derive per-link ephemeral keys. The multi-hop transport, -coordination, verification and reliability layers are fully autonomous and also based on elliptic -curve cryptography. +*Initiator Anonymity*. Links additionally offer *Forward Secrecy* by default, employing an Elliptic Curve +Diffie Hellman key exchange on Curve25519 to derive per-link ephemeral keys. Asymmetric, link-less +packet communication can also provide forward secrecy, with automatic key ratcheting, by enabling +ratchets on a per-destination basis. The multi-hop transport, coordination, verification and reliability +layers are fully autonomous and also based on elliptic curve cryptography. Reticulum also offers symmetric key encryption for group-oriented communications, as well as unencrypted packets for local broadcast purposes. @@ -431,7 +432,7 @@ For exchanges of small amounts of information, Reticulum offers the *Packet* API * | A packet is always created with an associated destination and some payload data. When the packet is sent to a *single* destination type, Reticulum will automatically create an ephemeral encryption key, perform - an ECDH key exchange with the destination's public key, and encrypt the information. + an ECDH key exchange with the destination's public key (or ratchet key, if available), and encrypt the information. * | It is important to note that this key exchange does not require any network traffic. The sender already knows the public key of the destination from an earlier received *announce*, and can thus perform the ECDH @@ -867,12 +868,14 @@ both on general-purpose CPUs and on microcontrollers. The necessary primitives a * HKDF for key derivation -* Fernet for encrypted tokens +* Modified Fernet for encrypted tokens * AES-128 in CBC mode * HMAC for message authentication + * No Version and Timestamp metadata included + * SHA-256 * SHA-512 diff --git a/docs/source/whatis.rst b/docs/source/whatis.rst index a420b7e..4c2d6ed 100644 --- a/docs/source/whatis.rst +++ b/docs/source/whatis.rst @@ -53,9 +53,9 @@ What does Reticulum Offer? * Forward Secrecy by using ephemeral Elliptic Curve Diffie-Hellman keys on Curve25519 -* Reticulum uses the `Fernet `_ specification for on-the-wire / over-the-air encryption +* Reticulum uses a modified version of the `Fernet `_ specification for on-the-wire / over-the-air encryption - * All keys are ephemeral and derived from an ECDH key exchange on Curve25519 + * Keys are ephemeral and derived from an ECDH key exchange on Curve25519 * AES-128 in CBC mode with PKCS7 padding @@ -63,6 +63,8 @@ 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