]> git.cryptolib.org Git - avr-crypto-lib.git/blob - noekeon/noekeon_cbc_enc.S
fixing E-Mail-Address & Copyright
[avr-crypto-lib.git] / noekeon / noekeon_cbc_enc.S
1 /* noekeon_cbc_enc.S */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org)
5
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.
10
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.
15
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/>.
18 */
19 /*
20  * \author  Daniel Otte
21  * \email   bg@nerilex.org
22  * \date    2008-08-06
23  * \license GPLv3 or later
24  *
25  *
26  *
27  */
28
29 .macro push_ p1:req p2:vararg
30         push \p1
31 .ifnb \p2
32         push_ \p2
33 .endif
34 .endm
35
36 .macro pop_ p1:req p2:vararg
37         pop \p1
38 .ifnb \p2
39         pop_ \p2
40 .endif
41 .endm
42
43 .extern noekeon_enc
44
45 /*
46  * void noekeon_cbc_enc(void *buffer, uint8_t block_cnt, const void *key)
47  */
48
49 /* param buffer    is passed in r24:r25
50  * param block_cnt is passed in r22 (r23 is 0)
51  * param key       is passed in r20:r21
52  */
53 .global noekeon_cbc_enc
54  noekeon_cbc_enc:
55         push r22
56         movw r22, r20
57         push_ r22, r23, r24, r25
58         rcall noekeon_enc
59 1:
60         pop_ r27, r26, r23, r22
61         pop r16 /* block  counter */
62         dec r16
63         breq 9f
64         push r16
65         /* xor blocks */
66         movw r30, r26
67         adiw r30, 16
68         ldi r16, 16
69 2:
70         ld r17, X+
71         ld r18, Z
72         eor r18, r17
73         st Z+, r18
74         dec r16
75         brne 2b
76
77         /* call encryption function; X points to our new block */
78         push_ r22, r23, r26, r27
79         movw r24, r26
80         rcall noekeon_enc
81         rjmp 1b
82 9:
83         ret
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99