X-Git-Url: https://git.cryptolib.org/?a=blobdiff_plain;f=arcfour-asm.S;h=6c8c351f677f6b68e218fd2857a3a2cee587ff53;hb=17332291e15183d71d88ed868275e3cb53917180;hp=78d0491ed0c78b3001d3b5ea28fe3a4cb66e4aae;hpb=3c995d0a8faeb9d37927d48e20fc45d839e066ea;p=avr-crypto-lib.git diff --git a/arcfour-asm.S b/arcfour-asm.S index 78d0491..6c8c351 100644 --- a/arcfour-asm.S +++ b/arcfour-asm.S @@ -1,74 +1,85 @@ +/* arcfour-asm.S */ +/* + This file is part of the This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + /* - * File: arcfour-asm.S - * Author: Daniel Otte - * Date: 07.06.2006 - * License: GPL + * File: arcfour-asm.S + * Author: Daniel Otte + * Date: 2006-07-06 + * License: GPLv3 or later * Description: Implementation of the ARCFOUR (RC4 compatible) stream cipher algorithm. * */ +#include +#include "avr-asm-macros.S" + /* +---+---+---------------------+ * | i | j | ......<256>........ | * +---+---+---------------------+ */ .global arcfour_init - -;== arcfour_init == -; this function initialises the context -; param1: 16-bit pointer to a ctx struct -; given in r25,r24 -; param2: 16-bit pointer to a key -; given in r23,r22 -; param1: 8-bit integer indicating keylength in byte -; given in r20 - +/* + *== arcfour_init == + * this function initialises the context + * param1: 16-bit pointer to the key + * given in r24:r25 + * param2: 8-bit integer indicating keylength in byte + * given in r22 + * param3: 16-bit pointer to a ctx struct + * given in r20:r21 + */ arcfour_init: - push r29 - push r28 - push r2 - - movw r26, r24 /* X points to ctx */ - movw r30, r22 /* Z points to key */ + push_ r28, r29 + movw r26, r20 /* X points to ctx */ + movw r30, r24 /* Z points to key */ st X+, r1 - st X+, r1 /* X points to S */ + st X+, r1 /* X points to S */ + movw r20, r26 /* store pointer to S in r21:r20 */ 1: st X+, r1 inc r1 brne 1b - adiw r24, 2 /* r24:r25 points to S */ - clr r21 /* r21 is j */ - mov r18, r20 /* r18 is keyindex counter */ + movw r26, r20 + add r22, r30 /* r18 is keyindex counter */ clr r0 + clr r19 2: - movw r26, r24 - ld r19, Z+ - add r21, r19 /* j+= key[i%length] */ - - add r26, r1 - adc r27, r0 - ld r19, X - add r21, r19 /* j += S[i] */ - - dec r18 /* check the key-index counter */ + ld r23, X + ld r18, Z+ + add r19, r18 + add r19, r23 + movw r28, r20 /* load pointer to S in Y */ + add r28, r19 + adc r29, r1 + ld r18, Y + st Y, r23 + st X+, r18 + cp r30, r22 brne 3f - movw r30, r22 - mov r18, r20 -3: /* now swap(S[i], S[j]) */ /* r19 is still S[i] */ - movw r28, r24 - add r28, r21 - adc r29, r0 /* Y points to S[j]*/ - ld r2, Y - st Y, r19 - st X, r2 - inc r1 + movw r30, r24 +3: + inc r0 brne 2b - - pop r2 - pop r28 - pop r29 + pop_ r29, r28 ret /*