9 #include <krb5-types.h>
24 int (*init)(EVP_MD_CTX *);
25 int (*update)(EVP_MD_CTX *,const void *, size_t );
26 int (*final)(void *, EVP_MD_CTX *);
27 int (*cleanup)(EVP_MD_CTX *);
35 EVP_MD_size(const EVP_MD *md)
41 EVP_MD_block_size(const EVP_MD *md)
43 return md->block_size;
47 EVP_MD_CTX_create(void)
49 return calloc(1, sizeof(EVP_MD_CTX));
53 EVP_MD_CTX_init(EVP_MD_CTX *ctx)
55 memset(ctx, 0, sizeof(*ctx));
59 EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
61 EVP_MD_CTX_cleanup(ctx);
66 EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
68 if (ctx->md && ctx->md->cleanup)
69 (ctx->md->cleanup)(ctx);
78 EVP_MD_CTX_md(EVP_MD_CTX *ctx)
84 EVP_MD_CTX_size(EVP_MD_CTX *ctx)
86 return EVP_MD_size(ctx->md);
90 EVP_MD_CTX_block_size(EVP_MD_CTX *ctx)
92 return EVP_MD_block_size(ctx->md);
96 EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *md, ENGINE *engine)
98 if (ctx->md != md || ctx->engine != engine) {
99 EVP_MD_CTX_cleanup(ctx);
101 ctx->engine = engine;
103 ctx->ptr = calloc(1, md->ctx_size);
104 if (ctx->ptr == NULL)
107 (ctx->md->init)(ctx->ptr);
112 EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t size)
114 (ctx->md->update)(ctx->ptr, data, size);
119 EVP_DigestFinal_ex(EVP_MD_CTX *ctx, void *hash, unsigned int *size)
121 (ctx->md->final)(hash, ctx->ptr);
123 *size = ctx->md->hash_size;
128 EVP_Digest(const void *data, size_t dsize, void *hash, unsigned int *hsize,
129 const EVP_MD *md, ENGINE *engine)
134 ctx = EVP_MD_CTX_create();
137 ret = EVP_DigestInit_ex(ctx, md, engine);
140 ret = EVP_DigestUpdate(ctx, data, dsize);
143 ret = EVP_DigestFinal_ex(ctx, hash, hsize);
146 EVP_MD_CTX_destroy(ctx);
154 static const struct hc_evp_md sha1 = {
179 static const struct hc_evp_md md5 = {
194 static const struct hc_evp_md md4 = {
209 static const struct hc_evp_md md2 = {
230 null_Update (void *m, const void * data, size_t size)
234 null_Final(void *res, struct md5 *m)
241 static const struct hc_evp_md null = {
254 void EVP_MD_CTX_init(EVP_MD_CTX *ctx);
255 int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
256 int EVP_DigestFinal(EVP_MD_CTX *ctx,unsigned char *md,unsigned int *s);
257 int EVP_SignFinal(EVP_MD_CTX *, void *, size_t *, EVP_PKEY *);
258 int EVP_VerifyFinal(EVP_MD_CTX *, const void *, size_t, EVP_PKEY *);
266 EVP_CIPHER_block_size(const EVP_CIPHER *c)
268 return c->block_size;
272 EVP_CIPHER_key_length(const EVP_CIPHER *c)
278 EVP_CIPHER_iv_length(const EVP_CIPHER *c)
284 EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *c)
286 memset(c, 0, sizeof(*c));
290 EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c)
292 if (c->cipher && c->cipher->cleanup)
293 c->cipher->cleanup(c);
294 if (c->cipher_data) {
295 free(c->cipher_data);
296 c->cipher_data = NULL;
303 EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int length)
309 EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad)
316 EVP_CIPHER_CTX_cipher(EVP_CIPHER_CTX *ctx)
322 EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
324 return EVP_CIPHER_block_size(ctx->cipher);
328 EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
330 return EVP_CIPHER_key_length(ctx->cipher);
334 EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
336 return EVP_CIPHER_iv_length(ctx->cipher);
340 EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx)
342 return ctx->cipher->flags;
346 EVP_CIPHER_CTX_mode(const EVP_CIPHER_CTX *ctx)
348 return EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_MODE;
352 EVP_CIPHER_CTX_get_app_data(EVP_CIPHER_CTX *ctx)
354 return ctx->app_data;
358 EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data)
360 ctx->app_data = data;
364 EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *c, ENGINE *engine,
365 const void *key, const void *iv, int encp)
370 ctx->encrypt = (encp ? 1 : 0);
372 if (c && (c != ctx->cipher)) {
373 EVP_CIPHER_CTX_cleanup(ctx);
375 ctx->key_len = c->key_len;
377 ctx->cipher_data = malloc(c->ctx_size);
378 if (ctx->cipher_data == NULL && c->ctx_size != 0)
381 } else if (ctx->cipher == NULL) {
382 /* reuse of cipher, but not any cipher ever set! */
386 switch (EVP_CIPHER_CTX_flags(ctx)) {
387 case EVP_CIPH_CBC_MODE:
389 assert(EVP_CIPHER_CTX_iv_length(ctx) <= sizeof(ctx->iv));
392 memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
393 memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
399 if (key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT))
400 ctx->cipher->init(ctx, key, iv, encp);
406 EVP_Cipher(EVP_CIPHER_CTX *ctx, void *out, const void *in,size_t size)
408 return ctx->cipher->do_cipher(ctx, out, in, size);
416 enc_null_init(EVP_CIPHER_CTX *ctx,
417 const unsigned char * key,
418 const unsigned char * iv,
425 enc_null_do_cipher(EVP_CIPHER_CTX *ctx,
427 const unsigned char *in,
430 memmove(out, in, size);
435 enc_null_cleanup(EVP_CIPHER_CTX *ctx)
443 static const EVP_CIPHER enc_null = {
466 unsigned int maximum_effective_key;
471 rc2_init(EVP_CIPHER_CTX *ctx,
472 const unsigned char * key,
473 const unsigned char * iv,
476 struct rc2_cbc *k = ctx->cipher_data;
477 k->maximum_effective_key = EVP_CIPHER_CTX_key_length(ctx) * 8;
479 EVP_CIPHER_CTX_key_length(ctx),
481 k->maximum_effective_key);
486 rc2_do_cipher(EVP_CIPHER_CTX *ctx,
488 const unsigned char *in,
491 struct rc2_cbc *k = ctx->cipher_data;
492 RC2_cbc_encrypt(in, out, size, &k->key, ctx->iv, ctx->encrypt);
497 rc2_cleanup(EVP_CIPHER_CTX *ctx)
499 memset(ctx->cipher_data, 0, sizeof(struct rc2_cbc));
507 static const EVP_CIPHER rc2_cbc = {
516 sizeof(struct rc2_cbc),
528 static const EVP_CIPHER rc2_40_cbc = {
537 sizeof(struct rc2_cbc),
561 printf("evp rc4_40\n");
570 struct des_ede3_cbc {
571 DES_key_schedule ks[3];
575 des_ede3_cbc_init(EVP_CIPHER_CTX *ctx,
576 const unsigned char * key,
577 const unsigned char * iv,
580 struct des_ede3_cbc *k = ctx->cipher_data;
582 DES_key_sched((DES_cblock *)(key), &k->ks[0]);
583 DES_key_sched((DES_cblock *)(key + 8), &k->ks[1]);
584 DES_key_sched((DES_cblock *)(key + 16), &k->ks[2]);
590 des_ede3_cbc_do_cipher(EVP_CIPHER_CTX *ctx,
592 const unsigned char *in,
595 struct des_ede3_cbc *k = ctx->cipher_data;
596 DES_ede3_cbc_encrypt(in, out, size,
597 &k->ks[0], &k->ks[1], &k->ks[2],
598 (DES_cblock *)ctx->iv, ctx->encrypt);
603 des_ede3_cbc_cleanup(EVP_CIPHER_CTX *ctx)
605 memset(ctx->cipher_data, 0, sizeof(struct des_ede3_cbc));
610 EVP_des_ede3_cbc(void)
612 static const EVP_CIPHER des_ede3_cbc = {
619 des_ede3_cbc_do_cipher,
620 des_ede3_cbc_cleanup,
621 sizeof(struct des_ede3_cbc),
627 return &des_ede3_cbc;
635 aes_init(EVP_CIPHER_CTX *ctx,
636 const unsigned char * key,
637 const unsigned char * iv,
640 AES_KEY *k = ctx->cipher_data;
642 AES_set_encrypt_key(key, ctx->cipher->key_len * 8, k);
644 AES_set_decrypt_key(key, ctx->cipher->key_len * 8, k);
649 aes_do_cipher(EVP_CIPHER_CTX *ctx,
651 const unsigned char *in,
654 AES_KEY *k = ctx->cipher_data;
655 AES_cbc_encrypt(in, out, size, k, ctx->iv, ctx->encrypt);
660 aes_cleanup(EVP_CIPHER_CTX *ctx)
662 memset(ctx->cipher_data, 0, sizeof(AES_KEY));
667 EVP_aes_128_cbc(void)
669 static const EVP_CIPHER aes_128_cbc = {
688 EVP_aes_192_cbc(void)
690 static const EVP_CIPHER aes_192_cbc = {
710 EVP_aes_256_cbc(void)
712 static const EVP_CIPHER aes_256_cbc = {