From b058911fb8840740144ed7730de04f87e035a7b9 Mon Sep 17 00:00:00 2001 From: Laan Tungir Date: Mon, 22 Sep 2025 13:13:30 -0400 Subject: [PATCH] Version v0.3.10 - fix truerng --- otp-arm64 | Bin 94296 -> 94296 bytes otp-x86_64 | Bin 105288 -> 105288 bytes otp.c | 295 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 291 insertions(+), 4 deletions(-) diff --git a/otp-arm64 b/otp-arm64 index fb1b857d6e055cec7c0e648a4d71ef68161fb183..13dde59262da69992fd4397a2a63640b7333df2f 100755 GIT binary patch delta 11305 zcmZu%3wRVowyv(pivUSTLIO!hIu9l=NhS|M0!a)*c!UI&U_jn0gW)A_ffWSTjN*cy zu$tnywyP3GLD9(7Xq2F`GK#LQuo}TDC@Rfkuk7j-R=5`sq3>Va(;;x3@0+*4?U`fHg!aLhAK>cJVV7-@5G*QSx?uIT9miq?-{r8$Av#dcEmm2yf1Ng z-|*eHJv^dq4fpq`nb6&8(5H%)H%X7uyO8QZ>4KZ2XXxLMo(oFX+$6o!mL9VzD$38r3d7L6jCC;8LEBTG=PZQA zre$z7gq8t3Aw&Rg2(<%zA#^OQZ?{zi>@miC^#|x(H9o>0B6J6D*-hW5DO?YsQq>*B zLdCUfrrlQN3#FB65m&=#r|RbZFgl`U@IV+{QSak=7_Cdc#`SPomoc5Q2s)DCj_`If z4PK^aoGIMbjdC&{;r?#)cIM+TYNRQ8{;Hv+F?Lrv-KxfOPb96*s^@AX9muLpQoD;o z5bNDNmodASPdHc$hS$o}9+cldm3w+pU4J+C_N2!C_1qgphx?bvrrn*7a9vz zDB9;tNDV}ZYrhzp0|VvwN+Sx37N)U46rFeGDKAobb^-TC)5Po|?uns|*-s{TV#G^m zCgT&vSiGt3i=om1wY6$5K@eH2SkYwDdaU@PO?%?R!#3@Y6B}(>j}s5tv>Hzb1{6j4 z;>9YP#d=fsf$k)|x0nl-iq5mp`N{3f^jGmF(8Ph}9Bdruj`Aglmd=KWw140{m#2>y zXtOYIC+Hgn?(fq%@QJRGUX8-*zW0R~nrO?EjN+;_lKD}axuAew)(=1i|&8A_z zJ;yZuU5-1$n<^g2V2{aVqKDbWQpJm%+G$jpYewuzuw=wAXYnUbDV-5(%uVHL8g0up zZGM`Yz!Appa!a@`jneXxZnxd{sN&fyxStI7lW%fgSH;Yr`DylQ@TQ9?wikhPG0CQV z8RAx(##ppGv)>Q%s<@g--QC!QnUwD?N$_Qg9jVsH0(O`X(RJ?8T+gKa?s-wZEb-5u zgVEBns5IXk=T~6KasFtIGv@j@^T%_KlRnLNaotH*@{=Sa79a;?Q+Yv>gee7O+>=dI zP$YZrabxdI480#KaLG*?UO1imvZzNJ_%v%_JJ~a$onxqzp z?NXFzr8GUwbJgmzfW9A!JY7i9WiB2lY%4E|M2w24x_l`Q6j6J5M!k2CP$Ddc>MmLX zRs4g3gBm1m2k%$*UK3-*;uXl`nu*3PKk49R8^u>lITcRsFQ$nVCEPohHdWlg1B2;o z#dz*5p<%Zm!lh)~Qk8^WVRh+lM$;eVu1e)zPWe?X?s3qJ zstm3>sIh9TJZrC1)x@11Xl(I=QuQcTqo=!=BGs|5%;tJ`(T-<*eaQ7S=+*7^JZEEyXzTyxW1lZBxKznGi`aJgvV~@ix#(lmeEDY6fdU(Q|F>{ zqyECZG4#slBCf~KsnJgE?M2rPZl&B~7WGT*TtUM;C%4^u~z~Y&sAp-UID1 zS4FbO?CdUyj#p!|_NJUMOQY0y@yE^<@w9VHrIdU(W(5z#(~KJP>8YBvT=E|S``apM&pNTTn4&7IGSDm9{2X6@9R;|^`q#CwbI`i0Bq}>6HVrUiEgf@(v^wz+>=UmlirE-#){?t zwicBcYHuo~-Ifr`(!@NlQT$r_%AZEnw>_Q^ND_Xq`(#>dw^g zWYD^)B`$x4_#Ps#I%Fz;5VT#!NS;jPK^YyJTE#t?ls0WV_hr(uX=Y5fO*5moZ<;y5 z7pF~@ajTnN&($p2J{_?srVk|`eA5v(9IZ2IQ@#Dg;j@ShDo)cE)hPy9PMl)_CvBVY zT9P+gC_b5iLt6@=D(f=S9|UF5%&)qNFZ|d=>?>}Y_1hH+_h-}L+cOgV*}@SFCqsE7 zGoOx8k>}Aqlr`)3JdjP>XO(e1n~u-III`P}S$A{ul)D2X7(fT^z_138qX9MUK+0~o zLmr!(8eH7xqV|T=B)>~2?0)m$n(*InqanxgQg_kWhAq<2`Z<$jFURJfSkIx-xs~#1 z_1tDz870m;#63Cm{k+$t*=_Spvj^s5b>eKEf4f|BV;2;0Uk)`cNZ@)7X$zd3<Uz4 zI#6IQzE-9e(3N|aHnKu7?K^X~LA6j!4$>TU%>bZpv#DMv+H4sM$}kR7<}DJtY? z>%M1spoAQanE6sFZG4$~hR}D7^$GeA@!WqQmkjb;J%LvbxP(J{DAoBAxTlQf`>*Ve+WT<8Rh@s3<#!B@`eHs zszP-e{2)9Eo!^kap!#Int0oQ2X$n~P#un9w2Vj8!14?d;|iN+cGVDvOE0 zptePiyral$n$v{hESu^8-fUWFf!2f*Bb+{LD&d|8GMZqx8eQ zZ41^wHf`LJk$~c=+et$U#R?7{7fmeCgZ6FNoq*cuixbuY_gj0eiFu>iHcDa_rOxvkH9pW-ew?9!S-_tHW zfiqwLCI1;ENDPhmb1nDB(4&8TJXMbo@*Vu2$E{4HA`?Bpe21iIMeRi+o-Bivw#FwX z<5U{dcI2sR3itG)BU`bed(p+MF0RH>X0ut*)HToJfmmv9uIGAeTlZ}n5KI@5AGr)~ z>i+568%J@^tmS$fJ^BoS8BhD3!JBArihkC7dmQoXld+xzG2mNkmdp{WiFEc^R5KYg zc6*Y9`P(z(P0eTDTtDfd*eXwYiSngw=k|qFtdBSb6`4K;$l5*)l`9hM@CY`^w2S+V zosjF>xp}ObJX~^wp>LD+^`(hBCUcfVFYTy`^(KiO(3We*l(J+pcHng;nR1>RAInn2 z{avNL6x#IM)C;H^0xCtfpb|`=87=cTOQ-!U zuSw?Wmue%t31;%opxG^h=$DuBq&R06O4)SUxNA(vIlQ~j;az{_o^*QZKX8_((}(}D zRF+_+FIVwEI<0%zEtxO9jDj4Gbrs8}>Z=k`|@O2~ZeCkcsdUvQR1XWOv3`cvHNMY2$+ejUrKAFY4AC^gVu{Oe0OGm7{J zX6H24{wXX_jJiYKS{!~Iwy%eXDY)>u!80g6 zwYNp)mg>KZmN|wVediOo>}KsdWZv5Zkc-1aBcNcP$N%`+Blx5FT z?_vAo)5Z5DOIh81Q}#9hvh4Rw+4}dNEkPyn$$uhV`A7vJ>@Ec_8yIOTL-jHTe3SMS zhz~#qH#)LOVcU!kIB%3yOi(9`70KCX4OJ}+@mT0UWh43AXQAS^kOhiFq21PN9yYC^ zJ_|#F=m=QP95*o1hN4<1+h(9Gef{Ad5QVmek1~{KR6z2r!0M}5P~dO<>CM0Gk=HXT zKgOaROxr$Ai1G~<3qKEzN*_%7KQ2neW%2(WHZMjFy#WI!^F5-Br4m>O) zz3spw92HdlL7W>UZOabgcFA8#>;8_r(INEI-=F9D5E}6b-sn)fe`3y!_K7(+)t@%Y z_<#4Q8UKkLX8iYcnDI~k%$%E*pP91b0L;zUL#Ax!q2{7Mp*Z=O>1~tz56y9#_6-$Z zgNBP83^(Fm+O!(qw)*fq%uAW523>3bn#8$~-n9q?LOatv-g= z$ZUG$n8`kT47(c{>}&HW`|E<-R_13yfv?zFf+5=mQxUe7BCdSeWjlElTK{#iEM+;p z{q?9uV}IsnSJ$x@uR55JS;#Nv`9k$&MgAjabqEl74Vek!#7hVl2Vu;leGW0#rco{4 zVbl0O)GV7;!^BL`EVy>2*);Bk-U5xj$~xE&R%d#HL!5LdEyGbu9)QqJg;wLX8MNnE`JLl^r9Hv3UkVOh+(}75F^%Fau-Nnx~?dc&d+O)rim z;9!O;`M&x)A-p+OXUxXF`p4k_lh+IK-#lovf&TLCy(3vq;rxFV_{$(;Q?So;D~j0hy~I-bqn_CBOPqAl97kVR zpY^hNPO#NI^sXL1%NHwV1e?n@YqKvEZks&x%i={l=%x5F7{ID3V#5e3IMKTi{|l_N?Rk2Oa+^ku9|AhKY0y`Kc%tjG znkXLY`i%brHr?>tS8TrFIY~Tp!*jBD5YLU~pu8!fA0A9PkRp;g>3$-ylTH=!HtkCj zy=*#=CZalNRdfe^-RX3(sOz(uA?9~|_GB&+4P6=DEHSI=v%kMN1Dyr~PBEpcT+bF0 zyFRmlq7KjIK$uIM`MW(Rm-xru+g?7oA)KE&&{p!Vg^Kb}+cV$SMDU?1{rh~vmJ6Y6 z;TOJ3Q--#mjZ@b4Y@D>>cXR8GIRr3+>+ZI}yOb?1t? z>hjrhz+bgMT`+saoYk|zfnde5<@Ye_GXe6IcdngVruKIi%~PwZ)B*k1{!YE)o>g;K z4vfSu9%ZSk4a*kGj_zExR9&`w)t&9Wbma>UZ>D4^&xJPj`RST*8kg@2fR}(z0DGWz zI0{sO1I}MFMgntzQ-Pif*Nip5F~3|ho&avXdd=7ayZ}53Ofg^w*eAp=QcxqUi7*Tg z@Rvx#@B;VtGz=ebbF^XjLs%p8#TZ5aj9tAA;}X!5Y#0T28BWPCj7dN*a24=%mtpJz zUdl0ygTRnN!#D@b1;*e;N-Z*sVqnN1!efoi2;JP2F`+yVRn_&zXem|>g-4)7R8Lz=#QO9JuRNI1WsyM|&WfjP{M#{ZCIbi~+!@(+y(`umiY2@@E*v zLqOk5!*~I>_qT@e5wLicVVnVmcwqoDJ>U+s2m0oqJ&?^sd*BQ6-~cdXfnl@)$1O69 z4xo22A_r^*HpX;E$4g)Ucxf370MFfp5dhb$GK?l*!S7%I7;~Rtd@gYVLI*s!(J=b- zU@Y*EVGIEd*@VyoKYGM4?ggHH6mtyB+JeZ*=f@1=0x);GVW>T^MqV?986!b_y&E0_ z=j_3VfqQ{|VD6ikGa%aw&w;!C0s}zx9m9x^!j$aOcIPV2%G|TpjAFShhKHxd0CMqN z0A7LQ;Ujq-d>;g_0w_N!zLW56J*y?o=w^2;Wci|g2cgeAH@2N6H)A!qi@XOWW&-57mfQ?g zO;E0amkaq!$e*x66^IzV^&zEsqrw~HY%#5Sq0)_ad6Um-twT zcAw;bRH8LYR7c>82Mr^Xvob# zEa?)6dm)cN9$C{xKC_GbX~?}Y&vcRB)kVHH3>mkFOhA@`ITNe9D0~eA9gtU8k+fFr zZ!87r;4hH>FcA(|a_`n2&E0v>11Xn@bmVQ=tzGP|=wiPjTxMJ-WZ|sA2u%n0#_Ju- zgn>&_kVh=JwW|1Irh@F?UdRiOAbnN`rh~T!J5a%U8uBK{Uyu$~MYXEKw{8e&{zC|# zXD$V%YQHa5!g>5mZ9_38bX^R#&q^#$6)gJE~gomz{0E?%L10&I*~i%GU( zs3WtCYaYuN+nHq?a{I1z$aGf!9gx>H*Q_=DmwqgU+;=bL!1ALtbokcE&A0KVq=NKg zGvr5+s++7u*3@hG)-AkQaDE~f0_=!oB}ynC`G9tJ37o1}uRSSo>L0XsN)$Igvr+r8 zL~$u0THjJ7IZxVLgY)9x4y1AHG`VnLvza$<DSZHS*-oGR7o6)qMq%=B<4^e(r zG__or$~`}{uPs*|4{Nl4c4`02(*9Yc>{fpE1b^;m|Df`t;IsV`%A>(&OPewK$CGD* zeEa8;mu}Ll9xL@Un1~X9FmTpCDLr6$*Yr zHRG|a)e^3NqLFI!BH>}-Dp)93j6eYeWd*-##TG2Ih&=ZD&)!`K{LJqM|1;;DIdkUB z%$c*39M^-7>%lFZp(Dy=N&Ji`=b!J4KHoRcx{1^#Z;$=;zUS}xFzm=PzK>RSUi~n1 z^PeU@TIyTGykR5#p@9wwLzrpC5oChYY4MfY_`1a}x{aSh_eI3_DM|=fQ*V=&6Ngl_ zq+@QAj-U@99b-vn-zJ?vKS1iXq>FBo&i186J`x`8miWVlp}8fgQ_>|`pYj^>%QPxA zo#`??2#^>NKw;DYP#K*_?bBmSk@UPIc^VGT59z(TGp;*W+ZOslNoHO~Wr{1@&-nH0 zrrCB$bPI(#6Fn4#_k?}&L9uU2D&CpUM>7g{bTj?!_(8A0Hrgx_UnRSVJ2tNd= z-c!9SN$TaV98w#m*e>Zks4y#qNj<4P%f*zQ)ST78lrTD+RVupnbUwq>FnZaU&fHW%wtI$o?>H8uNtF1!sZ$8%oPAV(wlvHoJsL;j}XQr8p^^zlm-l zM%^SS)>K!+sVt|iP7mhRI_;Q=pqv$|RNw^x# zAF)~fXzJP5mFSJ(Gr&?XcqRrvy{|YAkQN(J_{G_nnz5#qqv2 z3ln#OzGdR>xEm86n_FEe#q$VjoG{s%q(7dA+9uQl-rc6X2|UQA^#nSQ>tfy*x{_Ps zRQm*sdi(IKEa`bYL%OVIsF$&@KYSob;{tI?q_KI`PJbf*u5Y`;+)zY#PQp z@=W93N0P2u-i<|o>_K}qG~Z7)2je4I_I z3cuT?F&C}C9CvTQ5T+~C(}k0mMuo1@I5mxLND0i$Z-)sHUE&(fylJ%CH8WgI=l}T0 zik3H>$_mYSeh!wH=fBK(M&6uf;bPiZB+(6_+r#leFR|L%ab?i)e6Btgv2Ia>M#; z%lg6+)4H$3w7&d~TPA2)zfywKzl56>ap5!4n1 zTVGEL;%6e%%R+^@^XXhUqMc7k73of?fKP|USC&+A7w|o3>lqGiWiL#>fTmSEkf;~% z^+FUMNNjqldMz-fi_TUcV;53HWiIm+`l>2J5u`$@t$KiYim0P1y+JAFa!A0T`b&X{ z%I;!oQpJ1aX-^2%-kIAh_2A=$IyRQs-P?nApsgM0RO&)2sULLua>CqHl=VI;{ zs;$GNiPTz`&OEWSwl0Oai)j}?=}o8VN}0De#gA%W?l_t=Y7*1qXz!>x;d0DfF6N1+ zp?9IgNbqTQjh2}wfxh{Li%ESbel(6tIMt6f=elgPIoCHwn{z!j+MMg9(dO{k_2%%C z>&@Yt>#N00unR5R1ZV1@QcN*pAnQYAV@%h^1K`@iF_=ql>KFrO63KBl&SfIax_gpv zbT?XXG`rzLrX#$viOD#q=b)G8RjfO!eb-Mk|qg{ttmo zWrkWwrqp}lqW#HyCfF#01Lw+p2i4y5LYyaod%+fKT@ny=BH_@5drXhx8(qu~#YRjq z$+x7jQf6ujb&O9>)RT}d9Buydfny|L>jxG#g)WRA&fKX~H6b?+H|I;xKngT#JX1qb zXvu`qT(`o{LIhT)Naf2x+r^CFiBxXM=)?pR$7z&0aWqrY=)s9*OxI2{qqu9Lxxkku zHj22_PikO#8m*s%*p$#-0SMnD#0?khCYjS|DiO?MO{Ya`#~fUAd30(Ht{GglbFsNml+4}E)I6%6XEN8$ z!|}_aPv&ibif`ouGZ|A0>D>HM0of0kF!dpLQRt(GQdoq$h^IZSlC)1160-z05M>E}#XE;ouaI_LwWv8_*p2 zbDI8uYzRH}ShCRXzSxy%SuXfFeLbM>wDf%o7f)eM$;Czf7Bi4k7Z+bLChc+Ao3CB+ zy6DQ|4>bE-eBw9eX@hDZZ?tFzyJi3|w%OHN$bGiVZ^^utOex}mq z51_Ky(f-I-98_oawB6XH&GaTu+A`p9$)U&AZEwgREo@Ukv+|1NZK7uwZ@&I7GuO#2HR z#@i)D;#mQmcJUx_Y?Uifk$IfW^2$8MqGh~Lq^?dZl^E|~vsA{_Zk`5wfnED8-XB!i z(-3NRbu(_932adr&lC@?u4H~jZ>}zh_B*%^i507M$rI!|xB6i@6dO$uC8np?H|Lq1 zvdE@+Ehx^is2-qX(SiVIEx0j)X>Us@le&@70>j;?iX%-T{cwDlgwQ2`KZH`B!yd?@ zmCvQep}6XC+R%crgRSeLMe>BwuIIMIp>{g@RbYdA17{BF8RlC>acqbh#z#SBR-_r& zsn~F)kM1)5hTuDfR)|_k6}wjt;~NBT{EgcYYu3wm=68pf$kH7zR*Mg{OE2OMa8lCm zQG$fi(BIcFcQ`%!`xjEY;aq%)|Kn636Di0?QnVDybG{6$k~w2Nmd>q1HKWj|^@##ztxp&4 zHJ^TQ^QMPlySV8EijTI9>zju7d-D@e5$PjG)b^>UT#;x8he+d0yLjc;2)VwVnb)ex z!&65$jBV0tJdNGZ$o%p2=7u5BN&?>iZLxPusXu{?4fvetLwT=`j`sKAPjr>4iL~m~ z#%Mfb%({i0L>FG28I5<0kvG|$5-N>3uT2u4%6nfMF21@WHpYp%BYUG+cZ}NDAnJ~_ z8;69W&PYYifd9#KZX>QfyidHo80D1j<=0U+cv2{$4V7RlO>UdX{3*1%?OnlK_-0** z5^G*L>2zOPKf3y6fe`0yLMfXsb@>Xh6yba>OBnUqQ|{}Fe2D((H_1EK^gdus^u zq|%bNT!Q)LTPQeF>FitoX8u$<^>(YU)7;+5^i)cH2e-FEW8ZNFc@(~b(%vZ&?T&Yv z1Z2GXZvpYXqs*U1=X^L^85Fa*L=+0Oo3YK3XxZkH6i){K?lZA6GXFoU&ez!cXRtvr z>rU}@ad*~>FxK@nIFveo(uP6@kI249`ax^E!cu>hbM_GDdD=4Hw7e} zGD^SQTd-RZzAbTyo^0zT4{lq2+|cd}tZ%36MxEGkLrX!KWZw6|ZS$bzvb8*Ew8Ykm zmvd-W2X6f|I%e~b`%&g>MS+$>;{pD@L|gHZo<)vrN15K2PHb~BHJ2RQ)17)Q&xLKV zU;Ds*22eajirL6`eKKd|?L(usCo*iWS=*m>dGh$BV~Eoki8FX-&DS@s@NwrtP3QWPQw|Au%KA`=8j56Sq}z)agE9d9z=n>6a5k3d`J9Lc26 zH~AyRn$cIabh`Nq%|sKd2QWw~GTROmHo^u|11P%#D0zx_vE5fO@0#{tHGn}DIy`|k z^9NAY11S2Yqc5G@`x`{TH*H_K9DxEzd=v!6D&ge+OBQYW%U1C^vtU2=Y(HANKQ3JD z$D58=v-0+%-TO;Y@M8Sm!{)olq4!|mbfLX0ehc&N3+Q^-$$YI@ru;Z^9AO{-=6BxtzUDdAcCGn>|< zduXVy#PywJt5zy5Jfv;@s}5nDK70)}_T-mlkVXTC8=! zg&5EieV;^My7#ELE@zJ3vMv}4>!KddqKf0@x?DK!tX9hTyiRM1m{yZbk_t|`R1&#ja#?V-8X*ru+v|`u?JctwURgCHB+y_DXzKg6iZc9^Z68~ zr^-?t$VUp*DyUZ7rs^L^yFafKb&K(NI&%-Aj1yymT9{Hz3s2xHGK=0mVX_aO!0AQ? zJ88DEPZs63NbYJb!&e+FE-8KO3$+CWE5Gu|jpKv_QbWs5_7|0G4edC2XY;isTi&?l zkhsV|Ua`g(YcI>nu3 zjV(404{}bEC#u_SJj15-Zd|cxZ+Cu&O}j&QqD}il_!7{Aa7DgBBTqd(OzFW#S{9`512NRk$o#ZJZj*yN4PySc8~p5GV2;zp9HILd z_0XN&+9iJvzMlr@xw#-ic{+MxlO381Z9NY|=H0SwpwpATNB^s5XC?dt8u+5t%L0{_ zc*{}5{&b^0HG8X z+-pnrzfS(IdN<=&b@$sH-BEn1O-s@IUeMOwgwbgJe%H1d!?$*AyJPw0TiU&O`z`G_ zzUh{BJbxYSX488-tPMuPr19EWeS_}9t8UPVyxgX}Nqm4!<8iIz2A#|cLEm)x4*qP{ zwwl6Mb#1#-=kS$X8Mr8xb#438cyrgbp3awaZA+PaVb`{j#TTG$PDF9?Fq=kg*5jbB z`pk;%toz5lKY!OG%bR?~-;WGoc}#p}i}U?y+^u>3#QjYUB9+I8ba;Bx#1dn@pJ z;BjEAWEejJBZCbi8Fj$?9)_U;FZMJHH*j;fVR(ScBMrkFBsEKmq71_i#)dd_1ePZo zMv?g5%P@>_zzM)dfSd9RV-xUvzF~X}yjpA+=Yg3eh7pNJmxO+X(I0pfI05MGZy1Y! z!v+|}i@<%rt-zd8!#EBc2mG;HGdwSYr}#z3{0hSu2z+V~JOw7y7{+qoT;K-a*T6l% zWYsXf1}cLMBP0X^-Dw#4z{f`z#$CXiy9{G4Fk!S|tOiPV!*Sq-1~?9k9gF_J9~;rX z8RzWzNrsUF95dN4MgaE#XAAzlhVc||(Ju|-b>QYHhOrNr?>3BYfmeYcp>Sjx`U4lu zK!4zmz}Z0WEI0s+{gq*~1BcBuj85Q$d59eFbzpO3PYnD33;@s1hXLTX_+y8;!1@1U z7%jk@M_~XM(rg$<1g=ErfP0=YjD#>r+WNnSQ4TCxjnD)A&l<+#z>_UlV_-5Na-#h^ z!?*~{++Y|=FYFPYQDY1PF|5NdrUO6TiWvhlx1l5OdEi#y?Dye0Fm@*l0G|TJhGPx= z+FJ#(vpVzqb)!EbEe-CT5(&u1KR0+qf`=c$Q}OR{@CE|KkAi>W@bC5WTC__}k2?Yx zwx9WvjQ>~T-=6bYol8z(TYu1+1bQ!PPYc}hlh!6M?25KuVC+@xJJ@i1FBw`yp`6y7 zgWbOzr%4(dK4wj5YY(>e%P-)sBn&?8rJ{e4ARcnRA1C7P=Q zZKYIe5V*QbdsOiKW!eh@6UwzM0*lJEqe328q5ULq?jS9tANV<{RxNPzP;H99<#%dJ z1>QA6YZcfzQrp>2j$=7>+R=XK_w6sVp9FvU-CAOQpwysM3Y^fOO%fP1R$DA^-&pM> zfnSf)whJ8CsC_Q*`$p|2f#)Y^i35N+leJ2LPfgY)4S@ZyUusK%&G+Jn79mbp7d?3J zntNL(v%lEu8iX@H_daagz`D*~6W-d34ZXQ9G9h>0Zx~|&@h@7_tu?s8ihrz#KjbZt zzi!EAV?&Aka4+~G1$ddHrIyNln0JO&Sqi5fnWaqurXR=o-x}y-4m!8XqKZT`ze!ss z^z#>Je-;?BMEkB3liTpP7Fq^e^lL3wU}v*dR|fgOW!eJ*`!Cm?6F6ptwxvwQFTkGC z{$3{M%2&0haye;+@NE&&%$`?~n8nE&9PX9Z#J0vbddk8B1*{h#KmG;|eIO?0o?~vy zKgh+r--ph?H<4LD!$#yd%v$myZ)3x&O;?CO!KL`slY}ow4rcFsYVeu0*d4#-+jVRDQ93i`k z-#=~1EhvXaOzI`sd~ncgX#<$9^HN6bs8n%W)32{7gsU-SU@m;)K5ktZcIE&BO_aGDFc3 zJyzc7kb^otZIt)Qu<-i{@-epP+m44P%EMz=`$28{T-g;}>L*e#iS?-%r5unU zP4>7}zGd1Ar3pn-R+!hShDVFne=(nY>P0V)$}55(y|=lqIcewwk$h}^H{l!q;2*+> zu)yn{HX!Ek?Oyi+0{u^!v&XFR5R*cr*0j;&p%kZ`NOnlewKvEGDSO^(%>z7Nrn`&Wv~>u)khp-ks`Ks7vn5a z;?^2cBDHRP)i7kAAQW}ub>pz&ZCHzZxfu=f_G?(BSm9MiIpZSTcl*9Z@#t zIxGi2v5l(@m9wVRV?C88sFP}>W!r00UX~-L9d$&fH1aVk8rwv~^a!gY7j62S}5{Ro-nsK{c954@5qLkTMMD)^yRw^EvYj*@ndw!kODQd1<=!nUl5CQq+O<+!dkpcGSGp(lVq_*lJ|+25?4MdG$~KAANb_yg zVz=q$p3L0IyUkk=v}Lv7QsM3{Dr5K~ddHWP7>qX_F;?e`=RjL_vUyzuV_M_kh26B} z>PlFO}TnxiX ztz-2;rPdc0#-23xMJSiL{hYEE4cv%R3>9DZ*^jHxvJR!tLtLuTL!z^Xg&<06xsEEp z_-}-2%Qv*OqwDhWHaN8=Oa>@B%g5O@mlGS(xu@JH^JNX3@WPzN!}@O8q;mD4r<58O z!yR)5^WrAsN?FJ_OwLwcN>Rc-M;ORqkEE*BIK#x3l*20@Y^`a799-4_v*0lLuTzrb z?Q0&0AzFUI_#lqk)e^W`xw^q__E*eDb~8*d!|l7^t(XaR^N%oQ;K{=jTi&?luX&8A zYn`5#kw50xVal6lxg;bIflM3!gErdR^TVav0o>fuXSgv%ovSrD6QpJ5B(hb zBEYa-jd>JHr5|fw1gyV<8>1LR-&t9R`mQaP`Tgps(Q?tn#-6tvcd-Lu;~D3hRb<~q zSVHr4bc_M7F5r~G$nSlfhR5NyR`cQQ$M-;Y#n%w(n6L|<5M%Mvf?$7)rLEMK8Ao9z zZAmQ$emEET+YJG-i};feVZR+Fr_?Ea7fr@d2A*0bZ`y4?m&q#R6T-O@$nW9W{{Zy= zm9P?%Y~tOP8MR!aw3dS)KX`-f<$5~H@$VGW<9P@lwY;1!aoh~@c{A5PJIME_4y;U%aWAAt zAwE_zpDPq|)z}NQIy$&L7~T_hZv(tA?cFH7Z$?YapNC3?e+?7IcBMlCNSNW6J-$?l z|HW?dYDj-*H+9@JrC61ldsFc$qJ!i)9aI0t87N3TYm>!DGxX5hMnRc1EIOaO)(@*Zc0%+>qco^DYF~3(3Prmqc*!z%iXBK z=Ulm2oGVwiE57Ch!Lr#yt87wsuw{M_x!@%Z=_E}q4zax2jcADH6CcJ-9kZlMJ`Sq>^O6Jk04krD&lpvJ`^Sw-24v)}u3eI1)vE9H^!1KV+A8f1*_~0iS3-l0#LDy|89(e2~@_{#R zAs=}0SL6dX-9f&GU=ZGa2mv^b{s{r#%btt{ss&*kFdnGFR;L5!;0_c5)9|LQ04@aX z2Ac5oJ`XhZV5|)o+!Ohpg76VA9vIsT`M_eBkgmkPm!wI%9g^KY@P(Ce2{XP=mz}Z!&ffIAj)M_kqiGjD>d+ z1iu`{h5=6(GWHr!zm&0J;5*A0s|2oIjyF7T<4VRZ1AlynF)NT6k?$u6YgZ#5xZQ+& z;H8g{4}7o-`M|3+ERpTUBGLi@U?I>7JO&K+N2doN08BW<*mPh8a2fD!9qpe<29aDk zIg^Bubefk*1{ijHjiaYL2lBNGuK3GG_yqn!oGiyr4=mQ=x9PNvJ>bri&Vj4MG5(%n ztDhJ4pYuEMyYCwti-hguRiWNIfb(bYyZ2igQ}IuhlAi&A$4-G(_$x2knEYfq3lute zKP27-Ke0o=-%~Y~I10qT--~9wNg|W4{AgndIN2S2#Hbx%`3Sq$Xk#1ksCMubqJv)x z{%v{$GGrcY;_y5rGf8CDbv%y`aN0YPT0I>}eh@o&7tb$Fa|b`b%fZKhKW(+K_uMvT zwR3YOfPapbpbUA1Rsjs3`7t)zZPHBVq&pFP&!4d?ZrxmTc5?>&7x+ZPq8Vp5I^K(N zt6IU=f)91m_jl_1sf6Bw86Vuot^(p+S%Kfn7`(R1X;v1AjCzc}EY`S%l{mxl5tdD> zcvwRiV~gFw3Y=j(5jL1MA&d;6WEP??;ZN-nx8{mFn!~w#mL~JCuOk^d?G|>#88!i7 z^Jode41bSetiY|dvKR8HM%b_5|KC>a1m6z6yIYwcXPGnLAK-OZ>2})IJ5O7yhad`b zY1CV2_d~n}Z(-}5w?x(CJasY1*U>D5k@d8M!?UzXv5xTE{X-dB>Q-aEv&I?tgDJ^I zQUQ$uM751zY?0ft9aPQqZm8mHvci_{5ugg zo;LB?lPS>wQfU;2Q8bxD3C-eAKub7uqg4R0DV-kGk>29Zlj#i|=|v)`ItT0u+7BSw zrqI+JcoV2Dhx8#cXc_mOd7V~s?;LuHoA(RoEtujjh17R8uzo%r#PNWhj_3GeF`dKl zrzLa^kW8ST&PItedWyqT+5+f3bu<1&>9(nj&P~0K&qA*qbWkotUZ|$yITlvaIUKiC z(={Cb@;R-}#T*xQ(X-t4`-1+)apE3J=RBek>5{ienrMx%9DSQ)dUwAQ%r_BV8Tl#* z17M0mpfDd-NnuJks5AO;1*+eB=(1GK7{ClQ6onnB;QJTg9YK zB}yTd>Sg35BAP-ikC&57m8cH4yk0_15OG%^?OjUNi8I43UzU=GA!5TlT1`o;uQfvH k!x}-aQId*+11m|KkMqCrXjUaj^r_5LqAD#_m1Mj4A0lvRb^rhX delta 4341 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 GUh#iT;3}&C diff --git a/otp.c b/otp.c index 251e5fa..ba57073 100644 --- a/otp.c +++ b/otp.c @@ -44,7 +44,7 @@ static const int base64_decode_table[256] = { #define PROGRESS_UPDATE_INTERVAL (64 * 1024 * 1024) // 64MB intervals #define DEFAULT_PADS_DIR "pads" #define FILES_DIR "files" -#define MAX_ENTROPY_BUFFER 32768 // 32KB entropy buffer +#define MAX_ENTROPY_BUFFER (4 * 1024 * 1024) // 4MB entropy buffer for large operations //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -331,7 +331,7 @@ int interactive_mode(void) { void show_main_menu(void) { - printf("\n=========================== Main Menu - OTP v0.3.8 ===========================\n\n"); + printf("\n=========================== Main Menu - OTP v0.3.9 ===========================\n\n"); printf(" \033[4mT\033[0mext encrypt\n"); //TEXT ENCRYPT printf(" \033[4mF\033[0mile encrypt\n"); //FILE ENCRYPT @@ -2551,6 +2551,256 @@ int collect_truerng_entropy(unsigned char* entropy_buffer, size_t target_bytes, return 0; // Success } +// Streaming TrueRNG entropy collection for full pad enhancement +// This function applies entropy directly to the pad in chunks to avoid memory issues +int collect_truerng_entropy_streaming(const char* pad_chksum, size_t total_bytes, int display_progress) { + char port_path[512]; + truerng_device_type_t device_type; + int serial_fd = -1; + + // Find TrueRNG device + if (!find_truerng_port(port_path, sizeof(port_path), &device_type)) { + if (display_progress) { + printf("No TrueRNG device found.\n"); + printf("\nSupported devices:\n"); + printf(" - TrueRNG (PID: %s, VID: %s)\n", TRUERNG_VID, TRUERNG_PID); + printf(" - TrueRNGpro (PID: %s, VID: %s)\n", TRUERNGPRO_VID, TRUERNGPRO_PID); + printf(" - TrueRNGproV2 (PID: %s, VID: %s)\n", TRUERNGPROV2_VID, TRUERNGPROV2_PID); + printf("\nPlease connect a TrueRNG device and try again.\n"); + } + return 1; // Device not found + } + + if (display_progress) { + printf("Found %s at %s\n", get_truerng_device_name(device_type), port_path); + printf("Streaming %zu bytes of entropy directly to pad...\n", total_bytes); + } + + // Setup serial port + serial_fd = setup_truerng_serial_port(port_path); + if (serial_fd < 0) { + if (display_progress) { + printf("Error: Cannot open TrueRNG device at %s\n", port_path); + printf("Check device permissions or run as root.\n"); + } + return 2; // Serial port setup failed + } + + // Get pad paths + char pad_path[1024]; + char state_path[1024]; + get_pad_path(pad_chksum, pad_path, state_path); + + // Open pad file for read/write with temporary permissions + if (chmod(pad_path, S_IRUSR | S_IWUSR) != 0) { + if (display_progress) { + printf("Error: Cannot change pad file permissions\n"); + } + close(serial_fd); + return 3; + } + + FILE* pad_file = fopen(pad_path, "r+b"); + if (!pad_file) { + if (display_progress) { + printf("Error: Cannot open pad file for modification: %s\n", pad_path); + } + chmod(pad_path, S_IRUSR); // Restore read-only + close(serial_fd); + return 4; + } + + // Process pad in chunks + const size_t chunk_size = 1024 * 1024; // 1MB chunks + unsigned char* entropy_chunk = malloc(chunk_size); + unsigned char* pad_chunk = malloc(chunk_size); + unsigned char* mixed_chunk = malloc(chunk_size); + + if (!entropy_chunk || !pad_chunk || !mixed_chunk) { + if (display_progress) { + printf("Error: Cannot allocate chunk buffers\n"); + } + free(entropy_chunk); + free(pad_chunk); + free(mixed_chunk); + fclose(pad_file); + chmod(pad_path, S_IRUSR); + close(serial_fd); + return 5; + } + + size_t bytes_processed = 0; + time_t start_time = time(NULL); + + while (bytes_processed < total_bytes) { + size_t current_chunk_size = chunk_size; + if (total_bytes - bytes_processed < chunk_size) { + current_chunk_size = total_bytes - bytes_processed; + } + + // Collect entropy from TrueRNG for this chunk + size_t entropy_bytes_in_chunk = 0; + while (entropy_bytes_in_chunk < current_chunk_size) { + size_t bytes_needed = current_chunk_size - entropy_bytes_in_chunk; + size_t read_size = (bytes_needed > 1024) ? 1024 : bytes_needed; + + ssize_t result = read(serial_fd, entropy_chunk + entropy_bytes_in_chunk, read_size); + if (result < 0) { + if (display_progress) { + printf("Error: Failed to read from TrueRNG device\n"); + } + free(entropy_chunk); + free(pad_chunk); + free(mixed_chunk); + fclose(pad_file); + chmod(pad_path, S_IRUSR); + close(serial_fd); + return 6; + } else if (result == 0) { + if (display_progress) { + printf("Error: No data received from TrueRNG device\n"); + } + free(entropy_chunk); + free(pad_chunk); + free(mixed_chunk); + fclose(pad_file); + chmod(pad_path, S_IRUSR); + close(serial_fd); + return 7; + } + entropy_bytes_in_chunk += result; + } + + // Read current pad data for this chunk + if (fseek(pad_file, bytes_processed, SEEK_SET) != 0) { + if (display_progress) { + printf("Error: Cannot seek to offset %zu in pad file\n", bytes_processed); + } + free(entropy_chunk); + free(pad_chunk); + free(mixed_chunk); + fclose(pad_file); + chmod(pad_path, S_IRUSR); + close(serial_fd); + return 8; + } + + if (fread(pad_chunk, 1, current_chunk_size, pad_file) != current_chunk_size) { + if (display_progress) { + printf("Error: Cannot read pad data at offset %zu\n", bytes_processed); + } + free(entropy_chunk); + free(pad_chunk); + free(mixed_chunk); + fclose(pad_file); + chmod(pad_path, S_IRUSR); + close(serial_fd); + return 9; + } + + // Derive Chacha20 key and nonce from entropy chunk + unsigned char key[32], nonce[12]; + if (derive_chacha20_params(entropy_chunk, current_chunk_size, key, nonce) != 0) { + if (display_progress) { + printf("Error: Failed to derive Chacha20 parameters from entropy\n"); + } + free(entropy_chunk); + free(pad_chunk); + free(mixed_chunk); + fclose(pad_file); + chmod(pad_path, S_IRUSR); + close(serial_fd); + return 10; + } + + // Generate keystream and XOR with pad data + uint32_t counter = bytes_processed / 64; // Chacha20 block counter + if (chacha20_encrypt(key, counter, nonce, pad_chunk, mixed_chunk, current_chunk_size) != 0) { + if (display_progress) { + printf("Error: Chacha20 keystream generation failed\n"); + } + free(entropy_chunk); + free(pad_chunk); + free(mixed_chunk); + fclose(pad_file); + chmod(pad_path, S_IRUSR); + close(serial_fd); + return 11; + } + + // XOR existing pad with keystream (adds entropy) + for (size_t i = 0; i < current_chunk_size; i++) { + mixed_chunk[i] = pad_chunk[i] ^ mixed_chunk[i]; + } + + // Write modified data back to pad + if (fseek(pad_file, bytes_processed, SEEK_SET) != 0) { + if (display_progress) { + printf("Error: Cannot seek to write offset %zu\n", bytes_processed); + } + free(entropy_chunk); + free(pad_chunk); + free(mixed_chunk); + fclose(pad_file); + chmod(pad_path, S_IRUSR); + close(serial_fd); + return 12; + } + + if (fwrite(mixed_chunk, 1, current_chunk_size, pad_file) != current_chunk_size) { + if (display_progress) { + printf("Error: Cannot write modified pad data\n"); + } + free(entropy_chunk); + free(pad_chunk); + free(mixed_chunk); + fclose(pad_file); + chmod(pad_path, S_IRUSR); + close(serial_fd); + return 13; + } + + bytes_processed += current_chunk_size; + + // Show progress for large pads + if (display_progress && bytes_processed % (64 * 1024 * 1024) == 0) { // Every 64MB + double percentage = (double)bytes_processed / total_bytes * 100.0; + printf("Progress: %.1f%% (%zu/%zu MB)\r", percentage, + bytes_processed / (1024*1024), total_bytes / (1024*1024)); + fflush(stdout); + } + } + + // Cleanup + free(entropy_chunk); + free(pad_chunk); + free(mixed_chunk); + fclose(pad_file); + close(serial_fd); + + // Restore read-only permissions + if (chmod(pad_path, S_IRUSR) != 0) { + if (display_progress) { + printf("Warning: Cannot restore pad file to read-only\n"); + } + } + + if (display_progress) { + double collection_time = difftime(time(NULL), start_time); + printf("\nāœ“ TrueRNG streaming entropy collection complete!\n"); + printf(" Enhanced: %zu bytes in %.1f seconds\n", bytes_processed, collection_time); + printf(" Device: %s\n", get_truerng_device_name(device_type)); + if (collection_time > 0) { + printf(" Rate: %.1f MB/s\n", (double)bytes_processed / collection_time / (1024.0*1024.0)); + } + printf("āœ“ Pad integrity maintained\n"); + printf("āœ“ Entropy distributed across entire pad\n"); + printf("āœ“ Pad restored to read-only mode\n"); + } + + return 0; // Success +} + // Collect dice entropy with manual input validation int collect_dice_entropy(unsigned char* entropy_buffer, size_t target_bytes, size_t* collected_bytes, int display_progress) { @@ -3243,7 +3493,7 @@ int generate_ascii_armor(const char* chksum, uint64_t offset, const unsigned cha strcpy(*ascii_output, "-----BEGIN OTP MESSAGE-----\n"); char temp_line[256]; - snprintf(temp_line, sizeof(temp_line), "Version: v0.3.8\n"); + snprintf(temp_line, sizeof(temp_line), "Version: v0.3.9\n"); strcat(*ascii_output, temp_line); snprintf(temp_line, sizeof(temp_line), "Pad-ChkSum: %s\n", chksum); @@ -4797,6 +5047,43 @@ int handle_add_entropy_to_pad(const char* pad_chksum) { } } + // For TrueRNG with large pads, use streaming approach + if (entropy_source == ENTROPY_SOURCE_TRUERNG && target_bytes > MAX_ENTROPY_BUFFER) { + printf("\nUsing streaming approach for large pad enhancement...\n"); + + int result = collect_truerng_entropy_streaming(pad_chksum, target_bytes, 1); + + if (result != 0) { + printf("Error: TrueRNG streaming entropy collection failed\n"); + return 1; + } + + // Update checksum after entropy addition + printf("\nšŸ”„ Updating pad checksum...\n"); + char new_chksum[65]; + int checksum_result = update_pad_checksum_after_entropy(pad_chksum, new_chksum); + + if (checksum_result == 0) { + printf("āœ“ Pad checksum updated successfully\n"); + printf(" Old checksum: %.16s...\n", pad_chksum); + printf(" New checksum: %.16s...\n", new_chksum); + printf("āœ“ Pad files renamed to new checksum\n"); + } else if (checksum_result == 2) { + printf("ℹ Checksum unchanged (unusual but not an error)\n"); + } else { + printf("⚠ Warning: Checksum update failed (entropy was added successfully)\n"); + printf(" You may need to manually handle the checksum update\n"); + return 1; + } + + printf("\nšŸŽ‰ SUCCESS! Your entire pad now has enhanced randomness!\n"); + printf("Press Enter to continue..."); + getchar(); + + return 0; + } + + // For other entropy sources or smaller amounts, use traditional approach printf("\nCollecting %zu bytes of entropy from selected source...\n", target_bytes); // Allocate entropy buffer @@ -4845,7 +5132,7 @@ int handle_add_entropy_to_pad(const char* pad_chksum) { void print_usage(const char* program_name) { - printf("OTP Cipher - One Time Pad Implementation v0.3.8\n"); + printf("OTP Cipher - One Time Pad Implementation v0.3.9\n"); printf("Built for testing entropy system\n"); printf("Usage:\n"); printf(" %s - Interactive mode\n", program_name);