wolfSSL SSL/TLS library, support up to TLS1.3

Dependents:   CyaSSL-Twitter-OAuth4Tw Example-client-tls-cert TwitterReader TweetTest ... more

Committer:
wolfSSL
Date:
Thu Apr 28 00:57:21 2016 +0000
Revision:
4:1b0d80432c79
wolfSSL 3.9.0

Who changed what in which revision?

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