X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=arcfour%2Farcfour-asm.S;fp=arcfour%2Farcfour-asm.S;h=1ef8218ce971a608ffaf096959dc40fb63141804;hp=0000000000000000000000000000000000000000;hb=d32eba56ce10ea6b9eff123b50d9842673b38f2b;hpb=8f855d283a31a468ea014774c4723a8b77b81644 diff --git a/arcfour/arcfour-asm.S b/arcfour/arcfour-asm.S new file mode 100644 index 0000000..1ef8218 --- /dev/null +++ b/arcfour/arcfour-asm.S @@ -0,0 +1,133 @@ +/* arcfour-asm.S */ +/* + 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: 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 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_ 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 */ + movw r20, r26 /* store pointer to S in r21:r20 */ + +1: + st X+, r1 + inc r1 + brne 1b + + movw r26, r20 + add r22, r30 /* r18 is keyindex counter */ + clr r0 + clr r19 +2: + 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, r24 +3: + inc r0 + brne 2b + pop_ r29, r28 + ret + +/* +uint8_t arcfour_gen(arcfour_ctx_t *c){ + uint8_t t; + c->i++; + c->j += c->s[c->i]; + t = c->s[c->j]; + c->s[c->j] = c->s[c->i]; + c->s[c->i] = t; + return c->s[(c->s[c->j] + c->s[c->i]) & 0xff]; +} +*/ +.global arcfour_gen + +;== arcfour_gen == +; this function initialises the context +; param1: 16-bit pointer to a ctx struct +; given in r25,r24 + +arcfour_gen: + movw r26, r24 + ld r18, X + inc r18 + st X+, r18 + movw r30, r26 + ld r19, X+ + add r26, r18 + adc r27, r1 + ld r20, X + add r19, r20 + st Z+, r19 /* i,j loaded&saved; X->S[i]; Z->S[0]; r20=S[i] */ + add r30, r19 + adc r31, r1 + ld r21, Z /* X->S[i]; Z->S[j]; r20=S[i]; r21=S[j]*/ + st Z, r20 + st X, r21 + add r20, r21 + adiw r24, 2 + movw r26, r24 /* X and Z point to S */ + add r26, r20 + adc r27, r1 + ld r24, X + clr r25 + ret + + + + + +