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:
Vanger
Date:
Mon Jan 19 21:45:42 2015 +0000
Revision:
0:b86d15c6ba29
Updated CyaSSL Library to 3.3.0. Changed Settings and functions to be implemented for mbed platforms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vanger 0:b86d15c6ba29 1 /* des3.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_DES3
Vanger 0:b86d15c6ba29 29
Vanger 0:b86d15c6ba29 30 #ifdef HAVE_FIPS
Vanger 0:b86d15c6ba29 31 /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */
Vanger 0:b86d15c6ba29 32 #define FIPS_NO_WRAPPERS
Vanger 0:b86d15c6ba29 33 #endif
Vanger 0:b86d15c6ba29 34
Vanger 0:b86d15c6ba29 35 #include <cyassl/ctaocrypt/des3.h>
Vanger 0:b86d15c6ba29 36 #include <cyassl/ctaocrypt/error-crypt.h>
Vanger 0:b86d15c6ba29 37 #include <cyassl/ctaocrypt/logging.h>
Vanger 0:b86d15c6ba29 38
Vanger 0:b86d15c6ba29 39 #ifdef NO_INLINE
Vanger 0:b86d15c6ba29 40 #include <cyassl/ctaocrypt/misc.h>
Vanger 0:b86d15c6ba29 41 #else
Vanger 0:b86d15c6ba29 42 #include <ctaocrypt/src/misc.c>
Vanger 0:b86d15c6ba29 43 #endif
Vanger 0:b86d15c6ba29 44
Vanger 0:b86d15c6ba29 45
Vanger 0:b86d15c6ba29 46 #ifdef HAVE_CAVIUM
Vanger 0:b86d15c6ba29 47 static int Des3_CaviumSetKey(Des3* des3, const byte* key, const byte* iv);
Vanger 0:b86d15c6ba29 48 static int Des3_CaviumCbcEncrypt(Des3* des3, byte* out, const byte* in,
Vanger 0:b86d15c6ba29 49 word32 length);
Vanger 0:b86d15c6ba29 50 static int Des3_CaviumCbcDecrypt(Des3* des3, byte* out, const byte* in,
Vanger 0:b86d15c6ba29 51 word32 length);
Vanger 0:b86d15c6ba29 52 #endif
Vanger 0:b86d15c6ba29 53
Vanger 0:b86d15c6ba29 54
Vanger 0:b86d15c6ba29 55
Vanger 0:b86d15c6ba29 56
Vanger 0:b86d15c6ba29 57 #ifdef STM32F2_CRYPTO
Vanger 0:b86d15c6ba29 58 /*
Vanger 0:b86d15c6ba29 59 * STM32F2 hardware DES/3DES support through the STM32F2 standard
Vanger 0:b86d15c6ba29 60 * peripheral library. Documentation located in STM32F2xx Standard
Vanger 0:b86d15c6ba29 61 * Peripheral Library document (See note in README).
Vanger 0:b86d15c6ba29 62 */
Vanger 0:b86d15c6ba29 63 #include "stm32f2xx.h"
Vanger 0:b86d15c6ba29 64 #include "stm32f2xx_cryp.h"
Vanger 0:b86d15c6ba29 65
Vanger 0:b86d15c6ba29 66 int Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
Vanger 0:b86d15c6ba29 67 {
Vanger 0:b86d15c6ba29 68 word32 *dkey = des->key;
Vanger 0:b86d15c6ba29 69
Vanger 0:b86d15c6ba29 70 XMEMCPY(dkey, key, 8);
Vanger 0:b86d15c6ba29 71 ByteReverseWords(dkey, dkey, 8);
Vanger 0:b86d15c6ba29 72
Vanger 0:b86d15c6ba29 73 Des_SetIV(des, iv);
Vanger 0:b86d15c6ba29 74
Vanger 0:b86d15c6ba29 75 return 0;
Vanger 0:b86d15c6ba29 76 }
Vanger 0:b86d15c6ba29 77
Vanger 0:b86d15c6ba29 78 int Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir)
Vanger 0:b86d15c6ba29 79 {
Vanger 0:b86d15c6ba29 80 word32 *dkey1 = des->key[0];
Vanger 0:b86d15c6ba29 81 word32 *dkey2 = des->key[1];
Vanger 0:b86d15c6ba29 82 word32 *dkey3 = des->key[2];
Vanger 0:b86d15c6ba29 83
Vanger 0:b86d15c6ba29 84 XMEMCPY(dkey1, key, 8); /* set key 1 */
Vanger 0:b86d15c6ba29 85 XMEMCPY(dkey2, key + 8, 8); /* set key 2 */
Vanger 0:b86d15c6ba29 86 XMEMCPY(dkey3, key + 16, 8); /* set key 3 */
Vanger 0:b86d15c6ba29 87
Vanger 0:b86d15c6ba29 88 ByteReverseWords(dkey1, dkey1, 8);
Vanger 0:b86d15c6ba29 89 ByteReverseWords(dkey2, dkey2, 8);
Vanger 0:b86d15c6ba29 90 ByteReverseWords(dkey3, dkey3, 8);
Vanger 0:b86d15c6ba29 91
Vanger 0:b86d15c6ba29 92 return Des3_SetIV(des, iv);
Vanger 0:b86d15c6ba29 93 }
Vanger 0:b86d15c6ba29 94
Vanger 0:b86d15c6ba29 95 void DesCrypt(Des* des, byte* out, const byte* in, word32 sz,
Vanger 0:b86d15c6ba29 96 int dir, int mode)
Vanger 0:b86d15c6ba29 97 {
Vanger 0:b86d15c6ba29 98 word32 *dkey, *iv;
Vanger 0:b86d15c6ba29 99 CRYP_InitTypeDef DES_CRYP_InitStructure;
Vanger 0:b86d15c6ba29 100 CRYP_KeyInitTypeDef DES_CRYP_KeyInitStructure;
Vanger 0:b86d15c6ba29 101 CRYP_IVInitTypeDef DES_CRYP_IVInitStructure;
Vanger 0:b86d15c6ba29 102
Vanger 0:b86d15c6ba29 103 dkey = des->key;
Vanger 0:b86d15c6ba29 104 iv = des->reg;
Vanger 0:b86d15c6ba29 105
Vanger 0:b86d15c6ba29 106 /* crypto structure initialization */
Vanger 0:b86d15c6ba29 107 CRYP_KeyStructInit(&DES_CRYP_KeyInitStructure);
Vanger 0:b86d15c6ba29 108 CRYP_StructInit(&DES_CRYP_InitStructure);
Vanger 0:b86d15c6ba29 109 CRYP_IVStructInit(&DES_CRYP_IVInitStructure);
Vanger 0:b86d15c6ba29 110
Vanger 0:b86d15c6ba29 111 /* reset registers to their default values */
Vanger 0:b86d15c6ba29 112 CRYP_DeInit();
Vanger 0:b86d15c6ba29 113
Vanger 0:b86d15c6ba29 114 /* set direction, mode, and datatype */
Vanger 0:b86d15c6ba29 115 if (dir == DES_ENCRYPTION) {
Vanger 0:b86d15c6ba29 116 DES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
Vanger 0:b86d15c6ba29 117 } else { /* DES_DECRYPTION */
Vanger 0:b86d15c6ba29 118 DES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt;
Vanger 0:b86d15c6ba29 119 }
Vanger 0:b86d15c6ba29 120
Vanger 0:b86d15c6ba29 121 if (mode == DES_CBC) {
Vanger 0:b86d15c6ba29 122 DES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_DES_CBC;
Vanger 0:b86d15c6ba29 123 } else { /* DES_ECB */
Vanger 0:b86d15c6ba29 124 DES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_DES_ECB;
Vanger 0:b86d15c6ba29 125 }
Vanger 0:b86d15c6ba29 126
Vanger 0:b86d15c6ba29 127 DES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
Vanger 0:b86d15c6ba29 128 CRYP_Init(&DES_CRYP_InitStructure);
Vanger 0:b86d15c6ba29 129
Vanger 0:b86d15c6ba29 130 /* load key into correct registers */
Vanger 0:b86d15c6ba29 131 DES_CRYP_KeyInitStructure.CRYP_Key1Left = dkey[0];
Vanger 0:b86d15c6ba29 132 DES_CRYP_KeyInitStructure.CRYP_Key1Right = dkey[1];
Vanger 0:b86d15c6ba29 133 CRYP_KeyInit(&DES_CRYP_KeyInitStructure);
Vanger 0:b86d15c6ba29 134
Vanger 0:b86d15c6ba29 135 /* set iv */
Vanger 0:b86d15c6ba29 136 ByteReverseWords(iv, iv, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 137 DES_CRYP_IVInitStructure.CRYP_IV0Left = iv[0];
Vanger 0:b86d15c6ba29 138 DES_CRYP_IVInitStructure.CRYP_IV0Right = iv[1];
Vanger 0:b86d15c6ba29 139 CRYP_IVInit(&DES_CRYP_IVInitStructure);
Vanger 0:b86d15c6ba29 140
Vanger 0:b86d15c6ba29 141 /* enable crypto processor */
Vanger 0:b86d15c6ba29 142 CRYP_Cmd(ENABLE);
Vanger 0:b86d15c6ba29 143
Vanger 0:b86d15c6ba29 144 while (sz > 0)
Vanger 0:b86d15c6ba29 145 {
Vanger 0:b86d15c6ba29 146 /* flush IN/OUT FIFOs */
Vanger 0:b86d15c6ba29 147 CRYP_FIFOFlush();
Vanger 0:b86d15c6ba29 148
Vanger 0:b86d15c6ba29 149 /* if input and output same will overwrite input iv */
Vanger 0:b86d15c6ba29 150 XMEMCPY(des->tmp, in + sz - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 151
Vanger 0:b86d15c6ba29 152 CRYP_DataIn(*(uint32_t*)&in[0]);
Vanger 0:b86d15c6ba29 153 CRYP_DataIn(*(uint32_t*)&in[4]);
Vanger 0:b86d15c6ba29 154
Vanger 0:b86d15c6ba29 155 /* wait until the complete message has been processed */
Vanger 0:b86d15c6ba29 156 while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
Vanger 0:b86d15c6ba29 157
Vanger 0:b86d15c6ba29 158 *(uint32_t*)&out[0] = CRYP_DataOut();
Vanger 0:b86d15c6ba29 159 *(uint32_t*)&out[4] = CRYP_DataOut();
Vanger 0:b86d15c6ba29 160
Vanger 0:b86d15c6ba29 161 /* store iv for next call */
Vanger 0:b86d15c6ba29 162 XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 163
Vanger 0:b86d15c6ba29 164 sz -= DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 165 in += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 166 out += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 167 }
Vanger 0:b86d15c6ba29 168
Vanger 0:b86d15c6ba29 169 /* disable crypto processor */
Vanger 0:b86d15c6ba29 170 CRYP_Cmd(DISABLE);
Vanger 0:b86d15c6ba29 171 }
Vanger 0:b86d15c6ba29 172
Vanger 0:b86d15c6ba29 173 int Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 174 {
Vanger 0:b86d15c6ba29 175 DesCrypt(des, out, in, sz, DES_ENCRYPTION, DES_CBC);
Vanger 0:b86d15c6ba29 176 return 0;
Vanger 0:b86d15c6ba29 177 }
Vanger 0:b86d15c6ba29 178
Vanger 0:b86d15c6ba29 179 int Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 180 {
Vanger 0:b86d15c6ba29 181 DesCrypt(des, out, in, sz, DES_DECRYPTION, DES_CBC);
Vanger 0:b86d15c6ba29 182 return 0;
Vanger 0:b86d15c6ba29 183 }
Vanger 0:b86d15c6ba29 184
Vanger 0:b86d15c6ba29 185 int Des_EcbEncrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 186 {
Vanger 0:b86d15c6ba29 187 DesCrypt(des, out, in, sz, DES_ENCRYPTION, DES_ECB);
Vanger 0:b86d15c6ba29 188 return 0;
Vanger 0:b86d15c6ba29 189 }
Vanger 0:b86d15c6ba29 190
Vanger 0:b86d15c6ba29 191 void Des3Crypt(Des3* des, byte* out, const byte* in, word32 sz,
Vanger 0:b86d15c6ba29 192 int dir)
Vanger 0:b86d15c6ba29 193 {
Vanger 0:b86d15c6ba29 194 word32 *dkey1, *dkey2, *dkey3, *iv;
Vanger 0:b86d15c6ba29 195 CRYP_InitTypeDef DES3_CRYP_InitStructure;
Vanger 0:b86d15c6ba29 196 CRYP_KeyInitTypeDef DES3_CRYP_KeyInitStructure;
Vanger 0:b86d15c6ba29 197 CRYP_IVInitTypeDef DES3_CRYP_IVInitStructure;
Vanger 0:b86d15c6ba29 198
Vanger 0:b86d15c6ba29 199 dkey1 = des->key[0];
Vanger 0:b86d15c6ba29 200 dkey2 = des->key[1];
Vanger 0:b86d15c6ba29 201 dkey3 = des->key[2];
Vanger 0:b86d15c6ba29 202 iv = des->reg;
Vanger 0:b86d15c6ba29 203
Vanger 0:b86d15c6ba29 204 /* crypto structure initialization */
Vanger 0:b86d15c6ba29 205 CRYP_KeyStructInit(&DES3_CRYP_KeyInitStructure);
Vanger 0:b86d15c6ba29 206 CRYP_StructInit(&DES3_CRYP_InitStructure);
Vanger 0:b86d15c6ba29 207 CRYP_IVStructInit(&DES3_CRYP_IVInitStructure);
Vanger 0:b86d15c6ba29 208
Vanger 0:b86d15c6ba29 209 /* reset registers to their default values */
Vanger 0:b86d15c6ba29 210 CRYP_DeInit();
Vanger 0:b86d15c6ba29 211
Vanger 0:b86d15c6ba29 212 /* set direction, mode, and datatype */
Vanger 0:b86d15c6ba29 213 if (dir == DES_ENCRYPTION) {
Vanger 0:b86d15c6ba29 214 DES3_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
Vanger 0:b86d15c6ba29 215 } else {
Vanger 0:b86d15c6ba29 216 DES3_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt;
Vanger 0:b86d15c6ba29 217 }
Vanger 0:b86d15c6ba29 218
Vanger 0:b86d15c6ba29 219 DES3_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_TDES_CBC;
Vanger 0:b86d15c6ba29 220 DES3_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
Vanger 0:b86d15c6ba29 221 CRYP_Init(&DES3_CRYP_InitStructure);
Vanger 0:b86d15c6ba29 222
Vanger 0:b86d15c6ba29 223 /* load key into correct registers */
Vanger 0:b86d15c6ba29 224 DES3_CRYP_KeyInitStructure.CRYP_Key1Left = dkey1[0];
Vanger 0:b86d15c6ba29 225 DES3_CRYP_KeyInitStructure.CRYP_Key1Right = dkey1[1];
Vanger 0:b86d15c6ba29 226 DES3_CRYP_KeyInitStructure.CRYP_Key2Left = dkey2[0];
Vanger 0:b86d15c6ba29 227 DES3_CRYP_KeyInitStructure.CRYP_Key2Right = dkey2[1];
Vanger 0:b86d15c6ba29 228 DES3_CRYP_KeyInitStructure.CRYP_Key3Left = dkey3[0];
Vanger 0:b86d15c6ba29 229 DES3_CRYP_KeyInitStructure.CRYP_Key3Right = dkey3[1];
Vanger 0:b86d15c6ba29 230 CRYP_KeyInit(&DES3_CRYP_KeyInitStructure);
Vanger 0:b86d15c6ba29 231
Vanger 0:b86d15c6ba29 232 /* set iv */
Vanger 0:b86d15c6ba29 233 ByteReverseWords(iv, iv, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 234 DES3_CRYP_IVInitStructure.CRYP_IV0Left = iv[0];
Vanger 0:b86d15c6ba29 235 DES3_CRYP_IVInitStructure.CRYP_IV0Right = iv[1];
Vanger 0:b86d15c6ba29 236 CRYP_IVInit(&DES3_CRYP_IVInitStructure);
Vanger 0:b86d15c6ba29 237
Vanger 0:b86d15c6ba29 238 /* enable crypto processor */
Vanger 0:b86d15c6ba29 239 CRYP_Cmd(ENABLE);
Vanger 0:b86d15c6ba29 240
Vanger 0:b86d15c6ba29 241 while (sz > 0)
Vanger 0:b86d15c6ba29 242 {
Vanger 0:b86d15c6ba29 243 /* flush IN/OUT FIFOs */
Vanger 0:b86d15c6ba29 244 CRYP_FIFOFlush();
Vanger 0:b86d15c6ba29 245
Vanger 0:b86d15c6ba29 246 CRYP_DataIn(*(uint32_t*)&in[0]);
Vanger 0:b86d15c6ba29 247 CRYP_DataIn(*(uint32_t*)&in[4]);
Vanger 0:b86d15c6ba29 248
Vanger 0:b86d15c6ba29 249 /* wait until the complete message has been processed */
Vanger 0:b86d15c6ba29 250 while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
Vanger 0:b86d15c6ba29 251
Vanger 0:b86d15c6ba29 252 *(uint32_t*)&out[0] = CRYP_DataOut();
Vanger 0:b86d15c6ba29 253 *(uint32_t*)&out[4] = CRYP_DataOut();
Vanger 0:b86d15c6ba29 254
Vanger 0:b86d15c6ba29 255 /* store iv for next call */
Vanger 0:b86d15c6ba29 256 XMEMCPY(des->reg, out + sz - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 257
Vanger 0:b86d15c6ba29 258 sz -= DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 259 in += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 260 out += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 261 }
Vanger 0:b86d15c6ba29 262
Vanger 0:b86d15c6ba29 263 /* disable crypto processor */
Vanger 0:b86d15c6ba29 264 CRYP_Cmd(DISABLE);
Vanger 0:b86d15c6ba29 265
Vanger 0:b86d15c6ba29 266 }
Vanger 0:b86d15c6ba29 267
Vanger 0:b86d15c6ba29 268 int Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 269 {
Vanger 0:b86d15c6ba29 270 Des3Crypt(des, out, in, sz, DES_ENCRYPTION);
Vanger 0:b86d15c6ba29 271 return 0;
Vanger 0:b86d15c6ba29 272 }
Vanger 0:b86d15c6ba29 273
Vanger 0:b86d15c6ba29 274 int Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 275 {
Vanger 0:b86d15c6ba29 276 Des3Crypt(des, out, in, sz, DES_DECRYPTION);
Vanger 0:b86d15c6ba29 277 return 0;
Vanger 0:b86d15c6ba29 278 }
Vanger 0:b86d15c6ba29 279
Vanger 0:b86d15c6ba29 280 #elif defined(HAVE_COLDFIRE_SEC)
Vanger 0:b86d15c6ba29 281
Vanger 0:b86d15c6ba29 282 #include <cyassl/ctaocrypt/types.h>
Vanger 0:b86d15c6ba29 283
Vanger 0:b86d15c6ba29 284 #include "sec.h"
Vanger 0:b86d15c6ba29 285 #include "mcf5475_sec.h"
Vanger 0:b86d15c6ba29 286 #include "mcf5475_siu.h"
Vanger 0:b86d15c6ba29 287
Vanger 0:b86d15c6ba29 288 #if defined (HAVE_THREADX)
Vanger 0:b86d15c6ba29 289 #include "memory_pools.h"
Vanger 0:b86d15c6ba29 290 extern TX_BYTE_POOL mp_ncached; /* Non Cached memory pool */
Vanger 0:b86d15c6ba29 291 #endif
Vanger 0:b86d15c6ba29 292
Vanger 0:b86d15c6ba29 293 #define DES_BUFFER_SIZE (DES_BLOCK_SIZE * 64)
Vanger 0:b86d15c6ba29 294 static unsigned char *desBuffIn = NULL ;
Vanger 0:b86d15c6ba29 295 static unsigned char *desBuffOut = NULL ;
Vanger 0:b86d15c6ba29 296 static byte *secIV ;
Vanger 0:b86d15c6ba29 297 static byte *secKey ;
Vanger 0:b86d15c6ba29 298 static volatile SECdescriptorType *secDesc ;
Vanger 0:b86d15c6ba29 299
Vanger 0:b86d15c6ba29 300 static CyaSSL_Mutex Mutex_DesSEC ;
Vanger 0:b86d15c6ba29 301
Vanger 0:b86d15c6ba29 302 #define SEC_DESC_DES_CBC_ENCRYPT 0x20500010
Vanger 0:b86d15c6ba29 303 #define SEC_DESC_DES_CBC_DECRYPT 0x20400010
Vanger 0:b86d15c6ba29 304 #define SEC_DESC_DES3_CBC_ENCRYPT 0x20700010
Vanger 0:b86d15c6ba29 305 #define SEC_DESC_DES3_CBC_DECRYPT 0x20600010
Vanger 0:b86d15c6ba29 306
Vanger 0:b86d15c6ba29 307 #define DES_IVLEN 8
Vanger 0:b86d15c6ba29 308 #define DES_KEYLEN 8
Vanger 0:b86d15c6ba29 309 #define DES3_IVLEN 8
Vanger 0:b86d15c6ba29 310 #define DES3_KEYLEN 24
Vanger 0:b86d15c6ba29 311
Vanger 0:b86d15c6ba29 312 extern volatile unsigned char __MBAR[];
Vanger 0:b86d15c6ba29 313
Vanger 0:b86d15c6ba29 314 static void Des_Cbc(byte* out, const byte* in, word32 sz,
Vanger 0:b86d15c6ba29 315 byte *key, byte *iv, word32 desc)
Vanger 0:b86d15c6ba29 316 {
Vanger 0:b86d15c6ba29 317 #ifdef DEBUG_CYASSL
Vanger 0:b86d15c6ba29 318 int ret ; int stat1,stat2 ;
Vanger 0:b86d15c6ba29 319 #endif
Vanger 0:b86d15c6ba29 320 int size ;
Vanger 0:b86d15c6ba29 321 volatile int v ;
Vanger 0:b86d15c6ba29 322
Vanger 0:b86d15c6ba29 323 LockMutex(&Mutex_DesSEC) ;
Vanger 0:b86d15c6ba29 324
Vanger 0:b86d15c6ba29 325 secDesc->length1 = 0x0;
Vanger 0:b86d15c6ba29 326 secDesc->pointer1 = NULL;
Vanger 0:b86d15c6ba29 327 if((desc==SEC_DESC_DES_CBC_ENCRYPT)||(desc==SEC_DESC_DES_CBC_DECRYPT)){
Vanger 0:b86d15c6ba29 328 secDesc->length2 = DES_IVLEN ;
Vanger 0:b86d15c6ba29 329 secDesc->length3 = DES_KEYLEN ;
Vanger 0:b86d15c6ba29 330 } else {
Vanger 0:b86d15c6ba29 331 secDesc->length2 = DES3_IVLEN ;
Vanger 0:b86d15c6ba29 332 secDesc->length3 = DES3_KEYLEN ;
Vanger 0:b86d15c6ba29 333 }
Vanger 0:b86d15c6ba29 334 secDesc->pointer2 = secIV ;
Vanger 0:b86d15c6ba29 335 secDesc->pointer3 = secKey;
Vanger 0:b86d15c6ba29 336 secDesc->pointer4 = desBuffIn ;
Vanger 0:b86d15c6ba29 337 secDesc->pointer5 = desBuffOut ;
Vanger 0:b86d15c6ba29 338 secDesc->length6 = 0;
Vanger 0:b86d15c6ba29 339 secDesc->pointer6 = NULL;
Vanger 0:b86d15c6ba29 340 secDesc->length7 = 0x0;
Vanger 0:b86d15c6ba29 341 secDesc->pointer7 = NULL;
Vanger 0:b86d15c6ba29 342 secDesc->nextDescriptorPtr = NULL ;
Vanger 0:b86d15c6ba29 343
Vanger 0:b86d15c6ba29 344 while(sz) {
Vanger 0:b86d15c6ba29 345 XMEMCPY(secIV, iv, secDesc->length2) ;
Vanger 0:b86d15c6ba29 346 if((sz%DES_BUFFER_SIZE) == sz) {
Vanger 0:b86d15c6ba29 347 size = sz ;
Vanger 0:b86d15c6ba29 348 sz = 0 ;
Vanger 0:b86d15c6ba29 349 } else {
Vanger 0:b86d15c6ba29 350 size = DES_BUFFER_SIZE ;
Vanger 0:b86d15c6ba29 351 sz -= DES_BUFFER_SIZE ;
Vanger 0:b86d15c6ba29 352 }
Vanger 0:b86d15c6ba29 353
Vanger 0:b86d15c6ba29 354 XMEMCPY(desBuffIn, in, size) ;
Vanger 0:b86d15c6ba29 355 XMEMCPY(secKey, key, secDesc->length3) ;
Vanger 0:b86d15c6ba29 356
Vanger 0:b86d15c6ba29 357 secDesc->header = desc ;
Vanger 0:b86d15c6ba29 358 secDesc->length4 = size;
Vanger 0:b86d15c6ba29 359 secDesc->length5 = size;
Vanger 0:b86d15c6ba29 360 /* Point SEC to the location of the descriptor */
Vanger 0:b86d15c6ba29 361 MCF_SEC_FR0 = (uint32)secDesc;
Vanger 0:b86d15c6ba29 362 /* Initialize SEC and wait for encryption to complete */
Vanger 0:b86d15c6ba29 363 MCF_SEC_CCCR0 = 0x0000001a;
Vanger 0:b86d15c6ba29 364 /* poll SISR to determine when channel is complete */
Vanger 0:b86d15c6ba29 365 v=0 ;
Vanger 0:b86d15c6ba29 366 while((secDesc->header>> 24) != 0xff) {
Vanger 0:b86d15c6ba29 367 if(v++ > 1000)break ;
Vanger 0:b86d15c6ba29 368 }
Vanger 0:b86d15c6ba29 369
Vanger 0:b86d15c6ba29 370 #ifdef DEBUG_CYASSL
Vanger 0:b86d15c6ba29 371 ret = MCF_SEC_SISRH;
Vanger 0:b86d15c6ba29 372 stat1 = MCF_SEC_DSR ;
Vanger 0:b86d15c6ba29 373 stat2 = MCF_SEC_DISR ;
Vanger 0:b86d15c6ba29 374 if(ret & 0xe0000000) {
Vanger 0:b86d15c6ba29 375 /* db_printf("Des_Cbc(%x):ISRH=%08x, DSR=%08x, DISR=%08x\n", desc, ret, stat1, stat2) ; */
Vanger 0:b86d15c6ba29 376 }
Vanger 0:b86d15c6ba29 377 #endif
Vanger 0:b86d15c6ba29 378
Vanger 0:b86d15c6ba29 379 XMEMCPY(out, desBuffOut, size) ;
Vanger 0:b86d15c6ba29 380
Vanger 0:b86d15c6ba29 381 if((desc==SEC_DESC_DES3_CBC_ENCRYPT)||(desc==SEC_DESC_DES_CBC_ENCRYPT)) {
Vanger 0:b86d15c6ba29 382 XMEMCPY((void*)iv, (void*)&(out[size-secDesc->length2]), secDesc->length2) ;
Vanger 0:b86d15c6ba29 383 } else {
Vanger 0:b86d15c6ba29 384 XMEMCPY((void*)iv, (void*)&(in[size-secDesc->length2]), secDesc->length2) ;
Vanger 0:b86d15c6ba29 385 }
Vanger 0:b86d15c6ba29 386
Vanger 0:b86d15c6ba29 387 in += size ;
Vanger 0:b86d15c6ba29 388 out += size ;
Vanger 0:b86d15c6ba29 389
Vanger 0:b86d15c6ba29 390 }
Vanger 0:b86d15c6ba29 391 UnLockMutex(&Mutex_DesSEC) ;
Vanger 0:b86d15c6ba29 392
Vanger 0:b86d15c6ba29 393 }
Vanger 0:b86d15c6ba29 394
Vanger 0:b86d15c6ba29 395
Vanger 0:b86d15c6ba29 396 int Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 397 {
Vanger 0:b86d15c6ba29 398 Des_Cbc(out, in, sz, (byte *)des->key, (byte *)des->reg, SEC_DESC_DES_CBC_ENCRYPT) ;
Vanger 0:b86d15c6ba29 399 return 0;
Vanger 0:b86d15c6ba29 400 }
Vanger 0:b86d15c6ba29 401
Vanger 0:b86d15c6ba29 402 int Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 403 {
Vanger 0:b86d15c6ba29 404 Des_Cbc(out, in, sz, (byte *)des->key, (byte *)des->reg, SEC_DESC_DES_CBC_DECRYPT) ;
Vanger 0:b86d15c6ba29 405 return 0;
Vanger 0:b86d15c6ba29 406 }
Vanger 0:b86d15c6ba29 407
Vanger 0:b86d15c6ba29 408 int Des3_CbcEncrypt(Des3* des3, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 409 {
Vanger 0:b86d15c6ba29 410 Des_Cbc(out, in, sz, (byte *)des3->key, (byte *)des3->reg, SEC_DESC_DES3_CBC_ENCRYPT) ;
Vanger 0:b86d15c6ba29 411 return 0;
Vanger 0:b86d15c6ba29 412 }
Vanger 0:b86d15c6ba29 413
Vanger 0:b86d15c6ba29 414
Vanger 0:b86d15c6ba29 415 int Des3_CbcDecrypt(Des3* des3, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 416 {
Vanger 0:b86d15c6ba29 417 Des_Cbc(out, in, sz, (byte *)des3->key, (byte *)des3->reg, SEC_DESC_DES3_CBC_DECRYPT) ;
Vanger 0:b86d15c6ba29 418 return 0;
Vanger 0:b86d15c6ba29 419 }
Vanger 0:b86d15c6ba29 420
Vanger 0:b86d15c6ba29 421 static void setParity(byte *buf, int len)
Vanger 0:b86d15c6ba29 422 {
Vanger 0:b86d15c6ba29 423 int i, j ;
Vanger 0:b86d15c6ba29 424 byte v ;
Vanger 0:b86d15c6ba29 425 int bits ;
Vanger 0:b86d15c6ba29 426
Vanger 0:b86d15c6ba29 427 for(i=0; i<len; i++)
Vanger 0:b86d15c6ba29 428 {
Vanger 0:b86d15c6ba29 429 v = buf[i] >> 1 ;
Vanger 0:b86d15c6ba29 430 buf[i] = v << 1 ;
Vanger 0:b86d15c6ba29 431 bits = 0 ;
Vanger 0:b86d15c6ba29 432 for(j=0; j<7; j++)
Vanger 0:b86d15c6ba29 433 {
Vanger 0:b86d15c6ba29 434 bits += (v&0x1) ;
Vanger 0:b86d15c6ba29 435 v = v >> 1 ;
Vanger 0:b86d15c6ba29 436 }
Vanger 0:b86d15c6ba29 437 buf[i] |= (1 - (bits&0x1)) ;
Vanger 0:b86d15c6ba29 438 }
Vanger 0:b86d15c6ba29 439
Vanger 0:b86d15c6ba29 440 }
Vanger 0:b86d15c6ba29 441
Vanger 0:b86d15c6ba29 442
Vanger 0:b86d15c6ba29 443 int Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
Vanger 0:b86d15c6ba29 444 {
Vanger 0:b86d15c6ba29 445 if(desBuffIn == NULL) {
Vanger 0:b86d15c6ba29 446 #if defined (HAVE_THREADX)
Vanger 0:b86d15c6ba29 447 int s1, s2, s3, s4, s5 ;
Vanger 0:b86d15c6ba29 448 s5 = tx_byte_allocate(&mp_ncached,(void *)&secDesc,
Vanger 0:b86d15c6ba29 449 sizeof(SECdescriptorType), TX_NO_WAIT);
Vanger 0:b86d15c6ba29 450 s1 = tx_byte_allocate(&mp_ncached,(void *)&desBuffIn, DES_BUFFER_SIZE, TX_NO_WAIT);
Vanger 0:b86d15c6ba29 451 s2 = tx_byte_allocate(&mp_ncached,(void *)&desBuffOut, DES_BUFFER_SIZE, TX_NO_WAIT);
Vanger 0:b86d15c6ba29 452 /* Don't know des or des3 to be used. Allocate larger buffers */
Vanger 0:b86d15c6ba29 453 s3 = tx_byte_allocate(&mp_ncached,(void *)&secKey, DES3_KEYLEN,TX_NO_WAIT);
Vanger 0:b86d15c6ba29 454 s4 = tx_byte_allocate(&mp_ncached,(void *)&secIV, DES3_IVLEN, TX_NO_WAIT);
Vanger 0:b86d15c6ba29 455 #else
Vanger 0:b86d15c6ba29 456 #warning "Allocate non-Cache buffers"
Vanger 0:b86d15c6ba29 457 #endif
Vanger 0:b86d15c6ba29 458
Vanger 0:b86d15c6ba29 459 InitMutex(&Mutex_DesSEC) ;
Vanger 0:b86d15c6ba29 460 }
Vanger 0:b86d15c6ba29 461
Vanger 0:b86d15c6ba29 462 XMEMCPY(des->key, key, DES_KEYLEN);
Vanger 0:b86d15c6ba29 463 setParity((byte *)des->key, DES_KEYLEN) ;
Vanger 0:b86d15c6ba29 464
Vanger 0:b86d15c6ba29 465 if (iv) {
Vanger 0:b86d15c6ba29 466 XMEMCPY(des->reg, iv, DES_IVLEN);
Vanger 0:b86d15c6ba29 467 } else {
Vanger 0:b86d15c6ba29 468 XMEMSET(des->reg, 0x0, DES_IVLEN) ;
Vanger 0:b86d15c6ba29 469 }
Vanger 0:b86d15c6ba29 470 return 0;
Vanger 0:b86d15c6ba29 471 }
Vanger 0:b86d15c6ba29 472
Vanger 0:b86d15c6ba29 473 int Des3_SetKey(Des3* des3, const byte* key, const byte* iv, int dir)
Vanger 0:b86d15c6ba29 474 {
Vanger 0:b86d15c6ba29 475
Vanger 0:b86d15c6ba29 476 if(desBuffIn == NULL) {
Vanger 0:b86d15c6ba29 477 #if defined (HAVE_THREADX)
Vanger 0:b86d15c6ba29 478 int s1, s2, s3, s4, s5 ;
Vanger 0:b86d15c6ba29 479 s5 = tx_byte_allocate(&mp_ncached,(void *)&secDesc,
Vanger 0:b86d15c6ba29 480 sizeof(SECdescriptorType), TX_NO_WAIT);
Vanger 0:b86d15c6ba29 481 s1 = tx_byte_allocate(&mp_ncached,(void *)&desBuffIn, DES_BUFFER_SIZE, TX_NO_WAIT);
Vanger 0:b86d15c6ba29 482 s2 = tx_byte_allocate(&mp_ncached,(void *)&desBuffOut, DES_BUFFER_SIZE, TX_NO_WAIT);
Vanger 0:b86d15c6ba29 483 s3 = tx_byte_allocate(&mp_ncached,(void *)&secKey, DES3_KEYLEN,TX_NO_WAIT);
Vanger 0:b86d15c6ba29 484 s4 = tx_byte_allocate(&mp_ncached,(void *)&secIV, DES3_IVLEN, TX_NO_WAIT);
Vanger 0:b86d15c6ba29 485 #else
Vanger 0:b86d15c6ba29 486 #warning "Allocate non-Cache buffers"
Vanger 0:b86d15c6ba29 487 #endif
Vanger 0:b86d15c6ba29 488
Vanger 0:b86d15c6ba29 489 InitMutex(&Mutex_DesSEC) ;
Vanger 0:b86d15c6ba29 490 }
Vanger 0:b86d15c6ba29 491
Vanger 0:b86d15c6ba29 492 XMEMCPY(des3->key[0], key, DES3_KEYLEN);
Vanger 0:b86d15c6ba29 493 setParity((byte *)des3->key[0], DES3_KEYLEN) ;
Vanger 0:b86d15c6ba29 494
Vanger 0:b86d15c6ba29 495 if (iv) {
Vanger 0:b86d15c6ba29 496 XMEMCPY(des3->reg, iv, DES3_IVLEN);
Vanger 0:b86d15c6ba29 497 } else {
Vanger 0:b86d15c6ba29 498 XMEMSET(des3->reg, 0x0, DES3_IVLEN) ;
Vanger 0:b86d15c6ba29 499 }
Vanger 0:b86d15c6ba29 500 return 0;
Vanger 0:b86d15c6ba29 501
Vanger 0:b86d15c6ba29 502 }
Vanger 0:b86d15c6ba29 503
Vanger 0:b86d15c6ba29 504 #elif defined FREESCALE_MMCAU
Vanger 0:b86d15c6ba29 505 /*
Vanger 0:b86d15c6ba29 506 * Freescale mmCAU hardware DES/3DES support through the CAU/mmCAU library.
Vanger 0:b86d15c6ba29 507 * Documentation located in ColdFire/ColdFire+ CAU and Kinetis mmCAU
Vanger 0:b86d15c6ba29 508 * Software Library User Guide (See note in README).
Vanger 0:b86d15c6ba29 509 */
Vanger 0:b86d15c6ba29 510 #include "cau_api.h"
Vanger 0:b86d15c6ba29 511
Vanger 0:b86d15c6ba29 512 const unsigned char parityLookup[128] =
Vanger 0:b86d15c6ba29 513 {
Vanger 0:b86d15c6ba29 514 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
Vanger 0:b86d15c6ba29 515 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
Vanger 0:b86d15c6ba29 516 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
Vanger 0:b86d15c6ba29 517 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
Vanger 0:b86d15c6ba29 518 };
Vanger 0:b86d15c6ba29 519
Vanger 0:b86d15c6ba29 520 int Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
Vanger 0:b86d15c6ba29 521 {
Vanger 0:b86d15c6ba29 522 int i = 0;
Vanger 0:b86d15c6ba29 523 byte* dkey = (byte*)des->key;
Vanger 0:b86d15c6ba29 524
Vanger 0:b86d15c6ba29 525 XMEMCPY(dkey, key, 8);
Vanger 0:b86d15c6ba29 526
Vanger 0:b86d15c6ba29 527 Des_SetIV(des, iv);
Vanger 0:b86d15c6ba29 528
Vanger 0:b86d15c6ba29 529 /* fix key parity, if needed */
Vanger 0:b86d15c6ba29 530 for (i = 0; i < 8; i++) {
Vanger 0:b86d15c6ba29 531 dkey[i] = ((dkey[i] & 0xFE) | parityLookup[dkey[i] >> 1]);
Vanger 0:b86d15c6ba29 532 }
Vanger 0:b86d15c6ba29 533
Vanger 0:b86d15c6ba29 534 return 0;
Vanger 0:b86d15c6ba29 535 }
Vanger 0:b86d15c6ba29 536
Vanger 0:b86d15c6ba29 537 int Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir)
Vanger 0:b86d15c6ba29 538 {
Vanger 0:b86d15c6ba29 539 int i = 0, ret = 0;
Vanger 0:b86d15c6ba29 540 byte* dkey1 = (byte*)des->key[0];
Vanger 0:b86d15c6ba29 541 byte* dkey2 = (byte*)des->key[1];
Vanger 0:b86d15c6ba29 542 byte* dkey3 = (byte*)des->key[2];
Vanger 0:b86d15c6ba29 543
Vanger 0:b86d15c6ba29 544 XMEMCPY(dkey1, key, 8); /* set key 1 */
Vanger 0:b86d15c6ba29 545 XMEMCPY(dkey2, key + 8, 8); /* set key 2 */
Vanger 0:b86d15c6ba29 546 XMEMCPY(dkey3, key + 16, 8); /* set key 3 */
Vanger 0:b86d15c6ba29 547
Vanger 0:b86d15c6ba29 548 ret = Des3_SetIV(des, iv);
Vanger 0:b86d15c6ba29 549 if (ret != 0)
Vanger 0:b86d15c6ba29 550 return ret;
Vanger 0:b86d15c6ba29 551
Vanger 0:b86d15c6ba29 552 /* fix key parity if needed */
Vanger 0:b86d15c6ba29 553 for (i = 0; i < 8; i++)
Vanger 0:b86d15c6ba29 554 dkey1[i] = ((dkey1[i] & 0xFE) | parityLookup[dkey1[i] >> 1]);
Vanger 0:b86d15c6ba29 555
Vanger 0:b86d15c6ba29 556 for (i = 0; i < 8; i++)
Vanger 0:b86d15c6ba29 557 dkey2[i] = ((dkey2[i] & 0xFE) | parityLookup[dkey2[i] >> 1]);
Vanger 0:b86d15c6ba29 558
Vanger 0:b86d15c6ba29 559 for (i = 0; i < 8; i++)
Vanger 0:b86d15c6ba29 560 dkey3[i] = ((dkey3[i] & 0xFE) | parityLookup[dkey3[i] >> 1]);
Vanger 0:b86d15c6ba29 561
Vanger 0:b86d15c6ba29 562 return ret;
Vanger 0:b86d15c6ba29 563 }
Vanger 0:b86d15c6ba29 564
Vanger 0:b86d15c6ba29 565 int Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 566 {
Vanger 0:b86d15c6ba29 567 int i;
Vanger 0:b86d15c6ba29 568 int offset = 0;
Vanger 0:b86d15c6ba29 569 int len = sz;
Vanger 0:b86d15c6ba29 570 byte *iv;
Vanger 0:b86d15c6ba29 571 byte temp_block[DES_BLOCK_SIZE];
Vanger 0:b86d15c6ba29 572
Vanger 0:b86d15c6ba29 573 iv = (byte*)des->reg;
Vanger 0:b86d15c6ba29 574
Vanger 0:b86d15c6ba29 575 if ((cyassl_word)out % CYASSL_MMCAU_ALIGNMENT) {
Vanger 0:b86d15c6ba29 576 CYASSL_MSG("Bad cau_des_encrypt alignment");
Vanger 0:b86d15c6ba29 577 return BAD_ALIGN_E;
Vanger 0:b86d15c6ba29 578 }
Vanger 0:b86d15c6ba29 579
Vanger 0:b86d15c6ba29 580 while (len > 0)
Vanger 0:b86d15c6ba29 581 {
Vanger 0:b86d15c6ba29 582 XMEMCPY(temp_block, in + offset, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 583
Vanger 0:b86d15c6ba29 584 /* XOR block with IV for CBC */
Vanger 0:b86d15c6ba29 585 for (i = 0; i < DES_BLOCK_SIZE; i++)
Vanger 0:b86d15c6ba29 586 temp_block[i] ^= iv[i];
Vanger 0:b86d15c6ba29 587
Vanger 0:b86d15c6ba29 588 cau_des_encrypt(temp_block, (byte*)des->key, out + offset);
Vanger 0:b86d15c6ba29 589
Vanger 0:b86d15c6ba29 590 len -= DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 591 offset += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 592
Vanger 0:b86d15c6ba29 593 /* store IV for next block */
Vanger 0:b86d15c6ba29 594 XMEMCPY(iv, out + offset - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 595 }
Vanger 0:b86d15c6ba29 596
Vanger 0:b86d15c6ba29 597 return 0;
Vanger 0:b86d15c6ba29 598 }
Vanger 0:b86d15c6ba29 599
Vanger 0:b86d15c6ba29 600 int Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 601 {
Vanger 0:b86d15c6ba29 602 int i;
Vanger 0:b86d15c6ba29 603 int offset = 0;
Vanger 0:b86d15c6ba29 604 int len = sz;
Vanger 0:b86d15c6ba29 605 byte* iv;
Vanger 0:b86d15c6ba29 606 byte temp_block[DES_BLOCK_SIZE];
Vanger 0:b86d15c6ba29 607
Vanger 0:b86d15c6ba29 608 iv = (byte*)des->reg;
Vanger 0:b86d15c6ba29 609
Vanger 0:b86d15c6ba29 610 if ((cyassl_word)out % CYASSL_MMCAU_ALIGNMENT) {
Vanger 0:b86d15c6ba29 611 CYASSL_MSG("Bad cau_des_decrypt alignment");
Vanger 0:b86d15c6ba29 612 return BAD_ALIGN_E;
Vanger 0:b86d15c6ba29 613 }
Vanger 0:b86d15c6ba29 614
Vanger 0:b86d15c6ba29 615 while (len > 0)
Vanger 0:b86d15c6ba29 616 {
Vanger 0:b86d15c6ba29 617 XMEMCPY(temp_block, in + offset, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 618
Vanger 0:b86d15c6ba29 619 cau_des_decrypt(in + offset, (byte*)des->key, out + offset);
Vanger 0:b86d15c6ba29 620
Vanger 0:b86d15c6ba29 621 /* XOR block with IV for CBC */
Vanger 0:b86d15c6ba29 622 for (i = 0; i < DES_BLOCK_SIZE; i++)
Vanger 0:b86d15c6ba29 623 (out + offset)[i] ^= iv[i];
Vanger 0:b86d15c6ba29 624
Vanger 0:b86d15c6ba29 625 /* store IV for next block */
Vanger 0:b86d15c6ba29 626 XMEMCPY(iv, temp_block, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 627
Vanger 0:b86d15c6ba29 628 len -= DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 629 offset += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 630 }
Vanger 0:b86d15c6ba29 631
Vanger 0:b86d15c6ba29 632 return 0;
Vanger 0:b86d15c6ba29 633 }
Vanger 0:b86d15c6ba29 634
Vanger 0:b86d15c6ba29 635 int Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 636 {
Vanger 0:b86d15c6ba29 637 int i;
Vanger 0:b86d15c6ba29 638 int offset = 0;
Vanger 0:b86d15c6ba29 639 int len = sz;
Vanger 0:b86d15c6ba29 640
Vanger 0:b86d15c6ba29 641 byte *iv;
Vanger 0:b86d15c6ba29 642 byte temp_block[DES_BLOCK_SIZE];
Vanger 0:b86d15c6ba29 643
Vanger 0:b86d15c6ba29 644 iv = (byte*)des->reg;
Vanger 0:b86d15c6ba29 645
Vanger 0:b86d15c6ba29 646 if ((cyassl_word)out % CYASSL_MMCAU_ALIGNMENT) {
Vanger 0:b86d15c6ba29 647 CYASSL_MSG("Bad 3ede cau_des_encrypt alignment");
Vanger 0:b86d15c6ba29 648 return BAD_ALIGN_E;
Vanger 0:b86d15c6ba29 649 }
Vanger 0:b86d15c6ba29 650
Vanger 0:b86d15c6ba29 651 while (len > 0)
Vanger 0:b86d15c6ba29 652 {
Vanger 0:b86d15c6ba29 653 XMEMCPY(temp_block, in + offset, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 654
Vanger 0:b86d15c6ba29 655 /* XOR block with IV for CBC */
Vanger 0:b86d15c6ba29 656 for (i = 0; i < DES_BLOCK_SIZE; i++)
Vanger 0:b86d15c6ba29 657 temp_block[i] ^= iv[i];
Vanger 0:b86d15c6ba29 658
Vanger 0:b86d15c6ba29 659 cau_des_encrypt(temp_block , (byte*)des->key[0], out + offset);
Vanger 0:b86d15c6ba29 660 cau_des_decrypt(out + offset, (byte*)des->key[1], out + offset);
Vanger 0:b86d15c6ba29 661 cau_des_encrypt(out + offset, (byte*)des->key[2], out + offset);
Vanger 0:b86d15c6ba29 662
Vanger 0:b86d15c6ba29 663 len -= DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 664 offset += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 665
Vanger 0:b86d15c6ba29 666 /* store IV for next block */
Vanger 0:b86d15c6ba29 667 XMEMCPY(iv, out + offset - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 668 }
Vanger 0:b86d15c6ba29 669
Vanger 0:b86d15c6ba29 670 return 0;
Vanger 0:b86d15c6ba29 671 }
Vanger 0:b86d15c6ba29 672
Vanger 0:b86d15c6ba29 673 int Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 674 {
Vanger 0:b86d15c6ba29 675 int i;
Vanger 0:b86d15c6ba29 676 int offset = 0;
Vanger 0:b86d15c6ba29 677 int len = sz;
Vanger 0:b86d15c6ba29 678
Vanger 0:b86d15c6ba29 679 byte* iv;
Vanger 0:b86d15c6ba29 680 byte temp_block[DES_BLOCK_SIZE];
Vanger 0:b86d15c6ba29 681
Vanger 0:b86d15c6ba29 682 iv = (byte*)des->reg;
Vanger 0:b86d15c6ba29 683
Vanger 0:b86d15c6ba29 684 if ((cyassl_word)out % CYASSL_MMCAU_ALIGNMENT) {
Vanger 0:b86d15c6ba29 685 CYASSL_MSG("Bad 3ede cau_des_decrypt alignment");
Vanger 0:b86d15c6ba29 686 return BAD_ALIGN_E;
Vanger 0:b86d15c6ba29 687 }
Vanger 0:b86d15c6ba29 688
Vanger 0:b86d15c6ba29 689 while (len > 0)
Vanger 0:b86d15c6ba29 690 {
Vanger 0:b86d15c6ba29 691 XMEMCPY(temp_block, in + offset, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 692
Vanger 0:b86d15c6ba29 693 cau_des_decrypt(in + offset , (byte*)des->key[2], out + offset);
Vanger 0:b86d15c6ba29 694 cau_des_encrypt(out + offset, (byte*)des->key[1], out + offset);
Vanger 0:b86d15c6ba29 695 cau_des_decrypt(out + offset, (byte*)des->key[0], out + offset);
Vanger 0:b86d15c6ba29 696
Vanger 0:b86d15c6ba29 697 /* XOR block with IV for CBC */
Vanger 0:b86d15c6ba29 698 for (i = 0; i < DES_BLOCK_SIZE; i++)
Vanger 0:b86d15c6ba29 699 (out + offset)[i] ^= iv[i];
Vanger 0:b86d15c6ba29 700
Vanger 0:b86d15c6ba29 701 /* store IV for next block */
Vanger 0:b86d15c6ba29 702 XMEMCPY(iv, temp_block, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 703
Vanger 0:b86d15c6ba29 704 len -= DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 705 offset += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 706 }
Vanger 0:b86d15c6ba29 707
Vanger 0:b86d15c6ba29 708 return 0;
Vanger 0:b86d15c6ba29 709 }
Vanger 0:b86d15c6ba29 710
Vanger 0:b86d15c6ba29 711
Vanger 0:b86d15c6ba29 712 #elif defined(CYASSL_PIC32MZ_CRYPT)
Vanger 0:b86d15c6ba29 713
Vanger 0:b86d15c6ba29 714 #include "cyassl/ctaocrypt/port/pic32/pic32mz-crypt.h"
Vanger 0:b86d15c6ba29 715
Vanger 0:b86d15c6ba29 716 void Des_SetIV(Des* des, const byte* iv);
Vanger 0:b86d15c6ba29 717 int Des3_SetIV(Des3* des, const byte* iv);
Vanger 0:b86d15c6ba29 718
Vanger 0:b86d15c6ba29 719 int Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
Vanger 0:b86d15c6ba29 720 {
Vanger 0:b86d15c6ba29 721 word32 *dkey = des->key ;
Vanger 0:b86d15c6ba29 722 word32 *dreg = des->reg ;
Vanger 0:b86d15c6ba29 723
Vanger 0:b86d15c6ba29 724 XMEMCPY((byte *)dkey, (byte *)key, 8);
Vanger 0:b86d15c6ba29 725 ByteReverseWords(dkey, dkey, 8);
Vanger 0:b86d15c6ba29 726 XMEMCPY((byte *)dreg, (byte *)iv, 8);
Vanger 0:b86d15c6ba29 727 ByteReverseWords(dreg, dreg, 8);
Vanger 0:b86d15c6ba29 728
Vanger 0:b86d15c6ba29 729 return 0;
Vanger 0:b86d15c6ba29 730 }
Vanger 0:b86d15c6ba29 731
Vanger 0:b86d15c6ba29 732 int Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir)
Vanger 0:b86d15c6ba29 733 {
Vanger 0:b86d15c6ba29 734 word32 *dkey1 = des->key[0];
Vanger 0:b86d15c6ba29 735 word32 *dreg = des->reg ;
Vanger 0:b86d15c6ba29 736
Vanger 0:b86d15c6ba29 737 XMEMCPY(dkey1, key, 24);
Vanger 0:b86d15c6ba29 738 ByteReverseWords(dkey1, dkey1, 24);
Vanger 0:b86d15c6ba29 739 XMEMCPY(dreg, iv, 8);
Vanger 0:b86d15c6ba29 740 ByteReverseWords(dreg, dreg, 8) ;
Vanger 0:b86d15c6ba29 741
Vanger 0:b86d15c6ba29 742 return 0;
Vanger 0:b86d15c6ba29 743 }
Vanger 0:b86d15c6ba29 744
Vanger 0:b86d15c6ba29 745 void DesCrypt(word32 *key, word32 *iv, byte* out, const byte* in, word32 sz,
Vanger 0:b86d15c6ba29 746 int dir, int algo, int cryptoalgo)
Vanger 0:b86d15c6ba29 747 {
Vanger 0:b86d15c6ba29 748 securityAssociation *sa_p ;
Vanger 0:b86d15c6ba29 749 bufferDescriptor *bd_p ;
Vanger 0:b86d15c6ba29 750 const byte *in_p, *in_l ;
Vanger 0:b86d15c6ba29 751 byte *out_p, *out_l ;
Vanger 0:b86d15c6ba29 752 volatile securityAssociation sa __attribute__((aligned (8)));
Vanger 0:b86d15c6ba29 753 volatile bufferDescriptor bd __attribute__((aligned (8)));
Vanger 0:b86d15c6ba29 754 volatile int k ;
Vanger 0:b86d15c6ba29 755
Vanger 0:b86d15c6ba29 756 /* get uncached address */
Vanger 0:b86d15c6ba29 757
Vanger 0:b86d15c6ba29 758 in_l = in;
Vanger 0:b86d15c6ba29 759 out_l = out ;
Vanger 0:b86d15c6ba29 760 sa_p = KVA0_TO_KVA1(&sa) ;
Vanger 0:b86d15c6ba29 761 bd_p = KVA0_TO_KVA1(&bd) ;
Vanger 0:b86d15c6ba29 762 in_p = KVA0_TO_KVA1(in_l) ;
Vanger 0:b86d15c6ba29 763 out_p= KVA0_TO_KVA1(out_l);
Vanger 0:b86d15c6ba29 764
Vanger 0:b86d15c6ba29 765 if(PIC32MZ_IF_RAM(in_p))
Vanger 0:b86d15c6ba29 766 XMEMCPY((void *)in_p, (void *)in, sz);
Vanger 0:b86d15c6ba29 767 XMEMSET((void *)out_p, 0, sz);
Vanger 0:b86d15c6ba29 768
Vanger 0:b86d15c6ba29 769 /* Set up the Security Association */
Vanger 0:b86d15c6ba29 770 XMEMSET((byte *)KVA0_TO_KVA1(&sa), 0, sizeof(sa));
Vanger 0:b86d15c6ba29 771 sa_p->SA_CTRL.ALGO = algo ;
Vanger 0:b86d15c6ba29 772 sa_p->SA_CTRL.LNC = 1;
Vanger 0:b86d15c6ba29 773 sa_p->SA_CTRL.LOADIV = 1;
Vanger 0:b86d15c6ba29 774 sa_p->SA_CTRL.FB = 1;
Vanger 0:b86d15c6ba29 775 sa_p->SA_CTRL.ENCTYPE = dir ; /* Encryption/Decryption */
Vanger 0:b86d15c6ba29 776 sa_p->SA_CTRL.CRYPTOALGO = cryptoalgo;
Vanger 0:b86d15c6ba29 777 sa_p->SA_CTRL.KEYSIZE = 1 ; /* KEY is 192 bits */
Vanger 0:b86d15c6ba29 778 XMEMCPY((byte *)KVA0_TO_KVA1(&sa.SA_ENCKEY[algo==PIC32_ALGO_TDES ? 2 : 6]),
Vanger 0:b86d15c6ba29 779 (byte *)key, algo==PIC32_ALGO_TDES ? 24 : 8);
Vanger 0:b86d15c6ba29 780 XMEMCPY((byte *)KVA0_TO_KVA1(&sa.SA_ENCIV[2]), (byte *)iv, 8);
Vanger 0:b86d15c6ba29 781
Vanger 0:b86d15c6ba29 782 XMEMSET((byte *)KVA0_TO_KVA1(&bd), 0, sizeof(bd));
Vanger 0:b86d15c6ba29 783 /* Set up the Buffer Descriptor */
Vanger 0:b86d15c6ba29 784 bd_p->BD_CTRL.BUFLEN = sz;
Vanger 0:b86d15c6ba29 785 bd_p->BD_CTRL.LIFM = 1;
Vanger 0:b86d15c6ba29 786 bd_p->BD_CTRL.SA_FETCH_EN = 1;
Vanger 0:b86d15c6ba29 787 bd_p->BD_CTRL.LAST_BD = 1;
Vanger 0:b86d15c6ba29 788 bd_p->BD_CTRL.DESC_EN = 1;
Vanger 0:b86d15c6ba29 789
Vanger 0:b86d15c6ba29 790 bd_p->SA_ADDR = (unsigned int)KVA_TO_PA(&sa) ; /* (unsigned int)sa_p; */
Vanger 0:b86d15c6ba29 791 bd_p->SRCADDR = (unsigned int)KVA_TO_PA(in) ; /* (unsigned int)in_p; */
Vanger 0:b86d15c6ba29 792 bd_p->DSTADDR = (unsigned int)KVA_TO_PA(out); /* (unsigned int)out_p; */
Vanger 0:b86d15c6ba29 793 bd_p->NXTPTR = (unsigned int)KVA_TO_PA(&bd);
Vanger 0:b86d15c6ba29 794 bd_p->MSGLEN = sz ;
Vanger 0:b86d15c6ba29 795
Vanger 0:b86d15c6ba29 796 /* Fire in the hole! */
Vanger 0:b86d15c6ba29 797 CECON = 1 << 6;
Vanger 0:b86d15c6ba29 798 while (CECON);
Vanger 0:b86d15c6ba29 799
Vanger 0:b86d15c6ba29 800 /* Run the engine */
Vanger 0:b86d15c6ba29 801 CEBDPADDR = (unsigned int)KVA_TO_PA(&bd) ; /* (unsigned int)bd_p ; */
Vanger 0:b86d15c6ba29 802 CEINTEN = 0x07;
Vanger 0:b86d15c6ba29 803 CECON = 0x27;
Vanger 0:b86d15c6ba29 804
Vanger 0:b86d15c6ba29 805 WAIT_ENGINE ;
Vanger 0:b86d15c6ba29 806
Vanger 0:b86d15c6ba29 807 if((cryptoalgo == PIC32_CRYPTOALGO_CBC) ||
Vanger 0:b86d15c6ba29 808 (cryptoalgo == PIC32_CRYPTOALGO_TCBC)||
Vanger 0:b86d15c6ba29 809 (cryptoalgo == PIC32_CRYPTOALGO_RCBC)) {
Vanger 0:b86d15c6ba29 810 /* set iv for the next call */
Vanger 0:b86d15c6ba29 811 if(dir == PIC32_ENCRYPTION) {
Vanger 0:b86d15c6ba29 812 XMEMCPY((void *)iv, (void*)&(out_p[sz-DES_IVLEN]), DES_IVLEN) ;
Vanger 0:b86d15c6ba29 813 } else {
Vanger 0:b86d15c6ba29 814 ByteReverseWords((word32*)iv, (word32 *)&(in_p[sz-DES_IVLEN]),
Vanger 0:b86d15c6ba29 815 DES_IVLEN);
Vanger 0:b86d15c6ba29 816 }
Vanger 0:b86d15c6ba29 817
Vanger 0:b86d15c6ba29 818 }
Vanger 0:b86d15c6ba29 819
Vanger 0:b86d15c6ba29 820 ByteReverseWords((word32*)out, (word32 *)KVA0_TO_KVA1(out), sz);
Vanger 0:b86d15c6ba29 821 }
Vanger 0:b86d15c6ba29 822
Vanger 0:b86d15c6ba29 823 int Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 824 {
Vanger 0:b86d15c6ba29 825 DesCrypt(des->key, des->reg, out, in, sz,
Vanger 0:b86d15c6ba29 826 PIC32_ENCRYPTION, PIC32_ALGO_DES, PIC32_CRYPTOALGO_CBC );
Vanger 0:b86d15c6ba29 827 return 0;
Vanger 0:b86d15c6ba29 828 }
Vanger 0:b86d15c6ba29 829
Vanger 0:b86d15c6ba29 830 int Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 831 {
Vanger 0:b86d15c6ba29 832 DesCrypt(des->key, des->reg, out, in, sz,
Vanger 0:b86d15c6ba29 833 PIC32_DECRYPTION, PIC32_ALGO_DES, PIC32_CRYPTOALGO_CBC);
Vanger 0:b86d15c6ba29 834 return 0;
Vanger 0:b86d15c6ba29 835 }
Vanger 0:b86d15c6ba29 836
Vanger 0:b86d15c6ba29 837 int Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 838 {
Vanger 0:b86d15c6ba29 839 DesCrypt(des->key[0], des->reg, out, in, sz,
Vanger 0:b86d15c6ba29 840 PIC32_ENCRYPTION, PIC32_ALGO_TDES, PIC32_CRYPTOALGO_TCBC);
Vanger 0:b86d15c6ba29 841 return 0;
Vanger 0:b86d15c6ba29 842 }
Vanger 0:b86d15c6ba29 843
Vanger 0:b86d15c6ba29 844 int Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 845 {
Vanger 0:b86d15c6ba29 846 DesCrypt(des->key[0], des->reg, out, in, sz,
Vanger 0:b86d15c6ba29 847 PIC32_DECRYPTION, PIC32_ALGO_TDES, PIC32_CRYPTOALGO_TCBC);
Vanger 0:b86d15c6ba29 848 return 0;
Vanger 0:b86d15c6ba29 849 }
Vanger 0:b86d15c6ba29 850
Vanger 0:b86d15c6ba29 851 #else /* CTaoCrypt software implementation */
Vanger 0:b86d15c6ba29 852
Vanger 0:b86d15c6ba29 853 /* permuted choice table (key) */
Vanger 0:b86d15c6ba29 854 static const byte pc1[] = {
Vanger 0:b86d15c6ba29 855 57, 49, 41, 33, 25, 17, 9,
Vanger 0:b86d15c6ba29 856 1, 58, 50, 42, 34, 26, 18,
Vanger 0:b86d15c6ba29 857 10, 2, 59, 51, 43, 35, 27,
Vanger 0:b86d15c6ba29 858 19, 11, 3, 60, 52, 44, 36,
Vanger 0:b86d15c6ba29 859
Vanger 0:b86d15c6ba29 860 63, 55, 47, 39, 31, 23, 15,
Vanger 0:b86d15c6ba29 861 7, 62, 54, 46, 38, 30, 22,
Vanger 0:b86d15c6ba29 862 14, 6, 61, 53, 45, 37, 29,
Vanger 0:b86d15c6ba29 863 21, 13, 5, 28, 20, 12, 4
Vanger 0:b86d15c6ba29 864 };
Vanger 0:b86d15c6ba29 865
Vanger 0:b86d15c6ba29 866 /* number left rotations of pc1 */
Vanger 0:b86d15c6ba29 867 static const byte totrot[] = {
Vanger 0:b86d15c6ba29 868 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28
Vanger 0:b86d15c6ba29 869 };
Vanger 0:b86d15c6ba29 870
Vanger 0:b86d15c6ba29 871 /* permuted choice key (table) */
Vanger 0:b86d15c6ba29 872 static const byte pc2[] = {
Vanger 0:b86d15c6ba29 873 14, 17, 11, 24, 1, 5,
Vanger 0:b86d15c6ba29 874 3, 28, 15, 6, 21, 10,
Vanger 0:b86d15c6ba29 875 23, 19, 12, 4, 26, 8,
Vanger 0:b86d15c6ba29 876 16, 7, 27, 20, 13, 2,
Vanger 0:b86d15c6ba29 877 41, 52, 31, 37, 47, 55,
Vanger 0:b86d15c6ba29 878 30, 40, 51, 45, 33, 48,
Vanger 0:b86d15c6ba29 879 44, 49, 39, 56, 34, 53,
Vanger 0:b86d15c6ba29 880 46, 42, 50, 36, 29, 32
Vanger 0:b86d15c6ba29 881 };
Vanger 0:b86d15c6ba29 882
Vanger 0:b86d15c6ba29 883 /* End of DES-defined tables */
Vanger 0:b86d15c6ba29 884
Vanger 0:b86d15c6ba29 885 /* bit 0 is left-most in byte */
Vanger 0:b86d15c6ba29 886 static const int bytebit[] = {
Vanger 0:b86d15c6ba29 887 0200,0100,040,020,010,04,02,01
Vanger 0:b86d15c6ba29 888 };
Vanger 0:b86d15c6ba29 889
Vanger 0:b86d15c6ba29 890 static const word32 Spbox[8][64] = {
Vanger 0:b86d15c6ba29 891 {
Vanger 0:b86d15c6ba29 892 0x01010400,0x00000000,0x00010000,0x01010404,
Vanger 0:b86d15c6ba29 893 0x01010004,0x00010404,0x00000004,0x00010000,
Vanger 0:b86d15c6ba29 894 0x00000400,0x01010400,0x01010404,0x00000400,
Vanger 0:b86d15c6ba29 895 0x01000404,0x01010004,0x01000000,0x00000004,
Vanger 0:b86d15c6ba29 896 0x00000404,0x01000400,0x01000400,0x00010400,
Vanger 0:b86d15c6ba29 897 0x00010400,0x01010000,0x01010000,0x01000404,
Vanger 0:b86d15c6ba29 898 0x00010004,0x01000004,0x01000004,0x00010004,
Vanger 0:b86d15c6ba29 899 0x00000000,0x00000404,0x00010404,0x01000000,
Vanger 0:b86d15c6ba29 900 0x00010000,0x01010404,0x00000004,0x01010000,
Vanger 0:b86d15c6ba29 901 0x01010400,0x01000000,0x01000000,0x00000400,
Vanger 0:b86d15c6ba29 902 0x01010004,0x00010000,0x00010400,0x01000004,
Vanger 0:b86d15c6ba29 903 0x00000400,0x00000004,0x01000404,0x00010404,
Vanger 0:b86d15c6ba29 904 0x01010404,0x00010004,0x01010000,0x01000404,
Vanger 0:b86d15c6ba29 905 0x01000004,0x00000404,0x00010404,0x01010400,
Vanger 0:b86d15c6ba29 906 0x00000404,0x01000400,0x01000400,0x00000000,
Vanger 0:b86d15c6ba29 907 0x00010004,0x00010400,0x00000000,0x01010004},
Vanger 0:b86d15c6ba29 908 {
Vanger 0:b86d15c6ba29 909 0x80108020,0x80008000,0x00008000,0x00108020,
Vanger 0:b86d15c6ba29 910 0x00100000,0x00000020,0x80100020,0x80008020,
Vanger 0:b86d15c6ba29 911 0x80000020,0x80108020,0x80108000,0x80000000,
Vanger 0:b86d15c6ba29 912 0x80008000,0x00100000,0x00000020,0x80100020,
Vanger 0:b86d15c6ba29 913 0x00108000,0x00100020,0x80008020,0x00000000,
Vanger 0:b86d15c6ba29 914 0x80000000,0x00008000,0x00108020,0x80100000,
Vanger 0:b86d15c6ba29 915 0x00100020,0x80000020,0x00000000,0x00108000,
Vanger 0:b86d15c6ba29 916 0x00008020,0x80108000,0x80100000,0x00008020,
Vanger 0:b86d15c6ba29 917 0x00000000,0x00108020,0x80100020,0x00100000,
Vanger 0:b86d15c6ba29 918 0x80008020,0x80100000,0x80108000,0x00008000,
Vanger 0:b86d15c6ba29 919 0x80100000,0x80008000,0x00000020,0x80108020,
Vanger 0:b86d15c6ba29 920 0x00108020,0x00000020,0x00008000,0x80000000,
Vanger 0:b86d15c6ba29 921 0x00008020,0x80108000,0x00100000,0x80000020,
Vanger 0:b86d15c6ba29 922 0x00100020,0x80008020,0x80000020,0x00100020,
Vanger 0:b86d15c6ba29 923 0x00108000,0x00000000,0x80008000,0x00008020,
Vanger 0:b86d15c6ba29 924 0x80000000,0x80100020,0x80108020,0x00108000},
Vanger 0:b86d15c6ba29 925 {
Vanger 0:b86d15c6ba29 926 0x00000208,0x08020200,0x00000000,0x08020008,
Vanger 0:b86d15c6ba29 927 0x08000200,0x00000000,0x00020208,0x08000200,
Vanger 0:b86d15c6ba29 928 0x00020008,0x08000008,0x08000008,0x00020000,
Vanger 0:b86d15c6ba29 929 0x08020208,0x00020008,0x08020000,0x00000208,
Vanger 0:b86d15c6ba29 930 0x08000000,0x00000008,0x08020200,0x00000200,
Vanger 0:b86d15c6ba29 931 0x00020200,0x08020000,0x08020008,0x00020208,
Vanger 0:b86d15c6ba29 932 0x08000208,0x00020200,0x00020000,0x08000208,
Vanger 0:b86d15c6ba29 933 0x00000008,0x08020208,0x00000200,0x08000000,
Vanger 0:b86d15c6ba29 934 0x08020200,0x08000000,0x00020008,0x00000208,
Vanger 0:b86d15c6ba29 935 0x00020000,0x08020200,0x08000200,0x00000000,
Vanger 0:b86d15c6ba29 936 0x00000200,0x00020008,0x08020208,0x08000200,
Vanger 0:b86d15c6ba29 937 0x08000008,0x00000200,0x00000000,0x08020008,
Vanger 0:b86d15c6ba29 938 0x08000208,0x00020000,0x08000000,0x08020208,
Vanger 0:b86d15c6ba29 939 0x00000008,0x00020208,0x00020200,0x08000008,
Vanger 0:b86d15c6ba29 940 0x08020000,0x08000208,0x00000208,0x08020000,
Vanger 0:b86d15c6ba29 941 0x00020208,0x00000008,0x08020008,0x00020200},
Vanger 0:b86d15c6ba29 942 {
Vanger 0:b86d15c6ba29 943 0x00802001,0x00002081,0x00002081,0x00000080,
Vanger 0:b86d15c6ba29 944 0x00802080,0x00800081,0x00800001,0x00002001,
Vanger 0:b86d15c6ba29 945 0x00000000,0x00802000,0x00802000,0x00802081,
Vanger 0:b86d15c6ba29 946 0x00000081,0x00000000,0x00800080,0x00800001,
Vanger 0:b86d15c6ba29 947 0x00000001,0x00002000,0x00800000,0x00802001,
Vanger 0:b86d15c6ba29 948 0x00000080,0x00800000,0x00002001,0x00002080,
Vanger 0:b86d15c6ba29 949 0x00800081,0x00000001,0x00002080,0x00800080,
Vanger 0:b86d15c6ba29 950 0x00002000,0x00802080,0x00802081,0x00000081,
Vanger 0:b86d15c6ba29 951 0x00800080,0x00800001,0x00802000,0x00802081,
Vanger 0:b86d15c6ba29 952 0x00000081,0x00000000,0x00000000,0x00802000,
Vanger 0:b86d15c6ba29 953 0x00002080,0x00800080,0x00800081,0x00000001,
Vanger 0:b86d15c6ba29 954 0x00802001,0x00002081,0x00002081,0x00000080,
Vanger 0:b86d15c6ba29 955 0x00802081,0x00000081,0x00000001,0x00002000,
Vanger 0:b86d15c6ba29 956 0x00800001,0x00002001,0x00802080,0x00800081,
Vanger 0:b86d15c6ba29 957 0x00002001,0x00002080,0x00800000,0x00802001,
Vanger 0:b86d15c6ba29 958 0x00000080,0x00800000,0x00002000,0x00802080},
Vanger 0:b86d15c6ba29 959 {
Vanger 0:b86d15c6ba29 960 0x00000100,0x02080100,0x02080000,0x42000100,
Vanger 0:b86d15c6ba29 961 0x00080000,0x00000100,0x40000000,0x02080000,
Vanger 0:b86d15c6ba29 962 0x40080100,0x00080000,0x02000100,0x40080100,
Vanger 0:b86d15c6ba29 963 0x42000100,0x42080000,0x00080100,0x40000000,
Vanger 0:b86d15c6ba29 964 0x02000000,0x40080000,0x40080000,0x00000000,
Vanger 0:b86d15c6ba29 965 0x40000100,0x42080100,0x42080100,0x02000100,
Vanger 0:b86d15c6ba29 966 0x42080000,0x40000100,0x00000000,0x42000000,
Vanger 0:b86d15c6ba29 967 0x02080100,0x02000000,0x42000000,0x00080100,
Vanger 0:b86d15c6ba29 968 0x00080000,0x42000100,0x00000100,0x02000000,
Vanger 0:b86d15c6ba29 969 0x40000000,0x02080000,0x42000100,0x40080100,
Vanger 0:b86d15c6ba29 970 0x02000100,0x40000000,0x42080000,0x02080100,
Vanger 0:b86d15c6ba29 971 0x40080100,0x00000100,0x02000000,0x42080000,
Vanger 0:b86d15c6ba29 972 0x42080100,0x00080100,0x42000000,0x42080100,
Vanger 0:b86d15c6ba29 973 0x02080000,0x00000000,0x40080000,0x42000000,
Vanger 0:b86d15c6ba29 974 0x00080100,0x02000100,0x40000100,0x00080000,
Vanger 0:b86d15c6ba29 975 0x00000000,0x40080000,0x02080100,0x40000100},
Vanger 0:b86d15c6ba29 976 {
Vanger 0:b86d15c6ba29 977 0x20000010,0x20400000,0x00004000,0x20404010,
Vanger 0:b86d15c6ba29 978 0x20400000,0x00000010,0x20404010,0x00400000,
Vanger 0:b86d15c6ba29 979 0x20004000,0x00404010,0x00400000,0x20000010,
Vanger 0:b86d15c6ba29 980 0x00400010,0x20004000,0x20000000,0x00004010,
Vanger 0:b86d15c6ba29 981 0x00000000,0x00400010,0x20004010,0x00004000,
Vanger 0:b86d15c6ba29 982 0x00404000,0x20004010,0x00000010,0x20400010,
Vanger 0:b86d15c6ba29 983 0x20400010,0x00000000,0x00404010,0x20404000,
Vanger 0:b86d15c6ba29 984 0x00004010,0x00404000,0x20404000,0x20000000,
Vanger 0:b86d15c6ba29 985 0x20004000,0x00000010,0x20400010,0x00404000,
Vanger 0:b86d15c6ba29 986 0x20404010,0x00400000,0x00004010,0x20000010,
Vanger 0:b86d15c6ba29 987 0x00400000,0x20004000,0x20000000,0x00004010,
Vanger 0:b86d15c6ba29 988 0x20000010,0x20404010,0x00404000,0x20400000,
Vanger 0:b86d15c6ba29 989 0x00404010,0x20404000,0x00000000,0x20400010,
Vanger 0:b86d15c6ba29 990 0x00000010,0x00004000,0x20400000,0x00404010,
Vanger 0:b86d15c6ba29 991 0x00004000,0x00400010,0x20004010,0x00000000,
Vanger 0:b86d15c6ba29 992 0x20404000,0x20000000,0x00400010,0x20004010},
Vanger 0:b86d15c6ba29 993 {
Vanger 0:b86d15c6ba29 994 0x00200000,0x04200002,0x04000802,0x00000000,
Vanger 0:b86d15c6ba29 995 0x00000800,0x04000802,0x00200802,0x04200800,
Vanger 0:b86d15c6ba29 996 0x04200802,0x00200000,0x00000000,0x04000002,
Vanger 0:b86d15c6ba29 997 0x00000002,0x04000000,0x04200002,0x00000802,
Vanger 0:b86d15c6ba29 998 0x04000800,0x00200802,0x00200002,0x04000800,
Vanger 0:b86d15c6ba29 999 0x04000002,0x04200000,0x04200800,0x00200002,
Vanger 0:b86d15c6ba29 1000 0x04200000,0x00000800,0x00000802,0x04200802,
Vanger 0:b86d15c6ba29 1001 0x00200800,0x00000002,0x04000000,0x00200800,
Vanger 0:b86d15c6ba29 1002 0x04000000,0x00200800,0x00200000,0x04000802,
Vanger 0:b86d15c6ba29 1003 0x04000802,0x04200002,0x04200002,0x00000002,
Vanger 0:b86d15c6ba29 1004 0x00200002,0x04000000,0x04000800,0x00200000,
Vanger 0:b86d15c6ba29 1005 0x04200800,0x00000802,0x00200802,0x04200800,
Vanger 0:b86d15c6ba29 1006 0x00000802,0x04000002,0x04200802,0x04200000,
Vanger 0:b86d15c6ba29 1007 0x00200800,0x00000000,0x00000002,0x04200802,
Vanger 0:b86d15c6ba29 1008 0x00000000,0x00200802,0x04200000,0x00000800,
Vanger 0:b86d15c6ba29 1009 0x04000002,0x04000800,0x00000800,0x00200002},
Vanger 0:b86d15c6ba29 1010 {
Vanger 0:b86d15c6ba29 1011 0x10001040,0x00001000,0x00040000,0x10041040,
Vanger 0:b86d15c6ba29 1012 0x10000000,0x10001040,0x00000040,0x10000000,
Vanger 0:b86d15c6ba29 1013 0x00040040,0x10040000,0x10041040,0x00041000,
Vanger 0:b86d15c6ba29 1014 0x10041000,0x00041040,0x00001000,0x00000040,
Vanger 0:b86d15c6ba29 1015 0x10040000,0x10000040,0x10001000,0x00001040,
Vanger 0:b86d15c6ba29 1016 0x00041000,0x00040040,0x10040040,0x10041000,
Vanger 0:b86d15c6ba29 1017 0x00001040,0x00000000,0x00000000,0x10040040,
Vanger 0:b86d15c6ba29 1018 0x10000040,0x10001000,0x00041040,0x00040000,
Vanger 0:b86d15c6ba29 1019 0x00041040,0x00040000,0x10041000,0x00001000,
Vanger 0:b86d15c6ba29 1020 0x00000040,0x10040040,0x00001000,0x00041040,
Vanger 0:b86d15c6ba29 1021 0x10001000,0x00000040,0x10000040,0x10040000,
Vanger 0:b86d15c6ba29 1022 0x10040040,0x10000000,0x00040000,0x10001040,
Vanger 0:b86d15c6ba29 1023 0x00000000,0x10041040,0x00040040,0x10000040,
Vanger 0:b86d15c6ba29 1024 0x10040000,0x10001000,0x10001040,0x00000000,
Vanger 0:b86d15c6ba29 1025 0x10041040,0x00041000,0x00041000,0x00001040,
Vanger 0:b86d15c6ba29 1026 0x00001040,0x00040040,0x10000000,0x10041000}
Vanger 0:b86d15c6ba29 1027 };
Vanger 0:b86d15c6ba29 1028
Vanger 0:b86d15c6ba29 1029
Vanger 0:b86d15c6ba29 1030 static INLINE void IPERM(word32* left, word32* right)
Vanger 0:b86d15c6ba29 1031 {
Vanger 0:b86d15c6ba29 1032 word32 work;
Vanger 0:b86d15c6ba29 1033
Vanger 0:b86d15c6ba29 1034 *right = rotlFixed(*right, 4U);
Vanger 0:b86d15c6ba29 1035 work = (*left ^ *right) & 0xf0f0f0f0;
Vanger 0:b86d15c6ba29 1036 *left ^= work;
Vanger 0:b86d15c6ba29 1037
Vanger 0:b86d15c6ba29 1038 *right = rotrFixed(*right^work, 20U);
Vanger 0:b86d15c6ba29 1039 work = (*left ^ *right) & 0xffff0000;
Vanger 0:b86d15c6ba29 1040 *left ^= work;
Vanger 0:b86d15c6ba29 1041
Vanger 0:b86d15c6ba29 1042 *right = rotrFixed(*right^work, 18U);
Vanger 0:b86d15c6ba29 1043 work = (*left ^ *right) & 0x33333333;
Vanger 0:b86d15c6ba29 1044 *left ^= work;
Vanger 0:b86d15c6ba29 1045
Vanger 0:b86d15c6ba29 1046 *right = rotrFixed(*right^work, 6U);
Vanger 0:b86d15c6ba29 1047 work = (*left ^ *right) & 0x00ff00ff;
Vanger 0:b86d15c6ba29 1048 *left ^= work;
Vanger 0:b86d15c6ba29 1049
Vanger 0:b86d15c6ba29 1050 *right = rotlFixed(*right^work, 9U);
Vanger 0:b86d15c6ba29 1051 work = (*left ^ *right) & 0xaaaaaaaa;
Vanger 0:b86d15c6ba29 1052 *left = rotlFixed(*left^work, 1U);
Vanger 0:b86d15c6ba29 1053 *right ^= work;
Vanger 0:b86d15c6ba29 1054 }
Vanger 0:b86d15c6ba29 1055
Vanger 0:b86d15c6ba29 1056
Vanger 0:b86d15c6ba29 1057 static INLINE void FPERM(word32* left, word32* right)
Vanger 0:b86d15c6ba29 1058 {
Vanger 0:b86d15c6ba29 1059 word32 work;
Vanger 0:b86d15c6ba29 1060
Vanger 0:b86d15c6ba29 1061 *right = rotrFixed(*right, 1U);
Vanger 0:b86d15c6ba29 1062 work = (*left ^ *right) & 0xaaaaaaaa;
Vanger 0:b86d15c6ba29 1063 *right ^= work;
Vanger 0:b86d15c6ba29 1064
Vanger 0:b86d15c6ba29 1065 *left = rotrFixed(*left^work, 9U);
Vanger 0:b86d15c6ba29 1066 work = (*left ^ *right) & 0x00ff00ff;
Vanger 0:b86d15c6ba29 1067 *right ^= work;
Vanger 0:b86d15c6ba29 1068
Vanger 0:b86d15c6ba29 1069 *left = rotlFixed(*left^work, 6U);
Vanger 0:b86d15c6ba29 1070 work = (*left ^ *right) & 0x33333333;
Vanger 0:b86d15c6ba29 1071 *right ^= work;
Vanger 0:b86d15c6ba29 1072
Vanger 0:b86d15c6ba29 1073 *left = rotlFixed(*left^work, 18U);
Vanger 0:b86d15c6ba29 1074 work = (*left ^ *right) & 0xffff0000;
Vanger 0:b86d15c6ba29 1075 *right ^= work;
Vanger 0:b86d15c6ba29 1076
Vanger 0:b86d15c6ba29 1077 *left = rotlFixed(*left^work, 20U);
Vanger 0:b86d15c6ba29 1078 work = (*left ^ *right) & 0xf0f0f0f0;
Vanger 0:b86d15c6ba29 1079 *right ^= work;
Vanger 0:b86d15c6ba29 1080
Vanger 0:b86d15c6ba29 1081 *left = rotrFixed(*left^work, 4U);
Vanger 0:b86d15c6ba29 1082 }
Vanger 0:b86d15c6ba29 1083
Vanger 0:b86d15c6ba29 1084
Vanger 0:b86d15c6ba29 1085 static int DesSetKey(const byte* key, int dir, word32* out)
Vanger 0:b86d15c6ba29 1086 {
Vanger 0:b86d15c6ba29 1087 #ifdef CYASSL_SMALL_STACK
Vanger 0:b86d15c6ba29 1088 byte* buffer = (byte*)XMALLOC(56+56+8, NULL, DYNAMIC_TYPE_TMP_BUFFER);
Vanger 0:b86d15c6ba29 1089
Vanger 0:b86d15c6ba29 1090 if (buffer == NULL)
Vanger 0:b86d15c6ba29 1091 return MEMORY_E;
Vanger 0:b86d15c6ba29 1092 #else
Vanger 0:b86d15c6ba29 1093 byte buffer[56+56+8];
Vanger 0:b86d15c6ba29 1094 #endif
Vanger 0:b86d15c6ba29 1095
Vanger 0:b86d15c6ba29 1096 {
Vanger 0:b86d15c6ba29 1097 byte* const pc1m = buffer; /* place to modify pc1 into */
Vanger 0:b86d15c6ba29 1098 byte* const pcr = pc1m + 56; /* place to rotate pc1 into */
Vanger 0:b86d15c6ba29 1099 byte* const ks = pcr + 56;
Vanger 0:b86d15c6ba29 1100 register int i, j, l;
Vanger 0:b86d15c6ba29 1101 int m;
Vanger 0:b86d15c6ba29 1102
Vanger 0:b86d15c6ba29 1103 for (j = 0; j < 56; j++) { /* convert pc1 to bits of key */
Vanger 0:b86d15c6ba29 1104 l = pc1[j] - 1; /* integer bit location */
Vanger 0:b86d15c6ba29 1105 m = l & 07; /* find bit */
Vanger 0:b86d15c6ba29 1106 pc1m[j] = (key[l >> 3] & /* find which key byte l is in */
Vanger 0:b86d15c6ba29 1107 bytebit[m]) /* and which bit of that byte */
Vanger 0:b86d15c6ba29 1108 ? 1 : 0; /* and store 1-bit result */
Vanger 0:b86d15c6ba29 1109 }
Vanger 0:b86d15c6ba29 1110
Vanger 0:b86d15c6ba29 1111 for (i = 0; i < 16; i++) { /* key chunk for each iteration */
Vanger 0:b86d15c6ba29 1112 XMEMSET(ks, 0, 8); /* Clear key schedule */
Vanger 0:b86d15c6ba29 1113
Vanger 0:b86d15c6ba29 1114 for (j = 0; j < 56; j++) /* rotate pc1 the right amount */
Vanger 0:b86d15c6ba29 1115 pcr[j] =
Vanger 0:b86d15c6ba29 1116 pc1m[(l = j + totrot[i]) < (j < 28 ? 28 : 56) ? l : l-28];
Vanger 0:b86d15c6ba29 1117
Vanger 0:b86d15c6ba29 1118 /* rotate left and right halves independently */
Vanger 0:b86d15c6ba29 1119 for (j = 0; j < 48; j++) { /* select bits individually */
Vanger 0:b86d15c6ba29 1120 if (pcr[pc2[j] - 1]) { /* check bit that goes to ks[j] */
Vanger 0:b86d15c6ba29 1121 l= j % 6; /* mask it in if it's there */
Vanger 0:b86d15c6ba29 1122 ks[j/6] |= bytebit[l] >> 2;
Vanger 0:b86d15c6ba29 1123 }
Vanger 0:b86d15c6ba29 1124 }
Vanger 0:b86d15c6ba29 1125
Vanger 0:b86d15c6ba29 1126 /* Now convert to odd/even interleaved form for use in F */
Vanger 0:b86d15c6ba29 1127 out[2*i] = ((word32) ks[0] << 24)
Vanger 0:b86d15c6ba29 1128 | ((word32) ks[2] << 16)
Vanger 0:b86d15c6ba29 1129 | ((word32) ks[4] << 8)
Vanger 0:b86d15c6ba29 1130 | ((word32) ks[6]);
Vanger 0:b86d15c6ba29 1131
Vanger 0:b86d15c6ba29 1132 out[2*i + 1] = ((word32) ks[1] << 24)
Vanger 0:b86d15c6ba29 1133 | ((word32) ks[3] << 16)
Vanger 0:b86d15c6ba29 1134 | ((word32) ks[5] << 8)
Vanger 0:b86d15c6ba29 1135 | ((word32) ks[7]);
Vanger 0:b86d15c6ba29 1136 }
Vanger 0:b86d15c6ba29 1137
Vanger 0:b86d15c6ba29 1138 /* reverse key schedule order */
Vanger 0:b86d15c6ba29 1139 if (dir == DES_DECRYPTION) {
Vanger 0:b86d15c6ba29 1140 for (i = 0; i < 16; i += 2) {
Vanger 0:b86d15c6ba29 1141 word32 swap = out[i];
Vanger 0:b86d15c6ba29 1142 out[i] = out[DES_KS_SIZE - 2 - i];
Vanger 0:b86d15c6ba29 1143 out[DES_KS_SIZE - 2 - i] = swap;
Vanger 0:b86d15c6ba29 1144
Vanger 0:b86d15c6ba29 1145 swap = out[i + 1];
Vanger 0:b86d15c6ba29 1146 out[i + 1] = out[DES_KS_SIZE - 1 - i];
Vanger 0:b86d15c6ba29 1147 out[DES_KS_SIZE - 1 - i] = swap;
Vanger 0:b86d15c6ba29 1148 }
Vanger 0:b86d15c6ba29 1149 }
Vanger 0:b86d15c6ba29 1150
Vanger 0:b86d15c6ba29 1151 #ifdef CYASSL_SMALL_STACK
Vanger 0:b86d15c6ba29 1152 XFREE(buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER);
Vanger 0:b86d15c6ba29 1153 #endif
Vanger 0:b86d15c6ba29 1154 }
Vanger 0:b86d15c6ba29 1155
Vanger 0:b86d15c6ba29 1156 return 0;
Vanger 0:b86d15c6ba29 1157 }
Vanger 0:b86d15c6ba29 1158
Vanger 0:b86d15c6ba29 1159
Vanger 0:b86d15c6ba29 1160 static INLINE int Reverse(int dir)
Vanger 0:b86d15c6ba29 1161 {
Vanger 0:b86d15c6ba29 1162 return !dir;
Vanger 0:b86d15c6ba29 1163 }
Vanger 0:b86d15c6ba29 1164
Vanger 0:b86d15c6ba29 1165
Vanger 0:b86d15c6ba29 1166 int Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
Vanger 0:b86d15c6ba29 1167 {
Vanger 0:b86d15c6ba29 1168 Des_SetIV(des, iv);
Vanger 0:b86d15c6ba29 1169
Vanger 0:b86d15c6ba29 1170 return DesSetKey(key, dir, des->key);
Vanger 0:b86d15c6ba29 1171 }
Vanger 0:b86d15c6ba29 1172
Vanger 0:b86d15c6ba29 1173
Vanger 0:b86d15c6ba29 1174 int Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir)
Vanger 0:b86d15c6ba29 1175 {
Vanger 0:b86d15c6ba29 1176 int ret;
Vanger 0:b86d15c6ba29 1177
Vanger 0:b86d15c6ba29 1178 #ifdef HAVE_CAVIUM
Vanger 0:b86d15c6ba29 1179 if (des->magic == CYASSL_3DES_CAVIUM_MAGIC)
Vanger 0:b86d15c6ba29 1180 return Des3_CaviumSetKey(des, key, iv);
Vanger 0:b86d15c6ba29 1181 #endif
Vanger 0:b86d15c6ba29 1182
Vanger 0:b86d15c6ba29 1183 ret = DesSetKey(key + (dir == DES_ENCRYPTION ? 0:16), dir, des->key[0]);
Vanger 0:b86d15c6ba29 1184 if (ret != 0)
Vanger 0:b86d15c6ba29 1185 return ret;
Vanger 0:b86d15c6ba29 1186
Vanger 0:b86d15c6ba29 1187 ret = DesSetKey(key + 8, Reverse(dir), des->key[1]);
Vanger 0:b86d15c6ba29 1188 if (ret != 0)
Vanger 0:b86d15c6ba29 1189 return ret;
Vanger 0:b86d15c6ba29 1190
Vanger 0:b86d15c6ba29 1191 ret = DesSetKey(key + (dir == DES_DECRYPTION ? 0:16), dir, des->key[2]);
Vanger 0:b86d15c6ba29 1192 if (ret != 0)
Vanger 0:b86d15c6ba29 1193 return ret;
Vanger 0:b86d15c6ba29 1194
Vanger 0:b86d15c6ba29 1195 return Des3_SetIV(des, iv);
Vanger 0:b86d15c6ba29 1196 }
Vanger 0:b86d15c6ba29 1197
Vanger 0:b86d15c6ba29 1198
Vanger 0:b86d15c6ba29 1199 static void DesRawProcessBlock(word32* lIn, word32* rIn, const word32* kptr)
Vanger 0:b86d15c6ba29 1200 {
Vanger 0:b86d15c6ba29 1201 word32 l = *lIn, r = *rIn, i;
Vanger 0:b86d15c6ba29 1202
Vanger 0:b86d15c6ba29 1203 for (i=0; i<8; i++)
Vanger 0:b86d15c6ba29 1204 {
Vanger 0:b86d15c6ba29 1205 word32 work = rotrFixed(r, 4U) ^ kptr[4*i+0];
Vanger 0:b86d15c6ba29 1206 l ^= Spbox[6][(work) & 0x3f]
Vanger 0:b86d15c6ba29 1207 ^ Spbox[4][(work >> 8) & 0x3f]
Vanger 0:b86d15c6ba29 1208 ^ Spbox[2][(work >> 16) & 0x3f]
Vanger 0:b86d15c6ba29 1209 ^ Spbox[0][(work >> 24) & 0x3f];
Vanger 0:b86d15c6ba29 1210 work = r ^ kptr[4*i+1];
Vanger 0:b86d15c6ba29 1211 l ^= Spbox[7][(work) & 0x3f]
Vanger 0:b86d15c6ba29 1212 ^ Spbox[5][(work >> 8) & 0x3f]
Vanger 0:b86d15c6ba29 1213 ^ Spbox[3][(work >> 16) & 0x3f]
Vanger 0:b86d15c6ba29 1214 ^ Spbox[1][(work >> 24) & 0x3f];
Vanger 0:b86d15c6ba29 1215
Vanger 0:b86d15c6ba29 1216 work = rotrFixed(l, 4U) ^ kptr[4*i+2];
Vanger 0:b86d15c6ba29 1217 r ^= Spbox[6][(work) & 0x3f]
Vanger 0:b86d15c6ba29 1218 ^ Spbox[4][(work >> 8) & 0x3f]
Vanger 0:b86d15c6ba29 1219 ^ Spbox[2][(work >> 16) & 0x3f]
Vanger 0:b86d15c6ba29 1220 ^ Spbox[0][(work >> 24) & 0x3f];
Vanger 0:b86d15c6ba29 1221 work = l ^ kptr[4*i+3];
Vanger 0:b86d15c6ba29 1222 r ^= Spbox[7][(work) & 0x3f]
Vanger 0:b86d15c6ba29 1223 ^ Spbox[5][(work >> 8) & 0x3f]
Vanger 0:b86d15c6ba29 1224 ^ Spbox[3][(work >> 16) & 0x3f]
Vanger 0:b86d15c6ba29 1225 ^ Spbox[1][(work >> 24) & 0x3f];
Vanger 0:b86d15c6ba29 1226 }
Vanger 0:b86d15c6ba29 1227
Vanger 0:b86d15c6ba29 1228 *lIn = l; *rIn = r;
Vanger 0:b86d15c6ba29 1229 }
Vanger 0:b86d15c6ba29 1230
Vanger 0:b86d15c6ba29 1231
Vanger 0:b86d15c6ba29 1232 static void DesProcessBlock(Des* des, const byte* in, byte* out)
Vanger 0:b86d15c6ba29 1233 {
Vanger 0:b86d15c6ba29 1234 word32 l, r;
Vanger 0:b86d15c6ba29 1235
Vanger 0:b86d15c6ba29 1236 XMEMCPY(&l, in, sizeof(l));
Vanger 0:b86d15c6ba29 1237 XMEMCPY(&r, in + sizeof(l), sizeof(r));
Vanger 0:b86d15c6ba29 1238 #ifdef LITTLE_ENDIAN_ORDER
Vanger 0:b86d15c6ba29 1239 l = ByteReverseWord32(l);
Vanger 0:b86d15c6ba29 1240 r = ByteReverseWord32(r);
Vanger 0:b86d15c6ba29 1241 #endif
Vanger 0:b86d15c6ba29 1242 IPERM(&l,&r);
Vanger 0:b86d15c6ba29 1243
Vanger 0:b86d15c6ba29 1244 DesRawProcessBlock(&l, &r, des->key);
Vanger 0:b86d15c6ba29 1245
Vanger 0:b86d15c6ba29 1246 FPERM(&l,&r);
Vanger 0:b86d15c6ba29 1247 #ifdef LITTLE_ENDIAN_ORDER
Vanger 0:b86d15c6ba29 1248 l = ByteReverseWord32(l);
Vanger 0:b86d15c6ba29 1249 r = ByteReverseWord32(r);
Vanger 0:b86d15c6ba29 1250 #endif
Vanger 0:b86d15c6ba29 1251 XMEMCPY(out, &r, sizeof(r));
Vanger 0:b86d15c6ba29 1252 XMEMCPY(out + sizeof(r), &l, sizeof(l));
Vanger 0:b86d15c6ba29 1253 }
Vanger 0:b86d15c6ba29 1254
Vanger 0:b86d15c6ba29 1255
Vanger 0:b86d15c6ba29 1256 static void Des3ProcessBlock(Des3* des, const byte* in, byte* out)
Vanger 0:b86d15c6ba29 1257 {
Vanger 0:b86d15c6ba29 1258 word32 l, r;
Vanger 0:b86d15c6ba29 1259
Vanger 0:b86d15c6ba29 1260 XMEMCPY(&l, in, sizeof(l));
Vanger 0:b86d15c6ba29 1261 XMEMCPY(&r, in + sizeof(l), sizeof(r));
Vanger 0:b86d15c6ba29 1262 #ifdef LITTLE_ENDIAN_ORDER
Vanger 0:b86d15c6ba29 1263 l = ByteReverseWord32(l);
Vanger 0:b86d15c6ba29 1264 r = ByteReverseWord32(r);
Vanger 0:b86d15c6ba29 1265 #endif
Vanger 0:b86d15c6ba29 1266 IPERM(&l,&r);
Vanger 0:b86d15c6ba29 1267
Vanger 0:b86d15c6ba29 1268 DesRawProcessBlock(&l, &r, des->key[0]);
Vanger 0:b86d15c6ba29 1269 DesRawProcessBlock(&r, &l, des->key[1]);
Vanger 0:b86d15c6ba29 1270 DesRawProcessBlock(&l, &r, des->key[2]);
Vanger 0:b86d15c6ba29 1271
Vanger 0:b86d15c6ba29 1272 FPERM(&l,&r);
Vanger 0:b86d15c6ba29 1273 #ifdef LITTLE_ENDIAN_ORDER
Vanger 0:b86d15c6ba29 1274 l = ByteReverseWord32(l);
Vanger 0:b86d15c6ba29 1275 r = ByteReverseWord32(r);
Vanger 0:b86d15c6ba29 1276 #endif
Vanger 0:b86d15c6ba29 1277 XMEMCPY(out, &r, sizeof(r));
Vanger 0:b86d15c6ba29 1278 XMEMCPY(out + sizeof(r), &l, sizeof(l));
Vanger 0:b86d15c6ba29 1279 }
Vanger 0:b86d15c6ba29 1280
Vanger 0:b86d15c6ba29 1281
Vanger 0:b86d15c6ba29 1282 int Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 1283 {
Vanger 0:b86d15c6ba29 1284 word32 blocks = sz / DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1285
Vanger 0:b86d15c6ba29 1286 while (blocks--) {
Vanger 0:b86d15c6ba29 1287 xorbuf((byte*)des->reg, in, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1288 DesProcessBlock(des, (byte*)des->reg, (byte*)des->reg);
Vanger 0:b86d15c6ba29 1289 XMEMCPY(out, des->reg, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1290
Vanger 0:b86d15c6ba29 1291 out += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1292 in += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1293 }
Vanger 0:b86d15c6ba29 1294 return 0;
Vanger 0:b86d15c6ba29 1295 }
Vanger 0:b86d15c6ba29 1296
Vanger 0:b86d15c6ba29 1297
Vanger 0:b86d15c6ba29 1298 int Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 1299 {
Vanger 0:b86d15c6ba29 1300 word32 blocks = sz / DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1301 byte hold[DES_BLOCK_SIZE];
Vanger 0:b86d15c6ba29 1302
Vanger 0:b86d15c6ba29 1303 while (blocks--) {
Vanger 0:b86d15c6ba29 1304 XMEMCPY(des->tmp, in, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1305 DesProcessBlock(des, (byte*)des->tmp, out);
Vanger 0:b86d15c6ba29 1306 xorbuf(out, (byte*)des->reg, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1307
Vanger 0:b86d15c6ba29 1308 XMEMCPY(hold, des->reg, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1309 XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1310 XMEMCPY(des->tmp, hold, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1311
Vanger 0:b86d15c6ba29 1312 out += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1313 in += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1314 }
Vanger 0:b86d15c6ba29 1315 return 0;
Vanger 0:b86d15c6ba29 1316 }
Vanger 0:b86d15c6ba29 1317
Vanger 0:b86d15c6ba29 1318
Vanger 0:b86d15c6ba29 1319 int Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 1320 {
Vanger 0:b86d15c6ba29 1321 word32 blocks;
Vanger 0:b86d15c6ba29 1322
Vanger 0:b86d15c6ba29 1323 #ifdef HAVE_CAVIUM
Vanger 0:b86d15c6ba29 1324 if (des->magic == CYASSL_3DES_CAVIUM_MAGIC)
Vanger 0:b86d15c6ba29 1325 return Des3_CaviumCbcEncrypt(des, out, in, sz);
Vanger 0:b86d15c6ba29 1326 #endif
Vanger 0:b86d15c6ba29 1327
Vanger 0:b86d15c6ba29 1328 blocks = sz / DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1329 while (blocks--) {
Vanger 0:b86d15c6ba29 1330 xorbuf((byte*)des->reg, in, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1331 Des3ProcessBlock(des, (byte*)des->reg, (byte*)des->reg);
Vanger 0:b86d15c6ba29 1332 XMEMCPY(out, des->reg, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1333
Vanger 0:b86d15c6ba29 1334 out += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1335 in += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1336 }
Vanger 0:b86d15c6ba29 1337 return 0;
Vanger 0:b86d15c6ba29 1338 }
Vanger 0:b86d15c6ba29 1339
Vanger 0:b86d15c6ba29 1340
Vanger 0:b86d15c6ba29 1341 int Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 1342 {
Vanger 0:b86d15c6ba29 1343 word32 blocks;
Vanger 0:b86d15c6ba29 1344
Vanger 0:b86d15c6ba29 1345 #ifdef HAVE_CAVIUM
Vanger 0:b86d15c6ba29 1346 if (des->magic == CYASSL_3DES_CAVIUM_MAGIC)
Vanger 0:b86d15c6ba29 1347 return Des3_CaviumCbcDecrypt(des, out, in, sz);
Vanger 0:b86d15c6ba29 1348 #endif
Vanger 0:b86d15c6ba29 1349
Vanger 0:b86d15c6ba29 1350 blocks = sz / DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1351 while (blocks--) {
Vanger 0:b86d15c6ba29 1352 XMEMCPY(des->tmp, in, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1353 Des3ProcessBlock(des, (byte*)des->tmp, out);
Vanger 0:b86d15c6ba29 1354 xorbuf(out, (byte*)des->reg, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1355 XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1356
Vanger 0:b86d15c6ba29 1357 out += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1358 in += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1359 }
Vanger 0:b86d15c6ba29 1360 return 0;
Vanger 0:b86d15c6ba29 1361 }
Vanger 0:b86d15c6ba29 1362
Vanger 0:b86d15c6ba29 1363 #ifdef CYASSL_DES_ECB
Vanger 0:b86d15c6ba29 1364
Vanger 0:b86d15c6ba29 1365 /* One block, compatibility only */
Vanger 0:b86d15c6ba29 1366 int Des_EcbEncrypt(Des* des, byte* out, const byte* in, word32 sz)
Vanger 0:b86d15c6ba29 1367 {
Vanger 0:b86d15c6ba29 1368 word32 blocks = sz / DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1369
Vanger 0:b86d15c6ba29 1370 while (blocks--) {
Vanger 0:b86d15c6ba29 1371 DesProcessBlock(des, in, out);
Vanger 0:b86d15c6ba29 1372
Vanger 0:b86d15c6ba29 1373 out += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1374 in += DES_BLOCK_SIZE;
Vanger 0:b86d15c6ba29 1375 }
Vanger 0:b86d15c6ba29 1376 return 0;
Vanger 0:b86d15c6ba29 1377 }
Vanger 0:b86d15c6ba29 1378
Vanger 0:b86d15c6ba29 1379 #endif /* CYASSL_DES_ECB */
Vanger 0:b86d15c6ba29 1380
Vanger 0:b86d15c6ba29 1381 #endif /* STM32F2_CRYPTO */
Vanger 0:b86d15c6ba29 1382
Vanger 0:b86d15c6ba29 1383 void Des_SetIV(Des* des, const byte* iv)
Vanger 0:b86d15c6ba29 1384 {
Vanger 0:b86d15c6ba29 1385 if (des && iv)
Vanger 0:b86d15c6ba29 1386 XMEMCPY(des->reg, iv, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1387 else if (des)
Vanger 0:b86d15c6ba29 1388 XMEMSET(des->reg, 0, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1389 }
Vanger 0:b86d15c6ba29 1390
Vanger 0:b86d15c6ba29 1391
Vanger 0:b86d15c6ba29 1392 int Des_CbcDecryptWithKey(byte* out, const byte* in, word32 sz,
Vanger 0:b86d15c6ba29 1393 const byte* key, const byte* iv)
Vanger 0:b86d15c6ba29 1394 {
Vanger 0:b86d15c6ba29 1395 int ret = 0;
Vanger 0:b86d15c6ba29 1396 #ifdef CYASSL_SMALL_STACK
Vanger 0:b86d15c6ba29 1397 Des* des = NULL;
Vanger 0:b86d15c6ba29 1398 #else
Vanger 0:b86d15c6ba29 1399 Des des[1];
Vanger 0:b86d15c6ba29 1400 #endif
Vanger 0:b86d15c6ba29 1401
Vanger 0:b86d15c6ba29 1402 #ifdef CYASSL_SMALL_STACK
Vanger 0:b86d15c6ba29 1403 des = (Des*)XMALLOC(sizeof(Des), NULL, DYNAMIC_TYPE_TMP_BUFFER);
Vanger 0:b86d15c6ba29 1404 if (des == NULL)
Vanger 0:b86d15c6ba29 1405 return MEMORY_E;
Vanger 0:b86d15c6ba29 1406 #endif
Vanger 0:b86d15c6ba29 1407
Vanger 0:b86d15c6ba29 1408 ret = Des_SetKey(des, key, iv, DES_DECRYPTION);
Vanger 0:b86d15c6ba29 1409 if (ret == 0)
Vanger 0:b86d15c6ba29 1410 ret = Des_CbcDecrypt(des, out, in, sz);
Vanger 0:b86d15c6ba29 1411
Vanger 0:b86d15c6ba29 1412 #ifdef CYASSL_SMALL_STACK
Vanger 0:b86d15c6ba29 1413 XFREE(des, NULL, DYNAMIC_TYPE_TMP_BUFFER);
Vanger 0:b86d15c6ba29 1414 #endif
Vanger 0:b86d15c6ba29 1415
Vanger 0:b86d15c6ba29 1416 return ret;
Vanger 0:b86d15c6ba29 1417 }
Vanger 0:b86d15c6ba29 1418
Vanger 0:b86d15c6ba29 1419
Vanger 0:b86d15c6ba29 1420 int Des3_SetIV(Des3* des, const byte* iv)
Vanger 0:b86d15c6ba29 1421 {
Vanger 0:b86d15c6ba29 1422 if (des && iv)
Vanger 0:b86d15c6ba29 1423 XMEMCPY(des->reg, iv, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1424 else if (des)
Vanger 0:b86d15c6ba29 1425 XMEMSET(des->reg, 0, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1426
Vanger 0:b86d15c6ba29 1427 return 0;
Vanger 0:b86d15c6ba29 1428 }
Vanger 0:b86d15c6ba29 1429
Vanger 0:b86d15c6ba29 1430
Vanger 0:b86d15c6ba29 1431 int Des3_CbcDecryptWithKey(byte* out, const byte* in, word32 sz,
Vanger 0:b86d15c6ba29 1432 const byte* key, const byte* iv)
Vanger 0:b86d15c6ba29 1433 {
Vanger 0:b86d15c6ba29 1434 int ret = 0;
Vanger 0:b86d15c6ba29 1435 #ifdef CYASSL_SMALL_STACK
Vanger 0:b86d15c6ba29 1436 Des3* des3 = NULL;
Vanger 0:b86d15c6ba29 1437 #else
Vanger 0:b86d15c6ba29 1438 Des3 des3[1];
Vanger 0:b86d15c6ba29 1439 #endif
Vanger 0:b86d15c6ba29 1440
Vanger 0:b86d15c6ba29 1441 #ifdef CYASSL_SMALL_STACK
Vanger 0:b86d15c6ba29 1442 des3 = (Des3*)XMALLOC(sizeof(Des3), NULL, DYNAMIC_TYPE_TMP_BUFFER);
Vanger 0:b86d15c6ba29 1443 if (des3 == NULL)
Vanger 0:b86d15c6ba29 1444 return MEMORY_E;
Vanger 0:b86d15c6ba29 1445 #endif
Vanger 0:b86d15c6ba29 1446
Vanger 0:b86d15c6ba29 1447 ret = Des3_SetKey(des3, key, iv, DES_DECRYPTION);
Vanger 0:b86d15c6ba29 1448 if (ret == 0)
Vanger 0:b86d15c6ba29 1449 ret = Des3_CbcDecrypt(des3, out, in, sz);
Vanger 0:b86d15c6ba29 1450
Vanger 0:b86d15c6ba29 1451 #ifdef CYASSL_SMALL_STACK
Vanger 0:b86d15c6ba29 1452 XFREE(des3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
Vanger 0:b86d15c6ba29 1453 #endif
Vanger 0:b86d15c6ba29 1454
Vanger 0:b86d15c6ba29 1455 return ret;
Vanger 0:b86d15c6ba29 1456 }
Vanger 0:b86d15c6ba29 1457
Vanger 0:b86d15c6ba29 1458
Vanger 0:b86d15c6ba29 1459 #ifdef HAVE_CAVIUM
Vanger 0:b86d15c6ba29 1460
Vanger 0:b86d15c6ba29 1461 #include "cavium_common.h"
Vanger 0:b86d15c6ba29 1462
Vanger 0:b86d15c6ba29 1463 /* Initiliaze Des3 for use with Nitrox device */
Vanger 0:b86d15c6ba29 1464 int Des3_InitCavium(Des3* des3, int devId)
Vanger 0:b86d15c6ba29 1465 {
Vanger 0:b86d15c6ba29 1466 if (des3 == NULL)
Vanger 0:b86d15c6ba29 1467 return -1;
Vanger 0:b86d15c6ba29 1468
Vanger 0:b86d15c6ba29 1469 if (CspAllocContext(CONTEXT_SSL, &des3->contextHandle, devId) != 0)
Vanger 0:b86d15c6ba29 1470 return -1;
Vanger 0:b86d15c6ba29 1471
Vanger 0:b86d15c6ba29 1472 des3->devId = devId;
Vanger 0:b86d15c6ba29 1473 des3->magic = CYASSL_3DES_CAVIUM_MAGIC;
Vanger 0:b86d15c6ba29 1474
Vanger 0:b86d15c6ba29 1475 return 0;
Vanger 0:b86d15c6ba29 1476 }
Vanger 0:b86d15c6ba29 1477
Vanger 0:b86d15c6ba29 1478
Vanger 0:b86d15c6ba29 1479 /* Free Des3 from use with Nitrox device */
Vanger 0:b86d15c6ba29 1480 void Des3_FreeCavium(Des3* des3)
Vanger 0:b86d15c6ba29 1481 {
Vanger 0:b86d15c6ba29 1482 if (des3 == NULL)
Vanger 0:b86d15c6ba29 1483 return;
Vanger 0:b86d15c6ba29 1484
Vanger 0:b86d15c6ba29 1485 if (des3->magic != CYASSL_3DES_CAVIUM_MAGIC)
Vanger 0:b86d15c6ba29 1486 return;
Vanger 0:b86d15c6ba29 1487
Vanger 0:b86d15c6ba29 1488 CspFreeContext(CONTEXT_SSL, des3->contextHandle, des3->devId);
Vanger 0:b86d15c6ba29 1489 des3->magic = 0;
Vanger 0:b86d15c6ba29 1490 }
Vanger 0:b86d15c6ba29 1491
Vanger 0:b86d15c6ba29 1492
Vanger 0:b86d15c6ba29 1493 static int Des3_CaviumSetKey(Des3* des3, const byte* key, const byte* iv)
Vanger 0:b86d15c6ba29 1494 {
Vanger 0:b86d15c6ba29 1495 if (des3 == NULL)
Vanger 0:b86d15c6ba29 1496 return -1;
Vanger 0:b86d15c6ba29 1497
Vanger 0:b86d15c6ba29 1498 /* key[0] holds key, iv in reg */
Vanger 0:b86d15c6ba29 1499 XMEMCPY(des3->key[0], key, DES_BLOCK_SIZE*3);
Vanger 0:b86d15c6ba29 1500
Vanger 0:b86d15c6ba29 1501 return Des3_SetIV(des3, iv);
Vanger 0:b86d15c6ba29 1502 }
Vanger 0:b86d15c6ba29 1503
Vanger 0:b86d15c6ba29 1504
Vanger 0:b86d15c6ba29 1505 static int Des3_CaviumCbcEncrypt(Des3* des3, byte* out, const byte* in,
Vanger 0:b86d15c6ba29 1506 word32 length)
Vanger 0:b86d15c6ba29 1507 {
Vanger 0:b86d15c6ba29 1508 cyassl_word offset = 0;
Vanger 0:b86d15c6ba29 1509 word32 requestId;
Vanger 0:b86d15c6ba29 1510
Vanger 0:b86d15c6ba29 1511 while (length > CYASSL_MAX_16BIT) {
Vanger 0:b86d15c6ba29 1512 word16 slen = (word16)CYASSL_MAX_16BIT;
Vanger 0:b86d15c6ba29 1513 if (CspEncrypt3Des(CAVIUM_BLOCKING, des3->contextHandle,
Vanger 0:b86d15c6ba29 1514 CAVIUM_NO_UPDATE, slen, (byte*)in + offset,
Vanger 0:b86d15c6ba29 1515 out + offset, (byte*)des3->reg, (byte*)des3->key[0],
Vanger 0:b86d15c6ba29 1516 &requestId, des3->devId) != 0) {
Vanger 0:b86d15c6ba29 1517 CYASSL_MSG("Bad Cavium 3DES Cbc Encrypt");
Vanger 0:b86d15c6ba29 1518 return -1;
Vanger 0:b86d15c6ba29 1519 }
Vanger 0:b86d15c6ba29 1520 length -= CYASSL_MAX_16BIT;
Vanger 0:b86d15c6ba29 1521 offset += CYASSL_MAX_16BIT;
Vanger 0:b86d15c6ba29 1522 XMEMCPY(des3->reg, out + offset - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1523 }
Vanger 0:b86d15c6ba29 1524 if (length) {
Vanger 0:b86d15c6ba29 1525 word16 slen = (word16)length;
Vanger 0:b86d15c6ba29 1526
Vanger 0:b86d15c6ba29 1527 if (CspEncrypt3Des(CAVIUM_BLOCKING, des3->contextHandle,
Vanger 0:b86d15c6ba29 1528 CAVIUM_NO_UPDATE, slen, (byte*)in + offset,
Vanger 0:b86d15c6ba29 1529 out + offset, (byte*)des3->reg, (byte*)des3->key[0],
Vanger 0:b86d15c6ba29 1530 &requestId, des3->devId) != 0) {
Vanger 0:b86d15c6ba29 1531 CYASSL_MSG("Bad Cavium 3DES Cbc Encrypt");
Vanger 0:b86d15c6ba29 1532 return -1;
Vanger 0:b86d15c6ba29 1533 }
Vanger 0:b86d15c6ba29 1534 XMEMCPY(des3->reg, out+offset+length - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1535 }
Vanger 0:b86d15c6ba29 1536 return 0;
Vanger 0:b86d15c6ba29 1537 }
Vanger 0:b86d15c6ba29 1538
Vanger 0:b86d15c6ba29 1539 static int Des3_CaviumCbcDecrypt(Des3* des3, byte* out, const byte* in,
Vanger 0:b86d15c6ba29 1540 word32 length)
Vanger 0:b86d15c6ba29 1541 {
Vanger 0:b86d15c6ba29 1542 word32 requestId;
Vanger 0:b86d15c6ba29 1543 cyassl_word offset = 0;
Vanger 0:b86d15c6ba29 1544
Vanger 0:b86d15c6ba29 1545 while (length > CYASSL_MAX_16BIT) {
Vanger 0:b86d15c6ba29 1546 word16 slen = (word16)CYASSL_MAX_16BIT;
Vanger 0:b86d15c6ba29 1547 XMEMCPY(des3->tmp, in + offset + slen - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1548 if (CspDecrypt3Des(CAVIUM_BLOCKING, des3->contextHandle,
Vanger 0:b86d15c6ba29 1549 CAVIUM_NO_UPDATE, slen, (byte*)in+offset, out+offset,
Vanger 0:b86d15c6ba29 1550 (byte*)des3->reg, (byte*)des3->key[0], &requestId,
Vanger 0:b86d15c6ba29 1551 des3->devId) != 0) {
Vanger 0:b86d15c6ba29 1552 CYASSL_MSG("Bad Cavium 3Des Decrypt");
Vanger 0:b86d15c6ba29 1553 return -1;
Vanger 0:b86d15c6ba29 1554 }
Vanger 0:b86d15c6ba29 1555 length -= CYASSL_MAX_16BIT;
Vanger 0:b86d15c6ba29 1556 offset += CYASSL_MAX_16BIT;
Vanger 0:b86d15c6ba29 1557 XMEMCPY(des3->reg, des3->tmp, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1558 }
Vanger 0:b86d15c6ba29 1559 if (length) {
Vanger 0:b86d15c6ba29 1560 word16 slen = (word16)length;
Vanger 0:b86d15c6ba29 1561 XMEMCPY(des3->tmp, in + offset + slen - DES_BLOCK_SIZE,DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1562 if (CspDecrypt3Des(CAVIUM_BLOCKING, des3->contextHandle,
Vanger 0:b86d15c6ba29 1563 CAVIUM_NO_UPDATE, slen, (byte*)in+offset, out+offset,
Vanger 0:b86d15c6ba29 1564 (byte*)des3->reg, (byte*)des3->key[0], &requestId,
Vanger 0:b86d15c6ba29 1565 des3->devId) != 0) {
Vanger 0:b86d15c6ba29 1566 CYASSL_MSG("Bad Cavium 3Des Decrypt");
Vanger 0:b86d15c6ba29 1567 return -1;
Vanger 0:b86d15c6ba29 1568 }
Vanger 0:b86d15c6ba29 1569 XMEMCPY(des3->reg, des3->tmp, DES_BLOCK_SIZE);
Vanger 0:b86d15c6ba29 1570 }
Vanger 0:b86d15c6ba29 1571 return 0;
Vanger 0:b86d15c6ba29 1572 }
Vanger 0:b86d15c6ba29 1573
Vanger 0:b86d15c6ba29 1574 #endif /* HAVE_CAVIUM */
Vanger 0:b86d15c6ba29 1575
Vanger 0:b86d15c6ba29 1576 #endif /* NO_DES3 */