Xuyi Wang / wolfcrypt

Dependents:   OS

Committer:
sPymbed
Date:
Mon Nov 25 14:23:49 2019 +0000
Revision:
1:e4ea39eba2fb
Parent:
0:1387ff3eed4a
improved

Who changed what in which revision?

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