]> git.cryptolib.org Git - arm-crypto-lib.git/blob - bmw/autogen_f1.rb
b95608312ac8641e8aee52e296fe02c79de56bb9
[arm-crypto-lib.git] / bmw / autogen_f1.rb
1 # autogen f1 function for BMW
2
3 header = <<EOF
4 /* BEGIN of automatic generated code */
5
6 static inline
7 void bmw_small_f1(uint32_t* q, const void* m, const void* h){ 
8 EOF
9
10 footer = <<EOF
11 }
12
13 /* END of automatic generated code */
14
15 EOF
16
17 =begin
18   uint32_t r;
19   /* r = 0x05555555*(j+16); */
20   r = (   ROTL32(((uint32_t*)m)[j],      ((j+0))+1  )
21          + ROTL32(((uint32_t*)m)[(j+3)],  ((j+3))+1  )
22          - ROTL32(((uint32_t*)m)[(j+10)], ((j+10))+1 )
23          + k_lut[j]
24        ) ^ ((uint32_t*)h)[(j+7)];
25   r += S32_1(q[j+ 0]) + S32_2(q[j+ 1]) + S32_3(q[j+ 2]) + S32_0(q[j+ 3]) +
26      S32_1(q[j+ 4]) + S32_2(q[j+ 5]) + S32_3(q[j+ 6]) + S32_0(q[j+ 7]) +
27      S32_1(q[j+ 8]) + S32_2(q[j+ 9]) + S32_3(q[j+10]) + S32_0(q[j+11]) +
28      S32_1(q[j+12]) + S32_2(q[j+13]) + S32_3(q[j+14]) + S32_0(q[j+15]);
29 =end
30
31 def expand_1(j)
32   s = sprintf("/* expand_1(%2d) */\n", j)
33   s += sprintf("\tq[%2d] = \n", j+16)
34   s += sprintf("\t\t((  ROTL32(((uint32_t*)m)[%2d], %d) \n", j%16,      (j%16)+1)
35   s += sprintf("\t\t  + ROTL32(((uint32_t*)m)[%2d], %d) \n", (j+ 3)%16, ((j+ 3)%16)+1)
36   s += sprintf("\t\t  - ROTL32(((uint32_t*)m)[%2d], %d) \n", (j+10)%16, ((j+10)%16)+1)
37   s += sprintf("\t\t  + 0x%08xUL \n", 0x0555_5555*(16+j))
38   s += sprintf("\t\t )^ ((uint32_t*)h)[%2d] \n", (j+7)%16)
39   s += sprintf("\t\t)");
40   (0..15).each do |x|
41     s += (x%4==0)?"\n\t\t":" "
42     s += sprintf("+ S32_%d(q[%2d])", (x+1)%4, x+j)
43   end
44   s += ';'
45   return s
46 end
47
48
49 def expand_2(j)
50   s = sprintf("/* expand_2(%2d) */\n", j)
51   s += sprintf("\tq[%2d] = \n", j+16)
52   s += sprintf("\t\t((  ROTL32(((uint32_t*)m)[%2d], %d) \n", j%16,      (j%16)+1)
53   s += sprintf("\t\t  + ROTL32(((uint32_t*)m)[%2d], %d) \n", (j+ 3)%16, ((j+ 3)%16)+1)
54   s += sprintf("\t\t  - ROTL32(((uint32_t*)m)[%2d], %d) \n", (j+10)%16, ((j+10)%16)+1)
55   s += sprintf("\t\t  + 0x%08xUL \n", 0x0555_5555*(16+j))
56   s += sprintf("\t\t )^ ((uint32_t*)h)[%2d] \n", (j+7)%16)
57   s += sprintf("\t\t)");
58   (0..13).each do |x|
59     s += (x%4==0)?"\n\t\t":" "
60     if x%2==0
61       s += sprintf("+       q[%2d] ",  x+j)
62     else
63       s += sprintf("+ R32_%d(q[%2d])", (x+1)/2, x+j)
64     end
65   end
66   s += sprintf(" + S32_4(q[%2d]) + S32_5(q[%2d])", j+14, j+15)
67   s += ';'
68   return s
69 end
70
71
72 puts header
73 (0..1).each  {|x| puts expand_1(x)}
74 (2..15).each {|x| puts expand_2(x)}
75 puts footer