evp_locl.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. /* evp_locl.h */
  2. /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
  3. * project 2000.
  4. */
  5. /* ====================================================================
  6. * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions
  10. * are met:
  11. *
  12. * 1. Redistributions of source code must retain the above copyright
  13. * notice, this list of conditions and the following disclaimer.
  14. *
  15. * 2. Redistributions in binary form must reproduce the above copyright
  16. * notice, this list of conditions and the following disclaimer in
  17. * the documentation and/or other materials provided with the
  18. * distribution.
  19. *
  20. * 3. All advertising materials mentioning features or use of this
  21. * software must display the following acknowledgment:
  22. * "This product includes software developed by the OpenSSL Project
  23. * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
  24. *
  25. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  26. * endorse or promote products derived from this software without
  27. * prior written permission. For written permission, please contact
  28. * licensing@OpenSSL.org.
  29. *
  30. * 5. Products derived from this software may not be called "OpenSSL"
  31. * nor may "OpenSSL" appear in their names without prior written
  32. * permission of the OpenSSL Project.
  33. *
  34. * 6. Redistributions of any form whatsoever must retain the following
  35. * acknowledgment:
  36. * "This product includes software developed by the OpenSSL Project
  37. * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
  38. *
  39. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  40. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  41. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  42. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  43. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  44. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  45. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  46. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  48. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  49. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  50. * OF THE POSSIBILITY OF SUCH DAMAGE.
  51. * ====================================================================
  52. *
  53. * This product includes cryptographic software written by Eric Young
  54. * (eay@cryptsoft.com). This product includes software written by Tim
  55. * Hudson (tjh@cryptsoft.com).
  56. *
  57. */
  58. /* Macros to code block cipher wrappers */
  59. /* Wrapper functions for each cipher mode */
  60. #define BLOCK_CIPHER_ecb_loop() \
  61. size_t i, bl; \
  62. bl = ctx->cipher->block_size;\
  63. if(inl < bl) return 1;\
  64. inl -= bl; \
  65. for(i=0; i <= inl; i+=bl)
  66. #define BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \
  67. static int cname##_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \
  68. {\
  69. BLOCK_CIPHER_ecb_loop() \
  70. cprefix##_ecb_encrypt(in + i, out + i, &((kstruct *)ctx->cipher_data)->ksched, ctx->encrypt);\
  71. return 1;\
  72. }
  73. #define EVP_MAXCHUNK ((size_t)1<<(sizeof(long)*8-2))
  74. #define BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched) \
  75. static int cname##_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \
  76. {\
  77. while(inl>=EVP_MAXCHUNK)\
  78. {\
  79. cprefix##_ofb##cbits##_encrypt(in, out, (long)EVP_MAXCHUNK, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num);\
  80. inl-=EVP_MAXCHUNK;\
  81. in +=EVP_MAXCHUNK;\
  82. out+=EVP_MAXCHUNK;\
  83. }\
  84. if (inl)\
  85. cprefix##_ofb##cbits##_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num);\
  86. return 1;\
  87. }
  88. #define BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \
  89. static int cname##_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \
  90. {\
  91. while(inl>=EVP_MAXCHUNK) \
  92. {\
  93. cprefix##_cbc_encrypt(in, out, (long)EVP_MAXCHUNK, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, ctx->encrypt);\
  94. inl-=EVP_MAXCHUNK;\
  95. in +=EVP_MAXCHUNK;\
  96. out+=EVP_MAXCHUNK;\
  97. }\
  98. if (inl)\
  99. cprefix##_cbc_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, ctx->encrypt);\
  100. return 1;\
  101. }
  102. #define BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \
  103. static int cname##_cfb##cbits##_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \
  104. {\
  105. size_t chunk=EVP_MAXCHUNK;\
  106. if (cbits==1) chunk>>=3;\
  107. if (inl<chunk) chunk=inl;\
  108. while(inl && inl>=chunk)\
  109. {\
  110. cprefix##_cfb##cbits##_encrypt(in, out, (long)((cbits==1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ?inl*8:inl), &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num, ctx->encrypt);\
  111. inl-=chunk;\
  112. in +=chunk;\
  113. out+=chunk;\
  114. if(inl<chunk) chunk=inl;\
  115. }\
  116. return 1;\
  117. }
  118. #define BLOCK_CIPHER_all_funcs(cname, cprefix, cbits, kstruct, ksched) \
  119. BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \
  120. BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \
  121. BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \
  122. BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched)
  123. #define BLOCK_CIPHER_def1(cname, nmode, mode, MODE, kstruct, nid, block_size, \
  124. key_len, iv_len, flags, init_key, cleanup, \
  125. set_asn1, get_asn1, ctrl) \
  126. static const EVP_CIPHER cname##_##mode = { \
  127. nid##_##nmode, block_size, key_len, iv_len, \
  128. flags | EVP_CIPH_##MODE##_MODE, \
  129. init_key, \
  130. cname##_##mode##_cipher, \
  131. cleanup, \
  132. sizeof(kstruct), \
  133. set_asn1, get_asn1,\
  134. ctrl, \
  135. NULL \
  136. }; \
  137. const EVP_CIPHER *EVP_##cname##_##mode(void) { return &cname##_##mode; }
  138. #define BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, \
  139. iv_len, flags, init_key, cleanup, set_asn1, \
  140. get_asn1, ctrl) \
  141. BLOCK_CIPHER_def1(cname, cbc, cbc, CBC, kstruct, nid, block_size, key_len, \
  142. iv_len, flags, init_key, cleanup, set_asn1, get_asn1, ctrl)
  143. #define BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, \
  144. iv_len, cbits, flags, init_key, cleanup, \
  145. set_asn1, get_asn1, ctrl) \
  146. BLOCK_CIPHER_def1(cname, cfb##cbits, cfb##cbits, CFB, kstruct, nid, 1, \
  147. key_len, iv_len, flags, init_key, cleanup, set_asn1, \
  148. get_asn1, ctrl)
  149. #define BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, \
  150. iv_len, cbits, flags, init_key, cleanup, \
  151. set_asn1, get_asn1, ctrl) \
  152. BLOCK_CIPHER_def1(cname, ofb##cbits, ofb, OFB, kstruct, nid, 1, \
  153. key_len, iv_len, flags, init_key, cleanup, set_asn1, \
  154. get_asn1, ctrl)
  155. #define BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, \
  156. flags, init_key, cleanup, set_asn1, \
  157. get_asn1, ctrl) \
  158. BLOCK_CIPHER_def1(cname, ecb, ecb, ECB, kstruct, nid, block_size, key_len, \
  159. 0, flags, init_key, cleanup, set_asn1, get_asn1, ctrl)
  160. #define BLOCK_CIPHER_defs(cname, kstruct, \
  161. nid, block_size, key_len, iv_len, cbits, flags, \
  162. init_key, cleanup, set_asn1, get_asn1, ctrl) \
  163. BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, iv_len, flags, \
  164. init_key, cleanup, set_asn1, get_asn1, ctrl) \
  165. BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, iv_len, cbits, \
  166. flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \
  167. BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, iv_len, cbits, \
  168. flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \
  169. BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, flags, \
  170. init_key, cleanup, set_asn1, get_asn1, ctrl)
  171. /*
  172. #define BLOCK_CIPHER_defs(cname, kstruct, \
  173. nid, block_size, key_len, iv_len, flags,\
  174. init_key, cleanup, set_asn1, get_asn1, ctrl)\
  175. static const EVP_CIPHER cname##_cbc = {\
  176. nid##_cbc, block_size, key_len, iv_len, \
  177. flags | EVP_CIPH_CBC_MODE,\
  178. init_key,\
  179. cname##_cbc_cipher,\
  180. cleanup,\
  181. sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
  182. sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
  183. set_asn1, get_asn1,\
  184. ctrl, \
  185. NULL \
  186. };\
  187. const EVP_CIPHER *EVP_##cname##_cbc(void) { return &cname##_cbc; }\
  188. static const EVP_CIPHER cname##_cfb = {\
  189. nid##_cfb64, 1, key_len, iv_len, \
  190. flags | EVP_CIPH_CFB_MODE,\
  191. init_key,\
  192. cname##_cfb_cipher,\
  193. cleanup,\
  194. sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
  195. sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
  196. set_asn1, get_asn1,\
  197. ctrl,\
  198. NULL \
  199. };\
  200. const EVP_CIPHER *EVP_##cname##_cfb(void) { return &cname##_cfb; }\
  201. static const EVP_CIPHER cname##_ofb = {\
  202. nid##_ofb64, 1, key_len, iv_len, \
  203. flags | EVP_CIPH_OFB_MODE,\
  204. init_key,\
  205. cname##_ofb_cipher,\
  206. cleanup,\
  207. sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
  208. sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
  209. set_asn1, get_asn1,\
  210. ctrl,\
  211. NULL \
  212. };\
  213. const EVP_CIPHER *EVP_##cname##_ofb(void) { return &cname##_ofb; }\
  214. static const EVP_CIPHER cname##_ecb = {\
  215. nid##_ecb, block_size, key_len, iv_len, \
  216. flags | EVP_CIPH_ECB_MODE,\
  217. init_key,\
  218. cname##_ecb_cipher,\
  219. cleanup,\
  220. sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
  221. sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
  222. set_asn1, get_asn1,\
  223. ctrl,\
  224. NULL \
  225. };\
  226. const EVP_CIPHER *EVP_##cname##_ecb(void) { return &cname##_ecb; }
  227. */
  228. #define IMPLEMENT_BLOCK_CIPHER(cname, ksched, cprefix, kstruct, nid, \
  229. block_size, key_len, iv_len, cbits, \
  230. flags, init_key, \
  231. cleanup, set_asn1, get_asn1, ctrl) \
  232. BLOCK_CIPHER_all_funcs(cname, cprefix, cbits, kstruct, ksched) \
  233. BLOCK_CIPHER_defs(cname, kstruct, nid, block_size, key_len, iv_len, \
  234. cbits, flags, init_key, cleanup, set_asn1, \
  235. get_asn1, ctrl)
  236. #define EVP_C_DATA(kstruct, ctx) ((kstruct *)(ctx)->cipher_data)
  237. #define IMPLEMENT_CFBR(cipher,cprefix,kstruct,ksched,keysize,cbits,iv_len,fl) \
  238. BLOCK_CIPHER_func_cfb(cipher##_##keysize,cprefix,cbits,kstruct,ksched) \
  239. BLOCK_CIPHER_def_cfb(cipher##_##keysize,kstruct, \
  240. NID_##cipher##_##keysize, keysize/8, iv_len, cbits, \
  241. (fl)|EVP_CIPH_FLAG_DEFAULT_ASN1, \
  242. cipher##_init_key, NULL, NULL, NULL, NULL)
  243. struct evp_pkey_ctx_st
  244. {
  245. /* Method associated with this operation */
  246. const EVP_PKEY_METHOD *pmeth;
  247. /* Engine that implements this method or NULL if builtin */
  248. ENGINE *engine;
  249. /* Key: may be NULL */
  250. EVP_PKEY *pkey;
  251. /* Peer key for key agreement, may be NULL */
  252. EVP_PKEY *peerkey;
  253. /* Actual operation */
  254. int operation;
  255. /* Algorithm specific data */
  256. void *data;
  257. /* Application specific data */
  258. void *app_data;
  259. /* Keygen callback */
  260. EVP_PKEY_gen_cb *pkey_gencb;
  261. /* implementation specific keygen data */
  262. int *keygen_info;
  263. int keygen_info_count;
  264. } /* EVP_PKEY_CTX */;
  265. #define EVP_PKEY_FLAG_DYNAMIC 1
  266. struct evp_pkey_method_st
  267. {
  268. int pkey_id;
  269. int flags;
  270. int (*init)(EVP_PKEY_CTX *ctx);
  271. int (*copy)(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src);
  272. void (*cleanup)(EVP_PKEY_CTX *ctx);
  273. int (*paramgen_init)(EVP_PKEY_CTX *ctx);
  274. int (*paramgen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey);
  275. int (*keygen_init)(EVP_PKEY_CTX *ctx);
  276. int (*keygen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey);
  277. int (*sign_init)(EVP_PKEY_CTX *ctx);
  278. int (*sign)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
  279. const unsigned char *tbs, size_t tbslen);
  280. int (*verify_init)(EVP_PKEY_CTX *ctx);
  281. int (*verify)(EVP_PKEY_CTX *ctx,
  282. const unsigned char *sig, size_t siglen,
  283. const unsigned char *tbs, size_t tbslen);
  284. int (*verify_recover_init)(EVP_PKEY_CTX *ctx);
  285. int (*verify_recover)(EVP_PKEY_CTX *ctx,
  286. unsigned char *rout, size_t *routlen,
  287. const unsigned char *sig, size_t siglen);
  288. int (*signctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx);
  289. int (*signctx)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
  290. EVP_MD_CTX *mctx);
  291. int (*verifyctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx);
  292. int (*verifyctx)(EVP_PKEY_CTX *ctx, const unsigned char *sig,int siglen,
  293. EVP_MD_CTX *mctx);
  294. int (*encrypt_init)(EVP_PKEY_CTX *ctx);
  295. int (*encrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
  296. const unsigned char *in, size_t inlen);
  297. int (*decrypt_init)(EVP_PKEY_CTX *ctx);
  298. int (*decrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
  299. const unsigned char *in, size_t inlen);
  300. int (*derive_init)(EVP_PKEY_CTX *ctx);
  301. int (*derive)(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen);
  302. int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2);
  303. int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value);
  304. } /* EVP_PKEY_METHOD */;
  305. void evp_pkey_set_cb_translate(BN_GENCB *cb, EVP_PKEY_CTX *ctx);
  306. int PKCS5_v2_PBKDF2_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
  307. ASN1_TYPE *param,
  308. const EVP_CIPHER *c, const EVP_MD *md, int en_de);