3 This file is part of the Crypto-avr-lib/microcrypt-lib.
4 Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 * License: GPLv3 or later
25 * Description: Implementation of the ARCFOUR (RC4 compatible) stream cipher algorithm.
29 /* +---+---+---------------------+
30 * | i | j | ......<256>........ |
31 * +---+---+---------------------+
37 ; this function initialises the context
38 ; param1: 16-bit pointer to a ctx struct
40 ; param2: 16-bit pointer to a key
42 ; param1: 8-bit integer indicating keylength in byte
50 movw r26, r24 /* X points to ctx */
51 movw r30, r22 /* Z points to key */
53 st X+, r1 /* X points to S */
60 adiw r24, 2 /* r24:r25 points to S */
61 clr r21 /* r21 is j */
62 mov r18, r20 /* r18 is keyindex counter */
67 add r21, r19 /* j+= key[i%length] */
72 add r21, r19 /* j += S[i] */
74 dec r18 /* check the key-index counter */
78 3: /* now swap(S[i], S[j]) */ /* r19 is still S[i] */
81 adc r29, r0 /* Y points to S[j]*/
94 uint8_t arcfour_gen(arcfour_ctx_t *c){
99 c->s[c->j] = c->s[c->i];
101 return c->s[(c->s[c->j] + c->s[c->i]) & 0xff];
107 ; this function initialises the context
108 ; param1: 16-bit pointer to a ctx struct
122 st Z+, r19 /* i,j loaded&saved; X->S[i]; Z->S[0]; r20=S[i] */
125 ld r21, Z /* X->S[i]; Z->S[j]; r20=S[i]; r21=S[j]*/
130 movw r26, r24 /* X and Z point to S */