From 7ea9c004dfa219f6d4aa434ab7cc3b22473a3d0d Mon Sep 17 00:00:00 2001 From: kayos Date: Fri, 4 Jun 2021 14:34:53 -0700 Subject: [PATCH 01/31] add bluetooth profile render --- profiling/bluetooth_and_dbus_calls.html | 3663 +++++++++++++++++++++++ profiling/protomolecule.profile | Bin 0 -> 459027 bytes src/protogen/ble_scan.go | 16 +- 3 files changed, 3674 insertions(+), 5 deletions(-) create mode 100644 profiling/bluetooth_and_dbus_calls.html create mode 100644 profiling/protomolecule.profile diff --git a/profiling/bluetooth_and_dbus_calls.html b/profiling/bluetooth_and_dbus_calls.html new file mode 100644 index 0000000..6fd6f40 --- /dev/null +++ b/profiling/bluetooth_and_dbus_calls.html @@ -0,0 +1,3663 @@ + + + + + unknown calls + + + + + + +
+
+

pprof

+
+ + + + + + + + + + +
+ +
+ +
+ unknown calls +
+
Type: calls
Time: Jun 1, 2021 at 7:43pm (PDT)
Active filters:
focus=git\.tcp\.direct/kayos/prototooth\.\(\*Adapter\)\.Scan
ignore=protomolecule/src/eros\.Remember|github\.com/rs/zerolog/log\.Fatal|github…
Showing nodes accounting for 41542, 12.21% of 340337 total
Dropped 146 nodes (cum <= 1701)
Dropped 4 edges (freq <= 340)
Showing top 80 nodes out of 86
+See https://git.io/JfYMW for how to read the graph
+
+
+
+ +
+ +
+
Save options as
+ + + + +
+ +
+
Delete config
+
+ +
+ +
+ +
+ + +unnamed + + + +N1 + + +prototooth +(*Adapter) +Scan +1190 (0.35%) +of 50770 (14.92%) + + + + + +N3 + + +protogen +(*Scan) +resultHandler +3606 (1.06%) +of 12609 (3.70%) + + + + + +N1->N3 + + + + + + + 12609 + + + + + +N8 + + +adapter +(*Adapter1) +GetDevices +172 (0.051%) +of 16374 (4.81%) + + + + + +N1->N8 + + + + + + + 16374 + + + + + +N10 + + +dbus +SystemBus +204 (0.06%) +of 4110 (1.21%) + + + + + +N1->N10 + + + + + + + 3974 + + + + + +N28 + + +prototooth +makeScanResult +510 (0.15%) +of 1248 (0.37%) + + + + + +N1->N28 + + + + + + + 1248 + + + + + +N30 + + +adapter +(*Adapter1) +SetDiscoveryFilter +70 (0.021%) +of 2826 (0.83%) + + + + + +N1->N30 + + + + + + + 2826 + + + + + +N49 + + +dbus +(*defaultSignalHandler) +AddSignal +45 (0.013%) +of 928 (0.27%) + + + + + +N1->N49 + + + + + + + 928 + + + + + +N52 + + +adapter +(*Adapter1) +StartDiscovery +24 (0.0071%) +of 1402 (0.41%) + + + + + +N1->N52 + + + + + + + 1402 + + + + + +N53 + + +adapter +(*Adapter1) +StopDiscovery +23 (0.0068%) +of 1401 (0.41%) + + + + + +N1->N53 + + + + + + + 1401 + + + + + +N75 + + +dbus +(*Conn) +RemoveMatchSignal +70 (0.021%) +of 1290 (0.38%) + + + + + +N1->N75 + + + + + + + 1290 + + + + + +N77 + + +dbus +(*Conn) +AddMatchSignal +66 (0.019%) +of 1284 (0.38%) + + + + + +N1->N77 + + + + + + + 1284 + + + + + +N79 + + +device +(*Device1Properties) +FromDBusMap +45 (0.013%) +of 4796 (1.41%) + + + + + +N1->N79 + + + + + + + 4796 + + + + + +N80 + + +dbus +(*Conn) +RemoveSignal +53 (0.016%) +of 1249 (0.37%) + + + + + +N1->N80 + + + + + + + 1249 + + + + + +N2 + + +protomolecule +main +0 of 50770 (14.92%) + + + + + +N2->N1 + + + + + + + 50770 + + + + + +N13 + + +prototooth +(*Device) +DiscoverServices +900 (0.26%) +of 2442 (0.72%) + + + + + +N3->N13 + + + + + + + 2442 + + + + + +N16 + + +prototooth +(*DeviceService) +DiscoverCharacteristics +825 (0.24%) +of 2262 (0.66%) + + + + + +N3->N16 + + + + + + + 2262 + + + + + +N19 + + +prototooth +(UUID) +String +1356 (0.4%) + + + + + +N3->N19 + + + + + + + 864 + + + + + +N35 + + +protogen +resultHandler$2 +1008 (0.3%) + + + + + +N3->N35 + + + + + + + 1008 + + + + + +N38 + + +prototooth +(*Adapter) +Connect +309 (0.091%) +of 963 (0.28%) + + + + + +N3->N38 + + + + + + + 963 + + + + + +N66 + + +prototooth +(*DeviceCharacteristic) +Read +117 (0.034%) +of 357 (0.1%) + + + + + +N3->N66 + + + + + + + 357 + + + + + +N68 + + +device +(*Device1) +Disconnect +72 (0.021%) +of 396 (0.12%) + + + + + +N3->N68 + + + + + + + 396 + + + + + +N4 + + +fmt +(*pp) +printArg +1848 (0.54%) +of 11088 (3.26%) + + + + + +N15 + + +fmt +(*pp) +printValue +3228 (0.95%) + + + + + +N4->N15 + + + + + + + 3228 + + + + + +N17 + + +fmt +(*pp) +fmtInteger +2640 (0.78%) + + + + + +N4->N17 + + + + + + + 2640 + + + + + +N23 + + +reflect +ValueOf +812 (0.24%) + + + + + +N4->N23 + + + + + + + 240 + + + + + +N27 + + +fmt +(*pp) +handleMethods +1248 (0.37%) + + + + + +N4->N27 + + + + + + + 1248 + + + + + +N60 + + +fmt +(*pp) +fmtComplex +384 (0.11%) + + + + + +N4->N60 + + + + + + + 384 + + + + + +N70 + + +fmt +(*pp) +fmtPointer +297 (0.087%) + + + + + +N4->N70 + + + + + + + 297 + + + + + +N71 + + +fmt +(*pp) +fmtBytes +294 (0.086%) + + + + + +N4->N71 + + + + + + + 294 + + + + + +N5 + + +bluez +(*Client) +Call +1027 (0.3%) +of 5890 (1.73%) + + + + + +N21 + + +fmt +Sprint +102 (0.03%) +of 2337 (0.69%) + + + + + +N5->N21 + + + + + + + 2337 + + + + + +N50 + + +dbus +(*Object) +Call +183 (0.054%) +of 1470 (0.43%) + + + + + +N5->N50 + + + + + + + 1449 + + + + + +N57 + + +bluez +(*Client) +Connect +206 (0.061%) +of 1016 (0.3%) + + + + + +N5->N57 + + + + + + + 1016 + + + + + +N6 + + +fmt +Errorf +337 (0.099%) +of 15644 (4.60%) + + + + + +N7 + + +fmt +(*pp) +doPrintf +2859 (0.84%) +of 14197 (4.17%) + + + + + +N6->N7 + + + + + + + 14197 + + + + + +N25 + + +fmt +(*pp) +free +615 (0.18%) +of 1054 (0.31%) + + + + + +N6->N25 + + + + + + + 550 + + + + + +N39 + + +fmt +newPrinter +188 (0.055%) +of 899 (0.26%) + + + + + +N6->N39 + + + + + + + 518 + + + + + +N7->N4 + + + + + + + 10092 + + + + + +N67 + + +fmt +intFromArg +220 (0.065%) +of 512 (0.15%) + + + + + +N7->N67 + + + + + + + 512 + + + + + +N74 + + +fmt +(*pp) +argNumber +156 (0.046%) +of 324 (0.095%) + + + + + +N7->N74 + + + + + + + 324 + + + + + +N8->N6 + + + + + + + 12892 + + + + + +N18 + + +bluez +(*ObjectManager) +GetManagedObjects +308 (0.09%) +of 1319 (0.39%) + + + + + +N8->N18 + + + + + + + 573 + + + + + +N34 + + +bluez +GetObjectManager +290 (0.085%) +of 604 (0.18%) + + + + + +N8->N34 + + + + + + + 106 + + + + + +N46 + + +adapter +parseDevice +56 (0.016%) +of 2207 (0.65%) + + + + + +N8->N46 + + + + + + + 2207 + + + + + +N61 + + +adapter +(*Adapter1) +GetDeviceList +104 (0.031%) +of 424 (0.12%) + + + + + +N8->N61 + + + + + + + 424 + + + + + +N9 + + +util +mapStructField +477 (0.14%) +of 6664 (1.96%) + + + + + +N9->N6 + + + + + + + 2752 + + + + + +N9->N23 + + + + + + + 172 + + + + + +N29 + + +reflect +(Value) +Type +1188 (0.35%) + + + + + +N9->N29 + + + + + + + 1188 + + + + + +N58 + + +reflect +MapOf +456 (0.13%) + + + + + +N9->N58 + + + + + + + 456 + + + + + +N20 + + +sync +(*Mutex) +Lock +167 (0.049%) +of 1819 (0.53%) + + + + + +N10->N20 + + + + + + + 610 + + + + + +N26 + + +sync +(*Mutex) +Unlock +224 (0.066%) +of 985 (0.29%) + + + + + +N10->N26 + + + + + + + 328 + + + + + +N32 + + +dbus +Connect +53 (0.016%) +of 2187 (0.64%) + + + + + +N10->N32 + + + + + + + 2187 + + + + + +N62 + + +context +(*cancelCtx) +Err +14 (0.0041%) +of 636 (0.19%) + + + + + +N10->N62 + + + + + + + 636 + + + + + +N11 + + +dbus +(*Object) +createCall +1012 (0.3%) +of 2404 (0.71%) + + + + + +N45 + + +strings +LastIndex +688 (0.2%) + + + + + +N11->N45 + + + + + + + 688 + + + + + +N59 + + +dbus +MakeVariant +440 (0.13%) + + + + + +N11->N59 + + + + + + + 440 + + + + + +N12 + + +dbus +(*Call) +Store +531 (0.16%) +of 1613 (0.47%) + + + + + +N43 + + +dbus +Store +380 (0.11%) +of 1082 (0.32%) + + + + + +N12->N43 + + + + + + + 1082 + + + + + +N13->N18 + + + + + + + 270 + + + + + +N13->N19 + + + + + + + 246 + + + + + +N22 + + +prototooth +ParseUUID +894 (0.26%) + + + + + +N13->N22 + + + + + + + 264 + + + + + +N13->N34 + + + + + + + 204 + + + + + +N76 + + +gatt +NewGattService1 +171 (0.05%) +of 276 (0.081%) + + + + + +N13->N76 + + + + + + + 276 + + + + + +N14 + + +util +MapToStruct +64 (0.019%) +of 6728 (1.98%) + + + + + +N14->N9 + + + + + + + 6664 + + + + + +N16->N18 + + + + + + + 270 + + + + + +N16->N19 + + + + + + + 246 + + + + + +N16->N22 + + + + + + + 264 + + + + + +N16->N34 + + + + + + + 204 + + + + + +N73 + + +gatt +NewGattCharacteristic1 +186 (0.055%) +of 297 (0.087%) + + + + + +N16->N73 + + + + + + + 297 + + + + + +N18->N5 + + + + + + + 786 + + + + + +N18->N12 + + + + + + + 225 + + + + + +N24 + + +sync +(*Mutex) +lockSlow +1522 (0.45%) +of 1591 (0.47%) + + + + + +N20->N24 + + + + + + + 1591 + + + + + +N21->N25 + + + + + + + 504 + + + + + +N21->N39 + + + + + + + 381 + + + + + +N48 + + +fmt +(*pp) +doPrint +234 (0.069%) +of 1350 (0.4%) + + + + + +N21->N48 + + + + + + + 1350 + + + + + +N64 + + +sync +(*Pool) +Put +242 (0.071%) +of 439 (0.13%) + + + + + +N25->N64 + + + + + + + 439 + + + + + +N44 + + +sync +(*Mutex) +unlockSlow +676 (0.2%) +of 709 (0.21%) + + + + + +N26->N44 + + + + + + + 709 + + + + + +N28->N22 + + + + + + + 366 + + + + + +N65 + + +prototooth +ParseMAC +330 (0.097%) + + + + + +N28->N65 + + + + + + + 330 + + + + + +N30->N5 + + + + + + + 2324 + + + + + +N30->N12 + + + + + + + 432 + + + + + +N31 + + +dbus +(*Conn) +RemoveMatchSignalContext +116 (0.034%) +of 1200 (0.35%) + + + + + +N31->N12 + + + + + + + 158 + + + + + +N37 + + +dbus +(*Object) +CallWithContext +124 (0.036%) +of 1276 (0.37%) + + + + + +N31->N37 + + + + + + + 638 + + + + + +N54 + + +dbus +formatMatchOptions +148 (0.043%) +of 472 (0.14%) + + + + + +N31->N54 + + + + + + + 236 + + + + + +N40 + + +dbus +(*Conn) +Auth +258 (0.076%) +of 1564 (0.46%) + + + + + +N32->N40 + + + + + + + 1564 + + + + + +N78 + + +dbus +(*Conn) +Close +130 (0.038%) +of 302 (0.089%) + + + + + +N32->N78 + + + + + + + 302 + + + + + +N33 + + +dbus +(*Conn) +AddMatchSignalContext +114 (0.033%) +of 1198 (0.35%) + + + + + +N33->N12 + + + + + + + 158 + + + + + +N33->N37 + + + + + + + 638 + + + + + +N33->N54 + + + + + + + 236 + + + + + +N69 + + +bluez +NewObjectManager +289 (0.085%) +of 314 (0.092%) + + + + + +N34->N69 + + + + + + + 314 + + + + + +N36 + + +sync +(*RWMutex) +Lock +182 (0.053%) +of 1076 (0.32%) + + + + + +N36->N20 + + + + + + + 806 + + + + + +N37->N11 + + + + + + + 1152 + + + + + +N38->N5 + + + + + + + 114 + + + + + +N51 + + +device +NewDevice1 +221 (0.065%) +of 435 (0.13%) + + + + + +N38->N51 + + + + + + + 261 + + + + + +N56 + + +sync +(*Pool) +Get +324 (0.095%) +of 663 (0.19%) + + + + + +N39->N56 + + + + + + + 663 + + + + + +N47 + + +dbus +(*Conn) +tryAuth +600 (0.18%) + + + + + +N40->N47 + + + + + + + 600 + + + + + +N41 + + +dbus +(*defaultSignalHandler) +RemoveSignal +73 (0.021%) +of 1196 (0.35%) + + + + + +N41->N36 + + + + + + + 538 + + + + + +N42 + + +sync +(*RWMutex) +Unlock +180 (0.053%) +of 690 (0.2%) + + + + + +N41->N42 + + + + + + + 345 + + + + + +N42->N26 + + + + + + + 438 + + + + + +N63 + + +dbus +storeInterfaces +134 (0.039%) +of 626 (0.18%) + + + + + +N43->N63 + + + + + + + 626 + + + + + +N46->N14 + + + + + + + 1977 + + + + + +N46->N51 + + + + + + + 174 + + + + + +N48->N4 + + + + + + + 996 + + + + + +N49->N36 + + + + + + + 538 + + + + + +N49->N42 + + + + + + + 345 + + + + + +N50->N11 + + + + + + + 1252 + + + + + +N52->N5 + + + + + + + 1162 + + + + + +N52->N12 + + + + + + + 216 + + + + + +N53->N5 + + + + + + + 1162 + + + + + +N53->N12 + + + + + + + 216 + + + + + +N72 + + +strings +Join +204 (0.06%) +of 324 (0.095%) + + + + + +N54->N72 + + + + + + + 324 + + + + + +N55 + + +bluez +GetConnection +429 (0.13%) +of 737 (0.22%) + + + + + +N55->N10 + + + + + + + 136 + + + + + +N57->N55 + + + + + + + 737 + + + + + +N61->N18 + + + + + + + 206 + + + + + +N61->N34 + + + + + + + 90 + + + + + +N62->N20 + + + + + + + 403 + + + + + +N62->N26 + + + + + + + 219 + + + + + +N63->N23 + + + + + + + 320 + + + + + +N66->N5 + + + + + + + 114 + + + + + +N67->N23 + + + + + + + 80 + + + + + +N68->N5 + + + + + + + 228 + + + + + +N68->N12 + + + + + + + 96 + + + + + +N75->N31 + + + + + + + 1200 + + + + + +N77->N33 + + + + + + + 1198 + + + + + +N79->N14 + + + + + + + 4751 + + + + + +N80->N41 + + + + + + + 1196 + + + + + + +
+ + + + + + + \ No newline at end of file diff --git a/profiling/protomolecule.profile b/profiling/protomolecule.profile new file mode 100644 index 0000000000000000000000000000000000000000..839527bd5b8e1db9d02f45fcb86cca21da39e249 GIT binary patch literal 459027 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≠3==*8aCv*|hXTzVcopI$&Oq=SC6h+a%D zp_kIj=;ibZdL-GA#)I|r#H|W=}q)zdJDak-UidQ(?8QY z=$-T~dN;j?-b;sUL9~zFPamKU(!bD$=wIpI;MIod-{~XtQTiDD2YsAA0dtt7|D^w- zPtm98GxS;d93658(Rum;eUZLIU#73nSLthXV6b)i2K_gElfFgYrti@Iz#Mkzd-Q$! z0sWAEL_emVz_h3IGx|CGf__QAqF>W*=%5F@rQgx-=@0ZrI`j`2G$Qed{!D+NztTe) z(D_@*5XJ~+L@**5QH*E?NGCCjSVkNpo{_+K$4F#=DkO=K%t&FRGSV37j0{F515_bd zjQ5OeMh+vFk;lkq6foc_q>xd>C}xx}N*QGgaNw0QDj1cFD#iy!HKT?B+K^htM@Ajv z6QiEdz-VMNF+i!>%xGb>GTIpJjL(b?MkfPO1UYswx*0u;UPd3Ip8=_Z90wSKj4zBK z##hES#xMg|;5%c4G0GTY{9ueTCK!_p=-&q^e=>eCrWn(V8OAJQjsY3otj$ZWynhW<9fk*~n~SHZxn8txRyp zwK3b7pP3!ZPG%Rgo7uwz*`t@)$LwbgFbA1mm_y93L5YF~B6FDeojJlBWsWg_Fvpn? z{cZ5UoMirF{$frsr_Q%W<<|*@xdCt6GUNXS}c*VSC-Y{>Ocg%a{1M?9^pP0|g z7v?K7loiGbXGO4p1tM8dtY}sYE0z_oco^)ye8&b+dX{y(}y~xLx@W;L{lI!;J+YoyFRWJ_m1FJDHurPGzUD!C{=v&R}P}qxm8x&x*?2qg^_9u2dyMf)v2CZ8YyP4g>Ze_Qz+u5Jl9c)mBcCx$J z-RvHAFT0Q3&mLfd)@_jeg+0Xn%KpY4W`Adou;JEils(4&!5(K%uqW9++0fq!GWf-w zVo$SY*t6_8_B?xm4bJ98_7Z!Uy~18)ud&zJ8}MSk*_-Sw_BMNm{fE8F-eZH4XrFz+ zK4c%UkJ%^eQ}!7fOa;%`7wk*+75kcf!@gzTu_4RbJc<3leq=wfpV=>L&{Ds$Lpfob za83j#k`u)NK^V=6;ly&{IPshW&O1&b2iP@6{EsCI@7%EY5pQHYbOZ z%gN*9a|$@X;R`uMoMKK1r<7C1Dd$vhAZu`~N=_B$1E-o(!>Q$ba>h76IOCiN&Lrn2=NAY1*Kf@VXPPs^ndQuJ<~a+TMGmM$mpIFu70xPW zjkC_#fc5;%+2m|-wmCbTKb&389tVui_c;fgL(UQBm~+B8<(zTg@%cIDf^*5a;#_lX zIJcZTSp9p>1Lu+R#Chhta9%l~T*w!!F2cCs+z4(YH;Nn0jp0HgZ>3c%H;x<6P2j%c zCUTRw$y{&(r*KobY20*f1~-$N#eL5Ow$A3}aC5nN+8ofd%?ZrUU9FvH{4q;6#8bgJMKOAf&0jP;y!ac))e)c@4ZqUK6jG z*TQS%wef)KwDUgmI(VJDE?zgUhu6!4U8j%N&l}(k^1kqfcwc$nc))drdEa>>yiwj5 z?+0(3H^Bq%VKEE%BClE4)=6Bn&#)8gHGq!TZhI zxuWwd*QwELiu6*aDD_I=oQJ2;z#pi__6#remp;c59{@gpU6+*C-YPIsr)p4 zIv?nj!O!Gp@!#{a`8oVtejXq4y{5F0&|1%$KRtLY6-^K6d_wal9ef)kt zu+;#6kpG20#Q)0w#vkT?=Y#DY;g9mi_&@mL{0aUf|0hiQi$BGm=FjkF`E&ev{sO$( zB7cd$%wOTJ^4Iw5{0%;wk@=haE&euthyRDa%irUJ<71zHz(3?4@sIf@{8K*k_k)yY z{B!;V|B`>jzvkcYZ{g?f`1kw={v-d1|IB~kzrt&U3c>{8f(SvRAW9G|h!Fs}Vg+%6 zctL{Togh(=BuEwj+7v;mAWe`i$Pi=-vIOs8G+U4($Q9%X@&yHgLP3!L&J=}!WtnE zqE`4(SSS1>tQR&28--25<$_&_utnG^Y!kK%KMOmAoiN`nVYjeH*emQ4_6rAugD~GO z!Xe>T;Wy#1@VjtCI12L}6aEm63nzq=!k@xl!YP>Vv~Wf^E1VO~3m1fo!X+W7g_eaY z!d2m#a9y||{4LxRLJ@DuZ3(x9JHkK0UE!W^Uw9w{fqN)C5*`argr~wY;koca2#)Pb z;g#@Ocq6!lB1KW6XiC~{nW8Mwdr`J1N0ci9Lgb0^MFpZlQIV)vR3a*cY0E_A zq6$%^s7mxfR4uB3(OS_*QJv_Ms9w|{Y7{kzK(cEVwTN0pZK8J3XHkc!Qv}rL5_OAu zM7^RuQNL(FGzfF}A{r8X6@3#8i@u9SM593&*hFYd^g}c*nh;Hjeu{pHrrwle5UJCm z8PTk0PBbrC5G{&8HM}HR7OjX@MQfsU(S`{6TW_gCv??QpajG~?oG#7~XTr~BiQkK} z#W~_!ah^C|491NG;zDtexL8~wE)|0*N}0G^Tp_L$SBXD}tHt0wQjNG){83yd{v@s! zH^AH)#ZBU7af`TB+$L^^CHXAw5O<2Z#NFZ^ajzJpoj!5DctAWT{vsX{e-(cdgTyr~ z{w^L7kBY~{Kg8qW2^gIe{}lfcPl>0+GvZnCoESLJym&#pC|(jTi&w;};x#d_{knKV z{9C*!-V$$%cf{ao)gSS$cu%}9J`f*@!K?5i@v-5a#Lwav@vAsg0;Rn9bC@Jt5+R9{L`kA0F_Ksb@XdCP|lMNHQf^lJ}Bq37E#@NOC24l6*;lq)<{MDTZlFB&CuvNx7s#QYopD ze2@Tdtd`VBY9${fb&^k#dPxJ!p;6K#X_mA|S|x3gcFAX$wnNe>>5_CydL+G)K1n~! zcR(^I`63yTe3g8Y3`@Slv?G#H$(ZDaWLz>KnUws5`TmkjNv0(;l3B@|WL~l$0d4i7 zWJ$6tS&^(t)+Fna4GEZM{FZD=wj|q<9myZbu4GRFaf1%LFFBALN{%GQ5{MBr{)yyN zawa*KTu3e@z=5wM*OD8_t>jK}FL{svw|SI2NuDJyl2=KnG)xNICR`dJjg&@7qopy@ zSSfJeIBC2zLHbUbC{2B%`YH{T zg~`HY5wb`b^iP9mlq^~nBa4;A$>L=RvUf5tLP(S)$&zI$vQ$}`EL{eA#0*)cEKBxY zmMzPX<;wD8pxDlr703!@MY3X9iL6vs2BYP&3R$JBO7=lkEvu2$!stg?o$QmWUe+LM zlr_nkWxy+2WUaC`S-b4BtV7l*>ym-NNVlv<)+_6i^~(ligEH{u?Tc(k_Eq*xHZ1!t z8WTaYcv!1Q!Uwk%tbt;*J9>#_~m zZyBh_Hf39~ZP||Ok8D@AC)<~S(aM4BPWoNQ;*e(~cOWBp|T6QD5mEFNy z?`03NN7<9?S@t4(m4(Uy*D!gwJVG8RkCI2rW8|@Nz%@=DFHexalPAiPh4LbKvAjeMs;E+VnY>(HA+MBI z$v?=!%d~2Fjl5R=QC=tiB(ImlFVh<2jq)aWv%E##DsPjw!{U9GcgQ>CUGi>ukGxmj zCkIa3FCUN(%D>2mM5hw>x&vHV1S3e%p+ z&*c~LOZk=jT7DzHh56pe@8u8jNBNWdS^gq_m4k2!RfH+R6%mR^MU*015u*Ubc&s8$ z5wA#4yi+79k`y30Br8%Bsfsj3x*|gXMoXEBEX8|8wjxK7s{j{t^A!1t0!5*sNKp*a zlqgCSWr}h|g`!dc!m>*7K~b%!QPe6vD!~2eI>jeNy`n+UsAy7v+ZfG?7DcO~P0_9Z zcdkDxIuxCXE=9MZ2Y#kk(WmHF3@8Q_Uld@2hZJ8G-xR}&?}`z4?NP;;;)h~fF`<}* z*Z!&arI=DoD`ph4@KbY&dBuWaQL&_0R=~G66sw9g#kyic@mm32$89RM6x)g&#UI74 zVow2vAp42~#i8OzajZB|oGL(BeWo~9TqrITSBh)JjRJlhcdNKl+$$awkBTS7v*JYo zHse(hsti+xDmm0ikiWskB~2~Ym|l>N#9<)HG5a!C1A z`ArGDWmx%LIieg@jwydA$CY66H=&$V{#5=_PAR9AGs;;dh?zO%ymCRgs9aJmD_4}O zN-+6bQ?4sFl)sgm$}Q!#az_bI{{AR;m3zv4<$>~0d87o@{ju^yd8#~9o+~eum&z+8 zsMxQSH_BV(o$_A!pnOz5DZ!}wS^1)TRfejjLAtjgzbajop~_TcsotxyRUlMyRJp1=Rlce~Rj4Xb6|2AixI|T| zDpQrKDpZxKDwy(vs#;Z}s#Sed)u}$I>S4+TRimm&)vRh!wW``+%68RfRfnom)urlI z^{9Gb%05-UYCtup`l1?AeN{oEppm|*hE?BHBdSr=nCgdWTm^-{8EHZ_srsqQxo04pWD# zAx==H2z8`7N*%3^QOBy|)IiaAb%OexI#HdZPFAO=Q`JDxGQ*(lfYhdLSASM_s5{kN>TY$98XQEu>OOV9dO$s>{-PdIgOcs5`kQ)K z{arnx9#xO2f2hGl>T&gidQ$yU{YyQio>l`#no-ZH=hXA+1@)qONxiHFjcra)7uDbf^cN;KfrV5z1|Q?9AdRBEa; zA2gs)s@BwKYBe76i6rfJuF)_~);L({40(sXNjG`$+= zFN3+UPt&g%&kgYZf$%nkCJ$W<|5A0TcT*&AMho^INm2+0txlb~IpO`$w~@+0*Q64m5|F zBh9e}OiNERrzer3INdS{tK{)y8S#wF%mH+C&&l(k5$Dw5i%OZMrr?o2dn1k)?gF&DQ2-ga9xBhQWvFzWWh`qt&7pc>f&_qx&+-jU7`+(eLF~# zbji9DU8*ikm#)juW$Hjdo27fN%hu)Sa&>vSd|iPKewCst(iQ7Ubfvm7UAeA82VXqb zRp~zHs&zHGTHQxooepHCPr7I*7fK>qt~nJ z)Aj2Hbc4Dtx*^?Hn8P>Sus{;`^r<>O; z=oWQLx@FypZdC_q-`rTYuG`T4)@|yxblbWe9mo@Zbi2Ae-M;QXcc?qk9mD8}?o@ZC zJJ((4E_GMBYZ$%J-Rkai_qqq&qwY!f45Kf)S6!$+Odqa~&`0W{^Z|zMW3oq)2Hh*^x(QhranvmUZ1Vc(dX*(^!a+AS%JP#U!*VAm*`9N zW%_bGqz*=Sg}zc>rT?I>*4OB3_0YlFrhU}c=|Ab~^$q$)eUrXf57ceZx9Z#U?fTF9 z4t=M-OAq|6Ti>Ja)%WT9^#l4r{TCP=(tp)|(+}&v>qqpX`Y}E9*MjH|{kVQYKdJwz z|D~VOPwT+}HKU)^&*|s&3;IRo@ej^_%)FnD4fJNB>8^tKZY_ z>kssYuxdy8WBrN#RDY&F*I(!_^-xGKVP5I4^*8!k{hb~p%zOQV{!#y=f7ZX~LBf31 zhZ@2R;f4r9q#?=x5@xg^#t>_WGsGJb4DSqy29Pk549SKRL#iRokZ#B@WE$Xp#qi#c zZOAd?8uAPvVdfhO426awL$RU6P-=h^W|^VfP+_PvR2e=Pstq*;kT7cv9}RVePlkF! zgQ3yTWB>`X+0bHWHMAMp4WA7ihE4-Wm|cc$Lyw`?&}Zm33>XFtAYpzn3>m%}z8QuM z-wh*%Q3FVrV}>7wal?dR((u#p%P?gC33J*oW0*C}8RiWOhDF1Y0VK?2!-`?mux3~{ zY#4qUHVq)+whY^b9m5~Pu3^uxZ#aO_L&K5b*l=PvHJlmF4HpKGFfR>PhHJx(;nr|x z04d|%@L+f}JQ#& z{9vp$));GzAB`Xh))_w;>x~V@Mq`t)+1O$PuGDI5GqxK)8#|1h#x7$wOxt7ZHTD_% zjRVF(;}_!)Ea_L{H{-DJyK%%gY8*5EFoJ|RZk#Yq8h;vp8K;cXMxgzSan?9zoHs5Q z7mZ6skT92xE5=phnsME@Vf<~}G=hY=W!yII82=b|jeEv@VTv?GnW9ZGrdU&) zDc%InpiS>giKZk|vMI%sYDzP~*ELKTrc6_o>Afl2lw-;@frOc7$~P653Qa|(VpEB! z6y{K7DmPV_Dos_U52k8U4a}j|^wCsj`edp%HJBPrO(u{qn@ugIR#Tg)-SpYiVd^x2 z4AN!lHuac#O?{?*(|~Ev1mAWx4Vk{0zL|zi-%TT?Q5YRF{VO-H6< z(~0TSbY?m?frNQsx-?yxu1zDF@aC3w?(i~-u zHpiG_&2YkuGsl|~%B&bKbh;z4Q7xq8_iATW^;?V)!b%o zH-9#R?ddRgn!C*1<{opexzF4W^Bph`n!lKb%wNsl%){pIW}w=LdDJ{+{$UWnA&6{SB8n?{b z<{k4N^R9W%yl*}*gK^`b`N({1J~5w~&&=m$Fwnd(Uz)GX*XA4Zt@+Lj|Ln*7V16_| znV-!sX3$-{nnNvNmT*giCDIaQ0aVeJ7)z`r&Ju4)uz+oRXGydqS&}U&mQ+ic1$0H} zmJCa#CCl>Ol5NScN-U)o=%2kgv!&cpVX3rKSw2{*Ej1Qk z!&=KnOP%GDrQXtDX|y!KXtSlo(rRh5v|Bz~IxL+q+GXjs^jLZ=eU^U9fMw7EEc?YW zWch0OW*N48w~SauVcIdv56ie^!ZK<3Y58TDvVhslv}MLJYnijmTNW%3^KBq%S+Xo! zRxGQQHOsmMf*5ondBgJCvT50}Y+H6LP#oy7ExVRI%f98na%efSK$M_g9$QWj!JKwZ>Wt(|)wpSwC6ptqs;jYm>DZMq8|{);4Rq^|Q6Z+G*{w z0(rZwJ=R`ppS9mQU>&r6foX@VU#;J)!`AQC5$mXR45s~I9k)(cC#^rNzpPW%X&9Zc z&RXZJ^VS9HqIJo-45KU7RqL8{-MV4@ZQZnPSwYLbZQZf{vF=*;tozmj>!B42d$akG z_1Jo1J++=$&#f0$P(NH+udLVB8|$t0&Uzojs6^s}_0jrdeYU<>p}!N{zE^9gEzA~f zi?Bu7p#3*iQMPDXj4jp{XN$Kb*dXznKid**Nw#ELiY?WaW&`&V(rp>GOk0-iy)E08 z1JmW&@@)CG0$ZW2$W{zvCALyqnXTMbVXL%N!Po~|wXMchYx`)cvwecGdRv37(bi;Z zwzb$=VXV#8Zu@NOuyxwHY~3~p3aZd!>$UaS`fUR?aLano_Qf`2`)d1U8@9o>tiRhv zY@@a@+Yj5gZNdgd6_d7~wqLd>+q7-QHfx)+fm_z|wguawZOOK5Td}R$;9DANwsqTv z?YC{ywq@J4?btx1{;}=a_H6sM1KXkP$aV}{;ly@oJF}hJE^L>!D;v0FeQmq3-P-PK z_qGSyqYd_I+q3P(_G$~YhuOpJ5q6MGBJEN3XnTx3)*fe%w*$%q`#XE0J;|PIPqC-k z)9m1-NxD75o@vjrzqe=Gb70C`d!9YtUSKb@7uk#LB`{^Fz06*2udr9ztLz`_;J~Z4 z*Vt?AAMJJaPxg9ygB{$mZnQVqo9!+3R(qSh-45Tf{%r5CciOw`-S!@Puf5L>N~C`K zfPK*Z#Xe;JYX4>*wu2e_cl(Ha)IMhaVIQ|o*eC7q2-^P3K4qV_&)8?}bM|>VIK>w1 zi}oe^vVFzAYG1Rj!?YXr-}X)WmVMj4WB+5{wS!yMd-i?%f&I{aWIwi_*iYfr&g|#* z3;U)0%6@IXvERZR?(FyW2m7P_$^LAAvA^0ujS%VxbA&r09FdMFN39Hovj zN4W#UPlcn>QRVpHsCLvi;P|O^e00<~J~`?g4UR?!@Z%;&v!lh)>S%McJ3c#r=X5wa z9bJxYM~|b|(FfD@I|dwsjxUZO$5+QU7#ntccZ@hj9b=9kj&T^9a7;RWI(|8(9Mg^& z7@Kv>Ip!S;jz!0kV;RO)9IK8s$GT&~@!PTK0P(Zs*mmqV{y27F74{tajswS`e_MRxOLn)?i~+~M_7d?$Ft+b@#+Y5hB?EXfG)xr>5Otl zJ7b)&&Nvv0cP2RBITM{p&SYl_jHNo$oaxRCXQngD`5wlyojJ~2XPz_PS>P;$u_9-& zv&32IEOVASE1W=uN@tbxgR|OM6OyopsJn&U$Bq6RLYtq0!moY<9LdTb*sr zb|?IMSZ9Z`)7j($poa4?3 z`1wiaPvQ&6X&V(%z5s-a9%pEoYydVzymn1x}zOSF$U`mFh}!rMog*nJ&N~%k|!s z?aFcGy7FB4t^yb>bQQUZT_vtkSDCBaRpA01M5U|B^}$u`s&Uo2KDxjK!#dX|SG}vj z)#z$+HM?3|z!6$qZLW6LXIF=-)71q_)$QtW^}708{jLGmpz8~a4!OR%zPW~7-(4fF zQP)@yr4orhT;r|@*QD#G3;GXlKk;@=xu#t+u36Wd3;Nf=73N(Fu0_|9YuUBpT6KYI zr)#ct*M{r2Ytyym+IH=@;6a^h*R|)`cOAG6T}Q5C7r1tM;yQJmxz1e|u1nXI>)HkC zv>Vs0>&|uWdT>3uo?MVUNcrq~alN`i-C^!CSS$cW1kE+_~;NcfK2(9|i70cagi;UE(fvm$}Q` z(7$<`aJVboRqhY&YIlvh)(s_q35UDR{mEVLZg4lco7~NApjeB$)!pW9cYk(wxI5il zZm@OT?jCoqyU*S49&iu3zqr9^H{|~6{^lNbe|L|#N8Mv?km-K7$K4a|N%v3pFZYyt z+6|ie8TYJv&OPs5a4))-+{OOOyyD!|AZV(t(?rZmr`__HuzIQ*kAKl=x{geCI{o;OghkC+1 z(7%1VUEqoEM0%n;(ViGjtOq!6oG0Fs;Cbgs^dxzbJt-b=T&8-`Jn5bcPo^i!^WFoR zkZezmC)bnb$@dg^3Oz+0urbA+5>Kh8%v0{E@Kk!LJn&syPqnAUQ|tNYsq=jD)Wd5v zcp5!To@P&rr`6NuY4L=ehSh zcpg1Z9xxPm_PlsrJ)zz(Z@4$Y8|eie5ao^b#&~1Bao%`ug7+PaCVG>+$=(!isyEG> z?#=Lm6EM@8<$dqX_U3qVy?NezFQf|Q+5&H(x5!)UE%BCm;cuUmdCR>O-b!zk_k*|E z3q}Gp-dgWRZ=Ls(x8B>}ZS;bhs!iTzZ;Q9p+vaWee)e{F;hUg z7we1j#rqO`?|g|q@a>Z%U$QU7m+DLNrTa2`;KziSzAWE+U$!sDm+Q;(<@><5PYQg6 zz9L_-uf$jCEAxRbMU?w0e3iZ`-v?i{uf|vF1H1RpSLgfWtM@hd8huT^W*_{!d0(rq z&DZYx?CbD#`nr4|*1LT@zFuFSuirP|8}xmF(IMYg-#6c|@4IirH|iUM(I38X--K_{ z_tW>wH|3l5fl6@3H|v}8&HEO7i@qh_vJZ>^SA46!HQ%~#!}r^_>D%&w17zE`= z_3iogeFr{p;p@JKX|X+8t`Q9Tzxzl0qy91f4?noDFz%o5Px^oQfBC_;QKtOU{u%$Qf6hPe z2f1{?zvy4`FZ);gtMJ-u{&oL`|F?hBzXh+o?ceeL@$dTg{QG|R2b=yw|B?ULf8sy& zpZUREt8@Q_|I&ZuzxLnwZ(;1tfA4?rKl-2i&;A!b*wI&iXdo;Q9*77;2BHG+_#+S# zhz-OA;sXf*aBJXQATf{>NDia~AmQ70*aB&R^gu=+GmsSkcdOn9vI9AR+(2F+KTr?= z5nC823KR!Q0;PenKzX1d0Dh)a8K??;2vi4Z0=0pUfw}~`anaVG0+rf4nT|` z%a%ZEpe@iI_#Eg6bOu0Zbp^TuJ%QdpU!XrQ5Eu+VlD8>HU?}i4@GUSL_#PMuj0PZT zQ0TG1kHC0fA}|>M*X4c&eg&oi(}9`5Yyc7kSC|XT2NnX0fu+E5U?l)5pVh!xU{u{@ zK$KheH(J9 zt>3yfUlryx$pVUH=VxnpXDA=2uYRo^-fQHx&md-hD6H|=V)3A6z>Y!V`wc_bK78(Q zTBEilYD8X!Cxwb(oiFNeSfe^2L_kGEMnw0c6ylCV2tx@&3Pbbb5i&D;YaqPwc0(BJ ztuIj`scA#;B)Er~ zvE3a$NseR5)9q`E^hv#jQno%Do=M(g;m|d1AMr{J`GBm8*Usp5b7gchJd`}kB8WQQ zR_3#KU43KpbNDhj6MVs?{lIJS$^K;PWOx!kJGft0wk^Z^)t&t#tgjk#+k5Y(Tl1{B7D7qM7!EL zbM+>xo;`!n2@C4&+|XauN30^N5>dxO@m2Hgir1&BQeI$DCuAgn>tGD(F z9JJMWrcbWS=!@GGuGd?IwP2%8SB3&E*{VWPrz%4Nv0=Xlzu7MG6Dg81(m4o_0q#uG zXJUoWF$=2eeC%4%C#jNE$1fv-la+PXYpvo}7qEl?@g#rLZU|Q+n3qUI0a4x5dI?o@ z&x%o`yN&f~s$PL%U`Q|q><>B8DX_q930sc@HhaG>hptEb=5N*QtoOBw@7Y4+l|Fox z@B-$+GiNB?pv=w=JU6tjzS>0p#JsayI%oCzqa8ZZSdi$E$ zi6ak;&Y-VJSIyeu39&2l8+5b|hMN;8SBe${9TXP7r{Lr+p~&}eEFo$g4C^W<=B}vs z=)})HFtwoRpxgLzccrh5p5XB~ro(=RdqTDeap~Y)*FLf4p>+axt97pv?`sH841O50 z-~izw%xhXt6n?Z%zH(iVu0}}wsGt1CyLQ&jPhd@RBTlG5tdHFjwhal4x(Z{j_}X+e ztbIEnxn}l6N0a(=cLIG)agX4QBH;I_YkUo&#U8EQSGTKjZT^Ia$2VxX>v-+z1Rjj0 zB0i$PFLol|<37Uqgn+2uIz^~FjBijNMHeP!Xl1BG54Q-;b3#Zx3bs&n5#r~hrzCN{ z*M1PP4483&*I^Q3`Q(b2?HFbV5Xh3^AIRA;H9{>#(4ON%;?SYT#n1}kJP*g{4aMrQ zfsxPuAI70f(LwtelPgppR8xc`mvqt>BF|EUlOhe1DO6R2XoDq}gwO~+7ke^jSL_$L zJEm8tw`n3Y&_FN@p0W8q6O9zgBNmq?r^ZwYHS0k!z+;1tvM2rGt1iMw@ksFzlVO5Z z4bvjj2~2cie+gO;JGdXGefrt{_@v!KYCv|n`gHYlfBbZ-`;WMBx|;B``g9$O-9xv5 zVi(;g=qo(?f9eK>Z{=6%R9)Q_Ir#wLn8=%~j`@qf)n;L!}BrOc(sQa27IyG$Mt?>(o z*rtIul%Wr2aj*k#KVVir)9}BKVhqYR8nFKWTaBd=R30i{iXGh)P-5y+cVXGkE=A@u!urKPHw=YcoZ3=FM>VA!BAnG-cKZ< zpxiF`^H5>>>vD~(tT=_o$2a=_+U9szoi!#(cJd&>HbGJGlaY|y^gMYf=1F8*xDzBp<&oPuz% zJ`RLmbhem+VX@r|j5!upkiTH|bTPpUqd6K^jHVz{?nilyDg3%fO`-DKIr*Q(s58_^ z^fkG^g$>|qn3FmAz7EV6FE*S(+{bYWel4z@&73o+ol~K}U92@jvQG+oISD`W0!-3H zy8GcB;$8&1i+g4BD^QqLnda=Wf=UC_11?Dz-1Jj$^jq;f!-+4uJe<4Sqz@#SzK?#g zA~ZRjxep>Vc}f!{ySlraU`%Nj#gY0oa%R++P=M&L=uXc0BrM1ZViGcHvNgjz5NU@q z3n%9>Oz2J0Ppa&iJEGpAH{)rCz(uIWSPOFJrcaFS;yE%9YSzB|rR&Js3=NWnZ(Z^{ z!1eBvUc27EAlxzd0!hVUvOCWrbNeTL>>~c6bVuTg%JR#v*?slvjXPv(sLtCbVHV*8 zEuqTX`H7#qsK2NQ8JFRqerMA zraY5oq(*~Y2>-#h%7&OimLejJ1vj+dWAKOA7-5knq$Yu8zeJIyrbbSP8tmLOIAgte z7W)NX4~b1Q#XuTyo4XK4DcFzw@(;106jahTqxYz1&PHxn**#-O$QqSG4H`SJ&?NT; zORPR@hbd^%G=<31QIL1<(F^gXL-zVn^x)WppJ6l>veK>ex9Zta=p*KdYiC*jwB&JVc8hL39UlXy|ePD=|O+#W3&Dx)W zJwmsQ;sB+3(2Q_w!=8t`b+;G__C5OD^aSb&f6-sCwS>Wg zxz_y>w_vkCYsvW%jwm9k+dq<82aNV^>z{vtU3km*%m=gnnU?=U6jSdD_|SeNVzQco*hjDg04|{ndLnpGfA@F zaF5ZtAWZE4K^pHVzy+d>2JaD%xIqXun4w=~O)x_->~ojO4|7`|+d3Y3v*PaAAB471 zjnu>v9%*(=jjHd7j#w&4;HR?C-qTbd&qw|2yx8!Cy;{GugKiXB#;|?{Z!F+X)El+l zXNTP=2_98wJKadI%xI0q9i!FZhhu`-5O^1&)mOfzYG)B^Nz&j4CP3Ef?RXotiIwF# z4}YN9hBUrdW;=obKSODm;E348?`x0ty6;X?-^!Y`olBz!u^xkW2j51P?RX>pG6P!m z6ZbOj5%g6Ua%ad!_esZN_bKLe<+a2;w&c+x-OgSABTcn9>|c#p|?&FQP__nxHuWatO&5W1l(UHCuVowT18T(iHa8nOo~ z3@qKC%D(xvr!~Ka`Hi0^7uRr}FWL}SBW*gN?`(P-)}J=MoswM3dg8Ycfv126+s5vz zAMhsu*A#DhkOBdtvC)6>;~Mdv(i_Qr>aU;CJ^lm#B*Ini>D{%@Z$iTxw>?<5-v;~y zAZVO?yC%73_C{}y5dbeypoeTd=9K1I>7L+`82#W03QR0?>He@eX}IRS=ObNsf_}t& z3iRn~U(-Fc0nd1RjebwVABZ7^@FEcVIf6XyM-0hpvC!ut*aiq+0(qdG`Mg=@rSLlm zh?S6deosk>?JHA+p@`UyU>4~37LFnz7FMzb@m1jax1FK0>)ac4uxiJ6AT6sY=^Xq_b|6N0lWU_x^Dxg)ka zLTeyDRMnGr7leK+tH?9zNDQ%@FVUENh}eOW|Ed`fcb{I2VETv)&vC5>+r9&D zA#BoYZ!$!=K$9+H5VjYC_;?|EP40>HHZ-S))qn?6T><8lfi3<@=Gj&n2rb| z^+yaJ>~~>CBCKcj2C!e^)kVvw=P)`4o-i!JoO;|1pufZ+h6tVVb=u#8kN>M@LKSm^qNzoX^vP){@TPmU<5~ps)pGn;0Ln%^} zgeptZQ}`+Mto~Irl!ZzuRpLr1%ux5xOFk-#m(p;>5=zQYh7Lr{yfvq)i+hY;k|fEO z#cE{#Cc6J0I|IXu{DppL=FyC$p#tbW7Hm*>TBVS{R*et77P%|+9UA|Ag5y)jH z)rx7-SP4$aOyQZO*9tFD9mZWs!cPpK{g=nkj_vsTl~OydLXtaQYl>u#H2yy}#xJPA39XuzkQTprb><*9>kq!ryo?= zG`B~+L2vr_UK~!gCTm#`4BN$}4>E14+7l6o9Qq6%{)RG|B9>*~=0A80v~Kd-3%L2d zksy5zJt4{CQXuZrAj_s2d+}Lo-0C3Nrkp(jRU(!cVv(Rq8^Vy96y+8XRXCPRSWb_kATyD8 zSdnKDrM$O17M&yx!lt-nA($zkYo|3!bd-XF?O{tzWR!YI6%zk$FmF={i59~GsvuNR znl9(QFi~-cc1ynUx0rzo@|eJ?C@Bz3R7-T1f-Z=g5-}?TIea>dE!-`Zg3KwQy?jT7 zW;#Bc(6exmY%fBQhocit)E`3F5&#cj8{#qYXO~RPl~(e#9+5Yub4YX>f-;J$7P%3J zwCo*D#2unHimH}f%ogOnq0>sV8bUKl24V0b-_cuNdkK)7Rg$GGO5_-N1&i~Og*G{n zVTfxh*#2Ep-m+4*!NWf&MvJ@-9r(40I+F$YSH-u*IWw&E@_PWtxM1Llzl|akjVkn4 zBNmP-=u`MnvRZ;TLpCEqpW=pfLBo}r_Ex6gF}F}*n!*f@Dp_*W#H)%<}jp z@08b|o)nTx7-m%V37s;Vg;w&R4i|H+m0XIy&hYK?0~}8xXv%S)4WvP(`0}!pSc;RC zcMWJS(%gkx3%)BHm!K;nG+jz~qL!O^ZL58Z(=X{mPQZuev0r{A^+SmUY8C=tv z*`!)#R<-T5&YJM$33H-9gWV5uE~aixA8H|&$WbZLg=_Vf5UdhkiV+pbObA+8#lI9y zFC3jPHgl+TBUIMX%4VASX!>M2T#LIzZxsdS_#v}i=wA{;dx;cv^XWezM&{I*sou)? z|A81^3s!`tJeHurr;mt7Ve5pBnTc(%z@&2ILpr8^p5a+dgb5&i`7o~UDX zQSUFTTN^Oy5ve0vnXNWOap~yJ)f)U5qVujYZ+=?Hs@(6pgiS8@wAOC9yx)2ysCqQKrY#|-0nZ} z1KL73%bwaVi(Ax(kKW?&qFEld&<}B-N?zDLp__BsGP$}(_Djwk;YA{5AA~B#Sg4+- zkqCPmTkf+-l;Q#G?ocBDNfE3PAV!i!iomH4QTEA+vA+n48@le5FwE!Z7#`63z+U}q zF_Kt}`9(||x+Lo_Y_|l^C{^&N?7`2vBQg7E4I|mcQuH7!GCxSO z6%uenYJl`x)|U z>yN~St14IOBlwYF*V*{tJzE6kNn5`!8CS7BQ(eNV&WOTj1#$cJj zZ~4I|rB1r4*=fYx7`i5IvB%Q5o>eQAe9*%1(Wst-Hzjj~*_eB#I%IM9!0?g-J|$p; zVw)8^aOnl$hMqZOyaLRFtPs;5<6)cFA*-q5{Rd_trYE-KRE80iZ9<34rcRjN0GVw( zhxDfIWuqgut5kSt-#oq#q--&%G$Tse1m_uu>!vIz$s-KgT<5`V!!3s2IfR%mJ3K#t zG*&9hh#JUXWg=2Yqo*|1bDJeCVPI^%I^UE~)2sP|CPK z&`L?8UEQqAQ5B9MA*pxB81jQW8bfkY|Bwl86_SQ%nE{@wCgM--|F{qG=(A;nb7WwY zDOzRRT#u_7BDy|ocEnu2u6jw`N8_*z4NtvFRu%tq`fT^U(Z!cr4QP4v0N_1LYb>q$U%-DpC!(GLt#vpGg;e{<*O(bMQYCaJ$fq zLcVkcILuOTbLM}}85@Cy^kVGF_s z`j-eEfO+_hJb;@IrAIj5DA?^*?=1M1yJi6<@&n74r!UEi7+R-D9!afzIwm$%+>2Th zwGE5B2ihQ>^H+Ben&vnDR3*1)a^P?Ydl&E33%4+5afu4THvMfT0##&-r!3Kyu@L zlhUDsI=M@7>wW_)GG7s7NXz2Ezg4ie=V{7#BgyY6#24xag({t0Wv0WxOr7}inl3COF59%<1 zbYOqUbC&@Pf+(R5D0OevGwjEBb~2E`dNbSsRnq1+=rG2&<99ybw(-V6aR0H(ZL7uZ z`zx{xIkbV4w~aZ=tkyi-{&z`4gRq~kqQEwNyU*6J$!^*8$c6bN0dbjZS;QLaiiSHi zy$g0fb?Bj2=0~9eM`J43zrV!C(Qs&N0tP03gRj;Alm9K__D5SEhj$=uYi|wPfVE!} zt~FY|{7{f9ef zw(w2D%lgb!dzeSGE|I)rnQOB4MUB(%^`<$NHNfUS>o4f=WJi&%vt41U)?@*aGjRAb z{4bldmaUG^T#~=`!+yKuzw-4M;M*W|kZS}BvqX0%$g8x|# zLT|6TytY95xQT38&KiLw5uPegzr|Ju=9qyc{wfN;H)7ilf-x9>__yxR27CtrS8}I! zn^dRXXYp=yEy~|nbO_O#jrxbzjLxcE7h8yRm|0@r6&wB`9vHThPQ1^h+~oIF`xtgq zPUziKK>8FF{r%E?_vfwI)Bo`f@TdJ}nr>Dt?Jdqa@RbSkuzY3d^W8tUE>3UVph1Zl z1N}gxy9M(*txY8NSo)gGS)pq-Jv;?8_vbcY@WscEe?^DyKy!ds+(-RR z4PpkP-_{S$E?qkiuKrpM$0;sdyjz*49nD$i%&y5T4BxqqgI$Kd{t$Yv-U9#q#qmFq z!*^G~^;I{r7C9XRfkd)C^d0dN@N28)P5DG55KcB4v)+Fur1PvlX2)lT=EUa&`$qEq zlV>b5>5V3k{HY(l>eSO4vOQL}hh;nY#OM6ojiAx+^%kgf zP_>8aj#jQetwS%kGPOtRj@ztppQT@q-sACyifG+f-M8O6d;gIg;Li{KwH+RT>>$ts zzjdzvh~Seb&_}i-cS3Wc2BXzJw3ib_pF+W zxu<#L01fXUpC9e#0@?MS?lFXl$)z!vLoqyYMUWuyZqona4n0U4FsJ^Y+ zI}w>4Cdr>(i0fA^VJDeTdA6)Pizx;tQW{Lh;Y(yqm~#J@ow`C_vxO(i^M8&5dHn`er$A@*|0IWONE@Vj zm~Z|hofUd=RV+Lhf??rn61I#ym>Ec8FgyOpka`SlIPVcFV7dLZIy2XFP9S8C6iz5z z@j#0Y*2dqZ6Mp8nh+O0uJqmU(@{2&-pt!dkR@XBB^&CWYnWQluF{qIe0tLY6F%E@% zrt&%qFjBQsC`NFAMimshzlq=w?^h+SPRWP|HA{#2i1!g`IB=^ANxz^<3SrE! zG>8j$3Yz+vRXPjgFtRNQ3zU|4pd}h))z#kROrghcgyD?zHE^YiRKK!H4x#t>p$l?7 z+g5^ykr*=?sXtH;o)ljefhI_)%WOT;R+Wba=Jc+`R;ZEoJ=P;OGqPH?TRGBv;Lk49 z^+HfPVp{gwu47onK0-zh4C#8Y{^ev-;QTdi7UFmie%D{Q0ebYOsw+(kK0gB4U$+6H z3b!3;HSo9#eZ7cP1crV#Czn;Bk@oE`6&$)-YADOz|42xF0&+*gw=!2L&f@R9r_SIel0Ssp$o@-r88S0g=_X|mo_yp~}J z`!E76+wLE;VX|ab+L5{0cS$F_LS!Bs5m3G>>&W8nn;(-)Gg-4M`imZj;}QJXH{RiI zdvZ4Zm<{(T#B^{iL90Cq8>V)VJgUSr(fB_20odU%r|5RMJd*cH8H}=+(DfV2r!019 zJlYu)V>l*ZHN9YUBA&r8hP@Mk+!M6%-0sV>kp_`_t@rc*hmK(AN!p-i(_^T>n-6^o zwdi%)aA%{1<_abHKfD1>9M-4za0AV*sPWx0(-G!XI9UCBYSabYOdRyEklq&?3T(wh zkzxJ4*c+0kiLRP&UIZ_MoAf$txSjgDDzs2O(&*p?>{W)U^;&E=0f1Hs)Y9+*j8-s@ z!>@YoHlR;)t|dGfLE(jFL+LaX)Q~CK{#Xqd$461us-84$_yVD1y>c5SY`)fQp}M^` z8!o3I*Gk0C5tAUw3{rlh4L9^*iJl3+;RZbnws>{P3`(6d?RfGV3dux>6qESPA~00& zTr%lCK3{T*Dti@0vXJs!Jkwy@rqmhbjeI+7{9DPme09a=H%xR%i9!z_-_cVh#nVgH z<%^w(D;!(V9M@z zOhndYg~61+YQrC}0jtVtTxy&0JRWusfDLDI)r_E?!Vs@AnD#-tnqo20QnH?EqV!P0 znaU&HYtRqCsFbfh`UVNaWk>TU{lH-b@YdrJwsE%@;g$>n0T5&4$e^g!OxpA zXUsRTo>Fh~a}+0DN)s|i#d;@+NwrJn(e}@gYgfPXmgZO-bg25>q zv(jJ5oHA+5u+syv#!@x;i=Zf2!6}!9ej!iJln7YP0;;LiDMhnXoGRSpcMSPSQ}kwa zwPLs8nhZe;;XnVt4SBVaON>@={-%v8OVkexR>{s1yan2dV0p^~w(wGS`43Z&d)bZ> zNNY&lQUsCQ&t#RL_j zzaz_!nWEYIV>Q5T^>Ocg{Uv-$hZ+|&B#28TjmI1j>y;!r)CT?s)`;o;hc~PmA+m?Q zR{co(F8(2rYFP0@3H$DFW;LfqGo$cFy5V@EVc&0qe*}k{YAB7IG6_{i=;+TPms+ay zU~e=`{~@WGUP2QH4i9m&L;D{tz=;=mD7Q$_Wg2tOEt2X6ABUEVNZ6|`Gpm_3{>L{! z)S3&vq$P?+9TxkL$8L+mPfe68GeB*m1g1zLQ4V%%s$VU(SPIqCYQ;Y!K-O;Z!Got$^16*83kVwd!AdOFA69G=i@N4&>yE#V-J+qX)Z^Vdf9XvA?98nZCxY3>|&A zs)k?8Ls2%&`Y;Yo*!X-PbIE)c>-E-3cr)khkKFL6LQ3~U4Zrk^D&}MVfZ>+ind^;< zn?Lcd6X7gcx%j6hR<7E^6fsGb!V^LTES|J)+U~NI0w1mOw}#@zOqFdR8tdO28Ha>yTCbA4Z4JL01TB&Y+1|V@W zD7w@RBFiuW5E3EvQt!UuJ=jV#2GMELSs=nV1aK41|h_-Be zeJ*qgw1)U%3B`Nmzkq`-Qg(+~xT9$BbEUX~0aXx}z!g;aKfj@jR^dK4zaX4lv&<`^RnYHC%w~ z%{Gu=D|@B@P);23by78HT54RSaI@Y>168&nU+W-xJe-Jds$PNKY6Hy6c zWv&XodUql6tT3ZeCXwtuF=S_(e`RhMaycWwCFiHF^T;{*jpuM(ry)?CQaX2UdOOicP8fcxkU*o z`?eLlA&Wf~`5AN*A;Qi|J(b!R1QI_DVc>@5zE#mLwN(k+|4grVAp?sxovS=q`b?#a zUKY3Vw!$B68cSI~Ijod&R!*gwUNor`s{5`$N~z#8yK-tNqe?x!IBeoewWOjUHQZt( z712@yl`teJ2$h0Tc9o{mw<;y2iYmfWgtKHS<)yMJmFDtXrD@ruX(~*msw(OGm8IGs zu%he-UCpf0P%1wAd0*+`Gn{gOJi2hH{%okZGFKs?noKcuPQ6m8*=(e_DpygO8dEV| zj(4*1lkzZF@syg&)Kx6WLpuD08F;}HW|`|cWkYpd=j=;3l>twobWC}NevO#knWR5CqFurKX|_v@3TQ}k=K z%%U+h{NhezW@Y@6h*_%r)qO=SSLf8`_aGaitXA?l$7H_vsn}xHY2V!m`d6ixQ$n-G zO0Km^LkY#N;AZWW95A3z@^yBNr$T(?^O4fkXZV?beF`pGf0WPSGkKs8-{}69uLMpX z2-TXPAg?lBvNMZpzRP2+(3<~Pq@!9{tTt=0@5JRwK(sG&@zGtYH4h}iORi?uoJjwp zG8FQM|}Jxm6;`g~V@r%cY-Y zD-*c=nOYHgUv(A8<)$)`)T-D;Ve^7}4b(#C!U@HaQ};8J7K)tYOERWs8mAs0uQ#%Knd$iaCU>}amB5e)AX_hDQ66!9=%+e$!Ns3%6XyN zyr(HYS2hH3F6wNsS$7@gQst5ald|`mm|0#O+mgCf#!H<$ZRDg+bpo|vOO%IlR@Ec8ExKQJF#VQ80f6XTaY<7W@=LBpc#sy_%&O5hS}`NEV+(hNrkEBs9byA z+LXIaYsm_{h`PL$*(0;7I`}2wLrl&|!^5ykWsgF>c^y-hI<*Or$~x{Pt;5Vqox5zW z8GmG5xh0dsh)b2bLa%vmQ-Qj*F11kb#xF#k7u{{!_q~gr@tPLh%XMOFR@crzv;1({ zd<MpswvzdEiISM*|5r&nhBUP88uk&Di^Os>L^O%G@ z8&z9LKhnO+xtj^v?VQy62W9X9DoXpFP&Q6M%)c_jgNv6xX(EHqF7}1w?I$oa8qTls z^bWm#mD8)4U-(nW_>{>{$Q$Emezi|UQhemA zWm9TDEq?j@s=Iyd)!HV6u3W9Knr}1Lu&Z@pb=!XH%vZeNvdep+eQWI%)26msbUYsr ze(38hFOW|*7qcsVVR&oDSNu_Sm*zt0)(phcR0WDY%|oA!!an4BOFqf9m+4Mc?$7_~ z$SVUJ1Hc#_fW`1zVt|%wsT7zX+mHFxe~bN4@`w_j^^@gS@-4$d-J_V#=k{snn#Os7 zU9ttlafdgr6gDvPOvT2Sc3b*Gj>#sU`yd>$XJ_g;4|C=LkZ{P49Hv3 zvI)j22$$rH$Xge)DifBX%)$v4YZzV|7IV!I?4zOviwP${^6VK4N94>-7++hMayveI zom2n+%M3YjXnh`$kTqnroBLZ>|B>JOfbS6QmFfp!7P z8nMYrmHq;!B|$wZZ?JZE7I;-hL}(}>!7sYMtoPWO^Kb}mrtbtJcNeS=*;+NSEfXH0 zkY~4Yzj;QADi>_h9kD)p0w;5|a-x6D8Td>%N*|PD12Lhph+agkMk@4~f)3Q&GZUCB zy6@L3DSG$%(wx);K7r!ZFF{u(%B|1S(C^EHI?RQ< zB_rG8%a4S^kz0L8hEy}cNne)K4et%hxaNMN3}Sk5QGL{gHGn7wD8nOHJrN`kXeUfB z7#+O4eC845)#v@<1p7D45No%e*v?D=_vB5 z5B^6UNMu=hvbDYC@Ze}85{UfNhXG)p-xkAWI%Z*Ip~N(|QX<_Fj-memx1o$(q3g7Z zlK)-^-DKhisObkYsh0r%l4%Eb07s=@#9i$|x?#}UXWL3UlfEg0lF&4zXU9#Kl5UqN zC}dY^LS!9L{v$J(D@E27eqPBEgi)d;6`8mmlNq4abi!E_m7tj$>JwhVHi=yW_H&xlW< z(R4Vtg&AvdLxwcz1ED9iUWT_&dpZkz(`(vqZ^H4z>zA1+vN9&rYpmlk_=WGLllGPz z4V$@EQnNjKf9Zj<0#dVNSipC6Wo!yvKq7M*#{i8>7>#3u*gBfkhf6%IJvDD+(s+&4 zaOBH2k3-AN*H@kQ-5I8EXdHw0(;1e4Ur+N%ogUc(mvD@vZZkU6zxsz~@atw|#ZQYE z>D|UUw*dmt2nw-rQ&ZP_vkG>#bc+$6kvj00pCcFBa1MD*gUgoIYz=9C-Ig3rTn*{G zBbnRG4h>EHD2x^J%O*$M=qcdT1dy{tpd{gnN$nrS-j+O1bX$632#4k{_r@fPnP@Eq1*!DX2BWTPKK99Ru@HF7(`jk38iVt1_ z%c$D6#d*}toTmvK+WGhUe;tNxH4fVpn{Ai#keg{@1H`&OjV>lZ%;$`{OmQD=z)rZ9 zst?NoQkE6C3^&%2Rrghtn(>SROoB;&Y=&W$cWG2B@%n>-OU4@2Os_t^f0sqIs;Ea- z>l=rs5za*QarL9(yVTz<10-6_l%i2d{fzpfx;c{*9_yX^yMThpsSjrLwd$Ho9s2be zkD5zNBp+qpB^P{~G6dJpPnqmBps2$!34@?%D6D---bc2-97Afgw3abrhyIx6Hskq6 z*x_8G!L#vd6d9M^YIBX6GOd@4=>S`-hixe)8LluIueNzrMXVXk*pF8XXZ5NsLt~5y z|Kq#iq%Fez_5Y(6KGF==!19a$dtqzz%=)IvQ}bMqYV# z$TN#Ft}#NJ2Wy$C$0}+~zi#R3$69JFrLvMaUEtC;pjfirpxz#yE3j#`}232*2a+NuAi>Qm3I=uL~|7i@10GSHPx0-98bG8Vnn+9@y z{iWd4|1btLjgayes%xy`<%V;1z_FitZIoFL74ph3vu;ddryLnXHR3PGIBSeR*K@Yn zSi8Ymox5BMJfNYRcTW3fmeZ=c9$)QSwDSRXOW@pVj+gC#Rwxzc3ImW0`rIvAYrbod zmBpy;)@06^{EWDmy*2h~@KzU~Fbidx!81l~5M5{kKg3$_sf-! zdeCU+A>b604|ito>I)VWt=cWuEa@YeGC;M&8atEZ93l4{ztpaFMEgR~2zqNwsvZ+Tk z-?t9Cfr!J|OJk1)uLXW9ic5K3JqEOzkZ&&zbU~@h=91QB+0U2<4H}I-p|-+PL+}OT*dqTbD>4 z1+7CmR+XT!JHI4kRXC<&1Dd)^=?A0Epsr?MQ`fNgwDj$e zBnAwmRp4lqgKm(AEcO}!5t9Bx>`TeJM6V@&!%ua>mc0O8xbyd#Z2RzJqFZ0N(D}N2 zY5w3RXapB}0jXp4O8|=XJQ&w(AX`8`6u&gQL*zVDx=Vdn_SSE&)m^MS+Mi`5ncmg47cVNW0=R+ zM-sO8wv?~q$@k>Mt6%iS?O$(6IOOxP6YI64Ml*`nzvz$qIpDC#idhxovzSDk%pTzNuZ;J`eO|j*fyRy30n3VM%(oV8cwlor8tl92;Q^)1jkSE;t@wgQ}qkL z>oMp!m+`2QSVTL)XVb6PTE4C){uWKrUjdy~5up^d%ErF0!|~O&XKoQXRIKnCnY`qE6UF@Z5n(B%HUxMt}HmFSdE zv$(in=~Vyf>Giiv45_^C#k~W2XI_tt)-isQc5L;1Ux$fTo5ar1JmQ&#V|Fy^L5Mr~ z4nwaFGwjA*?|>i3cl_R#`E_!}Q^xQZE=~UI7}rj-LwD02=u-2#WOSq-yuQk~17{xO zfG#=cq1$D>9?#erL*6MkA96c{38Cg5)7r^A|9-RP>Buj{^eK~NOl>FqeC1~S-Z8jQ za9Ca~g<%4;zM#gFEmd>;djai1kf|?4eyj0h zU(htAO;91N_L1RR(hn#K#R`V;q+@zp+~)B2y%kva#b2JBlbVO#Z&e_v0g*xF&|hkz zLZCuZE%WpD*)?-VuBHy=xdU^%y5^<#KH7&BXlgVw^~3)k#(Z`rqi_yK1^a*^g(ih4g?ft%!%4$L z%SZcymV=gomX{XZJeepFKaorsL;0C9jxx%il)pE85?m5&61)nG%G>JF?EUPtYyqJ< zAt#}W*fNS@wqm;CSH)DtT*avI52)to`w06e`$+p}`-o7N(?m1)Gi00?oCq@dw5B|! zl%|}fjHdSjN+}3wC}~J(XlaOPsA&PsY3P~=nkbq`xA?WhwNNtpT&7H>e5Nl|A0Bt&r}?~=m1OtKEAbiE(#=;I*Xl(zyJS$!lw!SCPK_OIB>pazZ( z_LGAT)0qddc16uOcU4E6F3r5%V1sG@Tc#j?JK(g_biVRGnF20lbM;8kCH3pF_Iib* zn$T0F^L*n|qs5BTk-JO4SIk?Vgs+P$8`e$@O;63=R!AnE07`LW?Gp2Ker4y#1v<9d z*JFZjlhpYSMR8=u9qLEDoNz>URSWVGKeHUhg{NSzayL1+HvCyp4d>hAiyezpa;H~!Hl_P zBJO4%;3QX9$d2S(LTP5Ow-K*ITm|7yXR-Hgw!_XuJPh7^A%$R#Jn!*n^T2u|@Fpya za$F8wKJbHFIL++&aKg6a)d$yXbS;nSH;Y-sauqb=3CDE4`9WFF0S(l1{!MA0?mW>0 zc)z*u}AzdM52*{H7-B)p!ehj~Q~7=y?3jCzHjR z4UG$k`i(yT#XtPSo3ErG*0r;EMeK^kC!S?E9=0ZFrL4Gq~XYqW)?ZWrr$LRUd&55V`+m=5N1xUw;ySBT(Xk7(|c$nHm;u|nTU-Y^C zXkBeZ{7&{=#3mkJ`k)9fMjJ90k7vMpYbDS**=KLn_-<(v%{`yKGkS&R+G(w}%XEh4 z@vfyEYa+2l10emek%ez<>YAy;_%X?5l7 z%G;{_-P$ImVIFxQ{I2EUJLGXTV5tvC072oW80psEiVZCBfA9&Y?v(Q}5B!#h?^MSE z$JH*q$Q_rTL87GDrTaHN0or3$$I&kHUw2lnNL|re1p#c`{~a6DAxAupT2FM`JDuHr z>l3avtuEg^jsx&1DPq3U9M@d+-tBvxw|NM(to3@j3w!3YvFbLmbY0Ej?*&vfw$bYT zkD_S1>!`u<6z~jdqg<8yt5HC=bhLY#wK?hrvrH#%4PSza46$wn%XsoJ!wK$fxM#2Y zFxIM#Zb{{c+R^6|mD`TuQqS2o!c{We^2#x_V~Z0%1+LpP&(Su#-w?&s{5)DzY4`lz z&oiexchA-~eq901Qb;hzH^6;BbQ*Qr=lNrzhT1a$bZ%;G{=gG{EB4x-8|lW z^kQgJA)`eqyP5MMYLi+0XanGhZx@iL3+IP-Xr3W$FIK-C_qZTQj(hI3{YRZ3e=f7y zdfa)n>v6_+r{h`44;GKx9#>x1{9Y7~@&Y|xSlhn^iuT(V53Bd!7)Y$p%l>P_2fIht zCl??8rw}r773>Ge$4`$Rz$v@4Ps5+KLt;z!9#MdiIsEBx{B-B`{2sz0{g~wh|2E>j z_Yv#KM&Q?|tWRqDGC2C=m)gze2QKg3^vp+1pUn2}t7|sDxNn3C$`)5Qe(MuYx8MHg z6BC2XJ`L^tt3Qv=ukPUQ1H3!D*f+^8W3I&?3?J>D0?C?96wY31$wJvp<+mCZHxgVv+fQ?$=~`wsm4_0mO#u0&chVco?j$H)y0UQDmiZ~_5kW8>=`s{Y%Qxi4lP>aDqi`K?Q~0~+C@^r)!hY)=5)cq=V$gQ&7Rd;n2u_y&Z~c zx)79`!+uE}=6Xz3qzed^aO8yv9nN|*U|b&=!uBsM!GlB$FAIg?A-Be8OWKI=9;jJOJ4rIUvG6A^ov58roid#r$uHp>U>e{WV4qN}L$X#dmkE|}mr0hfmy!9tvNVERohz#=tt-#7 z<|=|Ww@;?-l?#n&RAcA@9+|tgCQfRrvo2RUJRNoTt#XM%|^JPh|g_O6G zAc=CwjDB5yg?G8Ss`!k8lQaof=1Dru)+z4SzRnvfb=Yrd&SozCtjnM}L*=CLf5`X# ze7M%E)xNV+NVAf*Rr1&Jwmh&%_)l%LiYJ{+&K1y(gnwb z1Ne)*yI^4ZX>mbxp#@&Q2XMqc-R3nD@?HMvI?3%*T$o%`xr=CXJt$nH+(x*+e^BAe z$x`;g&XX-En&sHnxX5tVdC=B=&^+~bS9lO^{r%dni`+F@fe!wps5WXV(^~Oe-lnu+ z=9~GcAK68PyIgA}zdTuKFTD3m|33Cb$*r_kMMc_r(5<3Z!Ar9d!iYliVAUuY!+9P~ z*{F9)T*3`~d8g){gzez#kTUYvQ-NIZVspx)thr(425F7dIg;k34n>@1GGYm{o1AVk zPDlQQ#R{BMG8)s_C29J3g_6@{z(qA*;yg?%9dt5%&DFr=0#5s|9@Re8irLQEZrk=N zR6CbHmr&yB?oXphD@rp-+eyPuOHL~#Xq#%8Yng1BZJBPFR~|hHD3m)__>F@rr>ntn zec}{O8&A_84J}-1VFxWJ&&f!OHgjsugf#Q>A?|-=@Da0Zu2rtt?Ih5P+71ETD5byM zD3S9ameDk0?V6m$8B4QzF5cgdsxX$TseCm-Y#z0ZZQu1holS4UB9s)J}jRbCclnzxklvZDNDC1tIo zl~nqiajk}xZ2G*ajV#hquIl8+S|h7~dWCQK;0jI)t=jUXmsWo|N#&|=))vR6zp3x9 zOQeTSH!!{u*k-&DS7y!~)A6Z-AkrB-F@oxkpl+RL)rI;OeA7%r8Mwo5`w zUPmVXQKD|Nz@YytMlA&$1>m;A{q=4Xy31~>E$12>O$O3Fx4JC(9Yy&YbeFHp8S_D3 zE?FKG`dbHokp9N(l=QJAXj?J322Vk_2(@M{@wt5r8YlxE@V}_VR3Hx+UsN_Quy^~q z7pUycUipSvzM}nR#3Wiqe85pq7q?f^l`Ysn>4Dr!?MfG{AKPo`$`@>`&FmuXD$$vQ+PeeFThXw1#T|+SI@7o29pcj3)KtL z3q=#lJ%bhCiq8u1ipC1xii_pP-&e{P#uwTbRu^*fl{Zxf^G5jl1@8>5)5W@iR|*=I zXhi?3L-p(p`dQ<(C})4+>YIwZX{`f$Ut||(1%>~{iDml-i*L7I1@=RK{zsH@wiw1M zW$s%4aR~p9Ke*A?rT-^Qh2h^c%4*vp84t95E4zRzop@`5>RN{B3{08ifxzq9)r$55 zrt2D3(3#*Ti{q)_GnqF=>Yrskko{D+ZnBylyRJzme`ClpGjvAyM!#sf^2~?_cwHw` zIe9>QU1Bwr_1lPN?D`>ICszAW=YhBSuGMeb|9-}Ft$piu%k(Cz$HF?}q@hRUtt=e9LeS+=%lX7Zp`>%))# znuL?xrv9xAH51BxW%9fB+WK1jwkuTObM=pD6A`Gz=h7du$NLv&kFFJNQ+k$G0_tR^ zihfT1-n}NiE&r=-op7u95ZMcBVsL%f-3#?(P^|3gb;Hu39v1a_Jf;hOh%3xwbxkH| zVTHvoz@j>ebGbN3)D%XOCG1Gd6fnuO>{KL5?_u2ZqfrkPN{iLN-(4L=S{ar|j-p5v zD%acSE)t8!zPfd|?1?M`mnFf%hDY7=*ss`O>;e{z{e~UKF6$}{(ne)PnMBP;Nk+9t z1w{Q+>JRRJq)@b8TKq%Uriz*7J>E~8wcnw?35wR0u2Ozt8zqEy2RG@D2(+KZP6)%Z zCC2IOpUjrJV1zv`-A#r08A9=H@EJrk+tg)p#3~P%ie~<= z>Gu-BlB=so8^ibbqd`*JNW-l zFjlk{7l|v!W#B&I5^(kSysNWMxcAMIms1NKjKZW0vWS5v^s>*Q6WHz;UfNK@cw2oPSum?nNED=AaJu2*Jm2Jsj-QRbNdQlQm zQoH>v|7AR_II6g$IH)+Mh*4Zs?2Y(YRIeMyNks{ugi}7@WY7}Jag->&&f@(>Ls`$c zq}iIcCp_h}(S~>_?wo~irwq{go!#NE(Svxz`MR7Z?Wp=OYKc(@S?)FS-Q5 z!kMZ0r;ZTm3L8MzAgnp(G^_shCdkgNm`XN7VKeAVgd62cPD7#$w?*-02iOmE7(#(k zg)>pB>aVHZR|LX<(t#7B1t3J3tgfluriCaV6P5!t5Y*aHRZ%_mxOoFr$U6*KWQ4f3Ddb`o<0 zfh+dEa`#1iCdc0ZYu@V9pNHjG0m&x7qNfYvlt3N)&$o#-fxyWLlBmi#4e(M7gPYR%_ z>VKCw0`w~e(C!VsY4UR-}gq=g04*%2L0BT z9VtX(_)jkqzT9U*Oi9Bj5P}qjLznc!(4W7pysN9){VU-3= zsJUrd6AU`rCq(Q*GuOEN2S1llky^wSG;IQhrVAgN9IEdOTK{xEvXE->bX*_qYmTHO zuB5^6SGgP0O$tCvJ6b*Ay>OAUh>S*dp>MZJZ>LlvfANBlST?QNm zJODNTM}Xb-b#F{j@}T;hI!1j} zy;psT_my6=ev5wFv`zVxdYX~r$3^wH3}Zew|zjy5;thFY1jM(ZlsV^ZwvY+QOE7H4AxpHA{h(%Hc=S-+vvhao3}OHxPj4*j7DS5I!*H{ z`}(^_=^0LZKx6y*akHHElNH`~{=K6m87#(`b$?o0T;T(wHAZ)ig!o*H=jvTe7h7B4 z@b9CEA0M`M8=u!5T7a6o9k+)^n=>eD?<^VcIT&N=A*P+J-tYlC%2zIJ&}QgIC=%Mf z-n8Dj-a=^O^Bw$f>pjOxxABGS zk0K7XtAhd0h$U#;?m50)Fm1uj47MatKdY4pT{NxbfvyZjC1^dfkZ5x|Tv+(n>_BPL z>9P4`usDJJ*^q>`YyOf{t=^;?WTB(g3*K)x&Cmrwi|j>Hz7+Gb$1coaQjU%8?kU7-E4{b;#)22T6xyW4I<0rSg?!{zqVFWQZt zXmS>V>~@y37nr^D@!vTLX-C@7 z+8`ZwqYD5pWsms3n>8cN*>78r_6{qUr~<8*7XEE6qsz@m7l%nqPr?0{(f)~t_o5Sz z@)tlKee8FaF_HMr$_w~jaz3(uL=$b=F&j1!wi4DKHWN0+O7qKq&1=nX&1Ws(sb@^& zBc=$(2qslhyGP{Frh(t&#^sjf`sAkNMp19UxgePd>MNYzP4Nf{W$ zUO0Mxg|L5=a`gMU^I=6U`n~p}b|%<*0HZHx&);)iF6n(R>93dQJ{GAxKkV0D_D4xf zV6T`+SwHM}ug@bPMpT^uHsk#~>8e!V!CJxli^S3O^Wc>UGSX|t5Z|xIHeY%_yw@Q$ zd|Qxd%0ci!(xRmZ~0g>3`i)^hIMjnVbxf>+al&17%S`}@&S zXfh^7kd(jY#@e^uocBJDXz?A_%760p-2SqKK16Szf1-ELzv`;ig#6kWwez(h+RNHt zZIpJ1_8)QQFKS=ahSe4jTlg4xFA6`Rz*rFCrJ9u53pJ41%Mq!O7kalJ>spWY~&Rm)5B=VB6fu1x!`{Yz@!d-`arA&r^q!ui{cHnY^e z-^tezcCMrXu-8ee@|&Hl&NNzWs~17rTOZRTwO8kie`7|1xmfalgRb_;Sod7_UH4x1U-v?Ip#(z&{|Mg0 z>qYW{eS%(3)dlTn$!YayMQFWf32D_#9wff4?N0Gd@lWwe@k{YZ2`Ii6Y9Mo^RicfJ zOO0!Zdq|rg=rt|b>F7VTQ8KHP7w1pQB>2Lz>hH?I{qF-zw3dQhmdk!qn;V71v;TZP z%?mPj?D^ro4zSZES%STA-y+rh@QsDtf$JOPaVCOR-GQ4M^~AHEEmKYl;w}VbI`({U zQ%e8Nj`0`9=qa+dkru~FTVzSnP1l*Zh5z4`E#o^cH(<*HCbX1-oR%RzMs0_Ue(efgKpn;j6Mt$EuZdXO9ENBc}r!qT;K z!M}NvV)uJPoHXr?ASr~gOUm2pa03kpzcHY75X4wQIy!v4w)?gQ4{3JXy=?t#eQX0Z zJvV(fy*K^i)TG@}?ji1f-0!)EyUV*9{xgddIaKy$??!YWx)7a+ZZ!z-zxY~fRBK6V zP-{*LqqVBlYbjFjd2WTbOK&-SIekT}!^wAMt70*M*N5qITZfb1%udCMR&<`WWcx~A z>v6}v_sr2wLmso_#qx5%=@-l9Zv0dGcUREfPDS@d+PEp=Ffs>F9)u zq{lK_U&z5uLEeSCOvk>@>6F&zyt@H_(rcHMdO69WWs=UTL;Hn^m^?j6TX#bP$h_Wi zeD~E)`@V^?Jda32m&dzue1OM0-4=m(pKv8f*=7FDt9|>$iC7EM&6+%G z_qpY|?nO`JzWvyQzgFo>cmI{c&cy(qwVkgMDS4X=XXuIQJfP&RyWldUtJB-|B<67P zuy>>PXYWq$uio|E{oZZz7k0=g zmvkApOxg}?C%pyUlBRP0R`O^-VMJk3;eE6+nHF=dv^=!{v$=F@kmJSI_2QX+H?o?y z$JY_(U$=|D_gj)lGye+eI3{;kyifLtnfZ0#)_QX^7jxn3z#Z}i>~cRbnUFN<1iRG# zjLbtCb^6%$?eY5iXc;mV>EFS0SmC|(G?i};qroBP!iP|Fe^s;ynKiiTaQ_mThv=bSS+3=rv}y9397HNYPAOe8AelPcc5fLusV zNJPl1F;y9wEX0EP9dxx<{)12A?U%6+SvpoxsE~8fLpXZOG2z9| zc3hU1ko70cz?|PF6Jv&MTTVhiEBjC5K{*#ED`VkVN*;g@^;>3EnW#U%TMpp^V>MaU zR&&nmjlql9mVNlxSX&m8P`A~&GwQ~Q6vg-&bmD!ujUKDcLN1|ptprh!*PSP@6X-b< z2R$R4Z@p@|@x1iB_Pp}E!Cqpo3H)zDF5eJ@5WI;9iFl*h6Knm~I6&c?97ldeeoB6k zf+eI>yH>qYy&1k7z8=0BzTu5t#p7`55UMxaGU_s;G7KSN*N!KM*kEK54NJYuQb_B~ z9(HPnEFK}KGeXCp-OW!)WHQ$wA-|`NZNChyoymvRcH>5dl9MK7qTa+`(w!kR-ixqU zhs57p{=HGqH5boQE9VNMXJ9Hiw6rbxa2lNd_zqGMG1z%Z}e(+x=U# zhDeq;mRgoPmTs14mP(c^YYq)}S!P))SsB?-*}HEaxP~@%)BmPCp*&~5O1V}1qj(GB zf`x8`QiP_4>W5B;iiWm?HeY~bgJd7bD&h0MQ;S-x6~&)~GTe$?Ii1gJRL<(;75RU@ z^O;n(Ak_V)bF*?xr@g2<^!1;rzj{iT;Lu+;L2H%slM1p)&NI^Ir|3xo*~vfPi_^YI zjnA)2O+u}1f;M;SivmJdZ?4uVCxyQ5l@^7{-Vc3v8*&2N+C>&Y-#$qAYkCn)E?XKp z_$LGh{MC5psOYDA$Qf|mVR}+h)*!Uvwu+(gegeHLGIZz9_|4TXhu+B&mf0UY=T5R3 zp`q7i=g19**-0T;m-(fCJ}VP`vd=;#Ze6by&ykxB^VTnU&;K0WfUrJ$yTg;sMU=9Y z;%)_3pbMY%-Ra2;7K1xJcQjrd7K*^G|MK4DeS&)g z_apAXZ2Rw)-SK{>`p)s4>AS#pim%d0tpjQg- z2JdLyO$m^Eur>FhuMO^?~zb-m;vxk7>jklgc}<^AtRO2RTv?SzLbpDW18JfbHRrLYs@4#zb=w+@egbj4uDHf)#dAy*Op z(I(`@ux9e&b04{#_aS7l!Y-`Cuw)jw%62F+h<=5yTPO{DhT3K`hddbc&)xT+t%tTz9|&zf4V$ zmjKa6PXpwABlk#)uRZvZgCrGoVuD$JMF&1Dk&LMEeUd|_04Bmoq0^q~D1eD^V2;)+ zHuTujMtKw|juZX;>9IVDjL3v?N%*24{CMWs4m9DKdwf$^rw{z(lz;qGSf~$0 zLVVUkboydEPuQa$MSLnV9?f8Dot*@|?k9<$CpqOA*Ug?3|LK{XB3ud`>xx*X~haKuA|GJ;cW4USZdQ><0YQ|wlZR;)z3sjY1@Ap{Zb zh;9mLiVKck8sKE-z(qcs?nVmQ7QscK1JJwomJSp}BqKXn5#*}Bk%vx4x1!_m zG+90xWylx(Cd)M0H2spbnFD74GlMBnEKby*g%IKhKg1J+7D7PHu%Zp%&*2X^=QszD za*zTNIa1`AHS$&S)$`TzH6W@Gb%h_&-44RZnwG9MQU(_lHOtB8w;LU!vWpds#oHk8 z&pe;uj$5cut1zojsxYe1s<5n3s4$?RwQq<28ulIW9b3-WPwC|Hu~t4Sg8Xn8{yhp# z58^mA-9hj>XY0TVN5EM@tf%@r8RITy?-rirw2L0wt&W8x@26dH&j`f{FeTHcUvU6A zPR;C1?G^0}X`&~x$7yrCavDV`Mbkuo*j3oA-^_>tMUkRDqNk!i;52qL+v?a0Jd?m8 zsv#;1&x9M>8N)+IN<`Z@k%CB8Bo7jR6hN{g`QnJsh2uTrVdKT)DdWxYKUu73yWrYz zj2#9pXeS77urqwyK;jr{lW2pmNwA5tNm`3pi+?QZr{t-ERm3V|m9Q$06(1|>-hQ4R zNPWEiSf2nS&mk`+&o2*Vn;uq-u!}H^@Qu)naE*W{Rtd5cKP{${L+HlpCVqWdEW-9{ zHIGe9#S!t9p;$mZI3n?JLCVs~&C%lkHeaQ^L{CY1orqxaUn05oeC$KM!yb~<^b{)6m-JYJ z-0*Ez)Y0QHa$~kSoL1=%4=!b&14&5F&+%}UKGk%o!f814q{U)+VskQ3t6jP|bQ!JKLsL za8Kx&m$WK7#Z5Dpvzw<};oreulrATFbE%u8<2|!Ve=ByS?*q=n(g<-op|SWj;L>`1?{4 zr7K3b)TnCu6t}Hj&$o1O=53dB1b3QVk5W#oC=G9Vz1-y| zo~wVWY?jzU0T&-_m($P?{3=sDmygx5$1u>*>6v9ij~m4%hLm8J06 z%!vpEX$p1*b{ckOc5-%lc4~H}TGM5`(q<2{v)zJi*;2u%Y`L4wd#q#i5~rS)iYObz z@6ZW|nA@`1xW-K}m$EB6#D5q0h2D#uVxqkIyFw=|@@t@jWm7JGm5$6-UM&d*PQ-Bx z&d^Q5z)3i^!Le-J=~}u*TNDB(G1yIaY#S0YMO(|WZyW!Y?!L%F+mKihs!gBx_1sit zSo|Pe91buT7~d$u3DdOV+sD)FKVX^z*@+^Qwi1I7O^D^>&?U1i>mV$iMI;mUC%*XF zn(w~gkSU^>Vbdi3Bi(_B1k80%k=&JU&_BL_u3O|Bb~q#z<3&el>`S#NHK-OpL+2oZ zv4x;J>fFYRNDLT#7&RDO7%dos8C4()mB2*4#FvR&iIVuxMp^CWf`RY7=~J}ovaF%6NHkQO(uy(JYXH6W#)ub=OoA0?IGMIItH;FLH+Q7Nu% zk$*15>1;OL-%HkUs9TT$w59 zR2-w2KO*&GLvtV}5olnr>6+gub?VhKWEO*@+f~Ug4+O;5J@?Dsmg4g=-ux4bq;ZhO zC_`G!Tn86pkxUL;829{7QaAXa-uS&^+7-s=EfZVqlv-P`v>Mryk1y4qipKZwW~gzpdt5bFJN)B2kE zL0V2F97E8K4~hI>-gVyEK(Ipii*rxSQ>gcrfQ;fdXM{ZqXJGo8S2!18A!lIbT2MGG zVRNYvB}yIpqBoDggA%2ImFbOE1o+6!5*o$53<%{0|CZ6S3bO)6C?ts@m?6+odw;Xz?d@iz5Us!gh{{`fO(Hb6?6 zVya>qIu)J9k;;~(%BcoW;~L=@;T!>saPe^HnKfn@X_j#C0C>2ZRHw7cc+`CK*Pt4y za~y7JOKH9w`_jr-QX_@iP*w#taC`-%?AhR4W7o z6>cfDv}p*Xq0~=ajO1~6q@grUWJaRPgx~dWu%!LwqE{8o-ZDrn<|uNxrqdQpwG$gL zO%+lbObgKx)uVhZI?~QzpjMGK&XJ=fnq}8Bcq2U`pE|%Ho5~Nk%CQ5Ds3&ygZkeQh zMm83FRf0&1jr-TQ_ zv%!->z@^V&P^MpIV5e_qu%%!1_r|44TTfL_v$%}AoV(Idbt;>p9<9ZbYtUNes5O;Y zA|3hja}RE)OV+n+Pt)t=KmnB{Pl|wFWk+5K*T5&L3j?sKk?1I1ls&Hq%-+z89pWi0 z3(VaxQ(yaWN+qO^(!}u&98h`aqqGnVBi&TT1|h0bSsS*of2r>C=yfn?;&=vhV<&l{ z4C2e^>YqquZfL~fsH_b%%d$0b0)U323VqGWY&DTQnBYK&`nT_&D@|3Kvo};?%c*1y z_$w9DFzT_hRG; zGiz)E@Yq_a3b7rrOtCq!wpJ;JLnlV3d?$$0vJ=<|`S+(KaWjv~=p4S=O3K+p)^Mabhmx8~uZ4BUZ)8X29yFQWI%nIx}F6 zQX3TXubEe4t`Gifbj`&aA+)1aXnfNk# zEnw!3MlPLvtOTk0m~Kj|`{eI%OgQBt#de(pry+AYpVVzf zZ7?|x=YbqoBVVbneeklr3R4$q#%O0z=(So>j7EcBV8f5w~gq2&@&&QaF%bE0() z3&Tx0&|1zb|EL0zZhAZ$>L4}jnN8jhoW3sAuNE~!;y{l9LhL%mAMc_@ZAM`j*a&O_ zHU^vA7$&L##_`3yjN^)vj1!8J)p%|Z*NTj2i9o8FZSkk@Pw_X`d9DOzDrVYc8fN-t zYG%3`ceo2`$Y`)?h{UCqr&HIz+va~_#()%qJ7K0%%f} zh9KHy9H*e3UDM&_>`j%#azXHu zLIs5c;U(4QI>I{KI#NmLDj3QU%89rX+n|jgilEdW{h;X}(V&)~snPVYv`K?ugYnWW zo^768r>cbI>`ERTpTbOVebCZL>+XIP&VQ$~U{|}a0gSIU+SwoRX_Pp=1(Tip-U-Uy z)hisrKP!WBY4=X~Cr`mbC#dmL-pK>7#|dg84svT*co8JCwLf+$qVu*e40UI_7hH5g zvVE2BAT_CKwd@AXi^Iqq2fj&vt5)mdt;GpsmV@l19P_Mf12`mm zmwVEyFb!N8gmHeKzuP(Nle5d4RQ;~=Imwj%7xOR1U#!09eKC6~-$m3x97q&Md`Wak zEI<4z%qC1X%=2#bJIFIG{paS-jh|aR*L!YO<>x`GN;^z7OfyV9OsnW(RQ#&>o&E>I z50DSVuWaSMq4S8uXdQXJnt!N&6&#iru3G<+cv;Z1@|8*0uX_Q+zp0$-jV_3mg|Hu9 zd4xqjV5Sa)tf|Q@pl9w)5`l%VC11wwH4>o&u@%qjj@-fm9<0({>V9baGIa0u!9(Y7 zz4wZUNT@F%HXUD7!=~=pifg^$5w==$2}9gVd(cCTe)-(sK?U(RRknbz$*Z#;M$Cmm z*iT>N!v^lj67f@`AB;`j8+%|(R7Z1ZWK;j;b+PeZ{w6b<+AscL1^2oioD&_=Dsl$v zt~Gtp3){TM^+20ApIS=joBMzu5rn3L*M=7+2;+eX!1#!4+iAV1ylA|ry=ZY%IGTa_ z?8cbSsvlIFRI5}wVhj}pi4+l32pR-6f>w=6jYf@Hjdq~kv_iE_wL!HVbsIO*Wlau)s;(@F|;6EQ&u?qQpeWiZ;k#%Pl29X_fX$x2%!dyC+HMI*x>j zp8uqJSeJbE^V=0WUAvB9)s!hVTcsWWz$9$@>+@FVu$Rn%dHCY>ybya!GsJv=Zjfc7IsJ)4TBE#kN! zXS=zNGP06rlB$porK@{uY&NVBX+qRUy~>R;3arFhk$2sE_*#k8E4GHdg6giP^(C|U zUYJ2mp^8vLsOEZHUq|>)via|I!o|YXSS_eJ)Eue|JvYY?CGw5)g_xM?ni^gf#{fgr z)+_s3`eOTP`h+6ImC))3M9+xwh%AV{6TKwrCJK%XJcC)UzgpMDqgK;(#dX7VO>()3 z&c4XL^1h7l>WI#Wa*kMWsanwokx5Yx zSW<7z+T)%wqaa3EZfGMKC{_T!GWU4A8qv3@rfcshJ^`3B0}VI45L|%5IhxBl^eKgq zI*K1xgFc|}P)F4ZU@Z|B0GaeXK3ucnTSVB>y+;}$yds7hK8SS+c7U=*yrmE}$?xr@ zJ`9DPr=SFIYGkBUQ{-l3^NLu)D$uTo&QwQ|JR#gCv^-*fLROtWmZO|K$K~W0` z%`oL_wt|(S?bVj=yJsv2HXFd&(N>6Cibnua4K{f&uNP#a4DEzKQtSc@{~2sob#r@} zZPY|m$9Kk;$A64>K4O@4gCD{f;rVa~d>Iagqu_@BX2pH8a9M=ugqegHgjp%0!|?Us z6wxWsW>K6dLUcs5T6Dj~k!(19By%KVB#S4VCsS`UeRQMnBc!5O(>A9xo0ePicWqrizNDd?_mjzdbB(D ziPn1kW;LL1K)P_D2?zF}yQVLs!+yChd;ffV@?8;>>=5yYnPE?N#j@C^>L(*W4aFg;=JCG zuVZWWSkb<_H}u!^59z~6pi$iY!V3BNX(Xj2nSFk2R%}Q&U|4!NXYL{!)@8Ab12T){l&jk=qku#fp>=I|rUc3KX{TlmJdWIYJh%+Bo=^WfH*w`Qbv zpzLj3|+!B?fR^%7;mnz75%%>M^FxA`ZLs9~aGoak6B ze%8whU>l4AQ}NHcMf(FcUvDggO!FBI77Bz^*&Z!Z*WzS5>^dk-Sr&Yo;e-t)#r?VH8CYNTHrt6P^ctJHF zXV6a&1KtEeUERpX5tIx1%~;QVJ0ykv$V8RI~LJBoT|<&0TAkP$EOp^uF7KFh;iKCc%1B&k)Z5oHk z*_qiX*?$`6s*w~v6fXh(YKNH%?9C>yB94tB{My1ns?M02jh95E_`MV<@^-4wB8W{2 zE)H$={8T9cFU~i|W(Xe&dPJR~wtVWa1{DWubqU@~nqM!aO8pzhPl_i_E4W(;TpWL~ zY86GUq5;LKZkD4O9fcbrF@lHC!%=O4!je#>glk2}T}GI`h2DzKkDC~*grxf@tW8Kk`f%GmX_%B}?lVRk@STxnc+ zTv;lkX*$)B-~n(scpIDno&|pdpP{f(31Dw#KvJ&C*vvR_Y5lI#w#Z5Asqaa4P#yk5 z|3Y_WE*+tyyrHqp-TmFjJUV;~TSQO^xF7E%!ZFE>AFkX>5uSaDV{+EkDQ84BJtq4a5qvV zIAs@JXcA<#8pGJGmBSqUyW4H-EVpKJ&JFj!^zAEce*ATU{RFOS%j zC&tNLK-kE}BJAjaKUKD%uz^k6bJRK{tl)t^^@631PS~dh=hP847qn8kYc^pD4|a(8 zsiYuJSFx&Lr4JIRrL5Kz!_ppTQ%hOm+cd+F4=~jK1E!OSwuq}G`Kh>RxT(2mtEj4I zs;H}IBP3m^l8Lz=e7k2JW`Fn7tJ>!gj#Q4cdsM>2rVkG9t=!X=bNyg-xBZ>T7oo30 z!rV`(9ux1=`-VZoI$r797}`MALc)mm(`bny{GQccw(pq`K?FSOznq0*qa=xz`8{jD z9Nh~bS{CqZ{Gxxob@PCkD$sOIFKp;RAyuIHn%VW%_Pt4B6gRfzOYOZzViXVdKUdp* z@0d7*8{7P)@?H^f2oLt-bCRp}dq0T(a5w4OeEc$b&*gyx^~`sSQXAExxn0e08{7A| zLvGOmeTUd_njF3s z>37Lf!`c|VGRrapG(U{GInFn(@7W8b*GkK5R^*>mKM#M%e%=2;)s%x*l%IlDEjB(j zK2APnHx9zxV!8!O(NGek?bP3L*4vx=$TlCh%!Xde*)Vgc%aQ2;NX2H*_v@-`Kk;%3d#Rj&fHQcUPC`Bx~`M(CATmKgN$ z6LR|Aq9{@i5yX|F=hLt2(HD5cSeI@pfJ36q5nAx(io7vb9^}Vy z!yGqwTh^kUeHVYA!{~Ts4j&RZ-XPjNcF2Ql=f~c@fuCoAba!lW6yQ5!2ZO(bC_f9O zgCIMqIi>K#43O21V$R5j^*=G(!H8((XuhCN#rUG=?x-f_&y!95G=Vfe_WuQj^KP@U zT7RtYLbm~rfq(&@fzS*$5Y$eN$CT-!&h+(~$at#?qe1St2Toc0>3DSA4Vj(BJFjz| z@toP`Sis%0It_N*bAsWSqsu~Z!h3Q#(QxLBAjpndP9?lB!%RDhEk^Mx{+5z#MGoFQmOh$#!|-X zfsvHdcuLD?-8T|QeYdKx-m^izLcUGDA>5GFx>y(LeL6Tw%a_iZ&S%JL$oGx+8y}m! zyJ0dPH}y9n^GN##Z{Gj@juxsXQjYYG)P8_$VSfI{X~U#8+_KoBxB6@CnsGK{H89$w zxAAMEaMe@8$9#&^od3FtC#g4x)FSmFy&_Mk1q~I?u&~HDYC)q8$hvxDEpe3;-4LD%lqbue(;7g*455+Ww)MmJ7 z4zC$)bAHVf9Gt;qR8fn+4eLcs;0{LbX1Z$*8(JzyS9x!04ja8cjP}-aB)+K{4atb) zjjm;^_HG?*b~Z13gBnHfa@FS7cz2EF@H*7y*AkUxRj1ac*0LFmnD7|#81ooKz8f>* zHL5XkHu`DAV6=rlPradDt)o${(Qn>*US;vwpS%UU_SChpmgN=$)zh^^X}^qdHJ3)$ zMh}g`d7-0pM)byrS`H&+qd_B#NvAG#Ia{2OpmC?+ws!`fQG;=3rl?h;cj@Q^Z+p#h zgLmcV3h#yfU^(waEx78WX|$9#sTN!vD}3OT;b4?m3vN6q86D$otU)!z9xQm&pz2Q= zMsIjoYC`Hxs&lP|{zA4jG8&C~jIOMSdM2=oC(cP3 zZw4k%@*IyaR66H3cvTE8GVD6rIor8xyzp;`GGwyml~H^mFg)p z6o1ooaokVK6aURn&!C*(pP>B&8D&Hn)?`^~(O*4PyFQ0?z7)R}Zw9|-kV|M%HncTm zZ%Fw@SFXc6FJ-+cpD@5c>jJ6q>Kx2Szi>`)5pS69(A%_6un>2j?=Ya8Z$6&uFtM#3 zyk#JB?i&Ty;i?8V8FZY%^|-oB^PFvlNf%TVu4S;6q0t3ZO~@2#v1yrbAujXn(sa`x zVN$%9z}h*a9#=nj!655g_svwRGjz_hwz(R!^TOh%Ydz42w#?11ZGKVDp$nr~u=v7< z$H}3<($9Z>(ZIo@;EmsTW!Zf{(m9Z!Lk~v2px-aCtgO^8aTa8?t5}fcr#%a@q&42r zEI|5UW=Fn_%tcap`<1=8dJ*|z;6?ds-bn8P^#bPt^Mcm}%1od)(fTU&rL#_RQwOa- z>HJtD{R_02kcmb^4KwwdWspxV+?g5^tt+h^bh%X3paoT!CT$2;HLwP#t+smrsY06W z!U{C}1m`onT+SMM^|buS3^%lx_Ac=`d;Z%CB%6WnlGhM9RW z`SU;oUBnq`*>H-&#JvzYK-HXfVeH@vL>@m;^`{M(n-?rUL+Vbe3(xP@ot9(fU;OwP z(s){mQ7@S7di?h7oLMchx_9TH1%s=b@T`r60z`6k)kfw0{zH68>a%h2g~g{yE3-BM z@1>udODxRWynTQF38@6ymP|a`qv`9K=X>@ii4szCYk}7bluxuJq-NKA-vgguB&7Zi zRd*fG)cZD$|E&m0OE*Y&jBb^V5u+RF?wo)k-3=QsKsuyB8l+(`8U+NA*l1}H1oe0P zyg$$L{XPHfoSofg=WM%o?)zNV>sosJeLNRu1*a27FETVzA<{NdPmzrPgOiQ(5$8S5 zcbsG#Uo7_W8p2kbDV&#)Mp&iKyPsF4+ZGYl;si!|VpTqGc(dB?7T3S%HR~k=6q2YP)hLl%hg@Xm2j(?lL3^u-o(w4eh00DHs@nj3;vhdB3Iv8- znC>K^jB~x3mrcGpyc(|^ubsHdGR<5mYcwTc{zMsFho_IXO5VnMqzgBKL!w}LhH(Am z>PAhQ_CdzzUc6iKH(kfZl5f3rH`4}t1|tS-qFEE3X{Ykg>r2*qD{Phxaz`)VIgxYx znZg;Y^VViAO*0(lR{J}*$#UfnDK67Bs^T)BaK#IVj$x^dseQ{;g_ozG|J>M_n>t~S zW7cSo3yzl)Q8#M{zk4cC6GHJ4uRfx3gZGjGCt-H=8M8qgc?@2YLWz(bH7`q`OoR7x zAU3jOkUe@5&zSrT)WWc%!rO8)W>72I9Iu_?n9H_d&9I}gvCP|g^Ua`Qv?^Zef|NWY zxaJgWW4hTnh#w8ZYnW&5H3}|0HQFo~42dSjW1^7f2LFbZ8dw7}qQ=o)cwZ@Aan*8x ze@_OC8b%l4x#8s-h`)1(tkejX-UMJQqCpJh6r;RrH2Z6$zd6#!|(;dYG&UmuwLpC&Ovrbu`(v8rsTw$amxh z2|VTgY7W^68iwT+dd4nQ<28@IkW&~c>$}wK@$ge9me=74wU^q~nDDe|7>_{qt2=6z zy9yH;=8b8p9`F=vlnH~Yn>0#<^=RH9j62^pSNTFHHka6eGCjry^*|+%&U#-(OvMEH zb?dRESM{1vXQ{6-rf?!7FYv{OhVy5b;tAI5F&-U*!kYWYu!`o|a|=xLgl4uePlMrl z)t1$+d3F%biJ^Q|sKHIyxhWL|7&8t8g7zg!m|)~jmQFe;z?i}s-?kt_ZD@XAcjXvC;ZGApgB zSc(h%l4LRNFPUl|jqTP^n&cMRT~T3LQ!W1&GcIbh(BudeNNE}5)4YHptzmMWie+gr zvl|z!t2ColX?3w%t0+Non~EwKq^sJ-WtrBJP_?vj(=|BHSr%aK#c*ifs8o@-5Qy0V z&FKL3q3n_`XsJXg#RObS-Yv5yPtqET*1K9PbkzGOZdY(fH-4S(sPj?Xt{;_4W>3D& z+xvX?Y`b`rHF=CyN3_sYcERM+@XpKnGllK)QQqVwS})Oc*B;I2Q>*RBQPpG}+9I(& z=g^PW6}b67Ew^Jw6Gm%Bb&|!BwY0<~umdzR>$EEJ+})acktrMtT8?@L?wOq&GWkcY z&E3dCj*$E#w}d12*O^#aMB-A5_I*f&%pt85(Gi-JIgYVBdN1D+B$A^t58>%s!9AGT zqBSjs6h(?7#nSW8`CENj#p+G!)#{xVWq#g`BUqs7LHZ~hfQWx?kl-s^))sZVOL>K-&fl| zzH+?koV9O4j&Q*8EIbnqj(N4}#XCQtUuM$nr%L3nx%ze^3pj!nm`=n@U41_wBRPmA zULg?Iv8q~(63}_HOD6J9@Gq~KJU$8NI$Ajsrga8PRcKjBKo`&+nL%3X63PMJVmX-d zLtW21kuVPH{F19n^UM>iSE8ma&7aXu(wO%g`TpXE?sF?OBISt(Up%B&0|NKJhp0W& zK}lAywo~P_K*1O35dXQVu!d>*f?v`P{fQ3f=c9`dOQy3@wSG#wRns6#g7c1P+=5K$ zN`LJ`#N5b}nFGWEa?d`%S309mJZXV@k32vFkfsx~4XGrIT%`jFVp3{L_o}4LG+Yn% zr1=>XE9(~KKmkoFd<^E5@3!|Y{Vf=DbT+*T`lg?8&f*5JSd#A(1=toSIhBcgTKa}$ z;(R67;P>1KvRg9EUNG6!k?X6xTQeRLO`paSK#}8>HfBA#Z`J37c z<=uAz1hWzaC(=*-jr@%QULDl#ySsvJnB3oP@VB)tf3~d|X`@^%(S6k! zJ+I(V{2uTh%v;T<_cd4frTI~mM)=*z?a?iuLuCBxz4zYc!TfihUb5W)!>3=Ak(AF9 z82gnY8?9J!zrH0yB(7CvqTBuenFw*@b4 zg#j;(rDQS>bv^4Gfl*p7Jb&eO);p3)$;)qKeg}To`N=kOz%h~^$DFW&pxADeppEWG z2rdo>!NuSrQ7qp?mmL~cU!)FLMTX(r>d)VcjKqm0*de4OAflrOMWrx^NjiG3ZA1;I zN9yBL5*FJz5lqt}M8>J@34LQ`LC7awxgP(<2^iR~CKhMYvAWBXRxWbZ#SazzJyTHR#&) zbZVn}fH;yO(lD|pri$29WO>oiFQ4C|tu5EJrEcn~jVtQwoMYD%IDbXl&m*vHP<^S_|mlw3_(ux9H{j=4<4;=9}fe%vYJM`9u(m53^p6DUa z*15Rjo6qY}-`4p_8-KH*y>o8IG2h(7v%Pa+$J3mA@T*(P;?Ar5haQY=(8V2}d`^$_ zM^8O2YNvejcRj3Hp({Iv`AZ%)Q|qnJ)g8tnaAi zXN$k{c-1yC_rok-i$OeSdEUk?wwh>F+WjO>uaJSELI%hI`6jevhhZT8@WzjM%@ zzmSXx!x7P!lq#|y=}YMjh906m#M;DmD9+m~+N_ZjVnSo_87O5e zj=ZafFhs`E7T@Be&)gX5gF5Cm9b?TIJcBwGND_S7hkA)L8IFU3XE$wPRT&tAqHJaN zPg{pth$a~dgM!nwPaR^78LWbW7dAa&gBaE;$?j%1?P7HpnsFW0M2weKva$~@j!!e&VipV6(_5vjx^#=z2ca&m@UCKiWZMuB-#@|uqDK99rJDXBddL$zMcw!|r3Gwsc zua>xNnq2Z(Xj-gZ@P#J!jr6lLKH_Idw3(nYXQO0IY#Mt6#~r6Zh)GnCeReP*F8*Piido3SGaBQ+yB ziDHRb;`ttJ%lBDUTtysOrX0Jci1JNx`uXf#q#ZB`O$@ZD;+{@%Z7o#EW zke{ISvBFWm-DP>ajmuWg-GFYY!liVz)t$in0n#HsCE3MpWm(+P{6$cT*39VpGxyN^ zzNvo7v==YPJ}ZeU<}Y(J(X1qS{2jPexcUt^&h3;;vFA^U8@qG-Y4}dj>*_bP(=|ny zpD*6-?zy_wl#BARHx2SQUg29=YlptLm~}jVZSm(<`jlNhr?`$s;R@gCmJI!jht+aV zE7alQ^NyDEYCDhtvc4MHc;kG5+-aHm+GqKDWar(KME=RuPsTfsEf|wHulPIhryif& z=id10!=^0T{8v6Z)J(PsWd8ZugZ*>~=x>fj(WAU57>&z%OG>z>4aF=7-6*ynLp!K!RNWO<;UC zn5Rj(iWCzDG)GHV}0yfKKW5#smtQTw{&t!puKCq=IgO<<>VKEA6qOK zb3bS4JtF>xLnKY^tHs+dq)mw06qg2k_N2BVpVUY0Zpd6R;1Io0+4sOcXyf zZgb=f$l;FCe9{*F9cb^B&4eLC)$5OLL`w{wl574Q81L21lp#x1f9LMqMzr_W%{N1e zv8qI=4264b4#seTzy%hxO&AX^Ah|6z7JZps~?+Y?0)HT z((py@>T-G2&N}s%9MPrZ^0uxHThxUd5 zD`$j-SnS99|8`AvldJ#HF}LlQYA)ybqhmo+ruEA=pN28L)LS{m%i!g0Na~o}CaUl< z`17`DDu!_;q-XD}dF)*w*S+8`+ghpZa_irNziun0rpn2GSBh<$k?Xs>{=99TdLsAg z(qzBs=ZVq2Q|f!hd<*ezcb}C5VNCNB1>KA8Ng|jFj0R>3lY$ipbg#7>Zcs|q3*FhgBwdK2rflvCtfVppVn7%-z<#Y!kKx#L`2U)R*NJM7@ad(hg zY6v*M5_ns?4)px0yG1SRsYa9o<}8>~DiV+9eL)tV1sJFnMl_1tyZtTcVTFl@TbbR7=_iZ#)~{_&Qiu=M;uXS!}gQ0GSTp6?tcW75I6)uwyP_ai26G5|&=AYtj* zxfU4h(Y@`vgejcNm<)qG6d<-tzbEGlJvtx8R8NY)9ALWwf)*qdAN--1^Us*%Npo0` zz=^oDe8f~v=1p>>PBEJI1aP(#rbEF{_lxD@ zrXjn}cB5ot6)lW@j52b8(4(v6?WQHWBA8X~`8%&sfBmO)6`l3A~hXOg1G1 zaVoj*GqK$|mYemXc1$WYN%a%!E;AG@hgbMdbs`XU(5yOAdH}gl8Y<{g9a6l~l{Fxq zD&5C5F#6#PrDpUo?RcD zO>K9N5$hlr>w;@v-d&npETdaioDv0NT0c5XIOWd-7BR>#$cxCg^ij_vX0(ee<-5bK zu8+R2?6!QRQk35Co83*D>6wX`u_UQ%>g})+L!QT&~CE6H*UKZ$!iVt&b2nshbN|``2*! zoYZd%-<8j|t}jC^m}bU)?B5cE-nV{&D%L@ZT*ily7NvhEybspC8(QA&nZYhnE<*kZ z+1^%{hlL8)$D$xDQJ-mG0=8~Bdx*3ZZlu@~LS6NfVXENPl!EgF;8 z2`&67dtrJ7J+4enwz>v57R<%x-Q*ebq9FN`UzaMd8Py^k`J%AC>(K8vI~Q^VyTnBl zMTSL1@^13^Ki!X8$^{8lKgsKdwS8Y%cTz3dmlp|h)IYE&DhLbwzVgLMr>HmV>if!9 zDjoUR-4{iQVLP{cmr`rHYDJ}C5G(K6nKOCLpNJ#Bnwfohr=JL|qR@Js3Y|8c`qV|v zua&cv@bjFXS+@p14Q>~IF5Zg%9N!PgmUm^U(`iXvulzW+w{VQVyRdI})%0^YtSby5 z-z)EF?atAV`nB?_(=6v6*;V|{t*xO(oi)yVkpq!qzdpg2mlk_1%e%HknqdMzI_Gy? zt;y9b5B+*)lI10C*AD!;XA1fr)gNDVE;&`t{E{dBDSLELRdlrnUE5VJsthaqZhCyt zGm|JUxUk=QaM3lBFYk5Rb9m7=6D!Z8KM;0s(K!Q?x4sQMyy%@tmFMLSct0~E?-nLb zxGei(GQ19}0%yx2cs2YRRv-bKQAorD_8qwWi6Vm2HTw0}-|K#ONOpVs^oZs(wik=z z_RsHzKayubw>U>k-Y@#me_HGBKYU0}EA;e*P2+LW@886+5AQa|!;ym@+JB#vVx+*<8jCsUDt!7Mzi_dBMt}_=*drX)_I?|KSNE9so0@{CZPY|bv{*(t3 zCbuya-j20S82of&C_EKQo-nHEx9rAbcmq}+;kEq6Sa|lmzwO`AH;TW|@81dMzh{nB zalZ|lyQ@X+g=)WlKe*q$-=cpy-0}_er{i$Bdm&g?*hj>YkG+L9bf3%?+=NGm58YF} zpMpb=FUjc5@|a`azP~zr;hxj|X&eOp_yc>aH?!#bW#OUEnBP+C;&DARh`5wly!Sr* zeGJ{j(;!l9u<}VwgpiK>7$-)*Z%k6hxa7zd*ZC&buc{g-_`E_5*~6- z^WG0E#s~MmK⪙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%0A9;5j51Ev&M33{VE8koh{}=s%M|N~K@%|po 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

