Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
wolfcrypt/src/evp.c@12:1a06964c2adb, 2017-08-22 (annotated)
- Committer:
- wolfSSL
- Date:
- Tue Aug 22 10:47:28 2017 +0000
- Revision:
- 12:1a06964c2adb
wolfSSL 3.12.0
Who changed what in which revision?
User | Revision | Line number | New 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 |