diff options
Diffstat (limited to 'src/lib/libcrypto/evp')
26 files changed, 712 insertions, 279 deletions
diff --git a/src/lib/libcrypto/evp/Makefile.ssl b/src/lib/libcrypto/evp/Makefile.ssl index 753479a015..c763b5ccd6 100644 --- a/src/lib/libcrypto/evp/Makefile.ssl +++ b/src/lib/libcrypto/evp/Makefile.ssl | |||
@@ -35,7 +35,8 @@ LIBSRC= encode.c digest.c evp_enc.c evp_key.c \ | |||
35 | m_ripemd.c \ | 35 | m_ripemd.c \ |
36 | p_open.c p_seal.c p_sign.c p_verify.c p_lib.c p_enc.c p_dec.c \ | 36 | p_open.c p_seal.c p_sign.c p_verify.c p_lib.c p_enc.c p_dec.c \ |
37 | bio_md.c bio_b64.c bio_enc.c evp_err.c e_null.c \ | 37 | bio_md.c bio_b64.c bio_enc.c evp_err.c e_null.c \ |
38 | c_all.c evp_lib.c bio_ok.c evp_pkey.c evp_pbe.c p5_crpt.c p5_crpt2.c | 38 | c_all.c c_allc.c c_alld.c evp_lib.c bio_ok.c \ |
39 | evp_pkey.c evp_pbe.c p5_crpt.c p5_crpt2.c | ||
39 | 40 | ||
40 | LIBOBJ= encode.o digest.o evp_enc.o evp_key.o \ | 41 | LIBOBJ= encode.o digest.o evp_enc.o evp_key.o \ |
41 | e_ecb_d.o e_cbc_d.o e_cfb_d.o e_ofb_d.o \ | 42 | e_ecb_d.o e_cbc_d.o e_cfb_d.o e_ofb_d.o \ |
@@ -50,7 +51,8 @@ LIBOBJ= encode.o digest.o evp_enc.o evp_key.o \ | |||
50 | m_ripemd.o \ | 51 | m_ripemd.o \ |
51 | p_open.o p_seal.o p_sign.o p_verify.o p_lib.o p_enc.o p_dec.o \ | 52 | p_open.o p_seal.o p_sign.o p_verify.o p_lib.o p_enc.o p_dec.o \ |
52 | bio_md.o bio_b64.o bio_enc.o evp_err.o e_null.o \ | 53 | bio_md.o bio_b64.o bio_enc.o evp_err.o e_null.o \ |
53 | c_all.o evp_lib.o bio_ok.o evp_pkey.o evp_pbe.o p5_crpt.o p5_crpt2.o | 54 | c_all.o c_allc.o c_alld.o evp_lib.o bio_ok.o \ |
55 | evp_pkey.o evp_pbe.o p5_crpt.o p5_crpt2.o | ||
54 | 56 | ||
55 | SRC= $(LIBSRC) | 57 | SRC= $(LIBSRC) |
56 | 58 | ||
@@ -176,13 +178,45 @@ c_all.o: ../../include/openssl/err.h ../../include/openssl/evp.h | |||
176 | c_all.o: ../../include/openssl/idea.h ../../include/openssl/md2.h | 178 | c_all.o: ../../include/openssl/idea.h ../../include/openssl/md2.h |
177 | c_all.o: ../../include/openssl/md5.h ../../include/openssl/mdc2.h | 179 | c_all.o: ../../include/openssl/md5.h ../../include/openssl/mdc2.h |
178 | c_all.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h | 180 | c_all.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h |
179 | c_all.o: ../../include/openssl/opensslv.h ../../include/openssl/pkcs12.h | 181 | c_all.o: ../../include/openssl/opensslv.h ../../include/openssl/rc2.h |
180 | c_all.o: ../../include/openssl/pkcs7.h ../../include/openssl/rc2.h | ||
181 | c_all.o: ../../include/openssl/rc4.h ../../include/openssl/rc5.h | 182 | c_all.o: ../../include/openssl/rc4.h ../../include/openssl/rc5.h |
182 | c_all.o: ../../include/openssl/ripemd.h ../../include/openssl/rsa.h | 183 | c_all.o: ../../include/openssl/ripemd.h ../../include/openssl/rsa.h |
183 | c_all.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h | 184 | c_all.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h |
184 | c_all.o: ../../include/openssl/stack.h ../../include/openssl/x509.h | 185 | c_all.o: ../../include/openssl/stack.h ../cryptlib.h |
185 | c_all.o: ../../include/openssl/x509_vfy.h ../cryptlib.h | 186 | c_allc.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h |
187 | c_allc.o: ../../include/openssl/blowfish.h ../../include/openssl/bn.h | ||
188 | c_allc.o: ../../include/openssl/buffer.h ../../include/openssl/cast.h | ||
189 | c_allc.o: ../../include/openssl/crypto.h ../../include/openssl/des.h | ||
190 | c_allc.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h | ||
191 | c_allc.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h | ||
192 | c_allc.o: ../../include/openssl/err.h ../../include/openssl/evp.h | ||
193 | c_allc.o: ../../include/openssl/idea.h ../../include/openssl/md2.h | ||
194 | c_allc.o: ../../include/openssl/md5.h ../../include/openssl/mdc2.h | ||
195 | c_allc.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h | ||
196 | c_allc.o: ../../include/openssl/opensslv.h ../../include/openssl/pkcs12.h | ||
197 | c_allc.o: ../../include/openssl/pkcs7.h ../../include/openssl/rc2.h | ||
198 | c_allc.o: ../../include/openssl/rc4.h ../../include/openssl/rc5.h | ||
199 | c_allc.o: ../../include/openssl/ripemd.h ../../include/openssl/rsa.h | ||
200 | c_allc.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h | ||
201 | c_allc.o: ../../include/openssl/stack.h ../../include/openssl/x509.h | ||
202 | c_allc.o: ../../include/openssl/x509_vfy.h ../cryptlib.h | ||
203 | c_alld.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h | ||
204 | c_alld.o: ../../include/openssl/blowfish.h ../../include/openssl/bn.h | ||
205 | c_alld.o: ../../include/openssl/buffer.h ../../include/openssl/cast.h | ||
206 | c_alld.o: ../../include/openssl/crypto.h ../../include/openssl/des.h | ||
207 | c_alld.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h | ||
208 | c_alld.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h | ||
209 | c_alld.o: ../../include/openssl/err.h ../../include/openssl/evp.h | ||
210 | c_alld.o: ../../include/openssl/idea.h ../../include/openssl/md2.h | ||
211 | c_alld.o: ../../include/openssl/md5.h ../../include/openssl/mdc2.h | ||
212 | c_alld.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h | ||
213 | c_alld.o: ../../include/openssl/opensslv.h ../../include/openssl/pkcs12.h | ||
214 | c_alld.o: ../../include/openssl/pkcs7.h ../../include/openssl/rc2.h | ||
215 | c_alld.o: ../../include/openssl/rc4.h ../../include/openssl/rc5.h | ||
216 | c_alld.o: ../../include/openssl/ripemd.h ../../include/openssl/rsa.h | ||
217 | c_alld.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h | ||
218 | c_alld.o: ../../include/openssl/stack.h ../../include/openssl/x509.h | ||
219 | c_alld.o: ../../include/openssl/x509_vfy.h ../cryptlib.h | ||
186 | digest.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h | 220 | digest.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h |
187 | digest.o: ../../include/openssl/blowfish.h ../../include/openssl/bn.h | 221 | digest.o: ../../include/openssl/blowfish.h ../../include/openssl/bn.h |
188 | digest.o: ../../include/openssl/buffer.h ../../include/openssl/cast.h | 222 | digest.o: ../../include/openssl/buffer.h ../../include/openssl/cast.h |
diff --git a/src/lib/libcrypto/evp/bio_b64.c b/src/lib/libcrypto/evp/bio_b64.c index 84729119df..bd5e24f993 100644 --- a/src/lib/libcrypto/evp/bio_b64.c +++ b/src/lib/libcrypto/evp/bio_b64.c | |||
@@ -69,6 +69,7 @@ static int b64_read(BIO *h,char *buf,int size); | |||
69 | static long b64_ctrl(BIO *h,int cmd,long arg1,char *arg2); | 69 | static long b64_ctrl(BIO *h,int cmd,long arg1,char *arg2); |
70 | static int b64_new(BIO *h); | 70 | static int b64_new(BIO *h); |
71 | static int b64_free(BIO *data); | 71 | static int b64_free(BIO *data); |
72 | static long b64_callback_ctrl(BIO *h,int cmd,void (*fp)()); | ||
72 | #define B64_BLOCK_SIZE 1024 | 73 | #define B64_BLOCK_SIZE 1024 |
73 | #define B64_BLOCK_SIZE2 768 | 74 | #define B64_BLOCK_SIZE2 768 |
74 | #define B64_NONE 0 | 75 | #define B64_NONE 0 |
@@ -100,6 +101,7 @@ static BIO_METHOD methods_b64= | |||
100 | b64_ctrl, | 101 | b64_ctrl, |
101 | b64_new, | 102 | b64_new, |
102 | b64_free, | 103 | b64_free, |
104 | b64_callback_ctrl, | ||
103 | }; | 105 | }; |
104 | 106 | ||
105 | BIO_METHOD *BIO_f_base64(void) | 107 | BIO_METHOD *BIO_f_base64(void) |
@@ -237,8 +239,8 @@ static int b64_read(BIO *b, char *out, int outl) | |||
237 | &(ctx->tmp[0])); | 239 | &(ctx->tmp[0])); |
238 | for (x=0; x < i; x++) | 240 | for (x=0; x < i; x++) |
239 | ctx->tmp[x]=p[x]; | 241 | ctx->tmp[x]=p[x]; |
240 | EVP_DecodeInit(&ctx->base64); | ||
241 | } | 242 | } |
243 | EVP_DecodeInit(&ctx->base64); | ||
242 | ctx->start=0; | 244 | ctx->start=0; |
243 | break; | 245 | break; |
244 | } | 246 | } |
@@ -522,3 +524,17 @@ again: | |||
522 | return(ret); | 524 | return(ret); |
523 | } | 525 | } |
524 | 526 | ||
527 | static long b64_callback_ctrl(BIO *b, int cmd, void (*fp)()) | ||
528 | { | ||
529 | long ret=1; | ||
530 | |||
531 | if (b->next_bio == NULL) return(0); | ||
532 | switch (cmd) | ||
533 | { | ||
534 | default: | ||
535 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | ||
536 | break; | ||
537 | } | ||
538 | return(ret); | ||
539 | } | ||
540 | |||
diff --git a/src/lib/libcrypto/evp/bio_enc.c b/src/lib/libcrypto/evp/bio_enc.c index 0a7b1ecf07..629bf4b95d 100644 --- a/src/lib/libcrypto/evp/bio_enc.c +++ b/src/lib/libcrypto/evp/bio_enc.c | |||
@@ -69,6 +69,7 @@ static int enc_read(BIO *h,char *buf,int size); | |||
69 | static long enc_ctrl(BIO *h,int cmd,long arg1,char *arg2); | 69 | static long enc_ctrl(BIO *h,int cmd,long arg1,char *arg2); |
70 | static int enc_new(BIO *h); | 70 | static int enc_new(BIO *h); |
71 | static int enc_free(BIO *data); | 71 | static int enc_free(BIO *data); |
72 | static long enc_callback_ctrl(BIO *h,int cmd,void (*fp)()); | ||
72 | #define ENC_BLOCK_SIZE (1024*4) | 73 | #define ENC_BLOCK_SIZE (1024*4) |
73 | 74 | ||
74 | typedef struct enc_struct | 75 | typedef struct enc_struct |
@@ -92,6 +93,7 @@ static BIO_METHOD methods_enc= | |||
92 | enc_ctrl, | 93 | enc_ctrl, |
93 | enc_new, | 94 | enc_new, |
94 | enc_free, | 95 | enc_free, |
96 | enc_callback_ctrl, | ||
95 | }; | 97 | }; |
96 | 98 | ||
97 | BIO_METHOD *BIO_f_cipher(void) | 99 | BIO_METHOD *BIO_f_cipher(void) |
@@ -184,9 +186,11 @@ static int enc_read(BIO *b, char *out, int outl) | |||
184 | ctx->ok=i; | 186 | ctx->ok=i; |
185 | ctx->buf_off=0; | 187 | ctx->buf_off=0; |
186 | } | 188 | } |
187 | else | 189 | else |
190 | { | ||
188 | ret=(ret == 0)?i:ret; | 191 | ret=(ret == 0)?i:ret; |
189 | break; | 192 | break; |
193 | } | ||
190 | } | 194 | } |
191 | else | 195 | else |
192 | { | 196 | { |
@@ -194,13 +198,19 @@ static int enc_read(BIO *b, char *out, int outl) | |||
194 | (unsigned char *)ctx->buf,&ctx->buf_len, | 198 | (unsigned char *)ctx->buf,&ctx->buf_len, |
195 | (unsigned char *)&(ctx->buf[8]),i); | 199 | (unsigned char *)&(ctx->buf[8]),i); |
196 | ctx->cont=1; | 200 | ctx->cont=1; |
201 | /* Note: it is possible for EVP_CipherUpdate to | ||
202 | * decrypt zero bytes because this is or looks like | ||
203 | * the final block: if this happens we should retry | ||
204 | * and either read more data or decrypt the final | ||
205 | * block | ||
206 | */ | ||
207 | if(ctx->buf_len == 0) continue; | ||
197 | } | 208 | } |
198 | 209 | ||
199 | if (ctx->buf_len <= outl) | 210 | if (ctx->buf_len <= outl) |
200 | i=ctx->buf_len; | 211 | i=ctx->buf_len; |
201 | else | 212 | else |
202 | i=outl; | 213 | i=outl; |
203 | |||
204 | if (i <= 0) break; | 214 | if (i <= 0) break; |
205 | memcpy(out,ctx->buf,i); | 215 | memcpy(out,ctx->buf,i); |
206 | ret+=i; | 216 | ret+=i; |
@@ -360,6 +370,20 @@ again: | |||
360 | return(ret); | 370 | return(ret); |
361 | } | 371 | } |
362 | 372 | ||
373 | static long enc_callback_ctrl(BIO *b, int cmd, void (*fp)()) | ||
374 | { | ||
375 | long ret=1; | ||
376 | |||
377 | if (b->next_bio == NULL) return(0); | ||
378 | switch (cmd) | ||
379 | { | ||
380 | default: | ||
381 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | ||
382 | break; | ||
383 | } | ||
384 | return(ret); | ||
385 | } | ||
386 | |||
363 | /* | 387 | /* |
364 | void BIO_set_cipher_ctx(b,c) | 388 | void BIO_set_cipher_ctx(b,c) |
365 | BIO *b; | 389 | BIO *b; |
diff --git a/src/lib/libcrypto/evp/bio_md.c b/src/lib/libcrypto/evp/bio_md.c index 317167f9c4..aef928dd8f 100644 --- a/src/lib/libcrypto/evp/bio_md.c +++ b/src/lib/libcrypto/evp/bio_md.c | |||
@@ -72,6 +72,8 @@ static int md_gets(BIO *h,char *str,int size); | |||
72 | static long md_ctrl(BIO *h,int cmd,long arg1,char *arg2); | 72 | static long md_ctrl(BIO *h,int cmd,long arg1,char *arg2); |
73 | static int md_new(BIO *h); | 73 | static int md_new(BIO *h); |
74 | static int md_free(BIO *data); | 74 | static int md_free(BIO *data); |
75 | static long md_callback_ctrl(BIO *h,int cmd,void (*fp)()); | ||
76 | |||
75 | static BIO_METHOD methods_md= | 77 | static BIO_METHOD methods_md= |
76 | { | 78 | { |
77 | BIO_TYPE_MD,"message digest", | 79 | BIO_TYPE_MD,"message digest", |
@@ -82,6 +84,7 @@ static BIO_METHOD methods_md= | |||
82 | md_ctrl, | 84 | md_ctrl, |
83 | md_new, | 85 | md_new, |
84 | md_free, | 86 | md_free, |
87 | md_callback_ctrl, | ||
85 | }; | 88 | }; |
86 | 89 | ||
87 | BIO_METHOD *BIO_f_md(void) | 90 | BIO_METHOD *BIO_f_md(void) |
@@ -220,6 +223,20 @@ static long md_ctrl(BIO *b, int cmd, long num, char *ptr) | |||
220 | return(ret); | 223 | return(ret); |
221 | } | 224 | } |
222 | 225 | ||
226 | static long md_callback_ctrl(BIO *b, int cmd, void (*fp)()) | ||
227 | { | ||
228 | long ret=1; | ||
229 | |||
230 | if (b->next_bio == NULL) return(0); | ||
231 | switch (cmd) | ||
232 | { | ||
233 | default: | ||
234 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | ||
235 | break; | ||
236 | } | ||
237 | return(ret); | ||
238 | } | ||
239 | |||
223 | static int md_gets(BIO *bp, char *buf, int size) | 240 | static int md_gets(BIO *bp, char *buf, int size) |
224 | { | 241 | { |
225 | EVP_MD_CTX *ctx; | 242 | EVP_MD_CTX *ctx; |
diff --git a/src/lib/libcrypto/evp/bio_ok.c b/src/lib/libcrypto/evp/bio_ok.c index 101275d648..e6ff5f2cdb 100644 --- a/src/lib/libcrypto/evp/bio_ok.c +++ b/src/lib/libcrypto/evp/bio_ok.c | |||
@@ -67,7 +67,7 @@ | |||
67 | and everything was OK. BUT if user types wrong password | 67 | and everything was OK. BUT if user types wrong password |
68 | BIO_f_cipher outputs only garbage and my function crashes. Yes | 68 | BIO_f_cipher outputs only garbage and my function crashes. Yes |
69 | I can and I should fix my function, but BIO_f_cipher is | 69 | I can and I should fix my function, but BIO_f_cipher is |
70 | easy way to add encryption support to many exisiting applications | 70 | easy way to add encryption support to many existing applications |
71 | and it's hard to debug and fix them all. | 71 | and it's hard to debug and fix them all. |
72 | 72 | ||
73 | So I wanted another BIO which would catch the incorrect passwords and | 73 | So I wanted another BIO which would catch the incorrect passwords and |
@@ -80,10 +80,10 @@ | |||
80 | 1) you must somehow separate checksum from actual data. | 80 | 1) you must somehow separate checksum from actual data. |
81 | 2) you need lot's of memory when reading the file, because you | 81 | 2) you need lot's of memory when reading the file, because you |
82 | must read to the end of the file and verify the checksum before | 82 | must read to the end of the file and verify the checksum before |
83 | leting the application to read the data. | 83 | letting the application to read the data. |
84 | 84 | ||
85 | BIO_f_reliable tries to solve both problems, so that you can | 85 | BIO_f_reliable tries to solve both problems, so that you can |
86 | read and write arbitraly long streams using only fixed amount | 86 | read and write arbitrary long streams using only fixed amount |
87 | of memory. | 87 | of memory. |
88 | 88 | ||
89 | BIO_f_reliable splits data stream into blocks. Each block is prefixed | 89 | BIO_f_reliable splits data stream into blocks. Each block is prefixed |
@@ -91,7 +91,7 @@ | |||
91 | several Kbytes of memory to buffer single block before verifying | 91 | several Kbytes of memory to buffer single block before verifying |
92 | it's digest. | 92 | it's digest. |
93 | 93 | ||
94 | BIO_f_reliable goes futher and adds several important capabilities: | 94 | BIO_f_reliable goes further and adds several important capabilities: |
95 | 95 | ||
96 | 1) the digest of the block is computed over the whole stream | 96 | 1) the digest of the block is computed over the whole stream |
97 | -- so nobody can rearrange the blocks or remove or replace them. | 97 | -- so nobody can rearrange the blocks or remove or replace them. |
@@ -110,7 +110,7 @@ | |||
110 | and then compare the digest output. | 110 | and then compare the digest output. |
111 | 111 | ||
112 | Bad things: BIO_f_reliable knows what's going on in EVP_Digest. I | 112 | Bad things: BIO_f_reliable knows what's going on in EVP_Digest. I |
113 | initialy wrote and tested this code on x86 machine and wrote the | 113 | initially wrote and tested this code on x86 machine and wrote the |
114 | digests out in machine-dependent order :( There are people using | 114 | digests out in machine-dependent order :( There are people using |
115 | this code and I cannot change this easily without making existing | 115 | this code and I cannot change this easily without making existing |
116 | data files unreadable. | 116 | data files unreadable. |
@@ -130,6 +130,8 @@ static int ok_read(BIO *h,char *buf,int size); | |||
130 | static long ok_ctrl(BIO *h,int cmd,long arg1,char *arg2); | 130 | static long ok_ctrl(BIO *h,int cmd,long arg1,char *arg2); |
131 | static int ok_new(BIO *h); | 131 | static int ok_new(BIO *h); |
132 | static int ok_free(BIO *data); | 132 | static int ok_free(BIO *data); |
133 | static long ok_callback_ctrl(BIO *h,int cmd,void (*fp)()); | ||
134 | |||
133 | static void sig_out(BIO* b); | 135 | static void sig_out(BIO* b); |
134 | static void sig_in(BIO* b); | 136 | static void sig_in(BIO* b); |
135 | static void block_out(BIO* b); | 137 | static void block_out(BIO* b); |
@@ -173,6 +175,7 @@ static BIO_METHOD methods_ok= | |||
173 | ok_ctrl, | 175 | ok_ctrl, |
174 | ok_new, | 176 | ok_new, |
175 | ok_free, | 177 | ok_free, |
178 | ok_callback_ctrl, | ||
176 | }; | 179 | }; |
177 | 180 | ||
178 | BIO_METHOD *BIO_f_reliable(void) | 181 | BIO_METHOD *BIO_f_reliable(void) |
@@ -428,6 +431,20 @@ static long ok_ctrl(BIO *b, int cmd, long num, char *ptr) | |||
428 | return(ret); | 431 | return(ret); |
429 | } | 432 | } |
430 | 433 | ||
434 | static long ok_callback_ctrl(BIO *b, int cmd, void (*fp)()) | ||
435 | { | ||
436 | long ret=1; | ||
437 | |||
438 | if (b->next_bio == NULL) return(0); | ||
439 | switch (cmd) | ||
440 | { | ||
441 | default: | ||
442 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | ||
443 | break; | ||
444 | } | ||
445 | return(ret); | ||
446 | } | ||
447 | |||
431 | static void longswap(void *_ptr, int len) | 448 | static void longswap(void *_ptr, int len) |
432 | { | 449 | { |
433 | #ifndef L_ENDIAN | 450 | #ifndef L_ENDIAN |
@@ -451,12 +468,12 @@ static void sig_out(BIO* b) | |||
451 | if(ctx->buf_len+ 2* md->digest->md_size > OK_BLOCK_SIZE) return; | 468 | if(ctx->buf_len+ 2* md->digest->md_size > OK_BLOCK_SIZE) return; |
452 | 469 | ||
453 | EVP_DigestInit(md, md->digest); | 470 | EVP_DigestInit(md, md->digest); |
454 | RAND_bytes(&(md->md.base[0]), md->digest->md_size); | 471 | RAND_pseudo_bytes(&(md->md.base[0]), md->digest->md_size); |
455 | memcpy(&(ctx->buf[ctx->buf_len]), &(md->md.base[0]), md->digest->md_size); | 472 | memcpy(&(ctx->buf[ctx->buf_len]), &(md->md.base[0]), md->digest->md_size); |
456 | longswap(&(ctx->buf[ctx->buf_len]), md->digest->md_size); | 473 | longswap(&(ctx->buf[ctx->buf_len]), md->digest->md_size); |
457 | ctx->buf_len+= md->digest->md_size; | 474 | ctx->buf_len+= md->digest->md_size; |
458 | 475 | ||
459 | EVP_DigestUpdate(md, (unsigned char*)WELLKNOWN, strlen(WELLKNOWN)); | 476 | EVP_DigestUpdate(md, WELLKNOWN, strlen(WELLKNOWN)); |
460 | md->digest->final(&(ctx->buf[ctx->buf_len]), &(md->md.base[0])); | 477 | md->digest->final(&(ctx->buf[ctx->buf_len]), &(md->md.base[0])); |
461 | ctx->buf_len+= md->digest->md_size; | 478 | ctx->buf_len+= md->digest->md_size; |
462 | ctx->blockout= 1; | 479 | ctx->blockout= 1; |
@@ -480,7 +497,7 @@ static void sig_in(BIO* b) | |||
480 | longswap(&(md->md.base[0]), md->digest->md_size); | 497 | longswap(&(md->md.base[0]), md->digest->md_size); |
481 | ctx->buf_off+= md->digest->md_size; | 498 | ctx->buf_off+= md->digest->md_size; |
482 | 499 | ||
483 | EVP_DigestUpdate(md, (unsigned char*)WELLKNOWN, strlen(WELLKNOWN)); | 500 | EVP_DigestUpdate(md, WELLKNOWN, strlen(WELLKNOWN)); |
484 | md->digest->final(tmp, &(md->md.base[0])); | 501 | md->digest->final(tmp, &(md->md.base[0])); |
485 | ret= memcmp(&(ctx->buf[ctx->buf_off]), tmp, md->digest->md_size) == 0; | 502 | ret= memcmp(&(ctx->buf[ctx->buf_off]), tmp, md->digest->md_size) == 0; |
486 | ctx->buf_off+= md->digest->md_size; | 503 | ctx->buf_off+= md->digest->md_size; |
diff --git a/src/lib/libcrypto/evp/c_all.c b/src/lib/libcrypto/evp/c_all.c index a4d3b43fb9..1e185830a3 100644 --- a/src/lib/libcrypto/evp/c_all.c +++ b/src/lib/libcrypto/evp/c_all.c | |||
@@ -59,135 +59,9 @@ | |||
59 | #include <stdio.h> | 59 | #include <stdio.h> |
60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
61 | #include <openssl/evp.h> | 61 | #include <openssl/evp.h> |
62 | #include <openssl/pkcs12.h> | ||
63 | #include <openssl/objects.h> | ||
64 | 62 | ||
65 | void SSLeay_add_all_algorithms(void) | 63 | void OpenSSL_add_all_algorithms(void) |
66 | { | 64 | { |
67 | SSLeay_add_all_ciphers(); | 65 | OpenSSL_add_all_ciphers(); |
68 | SSLeay_add_all_digests(); | 66 | OpenSSL_add_all_digests(); |
69 | } | 67 | } |
70 | |||
71 | void SSLeay_add_all_ciphers(void) | ||
72 | { | ||
73 | #ifndef NO_DES | ||
74 | EVP_add_cipher(EVP_des_cfb()); | ||
75 | EVP_add_cipher(EVP_des_ede_cfb()); | ||
76 | EVP_add_cipher(EVP_des_ede3_cfb()); | ||
77 | |||
78 | EVP_add_cipher(EVP_des_ofb()); | ||
79 | EVP_add_cipher(EVP_des_ede_ofb()); | ||
80 | EVP_add_cipher(EVP_des_ede3_ofb()); | ||
81 | |||
82 | EVP_add_cipher(EVP_desx_cbc()); | ||
83 | EVP_add_cipher_alias(SN_desx_cbc,"DESX"); | ||
84 | EVP_add_cipher_alias(SN_desx_cbc,"desx"); | ||
85 | |||
86 | EVP_add_cipher(EVP_des_cbc()); | ||
87 | EVP_add_cipher_alias(SN_des_cbc,"DES"); | ||
88 | EVP_add_cipher_alias(SN_des_cbc,"des"); | ||
89 | EVP_add_cipher(EVP_des_ede_cbc()); | ||
90 | EVP_add_cipher(EVP_des_ede3_cbc()); | ||
91 | EVP_add_cipher_alias(SN_des_ede3_cbc,"DES3"); | ||
92 | EVP_add_cipher_alias(SN_des_ede3_cbc,"des3"); | ||
93 | |||
94 | EVP_add_cipher(EVP_des_ecb()); | ||
95 | EVP_add_cipher(EVP_des_ede()); | ||
96 | EVP_add_cipher(EVP_des_ede3()); | ||
97 | #endif | ||
98 | |||
99 | #ifndef NO_RC4 | ||
100 | EVP_add_cipher(EVP_rc4()); | ||
101 | EVP_add_cipher(EVP_rc4_40()); | ||
102 | #endif | ||
103 | |||
104 | #ifndef NO_IDEA | ||
105 | EVP_add_cipher(EVP_idea_ecb()); | ||
106 | EVP_add_cipher(EVP_idea_cfb()); | ||
107 | EVP_add_cipher(EVP_idea_ofb()); | ||
108 | EVP_add_cipher(EVP_idea_cbc()); | ||
109 | EVP_add_cipher_alias(SN_idea_cbc,"IDEA"); | ||
110 | EVP_add_cipher_alias(SN_idea_cbc,"idea"); | ||
111 | #endif | ||
112 | |||
113 | #ifndef NO_RC2 | ||
114 | EVP_add_cipher(EVP_rc2_ecb()); | ||
115 | EVP_add_cipher(EVP_rc2_cfb()); | ||
116 | EVP_add_cipher(EVP_rc2_ofb()); | ||
117 | EVP_add_cipher(EVP_rc2_cbc()); | ||
118 | EVP_add_cipher(EVP_rc2_40_cbc()); | ||
119 | EVP_add_cipher(EVP_rc2_64_cbc()); | ||
120 | EVP_add_cipher_alias(SN_rc2_cbc,"RC2"); | ||
121 | EVP_add_cipher_alias(SN_rc2_cbc,"rc2"); | ||
122 | #endif | ||
123 | |||
124 | #ifndef NO_BF | ||
125 | EVP_add_cipher(EVP_bf_ecb()); | ||
126 | EVP_add_cipher(EVP_bf_cfb()); | ||
127 | EVP_add_cipher(EVP_bf_ofb()); | ||
128 | EVP_add_cipher(EVP_bf_cbc()); | ||
129 | EVP_add_cipher_alias(SN_bf_cbc,"BF"); | ||
130 | EVP_add_cipher_alias(SN_bf_cbc,"bf"); | ||
131 | EVP_add_cipher_alias(SN_bf_cbc,"blowfish"); | ||
132 | #endif | ||
133 | |||
134 | #ifndef NO_CAST | ||
135 | EVP_add_cipher(EVP_cast5_ecb()); | ||
136 | EVP_add_cipher(EVP_cast5_cfb()); | ||
137 | EVP_add_cipher(EVP_cast5_ofb()); | ||
138 | EVP_add_cipher(EVP_cast5_cbc()); | ||
139 | EVP_add_cipher_alias(SN_cast5_cbc,"CAST"); | ||
140 | EVP_add_cipher_alias(SN_cast5_cbc,"cast"); | ||
141 | EVP_add_cipher_alias(SN_cast5_cbc,"CAST-cbc"); | ||
142 | EVP_add_cipher_alias(SN_cast5_cbc,"cast-cbc"); | ||
143 | #endif | ||
144 | |||
145 | #ifndef NO_RC5 | ||
146 | EVP_add_cipher(EVP_rc5_32_12_16_ecb()); | ||
147 | EVP_add_cipher(EVP_rc5_32_12_16_cfb()); | ||
148 | EVP_add_cipher(EVP_rc5_32_12_16_ofb()); | ||
149 | EVP_add_cipher(EVP_rc5_32_12_16_cbc()); | ||
150 | EVP_add_cipher_alias(SN_rc5_cbc,"rc5"); | ||
151 | EVP_add_cipher_alias(SN_rc5_cbc,"RC5"); | ||
152 | #endif | ||
153 | } | ||
154 | |||
155 | |||
156 | void SSLeay_add_all_digests(void) | ||
157 | { | ||
158 | #ifndef NO_MD2 | ||
159 | EVP_add_digest(EVP_md2()); | ||
160 | #endif | ||
161 | #ifndef NO_MD5 | ||
162 | EVP_add_digest(EVP_md5()); | ||
163 | EVP_add_digest_alias(SN_md5,"ssl2-md5"); | ||
164 | EVP_add_digest_alias(SN_md5,"ssl3-md5"); | ||
165 | #endif | ||
166 | #ifndef NO_SHA | ||
167 | EVP_add_digest(EVP_sha()); | ||
168 | #ifndef NO_DSA | ||
169 | EVP_add_digest(EVP_dss()); | ||
170 | #endif | ||
171 | #endif | ||
172 | #ifndef NO_SHA | ||
173 | EVP_add_digest(EVP_sha1()); | ||
174 | EVP_add_digest_alias(SN_sha1,"ssl3-sha1"); | ||
175 | EVP_add_digest_alias(SN_sha1WithRSAEncryption,SN_sha1WithRSA); | ||
176 | #ifndef NO_DSA | ||
177 | EVP_add_digest(EVP_dss1()); | ||
178 | EVP_add_digest_alias(SN_dsaWithSHA1,SN_dsaWithSHA1_2); | ||
179 | EVP_add_digest_alias(SN_dsaWithSHA1,"DSS1"); | ||
180 | EVP_add_digest_alias(SN_dsaWithSHA1,"dss1"); | ||
181 | #endif | ||
182 | #endif | ||
183 | #if !defined(NO_MDC2) && !defined(NO_DES) | ||
184 | EVP_add_digest(EVP_mdc2()); | ||
185 | #endif | ||
186 | #ifndef NO_RIPEMD | ||
187 | EVP_add_digest(EVP_ripemd160()); | ||
188 | EVP_add_digest_alias(SN_ripemd160,"ripemd"); | ||
189 | EVP_add_digest_alias(SN_ripemd160,"rmd160"); | ||
190 | #endif | ||
191 | PKCS12_PBE_add(); | ||
192 | PKCS5_PBE_add(); | ||
193 | } | ||
diff --git a/src/lib/libcrypto/evp/c_allc.c b/src/lib/libcrypto/evp/c_allc.c new file mode 100644 index 0000000000..f24d3756c9 --- /dev/null +++ b/src/lib/libcrypto/evp/c_allc.c | |||
@@ -0,0 +1,149 @@ | |||
1 | /* crypto/evp/c_allc.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 | |||
59 | #include <stdio.h> | ||
60 | #include "cryptlib.h" | ||
61 | #include <openssl/evp.h> | ||
62 | #include <openssl/pkcs12.h> | ||
63 | #include <openssl/objects.h> | ||
64 | |||
65 | void OpenSSL_add_all_ciphers(void) | ||
66 | { | ||
67 | #ifndef NO_DES | ||
68 | EVP_add_cipher(EVP_des_cfb()); | ||
69 | EVP_add_cipher(EVP_des_ede_cfb()); | ||
70 | EVP_add_cipher(EVP_des_ede3_cfb()); | ||
71 | |||
72 | EVP_add_cipher(EVP_des_ofb()); | ||
73 | EVP_add_cipher(EVP_des_ede_ofb()); | ||
74 | EVP_add_cipher(EVP_des_ede3_ofb()); | ||
75 | |||
76 | EVP_add_cipher(EVP_desx_cbc()); | ||
77 | EVP_add_cipher_alias(SN_desx_cbc,"DESX"); | ||
78 | EVP_add_cipher_alias(SN_desx_cbc,"desx"); | ||
79 | |||
80 | EVP_add_cipher(EVP_des_cbc()); | ||
81 | EVP_add_cipher_alias(SN_des_cbc,"DES"); | ||
82 | EVP_add_cipher_alias(SN_des_cbc,"des"); | ||
83 | EVP_add_cipher(EVP_des_ede_cbc()); | ||
84 | EVP_add_cipher(EVP_des_ede3_cbc()); | ||
85 | EVP_add_cipher_alias(SN_des_ede3_cbc,"DES3"); | ||
86 | EVP_add_cipher_alias(SN_des_ede3_cbc,"des3"); | ||
87 | |||
88 | EVP_add_cipher(EVP_des_ecb()); | ||
89 | EVP_add_cipher(EVP_des_ede()); | ||
90 | EVP_add_cipher(EVP_des_ede3()); | ||
91 | #endif | ||
92 | |||
93 | #ifndef NO_RC4 | ||
94 | EVP_add_cipher(EVP_rc4()); | ||
95 | EVP_add_cipher(EVP_rc4_40()); | ||
96 | #endif | ||
97 | |||
98 | #ifndef NO_IDEA | ||
99 | EVP_add_cipher(EVP_idea_ecb()); | ||
100 | EVP_add_cipher(EVP_idea_cfb()); | ||
101 | EVP_add_cipher(EVP_idea_ofb()); | ||
102 | EVP_add_cipher(EVP_idea_cbc()); | ||
103 | EVP_add_cipher_alias(SN_idea_cbc,"IDEA"); | ||
104 | EVP_add_cipher_alias(SN_idea_cbc,"idea"); | ||
105 | #endif | ||
106 | |||
107 | #ifndef NO_RC2 | ||
108 | EVP_add_cipher(EVP_rc2_ecb()); | ||
109 | EVP_add_cipher(EVP_rc2_cfb()); | ||
110 | EVP_add_cipher(EVP_rc2_ofb()); | ||
111 | EVP_add_cipher(EVP_rc2_cbc()); | ||
112 | EVP_add_cipher(EVP_rc2_40_cbc()); | ||
113 | EVP_add_cipher(EVP_rc2_64_cbc()); | ||
114 | EVP_add_cipher_alias(SN_rc2_cbc,"RC2"); | ||
115 | EVP_add_cipher_alias(SN_rc2_cbc,"rc2"); | ||
116 | #endif | ||
117 | |||
118 | #ifndef NO_BF | ||
119 | EVP_add_cipher(EVP_bf_ecb()); | ||
120 | EVP_add_cipher(EVP_bf_cfb()); | ||
121 | EVP_add_cipher(EVP_bf_ofb()); | ||
122 | EVP_add_cipher(EVP_bf_cbc()); | ||
123 | EVP_add_cipher_alias(SN_bf_cbc,"BF"); | ||
124 | EVP_add_cipher_alias(SN_bf_cbc,"bf"); | ||
125 | EVP_add_cipher_alias(SN_bf_cbc,"blowfish"); | ||
126 | #endif | ||
127 | |||
128 | #ifndef NO_CAST | ||
129 | EVP_add_cipher(EVP_cast5_ecb()); | ||
130 | EVP_add_cipher(EVP_cast5_cfb()); | ||
131 | EVP_add_cipher(EVP_cast5_ofb()); | ||
132 | EVP_add_cipher(EVP_cast5_cbc()); | ||
133 | EVP_add_cipher_alias(SN_cast5_cbc,"CAST"); | ||
134 | EVP_add_cipher_alias(SN_cast5_cbc,"cast"); | ||
135 | EVP_add_cipher_alias(SN_cast5_cbc,"CAST-cbc"); | ||
136 | EVP_add_cipher_alias(SN_cast5_cbc,"cast-cbc"); | ||
137 | #endif | ||
138 | |||
139 | #ifndef NO_RC5 | ||
140 | EVP_add_cipher(EVP_rc5_32_12_16_ecb()); | ||
141 | EVP_add_cipher(EVP_rc5_32_12_16_cfb()); | ||
142 | EVP_add_cipher(EVP_rc5_32_12_16_ofb()); | ||
143 | EVP_add_cipher(EVP_rc5_32_12_16_cbc()); | ||
144 | EVP_add_cipher_alias(SN_rc5_cbc,"rc5"); | ||
145 | EVP_add_cipher_alias(SN_rc5_cbc,"RC5"); | ||
146 | #endif | ||
147 | PKCS12_PBE_add(); | ||
148 | PKCS5_PBE_add(); | ||
149 | } | ||
diff --git a/src/lib/libcrypto/evp/c_alld.c b/src/lib/libcrypto/evp/c_alld.c new file mode 100644 index 0000000000..febe51a3ee --- /dev/null +++ b/src/lib/libcrypto/evp/c_alld.c | |||
@@ -0,0 +1,100 @@ | |||
1 | /* crypto/evp/c_alld.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 | |||
59 | #include <stdio.h> | ||
60 | #include "cryptlib.h" | ||
61 | #include <openssl/evp.h> | ||
62 | #include <openssl/pkcs12.h> | ||
63 | #include <openssl/objects.h> | ||
64 | |||
65 | void OpenSSL_add_all_digests(void) | ||
66 | { | ||
67 | #ifndef NO_MD2 | ||
68 | EVP_add_digest(EVP_md2()); | ||
69 | #endif | ||
70 | #ifndef NO_MD5 | ||
71 | EVP_add_digest(EVP_md5()); | ||
72 | EVP_add_digest_alias(SN_md5,"ssl2-md5"); | ||
73 | EVP_add_digest_alias(SN_md5,"ssl3-md5"); | ||
74 | #endif | ||
75 | #ifndef NO_SHA | ||
76 | EVP_add_digest(EVP_sha()); | ||
77 | #ifndef NO_DSA | ||
78 | EVP_add_digest(EVP_dss()); | ||
79 | #endif | ||
80 | #endif | ||
81 | #ifndef NO_SHA | ||
82 | EVP_add_digest(EVP_sha1()); | ||
83 | EVP_add_digest_alias(SN_sha1,"ssl3-sha1"); | ||
84 | EVP_add_digest_alias(SN_sha1WithRSAEncryption,SN_sha1WithRSA); | ||
85 | #ifndef NO_DSA | ||
86 | EVP_add_digest(EVP_dss1()); | ||
87 | EVP_add_digest_alias(SN_dsaWithSHA1,SN_dsaWithSHA1_2); | ||
88 | EVP_add_digest_alias(SN_dsaWithSHA1,"DSS1"); | ||
89 | EVP_add_digest_alias(SN_dsaWithSHA1,"dss1"); | ||
90 | #endif | ||
91 | #endif | ||
92 | #if !defined(NO_MDC2) && !defined(NO_DES) | ||
93 | EVP_add_digest(EVP_mdc2()); | ||
94 | #endif | ||
95 | #ifndef NO_RIPEMD | ||
96 | EVP_add_digest(EVP_ripemd160()); | ||
97 | EVP_add_digest_alias(SN_ripemd160,"ripemd"); | ||
98 | EVP_add_digest_alias(SN_ripemd160,"rmd160"); | ||
99 | #endif | ||
100 | } | ||
diff --git a/src/lib/libcrypto/evp/e_cbc_3d.c b/src/lib/libcrypto/evp/e_cbc_3d.c index 02ccc6dc90..5d16b865c5 100644 --- a/src/lib/libcrypto/evp/e_cbc_3d.c +++ b/src/lib/libcrypto/evp/e_cbc_3d.c | |||
@@ -115,8 +115,8 @@ static void des_cbc_ede_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
115 | 115 | ||
116 | if (deskey != NULL) | 116 | if (deskey != NULL) |
117 | { | 117 | { |
118 | des_set_key(&deskey[0],ctx->c.des_ede.ks1); | 118 | des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1); |
119 | des_set_key(&deskey[1],ctx->c.des_ede.ks2); | 119 | des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2); |
120 | memcpy( (char *)ctx->c.des_ede.ks3, | 120 | memcpy( (char *)ctx->c.des_ede.ks3, |
121 | (char *)ctx->c.des_ede.ks1, | 121 | (char *)ctx->c.des_ede.ks1, |
122 | sizeof(ctx->c.des_ede.ks1)); | 122 | sizeof(ctx->c.des_ede.ks1)); |
@@ -134,9 +134,9 @@ static void des_cbc_ede3_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
134 | 134 | ||
135 | if (deskey != NULL) | 135 | if (deskey != NULL) |
136 | { | 136 | { |
137 | des_set_key(&deskey[0],ctx->c.des_ede.ks1); | 137 | des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1); |
138 | des_set_key(&deskey[1],ctx->c.des_ede.ks2); | 138 | des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2); |
139 | des_set_key(&deskey[2],ctx->c.des_ede.ks3); | 139 | des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3); |
140 | } | 140 | } |
141 | } | 141 | } |
142 | 142 | ||
diff --git a/src/lib/libcrypto/evp/e_cbc_d.c b/src/lib/libcrypto/evp/e_cbc_d.c index 9203f3f52d..5b4e5b8601 100644 --- a/src/lib/libcrypto/evp/e_cbc_d.c +++ b/src/lib/libcrypto/evp/e_cbc_d.c | |||
@@ -93,7 +93,7 @@ static void des_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
93 | memcpy(&(ctx->oiv[0]),iv,8); | 93 | memcpy(&(ctx->oiv[0]),iv,8); |
94 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); | 94 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); |
95 | if (deskey != NULL) | 95 | if (deskey != NULL) |
96 | des_set_key(deskey,ctx->c.des_ks); | 96 | des_set_key_unchecked(deskey,ctx->c.des_ks); |
97 | } | 97 | } |
98 | 98 | ||
99 | static void des_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 99 | static void des_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
diff --git a/src/lib/libcrypto/evp/e_cfb_3d.c b/src/lib/libcrypto/evp/e_cfb_3d.c index bd32b072e2..b364bd4e31 100644 --- a/src/lib/libcrypto/evp/e_cfb_3d.c +++ b/src/lib/libcrypto/evp/e_cfb_3d.c | |||
@@ -116,8 +116,8 @@ static void des_ede_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
116 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); | 116 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); |
117 | if (deskey != NULL) | 117 | if (deskey != NULL) |
118 | { | 118 | { |
119 | des_set_key(&deskey[0],ctx->c.des_ede.ks1); | 119 | des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1); |
120 | des_set_key(&deskey[1],ctx->c.des_ede.ks2); | 120 | des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2); |
121 | memcpy( (char *)ctx->c.des_ede.ks3, | 121 | memcpy( (char *)ctx->c.des_ede.ks3, |
122 | (char *)ctx->c.des_ede.ks1, | 122 | (char *)ctx->c.des_ede.ks1, |
123 | sizeof(ctx->c.des_ede.ks1)); | 123 | sizeof(ctx->c.des_ede.ks1)); |
@@ -136,9 +136,9 @@ static void des_ede3_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
136 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); | 136 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); |
137 | if (deskey != NULL) | 137 | if (deskey != NULL) |
138 | { | 138 | { |
139 | des_set_key(&deskey[0],ctx->c.des_ede.ks1); | 139 | des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1); |
140 | des_set_key(&deskey[1],ctx->c.des_ede.ks2); | 140 | des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2); |
141 | des_set_key(&deskey[2],ctx->c.des_ede.ks3); | 141 | des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3); |
142 | } | 142 | } |
143 | } | 143 | } |
144 | 144 | ||
diff --git a/src/lib/libcrypto/evp/e_cfb_d.c b/src/lib/libcrypto/evp/e_cfb_d.c index 6bdf20b646..9e1714bd15 100644 --- a/src/lib/libcrypto/evp/e_cfb_d.c +++ b/src/lib/libcrypto/evp/e_cfb_d.c | |||
@@ -95,7 +95,7 @@ static void des_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
95 | memcpy(&(ctx->oiv[0]),iv,8); | 95 | memcpy(&(ctx->oiv[0]),iv,8); |
96 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); | 96 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); |
97 | if (deskey != NULL) | 97 | if (deskey != NULL) |
98 | des_set_key(deskey,ctx->c.des_ks); | 98 | des_set_key_unchecked(deskey,ctx->c.des_ks); |
99 | } | 99 | } |
100 | 100 | ||
101 | static void des_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 101 | static void des_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
diff --git a/src/lib/libcrypto/evp/e_ecb_3d.c b/src/lib/libcrypto/evp/e_ecb_3d.c index 354a8b79a7..806e971d36 100644 --- a/src/lib/libcrypto/evp/e_ecb_3d.c +++ b/src/lib/libcrypto/evp/e_ecb_3d.c | |||
@@ -110,8 +110,8 @@ static void des_ede_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
110 | 110 | ||
111 | if (deskey != NULL) | 111 | if (deskey != NULL) |
112 | { | 112 | { |
113 | des_set_key(&deskey[0],ctx->c.des_ede.ks1); | 113 | des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1); |
114 | des_set_key(&deskey[1],ctx->c.des_ede.ks2); | 114 | des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2); |
115 | memcpy( (char *)ctx->c.des_ede.ks3, | 115 | memcpy( (char *)ctx->c.des_ede.ks3, |
116 | (char *)ctx->c.des_ede.ks1, | 116 | (char *)ctx->c.des_ede.ks1, |
117 | sizeof(ctx->c.des_ede.ks1)); | 117 | sizeof(ctx->c.des_ede.ks1)); |
@@ -125,9 +125,9 @@ static void des_ede3_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
125 | 125 | ||
126 | if (deskey != NULL) | 126 | if (deskey != NULL) |
127 | { | 127 | { |
128 | des_set_key(&deskey[0],ctx->c.des_ede.ks1); | 128 | des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1); |
129 | des_set_key(&deskey[1],ctx->c.des_ede.ks2); | 129 | des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2); |
130 | des_set_key(&deskey[2],ctx->c.des_ede.ks3); | 130 | des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3); |
131 | } | 131 | } |
132 | } | 132 | } |
133 | 133 | ||
diff --git a/src/lib/libcrypto/evp/e_ecb_d.c b/src/lib/libcrypto/evp/e_ecb_d.c index 5fb4e64b1c..c11bef55ef 100644 --- a/src/lib/libcrypto/evp/e_ecb_d.c +++ b/src/lib/libcrypto/evp/e_ecb_d.c | |||
@@ -90,7 +90,7 @@ static void des_ecb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
90 | des_cblock *deskey = (des_cblock *)key; | 90 | des_cblock *deskey = (des_cblock *)key; |
91 | 91 | ||
92 | if (deskey != NULL) | 92 | if (deskey != NULL) |
93 | des_set_key(deskey,ctx->c.des_ks); | 93 | des_set_key_unchecked(deskey,ctx->c.des_ks); |
94 | } | 94 | } |
95 | 95 | ||
96 | static void des_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 96 | static void des_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
diff --git a/src/lib/libcrypto/evp/e_ofb_3d.c b/src/lib/libcrypto/evp/e_ofb_3d.c index 5233567c0c..d1a33e2ecd 100644 --- a/src/lib/libcrypto/evp/e_ofb_3d.c +++ b/src/lib/libcrypto/evp/e_ofb_3d.c | |||
@@ -116,8 +116,8 @@ static void des_ede_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
116 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); | 116 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); |
117 | if (deskey != NULL) | 117 | if (deskey != NULL) |
118 | { | 118 | { |
119 | des_set_key(&deskey[0],ctx->c.des_ede.ks1); | 119 | des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1); |
120 | des_set_key(&deskey[1],ctx->c.des_ede.ks2); | 120 | des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2); |
121 | memcpy( (char *)ctx->c.des_ede.ks3, | 121 | memcpy( (char *)ctx->c.des_ede.ks3, |
122 | (char *)ctx->c.des_ede.ks1, | 122 | (char *)ctx->c.des_ede.ks1, |
123 | sizeof(ctx->c.des_ede.ks1)); | 123 | sizeof(ctx->c.des_ede.ks1)); |
@@ -136,9 +136,9 @@ static void des_ede3_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
136 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); | 136 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); |
137 | if (deskey != NULL) | 137 | if (deskey != NULL) |
138 | { | 138 | { |
139 | des_set_key(&deskey[0],ctx->c.des_ede.ks1); | 139 | des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1); |
140 | des_set_key(&deskey[1],ctx->c.des_ede.ks2); | 140 | des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2); |
141 | des_set_key(&deskey[2],ctx->c.des_ede.ks3); | 141 | des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3); |
142 | } | 142 | } |
143 | } | 143 | } |
144 | 144 | ||
diff --git a/src/lib/libcrypto/evp/e_ofb_d.c b/src/lib/libcrypto/evp/e_ofb_d.c index 398b3a002e..d51ce230f4 100644 --- a/src/lib/libcrypto/evp/e_ofb_d.c +++ b/src/lib/libcrypto/evp/e_ofb_d.c | |||
@@ -95,7 +95,7 @@ static void des_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
95 | memcpy(&(ctx->oiv[0]),iv,8); | 95 | memcpy(&(ctx->oiv[0]),iv,8); |
96 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); | 96 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); |
97 | if (deskey != NULL) | 97 | if (deskey != NULL) |
98 | des_set_key(deskey,ctx->c.des_ks); | 98 | des_set_key_unchecked(deskey,ctx->c.des_ks); |
99 | } | 99 | } |
100 | 100 | ||
101 | static void des_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 101 | static void des_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
diff --git a/src/lib/libcrypto/evp/e_xcbc_d.c b/src/lib/libcrypto/evp/e_xcbc_d.c index 3a6628a75c..7568fad4ff 100644 --- a/src/lib/libcrypto/evp/e_xcbc_d.c +++ b/src/lib/libcrypto/evp/e_xcbc_d.c | |||
@@ -94,7 +94,7 @@ static void desx_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | |||
94 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); | 94 | memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8); |
95 | if (deskey != NULL) | 95 | if (deskey != NULL) |
96 | { | 96 | { |
97 | des_set_key(deskey,ctx->c.desx_cbc.ks); | 97 | des_set_key_unchecked(deskey,ctx->c.desx_cbc.ks); |
98 | memcpy(&(ctx->c.desx_cbc.inw[0]),&(key[8]),8); | 98 | memcpy(&(ctx->c.desx_cbc.inw[0]),&(key[8]),8); |
99 | memcpy(&(ctx->c.desx_cbc.outw[0]),&(key[16]),8); | 99 | memcpy(&(ctx->c.desx_cbc.outw[0]),&(key[16]),8); |
100 | } | 100 | } |
diff --git a/src/lib/libcrypto/evp/encode.c b/src/lib/libcrypto/evp/encode.c index 0152624a76..14a4cb11f6 100644 --- a/src/lib/libcrypto/evp/encode.c +++ b/src/lib/libcrypto/evp/encode.c | |||
@@ -185,7 +185,7 @@ void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl) | |||
185 | *outl=ret; | 185 | *outl=ret; |
186 | } | 186 | } |
187 | 187 | ||
188 | int EVP_EncodeBlock(unsigned char *t, unsigned char *f, int dlen) | 188 | int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int dlen) |
189 | { | 189 | { |
190 | int i,ret=0; | 190 | int i,ret=0; |
191 | unsigned long l; | 191 | unsigned long l; |
@@ -337,7 +337,7 @@ end: | |||
337 | return(rv); | 337 | return(rv); |
338 | } | 338 | } |
339 | 339 | ||
340 | int EVP_DecodeBlock(unsigned char *t, unsigned char *f, int n) | 340 | int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n) |
341 | { | 341 | { |
342 | int i,ret=0,a,b,c,d; | 342 | int i,ret=0,a,b,c,d; |
343 | unsigned long l; | 343 | unsigned long l; |
diff --git a/src/lib/libcrypto/evp/evp.h b/src/lib/libcrypto/evp/evp.h index 570fe27d39..54215b0905 100644 --- a/src/lib/libcrypto/evp/evp.h +++ b/src/lib/libcrypto/evp/evp.h | |||
@@ -149,7 +149,7 @@ extern "C" { | |||
149 | 149 | ||
150 | /* Type needs to be a bit field | 150 | /* Type needs to be a bit field |
151 | * Sub-type needs to be for variations on the method, as in, can it do | 151 | * Sub-type needs to be for variations on the method, as in, can it do |
152 | * arbitary encryption.... */ | 152 | * arbitrary encryption.... */ |
153 | typedef struct evp_pkey_st | 153 | typedef struct evp_pkey_st |
154 | { | 154 | { |
155 | int type; | 155 | int type; |
@@ -343,7 +343,7 @@ typedef struct evp_cipher_ctx_st | |||
343 | unsigned char buf[EVP_MAX_IV_LENGTH]; /* saved partial block */ | 343 | unsigned char buf[EVP_MAX_IV_LENGTH]; /* saved partial block */ |
344 | int num; /* used by cfb/ofb mode */ | 344 | int num; /* used by cfb/ofb mode */ |
345 | 345 | ||
346 | char *app_data; /* aplication stuff */ | 346 | char *app_data; /* application stuff */ |
347 | union { | 347 | union { |
348 | #ifndef NO_RC4 | 348 | #ifndef NO_RC4 |
349 | struct | 349 | struct |
@@ -421,9 +421,10 @@ typedef int (EVP_PBE_KEYGEN)(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, | |||
421 | #define EVP_MD_size(e) ((e)->md_size) | 421 | #define EVP_MD_size(e) ((e)->md_size) |
422 | #define EVP_MD_block_size(e) ((e)->block_size) | 422 | #define EVP_MD_block_size(e) ((e)->block_size) |
423 | 423 | ||
424 | #define EVP_MD_CTX_md(e) ((e)->digest) | ||
424 | #define EVP_MD_CTX_size(e) EVP_MD_size((e)->digest) | 425 | #define EVP_MD_CTX_size(e) EVP_MD_size((e)->digest) |
425 | #define EVP_MD_CTX_block_size(e) EVP_MD_block_size((e)->digest) | 426 | #define EVP_MD_CTX_block_size(e) EVP_MD_block_size((e)->digest) |
426 | #define EVP_MD_CTX_type(e) ((e)->digest) | 427 | #define EVP_MD_CTX_type(e) EVP_MD_type((e)->digest) |
427 | 428 | ||
428 | #define EVP_CIPHER_nid(e) ((e)->nid) | 429 | #define EVP_CIPHER_nid(e) ((e)->nid) |
429 | #define EVP_CIPHER_block_size(e) ((e)->block_size) | 430 | #define EVP_CIPHER_block_size(e) ((e)->block_size) |
@@ -521,15 +522,14 @@ void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); | |||
521 | void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out, | 522 | void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out, |
522 | int *outl,unsigned char *in,int inl); | 523 | int *outl,unsigned char *in,int inl); |
523 | void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl); | 524 | void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl); |
524 | int EVP_EncodeBlock(unsigned char *t, unsigned char *f, int n); | 525 | int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n); |
525 | 526 | ||
526 | void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); | 527 | void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); |
527 | int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl, | 528 | int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl, |
528 | unsigned char *in, int inl); | 529 | unsigned char *in, int inl); |
529 | int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned | 530 | int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned |
530 | char *out, int *outl); | 531 | char *out, int *outl); |
531 | int EVP_DecodeBlock(unsigned char *t, unsigned | 532 | int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n); |
532 | char *f, int n); | ||
533 | 533 | ||
534 | void ERR_load_EVP_strings(void ); | 534 | void ERR_load_EVP_strings(void ); |
535 | 535 | ||
@@ -594,9 +594,12 @@ EVP_CIPHER *EVP_rc5_32_12_16_ecb(void); | |||
594 | EVP_CIPHER *EVP_rc5_32_12_16_cfb(void); | 594 | EVP_CIPHER *EVP_rc5_32_12_16_cfb(void); |
595 | EVP_CIPHER *EVP_rc5_32_12_16_ofb(void); | 595 | EVP_CIPHER *EVP_rc5_32_12_16_ofb(void); |
596 | 596 | ||
597 | void SSLeay_add_all_algorithms(void); | 597 | void OpenSSL_add_all_algorithms(void); |
598 | void SSLeay_add_all_ciphers(void); | 598 | void OpenSSL_add_all_ciphers(void); |
599 | void SSLeay_add_all_digests(void); | 599 | void OpenSSL_add_all_digests(void); |
600 | #define SSLeay_add_all_algorithms() OpenSSL_add_all_algorithms() | ||
601 | #define SSLeay_add_all_ciphers() OpenSSL_add_all_ciphers() | ||
602 | #define SSLeay_add_all_digests() OpenSSL_add_all_digests() | ||
600 | 603 | ||
601 | int EVP_add_cipher(EVP_CIPHER *cipher); | 604 | int EVP_add_cipher(EVP_CIPHER *cipher); |
602 | int EVP_add_digest(EVP_MD *digest); | 605 | int EVP_add_digest(EVP_MD *digest); |
@@ -613,6 +616,18 @@ int EVP_PKEY_type(int type); | |||
613 | int EVP_PKEY_bits(EVP_PKEY *pkey); | 616 | int EVP_PKEY_bits(EVP_PKEY *pkey); |
614 | int EVP_PKEY_size(EVP_PKEY *pkey); | 617 | int EVP_PKEY_size(EVP_PKEY *pkey); |
615 | int EVP_PKEY_assign(EVP_PKEY *pkey,int type,char *key); | 618 | int EVP_PKEY_assign(EVP_PKEY *pkey,int type,char *key); |
619 | #ifndef NO_RSA | ||
620 | int EVP_PKEY_set1_RSA(EVP_PKEY *pkey,RSA *key); | ||
621 | RSA * EVP_PKEY_get1_RSA(EVP_PKEY *pkey); | ||
622 | #endif | ||
623 | #ifndef NO_DSA | ||
624 | int EVP_PKEY_set1_DSA(EVP_PKEY *pkey,DSA *key); | ||
625 | DSA * EVP_PKEY_get1_DSA(EVP_PKEY *pkey); | ||
626 | #endif | ||
627 | #ifndef NO_DH | ||
628 | int EVP_PKEY_set1_DH(EVP_PKEY *pkey,DH *key); | ||
629 | DH * EVP_PKEY_get1_DH(EVP_PKEY *pkey); | ||
630 | #endif | ||
616 | EVP_PKEY * EVP_PKEY_new(void); | 631 | EVP_PKEY * EVP_PKEY_new(void); |
617 | void EVP_PKEY_free(EVP_PKEY *pkey); | 632 | void EVP_PKEY_free(EVP_PKEY *pkey); |
618 | EVP_PKEY * d2i_PublicKey(int type,EVP_PKEY **a, unsigned char **pp, | 633 | EVP_PKEY * d2i_PublicKey(int type,EVP_PKEY **a, unsigned char **pp, |
@@ -621,6 +636,8 @@ int i2d_PublicKey(EVP_PKEY *a, unsigned char **pp); | |||
621 | 636 | ||
622 | EVP_PKEY * d2i_PrivateKey(int type,EVP_PKEY **a, unsigned char **pp, | 637 | EVP_PKEY * d2i_PrivateKey(int type,EVP_PKEY **a, unsigned char **pp, |
623 | long length); | 638 | long length); |
639 | EVP_PKEY * d2i_AutoPrivateKey(EVP_PKEY **a, unsigned char **pp, | ||
640 | long length); | ||
624 | int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp); | 641 | int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp); |
625 | 642 | ||
626 | int EVP_PKEY_copy_parameters(EVP_PKEY *to,EVP_PKEY *from); | 643 | int EVP_PKEY_copy_parameters(EVP_PKEY *to,EVP_PKEY *from); |
@@ -677,6 +694,9 @@ void EVP_PBE_cleanup(void); | |||
677 | #define EVP_F_EVP_PKEY_COPY_PARAMETERS 103 | 694 | #define EVP_F_EVP_PKEY_COPY_PARAMETERS 103 |
678 | #define EVP_F_EVP_PKEY_DECRYPT 104 | 695 | #define EVP_F_EVP_PKEY_DECRYPT 104 |
679 | #define EVP_F_EVP_PKEY_ENCRYPT 105 | 696 | #define EVP_F_EVP_PKEY_ENCRYPT 105 |
697 | #define EVP_F_EVP_PKEY_GET1_DH 119 | ||
698 | #define EVP_F_EVP_PKEY_GET1_DSA 120 | ||
699 | #define EVP_F_EVP_PKEY_GET1_RSA 121 | ||
680 | #define EVP_F_EVP_PKEY_NEW 106 | 700 | #define EVP_F_EVP_PKEY_NEW 106 |
681 | #define EVP_F_EVP_SIGNFINAL 107 | 701 | #define EVP_F_EVP_SIGNFINAL 107 |
682 | #define EVP_F_EVP_VERIFYFINAL 108 | 702 | #define EVP_F_EVP_VERIFYFINAL 108 |
@@ -693,10 +713,13 @@ void EVP_PBE_cleanup(void); | |||
693 | #define EVP_R_DIFFERENT_KEY_TYPES 101 | 713 | #define EVP_R_DIFFERENT_KEY_TYPES 101 |
694 | #define EVP_R_ENCODE_ERROR 115 | 714 | #define EVP_R_ENCODE_ERROR 115 |
695 | #define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 | 715 | #define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 |
716 | #define EVP_R_EXPECTING_AN_RSA_KEY 127 | ||
717 | #define EVP_R_EXPECTING_A_DH_KEY 128 | ||
718 | #define EVP_R_EXPECTING_A_DSA_KEY 129 | ||
696 | #define EVP_R_INPUT_NOT_INITIALIZED 111 | 719 | #define EVP_R_INPUT_NOT_INITIALIZED 111 |
697 | #define EVP_R_IV_TOO_LARGE 102 | 720 | #define EVP_R_IV_TOO_LARGE 102 |
698 | #define EVP_R_KEYGEN_FAILURE 120 | 721 | #define EVP_R_KEYGEN_FAILURE 120 |
699 | #define EVP_R_MISSING_PARMATERS 103 | 722 | #define EVP_R_MISSING_PARAMETERS 103 |
700 | #define EVP_R_NO_DSA_PARAMETERS 116 | 723 | #define EVP_R_NO_DSA_PARAMETERS 116 |
701 | #define EVP_R_NO_SIGN_FUNCTION_CONFIGURED 104 | 724 | #define EVP_R_NO_SIGN_FUNCTION_CONFIGURED 104 |
702 | #define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED 105 | 725 | #define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED 105 |
diff --git a/src/lib/libcrypto/evp/evp_err.c b/src/lib/libcrypto/evp/evp_err.c index c61cc922e8..97953a0fc1 100644 --- a/src/lib/libcrypto/evp/evp_err.c +++ b/src/lib/libcrypto/evp/evp_err.c | |||
@@ -77,6 +77,9 @@ static ERR_STRING_DATA EVP_str_functs[]= | |||
77 | {ERR_PACK(0,EVP_F_EVP_PKEY_COPY_PARAMETERS,0), "EVP_PKEY_copy_parameters"}, | 77 | {ERR_PACK(0,EVP_F_EVP_PKEY_COPY_PARAMETERS,0), "EVP_PKEY_copy_parameters"}, |
78 | {ERR_PACK(0,EVP_F_EVP_PKEY_DECRYPT,0), "EVP_PKEY_decrypt"}, | 78 | {ERR_PACK(0,EVP_F_EVP_PKEY_DECRYPT,0), "EVP_PKEY_decrypt"}, |
79 | {ERR_PACK(0,EVP_F_EVP_PKEY_ENCRYPT,0), "EVP_PKEY_encrypt"}, | 79 | {ERR_PACK(0,EVP_F_EVP_PKEY_ENCRYPT,0), "EVP_PKEY_encrypt"}, |
80 | {ERR_PACK(0,EVP_F_EVP_PKEY_GET1_DH,0), "EVP_PKEY_get1_DH"}, | ||
81 | {ERR_PACK(0,EVP_F_EVP_PKEY_GET1_DSA,0), "EVP_PKEY_get1_DSA"}, | ||
82 | {ERR_PACK(0,EVP_F_EVP_PKEY_GET1_RSA,0), "EVP_PKEY_get1_RSA"}, | ||
80 | {ERR_PACK(0,EVP_F_EVP_PKEY_NEW,0), "EVP_PKEY_new"}, | 83 | {ERR_PACK(0,EVP_F_EVP_PKEY_NEW,0), "EVP_PKEY_new"}, |
81 | {ERR_PACK(0,EVP_F_EVP_SIGNFINAL,0), "EVP_SignFinal"}, | 84 | {ERR_PACK(0,EVP_F_EVP_SIGNFINAL,0), "EVP_SignFinal"}, |
82 | {ERR_PACK(0,EVP_F_EVP_VERIFYFINAL,0), "EVP_VerifyFinal"}, | 85 | {ERR_PACK(0,EVP_F_EVP_VERIFYFINAL,0), "EVP_VerifyFinal"}, |
@@ -96,10 +99,13 @@ static ERR_STRING_DATA EVP_str_reasons[]= | |||
96 | {EVP_R_DIFFERENT_KEY_TYPES ,"different key types"}, | 99 | {EVP_R_DIFFERENT_KEY_TYPES ,"different key types"}, |
97 | {EVP_R_ENCODE_ERROR ,"encode error"}, | 100 | {EVP_R_ENCODE_ERROR ,"encode error"}, |
98 | {EVP_R_EVP_PBE_CIPHERINIT_ERROR ,"evp pbe cipherinit error"}, | 101 | {EVP_R_EVP_PBE_CIPHERINIT_ERROR ,"evp pbe cipherinit error"}, |
102 | {EVP_R_EXPECTING_AN_RSA_KEY ,"expecting an rsa key"}, | ||
103 | {EVP_R_EXPECTING_A_DH_KEY ,"expecting a dh key"}, | ||
104 | {EVP_R_EXPECTING_A_DSA_KEY ,"expecting a dsa key"}, | ||
99 | {EVP_R_INPUT_NOT_INITIALIZED ,"input not initialized"}, | 105 | {EVP_R_INPUT_NOT_INITIALIZED ,"input not initialized"}, |
100 | {EVP_R_IV_TOO_LARGE ,"iv too large"}, | 106 | {EVP_R_IV_TOO_LARGE ,"iv too large"}, |
101 | {EVP_R_KEYGEN_FAILURE ,"keygen failure"}, | 107 | {EVP_R_KEYGEN_FAILURE ,"keygen failure"}, |
102 | {EVP_R_MISSING_PARMATERS ,"missing parmaters"}, | 108 | {EVP_R_MISSING_PARAMETERS ,"missing parameters"}, |
103 | {EVP_R_NO_DSA_PARAMETERS ,"no dsa parameters"}, | 109 | {EVP_R_NO_DSA_PARAMETERS ,"no dsa parameters"}, |
104 | {EVP_R_NO_SIGN_FUNCTION_CONFIGURED ,"no sign function configured"}, | 110 | {EVP_R_NO_SIGN_FUNCTION_CONFIGURED ,"no sign function configured"}, |
105 | {EVP_R_NO_VERIFY_FUNCTION_CONFIGURED ,"no verify function configured"}, | 111 | {EVP_R_NO_VERIFY_FUNCTION_CONFIGURED ,"no verify function configured"}, |
diff --git a/src/lib/libcrypto/evp/evp_key.c b/src/lib/libcrypto/evp/evp_key.c index 21eda418bc..667c21cca8 100644 --- a/src/lib/libcrypto/evp/evp_key.c +++ b/src/lib/libcrypto/evp/evp_key.c | |||
@@ -81,15 +81,18 @@ char *EVP_get_pw_prompt(void) | |||
81 | return(prompt_string); | 81 | return(prompt_string); |
82 | } | 82 | } |
83 | 83 | ||
84 | #ifdef NO_DES | 84 | /* For historical reasons, the standard function for reading passwords is |
85 | int des_read_pw_string(char *buf,int len,const char *prompt,int verify); | 85 | * in the DES library -- if someone ever wants to disable DES, |
86 | #endif | 86 | * this function will fail */ |
87 | |||
88 | int EVP_read_pw_string(char *buf, int len, const char *prompt, int verify) | 87 | int EVP_read_pw_string(char *buf, int len, const char *prompt, int verify) |
89 | { | 88 | { |
89 | #ifndef NO_DES | ||
90 | if ((prompt == NULL) && (prompt_string[0] != '\0')) | 90 | if ((prompt == NULL) && (prompt_string[0] != '\0')) |
91 | prompt=prompt_string; | 91 | prompt=prompt_string; |
92 | return(des_read_pw_string(buf,len,prompt,verify)); | 92 | return(des_read_pw_string(buf,len,prompt,verify)); |
93 | #else | ||
94 | return -1; | ||
95 | #endif | ||
93 | } | 96 | } |
94 | 97 | ||
95 | int EVP_BytesToKey(const EVP_CIPHER *type, EVP_MD *md, unsigned char *salt, | 98 | int EVP_BytesToKey(const EVP_CIPHER *type, EVP_MD *md, unsigned char *salt, |
diff --git a/src/lib/libcrypto/evp/evp_lib.c b/src/lib/libcrypto/evp/evp_lib.c index 3f9bf55828..a431945ef5 100644 --- a/src/lib/libcrypto/evp/evp_lib.c +++ b/src/lib/libcrypto/evp/evp_lib.c | |||
@@ -115,6 +115,7 @@ int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type) | |||
115 | int EVP_CIPHER_type(const EVP_CIPHER *ctx) | 115 | int EVP_CIPHER_type(const EVP_CIPHER *ctx) |
116 | { | 116 | { |
117 | int nid; | 117 | int nid; |
118 | ASN1_OBJECT *otmp; | ||
118 | nid = EVP_CIPHER_nid(ctx); | 119 | nid = EVP_CIPHER_nid(ctx); |
119 | 120 | ||
120 | switch(nid) { | 121 | switch(nid) { |
@@ -131,7 +132,10 @@ int EVP_CIPHER_type(const EVP_CIPHER *ctx) | |||
131 | return NID_rc4; | 132 | return NID_rc4; |
132 | 133 | ||
133 | default: | 134 | default: |
134 | 135 | /* Check it has an OID and it is valid */ | |
136 | otmp = OBJ_nid2obj(nid); | ||
137 | if(!otmp || !otmp->data) nid = NID_undef; | ||
138 | ASN1_OBJECT_free(otmp); | ||
135 | return nid; | 139 | return nid; |
136 | } | 140 | } |
137 | } | 141 | } |
diff --git a/src/lib/libcrypto/evp/evp_pkey.c b/src/lib/libcrypto/evp/evp_pkey.c index 421e452db1..d5e6f5880f 100644 --- a/src/lib/libcrypto/evp/evp_pkey.c +++ b/src/lib/libcrypto/evp/evp_pkey.c | |||
@@ -62,19 +62,22 @@ | |||
62 | #include <openssl/x509.h> | 62 | #include <openssl/x509.h> |
63 | #include <openssl/rand.h> | 63 | #include <openssl/rand.h> |
64 | 64 | ||
65 | static int dsa_pkey2pkcs8(PKCS8_PRIV_KEY_INFO *p8inf, EVP_PKEY *pkey); | ||
66 | |||
65 | /* Extract a private key from a PKCS8 structure */ | 67 | /* Extract a private key from a PKCS8 structure */ |
66 | 68 | ||
67 | EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8) | 69 | EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8) |
68 | { | 70 | { |
69 | EVP_PKEY *pkey; | 71 | EVP_PKEY *pkey = NULL; |
70 | #ifndef NO_RSA | 72 | #ifndef NO_RSA |
71 | RSA *rsa; | 73 | RSA *rsa = NULL; |
72 | #endif | 74 | #endif |
73 | #ifndef NO_DSA | 75 | #ifndef NO_DSA |
74 | DSA *dsa; | 76 | DSA *dsa = NULL; |
75 | ASN1_INTEGER *dsapriv; | 77 | ASN1_INTEGER *privkey; |
76 | STACK *ndsa; | 78 | ASN1_TYPE *t1, *t2, *param = NULL; |
77 | BN_CTX *ctx; | 79 | STACK *ndsa = NULL; |
80 | BN_CTX *ctx = NULL; | ||
78 | int plen; | 81 | int plen; |
79 | #endif | 82 | #endif |
80 | X509_ALGOR *a; | 83 | X509_ALGOR *a; |
@@ -82,21 +85,14 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8) | |||
82 | int pkeylen; | 85 | int pkeylen; |
83 | char obj_tmp[80]; | 86 | char obj_tmp[80]; |
84 | 87 | ||
85 | switch (p8->broken) { | 88 | if(p8->pkey->type == V_ASN1_OCTET_STRING) { |
86 | case PKCS8_OK: | 89 | p8->broken = PKCS8_OK; |
87 | p = p8->pkey->value.octet_string->data; | 90 | p = p8->pkey->value.octet_string->data; |
88 | pkeylen = p8->pkey->value.octet_string->length; | 91 | pkeylen = p8->pkey->value.octet_string->length; |
89 | break; | 92 | } else { |
90 | 93 | p8->broken = PKCS8_NO_OCTET; | |
91 | case PKCS8_NO_OCTET: | ||
92 | p = p8->pkey->value.sequence->data; | 94 | p = p8->pkey->value.sequence->data; |
93 | pkeylen = p8->pkey->value.sequence->length; | 95 | pkeylen = p8->pkey->value.sequence->length; |
94 | break; | ||
95 | |||
96 | default: | ||
97 | EVPerr(EVP_F_EVP_PKCS82PKEY,EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE); | ||
98 | return NULL; | ||
99 | break; | ||
100 | } | 96 | } |
101 | if (!(pkey = EVP_PKEY_new())) { | 97 | if (!(pkey = EVP_PKEY_new())) { |
102 | EVPerr(EVP_F_EVP_PKCS82PKEY,ERR_R_MALLOC_FAILURE); | 98 | EVPerr(EVP_F_EVP_PKCS82PKEY,ERR_R_MALLOC_FAILURE); |
@@ -121,65 +117,83 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8) | |||
121 | * be recalculated. | 117 | * be recalculated. |
122 | */ | 118 | */ |
123 | 119 | ||
124 | /* Check for broken Netscape Database DSA PKCS#8, UGH! */ | 120 | /* Check for broken DSA PKCS#8, UGH! */ |
125 | if(*p == (V_ASN1_SEQUENCE|V_ASN1_CONSTRUCTED)) { | 121 | if(*p == (V_ASN1_SEQUENCE|V_ASN1_CONSTRUCTED)) { |
126 | if(!(ndsa = ASN1_seq_unpack(p, pkeylen, | 122 | if(!(ndsa = ASN1_seq_unpack(p, pkeylen, |
127 | (char *(*)())d2i_ASN1_INTEGER, | 123 | (char *(*)())d2i_ASN1_TYPE, |
128 | ASN1_STRING_free))) { | 124 | ASN1_TYPE_free))) { |
129 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); | 125 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); |
130 | return NULL; | 126 | goto dsaerr; |
131 | } | 127 | } |
132 | if(sk_num(ndsa) != 2 ) { | 128 | if(sk_num(ndsa) != 2 ) { |
133 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); | 129 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); |
134 | sk_pop_free(ndsa, ASN1_STRING_free); | 130 | goto dsaerr; |
135 | return NULL; | ||
136 | } | 131 | } |
137 | dsapriv = (ASN1_INTEGER *) sk_pop(ndsa); | 132 | /* Handle Two broken types: |
138 | sk_pop_free(ndsa, ASN1_STRING_free); | 133 | * SEQUENCE {parameters, priv_key} |
139 | } else if (!(dsapriv=d2i_ASN1_INTEGER (NULL, &p, pkeylen))) { | 134 | * SEQUENCE {pub_key, priv_key} |
135 | */ | ||
136 | |||
137 | t1 = (ASN1_TYPE *)sk_value(ndsa, 0); | ||
138 | t2 = (ASN1_TYPE *)sk_value(ndsa, 1); | ||
139 | if(t1->type == V_ASN1_SEQUENCE) { | ||
140 | p8->broken = PKCS8_EMBEDDED_PARAM; | ||
141 | param = t1; | ||
142 | } else if(a->parameter->type == V_ASN1_SEQUENCE) { | ||
143 | p8->broken = PKCS8_NS_DB; | ||
144 | param = a->parameter; | ||
145 | } else { | ||
140 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); | 146 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); |
141 | return NULL; | 147 | goto dsaerr; |
142 | } | 148 | } |
143 | /* Retrieve parameters */ | 149 | |
144 | if (a->parameter->type != V_ASN1_SEQUENCE) { | 150 | if(t2->type != V_ASN1_INTEGER) { |
145 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_NO_DSA_PARAMETERS); | 151 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); |
146 | return NULL; | 152 | goto dsaerr; |
153 | } | ||
154 | privkey = t2->value.integer; | ||
155 | } else if (!(privkey=d2i_ASN1_INTEGER (NULL, &p, pkeylen))) { | ||
156 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); | ||
157 | goto dsaerr; | ||
147 | } | 158 | } |
148 | p = a->parameter->value.sequence->data; | 159 | p = param->value.sequence->data; |
149 | plen = a->parameter->value.sequence->length; | 160 | plen = param->value.sequence->length; |
150 | if (!(dsa = d2i_DSAparams (NULL, &p, plen))) { | 161 | if (!(dsa = d2i_DSAparams (NULL, &p, plen))) { |
151 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); | 162 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); |
152 | return NULL; | 163 | goto dsaerr; |
153 | } | 164 | } |
154 | /* We have parameters now set private key */ | 165 | /* We have parameters now set private key */ |
155 | if (!(dsa->priv_key = ASN1_INTEGER_to_BN(dsapriv, NULL))) { | 166 | if (!(dsa->priv_key = ASN1_INTEGER_to_BN(privkey, NULL))) { |
156 | EVPerr(EVP_F_EVP_PKCS82PKEY,EVP_R_BN_DECODE_ERROR); | 167 | EVPerr(EVP_F_EVP_PKCS82PKEY,EVP_R_BN_DECODE_ERROR); |
157 | DSA_free (dsa); | 168 | goto dsaerr; |
158 | return NULL; | ||
159 | } | 169 | } |
160 | /* Calculate public key (ouch!) */ | 170 | /* Calculate public key (ouch!) */ |
161 | if (!(dsa->pub_key = BN_new())) { | 171 | if (!(dsa->pub_key = BN_new())) { |
162 | EVPerr(EVP_F_EVP_PKCS82PKEY,ERR_R_MALLOC_FAILURE); | 172 | EVPerr(EVP_F_EVP_PKCS82PKEY,ERR_R_MALLOC_FAILURE); |
163 | DSA_free (dsa); | 173 | goto dsaerr; |
164 | return NULL; | ||
165 | } | 174 | } |
166 | if (!(ctx = BN_CTX_new())) { | 175 | if (!(ctx = BN_CTX_new())) { |
167 | EVPerr(EVP_F_EVP_PKCS82PKEY,ERR_R_MALLOC_FAILURE); | 176 | EVPerr(EVP_F_EVP_PKCS82PKEY,ERR_R_MALLOC_FAILURE); |
168 | DSA_free (dsa); | 177 | goto dsaerr; |
169 | return NULL; | ||
170 | } | 178 | } |
171 | 179 | ||
172 | if (!BN_mod_exp(dsa->pub_key, dsa->g, | 180 | if (!BN_mod_exp(dsa->pub_key, dsa->g, |
173 | dsa->priv_key, dsa->p, ctx)) { | 181 | dsa->priv_key, dsa->p, ctx)) { |
174 | 182 | ||
175 | EVPerr(EVP_F_EVP_PKCS82PKEY,EVP_R_BN_PUBKEY_ERROR); | 183 | EVPerr(EVP_F_EVP_PKCS82PKEY,EVP_R_BN_PUBKEY_ERROR); |
176 | BN_CTX_free (ctx); | 184 | goto dsaerr; |
177 | DSA_free (dsa); | ||
178 | return NULL; | ||
179 | } | 185 | } |
180 | 186 | ||
181 | EVP_PKEY_assign_DSA (pkey, dsa); | 187 | EVP_PKEY_assign_DSA(pkey, dsa); |
182 | BN_CTX_free (ctx); | 188 | BN_CTX_free (ctx); |
189 | sk_pop_free(ndsa, ASN1_TYPE_free); | ||
190 | break; | ||
191 | dsaerr: | ||
192 | BN_CTX_free (ctx); | ||
193 | sk_pop_free(ndsa, ASN1_TYPE_free); | ||
194 | DSA_free(dsa); | ||
195 | EVP_PKEY_free(pkey); | ||
196 | return NULL; | ||
183 | break; | 197 | break; |
184 | #endif | 198 | #endif |
185 | default: | 199 | default: |
@@ -193,30 +207,35 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8) | |||
193 | return pkey; | 207 | return pkey; |
194 | } | 208 | } |
195 | 209 | ||
210 | PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey) | ||
211 | { | ||
212 | return EVP_PKEY2PKCS8_broken(pkey, PKCS8_OK); | ||
213 | } | ||
214 | |||
196 | /* Turn a private key into a PKCS8 structure */ | 215 | /* Turn a private key into a PKCS8 structure */ |
197 | 216 | ||
198 | PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey) | 217 | PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken) |
199 | { | 218 | { |
200 | PKCS8_PRIV_KEY_INFO *p8; | 219 | PKCS8_PRIV_KEY_INFO *p8; |
201 | #ifndef NO_DSA | 220 | |
202 | ASN1_INTEGER *dpkey; | ||
203 | unsigned char *p, *q; | ||
204 | int len; | ||
205 | #endif | ||
206 | if (!(p8 = PKCS8_PRIV_KEY_INFO_new())) { | 221 | if (!(p8 = PKCS8_PRIV_KEY_INFO_new())) { |
207 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | 222 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); |
208 | return NULL; | 223 | return NULL; |
209 | } | 224 | } |
225 | p8->broken = broken; | ||
210 | ASN1_INTEGER_set (p8->version, 0); | 226 | ASN1_INTEGER_set (p8->version, 0); |
211 | if (!(p8->pkeyalg->parameter = ASN1_TYPE_new ())) { | 227 | if (!(p8->pkeyalg->parameter = ASN1_TYPE_new ())) { |
212 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | 228 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); |
213 | PKCS8_PRIV_KEY_INFO_free (p8); | 229 | PKCS8_PRIV_KEY_INFO_free (p8); |
214 | return NULL; | 230 | return NULL; |
215 | } | 231 | } |
232 | p8->pkey->type = V_ASN1_OCTET_STRING; | ||
216 | switch (EVP_PKEY_type(pkey->type)) { | 233 | switch (EVP_PKEY_type(pkey->type)) { |
217 | #ifndef NO_RSA | 234 | #ifndef NO_RSA |
218 | case EVP_PKEY_RSA: | 235 | case EVP_PKEY_RSA: |
219 | 236 | ||
237 | if(p8->broken == PKCS8_NO_OCTET) p8->pkey->type = V_ASN1_SEQUENCE; | ||
238 | |||
220 | p8->pkeyalg->algorithm = OBJ_nid2obj(NID_rsaEncryption); | 239 | p8->pkeyalg->algorithm = OBJ_nid2obj(NID_rsaEncryption); |
221 | p8->pkeyalg->parameter->type = V_ASN1_NULL; | 240 | p8->pkeyalg->parameter->type = V_ASN1_NULL; |
222 | if (!ASN1_pack_string ((char *)pkey, i2d_PrivateKey, | 241 | if (!ASN1_pack_string ((char *)pkey, i2d_PrivateKey, |
@@ -229,36 +248,11 @@ PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey) | |||
229 | #endif | 248 | #endif |
230 | #ifndef NO_DSA | 249 | #ifndef NO_DSA |
231 | case EVP_PKEY_DSA: | 250 | case EVP_PKEY_DSA: |
232 | p8->pkeyalg->algorithm = OBJ_nid2obj(NID_dsa); | 251 | if(!dsa_pkey2pkcs8(p8, pkey)) { |
233 | |||
234 | /* get paramaters and place in AlgorithmIdentifier */ | ||
235 | len = i2d_DSAparams (pkey->pkey.dsa, NULL); | ||
236 | if (!(p = Malloc(len))) { | ||
237 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
238 | PKCS8_PRIV_KEY_INFO_free (p8); | 252 | PKCS8_PRIV_KEY_INFO_free (p8); |
239 | return NULL; | 253 | return NULL; |
240 | } | 254 | } |
241 | q = p; | 255 | |
242 | i2d_DSAparams (pkey->pkey.dsa, &q); | ||
243 | p8->pkeyalg->parameter->type = V_ASN1_SEQUENCE; | ||
244 | p8->pkeyalg->parameter->value.sequence = ASN1_STRING_new(); | ||
245 | ASN1_STRING_set(p8->pkeyalg->parameter->value.sequence, p, len); | ||
246 | Free(p); | ||
247 | /* Get private key into an integer and pack */ | ||
248 | if (!(dpkey = BN_to_ASN1_INTEGER (pkey->pkey.dsa->priv_key, NULL))) { | ||
249 | EVPerr(EVP_F_EVP_PKEY2PKCS8,EVP_R_ENCODE_ERROR); | ||
250 | PKCS8_PRIV_KEY_INFO_free (p8); | ||
251 | return NULL; | ||
252 | } | ||
253 | |||
254 | if (!ASN1_pack_string((char *)dpkey, i2d_ASN1_INTEGER, | ||
255 | &p8->pkey->value.octet_string)) { | ||
256 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
257 | ASN1_INTEGER_free (dpkey); | ||
258 | PKCS8_PRIV_KEY_INFO_free (p8); | ||
259 | return NULL; | ||
260 | } | ||
261 | ASN1_INTEGER_free (dpkey); | ||
262 | break; | 256 | break; |
263 | #endif | 257 | #endif |
264 | default: | 258 | default: |
@@ -266,9 +260,8 @@ PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey) | |||
266 | PKCS8_PRIV_KEY_INFO_free (p8); | 260 | PKCS8_PRIV_KEY_INFO_free (p8); |
267 | return NULL; | 261 | return NULL; |
268 | } | 262 | } |
269 | p8->pkey->type = V_ASN1_OCTET_STRING; | 263 | RAND_add(p8->pkey->value.octet_string->data, |
270 | RAND_seed (p8->pkey->value.octet_string->data, | 264 | p8->pkey->value.octet_string->length, 0); |
271 | p8->pkey->value.octet_string->length); | ||
272 | return p8; | 265 | return p8; |
273 | } | 266 | } |
274 | 267 | ||
@@ -295,4 +288,112 @@ PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken) | |||
295 | } | 288 | } |
296 | } | 289 | } |
297 | 290 | ||
291 | #ifndef NO_DSA | ||
292 | static int dsa_pkey2pkcs8(PKCS8_PRIV_KEY_INFO *p8, EVP_PKEY *pkey) | ||
293 | { | ||
294 | ASN1_STRING *params; | ||
295 | ASN1_INTEGER *prkey; | ||
296 | ASN1_TYPE *ttmp; | ||
297 | STACK *ndsa; | ||
298 | unsigned char *p, *q; | ||
299 | int len; | ||
300 | p8->pkeyalg->algorithm = OBJ_nid2obj(NID_dsa); | ||
301 | len = i2d_DSAparams (pkey->pkey.dsa, NULL); | ||
302 | if (!(p = Malloc(len))) { | ||
303 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
304 | PKCS8_PRIV_KEY_INFO_free (p8); | ||
305 | return 0; | ||
306 | } | ||
307 | q = p; | ||
308 | i2d_DSAparams (pkey->pkey.dsa, &q); | ||
309 | params = ASN1_STRING_new(); | ||
310 | ASN1_STRING_set(params, p, len); | ||
311 | Free(p); | ||
312 | /* Get private key into integer */ | ||
313 | if (!(prkey = BN_to_ASN1_INTEGER (pkey->pkey.dsa->priv_key, NULL))) { | ||
314 | EVPerr(EVP_F_EVP_PKEY2PKCS8,EVP_R_ENCODE_ERROR); | ||
315 | return 0; | ||
316 | } | ||
317 | |||
318 | switch(p8->broken) { | ||
298 | 319 | ||
320 | case PKCS8_OK: | ||
321 | case PKCS8_NO_OCTET: | ||
322 | |||
323 | if (!ASN1_pack_string((char *)prkey, i2d_ASN1_INTEGER, | ||
324 | &p8->pkey->value.octet_string)) { | ||
325 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
326 | M_ASN1_INTEGER_free (prkey); | ||
327 | return 0; | ||
328 | } | ||
329 | |||
330 | M_ASN1_INTEGER_free (prkey); | ||
331 | p8->pkeyalg->parameter->value.sequence = params; | ||
332 | p8->pkeyalg->parameter->type = V_ASN1_SEQUENCE; | ||
333 | |||
334 | break; | ||
335 | |||
336 | case PKCS8_NS_DB: | ||
337 | |||
338 | p8->pkeyalg->parameter->value.sequence = params; | ||
339 | p8->pkeyalg->parameter->type = V_ASN1_SEQUENCE; | ||
340 | ndsa = sk_new_null(); | ||
341 | ttmp = ASN1_TYPE_new(); | ||
342 | if (!(ttmp->value.integer = BN_to_ASN1_INTEGER (pkey->pkey.dsa->pub_key, NULL))) { | ||
343 | EVPerr(EVP_F_EVP_PKEY2PKCS8,EVP_R_ENCODE_ERROR); | ||
344 | PKCS8_PRIV_KEY_INFO_free(p8); | ||
345 | return 0; | ||
346 | } | ||
347 | ttmp->type = V_ASN1_INTEGER; | ||
348 | sk_push(ndsa, (char *)ttmp); | ||
349 | |||
350 | ttmp = ASN1_TYPE_new(); | ||
351 | ttmp->value.integer = prkey; | ||
352 | ttmp->type = V_ASN1_INTEGER; | ||
353 | sk_push(ndsa, (char *)ttmp); | ||
354 | |||
355 | p8->pkey->value.octet_string = ASN1_OCTET_STRING_new(); | ||
356 | |||
357 | if (!ASN1_seq_pack(ndsa, i2d_ASN1_TYPE, | ||
358 | &p8->pkey->value.octet_string->data, | ||
359 | &p8->pkey->value.octet_string->length)) { | ||
360 | |||
361 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
362 | sk_pop_free(ndsa, ASN1_TYPE_free); | ||
363 | M_ASN1_INTEGER_free(prkey); | ||
364 | return 0; | ||
365 | } | ||
366 | sk_pop_free(ndsa, ASN1_TYPE_free); | ||
367 | break; | ||
368 | |||
369 | case PKCS8_EMBEDDED_PARAM: | ||
370 | |||
371 | p8->pkeyalg->parameter->type = V_ASN1_NULL; | ||
372 | ndsa = sk_new_null(); | ||
373 | ttmp = ASN1_TYPE_new(); | ||
374 | ttmp->value.sequence = params; | ||
375 | ttmp->type = V_ASN1_SEQUENCE; | ||
376 | sk_push(ndsa, (char *)ttmp); | ||
377 | |||
378 | ttmp = ASN1_TYPE_new(); | ||
379 | ttmp->value.integer = prkey; | ||
380 | ttmp->type = V_ASN1_INTEGER; | ||
381 | sk_push(ndsa, (char *)ttmp); | ||
382 | |||
383 | p8->pkey->value.octet_string = ASN1_OCTET_STRING_new(); | ||
384 | |||
385 | if (!ASN1_seq_pack(ndsa, i2d_ASN1_TYPE, | ||
386 | &p8->pkey->value.octet_string->data, | ||
387 | &p8->pkey->value.octet_string->length)) { | ||
388 | |||
389 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
390 | sk_pop_free(ndsa, ASN1_TYPE_free); | ||
391 | M_ASN1_INTEGER_free (prkey); | ||
392 | return 0; | ||
393 | } | ||
394 | sk_pop_free(ndsa, ASN1_TYPE_free); | ||
395 | break; | ||
396 | } | ||
397 | return 1; | ||
398 | } | ||
399 | #endif | ||
diff --git a/src/lib/libcrypto/evp/p_lib.c b/src/lib/libcrypto/evp/p_lib.c index 3422b77de6..4cb387f8de 100644 --- a/src/lib/libcrypto/evp/p_lib.c +++ b/src/lib/libcrypto/evp/p_lib.c | |||
@@ -119,7 +119,7 @@ int EVP_PKEY_copy_parameters(EVP_PKEY *to, EVP_PKEY *from) | |||
119 | 119 | ||
120 | if (EVP_PKEY_missing_parameters(from)) | 120 | if (EVP_PKEY_missing_parameters(from)) |
121 | { | 121 | { |
122 | EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS,EVP_R_MISSING_PARMATERS); | 122 | EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS,EVP_R_MISSING_PARAMETERS); |
123 | goto err; | 123 | goto err; |
124 | } | 124 | } |
125 | #ifndef NO_DSA | 125 | #ifndef NO_DSA |
@@ -202,8 +202,66 @@ int EVP_PKEY_assign(EVP_PKEY *pkey, int type, char *key) | |||
202 | pkey->type=EVP_PKEY_type(type); | 202 | pkey->type=EVP_PKEY_type(type); |
203 | pkey->save_type=type; | 203 | pkey->save_type=type; |
204 | pkey->pkey.ptr=key; | 204 | pkey->pkey.ptr=key; |
205 | return(1); | 205 | return(key != NULL); |
206 | } | ||
207 | |||
208 | #ifndef NO_RSA | ||
209 | int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key) | ||
210 | { | ||
211 | int ret = EVP_PKEY_assign_RSA(pkey, key); | ||
212 | if(ret) CRYPTO_add(&key->references, 1, CRYPTO_LOCK_RSA); | ||
213 | return ret; | ||
214 | } | ||
215 | |||
216 | RSA *EVP_PKEY_get1_RSA(EVP_PKEY *pkey) | ||
217 | { | ||
218 | if(pkey->type != EVP_PKEY_RSA) { | ||
219 | EVPerr(EVP_F_EVP_PKEY_GET1_RSA, EVP_R_EXPECTING_AN_RSA_KEY); | ||
220 | return NULL; | ||
221 | } | ||
222 | CRYPTO_add(&pkey->pkey.rsa->references, 1, CRYPTO_LOCK_RSA); | ||
223 | return pkey->pkey.rsa; | ||
224 | } | ||
225 | #endif | ||
226 | |||
227 | #ifndef NO_DSA | ||
228 | int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, DSA *key) | ||
229 | { | ||
230 | int ret = EVP_PKEY_assign_DSA(pkey, key); | ||
231 | if(ret) CRYPTO_add(&key->references, 1, CRYPTO_LOCK_DSA); | ||
232 | return ret; | ||
233 | } | ||
234 | |||
235 | DSA *EVP_PKEY_get1_DSA(EVP_PKEY *pkey) | ||
236 | { | ||
237 | if(pkey->type != EVP_PKEY_DSA) { | ||
238 | EVPerr(EVP_F_EVP_PKEY_GET1_DSA, EVP_R_EXPECTING_A_DSA_KEY); | ||
239 | return NULL; | ||
240 | } | ||
241 | CRYPTO_add(&pkey->pkey.dsa->references, 1, CRYPTO_LOCK_DSA); | ||
242 | return pkey->pkey.dsa; | ||
243 | } | ||
244 | #endif | ||
245 | |||
246 | #ifndef NO_DH | ||
247 | |||
248 | int EVP_PKEY_set1_DH(EVP_PKEY *pkey, DH *key) | ||
249 | { | ||
250 | int ret = EVP_PKEY_assign_DH(pkey, key); | ||
251 | if(ret) CRYPTO_add(&key->references, 1, CRYPTO_LOCK_DH); | ||
252 | return ret; | ||
253 | } | ||
254 | |||
255 | DH *EVP_PKEY_get1_DH(EVP_PKEY *pkey) | ||
256 | { | ||
257 | if(pkey->type != EVP_PKEY_DH) { | ||
258 | EVPerr(EVP_F_EVP_PKEY_GET1_DH, EVP_R_EXPECTING_A_DH_KEY); | ||
259 | return NULL; | ||
206 | } | 260 | } |
261 | CRYPTO_add(&pkey->pkey.dh->references, 1, CRYPTO_LOCK_DH); | ||
262 | return pkey->pkey.dh; | ||
263 | } | ||
264 | #endif | ||
207 | 265 | ||
208 | int EVP_PKEY_type(int type) | 266 | int EVP_PKEY_type(int type) |
209 | { | 267 | { |
@@ -244,7 +302,7 @@ void EVP_PKEY_free(EVP_PKEY *x) | |||
244 | } | 302 | } |
245 | #endif | 303 | #endif |
246 | EVP_PKEY_free_it(x); | 304 | EVP_PKEY_free_it(x); |
247 | Free((char *)x); | 305 | Free(x); |
248 | } | 306 | } |
249 | 307 | ||
250 | static void EVP_PKEY_free_it(EVP_PKEY *x) | 308 | static void EVP_PKEY_free_it(EVP_PKEY *x) |
diff --git a/src/lib/libcrypto/evp/p_open.c b/src/lib/libcrypto/evp/p_open.c index ddb9fd6942..b9ca7892c2 100644 --- a/src/lib/libcrypto/evp/p_open.c +++ b/src/lib/libcrypto/evp/p_open.c | |||
@@ -110,4 +110,10 @@ int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) | |||
110 | EVP_DecryptInit(ctx,NULL,NULL,NULL); | 110 | EVP_DecryptInit(ctx,NULL,NULL,NULL); |
111 | return(i); | 111 | return(i); |
112 | } | 112 | } |
113 | #else /* !NO_RSA */ | ||
114 | |||
115 | # ifdef PEDANTIC | ||
116 | static void *dummy=&dummy; | ||
117 | # endif | ||
118 | |||
113 | #endif | 119 | #endif |
diff --git a/src/lib/libcrypto/evp/p_seal.c b/src/lib/libcrypto/evp/p_seal.c index 09b46f4b0e..d449e892bf 100644 --- a/src/lib/libcrypto/evp/p_seal.c +++ b/src/lib/libcrypto/evp/p_seal.c | |||
@@ -73,9 +73,10 @@ int EVP_SealInit(EVP_CIPHER_CTX *ctx, EVP_CIPHER *type, unsigned char **ek, | |||
73 | int i; | 73 | int i; |
74 | 74 | ||
75 | if (npubk <= 0) return(0); | 75 | if (npubk <= 0) return(0); |
76 | RAND_bytes(key,EVP_MAX_KEY_LENGTH); | 76 | if (RAND_bytes(key,EVP_MAX_KEY_LENGTH) <= 0) |
77 | return(0); | ||
77 | if (type->iv_len > 0) | 78 | if (type->iv_len > 0) |
78 | RAND_bytes(iv,type->iv_len); | 79 | RAND_pseudo_bytes(iv,type->iv_len); |
79 | 80 | ||
80 | EVP_CIPHER_CTX_init(ctx); | 81 | EVP_CIPHER_CTX_init(ctx); |
81 | EVP_EncryptInit(ctx,type,key,iv); | 82 | EVP_EncryptInit(ctx,type,key,iv); |