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
+
+
+
+
+
+