]> git.cryptolib.org Git - arm-crypto-lib.git/blob - bmw/autogen_f1_large.rb
including even/odd-trick for BMW
[arm-crypto-lib.git] / bmw / autogen_f1_large.rb
1 # autogen f1 function for BMW
2
3 header = <<EOF
4 /* BEGIN of automatic generated code */
5
6 static inline
7 void bmw_large_f1(uint64_t* q, const void* m, const void* h){ 
8   uint64_t even, odd;
9 EOF
10
11 footer = <<EOF
12 }
13
14 /* END of automatic generated code */
15
16 EOF
17
18 =begin
19   uint32_t r;
20   /* r = 0x05555555*(j+16); */
21   r = (   ROTL32(((uint32_t*)m)[j],      ((j+0))+1  )
22          + ROTL32(((uint32_t*)m)[(j+3)],  ((j+3))+1  )
23          - ROTL32(((uint32_t*)m)[(j+10)], ((j+10))+1 )
24          + k_lut[j]
25        ) ^ ((uint32_t*)h)[(j+7)];
26   r += S32_1(q[j+ 0]) + S32_2(q[j+ 1]) + S32_3(q[j+ 2]) + S32_0(q[j+ 3]) +
27      S32_1(q[j+ 4]) + S32_2(q[j+ 5]) + S32_3(q[j+ 6]) + S32_0(q[j+ 7]) +
28      S32_1(q[j+ 8]) + S32_2(q[j+ 9]) + S32_3(q[j+10]) + S32_0(q[j+11]) +
29      S32_1(q[j+12]) + S32_2(q[j+13]) + S32_3(q[j+14]) + S32_0(q[j+15]);
30 =end
31
32 def expand_1(j)
33   s = sprintf("/* expand_1(%2d) */\n", j)
34   s += sprintf("\tq[%2d] = \n", j+16)
35   s += sprintf("\t\t((  ROTL64(((uint64_t*)m)[%2d], %d) \n", j%16,      (j%16)+1)
36   s += sprintf("\t\t  + ROTL64(((uint64_t*)m)[%2d], %d) \n", (j+ 3)%16, ((j+ 3)%16)+1)
37   s += sprintf("\t\t  - ROTL64(((uint64_t*)m)[%2d], %d) \n", (j+10)%16, ((j+10)%16)+1)
38   s += sprintf("\t\t  + 0x%016xULL \n", 0x0555_5555_5555_5555*(16+j))
39   s += sprintf("\t\t )^ ((uint64_t*)h)[%2d] \n", (j+7)%16)
40   s += sprintf("\t\t)");
41   (0..15).each do |x|
42     s += (x%4==0)?"\n\t\t":" "
43     s += sprintf("+ S64_%d(q[%2d])", (x+1)%4, x+j)
44   end
45   s += ';'
46   return s
47 end
48
49
50 def expand_2(j, start)
51   s = sprintf("/* expand_2(%2d) */\n", j)
52   s += sprintf("\tq[%2d] = \n", j+16)
53   s += sprintf("\t\t((  ROTL64(((uint64_t*)m)[%2d], %d) \n", j%16,      (j%16)+1)
54   s += sprintf("\t\t  + ROTL64(((uint64_t*)m)[%2d], %d) \n", (j+ 3)%16, ((j+ 3)%16)+1)
55   s += sprintf("\t\t  - ROTL64(((uint64_t*)m)[%2d], %d) \n", (j+10)%16, ((j+10)%16)+1)
56   s += sprintf("\t\t  + 0x%016xULL \n", 0x0555_5555_5555_5555*(16+j))
57   s += sprintf("\t\t )^ ((uint64_t*)h)[%2d] \n", (j+7)%16)
58   s += sprintf("\t\t)");
59   if(j-1<=start) 
60     if(j%2==0)
61       # even
62       s += sprintf("\n\t\t + ( even =  q[%2d] + q[%2d] + q[%2d]",j,j+2,j+4)
63       s += sprintf("\n\t\t           + q[%2d] + q[%2d] + q[%2d] + q[%2d] )",j+6,j+8,j+10,j+12)
64       s += sprintf("\n\t\t + R64_1(q[%2d]) + R64_2(q[%2d]) + R64_3(q[%2d])",j+1,j+3,j+5)
65       s += sprintf("\n\t\t + R64_4(q[%2d]) + R64_5(q[%2d]) + R64_6(q[%2d])",j+7,j+9,j+11)
66       s += sprintf("\n\t\t + R64_7(q[%2d]) + S64_4(q[%2d]) + S64_5(q[%2d])",j+13,j+14,j+15)
67     else
68       # odd
69       s += sprintf("\n\t\t + ( odd  =  q[%2d] + q[%2d] + q[%2d]",j,j+2,j+4)
70       s += sprintf("\n\t\t           + q[%2d] + q[%2d] + q[%2d] + q[%2d] )",j+6,j+8,j+10,j+12)
71       s += sprintf("\n\t\t + R64_1(q[%2d]) + R64_2(q[%2d]) + R64_3(q[%2d])",j+1,j+3,j+5)
72       s += sprintf("\n\t\t + R64_4(q[%2d]) + R64_5(q[%2d]) + R64_6(q[%2d])",j+7,j+9,j+11)
73       s += sprintf("\n\t\t + R64_7(q[%2d]) + S64_4(q[%2d]) + S64_5(q[%2d])",j+13,j+14,j+15)
74     end 
75   else 
76     s += sprintf("\n\t\t + ( %s  +=  q[%2d] - q[%2d] )",(j%2==0)?"even":"odd ",j+12,j-2)    
77     s += sprintf("\n\t\t + R64_1(q[%2d]) + R64_2(q[%2d]) + R64_3(q[%2d])",j+1,j+3,j+5)
78     s += sprintf("\n\t\t + R64_4(q[%2d]) + R64_5(q[%2d]) + R64_6(q[%2d])",j+7,j+9,j+11)
79     s += sprintf("\n\t\t + R64_7(q[%2d]) + S64_4(q[%2d]) + S64_5(q[%2d])",j+13,j+14,j+15)  
80   end 
81   s += ';'
82   return s
83 end
84
85
86 puts header
87 (0..1).each  {|x| puts expand_1(x)}
88 (2..15).each {|x| puts expand_2(x, 2)}
89 puts footer