Revert "Merge branch 'upstream' into tizen"
[platform/upstream/nettle.git] / x86_64 / sha1-compress.asm
1 C nettle, low-level cryptographics library
2
3 C Copyright (C) 2004, 2008 Niels Möller
4 C  
5 C The nettle library is free software; you can redistribute it and/or modify
6 C it under the terms of the GNU Lesser General Public License as published by
7 C the Free Software Foundation; either version 2.1 of the License, or (at your
8 C option) any later version.
9
10 C The nettle library is distributed in the hope that it will be useful, but
11 C WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 C or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
13 C License for more details.
14
15 C You should have received a copy of the GNU Lesser General Public License
16 C along with the nettle library; see the file COPYING.LIB.  If not, write to
17 C the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18 C MA 02111-1301, USA.
19
20 C Register usage. KVALUE and INPUT share a register.
21 define(<SA>,<%eax>)dnl
22 define(<SB>,<%r8d>)dnl
23 define(<SC>,<%ecx>)dnl
24 define(<SD>,<%edx>)dnl
25 define(<SE>,<%r9d>)dnl
26 define(<DATA>,<%rsp>)dnl
27 define(<TMP>,<%r10d>)dnl
28 define(<TMP2>,<%r11d>)dnl                       C  Used by F3
29 define(<KVALUE>, <%esi>)dnl                     
30
31 C Arguments
32 define(<STATE>,<%rdi>)dnl
33 define(<INPUT>,<%rsi>)dnl
34
35 C Constants
36 define(<K1VALUE>, <<$>0x5A827999>)dnl           C  Rounds  0-19
37 define(<K2VALUE>, <<$>0x6ED9EBA1>)dnl           C  Rounds 20-39
38 define(<K3VALUE>, <<$>0x8F1BBCDC>)dnl           C  Rounds 40-59
39 define(<K4VALUE>, <<$>0xCA62C1D6>)dnl           C  Rounds 60-79
40         
41 C Reads the input into register, byteswaps it, and stores it in the DATA array.
42 C SWAP(index, register)
43 define(<SWAP>, <
44         movl    OFFSET($1)(INPUT), $2
45         bswap   $2
46         movl    $2, OFFSET($1) (DATA)
47 >)dnl
48
49 C expand(i) is the expansion function
50 C
51 C   W[i] = (W[i - 16] ^ W[i - 14] ^ W[i - 8] ^ W[i - 3]) <<< 1
52 C
53 C where W[i] is stored in DATA[i mod 16].
54 C
55 C Result is stored back in W[i], and also left in TMP, the only
56 C register that is used.
57 define(<EXPAND>, <
58         movl    OFFSET(eval($1 % 16)) (DATA), TMP
59         xorl    OFFSET(eval(($1 +  2) % 16)) (DATA), TMP
60         xorl    OFFSET(eval(($1 +  8) % 16)) (DATA), TMP
61         xorl    OFFSET(eval(($1 + 13) % 16)) (DATA), TMP
62         roll    <$>1, TMP
63         movl    TMP, OFFSET(eval($1 % 16)) (DATA)>)dnl
64 define(<NOEXPAND>, <OFFSET($1) (DATA)>)dnl
65
66 C The f functions,
67 C
68 C  f1(x,y,z) = z ^ (x & (y ^ z))
69 C  f2(x,y,z) = x ^ y ^ z
70 C  f3(x,y,z) = (x & y) | (z & (x | y))
71 C  f4 = f2
72 C
73 C The macro Fk(x,y,z) computes = fk(x,y,z). 
74 C Result is left in TMP.
75 define(<F1>, <
76         movl    $3, TMP
77         xorl    $2, TMP
78         andl    $1, TMP
79         xorl    $3, TMP>)dnl
80 define(<F2>, <
81         movl    $1, TMP
82         xorl    $2, TMP
83         xorl    $3, TMP>)dnl
84 C Uses TMP2
85 define(<F3>, <
86         movl    $1, TMP2
87         andl    $2, TMP2
88         movl    $1, TMP
89         orl     $2, TMP
90         andl    $3, TMP
91         orl     TMP2, TMP>)dnl
92
93 C The form of one sha1 round is
94 C
95 C   a' = e + a <<< 5 + f( b, c, d ) + k + w;
96 C   b' = a;
97 C   c' = b <<< 30;
98 C   d' = c;
99 C   e' = d;
100 C
101 C where <<< denotes rotation. We permute our variables, so that we
102 C instead get
103 C
104 C   e += a <<< 5 + f( b, c, d ) + k + w;
105 C   b <<<= 30
106 C
107 C ROUND(a,b,c,d,e,f,w)
108 define(<ROUND>, <
109         addl    KVALUE, $5
110         addl    ifelse($7,,TMP,$7), $5
111         $6($2,$3,$4)
112         addl    TMP, $5
113
114 C Using the TMP register could be avoided, by rotating $1 in place,
115 C adding, and then rotating back.
116         movl    $1, TMP
117         roll    <$>5, TMP
118         addl    TMP, $5
119         roll    <$>30, $2>)dnl
120
121         .file "sha1-compress.asm"
122
123         C _nettle_sha1_compress(uint32_t *state, uint8_t *input)
124         
125         .text
126         ALIGN(16)
127 PROLOGUE(_nettle_sha1_compress)
128         C save all registers that need to be saved
129         W64_ENTRY(2, 0)
130         
131         sub     $68, %rsp       C  %rsp = W
132
133         C Load and byteswap data
134         SWAP( 0, SA) SWAP( 1, SB) SWAP( 2, SC) SWAP( 3, SD)
135         SWAP( 4, SA) SWAP( 5, SB) SWAP( 6, SC) SWAP( 7, SD)
136         SWAP( 8, SA) SWAP( 9, SB) SWAP(10, SC) SWAP(11, SD)
137         SWAP(12, SA) SWAP(13, SB) SWAP(14, SC) SWAP(15, SD)
138
139         C Load the state vector
140         movl      (STATE), SA
141         movl     4(STATE), SB
142         movl     8(STATE), SC
143         movl    12(STATE), SD
144         movl    16(STATE), SE
145
146         movl    K1VALUE, KVALUE
147         ROUND(SA, SB, SC, SD, SE, <F1>, NOEXPAND( 0))
148         ROUND(SE, SA, SB, SC, SD, <F1>, NOEXPAND( 1))
149         ROUND(SD, SE, SA, SB, SC, <F1>, NOEXPAND( 2))
150         ROUND(SC, SD, SE, SA, SB, <F1>, NOEXPAND( 3))
151         ROUND(SB, SC, SD, SE, SA, <F1>, NOEXPAND( 4))
152
153         ROUND(SA, SB, SC, SD, SE, <F1>, NOEXPAND( 5))
154         ROUND(SE, SA, SB, SC, SD, <F1>, NOEXPAND( 6))
155         ROUND(SD, SE, SA, SB, SC, <F1>, NOEXPAND( 7))
156         ROUND(SC, SD, SE, SA, SB, <F1>, NOEXPAND( 8))
157         ROUND(SB, SC, SD, SE, SA, <F1>, NOEXPAND( 9))
158
159         ROUND(SA, SB, SC, SD, SE, <F1>, NOEXPAND(10))
160         ROUND(SE, SA, SB, SC, SD, <F1>, NOEXPAND(11))
161         ROUND(SD, SE, SA, SB, SC, <F1>, NOEXPAND(12))
162         ROUND(SC, SD, SE, SA, SB, <F1>, NOEXPAND(13))
163         ROUND(SB, SC, SD, SE, SA, <F1>, NOEXPAND(14))
164
165         ROUND(SA, SB, SC, SD, SE, <F1>, NOEXPAND(15))
166         EXPAND(16) ROUND(SE, SA, SB, SC, SD, <F1>)
167         EXPAND(17) ROUND(SD, SE, SA, SB, SC, <F1>)
168         EXPAND(18) ROUND(SC, SD, SE, SA, SB, <F1>)
169         EXPAND(19) ROUND(SB, SC, SD, SE, SA, <F1>)
170
171         movl    K2VALUE, KVALUE
172         EXPAND(20) ROUND(SA, SB, SC, SD, SE, <F2>)
173         EXPAND(21) ROUND(SE, SA, SB, SC, SD, <F2>)
174         EXPAND(22) ROUND(SD, SE, SA, SB, SC, <F2>)
175         EXPAND(23) ROUND(SC, SD, SE, SA, SB, <F2>)
176         EXPAND(24) ROUND(SB, SC, SD, SE, SA, <F2>)
177
178         EXPAND(25) ROUND(SA, SB, SC, SD, SE, <F2>)
179         EXPAND(26) ROUND(SE, SA, SB, SC, SD, <F2>)
180         EXPAND(27) ROUND(SD, SE, SA, SB, SC, <F2>)
181         EXPAND(28) ROUND(SC, SD, SE, SA, SB, <F2>)
182         EXPAND(29) ROUND(SB, SC, SD, SE, SA, <F2>)
183
184         EXPAND(30) ROUND(SA, SB, SC, SD, SE, <F2>)
185         EXPAND(31) ROUND(SE, SA, SB, SC, SD, <F2>)
186         EXPAND(32) ROUND(SD, SE, SA, SB, SC, <F2>)
187         EXPAND(33) ROUND(SC, SD, SE, SA, SB, <F2>)
188         EXPAND(34) ROUND(SB, SC, SD, SE, SA, <F2>)
189
190         EXPAND(35) ROUND(SA, SB, SC, SD, SE, <F2>)
191         EXPAND(36) ROUND(SE, SA, SB, SC, SD, <F2>)
192         EXPAND(37) ROUND(SD, SE, SA, SB, SC, <F2>)
193         EXPAND(38) ROUND(SC, SD, SE, SA, SB, <F2>)
194         EXPAND(39) ROUND(SB, SC, SD, SE, SA, <F2>)
195
196         movl    K3VALUE, KVALUE
197         EXPAND(40) ROUND(SA, SB, SC, SD, SE, <F3>)
198         EXPAND(41) ROUND(SE, SA, SB, SC, SD, <F3>)
199         EXPAND(42) ROUND(SD, SE, SA, SB, SC, <F3>)
200         EXPAND(43) ROUND(SC, SD, SE, SA, SB, <F3>)
201         EXPAND(44) ROUND(SB, SC, SD, SE, SA, <F3>)
202
203         EXPAND(45) ROUND(SA, SB, SC, SD, SE, <F3>)
204         EXPAND(46) ROUND(SE, SA, SB, SC, SD, <F3>)
205         EXPAND(47) ROUND(SD, SE, SA, SB, SC, <F3>)
206         EXPAND(48) ROUND(SC, SD, SE, SA, SB, <F3>)
207         EXPAND(49) ROUND(SB, SC, SD, SE, SA, <F3>)
208
209         EXPAND(50) ROUND(SA, SB, SC, SD, SE, <F3>)
210         EXPAND(51) ROUND(SE, SA, SB, SC, SD, <F3>)
211         EXPAND(52) ROUND(SD, SE, SA, SB, SC, <F3>)
212         EXPAND(53) ROUND(SC, SD, SE, SA, SB, <F3>)
213         EXPAND(54) ROUND(SB, SC, SD, SE, SA, <F3>)
214
215         EXPAND(55) ROUND(SA, SB, SC, SD, SE, <F3>)
216         EXPAND(56) ROUND(SE, SA, SB, SC, SD, <F3>)
217         EXPAND(57) ROUND(SD, SE, SA, SB, SC, <F3>)
218         EXPAND(58) ROUND(SC, SD, SE, SA, SB, <F3>)
219         EXPAND(59) ROUND(SB, SC, SD, SE, SA, <F3>)
220
221         movl    K4VALUE, KVALUE
222         EXPAND(60) ROUND(SA, SB, SC, SD, SE, <F2>)
223         EXPAND(61) ROUND(SE, SA, SB, SC, SD, <F2>)
224         EXPAND(62) ROUND(SD, SE, SA, SB, SC, <F2>)
225         EXPAND(63) ROUND(SC, SD, SE, SA, SB, <F2>)
226         EXPAND(64) ROUND(SB, SC, SD, SE, SA, <F2>)
227
228         EXPAND(65) ROUND(SA, SB, SC, SD, SE, <F2>)
229         EXPAND(66) ROUND(SE, SA, SB, SC, SD, <F2>)
230         EXPAND(67) ROUND(SD, SE, SA, SB, SC, <F2>)
231         EXPAND(68) ROUND(SC, SD, SE, SA, SB, <F2>)
232         EXPAND(69) ROUND(SB, SC, SD, SE, SA, <F2>)
233
234         EXPAND(70) ROUND(SA, SB, SC, SD, SE, <F2>)
235         EXPAND(71) ROUND(SE, SA, SB, SC, SD, <F2>)
236         EXPAND(72) ROUND(SD, SE, SA, SB, SC, <F2>)
237         EXPAND(73) ROUND(SC, SD, SE, SA, SB, <F2>)
238         EXPAND(74) ROUND(SB, SC, SD, SE, SA, <F2>)
239
240         EXPAND(75) ROUND(SA, SB, SC, SD, SE, <F2>)
241         EXPAND(76) ROUND(SE, SA, SB, SC, SD, <F2>)
242         EXPAND(77) ROUND(SD, SE, SA, SB, SC, <F2>)
243         EXPAND(78) ROUND(SC, SD, SE, SA, SB, <F2>)
244         EXPAND(79) ROUND(SB, SC, SD, SE, SA, <F2>)
245
246         C Update the state vector
247         addl    SA,   (STATE) 
248         addl    SB,  4(STATE) 
249         addl    SC,  8(STATE) 
250         addl    SD, 12(STATE) 
251         addl    SE, 16(STATE)
252
253         add     $68, %rsp
254         W64_EXIT(2, 0)
255         ret
256 EPILOGUE(_nettle_sha1_compress)