From 40284b2b99583a04a4f915ece20119f8d2c02bb9 Mon Sep 17 00:00:00 2001
From: Arvid Norberg
The expression to calculate a valid ID prefix (from an IPv4 address) is:
-sha1((ip & 0x30f3fff) .. r) +sha1((ip & 0x01071f7f) .. r)
And for an IPv6 address (ip is the high 64 bits of the address):
-sha1((ip & 0x103070f1f3f7fff) .. r) +sha1((ip & 0x000103070f1f3f7f) .. r)
r is a random number in the range [0, 7]. The resulting integer, representing the masked IP address is supposed to be big-endian before @@ -131,8 +131,8 @@ uint8_t* ip; // our external IPv4 or IPv6 address (network byte order) int num_octets; // the number of octets to consider in ip (4 or 8) uint8_t node_id[20]; // resulting node ID -uint8_t v4mask[] = { 0x03, 0x0f, 0x3f, 0xff }; -uint8_t v6mask[] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; +uint8_t v4mask[] = { 0x01, 0x07, 0x1f, 0x7f }; +uint8_t v6mask[] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f }; uint8_t* mask = num_octets == 4 ? v4_mask : v8_mask; for (int i = 0; i < num_octets; ++i) @@ -152,11 +152,11 @@ node_id[19] = rand;
IP rand example node ID ============ ===== ========================================== -124.31.75.21 1 8a84ac4d 0c5d6a4ec8a88e4c6ab4c28b95eee4 01 -21.75.31.124 86 1167d8b9 4e7a08645677bbd1cfe7d8f956d532 56 -65.23.51.170 22 508e075d bc8f112a3d426c84764f8c2a1150e6 16 -84.124.73.14 65 095d76cb 1bb1fe518101ceef99462b947a01ff 41 -43.213.53.83 90 f62b5a2f 5b7c4be0237986d5243b87aa6d5130 5a +124.31.75.21 1 f766f9f5 0c5d6a4ec8a88e4c6ab4c28b95eee4 01 +21.75.31.124 86 7ee04779 4e7a08645677bbd1cfe7d8f956d532 56 +65.23.51.170 22 76a626ff bc8f112a3d426c84764f8c2a1150e6 16 +84.124.73.14 65 beb4e619 1bb1fe518101ceef99462b947a01ff 41 +43.213.53.83 90 ace5613a 5b7c4be0237986d5243b87aa6d5130 5a
The bold parts of the node ID are the important parts. The rest are random numbers.
diff --git a/docs/dht_sec.rst b/docs/dht_sec.rst index 8e1176bc2..df5290dc5 100644 --- a/docs/dht_sec.rst +++ b/docs/dht_sec.rst @@ -65,11 +65,11 @@ ID can be restricted at each class level of the IP. The expression to calculate a valid ID prefix (from an IPv4 address) is:: - sha1((ip & 0x30f3fff) .. r) + sha1((ip & 0x01071f7f) .. r) And for an IPv6 address (``ip`` is the high 64 bits of the address):: - sha1((ip & 0x103070f1f3f7fff) .. r) + sha1((ip & 0x000103070f1f3f7f) .. r) ``r`` is a random number in the range [0, 7]. The resulting integer, representing the masked IP address is supposed to be big-endian before @@ -91,8 +91,8 @@ Example code code for calculating a valid node ID:: int num_octets; // the number of octets to consider in ip (4 or 8) uint8_t node_id[20]; // resulting node ID - uint8_t v4mask[] = { 0x03, 0x0f, 0x3f, 0xff }; - uint8_t v6mask[] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; + uint8_t v4mask[] = { 0x01, 0x07, 0x1f, 0x7f }; + uint8_t v6mask[] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f }; uint8_t* mask = num_octets == 4 ? v4_mask : v8_mask; for (int i = 0; i < num_octets; ++i) @@ -114,11 +114,11 @@ test vectors: IP rand example node ID ============ ===== ========================================== - 124.31.75.21 1 **8a84ac4d** 0c5d6a4ec8a88e4c6ab4c28b95eee4 **01** - 21.75.31.124 86 **1167d8b9** 4e7a08645677bbd1cfe7d8f956d532 **56** - 65.23.51.170 22 **508e075d** bc8f112a3d426c84764f8c2a1150e6 **16** - 84.124.73.14 65 **095d76cb** 1bb1fe518101ceef99462b947a01ff **41** - 43.213.53.83 90 **f62b5a2f** 5b7c4be0237986d5243b87aa6d5130 **5a** + 124.31.75.21 1 **f766f9f5** 0c5d6a4ec8a88e4c6ab4c28b95eee4 **01** + 21.75.31.124 86 **7ee04779** 4e7a08645677bbd1cfe7d8f956d532 **56** + 65.23.51.170 22 **76a626ff** bc8f112a3d426c84764f8c2a1150e6 **16** + 84.124.73.14 65 **beb4e619** 1bb1fe518101ceef99462b947a01ff **41** + 43.213.53.83 90 **ace5613a** 5b7c4be0237986d5243b87aa6d5130 **5a** The bold parts of the node ID are the important parts. The rest are random numbers. diff --git a/docs/ip_id_v4.png b/docs/ip_id_v4.png index c3a209503d5a323b152e7b4d27ba1d94635d4bcf..7c17deb630d8021b97bab675378a9968375ee63e 100644 GIT binary patch delta 5525 zcmaJ^XE@wV_twjb5^F;cBzlSH61|2MEm$`C>Mgox;ipF3kg$Z0bR5Y14KfvfdC>#>PJ($fDi}-rAK-Ry@yaj5h l2?%cUE_nqCDo!On|J?GhH&pC6t_>W~Ug4bmULW0+k%gf7re0-Xk zns45`DJ(2>baZ?%)F^W88b^e_F4*b`b|;@^8VjIBm+wd}U`H<>6(7VGUGKi0l)Kj~ zmn`ZUd#)2hY5Y!__WvK93^F;VpRbFx8EFT^&G `gki-HE&2b^1ZYtu6CTEOB@99~gSDcLJK(!9skFNqLT>ujflExk`@*)p}w z$yTU5=OzX@khac^SUuYk2PvgYr}qolB$?;1c{_@^Qtwo&fk~yUjxfx{wYkm1Vc3_a zzmTboi`+9m*$RgXiisAYIGLjuAs0cTjFQcif9^QHyj4@E@m8|GP9e-IRhld2w0FQF zBGPN-T})bw346zCZc;;$q?3EmV9)|(jqm;R#P)L84dhPm=8xx#b%7~!+0XPd+QK ayr6H;Yq<`5h )*>z6ZaRxbiRJGE7UUwSV2K)%humwf9Eckjglqa@Rd z<%nFTMC8F!yzgUlIS(+HgPTr&3o>osvF? eh3>q) *TY=8yf!3o3V)hb7+vO Y-G$LDb!ypN9oK^7H*7@2XKOQ9INP4RyvwI=UJegIVZfaDfya zX+@nL&!dFMqRO6p>fOt!uv+U`iODrH8@V@syh#zgMzR1Q>vUlNIAy=0s|aZNbBQ(h z@hHkD%6h{rjB!c!dXVHqU^z)xHWK^0e#c(j_vyr2zw1jSBukAH(s4o{tw@@h1>y}0 zE4t!?i >`hL<|p8P}fRM9O}1dxW| zVz_8uTw+~ Y;yK&}QIo>I61uIBjjM=R7ZUPQ5glvsY`0$&cRnnIn&m;r)DYcgWCbY-?L@9c z>Y-k>&T*9Otk$c`4R(hk1ntV+)cR$M$ueUGt*|v7_h;Tt^(NP}s zZILbYFx^8>Y3v))%qrD@IIoA%PCX!e1Mwwb)igkOL72i+OiK#DAx#-|)Fz0-6 kF21z7+|P=wY2)E+-&x!}M97w&{W@7vt&;O# zJUTG&p->}w%_p0|=`o{94V_x!#>0MHZVeWM&WlfL4jM>bAEzWB*oi;mvYYXIf+GHN z49;)R@ n{MWKqA(_7BqPe}jCTV|Eb5Ua%rw`kei;n93b9*mB< zZ+3@5Om#243Q*&WaKSd5IFX&P_HOTz`$;O_S-(_!|4B _Q1vl_BMx z8rtwjsKf>@*n8r`LGzmH_YeqVIA#;)k&1@-@ALShq5L`DR!@7*s~v6i`*lg14kL_L z?!#Ko;K#)e^#Xm^*sX2VA@IK90lMkoGfu=}pMrN$d2>nzV{RgE4-xmF{NJ~&?d~T~ zN_H3n8L ^Hr^!? 6lC6yma@Pfm? zt7%ztl6eU8s$?s)89oP0eZLcgsaby%ur#nl;nTkf@V2 v%KrlN z$ d*sLkW0<#L>GC7;CiAZZ{9*&N94 z!F+Y4DZ~*~E9 %E z8~F-eT1X>bWCjn8gdL`u=gA^R!ep;7+B=GCeJE_74`Zz342bc%m`(cex^^D vwP}D*?l>j$HpWpA7iF9n^1y>a0QJ-V8N-s8Pk*7l!@~fuha3A<7FXB zqx(JxCU=rQzh9q(+M0f+Ob*d}N8yrjhtm7cOoKqC)Ex?b0Yd7#f;pu0lr+#FltOIu zFhZCx-mVx{zHkW%{`w0}WvWdf04>hyj;p$Z=u3MmUPH3>9HuqOX1$`ecU5Cha_?lS zolGcon!sDmX7=1?M$BGmy<;k4R6dI$5aUZiV{y4FWL(JrGWF_@SPoOR5N#`GhaY^R zAiU&FF!e`Srw)1a4$}VWE!a(y>j#qRY;|0uXWtww=!(=5MFoUsjGlKM?bpW)df0Q_ zSJyS+{YrE#dVNCy)gb)6Q;*#-9JD_FmMhcjb0ejNJM|5X>4|lKx{UtD@*7s#`u$Wk zaBe&P9stFPJ+ As(oAAzU+h6(y=?nM9VzW$EKItk1mUt`gg#r47LmwkEu5 z^?szIEWp^88!X;oCr44NPf5eq0v4ADS`wPk! @L+b>LI#JDQ`=G8j$JnFe||JdCVLXSMXzu&Bp zAWEKbLl1 kD @*&*2k?4spo_d-!~0i^5y$v>3e-RFFm#{naV%qf7cK67IEAhY^r;2%)9uu%6MdS z#HnkDRdlL*!|MXjNAB0E#Xcj0)?dqJ&3>T}ZE%F89g*;?l>w-R@VPg;E~7_3>J@L% zc(QB}aX7<$eXx<&fl8M56M?y8l9pp(lmUZ`P1m Px2(|HqZg>S`25p&t17V(1vFvo z>&2Lz18i<=9%A)^)}#}ga=bS7^>AUY({h) tjkEaZIO-&A*V8ws-sfPb`UWcdyi(H(;ygQO%SN% zu1=iqK|@ALI>JFKO~Mp+y*I!n*Mn(1nRmRKg!zbzTVJ7%sJBe87ls8O2^5CvXo%kU zZYAq{P(zw0u!|_CofZsP8>C{s!f7~^Y}1B!XOH^_6(J`IJ|0giT?y77&6X&p?nI%H zvt(&?4BVuV;I_ WlRquG+hj9==^v=tAE3rqOj?s2P m0!Zrx^^_Kx4Ug-;lm_9KnYW@SCB{io&k=C=8=+|@DbP2U z1)ziq&+iXI4-hi2|IGi{9%3L3Q=B(sI0;J{%K3?0!3tl5a5vzMA3hT#Qe~U__^6fw zm=rt)eCX{+ qXy){Cc8}2!|w%vvT54MIoiggS%~QJBfCqJ&C!ob$RQN5X^I1(i!RtqX(2HayfEL z3BA{miYMe?eh 1Y1n_+6csWXdev)BIvhti!C zRp&8y%Ma}Vp*+bVgr!N(bB;7V@MrH)$Wb!OL_gqj#e`|UT9D)yWf)c?dlorarf`m$ zjn$-4Gk4&C^dvINl }27c<%`24Yo1$Fm3PUu0p5iREwU2WLS%;$E_^=P{* zs@Uhkvmx&m5(0OAdcXE&`PZPaP;LBzq_%Rs>ZGIY*xP@6Wp4QV2{q}^L~09BuQ31` z(?v*=Qscm-0b7w=3a49T4^$J3_+6Rq(KKDTlrSCs91^~D=5Q+-z$8a`f*=P!>|Ce= zii2RSv9#DSoA%(K%L|pBunA(SNb>o#Nj{^jflzFs#T8&tjC4YPIgq`(MLGe%)I@m# z0a4#7` z)u{{bFPYjqHFc;*!~Y6utE&ML{-KEXPuv5(6BguLPnga!-9|twFYtUaD}EaOL@LX~ zi%>CE5XrT+_EKR`xa4j%-#rH!0wuF~!gdQvGi}z}>xz>jh4pN(oDbvnJK6)&S8cu8 zl^w^=&*1(&eOwf3_K5n9W1}ymA4D} 2NBv)ig#j7BSGSVb2dpjhK zCuZ=CoU|SDx3rCMRp5cr`&SwK|89`|+co=j&F7vY=xL}9Am%1jILq(Ai%S*iQJP8` zbtK(@8V%Fzi1P3p8#{Z~a!mV4vdR80p6p667{0qe9rbq!G`eUV+ewYU-{jT8#QE9B zhNgUT|20+-vg@%;AyP|7dGZ9fYhvj>8q4FUgXgo`aFR2TPSMV6#^NcQfrb&X3b97n z M=xaarghd`1ID?|Uk#TP`j{i#Xl&po+ZA)u@LDh0wI=IsPLXUk;0I^*8ar%d zF}_}ImNPuYMj>v*P_DzRL+8;eVxyZ _aU+`X04+7 z&qnFqbwm`8AzP(~@}A(gwrvm4ua9T&m%S(hN~X*#VQgBe2Yw3EW!XpJihWSfJJL5E zcAR${*vzL;L_8RO+n1U&x76p?xJ2bSJ&{hn9{ivHz0H}O>7hNP;8clzI0bmLd(ojC z7_UAVAPERYy9U8S!m`Ej=Jv}9r2n3tNSSILm$UOZof)Z^K5{a?oVRJ=#kqW`0BdFz uybAl2;-ZwhLlIY9u6?Nbzq{=WpEdazk%dzkAeC!ZpFYGyw@&*3>c0Suk(;Oh delta 4130 zcmZu!XHXMtvjwCH0-=h6h@c=Oh*TxO3(`AM5)vsAF-j2;Nq|rig0A}t9J zA~gh%fbbd+6b#h_EOew8rI(A}z4ynRx%+2lcIJ8J?AhHjyMOeW)zXjit5%&j&X4Qn zf8@-^CpGM7bIv>V< zAMFHTj=9;wW8)H&ut42(8NX1`Q;`{$> z+;QG??syM8vw?Rlz^FDn|5=O_H|}wN`EKvmm1a#)MQB6>!(?ZvLd<43NB|*5Ua~qN zudeBj`-P{0mZS$t+A4NOEjZK78v{#r`Mf5Mj`+^ml510+^Z;eeA|--M=G&s2u6GIe ziI$tYe)1It{=mm#KIS;eeS+EgY>#7^etw#@x)#E}k|DN=mDt$yT6s8F*GTn4YT(fa zBerHOj}=gv7QRFGl@UUHP6Sxl><+u>=>pD&&*?p;AXrKhUt_x1CNE&GSs?YL2VgSY z8oQ+O48!K!PvWdAg}2v+FMBa&gasFS`I-*g;Y0BM9~LY%t4b7Ot;8 1`EQ I@?g=~E|%nRffUNuARl$6!i_|?XdF-cFB zhL0W{sfZt$xl}a5Sg7zCrT=TF7U`Dj`wDK#WC}oT;2~jB%s9ERLpcWK%PX^H%Pda@ zdox!?!?IZB8d($fIslNdKdJNZPIr%wmDX*+i|i(YHm|-v*!>j)%>lYI($3*>1_g2V zF(rk)nG35orii-f hEMSsAT z*+5Tc0iU6}jX*{dy$6*-ypiIEAWB|13fcC5-B!}WhrprLM43UAJqC| GqP^*`Bz%+Bgq<)bM#2Qe8puf$94N^PR^1K$A hFhmK*gc#_2|Bx$2RgCY+){Nw(w$={j=pW`<>~H zZZUIbzxW|+?5f5&aM}bjgMH(okWW28XpaLv*_+s7d`$f=8+#QGd5Av@MlV$CFQ2>m z4;Xq57D^t48GFqNxQ~mSdwu~D{yjwqIb0L~`EII0Kimm(cb0(OtNIKbytdPVBOUe? zLEMK7DlzKT-pbZn0X|wo0Scni>Oj%1)BDWIm8#S`WDNGYbYgP5)yWRlL_<|`Mzh&y zp+$+P0*_fdTgO?XG{25iJCcI6$#5&goX*@KjnF}^l25hLiwvfg`rom3TS=@f_X_WS zob6-eg6L=vFT2(0bnIe!5w38Yn+nO4;@(|*E5(F^Ez=&;WP1DfJqbkOnxIx`No#-e zG+R6illd3J%D7619UE_7fBE2Q1v3VpkA{jp$eLE6~1D7OEbPUB!YKjhNF )Yr9fcP+xg=0KENPNgNGzo)P8nv65n^%{ z#{IkZtB8t=6A<6z;**?wvflSCI~@b ;d#eh$XzGqs&zB|;j7Ts;UAyXMra87zx z-?Gofv5x0qxaJ`3H!e%LJ$=I~OH=P}4y#y{C4K++{GR@hS)}5%9c(Pw2^ -j2ZTPdI&HW@pI(CQl9s<`QJh z6mu?JyeNNm=-!aODrjGp7rP@eWvIg;<40hTsbqfgYJyeIw(C}gn?29uVCiPtpoA6& z>uir}p8G-SpVXnhed^b{SSJ7abHq%bP>9I ;*LvS(U&@virm8pz`jmaoU`72I7AeG5b2hT z5uMA|unjQTlhMhNA=yB5GAN7`s&tfL4L5o2T?Cd)@9D$bB-lzoYc0&Kwp%UzlMl{e zF`}2!6vITxcF>Dw$HY3baVO`x#F#SqnG{qfe- MZ=8~HIh8cK6Zi-BW854< z_R)X$6c&BT& MB!26u-zSfX#C7pwV13lNlJrbFBCJjj^B{(2ouM}+4B zfyccLT(16$ xf2-hOrcpZTt|4aH7L_Pck%t@Cjh@oI~e?;yLw<@LC5^|LK zu~O3uQe-4~7T{J4)9Rp0K;0#|k6k{M#dQm*#V+1(+a+aK2BP;dLnq Qx2o2{EZ(1*-RFZ%;`9yY|!$v?umA_o*0jkH(i2#^nj zR%9!9O?fB1DW)74Zd94qX**v8nbmLzf`bRe)iPY0l-B20+v!dkKU=Nw>cHvU5^ebqLs`jP2n3Ru>!gaG zxH9AS?ZU7;3Ac3n%}FVWvi4M!8XP>=33C>l|B}s1jpY bJ#%qJ;eY zxm0=q&~c?G*F09Yurpi#2NooAG!stN38q;c6*RStSU~z1K8_)#;Vw&Ujtu#!2lg z<#=UVk7<12(WMmz95Vjg)(CVx^Euwy1aS^Z18Gw<|7D>F>{J&5`hDp9=Z1yp!%UKH zT1KPv=1^Ib;NqbR13^OKNN>;!Op=u0Ise|p$3=-^wcoF}RRzr^2tdqRItK_&;twiG zpLDX@pXd!}fppC~x1(}0d;8WMaq`L{JC&c>ao;Ad?5x)HB(M=7Jd1ERSgR*kTdRU+ z#&pZWLEg8rDlgKf{niJKIVgu>Ky=EZsN2TWQ=rK@%hFI|bZcW?k-9PGt$%P$F(u;w zw}C*Yn%<^8`h_rf$<$N86APOEbPigMBwVkiad>n+x?#3yYjd$|^(~wuqA4KDWH8Mf zF~hx=sCKVPU#_k>SUvh{d}B2x1R=fBb>SjidUJ&7`C n7=?l{l$ zq#5>6(N8A5Mq@kdfTODlt(!KyGB)!@(gQsoSUMXQly#DVYL|qw^GzkQG${2XdPIAG z_jS{bzU{A5qU2~QEipox@yJN(;F`^yt23$rxZ`baP^V!M)-lSed(z0m4oghb{!JcB zr>1&lhmZLRF7|h~3H@^?o0&vXX*b(zqnuAiM7m|5R?z=!X}<2T1-XtX+|xq&NF0WQ zemFs6hrfsj_cw_@N%3pnnT`(|*+L bt zy`N%r-A!W^@y{B-69mz4Xk2n-rK8-G? WP-H6xrG`shyN>i<;M39FicGe@tVKsvygB60B6{+uXWm>$=A!i4v>-; zd5d%gkip`8GC4t+9neFX_sKtb9xkU)Vup^onR$atDbH1^z*vi!t4?+uVwHv*@q!Hx z7%|g9Mz1DVio3XAFXOXgr3Pp2lA2BQy!&=Cw()SD5(oXcBrNy{J68Lx;QzAx-@bGr zZsX&GUOU#j-OaCPFy&UX0Ae}bybk;g>LA*cC@|a76)y47?qiHBo>)7nt2_>p;SXJ} zi2t(fvs%ywR|f1fXvZ=~5(_h{M&p~QxY7xow*rIp<6`Pyl;GTBhQU6dUQVo!OH+gC zK&MXDKG}O>T}O3ZuD)W@eIrqx8kC`wTaMqDzv$HgFl=_%DNV`;rTSa03rxC%f}_ux z1U{~T$rHjORnCa6Cdcl+{5dezILgZ<1`5472(sNS r)4iy{Zp@~mD8 Q;BUy$*3G8EDlqB40G(GNF8}}l diff --git a/docs/ips.py b/docs/ips.py index d2bf9d644..b633aede8 100644 --- a/docs/ips.py +++ b/docs/ips.py @@ -5,15 +5,21 @@ import sys def num_ids(bits, total_bits): - ret = 8; - modulus = 0x100 - mod_shift = 6 * 32 / total_bits - while bits >= 0: - ret *= min(1 << bits, 256) - ret = min(ret, modulus) + if total_bits == 32: + bit_dec = 2 + else: + bit_dec = 1 + + num_used = 7; + ret = 3 + + while bits > 0: + ret += min(num_used, bits) + num_used -= bit_dec + if num_used < 0: num_used = 0 bits -= 8 - modulus <<= mod_shift - return ret + + return 1 << ret f = open('ip_id_v4.dat', 'w+') for i in range(0, 33): diff --git a/src/kademlia/node_id.cpp b/src/kademlia/node_id.cpp index 602423d9a..1dee7840c 100644 --- a/src/kademlia/node_id.cpp +++ b/src/kademlia/node_id.cpp @@ -102,8 +102,8 @@ node_id generate_id_impl(address const& ip_, boost::uint32_t r) { boost::uint8_t* ip = 0; - const static boost::uint8_t v4mask[] = { 0x03, 0x0f, 0x3f, 0xff }; - const static boost::uint8_t v6mask[] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; + const static boost::uint8_t v4mask[] = { 0x01, 0x07, 0x1f, 0x7f }; + const static boost::uint8_t v6mask[] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f }; boost::uint8_t const* mask = 0; int num_octets = 0; diff --git a/test/test_primitives.cpp b/test/test_primitives.cpp index f2fe53f93..d1f061118 100644 --- a/test/test_primitives.cpp +++ b/test/test_primitives.cpp @@ -1733,11 +1733,11 @@ int test_main() boost::uint8_t prefixes[][4] = { - {0x8a, 0x84, 0xac, 0x4d}, - {0x11, 0x67, 0xd8, 0xb9 }, - {0x50, 0x8e, 0x07, 0x5d }, - {0x09, 0x5d, 0x76, 0xcb }, - {0xf6, 0x2b, 0x5a, 0x2f }, + {0xf7, 0x66, 0xf9, 0xf5}, + {0x7e, 0xe0, 0x47, 0x79 }, + {0x76, 0xa6, 0x26, 0xff }, + {0xbe, 0xb4, 0xe6, 0x19 }, + {0xac, 0xe5, 0x61, 0x3a }, }; for (int i = 0; i < 5; ++i)