1 # autogen f1 function for BMW
3 This file is part of the ARM-Crypto-Lib.
4 Copyright (C) 2006-2010 Daniel Otte (daniel.otte@rub.de)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 /* BEGIN of automatic generated code */
24 void bmw_small_f1(uint32_t* q, const void* m, const void* h){
30 /* END of automatic generated code */
36 /* r = 0x05555555*(j+16); */
37 r = ( ROTL32(((uint32_t*)m)[j], ((j+0))+1 )
38 + ROTL32(((uint32_t*)m)[(j+3)], ((j+3))+1 )
39 - ROTL32(((uint32_t*)m)[(j+10)], ((j+10))+1 )
41 ) ^ ((uint32_t*)h)[(j+7)];
42 r += S32_1(q[j+ 0]) + S32_2(q[j+ 1]) + S32_3(q[j+ 2]) + S32_0(q[j+ 3]) +
43 S32_1(q[j+ 4]) + S32_2(q[j+ 5]) + S32_3(q[j+ 6]) + S32_0(q[j+ 7]) +
44 S32_1(q[j+ 8]) + S32_2(q[j+ 9]) + S32_3(q[j+10]) + S32_0(q[j+11]) +
45 S32_1(q[j+12]) + S32_2(q[j+13]) + S32_3(q[j+14]) + S32_0(q[j+15]);
49 s = sprintf("/* expand_1(%2d) */\n", j)
50 s += sprintf("\tq[%2d] = \n", j+16)
51 s += sprintf("\t\t(( ROTL32(((uint32_t*)m)[%2d], %d) \n", j%16, (j%16)+1)
52 s += sprintf("\t\t + ROTL32(((uint32_t*)m)[%2d], %d) \n", (j+ 3)%16, ((j+ 3)%16)+1)
53 s += sprintf("\t\t - ROTL32(((uint32_t*)m)[%2d], %d) \n", (j+10)%16, ((j+10)%16)+1)
54 s += sprintf("\t\t + 0x%08xUL \n", 0x0555_5555*(16+j))
55 s += sprintf("\t\t )^ ((uint32_t*)h)[%2d] \n", (j+7)%16)
56 s += sprintf("\t\t)");
58 s += (x%4==0)?"\n\t\t":" "
59 s += sprintf("+ S32_%d(q[%2d])", (x+1)%4, x+j)
67 s = sprintf("/* expand_2(%2d) */\n", j)
68 s += sprintf("\tq[%2d] = \n", j+16)
69 s += sprintf("\t\t(( ROTL32(((uint32_t*)m)[%2d], %d) \n", j%16, (j%16)+1)
70 s += sprintf("\t\t + ROTL32(((uint32_t*)m)[%2d], %d) \n", (j+ 3)%16, ((j+ 3)%16)+1)
71 s += sprintf("\t\t - ROTL32(((uint32_t*)m)[%2d], %d) \n", (j+10)%16, ((j+10)%16)+1)
72 s += sprintf("\t\t + 0x%08xUL \n", 0x0555_5555*(16+j))
73 s += sprintf("\t\t )^ ((uint32_t*)h)[%2d] \n", (j+7)%16)
74 s += sprintf("\t\t)");
76 s += (x%4==0)?"\n\t\t":" "
78 s += sprintf("+ q[%2d] ", x+j)
80 s += sprintf("+ R32_%d(q[%2d])", (x+1)/2, x+j)
83 s += sprintf(" + S32_4(q[%2d]) + S32_5(q[%2d])", j+14, j+15)
90 (0..1).each {|x| puts expand_1(x)}
91 (2..15).each {|x| puts expand_2(x)}