From 7940ac08129e9680a3e3bf9fe8e1a9b7ea6cfa08 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 30 Sep 2022 11:15:34 +0200 Subject: [PATCH] Updated docs and manual --- RNS/Packet.py | 10 +++++++--- docs/Reticulum Manual.pdf | Bin 2364963 -> 2365085 bytes docs/manual/_sources/understanding.rst.txt | 16 ++++++++-------- docs/manual/reference.html | 9 ++++++--- docs/manual/searchindex.js | 2 +- docs/manual/understanding.html | 16 ++++++++-------- docs/source/understanding.rst | 16 ++++++++-------- 7 files changed, 38 insertions(+), 31 deletions(-) diff --git a/RNS/Packet.py b/RNS/Packet.py index 6e065f1..9a10d47 100755 --- a/RNS/Packet.py +++ b/RNS/Packet.py @@ -34,10 +34,14 @@ class Packet: ``RNS.Destination.GROUP`` destination or a :ref:`RNS.Link`. For ``RNS.Destination.GROUP`` destinations, Reticulum will use the - pre-shared key configured for the destination. + pre-shared key configured for the destination. All packets to group + destinations are encrypted with the same AES-128 key. - For ``RNS.Destination.SINGLE`` destinations and :ref:`RNS.Link` - destinations, reticulum will use ephemeral keys, and offers **Forward Secrecy**. + For ``RNS.Destination.SINGLE`` destinations, Reticulum will use a newly + derived ephemeral AES-128 key for every packet. + + For :ref:`RNS.Link` destinations, Reticulum will use per-link + ephemeral keys, and offers **Forward Secrecy**. :param destination: A :ref:`RNS.Destination` instance to which the packet will be sent. :param data: The data payload to be included in the packet as *bytes*. diff --git a/docs/Reticulum Manual.pdf b/docs/Reticulum Manual.pdf index b4bee3cbccd5b64f9e2dfb85e09a57f8c2c3a94a..1ab60fa4cf3f18402bae94b399a045e633fafedf 100644 GIT binary patch delta 23960 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𝔠>mD9G|jLnQxS6AK((bvsvkPdEfB_P>;F>_?WTJ(CJiBLBYM|f z(L!qc&Od+Wn^XS$9wJ?`?jYO9`*X2wK+&d`i+p zXv4S=>F(-L)Hfjtx`JHbHpm$Zcza@6!Q5p;^}31tN{8gvTnA;R(%Si%WqFLvKv)U!^K zO@gq~D}KWfK9inRs&BdPN{ixJaT{K z-Z-P-4z3|^kyv+e$8ve5;cbqg2FIHG`Yf{t$21(l!nuZ71wS1z>=mj{VCjNWEmzUk zXEs=v;R5zvIjdYQBV%X$4tAW=b;9qg` zwO1orFkOK3S|V!+bMa+n5av<)Kc#Or-PosNa~tglz&Lz{5~ptxrc=n3VcZc* zm0C+AE3P4adK!N-6n@QY|Fr58p>R<+^r=!WbBG`@7Yjx&CE|xN+)>Z;T3GF zUj`7n01om0W0T-bjhDEiekrMFCflws__R$lYlEw-$;^TCJukAbz`sCk*sdWj4iu}xa0jQ29x~ZX^ZabNH5`-1- z^Ns+u<2i>_>3|9;iIs@kIyT-Ypc3i3*zuWH%?ty)y>k67Lgc2JmUUJmfLwc;iMdHD zAYP9+TXxl0z-?FQiPe#AAH?y;LnV}(c>KUNao^U<(ErF|Tvf^-!kD>-1KUugUNzK! zxH`o;9m9=@y1E%U&FZe%>%#2Fgm70Wvg%|0kP}IZG_+yW4hv>X!RN$Vn{Rb@!(LUM zLH`wx0c8p_6!+9E|5IAI)=m9E^?gV3ujto=MJJU=O*_}$UfO&r#nrqTjeCRJoEQ&H7s0V>7D%=A0h(#k(gcMFB^@(??=UmXIH zMvZsZ4eq22QlM0+K@2{u~uH=8lIvGAhv%D|V{J=!M7cm%Ah#$>F zK4QH(oOqw9X-MrkKdkl5$E|AadR&c`v>264%8BUE0y_Po1?CHNTHaw<`uzrq*Y%k4 zeBP}f5)AQox-Y+*(nnk#G-m7~&Z{p1Zsrim%Kms;Hh3+cX0_QnWoRuw{j7= zHUGYpOYT1`xv`yxhnukBS?UD!) z?>)N=1yof(=7FA+fV<$Bd!UTneT9KEU*VblZq@6TuhW&J5gdnnA~kfn@j;^;iGiv> zj^75w1sHmUUmowML;;#Wj-zxvL%%o1K$0y^{bkOypPW0@rw8*wGX3A)0<<~n%s&sG zbyWa{cS-j)(#5Je{zgr0e?bBgj)HRy{cf1?meJLI@fbG`XRh6S7cj=EGQ6oGP&F%F z;Cbgc&VdLdLU5mPRs7tqpcO<5ND>MYuj&vgnZyg$ggP}0UlpXce5l%3v@a2MY8oau zh6f)(89$pu89W?LPYwFb;r(H5qLm4Pp5`XkRAIvXTK>a0g9|SJ+cghk_`^}A-oB#BM%6XsUrz!qe;ml&dZ^< zBIga*!IX{c!I%PX^C$D{vgq~Hyg?NzIW5TD*xPDJL)B9H#{seXg5+?9gk-?v+I=xE{(s!3X&rUbQ=p=LNv(kPkG@oLU^B)8)Q(fJ}1OAT)x}+vMel0wY!#}Gl>luKYo zvLUyxtWWmdw-8F*w`usMf8REN>a}8Ir)UgvFC3 zjH}p|4$kYU#73}6l$;a{&Ff-U5q6TvnQ}{BJ&$j+JhgtQRLyqtk<9WY8`Lb*yBD=) zx8D2SNTGf67(J}|9X3cF~>6Js{Z$QFj zFaS&!s16LX#=teX-VAi;lhJaii_p4KD=s)0=neuS_Prc#JLP^MBZgQ@6@u~S2M`Z7 z;Fnjca+1TOf50p~Z4p-2Wguhn3#|}#u+>5GkCCwgQ1#SJIk#uQ1R5gNSsG0DpwRub zLhI%4-$DiHTm|^^1(?+Vw@=FlGVjFX=G+bKtH~po_11J3&^Y%jvs=LWX1WV(2yi`} z?~$6TY=aEIvTbjs(*c(r#=}BrdB5FLZG~oRsG^e1!QH(01Y(w^_&cI`zw2Xc?FQEA z=ds;C^ob?(L!)H#G7zKwXshnuWD-Q(*6E}w_xt1sP&Ga$+!4Ng>*VtU^$~p>u4vYv zDA{GgZY+Gawr^-)QRj8{2FAODaB;(Knh!o%Jvsy8T)zgt^kKQaNODlRq!~#{V3Hss zq~VNAV1`8zyogVDvi6ji!={mTZ*ERFkZ3#}?0i!F2Oyr%2~YFis^fVL+ej?`jjSFU zP!#2hH||+I4i0kJJw*6QqA%8)O{?T>z){>UTHF_UYfP{A)NbR2z+HNClV2kq|FP4o zG_4jOWXEdkXOFu!OpeJ{_2F}OypP4jDHq&_(>jZ{op-t7l}&qjEIVQTRnn&=2~^d$ zH&?qAh{;MTgs~EJ^(|`c54_l5%~wN7!!U4v3so0**Xnfr^Gqn?aOPKV=2JXiP?G+G_A%Jv2b}s3`hk>!v#`PekHP_?qVo$y zQbM%LkBq|jjNUkm-gyiySqztHMJvHBf1(3--~`rJd{17e8urGC$8Vi{P97y)I(##4 TNSPowqEJB`W@ZH~MV$WumRr9? delta 23826 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

^iJa`nVSif)OJPZR8 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 diff --git a/docs/manual/_sources/understanding.rst.txt b/docs/manual/_sources/understanding.rst.txt index 696ee0b..d584d64 100644 --- a/docs/manual/_sources/understanding.rst.txt +++ b/docs/manual/_sources/understanding.rst.txt @@ -131,12 +131,13 @@ bits, ensuring the Reticulum address space could potentially support galactic-sc This is obviously complete and ridiculous over-allocation, and as such, the current 128 bits should be sufficient, even far into the future. -By default Reticulum encrypts all data using elliptic curve cryptography. Any packet sent to a -destination is encrypted with a derived ephemeral key. Reticulum can also set up an encrypted +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 -*Forward Secrecy* and *Initiator Anonymity*, by using an Elliptic Curve Diffie Hellman key exchange -on Curve25519 to derive ephemeral keys. The multi-hop transport, coordination, verification -and reliability layers are fully autonomous and also based on elliptic curve cryptography. +*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. Reticulum also offers symmetric key encryption for group-oriented communications, as well as unencrypted packets for local broadcast purposes. @@ -442,8 +443,7 @@ For exchanges of small amounts of information, Reticulum offers the *Packet* API * | When the destination receives the packet, it can itself perform an ECDH key exchange and decrypt the packet. -* | A new ephemeral key is used for every packet sent in this way, and forward secrecy is guaranteed on a - per packet level. +* | A new ephemeral key is used for every packet sent in this way. * | Once the packet has been received and decrypted by the addressed destination, that destination can opt to *prove* its receipt of the packet. It does this by calculating the SHA-256 hash of the received packet, @@ -453,7 +453,7 @@ For exchanges of small amounts of information, Reticulum offers the *Packet* API * | In case the packet is addressed to a *group* destination type, the packet will be encrypted with the pre-shared AES-128 key associated with the destination. In case the packet is addressed to a *plain* - destination type, the payload data will not be encrypted. Neither of these two destination types offer + destination type, the payload data will not be encrypted. Neither of these two destination types can offer forward secrecy. In general, it is recommended to always use the *single* destination type, unless it is strictly necessary to use one of the others. diff --git a/docs/manual/reference.html b/docs/manual/reference.html index 127ff0f..d86fead 100644 --- a/docs/manual/reference.html +++ b/docs/manual/reference.html @@ -685,9 +685,12 @@ over a Reticulum network. Packets to will automatically be encrypted if they are adressed to a RNS.Destination.SINGLE destination, RNS.Destination.GROUP destination or a RNS.Link.

For RNS.Destination.GROUP destinations, Reticulum will use the -pre-shared key configured for the destination.

-

For RNS.Destination.SINGLE destinations and RNS.Link -destinations, reticulum will use ephemeral keys, and offers Forward Secrecy.

+pre-shared key configured for the destination. All packets to group +destinations are encrypted with the same AES-128 key.

+

For RNS.Destination.SINGLE destinations, Reticulum will use a newly +derived ephemeral AES-128 key for every packet.

+

For RNS.Link destinations, Reticulum will use per-link +ephemeral keys, and offers Forward Secrecy.

Parameters:
    diff --git a/docs/manual/searchindex.js b/docs/manual/searchindex.js index 5236b93..91e0465 100644 --- a/docs/manual/searchindex.js +++ b/docs/manual/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["examples", "gettingstartedfast", "hardware", "index", "interfaces", "networks", "reference", "support", "understanding", "using", "whatis"], "filenames": ["examples.rst", "gettingstartedfast.rst", "hardware.rst", "index.rst", "interfaces.rst", "networks.rst", "reference.rst", "support.rst", "understanding.rst", "using.rst", "whatis.rst"], "titles": ["Code Examples", "Getting Started Fast", "Communications Hardware", "Reticulum Network Stack Manual", "Supported Interfaces", "Building Networks", "API Reference", "Support Reticulum", "Understanding Reticulum", "Using Reticulum on Your System", "What is Reticulum?"], "terms": {"A": [0, 1, 4, 5, 6, 8, 9, 10], "number": [0, 1, 4, 5, 6, 8, 9], "ar": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10], "includ": [0, 2, 3, 4, 6, 8], "sourc": [0, 1, 2, 5, 8, 10], "distribut": [0, 1, 5, 6, 8, 9], "reticulum": [0, 4, 5], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "us": [0, 2, 3, 4, 5, 6, 8], "learn": [0, 1, 7, 8], "how": [0, 1, 2, 4, 5, 8, 10], "write": [0, 1, 4, 6, 8], "your": [0, 1, 2, 3, 4, 5, 7, 8, 10], "own": [0, 1, 5, 6, 8, 9], "program": [0, 3, 4, 6, 8, 10], "The": [0, 1, 2, 3, 4, 5, 6, 10], "demonstr": [0, 4], "bare": 0, "minimum": [0, 4, 5, 8], "setup": [0, 1, 3, 4], "requir": [0, 1, 4, 5, 8, 9, 10], "connect": [0, 2, 3, 4, 5, 6, 8, 9, 10], "network": [0, 2, 4, 6, 8, 9, 10], "from": [0, 1, 2, 4, 5, 6, 8, 9, 10], "In": [0, 1, 2, 4, 5, 6, 8, 9, 10], "about": [0, 1, 2, 4, 5, 6, 8], "five": 0, "line": [0, 1, 2, 4, 5, 8, 10], "have": [0, 1, 2, 4, 5, 6, 8, 9], "stack": [0, 1, 5, 8, 9, 10], "initialis": [0, 6, 9], "readi": [0, 1, 2, 4, 5, 6, 10], "pass": [0, 2, 4, 5, 6, 8, 9], "traffic": [0, 1, 4, 5, 6, 8, 9], "thi": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], "rn": [0, 1, 6, 8, 9], "start": [0, 2, 3, 4, 6, 8, 9], "up": [0, 1, 2, 4, 5, 8, 9, 10], "gener": [0, 1, 2, 4, 5, 6, 8, 9, 10], "new": [0, 4, 5, 6, 8, 9], "destin": [0, 1, 3, 4, 5, 9], "let": [0, 1, 4, 5, 8, 9], "user": [0, 1, 4, 5, 8, 9], "send": [0, 4, 6, 8, 9], "an": [0, 1, 2, 4, 5, 6, 8, 9, 10], "import": [0, 1, 2, 4, 5, 7, 8], "argpars": 0, "": [0, 1, 4, 5, 8, 9, 10], "defin": [0, 4, 8, 9], "app": [0, 1, 6, 8], "name": [0, 3, 4, 5, 6], "we": [0, 1, 2, 4, 7, 8], "ll": [0, 1, 10], "all": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "creat": [0, 3, 4, 5, 6, 8, 9, 10], "sinc": [0, 1, 4, 5, 6, 8], "basic": [0, 1, 3, 6, 9], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "part": [0, 4, 5, 6, 8], "rang": [0, 1, 2, 4, 5, 8, 9, 10], "util": [0, 2, 3, 4, 8], "put": [0, 2, 4], "them": [0, 1, 2, 4, 5, 7, 8, 9], "within": [0, 1, 4, 5, 6, 8], "namespac": 0, "example_util": [0, 9], "app_nam": [0, 6], "execut": [0, 1, 4, 6, 9], "when": [0, 1, 2, 4, 5, 6, 8, 9], "def": 0, "program_setup": 0, "configpath": 0, "must": [0, 1, 4, 5, 6, 8], "first": [0, 1, 4, 6, 8, 9], "randomli": [0, 8], "ident": [0, 1, 3, 9, 10], "our": [0, 8], "just": [0, 1, 2, 4, 5, 8, 10], "endpoint": [0, 5, 6, 8], "address": [0, 1, 4, 5, 6, 8, 10], "commun": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10], "also": [0, 1, 2, 4, 5, 6, 8, 9, 10], "exist": [0, 1, 2, 4, 8, 9, 10], "which": [0, 1, 4, 5, 6, 8, 9], "know": [0, 1, 2, 5, 6, 8], "thei": [0, 1, 4, 5, 6, 8, 9], "reachabl": [0, 1, 4, 5, 6, 8, 9], "autoomat": 0, "path": [0, 1, 2, 4, 6, 8, 9], "anywher": [0, 4], "els": [0, 5, 8], "IN": [0, 6], "singl": [0, 4, 6, 8, 9, 10], "minimalsampl": 0, "configur": [0, 1, 2, 3, 4, 5, 6, 8, 10], "automat": [0, 1, 2, 4, 5, 6, 8, 9, 10], "prove": [0, 8], "packet": [0, 1, 2, 3, 4, 5, 9, 10], "adress": [0, 6], "By": [0, 1, 4, 6, 8, 9], "do": [0, 1, 2, 4, 6, 8, 10], "proof": [0, 6, 8, 9], "each": [0, 1, 4, 5, 8, 9], "incom": [0, 4, 6, 9], "transmit": [0, 4, 8], "back": [0, 4, 8, 10], "sender": [0, 1, 5, 8, 9], "anyon": [0, 1, 2, 5, 6, 8, 9], "tri": 0, "whether": [0, 4, 6, 8], "wa": [0, 2, 4, 5, 6, 8, 10], "receiv": [0, 1, 4, 6, 8, 9], "correctli": 0, "set_proof_strategi": [0, 6], "prove_al": [0, 6], "everyth": [0, 5, 8], "hand": [0, 1], "over": [0, 2, 3, 4, 6, 8, 9, 10], "control": [0, 1, 2, 3, 5, 6, 8], "loop": 0, "announceloop": 0, "log": [0, 4, 9], "prettyhexrep": 0, "hash": [0, 1, 6, 8, 9], "run": [0, 1, 2, 4, 5, 6, 8, 9, 10], "hit": 0, "enter": [0, 9], "manual": [0, 1, 4, 5, 6, 9], "ctrl": 0, "c": [0, 5], "quit": 0, "until": [0, 4, 6], "exit": [0, 1, 6, 9], "If": [0, 1, 2, 4, 5, 6, 8, 9, 10], "server": [0, 1, 2, 3, 9], "client": [0, 1, 2, 3, 6], "messag": [0, 1, 6, 8, 9], "direct": [0, 1, 2, 5, 6, 8, 9], "toward": [0, 4, 8], "while": [0, 1, 2, 4, 5, 6, 8, 10], "true": [0, 4, 6, 9], "input": [0, 9], "sent": [0, 1, 6, 8, 9], "startup": 0, "get": [0, 2, 3, 4, 6, 10], "pars": 0, "desir": [0, 2, 4, 8], "mode": [0, 1, 2, 3, 8, 9, 10], "__name__": 0, "__main__": 0, "try": [0, 3, 4], "parser": 0, "argumentpars": 0, "descript": [0, 9], "add_argu": 0, "config": [0, 1, 2, 5, 9], "action": 0, "store": [0, 2, 8, 9], "default": [0, 1, 2, 4, 5, 6, 8, 9], "none": [0, 4, 6, 8, 9], "help": [0, 2, 5, 7, 8, 9, 10], "altern": [0, 4, 9], "directori": [0, 9], "type": [0, 1, 3, 4, 5, 6, 9], "str": 0, "arg": 0, "parse_arg": 0, "configarg": 0, "except": [0, 4], "keyboardinterrupt": 0, "print": [0, 4, 9], "found": [0, 1, 4, 5, 8, 9], "http": [0, 1, 7], "github": [0, 1, 7], "com": [0, 1, 7], "markqvist": [0, 1, 7], "blob": [0, 8], "master": [0, 6], "py": [0, 1, 8], "build": [0, 1, 2, 3, 4, 8, 10], "upon": [0, 8], "previou": 0, "explor": [0, 8, 10], "notif": [0, 6], "relev": [0, 2, 4, 6, 8, 9], "set": [0, 1, 2, 4, 5, 6, 8, 9, 10], "callback": [0, 6], "applic": [0, 4, 5, 6, 8, 9], "arriv": [0, 8], "random": [0, 6, 8], "two": [0, 1, 2, 4, 5, 8], "list": [0, 1, 2, 4, 6, 8, 10], "string": [0, 6], "app_data": [0, 6], "fruit": 0, "peach": 0, "quinc": 0, "date": [0, 1], "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, 1, 2, 5, 8, 10], "destination_1": 0, "destination_2": 0, "handler": [0, 6], "onli": [0, 1, 2, 4, 5, 6, 8, 9, 10], "ask": [0, 2, 6], "chang": [0, 1, 4, 6, 8, 9, 10], "filter": [0, 5, 8], "see": [0, 1, 4, 5, 6, 8, 9, 10], "what": [0, 1, 3, 6, 8], "happen": [0, 6, 8], "announce_handl": 0, "exampleannouncehandl": 0, "aspect_filt": [0, 6], "regist": [0, 6], "transport": [0, 1, 3, 4, 5, 9, 10], "register_announce_handl": [0, 6], "select": [0, 4], "randint": 0, "0": [0, 4, 6, 8, 9, 10], "len": 0, "1": [0, 4, 6, 8, 9], "data": [0, 1, 3, 4, 5, 6, 8, 10], "encod": 0, "utf": 0, "8": [0, 4, 9], "nobl": 0, "ga": 0, "noble_ga": 0, "need": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], "class": [0, 3, 5, 10], "method": [0, 1, 4, 6, 8], "take": [0, 1, 4, 8, 9, 10], "option": [0, 1, 2, 3, 5, 6, 8, 9], "argument": [0, 6, 9], "instanc": [0, 3, 4, 6, 8, 9], "some": [0, 1, 2, 4, 5, 8, 9], "want": [0, 1, 2, 4, 5, 8, 9, 10], "aspect": [0, 2, 4, 6, 8], "__init__": 0, "self": [0, 5, 10], "call": [0, 5, 6, 8, 10], "system": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "match": [0, 4, 8], "specif": [0, 2, 3, 4, 6, 10], "cannot": [0, 1], "wildcard": 0, "received_announc": [0, 6], "destination_hash": [0, 6, 9], "announced_ident": [0, 6], "contain": [0, 5, 6, 8, 9], "follow": [0, 1, 2, 4, 7, 8, 9, 10], "decod": 0, "plaintext": [0, 6], "unencrypt": [0, 6, 8], "inform": [0, 1, 3, 4, 5, 6, 8, 9], "ani": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10], "listen": [0, 4, 8, 9], "sy": 0, "channel": [0, 4, 5, 7, 8, 10], "did": 0, "one": [0, 1, 2, 4, 5, 6, 8, 9, 10], "public_inform": 0, "ad": [0, 2, 3, 4, 5, 6, 8, 10], "so": [0, 1, 2, 4, 5, 6, 7, 8, 10], "differ": [0, 1, 2, 4, 5, 6, 8, 9, 10], "plain": [0, 4, 6, 8], "uncencrypt": 0, "broadcast_destin": 0, "specifi": [0, 1, 2, 4, 5, 6, 9], "everi": [0, 4, 5, 6, 8], "time": [0, 1, 2, 4, 5, 6, 8, 9], "set_packet_callback": [0, 6], "packet_callback": 0, "main": 0, "broadcastloop": 0, "simpli": [0, 1, 2, 4, 5, 8, 9], "out": [0, 1, 2, 4, 5, 6, 8, 9, 10], "r": [0, 4, 8, 9], "n": [0, 8, 9], "end": [0, 4, 5, 6, 8, 10], "stdout": [0, 4, 9], "flush": 0, "text": [0, 1, 5, 8], "prompt": 0, "channelarg": 0, "between": [0, 4, 5, 6, 8], "interfac": [0, 2, 3, 5, 6, 9], "simpl": [0, 2, 8, 9, 10], "respond": [0, 6], "receipt": [0, 3, 8], "choos": [0, 1, 4, 8], "global": [0, 1, 4, 5, 8, 10], "server_ident": 0, "queri": [0, 1, 6], "abl": [0, 1, 4, 5, 6, 8, 9], "verifi": [0, 6, 8], "repli": [0, 9], "encrypt": [0, 1, 5, 6, 8, 10], "wai": [0, 1, 4, 5, 8], "certain": [0, 4, 5, 7, 8], "than": [0, 1, 4, 5, 8], "read": [0, 1, 4, 8, 9], "echo_destin": 0, "tell": [0, 4], "function": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10], "server_callback": 0, "wait": [0, 4, 8, 9], "go": [0, 1, 4, 8], "handl": [0, 2, 4, 5, 6, 8, 9, 10], "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, "dbm": [0, 4], "snr": 0, "db": 0, "destination_hexhash": 0, "timeout": [0, 6, 9], "binari": [0, 1, 8], "represent": 0, "command": [0, 1, 4, 9], "dest_len": 0, "truncated_hashlength": [0, 6], "2": [0, 4, 6, 8, 9], "rais": [0, 6], "valueerror": [0, 6], "length": [0, 4, 6, 8], "invalid": [0, 6], "hex": 0, "hexadecim": [0, 8, 9], "charact": 0, "byte": [0, 6, 8, 9, 10], "format": [0, 3, 10], "fromhex": 0, "e": [0, 5], "check": [0, 1, 6, 8], "overrid": 0, "loglevel": [0, 6, 9], "provid": [0, 1, 2, 3, 4, 5, 6, 8, 10], "feedback": [0, 3], "log_info": 0, "doe": [0, 1, 2, 3, 4, 5, 6, 8, 9], "load": [0, 1, 6, 9], "has_path": [0, 6], "To": [0, 1, 2, 4, 5, 8, 9, 10], "public": [0, 3, 4, 6], "kei": [0, 3, 5, 6, 10], "done": [0, 1, 4, 5, 8, 9], "recal": [0, 6], "modul": [0, 1, 2, 8, 9, 10], "known": [0, 6, 8, 9], "return": [0, 6, 9], "outgo": [0, 4, 6, 8, 9], "got": 0, "correct": [0, 8], "convent": 0, "request_destin": 0, "add": [0, 1, 4, 5, 9], "echo_request": 0, "get_random_hash": [0, 6], "successfulli": [0, 8], "packetreceipt": [0, 6], "packet_receipt": [0, 6], "set_timeout": [0, 6], "set_timeout_callback": [0, 6], "packet_timed_out": 0, "deliveri": [0, 1, 6, 10], "set_delivery_callback": [0, 6], "packet_deliv": 0, "yet": [0, 4, 8], "request_path": [0, 6], "statu": [0, 1, 3, 4, 6, 8, 9], "deliv": [0, 6], "rtt": [0, 6, 8], "get_rtt": [0, 6], "round": [0, 6, 9], "3": [0, 4, 8, 9, 10], "rttstring": 0, "second": [0, 4, 6, 8, 9, 10], "1000": 0, "millisecond": [0, 9], "proof_packet": 0, "valid": [0, 4, 6, 8, 9], "trip": [0, 6, 9], "fail": [0, 6], "store_tru": 0, "t": [0, 1, 4, 5, 6, 9], "metavar": 0, "float": [0, 6], "narg": 0, "timeoutarg": 0, "print_help": 0, "establish": [0, 1, 4, 5, 6, 10], "remot": [0, 6, 9], "forth": 0, "o": [0, 8, 9, 10], "refer": [0, 1, 3], "latest": [0, 1, 4], "latest_client_link": 0, "server_destin": 0, "linkexampl": 0, "set_link_established_callback": [0, 6], "client_connect": 0, "server_loop": 0, "set_link_closed_callback": [0, 6], "client_disconnect": 0, "server_packet_receiv": 0, "disconnect": 0, "activ": [0, 1, 4, 6, 8], "last": [0, 4, 6], "reply_text": 0, "reply_data": 0, "server_link": 0, "sleep": [0, 9], "begin": [0, 2, 6], "And": 0, "client_packet_receiv": 0, "close": [0, 5, 6, 9], "link_establish": 0, "link_clos": 0, "interact": [0, 1, 6, 8, 9], "client_loop": 0, "becom": [0, 1, 5, 8], "should_quit": 0, "fals": [0, 4, 6, 9], "should": [0, 1, 2, 4, 5, 6, 8, 9, 10], "q": [0, 9], "teardown": [0, 6], "mdu": 0, "size": [0, 1, 4, 6, 8, 9], "exce": [0, 4, 6], "log_error": 0, "error": [0, 1, 7, 9], "ha": [0, 1, 2, 4, 5, 6, 8, 10], "been": [0, 1, 2, 4, 5, 6, 8, 10], "later": [0, 1, 4], "teardown_reason": 0, "now": [0, 1, 5, 8, 9], "elif": 0, "destination_clos": 0, "exit_handl": 0, "5": [0, 4, 6, 9], "_exit": 0, "identifi": [0, 4, 6, 8, 9], "intiat": 0, "onc": [0, 1, 2, 4, 5, 6, 8, 9, 10], "initi": [0, 5, 6, 8, 10], "peer": [0, 1, 4, 6, 8, 9], "identifyexampl": 0, "set_remote_identified_callback": [0, 6], "remote_identifi": 0, "origin": [0, 5, 8], "displai": [0, 8], "remote_p": 0, "unidentifi": 0, "get_remote_ident": [0, 6], "client_ident": 0, "sendig": 0, "perform": [0, 1, 4, 5, 8], "random_text_gener": 0, "request_id": [0, 6], "remote_ident": [0, 6], "requested_at": [0, 6], "look": [0, 1, 4, 8, 9], "On": [0, 1, 4, 9], "full": [0, 4, 6, 8, 9, 10], "moon": 0, "becki": 0, "upset": 0, "stai": [0, 8, 9], "awai": [0, 4, 5, 8, 9], "pet": 0, "shop": 0, "stock": 0, "requestexampl": 0, "register_request_handl": [0, 6], "response_gener": [0, 6], "allow": [0, 1, 2, 4, 5, 6, 8, 9, 10], "allow_al": [0, 6], "response_callback": [0, 6], "got_respons": 0, "failed_callback": [0, 6], "request_fail": 0, "request_receipt": [0, 6], "request_receiv": 0, "implement": [0, 4, 5, 6, 7, 8, 10], "file": [0, 1, 2, 4, 5, 6, 8, 9, 10], "download": [0, 4, 9], "resourc": [0, 1, 3, 7], "effici": [0, 1, 4, 8, 10], "serv": [0, 2, 4, 5, 8, 9], "pleas": [0, 1, 4, 6, 9, 10], "note": [0, 1, 2, 4, 6, 8, 9], "larg": [0, 2, 4, 5, 6, 8, 10], "transfer": [0, 6, 8, 9, 10], "recommend": [0, 1, 2, 8], "compress": [0, 6, 8], "hashmap": 0, "sequenc": [0, 6, 8, 10], "long": [0, 1, 2, 4, 8], "slow": [0, 4, 8], "cpu": [0, 8], "probabl": [0, 5, 8, 9, 10], "result": [0, 8, 9], "befor": [0, 1, 4, 6, 8, 9], "complet": [0, 1, 2, 4, 5, 6, 8, 9, 10], "prepar": [0, 5], "bundl": 0, "instead": [0, 1, 4, 8, 9], "slice": 0, "chunk": 0, "suitabl": [0, 1, 4, 5, 8, 10], "pack": 0, "thread": 0, "vendor": [0, 2], "umsgpack": 0, "app_timeout": 0, "45": [0, 8], "serve_path": 0, "here": [0, 1, 2, 4, 8, 9], "conveni": 0, "list_fil": 0, "entri": [0, 1, 8], "actual": [0, 1, 4, 8], "listdir": 0, "isfil": 0, "join": [0, 1, 5, 7, 8], "host": [0, 1, 4, 8, 9], "still": [0, 1, 2, 5, 8], "isdir": 0, "packb": 0, "fit": 0, "list_packet": 0, "list_receipt": 0, "list_deliv": 0, "list_timeout": 0, "too": [0, 5], "mani": [0, 1, 2, 4, 5, 6, 8, 9, 10], "split": 0, "filelist": 0, "multipl": [0, 4, 5, 8, 9], "hint": 0, "alreadi": [0, 1, 2, 5, 8, 9], "support": [0, 1, 3, 5, 8, 10], "after": [0, 4, 5, 6, 8, 9], "re": [0, 4, 6, 8], "keep": [0, 5, 6, 8, 9, 10], "open": [0, 2, 4, 5, 6, 7, 8, 9, 10], "client_request": 0, "longer": [0, 5, 8, 9], "filenam": 0, "rb": 0, "file_resourc": 0, "resource_sending_conclud": 0, "somethign": 0, "went": 0, "wrong": [0, 4], "don": [0, 1, 2, 5, 6, 9], "unknown": [0, 4, 6, 8], "conclud": [0, 6], "hasattr": 0, "avail": [0, 1, 2, 4, 5, 6, 8, 9, 10], "server_fil": 0, "current": [0, 1, 2, 3, 4, 6, 8], "current_download": 0, "current_filenam": 0, "variabl": 0, "statist": [0, 4, 7], "download_start": 0, "download_finish": 0, "download_tim": 0, "transfer_s": 0, "file_s": 0, "expect": [0, 4, 6, 8, 9], "normal": [0, 4, 6], "accordingli": 0, "filelist_receiv": 0, "advertis": [0, 6], "set_resource_strategi": [0, 6], "accept_al": [0, 6], "set_resource_started_callback": [0, 6], "download_began": 0, "set_resource_concluded_callback": [0, 6], "download_conclud": 0, "menu": 0, "menu_mod": 0, "down": [0, 2, 4, 6], "request_packet": 0, "create_receipt": [0, 6], "print_menu": 0, "25": [0, 3, 10], "user_input": 0, "int": 0, "screen": 0, "variou": [0, 1, 4, 5, 8], "state": 0, "It": [0, 1, 2, 4, 6, 8, 9, 10], "uninterest": 0, "won": 0, "detail": [0, 1, 3, 4, 6, 9, 10], "clear_screen": 0, "print_filelist": 0, "percent": 0, "get_progress": [0, 6], "100": [0, 4, 8], "rprogress": 0, "save_error": 0, "could": [0, 1, 4, 5, 6, 8, 10], "disk": [0, 6], "hour": [0, 4], "rem": 0, "divmod": 0, "3600": [0, 4], "minut": [0, 1, 4, 8], "60": 0, "timestr": 0, "05": 0, "2f": 0, "ttime": 0, "taken": [0, 8], "tfile": 0, "size_str": 0, "tdata": 0, "teffect": 0, "rate": [0, 3, 9], "suffix": 0, "b": [0, 5, 9], "ttransfer": 0, "press": 0, "index": [0, 1, 3], "enumer": 0, "filelist_data": 0, "unpack": 0, "extend": [0, 1, 6], "local": [0, 1, 4, 5, 6, 8, 9, 10], "unpackb": 0, "append": [0, 8], "visibl": 0, "updat": [0, 1, 6, 8], "small": [0, 4, 5, 8, 10], "job": 0, "potenti": [0, 4, 7, 8, 9], "target": [0, 4, 9], "filelist_timeout_job": 0, "setdaemon": 0, "detect": 0, "shown": 0, "progress": [0, 6, 10], "total_s": 0, "saved_filenam": 0, "counter": 0, "wb": 0, "human": [0, 6, 7, 8], "readabl": [0, 6, 8], "num": 0, "unit": [0, 1, 9], "ki": 0, "mi": 0, "gi": 0, "ti": [0, 8], "pi": [0, 5, 8, 9, 10], "ei": 0, "zi": 0, "last_unit": 0, "yi": 0, "k": 0, "m": [0, 1, 8, 9], "g": 0, "p": [0, 9], "z": 0, "y": 0, "ab": 0, "1024": 0, "clear": [0, 6, 8], "cl": 0, "nt": 0, "dir": 0, "best": [1, 8, 10], "depend": [1, 2, 5, 6, 8, 9], "guid": [1, 2, 6, 8], "outlin": [1, 2, 8], "sensibl": [1, 2], "scenario": [1, 3, 8], "built": [1, 4, 8, 10], "few": [1, 2, 4, 5, 8, 9, 10], "other": [1, 2, 4, 5, 6, 8, 9], "even": [1, 2, 4, 5, 8, 9, 10], "extrem": [1, 8, 9, 10], "low": [1, 2, 4, 5, 8, 10], "bandwidth": [1, 4, 5, 6, 8, 10], "These": [1, 4, 8, 9], "feel": 1, "work": [1, 2, 4, 5, 8, 9, 10], "design": [1, 2, 5, 8, 10], "well": [1, 2, 4, 5, 6, 8, 10], "lora": [1, 2, 3, 8, 10], "wifi": [1, 3, 4, 5, 8, 9, 10], "wire": [1, 2, 3, 4, 10], "ethernet": [1, 2, 4, 5, 8, 10], "combin": [1, 3, 5, 8], "As": [1, 2, 4, 5, 6, 8, 10], "easi": [1, 2, 4, 8, 9, 10], "experi": [1, 8], "without": [1, 2, 5, 8, 10], "transceiv": [1, 2, 4, 8, 10], "infrastructur": [1, 2, 4, 5, 8, 9], "launch": [1, 9], "separ": [1, 4, 5, 8, 9], "devic": [1, 2, 3, 4, 5, 6, 8, 9], "same": [1, 2, 4, 5, 6, 8, 9], "enough": [1, 2, 8], "physic": [1, 2, 4, 8, 9], "termin": [1, 6], "suit": [1, 2, 8, 9], "featur": [1, 7, 8, 10], "both": [1, 2, 4, 5, 6, 8, 9, 10], "delai": [1, 4, 8, 9], "offlin": 1, "share": [1, 5, 6, 8, 9], "browser": 1, "page": [1, 3, 8], "dynam": [1, 9], "render": 1, "authent": [1, 4, 5, 6, 8, 9, 10], "more": [1, 2, 4, 5, 6, 8, 9, 10], "face": [1, 4], "protocol": [1, 2, 3, 4, 10], "lxmf": 1, "anoth": [1, 6, 8, 9], "project": 1, "instal": [1, 3, 4, 5, 8, 9, 10], "via": [1, 2, 4, 7, 8, 9, 10], "pip": [1, 2, 9], "pip3": [1, 2, 9], "nomadnet": 1, "veri": [1, 2, 4, 5, 6, 7, 8, 9, 10], "might": [1, 4, 5, 8, 9], "reboot": 1, "similar": [1, 2, 4, 5, 9, 10], "again": [1, 4, 8, 9], "would": [1, 4, 5, 6, 8], "rather": 1, "graphic": 1, "linux": [1, 8], "maco": 1, "earli": [1, 2], "stage": [1, 8], "interoper": [1, 2, 5, 8, 10], "come": [1, 8], "make": [1, 2, 4, 7, 8, 9], "easier": [1, 4, 5, 9], "manag": [1, 5, 6, 8, 9], "rnsd": [1, 3], "background": [1, 4], "foreground": 1, "servic": [1, 3, 5], "rnstatu": [1, 3, 4, 8], "rnpath": [1, 3, 4], "rnprobe": [1, 3], "view": [1, 4, 8, 9], "chapter": [1, 2, 4, 5, 8, 9, 10], "locat": [1, 2, 5, 8, 9], "edit": [1, 9], "rnsconfig": 1, "broadcast": [1, 3, 4, 6, 8], "domain": [1, 4], "further": [1, 3, 4], "exampl": [1, 2, 3, 4, 6, 8, 9, 10], "tcp": [1, 2, 3, 5, 8, 10], "There": [1, 5, 8, 10], "subnet": [1, 5], "rout": [1, 4, 5, 6, 8, 9, 10], "tabl": [1, 4, 5, 8, 9], "thing": 1, "discov": [1, 4], "topographi": [1, 5, 8], "situat": [1, 2, 4, 5, 8], "where": [1, 2, 3, 4, 5, 6, 8, 9], "utilis": [1, 5, 9, 10], "extern": [1, 4, 6, 10], "often": [1, 4, 5, 8, 9], "suffici": [1, 4, 8, 9], "act": [1, 6, 8, 9], "gatewai": [1, 4, 5, 8], "enabl": [1, 2, 4, 5, 6, 8, 9], "wider": [1, 4, 8, 9], "autointerfac": [1, 2, 4, 9], "possibli": 1, "offer": [1, 3, 4, 6, 8], "i2p": [1, 3, 10], "carefulli": 1, "tcpserverinterfac": [1, 4], "access": [1, 3, 4, 5, 6, 9], "ip": [1, 2, 4, 8, 9, 10], "faster": [1, 4, 8], "lower": [1, 4, 9], "latenc": [1, 8, 10], "energi": 1, "i2pinterfac": [1, 4], "howev": [1, 5, 8], "leak": 1, "reveal": [1, 6, 8, 10], "who": [1, 8], "inspect": [1, 4, 5, 8], "someon": [1, 4], "determin": [1, 6, 8], "adversari": 1, "mai": [1, 4, 6, 8, 9], "record": [1, 8], "metadata": 1, "like": [1, 2, 4, 5, 6, 8, 9, 10], "transmiss": [1, 4, 6, 8], "though": [1, 2, 4, 8], "publicli": 1, "most": [1, 2, 4, 5, 8, 9], "anymor": 1, "through": [1, 2, 4, 5, 6, 8, 9, 10], "invis": [1, 4], "daemon": [1, 4, 6, 9], "parallel": 1, "For": [1, 2, 4, 5, 6, 8, 10], "alwai": [1, 4, 6, 8, 9], "node": [1, 3, 4, 5, 9, 10], "i2pd": [1, 4], "mix": [1, 4, 5, 9], "hide": 1, "relai": 1, "extra": [1, 4, 5, 9], "comput": [1, 8, 10], "power": [1, 2, 4, 8], "attack": 1, "form": [1, 4, 5, 6, 8], "deep": 1, "much": [1, 4, 5, 8, 9], "difficult": [1, 2], "non": [1, 6, 8], "behind": [1, 8], "firewal": [1, 4], "nat": 1, "preserv": [1, 6], "anonym": [1, 5, 6, 8, 10], "care": [1, 2, 6, 10], "slightli": 1, "experiment": [1, 2, 10], "made": [1, 6, 8], "dublin": 1, "hub": [1, 4], "tcpclientinterfac": [1, 2, 4], "ye": [1, 4, 8, 9], "target_host": [1, 4], "target_port": [1, 4], "4965": [1, 9], "frankfurt": [1, 9], "5377": 1, "uxg5kubabakh3jtnvsipingbr5574dle7bubvip7llfvwx2tgrua": 1, "b32": [1, 4], "point": [1, 2, 4, 5, 8, 9], "absolut": [1, 2, 7, 10], "usag": [1, 3, 4, 7, 9], "occasion": 1, "test": [1, 2, 8], "failur": [1, 4], "guarante": [1, 8], "compat": [1, 2, 4, 6, 8], "hardwar": [1, 3, 4, 5, 6, 8, 9, 10], "wide": [1, 2, 4, 8, 10], "section": [1, 2, 4, 5, 8, 9], "easili": [1, 4, 5, 8, 9, 10], "cheapli": 1, "rnode": [1, 3, 8, 9, 10], "purpos": [1, 2, 4, 6, 8], "digit": [1, 2, 8, 10], "integr": [1, 5, 8], "yourself": [1, 8, 10], "custom": [1, 4, 6, 8, 10], "firmwar": [1, 2, 8], "board": [1, 3, 8, 10], "auto": [1, 2, 3, 6, 8], "script": [1, 2], "prefer": [1, 8], "purchas": [1, 5, 8, 10], "supplier": [1, 3], "addit": [1, 2, 4, 8, 9, 10], "privat": [1, 4, 6, 7, 8, 10], "secur": [1, 8, 10], "uncensor": 1, "mesh": [1, 4, 5, 10], "think": 1, "welcom": 1, "head": 1, "discuss": [1, 2, 8], "propos": 1, "easiest": [1, 2, 4, 8], "releas": [1, 2, 4, 8], "abov": [1, 2, 4, 8, 9], "next": [1, 5, 6, 8], "step": [1, 2], "pyseri": 1, "netifac": 1, "api": [1, 3, 8, 10], "associ": [1, 6, 8], "case": [1, 2, 4, 5, 8, 9], "recip": 1, "cryptographi": [1, 8, 10], "clone": 1, "repositori": [1, 7, 8], "git": 1, "move": [1, 4, 8], "folder": 1, "symlink": [1, 9], "librari": 1, "cd": 1, "ln": [1, 9], "python3": [1, 2], "echo": [1, 3, 9], "unless": [1, 4, 6, 8], "ve": 1, "immedi": [1, 4, 9], "necessari": [1, 2, 4, 5, 6, 8], "nano": 1, "repeat": 1, "process": [1, 2, 4, 6, 8], "h": [1, 9], "ping": [1, 9], "replac": [1, 8, 9], "below": [1, 2, 4, 9], "3e12fc71692f8ec47bc5": 1, "filetransf": [1, 3, 6], "understand": [1, 3, 9], "architectur": 1, "precompil": 1, "dev": [1, 4, 9], "packag": [1, 4, 8], "sudo": [1, 9], "apt": 1, "relat": 1, "termux": 1, "f": 1, "droid": 1, "emul": 1, "environ": [1, 5, 8], "abil": [1, 2], "io": [1, 2, 9], "pre": [1, 2, 6, 8], "wheel": 1, "standard": [1, 2, 8], "sure": [1, 2, 9], "pkg": 1, "upgrad": [1, 8], "Then": 1, "essenti": [1, 4, 8], "openssl": [1, 8], "libffi": 1, "rust": 1, "platform": [1, 2, 8], "compil": 1, "export": 1, "cargo_build_target": 1, "aarch64": 1, "sever": [1, 5, 6, 9], "succe": 1, "softwar": [1, 2, 4, 8, 10], "possibl": [1, 2, 4, 5, 6, 8, 10], "apk": 1, "tutori": 1, "code": [1, 2, 3, 4, 9], "rare": [1, 4], "obscur": 1, "unusu": 1, "rnspure": 1, "content": [1, 5, 9], "No": [1, 4, 8, 9, 10], "matter": [1, 4], "perfectli": 1, "serial": [1, 2, 3, 8, 10], "pyca": [1, 8], "cryptograph": [1, 3, 5, 10], "primit": [1, 3], "One": [2, 6], "truli": [2, 8], "valuabl": [2, 7], "almost": [2, 4, 8, 9], "conceiv": 2, "kind": [2, 4, 5, 8], "medium": [2, 4, 5, 6, 8, 10], "flexibl": [2, 4, 10], "cover": [2, 8, 10], "wireless": [2, 5], "decad": 2, "old": [2, 7, 8], "radio": [2, 3, 4, 5, 6, 8, 9, 10], "modem": [2, 4, 5, 6, 8, 10], "modern": [2, 8], "millimet": 2, "wave": 2, "backhaul": [2, 5], "oper": [2, 4, 5, 6, 8, 9, 10], "good": [2, 5, 8, 9], "chanc": 2, "box": 2, "glue": 2, "littl": [2, 8], "effort": 2, "pipeinterfac": [2, 4], "kiss": [2, 3, 9, 10], "simplyequip": 2, "broad": 2, "abund": 2, "sometim": 2, "especi": [2, 4], "scratch": 2, "real": [2, 5, 10], "world": [2, 5, 10], "minim": [2, 3, 8], "cost": [2, 8, 10], "fundament": [2, 8], "categori": 2, "emploi": [2, 8], "reliabl": [2, 4, 5, 8, 10], "commonli": 2, "either": [2, 4, 5, 8, 9], "expens": 2, "hard": 2, "hungri": 2, "attempt": [2, 6], "allevi": 2, "particular": 2, "plaform": 2, "its": [2, 4, 6, 8], "compon": [2, 7, 8], "frequenc": [2, 4, 8], "band": [2, 8], "scheme": 2, "limit": [2, 5, 8], "common": [2, 3, 5, 8, 9, 10], "ism": [2, 8], "avoid": [2, 8, 9], "confus": [2, 8], "layer": [2, 4, 5, 8, 10], "noth": [2, 10], "lorawan": [2, 8], "central": [2, 5, 8], "iot": 2, "raw": 2, "overhead": [2, 4, 8], "high": [2, 4, 8, 10], "level": [2, 4, 8, 9], "directli": [2, 4, 6, 8, 9, 10], "replic": [2, 8], "across": [2, 5], "togeth": [2, 8, 9], "tool": [2, 8, 9, 10], "exact": [2, 4, 8], "explain": [2, 6], "approach": [2, 8, 9], "develop": [2, 3, 7, 8, 10], "boil": 2, "obtain": [2, 8], "autom": [2, 7, 8], "provis": 2, "rnodeinterfac": [2, 4, 9], "ic": 2, "semtech": 2, "sx1276": 2, "esp32": 2, "manufactur": 2, "avr": 2, "atmega1284p": 2, "rnodeconf": 2, "autoinstal": 2, "seri": 2, "question": [2, 4], "consid": [2, 6, 8, 10], "newest": [2, 8], "version": [2, 8, 9], "stabil": 2, "paramet": [2, 4, 5, 6, 8], "port": [2, 3, 4, 5, 8, 10], "air": [2, 10], "id": [2, 4, 6, 8, 9], "itself": [2, 3, 8], "touch": [2, 10], "produc": 2, "short": [2, 8, 9], "fulli": [2, 8, 10], "bridg": [2, 3], "behav": 2, "mean": [2, 4, 5, 8, 9], "link": [2, 3, 4, 5, 9, 10], "dhcp": [2, 4, 9], "dn": 2, "least": [2, 4, 8, 9, 10], "transpar": [2, 4, 8, 9], "capac": [2, 4, 6, 8], "distanc": [2, 8], "ubiqu": 2, "airmax": 2, "ltu": 2, "mikrotik": 2, "exhaust": [2, 8], "rel": [2, 8, 10], "cheap": [2, 8], "co": [2, 4, 10], "concurr": [2, 8, 9], "pattern": [2, 8], "gain": [2, 8], "antenna": 2, "backbon": 2, "area": [2, 4, 5, 8, 10], "aim": [3, 8], "particip": [3, 5, 8], "caveat": 3, "emptor": 3, "fast": [3, 4, 6, 8], "base": [3, 4, 5, 6, 8, 9, 10], "nomad": 3, "sideband": 3, "With": [3, 4, 5, 8, 9], "internet": [3, 4, 8, 10], "testnet": [3, 9], "arm64": 3, "android": 3, "pure": [3, 8], "python": [3, 8, 9, 10], "rncp": 3, "rnx": 3, "improv": [3, 4, 7], "fix": [3, 8], "motiv": 3, "goal": [3, 4], "introduct": 3, "announc": [3, 6, 9], "mechan": [3, 4], "reach": [3, 4, 5], "prioritis": [3, 4, 5, 6], "propag": [3, 4, 6], "rule": [3, 4], "udp": [3, 5, 8, 9, 10], "pipe": [3, 10], "ax": [3, 10], "concept": [3, 8, 9], "overview": [3, 4, 8], "interconnect": [3, 4, 8], "site": [3, 4], "growth": 3, "converg": [3, 8], "request": [3, 4, 8, 9], "identif": [3, 4, 10], "respons": [3, 6, 8], "donat": 3, "contribut": 3, "search": 3, "distinct": [4, 8], "topologi": [4, 8], "less": [4, 8, 10], "endless": 4, "describ": [4, 6, 8], "give": [4, 8, 9], "respect": 4, "discover": 4, "autoconfigur": [4, 10], "ipv6": [4, 9], "router": [4, 9], "sort": [4, 8], "switch": [4, 8], "os": 4, "interface_en": [4, 9], "isol": [4, 9], "lan": 4, "group": [4, 6, 8], "group_id": 4, "kernel": [4, 9, 10], "wlan0": 4, "eth1": 4, "Or": [4, 9, 10], "ignor": [4, 6, 8], "ones": [4, 9], "ignored_devic": 4, "tun0": 4, "eth0": 4, "multicast": 4, "autodiscov": 4, "discoveri": [4, 8, 9], "scope": 4, "admin": 4, "organis": [4, 5, 7], "custom_network_nam": 4, "discovery_scop": 4, "discovery_port": 4, "48555": 4, "data_port": 4, "49555": 4, "frequent": 4, "block": 4, "inbound": [4, 6], "portabl": [4, 8], "persist": [4, 9], "achiev": [4, 6, 8], "geti2p": 4, "net": 4, "websit": 4, "base32": 4, "comma": 4, "5urvjicpzi7q3ybztsef4i5ow2aq4soktfj7zedz53s47r54jnqq": 4, "output": [4, 9], "event": 4, "simplest": [4, 8], "tunnel": [4, 8, 10], "interchang": 4, "degre": 4, "retain": 4, "eas": [4, 8], "simpler": 4, "4242": 4, "listen_ip": 4, "listen_port": 4, "bind": 4, "10": [4, 8, 9], "88": 4, "i2p_tunnel": 4, "127": 4, "5001": 4, "dedic": [4, 8], "natur": 4, "toler": 4, "intermitt": 4, "gracefulli": 4, "restor": 4, "reappear": 4, "hostnam": 4, "expos": [4, 6], "soundmodem": 4, "kiss_fram": 4, "tnc": [4, 6, 9, 10], "8001": 4, "caution": 4, "frame": 4, "conjunct": 4, "never": [4, 6, 8], "disabl": [4, 8, 9], "intern": [4, 6, 8], "recoveri": 4, "greatli": 4, "unreli": 4, "implic": 4, "better": 4, "udpinterfac": 4, "forward_ip": 4, "255": 4, "forward_port": 4, "assum": [4, 8], "55": 4, "72": 4, "24": 4, "equival": 4, "forward": [4, 6, 8, 10], "segment": [4, 5, 6, 8, 10], "cours": [4, 8], "15": 4, "16": [4, 8, 9], "ttyusb0": [4, 9], "867": 4, "mhz": [4, 8], "867200000": 4, "125": 4, "khz": 4, "125000": 4, "tx": 4, "7": [4, 9], "mw": 4, "txpower": 4, "spread": 4, "factor": [4, 6], "12": 4, "being": [4, 6, 8], "fastest": [4, 8], "longest": 4, "spreadingfactor": 4, "throough": 4, "codingr": 4, "interv": [4, 6], "id_callsign": 4, "mycal": 4, "id_interv": 4, "600": 4, "homebrew": 4, "amount": [4, 5, 6, 8, 10], "ram": 4, "flow": [4, 5], "flow_control": 4, "pair": [4, 8], "laser": 4, "serialinterfac": 4, "baud": 4, "speed": [4, 8, 9], "115200": [4, 9], "databit": [4, 9], "pariti": [4, 9], "stopbit": [4, 9], "stdin": [4, 9], "virtual": [4, 5, 8, 9, 10], "netcat": 4, "l": [4, 9], "5757": 4, "respawn": 4, "respawn_delai": 4, "continu": [4, 7, 10], "scan": 4, "eof": 4, "respawn_interv": 4, "varieti": [4, 8, 9, 10], "openmodem": [4, 10], "period": [4, 6, 8], "beacon": 4, "station": 4, "kissinterfac": [4, 9], "ttyusb1": 4, "preambl": [4, 9], "150": [4, 9], "tail": 4, "txtail": [4, 9], "cdma": 4, "reason": [4, 8], "200": [4, 9], "slottim": [4, 9], "20": [4, 8, 9], "elaps": 4, "comment": [4, 9], "buffer": 4, "amateur": [4, 10], "spectrum": [4, 8], "encapsul": [4, 10], "callsign": 4, "ssid": 4, "realli": [4, 6], "doesn": 4, "anyth": [4, 8, 9, 10], "incur": 4, "ax25kissinterfac": 4, "no1cll": 4, "ttyusb2": 4, "150m": 4, "increas": [4, 9], "squelch": 4, "rx": 4, "turnaround": 4, "kept": [4, 5, 6, 8], "wast": 4, "airtim": 4, "behaviour": [4, 9], "bring": 4, "brought": [4, 9], "valu": [4, 6, 8], "access_point": 4, "shorthand": [4, 9], "ap": 4, "shorter": 4, "expiri": 4, "mostli": [4, 5, 8], "quiet": [4, 9], "momentarili": 4, "disappear": [4, 9], "network_nam": 4, "passphras": [4, 8], "alon": 4, "ifac_s": 4, "customis": 4, "carri": [4, 6, 8, 9], "512": [4, 6, 8], "bit": [4, 6, 8, 9, 10], "announce_cap": [4, 6], "maximum": [4, 6, 8], "alloc": [4, 6, 8, 9], "given": [4, 5, 6, 8, 9], "upkeep": 4, "cap": 4, "queue": [4, 8], "nearbi": 4, "ensur": [4, 6, 8], "overwhelm": [4, 6], "rapidli": 4, "spam": 4, "opposit": 4, "effect": 4, "excess": 4, "benefici": [4, 9], "balanc": 4, "necesarri": 4, "bitrat": 4, "report": [4, 7], "guess": 4, "per": [4, 6, 8, 10], "affect": 4, "strictli": [4, 8], "complex": [4, 8], "left": [4, 6, 8, 9], "gw": 4, "addition": 4, "behalf": 4, "resid": 4, "requestor": 4, "resolv": 4, "chain": 4, "along": [4, 5, 8], "boundari": 4, "remain": [4, 6, 8], "roam": 4, "mobil": [4, 8], "seen": [4, 8], "perspect": [4, 8], "vehicl": 4, "equip": [4, 5, 8], "side": [4, 10], "expir": 4, "significantli": 4, "impact": [4, 8], "announce_rate_target": 4, "announce_rate_grac": 4, "announce_rate_penalti": 4, "basi": [4, 6, 8, 9, 10], "moder": 4, "violat": 4, "enforc": 4, "penalti": 4, "7200": 4, "annouce_cap": 4, "mention": [4, 8], "strategi": [4, 6], "decis": [4, 8], "slower": [4, 6, 8], "hop": [4, 5, 6, 8, 9, 10], "right": [4, 5], "tend": 4, "conserv": 4, "span": [4, 8], "seamlessli": 4, "knowledg": [5, 8], "tradit": [5, 8], "worri": 5, "coordin": [5, 6, 8, 10], "entir": [5, 8, 9], "evolv": 5, "futur": [5, 8], "mind": [5, 10], "autonom": [5, 8], "terminologi": [5, 8], "rest": [5, 10], "billion": [5, 8], "larger": [5, 8], "higher": [5, 10], "issu": [5, 7], "discrimin": 5, "ephemer": [5, 6, 8, 10], "ellipt": [5, 6, 8, 10], "curv": [5, 6, 8, 10], "diffi": [5, 8, 10], "hellman": [5, 8, 10], "exchang": [5, 6, 8, 10], "curve25519": [5, 6, 8, 10], "throttl": 5, "thu": [5, 6, 8], "agnost": [5, 8], "equal": [5, 8], "keystor": 5, "degrad": 5, "term": [5, 8], "stationari": [5, 9], "candid": 5, "optim": 5, "intend": [5, 8], "trustless": [5, 8, 10], "leav": [5, 8], "free": [5, 7, 10], "unorganis": 5, "manner": 5, "properti": [5, 6], "far": [5, 8], "unexplor": 5, "dissolv": 5, "organ": 5, "restrict": 5, "legaci": 5, "unifi": 5, "underli": [5, 10], "carrier": [5, 10], "involv": 5, "hardlin": 5, "decid": [5, 6, 8], "illustr": [5, 8], "plan": [5, 8], "member": 5, "mainli": 5, "three": [5, 8], "hill": 5, "top": [5, 8], "chosen": [5, 8], "due": 5, "sight": 5, "becaus": [5, 8], "four": 5, "At": [5, 8], "raspberri": [5, 8, 9, 10], "usb": [5, 8, 9], "cabl": 5, "adapt": 5, "suppli": [5, 6, 8], "grow": 5, "place": [5, 8, 9], "core": [5, 8, 10], "those": [5, 8], "previous": [5, 6, 8], "d": [5, 9], "island": 5, "investig": 5, "dori": 5, "willing": 5, "she": 5, "her": 5, "home": 5, "newli": [5, 8], "everyon": [5, 8], "vice": [5, 10], "versa": [5, 10], "vhf": [5, 8, 10], "outli": 5, "geograph": 5, "coverag": 5, "dai": 5, "find": [5, 8], "were": 5, "poorli": 5, "outlier": 5, "configdir": 6, "logdest": 6, "exactli": [6, 8], "independ": [6, 8, 10], "inter": 6, "soon": 6, "kill": [6, 8], "forcibli": [6, 9], "advantag": 6, "demand": 6, "mtu": [6, 8, 10], "500": [6, 8, 10], "adher": 6, "507": 6, "break": [6, 8, 10], "prerequisit": 6, "percentag": 6, "schedul": 6, "queu": [6, 9], "fewer": 6, "distant": 6, "smaller": 6, "eventu": 6, "drop": [6, 8, 9], "appli": [6, 8], "individu": [6, 8], "static": 6, "should_use_implicit_proof": 6, "explicit": 6, "implicit": [6, 8], "transport_en": 6, "create_kei": 6, "decrypt": [6, 8], "signatur": [6, 8, 10], "verif": [6, 8], "sign": [6, 8], "dh": 6, "keysiz": 6, "x25519": [6, 8, 10], "concaten": 6, "256": [6, 8], "128": [6, 8, 10], "constant": 6, "truncat": [6, 8], "recall_app_data": 6, "heard": [6, 8], "full_hash": 6, "sha": [6, 8], "truncated_hash": 6, "from_byt": 6, "prv_byte": 6, "save": [6, 8], "hazard": 6, "feed": 6, "from_fil": 6, "to_fil": 6, "Be": [6, 9], "otherwis": 6, "get_private_kei": 6, "get_public_kei": 6, "load_private_kei": 6, "load_public_kei": 6, "pub_byt": 6, "ciphertext": 6, "token": [6, 8], "keyerror": 6, "hold": [6, 8], "ciphertext_token": 6, "presenc": 6, "ingo": 6, "zero": [6, 10], "full_nam": [6, 9], "app_and_aspects_from_nam": 6, "tupl": 6, "hash_from_name_and_ident": 6, "path_respons": 6, "flag": [6, 8], "accepts_link": 6, "accept": [6, 7, 8, 9], "set_proof_requested_callback": 6, "proof_strategi": 6, "prove_non": 6, "prove_app": 6, "proof_requested_callback": 6, "allowed_list": 6, "whatev": [6, 8], "funcion": 6, "allow_non": 6, "allow_list": 6, "deregister_request_handl": 6, "deregist": 6, "symmetr": [6, 8], "typeerror": 6, "incompat": [6, 8], "set_default_app_data": 6, "callabl": 6, "clear_default_app_data": 6, "secreci": [6, 8, 10], "payload": [6, 8], "instanti": 6, "encrypted_mdu": 6, "383": 6, "plain_mdu": 6, "464": 6, "resend": 6, "get_statu": 6, "cull": 6, "successful": 6, "proven": [6, 8], "established_callback": 6, "closed_callback": 6, "establishment_timeout_per_hop": 6, "keepalive_timeout_factor": 6, "4": [6, 8, 9], "calcul": [6, 8], "stale_grac": 6, "grace": 6, "keepal": [6, 8], "360": 6, "aliv": [6, 8], "stale_tim": 6, "720": 6, "mark": [6, 8], "stale": 6, "final": [6, 8], "torn": 6, "progress_callback": 6, "info": [6, 8, 9], "requestreceipt": 6, "no_inbound_for": 6, "no_outbound_for": 6, "outbound": [6, 8], "inactive_for": 6, "purg": 6, "set_resource_callback": 6, "get_transfer_s": 6, "get_data_s": 6, "get_part": 6, "is_compress": 6, "begun": 6, "resource_strategi": 6, "accept_non": 6, "accept_app": 6, "resource_callback": 6, "unsupport": 6, "get_request_id": 6, "get_respons": 6, "get_response_tim": 6, "auto_compress": 6, "arbitrari": [6, 8, 10], "checksum": [6, 10], "Will": 6, "whenev": [6, 8], "cancel": 6, "total": [6, 8, 10], "get_seg": 6, "divid": 6, "get_hash": 6, "pathfinder_m": 6, "object": 6, "attribut": 6, "deregister_announce_handl": 6, "hops_to": 6, "next_hop": 6, "next_hop_interfac": 6, "on_interfac": 6, "tag": 6, "recurs": 6, "gratefulli": 7, "monero": 7, "84fpy1qbxhcgdseepynmhthcrgmx4nffbytz2gkytoqhvvhjp8eaw1z1eedrnkd19b3b8nilcgvxzkv17ummmeescrpya5w": 7, "ethereum": 7, "0x81f7b979fea6134ba9fd5c701b3501a2e61e897a": 7, "bitcoin": 7, "3cpmacgm34qyvr6xwlvejmi2ane3pzquuq": 7, "ko": 7, "fi": 7, "roadmap": 7, "realiti": 7, "quickli": [7, 8, 10], "sponsor": [7, 10], "dysfunct": 7, "analyt": 7, "telemetri": 7, "collect": 7, "under": [7, 9], "circumst": [7, 8], "reli": [7, 8], "fashion": 7, "u": [7, 8], "suggest": 7, "briefli": 8, "overal": 8, "principl": [8, 10], "author": 8, "That": 8, "said": 8, "document": 8, "pretti": 8, "sentiment": 8, "philosophi": 8, "problem": 8, "seek": 8, "solv": 8, "solut": 8, "primari": 8, "lack": 8, "my": 8, "belief": 8, "highli": 8, "peopl": 8, "machin": 8, "censorship": 8, "barrier": 8, "todai": 8, "centralis": 8, "trust": 8, "approv": 8, "gatekeep": 8, "inevit": 8, "lead": 8, "govern": 8, "alter": 8, "censor": 8, "persecut": 8, "unwant": 8, "actor": 8, "imposs": 8, "freeli": 8, "deploi": 8, "enhanc": 8, "agenc": 8, "freedom": 8, "permissionless": 8, "pick": 8, "ghz": 8, "off": [8, 10], "shelf": [8, 10], "ultim": 8, "vast": 8, "myriad": 8, "thousand": 8, "surveil": 8, "disassoci": 8, "oversight": 8, "beings": 8, "usabl": 8, "useabl": 8, "critic": [8, 9], "agnostic": 8, "shall": 8, "handheld": 8, "stream": 8, "modifi": [8, 9], "interest": 8, "strong": 8, "oneself": 8, "unlicens": 8, "licens": 8, "condit": 8, "pmr": 8, "cb": 8, "wish": [8, 9], "written": 8, "programm": 8, "orient": 8, "multipoint": 8, "recipi": 8, "idea": [8, 9], "singular": 8, "_represented_": 8, "deriv": [8, 10], "characterist": 8, "13425ec15b621c1d928589718000d814": 8, "trade": 8, "accommod": 8, "simultan": 8, "unlik": 8, "nears": 8, "congest": 8, "galact": 8, "scale": 8, "obvious": 8, "ridicul": 8, "multi": [8, 9, 10], "special": [8, 9], "uniqu": [8, 10], "ecdh": [8, 10], "creator": 8, "correspond": 8, "possess": 8, "although": [8, 10], "abstract": 8, "capabl": 8, "dot": [8, 9], "notat": [8, 9], "repres": 8, "plenti": 8, "environment": 8, "monitor": 8, "measur": 8, "environmentlogg": 8, "remotesensor": 8, "temperatur": 8, "4faf1b2e0a077e6a9d92fa051f256038": 8, "advis": 8, "expand": 8, "structur": 8, "recap": 8, "indirectli": 8, "awar": 8, "ledger": 8, "therefor": [8, 10], "definit": 8, "messeng": 8, "nicknam": 8, "ed25519": [8, 10], "reconstruct": 8, "notic": [8, 9], "piec": 8, "intention": 8, "infer": 8, "throughout": 8, "accord": 8, "around": 8, "assign": [8, 9], "topic": 8, "necessarili": 8, "person": 8, "entiti": 8, "robot": 8, "sensor": 8, "someth": 8, "agent": 8, "manipul": 8, "multilater": 8, "creation": 8, "great": 8, "suffic": 8, "cluster": 8, "hear": 8, "But": 8, "introduc": 8, "lot": 8, "surviv": 8, "overcom": 8, "challeng": 8, "asymmetr": [8, 10], "closer": 8, "distinguish": 8, "contend": 8, "enable_transport": [8, 9], "retransmit": 8, "randomis": 8, "prioriti": 8, "invers": 8, "proport": 8, "count": 8, "insert": 8, "closest": 8, "greater": 8, "retri": 8, "newer": 8, "discard": 8, "contact": 8, "shortest": 8, "predict": 8, "constantli": 8, "earlier": 8, "opt": 8, "against": 8, "ae": [8, 10], "neither": 8, "session": 8, "bidirect": 8, "travers": 8, "rememb": 8, "subsequ": 8, "ten": 8, "advanc": 8, "confirm": [8, 10], "insid": 8, "intermediari": 8, "moment": [8, 10], "methodologi": [8, 9], "answer": [8, 9], "malici": 8, "pretend": 8, "recreat": 8, "rotat": 8, "procedur": 8, "memori": 8, "thereaft": 8, "297": [8, 10], "practic": [8, 10], "neglig": 8, "1200": 8, "96": 8, "keypair": 8, "simplic": 8, "explan": [8, 9], "lki": 8, "laid": 8, "had": 8, "construct": 8, "lkr": 8, "chose": 8, "bi": 8, "unequivoc": 8, "retransmiss": 8, "reassembl": 8, "programmat": 8, "satisfi": 8, "half": [8, 10], "duplex": [8, 10], "averag": 8, "throughput": [8, 10], "x": [8, 9], "runtim": 8, "consist": 8, "whereupon": 8, "stabl": [8, 10], "maintain": 8, "year": 8, "microcontrol": 8, "430": 8, "868": 8, "900": 8, "debian": [8, 9], "recent": 8, "mac": 8, "tailor": 8, "treat": 8, "regard": 8, "preshar": 8, "ifac": [8, 9], "onto": 8, "compos": 8, "field": 8, "header": 8, "32": 8, "context": 8, "465": 8, "vari": [8, 9], "64": [8, 9], "00": [8, 9], "01": 8, "reserv": 8, "11": 8, "_______": 8, "________________": 8, "________": 8, "______": 8, "__": 8, "_": 8, "01010000": 8, "00000100": 8, "hash1": 8, "hash2": 8, "header_2": 8, "00000000": 8, "00000111": 8, "header_1": 8, "10000000": 8, "exclud": 8, "51": 8, "157": 8, "83": [8, 9], "115": 8, "99": 8, "conceptu": 8, "x22519": 8, "hkdf": 8, "fernet": [8, 10], "cbc": [8, 10], "hmac": [8, 10], "hashlib": 8, "pkcs7": [8, 10], "pad": [8, 10], "trivial": [8, 10], "consequ": 8, "backend": 8, "loss": 8, "scrutini": 8, "review": [8, 10], "risk": 8, "pose": 8, "driver": [9, 10], "privileg": 9, "light": 9, "weight": 9, "boot": 9, "verbos": 9, "exampleconfig": 9, "ie": 9, "remov": 9, "breviti": 9, "socket": 9, "turn": 9, "share_inst": 9, "shared_instance_port": 9, "37428": 9, "instance_control_port": 9, "37429": 9, "panic": 9, "unrecover": 9, "occur": [9, 10], "panic_on_interface_error": 9, "warn": 9, "6": 9, "debug": 9, "unus": 9, "order": 9, "teach": 9, "task": 9, "v": 9, "show": 9, "ifconfig": 9, "gbp": 9, "13": 9, "kb": 9, "86": 9, "mbp": 9, "63": 9, "23": 9, "80": 9, "17": 9, "tcpinterfac": 9, "unsign": 9, "187": 9, "27": 9, "74": 9, "uhf": [9, 10], "30": 9, "kbp": 9, "e702c42ba8": 9, "49": 9, "9": 9, "5245a8efe1788c6a1cd36144a270e13b": 9, "c89b4da064bf66d280f0e4d8abfd9806": 9, "f53a1c4278e0726bb73fcc623d6ce763": 9, "reticulu": 9, "w": 9, "posit": 9, "probe": 9, "2d03725b327348980d570f739a3a5708": 9, "38": 9, "469": 9, "1726dbad538775b5bf9b0ea25a4079c8": 9, "c50cc4e4f7838b6c31f60ab9032cbc62": 9, "copi": 9, "tgz": 9, "73cbd378bb0286ed11a707c13447bb1": 9, "allowed_hash": 9, "decreas": 9, "auth": 9, "941bed5e228775e5a8079fc38b1ccf3f": 9, "1b03013c25f1c2ca068a4f080b844a10": 9, "7a55144adf826958a9529a3bcf08b149": 9, "cat": 9, "proc": 9, "cpuinfo": 9, "pseudo": 9, "shell": 9, "stderr": 9, "noauth": 9, "noid": 9, "mirror": 9, "max": 9, "perman": 9, "administr": 9, "ubuntu": 9, "ftdi_ft230x_basic_uart_43891ckm": 9, "if00": 9, "port0": 9, "plug": 9, "unplug": 9, "systemd": 9, "usr": 9, "bin": 9, "etc": 9, "execstartpr": 9, "restart": 9, "restartsec": 9, "usernameher": 9, "execstart": 9, "wantedbi": 9, "systemctl": 9, "readili": 10, "unforg": 10, "acknowledg": 10, "resili": 10, "userland": 10, "beta": 10, "bug": 10, "warrant": 10, "sha256": 10, "iv": 10, "urandom": 10, "intuit": 10, "friendli": 10, "44": 10, "gigabyt": 10, "scalabl": 10, "hoc": 10, "optic": 10, "transform": 10, "stop": 10, "fact": 10, "strength": 10, "generalis": 10, "fibr": 10, "popular": 10, "ideal": 10, "stdio": 10, "hack": 10, "foremost": 10, "audit": 10, "privaci": 10, "thorough": 10, "research": 10}, "objects": {"RNS": [[6, 0, 1, "", "Destination"], [6, 0, 1, "", "Identity"], [6, 0, 1, "", "Link"], [6, 0, 1, "", "Packet"], [6, 0, 1, "", "PacketReceipt"], [6, 0, 1, "", "RequestReceipt"], [6, 0, 1, "", "Resource"], [6, 0, 1, "", "Reticulum"], [6, 0, 1, "", "Transport"]], "RNS.Destination": [[6, 1, 1, "", "accepts_links"], [6, 1, 1, "", "announce"], [6, 1, 1, "", "app_and_aspects_from_name"], [6, 1, 1, "", "clear_default_app_data"], [6, 1, 1, "", "create_keys"], [6, 1, 1, "", "decrypt"], [6, 1, 1, "", "deregister_request_handler"], [6, 1, 1, "", "encrypt"], [6, 1, 1, "", "full_name"], [6, 1, 1, "", "get_private_key"], [6, 1, 1, "", "hash"], [6, 1, 1, "", "hash_from_name_and_identity"], [6, 1, 1, "", "load_private_key"], [6, 1, 1, "", "register_request_handler"], [6, 1, 1, "", "set_default_app_data"], [6, 1, 1, "", "set_link_established_callback"], [6, 1, 1, "", "set_packet_callback"], [6, 1, 1, "", "set_proof_requested_callback"], [6, 1, 1, "", "set_proof_strategy"], [6, 1, 1, "", "sign"]], "RNS.Identity": [[6, 2, 1, "", "CURVE"], [6, 2, 1, "", "KEYSIZE"], [6, 2, 1, "", "TRUNCATED_HASHLENGTH"], [6, 1, 1, "", "decrypt"], [6, 1, 1, "", "encrypt"], [6, 1, 1, "", "from_bytes"], [6, 1, 1, "", "from_file"], [6, 1, 1, "", "full_hash"], [6, 1, 1, "", "get_private_key"], [6, 1, 1, "", "get_public_key"], [6, 1, 1, "", "get_random_hash"], [6, 1, 1, "", "load_private_key"], [6, 1, 1, "", "load_public_key"], [6, 1, 1, "", "recall"], [6, 1, 1, "", "recall_app_data"], [6, 1, 1, "", "sign"], [6, 1, 1, "", "to_file"], [6, 1, 1, "", "truncated_hash"], [6, 1, 1, "", "validate"]], "RNS.Link": [[6, 2, 1, "", "CURVE"], [6, 2, 1, "", "ESTABLISHMENT_TIMEOUT_PER_HOP"], [6, 2, 1, "", "KEEPALIVE"], [6, 2, 1, "", "KEEPALIVE_TIMEOUT_FACTOR"], [6, 2, 1, "", "STALE_GRACE"], [6, 2, 1, "", "STALE_TIME"], [6, 1, 1, "", "get_remote_identity"], [6, 1, 1, "", "identify"], [6, 1, 1, "", "inactive_for"], [6, 1, 1, "", "no_inbound_for"], [6, 1, 1, "", "no_outbound_for"], [6, 1, 1, "", "request"], [6, 1, 1, "", "set_link_closed_callback"], [6, 1, 1, "", "set_packet_callback"], [6, 1, 1, "", "set_remote_identified_callback"], [6, 1, 1, "", "set_resource_callback"], [6, 1, 1, "", "set_resource_concluded_callback"], [6, 1, 1, "", "set_resource_started_callback"], [6, 1, 1, "", "set_resource_strategy"], [6, 1, 1, "", "teardown"]], "RNS.Packet": [[6, 2, 1, "", "ENCRYPTED_MDU"], [6, 2, 1, "", "PLAIN_MDU"], [6, 1, 1, "", "resend"], [6, 1, 1, "", "send"]], "RNS.PacketReceipt": [[6, 1, 1, "", "get_rtt"], [6, 1, 1, "", "get_status"], [6, 1, 1, "", "set_delivery_callback"], [6, 1, 1, "", "set_timeout"], [6, 1, 1, "", "set_timeout_callback"]], "RNS.RequestReceipt": [[6, 1, 1, "", "get_progress"], [6, 1, 1, "", "get_request_id"], [6, 1, 1, "", "get_response"], [6, 1, 1, "", "get_response_time"], [6, 1, 1, "", "get_status"]], "RNS.Resource": [[6, 1, 1, "", "advertise"], [6, 1, 1, "", "cancel"], [6, 1, 1, "", "get_data_size"], [6, 1, 1, "", "get_hash"], [6, 1, 1, "", "get_parts"], [6, 1, 1, "", "get_progress"], [6, 1, 1, "", "get_segments"], [6, 1, 1, "", "get_transfer_size"], [6, 1, 1, "", "is_compressed"]], "RNS.Reticulum": [[6, 2, 1, "", "ANNOUNCE_CAP"], [6, 2, 1, "", "MTU"], [6, 1, 1, "", "should_use_implicit_proof"], [6, 1, 1, "", "transport_enabled"]], "RNS.Transport": [[6, 2, 1, "", "PATHFINDER_M"], [6, 1, 1, "", "deregister_announce_handler"], [6, 1, 1, "", "has_path"], [6, 1, 1, "", "hops_to"], [6, 1, 1, "", "next_hop"], [6, 1, 1, "", "next_hop_interface"], [6, 1, 1, "", "register_announce_handler"], [6, 1, 1, "", "request_path"]]}, "objtypes": {"0": "py:class", "1": "py:method", "2": "py:attribute"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "method", "Python method"], "2": ["py", "attribute", "Python attribute"]}, "titleterms": {"code": [0, 7, 8], "exampl": [0, 5], "minim": 0, "announc": [0, 4, 8], "broadcast": 0, "echo": 0, "link": [0, 6, 8], "identif": 0, "request": [0, 6], "respons": 0, "filetransf": 0, "get": [1, 8], "start": 1, "fast": 1, "try": 1, "us": [1, 9, 10], "reticulum": [1, 2, 3, 6, 7, 8, 9, 10], "base": [1, 2], "program": [1, 9], "nomad": 1, "network": [1, 3, 5], "sideband": 1, "includ": [1, 9], "util": [1, 9], "creat": [1, 2], "With": 1, "connect": 1, "instanc": 1, "over": [1, 5], "internet": [1, 5], "public": [1, 8], "testnet": 1, "ad": 1, "radio": 1, "interfac": [1, 4, 8, 10], "develop": 1, "particip": 1, "arm64": 1, "android": 1, "pure": 1, "python": 1, "commun": 2, "hardwar": 2, "rnode": [2, 4], "support": [2, 4, 7], "board": 2, "lilygo": 2, "lora32": 2, "v2": 2, "1": 2, "0": 2, "t": 2, "beam": 2, "heltec": 2, "unsign": 2, "x": 2, "v1": 2, "instal": 2, "usag": 2, "supplier": 2, "wifi": 2, "combin": 2, "type": [2, 8, 10], "stack": 3, "manual": 3, "indic": 3, "tabl": 3, "auto": 4, "i2p": 4, "tcp": 4, "server": 4, "client": 4, "udp": 4, "lora": [4, 5], "serial": [4, 9], "pipe": 4, "kiss": 4, "ax": 4, "25": 4, "common": 4, "option": 4, "mode": 4, "rate": 4, "control": 4, "build": 5, "concept": 5, "overview": 5, "scenario": 5, "interconnect": 5, "site": 5, "bridg": 5, "growth": 5, "converg": 5, "api": 6, "refer": [6, 8], "class": 6, "ident": [6, 8], "destin": [6, 8], "packet": [6, 8], "receipt": 6, "resourc": [6, 8], "transport": [6, 8], "donat": 7, "provid": 7, "feedback": 7, "contribut": 7, "understand": 8, "motiv": 8, "goal": 8, "introduct": 8, "basic": 8, "function": 8, "name": [8, 9], "kei": 8, "further": 8, "node": 8, "The": [8, 9], "mechan": 8, "detail": 8, "reach": 8, "establish": 8, "setup": 8, "protocol": 8, "specif": 8, "prioritis": 8, "access": 8, "wire": 8, "format": 8, "propag": 8, "rule": 8, "cryptograph": 8, "primit": 8, "your": 9, "system": 9, "configur": 9, "data": 9, "rnsd": 9, "rnstatu": 9, "rnpath": 9, "rnprobe": 9, "rncp": 9, "rnx": 9, "improv": 9, "fix": 9, "port": 9, "servic": 9, "what": 10, "i": 10, "current": 10, "statu": 10, "doe": 10, "offer": 10, "where": 10, "can": 10, "devic": 10, "caveat": 10, "emptor": 10}, "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"], [6, "link"]], "Identification": [[0, "example-identify"]], "Requests & Responses": [[0, "requests-responses"]], "Filetransfer": [[0, "filetransfer"]], "Getting Started Fast": [[1, "getting-started-fast"]], "Try Using a Reticulum-based Program": [[1, "try-using-a-reticulum-based-program"]], "Nomad Network": [[1, "nomad-network"]], "Sideband": [[1, "sideband"]], "Using the Included Utilities": [[1, "using-the-included-utilities"]], "Creating a Network With Reticulum": [[1, "creating-a-network-with-reticulum"]], "Connecting Reticulum Instances Over the Internet": [[1, "connecting-reticulum-instances-over-the-internet"]], "Connect to the Public Testnet": [[1, "connect-to-the-public-testnet"]], "Adding Radio Interfaces": [[1, "adding-radio-interfaces"]], "Develop a Program with Reticulum": [[1, "develop-a-program-with-reticulum"]], "Participate in Reticulum Development": [[1, "participate-in-reticulum-development"]], "Reticulum on ARM64": [[1, "reticulum-on-arm64"]], "Reticulum on Android": [[1, "reticulum-on-android"]], "Pure-Python Reticulum": [[1, "pure-python-reticulum"]], "Communications Hardware": [[2, "communications-hardware"]], "RNode": [[2, "rnode"]], "Creating RNodes": [[2, "creating-rnodes"]], "Supported Boards": [[2, "supported-boards"]], "LilyGO LoRa32 v2.1": [[2, "lilygo-lora32-v2-1"]], "LilyGO LoRa32 v2.0": [[2, "lilygo-lora32-v2-0"]], "LilyGO T-Beam": [[2, "lilygo-t-beam"]], "Heltec LoRa32 v2.0": [[2, "heltec-lora32-v2-0"]], "Unsigned RNode v2.x": [[2, "unsigned-rnode-v2-x"]], "Unsigned RNode v1.x": [[2, "unsigned-rnode-v1-x"]], "Installation": [[2, "installation"]], "Usage with Reticulum": [[2, "usage-with-reticulum"]], "Suppliers": [[2, "suppliers"]], "WiFi-based Hardware": [[2, "wifi-based-hardware"]], "Combining Hardware Types": [[2, "combining-hardware-types"]], "Reticulum Network Stack Manual": [[3, "reticulum-network-stack-manual"]], "Indices and Tables": [[3, "indices-and-tables"]], "Supported Interfaces": [[4, "supported-interfaces"]], "Auto Interface": [[4, "auto-interface"]], "I2P Interface": [[4, "i2p-interface"]], "TCP Server Interface": [[4, "tcp-server-interface"]], "TCP Client Interface": [[4, "tcp-client-interface"]], "UDP Interface": [[4, "udp-interface"]], "RNode LoRa Interface": [[4, "rnode-lora-interface"]], "Serial Interface": [[4, "serial-interface"]], "Pipe Interface": [[4, "pipe-interface"]], "KISS Interface": [[4, "kiss-interface"]], "AX.25 KISS Interface": [[4, "ax-25-kiss-interface"]], "Common Interface Options": [[4, "common-interface-options"]], "Interface Modes": [[4, "interface-modes"]], "Announce Rate Control": [[4, "announce-rate-control"]], "Building Networks": [[5, "building-networks"]], "Concepts & Overview": [[5, "concepts-overview"]], "Example Scenarios": [[5, "example-scenarios"]], "Interconnected LoRa Sites": [[5, "interconnected-lora-sites"]], "Bridging Over the Internet": [[5, "bridging-over-the-internet"]], "Growth and Convergence": [[5, "growth-and-convergence"]], "API Reference": [[6, "api-reference"]], "Classes": [[6, "classes"]], "Reticulum": [[6, "reticulum"]], "Identity": [[6, "api-identity"]], "Destination": [[6, "destination"]], "Packet": [[6, "packet"]], "Packet Receipt": [[6, "packet-receipt"]], "Request Receipt": [[6, "request-receipt"]], "Resource": [[6, "resource"]], "Transport": [[6, "transport"]], "Support Reticulum": [[7, "support-reticulum"]], "Donations": [[7, "donations"]], "Provide Feedback": [[7, "provide-feedback"]], "Contribute Code": [[7, "contribute-code"]], "Understanding Reticulum": [[8, "understanding-reticulum"]], "Motivation": [[8, "motivation"]], "Goals": [[8, "goals"]], "Introduction & Basic Functionality": [[8, "introduction-basic-functionality"]], "Destinations": [[8, "destinations"]], "Destination Naming": [[8, "destination-naming"]], "Public Key Announcements": [[8, "public-key-announcements"]], "Identities": [[8, "understanding-identities"]], "Getting Further": [[8, "getting-further"]], "Reticulum Transport": [[8, "reticulum-transport"]], "Node Types": [[8, "node-types"]], "The Announce Mechanism in Detail": [[8, "the-announce-mechanism-in-detail"]], "Reaching the Destination": [[8, "reaching-the-destination"]], "Link Establishment in Detail": [[8, "link-establishment-in-detail"]], "Resources": [[8, "resources"]], "Reference Setup": [[8, "reference-setup"]], "Protocol Specifics": [[8, "protocol-specifics"]], "Packet Prioritisation": [[8, "packet-prioritisation"]], "Interface Access Codes": [[8, "interface-access-codes"]], "Wire Format": [[8, "wire-format"]], "Announce Propagation Rules": [[8, "announce-propagation-rules"]], "Cryptographic Primitives": [[8, "cryptographic-primitives"]], "Using Reticulum on Your System": [[9, "using-reticulum-on-your-system"]], "Configuration & Data": [[9, "configuration-data"]], "Included Utility Programs": [[9, "included-utility-programs"]], "The rnsd Utility": [[9, "the-rnsd-utility"]], "The rnstatus Utility": [[9, "the-rnstatus-utility"]], "The rnpath Utility": [[9, "the-rnpath-utility"]], "The rnprobe Utility": [[9, "the-rnprobe-utility"]], "The rncp Utility": [[9, "the-rncp-utility"]], "The rnx Utility": [[9, "the-rnx-utility"]], "Improving System Configuration": [[9, "improving-system-configuration"]], "Fixed Serial Port Names": [[9, "fixed-serial-port-names"]], "Reticulum as a System Service": [[9, "reticulum-as-a-system-service"]], "What is Reticulum?": [[10, "what-is-reticulum"]], "Current Status": [[10, "current-status"]], "What does Reticulum Offer?": [[10, "what-does-reticulum-offer"]], "Where can Reticulum be Used?": [[10, "where-can-reticulum-be-used"]], "Interface Types and Devices": [[10, "interface-types-and-devices"]], "Caveat Emptor": [[10, "caveat-emptor"]]}, "indexentries": {"announce_cap (rns.reticulum attribute)": [[6, "RNS.Reticulum.ANNOUNCE_CAP"]], "curve (rns.identity attribute)": [[6, "RNS.Identity.CURVE"]], "curve (rns.link attribute)": [[6, "RNS.Link.CURVE"]], "destination (class in rns)": [[6, "RNS.Destination"]], "encrypted_mdu (rns.packet attribute)": [[6, "RNS.Packet.ENCRYPTED_MDU"]], "establishment_timeout_per_hop (rns.link attribute)": [[6, "RNS.Link.ESTABLISHMENT_TIMEOUT_PER_HOP"]], "identity (class in rns)": [[6, "RNS.Identity"]], "keepalive (rns.link attribute)": [[6, "RNS.Link.KEEPALIVE"]], "keepalive_timeout_factor (rns.link attribute)": [[6, "RNS.Link.KEEPALIVE_TIMEOUT_FACTOR"]], "keysize (rns.identity attribute)": [[6, "RNS.Identity.KEYSIZE"]], "link (class in rns)": [[6, "RNS.Link"]], "mtu (rns.reticulum attribute)": [[6, "RNS.Reticulum.MTU"]], "pathfinder_m (rns.transport attribute)": [[6, "RNS.Transport.PATHFINDER_M"]], "plain_mdu (rns.packet attribute)": [[6, "RNS.Packet.PLAIN_MDU"]], "packet (class in rns)": [[6, "RNS.Packet"]], "packetreceipt (class in rns)": [[6, "RNS.PacketReceipt"]], "requestreceipt (class in rns)": [[6, "RNS.RequestReceipt"]], "resource (class in rns)": [[6, "RNS.Resource"]], "reticulum (class in rns)": [[6, "RNS.Reticulum"]], "stale_grace (rns.link attribute)": [[6, "RNS.Link.STALE_GRACE"]], "stale_time (rns.link attribute)": [[6, "RNS.Link.STALE_TIME"]], "truncated_hashlength (rns.identity attribute)": [[6, "RNS.Identity.TRUNCATED_HASHLENGTH"]], "transport (class in rns)": [[6, "RNS.Transport"]], "accepts_links() (rns.destination method)": [[6, "RNS.Destination.accepts_links"]], "advertise() (rns.resource method)": [[6, "RNS.Resource.advertise"]], "announce() (rns.destination method)": [[6, "RNS.Destination.announce"]], "app_and_aspects_from_name() (rns.destination static method)": [[6, "RNS.Destination.app_and_aspects_from_name"]], "cancel() (rns.resource method)": [[6, "RNS.Resource.cancel"]], "clear_default_app_data() (rns.destination method)": [[6, "RNS.Destination.clear_default_app_data"]], "create_keys() (rns.destination method)": [[6, "RNS.Destination.create_keys"]], "decrypt() (rns.destination method)": [[6, "RNS.Destination.decrypt"]], "decrypt() (rns.identity method)": [[6, "RNS.Identity.decrypt"]], "deregister_announce_handler() (rns.transport static method)": [[6, "RNS.Transport.deregister_announce_handler"]], "deregister_request_handler() (rns.destination method)": [[6, "RNS.Destination.deregister_request_handler"]], "encrypt() (rns.destination method)": [[6, "RNS.Destination.encrypt"]], "encrypt() (rns.identity method)": [[6, "RNS.Identity.encrypt"]], "from_bytes() (rns.identity static method)": [[6, "RNS.Identity.from_bytes"]], "from_file() (rns.identity static method)": [[6, "RNS.Identity.from_file"]], "full_hash() (rns.identity static method)": [[6, "RNS.Identity.full_hash"]], "full_name() (rns.destination static method)": [[6, "RNS.Destination.full_name"]], "get_data_size() (rns.resource method)": [[6, "RNS.Resource.get_data_size"]], "get_hash() (rns.resource method)": [[6, "RNS.Resource.get_hash"]], "get_parts() (rns.resource method)": [[6, "RNS.Resource.get_parts"]], "get_private_key() (rns.destination method)": [[6, "RNS.Destination.get_private_key"]], "get_private_key() (rns.identity method)": [[6, "RNS.Identity.get_private_key"]], "get_progress() (rns.requestreceipt method)": [[6, "RNS.RequestReceipt.get_progress"]], "get_progress() (rns.resource method)": [[6, "RNS.Resource.get_progress"]], "get_public_key() (rns.identity method)": [[6, "RNS.Identity.get_public_key"]], "get_random_hash() (rns.identity static method)": [[6, "RNS.Identity.get_random_hash"]], "get_remote_identity() (rns.link method)": [[6, "RNS.Link.get_remote_identity"]], "get_request_id() (rns.requestreceipt method)": [[6, "RNS.RequestReceipt.get_request_id"]], "get_response() (rns.requestreceipt method)": [[6, "RNS.RequestReceipt.get_response"]], "get_response_time() (rns.requestreceipt method)": [[6, "RNS.RequestReceipt.get_response_time"]], "get_rtt() (rns.packetreceipt method)": [[6, "RNS.PacketReceipt.get_rtt"]], "get_segments() (rns.resource method)": [[6, "RNS.Resource.get_segments"]], "get_status() (rns.packetreceipt method)": [[6, "RNS.PacketReceipt.get_status"]], "get_status() (rns.requestreceipt method)": [[6, "RNS.RequestReceipt.get_status"]], "get_transfer_size() (rns.resource method)": [[6, "RNS.Resource.get_transfer_size"]], "has_path() (rns.transport static method)": [[6, "RNS.Transport.has_path"]], "hash() (rns.destination static method)": [[6, "RNS.Destination.hash"]], "hash_from_name_and_identity() (rns.destination static method)": [[6, "RNS.Destination.hash_from_name_and_identity"]], "hops_to() (rns.transport static method)": [[6, "RNS.Transport.hops_to"]], "identify() (rns.link method)": [[6, "RNS.Link.identify"]], "inactive_for() (rns.link method)": [[6, "RNS.Link.inactive_for"]], "is_compressed() (rns.resource method)": [[6, "RNS.Resource.is_compressed"]], "load_private_key() (rns.destination method)": [[6, "RNS.Destination.load_private_key"]], "load_private_key() (rns.identity method)": [[6, "RNS.Identity.load_private_key"]], "load_public_key() (rns.identity method)": [[6, "RNS.Identity.load_public_key"]], "next_hop() (rns.transport static method)": [[6, "RNS.Transport.next_hop"]], "next_hop_interface() (rns.transport static method)": [[6, "RNS.Transport.next_hop_interface"]], "no_inbound_for() (rns.link method)": [[6, "RNS.Link.no_inbound_for"]], "no_outbound_for() (rns.link method)": [[6, "RNS.Link.no_outbound_for"]], "recall() (rns.identity static method)": [[6, "RNS.Identity.recall"]], "recall_app_data() (rns.identity static method)": [[6, "RNS.Identity.recall_app_data"]], "register_announce_handler() (rns.transport static method)": [[6, "RNS.Transport.register_announce_handler"]], "register_request_handler() (rns.destination method)": [[6, "RNS.Destination.register_request_handler"]], "request() (rns.link method)": [[6, "RNS.Link.request"]], "request_path() (rns.transport static method)": [[6, "RNS.Transport.request_path"]], "resend() (rns.packet method)": [[6, "RNS.Packet.resend"]], "send() (rns.packet method)": [[6, "RNS.Packet.send"]], "set_default_app_data() (rns.destination method)": [[6, "RNS.Destination.set_default_app_data"]], "set_delivery_callback() (rns.packetreceipt method)": [[6, "RNS.PacketReceipt.set_delivery_callback"]], "set_link_closed_callback() (rns.link method)": [[6, "RNS.Link.set_link_closed_callback"]], "set_link_established_callback() (rns.destination method)": [[6, "RNS.Destination.set_link_established_callback"]], "set_packet_callback() (rns.destination method)": [[6, "RNS.Destination.set_packet_callback"]], "set_packet_callback() (rns.link method)": [[6, "RNS.Link.set_packet_callback"]], "set_proof_requested_callback() (rns.destination method)": [[6, "RNS.Destination.set_proof_requested_callback"]], "set_proof_strategy() (rns.destination method)": [[6, "RNS.Destination.set_proof_strategy"]], "set_remote_identified_callback() (rns.link method)": [[6, "RNS.Link.set_remote_identified_callback"]], "set_resource_callback() (rns.link method)": [[6, "RNS.Link.set_resource_callback"]], "set_resource_concluded_callback() (rns.link method)": [[6, "RNS.Link.set_resource_concluded_callback"]], "set_resource_started_callback() (rns.link method)": [[6, "RNS.Link.set_resource_started_callback"]], "set_resource_strategy() (rns.link method)": [[6, "RNS.Link.set_resource_strategy"]], "set_timeout() (rns.packetreceipt method)": [[6, "RNS.PacketReceipt.set_timeout"]], "set_timeout_callback() (rns.packetreceipt method)": [[6, "RNS.PacketReceipt.set_timeout_callback"]], "should_use_implicit_proof() (rns.reticulum static method)": [[6, "RNS.Reticulum.should_use_implicit_proof"]], "sign() (rns.destination method)": [[6, "RNS.Destination.sign"]], "sign() (rns.identity method)": [[6, "RNS.Identity.sign"]], "teardown() (rns.link method)": [[6, "RNS.Link.teardown"]], "to_file() (rns.identity method)": [[6, "RNS.Identity.to_file"]], "transport_enabled() (rns.reticulum static method)": [[6, "RNS.Reticulum.transport_enabled"]], "truncated_hash() (rns.identity static method)": [[6, "RNS.Identity.truncated_hash"]], "validate() (rns.identity method)": [[6, "RNS.Identity.validate"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["examples", "gettingstartedfast", "hardware", "index", "interfaces", "networks", "reference", "support", "understanding", "using", "whatis"], "filenames": ["examples.rst", "gettingstartedfast.rst", "hardware.rst", "index.rst", "interfaces.rst", "networks.rst", "reference.rst", "support.rst", "understanding.rst", "using.rst", "whatis.rst"], "titles": ["Code Examples", "Getting Started Fast", "Communications Hardware", "Reticulum Network Stack Manual", "Supported Interfaces", "Building Networks", "API Reference", "Support Reticulum", "Understanding Reticulum", "Using Reticulum on Your System", "What is Reticulum?"], "terms": {"A": [0, 1, 4, 5, 6, 8, 9, 10], "number": [0, 1, 4, 5, 6, 8, 9], "ar": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10], "includ": [0, 2, 3, 4, 6, 8], "sourc": [0, 1, 2, 5, 8, 10], "distribut": [0, 1, 5, 6, 8, 9], "reticulum": [0, 4, 5], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "us": [0, 2, 3, 4, 5, 6, 8], "learn": [0, 1, 7, 8], "how": [0, 1, 2, 4, 5, 8, 10], "write": [0, 1, 4, 6, 8], "your": [0, 1, 2, 3, 4, 5, 7, 8, 10], "own": [0, 1, 5, 6, 8, 9], "program": [0, 3, 4, 6, 8, 10], "The": [0, 1, 2, 3, 4, 5, 6, 10], "demonstr": [0, 4], "bare": 0, "minimum": [0, 4, 5, 8], "setup": [0, 1, 3, 4], "requir": [0, 1, 4, 5, 8, 9, 10], "connect": [0, 2, 3, 4, 5, 6, 8, 9, 10], "network": [0, 2, 4, 6, 8, 9, 10], "from": [0, 1, 2, 4, 5, 6, 8, 9, 10], "In": [0, 1, 2, 4, 5, 6, 8, 9, 10], "about": [0, 1, 2, 4, 5, 6, 8], "five": 0, "line": [0, 1, 2, 4, 5, 8, 10], "have": [0, 1, 2, 4, 5, 6, 8, 9], "stack": [0, 1, 5, 8, 9, 10], "initialis": [0, 6, 9], "readi": [0, 1, 2, 4, 5, 6, 10], "pass": [0, 2, 4, 5, 6, 8, 9], "traffic": [0, 1, 4, 5, 6, 8, 9], "thi": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], "rn": [0, 1, 6, 8, 9], "start": [0, 2, 3, 4, 6, 8, 9], "up": [0, 1, 2, 4, 5, 8, 9, 10], "gener": [0, 1, 2, 4, 5, 6, 8, 9, 10], "new": [0, 4, 5, 6, 8, 9], "destin": [0, 1, 3, 4, 5, 9], "let": [0, 1, 4, 5, 8, 9], "user": [0, 1, 4, 5, 8, 9], "send": [0, 4, 6, 8, 9], "an": [0, 1, 2, 4, 5, 6, 8, 9, 10], "import": [0, 1, 2, 4, 5, 7, 8], "argpars": 0, "": [0, 1, 4, 5, 8, 9, 10], "defin": [0, 4, 8, 9], "app": [0, 1, 6, 8], "name": [0, 3, 4, 5, 6], "we": [0, 1, 2, 4, 7, 8], "ll": [0, 1, 10], "all": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "creat": [0, 3, 4, 5, 6, 8, 9, 10], "sinc": [0, 1, 4, 5, 6, 8], "basic": [0, 1, 3, 6, 9], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "part": [0, 4, 5, 6, 8], "rang": [0, 1, 2, 4, 5, 8, 9, 10], "util": [0, 2, 3, 4, 8], "put": [0, 2, 4], "them": [0, 1, 2, 4, 5, 7, 8, 9], "within": [0, 1, 4, 5, 6, 8], "namespac": 0, "example_util": [0, 9], "app_nam": [0, 6], "execut": [0, 1, 4, 6, 9], "when": [0, 1, 2, 4, 5, 6, 8, 9], "def": 0, "program_setup": 0, "configpath": 0, "must": [0, 1, 4, 5, 6, 8], "first": [0, 1, 4, 6, 8, 9], "randomli": [0, 8], "ident": [0, 1, 3, 9, 10], "our": [0, 8], "just": [0, 1, 2, 4, 5, 8, 10], "endpoint": [0, 5, 6, 8], "address": [0, 1, 4, 5, 6, 8, 10], "commun": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10], "also": [0, 1, 2, 4, 5, 6, 8, 9, 10], "exist": [0, 1, 2, 4, 8, 9, 10], "which": [0, 1, 4, 5, 6, 8, 9], "know": [0, 1, 2, 5, 6, 8], "thei": [0, 1, 4, 5, 6, 8, 9], "reachabl": [0, 1, 4, 5, 6, 8, 9], "autoomat": 0, "path": [0, 1, 2, 4, 6, 8, 9], "anywher": [0, 4], "els": [0, 5, 8], "IN": [0, 6], "singl": [0, 4, 6, 8, 9, 10], "minimalsampl": 0, "configur": [0, 1, 2, 3, 4, 5, 6, 8, 10], "automat": [0, 1, 2, 4, 5, 6, 8, 9, 10], "prove": [0, 8], "packet": [0, 1, 2, 3, 4, 5, 9, 10], "adress": [0, 6], "By": [0, 1, 4, 6, 8, 9], "do": [0, 1, 2, 4, 6, 8, 10], "proof": [0, 6, 8, 9], "each": [0, 1, 4, 5, 8, 9], "incom": [0, 4, 6, 9], "transmit": [0, 4, 8], "back": [0, 4, 8, 10], "sender": [0, 1, 5, 8, 9], "anyon": [0, 1, 2, 5, 6, 8, 9], "tri": 0, "whether": [0, 4, 6, 8], "wa": [0, 2, 4, 5, 6, 8, 10], "receiv": [0, 1, 4, 6, 8, 9], "correctli": 0, "set_proof_strategi": [0, 6], "prove_al": [0, 6], "everyth": [0, 5, 8], "hand": [0, 1], "over": [0, 2, 3, 4, 6, 8, 9, 10], "control": [0, 1, 2, 3, 5, 6, 8], "loop": 0, "announceloop": 0, "log": [0, 4, 9], "prettyhexrep": 0, "hash": [0, 1, 6, 8, 9], "run": [0, 1, 2, 4, 5, 6, 8, 9, 10], "hit": 0, "enter": [0, 9], "manual": [0, 1, 4, 5, 6, 9], "ctrl": 0, "c": [0, 5], "quit": 0, "until": [0, 4, 6], "exit": [0, 1, 6, 9], "If": [0, 1, 2, 4, 5, 6, 8, 9, 10], "server": [0, 1, 2, 3, 9], "client": [0, 1, 2, 3, 6], "messag": [0, 1, 6, 8, 9], "direct": [0, 1, 2, 5, 6, 8, 9], "toward": [0, 4, 8], "while": [0, 1, 2, 4, 5, 6, 8, 10], "true": [0, 4, 6, 9], "input": [0, 9], "sent": [0, 1, 6, 8, 9], "startup": 0, "get": [0, 2, 3, 4, 6, 10], "pars": 0, "desir": [0, 2, 4, 8], "mode": [0, 1, 2, 3, 8, 9, 10], "__name__": 0, "__main__": 0, "try": [0, 3, 4], "parser": 0, "argumentpars": 0, "descript": [0, 9], "add_argu": 0, "config": [0, 1, 2, 5, 9], "action": 0, "store": [0, 2, 8, 9], "default": [0, 1, 2, 4, 5, 6, 8, 9], "none": [0, 4, 6, 8, 9], "help": [0, 2, 5, 7, 8, 9, 10], "altern": [0, 4, 9], "directori": [0, 9], "type": [0, 1, 3, 4, 5, 6, 9], "str": 0, "arg": 0, "parse_arg": 0, "configarg": 0, "except": [0, 4], "keyboardinterrupt": 0, "print": [0, 4, 9], "found": [0, 1, 4, 5, 8, 9], "http": [0, 1, 7], "github": [0, 1, 7], "com": [0, 1, 7], "markqvist": [0, 1, 7], "blob": [0, 8], "master": [0, 6], "py": [0, 1, 8], "build": [0, 1, 2, 3, 4, 8, 10], "upon": [0, 8], "previou": 0, "explor": [0, 8, 10], "notif": [0, 6], "relev": [0, 2, 4, 6, 8, 9], "set": [0, 1, 2, 4, 5, 6, 8, 9, 10], "callback": [0, 6], "applic": [0, 4, 5, 6, 8, 9], "arriv": [0, 8], "random": [0, 6, 8], "two": [0, 1, 2, 4, 5, 8], "list": [0, 1, 2, 4, 6, 8, 10], "string": [0, 6], "app_data": [0, 6], "fruit": 0, "peach": 0, "quinc": 0, "date": [0, 1], "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, 1, 2, 5, 8, 10], "destination_1": 0, "destination_2": 0, "handler": [0, 6], "onli": [0, 1, 2, 4, 5, 6, 8, 9, 10], "ask": [0, 2, 6], "chang": [0, 1, 4, 6, 8, 9, 10], "filter": [0, 5, 8], "see": [0, 1, 4, 5, 6, 8, 9, 10], "what": [0, 1, 3, 6, 8], "happen": [0, 6, 8], "announce_handl": 0, "exampleannouncehandl": 0, "aspect_filt": [0, 6], "regist": [0, 6], "transport": [0, 1, 3, 4, 5, 9, 10], "register_announce_handl": [0, 6], "select": [0, 4], "randint": 0, "0": [0, 4, 6, 8, 9, 10], "len": 0, "1": [0, 4, 6, 8, 9], "data": [0, 1, 3, 4, 5, 6, 8, 10], "encod": 0, "utf": 0, "8": [0, 4, 9], "nobl": 0, "ga": 0, "noble_ga": 0, "need": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], "class": [0, 3, 5, 10], "method": [0, 1, 4, 6, 8], "take": [0, 1, 4, 8, 9, 10], "option": [0, 1, 2, 3, 5, 6, 8, 9], "argument": [0, 6, 9], "instanc": [0, 3, 4, 6, 8, 9], "some": [0, 1, 2, 4, 5, 8, 9], "want": [0, 1, 2, 4, 5, 8, 9, 10], "aspect": [0, 2, 4, 6, 8], "__init__": 0, "self": [0, 5, 10], "call": [0, 5, 6, 8, 10], "system": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "match": [0, 4, 8], "specif": [0, 2, 3, 4, 6, 10], "cannot": [0, 1], "wildcard": 0, "received_announc": [0, 6], "destination_hash": [0, 6, 9], "announced_ident": [0, 6], "contain": [0, 5, 6, 8, 9], "follow": [0, 1, 2, 4, 7, 8, 9, 10], "decod": 0, "plaintext": [0, 6], "unencrypt": [0, 6, 8], "inform": [0, 1, 3, 4, 5, 6, 8, 9], "ani": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10], "listen": [0, 4, 8, 9], "sy": 0, "channel": [0, 4, 5, 7, 8, 10], "did": 0, "one": [0, 1, 2, 4, 5, 6, 8, 9, 10], "public_inform": 0, "ad": [0, 2, 3, 4, 5, 6, 8, 10], "so": [0, 1, 2, 4, 5, 6, 7, 8, 10], "differ": [0, 1, 2, 4, 5, 6, 8, 9, 10], "plain": [0, 4, 6, 8], "uncencrypt": 0, "broadcast_destin": 0, "specifi": [0, 1, 2, 4, 5, 6, 9], "everi": [0, 4, 5, 6, 8], "time": [0, 1, 2, 4, 5, 6, 8, 9], "set_packet_callback": [0, 6], "packet_callback": 0, "main": 0, "broadcastloop": 0, "simpli": [0, 1, 2, 4, 5, 8, 9], "out": [0, 1, 2, 4, 5, 6, 8, 9, 10], "r": [0, 4, 8, 9], "n": [0, 8, 9], "end": [0, 4, 5, 6, 8, 10], "stdout": [0, 4, 9], "flush": 0, "text": [0, 1, 5, 8], "prompt": 0, "channelarg": 0, "between": [0, 4, 5, 6, 8], "interfac": [0, 2, 3, 5, 6, 9], "simpl": [0, 2, 8, 9, 10], "respond": [0, 6], "receipt": [0, 3, 8], "choos": [0, 1, 4, 8], "global": [0, 1, 4, 5, 8, 10], "server_ident": 0, "queri": [0, 1, 6], "abl": [0, 1, 4, 5, 6, 8, 9], "verifi": [0, 6, 8], "repli": [0, 9], "encrypt": [0, 1, 5, 6, 8, 10], "wai": [0, 1, 4, 5, 8], "certain": [0, 4, 5, 7, 8], "than": [0, 1, 4, 5, 8], "read": [0, 1, 4, 8, 9], "echo_destin": 0, "tell": [0, 4], "function": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10], "server_callback": 0, "wait": [0, 4, 8, 9], "go": [0, 1, 4, 8], "handl": [0, 2, 4, 5, 6, 8, 9, 10], "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, "dbm": [0, 4], "snr": 0, "db": 0, "destination_hexhash": 0, "timeout": [0, 6, 9], "binari": [0, 1, 8], "represent": 0, "command": [0, 1, 4, 9], "dest_len": 0, "truncated_hashlength": [0, 6], "2": [0, 4, 6, 8, 9], "rais": [0, 6], "valueerror": [0, 6], "length": [0, 4, 6, 8], "invalid": [0, 6], "hex": 0, "hexadecim": [0, 8, 9], "charact": 0, "byte": [0, 6, 8, 9, 10], "format": [0, 3, 10], "fromhex": 0, "e": [0, 5], "check": [0, 1, 6, 8], "overrid": 0, "loglevel": [0, 6, 9], "provid": [0, 1, 2, 3, 4, 5, 6, 8, 10], "feedback": [0, 3], "log_info": 0, "doe": [0, 1, 2, 3, 4, 5, 6, 8, 9], "load": [0, 1, 6, 9], "has_path": [0, 6], "To": [0, 1, 2, 4, 5, 8, 9, 10], "public": [0, 3, 4, 6], "kei": [0, 3, 5, 6, 10], "done": [0, 1, 4, 5, 8, 9], "recal": [0, 6], "modul": [0, 1, 2, 8, 9, 10], "known": [0, 6, 8, 9], "return": [0, 6, 9], "outgo": [0, 4, 6, 8, 9], "got": 0, "correct": [0, 8], "convent": 0, "request_destin": 0, "add": [0, 1, 4, 5, 9], "echo_request": 0, "get_random_hash": [0, 6], "successfulli": [0, 8], "packetreceipt": [0, 6], "packet_receipt": [0, 6], "set_timeout": [0, 6], "set_timeout_callback": [0, 6], "packet_timed_out": 0, "deliveri": [0, 1, 6, 10], "set_delivery_callback": [0, 6], "packet_deliv": 0, "yet": [0, 4, 8], "request_path": [0, 6], "statu": [0, 1, 3, 4, 6, 8, 9], "deliv": [0, 6], "rtt": [0, 6, 8], "get_rtt": [0, 6], "round": [0, 6, 9], "3": [0, 4, 8, 9, 10], "rttstring": 0, "second": [0, 4, 6, 8, 9, 10], "1000": 0, "millisecond": [0, 9], "proof_packet": 0, "valid": [0, 4, 6, 8, 9], "trip": [0, 6, 9], "fail": [0, 6], "store_tru": 0, "t": [0, 1, 4, 5, 6, 9], "metavar": 0, "float": [0, 6], "narg": 0, "timeoutarg": 0, "print_help": 0, "establish": [0, 1, 4, 5, 6, 10], "remot": [0, 6, 9], "forth": 0, "o": [0, 8, 9, 10], "refer": [0, 1, 3], "latest": [0, 1, 4], "latest_client_link": 0, "server_destin": 0, "linkexampl": 0, "set_link_established_callback": [0, 6], "client_connect": 0, "server_loop": 0, "set_link_closed_callback": [0, 6], "client_disconnect": 0, "server_packet_receiv": 0, "disconnect": 0, "activ": [0, 1, 4, 6, 8], "last": [0, 4, 6], "reply_text": 0, "reply_data": 0, "server_link": 0, "sleep": [0, 9], "begin": [0, 2, 6], "And": 0, "client_packet_receiv": 0, "close": [0, 5, 6, 9], "link_establish": 0, "link_clos": 0, "interact": [0, 1, 6, 8, 9], "client_loop": 0, "becom": [0, 1, 5, 8], "should_quit": 0, "fals": [0, 4, 6, 9], "should": [0, 1, 2, 4, 5, 6, 8, 9, 10], "q": [0, 9], "teardown": [0, 6], "mdu": 0, "size": [0, 1, 4, 6, 8, 9], "exce": [0, 4, 6], "log_error": 0, "error": [0, 1, 7, 9], "ha": [0, 1, 2, 4, 5, 6, 8, 10], "been": [0, 1, 2, 4, 5, 6, 8, 10], "later": [0, 1, 4], "teardown_reason": 0, "now": [0, 1, 5, 8, 9], "elif": 0, "destination_clos": 0, "exit_handl": 0, "5": [0, 4, 6, 9], "_exit": 0, "identifi": [0, 4, 6, 8, 9], "intiat": 0, "onc": [0, 1, 2, 4, 5, 6, 8, 9, 10], "initi": [0, 5, 6, 8, 10], "peer": [0, 1, 4, 6, 8, 9], "identifyexampl": 0, "set_remote_identified_callback": [0, 6], "remote_identifi": 0, "origin": [0, 5, 8], "displai": [0, 8], "remote_p": 0, "unidentifi": 0, "get_remote_ident": [0, 6], "client_ident": 0, "sendig": 0, "perform": [0, 1, 4, 5, 8], "random_text_gener": 0, "request_id": [0, 6], "remote_ident": [0, 6], "requested_at": [0, 6], "look": [0, 1, 4, 8, 9], "On": [0, 1, 4, 9], "full": [0, 4, 6, 8, 9, 10], "moon": 0, "becki": 0, "upset": 0, "stai": [0, 8, 9], "awai": [0, 4, 5, 8, 9], "pet": 0, "shop": 0, "stock": 0, "requestexampl": 0, "register_request_handl": [0, 6], "response_gener": [0, 6], "allow": [0, 1, 2, 4, 5, 6, 8, 9, 10], "allow_al": [0, 6], "response_callback": [0, 6], "got_respons": 0, "failed_callback": [0, 6], "request_fail": 0, "request_receipt": [0, 6], "request_receiv": 0, "implement": [0, 4, 5, 6, 7, 8, 10], "file": [0, 1, 2, 4, 5, 6, 8, 9, 10], "download": [0, 4, 9], "resourc": [0, 1, 3, 7], "effici": [0, 1, 4, 8, 10], "serv": [0, 2, 4, 5, 8, 9], "pleas": [0, 1, 4, 6, 9, 10], "note": [0, 1, 2, 4, 6, 8, 9], "larg": [0, 2, 4, 5, 6, 8, 10], "transfer": [0, 6, 8, 9, 10], "recommend": [0, 1, 2, 8], "compress": [0, 6, 8], "hashmap": 0, "sequenc": [0, 6, 8, 10], "long": [0, 1, 2, 4, 8], "slow": [0, 4, 8], "cpu": [0, 8], "probabl": [0, 5, 8, 9, 10], "result": [0, 8, 9], "befor": [0, 1, 4, 6, 8, 9], "complet": [0, 1, 2, 4, 5, 6, 8, 9, 10], "prepar": [0, 5], "bundl": 0, "instead": [0, 1, 4, 8, 9], "slice": 0, "chunk": 0, "suitabl": [0, 1, 4, 5, 8, 10], "pack": 0, "thread": 0, "vendor": [0, 2], "umsgpack": 0, "app_timeout": 0, "45": [0, 8], "serve_path": 0, "here": [0, 1, 2, 4, 8, 9], "conveni": 0, "list_fil": 0, "entri": [0, 1, 8], "actual": [0, 1, 4, 8], "listdir": 0, "isfil": 0, "join": [0, 1, 5, 7, 8], "host": [0, 1, 4, 8, 9], "still": [0, 1, 2, 5, 8], "isdir": 0, "packb": 0, "fit": 0, "list_packet": 0, "list_receipt": 0, "list_deliv": 0, "list_timeout": 0, "too": [0, 5], "mani": [0, 1, 2, 4, 5, 6, 8, 9, 10], "split": 0, "filelist": 0, "multipl": [0, 4, 5, 8, 9], "hint": 0, "alreadi": [0, 1, 2, 5, 8, 9], "support": [0, 1, 3, 5, 8, 10], "after": [0, 4, 5, 6, 8, 9], "re": [0, 4, 6, 8], "keep": [0, 5, 6, 8, 9, 10], "open": [0, 2, 4, 5, 6, 7, 8, 9, 10], "client_request": 0, "longer": [0, 5, 8, 9], "filenam": 0, "rb": 0, "file_resourc": 0, "resource_sending_conclud": 0, "somethign": 0, "went": 0, "wrong": [0, 4], "don": [0, 1, 2, 5, 6, 9], "unknown": [0, 4, 6, 8], "conclud": [0, 6], "hasattr": 0, "avail": [0, 1, 2, 4, 5, 6, 8, 9, 10], "server_fil": 0, "current": [0, 1, 2, 3, 4, 6, 8], "current_download": 0, "current_filenam": 0, "variabl": 0, "statist": [0, 4, 7], "download_start": 0, "download_finish": 0, "download_tim": 0, "transfer_s": 0, "file_s": 0, "expect": [0, 4, 6, 8, 9], "normal": [0, 4, 6], "accordingli": 0, "filelist_receiv": 0, "advertis": [0, 6], "set_resource_strategi": [0, 6], "accept_al": [0, 6], "set_resource_started_callback": [0, 6], "download_began": 0, "set_resource_concluded_callback": [0, 6], "download_conclud": 0, "menu": 0, "menu_mod": 0, "down": [0, 2, 4, 6], "request_packet": 0, "create_receipt": [0, 6], "print_menu": 0, "25": [0, 3, 10], "user_input": 0, "int": 0, "screen": 0, "variou": [0, 1, 4, 5, 8], "state": 0, "It": [0, 1, 2, 4, 6, 8, 9, 10], "uninterest": 0, "won": 0, "detail": [0, 1, 3, 4, 6, 9, 10], "clear_screen": 0, "print_filelist": 0, "percent": 0, "get_progress": [0, 6], "100": [0, 4, 8], "rprogress": 0, "save_error": 0, "could": [0, 1, 4, 5, 6, 8, 10], "disk": [0, 6], "hour": [0, 4], "rem": 0, "divmod": 0, "3600": [0, 4], "minut": [0, 1, 4, 8], "60": 0, "timestr": 0, "05": 0, "2f": 0, "ttime": 0, "taken": [0, 8], "tfile": 0, "size_str": 0, "tdata": 0, "teffect": 0, "rate": [0, 3, 9], "suffix": 0, "b": [0, 5, 9], "ttransfer": 0, "press": 0, "index": [0, 1, 3], "enumer": 0, "filelist_data": 0, "unpack": 0, "extend": [0, 1, 6], "local": [0, 1, 4, 5, 6, 8, 9, 10], "unpackb": 0, "append": [0, 8], "visibl": 0, "updat": [0, 1, 6, 8], "small": [0, 4, 5, 8, 10], "job": 0, "potenti": [0, 4, 7, 8, 9], "target": [0, 4, 9], "filelist_timeout_job": 0, "setdaemon": 0, "detect": 0, "shown": 0, "progress": [0, 6, 10], "total_s": 0, "saved_filenam": 0, "counter": 0, "wb": 0, "human": [0, 6, 7, 8], "readabl": [0, 6, 8], "num": 0, "unit": [0, 1, 9], "ki": 0, "mi": 0, "gi": 0, "ti": [0, 8], "pi": [0, 5, 8, 9, 10], "ei": 0, "zi": 0, "last_unit": 0, "yi": 0, "k": 0, "m": [0, 1, 8, 9], "g": 0, "p": [0, 9], "z": 0, "y": 0, "ab": 0, "1024": 0, "clear": [0, 6, 8], "cl": 0, "nt": 0, "dir": 0, "best": [1, 8, 10], "depend": [1, 2, 5, 6, 8, 9], "guid": [1, 2, 6, 8], "outlin": [1, 2, 8], "sensibl": [1, 2], "scenario": [1, 3, 8], "built": [1, 4, 8, 10], "few": [1, 2, 4, 5, 8, 9, 10], "other": [1, 2, 4, 5, 6, 8, 9], "even": [1, 2, 4, 5, 8, 9, 10], "extrem": [1, 8, 9, 10], "low": [1, 2, 4, 5, 8, 10], "bandwidth": [1, 4, 5, 6, 8, 10], "These": [1, 4, 8, 9], "feel": 1, "work": [1, 2, 4, 5, 8, 9, 10], "design": [1, 2, 5, 8, 10], "well": [1, 2, 4, 5, 6, 8, 10], "lora": [1, 2, 3, 8, 10], "wifi": [1, 3, 4, 5, 8, 9, 10], "wire": [1, 2, 3, 4, 10], "ethernet": [1, 2, 4, 5, 8, 10], "combin": [1, 3, 5, 8], "As": [1, 2, 4, 5, 6, 8, 10], "easi": [1, 2, 4, 8, 9, 10], "experi": [1, 8], "without": [1, 2, 5, 8, 10], "transceiv": [1, 2, 4, 8, 10], "infrastructur": [1, 2, 4, 5, 8, 9], "launch": [1, 9], "separ": [1, 4, 5, 8, 9], "devic": [1, 2, 3, 4, 5, 6, 8, 9], "same": [1, 2, 4, 5, 6, 8, 9], "enough": [1, 2, 8], "physic": [1, 2, 4, 8, 9], "termin": [1, 6], "suit": [1, 2, 8, 9], "featur": [1, 7, 8, 10], "both": [1, 2, 4, 5, 6, 8, 9, 10], "delai": [1, 4, 8, 9], "offlin": 1, "share": [1, 5, 6, 8, 9], "browser": 1, "page": [1, 3, 8], "dynam": [1, 9], "render": 1, "authent": [1, 4, 5, 6, 8, 9, 10], "more": [1, 2, 4, 5, 6, 8, 9, 10], "face": [1, 4], "protocol": [1, 2, 3, 4, 10], "lxmf": 1, "anoth": [1, 6, 8, 9], "project": 1, "instal": [1, 3, 4, 5, 8, 9, 10], "via": [1, 2, 4, 7, 8, 9, 10], "pip": [1, 2, 9], "pip3": [1, 2, 9], "nomadnet": 1, "veri": [1, 2, 4, 5, 6, 7, 8, 9, 10], "might": [1, 4, 5, 8, 9], "reboot": 1, "similar": [1, 2, 4, 5, 9, 10], "again": [1, 4, 8, 9], "would": [1, 4, 5, 6, 8], "rather": 1, "graphic": 1, "linux": [1, 8], "maco": 1, "earli": [1, 2], "stage": [1, 8], "interoper": [1, 2, 5, 8, 10], "come": [1, 8], "make": [1, 2, 4, 7, 8, 9], "easier": [1, 4, 5, 9], "manag": [1, 5, 6, 8, 9], "rnsd": [1, 3], "background": [1, 4], "foreground": 1, "servic": [1, 3, 5], "rnstatu": [1, 3, 4, 8], "rnpath": [1, 3, 4], "rnprobe": [1, 3], "view": [1, 4, 8, 9], "chapter": [1, 2, 4, 5, 8, 9, 10], "locat": [1, 2, 5, 8, 9], "edit": [1, 9], "rnsconfig": 1, "broadcast": [1, 3, 4, 6, 8], "domain": [1, 4], "further": [1, 3, 4], "exampl": [1, 2, 3, 4, 6, 8, 9, 10], "tcp": [1, 2, 3, 5, 8, 10], "There": [1, 5, 8, 10], "subnet": [1, 5], "rout": [1, 4, 5, 6, 8, 9, 10], "tabl": [1, 4, 5, 8, 9], "thing": 1, "discov": [1, 4], "topographi": [1, 5, 8], "situat": [1, 2, 4, 5, 8], "where": [1, 2, 3, 4, 5, 6, 8, 9], "utilis": [1, 5, 9, 10], "extern": [1, 4, 6, 10], "often": [1, 4, 5, 8, 9], "suffici": [1, 4, 8, 9], "act": [1, 6, 8, 9], "gatewai": [1, 4, 5, 8], "enabl": [1, 2, 4, 5, 6, 8, 9], "wider": [1, 4, 8, 9], "autointerfac": [1, 2, 4, 9], "possibli": 1, "offer": [1, 3, 4, 6, 8], "i2p": [1, 3, 10], "carefulli": 1, "tcpserverinterfac": [1, 4], "access": [1, 3, 4, 5, 6, 9], "ip": [1, 2, 4, 8, 9, 10], "faster": [1, 4, 8], "lower": [1, 4, 9], "latenc": [1, 8, 10], "energi": 1, "i2pinterfac": [1, 4], "howev": [1, 5, 8], "leak": 1, "reveal": [1, 6, 8, 10], "who": [1, 8], "inspect": [1, 4, 5, 8], "someon": [1, 4], "determin": [1, 6, 8], "adversari": 1, "mai": [1, 4, 6, 8, 9], "record": [1, 8], "metadata": 1, "like": [1, 2, 4, 5, 6, 8, 9, 10], "transmiss": [1, 4, 6, 8], "though": [1, 2, 4, 8], "publicli": 1, "most": [1, 2, 4, 5, 8, 9], "anymor": 1, "through": [1, 2, 4, 5, 6, 8, 9, 10], "invis": [1, 4], "daemon": [1, 4, 6, 9], "parallel": 1, "For": [1, 2, 4, 5, 6, 8, 10], "alwai": [1, 4, 6, 8, 9], "node": [1, 3, 4, 5, 9, 10], "i2pd": [1, 4], "mix": [1, 4, 5, 9], "hide": 1, "relai": 1, "extra": [1, 4, 5, 9], "comput": [1, 8, 10], "power": [1, 2, 4, 8], "attack": 1, "form": [1, 4, 5, 6, 8], "deep": 1, "much": [1, 4, 5, 8, 9], "difficult": [1, 2], "non": [1, 6, 8], "behind": [1, 8], "firewal": [1, 4], "nat": 1, "preserv": [1, 6], "anonym": [1, 5, 6, 8, 10], "care": [1, 2, 6, 10], "slightli": 1, "experiment": [1, 2, 10], "made": [1, 6, 8], "dublin": 1, "hub": [1, 4], "tcpclientinterfac": [1, 2, 4], "ye": [1, 4, 8, 9], "target_host": [1, 4], "target_port": [1, 4], "4965": [1, 9], "frankfurt": [1, 9], "5377": 1, "uxg5kubabakh3jtnvsipingbr5574dle7bubvip7llfvwx2tgrua": 1, "b32": [1, 4], "point": [1, 2, 4, 5, 8, 9], "absolut": [1, 2, 7, 10], "usag": [1, 3, 4, 7, 9], "occasion": 1, "test": [1, 2, 8], "failur": [1, 4], "guarante": [1, 8], "compat": [1, 2, 4, 6, 8], "hardwar": [1, 3, 4, 5, 6, 8, 9, 10], "wide": [1, 2, 4, 8, 10], "section": [1, 2, 4, 5, 8, 9], "easili": [1, 4, 5, 8, 9, 10], "cheapli": 1, "rnode": [1, 3, 8, 9, 10], "purpos": [1, 2, 4, 6, 8], "digit": [1, 2, 8, 10], "integr": [1, 5, 8], "yourself": [1, 8, 10], "custom": [1, 4, 6, 8, 10], "firmwar": [1, 2, 8], "board": [1, 3, 8, 10], "auto": [1, 2, 3, 6, 8], "script": [1, 2], "prefer": [1, 8], "purchas": [1, 5, 8, 10], "supplier": [1, 3], "addit": [1, 2, 4, 8, 9, 10], "privat": [1, 4, 6, 7, 8, 10], "secur": [1, 8, 10], "uncensor": 1, "mesh": [1, 4, 5, 10], "think": 1, "welcom": 1, "head": 1, "discuss": [1, 2, 8], "propos": 1, "easiest": [1, 2, 4, 8], "releas": [1, 2, 4, 8], "abov": [1, 2, 4, 8, 9], "next": [1, 5, 6, 8], "step": [1, 2], "pyseri": 1, "netifac": 1, "api": [1, 3, 8, 10], "associ": [1, 6, 8], "case": [1, 2, 4, 5, 8, 9], "recip": 1, "cryptographi": [1, 8, 10], "clone": 1, "repositori": [1, 7, 8], "git": 1, "move": [1, 4, 8], "folder": 1, "symlink": [1, 9], "librari": 1, "cd": 1, "ln": [1, 9], "python3": [1, 2], "echo": [1, 3, 9], "unless": [1, 4, 6, 8], "ve": 1, "immedi": [1, 4, 9], "necessari": [1, 2, 4, 5, 6, 8], "nano": 1, "repeat": 1, "process": [1, 2, 4, 6, 8], "h": [1, 9], "ping": [1, 9], "replac": [1, 8, 9], "below": [1, 2, 4, 9], "3e12fc71692f8ec47bc5": 1, "filetransf": [1, 3, 6], "understand": [1, 3, 9], "architectur": 1, "precompil": 1, "dev": [1, 4, 9], "packag": [1, 4, 8], "sudo": [1, 9], "apt": 1, "relat": 1, "termux": 1, "f": 1, "droid": 1, "emul": 1, "environ": [1, 5, 8], "abil": [1, 2], "io": [1, 2, 9], "pre": [1, 2, 6, 8], "wheel": 1, "standard": [1, 2, 8], "sure": [1, 2, 9], "pkg": 1, "upgrad": [1, 8], "Then": 1, "essenti": [1, 4, 8], "openssl": [1, 8], "libffi": 1, "rust": 1, "platform": [1, 2, 8], "compil": 1, "export": 1, "cargo_build_target": 1, "aarch64": 1, "sever": [1, 5, 6, 9], "succe": 1, "softwar": [1, 2, 4, 8, 10], "possibl": [1, 2, 4, 5, 6, 8, 10], "apk": 1, "tutori": 1, "code": [1, 2, 3, 4, 9], "rare": [1, 4], "obscur": 1, "unusu": 1, "rnspure": 1, "content": [1, 5, 9], "No": [1, 4, 8, 9, 10], "matter": [1, 4], "perfectli": 1, "serial": [1, 2, 3, 8, 10], "pyca": [1, 8], "cryptograph": [1, 3, 5, 10], "primit": [1, 3], "One": [2, 6], "truli": [2, 8], "valuabl": [2, 7], "almost": [2, 4, 8, 9], "conceiv": 2, "kind": [2, 4, 5, 8], "medium": [2, 4, 5, 6, 8, 10], "flexibl": [2, 4, 10], "cover": [2, 8, 10], "wireless": [2, 5], "decad": 2, "old": [2, 7, 8], "radio": [2, 3, 4, 5, 6, 8, 9, 10], "modem": [2, 4, 5, 6, 8, 10], "modern": [2, 8], "millimet": 2, "wave": 2, "backhaul": [2, 5], "oper": [2, 4, 5, 6, 8, 9, 10], "good": [2, 5, 8, 9], "chanc": 2, "box": 2, "glue": 2, "littl": [2, 8], "effort": 2, "pipeinterfac": [2, 4], "kiss": [2, 3, 9, 10], "simplyequip": 2, "broad": 2, "abund": 2, "sometim": 2, "especi": [2, 4], "scratch": 2, "real": [2, 5, 10], "world": [2, 5, 10], "minim": [2, 3, 8], "cost": [2, 8, 10], "fundament": [2, 8], "categori": 2, "emploi": [2, 8], "reliabl": [2, 4, 5, 8, 10], "commonli": 2, "either": [2, 4, 5, 8, 9], "expens": 2, "hard": 2, "hungri": 2, "attempt": [2, 6], "allevi": 2, "particular": 2, "plaform": 2, "its": [2, 4, 6, 8], "compon": [2, 7, 8], "frequenc": [2, 4, 8], "band": [2, 8], "scheme": 2, "limit": [2, 5, 8], "common": [2, 3, 5, 8, 9, 10], "ism": [2, 8], "avoid": [2, 8, 9], "confus": [2, 8], "layer": [2, 4, 5, 8, 10], "noth": [2, 10], "lorawan": [2, 8], "central": [2, 5, 8], "iot": 2, "raw": 2, "overhead": [2, 4, 8], "high": [2, 4, 8, 10], "level": [2, 4, 8, 9], "directli": [2, 4, 6, 8, 9, 10], "replic": [2, 8], "across": [2, 5], "togeth": [2, 8, 9], "tool": [2, 8, 9, 10], "exact": [2, 4, 8], "explain": [2, 6], "approach": [2, 8, 9], "develop": [2, 3, 7, 8, 10], "boil": 2, "obtain": [2, 8], "autom": [2, 7, 8], "provis": 2, "rnodeinterfac": [2, 4, 9], "ic": 2, "semtech": 2, "sx1276": 2, "esp32": 2, "manufactur": 2, "avr": 2, "atmega1284p": 2, "rnodeconf": 2, "autoinstal": 2, "seri": 2, "question": [2, 4], "consid": [2, 6, 8, 10], "newest": [2, 8], "version": [2, 8, 9], "stabil": 2, "paramet": [2, 4, 5, 6, 8], "port": [2, 3, 4, 5, 8, 10], "air": [2, 10], "id": [2, 4, 6, 8, 9], "itself": [2, 3, 8], "touch": [2, 10], "produc": 2, "short": [2, 8, 9], "fulli": [2, 8, 10], "bridg": [2, 3], "behav": 2, "mean": [2, 4, 5, 8, 9], "link": [2, 3, 4, 5, 9, 10], "dhcp": [2, 4, 9], "dn": 2, "least": [2, 4, 8, 9, 10], "transpar": [2, 4, 8, 9], "capac": [2, 4, 6, 8], "distanc": [2, 8], "ubiqu": 2, "airmax": 2, "ltu": 2, "mikrotik": 2, "exhaust": [2, 8], "rel": [2, 8, 10], "cheap": [2, 8], "co": [2, 4, 10], "concurr": [2, 8, 9], "pattern": [2, 8], "gain": [2, 8], "antenna": 2, "backbon": 2, "area": [2, 4, 5, 8, 10], "aim": [3, 8], "particip": [3, 5, 8], "caveat": 3, "emptor": 3, "fast": [3, 4, 6, 8], "base": [3, 4, 5, 6, 8, 9, 10], "nomad": 3, "sideband": 3, "With": [3, 4, 5, 8, 9], "internet": [3, 4, 8, 10], "testnet": [3, 9], "arm64": 3, "android": 3, "pure": [3, 8], "python": [3, 8, 9, 10], "rncp": 3, "rnx": 3, "improv": [3, 4, 7], "fix": [3, 8], "motiv": 3, "goal": [3, 4], "introduct": 3, "announc": [3, 6, 9], "mechan": [3, 4], "reach": [3, 4, 5], "prioritis": [3, 4, 5, 6], "propag": [3, 4, 6], "rule": [3, 4], "udp": [3, 5, 8, 9, 10], "pipe": [3, 10], "ax": [3, 10], "concept": [3, 8, 9], "overview": [3, 4, 8], "interconnect": [3, 4, 8], "site": [3, 4], "growth": 3, "converg": [3, 8], "request": [3, 4, 8, 9], "identif": [3, 4, 10], "respons": [3, 6, 8], "donat": 3, "contribut": 3, "search": 3, "distinct": [4, 8], "topologi": [4, 8], "less": [4, 8, 10], "endless": 4, "describ": [4, 6, 8], "give": [4, 8, 9], "respect": 4, "discover": 4, "autoconfigur": [4, 10], "ipv6": [4, 9], "router": [4, 9], "sort": [4, 8], "switch": [4, 8], "os": 4, "interface_en": [4, 9], "isol": [4, 9], "lan": 4, "group": [4, 6, 8], "group_id": 4, "kernel": [4, 9, 10], "wlan0": 4, "eth1": 4, "Or": [4, 9, 10], "ignor": [4, 6, 8], "ones": [4, 9], "ignored_devic": 4, "tun0": 4, "eth0": 4, "multicast": 4, "autodiscov": 4, "discoveri": [4, 8, 9], "scope": 4, "admin": 4, "organis": [4, 5, 7], "custom_network_nam": 4, "discovery_scop": 4, "discovery_port": 4, "48555": 4, "data_port": 4, "49555": 4, "frequent": 4, "block": 4, "inbound": [4, 6], "portabl": [4, 8], "persist": [4, 9], "achiev": [4, 6, 8], "geti2p": 4, "net": 4, "websit": 4, "base32": 4, "comma": 4, "5urvjicpzi7q3ybztsef4i5ow2aq4soktfj7zedz53s47r54jnqq": 4, "output": [4, 9], "event": 4, "simplest": [4, 8], "tunnel": [4, 8, 10], "interchang": 4, "degre": 4, "retain": 4, "eas": [4, 8], "simpler": 4, "4242": 4, "listen_ip": 4, "listen_port": 4, "bind": 4, "10": [4, 8, 9], "88": 4, "i2p_tunnel": 4, "127": 4, "5001": 4, "dedic": [4, 8], "natur": 4, "toler": 4, "intermitt": 4, "gracefulli": 4, "restor": 4, "reappear": 4, "hostnam": 4, "expos": [4, 6], "soundmodem": 4, "kiss_fram": 4, "tnc": [4, 6, 9, 10], "8001": 4, "caution": 4, "frame": 4, "conjunct": 4, "never": [4, 6, 8], "disabl": [4, 8, 9], "intern": [4, 6, 8], "recoveri": 4, "greatli": 4, "unreli": 4, "implic": 4, "better": 4, "udpinterfac": 4, "forward_ip": 4, "255": 4, "forward_port": 4, "assum": [4, 8], "55": 4, "72": 4, "24": 4, "equival": 4, "forward": [4, 6, 8, 10], "segment": [4, 5, 6, 8, 10], "cours": [4, 8], "15": 4, "16": [4, 8, 9], "ttyusb0": [4, 9], "867": 4, "mhz": [4, 8], "867200000": 4, "125": 4, "khz": 4, "125000": 4, "tx": 4, "7": [4, 9], "mw": 4, "txpower": 4, "spread": 4, "factor": [4, 6], "12": 4, "being": [4, 6, 8], "fastest": [4, 8], "longest": 4, "spreadingfactor": 4, "throough": 4, "codingr": 4, "interv": [4, 6], "id_callsign": 4, "mycal": 4, "id_interv": 4, "600": 4, "homebrew": 4, "amount": [4, 5, 6, 8, 10], "ram": 4, "flow": [4, 5], "flow_control": 4, "pair": [4, 8], "laser": 4, "serialinterfac": 4, "baud": 4, "speed": [4, 8, 9], "115200": [4, 9], "databit": [4, 9], "pariti": [4, 9], "stopbit": [4, 9], "stdin": [4, 9], "virtual": [4, 5, 8, 9, 10], "netcat": 4, "l": [4, 9], "5757": 4, "respawn": 4, "respawn_delai": 4, "continu": [4, 7, 10], "scan": 4, "eof": 4, "respawn_interv": 4, "varieti": [4, 8, 9, 10], "openmodem": [4, 10], "period": [4, 6, 8], "beacon": 4, "station": 4, "kissinterfac": [4, 9], "ttyusb1": 4, "preambl": [4, 9], "150": [4, 9], "tail": 4, "txtail": [4, 9], "cdma": 4, "reason": [4, 8], "200": [4, 9], "slottim": [4, 9], "20": [4, 8, 9], "elaps": 4, "comment": [4, 9], "buffer": 4, "amateur": [4, 10], "spectrum": [4, 8], "encapsul": [4, 10], "callsign": 4, "ssid": 4, "realli": [4, 6], "doesn": 4, "anyth": [4, 8, 9, 10], "incur": 4, "ax25kissinterfac": 4, "no1cll": 4, "ttyusb2": 4, "150m": 4, "increas": [4, 9], "squelch": 4, "rx": 4, "turnaround": 4, "kept": [4, 5, 6, 8], "wast": 4, "airtim": 4, "behaviour": [4, 9], "bring": 4, "brought": [4, 9], "valu": [4, 6, 8], "access_point": 4, "shorthand": [4, 9], "ap": 4, "shorter": 4, "expiri": 4, "mostli": [4, 5, 8], "quiet": [4, 9], "momentarili": 4, "disappear": [4, 9], "network_nam": 4, "passphras": [4, 8], "alon": 4, "ifac_s": 4, "customis": 4, "carri": [4, 6, 8, 9], "512": [4, 6, 8], "bit": [4, 6, 8, 9, 10], "announce_cap": [4, 6], "maximum": [4, 6, 8], "alloc": [4, 6, 8, 9], "given": [4, 5, 6, 8, 9], "upkeep": 4, "cap": 4, "queue": [4, 8], "nearbi": 4, "ensur": [4, 6, 8], "overwhelm": [4, 6], "rapidli": 4, "spam": 4, "opposit": 4, "effect": 4, "excess": 4, "benefici": [4, 9], "balanc": 4, "necesarri": 4, "bitrat": 4, "report": [4, 7], "guess": 4, "per": [4, 6, 8, 10], "affect": 4, "strictli": [4, 8], "complex": [4, 8], "left": [4, 6, 8, 9], "gw": 4, "addition": [4, 8], "behalf": 4, "resid": 4, "requestor": 4, "resolv": 4, "chain": 4, "along": [4, 5, 8], "boundari": 4, "remain": [4, 6, 8], "roam": 4, "mobil": [4, 8], "seen": [4, 8], "perspect": [4, 8], "vehicl": 4, "equip": [4, 5, 8], "side": [4, 10], "expir": 4, "significantli": 4, "impact": [4, 8], "announce_rate_target": 4, "announce_rate_grac": 4, "announce_rate_penalti": 4, "basi": [4, 6, 8, 9, 10], "moder": 4, "violat": 4, "enforc": 4, "penalti": 4, "7200": 4, "annouce_cap": 4, "mention": [4, 8], "strategi": [4, 6], "decis": [4, 8], "slower": [4, 6, 8], "hop": [4, 5, 6, 8, 9, 10], "right": [4, 5], "tend": 4, "conserv": 4, "span": [4, 8], "seamlessli": 4, "knowledg": [5, 8], "tradit": [5, 8], "worri": 5, "coordin": [5, 6, 8, 10], "entir": [5, 8, 9], "evolv": 5, "futur": [5, 8], "mind": [5, 10], "autonom": [5, 8], "terminologi": [5, 8], "rest": [5, 10], "billion": [5, 8], "larger": [5, 8], "higher": [5, 10], "issu": [5, 7], "discrimin": 5, "ephemer": [5, 6, 8, 10], "ellipt": [5, 6, 8, 10], "curv": [5, 6, 8, 10], "diffi": [5, 8, 10], "hellman": [5, 8, 10], "exchang": [5, 6, 8, 10], "curve25519": [5, 6, 8, 10], "throttl": 5, "thu": [5, 6, 8], "agnost": [5, 8], "equal": [5, 8], "keystor": 5, "degrad": 5, "term": [5, 8], "stationari": [5, 9], "candid": 5, "optim": 5, "intend": [5, 8], "trustless": [5, 8, 10], "leav": [5, 8], "free": [5, 7, 10], "unorganis": 5, "manner": 5, "properti": [5, 6], "far": [5, 8], "unexplor": 5, "dissolv": 5, "organ": 5, "restrict": 5, "legaci": 5, "unifi": 5, "underli": [5, 10], "carrier": [5, 10], "involv": 5, "hardlin": 5, "decid": [5, 6, 8], "illustr": [5, 8], "plan": [5, 8], "member": 5, "mainli": 5, "three": [5, 8], "hill": 5, "top": [5, 8], "chosen": [5, 8], "due": 5, "sight": 5, "becaus": [5, 8], "four": 5, "At": [5, 8], "raspberri": [5, 8, 9, 10], "usb": [5, 8, 9], "cabl": 5, "adapt": 5, "suppli": [5, 6, 8], "grow": 5, "place": [5, 8, 9], "core": [5, 8, 10], "those": [5, 8], "previous": [5, 6, 8], "d": [5, 9], "island": 5, "investig": 5, "dori": 5, "willing": 5, "she": 5, "her": 5, "home": 5, "newli": [5, 6, 8], "everyon": [5, 8], "vice": [5, 10], "versa": [5, 10], "vhf": [5, 8, 10], "outli": 5, "geograph": 5, "coverag": 5, "dai": 5, "find": [5, 8], "were": 5, "poorli": 5, "outlier": 5, "configdir": 6, "logdest": 6, "exactli": [6, 8], "independ": [6, 8, 10], "inter": 6, "soon": 6, "kill": [6, 8], "forcibli": [6, 9], "advantag": 6, "demand": 6, "mtu": [6, 8, 10], "500": [6, 8, 10], "adher": 6, "507": 6, "break": [6, 8, 10], "prerequisit": 6, "percentag": 6, "schedul": 6, "queu": [6, 9], "fewer": 6, "distant": 6, "smaller": 6, "eventu": 6, "drop": [6, 8, 9], "appli": [6, 8], "individu": [6, 8], "static": 6, "should_use_implicit_proof": 6, "explicit": 6, "implicit": [6, 8], "transport_en": 6, "create_kei": 6, "decrypt": [6, 8], "signatur": [6, 8, 10], "verif": [6, 8], "sign": [6, 8], "dh": 6, "keysiz": 6, "x25519": [6, 8, 10], "concaten": 6, "256": [6, 8], "128": [6, 8, 10], "constant": 6, "truncat": [6, 8], "recall_app_data": 6, "heard": [6, 8], "full_hash": 6, "sha": [6, 8], "truncated_hash": 6, "from_byt": 6, "prv_byte": 6, "save": [6, 8], "hazard": 6, "feed": 6, "from_fil": 6, "to_fil": 6, "Be": [6, 9], "otherwis": 6, "get_private_kei": 6, "get_public_kei": 6, "load_private_kei": 6, "load_public_kei": 6, "pub_byt": 6, "ciphertext": 6, "token": [6, 8], "keyerror": 6, "hold": [6, 8], "ciphertext_token": 6, "presenc": 6, "ingo": 6, "zero": [6, 10], "full_nam": [6, 9], "app_and_aspects_from_nam": 6, "tupl": 6, "hash_from_name_and_ident": 6, "path_respons": 6, "flag": [6, 8], "accepts_link": 6, "accept": [6, 7, 8, 9], "set_proof_requested_callback": 6, "proof_strategi": 6, "prove_non": 6, "prove_app": 6, "proof_requested_callback": 6, "allowed_list": 6, "whatev": [6, 8], "funcion": 6, "allow_non": 6, "allow_list": 6, "deregister_request_handl": 6, "deregist": 6, "symmetr": [6, 8], "typeerror": 6, "incompat": [6, 8], "set_default_app_data": 6, "callabl": 6, "clear_default_app_data": 6, "secreci": [6, 8, 10], "payload": [6, 8], "instanti": 6, "encrypted_mdu": 6, "383": 6, "plain_mdu": 6, "464": 6, "resend": 6, "get_statu": 6, "cull": 6, "successful": 6, "proven": [6, 8], "established_callback": 6, "closed_callback": 6, "establishment_timeout_per_hop": 6, "keepalive_timeout_factor": 6, "4": [6, 8, 9], "calcul": [6, 8], "stale_grac": 6, "grace": 6, "keepal": [6, 8], "360": 6, "aliv": [6, 8], "stale_tim": 6, "720": 6, "mark": [6, 8], "stale": 6, "final": [6, 8], "torn": 6, "progress_callback": 6, "info": [6, 8, 9], "requestreceipt": 6, "no_inbound_for": 6, "no_outbound_for": 6, "outbound": [6, 8], "inactive_for": 6, "purg": 6, "set_resource_callback": 6, "get_transfer_s": 6, "get_data_s": 6, "get_part": 6, "is_compress": 6, "begun": 6, "resource_strategi": 6, "accept_non": 6, "accept_app": 6, "resource_callback": 6, "unsupport": 6, "get_request_id": 6, "get_respons": 6, "get_response_tim": 6, "auto_compress": 6, "arbitrari": [6, 8, 10], "checksum": [6, 10], "Will": 6, "whenev": [6, 8], "cancel": 6, "total": [6, 8, 10], "get_seg": 6, "divid": 6, "get_hash": 6, "pathfinder_m": 6, "object": 6, "attribut": 6, "deregister_announce_handl": 6, "hops_to": 6, "next_hop": 6, "next_hop_interfac": 6, "on_interfac": 6, "tag": 6, "recurs": 6, "gratefulli": 7, "monero": 7, "84fpy1qbxhcgdseepynmhthcrgmx4nffbytz2gkytoqhvvhjp8eaw1z1eedrnkd19b3b8nilcgvxzkv17ummmeescrpya5w": 7, "ethereum": 7, "0x81f7b979fea6134ba9fd5c701b3501a2e61e897a": 7, "bitcoin": 7, "3cpmacgm34qyvr6xwlvejmi2ane3pzquuq": 7, "ko": 7, "fi": 7, "roadmap": 7, "realiti": 7, "quickli": [7, 8, 10], "sponsor": [7, 10], "dysfunct": 7, "analyt": 7, "telemetri": 7, "collect": 7, "under": [7, 9], "circumst": [7, 8], "reli": [7, 8], "fashion": 7, "u": [7, 8], "suggest": 7, "briefli": 8, "overal": 8, "principl": [8, 10], "author": 8, "That": 8, "said": 8, "document": 8, "pretti": 8, "sentiment": 8, "philosophi": 8, "problem": 8, "seek": 8, "solv": 8, "solut": 8, "primari": 8, "lack": 8, "my": 8, "belief": 8, "highli": 8, "peopl": 8, "machin": 8, "censorship": 8, "barrier": 8, "todai": 8, "centralis": 8, "trust": 8, "approv": 8, "gatekeep": 8, "inevit": 8, "lead": 8, "govern": 8, "alter": 8, "censor": 8, "persecut": 8, "unwant": 8, "actor": 8, "imposs": 8, "freeli": 8, "deploi": 8, "enhanc": 8, "agenc": 8, "freedom": 8, "permissionless": 8, "pick": 8, "ghz": 8, "off": [8, 10], "shelf": [8, 10], "ultim": 8, "vast": 8, "myriad": 8, "thousand": 8, "surveil": 8, "disassoci": 8, "oversight": 8, "beings": 8, "usabl": 8, "useabl": 8, "critic": [8, 9], "agnostic": 8, "shall": 8, "handheld": 8, "stream": 8, "modifi": [8, 9], "interest": 8, "strong": 8, "oneself": 8, "unlicens": 8, "licens": 8, "condit": 8, "pmr": 8, "cb": 8, "wish": [8, 9], "written": 8, "programm": 8, "orient": 8, "multipoint": 8, "recipi": 8, "idea": [8, 9], "singular": 8, "_represented_": 8, "deriv": [6, 8, 10], "characterist": 8, "13425ec15b621c1d928589718000d814": 8, "trade": 8, "accommod": 8, "simultan": 8, "unlik": 8, "nears": 8, "congest": 8, "galact": 8, "scale": 8, "obvious": 8, "ridicul": 8, "multi": [8, 9, 10], "special": [8, 9], "uniqu": [8, 10], "ecdh": [8, 10], "creator": 8, "correspond": 8, "possess": 8, "although": [8, 10], "abstract": 8, "capabl": 8, "dot": [8, 9], "notat": [8, 9], "repres": 8, "plenti": 8, "environment": 8, "monitor": 8, "measur": 8, "environmentlogg": 8, "remotesensor": 8, "temperatur": 8, "4faf1b2e0a077e6a9d92fa051f256038": 8, "advis": 8, "expand": 8, "structur": 8, "recap": 8, "indirectli": 8, "awar": 8, "ledger": 8, "therefor": [8, 10], "definit": 8, "messeng": 8, "nicknam": 8, "ed25519": [8, 10], "reconstruct": 8, "notic": [8, 9], "piec": 8, "intention": 8, "infer": 8, "throughout": 8, "accord": 8, "around": 8, "assign": [8, 9], "topic": 8, "necessarili": 8, "person": 8, "entiti": 8, "robot": 8, "sensor": 8, "someth": 8, "agent": 8, "manipul": 8, "multilater": 8, "creation": 8, "great": 8, "suffic": 8, "cluster": 8, "hear": 8, "But": 8, "introduc": 8, "lot": 8, "surviv": 8, "overcom": 8, "challeng": 8, "asymmetr": [8, 10], "closer": 8, "distinguish": 8, "contend": 8, "enable_transport": [8, 9], "retransmit": 8, "randomis": 8, "prioriti": 8, "invers": 8, "proport": 8, "count": 8, "insert": 8, "closest": 8, "greater": 8, "retri": 8, "newer": 8, "discard": 8, "contact": 8, "shortest": 8, "predict": 8, "constantli": 8, "earlier": 8, "opt": 8, "against": 8, "ae": [6, 8, 10], "neither": 8, "session": 8, "bidirect": 8, "travers": 8, "rememb": 8, "subsequ": 8, "ten": 8, "advanc": 8, "confirm": [8, 10], "insid": 8, "intermediari": 8, "moment": [8, 10], "methodologi": [8, 9], "answer": [8, 9], "malici": 8, "pretend": 8, "recreat": 8, "rotat": 8, "procedur": 8, "memori": 8, "thereaft": 8, "297": [8, 10], "practic": [8, 10], "neglig": 8, "1200": 8, "96": 8, "keypair": 8, "simplic": 8, "explan": [8, 9], "lki": 8, "laid": 8, "had": 8, "construct": 8, "lkr": 8, "chose": 8, "bi": 8, "unequivoc": 8, "retransmiss": 8, "reassembl": 8, "programmat": 8, "satisfi": 8, "half": [8, 10], "duplex": [8, 10], "averag": 8, "throughput": [8, 10], "x": [8, 9], "runtim": 8, "consist": 8, "whereupon": 8, "stabl": [8, 10], "maintain": 8, "year": 8, "microcontrol": 8, "430": 8, "868": 8, "900": 8, "debian": [8, 9], "recent": 8, "mac": 8, "tailor": 8, "treat": 8, "regard": 8, "preshar": 8, "ifac": [8, 9], "onto": 8, "compos": 8, "field": 8, "header": 8, "32": 8, "context": 8, "465": 8, "vari": [8, 9], "64": [8, 9], "00": [8, 9], "01": 8, "reserv": 8, "11": 8, "_______": 8, "________________": 8, "________": 8, "______": 8, "__": 8, "_": 8, "01010000": 8, "00000100": 8, "hash1": 8, "hash2": 8, "header_2": 8, "00000000": 8, "00000111": 8, "header_1": 8, "10000000": 8, "exclud": 8, "51": 8, "157": 8, "83": [8, 9], "115": 8, "99": 8, "conceptu": 8, "x22519": 8, "hkdf": 8, "fernet": [8, 10], "cbc": [8, 10], "hmac": [8, 10], "hashlib": 8, "pkcs7": [8, 10], "pad": [8, 10], "trivial": [8, 10], "consequ": 8, "backend": 8, "loss": 8, "scrutini": 8, "review": [8, 10], "risk": 8, "pose": 8, "driver": [9, 10], "privileg": 9, "light": 9, "weight": 9, "boot": 9, "verbos": 9, "exampleconfig": 9, "ie": 9, "remov": 9, "breviti": 9, "socket": 9, "turn": 9, "share_inst": 9, "shared_instance_port": 9, "37428": 9, "instance_control_port": 9, "37429": 9, "panic": 9, "unrecover": 9, "occur": [9, 10], "panic_on_interface_error": 9, "warn": 9, "6": 9, "debug": 9, "unus": 9, "order": 9, "teach": 9, "task": 9, "v": 9, "show": 9, "ifconfig": 9, "gbp": 9, "13": 9, "kb": 9, "86": 9, "mbp": 9, "63": 9, "23": 9, "80": 9, "17": 9, "tcpinterfac": 9, "unsign": 9, "187": 9, "27": 9, "74": 9, "uhf": [9, 10], "30": 9, "kbp": 9, "e702c42ba8": 9, "49": 9, "9": 9, "5245a8efe1788c6a1cd36144a270e13b": 9, "c89b4da064bf66d280f0e4d8abfd9806": 9, "f53a1c4278e0726bb73fcc623d6ce763": 9, "reticulu": 9, "w": 9, "posit": 9, "probe": 9, "2d03725b327348980d570f739a3a5708": 9, "38": 9, "469": 9, "1726dbad538775b5bf9b0ea25a4079c8": 9, "c50cc4e4f7838b6c31f60ab9032cbc62": 9, "copi": 9, "tgz": 9, "73cbd378bb0286ed11a707c13447bb1": 9, "allowed_hash": 9, "decreas": 9, "auth": 9, "941bed5e228775e5a8079fc38b1ccf3f": 9, "1b03013c25f1c2ca068a4f080b844a10": 9, "7a55144adf826958a9529a3bcf08b149": 9, "cat": 9, "proc": 9, "cpuinfo": 9, "pseudo": 9, "shell": 9, "stderr": 9, "noauth": 9, "noid": 9, "mirror": 9, "max": 9, "perman": 9, "administr": 9, "ubuntu": 9, "ftdi_ft230x_basic_uart_43891ckm": 9, "if00": 9, "port0": 9, "plug": 9, "unplug": 9, "systemd": 9, "usr": 9, "bin": 9, "etc": 9, "execstartpr": 9, "restart": 9, "restartsec": 9, "usernameher": 9, "execstart": 9, "wantedbi": 9, "systemctl": 9, "readili": 10, "unforg": 10, "acknowledg": 10, "resili": 10, "userland": 10, "beta": 10, "bug": 10, "warrant": 10, "sha256": 10, "iv": 10, "urandom": 10, "intuit": 10, "friendli": 10, "44": 10, "gigabyt": 10, "scalabl": 10, "hoc": 10, "optic": 10, "transform": 10, "stop": 10, "fact": 10, "strength": 10, "generalis": 10, "fibr": 10, "popular": 10, "ideal": 10, "stdio": 10, "hack": 10, "foremost": 10, "audit": 10, "privaci": 10, "thorough": 10, "research": 10}, "objects": {"RNS": [[6, 0, 1, "", "Destination"], [6, 0, 1, "", "Identity"], [6, 0, 1, "", "Link"], [6, 0, 1, "", "Packet"], [6, 0, 1, "", "PacketReceipt"], [6, 0, 1, "", "RequestReceipt"], [6, 0, 1, "", "Resource"], [6, 0, 1, "", "Reticulum"], [6, 0, 1, "", "Transport"]], "RNS.Destination": [[6, 1, 1, "", "accepts_links"], [6, 1, 1, "", "announce"], [6, 1, 1, "", "app_and_aspects_from_name"], [6, 1, 1, "", "clear_default_app_data"], [6, 1, 1, "", "create_keys"], [6, 1, 1, "", "decrypt"], [6, 1, 1, "", "deregister_request_handler"], [6, 1, 1, "", "encrypt"], [6, 1, 1, "", "full_name"], [6, 1, 1, "", "get_private_key"], [6, 1, 1, "", "hash"], [6, 1, 1, "", "hash_from_name_and_identity"], [6, 1, 1, "", "load_private_key"], [6, 1, 1, "", "register_request_handler"], [6, 1, 1, "", "set_default_app_data"], [6, 1, 1, "", "set_link_established_callback"], [6, 1, 1, "", "set_packet_callback"], [6, 1, 1, "", "set_proof_requested_callback"], [6, 1, 1, "", "set_proof_strategy"], [6, 1, 1, "", "sign"]], "RNS.Identity": [[6, 2, 1, "", "CURVE"], [6, 2, 1, "", "KEYSIZE"], [6, 2, 1, "", "TRUNCATED_HASHLENGTH"], [6, 1, 1, "", "decrypt"], [6, 1, 1, "", "encrypt"], [6, 1, 1, "", "from_bytes"], [6, 1, 1, "", "from_file"], [6, 1, 1, "", "full_hash"], [6, 1, 1, "", "get_private_key"], [6, 1, 1, "", "get_public_key"], [6, 1, 1, "", "get_random_hash"], [6, 1, 1, "", "load_private_key"], [6, 1, 1, "", "load_public_key"], [6, 1, 1, "", "recall"], [6, 1, 1, "", "recall_app_data"], [6, 1, 1, "", "sign"], [6, 1, 1, "", "to_file"], [6, 1, 1, "", "truncated_hash"], [6, 1, 1, "", "validate"]], "RNS.Link": [[6, 2, 1, "", "CURVE"], [6, 2, 1, "", "ESTABLISHMENT_TIMEOUT_PER_HOP"], [6, 2, 1, "", "KEEPALIVE"], [6, 2, 1, "", "KEEPALIVE_TIMEOUT_FACTOR"], [6, 2, 1, "", "STALE_GRACE"], [6, 2, 1, "", "STALE_TIME"], [6, 1, 1, "", "get_remote_identity"], [6, 1, 1, "", "identify"], [6, 1, 1, "", "inactive_for"], [6, 1, 1, "", "no_inbound_for"], [6, 1, 1, "", "no_outbound_for"], [6, 1, 1, "", "request"], [6, 1, 1, "", "set_link_closed_callback"], [6, 1, 1, "", "set_packet_callback"], [6, 1, 1, "", "set_remote_identified_callback"], [6, 1, 1, "", "set_resource_callback"], [6, 1, 1, "", "set_resource_concluded_callback"], [6, 1, 1, "", "set_resource_started_callback"], [6, 1, 1, "", "set_resource_strategy"], [6, 1, 1, "", "teardown"]], "RNS.Packet": [[6, 2, 1, "", "ENCRYPTED_MDU"], [6, 2, 1, "", "PLAIN_MDU"], [6, 1, 1, "", "resend"], [6, 1, 1, "", "send"]], "RNS.PacketReceipt": [[6, 1, 1, "", "get_rtt"], [6, 1, 1, "", "get_status"], [6, 1, 1, "", "set_delivery_callback"], [6, 1, 1, "", "set_timeout"], [6, 1, 1, "", "set_timeout_callback"]], "RNS.RequestReceipt": [[6, 1, 1, "", "get_progress"], [6, 1, 1, "", "get_request_id"], [6, 1, 1, "", "get_response"], [6, 1, 1, "", "get_response_time"], [6, 1, 1, "", "get_status"]], "RNS.Resource": [[6, 1, 1, "", "advertise"], [6, 1, 1, "", "cancel"], [6, 1, 1, "", "get_data_size"], [6, 1, 1, "", "get_hash"], [6, 1, 1, "", "get_parts"], [6, 1, 1, "", "get_progress"], [6, 1, 1, "", "get_segments"], [6, 1, 1, "", "get_transfer_size"], [6, 1, 1, "", "is_compressed"]], "RNS.Reticulum": [[6, 2, 1, "", "ANNOUNCE_CAP"], [6, 2, 1, "", "MTU"], [6, 1, 1, "", "should_use_implicit_proof"], [6, 1, 1, "", "transport_enabled"]], "RNS.Transport": [[6, 2, 1, "", "PATHFINDER_M"], [6, 1, 1, "", "deregister_announce_handler"], [6, 1, 1, "", "has_path"], [6, 1, 1, "", "hops_to"], [6, 1, 1, "", "next_hop"], [6, 1, 1, "", "next_hop_interface"], [6, 1, 1, "", "register_announce_handler"], [6, 1, 1, "", "request_path"]]}, "objtypes": {"0": "py:class", "1": "py:method", "2": "py:attribute"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "method", "Python method"], "2": ["py", "attribute", "Python attribute"]}, "titleterms": {"code": [0, 7, 8], "exampl": [0, 5], "minim": 0, "announc": [0, 4, 8], "broadcast": 0, "echo": 0, "link": [0, 6, 8], "identif": 0, "request": [0, 6], "respons": 0, "filetransf": 0, "get": [1, 8], "start": 1, "fast": 1, "try": 1, "us": [1, 9, 10], "reticulum": [1, 2, 3, 6, 7, 8, 9, 10], "base": [1, 2], "program": [1, 9], "nomad": 1, "network": [1, 3, 5], "sideband": 1, "includ": [1, 9], "util": [1, 9], "creat": [1, 2], "With": 1, "connect": 1, "instanc": 1, "over": [1, 5], "internet": [1, 5], "public": [1, 8], "testnet": 1, "ad": 1, "radio": 1, "interfac": [1, 4, 8, 10], "develop": 1, "particip": 1, "arm64": 1, "android": 1, "pure": 1, "python": 1, "commun": 2, "hardwar": 2, "rnode": [2, 4], "support": [2, 4, 7], "board": 2, "lilygo": 2, "lora32": 2, "v2": 2, "1": 2, "0": 2, "t": 2, "beam": 2, "heltec": 2, "unsign": 2, "x": 2, "v1": 2, "instal": 2, "usag": 2, "supplier": 2, "wifi": 2, "combin": 2, "type": [2, 8, 10], "stack": 3, "manual": 3, "indic": 3, "tabl": 3, "auto": 4, "i2p": 4, "tcp": 4, "server": 4, "client": 4, "udp": 4, "lora": [4, 5], "serial": [4, 9], "pipe": 4, "kiss": 4, "ax": 4, "25": 4, "common": 4, "option": 4, "mode": 4, "rate": 4, "control": 4, "build": 5, "concept": 5, "overview": 5, "scenario": 5, "interconnect": 5, "site": 5, "bridg": 5, "growth": 5, "converg": 5, "api": 6, "refer": [6, 8], "class": 6, "ident": [6, 8], "destin": [6, 8], "packet": [6, 8], "receipt": 6, "resourc": [6, 8], "transport": [6, 8], "donat": 7, "provid": 7, "feedback": 7, "contribut": 7, "understand": 8, "motiv": 8, "goal": 8, "introduct": 8, "basic": 8, "function": 8, "name": [8, 9], "kei": 8, "further": 8, "node": 8, "The": [8, 9], "mechan": 8, "detail": 8, "reach": 8, "establish": 8, "setup": 8, "protocol": 8, "specif": 8, "prioritis": 8, "access": 8, "wire": 8, "format": 8, "propag": 8, "rule": 8, "cryptograph": 8, "primit": 8, "your": 9, "system": 9, "configur": 9, "data": 9, "rnsd": 9, "rnstatu": 9, "rnpath": 9, "rnprobe": 9, "rncp": 9, "rnx": 9, "improv": 9, "fix": 9, "port": 9, "servic": 9, "what": 10, "i": 10, "current": 10, "statu": 10, "doe": 10, "offer": 10, "where": 10, "can": 10, "devic": 10, "caveat": 10, "emptor": 10}, "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"], [6, "link"]], "Identification": [[0, "example-identify"]], "Requests & Responses": [[0, "requests-responses"]], "Filetransfer": [[0, "filetransfer"]], "Getting Started Fast": [[1, "getting-started-fast"]], "Try Using a Reticulum-based Program": [[1, "try-using-a-reticulum-based-program"]], "Nomad Network": [[1, "nomad-network"]], "Sideband": [[1, "sideband"]], "Using the Included Utilities": [[1, "using-the-included-utilities"]], "Creating a Network With Reticulum": [[1, "creating-a-network-with-reticulum"]], "Connecting Reticulum Instances Over the Internet": [[1, "connecting-reticulum-instances-over-the-internet"]], "Connect to the Public Testnet": [[1, "connect-to-the-public-testnet"]], "Adding Radio Interfaces": [[1, "adding-radio-interfaces"]], "Develop a Program with Reticulum": [[1, "develop-a-program-with-reticulum"]], "Participate in Reticulum Development": [[1, "participate-in-reticulum-development"]], "Reticulum on ARM64": [[1, "reticulum-on-arm64"]], "Reticulum on Android": [[1, "reticulum-on-android"]], "Pure-Python Reticulum": [[1, "pure-python-reticulum"]], "Communications Hardware": [[2, "communications-hardware"]], "RNode": [[2, "rnode"]], "Creating RNodes": [[2, "creating-rnodes"]], "Supported Boards": [[2, "supported-boards"]], "LilyGO LoRa32 v2.1": [[2, "lilygo-lora32-v2-1"]], "LilyGO LoRa32 v2.0": [[2, "lilygo-lora32-v2-0"]], "LilyGO T-Beam": [[2, "lilygo-t-beam"]], "Heltec LoRa32 v2.0": [[2, "heltec-lora32-v2-0"]], "Unsigned RNode v2.x": [[2, "unsigned-rnode-v2-x"]], "Unsigned RNode v1.x": [[2, "unsigned-rnode-v1-x"]], "Installation": [[2, "installation"]], "Usage with Reticulum": [[2, "usage-with-reticulum"]], "Suppliers": [[2, "suppliers"]], "WiFi-based Hardware": [[2, "wifi-based-hardware"]], "Combining Hardware Types": [[2, "combining-hardware-types"]], "Reticulum Network Stack Manual": [[3, "reticulum-network-stack-manual"]], "Indices and Tables": [[3, "indices-and-tables"]], "Supported Interfaces": [[4, "supported-interfaces"]], "Auto Interface": [[4, "auto-interface"]], "I2P Interface": [[4, "i2p-interface"]], "TCP Server Interface": [[4, "tcp-server-interface"]], "TCP Client Interface": [[4, "tcp-client-interface"]], "UDP Interface": [[4, "udp-interface"]], "RNode LoRa Interface": [[4, "rnode-lora-interface"]], "Serial Interface": [[4, "serial-interface"]], "Pipe Interface": [[4, "pipe-interface"]], "KISS Interface": [[4, "kiss-interface"]], "AX.25 KISS Interface": [[4, "ax-25-kiss-interface"]], "Common Interface Options": [[4, "common-interface-options"]], "Interface Modes": [[4, "interface-modes"]], "Announce Rate Control": [[4, "announce-rate-control"]], "Building Networks": [[5, "building-networks"]], "Concepts & Overview": [[5, "concepts-overview"]], "Example Scenarios": [[5, "example-scenarios"]], "Interconnected LoRa Sites": [[5, "interconnected-lora-sites"]], "Bridging Over the Internet": [[5, "bridging-over-the-internet"]], "Growth and Convergence": [[5, "growth-and-convergence"]], "Support Reticulum": [[7, "support-reticulum"]], "Donations": [[7, "donations"]], "Provide Feedback": [[7, "provide-feedback"]], "Contribute Code": [[7, "contribute-code"]], "Using Reticulum on Your System": [[9, "using-reticulum-on-your-system"]], "Configuration & Data": [[9, "configuration-data"]], "Included Utility Programs": [[9, "included-utility-programs"]], "The rnsd Utility": [[9, "the-rnsd-utility"]], "The rnstatus Utility": [[9, "the-rnstatus-utility"]], "The rnpath Utility": [[9, "the-rnpath-utility"]], "The rnprobe Utility": [[9, "the-rnprobe-utility"]], "The rncp Utility": [[9, "the-rncp-utility"]], "The rnx Utility": [[9, "the-rnx-utility"]], "Improving System Configuration": [[9, "improving-system-configuration"]], "Fixed Serial Port Names": [[9, "fixed-serial-port-names"]], "Reticulum as a System Service": [[9, "reticulum-as-a-system-service"]], "What is Reticulum?": [[10, "what-is-reticulum"]], "Current Status": [[10, "current-status"]], "What does Reticulum Offer?": [[10, "what-does-reticulum-offer"]], "Where can Reticulum be Used?": [[10, "where-can-reticulum-be-used"]], "Interface Types and Devices": [[10, "interface-types-and-devices"]], "Caveat Emptor": [[10, "caveat-emptor"]], "API Reference": [[6, "api-reference"]], "Classes": [[6, "classes"]], "Reticulum": [[6, "reticulum"]], "Identity": [[6, "api-identity"]], "Destination": [[6, "destination"]], "Packet": [[6, "packet"]], "Packet Receipt": [[6, "packet-receipt"]], "Request Receipt": [[6, "request-receipt"]], "Resource": [[6, "resource"]], "Transport": [[6, "transport"]], "Understanding Reticulum": [[8, "understanding-reticulum"]], "Motivation": [[8, "motivation"]], "Goals": [[8, "goals"]], "Introduction & Basic Functionality": [[8, "introduction-basic-functionality"]], "Destinations": [[8, "destinations"]], "Destination Naming": [[8, "destination-naming"]], "Public Key Announcements": [[8, "public-key-announcements"]], "Identities": [[8, "understanding-identities"]], "Getting Further": [[8, "getting-further"]], "Reticulum Transport": [[8, "reticulum-transport"]], "Node Types": [[8, "node-types"]], "The Announce Mechanism in Detail": [[8, "the-announce-mechanism-in-detail"]], "Reaching the Destination": [[8, "reaching-the-destination"]], "Link Establishment in Detail": [[8, "link-establishment-in-detail"]], "Resources": [[8, "resources"]], "Reference Setup": [[8, "reference-setup"]], "Protocol Specifics": [[8, "protocol-specifics"]], "Packet Prioritisation": [[8, "packet-prioritisation"]], "Interface Access Codes": [[8, "interface-access-codes"]], "Wire Format": [[8, "wire-format"]], "Announce Propagation Rules": [[8, "announce-propagation-rules"]], "Cryptographic Primitives": [[8, "cryptographic-primitives"]]}, "indexentries": {"announce_cap (rns.reticulum attribute)": [[6, "RNS.Reticulum.ANNOUNCE_CAP"]], "curve (rns.identity attribute)": [[6, "RNS.Identity.CURVE"]], "curve (rns.link attribute)": [[6, "RNS.Link.CURVE"]], "destination (class in rns)": [[6, "RNS.Destination"]], "encrypted_mdu (rns.packet attribute)": [[6, "RNS.Packet.ENCRYPTED_MDU"]], "establishment_timeout_per_hop (rns.link attribute)": [[6, "RNS.Link.ESTABLISHMENT_TIMEOUT_PER_HOP"]], "identity (class in rns)": [[6, "RNS.Identity"]], "keepalive (rns.link attribute)": [[6, "RNS.Link.KEEPALIVE"]], "keepalive_timeout_factor (rns.link attribute)": [[6, "RNS.Link.KEEPALIVE_TIMEOUT_FACTOR"]], "keysize (rns.identity attribute)": [[6, "RNS.Identity.KEYSIZE"]], "link (class in rns)": [[6, "RNS.Link"]], "mtu (rns.reticulum attribute)": [[6, "RNS.Reticulum.MTU"]], "pathfinder_m (rns.transport attribute)": [[6, "RNS.Transport.PATHFINDER_M"]], "plain_mdu (rns.packet attribute)": [[6, "RNS.Packet.PLAIN_MDU"]], "packet (class in rns)": [[6, "RNS.Packet"]], "packetreceipt (class in rns)": [[6, "RNS.PacketReceipt"]], "requestreceipt (class in rns)": [[6, "RNS.RequestReceipt"]], "resource (class in rns)": [[6, "RNS.Resource"]], "reticulum (class in rns)": [[6, "RNS.Reticulum"]], "stale_grace (rns.link attribute)": [[6, "RNS.Link.STALE_GRACE"]], "stale_time (rns.link attribute)": [[6, "RNS.Link.STALE_TIME"]], "truncated_hashlength (rns.identity attribute)": [[6, "RNS.Identity.TRUNCATED_HASHLENGTH"]], "transport (class in rns)": [[6, "RNS.Transport"]], "accepts_links() (rns.destination method)": [[6, "RNS.Destination.accepts_links"]], "advertise() (rns.resource method)": [[6, "RNS.Resource.advertise"]], "announce() (rns.destination method)": [[6, "RNS.Destination.announce"]], "app_and_aspects_from_name() (rns.destination static method)": [[6, "RNS.Destination.app_and_aspects_from_name"]], "cancel() (rns.resource method)": [[6, "RNS.Resource.cancel"]], "clear_default_app_data() (rns.destination method)": [[6, "RNS.Destination.clear_default_app_data"]], "create_keys() (rns.destination method)": [[6, "RNS.Destination.create_keys"]], "decrypt() (rns.destination method)": [[6, "RNS.Destination.decrypt"]], "decrypt() (rns.identity method)": [[6, "RNS.Identity.decrypt"]], "deregister_announce_handler() (rns.transport static method)": [[6, "RNS.Transport.deregister_announce_handler"]], "deregister_request_handler() (rns.destination method)": [[6, "RNS.Destination.deregister_request_handler"]], "encrypt() (rns.destination method)": [[6, "RNS.Destination.encrypt"]], "encrypt() (rns.identity method)": [[6, "RNS.Identity.encrypt"]], "from_bytes() (rns.identity static method)": [[6, "RNS.Identity.from_bytes"]], "from_file() (rns.identity static method)": [[6, "RNS.Identity.from_file"]], "full_hash() (rns.identity static method)": [[6, "RNS.Identity.full_hash"]], "full_name() (rns.destination static method)": [[6, "RNS.Destination.full_name"]], "get_data_size() (rns.resource method)": [[6, "RNS.Resource.get_data_size"]], "get_hash() (rns.resource method)": [[6, "RNS.Resource.get_hash"]], "get_parts() (rns.resource method)": [[6, "RNS.Resource.get_parts"]], "get_private_key() (rns.destination method)": [[6, "RNS.Destination.get_private_key"]], "get_private_key() (rns.identity method)": [[6, "RNS.Identity.get_private_key"]], "get_progress() (rns.requestreceipt method)": [[6, "RNS.RequestReceipt.get_progress"]], "get_progress() (rns.resource method)": [[6, "RNS.Resource.get_progress"]], "get_public_key() (rns.identity method)": [[6, "RNS.Identity.get_public_key"]], "get_random_hash() (rns.identity static method)": [[6, "RNS.Identity.get_random_hash"]], "get_remote_identity() (rns.link method)": [[6, "RNS.Link.get_remote_identity"]], "get_request_id() (rns.requestreceipt method)": [[6, "RNS.RequestReceipt.get_request_id"]], "get_response() (rns.requestreceipt method)": [[6, "RNS.RequestReceipt.get_response"]], "get_response_time() (rns.requestreceipt method)": [[6, "RNS.RequestReceipt.get_response_time"]], "get_rtt() (rns.packetreceipt method)": [[6, "RNS.PacketReceipt.get_rtt"]], "get_segments() (rns.resource method)": [[6, "RNS.Resource.get_segments"]], "get_status() (rns.packetreceipt method)": [[6, "RNS.PacketReceipt.get_status"]], "get_status() (rns.requestreceipt method)": [[6, "RNS.RequestReceipt.get_status"]], "get_transfer_size() (rns.resource method)": [[6, "RNS.Resource.get_transfer_size"]], "has_path() (rns.transport static method)": [[6, "RNS.Transport.has_path"]], "hash() (rns.destination static method)": [[6, "RNS.Destination.hash"]], "hash_from_name_and_identity() (rns.destination static method)": [[6, "RNS.Destination.hash_from_name_and_identity"]], "hops_to() (rns.transport static method)": [[6, "RNS.Transport.hops_to"]], "identify() (rns.link method)": [[6, "RNS.Link.identify"]], "inactive_for() (rns.link method)": [[6, "RNS.Link.inactive_for"]], "is_compressed() (rns.resource method)": [[6, "RNS.Resource.is_compressed"]], "load_private_key() (rns.destination method)": [[6, "RNS.Destination.load_private_key"]], "load_private_key() (rns.identity method)": [[6, "RNS.Identity.load_private_key"]], "load_public_key() (rns.identity method)": [[6, "RNS.Identity.load_public_key"]], "next_hop() (rns.transport static method)": [[6, "RNS.Transport.next_hop"]], "next_hop_interface() (rns.transport static method)": [[6, "RNS.Transport.next_hop_interface"]], "no_inbound_for() (rns.link method)": [[6, "RNS.Link.no_inbound_for"]], "no_outbound_for() (rns.link method)": [[6, "RNS.Link.no_outbound_for"]], "recall() (rns.identity static method)": [[6, "RNS.Identity.recall"]], "recall_app_data() (rns.identity static method)": [[6, "RNS.Identity.recall_app_data"]], "register_announce_handler() (rns.transport static method)": [[6, "RNS.Transport.register_announce_handler"]], "register_request_handler() (rns.destination method)": [[6, "RNS.Destination.register_request_handler"]], "request() (rns.link method)": [[6, "RNS.Link.request"]], "request_path() (rns.transport static method)": [[6, "RNS.Transport.request_path"]], "resend() (rns.packet method)": [[6, "RNS.Packet.resend"]], "send() (rns.packet method)": [[6, "RNS.Packet.send"]], "set_default_app_data() (rns.destination method)": [[6, "RNS.Destination.set_default_app_data"]], "set_delivery_callback() (rns.packetreceipt method)": [[6, "RNS.PacketReceipt.set_delivery_callback"]], "set_link_closed_callback() (rns.link method)": [[6, "RNS.Link.set_link_closed_callback"]], "set_link_established_callback() (rns.destination method)": [[6, "RNS.Destination.set_link_established_callback"]], "set_packet_callback() (rns.destination method)": [[6, "RNS.Destination.set_packet_callback"]], "set_packet_callback() (rns.link method)": [[6, "RNS.Link.set_packet_callback"]], "set_proof_requested_callback() (rns.destination method)": [[6, "RNS.Destination.set_proof_requested_callback"]], "set_proof_strategy() (rns.destination method)": [[6, "RNS.Destination.set_proof_strategy"]], "set_remote_identified_callback() (rns.link method)": [[6, "RNS.Link.set_remote_identified_callback"]], "set_resource_callback() (rns.link method)": [[6, "RNS.Link.set_resource_callback"]], "set_resource_concluded_callback() (rns.link method)": [[6, "RNS.Link.set_resource_concluded_callback"]], "set_resource_started_callback() (rns.link method)": [[6, "RNS.Link.set_resource_started_callback"]], "set_resource_strategy() (rns.link method)": [[6, "RNS.Link.set_resource_strategy"]], "set_timeout() (rns.packetreceipt method)": [[6, "RNS.PacketReceipt.set_timeout"]], "set_timeout_callback() (rns.packetreceipt method)": [[6, "RNS.PacketReceipt.set_timeout_callback"]], "should_use_implicit_proof() (rns.reticulum static method)": [[6, "RNS.Reticulum.should_use_implicit_proof"]], "sign() (rns.destination method)": [[6, "RNS.Destination.sign"]], "sign() (rns.identity method)": [[6, "RNS.Identity.sign"]], "teardown() (rns.link method)": [[6, "RNS.Link.teardown"]], "to_file() (rns.identity method)": [[6, "RNS.Identity.to_file"]], "transport_enabled() (rns.reticulum static method)": [[6, "RNS.Reticulum.transport_enabled"]], "truncated_hash() (rns.identity static method)": [[6, "RNS.Identity.truncated_hash"]], "validate() (rns.identity method)": [[6, "RNS.Identity.validate"]]}}) \ No newline at end of file diff --git a/docs/manual/understanding.html b/docs/manual/understanding.html index 75a0624..6697a49 100644 --- a/docs/manual/understanding.html +++ b/docs/manual/understanding.html @@ -180,12 +180,13 @@ congestion, a one-line code change can upgrade the Reticulum address space all t bits, ensuring the Reticulum address space could potentially support galactic-scale networks. This is obviously complete and ridiculous over-allocation, and as such, the current 128 bits should be sufficient, even far into the future.

    -

    By default Reticulum encrypts all data using elliptic curve cryptography. Any packet sent to a -destination is encrypted with a derived ephemeral key. Reticulum can also set up an encrypted +

    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 -Forward Secrecy and Initiator Anonymity, by using an Elliptic Curve Diffie Hellman key exchange -on Curve25519 to derive ephemeral keys. The multi-hop transport, coordination, verification -and reliability layers are fully autonomous and also based on elliptic curve cryptography.

    +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.

    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, @@ -481,8 +482,7 @@ packet.

  • -
    A new ephemeral key is used for every packet sent in this way, and forward secrecy is guaranteed on a -per packet level.
    +
    A new ephemeral key is used for every packet sent in this way.
  • @@ -496,7 +496,7 @@ public signing key.
  • In case the packet is addressed to a group destination type, the packet will be encrypted with the pre-shared AES-128 key associated with the destination. In case the packet is addressed to a plain -destination type, the payload data will not be encrypted. Neither of these two destination types offer +destination type, the payload data will not be encrypted. Neither of these two destination types can offer forward secrecy. In general, it is recommended to always use the single destination type, unless it is strictly necessary to use one of the others.
    diff --git a/docs/source/understanding.rst b/docs/source/understanding.rst index 696ee0b..d584d64 100644 --- a/docs/source/understanding.rst +++ b/docs/source/understanding.rst @@ -131,12 +131,13 @@ bits, ensuring the Reticulum address space could potentially support galactic-sc This is obviously complete and ridiculous over-allocation, and as such, the current 128 bits should be sufficient, even far into the future. -By default Reticulum encrypts all data using elliptic curve cryptography. Any packet sent to a -destination is encrypted with a derived ephemeral key. Reticulum can also set up an encrypted +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 -*Forward Secrecy* and *Initiator Anonymity*, by using an Elliptic Curve Diffie Hellman key exchange -on Curve25519 to derive ephemeral keys. The multi-hop transport, coordination, verification -and reliability layers are fully autonomous and also based on elliptic curve cryptography. +*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. Reticulum also offers symmetric key encryption for group-oriented communications, as well as unencrypted packets for local broadcast purposes. @@ -442,8 +443,7 @@ For exchanges of small amounts of information, Reticulum offers the *Packet* API * | When the destination receives the packet, it can itself perform an ECDH key exchange and decrypt the packet. -* | A new ephemeral key is used for every packet sent in this way, and forward secrecy is guaranteed on a - per packet level. +* | A new ephemeral key is used for every packet sent in this way. * | Once the packet has been received and decrypted by the addressed destination, that destination can opt to *prove* its receipt of the packet. It does this by calculating the SHA-256 hash of the received packet, @@ -453,7 +453,7 @@ For exchanges of small amounts of information, Reticulum offers the *Packet* API * | In case the packet is addressed to a *group* destination type, the packet will be encrypted with the pre-shared AES-128 key associated with the destination. In case the packet is addressed to a *plain* - destination type, the payload data will not be encrypted. Neither of these two destination types offer + destination type, the payload data will not be encrypted. Neither of these two destination types can offer forward secrecy. In general, it is recommended to always use the *single* destination type, unless it is strictly necessary to use one of the others.