cyassl re-port with cellular comms, PSK test

Dependencies:   VodafoneUSBModem_bleedingedge2 mbed-rtos mbed-src

Committer:
ashleymills
Date:
Fri Apr 26 16:59:36 2013 +0000
Revision:
1:b211d97b0068
Parent:
0:e979170e02e7
nothing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashleymills 0:e979170e02e7 1 /* des3.c
ashleymills 0:e979170e02e7 2 *
ashleymills 0:e979170e02e7 3 * Copyright (C) 2006-2012 Sawtooth Consulting Ltd.
ashleymills 0:e979170e02e7 4 *
ashleymills 0:e979170e02e7 5 * This file is part of CyaSSL.
ashleymills 0:e979170e02e7 6 *
ashleymills 0:e979170e02e7 7 * CyaSSL is free software; you can redistribute it and/or modify
ashleymills 0:e979170e02e7 8 * it under the terms of the GNU General Public License as published by
ashleymills 0:e979170e02e7 9 * the Free Software Foundation; either version 2 of the License, or
ashleymills 0:e979170e02e7 10 * (at your option) any later version.
ashleymills 0:e979170e02e7 11 *
ashleymills 0:e979170e02e7 12 * CyaSSL is distributed in the hope that it will be useful,
ashleymills 0:e979170e02e7 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ashleymills 0:e979170e02e7 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ashleymills 0:e979170e02e7 15 * GNU General Public License for more details.
ashleymills 0:e979170e02e7 16 *
ashleymills 0:e979170e02e7 17 * You should have received a copy of the GNU General Public License
ashleymills 0:e979170e02e7 18 * along with this program; if not, write to the Free Software
ashleymills 0:e979170e02e7 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
ashleymills 0:e979170e02e7 20 */
ashleymills 0:e979170e02e7 21
ashleymills 0:e979170e02e7 22 #ifdef HAVE_CONFIG_H
ashleymills 0:e979170e02e7 23 #include <config.h>
ashleymills 0:e979170e02e7 24 #endif
ashleymills 0:e979170e02e7 25
ashleymills 0:e979170e02e7 26 #ifndef NO_DES3
ashleymills 0:e979170e02e7 27
ashleymills 0:e979170e02e7 28 #include <cyassl/ctaocrypt/des3.h>
ashleymills 0:e979170e02e7 29
ashleymills 0:e979170e02e7 30 #ifdef NO_INLINE
ashleymills 0:e979170e02e7 31 #include <cyassl/ctaocrypt/misc.h>
ashleymills 0:e979170e02e7 32 #else
ashleymills 0:e979170e02e7 33 #include <ctaocrypt/src/misc.c>
ashleymills 0:e979170e02e7 34 #endif
ashleymills 0:e979170e02e7 35
ashleymills 0:e979170e02e7 36
ashleymills 0:e979170e02e7 37 #ifdef HAVE_CAVIUM
ashleymills 0:e979170e02e7 38 static void Des3_CaviumSetKey(Des3* des3, const byte* key, const byte* iv);
ashleymills 0:e979170e02e7 39 static void Des3_CaviumCbcEncrypt(Des3* des3, byte* out, const byte* in,
ashleymills 0:e979170e02e7 40 word32 length);
ashleymills 0:e979170e02e7 41 static void Des3_CaviumCbcDecrypt(Des3* des3, byte* out, const byte* in,
ashleymills 0:e979170e02e7 42 word32 length);
ashleymills 0:e979170e02e7 43 #endif
ashleymills 0:e979170e02e7 44
ashleymills 0:e979170e02e7 45 #ifdef STM32F2_CRYPTO
ashleymills 0:e979170e02e7 46 /*
ashleymills 0:e979170e02e7 47 * STM32F2 hardware DES/3DES support through the STM32F2 standard
ashleymills 0:e979170e02e7 48 * peripheral library. Documentation located in STM32F2xx Standard
ashleymills 0:e979170e02e7 49 * Peripheral Library document (See note in README).
ashleymills 0:e979170e02e7 50 */
ashleymills 0:e979170e02e7 51 #include "stm32f2xx.h"
ashleymills 0:e979170e02e7 52
ashleymills 0:e979170e02e7 53 void Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
ashleymills 0:e979170e02e7 54 {
ashleymills 0:e979170e02e7 55 word32 *dkey = des->key;
ashleymills 0:e979170e02e7 56
ashleymills 0:e979170e02e7 57 XMEMCPY(dkey, key, 8);
ashleymills 0:e979170e02e7 58 ByteReverseWords(dkey, dkey, 8);
ashleymills 0:e979170e02e7 59
ashleymills 0:e979170e02e7 60 Des_SetIV(des, iv);
ashleymills 0:e979170e02e7 61 }
ashleymills 0:e979170e02e7 62
ashleymills 0:e979170e02e7 63 void Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir)
ashleymills 0:e979170e02e7 64 {
ashleymills 0:e979170e02e7 65 word32 *dkey1 = des->key[0];
ashleymills 0:e979170e02e7 66 word32 *dkey2 = des->key[1];
ashleymills 0:e979170e02e7 67 word32 *dkey3 = des->key[2];
ashleymills 0:e979170e02e7 68
ashleymills 0:e979170e02e7 69 XMEMCPY(dkey1, key, 8); /* set key 1 */
ashleymills 0:e979170e02e7 70 XMEMCPY(dkey2, key + 8, 8); /* set key 2 */
ashleymills 0:e979170e02e7 71 XMEMCPY(dkey3, key + 16, 8); /* set key 3 */
ashleymills 0:e979170e02e7 72
ashleymills 0:e979170e02e7 73 ByteReverseWords(dkey1, dkey1, 8);
ashleymills 0:e979170e02e7 74 ByteReverseWords(dkey2, dkey2, 8);
ashleymills 0:e979170e02e7 75 ByteReverseWords(dkey3, dkey3, 8);
ashleymills 0:e979170e02e7 76
ashleymills 0:e979170e02e7 77 Des3_SetIV(des, iv);
ashleymills 0:e979170e02e7 78 }
ashleymills 0:e979170e02e7 79
ashleymills 0:e979170e02e7 80 void DesCrypt(Des* des, byte* out, const byte* in, word32 sz,
ashleymills 0:e979170e02e7 81 int dir, int mode)
ashleymills 0:e979170e02e7 82 {
ashleymills 0:e979170e02e7 83 word32 *dkey, *iv;
ashleymills 0:e979170e02e7 84 CRYP_InitTypeDef DES_CRYP_InitStructure;
ashleymills 0:e979170e02e7 85 CRYP_KeyInitTypeDef DES_CRYP_KeyInitStructure;
ashleymills 0:e979170e02e7 86 CRYP_IVInitTypeDef DES_CRYP_IVInitStructure;
ashleymills 0:e979170e02e7 87
ashleymills 0:e979170e02e7 88 dkey = des->key;
ashleymills 0:e979170e02e7 89 iv = des->reg;
ashleymills 0:e979170e02e7 90
ashleymills 0:e979170e02e7 91 /* crypto structure initialization */
ashleymills 0:e979170e02e7 92 CRYP_KeyStructInit(&DES_CRYP_KeyInitStructure);
ashleymills 0:e979170e02e7 93 CRYP_StructInit(&DES_CRYP_InitStructure);
ashleymills 0:e979170e02e7 94 CRYP_IVStructInit(&DES_CRYP_IVInitStructure);
ashleymills 0:e979170e02e7 95
ashleymills 0:e979170e02e7 96 /* reset registers to their default values */
ashleymills 0:e979170e02e7 97 CRYP_DeInit();
ashleymills 0:e979170e02e7 98
ashleymills 0:e979170e02e7 99 /* set direction, mode, and datatype */
ashleymills 0:e979170e02e7 100 if (dir == DES_ENCRYPTION) {
ashleymills 0:e979170e02e7 101 DES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
ashleymills 0:e979170e02e7 102 } else { /* DES_DECRYPTION */
ashleymills 0:e979170e02e7 103 DES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt;
ashleymills 0:e979170e02e7 104 }
ashleymills 0:e979170e02e7 105
ashleymills 0:e979170e02e7 106 if (mode == DES_CBC) {
ashleymills 0:e979170e02e7 107 DES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_DES_CBC;
ashleymills 0:e979170e02e7 108 } else { /* DES_ECB */
ashleymills 0:e979170e02e7 109 DES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_DES_ECB;
ashleymills 0:e979170e02e7 110 }
ashleymills 0:e979170e02e7 111
ashleymills 0:e979170e02e7 112 DES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
ashleymills 0:e979170e02e7 113 CRYP_Init(&DES_CRYP_InitStructure);
ashleymills 0:e979170e02e7 114
ashleymills 0:e979170e02e7 115 /* load key into correct registers */
ashleymills 0:e979170e02e7 116 DES_CRYP_KeyInitStructure.CRYP_Key1Left = dkey[0];
ashleymills 0:e979170e02e7 117 DES_CRYP_KeyInitStructure.CRYP_Key1Right = dkey[1];
ashleymills 0:e979170e02e7 118 CRYP_KeyInit(&DES_CRYP_KeyInitStructure);
ashleymills 0:e979170e02e7 119
ashleymills 0:e979170e02e7 120 /* set iv */
ashleymills 0:e979170e02e7 121 ByteReverseWords(iv, iv, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 122 DES_CRYP_IVInitStructure.CRYP_IV0Left = iv[0];
ashleymills 0:e979170e02e7 123 DES_CRYP_IVInitStructure.CRYP_IV0Right = iv[1];
ashleymills 0:e979170e02e7 124 CRYP_IVInit(&DES_CRYP_IVInitStructure);
ashleymills 0:e979170e02e7 125
ashleymills 0:e979170e02e7 126 /* enable crypto processor */
ashleymills 0:e979170e02e7 127 CRYP_Cmd(ENABLE);
ashleymills 0:e979170e02e7 128
ashleymills 0:e979170e02e7 129 while (sz > 0)
ashleymills 0:e979170e02e7 130 {
ashleymills 0:e979170e02e7 131 /* flush IN/OUT FIFOs */
ashleymills 0:e979170e02e7 132 CRYP_FIFOFlush();
ashleymills 0:e979170e02e7 133
ashleymills 0:e979170e02e7 134 /* if input and output same will overwrite input iv */
ashleymills 0:e979170e02e7 135 XMEMCPY(des->tmp, in + sz - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 136
ashleymills 0:e979170e02e7 137 CRYP_DataIn(*(uint32_t*)&in[0]);
ashleymills 0:e979170e02e7 138 CRYP_DataIn(*(uint32_t*)&in[4]);
ashleymills 0:e979170e02e7 139
ashleymills 0:e979170e02e7 140 /* wait until the complete message has been processed */
ashleymills 0:e979170e02e7 141 while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
ashleymills 0:e979170e02e7 142
ashleymills 0:e979170e02e7 143 *(uint32_t*)&out[0] = CRYP_DataOut();
ashleymills 0:e979170e02e7 144 *(uint32_t*)&out[4] = CRYP_DataOut();
ashleymills 0:e979170e02e7 145
ashleymills 0:e979170e02e7 146 /* store iv for next call */
ashleymills 0:e979170e02e7 147 XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 148
ashleymills 0:e979170e02e7 149 sz -= DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 150 in += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 151 out += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 152 }
ashleymills 0:e979170e02e7 153
ashleymills 0:e979170e02e7 154 /* disable crypto processor */
ashleymills 0:e979170e02e7 155 CRYP_Cmd(DISABLE);
ashleymills 0:e979170e02e7 156 }
ashleymills 0:e979170e02e7 157
ashleymills 0:e979170e02e7 158 void Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
ashleymills 0:e979170e02e7 159 {
ashleymills 0:e979170e02e7 160 DesCrypt(des, out, in, sz, DES_ENCRYPTION, DES_CBC);
ashleymills 0:e979170e02e7 161 }
ashleymills 0:e979170e02e7 162
ashleymills 0:e979170e02e7 163 void Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
ashleymills 0:e979170e02e7 164 {
ashleymills 0:e979170e02e7 165 DesCrypt(des, out, in, sz, DES_DECRYPTION, DES_CBC);
ashleymills 0:e979170e02e7 166 }
ashleymills 0:e979170e02e7 167
ashleymills 0:e979170e02e7 168 void Des_EcbEncrypt(Des* des, byte* out, const byte* in, word32 sz)
ashleymills 0:e979170e02e7 169 {
ashleymills 0:e979170e02e7 170 DesCrypt(des, out, in, sz, DES_ENCRYPTION, DES_ECB);
ashleymills 0:e979170e02e7 171 }
ashleymills 0:e979170e02e7 172
ashleymills 0:e979170e02e7 173 void Des3Crypt(Des3* des, byte* out, const byte* in, word32 sz,
ashleymills 0:e979170e02e7 174 int dir)
ashleymills 0:e979170e02e7 175 {
ashleymills 0:e979170e02e7 176 word32 *dkey1, *dkey2, *dkey3, *iv;
ashleymills 0:e979170e02e7 177 CRYP_InitTypeDef DES3_CRYP_InitStructure;
ashleymills 0:e979170e02e7 178 CRYP_KeyInitTypeDef DES3_CRYP_KeyInitStructure;
ashleymills 0:e979170e02e7 179 CRYP_IVInitTypeDef DES3_CRYP_IVInitStructure;
ashleymills 0:e979170e02e7 180
ashleymills 0:e979170e02e7 181 dkey1 = des->key[0];
ashleymills 0:e979170e02e7 182 dkey2 = des->key[1];
ashleymills 0:e979170e02e7 183 dkey3 = des->key[2];
ashleymills 0:e979170e02e7 184 iv = des->reg;
ashleymills 0:e979170e02e7 185
ashleymills 0:e979170e02e7 186 /* crypto structure initialization */
ashleymills 0:e979170e02e7 187 CRYP_KeyStructInit(&DES3_CRYP_KeyInitStructure);
ashleymills 0:e979170e02e7 188 CRYP_StructInit(&DES3_CRYP_InitStructure);
ashleymills 0:e979170e02e7 189 CRYP_IVStructInit(&DES3_CRYP_IVInitStructure);
ashleymills 0:e979170e02e7 190
ashleymills 0:e979170e02e7 191 /* reset registers to their default values */
ashleymills 0:e979170e02e7 192 CRYP_DeInit();
ashleymills 0:e979170e02e7 193
ashleymills 0:e979170e02e7 194 /* set direction, mode, and datatype */
ashleymills 0:e979170e02e7 195 if (dir == DES_ENCRYPTION) {
ashleymills 0:e979170e02e7 196 DES3_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
ashleymills 0:e979170e02e7 197 } else {
ashleymills 0:e979170e02e7 198 DES3_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt;
ashleymills 0:e979170e02e7 199 }
ashleymills 0:e979170e02e7 200
ashleymills 0:e979170e02e7 201 DES3_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_TDES_CBC;
ashleymills 0:e979170e02e7 202 DES3_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
ashleymills 0:e979170e02e7 203 CRYP_Init(&DES3_CRYP_InitStructure);
ashleymills 0:e979170e02e7 204
ashleymills 0:e979170e02e7 205 /* load key into correct registers */
ashleymills 0:e979170e02e7 206 DES3_CRYP_KeyInitStructure.CRYP_Key1Left = dkey1[0];
ashleymills 0:e979170e02e7 207 DES3_CRYP_KeyInitStructure.CRYP_Key1Right = dkey1[1];
ashleymills 0:e979170e02e7 208 DES3_CRYP_KeyInitStructure.CRYP_Key2Left = dkey2[0];
ashleymills 0:e979170e02e7 209 DES3_CRYP_KeyInitStructure.CRYP_Key2Right = dkey2[1];
ashleymills 0:e979170e02e7 210 DES3_CRYP_KeyInitStructure.CRYP_Key3Left = dkey3[0];
ashleymills 0:e979170e02e7 211 DES3_CRYP_KeyInitStructure.CRYP_Key3Right = dkey3[1];
ashleymills 0:e979170e02e7 212 CRYP_KeyInit(&DES3_CRYP_KeyInitStructure);
ashleymills 0:e979170e02e7 213
ashleymills 0:e979170e02e7 214 /* set iv */
ashleymills 0:e979170e02e7 215 ByteReverseWords(iv, iv, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 216 DES3_CRYP_IVInitStructure.CRYP_IV0Left = iv[0];
ashleymills 0:e979170e02e7 217 DES3_CRYP_IVInitStructure.CRYP_IV0Right = iv[1];
ashleymills 0:e979170e02e7 218 CRYP_IVInit(&DES3_CRYP_IVInitStructure);
ashleymills 0:e979170e02e7 219
ashleymills 0:e979170e02e7 220 /* enable crypto processor */
ashleymills 0:e979170e02e7 221 CRYP_Cmd(ENABLE);
ashleymills 0:e979170e02e7 222
ashleymills 0:e979170e02e7 223 while (sz > 0)
ashleymills 0:e979170e02e7 224 {
ashleymills 0:e979170e02e7 225 /* flush IN/OUT FIFOs */
ashleymills 0:e979170e02e7 226 CRYP_FIFOFlush();
ashleymills 0:e979170e02e7 227
ashleymills 0:e979170e02e7 228 CRYP_DataIn(*(uint32_t*)&in[0]);
ashleymills 0:e979170e02e7 229 CRYP_DataIn(*(uint32_t*)&in[4]);
ashleymills 0:e979170e02e7 230
ashleymills 0:e979170e02e7 231 /* wait until the complete message has been processed */
ashleymills 0:e979170e02e7 232 while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
ashleymills 0:e979170e02e7 233
ashleymills 0:e979170e02e7 234 *(uint32_t*)&out[0] = CRYP_DataOut();
ashleymills 0:e979170e02e7 235 *(uint32_t*)&out[4] = CRYP_DataOut();
ashleymills 0:e979170e02e7 236
ashleymills 0:e979170e02e7 237 /* store iv for next call */
ashleymills 0:e979170e02e7 238 XMEMCPY(des->reg, out + sz - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 239
ashleymills 0:e979170e02e7 240 sz -= DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 241 in += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 242 out += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 243 }
ashleymills 0:e979170e02e7 244
ashleymills 0:e979170e02e7 245 /* disable crypto processor */
ashleymills 0:e979170e02e7 246 CRYP_Cmd(DISABLE);
ashleymills 0:e979170e02e7 247
ashleymills 0:e979170e02e7 248 }
ashleymills 0:e979170e02e7 249
ashleymills 0:e979170e02e7 250 void Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
ashleymills 0:e979170e02e7 251 {
ashleymills 0:e979170e02e7 252 Des3Crypt(des, out, in, sz, DES_ENCRYPTION);
ashleymills 0:e979170e02e7 253 }
ashleymills 0:e979170e02e7 254
ashleymills 0:e979170e02e7 255 void Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz)
ashleymills 0:e979170e02e7 256 {
ashleymills 0:e979170e02e7 257 Des3Crypt(des, out, in, sz, DES_DECRYPTION);
ashleymills 0:e979170e02e7 258 }
ashleymills 0:e979170e02e7 259
ashleymills 0:e979170e02e7 260 #else /* CTaoCrypt software implementation */
ashleymills 0:e979170e02e7 261
ashleymills 0:e979170e02e7 262 /* permuted choice table (key) */
ashleymills 0:e979170e02e7 263 static const byte pc1[] = {
ashleymills 0:e979170e02e7 264 57, 49, 41, 33, 25, 17, 9,
ashleymills 0:e979170e02e7 265 1, 58, 50, 42, 34, 26, 18,
ashleymills 0:e979170e02e7 266 10, 2, 59, 51, 43, 35, 27,
ashleymills 0:e979170e02e7 267 19, 11, 3, 60, 52, 44, 36,
ashleymills 0:e979170e02e7 268
ashleymills 0:e979170e02e7 269 63, 55, 47, 39, 31, 23, 15,
ashleymills 0:e979170e02e7 270 7, 62, 54, 46, 38, 30, 22,
ashleymills 0:e979170e02e7 271 14, 6, 61, 53, 45, 37, 29,
ashleymills 0:e979170e02e7 272 21, 13, 5, 28, 20, 12, 4
ashleymills 0:e979170e02e7 273 };
ashleymills 0:e979170e02e7 274
ashleymills 0:e979170e02e7 275 /* number left rotations of pc1 */
ashleymills 0:e979170e02e7 276 static const byte totrot[] = {
ashleymills 0:e979170e02e7 277 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28
ashleymills 0:e979170e02e7 278 };
ashleymills 0:e979170e02e7 279
ashleymills 0:e979170e02e7 280 /* permuted choice key (table) */
ashleymills 0:e979170e02e7 281 static const byte pc2[] = {
ashleymills 0:e979170e02e7 282 14, 17, 11, 24, 1, 5,
ashleymills 0:e979170e02e7 283 3, 28, 15, 6, 21, 10,
ashleymills 0:e979170e02e7 284 23, 19, 12, 4, 26, 8,
ashleymills 0:e979170e02e7 285 16, 7, 27, 20, 13, 2,
ashleymills 0:e979170e02e7 286 41, 52, 31, 37, 47, 55,
ashleymills 0:e979170e02e7 287 30, 40, 51, 45, 33, 48,
ashleymills 0:e979170e02e7 288 44, 49, 39, 56, 34, 53,
ashleymills 0:e979170e02e7 289 46, 42, 50, 36, 29, 32
ashleymills 0:e979170e02e7 290 };
ashleymills 0:e979170e02e7 291
ashleymills 0:e979170e02e7 292 /* End of DES-defined tables */
ashleymills 0:e979170e02e7 293
ashleymills 0:e979170e02e7 294 /* bit 0 is left-most in byte */
ashleymills 0:e979170e02e7 295 static const int bytebit[] = {
ashleymills 0:e979170e02e7 296 0200,0100,040,020,010,04,02,01
ashleymills 0:e979170e02e7 297 };
ashleymills 0:e979170e02e7 298
ashleymills 0:e979170e02e7 299 const word32 Spbox[8][64] = {
ashleymills 0:e979170e02e7 300 {
ashleymills 0:e979170e02e7 301 0x01010400,0x00000000,0x00010000,0x01010404,
ashleymills 0:e979170e02e7 302 0x01010004,0x00010404,0x00000004,0x00010000,
ashleymills 0:e979170e02e7 303 0x00000400,0x01010400,0x01010404,0x00000400,
ashleymills 0:e979170e02e7 304 0x01000404,0x01010004,0x01000000,0x00000004,
ashleymills 0:e979170e02e7 305 0x00000404,0x01000400,0x01000400,0x00010400,
ashleymills 0:e979170e02e7 306 0x00010400,0x01010000,0x01010000,0x01000404,
ashleymills 0:e979170e02e7 307 0x00010004,0x01000004,0x01000004,0x00010004,
ashleymills 0:e979170e02e7 308 0x00000000,0x00000404,0x00010404,0x01000000,
ashleymills 0:e979170e02e7 309 0x00010000,0x01010404,0x00000004,0x01010000,
ashleymills 0:e979170e02e7 310 0x01010400,0x01000000,0x01000000,0x00000400,
ashleymills 0:e979170e02e7 311 0x01010004,0x00010000,0x00010400,0x01000004,
ashleymills 0:e979170e02e7 312 0x00000400,0x00000004,0x01000404,0x00010404,
ashleymills 0:e979170e02e7 313 0x01010404,0x00010004,0x01010000,0x01000404,
ashleymills 0:e979170e02e7 314 0x01000004,0x00000404,0x00010404,0x01010400,
ashleymills 0:e979170e02e7 315 0x00000404,0x01000400,0x01000400,0x00000000,
ashleymills 0:e979170e02e7 316 0x00010004,0x00010400,0x00000000,0x01010004},
ashleymills 0:e979170e02e7 317 {
ashleymills 0:e979170e02e7 318 0x80108020,0x80008000,0x00008000,0x00108020,
ashleymills 0:e979170e02e7 319 0x00100000,0x00000020,0x80100020,0x80008020,
ashleymills 0:e979170e02e7 320 0x80000020,0x80108020,0x80108000,0x80000000,
ashleymills 0:e979170e02e7 321 0x80008000,0x00100000,0x00000020,0x80100020,
ashleymills 0:e979170e02e7 322 0x00108000,0x00100020,0x80008020,0x00000000,
ashleymills 0:e979170e02e7 323 0x80000000,0x00008000,0x00108020,0x80100000,
ashleymills 0:e979170e02e7 324 0x00100020,0x80000020,0x00000000,0x00108000,
ashleymills 0:e979170e02e7 325 0x00008020,0x80108000,0x80100000,0x00008020,
ashleymills 0:e979170e02e7 326 0x00000000,0x00108020,0x80100020,0x00100000,
ashleymills 0:e979170e02e7 327 0x80008020,0x80100000,0x80108000,0x00008000,
ashleymills 0:e979170e02e7 328 0x80100000,0x80008000,0x00000020,0x80108020,
ashleymills 0:e979170e02e7 329 0x00108020,0x00000020,0x00008000,0x80000000,
ashleymills 0:e979170e02e7 330 0x00008020,0x80108000,0x00100000,0x80000020,
ashleymills 0:e979170e02e7 331 0x00100020,0x80008020,0x80000020,0x00100020,
ashleymills 0:e979170e02e7 332 0x00108000,0x00000000,0x80008000,0x00008020,
ashleymills 0:e979170e02e7 333 0x80000000,0x80100020,0x80108020,0x00108000},
ashleymills 0:e979170e02e7 334 {
ashleymills 0:e979170e02e7 335 0x00000208,0x08020200,0x00000000,0x08020008,
ashleymills 0:e979170e02e7 336 0x08000200,0x00000000,0x00020208,0x08000200,
ashleymills 0:e979170e02e7 337 0x00020008,0x08000008,0x08000008,0x00020000,
ashleymills 0:e979170e02e7 338 0x08020208,0x00020008,0x08020000,0x00000208,
ashleymills 0:e979170e02e7 339 0x08000000,0x00000008,0x08020200,0x00000200,
ashleymills 0:e979170e02e7 340 0x00020200,0x08020000,0x08020008,0x00020208,
ashleymills 0:e979170e02e7 341 0x08000208,0x00020200,0x00020000,0x08000208,
ashleymills 0:e979170e02e7 342 0x00000008,0x08020208,0x00000200,0x08000000,
ashleymills 0:e979170e02e7 343 0x08020200,0x08000000,0x00020008,0x00000208,
ashleymills 0:e979170e02e7 344 0x00020000,0x08020200,0x08000200,0x00000000,
ashleymills 0:e979170e02e7 345 0x00000200,0x00020008,0x08020208,0x08000200,
ashleymills 0:e979170e02e7 346 0x08000008,0x00000200,0x00000000,0x08020008,
ashleymills 0:e979170e02e7 347 0x08000208,0x00020000,0x08000000,0x08020208,
ashleymills 0:e979170e02e7 348 0x00000008,0x00020208,0x00020200,0x08000008,
ashleymills 0:e979170e02e7 349 0x08020000,0x08000208,0x00000208,0x08020000,
ashleymills 0:e979170e02e7 350 0x00020208,0x00000008,0x08020008,0x00020200},
ashleymills 0:e979170e02e7 351 {
ashleymills 0:e979170e02e7 352 0x00802001,0x00002081,0x00002081,0x00000080,
ashleymills 0:e979170e02e7 353 0x00802080,0x00800081,0x00800001,0x00002001,
ashleymills 0:e979170e02e7 354 0x00000000,0x00802000,0x00802000,0x00802081,
ashleymills 0:e979170e02e7 355 0x00000081,0x00000000,0x00800080,0x00800001,
ashleymills 0:e979170e02e7 356 0x00000001,0x00002000,0x00800000,0x00802001,
ashleymills 0:e979170e02e7 357 0x00000080,0x00800000,0x00002001,0x00002080,
ashleymills 0:e979170e02e7 358 0x00800081,0x00000001,0x00002080,0x00800080,
ashleymills 0:e979170e02e7 359 0x00002000,0x00802080,0x00802081,0x00000081,
ashleymills 0:e979170e02e7 360 0x00800080,0x00800001,0x00802000,0x00802081,
ashleymills 0:e979170e02e7 361 0x00000081,0x00000000,0x00000000,0x00802000,
ashleymills 0:e979170e02e7 362 0x00002080,0x00800080,0x00800081,0x00000001,
ashleymills 0:e979170e02e7 363 0x00802001,0x00002081,0x00002081,0x00000080,
ashleymills 0:e979170e02e7 364 0x00802081,0x00000081,0x00000001,0x00002000,
ashleymills 0:e979170e02e7 365 0x00800001,0x00002001,0x00802080,0x00800081,
ashleymills 0:e979170e02e7 366 0x00002001,0x00002080,0x00800000,0x00802001,
ashleymills 0:e979170e02e7 367 0x00000080,0x00800000,0x00002000,0x00802080},
ashleymills 0:e979170e02e7 368 {
ashleymills 0:e979170e02e7 369 0x00000100,0x02080100,0x02080000,0x42000100,
ashleymills 0:e979170e02e7 370 0x00080000,0x00000100,0x40000000,0x02080000,
ashleymills 0:e979170e02e7 371 0x40080100,0x00080000,0x02000100,0x40080100,
ashleymills 0:e979170e02e7 372 0x42000100,0x42080000,0x00080100,0x40000000,
ashleymills 0:e979170e02e7 373 0x02000000,0x40080000,0x40080000,0x00000000,
ashleymills 0:e979170e02e7 374 0x40000100,0x42080100,0x42080100,0x02000100,
ashleymills 0:e979170e02e7 375 0x42080000,0x40000100,0x00000000,0x42000000,
ashleymills 0:e979170e02e7 376 0x02080100,0x02000000,0x42000000,0x00080100,
ashleymills 0:e979170e02e7 377 0x00080000,0x42000100,0x00000100,0x02000000,
ashleymills 0:e979170e02e7 378 0x40000000,0x02080000,0x42000100,0x40080100,
ashleymills 0:e979170e02e7 379 0x02000100,0x40000000,0x42080000,0x02080100,
ashleymills 0:e979170e02e7 380 0x40080100,0x00000100,0x02000000,0x42080000,
ashleymills 0:e979170e02e7 381 0x42080100,0x00080100,0x42000000,0x42080100,
ashleymills 0:e979170e02e7 382 0x02080000,0x00000000,0x40080000,0x42000000,
ashleymills 0:e979170e02e7 383 0x00080100,0x02000100,0x40000100,0x00080000,
ashleymills 0:e979170e02e7 384 0x00000000,0x40080000,0x02080100,0x40000100},
ashleymills 0:e979170e02e7 385 {
ashleymills 0:e979170e02e7 386 0x20000010,0x20400000,0x00004000,0x20404010,
ashleymills 0:e979170e02e7 387 0x20400000,0x00000010,0x20404010,0x00400000,
ashleymills 0:e979170e02e7 388 0x20004000,0x00404010,0x00400000,0x20000010,
ashleymills 0:e979170e02e7 389 0x00400010,0x20004000,0x20000000,0x00004010,
ashleymills 0:e979170e02e7 390 0x00000000,0x00400010,0x20004010,0x00004000,
ashleymills 0:e979170e02e7 391 0x00404000,0x20004010,0x00000010,0x20400010,
ashleymills 0:e979170e02e7 392 0x20400010,0x00000000,0x00404010,0x20404000,
ashleymills 0:e979170e02e7 393 0x00004010,0x00404000,0x20404000,0x20000000,
ashleymills 0:e979170e02e7 394 0x20004000,0x00000010,0x20400010,0x00404000,
ashleymills 0:e979170e02e7 395 0x20404010,0x00400000,0x00004010,0x20000010,
ashleymills 0:e979170e02e7 396 0x00400000,0x20004000,0x20000000,0x00004010,
ashleymills 0:e979170e02e7 397 0x20000010,0x20404010,0x00404000,0x20400000,
ashleymills 0:e979170e02e7 398 0x00404010,0x20404000,0x00000000,0x20400010,
ashleymills 0:e979170e02e7 399 0x00000010,0x00004000,0x20400000,0x00404010,
ashleymills 0:e979170e02e7 400 0x00004000,0x00400010,0x20004010,0x00000000,
ashleymills 0:e979170e02e7 401 0x20404000,0x20000000,0x00400010,0x20004010},
ashleymills 0:e979170e02e7 402 {
ashleymills 0:e979170e02e7 403 0x00200000,0x04200002,0x04000802,0x00000000,
ashleymills 0:e979170e02e7 404 0x00000800,0x04000802,0x00200802,0x04200800,
ashleymills 0:e979170e02e7 405 0x04200802,0x00200000,0x00000000,0x04000002,
ashleymills 0:e979170e02e7 406 0x00000002,0x04000000,0x04200002,0x00000802,
ashleymills 0:e979170e02e7 407 0x04000800,0x00200802,0x00200002,0x04000800,
ashleymills 0:e979170e02e7 408 0x04000002,0x04200000,0x04200800,0x00200002,
ashleymills 0:e979170e02e7 409 0x04200000,0x00000800,0x00000802,0x04200802,
ashleymills 0:e979170e02e7 410 0x00200800,0x00000002,0x04000000,0x00200800,
ashleymills 0:e979170e02e7 411 0x04000000,0x00200800,0x00200000,0x04000802,
ashleymills 0:e979170e02e7 412 0x04000802,0x04200002,0x04200002,0x00000002,
ashleymills 0:e979170e02e7 413 0x00200002,0x04000000,0x04000800,0x00200000,
ashleymills 0:e979170e02e7 414 0x04200800,0x00000802,0x00200802,0x04200800,
ashleymills 0:e979170e02e7 415 0x00000802,0x04000002,0x04200802,0x04200000,
ashleymills 0:e979170e02e7 416 0x00200800,0x00000000,0x00000002,0x04200802,
ashleymills 0:e979170e02e7 417 0x00000000,0x00200802,0x04200000,0x00000800,
ashleymills 0:e979170e02e7 418 0x04000002,0x04000800,0x00000800,0x00200002},
ashleymills 0:e979170e02e7 419 {
ashleymills 0:e979170e02e7 420 0x10001040,0x00001000,0x00040000,0x10041040,
ashleymills 0:e979170e02e7 421 0x10000000,0x10001040,0x00000040,0x10000000,
ashleymills 0:e979170e02e7 422 0x00040040,0x10040000,0x10041040,0x00041000,
ashleymills 0:e979170e02e7 423 0x10041000,0x00041040,0x00001000,0x00000040,
ashleymills 0:e979170e02e7 424 0x10040000,0x10000040,0x10001000,0x00001040,
ashleymills 0:e979170e02e7 425 0x00041000,0x00040040,0x10040040,0x10041000,
ashleymills 0:e979170e02e7 426 0x00001040,0x00000000,0x00000000,0x10040040,
ashleymills 0:e979170e02e7 427 0x10000040,0x10001000,0x00041040,0x00040000,
ashleymills 0:e979170e02e7 428 0x00041040,0x00040000,0x10041000,0x00001000,
ashleymills 0:e979170e02e7 429 0x00000040,0x10040040,0x00001000,0x00041040,
ashleymills 0:e979170e02e7 430 0x10001000,0x00000040,0x10000040,0x10040000,
ashleymills 0:e979170e02e7 431 0x10040040,0x10000000,0x00040000,0x10001040,
ashleymills 0:e979170e02e7 432 0x00000000,0x10041040,0x00040040,0x10000040,
ashleymills 0:e979170e02e7 433 0x10040000,0x10001000,0x10001040,0x00000000,
ashleymills 0:e979170e02e7 434 0x10041040,0x00041000,0x00041000,0x00001040,
ashleymills 0:e979170e02e7 435 0x00001040,0x00040040,0x10000000,0x10041000}
ashleymills 0:e979170e02e7 436 };
ashleymills 0:e979170e02e7 437
ashleymills 0:e979170e02e7 438
ashleymills 0:e979170e02e7 439 static INLINE void IPERM(word32* left, word32* right)
ashleymills 0:e979170e02e7 440 {
ashleymills 0:e979170e02e7 441 word32 work;
ashleymills 0:e979170e02e7 442
ashleymills 0:e979170e02e7 443 *right = rotlFixed(*right, 4U);
ashleymills 0:e979170e02e7 444 work = (*left ^ *right) & 0xf0f0f0f0;
ashleymills 0:e979170e02e7 445 *left ^= work;
ashleymills 0:e979170e02e7 446
ashleymills 0:e979170e02e7 447 *right = rotrFixed(*right^work, 20U);
ashleymills 0:e979170e02e7 448 work = (*left ^ *right) & 0xffff0000;
ashleymills 0:e979170e02e7 449 *left ^= work;
ashleymills 0:e979170e02e7 450
ashleymills 0:e979170e02e7 451 *right = rotrFixed(*right^work, 18U);
ashleymills 0:e979170e02e7 452 work = (*left ^ *right) & 0x33333333;
ashleymills 0:e979170e02e7 453 *left ^= work;
ashleymills 0:e979170e02e7 454
ashleymills 0:e979170e02e7 455 *right = rotrFixed(*right^work, 6U);
ashleymills 0:e979170e02e7 456 work = (*left ^ *right) & 0x00ff00ff;
ashleymills 0:e979170e02e7 457 *left ^= work;
ashleymills 0:e979170e02e7 458
ashleymills 0:e979170e02e7 459 *right = rotlFixed(*right^work, 9U);
ashleymills 0:e979170e02e7 460 work = (*left ^ *right) & 0xaaaaaaaa;
ashleymills 0:e979170e02e7 461 *left = rotlFixed(*left^work, 1U);
ashleymills 0:e979170e02e7 462 *right ^= work;
ashleymills 0:e979170e02e7 463 }
ashleymills 0:e979170e02e7 464
ashleymills 0:e979170e02e7 465
ashleymills 0:e979170e02e7 466 static INLINE void FPERM(word32* left, word32* right)
ashleymills 0:e979170e02e7 467 {
ashleymills 0:e979170e02e7 468 word32 work;
ashleymills 0:e979170e02e7 469
ashleymills 0:e979170e02e7 470 *right = rotrFixed(*right, 1U);
ashleymills 0:e979170e02e7 471 work = (*left ^ *right) & 0xaaaaaaaa;
ashleymills 0:e979170e02e7 472 *right ^= work;
ashleymills 0:e979170e02e7 473
ashleymills 0:e979170e02e7 474 *left = rotrFixed(*left^work, 9U);
ashleymills 0:e979170e02e7 475 work = (*left ^ *right) & 0x00ff00ff;
ashleymills 0:e979170e02e7 476 *right ^= work;
ashleymills 0:e979170e02e7 477
ashleymills 0:e979170e02e7 478 *left = rotlFixed(*left^work, 6U);
ashleymills 0:e979170e02e7 479 work = (*left ^ *right) & 0x33333333;
ashleymills 0:e979170e02e7 480 *right ^= work;
ashleymills 0:e979170e02e7 481
ashleymills 0:e979170e02e7 482 *left = rotlFixed(*left^work, 18U);
ashleymills 0:e979170e02e7 483 work = (*left ^ *right) & 0xffff0000;
ashleymills 0:e979170e02e7 484 *right ^= work;
ashleymills 0:e979170e02e7 485
ashleymills 0:e979170e02e7 486 *left = rotlFixed(*left^work, 20U);
ashleymills 0:e979170e02e7 487 work = (*left ^ *right) & 0xf0f0f0f0;
ashleymills 0:e979170e02e7 488 *right ^= work;
ashleymills 0:e979170e02e7 489
ashleymills 0:e979170e02e7 490 *left = rotrFixed(*left^work, 4U);
ashleymills 0:e979170e02e7 491 }
ashleymills 0:e979170e02e7 492
ashleymills 0:e979170e02e7 493
ashleymills 0:e979170e02e7 494 static void DesSetKey(const byte* key, int dir, word32* out)
ashleymills 0:e979170e02e7 495 {
ashleymills 0:e979170e02e7 496 byte buffer[56+56+8];
ashleymills 0:e979170e02e7 497 byte *const pc1m = buffer; /* place to modify pc1 into */
ashleymills 0:e979170e02e7 498 byte *const pcr = pc1m + 56; /* place to rotate pc1 into */
ashleymills 0:e979170e02e7 499 byte *const ks = pcr + 56;
ashleymills 0:e979170e02e7 500 register int i,j,l;
ashleymills 0:e979170e02e7 501 int m;
ashleymills 0:e979170e02e7 502
ashleymills 0:e979170e02e7 503 for (j = 0; j < 56; j++) { /* convert pc1 to bits of key */
ashleymills 0:e979170e02e7 504 l = pc1[j] - 1; /* integer bit location */
ashleymills 0:e979170e02e7 505 m = l & 07; /* find bit */
ashleymills 0:e979170e02e7 506 pc1m[j] = (key[l >> 3] & /* find which key byte l is in */
ashleymills 0:e979170e02e7 507 bytebit[m]) /* and which bit of that byte */
ashleymills 0:e979170e02e7 508 ? 1 : 0; /* and store 1-bit result */
ashleymills 0:e979170e02e7 509 }
ashleymills 0:e979170e02e7 510 for (i = 0; i < 16; i++) { /* key chunk for each iteration */
ashleymills 0:e979170e02e7 511 XMEMSET(ks, 0, 8); /* Clear key schedule */
ashleymills 0:e979170e02e7 512 for (j = 0; j < 56; j++) /* rotate pc1 the right amount */
ashleymills 0:e979170e02e7 513 pcr[j] = pc1m[(l = j + totrot[i]) < (j < 28 ? 28 : 56) ? l: l-28];
ashleymills 0:e979170e02e7 514 /* rotate left and right halves independently */
ashleymills 0:e979170e02e7 515 for (j = 0; j < 48; j++){ /* select bits individually */
ashleymills 0:e979170e02e7 516 /* check bit that goes to ks[j] */
ashleymills 0:e979170e02e7 517 if (pcr[pc2[j] - 1]){
ashleymills 0:e979170e02e7 518 /* mask it in if it's there */
ashleymills 0:e979170e02e7 519 l= j % 6;
ashleymills 0:e979170e02e7 520 ks[j/6] |= bytebit[l] >> 2;
ashleymills 0:e979170e02e7 521 }
ashleymills 0:e979170e02e7 522 }
ashleymills 0:e979170e02e7 523 /* Now convert to odd/even interleaved form for use in F */
ashleymills 0:e979170e02e7 524 out[2*i] = ((word32)ks[0] << 24)
ashleymills 0:e979170e02e7 525 | ((word32)ks[2] << 16)
ashleymills 0:e979170e02e7 526 | ((word32)ks[4] << 8)
ashleymills 0:e979170e02e7 527 | ((word32)ks[6]);
ashleymills 0:e979170e02e7 528 out[2*i + 1] = ((word32)ks[1] << 24)
ashleymills 0:e979170e02e7 529 | ((word32)ks[3] << 16)
ashleymills 0:e979170e02e7 530 | ((word32)ks[5] << 8)
ashleymills 0:e979170e02e7 531 | ((word32)ks[7]);
ashleymills 0:e979170e02e7 532 }
ashleymills 0:e979170e02e7 533
ashleymills 0:e979170e02e7 534 /* reverse key schedule order */
ashleymills 0:e979170e02e7 535 if (dir == DES_DECRYPTION)
ashleymills 0:e979170e02e7 536 for (i = 0; i < 16; i += 2) {
ashleymills 0:e979170e02e7 537 word32 swap = out[i];
ashleymills 0:e979170e02e7 538 out[i] = out[DES_KS_SIZE - 2 - i];
ashleymills 0:e979170e02e7 539 out[DES_KS_SIZE - 2 - i] = swap;
ashleymills 0:e979170e02e7 540
ashleymills 0:e979170e02e7 541 swap = out[i + 1];
ashleymills 0:e979170e02e7 542 out[i + 1] = out[DES_KS_SIZE - 1 - i];
ashleymills 0:e979170e02e7 543 out[DES_KS_SIZE - 1 - i] = swap;
ashleymills 0:e979170e02e7 544 }
ashleymills 0:e979170e02e7 545
ashleymills 0:e979170e02e7 546 }
ashleymills 0:e979170e02e7 547
ashleymills 0:e979170e02e7 548
ashleymills 0:e979170e02e7 549 static INLINE int Reverse(int dir)
ashleymills 0:e979170e02e7 550 {
ashleymills 0:e979170e02e7 551 return !dir;
ashleymills 0:e979170e02e7 552 }
ashleymills 0:e979170e02e7 553
ashleymills 0:e979170e02e7 554
ashleymills 0:e979170e02e7 555 void Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
ashleymills 0:e979170e02e7 556 {
ashleymills 0:e979170e02e7 557 DesSetKey(key, dir, des->key);
ashleymills 0:e979170e02e7 558
ashleymills 0:e979170e02e7 559 Des_SetIV(des, iv);
ashleymills 0:e979170e02e7 560 }
ashleymills 0:e979170e02e7 561
ashleymills 0:e979170e02e7 562
ashleymills 0:e979170e02e7 563 void Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir)
ashleymills 0:e979170e02e7 564 {
ashleymills 0:e979170e02e7 565 #ifdef HAVE_CAVIUM
ashleymills 0:e979170e02e7 566 if (des->magic == CYASSL_3DES_CAVIUM_MAGIC)
ashleymills 0:e979170e02e7 567 return Des3_CaviumSetKey(des, key, iv);
ashleymills 0:e979170e02e7 568 #endif
ashleymills 0:e979170e02e7 569
ashleymills 0:e979170e02e7 570 DesSetKey(key + (dir == DES_ENCRYPTION ? 0 : 16), dir, des->key[0]);
ashleymills 0:e979170e02e7 571 DesSetKey(key + 8, Reverse(dir), des->key[1]);
ashleymills 0:e979170e02e7 572 DesSetKey(key + (dir == DES_DECRYPTION ? 0 : 16), dir, des->key[2]);
ashleymills 0:e979170e02e7 573
ashleymills 0:e979170e02e7 574 Des3_SetIV(des, iv);
ashleymills 0:e979170e02e7 575 }
ashleymills 0:e979170e02e7 576
ashleymills 0:e979170e02e7 577
ashleymills 0:e979170e02e7 578 static void DesRawProcessBlock(word32* lIn, word32* rIn, const word32* kptr)
ashleymills 0:e979170e02e7 579 {
ashleymills 0:e979170e02e7 580 word32 l = *lIn, r = *rIn, i;
ashleymills 0:e979170e02e7 581
ashleymills 0:e979170e02e7 582 for (i=0; i<8; i++)
ashleymills 0:e979170e02e7 583 {
ashleymills 0:e979170e02e7 584 word32 work = rotrFixed(r, 4U) ^ kptr[4*i+0];
ashleymills 0:e979170e02e7 585 l ^= Spbox[6][(work) & 0x3f]
ashleymills 0:e979170e02e7 586 ^ Spbox[4][(work >> 8) & 0x3f]
ashleymills 0:e979170e02e7 587 ^ Spbox[2][(work >> 16) & 0x3f]
ashleymills 0:e979170e02e7 588 ^ Spbox[0][(work >> 24) & 0x3f];
ashleymills 0:e979170e02e7 589 work = r ^ kptr[4*i+1];
ashleymills 0:e979170e02e7 590 l ^= Spbox[7][(work) & 0x3f]
ashleymills 0:e979170e02e7 591 ^ Spbox[5][(work >> 8) & 0x3f]
ashleymills 0:e979170e02e7 592 ^ Spbox[3][(work >> 16) & 0x3f]
ashleymills 0:e979170e02e7 593 ^ Spbox[1][(work >> 24) & 0x3f];
ashleymills 0:e979170e02e7 594
ashleymills 0:e979170e02e7 595 work = rotrFixed(l, 4U) ^ kptr[4*i+2];
ashleymills 0:e979170e02e7 596 r ^= Spbox[6][(work) & 0x3f]
ashleymills 0:e979170e02e7 597 ^ Spbox[4][(work >> 8) & 0x3f]
ashleymills 0:e979170e02e7 598 ^ Spbox[2][(work >> 16) & 0x3f]
ashleymills 0:e979170e02e7 599 ^ Spbox[0][(work >> 24) & 0x3f];
ashleymills 0:e979170e02e7 600 work = l ^ kptr[4*i+3];
ashleymills 0:e979170e02e7 601 r ^= Spbox[7][(work) & 0x3f]
ashleymills 0:e979170e02e7 602 ^ Spbox[5][(work >> 8) & 0x3f]
ashleymills 0:e979170e02e7 603 ^ Spbox[3][(work >> 16) & 0x3f]
ashleymills 0:e979170e02e7 604 ^ Spbox[1][(work >> 24) & 0x3f];
ashleymills 0:e979170e02e7 605 }
ashleymills 0:e979170e02e7 606
ashleymills 0:e979170e02e7 607 *lIn = l; *rIn = r;
ashleymills 0:e979170e02e7 608 }
ashleymills 0:e979170e02e7 609
ashleymills 0:e979170e02e7 610
ashleymills 0:e979170e02e7 611 static void DesProcessBlock(Des* des, const byte* in, byte* out)
ashleymills 0:e979170e02e7 612 {
ashleymills 0:e979170e02e7 613 word32 l, r;
ashleymills 0:e979170e02e7 614
ashleymills 0:e979170e02e7 615 XMEMCPY(&l, in, sizeof(l));
ashleymills 0:e979170e02e7 616 XMEMCPY(&r, in + sizeof(l), sizeof(r));
ashleymills 0:e979170e02e7 617 #ifdef LITTLE_ENDIAN_ORDER
ashleymills 0:e979170e02e7 618 l = ByteReverseWord32(l);
ashleymills 0:e979170e02e7 619 r = ByteReverseWord32(r);
ashleymills 0:e979170e02e7 620 #endif
ashleymills 0:e979170e02e7 621 IPERM(&l,&r);
ashleymills 0:e979170e02e7 622
ashleymills 0:e979170e02e7 623 DesRawProcessBlock(&l, &r, des->key);
ashleymills 0:e979170e02e7 624
ashleymills 0:e979170e02e7 625 FPERM(&l,&r);
ashleymills 0:e979170e02e7 626 #ifdef LITTLE_ENDIAN_ORDER
ashleymills 0:e979170e02e7 627 l = ByteReverseWord32(l);
ashleymills 0:e979170e02e7 628 r = ByteReverseWord32(r);
ashleymills 0:e979170e02e7 629 #endif
ashleymills 0:e979170e02e7 630 XMEMCPY(out, &r, sizeof(r));
ashleymills 0:e979170e02e7 631 XMEMCPY(out + sizeof(r), &l, sizeof(l));
ashleymills 0:e979170e02e7 632 }
ashleymills 0:e979170e02e7 633
ashleymills 0:e979170e02e7 634
ashleymills 0:e979170e02e7 635 static void Des3ProcessBlock(Des3* des, const byte* in, byte* out)
ashleymills 0:e979170e02e7 636 {
ashleymills 0:e979170e02e7 637 word32 l, r;
ashleymills 0:e979170e02e7 638
ashleymills 0:e979170e02e7 639 XMEMCPY(&l, in, sizeof(l));
ashleymills 0:e979170e02e7 640 XMEMCPY(&r, in + sizeof(l), sizeof(r));
ashleymills 0:e979170e02e7 641 #ifdef LITTLE_ENDIAN_ORDER
ashleymills 0:e979170e02e7 642 l = ByteReverseWord32(l);
ashleymills 0:e979170e02e7 643 r = ByteReverseWord32(r);
ashleymills 0:e979170e02e7 644 #endif
ashleymills 0:e979170e02e7 645 IPERM(&l,&r);
ashleymills 0:e979170e02e7 646
ashleymills 0:e979170e02e7 647 DesRawProcessBlock(&l, &r, des->key[0]);
ashleymills 0:e979170e02e7 648 DesRawProcessBlock(&r, &l, des->key[1]);
ashleymills 0:e979170e02e7 649 DesRawProcessBlock(&l, &r, des->key[2]);
ashleymills 0:e979170e02e7 650
ashleymills 0:e979170e02e7 651 FPERM(&l,&r);
ashleymills 0:e979170e02e7 652 #ifdef LITTLE_ENDIAN_ORDER
ashleymills 0:e979170e02e7 653 l = ByteReverseWord32(l);
ashleymills 0:e979170e02e7 654 r = ByteReverseWord32(r);
ashleymills 0:e979170e02e7 655 #endif
ashleymills 0:e979170e02e7 656 XMEMCPY(out, &r, sizeof(r));
ashleymills 0:e979170e02e7 657 XMEMCPY(out + sizeof(r), &l, sizeof(l));
ashleymills 0:e979170e02e7 658 }
ashleymills 0:e979170e02e7 659
ashleymills 0:e979170e02e7 660
ashleymills 0:e979170e02e7 661 void Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
ashleymills 0:e979170e02e7 662 {
ashleymills 0:e979170e02e7 663 word32 blocks = sz / DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 664
ashleymills 0:e979170e02e7 665 while (blocks--) {
ashleymills 0:e979170e02e7 666 xorbuf((byte*)des->reg, in, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 667 DesProcessBlock(des, (byte*)des->reg, (byte*)des->reg);
ashleymills 0:e979170e02e7 668 XMEMCPY(out, des->reg, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 669
ashleymills 0:e979170e02e7 670 out += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 671 in += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 672 }
ashleymills 0:e979170e02e7 673 }
ashleymills 0:e979170e02e7 674
ashleymills 0:e979170e02e7 675
ashleymills 0:e979170e02e7 676 void Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
ashleymills 0:e979170e02e7 677 {
ashleymills 0:e979170e02e7 678 word32 blocks = sz / DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 679 byte hold[DES_BLOCK_SIZE];
ashleymills 0:e979170e02e7 680
ashleymills 0:e979170e02e7 681 while (blocks--) {
ashleymills 0:e979170e02e7 682 XMEMCPY(des->tmp, in, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 683 DesProcessBlock(des, (byte*)des->tmp, out);
ashleymills 0:e979170e02e7 684 xorbuf(out, (byte*)des->reg, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 685
ashleymills 0:e979170e02e7 686 XMEMCPY(hold, des->reg, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 687 XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 688 XMEMCPY(des->tmp, hold, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 689
ashleymills 0:e979170e02e7 690 out += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 691 in += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 692 }
ashleymills 0:e979170e02e7 693 }
ashleymills 0:e979170e02e7 694
ashleymills 0:e979170e02e7 695
ashleymills 0:e979170e02e7 696 void Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
ashleymills 0:e979170e02e7 697 {
ashleymills 0:e979170e02e7 698 word32 blocks;
ashleymills 0:e979170e02e7 699
ashleymills 0:e979170e02e7 700 #ifdef HAVE_CAVIUM
ashleymills 0:e979170e02e7 701 if (des->magic == CYASSL_3DES_CAVIUM_MAGIC)
ashleymills 0:e979170e02e7 702 return Des3_CaviumCbcEncrypt(des, out, in, sz);
ashleymills 0:e979170e02e7 703 #endif
ashleymills 0:e979170e02e7 704
ashleymills 0:e979170e02e7 705 blocks = sz / DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 706 while (blocks--) {
ashleymills 0:e979170e02e7 707 xorbuf((byte*)des->reg, in, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 708 Des3ProcessBlock(des, (byte*)des->reg, (byte*)des->reg);
ashleymills 0:e979170e02e7 709 XMEMCPY(out, des->reg, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 710
ashleymills 0:e979170e02e7 711 out += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 712 in += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 713 }
ashleymills 0:e979170e02e7 714 }
ashleymills 0:e979170e02e7 715
ashleymills 0:e979170e02e7 716
ashleymills 0:e979170e02e7 717 void Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz)
ashleymills 0:e979170e02e7 718 {
ashleymills 0:e979170e02e7 719 word32 blocks;
ashleymills 0:e979170e02e7 720
ashleymills 0:e979170e02e7 721 #ifdef HAVE_CAVIUM
ashleymills 0:e979170e02e7 722 if (des->magic == CYASSL_3DES_CAVIUM_MAGIC)
ashleymills 0:e979170e02e7 723 return Des3_CaviumCbcDecrypt(des, out, in, sz);
ashleymills 0:e979170e02e7 724 #endif
ashleymills 0:e979170e02e7 725
ashleymills 0:e979170e02e7 726 blocks = sz / DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 727 while (blocks--) {
ashleymills 0:e979170e02e7 728 XMEMCPY(des->tmp, in, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 729 Des3ProcessBlock(des, (byte*)des->tmp, out);
ashleymills 0:e979170e02e7 730 xorbuf(out, (byte*)des->reg, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 731 XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 732
ashleymills 0:e979170e02e7 733 out += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 734 in += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 735 }
ashleymills 0:e979170e02e7 736 }
ashleymills 0:e979170e02e7 737
ashleymills 0:e979170e02e7 738 #ifdef CYASSL_DES_ECB
ashleymills 0:e979170e02e7 739
ashleymills 0:e979170e02e7 740 /* One block, compatibility only */
ashleymills 0:e979170e02e7 741 void Des_EcbEncrypt(Des* des, byte* out, const byte* in, word32 sz)
ashleymills 0:e979170e02e7 742 {
ashleymills 0:e979170e02e7 743 word32 blocks = sz / DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 744
ashleymills 0:e979170e02e7 745 while (blocks--) {
ashleymills 0:e979170e02e7 746 DesProcessBlock(des, in, out);
ashleymills 0:e979170e02e7 747
ashleymills 0:e979170e02e7 748 out += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 749 in += DES_BLOCK_SIZE;
ashleymills 0:e979170e02e7 750 }
ashleymills 0:e979170e02e7 751 }
ashleymills 0:e979170e02e7 752
ashleymills 0:e979170e02e7 753 #endif /* CYASSL_DES_ECB */
ashleymills 0:e979170e02e7 754
ashleymills 0:e979170e02e7 755 #endif /* STM32F2_CRYPTO */
ashleymills 0:e979170e02e7 756
ashleymills 0:e979170e02e7 757 void Des_SetIV(Des* des, const byte* iv)
ashleymills 0:e979170e02e7 758 {
ashleymills 0:e979170e02e7 759 if (des && iv)
ashleymills 0:e979170e02e7 760 XMEMCPY(des->reg, iv, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 761 }
ashleymills 0:e979170e02e7 762
ashleymills 0:e979170e02e7 763
ashleymills 0:e979170e02e7 764 void Des3_SetIV(Des3* des, const byte* iv)
ashleymills 0:e979170e02e7 765 {
ashleymills 0:e979170e02e7 766 if (des && iv)
ashleymills 0:e979170e02e7 767 XMEMCPY(des->reg, iv, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 768 }
ashleymills 0:e979170e02e7 769
ashleymills 0:e979170e02e7 770
ashleymills 0:e979170e02e7 771 #ifdef HAVE_CAVIUM
ashleymills 0:e979170e02e7 772
ashleymills 0:e979170e02e7 773 #include <cyassl/ctaocrypt/logging.h>
ashleymills 0:e979170e02e7 774 #include "cavium_common.h"
ashleymills 0:e979170e02e7 775
ashleymills 0:e979170e02e7 776 /* Initiliaze Des3 for use with Nitrox device */
ashleymills 0:e979170e02e7 777 int Des3_InitCavium(Des3* des3, int devId)
ashleymills 0:e979170e02e7 778 {
ashleymills 0:e979170e02e7 779 if (des3 == NULL)
ashleymills 0:e979170e02e7 780 return -1;
ashleymills 0:e979170e02e7 781
ashleymills 0:e979170e02e7 782 if (CspAllocContext(CONTEXT_SSL, &des3->contextHandle, devId) != 0)
ashleymills 0:e979170e02e7 783 return -1;
ashleymills 0:e979170e02e7 784
ashleymills 0:e979170e02e7 785 des3->devId = devId;
ashleymills 0:e979170e02e7 786 des3->magic = CYASSL_3DES_CAVIUM_MAGIC;
ashleymills 0:e979170e02e7 787
ashleymills 0:e979170e02e7 788 return 0;
ashleymills 0:e979170e02e7 789 }
ashleymills 0:e979170e02e7 790
ashleymills 0:e979170e02e7 791
ashleymills 0:e979170e02e7 792 /* Free Des3 from use with Nitrox device */
ashleymills 0:e979170e02e7 793 void Des3_FreeCavium(Des3* des3)
ashleymills 0:e979170e02e7 794 {
ashleymills 0:e979170e02e7 795 if (des3 == NULL)
ashleymills 0:e979170e02e7 796 return;
ashleymills 0:e979170e02e7 797
ashleymills 0:e979170e02e7 798 if (des3->magic != CYASSL_3DES_CAVIUM_MAGIC)
ashleymills 0:e979170e02e7 799 return;
ashleymills 0:e979170e02e7 800
ashleymills 0:e979170e02e7 801 CspFreeContext(CONTEXT_SSL, des3->contextHandle, des3->devId);
ashleymills 0:e979170e02e7 802 des3->magic = 0;
ashleymills 0:e979170e02e7 803 }
ashleymills 0:e979170e02e7 804
ashleymills 0:e979170e02e7 805
ashleymills 0:e979170e02e7 806 static void Des3_CaviumSetKey(Des3* des3, const byte* key, const byte* iv)
ashleymills 0:e979170e02e7 807 {
ashleymills 0:e979170e02e7 808 if (des3 == NULL)
ashleymills 0:e979170e02e7 809 return;
ashleymills 0:e979170e02e7 810
ashleymills 0:e979170e02e7 811 /* key[0] holds key, iv in reg */
ashleymills 0:e979170e02e7 812 XMEMCPY(des3->key[0], key, DES_BLOCK_SIZE*3);
ashleymills 0:e979170e02e7 813
ashleymills 0:e979170e02e7 814 Des3_SetIV(des3, iv);
ashleymills 0:e979170e02e7 815 }
ashleymills 0:e979170e02e7 816
ashleymills 0:e979170e02e7 817
ashleymills 0:e979170e02e7 818 static void Des3_CaviumCbcEncrypt(Des3* des3, byte* out, const byte* in,
ashleymills 0:e979170e02e7 819 word32 length)
ashleymills 0:e979170e02e7 820 {
ashleymills 0:e979170e02e7 821 word offset = 0;
ashleymills 0:e979170e02e7 822 word32 requestId;
ashleymills 0:e979170e02e7 823
ashleymills 0:e979170e02e7 824 while (length > CYASSL_MAX_16BIT) {
ashleymills 0:e979170e02e7 825 word16 slen = (word16)CYASSL_MAX_16BIT;
ashleymills 0:e979170e02e7 826 if (CspEncrypt3Des(CAVIUM_BLOCKING, des3->contextHandle,
ashleymills 0:e979170e02e7 827 CAVIUM_NO_UPDATE, slen, (byte*)in + offset,
ashleymills 0:e979170e02e7 828 out + offset, (byte*)des3->reg, (byte*)des3->key[0],
ashleymills 0:e979170e02e7 829 &requestId, des3->devId) != 0) {
ashleymills 0:e979170e02e7 830 CYASSL_MSG("Bad Cavium 3DES Cbc Encrypt");
ashleymills 0:e979170e02e7 831 }
ashleymills 0:e979170e02e7 832 length -= CYASSL_MAX_16BIT;
ashleymills 0:e979170e02e7 833 offset += CYASSL_MAX_16BIT;
ashleymills 0:e979170e02e7 834 XMEMCPY(des3->reg, out + offset - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 835 }
ashleymills 0:e979170e02e7 836 if (length) {
ashleymills 0:e979170e02e7 837 word16 slen = (word16)length;
ashleymills 0:e979170e02e7 838
ashleymills 0:e979170e02e7 839 if (CspEncrypt3Des(CAVIUM_BLOCKING, des3->contextHandle,
ashleymills 0:e979170e02e7 840 CAVIUM_NO_UPDATE, slen, (byte*)in + offset,
ashleymills 0:e979170e02e7 841 out + offset, (byte*)des3->reg, (byte*)des3->key[0],
ashleymills 0:e979170e02e7 842 &requestId, des3->devId) != 0) {
ashleymills 0:e979170e02e7 843 CYASSL_MSG("Bad Cavium 3DES Cbc Encrypt");
ashleymills 0:e979170e02e7 844 }
ashleymills 0:e979170e02e7 845 XMEMCPY(des3->reg, out+offset+length - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 846 }
ashleymills 0:e979170e02e7 847 }
ashleymills 0:e979170e02e7 848
ashleymills 0:e979170e02e7 849 static void Des3_CaviumCbcDecrypt(Des3* des3, byte* out, const byte* in,
ashleymills 0:e979170e02e7 850 word32 length)
ashleymills 0:e979170e02e7 851 {
ashleymills 0:e979170e02e7 852 word32 requestId;
ashleymills 0:e979170e02e7 853 word offset = 0;
ashleymills 0:e979170e02e7 854
ashleymills 0:e979170e02e7 855 while (length > CYASSL_MAX_16BIT) {
ashleymills 0:e979170e02e7 856 word16 slen = (word16)CYASSL_MAX_16BIT;
ashleymills 0:e979170e02e7 857 XMEMCPY(des3->tmp, in + offset + slen - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 858 if (CspDecrypt3Des(CAVIUM_BLOCKING, des3->contextHandle,
ashleymills 0:e979170e02e7 859 CAVIUM_NO_UPDATE, slen, (byte*)in+offset, out+offset,
ashleymills 0:e979170e02e7 860 (byte*)des3->reg, (byte*)des3->key[0], &requestId,
ashleymills 0:e979170e02e7 861 des3->devId) != 0) {
ashleymills 0:e979170e02e7 862 CYASSL_MSG("Bad Cavium 3Des Decrypt");
ashleymills 0:e979170e02e7 863 }
ashleymills 0:e979170e02e7 864 length -= CYASSL_MAX_16BIT;
ashleymills 0:e979170e02e7 865 offset += CYASSL_MAX_16BIT;
ashleymills 0:e979170e02e7 866 XMEMCPY(des3->reg, des3->tmp, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 867 }
ashleymills 0:e979170e02e7 868 if (length) {
ashleymills 0:e979170e02e7 869 word16 slen = (word16)length;
ashleymills 0:e979170e02e7 870 XMEMCPY(des3->tmp, in + offset + slen - DES_BLOCK_SIZE,DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 871 if (CspDecrypt3Des(CAVIUM_BLOCKING, des3->contextHandle,
ashleymills 0:e979170e02e7 872 CAVIUM_NO_UPDATE, slen, (byte*)in+offset, out+offset,
ashleymills 0:e979170e02e7 873 (byte*)des3->reg, (byte*)des3->key[0], &requestId,
ashleymills 0:e979170e02e7 874 des3->devId) != 0) {
ashleymills 0:e979170e02e7 875 CYASSL_MSG("Bad Cavium 3Des Decrypt");
ashleymills 0:e979170e02e7 876 }
ashleymills 0:e979170e02e7 877 XMEMCPY(des3->reg, des3->tmp, DES_BLOCK_SIZE);
ashleymills 0:e979170e02e7 878 }
ashleymills 0:e979170e02e7 879 }
ashleymills 0:e979170e02e7 880
ashleymills 0:e979170e02e7 881 #endif /* HAVE_CAVIUM */
ashleymills 0:e979170e02e7 882
ashleymills 0:e979170e02e7 883 #endif /* NO_DES3 */