]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - arcfour-asm.S
forgotten files
[avr-crypto-lib.git] / arcfour-asm.S
index 78d0491ed0c78b3001d3b5ea28fe3a4cb66e4aae..1ef8218ce971a608ffaf096959dc40fb63141804 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>.
+*/
+
 /* 
- * 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 <avr/io.h>
+#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
 
 /*