]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - arcfour-asm.S
fixed small bug in MD5
[avr-crypto-lib.git] / arcfour-asm.S
index d3ecadbf4857f6fc7e4cfd627c5b38a11120e094..b506dc4953fd9701ec5ca38f2be9b86d5e116c06 100644 (file)
  * 
  */
  
+#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
 
 /*