Xuyi Wang / wolfSSL

Dependents:   OS

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

Who changed what in which revision?

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