|
1
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;
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
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