3 This file is part of the Crypto-avr-lib/microcrypt-lib.
4 Copyright (C) 2008 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 * File: serpent_sboxes.S
24 * License: GPLv3 or later
25 * Description: Implementation of the serpent sbox function.
31 /*******************************************************************************
33 *******************************************************************************/
35 .macro push_ p1:req, p2:vararg
42 .macro pop_ p1:req, p2:vararg
49 .macro push_range from:req, to:req
52 push_range "(\from+1)",\to
56 .macro pop_range from:req, to:req
59 pop_range \from,"(\to-1)"
63 .macro stack_alloc size:req, reg1=r30, reg2=r31
64 in r0, _SFR_IO_ADDR(SREG)
66 in \reg1, _SFR_IO_ADDR(SPL)
67 in \reg2, _SFR_IO_ADDR(SPH)
69 out _SFR_IO_ADDR(SPH), \reg2
70 out _SFR_IO_ADDR(SPL), \reg1
71 out _SFR_IO_ADDR(SREG), r0
74 .macro stack_free size:req, reg1=r30, reg2=r31
75 in r0, _SFR_IO_ADDR(SREG)
77 in \reg1, _SFR_IO_ADDR(SPL)
78 in \reg2, _SFR_IO_ADDR(SPH)
80 out _SFR_IO_ADDR(SPH), \reg2
81 out _SFR_IO_ADDR(SPL), \reg1
82 out _SFR_IO_ADDR(SREG), r0
85 /*******************************************************************************
86 * END of MACRO SECTION *
87 *******************************************************************************/
89 .byte 0x83, 0x1F, 0x6A, 0xB5, 0xDE, 0x24, 0x07, 0xC9
90 .byte 0xCF, 0x72, 0x09, 0xA5, 0xB1, 0x8E, 0xD6, 0x43
91 .byte 0x68, 0x97, 0xC3, 0xFA, 0x1D, 0x4E, 0xB0, 0x25
92 .byte 0xF0, 0x8B, 0x9C, 0x36, 0x1D, 0x42, 0x7A, 0xE5
93 .byte 0xF1, 0x38, 0x0C, 0x6B, 0x52, 0xA4, 0xE9, 0xD7
94 .byte 0x5F, 0xB2, 0xA4, 0xC9, 0x30, 0x8E, 0x6D, 0x17
95 .byte 0x27, 0x5C, 0x48, 0xB6, 0x9E, 0xF1, 0x3D, 0x0A
96 .byte 0xD1, 0x0F, 0x8E, 0xB2, 0x47, 0xAC, 0x39, 0x65
99 .byte 0x3D, 0x0B, 0x6A, 0xC5, 0xE1, 0x74, 0x9F, 0x28
100 .byte 0x85, 0xE2, 0x6F, 0x3C, 0x4B, 0x97, 0xD1, 0x0A
101 .byte 0x9C, 0x4F, 0xEB, 0x21, 0x30, 0xD6, 0x85, 0x7A
102 .byte 0x90, 0x7A, 0xEB, 0xD6, 0x53, 0x2C, 0x84, 0x1F
103 .byte 0x05, 0x38, 0x9A, 0xE7, 0xC2, 0x6B, 0xF4, 0x1D
104 .byte 0xF8, 0x92, 0x14, 0xED, 0x6B, 0x35, 0xC7, 0x0A
105 .byte 0xAF, 0xD1, 0x35, 0x06, 0x94, 0x7E, 0xC2, 0xB8
106 .byte 0x03, 0xD6, 0xE9, 0x8F, 0xC5, 0x7B, 0x1A, 0x24
109 * void ip(uint32_t *i, uint8_t *o){
112 * param i is given in r24:r25
113 * parma o is given in r22:r23
127 /* now the whole input is loaded in r2-r18 */
160 * void serpent_fp(uint32_t *i, uint8_t *o){
163 * param i is given in r24:r25
164 * parma o is given in r22:r23
198 * void inv_sbox128(void * w, uint8_t box)
207 * void sbox128(void * w, uint8_t box);
210 * param w is passed in r24:r25
211 * param box is passed in r22
218 * void sbox128x(void * w, uint8_t box);
221 * param w is passed in r24:r25
222 * param box is passed in r22
229 push_ r24, r25, r22, r30, r31
230 movw r22, r30 /* Z points to the stack buffer */
233 ldi r25, hi8(serpent_sbox)
234 ldi r24, lo8(serpent_sbox)
236 lsr r22 /* r22 *= 8 */
239 /* now we have X pointing to the buffer and (r24:r25) pointing to the SBox */