9 #include <krb5-types.h>
20 typedef int (*evp_md_init)(EVP_MD_CTX *);
21 typedef int (*evp_md_update)(EVP_MD_CTX *,const void *, size_t);
22 typedef int (*evp_md_final)(void *, EVP_MD_CTX *);
23 typedef int (*evp_md_cleanup)(EVP_MD_CTX *);
32 evp_md_cleanup cleanup;
40 EVP_MD_size(const EVP_MD *md)
46 EVP_MD_block_size(const EVP_MD *md)
48 return md->block_size;
52 EVP_MD_CTX_create(void)
54 return calloc(1, sizeof(EVP_MD_CTX));
58 EVP_MD_CTX_init(EVP_MD_CTX *ctx)
60 memset(ctx, 0, sizeof(*ctx));
64 EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
66 EVP_MD_CTX_cleanup(ctx);
71 EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
73 if (ctx->md && ctx->md->cleanup)
74 (ctx->md->cleanup)(ctx);
83 EVP_MD_CTX_md(EVP_MD_CTX *ctx)
89 EVP_MD_CTX_size(EVP_MD_CTX *ctx)
91 return EVP_MD_size(ctx->md);
95 EVP_MD_CTX_block_size(EVP_MD_CTX *ctx)
97 return EVP_MD_block_size(ctx->md);
101 EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *md, ENGINE *engine)
103 if (ctx->md != md || ctx->engine != engine) {
104 EVP_MD_CTX_cleanup(ctx);
106 ctx->engine = engine;
108 ctx->ptr = calloc(1, md->ctx_size);
109 if (ctx->ptr == NULL)
112 (ctx->md->init)(ctx->ptr);
117 EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t size)
119 (ctx->md->update)(ctx->ptr, data, size);
124 EVP_DigestFinal_ex(EVP_MD_CTX *ctx, void *hash, unsigned int *size)
126 (ctx->md->final)(hash, ctx->ptr);
128 *size = ctx->md->hash_size;
133 EVP_Digest(const void *data, size_t dsize, void *hash, unsigned int *hsize,
134 const EVP_MD *md, ENGINE *engine)
139 ctx = EVP_MD_CTX_create();
142 ret = EVP_DigestInit_ex(ctx, md, engine);
145 ret = EVP_DigestUpdate(ctx, data, dsize);
148 ret = EVP_DigestFinal_ex(ctx, hash, hsize);
151 EVP_MD_CTX_destroy(ctx);
162 static const struct hc_evp_md sha256 = {
166 (evp_md_init)SHA256_Init,
167 (evp_md_update)SHA256_Update,
168 (evp_md_final)SHA256_Final,
174 static const struct hc_evp_md sha1 = {
178 (evp_md_init)SHA1_Init,
179 (evp_md_update)SHA1_Update,
180 (evp_md_final)SHA1_Final,
199 static const struct hc_evp_md md5 = {
203 (evp_md_init)MD5_Init,
204 (evp_md_update)MD5_Update,
205 (evp_md_final)MD5_Final,
214 static const struct hc_evp_md md4 = {
218 (evp_md_init)MD4_Init,
219 (evp_md_update)MD4_Update,
220 (evp_md_final)MD4_Final,
229 static const struct hc_evp_md md2 = {
233 (evp_md_init)MD2_Init,
234 (evp_md_update)MD2_Update,
235 (evp_md_final)MD2_Final,
250 null_Update (void *m, const void * data, size_t size)
254 null_Final(void *res, struct md5 *m)
261 static const struct hc_evp_md null = {
265 (evp_md_init)null_Init,
266 (evp_md_update)null_Update,
267 (evp_md_final)null_Final,
274 void EVP_MD_CTX_init(EVP_MD_CTX *ctx);
275 int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
276 int EVP_DigestFinal(EVP_MD_CTX *ctx,unsigned char *md,unsigned int *s);
277 int EVP_SignFinal(EVP_MD_CTX *, void *, size_t *, EVP_PKEY *);
278 int EVP_VerifyFinal(EVP_MD_CTX *, const void *, size_t, EVP_PKEY *);
286 EVP_CIPHER_block_size(const EVP_CIPHER *c)
288 return c->block_size;
292 EVP_CIPHER_key_length(const EVP_CIPHER *c)
298 EVP_CIPHER_iv_length(const EVP_CIPHER *c)
304 EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *c)
306 memset(c, 0, sizeof(*c));
310 EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c)
312 if (c->cipher && c->cipher->cleanup)
313 c->cipher->cleanup(c);
314 if (c->cipher_data) {
315 free(c->cipher_data);
316 c->cipher_data = NULL;
323 EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int length)
329 EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad)
336 EVP_CIPHER_CTX_cipher(EVP_CIPHER_CTX *ctx)
342 EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
344 return EVP_CIPHER_block_size(ctx->cipher);
348 EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
350 return EVP_CIPHER_key_length(ctx->cipher);
354 EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
356 return EVP_CIPHER_iv_length(ctx->cipher);
360 EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx)
362 return ctx->cipher->flags;
366 EVP_CIPHER_CTX_mode(const EVP_CIPHER_CTX *ctx)
368 return EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_MODE;
372 EVP_CIPHER_CTX_get_app_data(EVP_CIPHER_CTX *ctx)
374 return ctx->app_data;
378 EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data)
380 ctx->app_data = data;
384 EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *c, ENGINE *engine,
385 const void *key, const void *iv, int encp)
390 ctx->encrypt = (encp ? 1 : 0);
392 if (c && (c != ctx->cipher)) {
393 EVP_CIPHER_CTX_cleanup(ctx);
395 ctx->key_len = c->key_len;
397 ctx->cipher_data = malloc(c->ctx_size);
398 if (ctx->cipher_data == NULL && c->ctx_size != 0)
401 } else if (ctx->cipher == NULL) {
402 /* reuse of cipher, but not any cipher ever set! */
406 switch (EVP_CIPHER_CTX_flags(ctx)) {
407 case EVP_CIPH_CBC_MODE:
409 assert(EVP_CIPHER_CTX_iv_length(ctx) <= sizeof(ctx->iv));
412 memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
413 memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
419 if (key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT))
420 ctx->cipher->init(ctx, key, iv, encp);
426 EVP_Cipher(EVP_CIPHER_CTX *ctx, void *out, const void *in,size_t size)
428 return ctx->cipher->do_cipher(ctx, out, in, size);
436 enc_null_init(EVP_CIPHER_CTX *ctx,
437 const unsigned char * key,
438 const unsigned char * iv,
445 enc_null_do_cipher(EVP_CIPHER_CTX *ctx,
447 const unsigned char *in,
450 memmove(out, in, size);
455 enc_null_cleanup(EVP_CIPHER_CTX *ctx)
463 static const EVP_CIPHER enc_null = {
486 unsigned int maximum_effective_key;
491 rc2_init(EVP_CIPHER_CTX *ctx,
492 const unsigned char * key,
493 const unsigned char * iv,
496 struct rc2_cbc *k = ctx->cipher_data;
497 k->maximum_effective_key = EVP_CIPHER_CTX_key_length(ctx) * 8;
499 EVP_CIPHER_CTX_key_length(ctx),
501 k->maximum_effective_key);
506 rc2_do_cipher(EVP_CIPHER_CTX *ctx,
508 const unsigned char *in,
511 struct rc2_cbc *k = ctx->cipher_data;
512 RC2_cbc_encrypt(in, out, size, &k->key, ctx->iv, ctx->encrypt);
517 rc2_cleanup(EVP_CIPHER_CTX *ctx)
519 memset(ctx->cipher_data, 0, sizeof(struct rc2_cbc));
527 static const EVP_CIPHER rc2_cbc = {
536 sizeof(struct rc2_cbc),
548 static const EVP_CIPHER rc2_40_cbc = {
557 sizeof(struct rc2_cbc),
569 static const EVP_CIPHER rc2_64_cbc = {
578 sizeof(struct rc2_cbc),
602 printf("evp rc4_40\n");
611 struct des_ede3_cbc {
612 DES_key_schedule ks[3];
616 des_ede3_cbc_init(EVP_CIPHER_CTX *ctx,
617 const unsigned char * key,
618 const unsigned char * iv,
621 struct des_ede3_cbc *k = ctx->cipher_data;
623 DES_key_sched((DES_cblock *)(key), &k->ks[0]);
624 DES_key_sched((DES_cblock *)(key + 8), &k->ks[1]);
625 DES_key_sched((DES_cblock *)(key + 16), &k->ks[2]);
631 des_ede3_cbc_do_cipher(EVP_CIPHER_CTX *ctx,
633 const unsigned char *in,
636 struct des_ede3_cbc *k = ctx->cipher_data;
637 DES_ede3_cbc_encrypt(in, out, size,
638 &k->ks[0], &k->ks[1], &k->ks[2],
639 (DES_cblock *)ctx->iv, ctx->encrypt);
644 des_ede3_cbc_cleanup(EVP_CIPHER_CTX *ctx)
646 memset(ctx->cipher_data, 0, sizeof(struct des_ede3_cbc));
651 EVP_des_ede3_cbc(void)
653 static const EVP_CIPHER des_ede3_cbc = {
660 des_ede3_cbc_do_cipher,
661 des_ede3_cbc_cleanup,
662 sizeof(struct des_ede3_cbc),
668 return &des_ede3_cbc;
676 aes_init(EVP_CIPHER_CTX *ctx,
677 const unsigned char * key,
678 const unsigned char * iv,
681 AES_KEY *k = ctx->cipher_data;
683 AES_set_encrypt_key(key, ctx->cipher->key_len * 8, k);
685 AES_set_decrypt_key(key, ctx->cipher->key_len * 8, k);
690 aes_do_cipher(EVP_CIPHER_CTX *ctx,
692 const unsigned char *in,
695 AES_KEY *k = ctx->cipher_data;
696 AES_cbc_encrypt(in, out, size, k, ctx->iv, ctx->encrypt);
701 aes_cleanup(EVP_CIPHER_CTX *ctx)
703 memset(ctx->cipher_data, 0, sizeof(AES_KEY));
708 EVP_aes_128_cbc(void)
710 static const EVP_CIPHER aes_128_cbc = {
729 EVP_aes_192_cbc(void)
731 static const EVP_CIPHER aes_192_cbc = {
751 EVP_aes_256_cbc(void)
753 static const EVP_CIPHER aes_256_cbc = {
775 static const struct cipher_name {
777 const EVP_CIPHER *(*func)(void);
779 { "des-ede3-cbc", EVP_des_ede3_cbc },
780 { "aes-128-cbc", EVP_aes_128_cbc },
781 { "aes-192-cbc", EVP_aes_192_cbc },
782 { "aes-256-cbc", EVP_aes_256_cbc }
787 EVP_get_cipherbyname(const char *name)
790 for (i = 0; i < sizeof(cipher_name)/sizeof(cipher_name[0]); i++) {
791 if (strcasecmp(cipher_name[i].name, name) == 0)
792 return (*cipher_name[i].func)();
803 #define min(a,b) (((a)>(b))?(b):(a))
807 EVP_BytesToKey(const EVP_CIPHER *type,
810 const void *data, size_t datalen,
815 int ivlen, keylen, first = 0;
816 unsigned int mds = 0, i;
817 unsigned char *key = keydata;
818 unsigned char *iv = ivdata;
822 keylen = EVP_CIPHER_key_length(type);
823 ivlen = EVP_CIPHER_iv_length(type);
828 buf = malloc(EVP_MD_size(md));
836 EVP_DigestInit_ex(&c, md, NULL);
838 EVP_DigestUpdate(&c, buf, mds);
840 EVP_DigestUpdate(&c,data,datalen);
842 #define PKCS5_SALT_LEN 8
845 EVP_DigestUpdate(&c, salt, PKCS5_SALT_LEN);
847 EVP_DigestFinal_ex(&c, buf, &mds);
848 assert(mds == EVP_MD_size(md));
850 for (i = 1; i < count; i++) {
851 EVP_DigestInit_ex(&c, md, NULL);
852 EVP_DigestUpdate(&c, buf, mds);
853 EVP_DigestFinal_ex(&c, buf, &mds);
854 assert(mds == EVP_MD_size(md));
859 size_t sz = min(keylen, mds);
861 memcpy(key, buf, sz);
867 if (ivlen && mds > i) {
868 size_t sz = min(ivlen, (mds - i));
870 memcpy(iv, &buf[i], sz);
875 if (keylen == 0 && ivlen == 0)
879 EVP_MD_CTX_cleanup(&c);
882 return EVP_CIPHER_key_length(type);
890 OpenSSL_add_all_algorithms(void)
896 OpenSSL_add_all_algorithms_conf(void)
902 OpenSSL_add_all_algorithms_noconf(void)