evp_enc.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. /* crypto/evp/evp_enc.c */
  2. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  3. * All rights reserved.
  4. *
  5. * This package is an SSL implementation written
  6. * by Eric Young (eay@cryptsoft.com).
  7. * The implementation was written so as to conform with Netscapes SSL.
  8. *
  9. * This library is free for commercial and non-commercial use as long as
  10. * the following conditions are aheared to. The following conditions
  11. * apply to all code found in this distribution, be it the RC4, RSA,
  12. * lhash, DES, etc., code; not just the SSL code. The SSL documentation
  13. * included with this distribution is covered by the same copyright terms
  14. * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  15. *
  16. * Copyright remains Eric Young's, and as such any Copyright notices in
  17. * the code are not to be removed.
  18. * If this package is used in a product, Eric Young should be given attribution
  19. * as the author of the parts of the library used.
  20. * This can be in the form of a textual message at program startup or
  21. * in documentation (online or textual) provided with the package.
  22. *
  23. * Redistribution and use in source and binary forms, with or without
  24. * modification, are permitted provided that the following conditions
  25. * are met:
  26. * 1. Redistributions of source code must retain the copyright
  27. * notice, this list of conditions and the following disclaimer.
  28. * 2. Redistributions in binary form must reproduce the above copyright
  29. * notice, this list of conditions and the following disclaimer in the
  30. * documentation and/or other materials provided with the distribution.
  31. * 3. All advertising materials mentioning features or use of this software
  32. * must display the following acknowledgement:
  33. * "This product includes cryptographic software written by
  34. * Eric Young (eay@cryptsoft.com)"
  35. * The word 'cryptographic' can be left out if the rouines from the library
  36. * being used are not cryptographic related :-).
  37. * 4. If you include any Windows specific code (or a derivative thereof) from
  38. * the apps directory (application code) you must include an acknowledgement:
  39. * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  40. *
  41. * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  42. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  43. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  44. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  45. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  46. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  47. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  48. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  49. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  50. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  51. * SUCH DAMAGE.
  52. *
  53. * The licence and distribution terms for any publically available version or
  54. * derivative of this code cannot be changed. i.e. this code cannot simply be
  55. * copied and put under another distribution licence
  56. * [including the GNU Public Licence.]
  57. */
  58. #include <stdio.h>
  59. #include "cryptlib.h"
  60. #include <openssl/evp.h>
  61. #include <openssl/err.h>
  62. #include <openssl/rand.h>
  63. #ifndef OPENSSL_NO_ENGINE
  64. #include <openssl/engine.h>
  65. #endif
  66. #include "evp_locl.h"
  67. #ifdef OPENSSL_FIPS
  68. #define M_do_cipher(ctx, out, in, inl) \
  69. EVP_Cipher(ctx,out,in,inl)
  70. #else
  71. #define M_do_cipher(ctx, out, in, inl) \
  72. ctx->cipher->do_cipher(ctx,out,in,inl)
  73. #endif
  74. const char EVP_version[]="EVP" OPENSSL_VERSION_PTEXT;
  75. EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void)
  76. {
  77. EVP_CIPHER_CTX *ctx=OPENSSL_malloc(sizeof *ctx);
  78. if (ctx)
  79. EVP_CIPHER_CTX_init(ctx);
  80. return ctx;
  81. }
  82. int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
  83. const unsigned char *key, const unsigned char *iv, int enc)
  84. {
  85. if (cipher)
  86. EVP_CIPHER_CTX_init(ctx);
  87. return EVP_CipherInit_ex(ctx,cipher,NULL,key,iv,enc);
  88. }
  89. int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
  90. const unsigned char *in, int inl)
  91. {
  92. if (ctx->encrypt)
  93. return EVP_EncryptUpdate(ctx,out,outl,in,inl);
  94. else return EVP_DecryptUpdate(ctx,out,outl,in,inl);
  95. }
  96. int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
  97. {
  98. if (ctx->encrypt)
  99. return EVP_EncryptFinal_ex(ctx,out,outl);
  100. else return EVP_DecryptFinal_ex(ctx,out,outl);
  101. }
  102. int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
  103. {
  104. if (ctx->encrypt)
  105. return EVP_EncryptFinal(ctx,out,outl);
  106. else return EVP_DecryptFinal(ctx,out,outl);
  107. }
  108. int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
  109. const unsigned char *key, const unsigned char *iv)
  110. {
  111. return EVP_CipherInit(ctx, cipher, key, iv, 1);
  112. }
  113. int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl,
  114. const unsigned char *key, const unsigned char *iv)
  115. {
  116. return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 1);
  117. }
  118. int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
  119. const unsigned char *key, const unsigned char *iv)
  120. {
  121. return EVP_CipherInit(ctx, cipher, key, iv, 0);
  122. }
  123. int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl,
  124. const unsigned char *key, const unsigned char *iv)
  125. {
  126. return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 0);
  127. }
  128. int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
  129. const unsigned char *in, int inl)
  130. {
  131. int i,j,bl;
  132. OPENSSL_assert(inl > 0);
  133. if(ctx->buf_len == 0 && (inl&(ctx->block_mask)) == 0)
  134. {
  135. if(M_do_cipher(ctx,out,in,inl))
  136. {
  137. *outl=inl;
  138. return 1;
  139. }
  140. else
  141. {
  142. *outl=0;
  143. return 0;
  144. }
  145. }
  146. i=ctx->buf_len;
  147. bl=ctx->cipher->block_size;
  148. OPENSSL_assert(bl <= (int)sizeof(ctx->buf));
  149. if (i != 0)
  150. {
  151. if (i+inl < bl)
  152. {
  153. memcpy(&(ctx->buf[i]),in,inl);
  154. ctx->buf_len+=inl;
  155. *outl=0;
  156. return 1;
  157. }
  158. else
  159. {
  160. j=bl-i;
  161. memcpy(&(ctx->buf[i]),in,j);
  162. if(!M_do_cipher(ctx,out,ctx->buf,bl)) return 0;
  163. inl-=j;
  164. in+=j;
  165. out+=bl;
  166. *outl=bl;
  167. }
  168. }
  169. else
  170. *outl = 0;
  171. i=inl&(bl-1);
  172. inl-=i;
  173. if (inl > 0)
  174. {
  175. if(!M_do_cipher(ctx,out,in,inl)) return 0;
  176. *outl+=inl;
  177. }
  178. if (i != 0)
  179. memcpy(ctx->buf,&(in[inl]),i);
  180. ctx->buf_len=i;
  181. return 1;
  182. }
  183. int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
  184. {
  185. int ret;
  186. ret = EVP_EncryptFinal_ex(ctx, out, outl);
  187. return ret;
  188. }
  189. int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
  190. {
  191. int n,ret;
  192. unsigned int i, b, bl;
  193. b=ctx->cipher->block_size;
  194. OPENSSL_assert(b <= sizeof ctx->buf);
  195. if (b == 1)
  196. {
  197. *outl=0;
  198. return 1;
  199. }
  200. bl=ctx->buf_len;
  201. if (ctx->flags & EVP_CIPH_NO_PADDING)
  202. {
  203. if(bl)
  204. {
  205. EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
  206. return 0;
  207. }
  208. *outl = 0;
  209. return 1;
  210. }
  211. n=b-bl;
  212. for (i=bl; i<b; i++)
  213. ctx->buf[i]=n;
  214. ret=M_do_cipher(ctx,out,ctx->buf,b);
  215. if(ret)
  216. *outl=b;
  217. return ret;
  218. }
  219. int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
  220. const unsigned char *in, int inl)
  221. {
  222. int fix_len;
  223. unsigned int b;
  224. if (inl == 0)
  225. {
  226. *outl=0;
  227. return 1;
  228. }
  229. if (ctx->flags & EVP_CIPH_NO_PADDING)
  230. return EVP_EncryptUpdate(ctx, out, outl, in, inl);
  231. b=ctx->cipher->block_size;
  232. OPENSSL_assert(b <= sizeof ctx->final);
  233. if(ctx->final_used)
  234. {
  235. memcpy(out,ctx->final,b);
  236. out+=b;
  237. fix_len = 1;
  238. }
  239. else
  240. fix_len = 0;
  241. if(!EVP_EncryptUpdate(ctx,out,outl,in,inl))
  242. return 0;
  243. /* if we have 'decrypted' a multiple of block size, make sure
  244. * we have a copy of this last block */
  245. if (b > 1 && !ctx->buf_len)
  246. {
  247. *outl-=b;
  248. ctx->final_used=1;
  249. memcpy(ctx->final,&out[*outl],b);
  250. }
  251. else
  252. ctx->final_used = 0;
  253. if (fix_len)
  254. *outl += b;
  255. return 1;
  256. }
  257. int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
  258. {
  259. int ret;
  260. ret = EVP_DecryptFinal_ex(ctx, out, outl);
  261. return ret;
  262. }
  263. int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
  264. {
  265. int i,n;
  266. unsigned int b;
  267. *outl=0;
  268. b=ctx->cipher->block_size;
  269. if (ctx->flags & EVP_CIPH_NO_PADDING)
  270. {
  271. if(ctx->buf_len)
  272. {
  273. EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
  274. return 0;
  275. }
  276. *outl = 0;
  277. return 1;
  278. }
  279. if (b > 1)
  280. {
  281. if (ctx->buf_len || !ctx->final_used)
  282. {
  283. EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_WRONG_FINAL_BLOCK_LENGTH);
  284. return(0);
  285. }
  286. OPENSSL_assert(b <= sizeof ctx->final);
  287. n=ctx->final[b-1];
  288. if (n == 0 || n > (int)b)
  289. {
  290. EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
  291. return(0);
  292. }
  293. for (i=0; i<n; i++)
  294. {
  295. if (ctx->final[--b] != n)
  296. {
  297. EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
  298. return(0);
  299. }
  300. }
  301. n=ctx->cipher->block_size-n;
  302. for (i=0; i<n; i++)
  303. out[i]=ctx->final[i];
  304. *outl=n;
  305. }
  306. else
  307. *outl=0;
  308. return(1);
  309. }
  310. void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
  311. {
  312. if (ctx)
  313. {
  314. EVP_CIPHER_CTX_cleanup(ctx);
  315. OPENSSL_free(ctx);
  316. }
  317. }
  318. int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen)
  319. {
  320. if(c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH)
  321. return EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_KEY_LENGTH, keylen, NULL);
  322. if(c->key_len == keylen) return 1;
  323. if((keylen > 0) && (c->cipher->flags & EVP_CIPH_VARIABLE_LENGTH))
  324. {
  325. c->key_len = keylen;
  326. return 1;
  327. }
  328. EVPerr(EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH,EVP_R_INVALID_KEY_LENGTH);
  329. return 0;
  330. }
  331. int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
  332. {
  333. if (pad) ctx->flags &= ~EVP_CIPH_NO_PADDING;
  334. else ctx->flags |= EVP_CIPH_NO_PADDING;
  335. return 1;
  336. }
  337. int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key)
  338. {
  339. if (ctx->cipher->flags & EVP_CIPH_RAND_KEY)
  340. return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key);
  341. if (RAND_bytes(key, ctx->key_len) <= 0)
  342. return 0;
  343. return 1;
  344. }
  345. #ifndef OPENSSL_NO_ENGINE
  346. #ifdef OPENSSL_FIPS
  347. static int do_evp_enc_engine_full(EVP_CIPHER_CTX *ctx, const EVP_CIPHER **pcipher, ENGINE *impl)
  348. {
  349. if(impl)
  350. {
  351. if (!ENGINE_init(impl))
  352. {
  353. EVPerr(EVP_F_DO_EVP_ENC_ENGINE_FULL, EVP_R_INITIALIZATION_ERROR);
  354. return 0;
  355. }
  356. }
  357. else
  358. /* Ask if an ENGINE is reserved for this job */
  359. impl = ENGINE_get_cipher_engine((*pcipher)->nid);
  360. if(impl)
  361. {
  362. /* There's an ENGINE for this job ... (apparently) */
  363. const EVP_CIPHER *c = ENGINE_get_cipher(impl, (*pcipher)->nid);
  364. if(!c)
  365. {
  366. /* One positive side-effect of US's export
  367. * control history, is that we should at least
  368. * be able to avoid using US mispellings of
  369. * "initialisation"? */
  370. EVPerr(EVP_F_DO_EVP_ENC_ENGINE_FULL, EVP_R_INITIALIZATION_ERROR);
  371. return 0;
  372. }
  373. /* We'll use the ENGINE's private cipher definition */
  374. *pcipher = c;
  375. /* Store the ENGINE functional reference so we know
  376. * 'cipher' came from an ENGINE and we need to release
  377. * it when done. */
  378. ctx->engine = impl;
  379. }
  380. else
  381. ctx->engine = NULL;
  382. return 1;
  383. }
  384. void int_EVP_CIPHER_init_engine_callbacks(void)
  385. {
  386. int_EVP_CIPHER_set_engine_callbacks(
  387. ENGINE_finish, do_evp_enc_engine_full);
  388. }
  389. #endif
  390. #endif