3 This file is part of the AVR-Crypto-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 * \email daniel.otte@rub.de
24 * \license GPLv3 or later
28 #include "avr-asm-macros.S"
31 .byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
32 .byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
33 .byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
34 .byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
35 .byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
36 .byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
37 .byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
38 .byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
39 .byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
40 .byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
41 .byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
42 .byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
43 .byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
44 .byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
45 .byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
46 .byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
47 .byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
48 .byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
49 .byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
50 .byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
51 .byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
52 .byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
53 .byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
54 .byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
55 .byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
56 .byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
57 .byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
58 .byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
59 .byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
60 .byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
61 .byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
62 .byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
68 .global twister_mini_round
101 .global twister_blank_round
106 stack_alloc_large 64, r28, r29
111 adiw r30, 1+8 /* Z points behind counter */
115 1: /* "add" counter */
124 /* decrement counter */
136 adiw r28, 1 /* Y points to stack memory */
139 ldi r20, lo8(twister_sbox)
140 ldi r21, hi8(twister_sbox)
145 2: /* sbox substitution */
165 /* load MDS-Table to MDS0:MDS7 */
181 ldi r20, 0x4D /* reducer for gf256mul*/
260 /*********************************************************************/
285 /*********************************************************************/
286 /* twister_ctx2hash */
288 * param dest: r24:r25
290 * param hashsize_b: r20:r21
302 .global twister_ctx2hash
303 .global twister_small_ctx2hash
304 .global twister_big_ctx2hash
305 .global twister224_ctx2hash
306 .global twister256_ctx2hash
307 .global twister384_ctx2hash
308 .global twister512_ctx2hash
313 rjmp twister_ctx2hash
318 rjmp twister_ctx2hash
323 rjmp twister_ctx2hash
328 ; rjmp twister_ctx2hash
330 twister_big_ctx2hash:
331 twister_small_ctx2hash:
345 ror r20 /* length is max 512 so we now only have to shift r20 */
346 swap r20 /* this is faster than 4 shifts */
373 rcall twister_blank_round
387 rcall twister_blank_round
440 /*********************************************************************/
441 /* void twister_small_nextBlock(twister_state_t* ctx, void* msg) */
452 .global twister_small_nextBlock
453 .global twister224_nextBlock
454 .global twister256_nextBlock
456 twister224_nextBlock:
457 twister256_nextBlock:
458 twister_small_nextBlock:
489 rcall twister_mini_round
494 rcall twister_mini_round
499 rcall twister_mini_round
516 rcall twister_mini_round
521 rcall twister_mini_round
526 rcall twister_mini_round
543 rcall twister_mini_round
548 rcall twister_mini_round
551 rcall twister_blank_round