X-Git-Url: https://git.cryptolib.org/?a=blobdiff_plain;f=arcfour-asm.S;h=1ef8218ce971a608ffaf096959dc40fb63141804;hb=83d0614d8b17eac97f891f7de2bb3ef265751dea;hp=78d0491ed0c78b3001d3b5ea28fe3a4cb66e4aae;hpb=3c995d0a8faeb9d37927d48e20fc45d839e066ea;p=avr-crypto-lib.git
diff --git a/arcfour-asm.S b/arcfour-asm.S
index 78d0491..1ef8218 100644
--- a/arcfour-asm.S
+++ b/arcfour-asm.S
@@ -1,74 +1,85 @@
+/* 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: 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
/*