CyaSSL is an SSL library for devices like mbed.

Dependents:   cyassl-client Sync

Committer:
toddouska
Date:
Sat Feb 05 01:09:17 2011 +0000
Revision:
0:5045d2638c29
Beta Version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
toddouska 0:5045d2638c29 1 /* arc4.c
toddouska 0:5045d2638c29 2 *
toddouska 0:5045d2638c29 3 * Copyright (C) 2006-2009 Sawtooth Consulting Ltd.
toddouska 0:5045d2638c29 4 *
toddouska 0:5045d2638c29 5 * This file is part of CyaSSL.
toddouska 0:5045d2638c29 6 *
toddouska 0:5045d2638c29 7 * CyaSSL is free software; you can redistribute it and/or modify
toddouska 0:5045d2638c29 8 * it under the terms of the GNU General Public License as published by
toddouska 0:5045d2638c29 9 * the Free Software Foundation; either version 2 of the License, or
toddouska 0:5045d2638c29 10 * (at your option) any later version.
toddouska 0:5045d2638c29 11 *
toddouska 0:5045d2638c29 12 * CyaSSL is distributed in the hope that it will be useful,
toddouska 0:5045d2638c29 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
toddouska 0:5045d2638c29 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
toddouska 0:5045d2638c29 15 * GNU General Public License for more details.
toddouska 0:5045d2638c29 16 *
toddouska 0:5045d2638c29 17 * You should have received a copy of the GNU General Public License
toddouska 0:5045d2638c29 18 * along with this program; if not, write to the Free Software
toddouska 0:5045d2638c29 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
toddouska 0:5045d2638c29 20 */
toddouska 0:5045d2638c29 21
toddouska 0:5045d2638c29 22
toddouska 0:5045d2638c29 23 #include "arc4.h"
toddouska 0:5045d2638c29 24
toddouska 0:5045d2638c29 25
toddouska 0:5045d2638c29 26
toddouska 0:5045d2638c29 27 void Arc4SetKey(Arc4* arc4, const byte* key, word32 length)
toddouska 0:5045d2638c29 28 {
toddouska 0:5045d2638c29 29 word32 i;
toddouska 0:5045d2638c29 30 word32 keyIndex = 0, stateIndex = 0;
toddouska 0:5045d2638c29 31
toddouska 0:5045d2638c29 32 arc4->x = 1;
toddouska 0:5045d2638c29 33 arc4->y = 0;
toddouska 0:5045d2638c29 34
toddouska 0:5045d2638c29 35 for (i = 0; i < ARC4_STATE_SIZE; i++)
toddouska 0:5045d2638c29 36 arc4->state[i] = i;
toddouska 0:5045d2638c29 37
toddouska 0:5045d2638c29 38 for (i = 0; i < ARC4_STATE_SIZE; i++) {
toddouska 0:5045d2638c29 39 word32 a = arc4->state[i];
toddouska 0:5045d2638c29 40 stateIndex += key[keyIndex] + a;
toddouska 0:5045d2638c29 41 stateIndex &= 0xFF;
toddouska 0:5045d2638c29 42 arc4->state[i] = arc4->state[stateIndex];
toddouska 0:5045d2638c29 43 arc4->state[stateIndex] = a;
toddouska 0:5045d2638c29 44
toddouska 0:5045d2638c29 45 if (++keyIndex >= length)
toddouska 0:5045d2638c29 46 keyIndex = 0;
toddouska 0:5045d2638c29 47 }
toddouska 0:5045d2638c29 48 }
toddouska 0:5045d2638c29 49
toddouska 0:5045d2638c29 50
toddouska 0:5045d2638c29 51 static INLINE word32 MakeByte(word32* x, word32* y, byte* s)
toddouska 0:5045d2638c29 52 {
toddouska 0:5045d2638c29 53 word32 a = s[*x], b;
toddouska 0:5045d2638c29 54 *y = (*y+a) & 0xff;
toddouska 0:5045d2638c29 55
toddouska 0:5045d2638c29 56 b = s[*y];
toddouska 0:5045d2638c29 57 s[*x] = b;
toddouska 0:5045d2638c29 58 s[*y] = a;
toddouska 0:5045d2638c29 59 *x = (*x+1) & 0xff;
toddouska 0:5045d2638c29 60
toddouska 0:5045d2638c29 61 return s[(a+b) & 0xff];
toddouska 0:5045d2638c29 62 }
toddouska 0:5045d2638c29 63
toddouska 0:5045d2638c29 64
toddouska 0:5045d2638c29 65 void Arc4Process(Arc4* arc4, byte* out, const byte* in, word32 length)
toddouska 0:5045d2638c29 66 {
toddouska 0:5045d2638c29 67 word32 x = arc4->x;
toddouska 0:5045d2638c29 68 word32 y = arc4->y;
toddouska 0:5045d2638c29 69
toddouska 0:5045d2638c29 70 while(length--)
toddouska 0:5045d2638c29 71 *out++ = *in++ ^ MakeByte(&x, &y, arc4->state);
toddouska 0:5045d2638c29 72
toddouska 0:5045d2638c29 73 arc4->x = x;
toddouska 0:5045d2638c29 74 arc4->y = y;
toddouska 0:5045d2638c29 75 }
toddouska 0:5045d2638c29 76