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

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

Committer:
wolfSSL
Date:
Tue Aug 22 10:48:22 2017 +0000
Revision:
13:f67a6c6013ca
wolfSSL3.12.0 with TLS1.3

Who changed what in which revision?

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