Xuyi Wang / wolfSSL

Dependents:   OS

Committer:
wolfSSL
Date:
Tue Aug 22 10:47:28 2017 +0000
Revision:
12:1a06964c2adb
wolfSSL 3.12.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 12:1a06964c2adb 1 /* evp.c
wolfSSL 12:1a06964c2adb 2 *
wolfSSL 12:1a06964c2adb 3 * Copyright (C) 2006-2016 wolfSSL Inc.
wolfSSL 12:1a06964c2adb 4 *
wolfSSL 12:1a06964c2adb 5 * This file is part of wolfSSL.
wolfSSL 12:1a06964c2adb 6 *
wolfSSL 12:1a06964c2adb 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 12:1a06964c2adb 8 * it under the terms of the GNU General Public License as published by
wolfSSL 12:1a06964c2adb 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 12:1a06964c2adb 10 * (at your option) any later version.
wolfSSL 12:1a06964c2adb 11 *
wolfSSL 12:1a06964c2adb 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 12:1a06964c2adb 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 12:1a06964c2adb 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 12:1a06964c2adb 15 * GNU General Public License for more details.
wolfSSL 12:1a06964c2adb 16 *
wolfSSL 12:1a06964c2adb 17 * You should have received a copy of the GNU General Public License
wolfSSL 12:1a06964c2adb 18 * along with this program; if not, write to the Free Software
wolfSSL 12:1a06964c2adb 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 12:1a06964c2adb 20 */
wolfSSL 12:1a06964c2adb 21
wolfSSL 12:1a06964c2adb 22 #if !defined(WOLFSSL_EVP_INCLUDED)
wolfSSL 12:1a06964c2adb 23 #warning evp.c does not need to be compiled seperatly from ssl.c
wolfSSL 12:1a06964c2adb 24 #else
wolfSSL 12:1a06964c2adb 25
wolfSSL 12:1a06964c2adb 26 static unsigned int cipherType(const WOLFSSL_EVP_CIPHER *cipher);
wolfSSL 12:1a06964c2adb 27
wolfSSL 12:1a06964c2adb 28 WOLFSSL_API int wolfSSL_EVP_EncryptInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
wolfSSL 12:1a06964c2adb 29 const WOLFSSL_EVP_CIPHER* type,
wolfSSL 12:1a06964c2adb 30 unsigned char* key, unsigned char* iv)
wolfSSL 12:1a06964c2adb 31 {
wolfSSL 12:1a06964c2adb 32 return wolfSSL_EVP_CipherInit(ctx, type, key, iv, 1);
wolfSSL 12:1a06964c2adb 33 }
wolfSSL 12:1a06964c2adb 34
wolfSSL 12:1a06964c2adb 35 WOLFSSL_API int wolfSSL_EVP_EncryptInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx,
wolfSSL 12:1a06964c2adb 36 const WOLFSSL_EVP_CIPHER* type,
wolfSSL 12:1a06964c2adb 37 WOLFSSL_ENGINE *impl,
wolfSSL 12:1a06964c2adb 38 unsigned char* key, unsigned char* iv)
wolfSSL 12:1a06964c2adb 39 {
wolfSSL 12:1a06964c2adb 40 (void) impl;
wolfSSL 12:1a06964c2adb 41 return wolfSSL_EVP_CipherInit(ctx, type, key, iv, 1);
wolfSSL 12:1a06964c2adb 42 }
wolfSSL 12:1a06964c2adb 43
wolfSSL 12:1a06964c2adb 44 WOLFSSL_API int wolfSSL_EVP_DecryptInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
wolfSSL 12:1a06964c2adb 45 const WOLFSSL_EVP_CIPHER* type,
wolfSSL 12:1a06964c2adb 46 unsigned char* key, unsigned char* iv)
wolfSSL 12:1a06964c2adb 47 {
wolfSSL 12:1a06964c2adb 48 WOLFSSL_ENTER("wolfSSL_EVP_CipherInit");
wolfSSL 12:1a06964c2adb 49 return wolfSSL_EVP_CipherInit(ctx, type, key, iv, 0);
wolfSSL 12:1a06964c2adb 50 }
wolfSSL 12:1a06964c2adb 51
wolfSSL 12:1a06964c2adb 52 WOLFSSL_API int wolfSSL_EVP_DecryptInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx,
wolfSSL 12:1a06964c2adb 53 const WOLFSSL_EVP_CIPHER* type,
wolfSSL 12:1a06964c2adb 54 WOLFSSL_ENGINE *impl,
wolfSSL 12:1a06964c2adb 55 unsigned char* key, unsigned char* iv)
wolfSSL 12:1a06964c2adb 56 {
wolfSSL 12:1a06964c2adb 57 (void) impl;
wolfSSL 12:1a06964c2adb 58 WOLFSSL_ENTER("wolfSSL_EVP_DecryptInit");
wolfSSL 12:1a06964c2adb 59 return wolfSSL_EVP_CipherInit(ctx, type, key, iv, 0);
wolfSSL 12:1a06964c2adb 60 }
wolfSSL 12:1a06964c2adb 61
wolfSSL 12:1a06964c2adb 62 WOLFSSL_API WOLFSSL_EVP_CIPHER_CTX *wolfSSL_EVP_CIPHER_CTX_new(void)
wolfSSL 12:1a06964c2adb 63 {
wolfSSL 12:1a06964c2adb 64 WOLFSSL_EVP_CIPHER_CTX *ctx = (WOLFSSL_EVP_CIPHER_CTX*)XMALLOC(sizeof *ctx,
wolfSSL 12:1a06964c2adb 65 NULL, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 12:1a06964c2adb 66 if (ctx){
wolfSSL 12:1a06964c2adb 67 WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_new");
wolfSSL 12:1a06964c2adb 68 wolfSSL_EVP_CIPHER_CTX_init(ctx);
wolfSSL 12:1a06964c2adb 69 }
wolfSSL 12:1a06964c2adb 70 return ctx;
wolfSSL 12:1a06964c2adb 71 }
wolfSSL 12:1a06964c2adb 72
wolfSSL 12:1a06964c2adb 73 WOLFSSL_API void wolfSSL_EVP_CIPHER_CTX_free(WOLFSSL_EVP_CIPHER_CTX *ctx)
wolfSSL 12:1a06964c2adb 74 {
wolfSSL 12:1a06964c2adb 75 if (ctx) {
wolfSSL 12:1a06964c2adb 76 WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_free");
wolfSSL 12:1a06964c2adb 77 wolfSSL_EVP_CIPHER_CTX_cleanup(ctx);
wolfSSL 12:1a06964c2adb 78 XFREE(ctx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 12:1a06964c2adb 79 }
wolfSSL 12:1a06964c2adb 80 }
wolfSSL 12:1a06964c2adb 81
wolfSSL 12:1a06964c2adb 82 WOLFSSL_API unsigned long wolfSSL_EVP_CIPHER_CTX_mode(const WOLFSSL_EVP_CIPHER_CTX *ctx)
wolfSSL 12:1a06964c2adb 83 {
wolfSSL 12:1a06964c2adb 84 if (ctx == NULL) return 0;
wolfSSL 12:1a06964c2adb 85 return ctx->flags & WOLFSSL_EVP_CIPH_MODE;
wolfSSL 12:1a06964c2adb 86 }
wolfSSL 12:1a06964c2adb 87
wolfSSL 12:1a06964c2adb 88 WOLFSSL_API int wolfSSL_EVP_EncryptFinal(WOLFSSL_EVP_CIPHER_CTX *ctx,
wolfSSL 12:1a06964c2adb 89 unsigned char *out, int *outl)
wolfSSL 12:1a06964c2adb 90 {
wolfSSL 12:1a06964c2adb 91 if (ctx && ctx->enc){
wolfSSL 12:1a06964c2adb 92 WOLFSSL_ENTER("wolfSSL_EVP_EncryptFinal");
wolfSSL 12:1a06964c2adb 93 return wolfSSL_EVP_CipherFinal(ctx, out, outl);
wolfSSL 12:1a06964c2adb 94 }
wolfSSL 12:1a06964c2adb 95 else
wolfSSL 12:1a06964c2adb 96 return 0;
wolfSSL 12:1a06964c2adb 97 }
wolfSSL 12:1a06964c2adb 98
wolfSSL 12:1a06964c2adb 99
wolfSSL 12:1a06964c2adb 100 WOLFSSL_API int wolfSSL_EVP_CipherInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx,
wolfSSL 12:1a06964c2adb 101 const WOLFSSL_EVP_CIPHER* type,
wolfSSL 12:1a06964c2adb 102 WOLFSSL_ENGINE *impl,
wolfSSL 12:1a06964c2adb 103 unsigned char* key, unsigned char* iv,
wolfSSL 12:1a06964c2adb 104 int enc)
wolfSSL 12:1a06964c2adb 105 {
wolfSSL 12:1a06964c2adb 106 (void)impl;
wolfSSL 12:1a06964c2adb 107 return wolfSSL_EVP_CipherInit(ctx, type, key, iv, enc);
wolfSSL 12:1a06964c2adb 108 }
wolfSSL 12:1a06964c2adb 109
wolfSSL 12:1a06964c2adb 110 WOLFSSL_API int wolfSSL_EVP_EncryptFinal_ex(WOLFSSL_EVP_CIPHER_CTX *ctx,
wolfSSL 12:1a06964c2adb 111 unsigned char *out, int *outl)
wolfSSL 12:1a06964c2adb 112 {
wolfSSL 12:1a06964c2adb 113 if (ctx && ctx->enc){
wolfSSL 12:1a06964c2adb 114 WOLFSSL_ENTER("wolfSSL_EVP_EncryptFinal_ex");
wolfSSL 12:1a06964c2adb 115 return wolfSSL_EVP_CipherFinal(ctx, out, outl);
wolfSSL 12:1a06964c2adb 116 }
wolfSSL 12:1a06964c2adb 117 else
wolfSSL 12:1a06964c2adb 118 return 0;
wolfSSL 12:1a06964c2adb 119 }
wolfSSL 12:1a06964c2adb 120
wolfSSL 12:1a06964c2adb 121 WOLFSSL_API int wolfSSL_EVP_DecryptFinal(WOLFSSL_EVP_CIPHER_CTX *ctx,
wolfSSL 12:1a06964c2adb 122 unsigned char *out, int *outl)
wolfSSL 12:1a06964c2adb 123 {
wolfSSL 12:1a06964c2adb 124 if (ctx && ctx->enc)
wolfSSL 12:1a06964c2adb 125 return 0;
wolfSSL 12:1a06964c2adb 126 else{
wolfSSL 12:1a06964c2adb 127 WOLFSSL_ENTER("wolfSSL_EVP_DecryptFinal");
wolfSSL 12:1a06964c2adb 128 return wolfSSL_EVP_CipherFinal(ctx, out, outl);
wolfSSL 12:1a06964c2adb 129 }
wolfSSL 12:1a06964c2adb 130 }
wolfSSL 12:1a06964c2adb 131
wolfSSL 12:1a06964c2adb 132 WOLFSSL_API int wolfSSL_EVP_DecryptFinal_ex(WOLFSSL_EVP_CIPHER_CTX *ctx,
wolfSSL 12:1a06964c2adb 133 unsigned char *out, int *outl)
wolfSSL 12:1a06964c2adb 134 {
wolfSSL 12:1a06964c2adb 135 if (ctx && ctx->enc)
wolfSSL 12:1a06964c2adb 136 return 0;
wolfSSL 12:1a06964c2adb 137 else{
wolfSSL 12:1a06964c2adb 138 WOLFSSL_ENTER("wolfSSL_EVP_CipherFinal_ex");
wolfSSL 12:1a06964c2adb 139 return wolfSSL_EVP_CipherFinal(ctx, out, outl);
wolfSSL 12:1a06964c2adb 140 }
wolfSSL 12:1a06964c2adb 141 }
wolfSSL 12:1a06964c2adb 142
wolfSSL 12:1a06964c2adb 143
wolfSSL 12:1a06964c2adb 144 WOLFSSL_API int wolfSSL_EVP_DigestInit_ex(WOLFSSL_EVP_MD_CTX* ctx,
wolfSSL 12:1a06964c2adb 145 const WOLFSSL_EVP_MD* type,
wolfSSL 12:1a06964c2adb 146 WOLFSSL_ENGINE *impl)
wolfSSL 12:1a06964c2adb 147 {
wolfSSL 12:1a06964c2adb 148 (void) impl;
wolfSSL 12:1a06964c2adb 149 WOLFSSL_ENTER("wolfSSL_EVP_DigestInit_ex");
wolfSSL 12:1a06964c2adb 150 return wolfSSL_EVP_DigestInit(ctx, type);
wolfSSL 12:1a06964c2adb 151 }
wolfSSL 12:1a06964c2adb 152
wolfSSL 12:1a06964c2adb 153 #ifdef DEBUG_WOLFSSL_EVP
wolfSSL 12:1a06964c2adb 154 #define PRINT_BUF(b, sz) { int i; for(i=0; i<(sz); i++){printf("%02x(%c),", (b)[i], (b)[i]); if((i+1)%8==0)printf("\n");}}
wolfSSL 12:1a06964c2adb 155 #else
wolfSSL 12:1a06964c2adb 156 #define PRINT_BUF(b, sz)
wolfSSL 12:1a06964c2adb 157 #endif
wolfSSL 12:1a06964c2adb 158
wolfSSL 12:1a06964c2adb 159 static int fillBuff(WOLFSSL_EVP_CIPHER_CTX *ctx, const unsigned char *in, int sz)
wolfSSL 12:1a06964c2adb 160 {
wolfSSL 12:1a06964c2adb 161 int fill;
wolfSSL 12:1a06964c2adb 162
wolfSSL 12:1a06964c2adb 163 if (sz > 0) {
wolfSSL 12:1a06964c2adb 164 if ((sz+ctx->bufUsed) > ctx->block_size) {
wolfSSL 12:1a06964c2adb 165 fill = ctx->block_size - ctx->bufUsed;
wolfSSL 12:1a06964c2adb 166 } else {
wolfSSL 12:1a06964c2adb 167 fill = sz;
wolfSSL 12:1a06964c2adb 168 }
wolfSSL 12:1a06964c2adb 169 XMEMCPY(&(ctx->buf[ctx->bufUsed]), in, fill);
wolfSSL 12:1a06964c2adb 170 ctx->bufUsed += fill;
wolfSSL 12:1a06964c2adb 171 return fill;
wolfSSL 12:1a06964c2adb 172 } else return 0;
wolfSSL 12:1a06964c2adb 173 }
wolfSSL 12:1a06964c2adb 174
wolfSSL 12:1a06964c2adb 175 static int evpCipherBlock(WOLFSSL_EVP_CIPHER_CTX *ctx,
wolfSSL 12:1a06964c2adb 176 unsigned char *out,
wolfSSL 12:1a06964c2adb 177 const unsigned char *in, int inl)
wolfSSL 12:1a06964c2adb 178 {
wolfSSL 12:1a06964c2adb 179 int ret = 0;
wolfSSL 12:1a06964c2adb 180
wolfSSL 12:1a06964c2adb 181 switch (ctx->cipherType) {
wolfSSL 12:1a06964c2adb 182 #if !defined(NO_AES) && defined(HAVE_AES_CBC)
wolfSSL 12:1a06964c2adb 183 case AES_128_CBC_TYPE:
wolfSSL 12:1a06964c2adb 184 case AES_192_CBC_TYPE:
wolfSSL 12:1a06964c2adb 185 case AES_256_CBC_TYPE:
wolfSSL 12:1a06964c2adb 186 if (ctx->enc)
wolfSSL 12:1a06964c2adb 187 ret = wc_AesCbcEncrypt(&ctx->cipher.aes, out, in, inl);
wolfSSL 12:1a06964c2adb 188 else
wolfSSL 12:1a06964c2adb 189 ret = wc_AesCbcDecrypt(&ctx->cipher.aes, out, in, inl);
wolfSSL 12:1a06964c2adb 190 break;
wolfSSL 12:1a06964c2adb 191 #endif
wolfSSL 12:1a06964c2adb 192 #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
wolfSSL 12:1a06964c2adb 193 case AES_128_CTR_TYPE:
wolfSSL 12:1a06964c2adb 194 case AES_192_CTR_TYPE:
wolfSSL 12:1a06964c2adb 195 case AES_256_CTR_TYPE:
wolfSSL 12:1a06964c2adb 196 if (ctx->enc)
wolfSSL 12:1a06964c2adb 197 ret = wc_AesCtrEncrypt(&ctx->cipher.aes, out, in, inl);
wolfSSL 12:1a06964c2adb 198 else
wolfSSL 12:1a06964c2adb 199 ret = wc_AesCtrEncrypt(&ctx->cipher.aes, out, in, inl);
wolfSSL 12:1a06964c2adb 200 break;
wolfSSL 12:1a06964c2adb 201 #endif
wolfSSL 12:1a06964c2adb 202 #if !defined(NO_AES) && defined(HAVE_AES_ECB)
wolfSSL 12:1a06964c2adb 203 case AES_128_ECB_TYPE:
wolfSSL 12:1a06964c2adb 204 case AES_192_ECB_TYPE:
wolfSSL 12:1a06964c2adb 205 case AES_256_ECB_TYPE:
wolfSSL 12:1a06964c2adb 206 if (ctx->enc)
wolfSSL 12:1a06964c2adb 207 ret = wc_AesEcbEncrypt(&ctx->cipher.aes, out, in, inl);
wolfSSL 12:1a06964c2adb 208 else
wolfSSL 12:1a06964c2adb 209 ret = wc_AesEcbDecrypt(&ctx->cipher.aes, out, in, inl);
wolfSSL 12:1a06964c2adb 210 break;
wolfSSL 12:1a06964c2adb 211 #endif
wolfSSL 12:1a06964c2adb 212 #ifndef NO_DES3
wolfSSL 12:1a06964c2adb 213 case DES_CBC_TYPE:
wolfSSL 12:1a06964c2adb 214 if (ctx->enc)
wolfSSL 12:1a06964c2adb 215 ret = wc_Des_CbcEncrypt(&ctx->cipher.des, out, in, inl);
wolfSSL 12:1a06964c2adb 216 else
wolfSSL 12:1a06964c2adb 217 ret = wc_Des_CbcDecrypt(&ctx->cipher.des, out, in, inl);
wolfSSL 12:1a06964c2adb 218 break;
wolfSSL 12:1a06964c2adb 219 case DES_EDE3_CBC_TYPE:
wolfSSL 12:1a06964c2adb 220 if (ctx->enc)
wolfSSL 12:1a06964c2adb 221 ret = wc_Des3_CbcEncrypt(&ctx->cipher.des3, out, in, inl);
wolfSSL 12:1a06964c2adb 222 else
wolfSSL 12:1a06964c2adb 223 ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, out, in, inl);
wolfSSL 12:1a06964c2adb 224 break;
wolfSSL 12:1a06964c2adb 225 #if defined(WOLFSSL_DES_ECB)
wolfSSL 12:1a06964c2adb 226 case DES_ECB_TYPE:
wolfSSL 12:1a06964c2adb 227 ret = wc_Des_EcbEncrypt(&ctx->cipher.des, out, in, inl);
wolfSSL 12:1a06964c2adb 228 break;
wolfSSL 12:1a06964c2adb 229 case DES_EDE3_ECB_TYPE:
wolfSSL 12:1a06964c2adb 230 ret = wc_Des3_EcbEncrypt(&ctx->cipher.des3, out, in, inl);
wolfSSL 12:1a06964c2adb 231 break;
wolfSSL 12:1a06964c2adb 232 #endif /* WOLFSSL_DES_ECB */
wolfSSL 12:1a06964c2adb 233 #endif /* !NO_DES3 */
wolfSSL 12:1a06964c2adb 234 default:
wolfSSL 12:1a06964c2adb 235 return 0;
wolfSSL 12:1a06964c2adb 236 }
wolfSSL 12:1a06964c2adb 237
wolfSSL 12:1a06964c2adb 238 if (ret != 0)
wolfSSL 12:1a06964c2adb 239 return 0; /* failure */
wolfSSL 12:1a06964c2adb 240
wolfSSL 12:1a06964c2adb 241 (void)in;
wolfSSL 12:1a06964c2adb 242 (void)inl;
wolfSSL 12:1a06964c2adb 243 (void)out;
wolfSSL 12:1a06964c2adb 244
wolfSSL 12:1a06964c2adb 245 return 1; /* success */
wolfSSL 12:1a06964c2adb 246 }
wolfSSL 12:1a06964c2adb 247
wolfSSL 12:1a06964c2adb 248 WOLFSSL_API int wolfSSL_EVP_CipherUpdate(WOLFSSL_EVP_CIPHER_CTX *ctx,
wolfSSL 12:1a06964c2adb 249 unsigned char *out, int *outl,
wolfSSL 12:1a06964c2adb 250 const unsigned char *in, int inl)
wolfSSL 12:1a06964c2adb 251 {
wolfSSL 12:1a06964c2adb 252 int blocks;
wolfSSL 12:1a06964c2adb 253 int fill;
wolfSSL 12:1a06964c2adb 254
wolfSSL 12:1a06964c2adb 255 if (ctx == NULL) return BAD_FUNC_ARG;
wolfSSL 12:1a06964c2adb 256 WOLFSSL_ENTER("wolfSSL_EVP_CipherUpdate");
wolfSSL 12:1a06964c2adb 257 *outl = 0;
wolfSSL 12:1a06964c2adb 258 if (ctx->bufUsed > 0) { /* concatinate them if there is anything */
wolfSSL 12:1a06964c2adb 259 fill = fillBuff(ctx, in, inl);
wolfSSL 12:1a06964c2adb 260 inl -= fill;
wolfSSL 12:1a06964c2adb 261 in += fill;
wolfSSL 12:1a06964c2adb 262 }
wolfSSL 12:1a06964c2adb 263 if((ctx->enc == 0)&& (ctx->lastUsed == 1)){
wolfSSL 12:1a06964c2adb 264 PRINT_BUF(ctx->lastBlock, ctx->block_size);
wolfSSL 12:1a06964c2adb 265 XMEMCPY(out, ctx->lastBlock, ctx->block_size);
wolfSSL 12:1a06964c2adb 266 *outl+= ctx->block_size;
wolfSSL 12:1a06964c2adb 267 out += ctx->block_size;
wolfSSL 12:1a06964c2adb 268 }
wolfSSL 12:1a06964c2adb 269 if ((ctx->bufUsed == ctx->block_size) || (ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING)){
wolfSSL 12:1a06964c2adb 270 /* the buff is full, flash out */
wolfSSL 12:1a06964c2adb 271 PRINT_BUF(ctx->buf, ctx->block_size);
wolfSSL 12:1a06964c2adb 272 if (evpCipherBlock(ctx, out, ctx->buf, ctx->block_size) == 0)
wolfSSL 12:1a06964c2adb 273 return 0;
wolfSSL 12:1a06964c2adb 274 PRINT_BUF(out, ctx->block_size);
wolfSSL 12:1a06964c2adb 275 if(ctx->enc == 0){
wolfSSL 12:1a06964c2adb 276 ctx->lastUsed = 1;
wolfSSL 12:1a06964c2adb 277 XMEMCPY(ctx->lastBlock, out, ctx->block_size);
wolfSSL 12:1a06964c2adb 278 } else {
wolfSSL 12:1a06964c2adb 279 *outl+= ctx->block_size;
wolfSSL 12:1a06964c2adb 280 out += ctx->block_size;
wolfSSL 12:1a06964c2adb 281 }
wolfSSL 12:1a06964c2adb 282 ctx->bufUsed = 0;
wolfSSL 12:1a06964c2adb 283 }
wolfSSL 12:1a06964c2adb 284
wolfSSL 12:1a06964c2adb 285 blocks = inl / ctx->block_size;
wolfSSL 12:1a06964c2adb 286 if (blocks > 0) {
wolfSSL 12:1a06964c2adb 287 /* process blocks */
wolfSSL 12:1a06964c2adb 288 if (evpCipherBlock(ctx, out, in, blocks*ctx->block_size) == 0)
wolfSSL 12:1a06964c2adb 289 return 0;
wolfSSL 12:1a06964c2adb 290 PRINT_BUF(ctx->buf, ctx->block_size);
wolfSSL 12:1a06964c2adb 291 PRINT_BUF(out, ctx->block_size);
wolfSSL 12:1a06964c2adb 292 inl -= ctx->block_size * blocks;
wolfSSL 12:1a06964c2adb 293 in += ctx->block_size * blocks;
wolfSSL 12:1a06964c2adb 294 if(ctx->enc == 0){
wolfSSL 12:1a06964c2adb 295 ctx->lastUsed = 1;
wolfSSL 12:1a06964c2adb 296 XMEMCPY(ctx->lastBlock, &out[ctx->block_size * (blocks-1)], ctx->block_size);
wolfSSL 12:1a06964c2adb 297 *outl+= ctx->block_size * (blocks-1);
wolfSSL 12:1a06964c2adb 298 } else {
wolfSSL 12:1a06964c2adb 299 *outl+= ctx->block_size * blocks;
wolfSSL 12:1a06964c2adb 300 }
wolfSSL 12:1a06964c2adb 301 }
wolfSSL 12:1a06964c2adb 302 if (inl > 0) {
wolfSSL 12:1a06964c2adb 303 /* put fraction into buff */
wolfSSL 12:1a06964c2adb 304 fillBuff(ctx, in, inl);
wolfSSL 12:1a06964c2adb 305 /* no increase of outl */
wolfSSL 12:1a06964c2adb 306 }
wolfSSL 12:1a06964c2adb 307
wolfSSL 12:1a06964c2adb 308 (void)out; /* silence warning in case not read */
wolfSSL 12:1a06964c2adb 309
wolfSSL 12:1a06964c2adb 310 return 1;
wolfSSL 12:1a06964c2adb 311 }
wolfSSL 12:1a06964c2adb 312
wolfSSL 12:1a06964c2adb 313 static void padBlock(WOLFSSL_EVP_CIPHER_CTX *ctx)
wolfSSL 12:1a06964c2adb 314 {
wolfSSL 12:1a06964c2adb 315 int i;
wolfSSL 12:1a06964c2adb 316 for (i = ctx->bufUsed; i < ctx->block_size; i++)
wolfSSL 12:1a06964c2adb 317 ctx->buf[i] = (byte)(ctx->block_size - ctx->bufUsed);
wolfSSL 12:1a06964c2adb 318 }
wolfSSL 12:1a06964c2adb 319
wolfSSL 12:1a06964c2adb 320 static int checkPad(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *buff)
wolfSSL 12:1a06964c2adb 321 {
wolfSSL 12:1a06964c2adb 322 int i;
wolfSSL 12:1a06964c2adb 323 int n;
wolfSSL 12:1a06964c2adb 324 n = buff[ctx->block_size-1];
wolfSSL 12:1a06964c2adb 325
wolfSSL 12:1a06964c2adb 326 if (n > ctx->block_size) return FALSE;
wolfSSL 12:1a06964c2adb 327 for (i = 0; i < n; i++){
wolfSSL 12:1a06964c2adb 328 if (buff[ctx->block_size-i-1] != n)
wolfSSL 12:1a06964c2adb 329 return FALSE;
wolfSSL 12:1a06964c2adb 330 }
wolfSSL 12:1a06964c2adb 331 return ctx->block_size - n;
wolfSSL 12:1a06964c2adb 332 }
wolfSSL 12:1a06964c2adb 333
wolfSSL 12:1a06964c2adb 334 WOLFSSL_API int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx,
wolfSSL 12:1a06964c2adb 335 unsigned char *out, int *outl)
wolfSSL 12:1a06964c2adb 336 {
wolfSSL 12:1a06964c2adb 337 int fl ;
wolfSSL 12:1a06964c2adb 338 if (ctx == NULL || out == NULL) return BAD_FUNC_ARG;
wolfSSL 12:1a06964c2adb 339 WOLFSSL_ENTER("wolfSSL_EVP_CipherFinal");
wolfSSL 12:1a06964c2adb 340 if (ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) {
wolfSSL 12:1a06964c2adb 341 *outl = 0;
wolfSSL 12:1a06964c2adb 342 return 1;
wolfSSL 12:1a06964c2adb 343 }
wolfSSL 12:1a06964c2adb 344 if (ctx->enc) {
wolfSSL 12:1a06964c2adb 345 if (ctx->bufUsed > 0) {
wolfSSL 12:1a06964c2adb 346 padBlock(ctx);
wolfSSL 12:1a06964c2adb 347 PRINT_BUF(ctx->buf, ctx->block_size);
wolfSSL 12:1a06964c2adb 348 if (evpCipherBlock(ctx, out, ctx->buf, ctx->block_size) == 0)
wolfSSL 12:1a06964c2adb 349 return 0;
wolfSSL 12:1a06964c2adb 350 PRINT_BUF(out, ctx->block_size);
wolfSSL 12:1a06964c2adb 351 *outl = ctx->block_size;
wolfSSL 12:1a06964c2adb 352 }
wolfSSL 12:1a06964c2adb 353 } else {
wolfSSL 12:1a06964c2adb 354 if (ctx->lastUsed){
wolfSSL 12:1a06964c2adb 355 PRINT_BUF(ctx->lastBlock, ctx->block_size);
wolfSSL 12:1a06964c2adb 356 if ((fl = checkPad(ctx, ctx->lastBlock)) >= 0) {
wolfSSL 12:1a06964c2adb 357 XMEMCPY(out, ctx->lastBlock, fl);
wolfSSL 12:1a06964c2adb 358 *outl = fl;
wolfSSL 12:1a06964c2adb 359 } else return 0;
wolfSSL 12:1a06964c2adb 360 }
wolfSSL 12:1a06964c2adb 361 }
wolfSSL 12:1a06964c2adb 362 return 1;
wolfSSL 12:1a06964c2adb 363 }
wolfSSL 12:1a06964c2adb 364
wolfSSL 12:1a06964c2adb 365 WOLFSSL_API int wolfSSL_EVP_CIPHER_CTX_block_size(const WOLFSSL_EVP_CIPHER_CTX *ctx)
wolfSSL 12:1a06964c2adb 366 {
wolfSSL 12:1a06964c2adb 367 if (ctx == NULL) return BAD_FUNC_ARG;
wolfSSL 12:1a06964c2adb 368 switch (ctx->cipherType) {
wolfSSL 12:1a06964c2adb 369
wolfSSL 12:1a06964c2adb 370 #if !defined(NO_AES) && defined(HAVE_AES_CBC)
wolfSSL 12:1a06964c2adb 371 case AES_128_CBC_TYPE:
wolfSSL 12:1a06964c2adb 372 case AES_192_CBC_TYPE:
wolfSSL 12:1a06964c2adb 373 case AES_256_CBC_TYPE:
wolfSSL 12:1a06964c2adb 374 #endif
wolfSSL 12:1a06964c2adb 375 #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
wolfSSL 12:1a06964c2adb 376 case AES_128_CTR_TYPE:
wolfSSL 12:1a06964c2adb 377 case AES_192_CTR_TYPE:
wolfSSL 12:1a06964c2adb 378 case AES_256_CTR_TYPE:
wolfSSL 12:1a06964c2adb 379 #endif
wolfSSL 12:1a06964c2adb 380 #if !defined(NO_AES)
wolfSSL 12:1a06964c2adb 381 case AES_128_ECB_TYPE:
wolfSSL 12:1a06964c2adb 382 case AES_192_ECB_TYPE:
wolfSSL 12:1a06964c2adb 383 case AES_256_ECB_TYPE:
wolfSSL 12:1a06964c2adb 384 #endif
wolfSSL 12:1a06964c2adb 385 #ifndef NO_DES3
wolfSSL 12:1a06964c2adb 386 case DES_CBC_TYPE:
wolfSSL 12:1a06964c2adb 387 case DES_ECB_TYPE:
wolfSSL 12:1a06964c2adb 388 case DES_EDE3_CBC_TYPE:
wolfSSL 12:1a06964c2adb 389 case DES_EDE3_ECB_TYPE:
wolfSSL 12:1a06964c2adb 390 #endif
wolfSSL 12:1a06964c2adb 391 return ctx->block_size;
wolfSSL 12:1a06964c2adb 392 default:
wolfSSL 12:1a06964c2adb 393 return 0;
wolfSSL 12:1a06964c2adb 394 }
wolfSSL 12:1a06964c2adb 395 }
wolfSSL 12:1a06964c2adb 396
wolfSSL 12:1a06964c2adb 397 static unsigned int cipherType(const WOLFSSL_EVP_CIPHER *cipher)
wolfSSL 12:1a06964c2adb 398 {
wolfSSL 12:1a06964c2adb 399 if (cipher == NULL) return 0; /* dummy for #ifdef */
wolfSSL 12:1a06964c2adb 400 #ifndef NO_DES3
wolfSSL 12:1a06964c2adb 401 else if (XSTRNCMP(cipher, EVP_DES_CBC, EVP_DES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 402 return DES_CBC_TYPE;
wolfSSL 12:1a06964c2adb 403 else if (XSTRNCMP(cipher, EVP_DES_EDE3_CBC, EVP_DES_EDE3_SIZE) == 0)
wolfSSL 12:1a06964c2adb 404 return DES_EDE3_CBC_TYPE;
wolfSSL 12:1a06964c2adb 405 #if !defined(NO_DES3)
wolfSSL 12:1a06964c2adb 406 else if (XSTRNCMP(cipher, EVP_DES_ECB, EVP_DES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 407 return DES_ECB_TYPE;
wolfSSL 12:1a06964c2adb 408 else if (XSTRNCMP(cipher, EVP_DES_EDE3_ECB, EVP_DES_EDE3_SIZE) == 0)
wolfSSL 12:1a06964c2adb 409 return DES_EDE3_ECB_TYPE;
wolfSSL 12:1a06964c2adb 410 #endif /* NO_DES3 && HAVE_AES_ECB */
wolfSSL 12:1a06964c2adb 411 #endif
wolfSSL 12:1a06964c2adb 412
wolfSSL 12:1a06964c2adb 413 #if !defined(NO_AES) && defined(HAVE_AES_CBC)
wolfSSL 12:1a06964c2adb 414 else if (XSTRNCMP(cipher, EVP_AES_128_CBC, EVP_AES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 415 return AES_128_CBC_TYPE;
wolfSSL 12:1a06964c2adb 416 else if (XSTRNCMP(cipher, EVP_AES_192_CBC, EVP_AES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 417 return AES_192_CBC_TYPE;
wolfSSL 12:1a06964c2adb 418 else if (XSTRNCMP(cipher, EVP_AES_256_CBC, EVP_AES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 419 return AES_256_CBC_TYPE;
wolfSSL 12:1a06964c2adb 420 #endif /* !NO_AES && HAVE_AES_CBC */
wolfSSL 12:1a06964c2adb 421 #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
wolfSSL 12:1a06964c2adb 422 else if (XSTRNCMP(cipher, EVP_AES_128_CTR, EVP_AES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 423 return AES_128_CTR_TYPE;
wolfSSL 12:1a06964c2adb 424 else if (XSTRNCMP(cipher, EVP_AES_192_CTR, EVP_AES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 425 return AES_192_CTR_TYPE;
wolfSSL 12:1a06964c2adb 426 else if (XSTRNCMP(cipher, EVP_AES_256_CTR, EVP_AES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 427 return AES_256_CTR_TYPE;
wolfSSL 12:1a06964c2adb 428 #endif /* !NO_AES && HAVE_AES_CBC */
wolfSSL 12:1a06964c2adb 429 #if !defined(NO_AES) && defined(HAVE_AES_ECB)
wolfSSL 12:1a06964c2adb 430 else if (XSTRNCMP(cipher, EVP_AES_128_ECB, EVP_AES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 431 return AES_128_ECB_TYPE;
wolfSSL 12:1a06964c2adb 432 else if (XSTRNCMP(cipher, EVP_AES_192_ECB, EVP_AES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 433 return AES_192_ECB_TYPE;
wolfSSL 12:1a06964c2adb 434 else if (XSTRNCMP(cipher, EVP_AES_256_ECB, EVP_AES_SIZE) == 0)
wolfSSL 12:1a06964c2adb 435 return AES_256_ECB_TYPE;
wolfSSL 12:1a06964c2adb 436 #endif /* !NO_AES && HAVE_AES_CBC */
wolfSSL 12:1a06964c2adb 437 else return 0;
wolfSSL 12:1a06964c2adb 438 }
wolfSSL 12:1a06964c2adb 439
wolfSSL 12:1a06964c2adb 440 WOLFSSL_API int wolfSSL_EVP_CIPHER_block_size(const WOLFSSL_EVP_CIPHER *cipher)
wolfSSL 12:1a06964c2adb 441 {
wolfSSL 12:1a06964c2adb 442 if (cipher == NULL) return BAD_FUNC_ARG;
wolfSSL 12:1a06964c2adb 443 switch (cipherType(cipher)) {
wolfSSL 12:1a06964c2adb 444 #if !defined(NO_AES) && defined(HAVE_AES_CBC)
wolfSSL 12:1a06964c2adb 445 case AES_128_CBC_TYPE:
wolfSSL 12:1a06964c2adb 446 case AES_192_CBC_TYPE:
wolfSSL 12:1a06964c2adb 447 case AES_256_CBC_TYPE:
wolfSSL 12:1a06964c2adb 448 return AES_BLOCK_SIZE;
wolfSSL 12:1a06964c2adb 449 #endif
wolfSSL 12:1a06964c2adb 450 #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
wolfSSL 12:1a06964c2adb 451 case AES_128_CTR_TYPE:
wolfSSL 12:1a06964c2adb 452 case AES_192_CTR_TYPE:
wolfSSL 12:1a06964c2adb 453 case AES_256_CTR_TYPE:
wolfSSL 12:1a06964c2adb 454 return AES_BLOCK_SIZE;
wolfSSL 12:1a06964c2adb 455 #endif
wolfSSL 12:1a06964c2adb 456 #if !defined(NO_AES) && defined(HAVE_AES_ECB)
wolfSSL 12:1a06964c2adb 457 case AES_128_ECB_TYPE:
wolfSSL 12:1a06964c2adb 458 case AES_192_ECB_TYPE:
wolfSSL 12:1a06964c2adb 459 case AES_256_ECB_TYPE:
wolfSSL 12:1a06964c2adb 460 return AES_BLOCK_SIZE;
wolfSSL 12:1a06964c2adb 461 #endif
wolfSSL 12:1a06964c2adb 462 #ifndef NO_DES3
wolfSSL 12:1a06964c2adb 463 case DES_CBC_TYPE: return 8;
wolfSSL 12:1a06964c2adb 464 case DES_EDE3_CBC_TYPE: return 8;
wolfSSL 12:1a06964c2adb 465 case DES_ECB_TYPE: return 8;
wolfSSL 12:1a06964c2adb 466 case DES_EDE3_ECB_TYPE: return 8;
wolfSSL 12:1a06964c2adb 467 #endif
wolfSSL 12:1a06964c2adb 468 default:
wolfSSL 12:1a06964c2adb 469 return 0;
wolfSSL 12:1a06964c2adb 470 }
wolfSSL 12:1a06964c2adb 471 }
wolfSSL 12:1a06964c2adb 472
wolfSSL 12:1a06964c2adb 473 unsigned long WOLFSSL_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher)
wolfSSL 12:1a06964c2adb 474 {
wolfSSL 12:1a06964c2adb 475 switch (cipherType(cipher)) {
wolfSSL 12:1a06964c2adb 476 #if !defined(NO_AES) && defined(HAVE_AES_CBC)
wolfSSL 12:1a06964c2adb 477 case AES_128_CBC_TYPE:
wolfSSL 12:1a06964c2adb 478 case AES_192_CBC_TYPE:
wolfSSL 12:1a06964c2adb 479 case AES_256_CBC_TYPE:
wolfSSL 12:1a06964c2adb 480 return WOLFSSL_EVP_CIPH_CBC_MODE ;
wolfSSL 12:1a06964c2adb 481 #endif
wolfSSL 12:1a06964c2adb 482 #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
wolfSSL 12:1a06964c2adb 483 case AES_128_CTR_TYPE:
wolfSSL 12:1a06964c2adb 484 case AES_192_CTR_TYPE:
wolfSSL 12:1a06964c2adb 485 case AES_256_CTR_TYPE:
wolfSSL 12:1a06964c2adb 486 return WOLFSSL_EVP_CIPH_CTR_MODE ;
wolfSSL 12:1a06964c2adb 487 #endif
wolfSSL 12:1a06964c2adb 488 #if !defined(NO_AES)
wolfSSL 12:1a06964c2adb 489 case AES_128_ECB_TYPE:
wolfSSL 12:1a06964c2adb 490 case AES_192_ECB_TYPE:
wolfSSL 12:1a06964c2adb 491 case AES_256_ECB_TYPE:
wolfSSL 12:1a06964c2adb 492 return WOLFSSL_EVP_CIPH_ECB_MODE ;
wolfSSL 12:1a06964c2adb 493 #endif
wolfSSL 12:1a06964c2adb 494 #ifndef NO_DES3
wolfSSL 12:1a06964c2adb 495 case DES_CBC_TYPE:
wolfSSL 12:1a06964c2adb 496 case DES_EDE3_CBC_TYPE:
wolfSSL 12:1a06964c2adb 497 return WOLFSSL_EVP_CIPH_CBC_MODE ;
wolfSSL 12:1a06964c2adb 498 case DES_ECB_TYPE:
wolfSSL 12:1a06964c2adb 499 case DES_EDE3_ECB_TYPE:
wolfSSL 12:1a06964c2adb 500 return WOLFSSL_EVP_CIPH_ECB_MODE ;
wolfSSL 12:1a06964c2adb 501 #endif
wolfSSL 12:1a06964c2adb 502 default:
wolfSSL 12:1a06964c2adb 503 return 0;
wolfSSL 12:1a06964c2adb 504 }
wolfSSL 12:1a06964c2adb 505 }
wolfSSL 12:1a06964c2adb 506
wolfSSL 12:1a06964c2adb 507 WOLFSSL_API unsigned long WOLFSSL_EVP_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher)
wolfSSL 12:1a06964c2adb 508 {
wolfSSL 12:1a06964c2adb 509 if (cipher == NULL) return 0;
wolfSSL 12:1a06964c2adb 510 return WOLFSSL_CIPHER_mode(cipher);
wolfSSL 12:1a06964c2adb 511 }
wolfSSL 12:1a06964c2adb 512
wolfSSL 12:1a06964c2adb 513 WOLFSSL_API void wolfSSL_EVP_CIPHER_CTX_set_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags)
wolfSSL 12:1a06964c2adb 514 {
wolfSSL 12:1a06964c2adb 515 if (ctx != NULL) {
wolfSSL 12:1a06964c2adb 516 ctx->flags = flags;
wolfSSL 12:1a06964c2adb 517 }
wolfSSL 12:1a06964c2adb 518 }
wolfSSL 12:1a06964c2adb 519
wolfSSL 12:1a06964c2adb 520 WOLFSSL_API unsigned long wolfSSL_EVP_CIPHER_flags(const WOLFSSL_EVP_CIPHER *cipher)
wolfSSL 12:1a06964c2adb 521 {
wolfSSL 12:1a06964c2adb 522 if (cipher == NULL) return 0;
wolfSSL 12:1a06964c2adb 523 return WOLFSSL_CIPHER_mode(cipher);
wolfSSL 12:1a06964c2adb 524 }
wolfSSL 12:1a06964c2adb 525
wolfSSL 12:1a06964c2adb 526 WOLFSSL_API int wolfSSL_EVP_CIPHER_CTX_set_padding(WOLFSSL_EVP_CIPHER_CTX *ctx, int padding)
wolfSSL 12:1a06964c2adb 527 {
wolfSSL 12:1a06964c2adb 528 if (ctx == NULL) return BAD_FUNC_ARG;
wolfSSL 12:1a06964c2adb 529 if (padding) {
wolfSSL 12:1a06964c2adb 530 ctx->flags &= ~WOLFSSL_EVP_CIPH_NO_PADDING;
wolfSSL 12:1a06964c2adb 531 }
wolfSSL 12:1a06964c2adb 532 else {
wolfSSL 12:1a06964c2adb 533 ctx->flags |= WOLFSSL_EVP_CIPH_NO_PADDING;
wolfSSL 12:1a06964c2adb 534 }
wolfSSL 12:1a06964c2adb 535 return 1;
wolfSSL 12:1a06964c2adb 536 }
wolfSSL 12:1a06964c2adb 537
wolfSSL 12:1a06964c2adb 538 WOLFSSL_API int wolfSSL_EVP_add_digest(const WOLFSSL_EVP_MD *digest)
wolfSSL 12:1a06964c2adb 539 {
wolfSSL 12:1a06964c2adb 540 (void)digest;
wolfSSL 12:1a06964c2adb 541 /* nothing to do */
wolfSSL 12:1a06964c2adb 542 return 0;
wolfSSL 12:1a06964c2adb 543 }
wolfSSL 12:1a06964c2adb 544 #endif /* WOLFSSL_EVP_INCLUDED */
wolfSSL 12:1a06964c2adb 545
wolfSSL 12:1a06964c2adb 546