9 #include <krb5-types.h>
21 typedef int (*evp_md_init
)(EVP_MD_CTX
*);
22 typedef int (*evp_md_update
)(EVP_MD_CTX
*,const void *, size_t);
23 typedef int (*evp_md_final
)(void *, EVP_MD_CTX
*);
24 typedef int (*evp_md_cleanup
)(EVP_MD_CTX
*);
33 evp_md_cleanup cleanup
;
41 EVP_MD_size(const EVP_MD
*md
)
47 EVP_MD_block_size(const EVP_MD
*md
)
49 return md
->block_size
;
53 EVP_MD_CTX_create(void)
55 return calloc(1, sizeof(EVP_MD_CTX
));
59 EVP_MD_CTX_init(EVP_MD_CTX
*ctx
)
61 memset(ctx
, 0, sizeof(*ctx
));
65 EVP_MD_CTX_destroy(EVP_MD_CTX
*ctx
)
67 EVP_MD_CTX_cleanup(ctx
);
72 EVP_MD_CTX_cleanup(EVP_MD_CTX
*ctx
)
74 if (ctx
->md
&& ctx
->md
->cleanup
)
75 (ctx
->md
->cleanup
)(ctx
);
84 EVP_MD_CTX_md(EVP_MD_CTX
*ctx
)
90 EVP_MD_CTX_size(EVP_MD_CTX
*ctx
)
92 return EVP_MD_size(ctx
->md
);
96 EVP_MD_CTX_block_size(EVP_MD_CTX
*ctx
)
98 return EVP_MD_block_size(ctx
->md
);
102 EVP_DigestInit_ex(EVP_MD_CTX
*ctx
, const EVP_MD
*md
, ENGINE
*engine
)
104 if (ctx
->md
!= md
|| ctx
->engine
!= engine
) {
105 EVP_MD_CTX_cleanup(ctx
);
107 ctx
->engine
= engine
;
109 ctx
->ptr
= calloc(1, md
->ctx_size
);
110 if (ctx
->ptr
== NULL
)
113 (ctx
->md
->init
)(ctx
->ptr
);
118 EVP_DigestUpdate(EVP_MD_CTX
*ctx
, const void *data
, size_t size
)
120 (ctx
->md
->update
)(ctx
->ptr
, data
, size
);
125 EVP_DigestFinal_ex(EVP_MD_CTX
*ctx
, void *hash
, unsigned int *size
)
127 (ctx
->md
->final
)(hash
, ctx
->ptr
);
129 *size
= ctx
->md
->hash_size
;
134 EVP_Digest(const void *data
, size_t dsize
, void *hash
, unsigned int *hsize
,
135 const EVP_MD
*md
, ENGINE
*engine
)
140 ctx
= EVP_MD_CTX_create();
143 ret
= EVP_DigestInit_ex(ctx
, md
, engine
);
146 ret
= EVP_DigestUpdate(ctx
, data
, dsize
);
149 ret
= EVP_DigestFinal_ex(ctx
, hash
, hsize
);
152 EVP_MD_CTX_destroy(ctx
);
163 static const struct hc_evp_md sha256
= {
167 (evp_md_init
)SHA256_Init
,
168 (evp_md_update
)SHA256_Update
,
169 (evp_md_final
)SHA256_Final
,
175 static const struct hc_evp_md sha1
= {
179 (evp_md_init
)SHA1_Init
,
180 (evp_md_update
)SHA1_Update
,
181 (evp_md_final
)SHA1_Final
,
200 static const struct hc_evp_md md5
= {
204 (evp_md_init
)MD5_Init
,
205 (evp_md_update
)MD5_Update
,
206 (evp_md_final
)MD5_Final
,
215 static const struct hc_evp_md md4
= {
219 (evp_md_init
)MD4_Init
,
220 (evp_md_update
)MD4_Update
,
221 (evp_md_final
)MD4_Final
,
230 static const struct hc_evp_md md2
= {
234 (evp_md_init
)MD2_Init
,
235 (evp_md_update
)MD2_Update
,
236 (evp_md_final
)MD2_Final
,
251 null_Update (void *m
, const void * data
, size_t size
)
255 null_Final(void *res
, struct md5
*m
)
262 static const struct hc_evp_md null
= {
266 (evp_md_init
)null_Init
,
267 (evp_md_update
)null_Update
,
268 (evp_md_final
)null_Final
,
275 void EVP_MD_CTX_init(EVP_MD_CTX
*ctx
);
276 int EVP_DigestInit(EVP_MD_CTX
*ctx
, const EVP_MD
*type
);
277 int EVP_DigestFinal(EVP_MD_CTX
*ctx
,unsigned char *md
,unsigned int *s
);
278 int EVP_SignFinal(EVP_MD_CTX
*, void *, size_t *, EVP_PKEY
*);
279 int EVP_VerifyFinal(EVP_MD_CTX
*, const void *, size_t, EVP_PKEY
*);
287 EVP_CIPHER_block_size(const EVP_CIPHER
*c
)
289 return c
->block_size
;
293 EVP_CIPHER_key_length(const EVP_CIPHER
*c
)
299 EVP_CIPHER_iv_length(const EVP_CIPHER
*c
)
305 EVP_CIPHER_CTX_init(EVP_CIPHER_CTX
*c
)
307 memset(c
, 0, sizeof(*c
));
311 EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX
*c
)
313 if (c
->cipher
&& c
->cipher
->cleanup
)
314 c
->cipher
->cleanup(c
);
315 if (c
->cipher_data
) {
316 free(c
->cipher_data
);
317 c
->cipher_data
= NULL
;
324 EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX
*c
, int length
)
330 EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX
*c
, int pad
)
337 EVP_CIPHER_CTX_cipher(EVP_CIPHER_CTX
*ctx
)
343 EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX
*ctx
)
345 return EVP_CIPHER_block_size(ctx
->cipher
);
349 EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX
*ctx
)
351 return EVP_CIPHER_key_length(ctx
->cipher
);
355 EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX
*ctx
)
357 return EVP_CIPHER_iv_length(ctx
->cipher
);
361 EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX
*ctx
)
363 return ctx
->cipher
->flags
;
367 EVP_CIPHER_CTX_mode(const EVP_CIPHER_CTX
*ctx
)
369 return EVP_CIPHER_CTX_flags(ctx
) & EVP_CIPH_MODE
;
373 EVP_CIPHER_CTX_get_app_data(EVP_CIPHER_CTX
*ctx
)
375 return ctx
->app_data
;
379 EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX
*ctx
, void *data
)
381 ctx
->app_data
= data
;
385 EVP_CipherInit_ex(EVP_CIPHER_CTX
*ctx
, const EVP_CIPHER
*c
, ENGINE
*engine
,
386 const void *key
, const void *iv
, int encp
)
391 ctx
->encrypt
= (encp
? 1 : 0);
393 if (c
&& (c
!= ctx
->cipher
)) {
394 EVP_CIPHER_CTX_cleanup(ctx
);
396 ctx
->key_len
= c
->key_len
;
398 ctx
->cipher_data
= malloc(c
->ctx_size
);
399 if (ctx
->cipher_data
== NULL
&& c
->ctx_size
!= 0)
402 } else if (ctx
->cipher
== NULL
) {
403 /* reuse of cipher, but not any cipher ever set! */
407 switch (EVP_CIPHER_CTX_flags(ctx
)) {
408 case EVP_CIPH_CBC_MODE
:
410 assert(EVP_CIPHER_CTX_iv_length(ctx
) <= sizeof(ctx
->iv
));
413 memcpy(ctx
->oiv
, iv
, EVP_CIPHER_CTX_iv_length(ctx
));
414 memcpy(ctx
->iv
, ctx
->oiv
, EVP_CIPHER_CTX_iv_length(ctx
));
420 if (key
|| (ctx
->cipher
->flags
& EVP_CIPH_ALWAYS_CALL_INIT
))
421 ctx
->cipher
->init(ctx
, key
, iv
, encp
);
427 EVP_Cipher(EVP_CIPHER_CTX
*ctx
, void *out
, const void *in
,size_t size
)
429 return ctx
->cipher
->do_cipher(ctx
, out
, in
, size
);
437 enc_null_init(EVP_CIPHER_CTX
*ctx
,
438 const unsigned char * key
,
439 const unsigned char * iv
,
446 enc_null_do_cipher(EVP_CIPHER_CTX
*ctx
,
448 const unsigned char *in
,
451 memmove(out
, in
, size
);
456 enc_null_cleanup(EVP_CIPHER_CTX
*ctx
)
464 static const EVP_CIPHER enc_null
= {
487 unsigned int maximum_effective_key
;
492 rc2_init(EVP_CIPHER_CTX
*ctx
,
493 const unsigned char * key
,
494 const unsigned char * iv
,
497 struct rc2_cbc
*k
= ctx
->cipher_data
;
498 k
->maximum_effective_key
= EVP_CIPHER_CTX_key_length(ctx
) * 8;
500 EVP_CIPHER_CTX_key_length(ctx
),
502 k
->maximum_effective_key
);
507 rc2_do_cipher(EVP_CIPHER_CTX
*ctx
,
509 const unsigned char *in
,
512 struct rc2_cbc
*k
= ctx
->cipher_data
;
513 RC2_cbc_encrypt(in
, out
, size
, &k
->key
, ctx
->iv
, ctx
->encrypt
);
518 rc2_cleanup(EVP_CIPHER_CTX
*ctx
)
520 memset(ctx
->cipher_data
, 0, sizeof(struct rc2_cbc
));
528 static const EVP_CIPHER rc2_cbc
= {
537 sizeof(struct rc2_cbc
),
549 static const EVP_CIPHER rc2_40_cbc
= {
558 sizeof(struct rc2_cbc
),
570 static const EVP_CIPHER rc2_64_cbc
= {
579 sizeof(struct rc2_cbc
),
603 printf("evp rc4_40\n");
612 struct des_ede3_cbc
{
613 DES_key_schedule ks
[3];
617 des_ede3_cbc_init(EVP_CIPHER_CTX
*ctx
,
618 const unsigned char * key
,
619 const unsigned char * iv
,
622 struct des_ede3_cbc
*k
= ctx
->cipher_data
;
624 DES_key_sched((DES_cblock
*)(key
), &k
->ks
[0]);
625 DES_key_sched((DES_cblock
*)(key
+ 8), &k
->ks
[1]);
626 DES_key_sched((DES_cblock
*)(key
+ 16), &k
->ks
[2]);
632 des_ede3_cbc_do_cipher(EVP_CIPHER_CTX
*ctx
,
634 const unsigned char *in
,
637 struct des_ede3_cbc
*k
= ctx
->cipher_data
;
638 DES_ede3_cbc_encrypt(in
, out
, size
,
639 &k
->ks
[0], &k
->ks
[1], &k
->ks
[2],
640 (DES_cblock
*)ctx
->iv
, ctx
->encrypt
);
645 des_ede3_cbc_cleanup(EVP_CIPHER_CTX
*ctx
)
647 memset(ctx
->cipher_data
, 0, sizeof(struct des_ede3_cbc
));
652 EVP_des_ede3_cbc(void)
654 static const EVP_CIPHER des_ede3_cbc
= {
661 des_ede3_cbc_do_cipher
,
662 des_ede3_cbc_cleanup
,
663 sizeof(struct des_ede3_cbc
),
669 return &des_ede3_cbc
;
677 aes_init(EVP_CIPHER_CTX
*ctx
,
678 const unsigned char * key
,
679 const unsigned char * iv
,
682 AES_KEY
*k
= ctx
->cipher_data
;
684 AES_set_encrypt_key(key
, ctx
->cipher
->key_len
* 8, k
);
686 AES_set_decrypt_key(key
, ctx
->cipher
->key_len
* 8, k
);
691 aes_do_cipher(EVP_CIPHER_CTX
*ctx
,
693 const unsigned char *in
,
696 AES_KEY
*k
= ctx
->cipher_data
;
697 AES_cbc_encrypt(in
, out
, size
, k
, ctx
->iv
, ctx
->encrypt
);
702 aes_cleanup(EVP_CIPHER_CTX
*ctx
)
704 memset(ctx
->cipher_data
, 0, sizeof(AES_KEY
));
709 EVP_aes_128_cbc(void)
711 static const EVP_CIPHER aes_128_cbc
= {
730 EVP_aes_192_cbc(void)
732 static const EVP_CIPHER aes_192_cbc
= {
752 EVP_aes_256_cbc(void)
754 static const EVP_CIPHER aes_256_cbc
= {
773 camellia_init(EVP_CIPHER_CTX
*ctx
,
774 const unsigned char * key
,
775 const unsigned char * iv
,
778 CAMELLIA_KEY
*k
= ctx
->cipher_data
;
779 k
->bits
= ctx
->cipher
->key_len
* 8;
780 CAMELLIA_set_key(key
, ctx
->cipher
->key_len
* 8, k
);
785 camellia_do_cipher(EVP_CIPHER_CTX
*ctx
,
787 const unsigned char *in
,
790 CAMELLIA_KEY
*k
= ctx
->cipher_data
;
791 CAMELLIA_cbc_encrypt(in
, out
, size
, k
, ctx
->iv
, ctx
->encrypt
);
796 camellia_cleanup(EVP_CIPHER_CTX
*ctx
)
798 memset(ctx
->cipher_data
, 0, sizeof(CAMELLIA_KEY
));
803 EVP_camellia_128_cbc(void)
805 static const EVP_CIPHER cipher
= {
814 sizeof(CAMELLIA_KEY
),
824 EVP_camellia_192_cbc(void)
826 static const EVP_CIPHER cipher
= {
835 sizeof(CAMELLIA_KEY
),
845 EVP_camellia_256_cbc(void)
847 static const EVP_CIPHER cipher
= {
856 sizeof(CAMELLIA_KEY
),
869 static const struct cipher_name
{
871 const EVP_CIPHER
*(*func
)(void);
873 { "des-ede3-cbc", EVP_des_ede3_cbc
},
874 { "aes-128-cbc", EVP_aes_128_cbc
},
875 { "aes-192-cbc", EVP_aes_192_cbc
},
876 { "aes-256-cbc", EVP_aes_256_cbc
},
877 { "camellia-128-cbc", EVP_camellia_128_cbc
},
878 { "camellia-192-cbc", EVP_camellia_192_cbc
},
879 { "camellia-256-cbc", EVP_camellia_256_cbc
}
884 EVP_get_cipherbyname(const char *name
)
887 for (i
= 0; i
< sizeof(cipher_name
)/sizeof(cipher_name
[0]); i
++) {
888 if (strcasecmp(cipher_name
[i
].name
, name
) == 0)
889 return (*cipher_name
[i
].func
)();
900 #define min(a,b) (((a)>(b))?(b):(a))
904 EVP_BytesToKey(const EVP_CIPHER
*type
,
907 const void *data
, size_t datalen
,
912 int ivlen
, keylen
, first
= 0;
913 unsigned int mds
= 0, i
;
914 unsigned char *key
= keydata
;
915 unsigned char *iv
= ivdata
;
919 keylen
= EVP_CIPHER_key_length(type
);
920 ivlen
= EVP_CIPHER_iv_length(type
);
925 buf
= malloc(EVP_MD_size(md
));
933 EVP_DigestInit_ex(&c
, md
, NULL
);
935 EVP_DigestUpdate(&c
, buf
, mds
);
937 EVP_DigestUpdate(&c
,data
,datalen
);
939 #define PKCS5_SALT_LEN 8
942 EVP_DigestUpdate(&c
, salt
, PKCS5_SALT_LEN
);
944 EVP_DigestFinal_ex(&c
, buf
, &mds
);
945 assert(mds
== EVP_MD_size(md
));
947 for (i
= 1; i
< count
; i
++) {
948 EVP_DigestInit_ex(&c
, md
, NULL
);
949 EVP_DigestUpdate(&c
, buf
, mds
);
950 EVP_DigestFinal_ex(&c
, buf
, &mds
);
951 assert(mds
== EVP_MD_size(md
));
956 size_t sz
= min(keylen
, mds
);
958 memcpy(key
, buf
, sz
);
964 if (ivlen
&& mds
> i
) {
965 size_t sz
= min(ivlen
, (mds
- i
));
967 memcpy(iv
, &buf
[i
], sz
);
972 if (keylen
== 0 && ivlen
== 0)
976 EVP_MD_CTX_cleanup(&c
);
979 return EVP_CIPHER_key_length(type
);
987 OpenSSL_add_all_algorithms(void)
993 OpenSSL_add_all_algorithms_conf(void)
999 OpenSSL_add_all_algorithms_noconf(void)