A library for setting up Secure Socket Layer (SSL) connections and verifying remote hosts using certificates. Contains only the source files for mbed platform implementation of the library.

Dependents:   HTTPClient-SSL HTTPClient-SSL HTTPClient-SSL HTTPClient-SSL

Committer:
Mike Fiore
Date:
Mon Mar 23 16:51:07 2015 -0500
Revision:
6:cf58d49e1a86
Parent:
0:b86d15c6ba29
fix whitespace in sha512.c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vanger 0:b86d15c6ba29 1 /* arc4.c
Vanger 0:b86d15c6ba29 2 *
Vanger 0:b86d15c6ba29 3 * Copyright (C) 2006-2014 wolfSSL Inc.
Vanger 0:b86d15c6ba29 4 *
Vanger 0:b86d15c6ba29 5 * This file is part of CyaSSL.
Vanger 0:b86d15c6ba29 6 *
Vanger 0:b86d15c6ba29 7 * CyaSSL is free software; you can redistribute it and/or modify
Vanger 0:b86d15c6ba29 8 * it under the terms of the GNU General Public License as published by
Vanger 0:b86d15c6ba29 9 * the Free Software Foundation; either version 2 of the License, or
Vanger 0:b86d15c6ba29 10 * (at your option) any later version.
Vanger 0:b86d15c6ba29 11 *
Vanger 0:b86d15c6ba29 12 * CyaSSL is distributed in the hope that it will be useful,
Vanger 0:b86d15c6ba29 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Vanger 0:b86d15c6ba29 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Vanger 0:b86d15c6ba29 15 * GNU General Public License for more details.
Vanger 0:b86d15c6ba29 16 *
Vanger 0:b86d15c6ba29 17 * You should have received a copy of the GNU General Public License
Vanger 0:b86d15c6ba29 18 * along with this program; if not, write to the Free Software
Vanger 0:b86d15c6ba29 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Vanger 0:b86d15c6ba29 20 */
Vanger 0:b86d15c6ba29 21
Vanger 0:b86d15c6ba29 22 #ifdef HAVE_CONFIG_H
Vanger 0:b86d15c6ba29 23 #include <config.h>
Vanger 0:b86d15c6ba29 24 #endif
Vanger 0:b86d15c6ba29 25
Vanger 0:b86d15c6ba29 26 #include <cyassl/ctaocrypt/settings.h>
Vanger 0:b86d15c6ba29 27
Vanger 0:b86d15c6ba29 28 #ifndef NO_RC4
Vanger 0:b86d15c6ba29 29
Vanger 0:b86d15c6ba29 30 #include <cyassl/ctaocrypt/arc4.h>
Vanger 0:b86d15c6ba29 31
Vanger 0:b86d15c6ba29 32
Vanger 0:b86d15c6ba29 33 #ifdef HAVE_CAVIUM
Vanger 0:b86d15c6ba29 34 static void Arc4CaviumSetKey(Arc4* arc4, const byte* key, word32 length);
Vanger 0:b86d15c6ba29 35 static void Arc4CaviumProcess(Arc4* arc4, byte* out, const byte* in,
Vanger 0:b86d15c6ba29 36 word32 length);
Vanger 0:b86d15c6ba29 37 #endif
Vanger 0:b86d15c6ba29 38
Vanger 0:b86d15c6ba29 39
Vanger 0:b86d15c6ba29 40 void Arc4SetKey(Arc4* arc4, const byte* key, word32 length)
Vanger 0:b86d15c6ba29 41 {
Vanger 0:b86d15c6ba29 42 word32 i;
Vanger 0:b86d15c6ba29 43 word32 keyIndex = 0, stateIndex = 0;
Vanger 0:b86d15c6ba29 44
Vanger 0:b86d15c6ba29 45 #ifdef HAVE_CAVIUM
Vanger 0:b86d15c6ba29 46 if (arc4->magic == CYASSL_ARC4_CAVIUM_MAGIC)
Vanger 0:b86d15c6ba29 47 return Arc4CaviumSetKey(arc4, key, length);
Vanger 0:b86d15c6ba29 48 #endif
Vanger 0:b86d15c6ba29 49
Vanger 0:b86d15c6ba29 50 arc4->x = 1;
Vanger 0:b86d15c6ba29 51 arc4->y = 0;
Vanger 0:b86d15c6ba29 52
Vanger 0:b86d15c6ba29 53 for (i = 0; i < ARC4_STATE_SIZE; i++)
Vanger 0:b86d15c6ba29 54 arc4->state[i] = (byte)i;
Vanger 0:b86d15c6ba29 55
Vanger 0:b86d15c6ba29 56 for (i = 0; i < ARC4_STATE_SIZE; i++) {
Vanger 0:b86d15c6ba29 57 word32 a = arc4->state[i];
Vanger 0:b86d15c6ba29 58 stateIndex += key[keyIndex] + a;
Vanger 0:b86d15c6ba29 59 stateIndex &= 0xFF;
Vanger 0:b86d15c6ba29 60 arc4->state[i] = arc4->state[stateIndex];
Vanger 0:b86d15c6ba29 61 arc4->state[stateIndex] = (byte)a;
Vanger 0:b86d15c6ba29 62
Vanger 0:b86d15c6ba29 63 if (++keyIndex >= length)
Vanger 0:b86d15c6ba29 64 keyIndex = 0;
Vanger 0:b86d15c6ba29 65 }
Vanger 0:b86d15c6ba29 66 }
Vanger 0:b86d15c6ba29 67
Vanger 0:b86d15c6ba29 68
Vanger 0:b86d15c6ba29 69 static INLINE byte MakeByte(word32* x, word32* y, byte* s)
Vanger 0:b86d15c6ba29 70 {
Vanger 0:b86d15c6ba29 71 word32 a = s[*x], b;
Vanger 0:b86d15c6ba29 72 *y = (*y+a) & 0xff;
Vanger 0:b86d15c6ba29 73
Vanger 0:b86d15c6ba29 74 b = s[*y];
Vanger 0:b86d15c6ba29 75 s[*x] = (byte)b;
Vanger 0:b86d15c6ba29 76 s[*y] = (byte)a;
Vanger 0:b86d15c6ba29 77 *x = (*x+1) & 0xff;
Vanger 0:b86d15c6ba29 78
Vanger 0:b86d15c6ba29 79 return s[(a+b) & 0xff];
Vanger 0:b86d15c6ba29 80 }
Vanger 0:b86d15c6ba29 81
Vanger 0:b86d15c6ba29 82
Vanger 0:b86d15c6ba29 83 void Arc4Process(Arc4* arc4, byte* out, const byte* in, word32 length)
Vanger 0:b86d15c6ba29 84 {
Vanger 0:b86d15c6ba29 85 word32 x;
Vanger 0:b86d15c6ba29 86 word32 y;
Vanger 0:b86d15c6ba29 87
Vanger 0:b86d15c6ba29 88 #ifdef HAVE_CAVIUM
Vanger 0:b86d15c6ba29 89 if (arc4->magic == CYASSL_ARC4_CAVIUM_MAGIC)
Vanger 0:b86d15c6ba29 90 return Arc4CaviumProcess(arc4, out, in, length);
Vanger 0:b86d15c6ba29 91 #endif
Vanger 0:b86d15c6ba29 92
Vanger 0:b86d15c6ba29 93 x = arc4->x;
Vanger 0:b86d15c6ba29 94 y = arc4->y;
Vanger 0:b86d15c6ba29 95
Vanger 0:b86d15c6ba29 96 while(length--)
Vanger 0:b86d15c6ba29 97 *out++ = *in++ ^ MakeByte(&x, &y, arc4->state);
Vanger 0:b86d15c6ba29 98
Vanger 0:b86d15c6ba29 99 arc4->x = (byte)x;
Vanger 0:b86d15c6ba29 100 arc4->y = (byte)y;
Vanger 0:b86d15c6ba29 101 }
Vanger 0:b86d15c6ba29 102
Vanger 0:b86d15c6ba29 103
Vanger 0:b86d15c6ba29 104 #ifdef HAVE_CAVIUM
Vanger 0:b86d15c6ba29 105
Vanger 0:b86d15c6ba29 106 #include <cyassl/ctaocrypt/logging.h>
Vanger 0:b86d15c6ba29 107 #include "cavium_common.h"
Vanger 0:b86d15c6ba29 108
Vanger 0:b86d15c6ba29 109 /* Initiliaze Arc4 for use with Nitrox device */
Vanger 0:b86d15c6ba29 110 int Arc4InitCavium(Arc4* arc4, int devId)
Vanger 0:b86d15c6ba29 111 {
Vanger 0:b86d15c6ba29 112 if (arc4 == NULL)
Vanger 0:b86d15c6ba29 113 return -1;
Vanger 0:b86d15c6ba29 114
Vanger 0:b86d15c6ba29 115 if (CspAllocContext(CONTEXT_SSL, &arc4->contextHandle, devId) != 0)
Vanger 0:b86d15c6ba29 116 return -1;
Vanger 0:b86d15c6ba29 117
Vanger 0:b86d15c6ba29 118 arc4->devId = devId;
Vanger 0:b86d15c6ba29 119 arc4->magic = CYASSL_ARC4_CAVIUM_MAGIC;
Vanger 0:b86d15c6ba29 120
Vanger 0:b86d15c6ba29 121 return 0;
Vanger 0:b86d15c6ba29 122 }
Vanger 0:b86d15c6ba29 123
Vanger 0:b86d15c6ba29 124
Vanger 0:b86d15c6ba29 125 /* Free Arc4 from use with Nitrox device */
Vanger 0:b86d15c6ba29 126 void Arc4FreeCavium(Arc4* arc4)
Vanger 0:b86d15c6ba29 127 {
Vanger 0:b86d15c6ba29 128 if (arc4 == NULL)
Vanger 0:b86d15c6ba29 129 return;
Vanger 0:b86d15c6ba29 130
Vanger 0:b86d15c6ba29 131 if (arc4->magic != CYASSL_ARC4_CAVIUM_MAGIC)
Vanger 0:b86d15c6ba29 132 return;
Vanger 0:b86d15c6ba29 133
Vanger 0:b86d15c6ba29 134 CspFreeContext(CONTEXT_SSL, arc4->contextHandle, arc4->devId);
Vanger 0:b86d15c6ba29 135 arc4->magic = 0;
Vanger 0:b86d15c6ba29 136 }
Vanger 0:b86d15c6ba29 137
Vanger 0:b86d15c6ba29 138
Vanger 0:b86d15c6ba29 139 static void Arc4CaviumSetKey(Arc4* arc4, const byte* key, word32 length)
Vanger 0:b86d15c6ba29 140 {
Vanger 0:b86d15c6ba29 141 word32 requestId;
Vanger 0:b86d15c6ba29 142
Vanger 0:b86d15c6ba29 143 if (CspInitializeRc4(CAVIUM_BLOCKING, arc4->contextHandle, length,
Vanger 0:b86d15c6ba29 144 (byte*)key, &requestId, arc4->devId) != 0) {
Vanger 0:b86d15c6ba29 145 CYASSL_MSG("Bad Cavium Arc4 Init");
Vanger 0:b86d15c6ba29 146 }
Vanger 0:b86d15c6ba29 147 }
Vanger 0:b86d15c6ba29 148
Vanger 0:b86d15c6ba29 149
Vanger 0:b86d15c6ba29 150 static void Arc4CaviumProcess(Arc4* arc4, byte* out, const byte* in,
Vanger 0:b86d15c6ba29 151 word32 length)
Vanger 0:b86d15c6ba29 152 {
Vanger 0:b86d15c6ba29 153 cyassl_word offset = 0;
Vanger 0:b86d15c6ba29 154 word32 requestId;
Vanger 0:b86d15c6ba29 155
Vanger 0:b86d15c6ba29 156 while (length > CYASSL_MAX_16BIT) {
Vanger 0:b86d15c6ba29 157 word16 slen = (word16)CYASSL_MAX_16BIT;
Vanger 0:b86d15c6ba29 158 if (CspEncryptRc4(CAVIUM_BLOCKING, arc4->contextHandle,CAVIUM_UPDATE,
Vanger 0:b86d15c6ba29 159 slen, (byte*)in + offset, out + offset, &requestId,
Vanger 0:b86d15c6ba29 160 arc4->devId) != 0) {
Vanger 0:b86d15c6ba29 161 CYASSL_MSG("Bad Cavium Arc4 Encrypt");
Vanger 0:b86d15c6ba29 162 }
Vanger 0:b86d15c6ba29 163 length -= CYASSL_MAX_16BIT;
Vanger 0:b86d15c6ba29 164 offset += CYASSL_MAX_16BIT;
Vanger 0:b86d15c6ba29 165 }
Vanger 0:b86d15c6ba29 166 if (length) {
Vanger 0:b86d15c6ba29 167 word16 slen = (word16)length;
Vanger 0:b86d15c6ba29 168 if (CspEncryptRc4(CAVIUM_BLOCKING, arc4->contextHandle,CAVIUM_UPDATE,
Vanger 0:b86d15c6ba29 169 slen, (byte*)in + offset, out + offset, &requestId,
Vanger 0:b86d15c6ba29 170 arc4->devId) != 0) {
Vanger 0:b86d15c6ba29 171 CYASSL_MSG("Bad Cavium Arc4 Encrypt");
Vanger 0:b86d15c6ba29 172 }
Vanger 0:b86d15c6ba29 173 }
Vanger 0:b86d15c6ba29 174 }
Vanger 0:b86d15c6ba29 175
Vanger 0:b86d15c6ba29 176 #endif /* HAVE_CAVIUM */
Vanger 0:b86d15c6ba29 177
Vanger 0:b86d15c6ba29 178 #endif /* NO_ARC4 */
Vanger 0:b86d15c6ba29 179