1 /*               rabbit-Stromverschlüsselung  (Kern)                       sc/25.07.2021 */
 2 
 3 # define U64  uint64_t
 4 # define WORDSIZE  0x100000000ull
 5 # define WSZ  WORDSIZE
 6 # define SQUARE_XaddC(j)  ( (U64)(X[j]+C[j]) * (U64)(X[j]+C[j]) )
 7 
 8 #if !defined(RABBIT_TEST)
 9 # define RABBIT_TEST  0
10 #endif
11 
12 
13 static int rabbit(int C_, char *A_[])
14 {
15    static _Bool pass;  //xyz
16    static uint32_t const A[8]= { 0x4D34D34D, 0xD34D34D3, 0x34D34D34, 0x4D34D34D,
17                                  0xD34D34D3, 0x34D34D34, 0x4D34D34D, 0xD34D34D3, };
18    uint32_t X[8], C[8], K[8], G[8];
19    uint64_t IV;
20    _Bool B;
21    uint64_t t;
22    unsigned i;
23    int fd[2], nb, ns, nw, wr=3;
24    int64_t sum;
25    uint64_t s[2], buf[2*1024];
26    char f, b, c;
27    //...
28    for (IV=0,B=0,i=0;  i<8;  ++i)  X[i]=C[i]=K[i]=G[i]= 0;
29    sum=nb=ns=0; f=b=c=0;
30    while (1)  {
31       switch (f)  {
32         case  0:  f=1; continue;
33         case  1:
34          for (i=0;  i<8;  ++i)  {
35             if (i&1)  X[i]= K[(i+5)%8]<<16 | K[(i+4)%8], C[i]= K[i]<<16 | K[(i+1)%8];
36             else      X[i]= K[(i+1)%8]<<16 | K[i], C[i]= K[(i+4)%8]<<16 | K[(i+5)%8];
37          }
38          b=1, f=4, c=4; continue;
39         case  2:
40          for (i=0;  i<8;  ++i)  C[i]^= X[(i+4)%8];
41          if (C_==4)  { b=2, f=4; continue; }
42         case  3:
43          C[0]^= IV, C[2]^= IV>>32, C[4]^= IV, C[6]^= IV>>32;
44          C[1]^= IV>>32&0xFFFF0000ull | IV>>16&0xFFFFull;
45          C[3]^= IV>>16&0xFFFF0000ull | IV    &0xFFFFull;
46          C[5]^= IV>>32&0xFFFF0000ull | IV>>16&0xFFFFull;
47          C[7]^= IV>>16&0xFFFF0000ull | IV    &0xFFFFull;
48          b=3, f=4, c=4;
49         case  4:
50          for (i=0;  i<8;  ++i)  t= C[i], t+=A[i], t+=B, B= t/WSZ, C[i]= t%WSZ;
51          for (i=0;  i<8;  ++i)  t= SQUARE_XaddC(i), G[i]= t ^ t>>32;
52          X[0]= G[0] + (G[7]<<16|G[7]>>16) + (G[6]<<16|G[6]>>16);
53          X[1]= G[1] + (G[0]<< 8|G[0]>>24) +  G[7]              ;
54          X[2]= G[2] + (G[1]<<16|G[1]>>16) + (G[0]<<16|G[0]>>16);
55          X[3]= G[3] + (G[2]<< 8|G[2]>>24) +  G[1]              ;
56          X[4]= G[4] + (G[3]<<16|G[3]>>16) + (G[2]<<16|G[2]>>16);
57          X[5]= G[5] + (G[4]<< 8|G[4]>>24) +  G[3]              ;
58          X[6]= G[6] + (G[5]<<16|G[5]>>16) + (G[4]<<16|G[4]>>16);
59          X[7]= G[7] + (G[6]<< 8|G[6]>>24) +  G[5]              ;
60          if (c)  { if (--c==0)  if (b==1)  f=2;  continue; }
61          // MSB hier oben
62          s[1] = (X[6]>>16 ^ X[1]    )&0xFFFFu, s[1]<<=16;
63          s[1]|= (X[6]     ^ X[3]>>16)&0xFFFFu, s[1]<<=16;
64          s[1]|= (X[4]>>16 ^ X[7]    )&0xFFFFu, s[1]<<=16;
65          s[1]|= (X[4]     ^ X[1]>>16)&0xFFFFu           ;
66          s[0] = (X[2]>>16 ^ X[5]    )&0xFFFFu, s[0]<<=16;
67          s[0]|= (X[2]     ^ X[7]>>16)&0xFFFFu, s[0]<<=16;
68          s[0]|= (X[0]>>16 ^ X[3]    )&0xFFFFu, s[0]<<=16;
69          s[0]|= (X[0]     ^ X[5]>>16)&0xFFFFu           ;
70          if (RABBIT_TEST>0)  {
71            if (wr-->0)  {
72              for (i=0; i<16; ++i) printf(" %02hhX", (byte)(s[i/8]>>8*(i%8)));
73              printf("\n"); continue; } else break;
74          }
75          //...
76          continue;
77       }
78       break;
79    }
80 
81 
82 

Copyright © Helmut Schellong, 2022