]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - arcfour/arcfour-asm.S
modified structure
[avr-crypto-lib.git] / arcfour / arcfour-asm.S
diff --git a/arcfour/arcfour-asm.S b/arcfour/arcfour-asm.S
new file mode 100644 (file)
index 0000000..1ef8218
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+*/
+
+/* 
+ * 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 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
+
+
+
+
+
+