Imported Upstream version 2.4
[platform/upstream/nettle.git] / x86_64 / camellia-crypt-internal.asm
1 C -*- mode: asm; asm-comment-char: ?C; -*-  
2 C nettle, low-level cryptographics library
3
4 C Copyright (C) 2010, Niels Möller
5 C  
6 C The nettle library is free software; you can redistribute it and/or modify
7 C it under the terms of the GNU Lesser General Public License as published by
8 C the Free Software Foundation; either version 2.1 of the License, or (at your
9 C option) any later version.
10
11 C The nettle library is distributed in the hope that it will be useful, but
12 C WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 C or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14 C License for more details.
15
16 C You should have received a copy of the GNU Lesser General Public License
17 C along with the nettle library; see the file COPYING.LIB.  If not, write to
18 C the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
19 C MA 02111-1307, USA.
20
21 C Performance, cycles per block
22 C
23 C               Intel SU4100
24 C                 C  asm
25 C Camellia-128  415  347
26 C Camellia-256  543  461
27
28 C Register usage:
29
30 define(<CTX>, <%rdi>)
31 define(<TABLE>, <%rsi>)
32 define(<LENGTH>, <%rdx>)
33 define(<DST>, <%rcx>)
34 define(<SRC>, <%r8>)
35
36 C Camellia state
37 define(<I0>, <%rax>)
38 define(<I1>, <%rbx>) C callee-save
39 define(<KEY>, <%r9>)
40 define(<TMP>, <%rbp>) C callee-save
41 define(<CNT>, <%r10>)
42 define(<IL>,  <%r11>)
43 define(<IR>,  <%r12>) C callee-save
44
45 define(<SP1110>, <(TABLE,$1,4)>)
46 define(<SP0222>, <1024(TABLE,$1,4)>)
47 define(<SP3033>, <2048(TABLE,$1,4)>)
48 define(<SP4404>, <3072(TABLE,$1,4)>)
49
50 C ROUND(x, y, key-offset)
51 define(<ROUND>, <
52         C Byte 0,1
53         movzbl  LREG($1), XREG(TMP)
54         movl    SP1110(TMP), XREG(IR)
55         movzbl  HREG($1), XREG(TMP)
56         xorl    SP4404(TMP), XREG(IR)
57         ror     <$>32, $1
58
59         C Byte 4,5
60         movzbl  LREG($1), XREG(TMP)
61         movl    SP4404(TMP), XREG(IL)
62         movzbl  HREG($1), XREG(TMP)
63         xorl    SP3033(TMP), XREG(IL)
64         rol     <$>16, $1
65
66         C Byte 2,3
67         movzbl  LREG($1), XREG(TMP)
68         xorl    SP3033(TMP), XREG(IR)
69         movzbl  HREG($1), XREG(TMP)
70         xorl    SP0222(TMP), XREG(IR)
71         ror     <$>32, $1
72
73         C Byte 6,7
74         movzbl  LREG($1), XREG(TMP)
75         xorl    SP0222(TMP), XREG(IL)
76         movzbl  HREG($1), XREG(TMP)
77         xorl    SP1110(TMP), XREG(IL)
78         ror     <$>16, $1
79
80         C 76543210
81         
82         xorl    XREG(IL), XREG(IR)
83         rorl    <$>8, XREG(IL)
84         xorl    XREG(IR), XREG(IL)
85         shl     <$>32, IR
86         or      IL, IR
87         xor     $3(KEY), $2
88         xor     IR, $2
89 >)
90
91 C FL(x, key-offset)
92 define(<FL>, <
93         mov     $1, TMP
94         shr     <$>32, TMP
95         andl    $2 + 4(KEY), XREG(TMP)
96         roll    <$>1, XREG(TMP)
97 C       xorl    XREG(TMP), XREG($1)
98         xor     TMP, $1
99         movl    $2(KEY), XREG(TMP)
100         orl     XREG($1), XREG(TMP)
101         shl     <$>32, TMP
102         xor     TMP, $1
103 >)
104 C FLINV(x0, key-offset)
105 define(<FLINV>, <
106         movl    $2(KEY), XREG(TMP)
107         orl     XREG($1), XREG(TMP)
108         shl     <$>32, TMP
109         xor     TMP, $1
110         mov     $1, TMP
111         shr     <$>32, TMP
112         andl    $2 + 4(KEY), XREG(TMP)
113         roll    <$>1, XREG(TMP)
114 C       xorl    XREG(TMP), XREG($1)
115         xor     TMP, $1 
116 >)
117
118         .file "camellia-encrypt-internal.asm"
119         
120         C _camellia_crypt(struct camellia_context *ctx, 
121         C                 const struct camellia_table *T,
122         C                 unsigned length, uint8_t *dst,
123         C                 uint8_t *src)
124         .text
125         ALIGN(4)
126 PROLOGUE(_nettle_camellia_crypt)
127
128         test    LENGTH, LENGTH
129         jz      .Lend
130
131         push    %rbx
132         push    %rbp
133         push    %r12
134         
135 .Lblock_loop:
136         C Load data, note that we'll happily do unaligned loads
137         mov     (SRC), I0
138         bswap   I0
139         mov     8(SRC), I1
140         bswap   I1
141         add     $16, SRC
142         mov     CTX, KEY
143         movl    (KEY), XREG(CNT)
144         sub     $8, CNT
145
146         C       Whitening using first subkey 
147         xor     8(KEY), I0
148         add     $16, KEY
149
150         ROUND(I0, I1, 0)
151         ROUND(I1, I0, 8)
152         ROUND(I0, I1, 16)
153         ROUND(I1, I0, 24)
154         ROUND(I0, I1, 32) 
155         ROUND(I1, I0, 40)
156         
157 .Lround_loop:
158         add     $64, KEY
159         FL(I0, -16)
160         FLINV(I1, -8)
161         ROUND(I0, I1, 0)
162         ROUND(I1, I0, 8)
163         ROUND(I0, I1, 16)
164         ROUND(I1, I0, 24)
165         ROUND(I0, I1, 32) 
166         ROUND(I1, I0, 40)
167
168         sub     $8, CNT 
169         ja      .Lround_loop
170
171         bswap   I0
172         mov     I0, 8(DST)
173         xor     48(KEY), I1
174         bswap   I1
175         mov     I1, (DST)
176         add     $16, DST
177         sub     $16, LENGTH
178
179         ja      .Lblock_loop
180
181         pop     %r12
182         pop     %rbp
183         pop     %rbx
184 .Lend:
185         ret
186 EPILOGUE(_nettle_camellia_crypt)