+JF`e{5x)e)+(V(C>m&)TjF|X*$Y`d}WF$L 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 Yvz}Gl3p|x1AUHimM%Tw_j$b7BKT3oL)c^nh literal 0 HcmV?d00001 diff --git a/src/protogen/ble_scan.go b/src/protogen/ble_scan.go index 1ba6083..66e862e 100644 --- a/src/protogen/ble_scan.go +++ b/src/protogen/ble_scan.go @@ -250,7 +250,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc return } - ServBuf := make([]byte, 255) + //ServBuf := make([]byte, 255) Charbuf := make([]byte, 255) targetServices, err = TargetDevice.DiscoverServices(nil) @@ -258,14 +258,15 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc sublog.Error().Err(err).Msg("DISCOVER_SERVICE_ERROR") } - for SerReadPos, srvcs := range targetServices { + //for SerReadPos, srvcs := range targetServices { + for _, srvcs := range targetServices { charSer := eros.Service{ UUID: srvcs.String(), } sublog.Info().Str("Service UUID", charSer.UUID). - Int("Bytes", SerReadPos). - Str("Value", string(ServBuf[:SerReadPos])). + //Int("Bytes", SerReadPos). + //Str("Value", string(ServBuf[:SerReadPos])). Msg("GATT_SERVICE") sublog.Debug().Str("status", "Attempting to Retrieve Characteristic List").Msg("ADAPTER_STATUS") @@ -275,8 +276,13 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc for _, char := range chars { ReadPos, _ := char.Read(Charbuf) + //flags := char.Flags + sublog.Info().Str("UUID", char.UUID().String()). - Int("Bytes", ReadPos).Str("Value", string(Charbuf[:ReadPos])). + //Int("Bytes", ReadPos). + Str("Value", string(Charbuf[:ReadPos])). + //Bool("Read", flags.Read()). + //Bool("Write", flags.Write()). Msg("SERVICE_CHARACTERISTIC") } From 49dff682e5c9317048c5a4e6d8e7bd0ed0e2f848 Mon Sep 17 00:00:00 2001 From: freqyXin Date: Fri, 4 Jun 2021 21:06:39 -0700 Subject: [PATCH 02/31] created cortazar package for device analysis features, and added notify feature --- src/cortazar/cortazar.go | 34 ++++++++++++++++++++++++++++++++++ src/eros/structs.go | 24 ++++++++++++++---------- 2 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 src/cortazar/cortazar.go diff --git a/src/cortazar/cortazar.go b/src/cortazar/cortazar.go new file mode 100644 index 0000000..07a3aaf --- /dev/null +++ b/src/cortazar/cortazar.go @@ -0,0 +1,34 @@ +package cortazar + +//Intended to be used as the target analysis package + +//for example + +/* + +1. attempt bonding (LTK exchange) with target, while in aggressive attack mode +2. store current LTK associated with target to device in eros +3. disconnect and forget target +4. recconect to target, pair, bond, store LTK, disconnect, forget -- repeatTK +5. compare LTKs for entropy + +** could also be used for link key which is the pin established during pairing +*/ + +//--------- + +/* + device metrics + - location and device type/manufacturer/etc... + - when and where a device is seen over time + + + + +*/ + +//----------- + +/* + + */ diff --git a/src/eros/structs.go b/src/eros/structs.go index 0840157..fed5226 100644 --- a/src/eros/structs.go +++ b/src/eros/structs.go @@ -1,13 +1,15 @@ package eros import ( - "git.tcp.direct/kayos/prototooth" "time" + + bluetooth "git.tcp.direct/kayos/prototooth" ) type Permissions struct { - Read string - Write string + Read string + Write string + Notify string } type Characteristic struct { @@ -25,7 +27,6 @@ type Service struct { Characteristic []Characteristic } - type ManufData struct { Entries []Manufacturer } @@ -45,7 +46,7 @@ type Manufacturer struct { // Exploit - BLE service exploit details to be marshalled into json before stored in bitcask type Exploit struct { Name string - Target string + Target string // Should prabably be a struct of some sort since exploits target service chars Category string Vector Vector Payload Payload @@ -63,11 +64,14 @@ type Payload struct { // Device will hold details about the discoverd device type Device struct { - Name string - Addr string - Manufacturer string - RSSIlast int16 - RSSIhist map[time.Time]int16 + Name string // local name of the device + Addr string // Broadcast MAC + Manufacturer string // Manufacturer Data if broadcast + RSSIlast int16 // Most Current RSSI + RSSIhist map[time.Time]int16 // Last RSSI readings + Alias string // Alias given to device + Trusted bool // Is is in the trusted devices + WakeAllowed bool // Does the device allow wake // Services - see Service struct Services []Service From 93468fa399600b3285dbe72120b5df464318a4e9 Mon Sep 17 00:00:00 2001 From: freqy Date: Thu, 10 Jun 2021 12:25:43 -0700 Subject: [PATCH 03/31] Readme Update --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9a8ab18..99bc245 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,8 @@ Cross platform BLE scanner and logger with teeth - ### GATT fuzzing +- ### Advertisment fuzzing / flooding + - ### Sweyntooth - ### Search for DFU From 6a95824ae21e68d4919ea6ebb332f5a3f3c5c333 Mon Sep 17 00:00:00 2001 From: freqyXin Date: Sat, 12 Jun 2021 22:29:40 -0700 Subject: [PATCH 04/31] added wrath package and started forming the targeted attack features --- src/vars/projVars.go | 4 ++++ src/wrath/wrath.go | 9 +++++++++ 2 files changed, 13 insertions(+) create mode 100644 src/wrath/wrath.go diff --git a/src/vars/projVars.go b/src/vars/projVars.go index 862fe22..1a105ff 100644 --- a/src/vars/projVars.go +++ b/src/vars/projVars.go @@ -45,6 +45,7 @@ var DFlag = flag.Bool("d", false, "global debug logging and pretty printing") var AFlag = flag.Bool("a", false, "attack mode") var TFlag = flag.Bool("t", false, "device tracking mode") var MFlag = flag.String("m", "0", "json file with manufacturer identifying data to preload into eros") +var WAFlag = flag.String("w", "00:00:00:00:00:00", "MAC address of target") //flag.Parse() @@ -59,3 +60,6 @@ var SonosScanTest = bluetooth.New16BitUUID(0xfe07) var AppleScanTest = bluetooth.New16BitUUID(0x004c) //var ServiceUUID16Out + +//target to attack with wrath +var WrathTarget = bluetooth.Address{} diff --git a/src/wrath/wrath.go b/src/wrath/wrath.go new file mode 100644 index 0000000..5858290 --- /dev/null +++ b/src/wrath/wrath.go @@ -0,0 +1,9 @@ +package wrath + +import bluetooth "git.tcp.direct/kayos/prototooth" + +//used for offensive operations + +func wrath(bluetooth.Address) { + +} From 55260e71322d1daca79a32802defc2f6c123fbbb Mon Sep 17 00:00:00 2001 From: freqyXin Date: Mon, 14 Jun 2021 16:31:42 -0700 Subject: [PATCH 05/31] pushing work on wrath -- this function is not working yet --- src/wrath/wrath.go | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/wrath/wrath.go b/src/wrath/wrath.go index 5858290..2ee8ffb 100644 --- a/src/wrath/wrath.go +++ b/src/wrath/wrath.go @@ -1,9 +1,32 @@ package wrath -import bluetooth "git.tcp.direct/kayos/prototooth" +import ( + projVars "protomolecule/src/vars" + + bluetooth "git.tcp.direct/kayos/prototooth" + "github.com/rs/zerolog/log" +) //used for offensive operations -func wrath(bluetooth.Address) { +func targetPicture() bluetooth.MAC { + + ingest := projVars.WAFlag + + target, err := bluetooth.ParseMAC(*ingest) + if err != nil { + log.Err(err).Msg("Error") + } + + a := bluetooth.Address{ + MACAddress: target, + } + + return target } + +func wrath(bluetooth.Address) { + + bluetooth.DefaultAdapter.Connect(targetPicture(), bluetooth.ConnectionParams{}) +} From 990942615081d1f2c094549f4c87af8d77d44daf Mon Sep 17 00:00:00 2001 From: kayos Date: Mon, 14 Jun 2021 18:15:50 -0700 Subject: [PATCH 06/31] begin implementing an interactive command line interface --- go.mod | 1 + go.sum | 19 +++++++++++++++++++ main.go | 24 ++++++++++++++++-------- src/blueStuff/blueStuff.go | 8 ++------ src/dust/dust.go | 7 ++++++- src/protogen/ble_scan.go | 18 ++++++++++++------ 6 files changed, 56 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index bdb3f92..777b5b1 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.16 require ( git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af + git.tcp.direct/kayos/sh3lly v0.0.0-20210614235113-d19f8c64b302 github.com/go-ole/go-ole v1.2.5 // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 // indirect diff --git a/go.sum b/go.sum index 2cf6ff1..9cf58ed 100644 --- a/go.sum +++ b/go.sum @@ -13,11 +13,15 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af h1:+J2MfTQvW1DmX1HYIQUsrCd5l0Il9JMYTOowIs8ju1Y= git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af/go.mod h1:kk4oyPgWq6Rijn30Js4ITQC5DFwmpyzWL3+8V6q9wdM= +git.tcp.direct/kayos/sh3lly v0.0.0-20210614235113-d19f8c64b302 h1:ZZPHkn3LszFqSYo6eV1gSHUX0ToVDWbipid+iDRIGnQ= +git.tcp.direct/kayos/sh3lly v0.0.0-20210614235113-d19f8c64b302/go.mod h1:VTiCCb2FCmHdDmLIa4cSqAVW6WISZUwekgTzybxbGx8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/JuulLabs-OSS/cbgo v0.0.2 h1:gCDyT0+EPuI8GOFyvAksFcVD2vF4CXBAVwT6uVnD9oo= github.com/JuulLabs-OSS/cbgo v0.0.2/go.mod h1:L4YtGP+gnyD84w7+jN66ncspFRfOYB5aj9QSXaFHmBA= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Zaba505/sand v1.3.0 h1:FiEhK2r5Pu7F/p+YGKj7+Ig2n12tVOdGJY+5MY3a5Fw= +github.com/Zaba505/sand v1.3.0/go.mod h1:dSKum/Od9vOx061yXMm03HGEs4cUc+PakZF3NSTIgrY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -68,6 +72,7 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -126,10 +131,18 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -142,6 +155,8 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/muesli/termenv v0.8.1 h1:9q230czSP3DHVpkaPDXGp0TOfAwyjyYwXlUCQxQSaBk= +github.com/muesli/termenv v0.8.1/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= github.com/muka/go-bluetooth v0.0.0-20200619025933-f6113f7141c5/go.mod h1:yV39+EVOWdnoTe75NyKdo9iuyI3Slyh4t7eQvElUbWE= github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 h1:p3srutpE8TpQmOUQ5Qw94jYFUdoG2jBbILeYLroQNoI= github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0= @@ -172,6 +187,8 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -195,6 +212,7 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -302,6 +320,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/main.go b/main.go index 515141b..cc248da 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,7 @@ import ( "syscall" "time" + "git.tcp.direct/kayos/sh3lly" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) @@ -72,9 +73,13 @@ func sigHandler() { signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c - log.Warn().Msg("Interrupt detected, shutting down gracefully...") - eros.Slumber() - os.Exit(0) + log.Warn().Msg("Interrupt detected, stopping scan...") + for _, scan := range protogen.ScanMgr.Scans { + scan.Stop() + } + + //eros.Slumber() + //os.Exit(0) }() } @@ -126,10 +131,9 @@ func earToTheWire() { } } - for { select { - case postcard := <- protogen.ScanMgr.Mailbox: + case postcard := <-protogen.ScanMgr.Mailbox: sublog = log.With().Int("scan_id", postcard.From).Logger() interpret(postcard) } @@ -137,8 +141,7 @@ func earToTheWire() { } } -func main() { - defer eros.Slumber() +func bleScan() { var scan *protogen.Scan // Note: the tinygo bluetooth (prototooth here) library does already have a channel system for starting and stopping scans @@ -151,5 +154,10 @@ func main() { //time.Sleep(30 * time.Millisecond) go dust.Must("Scan", scan.Start()) - +} + +func main() { + defer eros.Slumber() + sh3lly.MainPrompt = "ProtoMolecule > " + sh3lly.StartCLI(ProtoHandler) } diff --git a/src/blueStuff/blueStuff.go b/src/blueStuff/blueStuff.go index a3914ec..8e94514 100644 --- a/src/blueStuff/blueStuff.go +++ b/src/blueStuff/blueStuff.go @@ -2,19 +2,15 @@ package blueStuff import "git.tcp.direct/kayos/prototooth" -//controls connections to found devices to get service characteristics - -//TODO: disable the scan adapter, enable the attack adapter (this step pmight not be needed) +// controls connections to found devices to get service characteristics +// TODO: disable the scan adapter, enable the attack adapter (this step pmight not be needed) // use the result.LocalName passed from scanStuff to start connection // once connected, for list of service characteristics and check for read / write for each // loog all of this to eros func pathways(target bluetooth.ScanResult) { - println("Discovery") //device, err := projVars.ScanAdapter.Connect(bluetooth.ScanResult.Address, bluetooth.ConnectionParams{}) - //srvcs, err := projVars.ScanAdapter. - } diff --git a/src/dust/dust.go b/src/dust/dust.go index 1d3b8e9..4ae7ef9 100644 --- a/src/dust/dust.go +++ b/src/dust/dust.go @@ -9,7 +9,12 @@ import ( func Must(action string, err error) { if err != nil { - log.Fatal().Err(err).Str("action", action).Msg("FATAL_ERROR") + switch err.Error() { + case "AdapterExists: Launch helper exited with unknown return code 1": + log.Error().Msg("Is your bluetooth adapter enabled? Linux: is bluetoothd started?") + default: + log.Fatal().Err(err).Str("action", action).Msg("FATAL_ERROR") + } } } diff --git a/src/protogen/ble_scan.go b/src/protogen/ble_scan.go index 66e862e..8fcbfd2 100644 --- a/src/protogen/ble_scan.go +++ b/src/protogen/ble_scan.go @@ -3,9 +3,9 @@ package protogen import ( projVars "protomolecule/src/vars" - "protomolecule/src/eros" "github.com/rs/zerolog" "github.com/rs/zerolog/log" + "protomolecule/src/eros" bluetooth "git.tcp.direct/kayos/prototooth" @@ -50,7 +50,7 @@ func (s *Scan) NewDevice(name string, addr string, manuf string, rssi int16) *er newid := len(s.Devices) s.Devices[newid] = &eros.Device{ Name: name, - Addr: addr, + Addr: addr, Manufacturer: manuf, RSSIlast: rssi, } @@ -153,7 +153,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc Msg("EROS_RECALL") } - //Services level logging + // Service enumeration and storage // TODO: // Fix Logging output here -- Prob shouldnt output this much info // for each service discovered @@ -198,7 +198,6 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc sublog.Info().Str("Adapter", "Attempting Connection").Msg("ADAPTER_STATUS") - // TODO: re-assess the timeout mechanism // this is largely going to depend on how concurrent we can get (at least with only one ble adapter) @@ -299,6 +298,15 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc //TODO: stop scan and call bluestuff func and pass it the local name value } +func (s *Scan) Stop() error { + // TODO: fix this adapterId situation + err := projVars.ScanAdapter.StopScan() + if err != nil { + return err + } + return nil +} + func (s *Scan) Start() error { s.Started = time.Now() @@ -314,7 +322,6 @@ func (s *Scan) Start() error { adapterId := projVars.ScanAdapter.ID - log.Info(). Str("ID", adapterId). Bool("MODE_TRACK", projVars.TrackingMode). @@ -326,6 +333,5 @@ func (s *Scan) Start() error { return err } - return nil } From 52c1f28f809255f8ceaeada75f1e845fedfb561d Mon Sep 17 00:00:00 2001 From: kayos Date: Tue, 15 Jun 2021 01:15:30 -0700 Subject: [PATCH 07/31] continue implementation of a command line interface --- go.mod | 4 +++- go.sum | 34 ++++++++++++++++++++++++---------- main.go | 36 ++++++++++++++++++++++++++---------- src/vars/projVars.go | 2 ++ 4 files changed, 55 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 777b5b1..0d96bd7 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,11 @@ go 1.16 require ( git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af - git.tcp.direct/kayos/sh3lly v0.0.0-20210614235113-d19f8c64b302 + github.com/c-bata/go-prompt v0.2.5 github.com/go-ole/go-ole v1.2.5 // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible + github.com/mattn/go-runewidth v0.0.10 // indirect github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 // indirect github.com/prologic/bitcask v0.3.10 github.com/rs/zerolog v1.21.0 diff --git a/go.sum b/go.sum index 9cf58ed..ef55f98 100644 --- a/go.sum +++ b/go.sum @@ -13,15 +13,11 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af h1:+J2MfTQvW1DmX1HYIQUsrCd5l0Il9JMYTOowIs8ju1Y= git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af/go.mod h1:kk4oyPgWq6Rijn30Js4ITQC5DFwmpyzWL3+8V6q9wdM= -git.tcp.direct/kayos/sh3lly v0.0.0-20210614235113-d19f8c64b302 h1:ZZPHkn3LszFqSYo6eV1gSHUX0ToVDWbipid+iDRIGnQ= -git.tcp.direct/kayos/sh3lly v0.0.0-20210614235113-d19f8c64b302/go.mod h1:VTiCCb2FCmHdDmLIa4cSqAVW6WISZUwekgTzybxbGx8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/JuulLabs-OSS/cbgo v0.0.2 h1:gCDyT0+EPuI8GOFyvAksFcVD2vF4CXBAVwT6uVnD9oo= github.com/JuulLabs-OSS/cbgo v0.0.2/go.mod h1:L4YtGP+gnyD84w7+jN66ncspFRfOYB5aj9QSXaFHmBA= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Zaba505/sand v1.3.0 h1:FiEhK2r5Pu7F/p+YGKj7+Ig2n12tVOdGJY+5MY3a5Fw= -github.com/Zaba505/sand v1.3.0/go.mod h1:dSKum/Od9vOx061yXMm03HGEs4cUc+PakZF3NSTIgrY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -32,6 +28,10 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/c-bata/go-prompt v0.2.5 h1:3zg6PecEywxNn0xiqcXHD96fkbxghD+gdB2tbsYfl+Y= +github.com/c-bata/go-prompt v0.2.5/go.mod h1:vFnjEGDIIA/Lib7giyE4E9c50Lvl8j0S+7FVlAwDAVw= +github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI= +github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -72,7 +72,6 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -133,16 +132,23 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-tty v0.0.3 h1:5OfyWorkyO7xP52Mq7tB36ajHDG5OHrmBGIS/DtakQI= +github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -155,8 +161,6 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/muesli/termenv v0.8.1 h1:9q230czSP3DHVpkaPDXGp0TOfAwyjyYwXlUCQxQSaBk= -github.com/muesli/termenv v0.8.1/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= github.com/muka/go-bluetooth v0.0.0-20200619025933-f6113f7141c5/go.mod h1:yV39+EVOWdnoTe75NyKdo9iuyI3Slyh4t7eQvElUbWE= github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 h1:p3srutpE8TpQmOUQ5Qw94jYFUdoG2jBbILeYLroQNoI= github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0= @@ -171,6 +175,10 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= +github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= +github.com/pkg/term v1.2.0-beta.2 h1:L3y/h2jkuBVFdWiJvNfYfKmzcCnILw7mJWm2JQuMppw= +github.com/pkg/term v1.2.0-beta.2/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/plar/go-adaptive-radix-tree v1.0.4 h1:Ucd8R6RH2E7RW8ZtDKrsWyOD3paG2qqJO0I20WQ8oWQ= github.com/plar/go-adaptive-radix-tree v1.0.4/go.mod h1:Ot8d28EII3i7Lv4PSvBlF8ejiD/CtRYDuPsySJbSaK8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -212,7 +220,6 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -301,6 +308,7 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -310,6 +318,7 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -319,13 +328,18 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0 h1:g9s1Ppvvun/fI+BptTMj909BBIcGrzQ32k9FNlcevOE= diff --git a/main.go b/main.go index cc248da..50f87d1 100644 --- a/main.go +++ b/main.go @@ -3,15 +3,16 @@ package main import ( "flag" "os" + "os/exec" "os/signal" "protomolecule/src/dust" "protomolecule/src/eros" "protomolecule/src/protogen" projVars "protomolecule/src/vars" + "runtime" "syscall" "time" - "git.tcp.direct/kayos/sh3lly" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) @@ -20,6 +21,17 @@ var ( manufLoad bool ) +func handleExit() { + if runtime.GOOS == "windows" { + return + } + + rawModeOff := exec.Command("/bin/stty", "-raw", "echo") + rawModeOff.Stdin = os.Stdin + _ = rawModeOff.Run() + rawModeOff.Wait() +} + func loginit() { // setup json logfile // TODO: make this a command line argument @@ -72,14 +84,18 @@ func sigHandler() { c := make(chan os.Signal) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { - <-c - log.Warn().Msg("Interrupt detected, stopping scan...") - for _, scan := range protogen.ScanMgr.Scans { - scan.Stop() - } + for { + select { - //eros.Slumber() - //os.Exit(0) + case <-c: + log.Warn().Msg("Interrupt detected, stopping scan...") + for _, scan := range protogen.ScanMgr.Scans { + projVars.TrackingMode = false + projVars.AttackMode = false + scan.Stop() + } + } + } }() } @@ -157,7 +173,7 @@ func bleScan() { } func main() { + defer handleExit() defer eros.Slumber() - sh3lly.MainPrompt = "ProtoMolecule > " - sh3lly.StartCLI(ProtoHandler) + StartCLI() } diff --git a/src/vars/projVars.go b/src/vars/projVars.go index 1a105ff..2f4aa1d 100644 --- a/src/vars/projVars.go +++ b/src/vars/projVars.go @@ -47,6 +47,8 @@ var TFlag = flag.Bool("t", false, "device tracking mode") var MFlag = flag.String("m", "0", "json file with manufacturer identifying data to preload into eros") var WAFlag = flag.String("w", "00:00:00:00:00:00", "MAC address of target") +var Debug bool = false + //flag.Parse() //var attacker bluetooth.Addresser From 8f63a56d672e4b19ce40e0b4a026b4cd3c6e61ea Mon Sep 17 00:00:00 2001 From: kayos Date: Tue, 15 Jun 2021 13:23:53 -0700 Subject: [PATCH 08/31] rework eros and make minor CLI adjustments --- go.sum | 4 --- src/eros/eros.go | 86 ++++++++++++++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 36 deletions(-) diff --git a/go.sum b/go.sum index ef55f98..6f492d1 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,6 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/c-bata/go-prompt v0.2.5 h1:3zg6PecEywxNn0xiqcXHD96fkbxghD+gdB2tbsYfl+Y= github.com/c-bata/go-prompt v0.2.5/go.mod h1:vFnjEGDIIA/Lib7giyE4E9c50Lvl8j0S+7FVlAwDAVw= -github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI= -github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -177,8 +175,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= -github.com/pkg/term v1.2.0-beta.2 h1:L3y/h2jkuBVFdWiJvNfYfKmzcCnILw7mJWm2JQuMppw= -github.com/pkg/term v1.2.0-beta.2/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/plar/go-adaptive-radix-tree v1.0.4 h1:Ucd8R6RH2E7RW8ZtDKrsWyOD3paG2qqJO0I20WQ8oWQ= github.com/plar/go-adaptive-radix-tree v1.0.4/go.mod h1:Ot8d28EII3i7Lv4PSvBlF8ejiD/CtRYDuPsySJbSaK8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/src/eros/eros.go b/src/eros/eros.go index a184cf7..32ba398 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -27,12 +27,16 @@ import ( ) var ( - // deviceDb will hold details about devices discovered - deviceDb *bitcask.Bitcask - // attackDb will hold details about exploits to be used against BLE devices - attackDb *bitcask.Bitcask - // serviceDb will hold definitions of various bluetook services and will ultimately be updated via an HTTP repository - serviceDb *bitcask.Bitcask + // devices will hold details about devices discovered + // exploits will hold details about exploits to be used against BLE devices + // services will hold definitions of various bluetook services and will ultimately be updated via an HTTP repository + // manufacturers will hold manufacturer to UUID correlations + dbs = []string { + "devices", + "exploits", + "services", + "manufacturers", + } err error Manufacturers ManufData @@ -41,9 +45,10 @@ var ( DataDir string = "./.eros-data/" ) +var DB map[string]*bitcask.Bitcask + // Ingest UUID will add the UUID to the manufacturer if it doesn't already exist func (manuf *Manufacturer) IngestUUID(uuid bluetooth.UUID) bool { - contains := func(s []bluetooth.UUID, v bluetooth.UUID) bool { for _, a := range s { if a == v { @@ -72,8 +77,8 @@ func ManufLoad() { f, err := os.Open(path) if err != nil { - log.Debug().Msg(err.Error()) - os.Exit(1) + log.Error().Err(err). + Msg("Failed to open JSON file") } defer f.Close() @@ -132,44 +137,49 @@ func ManufLoad() { Manufacturers.Entries = append(Manufacturers.Entries, *mf) } } + + for _, manuf := range Manufacturers.Entries { + var jsonData []byte + jsonData, err = json.Marshal(manuf) + if err != nil { + log.Fatal().Err(err). + Msg("EROS_FATAL_MANUFACTURER_JSON_MARSHAL") + } + + err := DB["manufacturers"].Put([]byte(manuf.Name), jsonData) + if err != nil { + log.Fatal().Err(err). + Msg("EROS_FATAL_MANUFACTURER_JSON_STORE") + } + + log.Debug().Str("Name", manuf.Name). + Msg("EROS_MANUFACTURER_STORE") + } } // Awaken - create the data directory if it does not exist; initialize bitcask in this directory func Awaken() { - //log.Debug().Str("DataDir",DataDir).Msg("Initializing eros...") - - deviceDb, err = bitcask.Open(DataDir + "devices") - if err != nil { - panic(err.Error) - } - - attackDb, err = bitcask.Open(DataDir + "exploits") - if err != nil { - panic(err.Error) - } - - serviceDb, err = bitcask.Open(DataDir + "services") - if err != nil { - panic(err.Error) + DB = make(map[string]*bitcask.Bitcask) + for _, name := range dbs { + DB[name], err = bitcask.Open(DataDir + name) + if err != nil { + panic(err.Error()) + } } } // Slumber - Clean up database entries, sync them to persistent storage, and safelty close the database. func Slumber() { - rest := func(db *bitcask.Bitcask) { + for _, db := range DB { db.Merge() db.Sync() db.Close() } - - rest(deviceDb) - rest(attackDb) - rest(serviceDb) } // Exists - check if a device is present in the Database func Exists(Addr string) bool { - if deviceDb.Has([]byte(Addr)) { + if DB["devices"].Has([]byte(Addr)) { return true } @@ -200,7 +210,7 @@ func Remember(dev Device) error { return err } - err = deviceDb.Put([]byte(dev.Addr), jsonData) + err = DB["devices"].Put([]byte(dev.Addr), jsonData) return err } @@ -210,7 +220,7 @@ func Recall(Addr string) (Device, error) { var bytes []byte var member Device - bytes, err = deviceDb.Get([]byte(Addr)) + bytes, err = DB["devices"].Get([]byte(Addr)) if err != nil { member = Device{} @@ -221,6 +231,18 @@ func Recall(Addr string) (Device, error) { return member, err } +func Backup(path string) { + for _, db := range DB { + db.Merge() + db.Sync() + err := db.Backup(path) + if err != nil { + panic(err.Error()) + } + } + +} + // Hypnosis - retrieve new exploits/attacks from a remote http repository func Hypnosis(repo string) { // placeholder From 877557553c4680be1e7c8dbe33321ecd5b9bcccb Mon Sep 17 00:00:00 2001 From: kayos Date: Tue, 15 Jun 2021 19:42:53 -0700 Subject: [PATCH 09/31] refactor connection timeout, attempt to improve connection speed, attempt to improve speed of scan cancellation --- main.go | 27 +++++++------- src/eros/eros.go | 10 +++++- src/eros/structs.go | 3 ++ src/protogen/ble_scan.go | 77 +++++++++++----------------------------- src/protogen/structs.go | 15 ++++---- src/vars/projVars.go | 4 --- 6 files changed, 56 insertions(+), 80 deletions(-) diff --git a/main.go b/main.go index 50f87d1..3ab86a6 100644 --- a/main.go +++ b/main.go @@ -83,20 +83,23 @@ func cliFlags() { func sigHandler() { c := make(chan os.Signal) signal.Notify(c, os.Interrupt, syscall.SIGTERM) - go func() { - for { - select { - - case <-c: - log.Warn().Msg("Interrupt detected, stopping scan...") - for _, scan := range protogen.ScanMgr.Scans { - projVars.TrackingMode = false - projVars.AttackMode = false - scan.Stop() + for { + select { + case <-c: + log.Warn(). + Msg("Interrupt detected, stopping scan...") + for _, scan := range protogen.ScanMgr.Scans { + projVars.TrackingMode = false + projVars.AttackMode = false + for _, dev := range scan.Device { + if dev.Connected { + dev.Conn.Disconnect() + } } + scan.Stop() } } - }() + } } func init() { @@ -116,7 +119,7 @@ func init() { loginit() cliFlags() - sigHandler() + go sigHandler() log.Debug().Msg("Logging initialized") diff --git a/src/eros/eros.go b/src/eros/eros.go index 32ba398..e4b60f3 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -31,7 +31,7 @@ var ( // exploits will hold details about exploits to be used against BLE devices // services will hold definitions of various bluetook services and will ultimately be updated via an HTTP repository // manufacturers will hold manufacturer to UUID correlations - dbs = []string { + dbs = []string{ "devices", "exploits", "services", @@ -66,6 +66,14 @@ func (manuf *Manufacturer) IngestUUID(uuid bluetooth.UUID) bool { return true } +func (d *Device) ConnectHandler(target bluetooth.Addresser, c bool) { + if c { + d.Connected = true + } else { + d.Connected = false + } +} + // ManufLoad loads data from a json file containing UUID manufacturer associations func ManufLoad() { path := projVars.ManuFile diff --git a/src/eros/structs.go b/src/eros/structs.go index fed5226..4a672fc 100644 --- a/src/eros/structs.go +++ b/src/eros/structs.go @@ -79,4 +79,7 @@ type Device struct { Discovered time.Time // Seen - timestamp from when the device was last seen Seen time.Time + + Connected bool + Conn *bluetooth.Device } diff --git a/src/protogen/ble_scan.go b/src/protogen/ble_scan.go index 8fcbfd2..378c9f7 100644 --- a/src/protogen/ble_scan.go +++ b/src/protogen/ble_scan.go @@ -40,23 +40,23 @@ func (m *Meta) NewScan() *Scan { } scan := m.Scans[newid] - scan.Devices = make(map[int]*eros.Device) + scan.Device = make(map[int]*eros.Device) m.Count = len(m.Scans) return scan } func (s *Scan) NewDevice(name string, addr string, manuf string, rssi int16) *eros.Device { - newid := len(s.Devices) - s.Devices[newid] = &eros.Device{ + newid := len(s.Device) + s.Device[newid] = &eros.Device{ Name: name, Addr: addr, Manufacturer: manuf, RSSIlast: rssi, } - s.Count = len(s.Devices) - return s.Devices[newid] + s.Count = len(s.Device) + return s.Device[newid] } /* @@ -93,12 +93,6 @@ func ManfCheck(TargetAdvertData bluetooth.AdvertisementPayload) string { func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.ScanResult) { var sublog zerolog.Logger - projVars.ScanAdapter.SetConnectHandler(func(Result bluetooth.Addresser, connected bool) { - // It seems that because this is a callback that the library calls itself that it is passing us "connected" as an argument - // therefore I think what we're supposed to do is store that boolean so we can then reference it later - projVars.ConnectedToTarget = connected - }) - payload := result.AdvertisementPayload addr := result.Address.String() lname := result.LocalName() @@ -165,7 +159,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc // Skipping duplicate results unless tracking mode enabled (to store RSSI as devices move) if projVars.TrackingMode == false { - for _, dev := range s.Devices { + for _, dev := range s.Device { if addr == dev.Addr { return } @@ -175,6 +169,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc // Upon finding new and valid info we update the time for last activity s.Activity = time.Now() dev := s.NewDevice(lname, addr, EnumedManuf, rssi) + projVars.ScanAdapter.SetConnectHandler(dev.ConnectHandler) // Record all the services advertised, append them into the nested struct within Device for _, uuid := range uuids { @@ -198,53 +193,24 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc sublog.Info().Str("Adapter", "Attempting Connection").Msg("ADAPTER_STATUS") - // TODO: re-assess the timeout mechanism - // this is largely going to depend on how concurrent we can get (at least with only one ble adapter) + var connErr error + var err error + timeout := bluetooth.NewDuration(time.Duration(5) * time.Second) + dev.Conn, connErr = projVars.ScanAdapter.Connect(result.Address, bluetooth.ConnectionParams{ConnectionTimeout: timeout}) - // creates a new timer of d (time.Duration) - // outputs time on {timer_Name}.C chan - // can then be checked against tick (time.Time) - TimerCounts := time.NewTimer(10 * time.Millisecond) - - var ( - conTimeOut time.Duration - //tick <-chan time.Time - //not needed? - //tock <-chan time.Timer - err error - ) - - TargetDevice, connectError := projVars.ScanAdapter.Connect(result.Address, bluetooth.ConnectionParams{}) + if connErr != nil { + sublog.Error().Err(connErr).Msg("CONNECT_ERROR") + layToRest(dev) + return + } var targetServices []bluetooth.DeviceService sublog.Info(). - Str("status", "Attempting to Read Target Services"). + Str("status", "Connected, attempting to Read Target Services"). Msg("ADAPTER_STATUS") - // TODO: this will be running concurrently in a goroutine, - // so rather than set out timeout to be egregiously low we will just let it take its time - conTimeOut = 50 * time.Millisecond - - //attempted to fix but probably didnt help anything - if TimerCounts.C == nil { - endTime := time.After(conTimeOut) - select { - case <-endTime: - sublog.Error().Str("Adapter", "Connection Timeout").Msg("ADAPTER_STATUS") - TargetDevice.Disconnect() - endTime = nil - default: - if connectError != nil { - sublog.Error().Err(connectError).Msg("CONNECT_ERROR") - layToRest(dev) - return - } - sublog.Debug().Str("Status", "Connecting...").Msg("ADAPTER_STATUS") - } - } - - if !projVars.ConnectedToTarget { + if !dev.Connected { layToRest(dev) return } @@ -252,7 +218,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc //ServBuf := make([]byte, 255) Charbuf := make([]byte, 255) - targetServices, err = TargetDevice.DiscoverServices(nil) + targetServices, err = dev.Conn.DiscoverServices(nil) if err != nil { sublog.Error().Err(err).Msg("DISCOVER_SERVICE_ERROR") } @@ -288,10 +254,9 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc } // finished with this device - - TargetDevice.Disconnect() + dev.Conn.Disconnect() + dev.Connected = false sublog.Info().Str("Adapter", "Successfully Disconnected From Target").Msg("ADAPTER_STATUS") - projVars.ConnectedToTarget = false layToRest(dev) diff --git a/src/protogen/structs.go b/src/protogen/structs.go index 5de1f96..b31af47 100644 --- a/src/protogen/structs.go +++ b/src/protogen/structs.go @@ -1,8 +1,9 @@ package protogen import ( - "time" + bluetooth "git.tcp.direct/kayos/prototooth" "protomolecule/src/eros" + "time" ) /* @@ -42,16 +43,16 @@ type Postcard struct { // Arguments - augmenting arguments to the command Arguments []string - } // Instance of a BLE scan type Scan struct { - Count int + Count int // The ID is how we will refer back to running scans during IPC to react or cancel a scan - ID int - Started time.Time - Activity time.Time - Devices map[int]*eros.Device + ID int + Started time.Time + Activity time.Time + Device map[int]*eros.Device + Connection map[int]*bluetooth.Connection } diff --git a/src/vars/projVars.go b/src/vars/projVars.go index 2f4aa1d..c232185 100644 --- a/src/vars/projVars.go +++ b/src/vars/projVars.go @@ -25,8 +25,6 @@ var AdapterInUse = *&bluetooth.Adapter{} var AttackMode bool = false var TrackingMode bool = false -var ConnectedToTarget bool = false - //var SrvcUUIDList map[uint32]string //hold the values for the initial ble scan results.. @@ -52,8 +50,6 @@ var Debug bool = false //flag.Parse() //var attacker bluetooth.Addresser -//var connected bool -//var disconnected bool = true var log *zerolog.Logger From e3eeb9184a9ee866da5ad201c99306d9a6022e3f Mon Sep 17 00:00:00 2001 From: kayos Date: Wed, 16 Jun 2021 14:57:31 -0700 Subject: [PATCH 10/31] add cmd.go --- cmd.go | 289 +++++++++++++++++++++++++++++++++++++++ src/protogen/ble_scan.go | 14 +- 2 files changed, 295 insertions(+), 8 deletions(-) create mode 100644 cmd.go diff --git a/cmd.go b/cmd.go new file mode 100644 index 0000000..5fdbc85 --- /dev/null +++ b/cmd.go @@ -0,0 +1,289 @@ +package main + +import ( + "fmt" + cli "github.com/c-bata/go-prompt" + . "github.com/logrusorgru/aurora" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "os" + "protomolecule/src/eros" + projVars "protomolecule/src/vars" + "strings" +) + +var suggestions = []cli.Suggest{ + // Main Commands + // {"scan", + // "Start and stop scans"}, + + {"scan start", + "Start default scan"}, + + {"scan start attack", + "Start scan that also attempts to connect to all discovered BLE devices"}, + + {"scan start tracking", + "Start continuous RSSI tracking of all BLE devices within range"}, + + {"eros recall mac", + "Retrieve device info from database by MAC address"}, + + {"eros recall all", + "Retrieve info on all devices"}, + /* + {"", + ""}, + */ + {"exit", + "Exit ProtoMolecule"}, + + {"debug", + "Toggle debug messages"}, + + {"help", + "in-app documentation"}, +} + +func completer(in cli.Document) []cli.Suggest { + c := in.GetWordBeforeCursor() + if c == "" { + return []cli.Suggest{} + } + + return cli.FilterHasPrefix(suggestions, c, true) +} + +// commands that we will list when the user runs "help" +var cmds = []string{ + "scan", + "adapter", +} + +// Interpret is where we will actuall define our commands +func executor(cmd string) { + cmd = strings.TrimSpace(cmd) + + var args []string + args = strings.Split(cmd, " ") + + getArgs := func(args []string) string { + var ret string + for i, a := range args { + if i == 0 { + ret = a + continue + } + ret = ret + " " + a + if i != len(args)-1 { + ret = ret + " " + } + } + return ret + } + + switch args[0] { + + case "exit": + fallthrough + + case "quit": + eros.Slumber() + os.Exit(0) + + case "debug": + if projVars.Debug { + zerolog.SetGlobalLevel(zerolog.InfoLevel) + projVars.Debug = false + log.Info(). + Msg("Debug mode turned " + Sprintf(BrightRed("OFF\n").Bold())) + } else { + zerolog.SetGlobalLevel(zerolog.DebugLevel) + projVars.Debug = true + log.Debug(). + Msg("Debug mode turned " + Sprintf(BrightGreen("ON\n").Bold())) + } + + case "eros": + if len(args) < 2 { + getHelp("eros") + return + } + + switch args[1] { + case "recall": + if len(args) < 3 { + getHelp("eros recall") + return + } + switch args[2] { + case "mac": + if len(args) < 4 { + getHelp("eros recall") + return + } + fromEros, err := eros.Recall(args[3]) + if err != nil { + log.Error().Err(err).Str("target", args[3]). + Msg("Failed to recall MAC") + println() + return + } + + log.Info(). + Str("Name", fromEros.Name). + Str("Addr", fromEros.Addr). + Str("ManuF", fromEros.Manufacturer). //needs to be changed back to fromEros.Manufacturer + Int16("Current_RSSI", fromEros.RSSIlast). + Int("Service_Count", len(fromEros.Services)). + Msg("EROS_RECALL") + } + } + + case "help": + if len(args) < 2 { + getHelp("meta") + return + } + + getHelp(getArgs(args)) + + case "loadnames": + if len(args) < 2 { + log.Error().Msg("missing argument: path to json file with manufacturer UUIDs") + println() + } + + projVars.ManuFile = args[1] + eros.ManufLoad() + + case "adapter": + if len(args) > 1 { + switch args[1] { + case "list": + fmt.Println(getArgs(args) + ": list available bluetooth adapters") + case "use": + fmt.Println(getArgs(args) + ": select given adapter for usage") + default: + log.Error().Msg("unknown sub-command: " + args[1]) + println() + } + } else { + getHelp(getArgs(args)) + } + + /* + case "mode": + + case "attack": + if len(args) > 1 { + switch args[1] { + */ + + case "scan": + if len(args) > 1 { + switch args[1] { + + case "list": + fallthrough + + case "status": + fmt.Println(getArgs(args) + ": start new default BLE scan") + + case "start": + if len(args) > 2 { + switch args[2] { + case "tracking": + projVars.TrackingMode = true + projVars.AttackMode = false + case "attack": + projVars.TrackingMode = false + projVars.AttackMode = true + default: + // getHelp(getArgs(args)) + log.Error().Msg("unknown sub command: " + args[2]) + println() + } + } + + bleScan() + } + + } else { + getHelp(getArgs(args)) + } + + case "rpc": + if len(args) > 1 { + switch args[1] { + + case "status": + fmt.Println(getArgs(args) + ": ") + + case "server": + fmt.Println(getArgs(args) + ": ") + + case "client": + fmt.Println(getArgs(args) + ": ") + } + } else { + getHelp(getArgs(args)) + } + + case "clear": + print("\033[H\033[2J") + //termenv.ClearScreen() + + default: + log.Error().Msg("unknown command: " + cmd) + println() + } + +} + +func getHelp(target string) { + var lines []string + + lines = append(lines, "help: "+target) + + switch target { + + case "meta": + var list string + for _, cmd := range cmds { + list = list + cmd + ", " + } + + fmt.Println("Enabled commands: ") + list = strings.TrimSuffix(list, ", ") + fmt.Println(list) + fmt.Println() + + default: + log.Error().Msg("Help entry not found!") + fmt.Println() + } + +} + +func StartCLI() { + var hist []string + + p := cli.New( + executor, + completer, + cli.OptionPrefix("ProtoMolecule"+"> "), + //cli.OptionPrefixBackgroundColor(cli.Black), + cli.OptionPrefixTextColor(cli.Cyan), + cli.OptionHistory(hist), + cli.OptionSuggestionBGColor(cli.Black), + cli.OptionSuggestionTextColor(cli.White), + cli.OptionSelectedSuggestionBGColor(cli.Black), + cli.OptionSelectedSuggestionTextColor(cli.Cyan), + //prompt.OptionLivePrefix + cli.OptionTitle("ProtoMolecule"), + ) + + p.Run() + +} diff --git a/src/protogen/ble_scan.go b/src/protogen/ble_scan.go index 378c9f7..aa217bc 100644 --- a/src/protogen/ble_scan.go +++ b/src/protogen/ble_scan.go @@ -178,7 +178,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc } dev.Services = append(dev.Services, *svc) - sublog.Debug().Str("UUID", svc.UUID).Msg("SERVICE_DISCOVERED") + sublog.Info().Str("UUID", svc.UUID).Msg("SERVICE_DISCOVERED") } if !projVars.AttackMode { @@ -186,17 +186,15 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc return } - //////////////////////////////////////////////////////////////////////// - //var PreTargetHandling type - //var TargetDeviceService *bluetooth.DeviceService - //var TargetDeviceServiceChar *bluetooth.DeviceCharacteristic - sublog.Info().Str("Adapter", "Attempting Connection").Msg("ADAPTER_STATUS") var connErr error var err error - timeout := bluetooth.NewDuration(time.Duration(5) * time.Second) - dev.Conn, connErr = projVars.ScanAdapter.Connect(result.Address, bluetooth.ConnectionParams{ConnectionTimeout: timeout}) + + // TODO: make timeout values and intervals command line arguments instead of hard coding them + timeout := bluetooth.NewDuration(time.Duration(3) * time.Second) + interval := bluetooth.NewDuration(time.Duration(20) * time.Millisecond) + dev.Conn, connErr = projVars.ScanAdapter.Connect(result.Address, bluetooth.ConnectionParams{ConnectionTimeout: timeout, MinInterval: interval}) if connErr != nil { sublog.Error().Err(connErr).Msg("CONNECT_ERROR") From ebe586a48c6b4ff94239bfb888dd8d90ea28f441 Mon Sep 17 00:00:00 2001 From: freqy Date: Sat, 19 Jun 2021 12:50:05 -0700 Subject: [PATCH 11/31] sample code in wrath to get off to a good start --- src/wrath/wrath.go | 129 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 5 deletions(-) diff --git a/src/wrath/wrath.go b/src/wrath/wrath.go index 2ee8ffb..76d6ced 100644 --- a/src/wrath/wrath.go +++ b/src/wrath/wrath.go @@ -4,16 +4,22 @@ import ( projVars "protomolecule/src/vars" bluetooth "git.tcp.direct/kayos/prototooth" - "github.com/rs/zerolog/log" + "tinygo.org/x/bluetooth/rawterm" ) //used for offensive operations - +/* func targetPicture() bluetooth.MAC { - ingest := projVars.WAFlag + type targetMac bluetooth.MAC - target, err := bluetooth.ParseMAC(*ingest) + for c, err := range projVars.WAFlag { + append(targetMac{}) + } + + println(targetMac) + + target, err := bluetooth.ParseMAC(targetMac) if err != nil { log.Err(err).Msg("Error") } @@ -25,8 +31,121 @@ func targetPicture() bluetooth.MAC { return target } +*/ func wrath(bluetooth.Address) { - bluetooth.DefaultAdapter.Connect(targetPicture(), bluetooth.ConnectionParams{}) + //bluetooth.DefaultAdapter.Connect(targetPicture(), bluetooth.ConnectionParams{}) + + //TargetDevice, connectError := projVars.ScanAdapter.Connect(result.Address, bluetooth.ConnectionParams{}) + + // Enable BLE interface. + err := projVars.ScanAdapter.Enable() + if err != nil { + println("could not enable the BLE stack:", err.Error()) + return + } + + // The address to connect to. Set during scanning and read afterwards. + var foundDevice bluetooth.ScanResult + // Scan for NUS peripheral. + println("Scanning...") + err = projVars.ScanAdapter.Scan(func(adapter *bluetooth.Adapter, result bluetooth.ScanResult) { + if !result.AdvertisementPayload.HasServiceUUID() { + return + } + foundDevice = result + + // Stop the scan. + err := adapter.StopScan() + if err != nil { + // Unlikely, but we can't recover from this. + println("failed to stop the scan:", err.Error()) + } + }) + if err != nil { + println("could not start a scan:", err.Error()) + return + } + + // Found a device: print this event. + if name := foundDevice.LocalName(); name == "" { + print("Connecting to ", foundDevice.Address.String(), "...") + println() + } else { + print("Connecting to ", name, " (", foundDevice.Address.String(), ")...") + println() + } + + // Found a NUS peripheral. Connect to it. + device, err := adapter.Connect(foundDevice.Address, bluetooth.ConnectionParams{}) + if err != nil { + println("Failed to connect:", err.Error()) + return + } + + // Connected. Look up the Nordic UART Service. + println("Discovering service...") + services, err := device.DiscoverServices([]bluetooth.UUID{serviceUUID}) + if err != nil { + println("Failed to discover the Nordic UART Service:", err.Error()) + return + } + service := services[0] + + // Get the two characteristics present in this service. + chars, err := service.DiscoverCharacteristics([]bluetooth.UUID{rxUUID, txUUID}) + if err != nil { + println("Failed to discover RX and TX characteristics:", err.Error()) + return + } + rx := chars[0] + tx := chars[1] + + // Enable notifications to receive incoming data. + err = tx.EnableNotifications(func(value []byte) { + for _, c := range value { + rawterm.Putchar(c) + } + }) + if err != nil { + println("Failed to enable TX notifications:", err.Error()) + return + } + + println("Connected. Exit console using Ctrl-X.") + rawterm.Configure() + defer rawterm.Restore() + var line []byte + for { + ch := rawterm.Getchar() + line = append(line, ch) + + // Send the current line to the central. + if ch == '\x18' { + // The user pressed Ctrl-X, exit the program. + break + } else if ch == '\n' { + sendbuf := line // copy buffer + // Reset the slice while keeping the buffer in place. + line = line[:0] + + // Send the sendbuf after breaking it up in pieces. + for len(sendbuf) != 0 { + // Chop off up to 20 bytes from the sendbuf. + partlen := 20 + if len(sendbuf) < 20 { + partlen = len(sendbuf) + } + part := sendbuf[:partlen] + sendbuf = sendbuf[partlen:] + // This performs a "write command" aka "write without response". + _, err := rx.WriteWithoutResponse(part) + if err != nil { + println("could not send:", err.Error()) + } + } + } + } + } From d535711880071c49dae89ebeb43722fc953fc70b Mon Sep 17 00:00:00 2001 From: kayos Date: Mon, 21 Jun 2021 14:52:09 -0700 Subject: [PATCH 12/31] hunt down wrath bugs --- cmd.go | 18 +++++++++++---- go.mod | 1 + go.sum | 3 +++ main.go | 1 + src/wrath/wrath.go | 56 +++++++++++++++++++++++++++------------------- 5 files changed, 52 insertions(+), 27 deletions(-) diff --git a/cmd.go b/cmd.go index 5fdbc85..d552124 100644 --- a/cmd.go +++ b/cmd.go @@ -8,6 +8,7 @@ import ( "github.com/rs/zerolog/log" "os" "protomolecule/src/eros" +// "protomolecule/src/wrath" projVars "protomolecule/src/vars" "strings" ) @@ -31,10 +32,10 @@ var suggestions = []cli.Suggest{ {"eros recall all", "Retrieve info on all devices"}, - /* - {"", - ""}, - */ +/* + {"wrath", + "attack by address"}, +*/ {"exit", "Exit ProtoMolecule"}, @@ -230,6 +231,15 @@ func executor(cmd string) { getHelp(getArgs(args)) } + /* + case "wrath": + if len(args) < 2 { + getHelp("wrath") + return + } + wrath(args[1]) + */ + case "clear": print("\033[H\033[2J") //termenv.ClearScreen() diff --git a/go.mod b/go.mod index 0d96bd7..f82a8bd 100644 --- a/go.mod +++ b/go.mod @@ -16,4 +16,5 @@ require ( github.com/stretchr/testify v1.7.0 // indirect golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + tinygo.org/x/bluetooth v0.3.0 ) diff --git a/go.sum b/go.sum index 6f492d1..0b1fc55 100644 --- a/go.sum +++ b/go.sum @@ -255,6 +255,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -415,4 +416,6 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +tinygo.org/x/bluetooth v0.3.0 h1:xy6f1aCAA5VzaXcx+qs4od6ZpiNu6pa/ufnZP7Db2ss= +tinygo.org/x/bluetooth v0.3.0/go.mod h1:zg3FxlQIY6vtbtpK5dU8h5BzQiLoE3hGthXTR0GNEn0= tinygo.org/x/drivers v0.15.1/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= diff --git a/main.go b/main.go index 3ab86a6..8fd729f 100644 --- a/main.go +++ b/main.go @@ -106,6 +106,7 @@ func init() { // Initializing an instance of our scan manager to keep track of concurrent scans // NOTE: Devices are kept track of per Scan via a nested map of eros.Device instances // + // TODO: Get all of this management stuff into its own package (structs and maps and initialization of the former) // TODO: Name these structs and maps and instances more uniformly and idiomatically diff --git a/src/wrath/wrath.go b/src/wrath/wrath.go index 76d6ced..5a13cbd 100644 --- a/src/wrath/wrath.go +++ b/src/wrath/wrath.go @@ -1,9 +1,10 @@ package wrath import ( - projVars "protomolecule/src/vars" - bluetooth "git.tcp.direct/kayos/prototooth" + "github.com/rs/zerolog/log" + "github.com/rs/zerolog" + projVars "protomolecule/src/vars" "tinygo.org/x/bluetooth/rawterm" ) @@ -33,7 +34,9 @@ func targetPicture() bluetooth.MAC { } */ -func wrath(bluetooth.Address) { +func Start() { + + var sublog zerolog.Logger //bluetooth.DefaultAdapter.Connect(targetPicture(), bluetooth.ConnectionParams{}) @@ -42,53 +45,57 @@ func wrath(bluetooth.Address) { // Enable BLE interface. err := projVars.ScanAdapter.Enable() if err != nil { - println("could not enable the BLE stack:", err.Error()) + log.Error(). + Err(err). + Msg("could not enable the BLE stack") return } // The address to connect to. Set during scanning and read afterwards. var foundDevice bluetooth.ScanResult // Scan for NUS peripheral. - println("Scanning...") - err = projVars.ScanAdapter.Scan(func(adapter *bluetooth.Adapter, result bluetooth.ScanResult) { - if !result.AdvertisementPayload.HasServiceUUID() { + log.Info().Msg("Scanning...") + err = projVars.ScanAdapter.Scan(func(adapter *bluetooth.Adapter, foundDevice bluetooth.ScanResult) { + if !foundDevice.AdvertisementPayload.HasServiceUUID() { return } - foundDevice = result // Stop the scan. - err := adapter.StopScan() + err := projVars.ScanAdapter.StopScan() if err != nil { // Unlikely, but we can't recover from this. - println("failed to stop the scan:", err.Error()) + log.Error().Err(err). + Msg("failed to stop scan") } }) if err != nil { - println("could not start a scan:", err.Error()) + log.Error().Err(err). + Msg("failed to start scan") return } // Found a device: print this event. if name := foundDevice.LocalName(); name == "" { - print("Connecting to ", foundDevice.Address.String(), "...") - println() + sublog = log.With().Str("MAC", foundDevice.Address.String()).Logger() } else { - print("Connecting to ", name, " (", foundDevice.Address.String(), ")...") - println() + sublog = log.With().Str("MAC", foundDevice.Address.String()). + Str("Name", foundDevice.LocalName()).Logger() } // Found a NUS peripheral. Connect to it. - device, err := adapter.Connect(foundDevice.Address, bluetooth.ConnectionParams{}) + device, err := projVars.ScanAdapter.Connect(foundDevice.Address, bluetooth.ConnectionParams{}) if err != nil { - println("Failed to connect:", err.Error()) + sublog.Error().Err(err). + Msg("Failed to connect") return } // Connected. Look up the Nordic UART Service. - println("Discovering service...") + sublog.Info().Msg("Discovering services...") services, err := device.DiscoverServices([]bluetooth.UUID{serviceUUID}) if err != nil { - println("Failed to discover the Nordic UART Service:", err.Error()) + log.Error().Err(err). + Msg("Failed to discover the Nordic UART Service") return } service := services[0] @@ -96,7 +103,8 @@ func wrath(bluetooth.Address) { // Get the two characteristics present in this service. chars, err := service.DiscoverCharacteristics([]bluetooth.UUID{rxUUID, txUUID}) if err != nil { - println("Failed to discover RX and TX characteristics:", err.Error()) + log.Error().Err(err). + Msg("Failed to discover RX and TX characteristics") return } rx := chars[0] @@ -109,11 +117,12 @@ func wrath(bluetooth.Address) { } }) if err != nil { - println("Failed to enable TX notifications:", err.Error()) + sublog.Error().Err(err). + Msg("Failed to enable TX notifications") return } - println("Connected. Exit console using Ctrl-X.") + sublog.Info().Msg("Connected. Exit console using Ctrl-X.") rawterm.Configure() defer rawterm.Restore() var line []byte @@ -142,7 +151,8 @@ func wrath(bluetooth.Address) { // This performs a "write command" aka "write without response". _, err := rx.WriteWithoutResponse(part) if err != nil { - println("could not send:", err.Error()) + sublog.Error().Err(err). + Msg("could not send:") } } } From 4428ac4da7e28ea6b1b10483ec30f5f800054160 Mon Sep 17 00:00:00 2001 From: kayos Date: Wed, 30 Jun 2021 20:40:33 -0700 Subject: [PATCH 13/31] Work on command line interface, add arboghast --- cmd.go | 39 ++++++++++++++++++++-------- main.go | 1 + src/arboghast/arboghast.go | 52 ++++++++++++++++++++++++++++++++++++++ src/arboghast/entropy.go | 34 +++++++++++++++++++++++++ src/eros/eros.go | 21 ++++++--------- src/protogen/ble_scan.go | 34 ++++++++++++------------- src/protogen/structs.go | 8 +++--- src/wrath/wrath.go | 3 +-- 8 files changed, 145 insertions(+), 47 deletions(-) create mode 100644 src/arboghast/arboghast.go create mode 100644 src/arboghast/entropy.go diff --git a/cmd.go b/cmd.go index d552124..b4f0569 100644 --- a/cmd.go +++ b/cmd.go @@ -8,7 +8,7 @@ import ( "github.com/rs/zerolog/log" "os" "protomolecule/src/eros" -// "protomolecule/src/wrath" + // "protomolecule/src/wrath" projVars "protomolecule/src/vars" "strings" ) @@ -32,10 +32,17 @@ var suggestions = []cli.Suggest{ {"eros recall all", "Retrieve info on all devices"}, -/* - {"wrath", - "attack by address"}, -*/ + + {"eros backup", + "Backup all databases to the supplied directory"}, + + {"arboghast start", + "Start entropic fuzzing via advertising"}, + + /* + {"wrath", + "attack by address"}, + */ {"exit", "Exit ProtoMolecule"}, @@ -138,7 +145,17 @@ func executor(cmd string) { Int16("Current_RSSI", fromEros.RSSIlast). Int("Service_Count", len(fromEros.Services)). Msg("EROS_RECALL") + + case "backup": + if len(args) < 3 { + getHelp("eros backup") + return + } + if err := eros.Backup(args[3]); err != nil { + log.Error().Err(err).Msg("Failed to backup databases!") + } } + } case "help": @@ -232,12 +249,12 @@ func executor(cmd string) { } /* - case "wrath": - if len(args) < 2 { - getHelp("wrath") - return - } - wrath(args[1]) + case "wrath": + if len(args) < 2 { + getHelp("wrath") + return + } + wrath(args[1]) */ case "clear": diff --git a/main.go b/main.go index 8fd729f..c217c6e 100644 --- a/main.go +++ b/main.go @@ -67,6 +67,7 @@ func cliFlags() { } if *projVars.DFlag { + projVars.Debug = true zerolog.SetGlobalLevel(zerolog.DebugLevel) } diff --git a/src/arboghast/arboghast.go b/src/arboghast/arboghast.go new file mode 100644 index 0000000..fb265ee --- /dev/null +++ b/src/arboghast/arboghast.go @@ -0,0 +1,52 @@ +// arboghast is a package focused on fuzzing BLE devices +package arboghast + +import ( + projVars "protomolecule/src/vars" + bluetooth "git.tcp.direct/kayos/prototooth" + "sync" +) + +type Circus struct { + Trick map[int]*Fuzzy + uuid_pool []bluetooth.UUID + mu *sync.Mutex +} + +type Fuzzy struct { + config *bluetooth.AdvertisementOptions + ad *bluetooth.Advertisement + mu *sync.Mutex +} + +var circus *Circus + +func Awaken() { + circus = &Circus{ + Trick: make(map[int]*Fuzzy), + uuid_pool: []bluetooth.UUID{}, + mu: &sync.Mutex{}, + } +} + +func NewEntropicFuzzer() *Fuzzy { + options := &bluetooth.AdvertisementOptions{ + LocalName: RandomAlpha(16), + + // Interval: + } + mutex := &sync.Mutex{} + + ad := projVars.ScanAdapter.DefaultAdvertisement() + ad.Configure(options) + + return &Fuzzy{ + config: options, + ad: ad, + mu: mutex, + } +} + +func (f *Fuzzy) StartAd() { + f.ad.Start() +} diff --git a/src/arboghast/entropy.go b/src/arboghast/entropy.go new file mode 100644 index 0000000..f61b6c9 --- /dev/null +++ b/src/arboghast/entropy.go @@ -0,0 +1,34 @@ +package arboghast + +import ( + "math/rand" + "time" + "unsafe" +) + +var src = rand.NewSource(time.Now().UnixNano()) + +const ( + letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + letterIdxBits = 6 // 6 bits to represent a letter index + letterIdxMask = 1<= 0; { + if remain == 0 { + cache, remain = src.Int63(), letterIdxMax + } + if idx := int(cache & letterIdxMask); idx < len(letterBytes) { + b[i] = letterBytes[idx] + i-- + } + cache >>= letterIdxBits + remain-- + } + + return *(*string)(unsafe.Pointer(&b)) +} diff --git a/src/eros/eros.go b/src/eros/eros.go index e4b60f3..93ecda2 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -1,5 +1,3 @@ -package eros - // Eros controls the Bitcask db that holds the devices captured during scanning // // Addr (Key) @@ -10,6 +8,7 @@ package eros // TODO: // Output to report // +package eros import ( "bufio" @@ -27,15 +26,11 @@ import ( ) var ( - // devices will hold details about devices discovered - // exploits will hold details about exploits to be used against BLE devices - // services will hold definitions of various bluetook services and will ultimately be updated via an HTTP repository - // manufacturers will hold manufacturer to UUID correlations dbs = []string{ - "devices", - "exploits", - "services", - "manufacturers", + "devices", // details about devices discovered + "exploits", // details about exploits to be used against BLE devices + "services", // definitions of various bluetook services and will ultimately be updated via an HTTP repository + "manufacturers", // manufacturer to UUID correlations and info } err error @@ -239,16 +234,16 @@ func Recall(Addr string) (Device, error) { return member, err } -func Backup(path string) { +func Backup(path string) error { for _, db := range DB { db.Merge() db.Sync() err := db.Backup(path) if err != nil { - panic(err.Error()) + return err } } - + return nil } // Hypnosis - retrieve new exploits/attacks from a remote http repository diff --git a/src/protogen/ble_scan.go b/src/protogen/ble_scan.go index aa217bc..ae026e4 100644 --- a/src/protogen/ble_scan.go +++ b/src/protogen/ble_scan.go @@ -15,23 +15,23 @@ import ( // ScanMgr will keep track of concurrently running scans var ScanMgr *Meta + +// NewScan - here we are creating an "anonymous" instance of a Scan struct +// You'll notice it doesn't contain most of the data that actually is supposed to live within that struct +// +// This works because the integer ID is being used as a key that will have a global scope +// +// See: Remember function as it is defined in eros/eros.go +// Remember usage in this file (scanStuff/scanStuff.go +// +// In these examples we are sending an instance of a struct with some data to eros; allowing it to finish filling out the rest +// This can be done with just structs, but becomes problematic when trying to refer to them later +// +//TODO: implement Mutex locking from sync in most of these structs to prevent concurrent read/write operations from causing a race w̶a̶r̶ condition +// ref: https://gobyexample.com/mutexes +// ref: https://golang.org/pkg/sync/#Mutex +// ref: https://www.geeksforgeeks.org/mutex-in-golang-with-examples/ func (m *Meta) NewScan() *Scan { - // Here we are creating an "anonymous" instance of a Scan struct - // You'll notice it doesn't contain most of the data that actually is supposed to live within that struct - - // This works because the integer ID is being used as a key that will have a global scope - // - // See: Remember function as it is defined in eros/eros.go - // Remember usage in this file (scanStuff/scanStuff.go - // - // In these examples we are sending an instance of a struct with some data to eros; allowing it to finish filling out the rest - // This can be done with just structs, but becomes problematic when trying to refer to them later - // - //TODO: implement Mutex locking from sync in most of these structs to prevent concurrent read/write operations from causing a race w̶a̶r̶ condition - // ref: https://gobyexample.com/mutexes - // ref: https://golang.org/pkg/sync/#Mutex - // ref: https://www.geeksforgeeks.org/mutex-in-golang-with-examples/ - newid := len(m.Scans) m.Scans[newid] = &Scan{ @@ -141,7 +141,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc log.Info(). Str("Name", fromEros.Name). Str("Addr", fromEros.Addr). - Str("ManuF", EnumedManuf). //needs to be changed back to fromEros.Manufacturer + Str("ManuF", fromEros.Manufacturer). //needs to be changed back to fromEros.Manufacturer Int16("Current_RSSI", fromEros.RSSIlast). Int("Service_Count", len(fromEros.Services)). Msg("EROS_RECALL") diff --git a/src/protogen/structs.go b/src/protogen/structs.go index b31af47..9f8479a 100644 --- a/src/protogen/structs.go +++ b/src/protogen/structs.go @@ -7,11 +7,11 @@ import ( ) /* - Why the Meta struct? This shit is a fucking maze. -Well in theory we will have multiple types of scans in the future, -if that's the case this is going to become necessary very quickly +Why the Meta struct? + In theory we will have multiple types of scans in the future, + if that's the case this is going to become necessary very quickly -I've mocked up some commented out examples below. + I've mocked up some commented out examples in the source code below. */ type Meta struct { Count int diff --git a/src/wrath/wrath.go b/src/wrath/wrath.go index 5a13cbd..17900c1 100644 --- a/src/wrath/wrath.go +++ b/src/wrath/wrath.go @@ -2,8 +2,8 @@ package wrath import ( bluetooth "git.tcp.direct/kayos/prototooth" - "github.com/rs/zerolog/log" "github.com/rs/zerolog" + "github.com/rs/zerolog/log" projVars "protomolecule/src/vars" "tinygo.org/x/bluetooth/rawterm" ) @@ -157,5 +157,4 @@ func Start() { } } } - } From 93a7e51c290047b4aba9c33084850d020ed12cf0 Mon Sep 17 00:00:00 2001 From: kayos Date: Fri, 9 Jul 2021 01:13:24 -0700 Subject: [PATCH 14/31] being deimos packet capture implementation scaffolding --- go.mod | 1 + go.sum | 4 ++++ src/deimos/main.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 src/deimos/main.go diff --git a/go.mod b/go.mod index f82a8bd..f140417 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/c-bata/go-prompt v0.2.5 github.com/go-ole/go-ole v1.2.5 // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect + github.com/google/gopacket v1.1.19 github.com/logrusorgru/aurora v2.0.3+incompatible github.com/mattn/go-runewidth v0.0.10 // indirect github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 // indirect diff --git a/go.sum b/go.sum index 0b1fc55..ecd168f 100644 --- a/go.sum +++ b/go.sum @@ -79,6 +79,8 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -273,6 +275,7 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -365,6 +368,7 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= diff --git a/src/deimos/main.go b/src/deimos/main.go new file mode 100644 index 0000000..1551512 --- /dev/null +++ b/src/deimos/main.go @@ -0,0 +1,45 @@ +package deimos + +import ( + "fmt" + "github.com/google/gopacket/pcap" + "github.com/rs/zerolog/log" + "strconv" + "strings" +) + +type DevMap map[int]*pcap.Interface +var Devices DevMap + +func getInterfaces() []pcap.Interface { + devices, err := pcap.FindAllDevs() + if err != nil { + log.Error().Err(err).Msg("failed to get network interfaces") + return nil + } + return devices +} + +func getBlueDevices() []pcap.Interface { + var blues []pcap.Interface + devices := getInterfaces() + for n, device := range devices { + if strings.Contains(strings.ToLower(device.Name), "bluetooth") { + Devices[n] = device + blues = append(blues, device) + } + if strings.Contains(strings.ToLower(device.Name), "hci") { + Devices[n] = device + blues = append(blues, device) + } + } + return blues +} + +func PrintBlueDevices() { + _ := getBlueDevices() + for n, _ := range Devices { + devid := strconv.Itoa(n) + fmt.Println("[" + devid + "] " + Devices[n].Name) + } +} From 16d7e6bd95ba587d448d340b93ac068a722f04a4 Mon Sep 17 00:00:00 2001 From: kayos Date: Sun, 11 Jul 2021 18:54:34 -0700 Subject: [PATCH 15/31] fix go-prompt issue with fork --- cmd.go | 2 +- go.mod | 2 +- go.sum | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cmd.go b/cmd.go index b4f0569..02cd631 100644 --- a/cmd.go +++ b/cmd.go @@ -2,7 +2,7 @@ package main import ( "fmt" - cli "github.com/c-bata/go-prompt" + cli "git.tcp.direct/tcp.direct/go-prompt" . "github.com/logrusorgru/aurora" "github.com/rs/zerolog" "github.com/rs/zerolog/log" diff --git a/go.mod b/go.mod index f140417..eadb18f 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af - github.com/c-bata/go-prompt v0.2.5 + git.tcp.direct/tcp.direct/go-prompt v0.2.7-0.20210712015119-a962cc8abe10 github.com/go-ole/go-ole v1.2.5 // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect github.com/google/gopacket v1.1.19 diff --git a/go.sum b/go.sum index ecd168f..0067410 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,8 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af h1:+J2MfTQvW1DmX1HYIQUsrCd5l0Il9JMYTOowIs8ju1Y= git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af/go.mod h1:kk4oyPgWq6Rijn30Js4ITQC5DFwmpyzWL3+8V6q9wdM= +git.tcp.direct/tcp.direct/go-prompt v0.2.7-0.20210712015119-a962cc8abe10 h1:P32iohMBsZcCaimaTqotr9MNa4jPun92zyKkbuBj9ow= +git.tcp.direct/tcp.direct/go-prompt v0.2.7-0.20210712015119-a962cc8abe10/go.mod h1:4E08LRVmW6/2cT0+PaglopcbBZ23bN9fquplcKCFnyQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/JuulLabs-OSS/cbgo v0.0.2 h1:gCDyT0+EPuI8GOFyvAksFcVD2vF4CXBAVwT6uVnD9oo= @@ -28,8 +30,6 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/c-bata/go-prompt v0.2.5 h1:3zg6PecEywxNn0xiqcXHD96fkbxghD+gdB2tbsYfl+Y= -github.com/c-bata/go-prompt v0.2.5/go.mod h1:vFnjEGDIIA/Lib7giyE4E9c50Lvl8j0S+7FVlAwDAVw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -175,8 +175,8 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= -github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= +github.com/pkg/term v1.2.0-beta.2 h1:L3y/h2jkuBVFdWiJvNfYfKmzcCnILw7mJWm2JQuMppw= +github.com/pkg/term v1.2.0-beta.2/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/plar/go-adaptive-radix-tree v1.0.4 h1:Ucd8R6RH2E7RW8ZtDKrsWyOD3paG2qqJO0I20WQ8oWQ= github.com/plar/go-adaptive-radix-tree v1.0.4/go.mod h1:Ot8d28EII3i7Lv4PSvBlF8ejiD/CtRYDuPsySJbSaK8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -299,6 +299,7 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From 5528bd925cc93c8635ea6ceb45ae50d92fc2ee55 Mon Sep 17 00:00:00 2001 From: kayos Date: Mon, 16 Aug 2021 12:16:05 -0700 Subject: [PATCH 16/31] Make minor progress on deimos implementation and create Makefile and add versioning for builds --- Makefile | 22 ++++++++++++++++++++++ cmd.go | 34 ++++++++++++++++++++-------------- go.mod | 1 + go.sum | 3 +++ main.go | 15 +++++++++++++-- src/arboghast/arboghast.go | 4 ++-- src/deimos/main.go | 38 +++++++++++++++++++++++++++++++++++--- src/eros/eros.go | 4 +++- src/protogen/ble_scan.go | 1 - 9 files changed, 99 insertions(+), 23 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ce47c6c --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +.DEFAULT_GOAL := protomolecule +.PHONY = fmt vet all clean deps benchmark + +all: main + +protomolecule: + go build -ldflags="-s -w -X main.GitVersion=git-$(shell git rev-list --count HEAD)-$(shell git rev-parse --short HEAD) -X main.BuildDate=$(shell date -u +%Y-%m-%dT%H:%M:%S%Z)" +install: + cp protomolecule /usr/local/bin/ +uninstall: + rm /usr/local/bin/protomolecule +benchmark: + go test -bench=. +deps: + go mod tidy -v +fmt: + find . -name "*.go" -exec gofmt -s -w {} \; +vet: + go vet ./ +clean: + rm protomolecule + diff --git a/cmd.go b/cmd.go index 02cd631..cebb3cf 100644 --- a/cmd.go +++ b/cmd.go @@ -8,7 +8,9 @@ import ( "github.com/rs/zerolog/log" "os" "protomolecule/src/eros" - // "protomolecule/src/wrath" + "strconv" + //"protomolecule/src/wrath" + "protomolecule/src/deimos" projVars "protomolecule/src/vars" "strings" ) @@ -38,7 +40,6 @@ var suggestions = []cli.Suggest{ {"arboghast start", "Start entropic fuzzing via advertising"}, - /* {"wrath", "attack by address"}, @@ -179,9 +180,23 @@ func executor(cmd string) { if len(args) > 1 { switch args[1] { case "list": - fmt.Println(getArgs(args) + ": list available bluetooth adapters") - case "use": - fmt.Println(getArgs(args) + ": select given adapter for usage") + deimos.PrintBlueDevices() + case "sniff": + var ( + err error + devint int + ) + if len(args) < 2 { + log.Error().Msg("not enough parameters, missing adapter ID") + println() + return + } + if devint, err = strconv.Atoi(args[2]); err != nil { + log.Error().Msg("invalid parameter, must be integer of adapter ID") + println() + return + } + deimos.Sniff(devint) default: log.Error().Msg("unknown sub-command: " + args[1]) println() @@ -189,15 +204,6 @@ func executor(cmd string) { } else { getHelp(getArgs(args)) } - - /* - case "mode": - - case "attack": - if len(args) > 1 { - switch args[1] { - */ - case "scan": if len(args) > 1 { switch args[1] { diff --git a/go.mod b/go.mod index eadb18f..c009033 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/go-ole/go-ole v1.2.5 // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect github.com/google/gopacket v1.1.19 + github.com/json-iterator/go v1.1.6 github.com/logrusorgru/aurora v2.0.3+incompatible github.com/mattn/go-runewidth v0.0.10 // indirect github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 // indirect diff --git a/go.sum b/go.sum index 0067410..1b4394e 100644 --- a/go.sum +++ b/go.sum @@ -116,6 +116,7 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -159,7 +160,9 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/muka/go-bluetooth v0.0.0-20200619025933-f6113f7141c5/go.mod h1:yV39+EVOWdnoTe75NyKdo9iuyI3Slyh4t7eQvElUbWE= github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 h1:p3srutpE8TpQmOUQ5Qw94jYFUdoG2jBbILeYLroQNoI= diff --git a/main.go b/main.go index c217c6e..f64e17d 100644 --- a/main.go +++ b/main.go @@ -18,7 +18,9 @@ import ( ) var ( - manufLoad bool + manufLoad bool + GitVersion string + BuildDate string ) func handleExit() { @@ -123,7 +125,16 @@ func init() { cliFlags() go sigHandler() - log.Debug().Msg("Logging initialized") + // to make versioning via git commits work, build like this: + // + // export GIT_COMMIT=$(git rev-list -1 HEAD) && go build ./ ld + + if len(GitVersion) > 0 { + log.Info(). + Str("Version", "git-"+GitVersion). + Str("Built", BuildDate). + Msg("Initializing protomolecule") + } // see ./src/eros log.Debug().Msg("Initializing database engine") diff --git a/src/arboghast/arboghast.go b/src/arboghast/arboghast.go index fb265ee..161bfdd 100644 --- a/src/arboghast/arboghast.go +++ b/src/arboghast/arboghast.go @@ -2,8 +2,8 @@ package arboghast import ( - projVars "protomolecule/src/vars" bluetooth "git.tcp.direct/kayos/prototooth" + projVars "protomolecule/src/vars" "sync" ) @@ -42,7 +42,7 @@ func NewEntropicFuzzer() *Fuzzy { return &Fuzzy{ config: options, - ad: ad, + ad: ad, mu: mutex, } } diff --git a/src/deimos/main.go b/src/deimos/main.go index 1551512..a070c01 100644 --- a/src/deimos/main.go +++ b/src/deimos/main.go @@ -1,15 +1,23 @@ package deimos import ( + "errors" "fmt" + "github.com/google/gopacket/dumpcommand" "github.com/google/gopacket/pcap" "github.com/rs/zerolog/log" "strconv" "strings" ) -type DevMap map[int]*pcap.Interface +type DevMap map[int]pcap.Interface + var Devices DevMap +var Interface *pcap.Handle + +func init() { + Devices = make(map[int]pcap.Interface) +} func getInterfaces() []pcap.Interface { devices, err := pcap.FindAllDevs() @@ -37,9 +45,33 @@ func getBlueDevices() []pcap.Interface { } func PrintBlueDevices() { - _ := getBlueDevices() - for n, _ := range Devices { + getBlueDevices() + for n := range Devices { devid := strconv.Itoa(n) fmt.Println("[" + devid + "] " + Devices[n].Name) } } + +func Sniff(dev int) error { + var ( + err error + d pcap.Interface + preInterface *pcap.InactiveHandle + ok bool + ) + if d, ok = Devices[dev]; !ok { + return errors.New("adapter ID does not exist") + } + if preInterface, err = pcap.NewInactiveHandle(d.Name); err != nil { + return err + } + defer preInterface.CleanUp() + if err = preInterface.SetPromisc(true); err != nil { + return err + } + if Interface, err = preInterface.Activate(); err != nil { + return err + } + go dumpcommand.Run(Interface) + return nil +} diff --git a/src/eros/eros.go b/src/eros/eros.go index 93ecda2..7c8eb62 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -12,7 +12,7 @@ package eros import ( "bufio" - "encoding/json" + jsoniter "github.com/json-iterator/go" "os" "strconv" "strings" @@ -26,6 +26,8 @@ import ( ) var ( + json = jsoniter.ConfigCompatibleWithStandardLibrary + dbs = []string{ "devices", // details about devices discovered "exploits", // details about exploits to be used against BLE devices diff --git a/src/protogen/ble_scan.go b/src/protogen/ble_scan.go index ae026e4..5075a72 100644 --- a/src/protogen/ble_scan.go +++ b/src/protogen/ble_scan.go @@ -15,7 +15,6 @@ import ( // ScanMgr will keep track of concurrently running scans var ScanMgr *Meta - // NewScan - here we are creating an "anonymous" instance of a Scan struct // You'll notice it doesn't contain most of the data that actually is supposed to live within that struct // From ed222d181d8b210e3790704bc7372d9069a62e67 Mon Sep 17 00:00:00 2001 From: kayos Date: Mon, 16 Aug 2021 12:18:38 -0700 Subject: [PATCH 17/31] fix version string redundancy --- main.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/main.go b/main.go index f64e17d..9111832 100644 --- a/main.go +++ b/main.go @@ -125,13 +125,9 @@ func init() { cliFlags() go sigHandler() - // to make versioning via git commits work, build like this: - // - // export GIT_COMMIT=$(git rev-list -1 HEAD) && go build ./ ld - if len(GitVersion) > 0 { log.Info(). - Str("Version", "git-"+GitVersion). + Str("Version", GitVersion). Str("Built", BuildDate). Msg("Initializing protomolecule") } From df3dfabe2292114c8b4273d111a938fd61291007 Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Tue, 17 Aug 2021 08:28:24 -0700 Subject: [PATCH 18/31] refactor handling of types cross package and add documentation --- main.go | 1 - src/eros/eros.go | 12 +++++++++--- src/eros/structs.go | 5 ++++- src/protogen/ble_scan.go | 13 ++++++------- src/protogen/structs.go | 27 ++++++++++++++++----------- 5 files changed, 35 insertions(+), 23 deletions(-) diff --git a/main.go b/main.go index 9111832..50103c0 100644 --- a/main.go +++ b/main.go @@ -116,7 +116,6 @@ func init() { dust.PrintBanner() protogen.ScanMgr = &protogen.Meta{ - Count: 0, Scans: make(map[int]*protogen.Scan), Mailbox: make(chan protogen.Postcard), } diff --git a/src/eros/eros.go b/src/eros/eros.go index 7c8eb62..7fcf960 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -14,12 +14,12 @@ import ( "bufio" jsoniter "github.com/json-iterator/go" "os" + projVars "protomolecule/src/vars" "strconv" "strings" + "sync" "time" - projVars "protomolecule/src/vars" - bluetooth "git.tcp.direct/kayos/prototooth" "github.com/prologic/bitcask" "github.com/rs/zerolog/log" @@ -62,8 +62,14 @@ func (manuf *Manufacturer) IngestUUID(uuid bluetooth.UUID) bool { manuf.UUIDs = append(manuf.UUIDs, uuid) return true } +func FinalizeDevice(bigidea Device) *Device { + bigidea.mu = &sync.RWMutex{} + return &bigidea +} func (d *Device) ConnectHandler(target bluetooth.Addresser, c bool) { + d.mu.Lock() + defer d.mu.Unlock() if c { d.Connected = true } else { @@ -191,7 +197,7 @@ func Exists(Addr string) bool { return false } -// Remember - store device details into the database +// Remember stores device details into the database func Remember(dev Device) error { var err error var rhist map[time.Time]int16 diff --git a/src/eros/structs.go b/src/eros/structs.go index 4a672fc..9a027ee 100644 --- a/src/eros/structs.go +++ b/src/eros/structs.go @@ -2,7 +2,7 @@ package eros import ( "time" - + "sync" bluetooth "git.tcp.direct/kayos/prototooth" ) @@ -82,4 +82,7 @@ type Device struct { Connected bool Conn *bluetooth.Device + + // The most at-risk type we have so far for concurrency, needs to be mutexed + mu *sync.RWMutex } diff --git a/src/protogen/ble_scan.go b/src/protogen/ble_scan.go index 5075a72..765b82a 100644 --- a/src/protogen/ble_scan.go +++ b/src/protogen/ble_scan.go @@ -41,21 +41,19 @@ func (m *Meta) NewScan() *Scan { scan := m.Scans[newid] scan.Device = make(map[int]*eros.Device) - m.Count = len(m.Scans) return scan } func (s *Scan) NewDevice(name string, addr string, manuf string, rssi int16) *eros.Device { - newid := len(s.Device) - s.Device[newid] = &eros.Device{ + s.mu.Lock() + defer s.mu.Unlock() + s.Device[len(s.Device)] = eros.FinalizeDevice(eros.Device{ Name: name, Addr: addr, Manufacturer: manuf, RSSIlast: rssi, - } - - s.Count = len(s.Device) - return s.Device[newid] + }) + return s.Device[len(s.Device)] } /* @@ -94,6 +92,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc payload := result.AdvertisementPayload addr := result.Address.String() + lname := result.LocalName() //adbytes := payload.Bytes() rssi := result.RSSI diff --git a/src/protogen/structs.go b/src/protogen/structs.go index 9f8479a..92e2f1f 100644 --- a/src/protogen/structs.go +++ b/src/protogen/structs.go @@ -4,6 +4,7 @@ import ( bluetooth "git.tcp.direct/kayos/prototooth" "protomolecule/src/eros" "time" + "sync" ) /* @@ -14,45 +15,49 @@ Why the Meta struct? I've mocked up some commented out examples in the source code below. */ type Meta struct { - Count int Scans map[int]*Scan - Mailbox chan Postcard - // // // Future Concepts // // // // BLEScans map[int]*BLEScan // LoraScans map[int]*LoraScan // ZigScans map[int]*ZigScan // WiFiScans map[int]*WiFiScan + + // we definitely need this to be safe for concurrency + mu *sync.RWMutex } // Postcard will encapsulate interprocess communication messages that we send back to the main thread type Postcard struct { - // From - the ScanID the message originated from From int - // Stamp - the time the IPC message was created Stamp time.Time - // Device ID - relevant DeviceID (if applicable) - Remember to use Scan.Devices[id] for easy referral DeviceID int - // Command - the actual IPC command Command string - // Arguments - augmenting arguments to the command Arguments []string } -// Instance of a BLE scan +// TODO: Form profiles on devices +// Scan represents an instance of a BLE scan type Scan struct { Count int - - // The ID is how we will refer back to running scans during IPC to react or cancel a scan ID int + // Started the scan at this time Started time.Time + // Activity was last seen at this time Activity time.Time + // Device represents a bluetooth endpoints Device map[int]*eros.Device + // Connection is an active connection to a bluetooth endpoint Connection map[int]*bluetooth.Connection + /* Ignore is a map of devices to disregard during a scan, + by using the hardware address as a key. (needs disclaimer?) */ + Ignore map[string]bool + + // Gonna plan on mutexing scan operations just to be safe + mu *sync.RWMutex } From 38210653b839b9b58aad9b0343c7f5b573a037e2 Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Tue, 17 Aug 2021 09:25:41 -0700 Subject: [PATCH 19/31] begin implementing mutexes and adjusting the way we reference and instantiate instances of types accordingly --- src/eros/eros.go | 4 ++-- src/eros/structs.go | 4 ++-- src/protogen/ble_scan.go | 13 +++++++------ src/protogen/structs.go | 14 +++++++------- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/eros/eros.go b/src/eros/eros.go index 7fcf960..514462e 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -197,8 +197,8 @@ func Exists(Addr string) bool { return false } -// Remember stores device details into the database -func Remember(dev Device) error { +// Remember stores device details into the database via an argument +func Remember(dev *Device) error { var err error var rhist map[time.Time]int16 diff --git a/src/eros/structs.go b/src/eros/structs.go index 9a027ee..d4bc2ca 100644 --- a/src/eros/structs.go +++ b/src/eros/structs.go @@ -1,9 +1,9 @@ package eros import ( - "time" - "sync" bluetooth "git.tcp.direct/kayos/prototooth" + "sync" + "time" ) type Permissions struct { diff --git a/src/protogen/ble_scan.go b/src/protogen/ble_scan.go index 765b82a..c424ff0 100644 --- a/src/protogen/ble_scan.go +++ b/src/protogen/ble_scan.go @@ -8,7 +8,7 @@ import ( "protomolecule/src/eros" bluetooth "git.tcp.direct/kayos/prototooth" - + "sync" "time" ) @@ -40,20 +40,21 @@ func (m *Meta) NewScan() *Scan { scan := m.Scans[newid] scan.Device = make(map[int]*eros.Device) - + scan.mu = &sync.RWMutex{} return scan } func (s *Scan) NewDevice(name string, addr string, manuf string, rssi int16) *eros.Device { s.mu.Lock() defer s.mu.Unlock() - s.Device[len(s.Device)] = eros.FinalizeDevice(eros.Device{ + draft := eros.Device{ Name: name, Addr: addr, Manufacturer: manuf, RSSIlast: rssi, - }) - return s.Device[len(s.Device)] + } + + return eros.FinalizeDevice(draft) } /* @@ -128,7 +129,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc layToRest := func(dev *eros.Device) { sublog.Debug().Msg("Storing data with Eros") - eros.Remember(*dev) + eros.Remember(dev) // simple eros test fromEros, err := eros.Recall(addr) diff --git a/src/protogen/structs.go b/src/protogen/structs.go index 92e2f1f..1c263cc 100644 --- a/src/protogen/structs.go +++ b/src/protogen/structs.go @@ -3,8 +3,8 @@ package protogen import ( bluetooth "git.tcp.direct/kayos/prototooth" "protomolecule/src/eros" - "time" "sync" + "time" ) /* @@ -15,7 +15,7 @@ Why the Meta struct? I've mocked up some commented out examples in the source code below. */ type Meta struct { - Scans map[int]*Scan + Scans map[int]*Scan Mailbox chan Postcard // // // Future Concepts // // // // BLEScans map[int]*BLEScan @@ -45,18 +45,18 @@ type Postcard struct { // Scan represents an instance of a BLE scan type Scan struct { Count int - ID int + ID int // Started the scan at this time - Started time.Time + Started time.Time // Activity was last seen at this time - Activity time.Time + Activity time.Time // Device represents a bluetooth endpoints - Device map[int]*eros.Device + Device map[int]*eros.Device // Connection is an active connection to a bluetooth endpoint Connection map[int]*bluetooth.Connection /* Ignore is a map of devices to disregard during a scan, by using the hardware address as a key. (needs disclaimer?) */ - Ignore map[string]bool + Ignore map[string]bool // Gonna plan on mutexing scan operations just to be safe mu *sync.RWMutex From fc5e158b46da5cd7da3a950e83e57d4031615003 Mon Sep 17 00:00:00 2001 From: Dillinger Date: Tue, 17 Aug 2021 20:43:35 +0000 Subject: [PATCH 20/31] Update 'src/eros/eros.go' added clientside api functionality for exploit; my json code might get cucked by json-iterator tho --- src/eros/eros.go | 130 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 123 insertions(+), 7 deletions(-) diff --git a/src/eros/eros.go b/src/eros/eros.go index 514462e..193cee4 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -23,6 +23,13 @@ import ( bluetooth "git.tcp.direct/kayos/prototooth" "github.com/prologic/bitcask" "github.com/rs/zerolog/log" + + structs "protomolecule/src/eros/structs" + "github.com/labstack/echo/middleware" + "github.com/labstack/echo" + "encoding/json" + "fmt" + "net/http" ) var ( @@ -31,12 +38,13 @@ var ( dbs = []string{ "devices", // details about devices discovered "exploits", // details about exploits to be used against BLE devices - "services", // definitions of various bluetook services and will ultimately be updated via an HTTP repository + "services", // definitions of various bluetooth services and will ultimately be updated via an HTTP repository "manufacturers", // manufacturer to UUID correlations and info } err error Manufacturers ManufData + Exploits Exploit // DataDir - should be defined by config or cmd flag DataDir string = "./.eros-data/" @@ -256,15 +264,123 @@ func Backup(path string) error { // Hypnosis - retrieve new exploits/attacks from a remote http repository func Hypnosis(repo string) { - // placeholder + + e:= echo.New() + // CORS + e.Use(middleware.CORSWithConfig(middleware.CORSConfig{ + AllowOrigins: []string{"*"}, + AllowMethods: []string{echo.GET, echo.HEAD, echo.PUT, echo.PATCH, echo.POST, echo.DELETE} //TODO: possibly trim the methods for security purposes + })) + + // GET + e.GET("/exploits", func(c echo.Context) error { + // Build request + req, err := http.NewRequest("GET", repo, nil) + if err != nil { + fmt.Println("Error in GET request: ", err) + } + + // Certificate sanity checks + caCert, err := ioutil.Readfile("server.crt") + if err != nil { + log.Fatal(err) + } + cert, err := tls.LoadX509KeyPair("client.crt", "client.key") + if err != nil { + log.Fatal(err) + } + + // Add certificates + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(caCert) + + // Create client + client := &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{ + RootCAs: caCertPool, + Certificates: []tls.Certificate{cert}, + }, + }, + } + + // Send request + res, err := client.Do(req) + if err != nil { + fmt.Println("Client Error: ", err) + } + + // Defer body close + defer res.Body.Close() + + // Late binding data from JSON + var exp structs.Exploit + + // Decode JSON stream + If err := json.NewDecoder(res.Body).Decode(&exp); err != nil { + fmt.Println(err) + } + + return c.JSON(http.StatusOK, exp) + + }) + } // Trauma - store details of an exploit/attack against BLE devices -func Trauma(name string, targ string, cat string, vec Vector, pay Payload) { - // placeholder +func Trauma(exp *Exploit) error { + var err error + var rhist map[time.Time]int16 + + if !Known(exp.Addr) { + exp.Discovered = time.Now() + rhist = make(map[time.Time]int16) + } else { + re, _ := Flashback(exp.Addr) + exp.Discovered = re.Discovered + rhist = re.RSSIhist + } + + rhist[time.Now()] = exp.RSSIlast + exp.RSSIhist = rhist + exp.Seen = time.Now() + + var jsonData []byte + jsonData, err = json.Marshal(exp) + if err != nil { + return err + } + + err = DB["exploits"].Put([]byte(exp.Addr), jsonData) + return err } -// Flashback - retrieve details for the named exploit/attack -func Flashback(name string) { - //placeholder +func FinalizeExploit(bigidea Exploit) *Exploit { + bigidea.mu = &sync.RWMutex{} + return &bigidea +} + +// Known - check if an exploit is present in the database +func Known(Addr string) bool { + if DB["exploits"].Has([]byte(Addr)) { + return true + } + + return false +} +// Flashback - retrieve details for the named exploit/attack +func Flashback(Addr string) (Exploit, error) { + var err error + var bytes []byte + var member Exploit + + bytes, err = DB["exploits"].Get([]byte(Addr)) + + if err != nil { + member = Exploit{} + return member, err + } + + json.Unmarshal(bytes, &member) + return member, err } From 08c7491e6bef4ffab774d2aab52041170b586cdb Mon Sep 17 00:00:00 2001 From: Dillinger Date: Wed, 18 Aug 2021 08:44:42 -0400 Subject: [PATCH 21/31] Am a dum dum --- src/eros/eros.go | 120 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 114 insertions(+), 6 deletions(-) diff --git a/src/eros/eros.go b/src/eros/eros.go index 514462e..2b5e7d9 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -23,6 +23,13 @@ import ( bluetooth "git.tcp.direct/kayos/prototooth" "github.com/prologic/bitcask" "github.com/rs/zerolog/log" + + structs "protomolecule/src/eros/structs" + "github.com/labstack/echo/middleware" + "github.com/labstack/echo" + "net/http" + "fmt" + ) var ( @@ -256,15 +263,116 @@ func Backup(path string) error { // Hypnosis - retrieve new exploits/attacks from a remote http repository func Hypnosis(repo string) { - // placeholder + + e:= echo.New() + // CORS + e.Use(middleware.CORSWithConfig(middleware.CORSConfig{ + AllowOrigins: []string{"*"}, + AllowMethods: []string{echo.GET, echo.HEAD, echo.PUT, echo.PATCH, echo.POST, echo.DELETE} //TODO: possibly trim the methods + })) + + // GET + e.GET("/exploits", func(c echo.Context) error { // This will definitely need to be updated + // Build request + req, err := http.NewRequest("GET", repo, nil) + if err != nil { + fmt.Println("Error in GET request: ", err) + } + + // Certificate sanity checks + caCert, err := os.Readfile("server.crt") + if err != nil { + log.Fatal(err) + } + cert, err := tls.LoadX509KeyPair("client.crt", "client.key") + if err != nil { + log.Fatal(err) + } + + // Add certificates + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(caCert) + + // Create client + client := &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{ + RootCAs: caCertPool, + Certificates: []tls.Certificate{cert}, + }, + }, + } + + // Send request + res, err := client.Do(req) + if err != nil { + fmt.Println("Client Error: ", err) + } + + // Defer body close + defer res.Body.Close() + + // Late binding data from JSON + var exp Exploit + + // Decode JSON stream + If err := json.NewDecoder(res.Body).Decode(&exp); err != nil { + fmt.Println(err) + } + + return c.JSON(http.StatusOK, exp) + }) } // Trauma - store details of an exploit/attack against BLE devices -func Trauma(name string, targ string, cat string, vec Vector, pay Payload) { - // placeholder +func Trauma(exp *Exploit) error { + var err error + var rhist map[time.Time]int16 + + if !Known(exp.Addr) { + exp.Discovered = time.Now() + rhist = make(map[time.Time]int16) + } else { + re, _ := Flashback(exp.Addr) + exp.Discovered = re.Discovered + rhist = re.RSSIhist + } + + rhist[time.Now()] = exp.RSSIlast + exp.RSSIhist = rhist + exp.Seen = time.Now() + + var jsonData []byte + jsonData, err = json.Marshal(exp) + if err != nil { + return err + } + + err = DB["exploits"].Put([]byte(exp.Addr), jsonData) + return err } -// Flashback - retrieve details for the named exploit/attack -func Flashback(name string) { - //placeholder +// Known - check if an exploit is present in the database +func Known(Addr string) bool { + if DB["exploits"].Has([]byte(Addr)) { + return true + } + + return false } +// Flashback - retrieve details for the named exploit/attack +func Flashback(Addr string) (Exploit, error) { + var err error + var bytes []byte + var member Exploit + + bytes, err = DB["exploits"].Get([]byte(Addr)) + + if err != nil { + member = Exploit{} + return member, err + } + + json.Unmarshal(bytes, &member) + return member, err +} \ No newline at end of file From df20ee2de609801e529bc95a27213bfe3b82bcdb Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Sat, 21 Aug 2021 01:45:32 -0700 Subject: [PATCH 22/31] Excellent HTTPS API prep-wor by Dillinger --- cmd.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/cmd.go b/cmd.go index cebb3cf..42bcecb 100644 --- a/cmd.go +++ b/cmd.go @@ -55,7 +55,7 @@ var suggestions = []cli.Suggest{ } func completer(in cli.Document) []cli.Suggest { - c := in.GetWordBeforeCursor() + c := in.CurrentLineBeforeCursor() if c == "" { return []cli.Suggest{} } @@ -63,12 +63,6 @@ func completer(in cli.Document) []cli.Suggest { return cli.FilterHasPrefix(suggestions, c, true) } -// commands that we will list when the user runs "help" -var cmds = []string{ - "scan", - "adapter", -} - // Interpret is where we will actuall define our commands func executor(cmd string) { cmd = strings.TrimSpace(cmd) @@ -275,6 +269,10 @@ func executor(cmd string) { } func getHelp(target string) { + fmt.Println("pRaNkeD! (help not available just yet.)") + fmt.Println() + return + /* var lines []string lines = append(lines, "help: "+target) @@ -296,7 +294,7 @@ func getHelp(target string) { log.Error().Msg("Help entry not found!") fmt.Println() } - + */ } func StartCLI() { From 721e08994c6915fa3a1eb0b544bee5b664595ff6 Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Sat, 28 Aug 2021 03:36:48 -0700 Subject: [PATCH 23/31] fixing for use while developing --- cmd.go | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/cmd.go b/cmd.go index 42bcecb..d4c970d 100644 --- a/cmd.go +++ b/cmd.go @@ -273,27 +273,27 @@ func getHelp(target string) { fmt.Println() return /* - var lines []string + var lines []string - lines = append(lines, "help: "+target) + lines = append(lines, "help: "+target) - switch target { + switch target { - case "meta": - var list string - for _, cmd := range cmds { - list = list + cmd + ", " + case "meta": + var list string + for _, cmd := range cmds { + list = list + cmd + ", " + } + + fmt.Println("Enabled commands: ") + list = strings.TrimSuffix(list, ", ") + fmt.Println(list) + fmt.Println() + + default: + log.Error().Msg("Help entry not found!") + fmt.Println() } - - fmt.Println("Enabled commands: ") - list = strings.TrimSuffix(list, ", ") - fmt.Println(list) - fmt.Println() - - default: - log.Error().Msg("Help entry not found!") - fmt.Println() - } */ } From 12ad017b3945a108f02274b5c5f11ae7a7fd0859 Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Mon, 31 Jan 2022 03:08:08 -0800 Subject: [PATCH 24/31] Broken: wrath of Dillinger --- src/eros/eros.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/eros/eros.go b/src/eros/eros.go index 45530d9..6dc933a 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -24,11 +24,6 @@ import ( "github.com/prologic/bitcask" "github.com/rs/zerolog/log" - structs "protomolecule/src/eros/structs" - "github.com/labstack/echo/middleware" - "github.com/labstack/echo" - "net/http" - "fmt" ) @@ -261,7 +256,7 @@ func Backup(path string) error { } return nil } - +/* // Hypnosis - retrieve new exploits/attacks from a remote http repository func Hypnosis(repo string) { @@ -357,7 +352,7 @@ func FinalizeExploit(bigidea Exploit) *Exploit { bigidea.mu = &sync.RWMutex{} return &bigidea } - +*/ // Known - check if an exploit is present in the database func Known(Addr string) bool { if DB["exploits"].Has([]byte(Addr)) { @@ -381,4 +376,4 @@ func Flashback(Addr string) (Exploit, error) { json.Unmarshal(bytes, &member) return member, err -} \ No newline at end of file +} From 3e72e21fabf9261c9b180df9672d2886277ab5d2 Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Sat, 20 Aug 2022 19:07:54 -0700 Subject: [PATCH 25/31] Fix: various things stopping us from building --- cmd.go | 2 +- go.mod | 43 +++++++++----- go.sum | 115 ++++++++++++++++++++----------------- main.go | 2 +- src/arboghast/arboghast.go | 2 +- src/wrath/wrath.go | 12 ++-- 6 files changed, 99 insertions(+), 77 deletions(-) diff --git a/cmd.go b/cmd.go index d4c970d..31f313a 100644 --- a/cmd.go +++ b/cmd.go @@ -2,7 +2,7 @@ package main import ( "fmt" - cli "git.tcp.direct/tcp.direct/go-prompt" + cli "git.tcp.direct/Mirrors/go-prompt" . "github.com/logrusorgru/aurora" "github.com/rs/zerolog" "github.com/rs/zerolog/log" diff --git a/go.mod b/go.mod index c009033..aaaf495 100644 --- a/go.mod +++ b/go.mod @@ -1,22 +1,37 @@ module protomolecule -go 1.16 +go 1.19 require ( - git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af - git.tcp.direct/tcp.direct/go-prompt v0.2.7-0.20210712015119-a962cc8abe10 - github.com/go-ole/go-ole v1.2.5 // indirect - github.com/godbus/dbus/v5 v5.0.4 // indirect + git.tcp.direct/Mirrors/go-prompt v0.3.0 + git.tcp.direct/kayos/prototooth v0.5.1 github.com/google/gopacket v1.1.19 - github.com/json-iterator/go v1.1.6 + github.com/json-iterator/go v1.1.12 github.com/logrusorgru/aurora v2.0.3+incompatible - github.com/mattn/go-runewidth v0.0.10 // indirect - github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 // indirect github.com/prologic/bitcask v0.3.10 - github.com/rs/zerolog v1.21.0 - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/stretchr/testify v1.7.0 // indirect - golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - tinygo.org/x/bluetooth v0.3.0 + github.com/rs/zerolog v1.27.0 + tinygo.org/x/bluetooth v0.5.0 +) + +require ( + github.com/JuulLabs-OSS/cbgo v0.0.2 // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/mattn/go-tty v0.0.4 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/muka/go-bluetooth v0.0.0-20220819143208-8b1989180f4c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/term v1.1.0 // indirect + github.com/plar/go-adaptive-radix-tree v1.0.4 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 // indirect + golang.org/x/exp v0.0.0-20200228211341-fcea875c7e85 // indirect + golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 // indirect + golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect ) diff --git a/go.sum b/go.sum index 1b4394e..3b11534 100644 --- a/go.sum +++ b/go.sum @@ -11,10 +11,10 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af h1:+J2MfTQvW1DmX1HYIQUsrCd5l0Il9JMYTOowIs8ju1Y= -git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af/go.mod h1:kk4oyPgWq6Rijn30Js4ITQC5DFwmpyzWL3+8V6q9wdM= -git.tcp.direct/tcp.direct/go-prompt v0.2.7-0.20210712015119-a962cc8abe10 h1:P32iohMBsZcCaimaTqotr9MNa4jPun92zyKkbuBj9ow= -git.tcp.direct/tcp.direct/go-prompt v0.2.7-0.20210712015119-a962cc8abe10/go.mod h1:4E08LRVmW6/2cT0+PaglopcbBZ23bN9fquplcKCFnyQ= +git.tcp.direct/Mirrors/go-prompt v0.3.0 h1:4IXTCPeuMfoemcJ+riSuKQhAx1rJo5hTtuSkr/IFq+A= +git.tcp.direct/Mirrors/go-prompt v0.3.0/go.mod h1:x8Gs5SGQbFzTglOjiK16geOcdw1dVZas3HYkfx0o6ls= +git.tcp.direct/kayos/prototooth v0.5.1 h1:j/WOekGSZLGCt1gqLFAedWEooprTyxYEIyQKei4kcew= +git.tcp.direct/kayos/prototooth v0.5.1/go.mod h1:sRAZ69v83VhnR037/DylbPPBwKb5UCoqEurDFNum0fM= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/JuulLabs-OSS/cbgo v0.0.2 h1:gCDyT0+EPuI8GOFyvAksFcVD2vF4CXBAVwT6uVnD9oo= @@ -29,6 +29,7 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgould/http v0.0.0-20190627042742-d268792bdee7/go.mod h1:BTqvVegvwifopl4KTEDth6Zezs9eR+lCWhvGKvkxJHE= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -38,6 +39,7 @@ github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -58,12 +60,13 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -79,6 +82,7 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -116,15 +120,15 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -137,19 +141,18 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= -github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-tty v0.0.3 h1:5OfyWorkyO7xP52Mq7tB36ajHDG5OHrmBGIS/DtakQI= -github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-tty v0.0.4 h1:NVikla9X8MN0SQAqCYzpGyXv0jY7MNl3HOWD2dkle7E= +github.com/mattn/go-tty v0.0.4/go.mod h1:u5GGXBtZU6RQoKV8gY5W6UhMudbR5vXnUe7j3pxse28= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -160,13 +163,15 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/muka/go-bluetooth v0.0.0-20200619025933-f6113f7141c5/go.mod h1:yV39+EVOWdnoTe75NyKdo9iuyI3Slyh4t7eQvElUbWE= -github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 h1:p3srutpE8TpQmOUQ5Qw94jYFUdoG2jBbILeYLroQNoI= -github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/muka/go-bluetooth v0.0.0-20210812063148-b6c83362e27d/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0= +github.com/muka/go-bluetooth v0.0.0-20220819143208-8b1989180f4c h1:CTU9zYG49RMMVTZwRcC78uBJ5gGmvLSgQXCDn1n4jJY= +github.com/muka/go-bluetooth v0.0.0-20220819143208-8b1989180f4c/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -178,8 +183,8 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v1.2.0-beta.2 h1:L3y/h2jkuBVFdWiJvNfYfKmzcCnILw7mJWm2JQuMppw= -github.com/pkg/term v1.2.0-beta.2/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= +github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= +github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/plar/go-adaptive-radix-tree v1.0.4 h1:Ucd8R6RH2E7RW8ZtDKrsWyOD3paG2qqJO0I20WQ8oWQ= github.com/plar/go-adaptive-radix-tree v1.0.4/go.mod h1:Ot8d28EII3i7Lv4PSvBlF8ejiD/CtRYDuPsySJbSaK8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -196,13 +201,13 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.21.0 h1:Q3vdXlfLNT+OftyBHsU0Y445MD+8m8axjKgf2si0QcM= -github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= +github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -211,8 +216,8 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -234,7 +239,6 @@ github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -245,6 +249,7 @@ github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0 github.com/tidwall/redcon v1.4.0/go.mod h1:IGzxyoKE3Ea5AWIXo/ZHP+hzY8sWXaMKr7KlFgcWSZU= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -260,8 +265,9 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 h1:GIAS/yBem/gq2MUqgNIzUHW7cJMmx3TGZOrnyYaNQ6c= +golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -302,8 +308,8 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -312,9 +318,7 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -335,23 +339,23 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0 h1:g9s1Ppvvun/fI+BptTMj909BBIcGrzQ32k9FNlcevOE= -golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 h1:Sx/u41w+OwrInGdEckYmEuU5gHoGSL4QbDz3S9s6j4U= +golang.org/x/sys v0.0.0-20220818161305-2296e01440c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -375,7 +379,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -414,16 +417,20 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -tinygo.org/x/bluetooth v0.3.0 h1:xy6f1aCAA5VzaXcx+qs4od6ZpiNu6pa/ufnZP7Db2ss= -tinygo.org/x/bluetooth v0.3.0/go.mod h1:zg3FxlQIY6vtbtpK5dU8h5BzQiLoE3hGthXTR0GNEn0= +tinygo.org/x/bluetooth v0.5.0 h1:UftQTmx/snuTbeoS/R6+ZixmxSl5d6BvyfxlmD8eDng= +tinygo.org/x/bluetooth v0.5.0/go.mod h1:3rm7IKtmhP7aU2XRJI/Ods3J9Lqc3BAPPTNZmTtb42Q= +tinygo.org/x/drivers v0.14.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= tinygo.org/x/drivers v0.15.1/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= +tinygo.org/x/drivers v0.16.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= +tinygo.org/x/drivers v0.20.0/go.mod h1:uJD/l1qWzxzLx+vcxaW0eY464N5RAgFi1zTVzASFdqI= +tinygo.org/x/tinyfont v0.2.1/go.mod h1:eLqnYSrFRjt5STxWaMeOWJTzrKhXqpWw7nU3bPfKOAM= +tinygo.org/x/tinyfs v0.1.0/go.mod h1:ysc8Y92iHfhTXeyEM9+c7zviUQ4fN9UCFgSOFfMWv20= +tinygo.org/x/tinyterm v0.1.0/go.mod h1:/DDhNnGwNF2/tNgHywvyZuCGnbH3ov49Z/6e8LPLRR4= diff --git a/main.go b/main.go index 50103c0..ec82876 100644 --- a/main.go +++ b/main.go @@ -84,7 +84,7 @@ func cliFlags() { } func sigHandler() { - c := make(chan os.Signal) + c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) for { select { diff --git a/src/arboghast/arboghast.go b/src/arboghast/arboghast.go index 161bfdd..9a702e9 100644 --- a/src/arboghast/arboghast.go +++ b/src/arboghast/arboghast.go @@ -38,7 +38,7 @@ func NewEntropicFuzzer() *Fuzzy { mutex := &sync.Mutex{} ad := projVars.ScanAdapter.DefaultAdvertisement() - ad.Configure(options) + ad.Configure(*options) return &Fuzzy{ config: options, diff --git a/src/wrath/wrath.go b/src/wrath/wrath.go index 17900c1..868d987 100644 --- a/src/wrath/wrath.go +++ b/src/wrath/wrath.go @@ -34,7 +34,7 @@ func targetPicture() bluetooth.MAC { } */ -func Start() { +func Start(targetUUID bluetooth.UUID) { var sublog zerolog.Logger @@ -56,7 +56,7 @@ func Start() { // Scan for NUS peripheral. log.Info().Msg("Scanning...") err = projVars.ScanAdapter.Scan(func(adapter *bluetooth.Adapter, foundDevice bluetooth.ScanResult) { - if !foundDevice.AdvertisementPayload.HasServiceUUID() { + if !foundDevice.AdvertisementPayload.HasServiceUUID(targetUUID) { return } @@ -64,7 +64,7 @@ func Start() { err := projVars.ScanAdapter.StopScan() if err != nil { // Unlikely, but we can't recover from this. - log.Error().Err(err). + log.Panic().Err(err). Msg("failed to stop scan") } }) @@ -92,7 +92,7 @@ func Start() { // Connected. Look up the Nordic UART Service. sublog.Info().Msg("Discovering services...") - services, err := device.DiscoverServices([]bluetooth.UUID{serviceUUID}) + services, err := device.DiscoverServices([]bluetooth.UUID{targetUUID}) if err != nil { log.Error().Err(err). Msg("Failed to discover the Nordic UART Service") @@ -100,8 +100,8 @@ func Start() { } service := services[0] - // Get the two characteristics present in this service. - chars, err := service.DiscoverCharacteristics([]bluetooth.UUID{rxUUID, txUUID}) + // Discover all characteristics (we'll filter later) + chars, err := service.DiscoverCharacteristics([]bluetooth.UUID{}) if err != nil { log.Error().Err(err). Msg("Failed to discover RX and TX characteristics") From 7042dfb8d9c9d013be8710061655bc0cba515080 Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Sun, 30 Apr 2023 03:38:45 -0700 Subject: [PATCH 26/31] Docs: fix comments --- src/vars/projVars.go | 42 +++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/src/vars/projVars.go b/src/vars/projVars.go index c232185..93ecb28 100644 --- a/src/vars/projVars.go +++ b/src/vars/projVars.go @@ -1,44 +1,40 @@ -package projVars +package common import ( "flag" bluetooth "git.tcp.direct/kayos/prototooth" - "github.com/rs/zerolog" ) -//The initial list of device in the area -var ScanList map[string]string +type Config struct { +} var InitResults []string -// Place holder for -// File with list of all known Manufacturers -// is probably unneeded***** +// ManuFile is a place holder for a file with list of all known Manufacturers +// this is actually stored by eros and likely deprecated. var ManuFile = "./ManufUUID.json" -//var to hold service UUIDs -var SrvcUUID bluetooth.UUID - +// AdapterInUse TODO: use this or refactor it var AdapterInUse = *&bluetooth.Adapter{} var AttackMode bool = false var TrackingMode bool = false -//var SrvcUUIDList map[uint32]string +// var SrvcUUIDList map[uint32]string -//hold the values for the initial ble scan results.. +// ScanResChan hold the values for the initial ble scan results.. // ... i.e. the mac and broadcast name string -var C = make(chan bluetooth.ScanResult) +var ScanResChan = make(chan bluetooth.ScanResult) -//the BLE adapter --duh -//var Adapter = bluetooth.DefaultAdapter +// ScanAdapter the BLE adapter --duh +// var Adapter = bluetooth.DefaultAdapter var ScanAdapter = bluetooth.DefaultAdapter var AttackAdapter = bluetooth.DefaultAdapter -//Device to be targeted --not fully implemented -//var Target = flag.String("t", "00:00:00:00:00:00", "Target device to attack") +// DFlag Device to be targeted --not fully implemented +// var Target = flag.String("t", "00:00:00:00:00:00", "Target device to attack") var DFlag = flag.Bool("d", false, "global debug logging and pretty printing") var AFlag = flag.Bool("a", false, "attack mode") var TFlag = flag.Bool("t", false, "device tracking mode") @@ -47,17 +43,9 @@ var WAFlag = flag.String("w", "00:00:00:00:00:00", "MAC address of target") var Debug bool = false -//flag.Parse() - -//var attacker bluetooth.Addresser - -var log *zerolog.Logger - -//Service UUIDs for testing +// SonosScanTest Service UUIDs for testing var SonosScanTest = bluetooth.New16BitUUID(0xfe07) var AppleScanTest = bluetooth.New16BitUUID(0x004c) -//var ServiceUUID16Out - -//target to attack with wrath +// WrathTarget target to attack with wrath var WrathTarget = bluetooth.Address{} From 5892355417d4efd578fa49d37b5d8c3b4d77bb44 Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Sun, 30 Apr 2023 03:38:55 -0700 Subject: [PATCH 27/31] Chore: deps --- go.mod | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index aaaf495..c86fab7 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,9 @@ go 1.19 require ( git.tcp.direct/Mirrors/go-prompt v0.3.0 git.tcp.direct/kayos/prototooth v0.5.1 - github.com/google/gopacket v1.1.19 - github.com/json-iterator/go v1.1.12 - github.com/logrusorgru/aurora v2.0.3+incompatible + github.com/google/gopacket latest + github.com/json-iterator/go latest + github.com/logrusorgru/aurora latest github.com/prologic/bitcask v0.3.10 github.com/rs/zerolog v1.27.0 tinygo.org/x/bluetooth v0.5.0 From e4f9223fb4d91b91a395756bd534eece01b6393c Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Sun, 30 Apr 2023 04:18:34 -0700 Subject: [PATCH 28/31] Refactor: overhaul program configuration system --- cmd.go | 40 ++++++++------- main.go | 18 +------ src/arboghast/arboghast.go | 8 +-- src/config/config.go | 99 ++++++++++++++++++++++++++++++++++++++ src/eros/eros.go | 63 +++++++++++++----------- src/vars/projVars.go | 51 -------------------- src/wrath/wrath.go | 11 +++-- 7 files changed, 170 insertions(+), 120 deletions(-) create mode 100644 src/config/config.go delete mode 100644 src/vars/projVars.go diff --git a/cmd.go b/cmd.go index 31f313a..fdcb382 100644 --- a/cmd.go +++ b/cmd.go @@ -2,17 +2,20 @@ package main import ( "fmt" + "os" + "strconv" + "strings" + cli "git.tcp.direct/Mirrors/go-prompt" . "github.com/logrusorgru/aurora" "github.com/rs/zerolog" "github.com/rs/zerolog/log" - "os" + "protomolecule/src/eros" - "strconv" - //"protomolecule/src/wrath" + + // "protomolecule/src/wrath" + projVars "protomolecule/src/config" "protomolecule/src/deimos" - projVars "protomolecule/src/vars" - "strings" ) var suggestions = []cli.Suggest{ @@ -95,16 +98,17 @@ func executor(cmd string) { os.Exit(0) case "debug": - if projVars.Debug { + switch log.Logger.GetLevel() { + case zerolog.DebugLevel: zerolog.SetGlobalLevel(zerolog.InfoLevel) - projVars.Debug = false log.Info(). Msg("Debug mode turned " + Sprintf(BrightRed("OFF\n").Bold())) - } else { + case zerolog.InfoLevel: zerolog.SetGlobalLevel(zerolog.DebugLevel) - projVars.Debug = true log.Debug(). Msg("Debug mode turned " + Sprintf(BrightGreen("ON\n").Bold())) + default: + return } case "eros": @@ -136,7 +140,7 @@ func executor(cmd string) { log.Info(). Str("Name", fromEros.Name). Str("Addr", fromEros.Addr). - Str("ManuF", fromEros.Manufacturer). //needs to be changed back to fromEros.Manufacturer + Str("ManuF", fromEros.Manufacturer). // needs to be changed back to fromEros.Manufacturer Int16("Current_RSSI", fromEros.RSSIlast). Int("Service_Count", len(fromEros.Services)). Msg("EROS_RECALL") @@ -167,7 +171,7 @@ func executor(cmd string) { println() } - projVars.ManuFile = args[1] + projVars.GlobalConfig.ManuFile = args[1] eros.ManufLoad() case "adapter": @@ -212,11 +216,11 @@ func executor(cmd string) { if len(args) > 2 { switch args[2] { case "tracking": - projVars.TrackingMode = true - projVars.AttackMode = false + *projVars.GlobalConfig.CooleanFlags.Tracking = true + *projVars.GlobalConfig.CooleanFlags.Attack = false case "attack": - projVars.TrackingMode = false - projVars.AttackMode = true + *projVars.GlobalConfig.CooleanFlags.Tracking = false + *projVars.GlobalConfig.CooleanFlags.Attack = true default: // getHelp(getArgs(args)) log.Error().Msg("unknown sub command: " + args[2]) @@ -259,7 +263,7 @@ func executor(cmd string) { case "clear": print("\033[H\033[2J") - //termenv.ClearScreen() + // termenv.ClearScreen() default: log.Error().Msg("unknown command: " + cmd) @@ -304,14 +308,14 @@ func StartCLI() { executor, completer, cli.OptionPrefix("ProtoMolecule"+"> "), - //cli.OptionPrefixBackgroundColor(cli.Black), + // cli.OptionPrefixBackgroundColor(cli.Black), cli.OptionPrefixTextColor(cli.Cyan), cli.OptionHistory(hist), cli.OptionSuggestionBGColor(cli.Black), cli.OptionSuggestionTextColor(cli.White), cli.OptionSelectedSuggestionBGColor(cli.Black), cli.OptionSelectedSuggestionTextColor(cli.Cyan), - //prompt.OptionLivePrefix + // prompt.OptionLivePrefix cli.OptionTitle("ProtoMolecule"), ) diff --git a/main.go b/main.go index ec82876..a782afa 100644 --- a/main.go +++ b/main.go @@ -63,24 +63,10 @@ func loginit() { func cliFlags() { flag.Parse() - - if *projVars.AFlag { - projVars.AttackMode = true - } - - if *projVars.DFlag { - projVars.Debug = true + if *projVars.GlobalConfig.CooleanFlags.Debug { zerolog.SetGlobalLevel(zerolog.DebugLevel) } - - if *projVars.TFlag { - projVars.TrackingMode = true - } - - if *projVars.MFlag != "0" { - projVars.ManuFile = *projVars.MFlag - manufLoad = true - } + manufLoad = *projVars.GlobalConfig.StringFlags.MACVendorFile != "" } func sigHandler() { diff --git a/src/arboghast/arboghast.go b/src/arboghast/arboghast.go index 9a702e9..32e4b92 100644 --- a/src/arboghast/arboghast.go +++ b/src/arboghast/arboghast.go @@ -2,9 +2,11 @@ package arboghast import ( - bluetooth "git.tcp.direct/kayos/prototooth" - projVars "protomolecule/src/vars" "sync" + + bluetooth "git.tcp.direct/kayos/prototooth" + + projVars "protomolecule/src/config" ) type Circus struct { @@ -37,7 +39,7 @@ func NewEntropicFuzzer() *Fuzzy { } mutex := &sync.Mutex{} - ad := projVars.ScanAdapter.DefaultAdvertisement() + ad := projVars.GlobalConfig.GetScanAdapter().DefaultAdvertisement() ad.Configure(*options) return &Fuzzy{ diff --git a/src/config/config.go b/src/config/config.go new file mode 100644 index 0000000..c10f1ad --- /dev/null +++ b/src/config/config.go @@ -0,0 +1,99 @@ +package common + +import ( + "flag" + + bluetooth "git.tcp.direct/kayos/prototooth" +) + +type Mode uint32 + +const ( + ModeNone Mode = iota + ModeScan + ModeTrack + ModeAttack +) + +func (m Mode) String() string { + return [...]string{"None", "Track", "Attack"}[m] +} + +// Tooth is a bluetooth adapter. +type Tooth struct { + ID int + Usecase Mode + *bluetooth.Adapter +} + +type Config struct { + // ManuFile is a place holder for a file with list of all known Manufacturers + // this is actually stored by eros and likely deprecated. + ManuFile string + Teeth []*Tooth + + CooleanFlags struct { + Debug *bool + Attack *bool + Tracking *bool + } + StringFlags struct { + MACVendorFile *string + MACTarget *string + } +} + +func (c *Config) GetScanAdapter() *bluetooth.Adapter { + if len(c.Teeth) == 1 { + return c.Teeth[0].Adapter + } + var choice *bluetooth.Adapter + for _, v := range c.Teeth { + if v.Usecase == ModeScan || v.Usecase == ModeTrack { + choice = v.Adapter + break + } + } + return choice +} + +var DefaultConfig = Config{ + ManuFile: DefManuFile, + Teeth: []*Tooth{ + &Tooth{ + ID: 0, + Usecase: ModeNone, + Adapter: bluetooth.DefaultAdapter, + }, + }, + CooleanFlags: struct { + Debug *bool + Attack *bool + Tracking *bool + }{ + Debug: flag.Bool("d", false, "global debug logging and pretty printing"), + Attack: flag.Bool("a", false, "attack mode"), + Tracking: flag.Bool("t", false, "device tracking mode"), + }, + + StringFlags: struct { + MACVendorFile *string + MACTarget *string + }{ + MACVendorFile: flag.String("m", DefManuFile, "json file with manufacturer identifying data to preload into eros"), + MACTarget: flag.String("w", "00:00:00:00:00:00", "MAC address of target"), + }, +} + +const DefManuFile = "./ManufUUID.json" + +// Service UUIDs for testing +var ( + SonosScanTest = bluetooth.New16BitUUID(0xfe07) + AppleScanTest = bluetooth.New16BitUUID(0x004c) + GlobalConfig *Config +) + +func init() { + GlobalConfig = &DefaultConfig +} diff --git a/src/eros/eros.go b/src/eros/eros.go index 6dc933a..1f235af 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -5,26 +5,26 @@ // Raw Advertisement Packet (Advertisement) // Services UUIDs (Services) -// TODO: -// Output to report +// TODO: // +// Output to report package eros import ( "bufio" - jsoniter "github.com/json-iterator/go" "os" - projVars "protomolecule/src/vars" "strconv" "strings" "sync" "time" + jsoniter "github.com/json-iterator/go" + + projVars "protomolecule/src/config" + bluetooth "git.tcp.direct/kayos/prototooth" "github.com/prologic/bitcask" "github.com/rs/zerolog/log" - - ) var ( @@ -39,7 +39,7 @@ var ( err error Manufacturers ManufData - Exploits Exploit + // Exploits Exploit // DataDir - should be defined by config or cmd flag DataDir string = "./.eros-data/" @@ -82,7 +82,7 @@ func (d *Device) ConnectHandler(target bluetooth.Addresser, c bool) { // ManufLoad loads data from a json file containing UUID manufacturer associations func ManufLoad() { - path := projVars.ManuFile + path := *projVars.GlobalConfig.StringFlags.MACVendorFile var uuid bluetooth.UUID log.Info(). @@ -107,7 +107,7 @@ func ManufLoad() { utmp, err := strconv.ParseUint(mf.UString, 0, 16) if err != nil { - log.Fatal().Str("file", projVars.ManuFile). + log.Fatal().Str("file", path). Str("string", mf.UString). Err(err).Msg("MANUFACTURER_PARSE_ERROR") } @@ -118,8 +118,8 @@ func ManufLoad() { log.Debug(). Str("Manufacturer", mf.Name). Str("UUID_String", mf.UString). - //Interface("UUID_Type", uuid). - //Str("Website", mf.Website). + // Interface("UUID_Type", uuid). + // Str("Website", mf.Website). Msg("LOADED_MANUFACTURER_DATA") mf.UString = "" @@ -142,7 +142,7 @@ func ManufLoad() { log.Debug().Str("Manufacturer", mf.Name). Int("UUID_Count", len(mf.UUIDs)). - //Interface("UUIDs", mf.UUIDs). + // Interface("UUIDs", mf.UUIDs). Msg("EXISTING_MANUFACTURER_FOUND") } @@ -182,12 +182,19 @@ func Awaken() { } } +func logErr(err error) { + if err != nil { + log.Error().Err(err). + Msg("EROS_DATABASE_ERROR") + } +} + // Slumber - Clean up database entries, sync them to persistent storage, and safelty close the database. func Slumber() { for _, db := range DB { - db.Merge() - db.Sync() - db.Close() + logErr(db.Merge()) + logErr(db.Sync()) + logErr(db.Close()) } } @@ -241,14 +248,16 @@ func Recall(Addr string) (Device, error) { return member, err } - json.Unmarshal(bytes, &member) + if err := json.Unmarshal(bytes, &member); err != nil { + log.Panic().Err(err).Msg("Failed to unmarshal device") + } return member, err } func Backup(path string) error { for _, db := range DB { - db.Merge() - db.Sync() + logErr(db.Merge()) + logErr(db.Sync()) err := db.Backup(path) if err != nil { return err @@ -256,6 +265,7 @@ func Backup(path string) error { } return nil } + /* // Hypnosis - retrieve new exploits/attacks from a remote http repository func Hypnosis(repo string) { @@ -267,7 +277,7 @@ func Hypnosis(repo string) { AllowMethods: []string{echo.GET, echo.HEAD, echo.PUT, echo.PATCH, echo.POST, echo.DELETE} //TODO: possibly trim the methods })) - // GET + // GET e.GET("/exploits", func(c echo.Context) error { // This will definitely need to be updated // Build request req, err := http.NewRequest("GET", repo, nil) @@ -289,7 +299,7 @@ func Hypnosis(repo string) { caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) - // Create client + // Create client client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{ @@ -308,7 +318,7 @@ func Hypnosis(repo string) { // Defer body close defer res.Body.Close() - // Late binding data from JSON + // Late binding data from JSON var exp Exploit // Decode JSON stream @@ -355,12 +365,9 @@ func FinalizeExploit(bigidea Exploit) *Exploit { */ // Known - check if an exploit is present in the database func Known(Addr string) bool { - if DB["exploits"].Has([]byte(Addr)) { - return true - } - - return false + return DB["exploits"].Has([]byte(Addr)) } + // Flashback - retrieve details for the named exploit/attack func Flashback(Addr string) (Exploit, error) { var err error @@ -374,6 +381,8 @@ func Flashback(Addr string) (Exploit, error) { return member, err } - json.Unmarshal(bytes, &member) + if err := json.Unmarshal(bytes, &member); err != nil { + log.Panic().Err(err).Msg("Failed to unmarshal exploit") + } return member, err } diff --git a/src/vars/projVars.go b/src/vars/projVars.go deleted file mode 100644 index 93ecb28..0000000 --- a/src/vars/projVars.go +++ /dev/null @@ -1,51 +0,0 @@ -package common - -import ( - "flag" - - bluetooth "git.tcp.direct/kayos/prototooth" -) - -type Config struct { -} - -var InitResults []string - -// ManuFile is a place holder for a file with list of all known Manufacturers -// this is actually stored by eros and likely deprecated. -var ManuFile = "./ManufUUID.json" - -// AdapterInUse TODO: use this or refactor it -var AdapterInUse = *&bluetooth.Adapter{} - -var AttackMode bool = false -var TrackingMode bool = false - -// var SrvcUUIDList map[uint32]string - -// ScanResChan hold the values for the initial ble scan results.. -// ... i.e. the mac and broadcast name string -var ScanResChan = make(chan bluetooth.ScanResult) - -// ScanAdapter the BLE adapter --duh -// var Adapter = bluetooth.DefaultAdapter -var ScanAdapter = bluetooth.DefaultAdapter - -var AttackAdapter = bluetooth.DefaultAdapter - -// DFlag Device to be targeted --not fully implemented -// var Target = flag.String("t", "00:00:00:00:00:00", "Target device to attack") -var DFlag = flag.Bool("d", false, "global debug logging and pretty printing") -var AFlag = flag.Bool("a", false, "attack mode") -var TFlag = flag.Bool("t", false, "device tracking mode") -var MFlag = flag.String("m", "0", "json file with manufacturer identifying data to preload into eros") -var WAFlag = flag.String("w", "00:00:00:00:00:00", "MAC address of target") - -var Debug bool = false - -// SonosScanTest Service UUIDs for testing -var SonosScanTest = bluetooth.New16BitUUID(0xfe07) -var AppleScanTest = bluetooth.New16BitUUID(0x004c) - -// WrathTarget target to attack with wrath -var WrathTarget = bluetooth.Address{} diff --git a/src/wrath/wrath.go b/src/wrath/wrath.go index 868d987..6ab73c6 100644 --- a/src/wrath/wrath.go +++ b/src/wrath/wrath.go @@ -4,8 +4,9 @@ import ( bluetooth "git.tcp.direct/kayos/prototooth" "github.com/rs/zerolog" "github.com/rs/zerolog/log" - projVars "protomolecule/src/vars" "tinygo.org/x/bluetooth/rawterm" + + projVars "protomolecule/src/config" ) //used for offensive operations @@ -43,7 +44,7 @@ func Start(targetUUID bluetooth.UUID) { //TargetDevice, connectError := projVars.ScanAdapter.Connect(result.Address, bluetooth.ConnectionParams{}) // Enable BLE interface. - err := projVars.ScanAdapter.Enable() + err := projVars.GlobalConfig.GetScanAdapter().Enable() if err != nil { log.Error(). Err(err). @@ -55,13 +56,13 @@ func Start(targetUUID bluetooth.UUID) { var foundDevice bluetooth.ScanResult // Scan for NUS peripheral. log.Info().Msg("Scanning...") - err = projVars.ScanAdapter.Scan(func(adapter *bluetooth.Adapter, foundDevice bluetooth.ScanResult) { + err = projVars.GlobalConfig.GetScanAdapter().Scan(func(adapter *bluetooth.Adapter, foundDevice bluetooth.ScanResult) { if !foundDevice.AdvertisementPayload.HasServiceUUID(targetUUID) { return } // Stop the scan. - err := projVars.ScanAdapter.StopScan() + err := projVars.GlobalConfig.GetScanAdapter().StopScan() if err != nil { // Unlikely, but we can't recover from this. log.Panic().Err(err). @@ -83,7 +84,7 @@ func Start(targetUUID bluetooth.UUID) { } // Found a NUS peripheral. Connect to it. - device, err := projVars.ScanAdapter.Connect(foundDevice.Address, bluetooth.ConnectionParams{}) + device, err := projVars.GlobalConfig.GetScanAdapter().Connect(foundDevice.Address, bluetooth.ConnectionParams{}) if err != nil { sublog.Error().Err(err). Msg("Failed to connect") From 40b8acacdffef9af62f4f8b437c74a3719a9ea0d Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Sun, 30 Apr 2023 04:18:45 -0700 Subject: [PATCH 29/31] Chore: deps --- go.mod | 12 ++++++------ go.sum | 13 +++++++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index c86fab7..9f30215 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,9 @@ go 1.19 require ( git.tcp.direct/Mirrors/go-prompt v0.3.0 git.tcp.direct/kayos/prototooth v0.5.1 - github.com/google/gopacket latest - github.com/json-iterator/go latest - github.com/logrusorgru/aurora latest + github.com/google/gopacket v1.1.19 + github.com/json-iterator/go v1.1.12 + github.com/logrusorgru/aurora v2.0.3+incompatible github.com/prologic/bitcask v0.3.10 github.com/rs/zerolog v1.27.0 tinygo.org/x/bluetooth v0.5.0 @@ -30,8 +30,8 @@ require ( github.com/plar/go-adaptive-radix-tree v1.0.4 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect - golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 // indirect + golang.org/x/crypto v0.7.0 // indirect golang.org/x/exp v0.0.0-20200228211341-fcea875c7e85 // indirect - golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 // indirect - golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/term v0.6.0 // indirect ) diff --git a/go.sum b/go.sum index 3b11534..e5e64e5 100644 --- a/go.sum +++ b/go.sum @@ -266,8 +266,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 h1:GIAS/yBem/gq2MUqgNIzUHW7cJMmx3TGZOrnyYaNQ6c= -golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -309,7 +309,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -348,10 +348,11 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 h1:Sx/u41w+OwrInGdEckYmEuU5gHoGSL4QbDz3S9s6j4U= -golang.org/x/sys v0.0.0-20220818161305-2296e01440c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= From 7347a53374f4b6a122cd3a43d945ca04d9191589 Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Sun, 30 Apr 2023 04:18:53 -0700 Subject: [PATCH 30/31] Chore: tidy up --- main.go | 29 ++++----------- src/blueStuff/blueStuff.go | 4 +-- src/protogen/ble_scan.go | 74 ++++++++++++++++++++------------------ src/wrath/wrath.go | 6 ++-- 4 files changed, 52 insertions(+), 61 deletions(-) diff --git a/main.go b/main.go index a782afa..7f59353 100644 --- a/main.go +++ b/main.go @@ -3,15 +3,14 @@ package main import ( "flag" "os" - "os/exec" "os/signal" + "syscall" + "time" + + projVars "protomolecule/src/config" "protomolecule/src/dust" "protomolecule/src/eros" "protomolecule/src/protogen" - projVars "protomolecule/src/vars" - "runtime" - "syscall" - "time" "github.com/rs/zerolog" "github.com/rs/zerolog/log" @@ -23,17 +22,6 @@ var ( BuildDate string ) -func handleExit() { - if runtime.GOOS == "windows" { - return - } - - rawModeOff := exec.Command("/bin/stty", "-raw", "echo") - rawModeOff.Stdin = os.Stdin - _ = rawModeOff.Run() - rawModeOff.Wait() -} - func loginit() { // setup json logfile // TODO: make this a command line argument @@ -78,14 +66,12 @@ func sigHandler() { log.Warn(). Msg("Interrupt detected, stopping scan...") for _, scan := range protogen.ScanMgr.Scans { - projVars.TrackingMode = false - projVars.AttackMode = false for _, dev := range scan.Device { if dev.Connected { - dev.Conn.Disconnect() + _ = dev.Conn.Disconnect() } } - scan.Stop() + _ = scan.Stop() } } } @@ -165,12 +151,11 @@ func bleScan() { scan = protogen.ScanMgr.NewScan() - //time.Sleep(30 * time.Millisecond) + // time.Sleep(30 * time.Millisecond) go dust.Must("Scan", scan.Start()) } func main() { - defer handleExit() defer eros.Slumber() StartCLI() } diff --git a/src/blueStuff/blueStuff.go b/src/blueStuff/blueStuff.go index 8e94514..3f52e90 100644 --- a/src/blueStuff/blueStuff.go +++ b/src/blueStuff/blueStuff.go @@ -11,6 +11,6 @@ import "git.tcp.direct/kayos/prototooth" func pathways(target bluetooth.ScanResult) { println("Discovery") - //device, err := projVars.ScanAdapter.Connect(bluetooth.ScanResult.Address, bluetooth.ConnectionParams{}) - //srvcs, err := projVars.ScanAdapter. + // device, err := projVars.GlobalConfig.GetScanAdapter().Connect(bluetooth.ScanResult.Address, bluetooth.ConnectionParams{}) + // srvcs, err := projVars.GlobalConfig.GetScanAdapter(). } diff --git a/src/protogen/ble_scan.go b/src/protogen/ble_scan.go index c424ff0..b1ad767 100644 --- a/src/protogen/ble_scan.go +++ b/src/protogen/ble_scan.go @@ -1,15 +1,17 @@ package protogen import ( - projVars "protomolecule/src/vars" + "sync" + "time" + + projVars "protomolecule/src/config" "github.com/rs/zerolog" "github.com/rs/zerolog/log" + "protomolecule/src/eros" bluetooth "git.tcp.direct/kayos/prototooth" - "sync" - "time" ) // ScanMgr will keep track of concurrently running scans @@ -26,7 +28,6 @@ var ScanMgr *Meta // In these examples we are sending an instance of a struct with some data to eros; allowing it to finish filling out the rest // This can be done with just structs, but becomes problematic when trying to refer to them later // -//TODO: implement Mutex locking from sync in most of these structs to prevent concurrent read/write operations from causing a race w̶a̶r̶ condition // ref: https://gobyexample.com/mutexes // ref: https://golang.org/pkg/sync/#Mutex // ref: https://www.geeksforgeeks.org/mutex-in-golang-with-examples/ @@ -95,18 +96,18 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc addr := result.Address.String() lname := result.LocalName() - //adbytes := payload.Bytes() + // adbytes := payload.Bytes() rssi := result.RSSI EnumedManuf := "" // TODO: probably make this a function or a method in eros(?) // - //---attempts to set the manufacturer value---- - //range through the uuids in the payload and compare - //known manufacturers list + // ---attempts to set the manufacturer value---- + // range through the uuids in the payload and compare + // known manufacturers list uuids := payload.ServiceUUIDOut() for range uuids { - //for every element within the manufacturers list + // for every element within the manufacturers list // check each UUID for _, man := range eros.Manufacturers.Entries { // pull the UUID the current element of the manufacturer list @@ -114,7 +115,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc // for each manufacturer's UUID: compare the advertisment payload for a match for _, manusss := range currManufErosOut { manufBool := payload.HasServiceUUID(manusss) - //if there is a UUID match then assign the Manufacturer's name + // if there is a UUID match then assign the Manufacturer's name // to the output variable EnumedManuf if manufBool == true { EnumedManuf = man.Name @@ -125,11 +126,13 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc } - //ManufOut := ManfCheck(payload) + // ManufOut := ManfCheck(payload) layToRest := func(dev *eros.Device) { sublog.Debug().Msg("Storing data with Eros") - eros.Remember(dev) + if err := eros.Remember(dev); err != nil { + log.Warn().Err(err).Msg("EROS_REMEMBER_FAILURE") + } // simple eros test fromEros, err := eros.Recall(addr) @@ -140,7 +143,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc log.Info(). Str("Name", fromEros.Name). Str("Addr", fromEros.Addr). - Str("ManuF", fromEros.Manufacturer). //needs to be changed back to fromEros.Manufacturer + Str("ManuF", fromEros.Manufacturer). // needs to be changed back to fromEros.Manufacturer Int16("Current_RSSI", fromEros.RSSIlast). Int("Service_Count", len(fromEros.Services)). Msg("EROS_RECALL") @@ -157,7 +160,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc Int16("RSSI", rssi).Logger() // Skipping duplicate results unless tracking mode enabled (to store RSSI as devices move) - if projVars.TrackingMode == false { + if !*projVars.GlobalConfig.CooleanFlags.Tracking { for _, dev := range s.Device { if addr == dev.Addr { return @@ -168,7 +171,8 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc // Upon finding new and valid info we update the time for last activity s.Activity = time.Now() dev := s.NewDevice(lname, addr, EnumedManuf, rssi) - projVars.ScanAdapter.SetConnectHandler(dev.ConnectHandler) + + projVars.GlobalConfig.GetScanAdapter().SetConnectHandler(dev.ConnectHandler) // Record all the services advertised, append them into the nested struct within Device for _, uuid := range uuids { @@ -180,7 +184,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc sublog.Info().Str("UUID", svc.UUID).Msg("SERVICE_DISCOVERED") } - if !projVars.AttackMode { + if !*projVars.GlobalConfig.CooleanFlags.Attack { layToRest(dev) return } @@ -193,7 +197,9 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc // TODO: make timeout values and intervals command line arguments instead of hard coding them timeout := bluetooth.NewDuration(time.Duration(3) * time.Second) interval := bluetooth.NewDuration(time.Duration(20) * time.Millisecond) - dev.Conn, connErr = projVars.ScanAdapter.Connect(result.Address, bluetooth.ConnectionParams{ConnectionTimeout: timeout, MinInterval: interval}) + + dev.Conn, connErr = projVars.GlobalConfig.GetScanAdapter(). + Connect(result.Address, bluetooth.ConnectionParams{ConnectionTimeout: timeout, MinInterval: interval}) if connErr != nil { sublog.Error().Err(connErr).Msg("CONNECT_ERROR") @@ -212,7 +218,7 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc return } - //ServBuf := make([]byte, 255) + // ServBuf := make([]byte, 255) Charbuf := make([]byte, 255) targetServices, err = dev.Conn.DiscoverServices(nil) @@ -220,15 +226,15 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc sublog.Error().Err(err).Msg("DISCOVER_SERVICE_ERROR") } - //for SerReadPos, srvcs := range targetServices { + // for SerReadPos, srvcs := range targetServices { for _, srvcs := range targetServices { charSer := eros.Service{ UUID: srvcs.String(), } sublog.Info().Str("Service UUID", charSer.UUID). - //Int("Bytes", SerReadPos). - //Str("Value", string(ServBuf[:SerReadPos])). + // Int("Bytes", SerReadPos). + // Str("Value", string(ServBuf[:SerReadPos])). Msg("GATT_SERVICE") sublog.Debug().Str("status", "Attempting to Retrieve Characteristic List").Msg("ADAPTER_STATUS") @@ -238,31 +244,31 @@ func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.Sc for _, char := range chars { ReadPos, _ := char.Read(Charbuf) - //flags := char.Flags + // flags := char.Flags sublog.Info().Str("UUID", char.UUID().String()). - //Int("Bytes", ReadPos). + // Int("Bytes", ReadPos). Str("Value", string(Charbuf[:ReadPos])). - //Bool("Read", flags.Read()). - //Bool("Write", flags.Write()). + // Bool("Read", flags.Read()). + // Bool("Write", flags.Write()). Msg("SERVICE_CHARACTERISTIC") } } // finished with this device - dev.Conn.Disconnect() + _ = dev.Conn.Disconnect() dev.Connected = false sublog.Info().Str("Adapter", "Successfully Disconnected From Target").Msg("ADAPTER_STATUS") layToRest(dev) - //TODO: stop scan and call bluestuff func and pass it the local name value + // TODO: stop scan and call bluestuff func and pass it the local name value } func (s *Scan) Stop() error { // TODO: fix this adapterId situation - err := projVars.ScanAdapter.StopScan() + err := projVars.GlobalConfig.GetScanAdapter().StopScan() if err != nil { return err } @@ -273,24 +279,24 @@ func (s *Scan) Start() error { s.Started = time.Now() // create list of devices in the Area of Operation - //log.Debug().Msg("Creating Device Map") + // log.Debug().Msg("Creating Device Map") // Enable BLE interface log.Debug().Msg("Enabling Adapter") - err := projVars.ScanAdapter.Enable() + err := projVars.GlobalConfig.GetScanAdapter().Enable() if err != nil { return err } - adapterId := projVars.ScanAdapter.ID + adapterId := projVars.GlobalConfig.GetScanAdapter().ID log.Info(). Str("ID", adapterId). - Bool("MODE_TRACK", projVars.TrackingMode). - Bool("MODE_ATTACK", projVars.AttackMode). + Bool("MODE_TRACK", *projVars.GlobalConfig.CooleanFlags.Tracking). + Bool("MODE_ATTACK", *projVars.GlobalConfig.CooleanFlags.Attack). Msg("Starting new ProtoMolecule BLE Scan") - err = projVars.ScanAdapter.Scan(s.resultHandler) + err = projVars.GlobalConfig.GetScanAdapter().Scan(s.resultHandler) if err != nil { return err } diff --git a/src/wrath/wrath.go b/src/wrath/wrath.go index 6ab73c6..ea77578 100644 --- a/src/wrath/wrath.go +++ b/src/wrath/wrath.go @@ -9,7 +9,7 @@ import ( projVars "protomolecule/src/config" ) -//used for offensive operations +// used for offensive operations /* func targetPicture() bluetooth.MAC { @@ -39,9 +39,9 @@ func Start(targetUUID bluetooth.UUID) { var sublog zerolog.Logger - //bluetooth.DefaultAdapter.Connect(targetPicture(), bluetooth.ConnectionParams{}) + // bluetooth.DefaultAdapter.Connect(targetPicture(), bluetooth.ConnectionParams{}) - //TargetDevice, connectError := projVars.ScanAdapter.Connect(result.Address, bluetooth.ConnectionParams{}) + // TargetDevice, connectError := projVars.GlobalConfig.GetScanAdapter().Connect(result.Address, bluetooth.ConnectionParams{}) // Enable BLE interface. err := projVars.GlobalConfig.GetScanAdapter().Enable() From 4b53941c6aaf770245b1f3129863eeba951cfeaf Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Thu, 2 Nov 2023 18:04:36 -0700 Subject: [PATCH 31/31] Fix[eros]: value too large --- src/eros/eros.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/eros/eros.go b/src/eros/eros.go index 1f235af..60c9359 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -175,7 +175,7 @@ func ManufLoad() { func Awaken() { DB = make(map[string]*bitcask.Bitcask) for _, name := range dbs { - DB[name], err = bitcask.Open(DataDir + name) + DB[name], err = bitcask.Open(DataDir+name, bitcask.WithMaxValueSize(1024*1024*1024)) if err != nil { panic(err.Error()) }