mdw-test/: Include some random utilities I've found handy for testing.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 28 Apr 2017 21:51:36 +0000 (22:51 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Wed, 25 Sep 2019 12:46:59 +0000 (13:46 +0100)
This allows setting up of a network of multiple Secnets on a single
machine, by an unprivileged user.  See `mdw-test/README' for more
information.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
mdw-test/.gitignore [new file with mode: 0644]
mdw-test/Makefile [new file with mode: 0644]
mdw-test/README [new file with mode: 0644]
mdw-test/alice.conf [new file with mode: 0644]
mdw-test/bob.conf [new file with mode: 0644]
mdw-test/fake-userv-ipif [new file with mode: 0755]
mdw-test/keyring [new file with mode: 0644]
mdw-test/mk-sshv1-rsapriv [new file with mode: 0755]
mdw-test/mkping [new file with mode: 0755]
mdw-test/secnet.conf [new file with mode: 0644]
mdw-test/sites [new file with mode: 0644]

diff --git a/mdw-test/.gitignore b/mdw-test/.gitignore
new file mode 100644 (file)
index 0000000..b69a202
--- /dev/null
@@ -0,0 +1,2 @@
+*.priv
+sites.conf
diff --git a/mdw-test/Makefile b/mdw-test/Makefile
new file mode 100644 (file)
index 0000000..b809cad
--- /dev/null
@@ -0,0 +1,15 @@
+### -*-makefile-*-
+
+all::
+
+TARGETS += sites.conf
+sites.conf: sites ../make-secnet-sites
+       ../make-secnet-sites sites >$@.new && mv $@.new $@
+
+TARGETS += alice.priv bob.priv
+alice.priv bob.priv: %.priv: keyring mk-sshv1-rsapriv
+       ./mk-sshv1-rsapriv keyring $* $@
+
+all:: $(TARGETS)
+clean::; rm -f $(TARGETS)
+.PHONY: all clean
diff --git a/mdw-test/README b/mdw-test/README
new file mode 100644 (file)
index 0000000..f43dbee
--- /dev/null
@@ -0,0 +1,41 @@
+Local unprivileged testing machinery
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This directory contains some random utilities I've found useful for
+testing Secnet.  It lets me run two (or more) instances on a single
+machine, and get them to exchange keys and transmit packets, all as an
+unprivileged user.
+
+This isn't standalone: other tools are needed to make it work.
+Dependencies are described along with the tools they're needed by.
+
+  * mk-sshv1-rsapriv KEYRING TAG OUT: converts a Catacomb format RSA
+    private key, in the given KEYRING with the given TAG, writing a file
+    OUT in the SSH v1 format wanted by Secnet.  This needs my Catacomb
+    library, https://git.distorted.org.uk/~mdw/catacomb/, and the Python
+    bindings, https://git.distorted.org.uk/~mdw/catacomb-python/.  If
+    you have some other way of generating RSA private keys in the right
+    format, then you don't need this stuff.
+
+  * mkping FROM-NAME FROM-ADDR TO-NAME TO-ADDR OUT: formats an IPv4 ICMP
+    echo request packet with source and destination addresses FROM-ADDR
+    and TO-ADDR respectively, with payload a simple string containing
+    FROM-NAME and TO-NAME, and writes it to OUT, which may be `-' for
+    standard output.  This requires the Python `ImpactPacket' library,
+    available in Debian as `python-impacket'.
+
+  * fake-userv-ipif: is a call-compatible drop-in for `userv', but uses
+    the `tripe-uslip' program instead.  To use it, configure a
+    `userv-ipif' netlink with userv-path = "./fake-userv-ipif", and
+    service-name = "SOCKET", where SOCKET names a Unix-domain socket to
+    use as the fake network interface.  Secnet will start `tripe-uslip'
+    and use it as its tunnel device, and you can send and receive
+    packets with tripe-uslip -p SOCKET <IN and tripe-uslip -g SOCKET
+    >OUT respectively.  I find this useful with `mkping' above to
+    generate packets, and `xxd' to inspect them.  `tripe-uslip' is part
+    of TrIPE, https://git.distorted.org.uk/~mdw/tripe/.
+
+There are also pieces of configuration in a fairly random state.
+They'll need tweaking to set up your particular test.
+
+                                                       mdw, 2017-07-13
diff --git a/mdw-test/alice.conf b/mdw-test/alice.conf
new file mode 100644 (file)
index 0000000..61ed1cc
--- /dev/null
@@ -0,0 +1,10 @@
+### -*-conf-*-
+
+log = logfile { filename "alice.log"; class "default"; };
+comm = udp { address = "127.0.0.1"; port = 30001; buffer = sysbuffer(); };
+local-name = "mdw-test/alice/alice";
+local-key = rsa-private("alice.priv");
+secnet-address = "10.1.0.1";
+service-name = "alice-to-bob";
+
+include secnet.conf
diff --git a/mdw-test/bob.conf b/mdw-test/bob.conf
new file mode 100644 (file)
index 0000000..c984d3e
--- /dev/null
@@ -0,0 +1,10 @@
+### -*-conf-*-
+
+log = logfile { filename "bob.log"; class "default"; };
+comm = udp { address = "127.0.0.1"; port = 30002; buffer = sysbuffer(); };
+local-name = "mdw-test/bob/bob";
+local-key = rsa-private("bob.priv");
+secnet-address = "10.2.0.1";
+service-name = "bob-to-alice";
+
+include secnet.conf
diff --git a/mdw-test/fake-userv-ipif b/mdw-test/fake-userv-ipif
new file mode 100755 (executable)
index 0000000..b8dca01
--- /dev/null
@@ -0,0 +1,4 @@
+#! /bin/sh -e
+
+echo >&2 "$0: $@"
+exec tripe-uslip "$2" | { read line; echo >&2 "$0: $line"; echo -n 'À'; cat; }
diff --git a/mdw-test/keyring b/mdw-test/keyring
new file mode 100644 (file)
index 0000000..207ab73
--- /dev/null
@@ -0,0 +1,3 @@
+f11201a3:secnet-sign:bob struct:[private=struct:[q-inv=integer,private,burn:766609333830889466976846071832544262217354309936234552930798794135964436078733626253516739586103057783214656914516394354987301853449649729978977291167795728229344204548149148923448016916908891000772690516364729183922011958037364710704657429867365998058295526139777776717244295601981695849867182019711904807265551702683876191421725911228087458070867449149599047982791898463697493745128704169178846927327261808861845915811502308584425590133641800693204289367518211,d-mod-q=integer,private,burn:987896097096225291354983132906088365770018786575674259909690494141520256520623226445790291986846034980188928447053028659835010418829973896374970528145750801116594906902910072672712950037389011793769426774416624493916647488164386778278197744821875581913062214761655021894589086690671124688768857522511302790132609459323362607462275716892418724048564906328678495303704873258658298046960719709638503919636089600667305030719124467791512252050123648619742281019809533,p=integer,private,burn:1787491047600701770212499403261105342958381068071985702207117651601919045667891427745555405547882288147947032992473207082283045460092526451175277374149434571356456148866689128512020744432841087156542252629624569963444829628650258676576196122241651367633941736083449546985682186895888479182743693528005477451326027316129552868558034231938708596294094565592613451218603675903679808639434829285847053330459784152226462711226217045816861888673926537106790925815410369,d=integer,private,burn:259496500677956539342448355030247063747424553807364522020967156494558348319360379498235347450984124241380144422703547228449848074657206793715861807636915206765824504031877820727251456214793568030291190382456396365961084459822405768053083435047802077479841529949091998844683864755613592199468719372409460088334113434926911824397558224042787121610262959555573173649167396621050188465853154342454749935405833257381267533307754714968541059483087284290890538694828466210404426111823759397638538591122744856442835098026981909847195051096882545311731727844078767186533077614279605329135131457795121100406669779248728652751954176549286662169723194299335947655630779413520938206425626021956978604045565753093396582439423883399376309657594620669452311036423349493772560459975063765682526134572563804451783681792308044191085499190131885709724570179842590690505139835046946985636113093240507062600248651460408990397248331456398071893889,d-mod-p=integer,private,burn:1126001806752633960685610042635938065195138685235574678882442667939234720560190880007438689025112110470418928392530385601797049739451910554500818638545939802613484530109898133596140568124348252775847084205279777017117908149430051409185218742246735966879772504577095855741900047359657292439086174887623451349627595277768168525040051958914165214907691838899025797947858982803721824616177540812623552339818754733059451707741629072424787924561917438361791912680827649,q=integer,private,burn:1750067482508320500595527222091264041829158567801323529441853923896548534980188792852487048680684649128169801422746704670350238621945127699600660724505691857082802552066387820860970093434257701471233056426948028637864990577965384951696668349841634275221958598968362891469271117027882511115768201525958190321852164512384787544404788854114838381348041580377418638916580788721521526668567770985554227095045017006593679410683585896625282834507607881053981615656041557],n=integer,public:3128229957680720632555143537867617367205916119354961589200427579358754800663279902727094631821051512996841814592241768547947704086969440198612422567295228898337504004550202655569185815496905374413904854979314788675800899888417365367588508982383482893736112268605470859612626955667920167750681773477347334831077493274129498801718527237945762823318643167551475964581161348726895282164373802288504910607319432390140003739610102226596758100863256019603070584832699937324236516697929420563022836820485144864187126688980033345955962891778790318289907390596007096239855202651745202390983050407498898842096699717835262219074707822779458769666142601133131622549367932553000903760038360824396589724874611949951188136506009460580722287355486124375523386365320668377318082541868040631799060240907526740502943894735700587441244905086568824370194259318201649598045015146239823021150638042381266830548366128479832903536526851779248072704533,e=integer,public:65537] forever forever -
+c7d65fc5:secnet-param struct:[p=integer,shared:5425425323472235076312936520599962275420156992814694405520810223344985914720456982666981857161089524071918136996469133447954055573182416699241116843547554610822062586044587930216955298471530923339796028288828288783075135971934083186412631897420865568912549593824954149736060830589546228181579114687807304391069342536433288368110868358036460427569724375816296631127297241781020857449973912792853480475034488133411841738924923631066530070554074263485991847117875744403072796708795516001798683672894940658247375269717307566304258587210974044324930600720708776587184753005279932075625965033619342328438014230900202511243293354994516011202559795897901631882089161677635847240045607583782491850853192306729011302058403026065939156326685450460184156898214354949218245248237057330380119117141905860246571819469850527276688066397731857622797991433255818494253276512569648676045376654314160512684270439078796327976756730220098022623747,g=integer,shared:1908491802935537547483312380379226185236132612959534439982806428177935118553401555357612873631047087605177810332188862203836985487437968479657234624079578617806502727622169510385077058343641596066306122011488853718371977245588765560506314784911820853307764799175292357989833832248215639079994834852235632284334323082896048893729987866749575128900811203118441755644906370619224447970755827538617134537083178798939905662280213718966348830846119153392647550244567952417247169727439876259101864255531352519625699439260353914811135669136535719603834524883600986967235008980851133775822133587217568838618997837744525259334548893060847247730669584469573385872823807911864665241152528375661391195174955591493298600147917878606232333937123526076917058825531742275205889924029670830489013970738458951002176683225309177904174284827889668170775219540140923094713613300151942346537124914086527319738425162820038814005497140374427470888602,q=integer,shared:104526440050124816795566216964898816956411937850690033721715713376129411674243] forever forever factors=104526440050124816795566216964898816956411937850690033721715713376129411674243%2c+111235349195753708964633209273540280095417225833437320455300598278166439869747%2c+60883601187166364963218074020781894352009984286534189132359030692378536523247%2c+83629215360611992278649940921309416324903325780840391679002621035017944328019%2c+113665649721378165691874992149740900384116063454424726848960894469472844842627%2c+77510106691941198379855872024503564622144483421396883828273037736859203790809%2c+106087341035669847774462550333066125631049576009776814824749043393974457125673%2c+95841352612920601311923192241337755425161440607972333407335716663503419100629%2c+109692707654239342678972021983236568525205471200271552001413970974291171583473%2c+93961598028951749904853167208921549185093630815930031228198063111400452291541%2c+60137815403960584285097332023354989079978584315342893217135288732014787335397%2c+825271005211233952077513330494361010504913884747589179652469932565043117351291
+59ebe14c:secnet-sign:alice struct:[private=struct:[q-inv=integer,private,burn:1258553002030652299538656746380924346832574750884502027715809659373453243167746386835625905766055182284304185943203646813721817443535711089100992115899350503591139311197969383902438510846213725003285300404709567947718297266072077445050885154919151122484149337748307371246803348343598279117229666576641564954860550639296560989092185053575508932785233543402012564089532753253733971492899284887870981420193343507747088815096287354709150055567059655082919209367794989,d-mod-q=integer,private,burn:201210293783252550717936946303434822256502000837781960898155577854317910558120488864629978367985050938279710429130795279281981069100543321476441322711444882598152625746988597273673893588230357577770589369346338642259799937601927188013074792281064613006870454609671760200490696872246811416592971341734382043699955568613222835796973694288086658232696506949694506736859833861264277514152435043119764070622661190931011884106087998192996557184950487983418790005452893,p=integer,private,burn:2267059454392873372702907809947436675865553246352118712672577069139535627665820657391226090057444274977247719376271974463182908112014247881261040769552301440541401768213037160387140308063341297228932617265400774548760915488110437326905737854239629220277241249569522523654484793432827538956962426550774070733444877619856096641059045541676457473691480385878761059500641947011440060942652036925242345998312272816052699488830209370717612133089728240292796154339751013,d=integer,private,burn:1602845287024405411960109515284656280569537607228807839618295366526741307522244640407125979077364160604298927104950636006623429800965676254978066546420999327403665729770156526327069345172896375082116696441872517401015295518040841127538576957114735027305354977779781874312614487713645407048390826116768663792663833337598372735578349423072797111412893369284074903849884424958236689782754289271790432898140419604510039495304215845831651766072878809417003095429596310773064539455342836796341116033988634786008733747462763179784264388622986982169586690136315073233969349681867177861356907493910721420370532841220747805087985806445560670772334417403049829913657703827410041804803133171118298455732509677214992156414824901687433180419586414981982487394953793110871014054678923030724188188739434093864724669254291545315162962171720153948474816479276662948378806507004546260938599234961244032555592715298067976893412969313572636254965,d-mod-p=integer,private,burn:1816670909049094876394076772739208872948582630249694347214943160962524872333581083421807842463750263041947578901745201685810714334172334040010773732312712128307868786506005348918190450563231379321175126431283892716744388645941923449305104519448595568324761260107154956356906448215691958182443440425515386311676223171063408872827530932331698386344438644203959512363935076845137825663751118043287795974691634213965235196223447907624347107641076918312659652371342965,q=integer,private,burn:1590677807439447818625022153183137267337077397937963374111269252815251255035891734465772604620342133093128755415433646588456356251585320586200426413334133084539822513097755331667643662737256084990874682207340288974400543849290410388517838680545733599834893725422684939476424463319232723740561346540801712424362362858890806391993518094397869158093634617124502881545667422408404940343185541064045835693172176896266070669319745372445647209677937289622354311289187727],n=integer,public:3606161162248526664845936157613777052805087150996562913371812885084297535868633069512412341124743472889130908037458584320571232560321582063629569585910950511339159303522090947867184252204676006582903308835064081872683685692025012615235267273328700783896429707985154729632359487162127020433937745969366721673211337147777495458953922523212616223782309780214916732989233442334676459887480658988493781247375639115699701622195794431358896026128778679097208392357213598980699575716349530129550578709952688391207667019873779415491950449515068830909535745890151137888182878392421829433688737196120023659879273030223397339207532712560991850980496679420290569321575389471625050240209850377360054058989512801342680478044066943762339291119508819255235442954479444776803649879272492628111798931781465301988187153092779676610560258000480421489897545889126816988057806725815600350140265814767516503568635601594689443772692955020824195417451,e=integer,public:65537] forever forever -
diff --git a/mdw-test/mk-sshv1-rsapriv b/mdw-test/mk-sshv1-rsapriv
new file mode 100755 (executable)
index 0000000..60c12e8
--- /dev/null
@@ -0,0 +1,33 @@
+#! /usr/bin/python
+
+from sys import argv
+import os as OS
+import catacomb as C
+
+MAGIC = 'SSH PRIVATE KEY FILE FORMAT 1.1\n\0'
+keyring, tag, outfile = argv[1:]
+kf = C.KeyFile(keyring)
+k = kf[tag]
+kd = k.data
+
+n, e = [kd[label].mp for label in ['n', 'e']]
+priv = kd['private']
+d, p, q, dp, dq, q_inv = \
+  [priv[label].mp for label in ['d', 'p', 'q', 'd-mod-p', 'd-mod-q', 'q-inv']]
+
+buf = C.WriteBuffer()
+buf.put(MAGIC)
+buf.putu8(0) # symmetric cipher type
+buf.putu32(0) # `reserved data'
+buf.putu32(n.nbits) # `not sure what this is'
+buf.putu16(n.nbits).put(n.storeb())
+buf.putu16(e.nbits).put(e.storeb())
+buf.putblk32(k.fulltag) # comment
+buf.putu16(1234).putu16(1234)# `next two pairs of characters are identical'
+buf.putu16(d.nbits).put(d.storeb())
+buf.putu16(q_inv.nbits).put(q_inv.storeb())
+buf.putu16(q.nbits).put(q.storeb())
+buf.putu16(p.nbits).put(p.storeb())
+outtmp = outfile + '.new'
+with open(outtmp, 'wb') as f: f.write(buf)
+OS.rename(outtmp, outfile)
diff --git a/mdw-test/mkping b/mdw-test/mkping
new file mode 100755 (executable)
index 0000000..d22c93d
--- /dev/null
@@ -0,0 +1,24 @@
+#! /usr/bin/python
+
+import os as OS
+from sys import stdout, argv
+import impacket.ImpactPacket as I
+
+sndname, sndaddr, rcpname, rcpaddr, outfile = argv[1:]
+
+ip = I.IP()
+ip.set_ip_src(sndaddr);
+ip.set_ip_dst(rcpaddr);
+icmp = I.ICMP()
+icmp.set_icmp_type(icmp.ICMP_ECHO)
+icmp.set_icmp_cksum(0)
+icmp.auto_checksum = 1
+icmp.contains(I.Data('Hello, %s, from %s!' % (rcpname, sndname)))
+ip.contains(icmp)
+
+if outfile == '-':
+  stdout.write(ip.get_packet())
+else:
+  outtmp = outfile + '.new'
+  with open(outtmp, 'wb') as f: f.write(ip.get_packet())
+  OS.rename(outtmp, outfile)
diff --git a/mdw-test/secnet.conf b/mdw-test/secnet.conf
new file mode 100644 (file)
index 0000000..b66603f
--- /dev/null
@@ -0,0 +1,16 @@
+### -*-conf-*-
+
+resolver = adns { };
+random = randomfile("/dev/urandom");
+#transform = serpent256-cbc { };
+transform = eax-serpent { };
+system = { };
+
+netlink = userv-ipif {
+       local-address = "1.0.0.0";
+       userv-path = "./fake-userv-ipif";
+       buffer = sysbuffer();
+};
+
+include sites.conf
+sites = map(site, all-sites);
diff --git a/mdw-test/sites b/mdw-test/sites
new file mode 100644 (file)
index 0000000..f958cf8
--- /dev/null
@@ -0,0 +1,53 @@
+### -*-conf-*-
+
+###--------------------------------------------------------------------------
+vpn mdw-test
+
+contact mdw@distorted.org.uk
+hash sha1
+
+## Diffie--Hellman group generated 2017-04-28.
+##
+## Let q_i be as follows.
+##
+##   q_0 = 104526440050124816795566216964898816956411937850690033721715713376129411674243
+##   q_1 = 111235349195753708964633209273540280095417225833437320455300598278166439869747
+##   q_2 = 60883601187166364963218074020781894352009984286534189132359030692378536523247
+##   q_3 = 83629215360611992278649940921309416324903325780840391679002621035017944328019
+##   q_4 = 113665649721378165691874992149740900384116063454424726848960894469472844842627
+##   q_5 = 77510106691941198379855872024503564622144483421396883828273037736859203790809
+##   q_6 = 106087341035669847774462550333066125631049576009776814824749043393974457125673
+##   q_7 = 95841352612920601311923192241337755425161440607972333407335716663503419100629
+##   q_8 = 109692707654239342678972021983236568525205471200271552001413970974291171583473
+##   q_9 = 93961598028951749904853167208921549185093630815930031228198063111400452291541
+##   q_10 = 60137815403960584285097332023354989079978584315342893217135288732014787335397
+##   q_11 = 825271005211233952077513330494361010504913884747589179652469932565043117351291
+##
+## Then q_i > 2^255, and q_i is prime (Sage verifies this quickly), for 0 <=
+## i < 12.  Let p = 2*PROD_{0<=i<12} q_i + 1; then 2^3071 < p < 2^3072.
+## Also, 2^{p-1} == 1 (mod p), and gcd(2^{(p-1)/q_i} - 1, p) == 1 for each
+## 0 <= i < 12, so p is prime by Pocklington's theorem.  Finally, set q =
+## q_0, and g = 2^{(p-1)/q}, so that g has order q in GF(p)^*.
+dh ef1233764fabef4f216f957871e7e9eda5a82d31aa1036ec54dd1d7f1dc6d15918370ebea703adbecf8ef48ca4760b555504b58eeadfe7ccfea8966096701434480dae0477537b1e8c56771b26742688a3804314ddbcd9121d21d1cdeb0574ab4f487a68b287e760305a8557d4b81aac36505ef206715e01ba581b4fed24f1806dc81051cedcbf78547574ef699f24b2aa02b0ae6d8dab4091795ed6ee95bf3120c8a7c7e607f4611b58f83bc0acde50a5345ff570366a2a3994b5ec09f1bb95a900f4b28ffd1b75336be514aaff162c810c35d65924710780f0954168d45a78179dbe496cd26fbc038846cbf054d8ae69bda87698a836866bde3d2c2aa4d7a2fb9a6cc3330d06f1e83e859f585f1612dd389badad41370a8d955dfd98ff241b0227130656b959962fc29e9721f7112bde43b4d09eb29db1ffac0a37ee25dbe99e1c4ea9bc23210971d2f02d8bc000f3caa711a6bab24ceab5022af119361bcb59b0c070989c8fb1ef005cef2aa988dabe9a822c082c374e15a94d8a0acd4a03 5418fc17aa90e9f025db7015c68748c63b021df235eb3f8dfc7a28bbfa0a119da168be262b639df2c285238713ef31075379dd4342ce526520e6b6d7d073509d1ff893dfed769536483228b89c00ec3b66b355d0158167e0f3bf67f34fdcbb40ffdd87d3cea8bc0723560d276f378301d120cb6ff5124ed325f1f7a93516f7f23ec5ba41a090a3c720f4a49bc2345304fd4683144f2b6970ee14e19dd75b95ce2273811de39cad185981eb5247f5049ae268390e1f54008fd052d1b6c07b5d93636db66a08de861cc4463512170c258221eb599ae595116274a71983f6e1f127609ca2114b244786b1648c0b9a7b4eb43073034fd19efce1f755b2e572d682176083eabfeba0bb5605de0c5c5ea01d6244284872a7f7e9a88105cde69c017590765ff24a62001b7674c39ee10260e440f56ab749fe352a3eb84b94981166e7a63bd294333668fcf9aa09ac7f133760a9d177d28bdfa4ee254dee39fa845a0230d6cf04384678970a88e20e829645e22fca339083803eb107282d0b4afd377e9a
+
+###--------------------------------------------------------------------------
+location alice alice
+
+site alice
+networks 10.1.0.0/24
+peer 10.1.0.1
+address localhost 30001
+
+pubkey 0 65537 3606161162248526664845936157613777052805087150996562913371812885084297535868633069512412341124743472889130908037458584320571232560321582063629569585910950511339159303522090947867184252204676006582903308835064081872683685692025012615235267273328700783896429707985154729632359487162127020433937745969366721673211337147777495458953922523212616223782309780214916732989233442334676459887480658988493781247375639115699701622195794431358896026128778679097208392357213598980699575716349530129550578709952688391207667019873779415491950449515068830909535745890151137888182878392421829433688737196120023659879273030223397339207532712560991850980496679420290569321575389471625050240209850377360054058989512801342680478044066943762339291119508819255235442954479444776803649879272492628111798931781465301988187153092779676610560258000480421489897545889126816988057806725815600350140265814767516503568635601594689443772692955020824195417451
+
+###--------------------------------------------------------------------------
+location bob bob
+
+site bob
+networks 10.2.0.0/24
+peer 10.2.0.1
+address localhost 30002
+
+pubkey 0 65537 3128229957680720632555143537867617367205916119354961589200427579358754800663279902727094631821051512996841814592241768547947704086969440198612422567295228898337504004550202655569185815496905374413904854979314788675800899888417365367588508982383482893736112268605470859612626955667920167750681773477347334831077493274129498801718527237945762823318643167551475964581161348726895282164373802288504910607319432390140003739610102226596758100863256019603070584832699937324236516697929420563022836820485144864187126688980033345955962891778790318289907390596007096239855202651745202390983050407498898842096699717835262219074707822779458769666142601133131622549367932553000903760038360824396589724874611949951188136506009460580722287355486124375523386365320668377318082541868040631799060240907526740502943894735700587441244905086568824370194259318201649598045015146239823021150638042381266830548366128479832903536526851779248072704533
+
+###----- That's all, folks --------------------------------------------------