diff options
| author | djm <> | 2009-01-09 12:14:11 +0000 |
|---|---|---|
| committer | djm <> | 2009-01-09 12:14:11 +0000 |
| commit | a0fdc9ec41594852f67ec77dfad9cb06bacc4186 (patch) | |
| tree | c43f6b3a4d93ad2cb3dcf93275295679d895a033 | |
| parent | 5a3c0a05c7f2c5d3c584b7c8d6aec836dd724c80 (diff) | |
| download | openbsd-a0fdc9ec41594852f67ec77dfad9cb06bacc4186.tar.gz openbsd-a0fdc9ec41594852f67ec77dfad9cb06bacc4186.tar.bz2 openbsd-a0fdc9ec41594852f67ec77dfad9cb06bacc4186.zip | |
import openssl-0.9.8j
Diffstat (limited to '')
263 files changed, 3222 insertions, 2494 deletions
diff --git a/src/lib/libcrypto/aes/aes.h b/src/lib/libcrypto/aes/aes.h index baf0222d49..450f2b4051 100644 --- a/src/lib/libcrypto/aes/aes.h +++ b/src/lib/libcrypto/aes/aes.h | |||
| @@ -66,6 +66,10 @@ | |||
| 66 | #define AES_MAXNR 14 | 66 | #define AES_MAXNR 14 |
| 67 | #define AES_BLOCK_SIZE 16 | 67 | #define AES_BLOCK_SIZE 16 |
| 68 | 68 | ||
| 69 | #ifdef OPENSSL_FIPS | ||
| 70 | #define FIPS_AES_SIZE_T int | ||
| 71 | #endif | ||
| 72 | |||
| 69 | #ifdef __cplusplus | 73 | #ifdef __cplusplus |
| 70 | extern "C" { | 74 | extern "C" { |
| 71 | #endif | 75 | #endif |
diff --git a/src/lib/libcrypto/aes/aes_cbc.c b/src/lib/libcrypto/aes/aes_cbc.c index d2ba6bcdb4..373864cd4b 100644 --- a/src/lib/libcrypto/aes/aes_cbc.c +++ b/src/lib/libcrypto/aes/aes_cbc.c | |||
| @@ -59,6 +59,7 @@ | |||
| 59 | #include <openssl/aes.h> | 59 | #include <openssl/aes.h> |
| 60 | #include "aes_locl.h" | 60 | #include "aes_locl.h" |
| 61 | 61 | ||
| 62 | #if !defined(OPENSSL_FIPS_AES_ASM) | ||
| 62 | void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, | 63 | void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, |
| 63 | const unsigned long length, const AES_KEY *key, | 64 | const unsigned long length, const AES_KEY *key, |
| 64 | unsigned char *ivec, const int enc) { | 65 | unsigned char *ivec, const int enc) { |
| @@ -129,3 +130,4 @@ void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, | |||
| 129 | } | 130 | } |
| 130 | } | 131 | } |
| 131 | } | 132 | } |
| 133 | #endif | ||
diff --git a/src/lib/libcrypto/aes/aes_core.c b/src/lib/libcrypto/aes/aes_core.c index 3a80e18b0a..cffdd4daec 100644 --- a/src/lib/libcrypto/aes/aes_core.c +++ b/src/lib/libcrypto/aes/aes_core.c | |||
| @@ -37,6 +37,10 @@ | |||
| 37 | 37 | ||
| 38 | #include <stdlib.h> | 38 | #include <stdlib.h> |
| 39 | #include <openssl/aes.h> | 39 | #include <openssl/aes.h> |
| 40 | #ifdef OPENSSL_FIPS | ||
| 41 | #include <openssl/fips.h> | ||
| 42 | #endif | ||
| 43 | |||
| 40 | #include "aes_locl.h" | 44 | #include "aes_locl.h" |
| 41 | 45 | ||
| 42 | /* | 46 | /* |
| @@ -631,6 +635,10 @@ int AES_set_encrypt_key(const unsigned char *userKey, const int bits, | |||
| 631 | int i = 0; | 635 | int i = 0; |
| 632 | u32 temp; | 636 | u32 temp; |
| 633 | 637 | ||
| 638 | #ifdef OPENSSL_FIPS | ||
| 639 | FIPS_selftest_check(); | ||
| 640 | #endif | ||
| 641 | |||
| 634 | if (!userKey || !key) | 642 | if (!userKey || !key) |
| 635 | return -1; | 643 | return -1; |
| 636 | if (bits != 128 && bits != 192 && bits != 256) | 644 | if (bits != 128 && bits != 192 && bits != 256) |
diff --git a/src/lib/libcrypto/aes/asm/aes-586.pl b/src/lib/libcrypto/aes/asm/aes-586.pl index 89fa261794..3bc46a968e 100644 --- a/src/lib/libcrypto/aes/asm/aes-586.pl +++ b/src/lib/libcrypto/aes/asm/aes-586.pl | |||
| @@ -955,8 +955,9 @@ my $mark=&DWP(60+240,"esp"); #copy of aes_key->rounds | |||
| 955 | 955 | ||
| 956 | &align (4); | 956 | &align (4); |
| 957 | &set_label("enc_tail"); | 957 | &set_label("enc_tail"); |
| 958 | &push ($key eq "edi" ? $key : ""); # push ivp | 958 | &mov ($s0,$key eq "edi" ? $key : ""); |
| 959 | &mov ($key,$_out); # load out | 959 | &mov ($key,$_out); # load out |
| 960 | &push ($s0); # push ivp | ||
| 960 | &mov ($s1,16); | 961 | &mov ($s1,16); |
| 961 | &sub ($s1,$s2); | 962 | &sub ($s1,$s2); |
| 962 | &cmp ($key,$acc); # compare with inp | 963 | &cmp ($key,$acc); # compare with inp |
diff --git a/src/lib/libcrypto/aes/asm/aes-x86_64.pl b/src/lib/libcrypto/aes/asm/aes-x86_64.pl index 44e0bf8cae..f616f1751f 100755 --- a/src/lib/libcrypto/aes/asm/aes-x86_64.pl +++ b/src/lib/libcrypto/aes/asm/aes-x86_64.pl | |||
| @@ -1198,19 +1198,20 @@ AES_cbc_encrypt: | |||
| 1198 | ret | 1198 | ret |
| 1199 | .align 4 | 1199 | .align 4 |
| 1200 | .Lcbc_enc_tail: | 1200 | .Lcbc_enc_tail: |
| 1201 | cmp $inp,$out | 1201 | mov %rax,%r11 |
| 1202 | je .Lcbc_enc_in_place | 1202 | mov %rcx,%r12 |
| 1203 | mov %r10,%rcx | 1203 | mov %r10,%rcx |
| 1204 | mov $inp,%rsi | 1204 | mov $inp,%rsi |
| 1205 | mov $out,%rdi | 1205 | mov $out,%rdi |
| 1206 | .long 0xF689A4F3 # rep movsb | 1206 | .long 0xF689A4F3 # rep movsb |
| 1207 | .Lcbc_enc_in_place: | ||
| 1208 | mov \$16,%rcx # zero tail | 1207 | mov \$16,%rcx # zero tail |
| 1209 | sub %r10,%rcx | 1208 | sub %r10,%rcx |
| 1210 | xor %rax,%rax | 1209 | xor %rax,%rax |
| 1211 | .long 0xF689AAF3 # rep stosb | 1210 | .long 0xF689AAF3 # rep stosb |
| 1212 | mov $out,$inp # this is not a mistake! | 1211 | mov $out,$inp # this is not a mistake! |
| 1213 | movq \$16,$_len # len=16 | 1212 | movq \$16,$_len # len=16 |
| 1213 | mov %r11,%rax | ||
| 1214 | mov %r12,%rcx | ||
| 1214 | jmp .Lcbc_enc_loop # one more spin... | 1215 | jmp .Lcbc_enc_loop # one more spin... |
| 1215 | #----------------------------- DECRYPT -----------------------------# | 1216 | #----------------------------- DECRYPT -----------------------------# |
| 1216 | .align 16 | 1217 | .align 16 |
diff --git a/src/lib/libcrypto/asn1/a_mbstr.c b/src/lib/libcrypto/asn1/a_mbstr.c index 2d4800a22a..1bcd046893 100644 --- a/src/lib/libcrypto/asn1/a_mbstr.c +++ b/src/lib/libcrypto/asn1/a_mbstr.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* a_mbstr.c */ | 1 | /* a_mbstr.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/a_sign.c b/src/lib/libcrypto/asn1/a_sign.c index 1081950518..4dee45fbb8 100644 --- a/src/lib/libcrypto/asn1/a_sign.c +++ b/src/lib/libcrypto/asn1/a_sign.c | |||
| @@ -267,7 +267,12 @@ int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, | |||
| 267 | goto err; | 267 | goto err; |
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | EVP_SignInit_ex(&ctx,type, NULL); | 270 | if (!EVP_SignInit_ex(&ctx,type, NULL)) |
| 271 | { | ||
| 272 | outl=0; | ||
| 273 | ASN1err(ASN1_F_ASN1_ITEM_SIGN,ERR_R_EVP_LIB); | ||
| 274 | goto err; | ||
| 275 | } | ||
| 271 | EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl); | 276 | EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl); |
| 272 | if (!EVP_SignFinal(&ctx,(unsigned char *)buf_out, | 277 | if (!EVP_SignFinal(&ctx,(unsigned char *)buf_out, |
| 273 | (unsigned int *)&outl,pkey)) | 278 | (unsigned int *)&outl,pkey)) |
diff --git a/src/lib/libcrypto/asn1/a_strex.c b/src/lib/libcrypto/asn1/a_strex.c index c2dbb6f9a5..7fc14d3296 100644 --- a/src/lib/libcrypto/asn1/a_strex.c +++ b/src/lib/libcrypto/asn1/a_strex.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* a_strex.c */ | 1 | /* a_strex.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/a_strnid.c b/src/lib/libcrypto/asn1/a_strnid.c index 613bbc4a7d..fe515b52ba 100644 --- a/src/lib/libcrypto/asn1/a_strnid.c +++ b/src/lib/libcrypto/asn1/a_strnid.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* a_strnid.c */ | 1 | /* a_strnid.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/a_verify.c b/src/lib/libcrypto/asn1/a_verify.c index fdce6e4380..da3efaaf8d 100644 --- a/src/lib/libcrypto/asn1/a_verify.c +++ b/src/lib/libcrypto/asn1/a_verify.c | |||
| @@ -100,7 +100,12 @@ int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *a, ASN1_BIT_STRING *signature, | |||
| 100 | p=buf_in; | 100 | p=buf_in; |
| 101 | 101 | ||
| 102 | i2d(data,&p); | 102 | i2d(data,&p); |
| 103 | EVP_VerifyInit_ex(&ctx,type, NULL); | 103 | if (!EVP_VerifyInit_ex(&ctx,type, NULL)) |
| 104 | { | ||
| 105 | ASN1err(ASN1_F_ASN1_VERIFY,ERR_R_EVP_LIB); | ||
| 106 | ret=0; | ||
| 107 | goto err; | ||
| 108 | } | ||
| 104 | EVP_VerifyUpdate(&ctx,(unsigned char *)buf_in,inl); | 109 | EVP_VerifyUpdate(&ctx,(unsigned char *)buf_in,inl); |
| 105 | 110 | ||
| 106 | OPENSSL_cleanse(buf_in,(unsigned int)inl); | 111 | OPENSSL_cleanse(buf_in,(unsigned int)inl); |
diff --git a/src/lib/libcrypto/asn1/asn1_gen.c b/src/lib/libcrypto/asn1/asn1_gen.c index 26c832781e..2da38292c8 100644 --- a/src/lib/libcrypto/asn1/asn1_gen.c +++ b/src/lib/libcrypto/asn1/asn1_gen.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* asn1_gen.c */ | 1 | /* asn1_gen.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2002. | 3 | * project 2002. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/asn1t.h b/src/lib/libcrypto/asn1/asn1t.h index bf315e65ed..ac14f9415b 100644 --- a/src/lib/libcrypto/asn1/asn1t.h +++ b/src/lib/libcrypto/asn1/asn1t.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* asn1t.h */ | 1 | /* asn1t.h */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/asn_mime.c b/src/lib/libcrypto/asn1/asn_mime.c index fe7c4ec7ab..bc80b20d63 100644 --- a/src/lib/libcrypto/asn1/asn_mime.c +++ b/src/lib/libcrypto/asn1/asn_mime.c | |||
| @@ -526,6 +526,8 @@ int SMIME_text(BIO *in, BIO *out) | |||
| 526 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 526 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 527 | while ((len = BIO_read(in, iobuf, sizeof(iobuf))) > 0) | 527 | while ((len = BIO_read(in, iobuf, sizeof(iobuf))) > 0) |
| 528 | BIO_write(out, iobuf, len); | 528 | BIO_write(out, iobuf, len); |
| 529 | if (len < 0) | ||
| 530 | return 0; | ||
| 529 | return 1; | 531 | return 1; |
| 530 | } | 532 | } |
| 531 | 533 | ||
diff --git a/src/lib/libcrypto/asn1/asn_moid.c b/src/lib/libcrypto/asn1/asn_moid.c index 9132350f10..1ea6a59248 100644 --- a/src/lib/libcrypto/asn1/asn_moid.c +++ b/src/lib/libcrypto/asn1/asn_moid.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* asn_moid.c */ | 1 | /* asn_moid.c */ |
| 2 | /* Written by Stephen Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Stephen Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/asn_pack.c b/src/lib/libcrypto/asn1/asn_pack.c index e8b671b7b5..f1a5a05632 100644 --- a/src/lib/libcrypto/asn1/asn_pack.c +++ b/src/lib/libcrypto/asn1/asn_pack.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* asn_pack.c */ | 1 | /* asn_pack.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/nsseq.c b/src/lib/libcrypto/asn1/nsseq.c index 50e2d4d07a..e551c57d59 100644 --- a/src/lib/libcrypto/asn1/nsseq.c +++ b/src/lib/libcrypto/asn1/nsseq.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* nsseq.c */ | 1 | /* nsseq.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/p5_pbe.c b/src/lib/libcrypto/asn1/p5_pbe.c index da91170094..c4582f8041 100644 --- a/src/lib/libcrypto/asn1/p5_pbe.c +++ b/src/lib/libcrypto/asn1/p5_pbe.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p5_pbe.c */ | 1 | /* p5_pbe.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/p5_pbev2.c b/src/lib/libcrypto/asn1/p5_pbev2.c index c834a38ddf..2b0516afee 100644 --- a/src/lib/libcrypto/asn1/p5_pbev2.c +++ b/src/lib/libcrypto/asn1/p5_pbev2.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p5_pbev2.c */ | 1 | /* p5_pbev2.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999-2004. | 3 | * project 1999-2004. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/p8_pkey.c b/src/lib/libcrypto/asn1/p8_pkey.c index 24b409132f..0a1957556e 100644 --- a/src/lib/libcrypto/asn1/p8_pkey.c +++ b/src/lib/libcrypto/asn1/p8_pkey.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p8_pkey.c */ | 1 | /* p8_pkey.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/t_bitst.c b/src/lib/libcrypto/asn1/t_bitst.c index 397332d9b8..2e59a25fa1 100644 --- a/src/lib/libcrypto/asn1/t_bitst.c +++ b/src/lib/libcrypto/asn1/t_bitst.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* t_bitst.c */ | 1 | /* t_bitst.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/t_crl.c b/src/lib/libcrypto/asn1/t_crl.c index 929b3e5904..bdb244c015 100644 --- a/src/lib/libcrypto/asn1/t_crl.c +++ b/src/lib/libcrypto/asn1/t_crl.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* t_crl.c */ | 1 | /* t_crl.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/t_spki.c b/src/lib/libcrypto/asn1/t_spki.c index c2a5797dd8..a73369b949 100644 --- a/src/lib/libcrypto/asn1/t_spki.c +++ b/src/lib/libcrypto/asn1/t_spki.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* t_spki.c */ | 1 | /* t_spki.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/t_x509.c b/src/lib/libcrypto/asn1/t_x509.c index eb776b7b3b..8b09e5890f 100644 --- a/src/lib/libcrypto/asn1/t_x509.c +++ b/src/lib/libcrypto/asn1/t_x509.c | |||
| @@ -393,8 +393,9 @@ int ASN1_GENERALIZEDTIME_print(BIO *bp, ASN1_GENERALIZEDTIME *tm) | |||
| 393 | d= (v[6]-'0')*10+(v[7]-'0'); | 393 | d= (v[6]-'0')*10+(v[7]-'0'); |
| 394 | h= (v[8]-'0')*10+(v[9]-'0'); | 394 | h= (v[8]-'0')*10+(v[9]-'0'); |
| 395 | m= (v[10]-'0')*10+(v[11]-'0'); | 395 | m= (v[10]-'0')*10+(v[11]-'0'); |
| 396 | if ( (v[12] >= '0') && (v[12] <= '9') && | 396 | if (tm->length >= 14 && |
| 397 | (v[13] >= '0') && (v[13] <= '9')) | 397 | (v[12] >= '0') && (v[12] <= '9') && |
| 398 | (v[13] >= '0') && (v[13] <= '9')) | ||
| 398 | s= (v[12]-'0')*10+(v[13]-'0'); | 399 | s= (v[12]-'0')*10+(v[13]-'0'); |
| 399 | 400 | ||
| 400 | if (BIO_printf(bp,"%s %2d %02d:%02d:%02d %d%s", | 401 | if (BIO_printf(bp,"%s %2d %02d:%02d:%02d %d%s", |
| @@ -428,8 +429,9 @@ int ASN1_UTCTIME_print(BIO *bp, ASN1_UTCTIME *tm) | |||
| 428 | d= (v[4]-'0')*10+(v[5]-'0'); | 429 | d= (v[4]-'0')*10+(v[5]-'0'); |
| 429 | h= (v[6]-'0')*10+(v[7]-'0'); | 430 | h= (v[6]-'0')*10+(v[7]-'0'); |
| 430 | m= (v[8]-'0')*10+(v[9]-'0'); | 431 | m= (v[8]-'0')*10+(v[9]-'0'); |
| 431 | if ( (v[10] >= '0') && (v[10] <= '9') && | 432 | if (tm->length >=12 && |
| 432 | (v[11] >= '0') && (v[11] <= '9')) | 433 | (v[10] >= '0') && (v[10] <= '9') && |
| 434 | (v[11] >= '0') && (v[11] <= '9')) | ||
| 433 | s= (v[10]-'0')*10+(v[11]-'0'); | 435 | s= (v[10]-'0')*10+(v[11]-'0'); |
| 434 | 436 | ||
| 435 | if (BIO_printf(bp,"%s %2d %02d:%02d:%02d %d%s", | 437 | if (BIO_printf(bp,"%s %2d %02d:%02d:%02d %d%s", |
| @@ -501,4 +503,3 @@ err: | |||
| 501 | OPENSSL_free(b); | 503 | OPENSSL_free(b); |
| 502 | return(ret); | 504 | return(ret); |
| 503 | } | 505 | } |
| 504 | |||
diff --git a/src/lib/libcrypto/asn1/t_x509a.c b/src/lib/libcrypto/asn1/t_x509a.c index ffbbfb51f4..8b18801a17 100644 --- a/src/lib/libcrypto/asn1/t_x509a.c +++ b/src/lib/libcrypto/asn1/t_x509a.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* t_x509a.c */ | 1 | /* t_x509a.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/tasn_dec.c b/src/lib/libcrypto/asn1/tasn_dec.c index 0ee406231e..ced641698e 100644 --- a/src/lib/libcrypto/asn1/tasn_dec.c +++ b/src/lib/libcrypto/asn1/tasn_dec.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* tasn_dec.c */ | 1 | /* tasn_dec.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/tasn_enc.c b/src/lib/libcrypto/asn1/tasn_enc.c index be19b36acd..2721f904a6 100644 --- a/src/lib/libcrypto/asn1/tasn_enc.c +++ b/src/lib/libcrypto/asn1/tasn_enc.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* tasn_enc.c */ | 1 | /* tasn_enc.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/tasn_fre.c b/src/lib/libcrypto/asn1/tasn_fre.c index bb7c1e2af4..d7c017fa1d 100644 --- a/src/lib/libcrypto/asn1/tasn_fre.c +++ b/src/lib/libcrypto/asn1/tasn_fre.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* tasn_fre.c */ | 1 | /* tasn_fre.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/tasn_new.c b/src/lib/libcrypto/asn1/tasn_new.c index 531dad365c..5c6a2ebd4d 100644 --- a/src/lib/libcrypto/asn1/tasn_new.c +++ b/src/lib/libcrypto/asn1/tasn_new.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* tasn_new.c */ | 1 | /* tasn_new.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/tasn_prn.c b/src/lib/libcrypto/asn1/tasn_prn.c index 719639b511..b9c96a6dbe 100644 --- a/src/lib/libcrypto/asn1/tasn_prn.c +++ b/src/lib/libcrypto/asn1/tasn_prn.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* tasn_prn.c */ | 1 | /* tasn_prn.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/tasn_typ.c b/src/lib/libcrypto/asn1/tasn_typ.c index 6f17f1bec7..6252213d15 100644 --- a/src/lib/libcrypto/asn1/tasn_typ.c +++ b/src/lib/libcrypto/asn1/tasn_typ.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* tasn_typ.c */ | 1 | /* tasn_typ.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/tasn_utl.c b/src/lib/libcrypto/asn1/tasn_utl.c index 34d520b180..ca9ec7a32f 100644 --- a/src/lib/libcrypto/asn1/tasn_utl.c +++ b/src/lib/libcrypto/asn1/tasn_utl.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* tasn_utl.c */ | 1 | /* tasn_utl.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/x_algor.c b/src/lib/libcrypto/asn1/x_algor.c index 33533aba86..99e53429b7 100644 --- a/src/lib/libcrypto/asn1/x_algor.c +++ b/src/lib/libcrypto/asn1/x_algor.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* x_algor.c */ | 1 | /* x_algor.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/x_bignum.c b/src/lib/libcrypto/asn1/x_bignum.c index 869c05d931..9cf3204a1b 100644 --- a/src/lib/libcrypto/asn1/x_bignum.c +++ b/src/lib/libcrypto/asn1/x_bignum.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* x_bignum.c */ | 1 | /* x_bignum.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/x_exten.c b/src/lib/libcrypto/asn1/x_exten.c index 1732e66712..3a21239926 100644 --- a/src/lib/libcrypto/asn1/x_exten.c +++ b/src/lib/libcrypto/asn1/x_exten.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* x_exten.c */ | 1 | /* x_exten.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/x_long.c b/src/lib/libcrypto/asn1/x_long.c index 0db233cb95..bf35457c1f 100644 --- a/src/lib/libcrypto/asn1/x_long.c +++ b/src/lib/libcrypto/asn1/x_long.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* x_long.c */ | 1 | /* x_long.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/asn1/x_x509a.c b/src/lib/libcrypto/asn1/x_x509a.c index 13db5fd03f..b603f82de7 100644 --- a/src/lib/libcrypto/asn1/x_x509a.c +++ b/src/lib/libcrypto/asn1/x_x509a.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* a_x509a.c */ | 1 | /* a_x509a.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/bf/bf_skey.c b/src/lib/libcrypto/bf/bf_skey.c index 3673cdee6e..6ac2aeb279 100644 --- a/src/lib/libcrypto/bf/bf_skey.c +++ b/src/lib/libcrypto/bf/bf_skey.c | |||
| @@ -59,10 +59,15 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include <string.h> | 60 | #include <string.h> |
| 61 | #include <openssl/blowfish.h> | 61 | #include <openssl/blowfish.h> |
| 62 | #include <openssl/crypto.h> | ||
| 63 | #ifdef OPENSSL_FIPS | ||
| 64 | #include <openssl/fips.h> | ||
| 65 | #endif | ||
| 66 | |||
| 62 | #include "bf_locl.h" | 67 | #include "bf_locl.h" |
| 63 | #include "bf_pi.h" | 68 | #include "bf_pi.h" |
| 64 | 69 | ||
| 65 | void BF_set_key(BF_KEY *key, int len, const unsigned char *data) | 70 | FIPS_NON_FIPS_VCIPHER_Init(BF) |
| 66 | { | 71 | { |
| 67 | int i; | 72 | int i; |
| 68 | BF_LONG *p,ri,in[2]; | 73 | BF_LONG *p,ri,in[2]; |
diff --git a/src/lib/libcrypto/bf/blowfish.h b/src/lib/libcrypto/bf/blowfish.h index cd49e85ab2..d24ffccb65 100644 --- a/src/lib/libcrypto/bf/blowfish.h +++ b/src/lib/libcrypto/bf/blowfish.h | |||
| @@ -104,7 +104,9 @@ typedef struct bf_key_st | |||
| 104 | BF_LONG S[4*256]; | 104 | BF_LONG S[4*256]; |
| 105 | } BF_KEY; | 105 | } BF_KEY; |
| 106 | 106 | ||
| 107 | 107 | #ifdef OPENSSL_FIPS | |
| 108 | void private_BF_set_key(BF_KEY *key, int len, const unsigned char *data); | ||
| 109 | #endif | ||
| 108 | void BF_set_key(BF_KEY *key, int len, const unsigned char *data); | 110 | void BF_set_key(BF_KEY *key, int len, const unsigned char *data); |
| 109 | 111 | ||
| 110 | void BF_encrypt(BF_LONG *data,const BF_KEY *key); | 112 | void BF_encrypt(BF_LONG *data,const BF_KEY *key); |
diff --git a/src/lib/libcrypto/bio/bss_bio.c b/src/lib/libcrypto/bio/bss_bio.c index 0f9f0955b4..76bd48e767 100644 --- a/src/lib/libcrypto/bio/bss_bio.c +++ b/src/lib/libcrypto/bio/bss_bio.c | |||
| @@ -919,6 +919,6 @@ int BIO_nwrite(BIO *bio, char **buf, int num) | |||
| 919 | 919 | ||
| 920 | ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf); | 920 | ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf); |
| 921 | if (ret > 0) | 921 | if (ret > 0) |
| 922 | bio->num_read += ret; | 922 | bio->num_write += ret; |
| 923 | return ret; | 923 | return ret; |
| 924 | } | 924 | } |
diff --git a/src/lib/libcrypto/bio/bss_dgram.c b/src/lib/libcrypto/bio/bss_dgram.c index ea2c3fff63..c3da6dc82f 100644 --- a/src/lib/libcrypto/bio/bss_dgram.c +++ b/src/lib/libcrypto/bio/bss_dgram.c | |||
| @@ -82,7 +82,7 @@ static int dgram_new(BIO *h); | |||
| 82 | static int dgram_free(BIO *data); | 82 | static int dgram_free(BIO *data); |
| 83 | static int dgram_clear(BIO *bio); | 83 | static int dgram_clear(BIO *bio); |
| 84 | 84 | ||
| 85 | int BIO_dgram_should_retry(int s); | 85 | static int BIO_dgram_should_retry(int s); |
| 86 | 86 | ||
| 87 | static BIO_METHOD methods_dgramp= | 87 | static BIO_METHOD methods_dgramp= |
| 88 | { | 88 | { |
| @@ -345,30 +345,90 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 345 | 345 | ||
| 346 | memcpy(&(data->peer), to, sizeof(struct sockaddr)); | 346 | memcpy(&(data->peer), to, sizeof(struct sockaddr)); |
| 347 | break; | 347 | break; |
| 348 | #if defined(SO_RCVTIMEO) | ||
| 348 | case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: | 349 | case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: |
| 350 | #ifdef OPENSSL_SYS_WINDOWS | ||
| 351 | { | ||
| 352 | struct timeval *tv = (struct timeval *)ptr; | ||
| 353 | int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; | ||
| 354 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | ||
| 355 | (void*)&timeout, sizeof(timeout)) < 0) | ||
| 356 | { perror("setsockopt"); ret = -1; } | ||
| 357 | } | ||
| 358 | #else | ||
| 349 | if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, | 359 | if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, |
| 350 | sizeof(struct timeval)) < 0) | 360 | sizeof(struct timeval)) < 0) |
| 351 | { perror("setsockopt"); ret = -1; } | 361 | { perror("setsockopt"); ret = -1; } |
| 362 | #endif | ||
| 352 | break; | 363 | break; |
| 353 | case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: | 364 | case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: |
| 365 | #ifdef OPENSSL_SYS_WINDOWS | ||
| 366 | { | ||
| 367 | int timeout, sz = sizeof(timeout); | ||
| 368 | struct timeval *tv = (struct timeval *)ptr; | ||
| 369 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | ||
| 370 | (void*)&timeout, &sz) < 0) | ||
| 371 | { perror("getsockopt"); ret = -1; } | ||
| 372 | else | ||
| 373 | { | ||
| 374 | tv->tv_sec = timeout / 1000; | ||
| 375 | tv->tv_usec = (timeout % 1000) * 1000; | ||
| 376 | ret = sizeof(*tv); | ||
| 377 | } | ||
| 378 | } | ||
| 379 | #else | ||
| 354 | if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 380 | if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 355 | ptr, (void *)&ret) < 0) | 381 | ptr, (void *)&ret) < 0) |
| 356 | { perror("getsockopt"); ret = -1; } | 382 | { perror("getsockopt"); ret = -1; } |
| 383 | #endif | ||
| 357 | break; | 384 | break; |
| 385 | #endif | ||
| 386 | #if defined(SO_SNDTIMEO) | ||
| 358 | case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: | 387 | case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: |
| 388 | #ifdef OPENSSL_SYS_WINDOWS | ||
| 389 | { | ||
| 390 | struct timeval *tv = (struct timeval *)ptr; | ||
| 391 | int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; | ||
| 392 | if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, | ||
| 393 | (void*)&timeout, sizeof(timeout)) < 0) | ||
| 394 | { perror("setsockopt"); ret = -1; } | ||
| 395 | } | ||
| 396 | #else | ||
| 359 | if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, | 397 | if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, |
| 360 | sizeof(struct timeval)) < 0) | 398 | sizeof(struct timeval)) < 0) |
| 361 | { perror("setsockopt"); ret = -1; } | 399 | { perror("setsockopt"); ret = -1; } |
| 400 | #endif | ||
| 362 | break; | 401 | break; |
| 363 | case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: | 402 | case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: |
| 403 | #ifdef OPENSSL_SYS_WINDOWS | ||
| 404 | { | ||
| 405 | int timeout, sz = sizeof(timeout); | ||
| 406 | struct timeval *tv = (struct timeval *)ptr; | ||
| 407 | if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, | ||
| 408 | (void*)&timeout, &sz) < 0) | ||
| 409 | { perror("getsockopt"); ret = -1; } | ||
| 410 | else | ||
| 411 | { | ||
| 412 | tv->tv_sec = timeout / 1000; | ||
| 413 | tv->tv_usec = (timeout % 1000) * 1000; | ||
| 414 | ret = sizeof(*tv); | ||
| 415 | } | ||
| 416 | } | ||
| 417 | #else | ||
| 364 | if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, | 418 | if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, |
| 365 | ptr, (void *)&ret) < 0) | 419 | ptr, (void *)&ret) < 0) |
| 366 | { perror("getsockopt"); ret = -1; } | 420 | { perror("getsockopt"); ret = -1; } |
| 421 | #endif | ||
| 367 | break; | 422 | break; |
| 423 | #endif | ||
| 368 | case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP: | 424 | case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP: |
| 369 | /* fall-through */ | 425 | /* fall-through */ |
| 370 | case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: | 426 | case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: |
| 427 | #ifdef OPENSSL_SYS_WINDOWS | ||
| 428 | if ( data->_errno == WSAETIMEDOUT) | ||
| 429 | #else | ||
| 371 | if ( data->_errno == EAGAIN) | 430 | if ( data->_errno == EAGAIN) |
| 431 | #endif | ||
| 372 | { | 432 | { |
| 373 | ret = 1; | 433 | ret = 1; |
| 374 | data->_errno = 0; | 434 | data->_errno = 0; |
| @@ -403,7 +463,7 @@ static int dgram_puts(BIO *bp, const char *str) | |||
| 403 | return(ret); | 463 | return(ret); |
| 404 | } | 464 | } |
| 405 | 465 | ||
| 406 | int BIO_dgram_should_retry(int i) | 466 | static int BIO_dgram_should_retry(int i) |
| 407 | { | 467 | { |
| 408 | int err; | 468 | int err; |
| 409 | 469 | ||
diff --git a/src/lib/libcrypto/bio/bss_file.c b/src/lib/libcrypto/bio/bss_file.c index 4df9927c43..9ad46fa081 100644 --- a/src/lib/libcrypto/bio/bss_file.c +++ b/src/lib/libcrypto/bio/bss_file.c | |||
| @@ -279,7 +279,7 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 279 | #endif | 279 | #endif |
| 280 | { | 280 | { |
| 281 | #if defined(OPENSSL_SYS_WINDOWS) | 281 | #if defined(OPENSSL_SYS_WINDOWS) |
| 282 | int fd = fileno((FILE*)ptr); | 282 | int fd = _fileno((FILE*)ptr); |
| 283 | if (num & BIO_FP_TEXT) | 283 | if (num & BIO_FP_TEXT) |
| 284 | _setmode(fd,_O_TEXT); | 284 | _setmode(fd,_O_TEXT); |
| 285 | else | 285 | else |
diff --git a/src/lib/libcrypto/bn/bn.h b/src/lib/libcrypto/bn/bn.h index 6d754d5547..f1719a5877 100644 --- a/src/lib/libcrypto/bn/bn.h +++ b/src/lib/libcrypto/bn/bn.h | |||
| @@ -408,8 +408,8 @@ BIGNUM *BN_CTX_get(BN_CTX *ctx); | |||
| 408 | void BN_CTX_end(BN_CTX *ctx); | 408 | void BN_CTX_end(BN_CTX *ctx); |
| 409 | int BN_rand(BIGNUM *rnd, int bits, int top,int bottom); | 409 | int BN_rand(BIGNUM *rnd, int bits, int top,int bottom); |
| 410 | int BN_pseudo_rand(BIGNUM *rnd, int bits, int top,int bottom); | 410 | int BN_pseudo_rand(BIGNUM *rnd, int bits, int top,int bottom); |
| 411 | int BN_rand_range(BIGNUM *rnd, BIGNUM *range); | 411 | int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); |
| 412 | int BN_pseudo_rand_range(BIGNUM *rnd, BIGNUM *range); | 412 | int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range); |
| 413 | int BN_num_bits(const BIGNUM *a); | 413 | int BN_num_bits(const BIGNUM *a); |
| 414 | int BN_num_bits_word(BN_ULONG); | 414 | int BN_num_bits_word(BN_ULONG); |
| 415 | BIGNUM *BN_new(void); | 415 | BIGNUM *BN_new(void); |
| @@ -531,6 +531,17 @@ int BN_is_prime_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx, BN_GENCB *cb); | |||
| 531 | int BN_is_prime_fasttest_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx, | 531 | int BN_is_prime_fasttest_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx, |
| 532 | int do_trial_division, BN_GENCB *cb); | 532 | int do_trial_division, BN_GENCB *cb); |
| 533 | 533 | ||
| 534 | int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); | ||
| 535 | |||
| 536 | int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, | ||
| 537 | const BIGNUM *Xp, const BIGNUM *Xp1, const BIGNUM *Xp2, | ||
| 538 | const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb); | ||
| 539 | int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, | ||
| 540 | BIGNUM *Xp1, BIGNUM *Xp2, | ||
| 541 | const BIGNUM *Xp, | ||
| 542 | const BIGNUM *e, BN_CTX *ctx, | ||
| 543 | BN_GENCB *cb); | ||
| 544 | |||
| 534 | BN_MONT_CTX *BN_MONT_CTX_new(void ); | 545 | BN_MONT_CTX *BN_MONT_CTX_new(void ); |
| 535 | void BN_MONT_CTX_init(BN_MONT_CTX *ctx); | 546 | void BN_MONT_CTX_init(BN_MONT_CTX *ctx); |
| 536 | int BN_mod_mul_montgomery(BIGNUM *r,const BIGNUM *a,const BIGNUM *b, | 547 | int BN_mod_mul_montgomery(BIGNUM *r,const BIGNUM *a,const BIGNUM *b, |
diff --git a/src/lib/libcrypto/bn/bn_div.c b/src/lib/libcrypto/bn/bn_div.c index 8655eb118e..1e8e57626b 100644 --- a/src/lib/libcrypto/bn/bn_div.c +++ b/src/lib/libcrypto/bn/bn_div.c | |||
| @@ -187,6 +187,17 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, | |||
| 187 | BN_ULONG d0,d1; | 187 | BN_ULONG d0,d1; |
| 188 | int num_n,div_n; | 188 | int num_n,div_n; |
| 189 | 189 | ||
| 190 | /* Invalid zero-padding would have particularly bad consequences | ||
| 191 | * in the case of 'num', so don't just rely on bn_check_top() for this one | ||
| 192 | * (bn_check_top() works only for BN_DEBUG builds) */ | ||
| 193 | if (num->top > 0 && num->d[num->top - 1] == 0) | ||
| 194 | { | ||
| 195 | BNerr(BN_F_BN_DIV,BN_R_NOT_INITIALIZED); | ||
| 196 | return 0; | ||
| 197 | } | ||
| 198 | |||
| 199 | bn_check_top(num); | ||
| 200 | |||
| 190 | if ((BN_get_flags(num, BN_FLG_CONSTTIME) != 0) || (BN_get_flags(divisor, BN_FLG_CONSTTIME) != 0)) | 201 | if ((BN_get_flags(num, BN_FLG_CONSTTIME) != 0) || (BN_get_flags(divisor, BN_FLG_CONSTTIME) != 0)) |
| 191 | { | 202 | { |
| 192 | return BN_div_no_branch(dv, rm, num, divisor, ctx); | 203 | return BN_div_no_branch(dv, rm, num, divisor, ctx); |
| @@ -194,7 +205,7 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, | |||
| 194 | 205 | ||
| 195 | bn_check_top(dv); | 206 | bn_check_top(dv); |
| 196 | bn_check_top(rm); | 207 | bn_check_top(rm); |
| 197 | bn_check_top(num); | 208 | /* bn_check_top(num); */ /* 'num' has been checked already */ |
| 198 | bn_check_top(divisor); | 209 | bn_check_top(divisor); |
| 199 | 210 | ||
| 200 | if (BN_is_zero(divisor)) | 211 | if (BN_is_zero(divisor)) |
| @@ -419,7 +430,7 @@ static int BN_div_no_branch(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, | |||
| 419 | 430 | ||
| 420 | bn_check_top(dv); | 431 | bn_check_top(dv); |
| 421 | bn_check_top(rm); | 432 | bn_check_top(rm); |
| 422 | bn_check_top(num); | 433 | /* bn_check_top(num); */ /* 'num' has been checked in BN_div() */ |
| 423 | bn_check_top(divisor); | 434 | bn_check_top(divisor); |
| 424 | 435 | ||
| 425 | if (BN_is_zero(divisor)) | 436 | if (BN_is_zero(divisor)) |
diff --git a/src/lib/libcrypto/bn/bn_gf2m.c b/src/lib/libcrypto/bn/bn_gf2m.c index 6a793857e1..306f029f27 100644 --- a/src/lib/libcrypto/bn/bn_gf2m.c +++ b/src/lib/libcrypto/bn/bn_gf2m.c | |||
| @@ -384,7 +384,11 @@ int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[]) | |||
| 384 | if (zz == 0) break; | 384 | if (zz == 0) break; |
| 385 | d1 = BN_BITS2 - d0; | 385 | d1 = BN_BITS2 - d0; |
| 386 | 386 | ||
| 387 | if (d0) z[dN] = (z[dN] << d1) >> d1; /* clear up the top d1 bits */ | 387 | /* clear up the top d1 bits */ |
| 388 | if (d0) | ||
| 389 | z[dN] = (z[dN] << d1) >> d1; | ||
| 390 | else | ||
| 391 | z[dN] = 0; | ||
| 388 | z[0] ^= zz; /* reduction t^0 component */ | 392 | z[0] ^= zz; /* reduction t^0 component */ |
| 389 | 393 | ||
| 390 | for (k = 1; p[k] != 0; k++) | 394 | for (k = 1; p[k] != 0; k++) |
diff --git a/src/lib/libcrypto/bn/bn_lib.c b/src/lib/libcrypto/bn/bn_lib.c index 2649b8c538..32a8fbaf51 100644 --- a/src/lib/libcrypto/bn/bn_lib.c +++ b/src/lib/libcrypto/bn/bn_lib.c | |||
| @@ -139,25 +139,6 @@ const BIGNUM *BN_value_one(void) | |||
| 139 | return(&const_one); | 139 | return(&const_one); |
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | char *BN_options(void) | ||
| 143 | { | ||
| 144 | static int init=0; | ||
| 145 | static char data[16]; | ||
| 146 | |||
| 147 | if (!init) | ||
| 148 | { | ||
| 149 | init++; | ||
| 150 | #ifdef BN_LLONG | ||
| 151 | BIO_snprintf(data,sizeof data,"bn(%d,%d)", | ||
| 152 | (int)sizeof(BN_ULLONG)*8,(int)sizeof(BN_ULONG)*8); | ||
| 153 | #else | ||
| 154 | BIO_snprintf(data,sizeof data,"bn(%d,%d)", | ||
| 155 | (int)sizeof(BN_ULONG)*8,(int)sizeof(BN_ULONG)*8); | ||
| 156 | #endif | ||
| 157 | } | ||
| 158 | return(data); | ||
| 159 | } | ||
| 160 | |||
| 161 | int BN_num_bits_word(BN_ULONG l) | 142 | int BN_num_bits_word(BN_ULONG l) |
| 162 | { | 143 | { |
| 163 | static const char bits[256]={ | 144 | static const char bits[256]={ |
diff --git a/src/lib/libcrypto/bn/bn_nist.c b/src/lib/libcrypto/bn/bn_nist.c index e14232fdbb..2ca5b01391 100644 --- a/src/lib/libcrypto/bn/bn_nist.c +++ b/src/lib/libcrypto/bn/bn_nist.c | |||
| @@ -59,109 +59,266 @@ | |||
| 59 | #include "bn_lcl.h" | 59 | #include "bn_lcl.h" |
| 60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
| 61 | 61 | ||
| 62 | |||
| 62 | #define BN_NIST_192_TOP (192+BN_BITS2-1)/BN_BITS2 | 63 | #define BN_NIST_192_TOP (192+BN_BITS2-1)/BN_BITS2 |
| 63 | #define BN_NIST_224_TOP (224+BN_BITS2-1)/BN_BITS2 | 64 | #define BN_NIST_224_TOP (224+BN_BITS2-1)/BN_BITS2 |
| 64 | #define BN_NIST_256_TOP (256+BN_BITS2-1)/BN_BITS2 | 65 | #define BN_NIST_256_TOP (256+BN_BITS2-1)/BN_BITS2 |
| 65 | #define BN_NIST_384_TOP (384+BN_BITS2-1)/BN_BITS2 | 66 | #define BN_NIST_384_TOP (384+BN_BITS2-1)/BN_BITS2 |
| 66 | #define BN_NIST_521_TOP (521+BN_BITS2-1)/BN_BITS2 | 67 | #define BN_NIST_521_TOP (521+BN_BITS2-1)/BN_BITS2 |
| 67 | 68 | ||
| 69 | /* pre-computed tables are "carry-less" values of modulus*(i+1) */ | ||
| 68 | #if BN_BITS2 == 64 | 70 | #if BN_BITS2 == 64 |
| 69 | static const BN_ULONG _nist_p_192[] = | 71 | static const BN_ULONG _nist_p_192[][BN_NIST_192_TOP] = { |
| 70 | {0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFEULL, | 72 | {0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFEULL,0xFFFFFFFFFFFFFFFFULL}, |
| 71 | 0xFFFFFFFFFFFFFFFFULL}; | 73 | {0xFFFFFFFFFFFFFFFEULL,0xFFFFFFFFFFFFFFFDULL,0xFFFFFFFFFFFFFFFFULL}, |
| 72 | static const BN_ULONG _nist_p_224[] = | 74 | {0xFFFFFFFFFFFFFFFDULL,0xFFFFFFFFFFFFFFFCULL,0xFFFFFFFFFFFFFFFFULL} |
| 75 | }; | ||
| 76 | static const BN_ULONG _nist_p_192_sqr[] = { | ||
| 77 | 0x0000000000000001ULL,0x0000000000000002ULL,0x0000000000000001ULL, | ||
| 78 | 0xFFFFFFFFFFFFFFFEULL,0xFFFFFFFFFFFFFFFDULL,0xFFFFFFFFFFFFFFFFULL | ||
| 79 | }; | ||
| 80 | static const BN_ULONG _nist_p_224[][BN_NIST_224_TOP] = { | ||
| 73 | {0x0000000000000001ULL,0xFFFFFFFF00000000ULL, | 81 | {0x0000000000000001ULL,0xFFFFFFFF00000000ULL, |
| 74 | 0xFFFFFFFFFFFFFFFFULL,0x00000000FFFFFFFFULL}; | 82 | 0xFFFFFFFFFFFFFFFFULL,0x00000000FFFFFFFFULL}, |
| 75 | static const BN_ULONG _nist_p_256[] = | 83 | {0x0000000000000002ULL,0xFFFFFFFE00000000ULL, |
| 84 | 0xFFFFFFFFFFFFFFFFULL,0x00000001FFFFFFFFULL} /* this one is "carry-full" */ | ||
| 85 | }; | ||
| 86 | static const BN_ULONG _nist_p_224_sqr[] = { | ||
| 87 | 0x0000000000000001ULL,0xFFFFFFFE00000000ULL, | ||
| 88 | 0xFFFFFFFFFFFFFFFFULL,0x0000000200000000ULL, | ||
| 89 | 0x0000000000000000ULL,0xFFFFFFFFFFFFFFFEULL, | ||
| 90 | 0xFFFFFFFFFFFFFFFFULL | ||
| 91 | }; | ||
| 92 | static const BN_ULONG _nist_p_256[][BN_NIST_256_TOP] = { | ||
| 76 | {0xFFFFFFFFFFFFFFFFULL,0x00000000FFFFFFFFULL, | 93 | {0xFFFFFFFFFFFFFFFFULL,0x00000000FFFFFFFFULL, |
| 77 | 0x0000000000000000ULL,0xFFFFFFFF00000001ULL}; | 94 | 0x0000000000000000ULL,0xFFFFFFFF00000001ULL}, |
| 78 | static const BN_ULONG _nist_p_384[] = | 95 | {0xFFFFFFFFFFFFFFFEULL,0x00000001FFFFFFFFULL, |
| 79 | {0x00000000FFFFFFFFULL,0xFFFFFFFF00000000ULL, | 96 | 0x0000000000000000ULL,0xFFFFFFFE00000002ULL}, |
| 80 | 0xFFFFFFFFFFFFFFFEULL,0xFFFFFFFFFFFFFFFFULL, | 97 | {0xFFFFFFFFFFFFFFFDULL,0x00000002FFFFFFFFULL, |
| 81 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}; | 98 | 0x0000000000000000ULL,0xFFFFFFFD00000003ULL}, |
| 99 | {0xFFFFFFFFFFFFFFFCULL,0x00000003FFFFFFFFULL, | ||
| 100 | 0x0000000000000000ULL,0xFFFFFFFC00000004ULL}, | ||
| 101 | {0xFFFFFFFFFFFFFFFBULL,0x00000004FFFFFFFFULL, | ||
| 102 | 0x0000000000000000ULL,0xFFFFFFFB00000005ULL}, | ||
| 103 | }; | ||
| 104 | static const BN_ULONG _nist_p_256_sqr[] = { | ||
| 105 | 0x0000000000000001ULL,0xFFFFFFFE00000000ULL, | ||
| 106 | 0xFFFFFFFFFFFFFFFFULL,0x00000001FFFFFFFEULL, | ||
| 107 | 0x00000001FFFFFFFEULL,0x00000001FFFFFFFEULL, | ||
| 108 | 0xFFFFFFFE00000001ULL,0xFFFFFFFE00000002ULL | ||
| 109 | }; | ||
| 110 | static const BN_ULONG _nist_p_384[][BN_NIST_384_TOP] = { | ||
| 111 | {0x00000000FFFFFFFFULL,0xFFFFFFFF00000000ULL,0xFFFFFFFFFFFFFFFEULL, | ||
| 112 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, | ||
| 113 | {0x00000001FFFFFFFEULL,0xFFFFFFFE00000000ULL,0xFFFFFFFFFFFFFFFDULL, | ||
| 114 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, | ||
| 115 | {0x00000002FFFFFFFDULL,0xFFFFFFFD00000000ULL,0xFFFFFFFFFFFFFFFCULL, | ||
| 116 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, | ||
| 117 | {0x00000003FFFFFFFCULL,0xFFFFFFFC00000000ULL,0xFFFFFFFFFFFFFFFBULL, | ||
| 118 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, | ||
| 119 | {0x00000004FFFFFFFBULL,0xFFFFFFFB00000000ULL,0xFFFFFFFFFFFFFFFAULL, | ||
| 120 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, | ||
| 121 | }; | ||
| 122 | static const BN_ULONG _nist_p_384_sqr[] = { | ||
| 123 | 0xFFFFFFFE00000001ULL,0x0000000200000000ULL,0xFFFFFFFE00000000ULL, | ||
| 124 | 0x0000000200000000ULL,0x0000000000000001ULL,0x0000000000000000ULL, | ||
| 125 | 0x00000001FFFFFFFEULL,0xFFFFFFFE00000000ULL,0xFFFFFFFFFFFFFFFDULL, | ||
| 126 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL | ||
| 127 | }; | ||
| 82 | static const BN_ULONG _nist_p_521[] = | 128 | static const BN_ULONG _nist_p_521[] = |
| 83 | {0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL, | 129 | {0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL, |
| 84 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL, | 130 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL, |
| 85 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL, | 131 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL, |
| 86 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL, | 132 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL, |
| 87 | 0x00000000000001FFULL}; | 133 | 0x00000000000001FFULL}; |
| 134 | static const BN_ULONG _nist_p_521_sqr[] = { | ||
| 135 | 0x0000000000000001ULL,0x0000000000000000ULL,0x0000000000000000ULL, | ||
| 136 | 0x0000000000000000ULL,0x0000000000000000ULL,0x0000000000000000ULL, | ||
| 137 | 0x0000000000000000ULL,0x0000000000000000ULL,0xFFFFFFFFFFFFFC00ULL, | ||
| 138 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL, | ||
| 139 | 0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL, | ||
| 140 | 0xFFFFFFFFFFFFFFFFULL,0x000000000003FFFFULL | ||
| 141 | }; | ||
| 88 | #elif BN_BITS2 == 32 | 142 | #elif BN_BITS2 == 32 |
| 89 | static const BN_ULONG _nist_p_192[] = {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFE, | 143 | static const BN_ULONG _nist_p_192[][BN_NIST_192_TOP] = { |
| 90 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}; | 144 | {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFE,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}, |
| 91 | static const BN_ULONG _nist_p_224[] = {0x00000001,0x00000000,0x00000000, | 145 | {0xFFFFFFFE,0xFFFFFFFF,0xFFFFFFFD,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}, |
| 92 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}; | 146 | {0xFFFFFFFD,0xFFFFFFFF,0xFFFFFFFC,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF} |
| 93 | static const BN_ULONG _nist_p_256[] = {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | 147 | }; |
| 94 | 0x00000000,0x00000000,0x00000000,0x00000001,0xFFFFFFFF}; | 148 | static const BN_ULONG _nist_p_192_sqr[] = { |
| 95 | static const BN_ULONG _nist_p_384[] = {0xFFFFFFFF,0x00000000,0x00000000, | 149 | 0x00000001,0x00000000,0x00000002,0x00000000,0x00000001,0x00000000, |
| 96 | 0xFFFFFFFF,0xFFFFFFFE,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | 150 | 0xFFFFFFFE,0xFFFFFFFF,0xFFFFFFFD,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF |
| 97 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}; | 151 | }; |
| 152 | static const BN_ULONG _nist_p_224[][BN_NIST_224_TOP] = { | ||
| 153 | {0x00000001,0x00000000,0x00000000,0xFFFFFFFF, | ||
| 154 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}, | ||
| 155 | {0x00000002,0x00000000,0x00000000,0xFFFFFFFE, | ||
| 156 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF} | ||
| 157 | }; | ||
| 158 | static const BN_ULONG _nist_p_224_sqr[] = { | ||
| 159 | 0x00000001,0x00000000,0x00000000,0xFFFFFFFE, | ||
| 160 | 0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000002, | ||
| 161 | 0x00000000,0x00000000,0xFFFFFFFE,0xFFFFFFFF, | ||
| 162 | 0xFFFFFFFF,0xFFFFFFFF | ||
| 163 | }; | ||
| 164 | static const BN_ULONG _nist_p_256[][BN_NIST_256_TOP] = { | ||
| 165 | {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0x00000000, | ||
| 166 | 0x00000000,0x00000000,0x00000001,0xFFFFFFFF}, | ||
| 167 | {0xFFFFFFFE,0xFFFFFFFF,0xFFFFFFFF,0x00000001, | ||
| 168 | 0x00000000,0x00000000,0x00000002,0xFFFFFFFE}, | ||
| 169 | {0xFFFFFFFD,0xFFFFFFFF,0xFFFFFFFF,0x00000002, | ||
| 170 | 0x00000000,0x00000000,0x00000003,0xFFFFFFFD}, | ||
| 171 | {0xFFFFFFFC,0xFFFFFFFF,0xFFFFFFFF,0x00000003, | ||
| 172 | 0x00000000,0x00000000,0x00000004,0xFFFFFFFC}, | ||
| 173 | {0xFFFFFFFB,0xFFFFFFFF,0xFFFFFFFF,0x00000004, | ||
| 174 | 0x00000000,0x00000000,0x00000005,0xFFFFFFFB}, | ||
| 175 | }; | ||
| 176 | static const BN_ULONG _nist_p_256_sqr[] = { | ||
| 177 | 0x00000001,0x00000000,0x00000000,0xFFFFFFFE, | ||
| 178 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFE,0x00000001, | ||
| 179 | 0xFFFFFFFE,0x00000001,0xFFFFFFFE,0x00000001, | ||
| 180 | 0x00000001,0xFFFFFFFE,0x00000002,0xFFFFFFFE | ||
| 181 | }; | ||
| 182 | static const BN_ULONG _nist_p_384[][BN_NIST_384_TOP] = { | ||
| 183 | {0xFFFFFFFF,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFE,0xFFFFFFFF, | ||
| 184 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}, | ||
| 185 | {0xFFFFFFFE,0x00000001,0x00000000,0xFFFFFFFE,0xFFFFFFFD,0xFFFFFFFF, | ||
| 186 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}, | ||
| 187 | {0xFFFFFFFD,0x00000002,0x00000000,0xFFFFFFFD,0xFFFFFFFC,0xFFFFFFFF, | ||
| 188 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}, | ||
| 189 | {0xFFFFFFFC,0x00000003,0x00000000,0xFFFFFFFC,0xFFFFFFFB,0xFFFFFFFF, | ||
| 190 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}, | ||
| 191 | {0xFFFFFFFB,0x00000004,0x00000000,0xFFFFFFFB,0xFFFFFFFA,0xFFFFFFFF, | ||
| 192 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}, | ||
| 193 | }; | ||
| 194 | static const BN_ULONG _nist_p_384_sqr[] = { | ||
| 195 | 0x00000001,0xFFFFFFFE,0x00000000,0x00000002,0x00000000,0xFFFFFFFE, | ||
| 196 | 0x00000000,0x00000002,0x00000001,0x00000000,0x00000000,0x00000000, | ||
| 197 | 0xFFFFFFFE,0x00000001,0x00000000,0xFFFFFFFE,0xFFFFFFFD,0xFFFFFFFF, | ||
| 198 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF | ||
| 199 | }; | ||
| 98 | static const BN_ULONG _nist_p_521[] = {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | 200 | static const BN_ULONG _nist_p_521[] = {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, |
| 99 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | 201 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, |
| 100 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | 202 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, |
| 101 | 0xFFFFFFFF,0x000001FF}; | 203 | 0xFFFFFFFF,0x000001FF}; |
| 204 | static const BN_ULONG _nist_p_521_sqr[] = { | ||
| 205 | 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 206 | 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 207 | 0x00000000,0x00000000,0x00000000,0x00000000,0xFFFFFC00,0xFFFFFFFF, | ||
| 208 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 209 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 210 | 0xFFFFFFFF,0xFFFFFFFF,0x0003FFFF | ||
| 211 | }; | ||
| 212 | #else | ||
| 213 | #error "unsupported BN_BITS2" | ||
| 102 | #endif | 214 | #endif |
| 103 | 215 | ||
| 216 | |||
| 217 | static const BIGNUM _bignum_nist_p_192 = | ||
| 218 | { | ||
| 219 | (BN_ULONG *)_nist_p_192[0], | ||
| 220 | BN_NIST_192_TOP, | ||
| 221 | BN_NIST_192_TOP, | ||
| 222 | 0, | ||
| 223 | BN_FLG_STATIC_DATA | ||
| 224 | }; | ||
| 225 | |||
| 226 | static const BIGNUM _bignum_nist_p_224 = | ||
| 227 | { | ||
| 228 | (BN_ULONG *)_nist_p_224[0], | ||
| 229 | BN_NIST_224_TOP, | ||
| 230 | BN_NIST_224_TOP, | ||
| 231 | 0, | ||
| 232 | BN_FLG_STATIC_DATA | ||
| 233 | }; | ||
| 234 | |||
| 235 | static const BIGNUM _bignum_nist_p_256 = | ||
| 236 | { | ||
| 237 | (BN_ULONG *)_nist_p_256[0], | ||
| 238 | BN_NIST_256_TOP, | ||
| 239 | BN_NIST_256_TOP, | ||
| 240 | 0, | ||
| 241 | BN_FLG_STATIC_DATA | ||
| 242 | }; | ||
| 243 | |||
| 244 | static const BIGNUM _bignum_nist_p_384 = | ||
| 245 | { | ||
| 246 | (BN_ULONG *)_nist_p_384[0], | ||
| 247 | BN_NIST_384_TOP, | ||
| 248 | BN_NIST_384_TOP, | ||
| 249 | 0, | ||
| 250 | BN_FLG_STATIC_DATA | ||
| 251 | }; | ||
| 252 | |||
| 253 | static const BIGNUM _bignum_nist_p_521 = | ||
| 254 | { | ||
| 255 | (BN_ULONG *)_nist_p_521, | ||
| 256 | BN_NIST_521_TOP, | ||
| 257 | BN_NIST_521_TOP, | ||
| 258 | 0, | ||
| 259 | BN_FLG_STATIC_DATA | ||
| 260 | }; | ||
| 261 | |||
| 262 | |||
| 104 | const BIGNUM *BN_get0_nist_prime_192(void) | 263 | const BIGNUM *BN_get0_nist_prime_192(void) |
| 105 | { | 264 | { |
| 106 | static BIGNUM const_nist_192 = { (BN_ULONG *)_nist_p_192, | 265 | return &_bignum_nist_p_192; |
| 107 | BN_NIST_192_TOP, BN_NIST_192_TOP, 0, BN_FLG_STATIC_DATA }; | ||
| 108 | return &const_nist_192; | ||
| 109 | } | 266 | } |
| 110 | 267 | ||
| 111 | const BIGNUM *BN_get0_nist_prime_224(void) | 268 | const BIGNUM *BN_get0_nist_prime_224(void) |
| 112 | { | 269 | { |
| 113 | static BIGNUM const_nist_224 = { (BN_ULONG *)_nist_p_224, | 270 | return &_bignum_nist_p_224; |
| 114 | BN_NIST_224_TOP, BN_NIST_224_TOP, 0, BN_FLG_STATIC_DATA }; | ||
| 115 | return &const_nist_224; | ||
| 116 | } | 271 | } |
| 117 | 272 | ||
| 118 | const BIGNUM *BN_get0_nist_prime_256(void) | 273 | const BIGNUM *BN_get0_nist_prime_256(void) |
| 119 | { | 274 | { |
| 120 | static BIGNUM const_nist_256 = { (BN_ULONG *)_nist_p_256, | 275 | return &_bignum_nist_p_256; |
| 121 | BN_NIST_256_TOP, BN_NIST_256_TOP, 0, BN_FLG_STATIC_DATA }; | ||
| 122 | return &const_nist_256; | ||
| 123 | } | 276 | } |
| 124 | 277 | ||
| 125 | const BIGNUM *BN_get0_nist_prime_384(void) | 278 | const BIGNUM *BN_get0_nist_prime_384(void) |
| 126 | { | 279 | { |
| 127 | static BIGNUM const_nist_384 = { (BN_ULONG *)_nist_p_384, | 280 | return &_bignum_nist_p_384; |
| 128 | BN_NIST_384_TOP, BN_NIST_384_TOP, 0, BN_FLG_STATIC_DATA }; | ||
| 129 | return &const_nist_384; | ||
| 130 | } | 281 | } |
| 131 | 282 | ||
| 132 | const BIGNUM *BN_get0_nist_prime_521(void) | 283 | const BIGNUM *BN_get0_nist_prime_521(void) |
| 133 | { | 284 | { |
| 134 | static BIGNUM const_nist_521 = { (BN_ULONG *)_nist_p_521, | 285 | return &_bignum_nist_p_521; |
| 135 | BN_NIST_521_TOP, BN_NIST_521_TOP, 0, BN_FLG_STATIC_DATA }; | ||
| 136 | return &const_nist_521; | ||
| 137 | } | 286 | } |
| 138 | 287 | ||
| 139 | #define BN_NIST_ADD_ONE(a) while (!(*(a)=(*(a)+1)&BN_MASK2)) ++(a); | ||
| 140 | 288 | ||
| 141 | static void nist_cp_bn_0(BN_ULONG *buf, BN_ULONG *a, int top, int max) | 289 | static void nist_cp_bn_0(BN_ULONG *buf, BN_ULONG *a, int top, int max) |
| 142 | { | 290 | { |
| 143 | int i; | 291 | int i; |
| 144 | BN_ULONG *_tmp1 = (buf), *_tmp2 = (a); | 292 | BN_ULONG *_tmp1 = (buf), *_tmp2 = (a); |
| 145 | for (i = (top); i != 0; i--) | 293 | |
| 146 | *_tmp1++ = *_tmp2++; | 294 | #ifdef BN_DEBUG |
| 147 | for (i = (max) - (top); i != 0; i--) | 295 | OPENSSL_assert(top <= max); |
| 148 | *_tmp1++ = (BN_ULONG) 0; | 296 | #endif |
| 149 | } | 297 | for (i = (top); i != 0; i--) |
| 298 | *_tmp1++ = *_tmp2++; | ||
| 299 | for (i = (max) - (top); i != 0; i--) | ||
| 300 | *_tmp1++ = (BN_ULONG) 0; | ||
| 301 | } | ||
| 150 | 302 | ||
| 151 | static void nist_cp_bn(BN_ULONG *buf, BN_ULONG *a, int top) | 303 | static void nist_cp_bn(BN_ULONG *buf, BN_ULONG *a, int top) |
| 152 | { | 304 | { |
| 153 | int i; | 305 | int i; |
| 154 | BN_ULONG *_tmp1 = (buf), *_tmp2 = (a); | 306 | BN_ULONG *_tmp1 = (buf), *_tmp2 = (a); |
| 155 | for (i = (top); i != 0; i--) | 307 | for (i = (top); i != 0; i--) |
| 156 | *_tmp1++ = *_tmp2++; | 308 | *_tmp1++ = *_tmp2++; |
| 157 | } | 309 | } |
| 158 | 310 | ||
| 159 | #if BN_BITS2 == 64 | 311 | #if BN_BITS2 == 64 |
| 160 | #define bn_cp_64(to, n, from, m) (to)[n] = (m>=0)?((from)[m]):0; | 312 | #define bn_cp_64(to, n, from, m) (to)[n] = (m>=0)?((from)[m]):0; |
| 161 | #define bn_64_set_0(to, n) (to)[n] = (BN_ULONG)0; | 313 | #define bn_64_set_0(to, n) (to)[n] = (BN_ULONG)0; |
| 162 | /* TBD */ | 314 | /* |
| 163 | #define bn_cp_32(to, n, from, m) (to)[n] = (m>=0)?((from)[m]):0; | 315 | * two following macros are implemented under assumption that they |
| 164 | #define bn_32_set_0(to, n) (to)[n] = (BN_ULONG)0; | 316 | * are called in a sequence with *ascending* n, i.e. as they are... |
| 317 | */ | ||
| 318 | #define bn_cp_32_naked(to, n, from, m) (((n)&1)?(to[(n)/2]|=((m)&1)?(from[(m)/2]&BN_MASK2h):(from[(m)/2]<<32))\ | ||
| 319 | :(to[(n)/2] =((m)&1)?(from[(m)/2]>>32):(from[(m)/2]&BN_MASK2l))) | ||
| 320 | #define bn_32_set_0(to, n) (((n)&1)?(to[(n)/2]&=BN_MASK2l):(to[(n)/2]=0)); | ||
| 321 | #define bn_cp_32(to,n,from,m) ((m)>=0)?bn_cp_32_naked(to,n,from,m):bn_32_set_0(to,n) | ||
| 165 | #else | 322 | #else |
| 166 | #define bn_cp_64(to, n, from, m) \ | 323 | #define bn_cp_64(to, n, from, m) \ |
| 167 | { \ | 324 | { \ |
| @@ -182,9 +339,9 @@ static void nist_cp_bn(BN_ULONG *buf, BN_ULONG *a, int top) | |||
| 182 | 339 | ||
| 183 | #define nist_set_192(to, from, a1, a2, a3) \ | 340 | #define nist_set_192(to, from, a1, a2, a3) \ |
| 184 | { \ | 341 | { \ |
| 185 | if (a3 != 0) bn_cp_64(to, 0, from, (a3) - 3) else bn_64_set_0(to, 0)\ | 342 | bn_cp_64(to, 0, from, (a3) - 3) \ |
| 186 | bn_cp_64(to, 1, from, (a2) - 3) \ | 343 | bn_cp_64(to, 1, from, (a2) - 3) \ |
| 187 | if (a1 != 0) bn_cp_64(to, 2, from, (a1) - 3) else bn_64_set_0(to, 2)\ | 344 | bn_cp_64(to, 2, from, (a1) - 3) \ |
| 188 | } | 345 | } |
| 189 | 346 | ||
| 190 | int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | 347 | int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, |
| @@ -198,6 +355,16 @@ int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 198 | c_d[BN_NIST_192_TOP], | 355 | c_d[BN_NIST_192_TOP], |
| 199 | *res; | 356 | *res; |
| 200 | size_t mask; | 357 | size_t mask; |
| 358 | static const BIGNUM _bignum_nist_p_192_sqr = { | ||
| 359 | (BN_ULONG *)_nist_p_192_sqr, | ||
| 360 | sizeof(_nist_p_192_sqr)/sizeof(_nist_p_192_sqr[0]), | ||
| 361 | sizeof(_nist_p_192_sqr)/sizeof(_nist_p_192_sqr[0]), | ||
| 362 | 0,BN_FLG_STATIC_DATA }; | ||
| 363 | |||
| 364 | field = &_bignum_nist_p_192; /* just to make sure */ | ||
| 365 | |||
| 366 | if (BN_is_negative(a) || BN_ucmp(a,&_bignum_nist_p_192_sqr)>=0) | ||
| 367 | return BN_nnmod(r, a, field, ctx); | ||
| 201 | 368 | ||
| 202 | i = BN_ucmp(field, a); | 369 | i = BN_ucmp(field, a); |
| 203 | if (i == 0) | 370 | if (i == 0) |
| @@ -208,9 +375,6 @@ int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 208 | else if (i > 0) | 375 | else if (i > 0) |
| 209 | return (r == a) ? 1 : (BN_copy(r ,a) != NULL); | 376 | return (r == a) ? 1 : (BN_copy(r ,a) != NULL); |
| 210 | 377 | ||
| 211 | if (top == BN_NIST_192_TOP) | ||
| 212 | return BN_usub(r, a, field); | ||
| 213 | |||
| 214 | if (r != a) | 378 | if (r != a) |
| 215 | { | 379 | { |
| 216 | if (!bn_wexpand(r, BN_NIST_192_TOP)) | 380 | if (!bn_wexpand(r, BN_NIST_192_TOP)) |
| @@ -224,23 +388,26 @@ int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 224 | nist_cp_bn_0(buf, a_d + BN_NIST_192_TOP, top - BN_NIST_192_TOP, BN_NIST_192_TOP); | 388 | nist_cp_bn_0(buf, a_d + BN_NIST_192_TOP, top - BN_NIST_192_TOP, BN_NIST_192_TOP); |
| 225 | 389 | ||
| 226 | nist_set_192(t_d, buf, 0, 3, 3); | 390 | nist_set_192(t_d, buf, 0, 3, 3); |
| 227 | carry = bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP); | 391 | carry = (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP); |
| 228 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_192,BN_NIST_192_TOP); | ||
| 229 | mask = ~mask | (0-(size_t)carry); | ||
| 230 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 231 | |||
| 232 | nist_set_192(t_d, buf, 4, 4, 0); | 392 | nist_set_192(t_d, buf, 4, 4, 0); |
| 233 | carry = bn_add_words(r_d, res, t_d, BN_NIST_192_TOP); | 393 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP); |
| 234 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_192,BN_NIST_192_TOP); | ||
| 235 | mask = ~mask | (0-(size_t)carry); | ||
| 236 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 237 | |||
| 238 | nist_set_192(t_d, buf, 5, 5, 5) | 394 | nist_set_192(t_d, buf, 5, 5, 5) |
| 239 | carry = bn_add_words(r_d, res, t_d, BN_NIST_192_TOP); | 395 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP); |
| 240 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_192,BN_NIST_192_TOP); | ||
| 241 | mask = ~mask | (0-(size_t)carry); | ||
| 242 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 243 | 396 | ||
| 397 | if (carry > 0) | ||
| 398 | carry = (int)bn_sub_words(r_d,r_d,_nist_p_192[carry-1],BN_NIST_192_TOP); | ||
| 399 | else | ||
| 400 | carry = 1; | ||
| 401 | |||
| 402 | /* | ||
| 403 | * we need 'if (carry==0 || result>=modulus) result-=modulus;' | ||
| 404 | * as comparison implies subtraction, we can write | ||
| 405 | * 'tmp=result-modulus; if (!carry || !borrow) result=tmp;' | ||
| 406 | * this is what happens below, but without explicit if:-) a. | ||
| 407 | */ | ||
| 408 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_192[0],BN_NIST_192_TOP); | ||
| 409 | mask &= 0-(size_t)carry; | ||
| 410 | res = (BN_ULONG *)(((size_t)c_d&~mask) | ((size_t)r_d&mask)); | ||
| 244 | nist_cp_bn(r_d, res, BN_NIST_192_TOP); | 411 | nist_cp_bn(r_d, res, BN_NIST_192_TOP); |
| 245 | r->top = BN_NIST_192_TOP; | 412 | r->top = BN_NIST_192_TOP; |
| 246 | bn_correct_top(r); | 413 | bn_correct_top(r); |
| @@ -248,21 +415,22 @@ int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 248 | return 1; | 415 | return 1; |
| 249 | } | 416 | } |
| 250 | 417 | ||
| 418 | typedef BN_ULONG (*bn_addsub_f)(BN_ULONG *,const BN_ULONG *,const BN_ULONG *,int); | ||
| 419 | |||
| 251 | #define nist_set_224(to, from, a1, a2, a3, a4, a5, a6, a7) \ | 420 | #define nist_set_224(to, from, a1, a2, a3, a4, a5, a6, a7) \ |
| 252 | { \ | 421 | { \ |
| 253 | if (a7 != 0) bn_cp_32(to, 0, from, (a7) - 7) else bn_32_set_0(to, 0)\ | 422 | bn_cp_32(to, 0, from, (a7) - 7) \ |
| 254 | if (a6 != 0) bn_cp_32(to, 1, from, (a6) - 7) else bn_32_set_0(to, 1)\ | 423 | bn_cp_32(to, 1, from, (a6) - 7) \ |
| 255 | if (a5 != 0) bn_cp_32(to, 2, from, (a5) - 7) else bn_32_set_0(to, 2)\ | 424 | bn_cp_32(to, 2, from, (a5) - 7) \ |
| 256 | if (a4 != 0) bn_cp_32(to, 3, from, (a4) - 7) else bn_32_set_0(to, 3)\ | 425 | bn_cp_32(to, 3, from, (a4) - 7) \ |
| 257 | if (a3 != 0) bn_cp_32(to, 4, from, (a3) - 7) else bn_32_set_0(to, 4)\ | 426 | bn_cp_32(to, 4, from, (a3) - 7) \ |
| 258 | if (a2 != 0) bn_cp_32(to, 5, from, (a2) - 7) else bn_32_set_0(to, 5)\ | 427 | bn_cp_32(to, 5, from, (a2) - 7) \ |
| 259 | if (a1 != 0) bn_cp_32(to, 6, from, (a1) - 7) else bn_32_set_0(to, 6)\ | 428 | bn_cp_32(to, 6, from, (a1) - 7) \ |
| 260 | } | 429 | } |
| 261 | 430 | ||
| 262 | int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | 431 | int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, |
| 263 | BN_CTX *ctx) | 432 | BN_CTX *ctx) |
| 264 | { | 433 | { |
| 265 | #if BN_BITS2 == 32 | ||
| 266 | int top = a->top, i; | 434 | int top = a->top, i; |
| 267 | int carry; | 435 | int carry; |
| 268 | BN_ULONG *r_d, *a_d = a->d; | 436 | BN_ULONG *r_d, *a_d = a->d; |
| @@ -271,6 +439,18 @@ int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 271 | c_d[BN_NIST_224_TOP], | 439 | c_d[BN_NIST_224_TOP], |
| 272 | *res; | 440 | *res; |
| 273 | size_t mask; | 441 | size_t mask; |
| 442 | union { bn_addsub_f f; size_t p; } u; | ||
| 443 | static const BIGNUM _bignum_nist_p_224_sqr = { | ||
| 444 | (BN_ULONG *)_nist_p_224_sqr, | ||
| 445 | sizeof(_nist_p_224_sqr)/sizeof(_nist_p_224_sqr[0]), | ||
| 446 | sizeof(_nist_p_224_sqr)/sizeof(_nist_p_224_sqr[0]), | ||
| 447 | 0,BN_FLG_STATIC_DATA }; | ||
| 448 | |||
| 449 | |||
| 450 | field = &_bignum_nist_p_224; /* just to make sure */ | ||
| 451 | |||
| 452 | if (BN_is_negative(a) || BN_ucmp(a,&_bignum_nist_p_224_sqr)>=0) | ||
| 453 | return BN_nnmod(r, a, field, ctx); | ||
| 274 | 454 | ||
| 275 | i = BN_ucmp(field, a); | 455 | i = BN_ucmp(field, a); |
| 276 | if (i == 0) | 456 | if (i == 0) |
| @@ -281,9 +461,6 @@ int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 281 | else if (i > 0) | 461 | else if (i > 0) |
| 282 | return (r == a)? 1 : (BN_copy(r ,a) != NULL); | 462 | return (r == a)? 1 : (BN_copy(r ,a) != NULL); |
| 283 | 463 | ||
| 284 | if (top == BN_NIST_224_TOP) | ||
| 285 | return BN_usub(r, a, field); | ||
| 286 | |||
| 287 | if (r != a) | 464 | if (r != a) |
| 288 | { | 465 | { |
| 289 | if (!bn_wexpand(r, BN_NIST_224_TOP)) | 466 | if (!bn_wexpand(r, BN_NIST_224_TOP)) |
| @@ -294,67 +471,77 @@ int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 294 | else | 471 | else |
| 295 | r_d = a_d; | 472 | r_d = a_d; |
| 296 | 473 | ||
| 474 | #if BN_BITS2==64 | ||
| 475 | /* copy upper 256 bits of 448 bit number ... */ | ||
| 476 | nist_cp_bn_0(t_d, a_d + (BN_NIST_224_TOP-1), top - (BN_NIST_224_TOP-1), BN_NIST_224_TOP); | ||
| 477 | /* ... and right shift by 32 to obtain upper 224 bits */ | ||
| 478 | nist_set_224(buf, t_d, 14, 13, 12, 11, 10, 9, 8); | ||
| 479 | /* truncate lower part to 224 bits too */ | ||
| 480 | r_d[BN_NIST_224_TOP-1] &= BN_MASK2l; | ||
| 481 | #else | ||
| 297 | nist_cp_bn_0(buf, a_d + BN_NIST_224_TOP, top - BN_NIST_224_TOP, BN_NIST_224_TOP); | 482 | nist_cp_bn_0(buf, a_d + BN_NIST_224_TOP, top - BN_NIST_224_TOP, BN_NIST_224_TOP); |
| 298 | 483 | #endif | |
| 299 | nist_set_224(t_d, buf, 10, 9, 8, 7, 0, 0, 0); | 484 | nist_set_224(t_d, buf, 10, 9, 8, 7, 0, 0, 0); |
| 300 | carry = bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP); | 485 | carry = (int)bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP); |
| 301 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_224,BN_NIST_224_TOP); | ||
| 302 | mask = ~mask | (0-(size_t)carry); | ||
| 303 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 304 | |||
| 305 | nist_set_224(t_d, buf, 0, 13, 12, 11, 0, 0, 0); | 486 | nist_set_224(t_d, buf, 0, 13, 12, 11, 0, 0, 0); |
| 306 | carry = bn_add_words(r_d, res, t_d, BN_NIST_224_TOP); | 487 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP); |
| 307 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_224,BN_NIST_224_TOP); | ||
| 308 | mask = ~mask | (0-(size_t)carry); | ||
| 309 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 310 | |||
| 311 | nist_set_224(t_d, buf, 13, 12, 11, 10, 9, 8, 7); | 488 | nist_set_224(t_d, buf, 13, 12, 11, 10, 9, 8, 7); |
| 312 | #if BRANCH_FREE | 489 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP); |
| 313 | carry = bn_sub_words(r_d, res, t_d, BN_NIST_224_TOP); | ||
| 314 | bn_add_words(c_d,r_d,_nist_p_224,BN_NIST_224_TOP); | ||
| 315 | mask = 0-(size_t)carry; | ||
| 316 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 317 | #else | ||
| 318 | if (bn_sub_words(r_d, res, t_d, BN_NIST_224_TOP)) | ||
| 319 | bn_add_words(r_d,r_d,_nist_p_224,BN_NIST_224_TOP); | ||
| 320 | #endif | ||
| 321 | nist_set_224(t_d, buf, 0, 0, 0, 0, 13, 12, 11); | 490 | nist_set_224(t_d, buf, 0, 0, 0, 0, 13, 12, 11); |
| 322 | #if BRANCH_FREE | 491 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP); |
| 323 | carry = bn_sub_words(r_d, res, t_d, BN_NIST_224_TOP); | ||
| 324 | bn_add_words(c_d,r_d,_nist_p_224,BN_NIST_224_TOP); | ||
| 325 | mask = 0-(size_t)carry; | ||
| 326 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 327 | 492 | ||
| 328 | nist_cp_bn(r_d, res, BN_NIST_224_TOP); | 493 | #if BN_BITS2==64 |
| 329 | #else | 494 | carry = (int)(r_d[BN_NIST_224_TOP-1]>>32); |
| 330 | if (bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP)) | 495 | #endif |
| 331 | bn_add_words(r_d,r_d,_nist_p_224,BN_NIST_224_TOP); | 496 | u.f = bn_sub_words; |
| 497 | if (carry > 0) | ||
| 498 | { | ||
| 499 | carry = (int)bn_sub_words(r_d,r_d,_nist_p_224[carry-1],BN_NIST_224_TOP); | ||
| 500 | #if BN_BITS2==64 | ||
| 501 | carry=(int)(~(r_d[BN_NIST_224_TOP-1]>>32))&1; | ||
| 332 | #endif | 502 | #endif |
| 503 | } | ||
| 504 | else if (carry < 0) | ||
| 505 | { | ||
| 506 | /* it's a bit more comlicated logic in this case. | ||
| 507 | * if bn_add_words yields no carry, then result | ||
| 508 | * has to be adjusted by unconditionally *adding* | ||
| 509 | * the modulus. but if it does, then result has | ||
| 510 | * to be compared to the modulus and conditionally | ||
| 511 | * adjusted by *subtracting* the latter. */ | ||
| 512 | carry = (int)bn_add_words(r_d,r_d,_nist_p_224[-carry-1],BN_NIST_224_TOP); | ||
| 513 | mask = 0-(size_t)carry; | ||
| 514 | u.p = ((size_t)bn_sub_words&mask) | ((size_t)bn_add_words&~mask); | ||
| 515 | } | ||
| 516 | else | ||
| 517 | carry = 1; | ||
| 518 | |||
| 519 | /* otherwise it's effectively same as in BN_nist_mod_192... */ | ||
| 520 | mask = 0-(size_t)(*u.f)(c_d,r_d,_nist_p_224[0],BN_NIST_224_TOP); | ||
| 521 | mask &= 0-(size_t)carry; | ||
| 522 | res = (BN_ULONG *)(((size_t)c_d&~mask) | ((size_t)r_d&mask)); | ||
| 523 | nist_cp_bn(r_d, res, BN_NIST_224_TOP); | ||
| 333 | r->top = BN_NIST_224_TOP; | 524 | r->top = BN_NIST_224_TOP; |
| 334 | bn_correct_top(r); | 525 | bn_correct_top(r); |
| 335 | 526 | ||
| 336 | return 1; | 527 | return 1; |
| 337 | #else /* BN_BITS!=32 */ | ||
| 338 | return 0; | ||
| 339 | #endif | ||
| 340 | } | 528 | } |
| 341 | 529 | ||
| 342 | #define nist_set_256(to, from, a1, a2, a3, a4, a5, a6, a7, a8) \ | 530 | #define nist_set_256(to, from, a1, a2, a3, a4, a5, a6, a7, a8) \ |
| 343 | { \ | 531 | { \ |
| 344 | if (a8 != 0) bn_cp_32(to, 0, from, (a8) - 8) else bn_32_set_0(to, 0)\ | 532 | bn_cp_32(to, 0, from, (a8) - 8) \ |
| 345 | if (a7 != 0) bn_cp_32(to, 1, from, (a7) - 8) else bn_32_set_0(to, 1)\ | 533 | bn_cp_32(to, 1, from, (a7) - 8) \ |
| 346 | if (a6 != 0) bn_cp_32(to, 2, from, (a6) - 8) else bn_32_set_0(to, 2)\ | 534 | bn_cp_32(to, 2, from, (a6) - 8) \ |
| 347 | if (a5 != 0) bn_cp_32(to, 3, from, (a5) - 8) else bn_32_set_0(to, 3)\ | 535 | bn_cp_32(to, 3, from, (a5) - 8) \ |
| 348 | if (a4 != 0) bn_cp_32(to, 4, from, (a4) - 8) else bn_32_set_0(to, 4)\ | 536 | bn_cp_32(to, 4, from, (a4) - 8) \ |
| 349 | if (a3 != 0) bn_cp_32(to, 5, from, (a3) - 8) else bn_32_set_0(to, 5)\ | 537 | bn_cp_32(to, 5, from, (a3) - 8) \ |
| 350 | if (a2 != 0) bn_cp_32(to, 6, from, (a2) - 8) else bn_32_set_0(to, 6)\ | 538 | bn_cp_32(to, 6, from, (a2) - 8) \ |
| 351 | if (a1 != 0) bn_cp_32(to, 7, from, (a1) - 8) else bn_32_set_0(to, 7)\ | 539 | bn_cp_32(to, 7, from, (a1) - 8) \ |
| 352 | } | 540 | } |
| 353 | 541 | ||
| 354 | int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | 542 | int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, |
| 355 | BN_CTX *ctx) | 543 | BN_CTX *ctx) |
| 356 | { | 544 | { |
| 357 | #if BN_BITS2 == 32 | ||
| 358 | int i, top = a->top; | 545 | int i, top = a->top; |
| 359 | int carry = 0; | 546 | int carry = 0; |
| 360 | register BN_ULONG *a_d = a->d, *r_d; | 547 | register BN_ULONG *a_d = a->d, *r_d; |
| @@ -363,6 +550,17 @@ int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 363 | c_d[BN_NIST_256_TOP], | 550 | c_d[BN_NIST_256_TOP], |
| 364 | *res; | 551 | *res; |
| 365 | size_t mask; | 552 | size_t mask; |
| 553 | union { bn_addsub_f f; size_t p; } u; | ||
| 554 | static const BIGNUM _bignum_nist_p_256_sqr = { | ||
| 555 | (BN_ULONG *)_nist_p_256_sqr, | ||
| 556 | sizeof(_nist_p_256_sqr)/sizeof(_nist_p_256_sqr[0]), | ||
| 557 | sizeof(_nist_p_256_sqr)/sizeof(_nist_p_256_sqr[0]), | ||
| 558 | 0,BN_FLG_STATIC_DATA }; | ||
| 559 | |||
| 560 | field = &_bignum_nist_p_256; /* just to make sure */ | ||
| 561 | |||
| 562 | if (BN_is_negative(a) || BN_ucmp(a,&_bignum_nist_p_256_sqr)>=0) | ||
| 563 | return BN_nnmod(r, a, field, ctx); | ||
| 366 | 564 | ||
| 367 | i = BN_ucmp(field, a); | 565 | i = BN_ucmp(field, a); |
| 368 | if (i == 0) | 566 | if (i == 0) |
| @@ -373,9 +571,6 @@ int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 373 | else if (i > 0) | 571 | else if (i > 0) |
| 374 | return (r == a)? 1 : (BN_copy(r ,a) != NULL); | 572 | return (r == a)? 1 : (BN_copy(r ,a) != NULL); |
| 375 | 573 | ||
| 376 | if (top == BN_NIST_256_TOP) | ||
| 377 | return BN_usub(r, a, field); | ||
| 378 | |||
| 379 | if (r != a) | 574 | if (r != a) |
| 380 | { | 575 | { |
| 381 | if (!bn_wexpand(r, BN_NIST_256_TOP)) | 576 | if (!bn_wexpand(r, BN_NIST_256_TOP)) |
| @@ -391,111 +586,84 @@ int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 391 | /*S1*/ | 586 | /*S1*/ |
| 392 | nist_set_256(t_d, buf, 15, 14, 13, 12, 11, 0, 0, 0); | 587 | nist_set_256(t_d, buf, 15, 14, 13, 12, 11, 0, 0, 0); |
| 393 | /*S2*/ | 588 | /*S2*/ |
| 394 | nist_set_256(c_d,buf, 0, 15, 14, 13, 12, 0, 0, 0); | 589 | nist_set_256(c_d, buf, 0, 15, 14, 13, 12, 0, 0, 0); |
| 395 | carry = bn_add_words(t_d, t_d, c_d, BN_NIST_256_TOP); | 590 | carry = (int)bn_add_words(t_d, t_d, c_d, BN_NIST_256_TOP); |
| 396 | mask = 0-(size_t)bn_sub_words(c_d,t_d,_nist_p_256,BN_NIST_256_TOP); | 591 | /* left shift */ |
| 397 | mask = ~mask | (0-(size_t)carry); | 592 | { |
| 398 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)t_d&~mask)); | 593 | register BN_ULONG *ap,t,c; |
| 399 | 594 | ap = t_d; | |
| 400 | carry = bn_add_words(t_d, res, res, BN_NIST_256_TOP); | 595 | c=0; |
| 401 | mask = 0-(size_t)bn_sub_words(c_d,t_d,_nist_p_256,BN_NIST_256_TOP); | 596 | for (i = BN_NIST_256_TOP; i != 0; --i) |
| 402 | mask = ~mask | (0-(size_t)carry); | 597 | { |
| 403 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)t_d&~mask)); | 598 | t= *ap; |
| 404 | 599 | *(ap++)=((t<<1)|c)&BN_MASK2; | |
| 405 | carry = bn_add_words(r_d, r_d, res, BN_NIST_256_TOP); | 600 | c=(t & BN_TBIT)?1:0; |
| 406 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_256,BN_NIST_256_TOP); | 601 | } |
| 407 | mask = ~mask | (0-(size_t)carry); | 602 | carry <<= 1; |
| 408 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | 603 | carry |= c; |
| 409 | 604 | } | |
| 605 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP); | ||
| 410 | /*S3*/ | 606 | /*S3*/ |
| 411 | nist_set_256(t_d, buf, 15, 14, 0, 0, 0, 10, 9, 8); | 607 | nist_set_256(t_d, buf, 15, 14, 0, 0, 0, 10, 9, 8); |
| 412 | carry = bn_add_words(r_d, res, t_d, BN_NIST_256_TOP); | 608 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 413 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_256,BN_NIST_256_TOP); | ||
| 414 | mask = ~mask | (0-(size_t)carry); | ||
| 415 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 416 | |||
| 417 | /*S4*/ | 609 | /*S4*/ |
| 418 | nist_set_256(t_d, buf, 8, 13, 15, 14, 13, 11, 10, 9); | 610 | nist_set_256(t_d, buf, 8, 13, 15, 14, 13, 11, 10, 9); |
| 419 | carry = bn_add_words(r_d, res, t_d, BN_NIST_256_TOP); | 611 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 420 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_256,BN_NIST_256_TOP); | ||
| 421 | mask = ~mask | (0-(size_t)carry); | ||
| 422 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 423 | |||
| 424 | /*D1*/ | 612 | /*D1*/ |
| 425 | nist_set_256(t_d, buf, 10, 8, 0, 0, 0, 13, 12, 11); | 613 | nist_set_256(t_d, buf, 10, 8, 0, 0, 0, 13, 12, 11); |
| 426 | #if BRANCH_FREE | 614 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 427 | carry = bn_sub_words(r_d, res, t_d, BN_NIST_256_TOP); | ||
| 428 | bn_add_words(c_d,r_d,_nist_p_256,BN_NIST_256_TOP); | ||
| 429 | mask = 0-(size_t)carry; | ||
| 430 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 431 | #else | ||
| 432 | if (bn_sub_words(r_d, res, t_d, BN_NIST_256_TOP)) | ||
| 433 | bn_add_words(r_d,r_d,_nist_p_256,BN_NIST_256_TOP); | ||
| 434 | #endif | ||
| 435 | /*D2*/ | 615 | /*D2*/ |
| 436 | nist_set_256(t_d, buf, 11, 9, 0, 0, 15, 14, 13, 12); | 616 | nist_set_256(t_d, buf, 11, 9, 0, 0, 15, 14, 13, 12); |
| 437 | #if BRANCH_FREE | 617 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 438 | carry = bn_sub_words(r_d, res, t_d, BN_NIST_256_TOP); | ||
| 439 | bn_add_words(c_d,r_d,_nist_p_256,BN_NIST_256_TOP); | ||
| 440 | mask = 0-(size_t)carry; | ||
| 441 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 442 | #else | ||
| 443 | if (bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP)) | ||
| 444 | bn_add_words(r_d,r_d,_nist_p_256,BN_NIST_256_TOP); | ||
| 445 | #endif | ||
| 446 | /*D3*/ | 618 | /*D3*/ |
| 447 | nist_set_256(t_d, buf, 12, 0, 10, 9, 8, 15, 14, 13); | 619 | nist_set_256(t_d, buf, 12, 0, 10, 9, 8, 15, 14, 13); |
| 448 | #if BRANCH_FREE | 620 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 449 | carry = bn_sub_words(r_d, res, t_d, BN_NIST_256_TOP); | ||
| 450 | bn_add_words(c_d,r_d,_nist_p_256,BN_NIST_256_TOP); | ||
| 451 | mask = 0-(size_t)carry; | ||
| 452 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 453 | #else | ||
| 454 | if (bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP)) | ||
| 455 | bn_add_words(r_d,r_d,_nist_p_256,BN_NIST_256_TOP); | ||
| 456 | #endif | ||
| 457 | /*D4*/ | 621 | /*D4*/ |
| 458 | nist_set_256(t_d, buf, 13, 0, 11, 10, 9, 0, 15, 14); | 622 | nist_set_256(t_d, buf, 13, 0, 11, 10, 9, 0, 15, 14); |
| 459 | #if BRANCH_FREE | 623 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 460 | carry = bn_sub_words(r_d, res, t_d, BN_NIST_256_TOP); | ||
| 461 | bn_add_words(c_d,r_d,_nist_p_256,BN_NIST_256_TOP); | ||
| 462 | mask = 0-(size_t)carry; | ||
| 463 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 464 | 624 | ||
| 465 | nist_cp_bn(r_d, res, BN_NIST_384_TOP); | 625 | /* see BN_nist_mod_224 for explanation */ |
| 466 | #else | 626 | u.f = bn_sub_words; |
| 467 | if (bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP)) | 627 | if (carry > 0) |
| 468 | bn_add_words(r_d,r_d,_nist_p_256,BN_NIST_256_TOP); | 628 | carry = (int)bn_sub_words(r_d,r_d,_nist_p_256[carry-1],BN_NIST_256_TOP); |
| 469 | #endif | 629 | else if (carry < 0) |
| 630 | { | ||
| 631 | carry = (int)bn_add_words(r_d,r_d,_nist_p_256[-carry-1],BN_NIST_256_TOP); | ||
| 632 | mask = 0-(size_t)carry; | ||
| 633 | u.p = ((size_t)bn_sub_words&mask) | ((size_t)bn_add_words&~mask); | ||
| 634 | } | ||
| 635 | else | ||
| 636 | carry = 1; | ||
| 637 | |||
| 638 | mask = 0-(size_t)(*u.f)(c_d,r_d,_nist_p_256[0],BN_NIST_256_TOP); | ||
| 639 | mask &= 0-(size_t)carry; | ||
| 640 | res = (BN_ULONG *)(((size_t)c_d&~mask) | ((size_t)r_d&mask)); | ||
| 641 | nist_cp_bn(r_d, res, BN_NIST_256_TOP); | ||
| 470 | r->top = BN_NIST_256_TOP; | 642 | r->top = BN_NIST_256_TOP; |
| 471 | bn_correct_top(r); | 643 | bn_correct_top(r); |
| 472 | 644 | ||
| 473 | return 1; | 645 | return 1; |
| 474 | #else /* BN_BITS!=32 */ | ||
| 475 | return 0; | ||
| 476 | #endif | ||
| 477 | } | 646 | } |
| 478 | 647 | ||
| 479 | #define nist_set_384(to,from,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) \ | 648 | #define nist_set_384(to,from,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) \ |
| 480 | { \ | 649 | { \ |
| 481 | if (a12 != 0) bn_cp_32(to, 0, from, (a12) - 12) else bn_32_set_0(to, 0)\ | 650 | bn_cp_32(to, 0, from, (a12) - 12) \ |
| 482 | if (a11 != 0) bn_cp_32(to, 1, from, (a11) - 12) else bn_32_set_0(to, 1)\ | 651 | bn_cp_32(to, 1, from, (a11) - 12) \ |
| 483 | if (a10 != 0) bn_cp_32(to, 2, from, (a10) - 12) else bn_32_set_0(to, 2)\ | 652 | bn_cp_32(to, 2, from, (a10) - 12) \ |
| 484 | if (a9 != 0) bn_cp_32(to, 3, from, (a9) - 12) else bn_32_set_0(to, 3)\ | 653 | bn_cp_32(to, 3, from, (a9) - 12) \ |
| 485 | if (a8 != 0) bn_cp_32(to, 4, from, (a8) - 12) else bn_32_set_0(to, 4)\ | 654 | bn_cp_32(to, 4, from, (a8) - 12) \ |
| 486 | if (a7 != 0) bn_cp_32(to, 5, from, (a7) - 12) else bn_32_set_0(to, 5)\ | 655 | bn_cp_32(to, 5, from, (a7) - 12) \ |
| 487 | if (a6 != 0) bn_cp_32(to, 6, from, (a6) - 12) else bn_32_set_0(to, 6)\ | 656 | bn_cp_32(to, 6, from, (a6) - 12) \ |
| 488 | if (a5 != 0) bn_cp_32(to, 7, from, (a5) - 12) else bn_32_set_0(to, 7)\ | 657 | bn_cp_32(to, 7, from, (a5) - 12) \ |
| 489 | if (a4 != 0) bn_cp_32(to, 8, from, (a4) - 12) else bn_32_set_0(to, 8)\ | 658 | bn_cp_32(to, 8, from, (a4) - 12) \ |
| 490 | if (a3 != 0) bn_cp_32(to, 9, from, (a3) - 12) else bn_32_set_0(to, 9)\ | 659 | bn_cp_32(to, 9, from, (a3) - 12) \ |
| 491 | if (a2 != 0) bn_cp_32(to, 10, from, (a2) - 12) else bn_32_set_0(to, 10)\ | 660 | bn_cp_32(to, 10, from, (a2) - 12) \ |
| 492 | if (a1 != 0) bn_cp_32(to, 11, from, (a1) - 12) else bn_32_set_0(to, 11)\ | 661 | bn_cp_32(to, 11, from, (a1) - 12) \ |
| 493 | } | 662 | } |
| 494 | 663 | ||
| 495 | int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | 664 | int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, |
| 496 | BN_CTX *ctx) | 665 | BN_CTX *ctx) |
| 497 | { | 666 | { |
| 498 | #if BN_BITS2 == 32 | ||
| 499 | int i, top = a->top; | 667 | int i, top = a->top; |
| 500 | int carry = 0; | 668 | int carry = 0; |
| 501 | register BN_ULONG *r_d, *a_d = a->d; | 669 | register BN_ULONG *r_d, *a_d = a->d; |
| @@ -504,6 +672,18 @@ int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 504 | c_d[BN_NIST_384_TOP], | 672 | c_d[BN_NIST_384_TOP], |
| 505 | *res; | 673 | *res; |
| 506 | size_t mask; | 674 | size_t mask; |
| 675 | union { bn_addsub_f f; size_t p; } u; | ||
| 676 | static const BIGNUM _bignum_nist_p_384_sqr = { | ||
| 677 | (BN_ULONG *)_nist_p_384_sqr, | ||
| 678 | sizeof(_nist_p_384_sqr)/sizeof(_nist_p_384_sqr[0]), | ||
| 679 | sizeof(_nist_p_384_sqr)/sizeof(_nist_p_384_sqr[0]), | ||
| 680 | 0,BN_FLG_STATIC_DATA }; | ||
| 681 | |||
| 682 | |||
| 683 | field = &_bignum_nist_p_384; /* just to make sure */ | ||
| 684 | |||
| 685 | if (BN_is_negative(a) || BN_ucmp(a,&_bignum_nist_p_384_sqr)>=0) | ||
| 686 | return BN_nnmod(r, a, field, ctx); | ||
| 507 | 687 | ||
| 508 | i = BN_ucmp(field, a); | 688 | i = BN_ucmp(field, a); |
| 509 | if (i == 0) | 689 | if (i == 0) |
| @@ -514,9 +694,6 @@ int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 514 | else if (i > 0) | 694 | else if (i > 0) |
| 515 | return (r == a)? 1 : (BN_copy(r ,a) != NULL); | 695 | return (r == a)? 1 : (BN_copy(r ,a) != NULL); |
| 516 | 696 | ||
| 517 | if (top == BN_NIST_384_TOP) | ||
| 518 | return BN_usub(r, a, field); | ||
| 519 | |||
| 520 | if (r != a) | 697 | if (r != a) |
| 521 | { | 698 | { |
| 522 | if (!bn_wexpand(r, BN_NIST_384_TOP)) | 699 | if (!bn_wexpand(r, BN_NIST_384_TOP)) |
| @@ -544,149 +721,116 @@ int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | |||
| 544 | } | 721 | } |
| 545 | *ap=c; | 722 | *ap=c; |
| 546 | } | 723 | } |
| 547 | carry = bn_add_words(r_d+(128/BN_BITS2), r_d+(128/BN_BITS2), | 724 | carry = (int)bn_add_words(r_d+(128/BN_BITS2), r_d+(128/BN_BITS2), |
| 548 | t_d, BN_NIST_256_TOP); | 725 | t_d, BN_NIST_256_TOP); |
| 549 | /* | ||
| 550 | * we need if (result>=modulus) subtract(result,modulus); | ||
| 551 | * in n-bit space this can be expressed as | ||
| 552 | * if (carry || result>=modulus) subtract(result,modulus); | ||
| 553 | * the catch is that comparison implies subtraction and | ||
| 554 | * therefore one can write tmp=subtract(result,modulus); | ||
| 555 | * and then if(carry || !borrow) result=tmp; this's what | ||
| 556 | * happens below, but without explicit if:-) a. | ||
| 557 | */ | ||
| 558 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 559 | mask = ~mask | (0-(size_t)carry); | ||
| 560 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 561 | |||
| 562 | /*S2 */ | 726 | /*S2 */ |
| 563 | carry = bn_add_words(r_d, res, buf, BN_NIST_384_TOP); | 727 | carry += (int)bn_add_words(r_d, r_d, buf, BN_NIST_384_TOP); |
| 564 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 565 | mask = ~mask | (0-(size_t)carry); | ||
| 566 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 567 | |||
| 568 | /*S3*/ | 728 | /*S3*/ |
| 569 | nist_set_384(t_d,buf,20,19,18,17,16,15,14,13,12,23,22,21); | 729 | nist_set_384(t_d,buf,20,19,18,17,16,15,14,13,12,23,22,21); |
| 570 | carry = bn_add_words(r_d, res, t_d, BN_NIST_384_TOP); | 730 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 571 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 572 | mask = ~mask | (0-(size_t)carry); | ||
| 573 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 574 | |||
| 575 | /*S4*/ | 731 | /*S4*/ |
| 576 | nist_set_384(t_d,buf,19,18,17,16,15,14,13,12,20,0,23,0); | 732 | nist_set_384(t_d,buf,19,18,17,16,15,14,13,12,20,0,23,0); |
| 577 | carry = bn_add_words(r_d, res, t_d, BN_NIST_384_TOP); | 733 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 578 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 579 | mask = ~mask | (0-(size_t)carry); | ||
| 580 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 581 | |||
| 582 | /*S5*/ | 734 | /*S5*/ |
| 583 | nist_set_384(t_d, buf,0,0,0,0,23,22,21,20,0,0,0,0); | 735 | nist_set_384(t_d, buf,0,0,0,0,23,22,21,20,0,0,0,0); |
| 584 | carry = bn_add_words(r_d, res, t_d, BN_NIST_384_TOP); | 736 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 585 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 586 | mask = ~mask | (0-(size_t)carry); | ||
| 587 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 588 | |||
| 589 | /*S6*/ | 737 | /*S6*/ |
| 590 | nist_set_384(t_d,buf,0,0,0,0,0,0,23,22,21,0,0,20); | 738 | nist_set_384(t_d,buf,0,0,0,0,0,0,23,22,21,0,0,20); |
| 591 | carry = bn_add_words(r_d, res, t_d, BN_NIST_384_TOP); | 739 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 592 | mask = 0-(size_t)bn_sub_words(c_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 593 | mask = ~mask | (0-(size_t)carry); | ||
| 594 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 595 | |||
| 596 | /*D1*/ | 740 | /*D1*/ |
| 597 | nist_set_384(t_d,buf,22,21,20,19,18,17,16,15,14,13,12,23); | 741 | nist_set_384(t_d,buf,22,21,20,19,18,17,16,15,14,13,12,23); |
| 598 | #if BRANCH_FREE | 742 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 599 | carry = bn_sub_words(r_d, res, t_d, BN_NIST_384_TOP); | ||
| 600 | bn_add_words(c_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 601 | mask = 0-(size_t)carry; | ||
| 602 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 603 | #else | ||
| 604 | if (bn_sub_words(r_d, res, t_d, BN_NIST_384_TOP)) | ||
| 605 | bn_add_words(r_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 606 | #endif | ||
| 607 | /*D2*/ | 743 | /*D2*/ |
| 608 | nist_set_384(t_d,buf,0,0,0,0,0,0,0,23,22,21,20,0); | 744 | nist_set_384(t_d,buf,0,0,0,0,0,0,0,23,22,21,20,0); |
| 609 | #if BRANCH_FREE | 745 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 610 | carry = bn_sub_words(r_d, res, t_d, BN_NIST_384_TOP); | ||
| 611 | bn_add_words(c_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 612 | mask = 0-(size_t)carry; | ||
| 613 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | ||
| 614 | #else | ||
| 615 | if (bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP)) | ||
| 616 | bn_add_words(r_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 617 | #endif | ||
| 618 | /*D3*/ | 746 | /*D3*/ |
| 619 | nist_set_384(t_d,buf,0,0,0,0,0,0,0,23,23,0,0,0); | 747 | nist_set_384(t_d,buf,0,0,0,0,0,0,0,23,23,0,0,0); |
| 620 | #if BRANCH_FREE | 748 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 621 | carry = bn_sub_words(r_d, res, t_d, BN_NIST_384_TOP); | 749 | |
| 622 | bn_add_words(c_d,r_d,_nist_p_384,BN_NIST_384_TOP); | 750 | /* see BN_nist_mod_224 for explanation */ |
| 623 | mask = 0-(size_t)carry; | 751 | u.f = bn_sub_words; |
| 624 | res = (BN_ULONG *)(((size_t)c_d&mask) | ((size_t)r_d&~mask)); | 752 | if (carry > 0) |
| 753 | carry = (int)bn_sub_words(r_d,r_d,_nist_p_384[carry-1],BN_NIST_384_TOP); | ||
| 754 | else if (carry < 0) | ||
| 755 | { | ||
| 756 | carry = (int)bn_add_words(r_d,r_d,_nist_p_384[-carry-1],BN_NIST_384_TOP); | ||
| 757 | mask = 0-(size_t)carry; | ||
| 758 | u.p = ((size_t)bn_sub_words&mask) | ((size_t)bn_add_words&~mask); | ||
| 759 | } | ||
| 760 | else | ||
| 761 | carry = 1; | ||
| 625 | 762 | ||
| 763 | mask = 0-(size_t)(*u.f)(c_d,r_d,_nist_p_384[0],BN_NIST_384_TOP); | ||
| 764 | mask &= 0-(size_t)carry; | ||
| 765 | res = (BN_ULONG *)(((size_t)c_d&~mask) | ((size_t)r_d&mask)); | ||
| 626 | nist_cp_bn(r_d, res, BN_NIST_384_TOP); | 766 | nist_cp_bn(r_d, res, BN_NIST_384_TOP); |
| 627 | #else | ||
| 628 | if (bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP)) | ||
| 629 | bn_add_words(r_d,r_d,_nist_p_384,BN_NIST_384_TOP); | ||
| 630 | #endif | ||
| 631 | r->top = BN_NIST_384_TOP; | 767 | r->top = BN_NIST_384_TOP; |
| 632 | bn_correct_top(r); | 768 | bn_correct_top(r); |
| 633 | 769 | ||
| 634 | return 1; | 770 | return 1; |
| 635 | #else /* BN_BITS!=32 */ | ||
| 636 | return 0; | ||
| 637 | #endif | ||
| 638 | } | 771 | } |
| 639 | 772 | ||
| 773 | #define BN_NIST_521_RSHIFT (521%BN_BITS2) | ||
| 774 | #define BN_NIST_521_LSHIFT (BN_BITS2-BN_NIST_521_RSHIFT) | ||
| 775 | #define BN_NIST_521_TOP_MASK ((BN_ULONG)BN_MASK2>>BN_NIST_521_LSHIFT) | ||
| 776 | |||
| 640 | int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, | 777 | int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, |
| 641 | BN_CTX *ctx) | 778 | BN_CTX *ctx) |
| 642 | { | 779 | { |
| 643 | #if BN_BITS2 == 64 | 780 | int top = a->top, i; |
| 644 | #define BN_NIST_521_TOP_MASK (BN_ULONG)0x1FF | 781 | BN_ULONG *r_d, *a_d = a->d, |
| 645 | #elif BN_BITS2 == 32 | 782 | t_d[BN_NIST_521_TOP], |
| 646 | #define BN_NIST_521_TOP_MASK (BN_ULONG)0x1FF | 783 | val,tmp,*res; |
| 647 | #endif | 784 | size_t mask; |
| 648 | int top, ret = 0; | 785 | static const BIGNUM _bignum_nist_p_521_sqr = { |
| 649 | BN_ULONG *r_d; | 786 | (BN_ULONG *)_nist_p_521_sqr, |
| 650 | BIGNUM *tmp; | 787 | sizeof(_nist_p_521_sqr)/sizeof(_nist_p_521_sqr[0]), |
| 651 | 788 | sizeof(_nist_p_521_sqr)/sizeof(_nist_p_521_sqr[0]), | |
| 652 | /* check whether a reduction is necessary */ | 789 | 0,BN_FLG_STATIC_DATA }; |
| 653 | top = a->top; | ||
| 654 | if (top < BN_NIST_521_TOP || ( top == BN_NIST_521_TOP && | ||
| 655 | (!(a->d[BN_NIST_521_TOP-1] & ~(BN_NIST_521_TOP_MASK))))) | ||
| 656 | return (r == a)? 1 : (BN_copy(r ,a) != NULL); | ||
| 657 | 790 | ||
| 658 | BN_CTX_start(ctx); | 791 | field = &_bignum_nist_p_521; /* just to make sure */ |
| 659 | tmp = BN_CTX_get(ctx); | ||
| 660 | if (!tmp) | ||
| 661 | goto err; | ||
| 662 | 792 | ||
| 663 | if (!bn_wexpand(tmp, BN_NIST_521_TOP)) | 793 | if (BN_is_negative(a) || BN_ucmp(a,&_bignum_nist_p_521_sqr)>=0) |
| 664 | goto err; | 794 | return BN_nnmod(r, a, field, ctx); |
| 665 | nist_cp_bn(tmp->d, a->d, BN_NIST_521_TOP); | ||
| 666 | 795 | ||
| 667 | tmp->top = BN_NIST_521_TOP; | 796 | i = BN_ucmp(field, a); |
| 668 | tmp->d[BN_NIST_521_TOP-1] &= BN_NIST_521_TOP_MASK; | 797 | if (i == 0) |
| 669 | bn_correct_top(tmp); | 798 | { |
| 799 | BN_zero(r); | ||
| 800 | return 1; | ||
| 801 | } | ||
| 802 | else if (i > 0) | ||
| 803 | return (r == a)? 1 : (BN_copy(r ,a) != NULL); | ||
| 670 | 804 | ||
| 671 | if (!BN_rshift(r, a, 521)) | 805 | if (r != a) |
| 672 | goto err; | 806 | { |
| 807 | if (!bn_wexpand(r,BN_NIST_521_TOP)) | ||
| 808 | return 0; | ||
| 809 | r_d = r->d; | ||
| 810 | nist_cp_bn(r_d,a_d, BN_NIST_521_TOP); | ||
| 811 | } | ||
| 812 | else | ||
| 813 | r_d = a_d; | ||
| 673 | 814 | ||
| 674 | if (!BN_uadd(r, tmp, r)) | 815 | /* upper 521 bits, copy ... */ |
| 675 | goto err; | 816 | nist_cp_bn_0(t_d,a_d + (BN_NIST_521_TOP-1), top - (BN_NIST_521_TOP-1),BN_NIST_521_TOP); |
| 676 | top = r->top; | 817 | /* ... and right shift */ |
| 677 | r_d = r->d; | 818 | for (val=t_d[0],i=0; i<BN_NIST_521_TOP-1; i++) |
| 678 | if (top == BN_NIST_521_TOP && | ||
| 679 | (r_d[BN_NIST_521_TOP-1] & ~(BN_NIST_521_TOP_MASK))) | ||
| 680 | { | 819 | { |
| 681 | BN_NIST_ADD_ONE(r_d) | 820 | tmp = val>>BN_NIST_521_RSHIFT; |
| 682 | r->d[BN_NIST_521_TOP-1] &= BN_NIST_521_TOP_MASK; | 821 | val = t_d[i+1]; |
| 822 | t_d[i] = (tmp | val<<BN_NIST_521_LSHIFT) & BN_MASK2; | ||
| 683 | } | 823 | } |
| 824 | t_d[i] = val>>BN_NIST_521_RSHIFT; | ||
| 825 | /* lower 521 bits */ | ||
| 826 | r_d[i] &= BN_NIST_521_TOP_MASK; | ||
| 827 | |||
| 828 | bn_add_words(r_d,r_d,t_d,BN_NIST_521_TOP); | ||
| 829 | mask = 0-(size_t)bn_sub_words(t_d,r_d,_nist_p_521,BN_NIST_521_TOP); | ||
| 830 | res = (BN_ULONG *)(((size_t)t_d&~mask) | ((size_t)r_d&mask)); | ||
| 831 | nist_cp_bn(r_d,res,BN_NIST_521_TOP); | ||
| 832 | r->top = BN_NIST_521_TOP; | ||
| 684 | bn_correct_top(r); | 833 | bn_correct_top(r); |
| 685 | 834 | ||
| 686 | ret = 1; | 835 | return 1; |
| 687 | err: | ||
| 688 | BN_CTX_end(ctx); | ||
| 689 | |||
| 690 | bn_check_top(r); | ||
| 691 | return ret; | ||
| 692 | } | 836 | } |
diff --git a/src/lib/libcrypto/bn/bn_rand.c b/src/lib/libcrypto/bn/bn_rand.c index f51830b12b..b376c28ff3 100644 --- a/src/lib/libcrypto/bn/bn_rand.c +++ b/src/lib/libcrypto/bn/bn_rand.c | |||
| @@ -227,7 +227,7 @@ int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom) | |||
| 227 | 227 | ||
| 228 | 228 | ||
| 229 | /* random number r: 0 <= r < range */ | 229 | /* random number r: 0 <= r < range */ |
| 230 | static int bn_rand_range(int pseudo, BIGNUM *r, BIGNUM *range) | 230 | static int bn_rand_range(int pseudo, BIGNUM *r, const BIGNUM *range) |
| 231 | { | 231 | { |
| 232 | int (*bn_rand)(BIGNUM *, int, int, int) = pseudo ? BN_pseudo_rand : BN_rand; | 232 | int (*bn_rand)(BIGNUM *, int, int, int) = pseudo ? BN_pseudo_rand : BN_rand; |
| 233 | int n; | 233 | int n; |
| @@ -294,12 +294,12 @@ static int bn_rand_range(int pseudo, BIGNUM *r, BIGNUM *range) | |||
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | 296 | ||
| 297 | int BN_rand_range(BIGNUM *r, BIGNUM *range) | 297 | int BN_rand_range(BIGNUM *r, const BIGNUM *range) |
| 298 | { | 298 | { |
| 299 | return bn_rand_range(0, r, range); | 299 | return bn_rand_range(0, r, range); |
| 300 | } | 300 | } |
| 301 | 301 | ||
| 302 | int BN_pseudo_rand_range(BIGNUM *r, BIGNUM *range) | 302 | int BN_pseudo_rand_range(BIGNUM *r, const BIGNUM *range) |
| 303 | { | 303 | { |
| 304 | return bn_rand_range(1, r, range); | 304 | return bn_rand_range(1, r, range); |
| 305 | } | 305 | } |
diff --git a/src/lib/libcrypto/bn/bn_shift.c b/src/lib/libcrypto/bn/bn_shift.c index de9312dce2..c4d301afc4 100644 --- a/src/lib/libcrypto/bn/bn_shift.c +++ b/src/lib/libcrypto/bn/bn_shift.c | |||
| @@ -177,7 +177,7 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n) | |||
| 177 | nw=n/BN_BITS2; | 177 | nw=n/BN_BITS2; |
| 178 | rb=n%BN_BITS2; | 178 | rb=n%BN_BITS2; |
| 179 | lb=BN_BITS2-rb; | 179 | lb=BN_BITS2-rb; |
| 180 | if (nw > a->top || a->top == 0) | 180 | if (nw >= a->top || a->top == 0) |
| 181 | { | 181 | { |
| 182 | BN_zero(r); | 182 | BN_zero(r); |
| 183 | return(1); | 183 | return(1); |
diff --git a/src/lib/libcrypto/bn/bn_x931p.c b/src/lib/libcrypto/bn/bn_x931p.c index c64410dd3a..04c5c874ec 100644 --- a/src/lib/libcrypto/bn/bn_x931p.c +++ b/src/lib/libcrypto/bn/bn_x931p.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* bn_x931p.c */ | 1 | /* bn_x931p.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2005. | 3 | * project 2005. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -59,18 +59,15 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include <openssl/bn.h> | 60 | #include <openssl/bn.h> |
| 61 | 61 | ||
| 62 | #ifdef OPENSSL_FIPS | ||
| 63 | |||
| 64 | /* X9.31 routines for prime derivation */ | 62 | /* X9.31 routines for prime derivation */ |
| 65 | 63 | ||
| 66 | |||
| 67 | /* X9.31 prime derivation. This is used to generate the primes pi | 64 | /* X9.31 prime derivation. This is used to generate the primes pi |
| 68 | * (p1, p2, q1, q2) from a parameter Xpi by checking successive odd | 65 | * (p1, p2, q1, q2) from a parameter Xpi by checking successive odd |
| 69 | * integers. | 66 | * integers. |
| 70 | */ | 67 | */ |
| 71 | 68 | ||
| 72 | static int bn_x931_derive_pi(BIGNUM *pi, const BIGNUM *Xpi, BN_CTX *ctx, | 69 | static int bn_x931_derive_pi(BIGNUM *pi, const BIGNUM *Xpi, BN_CTX *ctx, |
| 73 | void (*cb)(int, int, void *), void *cb_arg) | 70 | BN_GENCB *cb) |
| 74 | { | 71 | { |
| 75 | int i = 0; | 72 | int i = 0; |
| 76 | if (!BN_copy(pi, Xpi)) | 73 | if (!BN_copy(pi, Xpi)) |
| @@ -80,16 +77,14 @@ static int bn_x931_derive_pi(BIGNUM *pi, const BIGNUM *Xpi, BN_CTX *ctx, | |||
| 80 | for(;;) | 77 | for(;;) |
| 81 | { | 78 | { |
| 82 | i++; | 79 | i++; |
| 83 | if (cb) | 80 | BN_GENCB_call(cb, 0, i); |
| 84 | cb(0, i, cb_arg); | ||
| 85 | /* NB 27 MR is specificed in X9.31 */ | 81 | /* NB 27 MR is specificed in X9.31 */ |
| 86 | if (BN_is_prime_fasttest(pi, 27, cb, ctx, cb_arg, 1)) | 82 | if (BN_is_prime_fasttest_ex(pi, 27, ctx, 1, cb)) |
| 87 | break; | 83 | break; |
| 88 | if (!BN_add_word(pi, 2)) | 84 | if (!BN_add_word(pi, 2)) |
| 89 | return 0; | 85 | return 0; |
| 90 | } | 86 | } |
| 91 | if (cb) | 87 | BN_GENCB_call(cb, 2, i); |
| 92 | cb(2, i, cb_arg); | ||
| 93 | return 1; | 88 | return 1; |
| 94 | } | 89 | } |
| 95 | 90 | ||
| @@ -98,10 +93,9 @@ static int bn_x931_derive_pi(BIGNUM *pi, const BIGNUM *Xpi, BN_CTX *ctx, | |||
| 98 | * not NULL they will be returned too: this is needed for testing. | 93 | * not NULL they will be returned too: this is needed for testing. |
| 99 | */ | 94 | */ |
| 100 | 95 | ||
| 101 | int BN_X931_derive_prime(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, | 96 | int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, |
| 102 | void (*cb)(int, int, void *), void *cb_arg, | ||
| 103 | const BIGNUM *Xp, const BIGNUM *Xp1, const BIGNUM *Xp2, | 97 | const BIGNUM *Xp, const BIGNUM *Xp1, const BIGNUM *Xp2, |
| 104 | const BIGNUM *e, BN_CTX *ctx) | 98 | const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb) |
| 105 | { | 99 | { |
| 106 | int ret = 0; | 100 | int ret = 0; |
| 107 | 101 | ||
| @@ -124,10 +118,10 @@ int BN_X931_derive_prime(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, | |||
| 124 | 118 | ||
| 125 | pm1 = BN_CTX_get(ctx); | 119 | pm1 = BN_CTX_get(ctx); |
| 126 | 120 | ||
| 127 | if (!bn_x931_derive_pi(p1, Xp1, ctx, cb, cb_arg)) | 121 | if (!bn_x931_derive_pi(p1, Xp1, ctx, cb)) |
| 128 | goto err; | 122 | goto err; |
| 129 | 123 | ||
| 130 | if (!bn_x931_derive_pi(p2, Xp2, ctx, cb, cb_arg)) | 124 | if (!bn_x931_derive_pi(p2, Xp2, ctx, cb)) |
| 131 | goto err; | 125 | goto err; |
| 132 | 126 | ||
| 133 | if (!BN_mul(p1p2, p1, p2, ctx)) | 127 | if (!BN_mul(p1p2, p1, p2, ctx)) |
| @@ -166,8 +160,7 @@ int BN_X931_derive_prime(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, | |||
| 166 | for (;;) | 160 | for (;;) |
| 167 | { | 161 | { |
| 168 | int i = 1; | 162 | int i = 1; |
| 169 | if (cb) | 163 | BN_GENCB_call(cb, 0, i++); |
| 170 | cb(0, i++, cb_arg); | ||
| 171 | if (!BN_copy(pm1, p)) | 164 | if (!BN_copy(pm1, p)) |
| 172 | goto err; | 165 | goto err; |
| 173 | if (!BN_sub_word(pm1, 1)) | 166 | if (!BN_sub_word(pm1, 1)) |
| @@ -179,14 +172,13 @@ int BN_X931_derive_prime(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, | |||
| 179 | * offering similar or better guarantees 50 MR is considerably | 172 | * offering similar or better guarantees 50 MR is considerably |
| 180 | * better. | 173 | * better. |
| 181 | */ | 174 | */ |
| 182 | && BN_is_prime_fasttest(p, 50, cb, ctx, cb_arg, 1)) | 175 | && BN_is_prime_fasttest_ex(p, 50, ctx, 1, cb)) |
| 183 | break; | 176 | break; |
| 184 | if (!BN_add(p, p, p1p2)) | 177 | if (!BN_add(p, p, p1p2)) |
| 185 | goto err; | 178 | goto err; |
| 186 | } | 179 | } |
| 187 | 180 | ||
| 188 | if (cb) | 181 | BN_GENCB_call(cb, 3, 0); |
| 189 | cb(3, 0, cb_arg); | ||
| 190 | 182 | ||
| 191 | ret = 1; | 183 | ret = 1; |
| 192 | 184 | ||
| @@ -248,11 +240,11 @@ int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx) | |||
| 248 | * are generated using the previous function and supplied as input. | 240 | * are generated using the previous function and supplied as input. |
| 249 | */ | 241 | */ |
| 250 | 242 | ||
| 251 | int BN_X931_generate_prime(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, | 243 | int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, |
| 252 | BIGNUM *Xp1, BIGNUM *Xp2, | 244 | BIGNUM *Xp1, BIGNUM *Xp2, |
| 253 | const BIGNUM *Xp, | 245 | const BIGNUM *Xp, |
| 254 | const BIGNUM *e, BN_CTX *ctx, | 246 | const BIGNUM *e, BN_CTX *ctx, |
| 255 | void (*cb)(int, int, void *), void *cb_arg) | 247 | BN_GENCB *cb) |
| 256 | { | 248 | { |
| 257 | int ret = 0; | 249 | int ret = 0; |
| 258 | 250 | ||
| @@ -266,8 +258,7 @@ int BN_X931_generate_prime(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, | |||
| 266 | goto error; | 258 | goto error; |
| 267 | if (!BN_rand(Xp2, 101, 0, 0)) | 259 | if (!BN_rand(Xp2, 101, 0, 0)) |
| 268 | goto error; | 260 | goto error; |
| 269 | if (!BN_X931_derive_prime(p, p1, p2, cb, cb_arg, | 261 | if (!BN_X931_derive_prime_ex(p, p1, p2, Xp, Xp1, Xp2, e, ctx, cb)) |
| 270 | Xp, Xp1, Xp2, e, ctx)) | ||
| 271 | goto error; | 262 | goto error; |
| 272 | 263 | ||
| 273 | ret = 1; | 264 | ret = 1; |
| @@ -279,4 +270,3 @@ int BN_X931_generate_prime(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, | |||
| 279 | 270 | ||
| 280 | } | 271 | } |
| 281 | 272 | ||
| 282 | #endif | ||
diff --git a/src/lib/libcrypto/buffer/buf_str.c b/src/lib/libcrypto/buffer/buf_str.c new file mode 100644 index 0000000000..28dd1e401e --- /dev/null +++ b/src/lib/libcrypto/buffer/buf_str.c | |||
| @@ -0,0 +1,116 @@ | |||
| 1 | /* crypto/buffer/buf_str.c */ | ||
| 2 | /* ==================================================================== | ||
| 3 | * Copyright (c) 2007 The OpenSSL Project. All rights reserved. | ||
| 4 | * | ||
| 5 | * Redistribution and use in source and binary forms, with or without | ||
| 6 | * modification, are permitted provided that the following conditions | ||
| 7 | * are met: | ||
| 8 | * | ||
| 9 | * 1. Redistributions of source code must retain the above copyright | ||
| 10 | * notice, this list of conditions and the following disclaimer. | ||
| 11 | * | ||
| 12 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 13 | * notice, this list of conditions and the following disclaimer in | ||
| 14 | * the documentation and/or other materials provided with the | ||
| 15 | * distribution. | ||
| 16 | * | ||
| 17 | * 3. All advertising materials mentioning features or use of this | ||
| 18 | * software must display the following acknowledgment: | ||
| 19 | * "This product includes software developed by the OpenSSL Project | ||
| 20 | * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | ||
| 21 | * | ||
| 22 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
| 23 | * endorse or promote products derived from this software without | ||
| 24 | * prior written permission. For written permission, please contact | ||
| 25 | * licensing@OpenSSL.org. | ||
| 26 | * | ||
| 27 | * 5. Products derived from this software may not be called "OpenSSL" | ||
| 28 | * nor may "OpenSSL" appear in their names without prior written | ||
| 29 | * permission of the OpenSSL Project. | ||
| 30 | * | ||
| 31 | * 6. Redistributions of any form whatsoever must retain the following | ||
| 32 | * acknowledgment: | ||
| 33 | * "This product includes software developed by the OpenSSL Project | ||
| 34 | * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | ||
| 35 | * | ||
| 36 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
| 37 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 38 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
| 39 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
| 40 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 41 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 42 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 43 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 44 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 45 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| 46 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
| 47 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 48 | * ==================================================================== | ||
| 49 | * | ||
| 50 | * This product includes cryptographic software written by Eric Young | ||
| 51 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
| 52 | * Hudson (tjh@cryptsoft.com). | ||
| 53 | * | ||
| 54 | */ | ||
| 55 | |||
| 56 | #include <stdio.h> | ||
| 57 | #include "cryptlib.h" | ||
| 58 | #include <openssl/buffer.h> | ||
| 59 | |||
| 60 | char *BUF_strdup(const char *str) | ||
| 61 | { | ||
| 62 | if (str == NULL) return(NULL); | ||
| 63 | return BUF_strndup(str, strlen(str)); | ||
| 64 | } | ||
| 65 | |||
| 66 | char *BUF_strndup(const char *str, size_t siz) | ||
| 67 | { | ||
| 68 | char *ret; | ||
| 69 | |||
| 70 | if (str == NULL) return(NULL); | ||
| 71 | |||
| 72 | ret=OPENSSL_malloc(siz+1); | ||
| 73 | if (ret == NULL) | ||
| 74 | { | ||
| 75 | BUFerr(BUF_F_BUF_STRNDUP,ERR_R_MALLOC_FAILURE); | ||
| 76 | return(NULL); | ||
| 77 | } | ||
| 78 | BUF_strlcpy(ret,str,siz+1); | ||
| 79 | return(ret); | ||
| 80 | } | ||
| 81 | |||
| 82 | void *BUF_memdup(const void *data, size_t siz) | ||
| 83 | { | ||
| 84 | void *ret; | ||
| 85 | |||
| 86 | if (data == NULL) return(NULL); | ||
| 87 | |||
| 88 | ret=OPENSSL_malloc(siz); | ||
| 89 | if (ret == NULL) | ||
| 90 | { | ||
| 91 | BUFerr(BUF_F_BUF_MEMDUP,ERR_R_MALLOC_FAILURE); | ||
| 92 | return(NULL); | ||
| 93 | } | ||
| 94 | return memcpy(ret, data, siz); | ||
| 95 | } | ||
| 96 | |||
| 97 | size_t BUF_strlcpy(char *dst, const char *src, size_t size) | ||
| 98 | { | ||
| 99 | size_t l = 0; | ||
| 100 | for(; size > 1 && *src; size--) | ||
| 101 | { | ||
| 102 | *dst++ = *src++; | ||
| 103 | l++; | ||
| 104 | } | ||
| 105 | if (size) | ||
| 106 | *dst = '\0'; | ||
| 107 | return l + strlen(src); | ||
| 108 | } | ||
| 109 | |||
| 110 | size_t BUF_strlcat(char *dst, const char *src, size_t size) | ||
| 111 | { | ||
| 112 | size_t l = 0; | ||
| 113 | for(; size > 0 && *dst; size--, dst++) | ||
| 114 | l++; | ||
| 115 | return l + BUF_strlcpy(dst, src, size); | ||
| 116 | } | ||
diff --git a/src/lib/libcrypto/buffer/buffer.c b/src/lib/libcrypto/buffer/buffer.c index 3bf03c7eff..b3e947771d 100644 --- a/src/lib/libcrypto/buffer/buffer.c +++ b/src/lib/libcrypto/buffer/buffer.c | |||
| @@ -161,61 +161,3 @@ int BUF_MEM_grow_clean(BUF_MEM *str, int len) | |||
| 161 | } | 161 | } |
| 162 | return(len); | 162 | return(len); |
| 163 | } | 163 | } |
| 164 | |||
| 165 | char *BUF_strdup(const char *str) | ||
| 166 | { | ||
| 167 | if (str == NULL) return(NULL); | ||
| 168 | return BUF_strndup(str, strlen(str)); | ||
| 169 | } | ||
| 170 | |||
| 171 | char *BUF_strndup(const char *str, size_t siz) | ||
| 172 | { | ||
| 173 | char *ret; | ||
| 174 | |||
| 175 | if (str == NULL) return(NULL); | ||
| 176 | |||
| 177 | ret=OPENSSL_malloc(siz+1); | ||
| 178 | if (ret == NULL) | ||
| 179 | { | ||
| 180 | BUFerr(BUF_F_BUF_STRNDUP,ERR_R_MALLOC_FAILURE); | ||
| 181 | return(NULL); | ||
| 182 | } | ||
| 183 | BUF_strlcpy(ret,str,siz+1); | ||
| 184 | return(ret); | ||
| 185 | } | ||
| 186 | |||
| 187 | void *BUF_memdup(const void *data, size_t siz) | ||
| 188 | { | ||
| 189 | void *ret; | ||
| 190 | |||
| 191 | if (data == NULL) return(NULL); | ||
| 192 | |||
| 193 | ret=OPENSSL_malloc(siz); | ||
| 194 | if (ret == NULL) | ||
| 195 | { | ||
| 196 | BUFerr(BUF_F_BUF_MEMDUP,ERR_R_MALLOC_FAILURE); | ||
| 197 | return(NULL); | ||
| 198 | } | ||
| 199 | return memcpy(ret, data, siz); | ||
| 200 | } | ||
| 201 | |||
| 202 | size_t BUF_strlcpy(char *dst, const char *src, size_t size) | ||
| 203 | { | ||
| 204 | size_t l = 0; | ||
| 205 | for(; size > 1 && *src; size--) | ||
| 206 | { | ||
| 207 | *dst++ = *src++; | ||
| 208 | l++; | ||
| 209 | } | ||
| 210 | if (size) | ||
| 211 | *dst = '\0'; | ||
| 212 | return l + strlen(src); | ||
| 213 | } | ||
| 214 | |||
| 215 | size_t BUF_strlcat(char *dst, const char *src, size_t size) | ||
| 216 | { | ||
| 217 | size_t l = 0; | ||
| 218 | for(; size > 0 && *dst; size--, dst++) | ||
| 219 | l++; | ||
| 220 | return l + BUF_strlcpy(dst, src, size); | ||
| 221 | } | ||
diff --git a/src/lib/libcrypto/camellia/camellia.h b/src/lib/libcrypto/camellia/camellia.h index 3c8a359543..b8a8b6e10b 100644 --- a/src/lib/libcrypto/camellia/camellia.h +++ b/src/lib/libcrypto/camellia/camellia.h | |||
| @@ -87,6 +87,11 @@ struct camellia_key_st | |||
| 87 | 87 | ||
| 88 | typedef struct camellia_key_st CAMELLIA_KEY; | 88 | typedef struct camellia_key_st CAMELLIA_KEY; |
| 89 | 89 | ||
| 90 | #ifdef OPENSSL_FIPS | ||
| 91 | int private_Camellia_set_key(const unsigned char *userKey, const int bits, | ||
| 92 | CAMELLIA_KEY *key); | ||
| 93 | #endif | ||
| 94 | |||
| 90 | int Camellia_set_key(const unsigned char *userKey, const int bits, | 95 | int Camellia_set_key(const unsigned char *userKey, const int bits, |
| 91 | CAMELLIA_KEY *key); | 96 | CAMELLIA_KEY *key); |
| 92 | 97 | ||
diff --git a/src/lib/libcrypto/camellia/cmll_misc.c b/src/lib/libcrypto/camellia/cmll_misc.c index f1047b54e0..2cd7aba9bb 100644 --- a/src/lib/libcrypto/camellia/cmll_misc.c +++ b/src/lib/libcrypto/camellia/cmll_misc.c | |||
| @@ -52,11 +52,24 @@ | |||
| 52 | #include <openssl/opensslv.h> | 52 | #include <openssl/opensslv.h> |
| 53 | #include <openssl/camellia.h> | 53 | #include <openssl/camellia.h> |
| 54 | #include "cmll_locl.h" | 54 | #include "cmll_locl.h" |
| 55 | #include <openssl/crypto.h> | ||
| 56 | #ifdef OPENSSL_FIPS | ||
| 57 | #include <openssl/fips.h> | ||
| 58 | #endif | ||
| 55 | 59 | ||
| 56 | const char CAMELLIA_version[]="CAMELLIA" OPENSSL_VERSION_PTEXT; | 60 | const char CAMELLIA_version[]="CAMELLIA" OPENSSL_VERSION_PTEXT; |
| 57 | 61 | ||
| 58 | int Camellia_set_key(const unsigned char *userKey, const int bits, | 62 | int Camellia_set_key(const unsigned char *userKey, const int bits, |
| 59 | CAMELLIA_KEY *key) | 63 | CAMELLIA_KEY *key) |
| 64 | #ifdef OPENSSL_FIPS | ||
| 65 | { | ||
| 66 | if (FIPS_mode()) | ||
| 67 | FIPS_BAD_ABORT(CAMELLIA) | ||
| 68 | return private_Camellia_set_key(userKey, bits, key); | ||
| 69 | } | ||
| 70 | int private_Camellia_set_key(const unsigned char *userKey, const int bits, | ||
| 71 | CAMELLIA_KEY *key) | ||
| 72 | #endif | ||
| 60 | { | 73 | { |
| 61 | if (!userKey || !key) | 74 | if (!userKey || !key) |
| 62 | { | 75 | { |
diff --git a/src/lib/libcrypto/cast/c_skey.c b/src/lib/libcrypto/cast/c_skey.c index 76e40005c9..68e690a60c 100644 --- a/src/lib/libcrypto/cast/c_skey.c +++ b/src/lib/libcrypto/cast/c_skey.c | |||
| @@ -57,6 +57,11 @@ | |||
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #include <openssl/cast.h> | 59 | #include <openssl/cast.h> |
| 60 | #include <openssl/crypto.h> | ||
| 61 | #ifdef OPENSSL_FIPS | ||
| 62 | #include <openssl/fips.h> | ||
| 63 | #endif | ||
| 64 | |||
| 60 | #include "cast_lcl.h" | 65 | #include "cast_lcl.h" |
| 61 | #include "cast_s.h" | 66 | #include "cast_s.h" |
| 62 | 67 | ||
| @@ -72,7 +77,7 @@ | |||
| 72 | #define S6 CAST_S_table6 | 77 | #define S6 CAST_S_table6 |
| 73 | #define S7 CAST_S_table7 | 78 | #define S7 CAST_S_table7 |
| 74 | 79 | ||
| 75 | void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data) | 80 | FIPS_NON_FIPS_VCIPHER_Init(CAST) |
| 76 | { | 81 | { |
| 77 | CAST_LONG x[16]; | 82 | CAST_LONG x[16]; |
| 78 | CAST_LONG z[16]; | 83 | CAST_LONG z[16]; |
diff --git a/src/lib/libcrypto/cast/cast.h b/src/lib/libcrypto/cast/cast.h index 90b45b950a..1faf5806aa 100644 --- a/src/lib/libcrypto/cast/cast.h +++ b/src/lib/libcrypto/cast/cast.h | |||
| @@ -83,7 +83,9 @@ typedef struct cast_key_st | |||
| 83 | int short_key; /* Use reduced rounds for short key */ | 83 | int short_key; /* Use reduced rounds for short key */ |
| 84 | } CAST_KEY; | 84 | } CAST_KEY; |
| 85 | 85 | ||
| 86 | 86 | #ifdef OPENSSL_FIPS | |
| 87 | void private_CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); | ||
| 88 | #endif | ||
| 87 | void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); | 89 | void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); |
| 88 | void CAST_ecb_encrypt(const unsigned char *in,unsigned char *out,CAST_KEY *key, | 90 | void CAST_ecb_encrypt(const unsigned char *in,unsigned char *out,CAST_KEY *key, |
| 89 | int enc); | 91 | int enc); |
diff --git a/src/lib/libcrypto/cms/cms_sd.c b/src/lib/libcrypto/cms/cms_sd.c index 591bfbec33..cdac3b870d 100644 --- a/src/lib/libcrypto/cms/cms_sd.c +++ b/src/lib/libcrypto/cms/cms_sd.c | |||
| @@ -830,7 +830,7 @@ int CMS_SignerInfo_verify(CMS_SignerInfo *si) | |||
| 830 | cms_fixup_mctx(&mctx, si->pkey); | 830 | cms_fixup_mctx(&mctx, si->pkey); |
| 831 | r = EVP_VerifyFinal(&mctx, | 831 | r = EVP_VerifyFinal(&mctx, |
| 832 | si->signature->data, si->signature->length, si->pkey); | 832 | si->signature->data, si->signature->length, si->pkey); |
| 833 | if (!r) | 833 | if (r <= 0) |
| 834 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_VERIFICATION_FAILURE); | 834 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_VERIFICATION_FAILURE); |
| 835 | err: | 835 | err: |
| 836 | EVP_MD_CTX_cleanup(&mctx); | 836 | EVP_MD_CTX_cleanup(&mctx); |
diff --git a/src/lib/libcrypto/cms/cms_smime.c b/src/lib/libcrypto/cms/cms_smime.c index f79c504e91..b9463f9abb 100644 --- a/src/lib/libcrypto/cms/cms_smime.c +++ b/src/lib/libcrypto/cms/cms_smime.c | |||
| @@ -68,7 +68,10 @@ static int cms_copy_content(BIO *out, BIO *in, unsigned int flags) | |||
| 68 | if (out == NULL) | 68 | if (out == NULL) |
| 69 | tmpout = BIO_new(BIO_s_null()); | 69 | tmpout = BIO_new(BIO_s_null()); |
| 70 | else if (flags & CMS_TEXT) | 70 | else if (flags & CMS_TEXT) |
| 71 | { | ||
| 71 | tmpout = BIO_new(BIO_s_mem()); | 72 | tmpout = BIO_new(BIO_s_mem()); |
| 73 | BIO_set_mem_eof_return(tmpout, 0); | ||
| 74 | } | ||
| 72 | else | 75 | else |
| 73 | tmpout = out; | 76 | tmpout = out; |
| 74 | 77 | ||
| @@ -89,11 +92,13 @@ static int cms_copy_content(BIO *out, BIO *in, unsigned int flags) | |||
| 89 | if (!BIO_get_cipher_status(in)) | 92 | if (!BIO_get_cipher_status(in)) |
| 90 | goto err; | 93 | goto err; |
| 91 | } | 94 | } |
| 95 | if (i < 0) | ||
| 96 | goto err; | ||
| 92 | break; | 97 | break; |
| 93 | } | 98 | } |
| 94 | 99 | ||
| 95 | if (tmpout) | 100 | if (tmpout && (BIO_write(tmpout, buf, i) != i)) |
| 96 | BIO_write(tmpout, buf, i); | 101 | goto err; |
| 97 | } | 102 | } |
| 98 | 103 | ||
| 99 | if(flags & CMS_TEXT) | 104 | if(flags & CMS_TEXT) |
diff --git a/src/lib/libcrypto/comp/c_zlib.c b/src/lib/libcrypto/comp/c_zlib.c index 0f34597e70..eccfd09137 100644 --- a/src/lib/libcrypto/comp/c_zlib.c +++ b/src/lib/libcrypto/comp/c_zlib.c | |||
| @@ -727,6 +727,7 @@ static long bio_zlib_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 727 | case BIO_CTRL_RESET: | 727 | case BIO_CTRL_RESET: |
| 728 | ctx->ocount = 0; | 728 | ctx->ocount = 0; |
| 729 | ctx->odone = 0; | 729 | ctx->odone = 0; |
| 730 | ret = 1; | ||
| 730 | break; | 731 | break; |
| 731 | 732 | ||
| 732 | case BIO_CTRL_FLUSH: | 733 | case BIO_CTRL_FLUSH: |
| @@ -771,7 +772,7 @@ static long bio_zlib_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 771 | } | 772 | } |
| 772 | ctx->obufsize = obs; | 773 | ctx->obufsize = obs; |
| 773 | } | 774 | } |
| 774 | 775 | ret = 1; | |
| 775 | break; | 776 | break; |
| 776 | 777 | ||
| 777 | case BIO_C_DO_STATE_MACHINE: | 778 | case BIO_C_DO_STATE_MACHINE: |
| @@ -783,7 +784,6 @@ static long bio_zlib_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 783 | default: | 784 | default: |
| 784 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | 785 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 785 | break; | 786 | break; |
| 786 | |||
| 787 | } | 787 | } |
| 788 | 788 | ||
| 789 | return ret; | 789 | return ret; |
diff --git a/src/lib/libcrypto/conf/conf_mall.c b/src/lib/libcrypto/conf/conf_mall.c index 4ba40cf44c..1cc1fd5534 100644 --- a/src/lib/libcrypto/conf/conf_mall.c +++ b/src/lib/libcrypto/conf/conf_mall.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* conf_mall.c */ | 1 | /* conf_mall.c */ |
| 2 | /* Written by Stephen Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Stephen Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -63,6 +63,7 @@ | |||
| 63 | #include <openssl/dso.h> | 63 | #include <openssl/dso.h> |
| 64 | #include <openssl/x509.h> | 64 | #include <openssl/x509.h> |
| 65 | #include <openssl/asn1.h> | 65 | #include <openssl/asn1.h> |
| 66 | #include <openssl/evp.h> | ||
| 66 | #ifndef OPENSSL_NO_ENGINE | 67 | #ifndef OPENSSL_NO_ENGINE |
| 67 | #include <openssl/engine.h> | 68 | #include <openssl/engine.h> |
| 68 | #endif | 69 | #endif |
| @@ -76,5 +77,6 @@ void OPENSSL_load_builtin_modules(void) | |||
| 76 | #ifndef OPENSSL_NO_ENGINE | 77 | #ifndef OPENSSL_NO_ENGINE |
| 77 | ENGINE_add_conf_module(); | 78 | ENGINE_add_conf_module(); |
| 78 | #endif | 79 | #endif |
| 80 | EVP_add_alg_module(); | ||
| 79 | } | 81 | } |
| 80 | 82 | ||
diff --git a/src/lib/libcrypto/conf/conf_mod.c b/src/lib/libcrypto/conf/conf_mod.c index 628e8333a6..ee9c677d9b 100644 --- a/src/lib/libcrypto/conf/conf_mod.c +++ b/src/lib/libcrypto/conf/conf_mod.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* conf_mod.c */ | 1 | /* conf_mod.c */ |
| 2 | /* Written by Stephen Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Stephen Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/conf/conf_sap.c b/src/lib/libcrypto/conf/conf_sap.c index 9c53bac1a8..760dc2632d 100644 --- a/src/lib/libcrypto/conf/conf_sap.c +++ b/src/lib/libcrypto/conf/conf_sap.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* conf_sap.c */ | 1 | /* conf_sap.c */ |
| 2 | /* Written by Stephen Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Stephen Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/cryptlib.c b/src/lib/libcrypto/cryptlib.c index 8c68623828..8f9e88e403 100644 --- a/src/lib/libcrypto/cryptlib.c +++ b/src/lib/libcrypto/cryptlib.c | |||
| @@ -121,275 +121,17 @@ | |||
| 121 | static double SSLeay_MSVC5_hack=0.0; /* and for VC1.5 */ | 121 | static double SSLeay_MSVC5_hack=0.0; /* and for VC1.5 */ |
| 122 | #endif | 122 | #endif |
| 123 | 123 | ||
| 124 | DECLARE_STACK_OF(CRYPTO_dynlock) | ||
| 125 | IMPLEMENT_STACK_OF(CRYPTO_dynlock) | ||
| 126 | |||
| 127 | /* real #defines in crypto.h, keep these upto date */ | ||
| 128 | static const char* const lock_names[CRYPTO_NUM_LOCKS] = | ||
| 129 | { | ||
| 130 | "<<ERROR>>", | ||
| 131 | "err", | ||
| 132 | "ex_data", | ||
| 133 | "x509", | ||
| 134 | "x509_info", | ||
| 135 | "x509_pkey", | ||
| 136 | "x509_crl", | ||
| 137 | "x509_req", | ||
| 138 | "dsa", | ||
| 139 | "rsa", | ||
| 140 | "evp_pkey", | ||
| 141 | "x509_store", | ||
| 142 | "ssl_ctx", | ||
| 143 | "ssl_cert", | ||
| 144 | "ssl_session", | ||
| 145 | "ssl_sess_cert", | ||
| 146 | "ssl", | ||
| 147 | "ssl_method", | ||
| 148 | "rand", | ||
| 149 | "rand2", | ||
| 150 | "debug_malloc", | ||
| 151 | "BIO", | ||
| 152 | "gethostbyname", | ||
| 153 | "getservbyname", | ||
| 154 | "readdir", | ||
| 155 | "RSA_blinding", | ||
| 156 | "dh", | ||
| 157 | "debug_malloc2", | ||
| 158 | "dso", | ||
| 159 | "dynlock", | ||
| 160 | "engine", | ||
| 161 | "ui", | ||
| 162 | "ecdsa", | ||
| 163 | "ec", | ||
| 164 | "ecdh", | ||
| 165 | "bn", | ||
| 166 | "ec_pre_comp", | ||
| 167 | "store", | ||
| 168 | "comp", | ||
| 169 | #if CRYPTO_NUM_LOCKS != 39 | ||
| 170 | # error "Inconsistency between crypto.h and cryptlib.c" | ||
| 171 | #endif | ||
| 172 | }; | ||
| 173 | |||
| 174 | /* This is for applications to allocate new type names in the non-dynamic | ||
| 175 | array of lock names. These are numbered with positive numbers. */ | ||
| 176 | static STACK *app_locks=NULL; | ||
| 177 | |||
| 178 | /* For applications that want a more dynamic way of handling threads, the | ||
| 179 | following stack is used. These are externally numbered with negative | ||
| 180 | numbers. */ | ||
| 181 | static STACK_OF(CRYPTO_dynlock) *dyn_locks=NULL; | ||
| 182 | |||
| 183 | |||
| 184 | static void (MS_FAR *locking_callback)(int mode,int type, | 124 | static void (MS_FAR *locking_callback)(int mode,int type, |
| 185 | const char *file,int line)=NULL; | 125 | const char *file,int line)=NULL; |
| 186 | static int (MS_FAR *add_lock_callback)(int *pointer,int amount, | 126 | static int (MS_FAR *add_lock_callback)(int *pointer,int amount, |
| 187 | int type,const char *file,int line)=NULL; | 127 | int type,const char *file,int line)=NULL; |
| 188 | static unsigned long (MS_FAR *id_callback)(void)=NULL; | 128 | static unsigned long (MS_FAR *id_callback)(void)=NULL; |
| 189 | static struct CRYPTO_dynlock_value *(MS_FAR *dynlock_create_callback) | ||
| 190 | (const char *file,int line)=NULL; | ||
| 191 | static void (MS_FAR *dynlock_lock_callback)(int mode, | ||
| 192 | struct CRYPTO_dynlock_value *l, const char *file,int line)=NULL; | ||
| 193 | static void (MS_FAR *dynlock_destroy_callback)(struct CRYPTO_dynlock_value *l, | ||
| 194 | const char *file,int line)=NULL; | ||
| 195 | |||
| 196 | int CRYPTO_get_new_lockid(char *name) | ||
| 197 | { | ||
| 198 | char *str; | ||
| 199 | int i; | ||
| 200 | |||
| 201 | #if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16) | ||
| 202 | /* A hack to make Visual C++ 5.0 work correctly when linking as | ||
| 203 | * a DLL using /MT. Without this, the application cannot use | ||
| 204 | * and floating point printf's. | ||
| 205 | * It also seems to be needed for Visual C 1.5 (win16) */ | ||
| 206 | SSLeay_MSVC5_hack=(double)name[0]*(double)name[1]; | ||
| 207 | #endif | ||
| 208 | |||
| 209 | if ((app_locks == NULL) && ((app_locks=sk_new_null()) == NULL)) | ||
| 210 | { | ||
| 211 | CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_LOCKID,ERR_R_MALLOC_FAILURE); | ||
| 212 | return(0); | ||
| 213 | } | ||
| 214 | if ((str=BUF_strdup(name)) == NULL) | ||
| 215 | { | ||
| 216 | CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_LOCKID,ERR_R_MALLOC_FAILURE); | ||
| 217 | return(0); | ||
| 218 | } | ||
| 219 | i=sk_push(app_locks,str); | ||
| 220 | if (!i) | ||
| 221 | OPENSSL_free(str); | ||
| 222 | else | ||
| 223 | i+=CRYPTO_NUM_LOCKS; /* gap of one :-) */ | ||
| 224 | return(i); | ||
| 225 | } | ||
| 226 | 129 | ||
| 227 | int CRYPTO_num_locks(void) | 130 | int CRYPTO_num_locks(void) |
| 228 | { | 131 | { |
| 229 | return CRYPTO_NUM_LOCKS; | 132 | return CRYPTO_NUM_LOCKS; |
| 230 | } | 133 | } |
| 231 | 134 | ||
| 232 | int CRYPTO_get_new_dynlockid(void) | ||
| 233 | { | ||
| 234 | int i = 0; | ||
| 235 | CRYPTO_dynlock *pointer = NULL; | ||
| 236 | |||
| 237 | if (dynlock_create_callback == NULL) | ||
| 238 | { | ||
| 239 | CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK); | ||
| 240 | return(0); | ||
| 241 | } | ||
| 242 | CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); | ||
| 243 | if ((dyn_locks == NULL) | ||
| 244 | && ((dyn_locks=sk_CRYPTO_dynlock_new_null()) == NULL)) | ||
| 245 | { | ||
| 246 | CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | ||
| 247 | CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,ERR_R_MALLOC_FAILURE); | ||
| 248 | return(0); | ||
| 249 | } | ||
| 250 | CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | ||
| 251 | |||
| 252 | pointer = (CRYPTO_dynlock *)OPENSSL_malloc(sizeof(CRYPTO_dynlock)); | ||
| 253 | if (pointer == NULL) | ||
| 254 | { | ||
| 255 | CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,ERR_R_MALLOC_FAILURE); | ||
| 256 | return(0); | ||
| 257 | } | ||
| 258 | pointer->references = 1; | ||
| 259 | pointer->data = dynlock_create_callback(__FILE__,__LINE__); | ||
| 260 | if (pointer->data == NULL) | ||
| 261 | { | ||
| 262 | OPENSSL_free(pointer); | ||
| 263 | CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,ERR_R_MALLOC_FAILURE); | ||
| 264 | return(0); | ||
| 265 | } | ||
| 266 | |||
| 267 | CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); | ||
| 268 | /* First, try to find an existing empty slot */ | ||
| 269 | i=sk_CRYPTO_dynlock_find(dyn_locks,NULL); | ||
| 270 | /* If there was none, push, thereby creating a new one */ | ||
| 271 | if (i == -1) | ||
| 272 | /* Since sk_push() returns the number of items on the | ||
| 273 | stack, not the location of the pushed item, we need | ||
| 274 | to transform the returned number into a position, | ||
| 275 | by decreasing it. */ | ||
| 276 | i=sk_CRYPTO_dynlock_push(dyn_locks,pointer) - 1; | ||
| 277 | else | ||
| 278 | /* If we found a place with a NULL pointer, put our pointer | ||
| 279 | in it. */ | ||
| 280 | (void)sk_CRYPTO_dynlock_set(dyn_locks,i,pointer); | ||
| 281 | CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | ||
| 282 | |||
| 283 | if (i == -1) | ||
| 284 | { | ||
| 285 | dynlock_destroy_callback(pointer->data,__FILE__,__LINE__); | ||
| 286 | OPENSSL_free(pointer); | ||
| 287 | } | ||
| 288 | else | ||
| 289 | i += 1; /* to avoid 0 */ | ||
| 290 | return -i; | ||
| 291 | } | ||
| 292 | |||
| 293 | void CRYPTO_destroy_dynlockid(int i) | ||
| 294 | { | ||
| 295 | CRYPTO_dynlock *pointer = NULL; | ||
| 296 | if (i) | ||
| 297 | i = -i-1; | ||
| 298 | if (dynlock_destroy_callback == NULL) | ||
| 299 | return; | ||
| 300 | |||
| 301 | CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); | ||
| 302 | |||
| 303 | if (dyn_locks == NULL || i >= sk_CRYPTO_dynlock_num(dyn_locks)) | ||
| 304 | { | ||
| 305 | CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | ||
| 306 | return; | ||
| 307 | } | ||
| 308 | pointer = sk_CRYPTO_dynlock_value(dyn_locks, i); | ||
| 309 | if (pointer != NULL) | ||
| 310 | { | ||
| 311 | --pointer->references; | ||
| 312 | #ifdef REF_CHECK | ||
| 313 | if (pointer->references < 0) | ||
| 314 | { | ||
| 315 | fprintf(stderr,"CRYPTO_destroy_dynlockid, bad reference count\n"); | ||
| 316 | abort(); | ||
| 317 | } | ||
| 318 | else | ||
| 319 | #endif | ||
| 320 | if (pointer->references <= 0) | ||
| 321 | { | ||
| 322 | (void)sk_CRYPTO_dynlock_set(dyn_locks, i, NULL); | ||
| 323 | } | ||
| 324 | else | ||
| 325 | pointer = NULL; | ||
| 326 | } | ||
| 327 | CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | ||
| 328 | |||
| 329 | if (pointer) | ||
| 330 | { | ||
| 331 | dynlock_destroy_callback(pointer->data,__FILE__,__LINE__); | ||
| 332 | OPENSSL_free(pointer); | ||
| 333 | } | ||
| 334 | } | ||
| 335 | |||
| 336 | struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i) | ||
| 337 | { | ||
| 338 | CRYPTO_dynlock *pointer = NULL; | ||
| 339 | if (i) | ||
| 340 | i = -i-1; | ||
| 341 | |||
| 342 | CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); | ||
| 343 | |||
| 344 | if (dyn_locks != NULL && i < sk_CRYPTO_dynlock_num(dyn_locks)) | ||
| 345 | pointer = sk_CRYPTO_dynlock_value(dyn_locks, i); | ||
| 346 | if (pointer) | ||
| 347 | pointer->references++; | ||
| 348 | |||
| 349 | CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | ||
| 350 | |||
| 351 | if (pointer) | ||
| 352 | return pointer->data; | ||
| 353 | return NULL; | ||
| 354 | } | ||
| 355 | |||
| 356 | struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void)) | ||
| 357 | (const char *file,int line) | ||
| 358 | { | ||
| 359 | return(dynlock_create_callback); | ||
| 360 | } | ||
| 361 | |||
| 362 | void (*CRYPTO_get_dynlock_lock_callback(void))(int mode, | ||
| 363 | struct CRYPTO_dynlock_value *l, const char *file,int line) | ||
| 364 | { | ||
| 365 | return(dynlock_lock_callback); | ||
| 366 | } | ||
| 367 | |||
| 368 | void (*CRYPTO_get_dynlock_destroy_callback(void)) | ||
| 369 | (struct CRYPTO_dynlock_value *l, const char *file,int line) | ||
| 370 | { | ||
| 371 | return(dynlock_destroy_callback); | ||
| 372 | } | ||
| 373 | |||
| 374 | void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*func) | ||
| 375 | (const char *file, int line)) | ||
| 376 | { | ||
| 377 | dynlock_create_callback=func; | ||
| 378 | } | ||
| 379 | |||
| 380 | void CRYPTO_set_dynlock_lock_callback(void (*func)(int mode, | ||
| 381 | struct CRYPTO_dynlock_value *l, const char *file, int line)) | ||
| 382 | { | ||
| 383 | dynlock_lock_callback=func; | ||
| 384 | } | ||
| 385 | |||
| 386 | void CRYPTO_set_dynlock_destroy_callback(void (*func) | ||
| 387 | (struct CRYPTO_dynlock_value *l, const char *file, int line)) | ||
| 388 | { | ||
| 389 | dynlock_destroy_callback=func; | ||
| 390 | } | ||
| 391 | |||
| 392 | |||
| 393 | void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file, | 135 | void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file, |
| 394 | int line) | 136 | int line) |
| 395 | { | 137 | { |
| @@ -445,6 +187,14 @@ unsigned long CRYPTO_thread_id(void) | |||
| 445 | return(ret); | 187 | return(ret); |
| 446 | } | 188 | } |
| 447 | 189 | ||
| 190 | static void (*do_dynlock_cb)(int mode, int type, const char *file, int line); | ||
| 191 | |||
| 192 | void int_CRYPTO_set_do_dynlock_callback( | ||
| 193 | void (*dyn_cb)(int mode, int type, const char *file, int line)) | ||
| 194 | { | ||
| 195 | do_dynlock_cb = dyn_cb; | ||
| 196 | } | ||
| 197 | |||
| 448 | void CRYPTO_lock(int mode, int type, const char *file, int line) | 198 | void CRYPTO_lock(int mode, int type, const char *file, int line) |
| 449 | { | 199 | { |
| 450 | #ifdef LOCK_DEBUG | 200 | #ifdef LOCK_DEBUG |
| @@ -472,17 +222,8 @@ void CRYPTO_lock(int mode, int type, const char *file, int line) | |||
| 472 | #endif | 222 | #endif |
| 473 | if (type < 0) | 223 | if (type < 0) |
| 474 | { | 224 | { |
| 475 | if (dynlock_lock_callback != NULL) | 225 | if (do_dynlock_cb) |
| 476 | { | 226 | do_dynlock_cb(mode, type, file, line); |
| 477 | struct CRYPTO_dynlock_value *pointer | ||
| 478 | = CRYPTO_get_dynlock_value(type); | ||
| 479 | |||
| 480 | OPENSSL_assert(pointer != NULL); | ||
| 481 | |||
| 482 | dynlock_lock_callback(mode, pointer, file, line); | ||
| 483 | |||
| 484 | CRYPTO_destroy_dynlockid(type); | ||
| 485 | } | ||
| 486 | } | 227 | } |
| 487 | else | 228 | else |
| 488 | if (locking_callback != NULL) | 229 | if (locking_callback != NULL) |
| @@ -527,21 +268,9 @@ int CRYPTO_add_lock(int *pointer, int amount, int type, const char *file, | |||
| 527 | return(ret); | 268 | return(ret); |
| 528 | } | 269 | } |
| 529 | 270 | ||
| 530 | const char *CRYPTO_get_lock_name(int type) | ||
| 531 | { | ||
| 532 | if (type < 0) | ||
| 533 | return("dynamic"); | ||
| 534 | else if (type < CRYPTO_NUM_LOCKS) | ||
| 535 | return(lock_names[type]); | ||
| 536 | else if (type-CRYPTO_NUM_LOCKS > sk_num(app_locks)) | ||
| 537 | return("ERROR"); | ||
| 538 | else | ||
| 539 | return(sk_value(app_locks,type-CRYPTO_NUM_LOCKS)); | ||
| 540 | } | ||
| 541 | |||
| 542 | #if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ | 271 | #if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ |
| 543 | defined(__INTEL__) || \ | 272 | defined(__INTEL__) || \ |
| 544 | defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) | 273 | defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64) |
| 545 | 274 | ||
| 546 | unsigned long OPENSSL_ia32cap_P=0; | 275 | unsigned long OPENSSL_ia32cap_P=0; |
| 547 | unsigned long *OPENSSL_ia32cap_loc(void) { return &OPENSSL_ia32cap_P; } | 276 | unsigned long *OPENSSL_ia32cap_loc(void) { return &OPENSSL_ia32cap_P; } |
| @@ -577,6 +306,62 @@ void OPENSSL_cpuid_setup(void) {} | |||
| 577 | #endif | 306 | #endif |
| 578 | 307 | ||
| 579 | #if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL) | 308 | #if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL) |
| 309 | |||
| 310 | #ifdef OPENSSL_FIPS | ||
| 311 | |||
| 312 | #include <tlhelp32.h> | ||
| 313 | #if defined(__GNUC__) && __GNUC__>=2 | ||
| 314 | static int DllInit(void) __attribute__((constructor)); | ||
| 315 | #elif defined(_MSC_VER) | ||
| 316 | static int DllInit(void); | ||
| 317 | # ifdef _WIN64 | ||
| 318 | # pragma section(".CRT$XCU",read) | ||
| 319 | __declspec(allocate(".CRT$XCU")) | ||
| 320 | # else | ||
| 321 | # pragma data_seg(".CRT$XCU") | ||
| 322 | # endif | ||
| 323 | static int (*p)(void) = DllInit; | ||
| 324 | # pragma data_seg() | ||
| 325 | #endif | ||
| 326 | |||
| 327 | static int DllInit(void) | ||
| 328 | { | ||
| 329 | #if defined(_WIN32_WINNT) | ||
| 330 | union { int(*f)(void); BYTE *p; } t = { DllInit }; | ||
| 331 | HANDLE hModuleSnap = INVALID_HANDLE_VALUE; | ||
| 332 | IMAGE_DOS_HEADER *dos_header; | ||
| 333 | IMAGE_NT_HEADERS *nt_headers; | ||
| 334 | MODULEENTRY32 me32 = {sizeof(me32)}; | ||
| 335 | |||
| 336 | hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0); | ||
| 337 | if (hModuleSnap != INVALID_HANDLE_VALUE && | ||
| 338 | Module32First(hModuleSnap,&me32)) do | ||
| 339 | { | ||
| 340 | if (t.p >= me32.modBaseAddr && | ||
| 341 | t.p < me32.modBaseAddr+me32.modBaseSize) | ||
| 342 | { | ||
| 343 | dos_header=(IMAGE_DOS_HEADER *)me32.modBaseAddr; | ||
| 344 | if (dos_header->e_magic==IMAGE_DOS_SIGNATURE) | ||
| 345 | { | ||
| 346 | nt_headers=(IMAGE_NT_HEADERS *) | ||
| 347 | ((BYTE *)dos_header+dos_header->e_lfanew); | ||
| 348 | if (nt_headers->Signature==IMAGE_NT_SIGNATURE && | ||
| 349 | me32.modBaseAddr!=(BYTE*)nt_headers->OptionalHeader.ImageBase) | ||
| 350 | OPENSSL_NONPIC_relocated=1; | ||
| 351 | } | ||
| 352 | break; | ||
| 353 | } | ||
| 354 | } while (Module32Next(hModuleSnap,&me32)); | ||
| 355 | |||
| 356 | if (hModuleSnap != INVALID_HANDLE_VALUE) | ||
| 357 | CloseHandle(hModuleSnap); | ||
| 358 | #endif | ||
| 359 | OPENSSL_cpuid_setup(); | ||
| 360 | return 0; | ||
| 361 | } | ||
| 362 | |||
| 363 | #else | ||
| 364 | |||
| 580 | #ifdef __CYGWIN__ | 365 | #ifdef __CYGWIN__ |
| 581 | /* pick DLL_[PROCESS|THREAD]_[ATTACH|DETACH] definitions */ | 366 | /* pick DLL_[PROCESS|THREAD]_[ATTACH|DETACH] definitions */ |
| 582 | #include <windows.h> | 367 | #include <windows.h> |
| @@ -620,6 +405,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, | |||
| 620 | } | 405 | } |
| 621 | #endif | 406 | #endif |
| 622 | 407 | ||
| 408 | #endif | ||
| 409 | |||
| 623 | #if defined(_WIN32) && !defined(__CYGWIN__) | 410 | #if defined(_WIN32) && !defined(__CYGWIN__) |
| 624 | #include <tchar.h> | 411 | #include <tchar.h> |
| 625 | 412 | ||
diff --git a/src/lib/libcrypto/cryptlib.h b/src/lib/libcrypto/cryptlib.h index 5ceaa964b5..fc249c57f3 100644 --- a/src/lib/libcrypto/cryptlib.h +++ b/src/lib/libcrypto/cryptlib.h | |||
| @@ -103,7 +103,6 @@ extern unsigned long OPENSSL_ia32cap_P; | |||
| 103 | void OPENSSL_showfatal(const char *,...); | 103 | void OPENSSL_showfatal(const char *,...); |
| 104 | void *OPENSSL_stderr(void); | 104 | void *OPENSSL_stderr(void); |
| 105 | extern int OPENSSL_NONPIC_relocated; | 105 | extern int OPENSSL_NONPIC_relocated; |
| 106 | int OPENSSL_isservice(void); | ||
| 107 | 106 | ||
| 108 | #ifdef __cplusplus | 107 | #ifdef __cplusplus |
| 109 | } | 108 | } |
diff --git a/src/lib/libcrypto/crypto.h b/src/lib/libcrypto/crypto.h index d2b5ffe332..0e4fb0723c 100644 --- a/src/lib/libcrypto/crypto.h +++ b/src/lib/libcrypto/crypto.h | |||
| @@ -219,7 +219,13 @@ typedef struct openssl_item_st | |||
| 219 | #define CRYPTO_LOCK_EC_PRE_COMP 36 | 219 | #define CRYPTO_LOCK_EC_PRE_COMP 36 |
| 220 | #define CRYPTO_LOCK_STORE 37 | 220 | #define CRYPTO_LOCK_STORE 37 |
| 221 | #define CRYPTO_LOCK_COMP 38 | 221 | #define CRYPTO_LOCK_COMP 38 |
| 222 | #ifndef OPENSSL_FIPS | ||
| 222 | #define CRYPTO_NUM_LOCKS 39 | 223 | #define CRYPTO_NUM_LOCKS 39 |
| 224 | #else | ||
| 225 | #define CRYPTO_LOCK_FIPS 39 | ||
| 226 | #define CRYPTO_LOCK_FIPS2 40 | ||
| 227 | #define CRYPTO_NUM_LOCKS 41 | ||
| 228 | #endif | ||
| 223 | 229 | ||
| 224 | #define CRYPTO_LOCK 1 | 230 | #define CRYPTO_LOCK 1 |
| 225 | #define CRYPTO_UNLOCK 2 | 231 | #define CRYPTO_UNLOCK 2 |
| @@ -341,14 +347,7 @@ DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS) | |||
| 341 | 347 | ||
| 342 | /* Set standard debugging functions (not done by default | 348 | /* Set standard debugging functions (not done by default |
| 343 | * unless CRYPTO_MDEBUG is defined) */ | 349 | * unless CRYPTO_MDEBUG is defined) */ |
| 344 | #define CRYPTO_malloc_debug_init() do {\ | 350 | void CRYPTO_malloc_debug_init(void); |
| 345 | CRYPTO_set_mem_debug_functions(\ | ||
| 346 | CRYPTO_dbg_malloc,\ | ||
| 347 | CRYPTO_dbg_realloc,\ | ||
| 348 | CRYPTO_dbg_free,\ | ||
| 349 | CRYPTO_dbg_set_options,\ | ||
| 350 | CRYPTO_dbg_get_options);\ | ||
| 351 | } while(0) | ||
| 352 | 351 | ||
| 353 | int CRYPTO_mem_ctrl(int mode); | 352 | int CRYPTO_mem_ctrl(int mode); |
| 354 | int CRYPTO_is_mem_check_on(void); | 353 | int CRYPTO_is_mem_check_on(void); |
| @@ -363,6 +362,7 @@ int CRYPTO_is_mem_check_on(void); | |||
| 363 | #define is_MemCheck_on() CRYPTO_is_mem_check_on() | 362 | #define is_MemCheck_on() CRYPTO_is_mem_check_on() |
| 364 | 363 | ||
| 365 | #define OPENSSL_malloc(num) CRYPTO_malloc((int)num,__FILE__,__LINE__) | 364 | #define OPENSSL_malloc(num) CRYPTO_malloc((int)num,__FILE__,__LINE__) |
| 365 | #define OPENSSL_strdup(str) CRYPTO_strdup((str),__FILE__,__LINE__) | ||
| 366 | #define OPENSSL_realloc(addr,num) \ | 366 | #define OPENSSL_realloc(addr,num) \ |
| 367 | CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__) | 367 | CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__) |
| 368 | #define OPENSSL_realloc_clean(addr,old_num,num) \ | 368 | #define OPENSSL_realloc_clean(addr,old_num,num) \ |
| @@ -427,6 +427,9 @@ const char *CRYPTO_get_lock_name(int type); | |||
| 427 | int CRYPTO_add_lock(int *pointer,int amount,int type, const char *file, | 427 | int CRYPTO_add_lock(int *pointer,int amount,int type, const char *file, |
| 428 | int line); | 428 | int line); |
| 429 | 429 | ||
| 430 | void int_CRYPTO_set_do_dynlock_callback( | ||
| 431 | void (*do_dynlock_cb)(int mode, int type, const char *file, int line)); | ||
| 432 | |||
| 430 | int CRYPTO_get_new_dynlockid(void); | 433 | int CRYPTO_get_new_dynlockid(void); |
| 431 | void CRYPTO_destroy_dynlockid(int i); | 434 | void CRYPTO_destroy_dynlockid(int i); |
| 432 | struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i); | 435 | struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i); |
| @@ -451,6 +454,10 @@ int CRYPTO_set_mem_debug_functions(void (*m)(void *,int,const char *,int,int), | |||
| 451 | void (*f)(void *,int), | 454 | void (*f)(void *,int), |
| 452 | void (*so)(long), | 455 | void (*so)(long), |
| 453 | long (*go)(void)); | 456 | long (*go)(void)); |
| 457 | void CRYPTO_set_mem_info_functions( | ||
| 458 | int (*push_info_fn)(const char *info, const char *file, int line), | ||
| 459 | int (*pop_info_fn)(void), | ||
| 460 | int (*remove_all_info_fn)(void)); | ||
| 454 | void CRYPTO_get_mem_functions(void *(**m)(size_t),void *(**r)(void *, size_t), void (**f)(void *)); | 461 | void CRYPTO_get_mem_functions(void *(**m)(size_t),void *(**r)(void *, size_t), void (**f)(void *)); |
| 455 | void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *)); | 462 | void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *)); |
| 456 | void CRYPTO_get_mem_ex_functions(void *(**m)(size_t,const char *,int), | 463 | void CRYPTO_get_mem_ex_functions(void *(**m)(size_t,const char *,int), |
| @@ -467,6 +474,7 @@ void CRYPTO_get_mem_debug_functions(void (**m)(void *,int,const char *,int,int), | |||
| 467 | void *CRYPTO_malloc_locked(int num, const char *file, int line); | 474 | void *CRYPTO_malloc_locked(int num, const char *file, int line); |
| 468 | void CRYPTO_free_locked(void *); | 475 | void CRYPTO_free_locked(void *); |
| 469 | void *CRYPTO_malloc(int num, const char *file, int line); | 476 | void *CRYPTO_malloc(int num, const char *file, int line); |
| 477 | char *CRYPTO_strdup(const char *str, const char *file, int line); | ||
| 470 | void CRYPTO_free(void *); | 478 | void CRYPTO_free(void *); |
| 471 | void *CRYPTO_realloc(void *addr,int num, const char *file, int line); | 479 | void *CRYPTO_realloc(void *addr,int num, const char *file, int line); |
| 472 | void *CRYPTO_realloc_clean(void *addr,int old_num,int num,const char *file, | 480 | void *CRYPTO_realloc_clean(void *addr,int old_num,int num,const char *file, |
| @@ -506,6 +514,9 @@ void CRYPTO_dbg_free(void *addr,int before_p); | |||
| 506 | void CRYPTO_dbg_set_options(long bits); | 514 | void CRYPTO_dbg_set_options(long bits); |
| 507 | long CRYPTO_dbg_get_options(void); | 515 | long CRYPTO_dbg_get_options(void); |
| 508 | 516 | ||
| 517 | int CRYPTO_dbg_push_info(const char *info, const char *file, int line); | ||
| 518 | int CRYPTO_dbg_pop_info(void); | ||
| 519 | int CRYPTO_dbg_remove_all_info(void); | ||
| 509 | 520 | ||
| 510 | #ifndef OPENSSL_NO_FP_API | 521 | #ifndef OPENSSL_NO_FP_API |
| 511 | void CRYPTO_mem_leaks_fp(FILE *); | 522 | void CRYPTO_mem_leaks_fp(FILE *); |
| @@ -521,6 +532,61 @@ void OpenSSLDie(const char *file,int line,const char *assertion); | |||
| 521 | 532 | ||
| 522 | unsigned long *OPENSSL_ia32cap_loc(void); | 533 | unsigned long *OPENSSL_ia32cap_loc(void); |
| 523 | #define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc())) | 534 | #define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc())) |
| 535 | int OPENSSL_isservice(void); | ||
| 536 | |||
| 537 | #ifdef OPENSSL_FIPS | ||
| 538 | #define FIPS_ERROR_IGNORED(alg) OpenSSLDie(__FILE__, __LINE__, \ | ||
| 539 | alg " previous FIPS forbidden algorithm error ignored"); | ||
| 540 | |||
| 541 | #define FIPS_BAD_ABORT(alg) OpenSSLDie(__FILE__, __LINE__, \ | ||
| 542 | #alg " Algorithm forbidden in FIPS mode"); | ||
| 543 | |||
| 544 | #ifdef OPENSSL_FIPS_STRICT | ||
| 545 | #define FIPS_BAD_ALGORITHM(alg) FIPS_BAD_ABORT(alg) | ||
| 546 | #else | ||
| 547 | #define FIPS_BAD_ALGORITHM(alg) \ | ||
| 548 | { \ | ||
| 549 | FIPSerr(FIPS_F_HASH_FINAL,FIPS_R_NON_FIPS_METHOD); \ | ||
| 550 | ERR_add_error_data(2, "Algorithm=", #alg); \ | ||
| 551 | return 0; \ | ||
| 552 | } | ||
| 553 | #endif | ||
| 554 | |||
| 555 | /* Low level digest API blocking macro */ | ||
| 556 | |||
| 557 | #define FIPS_NON_FIPS_MD_Init(alg) \ | ||
| 558 | int alg##_Init(alg##_CTX *c) \ | ||
| 559 | { \ | ||
| 560 | if (FIPS_mode()) \ | ||
| 561 | FIPS_BAD_ALGORITHM(alg) \ | ||
| 562 | return private_##alg##_Init(c); \ | ||
| 563 | } \ | ||
| 564 | int private_##alg##_Init(alg##_CTX *c) | ||
| 565 | |||
| 566 | /* For ciphers the API often varies from cipher to cipher and each needs to | ||
| 567 | * be treated as a special case. Variable key length ciphers (Blowfish, RC4, | ||
| 568 | * CAST) however are very similar and can use a blocking macro. | ||
| 569 | */ | ||
| 570 | |||
| 571 | #define FIPS_NON_FIPS_VCIPHER_Init(alg) \ | ||
| 572 | void alg##_set_key(alg##_KEY *key, int len, const unsigned char *data) \ | ||
| 573 | { \ | ||
| 574 | if (FIPS_mode()) \ | ||
| 575 | FIPS_BAD_ABORT(alg) \ | ||
| 576 | private_##alg##_set_key(key, len, data); \ | ||
| 577 | } \ | ||
| 578 | void private_##alg##_set_key(alg##_KEY *key, int len, \ | ||
| 579 | const unsigned char *data) | ||
| 580 | |||
| 581 | #else | ||
| 582 | |||
| 583 | #define FIPS_NON_FIPS_VCIPHER_Init(alg) \ | ||
| 584 | void alg##_set_key(alg##_KEY *key, int len, const unsigned char *data) | ||
| 585 | |||
| 586 | #define FIPS_NON_FIPS_MD_Init(alg) \ | ||
| 587 | int alg##_Init(alg##_CTX *c) | ||
| 588 | |||
| 589 | #endif /* def OPENSSL_FIPS */ | ||
| 524 | 590 | ||
| 525 | /* BEGIN ERROR CODES */ | 591 | /* BEGIN ERROR CODES */ |
| 526 | /* The following lines are auto generated by the script mkerr.pl. Any changes | 592 | /* The following lines are auto generated by the script mkerr.pl. Any changes |
| @@ -528,6 +594,9 @@ unsigned long *OPENSSL_ia32cap_loc(void); | |||
| 528 | */ | 594 | */ |
| 529 | void ERR_load_CRYPTO_strings(void); | 595 | void ERR_load_CRYPTO_strings(void); |
| 530 | 596 | ||
| 597 | #define OPENSSL_HAVE_INIT 1 | ||
| 598 | void OPENSSL_init(void); | ||
| 599 | |||
| 531 | /* Error codes for the CRYPTO functions. */ | 600 | /* Error codes for the CRYPTO functions. */ |
| 532 | 601 | ||
| 533 | /* Function codes. */ | 602 | /* Function codes. */ |
diff --git a/src/lib/libcrypto/des/des_enc.c b/src/lib/libcrypto/des/des_enc.c index 1c37ab96d3..cf71965aca 100644 --- a/src/lib/libcrypto/des/des_enc.c +++ b/src/lib/libcrypto/des/des_enc.c | |||
| @@ -289,6 +289,8 @@ void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, | |||
| 289 | 289 | ||
| 290 | #ifndef DES_DEFAULT_OPTIONS | 290 | #ifndef DES_DEFAULT_OPTIONS |
| 291 | 291 | ||
| 292 | #if !defined(OPENSSL_FIPS_DES_ASM) | ||
| 293 | |||
| 292 | #undef CBC_ENC_C__DONT_UPDATE_IV | 294 | #undef CBC_ENC_C__DONT_UPDATE_IV |
| 293 | #include "ncbc_enc.c" /* DES_ncbc_encrypt */ | 295 | #include "ncbc_enc.c" /* DES_ncbc_encrypt */ |
| 294 | 296 | ||
| @@ -404,4 +406,6 @@ void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, | |||
| 404 | tin[0]=tin[1]=0; | 406 | tin[0]=tin[1]=0; |
| 405 | } | 407 | } |
| 406 | 408 | ||
| 409 | #endif | ||
| 410 | |||
| 407 | #endif /* DES_DEFAULT_OPTIONS */ | 411 | #endif /* DES_DEFAULT_OPTIONS */ |
diff --git a/src/lib/libcrypto/des/ecb_enc.c b/src/lib/libcrypto/des/ecb_enc.c index 00d5b91e8c..75ae6cf8bb 100644 --- a/src/lib/libcrypto/des/ecb_enc.c +++ b/src/lib/libcrypto/des/ecb_enc.c | |||
| @@ -57,54 +57,7 @@ | |||
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #include "des_locl.h" | 59 | #include "des_locl.h" |
| 60 | #include "des_ver.h" | ||
| 61 | #include "spr.h" | 60 | #include "spr.h" |
| 62 | #include <openssl/opensslv.h> | ||
| 63 | #include <openssl/bio.h> | ||
| 64 | |||
| 65 | OPENSSL_GLOBAL const char libdes_version[]="libdes" OPENSSL_VERSION_PTEXT; | ||
| 66 | OPENSSL_GLOBAL const char DES_version[]="DES" OPENSSL_VERSION_PTEXT; | ||
| 67 | |||
| 68 | const char *DES_options(void) | ||
| 69 | { | ||
| 70 | static int init=1; | ||
| 71 | static char buf[32]; | ||
| 72 | |||
| 73 | if (init) | ||
| 74 | { | ||
| 75 | const char *ptr,*unroll,*risc,*size; | ||
| 76 | |||
| 77 | #ifdef DES_PTR | ||
| 78 | ptr="ptr"; | ||
| 79 | #else | ||
| 80 | ptr="idx"; | ||
| 81 | #endif | ||
| 82 | #if defined(DES_RISC1) || defined(DES_RISC2) | ||
| 83 | #ifdef DES_RISC1 | ||
| 84 | risc="risc1"; | ||
| 85 | #endif | ||
| 86 | #ifdef DES_RISC2 | ||
| 87 | risc="risc2"; | ||
| 88 | #endif | ||
| 89 | #else | ||
| 90 | risc="cisc"; | ||
| 91 | #endif | ||
| 92 | #ifdef DES_UNROLL | ||
| 93 | unroll="16"; | ||
| 94 | #else | ||
| 95 | unroll="4"; | ||
| 96 | #endif | ||
| 97 | if (sizeof(DES_LONG) != sizeof(long)) | ||
| 98 | size="int"; | ||
| 99 | else | ||
| 100 | size="long"; | ||
| 101 | BIO_snprintf(buf,sizeof buf,"des(%s,%s,%s,%s)",ptr,risc,unroll, | ||
| 102 | size); | ||
| 103 | init=0; | ||
| 104 | } | ||
| 105 | return(buf); | ||
| 106 | } | ||
| 107 | |||
| 108 | 61 | ||
| 109 | void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, | 62 | void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, |
| 110 | DES_key_schedule *ks, int enc) | 63 | DES_key_schedule *ks, int enc) |
diff --git a/src/lib/libcrypto/des/enc_read.c b/src/lib/libcrypto/des/enc_read.c index c70fb686b8..e7da2ec66b 100644 --- a/src/lib/libcrypto/des/enc_read.c +++ b/src/lib/libcrypto/des/enc_read.c | |||
| @@ -147,7 +147,11 @@ int DES_enc_read(int fd, void *buf, int len, DES_key_schedule *sched, | |||
| 147 | /* first - get the length */ | 147 | /* first - get the length */ |
| 148 | while (net_num < HDRSIZE) | 148 | while (net_num < HDRSIZE) |
| 149 | { | 149 | { |
| 150 | #ifndef _WIN32 | ||
| 150 | i=read(fd,(void *)&(net[net_num]),HDRSIZE-net_num); | 151 | i=read(fd,(void *)&(net[net_num]),HDRSIZE-net_num); |
| 152 | #else | ||
| 153 | i=_read(fd,(void *)&(net[net_num]),HDRSIZE-net_num); | ||
| 154 | #endif | ||
| 151 | #ifdef EINTR | 155 | #ifdef EINTR |
| 152 | if ((i == -1) && (errno == EINTR)) continue; | 156 | if ((i == -1) && (errno == EINTR)) continue; |
| 153 | #endif | 157 | #endif |
diff --git a/src/lib/libcrypto/des/enc_writ.c b/src/lib/libcrypto/des/enc_writ.c index af5b8c2349..c2f032c9a6 100644 --- a/src/lib/libcrypto/des/enc_writ.c +++ b/src/lib/libcrypto/des/enc_writ.c | |||
| @@ -153,7 +153,11 @@ int DES_enc_write(int fd, const void *_buf, int len, | |||
| 153 | { | 153 | { |
| 154 | /* eay 26/08/92 I was not doing writing from where we | 154 | /* eay 26/08/92 I was not doing writing from where we |
| 155 | * got up to. */ | 155 | * got up to. */ |
| 156 | #ifndef _WIN32 | ||
| 156 | i=write(fd,(void *)&(outbuf[j]),outnum-j); | 157 | i=write(fd,(void *)&(outbuf[j]),outnum-j); |
| 158 | #else | ||
| 159 | i=_write(fd,(void *)&(outbuf[j]),outnum-j); | ||
| 160 | #endif | ||
| 157 | if (i == -1) | 161 | if (i == -1) |
| 158 | { | 162 | { |
| 159 | #ifdef EINTR | 163 | #ifdef EINTR |
diff --git a/src/lib/libcrypto/des/set_key.c b/src/lib/libcrypto/des/set_key.c index a43ef3c881..c0806d593c 100644 --- a/src/lib/libcrypto/des/set_key.c +++ b/src/lib/libcrypto/des/set_key.c | |||
| @@ -64,6 +64,10 @@ | |||
| 64 | * 1.0 First working version | 64 | * 1.0 First working version |
| 65 | */ | 65 | */ |
| 66 | #include "des_locl.h" | 66 | #include "des_locl.h" |
| 67 | #ifdef OPENSSL_FIPS | ||
| 68 | #include <openssl/fips.h> | ||
| 69 | #endif | ||
| 70 | |||
| 67 | 71 | ||
| 68 | OPENSSL_IMPLEMENT_GLOBAL(int,DES_check_key); /* defaults to false */ | 72 | OPENSSL_IMPLEMENT_GLOBAL(int,DES_check_key); /* defaults to false */ |
| 69 | 73 | ||
| @@ -349,6 +353,10 @@ void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule) | |||
| 349 | k = &schedule->ks->deslong[0]; | 353 | k = &schedule->ks->deslong[0]; |
| 350 | in = &(*key)[0]; | 354 | in = &(*key)[0]; |
| 351 | 355 | ||
| 356 | #ifdef OPENSSL_FIPS | ||
| 357 | FIPS_selftest_check(); | ||
| 358 | #endif | ||
| 359 | |||
| 352 | c2l(in,c); | 360 | c2l(in,c); |
| 353 | c2l(in,d); | 361 | c2l(in,d); |
| 354 | 362 | ||
| @@ -405,3 +413,4 @@ void des_fixup_key_parity(des_cblock *key) | |||
| 405 | des_set_odd_parity(key); | 413 | des_set_odd_parity(key); |
| 406 | } | 414 | } |
| 407 | */ | 415 | */ |
| 416 | |||
diff --git a/src/lib/libcrypto/dh/dh.h b/src/lib/libcrypto/dh/dh.h index ccdf35ae1c..10475ac4b3 100644 --- a/src/lib/libcrypto/dh/dh.h +++ b/src/lib/libcrypto/dh/dh.h | |||
| @@ -77,6 +77,8 @@ | |||
| 77 | # define OPENSSL_DH_MAX_MODULUS_BITS 10000 | 77 | # define OPENSSL_DH_MAX_MODULUS_BITS 10000 |
| 78 | #endif | 78 | #endif |
| 79 | 79 | ||
| 80 | #define OPENSSL_DH_FIPS_MIN_MODULUS_BITS 1024 | ||
| 81 | |||
| 80 | #define DH_FLAG_CACHE_MONT_P 0x01 | 82 | #define DH_FLAG_CACHE_MONT_P 0x01 |
| 81 | #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH | 83 | #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH |
| 82 | * implementation now uses constant time | 84 | * implementation now uses constant time |
| @@ -167,6 +169,11 @@ struct dh_st | |||
| 167 | 169 | ||
| 168 | const DH_METHOD *DH_OpenSSL(void); | 170 | const DH_METHOD *DH_OpenSSL(void); |
| 169 | 171 | ||
| 172 | #ifdef OPENSSL_FIPS | ||
| 173 | DH * FIPS_dh_new(void); | ||
| 174 | void FIPS_dh_free(DH *dh); | ||
| 175 | #endif | ||
| 176 | |||
| 170 | void DH_set_default_method(const DH_METHOD *meth); | 177 | void DH_set_default_method(const DH_METHOD *meth); |
| 171 | const DH_METHOD *DH_get_default_method(void); | 178 | const DH_METHOD *DH_get_default_method(void); |
| 172 | int DH_set_method(DH *dh, const DH_METHOD *meth); | 179 | int DH_set_method(DH *dh, const DH_METHOD *meth); |
| @@ -218,6 +225,9 @@ void ERR_load_DH_strings(void); | |||
| 218 | #define DH_F_DHPARAMS_PRINT 100 | 225 | #define DH_F_DHPARAMS_PRINT 100 |
| 219 | #define DH_F_DHPARAMS_PRINT_FP 101 | 226 | #define DH_F_DHPARAMS_PRINT_FP 101 |
| 220 | #define DH_F_DH_BUILTIN_GENPARAMS 106 | 227 | #define DH_F_DH_BUILTIN_GENPARAMS 106 |
| 228 | #define DH_F_DH_COMPUTE_KEY 107 | ||
| 229 | #define DH_F_DH_GENERATE_KEY 108 | ||
| 230 | #define DH_F_DH_GENERATE_PARAMETERS 109 | ||
| 221 | #define DH_F_DH_NEW_METHOD 105 | 231 | #define DH_F_DH_NEW_METHOD 105 |
| 222 | #define DH_F_GENERATE_KEY 103 | 232 | #define DH_F_GENERATE_KEY 103 |
| 223 | #define DH_F_GENERATE_PARAMETERS 104 | 233 | #define DH_F_GENERATE_PARAMETERS 104 |
| @@ -225,6 +235,7 @@ void ERR_load_DH_strings(void); | |||
| 225 | /* Reason codes. */ | 235 | /* Reason codes. */ |
| 226 | #define DH_R_BAD_GENERATOR 101 | 236 | #define DH_R_BAD_GENERATOR 101 |
| 227 | #define DH_R_INVALID_PUBKEY 102 | 237 | #define DH_R_INVALID_PUBKEY 102 |
| 238 | #define DH_R_KEY_SIZE_TOO_SMALL 104 | ||
| 228 | #define DH_R_MODULUS_TOO_LARGE 103 | 239 | #define DH_R_MODULUS_TOO_LARGE 103 |
| 229 | #define DH_R_NO_PRIVATE_VALUE 100 | 240 | #define DH_R_NO_PRIVATE_VALUE 100 |
| 230 | 241 | ||
diff --git a/src/lib/libcrypto/dh/dh_asn1.c b/src/lib/libcrypto/dh/dh_asn1.c index 769b5b68c5..76740af2bd 100644 --- a/src/lib/libcrypto/dh/dh_asn1.c +++ b/src/lib/libcrypto/dh/dh_asn1.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* dh_asn1.c */ | 1 | /* dh_asn1.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/dh/dh_check.c b/src/lib/libcrypto/dh/dh_check.c index b846913004..316cb9221d 100644 --- a/src/lib/libcrypto/dh/dh_check.c +++ b/src/lib/libcrypto/dh/dh_check.c | |||
| @@ -70,6 +70,8 @@ | |||
| 70 | * should hold. | 70 | * should hold. |
| 71 | */ | 71 | */ |
| 72 | 72 | ||
| 73 | #ifndef OPENSSL_FIPS | ||
| 74 | |||
| 73 | int DH_check(const DH *dh, int *ret) | 75 | int DH_check(const DH *dh, int *ret) |
| 74 | { | 76 | { |
| 75 | int ok=0; | 77 | int ok=0; |
| @@ -140,3 +142,5 @@ err: | |||
| 140 | if (q != NULL) BN_free(q); | 142 | if (q != NULL) BN_free(q); |
| 141 | return(ok); | 143 | return(ok); |
| 142 | } | 144 | } |
| 145 | |||
| 146 | #endif | ||
diff --git a/src/lib/libcrypto/dh/dh_err.c b/src/lib/libcrypto/dh/dh_err.c index a2d8196ecb..13263c81c1 100644 --- a/src/lib/libcrypto/dh/dh_err.c +++ b/src/lib/libcrypto/dh/dh_err.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* crypto/dh/dh_err.c */ | 1 | /* crypto/dh/dh_err.c */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that the following conditions | 6 | * modification, are permitted provided that the following conditions |
| @@ -74,6 +74,9 @@ static ERR_STRING_DATA DH_str_functs[]= | |||
| 74 | {ERR_FUNC(DH_F_DHPARAMS_PRINT), "DHparams_print"}, | 74 | {ERR_FUNC(DH_F_DHPARAMS_PRINT), "DHparams_print"}, |
| 75 | {ERR_FUNC(DH_F_DHPARAMS_PRINT_FP), "DHparams_print_fp"}, | 75 | {ERR_FUNC(DH_F_DHPARAMS_PRINT_FP), "DHparams_print_fp"}, |
| 76 | {ERR_FUNC(DH_F_DH_BUILTIN_GENPARAMS), "DH_BUILTIN_GENPARAMS"}, | 76 | {ERR_FUNC(DH_F_DH_BUILTIN_GENPARAMS), "DH_BUILTIN_GENPARAMS"}, |
| 77 | {ERR_FUNC(DH_F_DH_COMPUTE_KEY), "DH_compute_key"}, | ||
| 78 | {ERR_FUNC(DH_F_DH_GENERATE_KEY), "DH_generate_key"}, | ||
| 79 | {ERR_FUNC(DH_F_DH_GENERATE_PARAMETERS), "DH_generate_parameters"}, | ||
| 77 | {ERR_FUNC(DH_F_DH_NEW_METHOD), "DH_new_method"}, | 80 | {ERR_FUNC(DH_F_DH_NEW_METHOD), "DH_new_method"}, |
| 78 | {ERR_FUNC(DH_F_GENERATE_KEY), "GENERATE_KEY"}, | 81 | {ERR_FUNC(DH_F_GENERATE_KEY), "GENERATE_KEY"}, |
| 79 | {ERR_FUNC(DH_F_GENERATE_PARAMETERS), "GENERATE_PARAMETERS"}, | 82 | {ERR_FUNC(DH_F_GENERATE_PARAMETERS), "GENERATE_PARAMETERS"}, |
| @@ -84,6 +87,7 @@ static ERR_STRING_DATA DH_str_reasons[]= | |||
| 84 | { | 87 | { |
| 85 | {ERR_REASON(DH_R_BAD_GENERATOR) ,"bad generator"}, | 88 | {ERR_REASON(DH_R_BAD_GENERATOR) ,"bad generator"}, |
| 86 | {ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"}, | 89 | {ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"}, |
| 90 | {ERR_REASON(DH_R_KEY_SIZE_TOO_SMALL) ,"key size too small"}, | ||
| 87 | {ERR_REASON(DH_R_MODULUS_TOO_LARGE) ,"modulus too large"}, | 91 | {ERR_REASON(DH_R_MODULUS_TOO_LARGE) ,"modulus too large"}, |
| 88 | {ERR_REASON(DH_R_NO_PRIVATE_VALUE) ,"no private value"}, | 92 | {ERR_REASON(DH_R_NO_PRIVATE_VALUE) ,"no private value"}, |
| 89 | {0,NULL} | 93 | {0,NULL} |
diff --git a/src/lib/libcrypto/dh/dh_gen.c b/src/lib/libcrypto/dh/dh_gen.c index cfd5b11868..999e1deb40 100644 --- a/src/lib/libcrypto/dh/dh_gen.c +++ b/src/lib/libcrypto/dh/dh_gen.c | |||
| @@ -66,6 +66,8 @@ | |||
| 66 | #include <openssl/bn.h> | 66 | #include <openssl/bn.h> |
| 67 | #include <openssl/dh.h> | 67 | #include <openssl/dh.h> |
| 68 | 68 | ||
| 69 | #ifndef OPENSSL_FIPS | ||
| 70 | |||
| 69 | static int dh_builtin_genparams(DH *ret, int prime_len, int generator, BN_GENCB *cb); | 71 | static int dh_builtin_genparams(DH *ret, int prime_len, int generator, BN_GENCB *cb); |
| 70 | 72 | ||
| 71 | int DH_generate_parameters_ex(DH *ret, int prime_len, int generator, BN_GENCB *cb) | 73 | int DH_generate_parameters_ex(DH *ret, int prime_len, int generator, BN_GENCB *cb) |
| @@ -173,3 +175,5 @@ err: | |||
| 173 | } | 175 | } |
| 174 | return ok; | 176 | return ok; |
| 175 | } | 177 | } |
| 178 | |||
| 179 | #endif | ||
diff --git a/src/lib/libcrypto/dh/dh_key.c b/src/lib/libcrypto/dh/dh_key.c index e7db440342..79dd331863 100644 --- a/src/lib/libcrypto/dh/dh_key.c +++ b/src/lib/libcrypto/dh/dh_key.c | |||
| @@ -62,6 +62,8 @@ | |||
| 62 | #include <openssl/rand.h> | 62 | #include <openssl/rand.h> |
| 63 | #include <openssl/dh.h> | 63 | #include <openssl/dh.h> |
| 64 | 64 | ||
| 65 | #ifndef OPENSSL_FIPS | ||
| 66 | |||
| 65 | static int generate_key(DH *dh); | 67 | static int generate_key(DH *dh); |
| 66 | static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh); | 68 | static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh); |
| 67 | static int dh_bn_mod_exp(const DH *dh, BIGNUM *r, | 69 | static int dh_bn_mod_exp(const DH *dh, BIGNUM *r, |
| @@ -261,3 +263,5 @@ static int dh_finish(DH *dh) | |||
| 261 | BN_MONT_CTX_free(dh->method_mont_p); | 263 | BN_MONT_CTX_free(dh->method_mont_p); |
| 262 | return(1); | 264 | return(1); |
| 263 | } | 265 | } |
| 266 | |||
| 267 | #endif | ||
diff --git a/src/lib/libcrypto/dsa/dsa.h b/src/lib/libcrypto/dsa/dsa.h index 3a8fe5b56b..702c50d6dc 100644 --- a/src/lib/libcrypto/dsa/dsa.h +++ b/src/lib/libcrypto/dsa/dsa.h | |||
| @@ -88,6 +88,8 @@ | |||
| 88 | # define OPENSSL_DSA_MAX_MODULUS_BITS 10000 | 88 | # define OPENSSL_DSA_MAX_MODULUS_BITS 10000 |
| 89 | #endif | 89 | #endif |
| 90 | 90 | ||
| 91 | #define OPENSSL_DSA_FIPS_MIN_MODULUS_BITS 1024 | ||
| 92 | |||
| 91 | #define DSA_FLAG_CACHE_MONT_P 0x01 | 93 | #define DSA_FLAG_CACHE_MONT_P 0x01 |
| 92 | #define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA | 94 | #define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA |
| 93 | * implementation now uses constant time | 95 | * implementation now uses constant time |
| @@ -97,6 +99,25 @@ | |||
| 97 | * be used for all exponents. | 99 | * be used for all exponents. |
| 98 | */ | 100 | */ |
| 99 | 101 | ||
| 102 | /* If this flag is set the DSA method is FIPS compliant and can be used | ||
| 103 | * in FIPS mode. This is set in the validated module method. If an | ||
| 104 | * application sets this flag in its own methods it is its reposibility | ||
| 105 | * to ensure the result is compliant. | ||
| 106 | */ | ||
| 107 | |||
| 108 | #define DSA_FLAG_FIPS_METHOD 0x0400 | ||
| 109 | |||
| 110 | /* If this flag is set the operations normally disabled in FIPS mode are | ||
| 111 | * permitted it is then the applications responsibility to ensure that the | ||
| 112 | * usage is compliant. | ||
| 113 | */ | ||
| 114 | |||
| 115 | #define DSA_FLAG_NON_FIPS_ALLOW 0x0400 | ||
| 116 | |||
| 117 | #ifdef OPENSSL_FIPS | ||
| 118 | #define FIPS_DSA_SIZE_T int | ||
| 119 | #endif | ||
| 120 | |||
| 100 | #ifdef __cplusplus | 121 | #ifdef __cplusplus |
| 101 | extern "C" { | 122 | extern "C" { |
| 102 | #endif | 123 | #endif |
| @@ -189,6 +210,11 @@ void DSA_set_default_method(const DSA_METHOD *); | |||
| 189 | const DSA_METHOD *DSA_get_default_method(void); | 210 | const DSA_METHOD *DSA_get_default_method(void); |
| 190 | int DSA_set_method(DSA *dsa, const DSA_METHOD *); | 211 | int DSA_set_method(DSA *dsa, const DSA_METHOD *); |
| 191 | 212 | ||
| 213 | #ifdef OPENSSL_FIPS | ||
| 214 | DSA * FIPS_dsa_new(void); | ||
| 215 | void FIPS_dsa_free (DSA *r); | ||
| 216 | #endif | ||
| 217 | |||
| 192 | DSA * DSA_new(void); | 218 | DSA * DSA_new(void); |
| 193 | DSA * DSA_new_method(ENGINE *engine); | 219 | DSA * DSA_new_method(ENGINE *engine); |
| 194 | void DSA_free (DSA *r); | 220 | void DSA_free (DSA *r); |
| @@ -249,6 +275,11 @@ int DSA_print_fp(FILE *bp, const DSA *x, int off); | |||
| 249 | DH *DSA_dup_DH(const DSA *r); | 275 | DH *DSA_dup_DH(const DSA *r); |
| 250 | #endif | 276 | #endif |
| 251 | 277 | ||
| 278 | #ifdef OPENSSL_FIPS | ||
| 279 | int FIPS_dsa_sig_encode(unsigned char *out, DSA_SIG *sig); | ||
| 280 | int FIPS_dsa_sig_decode(DSA_SIG *sig, const unsigned char *in, int inlen); | ||
| 281 | #endif | ||
| 282 | |||
| 252 | /* BEGIN ERROR CODES */ | 283 | /* BEGIN ERROR CODES */ |
| 253 | /* The following lines are auto generated by the script mkerr.pl. Any changes | 284 | /* The following lines are auto generated by the script mkerr.pl. Any changes |
| 254 | * made after this point may be overwritten when the script is next run. | 285 | * made after this point may be overwritten when the script is next run. |
| @@ -261,11 +292,16 @@ void ERR_load_DSA_strings(void); | |||
| 261 | #define DSA_F_D2I_DSA_SIG 110 | 292 | #define DSA_F_D2I_DSA_SIG 110 |
| 262 | #define DSA_F_DSAPARAMS_PRINT 100 | 293 | #define DSA_F_DSAPARAMS_PRINT 100 |
| 263 | #define DSA_F_DSAPARAMS_PRINT_FP 101 | 294 | #define DSA_F_DSAPARAMS_PRINT_FP 101 |
| 295 | #define DSA_F_DSA_BUILTIN_KEYGEN 119 | ||
| 296 | #define DSA_F_DSA_BUILTIN_PARAMGEN 118 | ||
| 264 | #define DSA_F_DSA_DO_SIGN 112 | 297 | #define DSA_F_DSA_DO_SIGN 112 |
| 265 | #define DSA_F_DSA_DO_VERIFY 113 | 298 | #define DSA_F_DSA_DO_VERIFY 113 |
| 299 | #define DSA_F_DSA_GENERATE_PARAMETERS 117 | ||
| 266 | #define DSA_F_DSA_NEW_METHOD 103 | 300 | #define DSA_F_DSA_NEW_METHOD 103 |
| 267 | #define DSA_F_DSA_PRINT 104 | 301 | #define DSA_F_DSA_PRINT 104 |
| 268 | #define DSA_F_DSA_PRINT_FP 105 | 302 | #define DSA_F_DSA_PRINT_FP 105 |
| 303 | #define DSA_F_DSA_SET_DEFAULT_METHOD 115 | ||
| 304 | #define DSA_F_DSA_SET_METHOD 116 | ||
| 269 | #define DSA_F_DSA_SIGN 106 | 305 | #define DSA_F_DSA_SIGN 106 |
| 270 | #define DSA_F_DSA_SIGN_SETUP 107 | 306 | #define DSA_F_DSA_SIGN_SETUP 107 |
| 271 | #define DSA_F_DSA_SIG_NEW 109 | 307 | #define DSA_F_DSA_SIG_NEW 109 |
| @@ -276,8 +312,11 @@ void ERR_load_DSA_strings(void); | |||
| 276 | /* Reason codes. */ | 312 | /* Reason codes. */ |
| 277 | #define DSA_R_BAD_Q_VALUE 102 | 313 | #define DSA_R_BAD_Q_VALUE 102 |
| 278 | #define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 | 314 | #define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 |
| 315 | #define DSA_R_KEY_SIZE_TOO_SMALL 106 | ||
| 279 | #define DSA_R_MISSING_PARAMETERS 101 | 316 | #define DSA_R_MISSING_PARAMETERS 101 |
| 280 | #define DSA_R_MODULUS_TOO_LARGE 103 | 317 | #define DSA_R_MODULUS_TOO_LARGE 103 |
| 318 | #define DSA_R_NON_FIPS_METHOD 104 | ||
| 319 | #define DSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE 105 | ||
| 281 | 320 | ||
| 282 | #ifdef __cplusplus | 321 | #ifdef __cplusplus |
| 283 | } | 322 | } |
diff --git a/src/lib/libcrypto/dsa/dsa_asn1.c b/src/lib/libcrypto/dsa/dsa_asn1.c index 23fce555aa..0645facb4b 100644 --- a/src/lib/libcrypto/dsa/dsa_asn1.c +++ b/src/lib/libcrypto/dsa/dsa_asn1.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* dsa_asn1.c */ | 1 | /* dsa_asn1.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -61,6 +61,11 @@ | |||
| 61 | #include <openssl/dsa.h> | 61 | #include <openssl/dsa.h> |
| 62 | #include <openssl/asn1.h> | 62 | #include <openssl/asn1.h> |
| 63 | #include <openssl/asn1t.h> | 63 | #include <openssl/asn1t.h> |
| 64 | #include <openssl/bn.h> | ||
| 65 | #ifdef OPENSSL_FIPS | ||
| 66 | #include <openssl/fips.h> | ||
| 67 | #endif | ||
| 68 | |||
| 64 | 69 | ||
| 65 | /* Override the default new methods */ | 70 | /* Override the default new methods */ |
| 66 | static int sig_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) | 71 | static int sig_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) |
| @@ -83,7 +88,7 @@ ASN1_SEQUENCE_cb(DSA_SIG, sig_cb) = { | |||
| 83 | ASN1_SIMPLE(DSA_SIG, s, CBIGNUM) | 88 | ASN1_SIMPLE(DSA_SIG, s, CBIGNUM) |
| 84 | } ASN1_SEQUENCE_END_cb(DSA_SIG, DSA_SIG) | 89 | } ASN1_SEQUENCE_END_cb(DSA_SIG, DSA_SIG) |
| 85 | 90 | ||
| 86 | IMPLEMENT_ASN1_FUNCTIONS_const(DSA_SIG) | 91 | IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA_SIG,DSA_SIG,DSA_SIG) |
| 87 | 92 | ||
| 88 | /* Override the default free and new methods */ | 93 | /* Override the default free and new methods */ |
| 89 | static int dsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) | 94 | static int dsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) |
| @@ -138,3 +143,76 @@ ASN1_CHOICE_cb(DSAPublicKey, dsa_cb) = { | |||
| 138 | } ASN1_CHOICE_END_cb(DSA, DSAPublicKey, write_params) | 143 | } ASN1_CHOICE_END_cb(DSA, DSAPublicKey, write_params) |
| 139 | 144 | ||
| 140 | IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAPublicKey, DSAPublicKey) | 145 | IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAPublicKey, DSAPublicKey) |
| 146 | |||
| 147 | int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig, | ||
| 148 | unsigned int *siglen, DSA *dsa) | ||
| 149 | { | ||
| 150 | DSA_SIG *s; | ||
| 151 | #ifdef OPENSSL_FIPS | ||
| 152 | if(FIPS_mode() && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW)) | ||
| 153 | { | ||
| 154 | DSAerr(DSA_F_DSA_SIGN, DSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); | ||
| 155 | return 0; | ||
| 156 | } | ||
| 157 | #endif | ||
| 158 | s=DSA_do_sign(dgst,dlen,dsa); | ||
| 159 | if (s == NULL) | ||
| 160 | { | ||
| 161 | *siglen=0; | ||
| 162 | return(0); | ||
| 163 | } | ||
| 164 | *siglen=i2d_DSA_SIG(s,&sig); | ||
| 165 | DSA_SIG_free(s); | ||
| 166 | return(1); | ||
| 167 | } | ||
| 168 | |||
| 169 | int DSA_size(const DSA *r) | ||
| 170 | { | ||
| 171 | int ret,i; | ||
| 172 | ASN1_INTEGER bs; | ||
| 173 | unsigned char buf[4]; /* 4 bytes looks really small. | ||
| 174 | However, i2d_ASN1_INTEGER() will not look | ||
| 175 | beyond the first byte, as long as the second | ||
| 176 | parameter is NULL. */ | ||
| 177 | |||
| 178 | i=BN_num_bits(r->q); | ||
| 179 | bs.length=(i+7)/8; | ||
| 180 | bs.data=buf; | ||
| 181 | bs.type=V_ASN1_INTEGER; | ||
| 182 | /* If the top bit is set the asn1 encoding is 1 larger. */ | ||
| 183 | buf[0]=0xff; | ||
| 184 | |||
| 185 | i=i2d_ASN1_INTEGER(&bs,NULL); | ||
| 186 | i+=i; /* r and s */ | ||
| 187 | ret=ASN1_object_size(1,i,V_ASN1_SEQUENCE); | ||
| 188 | return(ret); | ||
| 189 | } | ||
| 190 | |||
| 191 | /* data has already been hashed (probably with SHA or SHA-1). */ | ||
| 192 | /* returns | ||
| 193 | * 1: correct signature | ||
| 194 | * 0: incorrect signature | ||
| 195 | * -1: error | ||
| 196 | */ | ||
| 197 | int DSA_verify(int type, const unsigned char *dgst, int dgst_len, | ||
| 198 | const unsigned char *sigbuf, int siglen, DSA *dsa) | ||
| 199 | { | ||
| 200 | DSA_SIG *s; | ||
| 201 | int ret=-1; | ||
| 202 | #ifdef OPENSSL_FIPS | ||
| 203 | if(FIPS_mode() && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW)) | ||
| 204 | { | ||
| 205 | DSAerr(DSA_F_DSA_VERIFY, DSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); | ||
| 206 | return 0; | ||
| 207 | } | ||
| 208 | #endif | ||
| 209 | |||
| 210 | s = DSA_SIG_new(); | ||
| 211 | if (s == NULL) return(ret); | ||
| 212 | if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err; | ||
| 213 | ret=DSA_do_verify(dgst,dgst_len,s,dsa); | ||
| 214 | err: | ||
| 215 | DSA_SIG_free(s); | ||
| 216 | return(ret); | ||
| 217 | } | ||
| 218 | |||
diff --git a/src/lib/libcrypto/dsa/dsa_err.c b/src/lib/libcrypto/dsa/dsa_err.c index 768711994b..872839af94 100644 --- a/src/lib/libcrypto/dsa/dsa_err.c +++ b/src/lib/libcrypto/dsa/dsa_err.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* crypto/dsa/dsa_err.c */ | 1 | /* crypto/dsa/dsa_err.c */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that the following conditions | 6 | * modification, are permitted provided that the following conditions |
| @@ -73,11 +73,16 @@ static ERR_STRING_DATA DSA_str_functs[]= | |||
| 73 | {ERR_FUNC(DSA_F_D2I_DSA_SIG), "d2i_DSA_SIG"}, | 73 | {ERR_FUNC(DSA_F_D2I_DSA_SIG), "d2i_DSA_SIG"}, |
| 74 | {ERR_FUNC(DSA_F_DSAPARAMS_PRINT), "DSAparams_print"}, | 74 | {ERR_FUNC(DSA_F_DSAPARAMS_PRINT), "DSAparams_print"}, |
| 75 | {ERR_FUNC(DSA_F_DSAPARAMS_PRINT_FP), "DSAparams_print_fp"}, | 75 | {ERR_FUNC(DSA_F_DSAPARAMS_PRINT_FP), "DSAparams_print_fp"}, |
| 76 | {ERR_FUNC(DSA_F_DSA_BUILTIN_KEYGEN), "DSA_BUILTIN_KEYGEN"}, | ||
| 77 | {ERR_FUNC(DSA_F_DSA_BUILTIN_PARAMGEN), "DSA_BUILTIN_PARAMGEN"}, | ||
| 76 | {ERR_FUNC(DSA_F_DSA_DO_SIGN), "DSA_do_sign"}, | 78 | {ERR_FUNC(DSA_F_DSA_DO_SIGN), "DSA_do_sign"}, |
| 77 | {ERR_FUNC(DSA_F_DSA_DO_VERIFY), "DSA_do_verify"}, | 79 | {ERR_FUNC(DSA_F_DSA_DO_VERIFY), "DSA_do_verify"}, |
| 80 | {ERR_FUNC(DSA_F_DSA_GENERATE_PARAMETERS), "DSA_generate_parameters"}, | ||
| 78 | {ERR_FUNC(DSA_F_DSA_NEW_METHOD), "DSA_new_method"}, | 81 | {ERR_FUNC(DSA_F_DSA_NEW_METHOD), "DSA_new_method"}, |
| 79 | {ERR_FUNC(DSA_F_DSA_PRINT), "DSA_print"}, | 82 | {ERR_FUNC(DSA_F_DSA_PRINT), "DSA_print"}, |
| 80 | {ERR_FUNC(DSA_F_DSA_PRINT_FP), "DSA_print_fp"}, | 83 | {ERR_FUNC(DSA_F_DSA_PRINT_FP), "DSA_print_fp"}, |
| 84 | {ERR_FUNC(DSA_F_DSA_SET_DEFAULT_METHOD), "DSA_set_default_method"}, | ||
| 85 | {ERR_FUNC(DSA_F_DSA_SET_METHOD), "DSA_set_method"}, | ||
| 81 | {ERR_FUNC(DSA_F_DSA_SIGN), "DSA_sign"}, | 86 | {ERR_FUNC(DSA_F_DSA_SIGN), "DSA_sign"}, |
| 82 | {ERR_FUNC(DSA_F_DSA_SIGN_SETUP), "DSA_sign_setup"}, | 87 | {ERR_FUNC(DSA_F_DSA_SIGN_SETUP), "DSA_sign_setup"}, |
| 83 | {ERR_FUNC(DSA_F_DSA_SIG_NEW), "DSA_SIG_new"}, | 88 | {ERR_FUNC(DSA_F_DSA_SIG_NEW), "DSA_SIG_new"}, |
| @@ -91,8 +96,11 @@ static ERR_STRING_DATA DSA_str_reasons[]= | |||
| 91 | { | 96 | { |
| 92 | {ERR_REASON(DSA_R_BAD_Q_VALUE) ,"bad q value"}, | 97 | {ERR_REASON(DSA_R_BAD_Q_VALUE) ,"bad q value"}, |
| 93 | {ERR_REASON(DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE),"data too large for key size"}, | 98 | {ERR_REASON(DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE),"data too large for key size"}, |
| 99 | {ERR_REASON(DSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"}, | ||
| 94 | {ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"}, | 100 | {ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"}, |
| 95 | {ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, | 101 | {ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, |
| 102 | {ERR_REASON(DSA_R_NON_FIPS_METHOD) ,"non fips method"}, | ||
| 103 | {ERR_REASON(DSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE),"operation not allowed in fips mode"}, | ||
| 96 | {0,NULL} | 104 | {0,NULL} |
| 97 | }; | 105 | }; |
| 98 | 106 | ||
diff --git a/src/lib/libcrypto/dsa/dsa_gen.c b/src/lib/libcrypto/dsa/dsa_gen.c index ca0b86a6cf..6f1728e3cf 100644 --- a/src/lib/libcrypto/dsa/dsa_gen.c +++ b/src/lib/libcrypto/dsa/dsa_gen.c | |||
| @@ -82,6 +82,8 @@ | |||
| 82 | #include <openssl/rand.h> | 82 | #include <openssl/rand.h> |
| 83 | #include <openssl/sha.h> | 83 | #include <openssl/sha.h> |
| 84 | 84 | ||
| 85 | #ifndef OPENSSL_FIPS | ||
| 86 | |||
| 85 | static int dsa_builtin_paramgen(DSA *ret, int bits, | 87 | static int dsa_builtin_paramgen(DSA *ret, int bits, |
| 86 | unsigned char *seed_in, int seed_len, | 88 | unsigned char *seed_in, int seed_len, |
| 87 | int *counter_ret, unsigned long *h_ret, BN_GENCB *cb); | 89 | int *counter_ret, unsigned long *h_ret, BN_GENCB *cb); |
| @@ -320,3 +322,4 @@ err: | |||
| 320 | return ok; | 322 | return ok; |
| 321 | } | 323 | } |
| 322 | #endif | 324 | #endif |
| 325 | #endif | ||
diff --git a/src/lib/libcrypto/dsa/dsa_key.c b/src/lib/libcrypto/dsa/dsa_key.c index c4aa86bc6d..5e39124230 100644 --- a/src/lib/libcrypto/dsa/dsa_key.c +++ b/src/lib/libcrypto/dsa/dsa_key.c | |||
| @@ -64,6 +64,8 @@ | |||
| 64 | #include <openssl/dsa.h> | 64 | #include <openssl/dsa.h> |
| 65 | #include <openssl/rand.h> | 65 | #include <openssl/rand.h> |
| 66 | 66 | ||
| 67 | #ifndef OPENSSL_FIPS | ||
| 68 | |||
| 67 | static int dsa_builtin_keygen(DSA *dsa); | 69 | static int dsa_builtin_keygen(DSA *dsa); |
| 68 | 70 | ||
| 69 | int DSA_generate_key(DSA *dsa) | 71 | int DSA_generate_key(DSA *dsa) |
| @@ -126,3 +128,5 @@ err: | |||
| 126 | return(ok); | 128 | return(ok); |
| 127 | } | 129 | } |
| 128 | #endif | 130 | #endif |
| 131 | |||
| 132 | #endif | ||
diff --git a/src/lib/libcrypto/dsa/dsa_lib.c b/src/lib/libcrypto/dsa/dsa_lib.c index e9b75902db..7ac9dc8c89 100644 --- a/src/lib/libcrypto/dsa/dsa_lib.c +++ b/src/lib/libcrypto/dsa/dsa_lib.c | |||
| @@ -76,6 +76,14 @@ static const DSA_METHOD *default_DSA_method = NULL; | |||
| 76 | 76 | ||
| 77 | void DSA_set_default_method(const DSA_METHOD *meth) | 77 | void DSA_set_default_method(const DSA_METHOD *meth) |
| 78 | { | 78 | { |
| 79 | #ifdef OPENSSL_FIPS | ||
| 80 | if (FIPS_mode() && !(meth->flags & DSA_FLAG_FIPS_METHOD)) | ||
| 81 | { | ||
| 82 | DSAerr(DSA_F_DSA_SET_DEFAULT_METHOD, DSA_R_NON_FIPS_METHOD); | ||
| 83 | return; | ||
| 84 | } | ||
| 85 | #endif | ||
| 86 | |||
| 79 | default_DSA_method = meth; | 87 | default_DSA_method = meth; |
| 80 | } | 88 | } |
| 81 | 89 | ||
| @@ -96,6 +104,13 @@ int DSA_set_method(DSA *dsa, const DSA_METHOD *meth) | |||
| 96 | /* NB: The caller is specifically setting a method, so it's not up to us | 104 | /* NB: The caller is specifically setting a method, so it's not up to us |
| 97 | * to deal with which ENGINE it comes from. */ | 105 | * to deal with which ENGINE it comes from. */ |
| 98 | const DSA_METHOD *mtmp; | 106 | const DSA_METHOD *mtmp; |
| 107 | #ifdef OPENSSL_FIPS | ||
| 108 | if (FIPS_mode() && !(meth->flags & DSA_FLAG_FIPS_METHOD)) | ||
| 109 | { | ||
| 110 | DSAerr(DSA_F_DSA_SET_METHOD, DSA_R_NON_FIPS_METHOD); | ||
| 111 | return 0; | ||
| 112 | } | ||
| 113 | #endif | ||
| 99 | mtmp = dsa->meth; | 114 | mtmp = dsa->meth; |
| 100 | if (mtmp->finish) mtmp->finish(dsa); | 115 | if (mtmp->finish) mtmp->finish(dsa); |
| 101 | #ifndef OPENSSL_NO_ENGINE | 116 | #ifndef OPENSSL_NO_ENGINE |
| @@ -147,6 +162,18 @@ DSA *DSA_new_method(ENGINE *engine) | |||
| 147 | } | 162 | } |
| 148 | } | 163 | } |
| 149 | #endif | 164 | #endif |
| 165 | #ifdef OPENSSL_FIPS | ||
| 166 | if (FIPS_mode() && !(ret->meth->flags & DSA_FLAG_FIPS_METHOD)) | ||
| 167 | { | ||
| 168 | DSAerr(DSA_F_DSA_NEW_METHOD, DSA_R_NON_FIPS_METHOD); | ||
| 169 | #ifndef OPENSSL_NO_ENGINE | ||
| 170 | if (ret->engine) | ||
| 171 | ENGINE_finish(ret->engine); | ||
| 172 | #endif | ||
| 173 | OPENSSL_free(ret); | ||
| 174 | return NULL; | ||
| 175 | } | ||
| 176 | #endif | ||
| 150 | 177 | ||
| 151 | ret->pad=0; | 178 | ret->pad=0; |
| 152 | ret->version=0; | 179 | ret->version=0; |
| @@ -233,28 +260,6 @@ int DSA_up_ref(DSA *r) | |||
| 233 | return ((i > 1) ? 1 : 0); | 260 | return ((i > 1) ? 1 : 0); |
| 234 | } | 261 | } |
| 235 | 262 | ||
| 236 | int DSA_size(const DSA *r) | ||
| 237 | { | ||
| 238 | int ret,i; | ||
| 239 | ASN1_INTEGER bs; | ||
| 240 | unsigned char buf[4]; /* 4 bytes looks really small. | ||
| 241 | However, i2d_ASN1_INTEGER() will not look | ||
| 242 | beyond the first byte, as long as the second | ||
| 243 | parameter is NULL. */ | ||
| 244 | |||
| 245 | i=BN_num_bits(r->q); | ||
| 246 | bs.length=(i+7)/8; | ||
| 247 | bs.data=buf; | ||
| 248 | bs.type=V_ASN1_INTEGER; | ||
| 249 | /* If the top bit is set the asn1 encoding is 1 larger. */ | ||
| 250 | buf[0]=0xff; | ||
| 251 | |||
| 252 | i=i2d_ASN1_INTEGER(&bs,NULL); | ||
| 253 | i+=i; /* r and s */ | ||
| 254 | ret=ASN1_object_size(1,i,V_ASN1_SEQUENCE); | ||
| 255 | return(ret); | ||
| 256 | } | ||
| 257 | |||
| 258 | int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | 263 | int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, |
| 259 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | 264 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
| 260 | { | 265 | { |
diff --git a/src/lib/libcrypto/dsa/dsa_ossl.c b/src/lib/libcrypto/dsa/dsa_ossl.c index 75ff7cc4af..412cf1d88b 100644 --- a/src/lib/libcrypto/dsa/dsa_ossl.c +++ b/src/lib/libcrypto/dsa/dsa_ossl.c | |||
| @@ -65,6 +65,8 @@ | |||
| 65 | #include <openssl/rand.h> | 65 | #include <openssl/rand.h> |
| 66 | #include <openssl/asn1.h> | 66 | #include <openssl/asn1.h> |
| 67 | 67 | ||
| 68 | #ifndef OPENSSL_FIPS | ||
| 69 | |||
| 68 | static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa); | 70 | static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa); |
| 69 | static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp); | 71 | static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp); |
| 70 | static int dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, | 72 | static int dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, |
| @@ -391,3 +393,4 @@ static int dsa_finish(DSA *dsa) | |||
| 391 | return(1); | 393 | return(1); |
| 392 | } | 394 | } |
| 393 | 395 | ||
| 396 | #endif | ||
diff --git a/src/lib/libcrypto/dsa/dsa_sign.c b/src/lib/libcrypto/dsa/dsa_sign.c index 89205026f0..4cfbbe57a8 100644 --- a/src/lib/libcrypto/dsa/dsa_sign.c +++ b/src/lib/libcrypto/dsa/dsa_sign.c | |||
| @@ -64,29 +64,32 @@ | |||
| 64 | #include <openssl/dsa.h> | 64 | #include <openssl/dsa.h> |
| 65 | #include <openssl/rand.h> | 65 | #include <openssl/rand.h> |
| 66 | #include <openssl/asn1.h> | 66 | #include <openssl/asn1.h> |
| 67 | #ifdef OPENSSL_FIPS | ||
| 68 | #include <openssl/fips.h> | ||
| 69 | #endif | ||
| 67 | 70 | ||
| 68 | DSA_SIG * DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | ||
| 69 | { | ||
| 70 | return dsa->meth->dsa_do_sign(dgst, dlen, dsa); | ||
| 71 | } | ||
| 72 | 71 | ||
| 73 | int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig, | 72 | DSA_SIG * DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) |
| 74 | unsigned int *siglen, DSA *dsa) | ||
| 75 | { | 73 | { |
| 76 | DSA_SIG *s; | 74 | #ifdef OPENSSL_FIPS |
| 77 | s=DSA_do_sign(dgst,dlen,dsa); | 75 | if(FIPS_mode() && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW)) |
| 78 | if (s == NULL) | ||
| 79 | { | 76 | { |
| 80 | *siglen=0; | 77 | DSAerr(DSA_F_DSA_DO_SIGN, DSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); |
| 81 | return(0); | 78 | return NULL; |
| 82 | } | 79 | } |
| 83 | *siglen=i2d_DSA_SIG(s,&sig); | 80 | #endif |
| 84 | DSA_SIG_free(s); | 81 | return dsa->meth->dsa_do_sign(dgst, dlen, dsa); |
| 85 | return(1); | ||
| 86 | } | 82 | } |
| 87 | 83 | ||
| 88 | int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp) | 84 | int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp) |
| 89 | { | 85 | { |
| 86 | #ifdef OPENSSL_FIPS | ||
| 87 | if(FIPS_mode() && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW)) | ||
| 88 | { | ||
| 89 | DSAerr(DSA_F_DSA_SIGN_SETUP, DSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); | ||
| 90 | return 0; | ||
| 91 | } | ||
| 92 | #endif | ||
| 90 | return dsa->meth->dsa_sign_setup(dsa, ctx_in, kinvp, rp); | 93 | return dsa->meth->dsa_sign_setup(dsa, ctx_in, kinvp, rp); |
| 91 | } | 94 | } |
| 92 | 95 | ||
diff --git a/src/lib/libcrypto/dsa/dsa_vrf.c b/src/lib/libcrypto/dsa/dsa_vrf.c index c4aeddd056..c75e423048 100644 --- a/src/lib/libcrypto/dsa/dsa_vrf.c +++ b/src/lib/libcrypto/dsa/dsa_vrf.c | |||
| @@ -64,31 +64,21 @@ | |||
| 64 | #include <openssl/dsa.h> | 64 | #include <openssl/dsa.h> |
| 65 | #include <openssl/rand.h> | 65 | #include <openssl/rand.h> |
| 66 | #include <openssl/asn1.h> | 66 | #include <openssl/asn1.h> |
| 67 | #ifdef OPENSSL_FIPS | ||
| 68 | #include <openssl/fips.h> | ||
| 69 | #endif | ||
| 70 | |||
| 67 | #include <openssl/asn1_mac.h> | 71 | #include <openssl/asn1_mac.h> |
| 68 | 72 | ||
| 69 | int DSA_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, | 73 | int DSA_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, |
| 70 | DSA *dsa) | 74 | DSA *dsa) |
| 71 | { | 75 | { |
| 76 | #ifdef OPENSSL_FIPS | ||
| 77 | if(FIPS_mode() && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW)) | ||
| 78 | { | ||
| 79 | DSAerr(DSA_F_DSA_DO_VERIFY, DSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); | ||
| 80 | return 0; | ||
| 81 | } | ||
| 82 | #endif | ||
| 72 | return dsa->meth->dsa_do_verify(dgst, dgst_len, sig, dsa); | 83 | return dsa->meth->dsa_do_verify(dgst, dgst_len, sig, dsa); |
| 73 | } | 84 | } |
| 74 | |||
| 75 | /* data has already been hashed (probably with SHA or SHA-1). */ | ||
| 76 | /* returns | ||
| 77 | * 1: correct signature | ||
| 78 | * 0: incorrect signature | ||
| 79 | * -1: error | ||
| 80 | */ | ||
| 81 | int DSA_verify(int type, const unsigned char *dgst, int dgst_len, | ||
| 82 | const unsigned char *sigbuf, int siglen, DSA *dsa) | ||
| 83 | { | ||
| 84 | DSA_SIG *s; | ||
| 85 | int ret=-1; | ||
| 86 | |||
| 87 | s = DSA_SIG_new(); | ||
| 88 | if (s == NULL) return(ret); | ||
| 89 | if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err; | ||
| 90 | ret=DSA_do_verify(dgst,dgst_len,s,dsa); | ||
| 91 | err: | ||
| 92 | DSA_SIG_free(s); | ||
| 93 | return(ret); | ||
| 94 | } | ||
diff --git a/src/lib/libcrypto/ec/ec_key.c b/src/lib/libcrypto/ec/ec_key.c index 3d6c900b95..12fb0e6d6d 100644 --- a/src/lib/libcrypto/ec/ec_key.c +++ b/src/lib/libcrypto/ec/ec_key.c | |||
| @@ -296,7 +296,7 @@ int EC_KEY_check_key(const EC_KEY *eckey) | |||
| 296 | { | 296 | { |
| 297 | int ok = 0; | 297 | int ok = 0; |
| 298 | BN_CTX *ctx = NULL; | 298 | BN_CTX *ctx = NULL; |
| 299 | BIGNUM *order = NULL; | 299 | const BIGNUM *order = NULL; |
| 300 | EC_POINT *point = NULL; | 300 | EC_POINT *point = NULL; |
| 301 | 301 | ||
| 302 | if (!eckey || !eckey->group || !eckey->pub_key) | 302 | if (!eckey || !eckey->group || !eckey->pub_key) |
| @@ -307,8 +307,6 @@ int EC_KEY_check_key(const EC_KEY *eckey) | |||
| 307 | 307 | ||
| 308 | if ((ctx = BN_CTX_new()) == NULL) | 308 | if ((ctx = BN_CTX_new()) == NULL) |
| 309 | goto err; | 309 | goto err; |
| 310 | if ((order = BN_new()) == NULL) | ||
| 311 | goto err; | ||
| 312 | if ((point = EC_POINT_new(eckey->group)) == NULL) | 310 | if ((point = EC_POINT_new(eckey->group)) == NULL) |
| 313 | goto err; | 311 | goto err; |
| 314 | 312 | ||
| @@ -319,17 +317,13 @@ int EC_KEY_check_key(const EC_KEY *eckey) | |||
| 319 | goto err; | 317 | goto err; |
| 320 | } | 318 | } |
| 321 | /* testing whether pub_key * order is the point at infinity */ | 319 | /* testing whether pub_key * order is the point at infinity */ |
| 322 | if (!EC_GROUP_get_order(eckey->group, order, ctx)) | 320 | order = &eckey->group->order; |
| 321 | if (BN_is_zero(order)) | ||
| 323 | { | 322 | { |
| 324 | ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_INVALID_GROUP_ORDER); | 323 | ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_INVALID_GROUP_ORDER); |
| 325 | goto err; | 324 | goto err; |
| 326 | } | 325 | } |
| 327 | if (!EC_POINT_copy(point, eckey->pub_key)) | 326 | if (!EC_POINT_mul(eckey->group, point, NULL, eckey->pub_key, order, ctx)) |
| 328 | { | ||
| 329 | ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_EC_LIB); | ||
| 330 | goto err; | ||
| 331 | } | ||
| 332 | if (!EC_POINT_mul(eckey->group, point, order, NULL, NULL, ctx)) | ||
| 333 | { | 327 | { |
| 334 | ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_EC_LIB); | 328 | ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_EC_LIB); |
| 335 | goto err; | 329 | goto err; |
| @@ -366,8 +360,6 @@ int EC_KEY_check_key(const EC_KEY *eckey) | |||
| 366 | err: | 360 | err: |
| 367 | if (ctx != NULL) | 361 | if (ctx != NULL) |
| 368 | BN_CTX_free(ctx); | 362 | BN_CTX_free(ctx); |
| 369 | if (order != NULL) | ||
| 370 | BN_free(order); | ||
| 371 | if (point != NULL) | 363 | if (point != NULL) |
| 372 | EC_POINT_free(point); | 364 | EC_POINT_free(point); |
| 373 | return(ok); | 365 | return(ok); |
diff --git a/src/lib/libcrypto/engine/eng_all.c b/src/lib/libcrypto/engine/eng_all.c index 8599046717..d29cd57dc2 100644 --- a/src/lib/libcrypto/engine/eng_all.c +++ b/src/lib/libcrypto/engine/eng_all.c | |||
| @@ -107,6 +107,9 @@ void ENGINE_load_builtin_engines(void) | |||
| 107 | #if defined(__OpenBSD__) || defined(__FreeBSD__) | 107 | #if defined(__OpenBSD__) || defined(__FreeBSD__) |
| 108 | ENGINE_load_cryptodev(); | 108 | ENGINE_load_cryptodev(); |
| 109 | #endif | 109 | #endif |
| 110 | #if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG) | ||
| 111 | ENGINE_load_capi(); | ||
| 112 | #endif | ||
| 110 | #endif | 113 | #endif |
| 111 | } | 114 | } |
| 112 | 115 | ||
diff --git a/src/lib/libcrypto/engine/eng_cnf.c b/src/lib/libcrypto/engine/eng_cnf.c index a97e01e619..08066cea59 100644 --- a/src/lib/libcrypto/engine/eng_cnf.c +++ b/src/lib/libcrypto/engine/eng_cnf.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* eng_cnf.c */ | 1 | /* eng_cnf.c */ |
| 2 | /* Written by Stephen Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Stephen Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -98,6 +98,8 @@ static int int_engine_configure(char *name, char *value, const CONF *cnf) | |||
| 98 | CONF_VALUE *ecmd; | 98 | CONF_VALUE *ecmd; |
| 99 | char *ctrlname, *ctrlvalue; | 99 | char *ctrlname, *ctrlvalue; |
| 100 | ENGINE *e = NULL; | 100 | ENGINE *e = NULL; |
| 101 | int soft = 0; | ||
| 102 | |||
| 101 | name = skip_dot(name); | 103 | name = skip_dot(name); |
| 102 | #ifdef ENGINE_CONF_DEBUG | 104 | #ifdef ENGINE_CONF_DEBUG |
| 103 | fprintf(stderr, "Configuring engine %s\n", name); | 105 | fprintf(stderr, "Configuring engine %s\n", name); |
| @@ -125,6 +127,8 @@ static int int_engine_configure(char *name, char *value, const CONF *cnf) | |||
| 125 | /* Override engine name to use */ | 127 | /* Override engine name to use */ |
| 126 | if (!strcmp(ctrlname, "engine_id")) | 128 | if (!strcmp(ctrlname, "engine_id")) |
| 127 | name = ctrlvalue; | 129 | name = ctrlvalue; |
| 130 | else if (!strcmp(ctrlname, "soft_load")) | ||
| 131 | soft = 1; | ||
| 128 | /* Load a dynamic ENGINE */ | 132 | /* Load a dynamic ENGINE */ |
| 129 | else if (!strcmp(ctrlname, "dynamic_path")) | 133 | else if (!strcmp(ctrlname, "dynamic_path")) |
| 130 | { | 134 | { |
| @@ -147,6 +151,11 @@ static int int_engine_configure(char *name, char *value, const CONF *cnf) | |||
| 147 | if (!e) | 151 | if (!e) |
| 148 | { | 152 | { |
| 149 | e = ENGINE_by_id(name); | 153 | e = ENGINE_by_id(name); |
| 154 | if (!e && soft) | ||
| 155 | { | ||
| 156 | ERR_clear_error(); | ||
| 157 | return 1; | ||
| 158 | } | ||
| 150 | if (!e) | 159 | if (!e) |
| 151 | return 0; | 160 | return 0; |
| 152 | } | 161 | } |
diff --git a/src/lib/libcrypto/engine/eng_err.c b/src/lib/libcrypto/engine/eng_err.c index 369f2e22d3..574ffbb5c0 100644 --- a/src/lib/libcrypto/engine/eng_err.c +++ b/src/lib/libcrypto/engine/eng_err.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* crypto/engine/eng_err.c */ | 1 | /* crypto/engine/eng_err.c */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1999-2008 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that the following conditions | 6 | * modification, are permitted provided that the following conditions |
| @@ -92,6 +92,7 @@ static ERR_STRING_DATA ENGINE_str_functs[]= | |||
| 92 | {ERR_FUNC(ENGINE_F_ENGINE_LIST_REMOVE), "ENGINE_LIST_REMOVE"}, | 92 | {ERR_FUNC(ENGINE_F_ENGINE_LIST_REMOVE), "ENGINE_LIST_REMOVE"}, |
| 93 | {ERR_FUNC(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY), "ENGINE_load_private_key"}, | 93 | {ERR_FUNC(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY), "ENGINE_load_private_key"}, |
| 94 | {ERR_FUNC(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY), "ENGINE_load_public_key"}, | 94 | {ERR_FUNC(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY), "ENGINE_load_public_key"}, |
| 95 | {ERR_FUNC(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT), "ENGINE_load_ssl_client_cert"}, | ||
| 95 | {ERR_FUNC(ENGINE_F_ENGINE_NEW), "ENGINE_new"}, | 96 | {ERR_FUNC(ENGINE_F_ENGINE_NEW), "ENGINE_new"}, |
| 96 | {ERR_FUNC(ENGINE_F_ENGINE_REMOVE), "ENGINE_remove"}, | 97 | {ERR_FUNC(ENGINE_F_ENGINE_REMOVE), "ENGINE_remove"}, |
| 97 | {ERR_FUNC(ENGINE_F_ENGINE_SET_DEFAULT_STRING), "ENGINE_set_default_string"}, | 98 | {ERR_FUNC(ENGINE_F_ENGINE_SET_DEFAULT_STRING), "ENGINE_set_default_string"}, |
diff --git a/src/lib/libcrypto/engine/eng_int.h b/src/lib/libcrypto/engine/eng_int.h index a5b1edebf4..a66f107a44 100644 --- a/src/lib/libcrypto/engine/eng_int.h +++ b/src/lib/libcrypto/engine/eng_int.h | |||
| @@ -170,6 +170,8 @@ struct engine_st | |||
| 170 | ENGINE_LOAD_KEY_PTR load_privkey; | 170 | ENGINE_LOAD_KEY_PTR load_privkey; |
| 171 | ENGINE_LOAD_KEY_PTR load_pubkey; | 171 | ENGINE_LOAD_KEY_PTR load_pubkey; |
| 172 | 172 | ||
| 173 | ENGINE_SSL_CLIENT_CERT_PTR load_ssl_client_cert; | ||
| 174 | |||
| 173 | const ENGINE_CMD_DEFN *cmd_defns; | 175 | const ENGINE_CMD_DEFN *cmd_defns; |
| 174 | int flags; | 176 | int flags; |
| 175 | /* reference count on the structure itself */ | 177 | /* reference count on the structure itself */ |
diff --git a/src/lib/libcrypto/engine/eng_padlock.c b/src/lib/libcrypto/engine/eng_padlock.c index 1ba9d85db4..743558ab33 100644 --- a/src/lib/libcrypto/engine/eng_padlock.c +++ b/src/lib/libcrypto/engine/eng_padlock.c | |||
| @@ -234,8 +234,8 @@ padlock_bind_fn(ENGINE *e, const char *id) | |||
| 234 | return 1; | 234 | return 1; |
| 235 | } | 235 | } |
| 236 | 236 | ||
| 237 | IMPLEMENT_DYNAMIC_CHECK_FN (); | 237 | IMPLEMENT_DYNAMIC_CHECK_FN () |
| 238 | IMPLEMENT_DYNAMIC_BIND_FN (padlock_bind_fn); | 238 | IMPLEMENT_DYNAMIC_BIND_FN (padlock_bind_fn) |
| 239 | #endif /* DYNAMIC_ENGINE */ | 239 | #endif /* DYNAMIC_ENGINE */ |
| 240 | 240 | ||
| 241 | /* ===== Here comes the "real" engine ===== */ | 241 | /* ===== Here comes the "real" engine ===== */ |
diff --git a/src/lib/libcrypto/engine/eng_pkey.c b/src/lib/libcrypto/engine/eng_pkey.c index bc8b21abec..1dfa2e3664 100644 --- a/src/lib/libcrypto/engine/eng_pkey.c +++ b/src/lib/libcrypto/engine/eng_pkey.c | |||
| @@ -69,6 +69,13 @@ int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f) | |||
| 69 | return 1; | 69 | return 1; |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | int ENGINE_set_load_ssl_client_cert_function(ENGINE *e, | ||
| 73 | ENGINE_SSL_CLIENT_CERT_PTR loadssl_f) | ||
| 74 | { | ||
| 75 | e->load_ssl_client_cert = loadssl_f; | ||
| 76 | return 1; | ||
| 77 | } | ||
| 78 | |||
| 72 | ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e) | 79 | ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e) |
| 73 | { | 80 | { |
| 74 | return e->load_privkey; | 81 | return e->load_privkey; |
| @@ -79,6 +86,11 @@ ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e) | |||
| 79 | return e->load_pubkey; | 86 | return e->load_pubkey; |
| 80 | } | 87 | } |
| 81 | 88 | ||
| 89 | ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE *e) | ||
| 90 | { | ||
| 91 | return e->load_ssl_client_cert; | ||
| 92 | } | ||
| 93 | |||
| 82 | /* API functions to load public/private keys */ | 94 | /* API functions to load public/private keys */ |
| 83 | 95 | ||
| 84 | EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, | 96 | EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, |
| @@ -152,3 +164,33 @@ EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, | |||
| 152 | } | 164 | } |
| 153 | return pkey; | 165 | return pkey; |
| 154 | } | 166 | } |
| 167 | |||
| 168 | int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, | ||
| 169 | STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **ppkey, | ||
| 170 | STACK_OF(X509) **pother, UI_METHOD *ui_method, void *callback_data) | ||
| 171 | { | ||
| 172 | |||
| 173 | if(e == NULL) | ||
| 174 | { | ||
| 175 | ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT, | ||
| 176 | ERR_R_PASSED_NULL_PARAMETER); | ||
| 177 | return 0; | ||
| 178 | } | ||
| 179 | CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); | ||
| 180 | if(e->funct_ref == 0) | ||
| 181 | { | ||
| 182 | CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); | ||
| 183 | ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT, | ||
| 184 | ENGINE_R_NOT_INITIALISED); | ||
| 185 | return 0; | ||
| 186 | } | ||
| 187 | CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); | ||
| 188 | if (!e->load_ssl_client_cert) | ||
| 189 | { | ||
| 190 | ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT, | ||
| 191 | ENGINE_R_NO_LOAD_FUNCTION); | ||
| 192 | return 0; | ||
| 193 | } | ||
| 194 | return e->load_ssl_client_cert(e, s, ca_dn, pcert, ppkey, pother, | ||
| 195 | ui_method, callback_data); | ||
| 196 | } | ||
diff --git a/src/lib/libcrypto/engine/engine.h b/src/lib/libcrypto/engine/engine.h index 3ec59338ff..f503595ece 100644 --- a/src/lib/libcrypto/engine/engine.h +++ b/src/lib/libcrypto/engine/engine.h | |||
| @@ -93,6 +93,8 @@ | |||
| 93 | #include <openssl/err.h> | 93 | #include <openssl/err.h> |
| 94 | #endif | 94 | #endif |
| 95 | 95 | ||
| 96 | #include <openssl/x509.h> | ||
| 97 | |||
| 96 | #include <openssl/ossl_typ.h> | 98 | #include <openssl/ossl_typ.h> |
| 97 | #include <openssl/symhacks.h> | 99 | #include <openssl/symhacks.h> |
| 98 | 100 | ||
| @@ -278,6 +280,9 @@ typedef int (*ENGINE_CTRL_FUNC_PTR)(ENGINE *, int, long, void *, void (*f)(void) | |||
| 278 | /* Generic load_key function pointer */ | 280 | /* Generic load_key function pointer */ |
| 279 | typedef EVP_PKEY * (*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, | 281 | typedef EVP_PKEY * (*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, |
| 280 | UI_METHOD *ui_method, void *callback_data); | 282 | UI_METHOD *ui_method, void *callback_data); |
| 283 | typedef int (*ENGINE_SSL_CLIENT_CERT_PTR)(ENGINE *, SSL *ssl, | ||
| 284 | STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **pkey, | ||
| 285 | STACK_OF(X509) **pother, UI_METHOD *ui_method, void *callback_data); | ||
| 281 | /* These callback types are for an ENGINE's handler for cipher and digest logic. | 286 | /* These callback types are for an ENGINE's handler for cipher and digest logic. |
| 282 | * These handlers have these prototypes; | 287 | * These handlers have these prototypes; |
| 283 | * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); | 288 | * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); |
| @@ -334,6 +339,9 @@ void ENGINE_load_ubsec(void); | |||
| 334 | void ENGINE_load_cryptodev(void); | 339 | void ENGINE_load_cryptodev(void); |
| 335 | void ENGINE_load_padlock(void); | 340 | void ENGINE_load_padlock(void); |
| 336 | void ENGINE_load_builtin_engines(void); | 341 | void ENGINE_load_builtin_engines(void); |
| 342 | #ifndef OPENSSL_NO_CAPIENG | ||
| 343 | void ENGINE_load_capi(void); | ||
| 344 | #endif | ||
| 337 | 345 | ||
| 338 | /* Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation | 346 | /* Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation |
| 339 | * "registry" handling. */ | 347 | * "registry" handling. */ |
| @@ -459,6 +467,8 @@ int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f); | |||
| 459 | int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); | 467 | int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); |
| 460 | int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f); | 468 | int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f); |
| 461 | int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f); | 469 | int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f); |
| 470 | int ENGINE_set_load_ssl_client_cert_function(ENGINE *e, | ||
| 471 | ENGINE_SSL_CLIENT_CERT_PTR loadssl_f); | ||
| 462 | int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f); | 472 | int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f); |
| 463 | int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f); | 473 | int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f); |
| 464 | int ENGINE_set_flags(ENGINE *e, int flags); | 474 | int ENGINE_set_flags(ENGINE *e, int flags); |
| @@ -494,6 +504,7 @@ ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e); | |||
| 494 | ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e); | 504 | ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e); |
| 495 | ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e); | 505 | ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e); |
| 496 | ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e); | 506 | ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e); |
| 507 | ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE *e); | ||
| 497 | ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e); | 508 | ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e); |
| 498 | ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e); | 509 | ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e); |
| 499 | const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid); | 510 | const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid); |
| @@ -529,6 +540,10 @@ EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, | |||
| 529 | UI_METHOD *ui_method, void *callback_data); | 540 | UI_METHOD *ui_method, void *callback_data); |
| 530 | EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, | 541 | EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, |
| 531 | UI_METHOD *ui_method, void *callback_data); | 542 | UI_METHOD *ui_method, void *callback_data); |
| 543 | int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, | ||
| 544 | STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **ppkey, | ||
| 545 | STACK_OF(X509) **pother, | ||
| 546 | UI_METHOD *ui_method, void *callback_data); | ||
| 532 | 547 | ||
| 533 | /* This returns a pointer for the current ENGINE structure that | 548 | /* This returns a pointer for the current ENGINE structure that |
| 534 | * is (by default) performing any RSA operations. The value returned | 549 | * is (by default) performing any RSA operations. The value returned |
| @@ -723,6 +738,7 @@ void ERR_load_ENGINE_strings(void); | |||
| 723 | #define ENGINE_F_ENGINE_LIST_REMOVE 121 | 738 | #define ENGINE_F_ENGINE_LIST_REMOVE 121 |
| 724 | #define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150 | 739 | #define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150 |
| 725 | #define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151 | 740 | #define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151 |
| 741 | #define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT 192 | ||
| 726 | #define ENGINE_F_ENGINE_NEW 122 | 742 | #define ENGINE_F_ENGINE_NEW 122 |
| 727 | #define ENGINE_F_ENGINE_REMOVE 123 | 743 | #define ENGINE_F_ENGINE_REMOVE 123 |
| 728 | #define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189 | 744 | #define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189 |
diff --git a/src/lib/libcrypto/err/err.c b/src/lib/libcrypto/err/err.c index b6ff070e8f..292404a2fb 100644 --- a/src/lib/libcrypto/err/err.c +++ b/src/lib/libcrypto/err/err.c | |||
| @@ -119,479 +119,9 @@ | |||
| 119 | #include <openssl/bio.h> | 119 | #include <openssl/bio.h> |
| 120 | #include <openssl/err.h> | 120 | #include <openssl/err.h> |
| 121 | 121 | ||
| 122 | static void err_load_strings(int lib, ERR_STRING_DATA *str); | 122 | static unsigned long get_error_values(int inc,int top, |
| 123 | 123 | const char **file,int *line, | |
| 124 | static void ERR_STATE_free(ERR_STATE *s); | 124 | const char **data,int *flags); |
| 125 | #ifndef OPENSSL_NO_ERR | ||
| 126 | static ERR_STRING_DATA ERR_str_libraries[]= | ||
| 127 | { | ||
| 128 | {ERR_PACK(ERR_LIB_NONE,0,0) ,"unknown library"}, | ||
| 129 | {ERR_PACK(ERR_LIB_SYS,0,0) ,"system library"}, | ||
| 130 | {ERR_PACK(ERR_LIB_BN,0,0) ,"bignum routines"}, | ||
| 131 | {ERR_PACK(ERR_LIB_RSA,0,0) ,"rsa routines"}, | ||
| 132 | {ERR_PACK(ERR_LIB_DH,0,0) ,"Diffie-Hellman routines"}, | ||
| 133 | {ERR_PACK(ERR_LIB_EVP,0,0) ,"digital envelope routines"}, | ||
| 134 | {ERR_PACK(ERR_LIB_BUF,0,0) ,"memory buffer routines"}, | ||
| 135 | {ERR_PACK(ERR_LIB_OBJ,0,0) ,"object identifier routines"}, | ||
| 136 | {ERR_PACK(ERR_LIB_PEM,0,0) ,"PEM routines"}, | ||
| 137 | {ERR_PACK(ERR_LIB_DSA,0,0) ,"dsa routines"}, | ||
| 138 | {ERR_PACK(ERR_LIB_X509,0,0) ,"x509 certificate routines"}, | ||
| 139 | {ERR_PACK(ERR_LIB_ASN1,0,0) ,"asn1 encoding routines"}, | ||
| 140 | {ERR_PACK(ERR_LIB_CONF,0,0) ,"configuration file routines"}, | ||
| 141 | {ERR_PACK(ERR_LIB_CRYPTO,0,0) ,"common libcrypto routines"}, | ||
| 142 | {ERR_PACK(ERR_LIB_EC,0,0) ,"elliptic curve routines"}, | ||
| 143 | {ERR_PACK(ERR_LIB_SSL,0,0) ,"SSL routines"}, | ||
| 144 | {ERR_PACK(ERR_LIB_BIO,0,0) ,"BIO routines"}, | ||
| 145 | {ERR_PACK(ERR_LIB_PKCS7,0,0) ,"PKCS7 routines"}, | ||
| 146 | {ERR_PACK(ERR_LIB_X509V3,0,0) ,"X509 V3 routines"}, | ||
| 147 | {ERR_PACK(ERR_LIB_PKCS12,0,0) ,"PKCS12 routines"}, | ||
| 148 | {ERR_PACK(ERR_LIB_RAND,0,0) ,"random number generator"}, | ||
| 149 | {ERR_PACK(ERR_LIB_DSO,0,0) ,"DSO support routines"}, | ||
| 150 | {ERR_PACK(ERR_LIB_ENGINE,0,0) ,"engine routines"}, | ||
| 151 | {ERR_PACK(ERR_LIB_OCSP,0,0) ,"OCSP routines"}, | ||
| 152 | {ERR_PACK(ERR_LIB_CMS,0,0) ,"CMS routines"}, | ||
| 153 | {0,NULL}, | ||
| 154 | }; | ||
| 155 | |||
| 156 | static ERR_STRING_DATA ERR_str_functs[]= | ||
| 157 | { | ||
| 158 | {ERR_PACK(0,SYS_F_FOPEN,0), "fopen"}, | ||
| 159 | {ERR_PACK(0,SYS_F_CONNECT,0), "connect"}, | ||
| 160 | {ERR_PACK(0,SYS_F_GETSERVBYNAME,0), "getservbyname"}, | ||
| 161 | {ERR_PACK(0,SYS_F_SOCKET,0), "socket"}, | ||
| 162 | {ERR_PACK(0,SYS_F_IOCTLSOCKET,0), "ioctlsocket"}, | ||
| 163 | {ERR_PACK(0,SYS_F_BIND,0), "bind"}, | ||
| 164 | {ERR_PACK(0,SYS_F_LISTEN,0), "listen"}, | ||
| 165 | {ERR_PACK(0,SYS_F_ACCEPT,0), "accept"}, | ||
| 166 | #ifdef OPENSSL_SYS_WINDOWS | ||
| 167 | {ERR_PACK(0,SYS_F_WSASTARTUP,0), "WSAstartup"}, | ||
| 168 | #endif | ||
| 169 | {ERR_PACK(0,SYS_F_OPENDIR,0), "opendir"}, | ||
| 170 | {ERR_PACK(0,SYS_F_FREAD,0), "fread"}, | ||
| 171 | {0,NULL}, | ||
| 172 | }; | ||
| 173 | |||
| 174 | static ERR_STRING_DATA ERR_str_reasons[]= | ||
| 175 | { | ||
| 176 | {ERR_R_SYS_LIB ,"system lib"}, | ||
| 177 | {ERR_R_BN_LIB ,"BN lib"}, | ||
| 178 | {ERR_R_RSA_LIB ,"RSA lib"}, | ||
| 179 | {ERR_R_DH_LIB ,"DH lib"}, | ||
| 180 | {ERR_R_EVP_LIB ,"EVP lib"}, | ||
| 181 | {ERR_R_BUF_LIB ,"BUF lib"}, | ||
| 182 | {ERR_R_OBJ_LIB ,"OBJ lib"}, | ||
| 183 | {ERR_R_PEM_LIB ,"PEM lib"}, | ||
| 184 | {ERR_R_DSA_LIB ,"DSA lib"}, | ||
| 185 | {ERR_R_X509_LIB ,"X509 lib"}, | ||
| 186 | {ERR_R_ASN1_LIB ,"ASN1 lib"}, | ||
| 187 | {ERR_R_CONF_LIB ,"CONF lib"}, | ||
| 188 | {ERR_R_CRYPTO_LIB ,"CRYPTO lib"}, | ||
| 189 | {ERR_R_EC_LIB ,"EC lib"}, | ||
| 190 | {ERR_R_SSL_LIB ,"SSL lib"}, | ||
| 191 | {ERR_R_BIO_LIB ,"BIO lib"}, | ||
| 192 | {ERR_R_PKCS7_LIB ,"PKCS7 lib"}, | ||
| 193 | {ERR_R_X509V3_LIB ,"X509V3 lib"}, | ||
| 194 | {ERR_R_PKCS12_LIB ,"PKCS12 lib"}, | ||
| 195 | {ERR_R_RAND_LIB ,"RAND lib"}, | ||
| 196 | {ERR_R_DSO_LIB ,"DSO lib"}, | ||
| 197 | {ERR_R_ENGINE_LIB ,"ENGINE lib"}, | ||
| 198 | {ERR_R_OCSP_LIB ,"OCSP lib"}, | ||
| 199 | |||
| 200 | {ERR_R_NESTED_ASN1_ERROR ,"nested asn1 error"}, | ||
| 201 | {ERR_R_BAD_ASN1_OBJECT_HEADER ,"bad asn1 object header"}, | ||
| 202 | {ERR_R_BAD_GET_ASN1_OBJECT_CALL ,"bad get asn1 object call"}, | ||
| 203 | {ERR_R_EXPECTING_AN_ASN1_SEQUENCE ,"expecting an asn1 sequence"}, | ||
| 204 | {ERR_R_ASN1_LENGTH_MISMATCH ,"asn1 length mismatch"}, | ||
| 205 | {ERR_R_MISSING_ASN1_EOS ,"missing asn1 eos"}, | ||
| 206 | |||
| 207 | {ERR_R_FATAL ,"fatal"}, | ||
| 208 | {ERR_R_MALLOC_FAILURE ,"malloc failure"}, | ||
| 209 | {ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED ,"called a function you should not call"}, | ||
| 210 | {ERR_R_PASSED_NULL_PARAMETER ,"passed a null parameter"}, | ||
| 211 | {ERR_R_INTERNAL_ERROR ,"internal error"}, | ||
| 212 | {ERR_R_DISABLED ,"called a function that was disabled at compile-time"}, | ||
| 213 | |||
| 214 | {0,NULL}, | ||
| 215 | }; | ||
| 216 | #endif | ||
| 217 | |||
| 218 | |||
| 219 | /* Define the predeclared (but externally opaque) "ERR_FNS" type */ | ||
| 220 | struct st_ERR_FNS | ||
| 221 | { | ||
| 222 | /* Works on the "error_hash" string table */ | ||
| 223 | LHASH *(*cb_err_get)(int create); | ||
| 224 | void (*cb_err_del)(void); | ||
| 225 | ERR_STRING_DATA *(*cb_err_get_item)(const ERR_STRING_DATA *); | ||
| 226 | ERR_STRING_DATA *(*cb_err_set_item)(ERR_STRING_DATA *); | ||
| 227 | ERR_STRING_DATA *(*cb_err_del_item)(ERR_STRING_DATA *); | ||
| 228 | /* Works on the "thread_hash" error-state table */ | ||
| 229 | LHASH *(*cb_thread_get)(int create); | ||
| 230 | void (*cb_thread_release)(LHASH **hash); | ||
| 231 | ERR_STATE *(*cb_thread_get_item)(const ERR_STATE *); | ||
| 232 | ERR_STATE *(*cb_thread_set_item)(ERR_STATE *); | ||
| 233 | void (*cb_thread_del_item)(const ERR_STATE *); | ||
| 234 | /* Returns the next available error "library" numbers */ | ||
| 235 | int (*cb_get_next_lib)(void); | ||
| 236 | }; | ||
| 237 | |||
| 238 | /* Predeclarations of the "err_defaults" functions */ | ||
| 239 | static LHASH *int_err_get(int create); | ||
| 240 | static void int_err_del(void); | ||
| 241 | static ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *); | ||
| 242 | static ERR_STRING_DATA *int_err_set_item(ERR_STRING_DATA *); | ||
| 243 | static ERR_STRING_DATA *int_err_del_item(ERR_STRING_DATA *); | ||
| 244 | static LHASH *int_thread_get(int create); | ||
| 245 | static void int_thread_release(LHASH **hash); | ||
| 246 | static ERR_STATE *int_thread_get_item(const ERR_STATE *); | ||
| 247 | static ERR_STATE *int_thread_set_item(ERR_STATE *); | ||
| 248 | static void int_thread_del_item(const ERR_STATE *); | ||
| 249 | static int int_err_get_next_lib(void); | ||
| 250 | /* The static ERR_FNS table using these defaults functions */ | ||
| 251 | static const ERR_FNS err_defaults = | ||
| 252 | { | ||
| 253 | int_err_get, | ||
| 254 | int_err_del, | ||
| 255 | int_err_get_item, | ||
| 256 | int_err_set_item, | ||
| 257 | int_err_del_item, | ||
| 258 | int_thread_get, | ||
| 259 | int_thread_release, | ||
| 260 | int_thread_get_item, | ||
| 261 | int_thread_set_item, | ||
| 262 | int_thread_del_item, | ||
| 263 | int_err_get_next_lib | ||
| 264 | }; | ||
| 265 | |||
| 266 | /* The replacable table of ERR_FNS functions we use at run-time */ | ||
| 267 | static const ERR_FNS *err_fns = NULL; | ||
| 268 | |||
| 269 | /* Eg. rather than using "err_get()", use "ERRFN(err_get)()". */ | ||
| 270 | #define ERRFN(a) err_fns->cb_##a | ||
| 271 | |||
| 272 | /* The internal state used by "err_defaults" - as such, the setting, reading, | ||
| 273 | * creating, and deleting of this data should only be permitted via the | ||
| 274 | * "err_defaults" functions. This way, a linked module can completely defer all | ||
| 275 | * ERR state operation (together with requisite locking) to the implementations | ||
| 276 | * and state in the loading application. */ | ||
| 277 | static LHASH *int_error_hash = NULL; | ||
| 278 | static LHASH *int_thread_hash = NULL; | ||
| 279 | static int int_thread_hash_references = 0; | ||
| 280 | static int int_err_library_number= ERR_LIB_USER; | ||
| 281 | |||
| 282 | /* Internal function that checks whether "err_fns" is set and if not, sets it to | ||
| 283 | * the defaults. */ | ||
| 284 | static void err_fns_check(void) | ||
| 285 | { | ||
| 286 | if (err_fns) return; | ||
| 287 | |||
| 288 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 289 | if (!err_fns) | ||
| 290 | err_fns = &err_defaults; | ||
| 291 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 292 | } | ||
| 293 | |||
| 294 | /* API functions to get or set the underlying ERR functions. */ | ||
| 295 | |||
| 296 | const ERR_FNS *ERR_get_implementation(void) | ||
| 297 | { | ||
| 298 | err_fns_check(); | ||
| 299 | return err_fns; | ||
| 300 | } | ||
| 301 | |||
| 302 | int ERR_set_implementation(const ERR_FNS *fns) | ||
| 303 | { | ||
| 304 | int ret = 0; | ||
| 305 | |||
| 306 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 307 | /* It's too late if 'err_fns' is non-NULL. BTW: not much point setting | ||
| 308 | * an error is there?! */ | ||
| 309 | if (!err_fns) | ||
| 310 | { | ||
| 311 | err_fns = fns; | ||
| 312 | ret = 1; | ||
| 313 | } | ||
| 314 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 315 | return ret; | ||
| 316 | } | ||
| 317 | |||
| 318 | /* These are the callbacks provided to "lh_new()" when creating the LHASH tables | ||
| 319 | * internal to the "err_defaults" implementation. */ | ||
| 320 | |||
| 321 | /* static unsigned long err_hash(ERR_STRING_DATA *a); */ | ||
| 322 | static unsigned long err_hash(const void *a_void); | ||
| 323 | /* static int err_cmp(ERR_STRING_DATA *a, ERR_STRING_DATA *b); */ | ||
| 324 | static int err_cmp(const void *a_void, const void *b_void); | ||
| 325 | /* static unsigned long pid_hash(ERR_STATE *pid); */ | ||
| 326 | static unsigned long pid_hash(const void *pid_void); | ||
| 327 | /* static int pid_cmp(ERR_STATE *a,ERR_STATE *pid); */ | ||
| 328 | static int pid_cmp(const void *a_void,const void *pid_void); | ||
| 329 | static unsigned long get_error_values(int inc,int top,const char **file,int *line, | ||
| 330 | const char **data,int *flags); | ||
| 331 | |||
| 332 | /* The internal functions used in the "err_defaults" implementation */ | ||
| 333 | |||
| 334 | static LHASH *int_err_get(int create) | ||
| 335 | { | ||
| 336 | LHASH *ret = NULL; | ||
| 337 | |||
| 338 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 339 | if (!int_error_hash && create) | ||
| 340 | { | ||
| 341 | CRYPTO_push_info("int_err_get (err.c)"); | ||
| 342 | int_error_hash = lh_new(err_hash, err_cmp); | ||
| 343 | CRYPTO_pop_info(); | ||
| 344 | } | ||
| 345 | if (int_error_hash) | ||
| 346 | ret = int_error_hash; | ||
| 347 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 348 | |||
| 349 | return ret; | ||
| 350 | } | ||
| 351 | |||
| 352 | static void int_err_del(void) | ||
| 353 | { | ||
| 354 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 355 | if (int_error_hash) | ||
| 356 | { | ||
| 357 | lh_free(int_error_hash); | ||
| 358 | int_error_hash = NULL; | ||
| 359 | } | ||
| 360 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 361 | } | ||
| 362 | |||
| 363 | static ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *d) | ||
| 364 | { | ||
| 365 | ERR_STRING_DATA *p; | ||
| 366 | LHASH *hash; | ||
| 367 | |||
| 368 | err_fns_check(); | ||
| 369 | hash = ERRFN(err_get)(0); | ||
| 370 | if (!hash) | ||
| 371 | return NULL; | ||
| 372 | |||
| 373 | CRYPTO_r_lock(CRYPTO_LOCK_ERR); | ||
| 374 | p = (ERR_STRING_DATA *)lh_retrieve(hash, d); | ||
| 375 | CRYPTO_r_unlock(CRYPTO_LOCK_ERR); | ||
| 376 | |||
| 377 | return p; | ||
| 378 | } | ||
| 379 | |||
| 380 | static ERR_STRING_DATA *int_err_set_item(ERR_STRING_DATA *d) | ||
| 381 | { | ||
| 382 | ERR_STRING_DATA *p; | ||
| 383 | LHASH *hash; | ||
| 384 | |||
| 385 | err_fns_check(); | ||
| 386 | hash = ERRFN(err_get)(1); | ||
| 387 | if (!hash) | ||
| 388 | return NULL; | ||
| 389 | |||
| 390 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 391 | p = (ERR_STRING_DATA *)lh_insert(hash, d); | ||
| 392 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 393 | |||
| 394 | return p; | ||
| 395 | } | ||
| 396 | |||
| 397 | static ERR_STRING_DATA *int_err_del_item(ERR_STRING_DATA *d) | ||
| 398 | { | ||
| 399 | ERR_STRING_DATA *p; | ||
| 400 | LHASH *hash; | ||
| 401 | |||
| 402 | err_fns_check(); | ||
| 403 | hash = ERRFN(err_get)(0); | ||
| 404 | if (!hash) | ||
| 405 | return NULL; | ||
| 406 | |||
| 407 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 408 | p = (ERR_STRING_DATA *)lh_delete(hash, d); | ||
| 409 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 410 | |||
| 411 | return p; | ||
| 412 | } | ||
| 413 | |||
| 414 | static LHASH *int_thread_get(int create) | ||
| 415 | { | ||
| 416 | LHASH *ret = NULL; | ||
| 417 | |||
| 418 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 419 | if (!int_thread_hash && create) | ||
| 420 | { | ||
| 421 | CRYPTO_push_info("int_thread_get (err.c)"); | ||
| 422 | int_thread_hash = lh_new(pid_hash, pid_cmp); | ||
| 423 | CRYPTO_pop_info(); | ||
| 424 | } | ||
| 425 | if (int_thread_hash) | ||
| 426 | { | ||
| 427 | int_thread_hash_references++; | ||
| 428 | ret = int_thread_hash; | ||
| 429 | } | ||
| 430 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 431 | return ret; | ||
| 432 | } | ||
| 433 | |||
| 434 | static void int_thread_release(LHASH **hash) | ||
| 435 | { | ||
| 436 | int i; | ||
| 437 | |||
| 438 | if (hash == NULL || *hash == NULL) | ||
| 439 | return; | ||
| 440 | |||
| 441 | i = CRYPTO_add(&int_thread_hash_references, -1, CRYPTO_LOCK_ERR); | ||
| 442 | |||
| 443 | #ifdef REF_PRINT | ||
| 444 | fprintf(stderr,"%4d:%s\n",int_thread_hash_references,"ERR"); | ||
| 445 | #endif | ||
| 446 | if (i > 0) return; | ||
| 447 | #ifdef REF_CHECK | ||
| 448 | if (i < 0) | ||
| 449 | { | ||
| 450 | fprintf(stderr,"int_thread_release, bad reference count\n"); | ||
| 451 | abort(); /* ok */ | ||
| 452 | } | ||
| 453 | #endif | ||
| 454 | *hash = NULL; | ||
| 455 | } | ||
| 456 | |||
| 457 | static ERR_STATE *int_thread_get_item(const ERR_STATE *d) | ||
| 458 | { | ||
| 459 | ERR_STATE *p; | ||
| 460 | LHASH *hash; | ||
| 461 | |||
| 462 | err_fns_check(); | ||
| 463 | hash = ERRFN(thread_get)(0); | ||
| 464 | if (!hash) | ||
| 465 | return NULL; | ||
| 466 | |||
| 467 | CRYPTO_r_lock(CRYPTO_LOCK_ERR); | ||
| 468 | p = (ERR_STATE *)lh_retrieve(hash, d); | ||
| 469 | CRYPTO_r_unlock(CRYPTO_LOCK_ERR); | ||
| 470 | |||
| 471 | ERRFN(thread_release)(&hash); | ||
| 472 | return p; | ||
| 473 | } | ||
| 474 | |||
| 475 | static ERR_STATE *int_thread_set_item(ERR_STATE *d) | ||
| 476 | { | ||
| 477 | ERR_STATE *p; | ||
| 478 | LHASH *hash; | ||
| 479 | |||
| 480 | err_fns_check(); | ||
| 481 | hash = ERRFN(thread_get)(1); | ||
| 482 | if (!hash) | ||
| 483 | return NULL; | ||
| 484 | |||
| 485 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 486 | p = (ERR_STATE *)lh_insert(hash, d); | ||
| 487 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 488 | |||
| 489 | ERRFN(thread_release)(&hash); | ||
| 490 | return p; | ||
| 491 | } | ||
| 492 | |||
| 493 | static void int_thread_del_item(const ERR_STATE *d) | ||
| 494 | { | ||
| 495 | ERR_STATE *p; | ||
| 496 | LHASH *hash; | ||
| 497 | |||
| 498 | err_fns_check(); | ||
| 499 | hash = ERRFN(thread_get)(0); | ||
| 500 | if (!hash) | ||
| 501 | return; | ||
| 502 | |||
| 503 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 504 | p = (ERR_STATE *)lh_delete(hash, d); | ||
| 505 | /* make sure we don't leak memory */ | ||
| 506 | if (int_thread_hash_references == 1 | ||
| 507 | && int_thread_hash && (lh_num_items(int_thread_hash) == 0)) | ||
| 508 | { | ||
| 509 | lh_free(int_thread_hash); | ||
| 510 | int_thread_hash = NULL; | ||
| 511 | } | ||
| 512 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 513 | |||
| 514 | ERRFN(thread_release)(&hash); | ||
| 515 | if (p) | ||
| 516 | ERR_STATE_free(p); | ||
| 517 | } | ||
| 518 | |||
| 519 | static int int_err_get_next_lib(void) | ||
| 520 | { | ||
| 521 | int ret; | ||
| 522 | |||
| 523 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 524 | ret = int_err_library_number++; | ||
| 525 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 526 | |||
| 527 | return ret; | ||
| 528 | } | ||
| 529 | |||
| 530 | |||
| 531 | #ifndef OPENSSL_NO_ERR | ||
| 532 | #define NUM_SYS_STR_REASONS 127 | ||
| 533 | #define LEN_SYS_STR_REASON 32 | ||
| 534 | |||
| 535 | static ERR_STRING_DATA SYS_str_reasons[NUM_SYS_STR_REASONS + 1]; | ||
| 536 | /* SYS_str_reasons is filled with copies of strerror() results at | ||
| 537 | * initialization. | ||
| 538 | * 'errno' values up to 127 should cover all usual errors, | ||
| 539 | * others will be displayed numerically by ERR_error_string. | ||
| 540 | * It is crucial that we have something for each reason code | ||
| 541 | * that occurs in ERR_str_reasons, or bogus reason strings | ||
| 542 | * will be returned for SYSerr(), which always gets an errno | ||
| 543 | * value and never one of those 'standard' reason codes. */ | ||
| 544 | |||
| 545 | static void build_SYS_str_reasons(void) | ||
| 546 | { | ||
| 547 | /* OPENSSL_malloc cannot be used here, use static storage instead */ | ||
| 548 | static char strerror_tab[NUM_SYS_STR_REASONS][LEN_SYS_STR_REASON]; | ||
| 549 | int i; | ||
| 550 | static int init = 1; | ||
| 551 | |||
| 552 | CRYPTO_r_lock(CRYPTO_LOCK_ERR); | ||
| 553 | if (!init) | ||
| 554 | { | ||
| 555 | CRYPTO_r_unlock(CRYPTO_LOCK_ERR); | ||
| 556 | return; | ||
| 557 | } | ||
| 558 | |||
| 559 | CRYPTO_r_unlock(CRYPTO_LOCK_ERR); | ||
| 560 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||
| 561 | if (!init) | ||
| 562 | { | ||
| 563 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 564 | return; | ||
| 565 | } | ||
| 566 | |||
| 567 | for (i = 1; i <= NUM_SYS_STR_REASONS; i++) | ||
| 568 | { | ||
| 569 | ERR_STRING_DATA *str = &SYS_str_reasons[i - 1]; | ||
| 570 | |||
| 571 | str->error = (unsigned long)i; | ||
| 572 | if (str->string == NULL) | ||
| 573 | { | ||
| 574 | char (*dest)[LEN_SYS_STR_REASON] = &(strerror_tab[i - 1]); | ||
| 575 | char *src = strerror(i); | ||
| 576 | if (src != NULL) | ||
| 577 | { | ||
| 578 | strncpy(*dest, src, sizeof *dest); | ||
| 579 | (*dest)[sizeof *dest - 1] = '\0'; | ||
| 580 | str->string = *dest; | ||
| 581 | } | ||
| 582 | } | ||
| 583 | if (str->string == NULL) | ||
| 584 | str->string = "unknown"; | ||
| 585 | } | ||
| 586 | |||
| 587 | /* Now we still have SYS_str_reasons[NUM_SYS_STR_REASONS] = {0, NULL}, | ||
| 588 | * as required by ERR_load_strings. */ | ||
| 589 | |||
| 590 | init = 0; | ||
| 591 | |||
| 592 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||
| 593 | } | ||
| 594 | #endif | ||
| 595 | 125 | ||
| 596 | #define err_clear_data(p,i) \ | 126 | #define err_clear_data(p,i) \ |
| 597 | do { \ | 127 | do { \ |
| @@ -613,68 +143,6 @@ static void build_SYS_str_reasons(void) | |||
| 613 | (p)->err_line[i]= -1; \ | 143 | (p)->err_line[i]= -1; \ |
| 614 | } while(0) | 144 | } while(0) |
| 615 | 145 | ||
| 616 | static void ERR_STATE_free(ERR_STATE *s) | ||
| 617 | { | ||
| 618 | int i; | ||
| 619 | |||
| 620 | if (s == NULL) | ||
| 621 | return; | ||
| 622 | |||
| 623 | for (i=0; i<ERR_NUM_ERRORS; i++) | ||
| 624 | { | ||
| 625 | err_clear_data(s,i); | ||
| 626 | } | ||
| 627 | OPENSSL_free(s); | ||
| 628 | } | ||
| 629 | |||
| 630 | void ERR_load_ERR_strings(void) | ||
| 631 | { | ||
| 632 | err_fns_check(); | ||
| 633 | #ifndef OPENSSL_NO_ERR | ||
| 634 | err_load_strings(0,ERR_str_libraries); | ||
| 635 | err_load_strings(0,ERR_str_reasons); | ||
| 636 | err_load_strings(ERR_LIB_SYS,ERR_str_functs); | ||
| 637 | build_SYS_str_reasons(); | ||
| 638 | err_load_strings(ERR_LIB_SYS,SYS_str_reasons); | ||
| 639 | #endif | ||
| 640 | } | ||
| 641 | |||
| 642 | static void err_load_strings(int lib, ERR_STRING_DATA *str) | ||
| 643 | { | ||
| 644 | while (str->error) | ||
| 645 | { | ||
| 646 | if (lib) | ||
| 647 | str->error|=ERR_PACK(lib,0,0); | ||
| 648 | ERRFN(err_set_item)(str); | ||
| 649 | str++; | ||
| 650 | } | ||
| 651 | } | ||
| 652 | |||
| 653 | void ERR_load_strings(int lib, ERR_STRING_DATA *str) | ||
| 654 | { | ||
| 655 | ERR_load_ERR_strings(); | ||
| 656 | err_load_strings(lib, str); | ||
| 657 | } | ||
| 658 | |||
| 659 | void ERR_unload_strings(int lib, ERR_STRING_DATA *str) | ||
| 660 | { | ||
| 661 | while (str->error) | ||
| 662 | { | ||
| 663 | if (lib) | ||
| 664 | str->error|=ERR_PACK(lib,0,0); | ||
| 665 | ERRFN(err_del_item)(str); | ||
| 666 | str++; | ||
| 667 | } | ||
| 668 | } | ||
| 669 | |||
| 670 | void ERR_free_strings(void) | ||
| 671 | { | ||
| 672 | err_fns_check(); | ||
| 673 | ERRFN(err_del)(); | ||
| 674 | } | ||
| 675 | |||
| 676 | /********************************************************/ | ||
| 677 | |||
| 678 | void ERR_put_error(int lib, int func, int reason, const char *file, | 146 | void ERR_put_error(int lib, int func, int reason, const char *file, |
| 679 | int line) | 147 | int line) |
| 680 | { | 148 | { |
| @@ -829,218 +297,6 @@ static unsigned long get_error_values(int inc, int top, const char **file, int * | |||
| 829 | return ret; | 297 | return ret; |
| 830 | } | 298 | } |
| 831 | 299 | ||
| 832 | void ERR_error_string_n(unsigned long e, char *buf, size_t len) | ||
| 833 | { | ||
| 834 | char lsbuf[64], fsbuf[64], rsbuf[64]; | ||
| 835 | const char *ls,*fs,*rs; | ||
| 836 | unsigned long l,f,r; | ||
| 837 | |||
| 838 | l=ERR_GET_LIB(e); | ||
| 839 | f=ERR_GET_FUNC(e); | ||
| 840 | r=ERR_GET_REASON(e); | ||
| 841 | |||
| 842 | ls=ERR_lib_error_string(e); | ||
| 843 | fs=ERR_func_error_string(e); | ||
| 844 | rs=ERR_reason_error_string(e); | ||
| 845 | |||
| 846 | if (ls == NULL) | ||
| 847 | BIO_snprintf(lsbuf, sizeof(lsbuf), "lib(%lu)", l); | ||
| 848 | if (fs == NULL) | ||
| 849 | BIO_snprintf(fsbuf, sizeof(fsbuf), "func(%lu)", f); | ||
| 850 | if (rs == NULL) | ||
| 851 | BIO_snprintf(rsbuf, sizeof(rsbuf), "reason(%lu)", r); | ||
| 852 | |||
| 853 | BIO_snprintf(buf, len,"error:%08lX:%s:%s:%s", e, ls?ls:lsbuf, | ||
| 854 | fs?fs:fsbuf, rs?rs:rsbuf); | ||
| 855 | if (strlen(buf) == len-1) | ||
| 856 | { | ||
| 857 | /* output may be truncated; make sure we always have 5 | ||
| 858 | * colon-separated fields, i.e. 4 colons ... */ | ||
| 859 | #define NUM_COLONS 4 | ||
| 860 | if (len > NUM_COLONS) /* ... if possible */ | ||
| 861 | { | ||
| 862 | int i; | ||
| 863 | char *s = buf; | ||
| 864 | |||
| 865 | for (i = 0; i < NUM_COLONS; i++) | ||
| 866 | { | ||
| 867 | char *colon = strchr(s, ':'); | ||
| 868 | if (colon == NULL || colon > &buf[len-1] - NUM_COLONS + i) | ||
| 869 | { | ||
| 870 | /* set colon no. i at last possible position | ||
| 871 | * (buf[len-1] is the terminating 0)*/ | ||
| 872 | colon = &buf[len-1] - NUM_COLONS + i; | ||
| 873 | *colon = ':'; | ||
| 874 | } | ||
| 875 | s = colon + 1; | ||
| 876 | } | ||
| 877 | } | ||
| 878 | } | ||
| 879 | } | ||
| 880 | |||
| 881 | /* BAD for multi-threading: uses a local buffer if ret == NULL */ | ||
| 882 | /* ERR_error_string_n should be used instead for ret != NULL | ||
| 883 | * as ERR_error_string cannot know how large the buffer is */ | ||
| 884 | char *ERR_error_string(unsigned long e, char *ret) | ||
| 885 | { | ||
| 886 | static char buf[256]; | ||
| 887 | |||
| 888 | if (ret == NULL) ret=buf; | ||
| 889 | ERR_error_string_n(e, ret, 256); | ||
| 890 | |||
| 891 | return ret; | ||
| 892 | } | ||
| 893 | |||
| 894 | LHASH *ERR_get_string_table(void) | ||
| 895 | { | ||
| 896 | err_fns_check(); | ||
| 897 | return ERRFN(err_get)(0); | ||
| 898 | } | ||
| 899 | |||
| 900 | LHASH *ERR_get_err_state_table(void) | ||
| 901 | { | ||
| 902 | err_fns_check(); | ||
| 903 | return ERRFN(thread_get)(0); | ||
| 904 | } | ||
| 905 | |||
| 906 | void ERR_release_err_state_table(LHASH **hash) | ||
| 907 | { | ||
| 908 | err_fns_check(); | ||
| 909 | ERRFN(thread_release)(hash); | ||
| 910 | } | ||
| 911 | |||
| 912 | const char *ERR_lib_error_string(unsigned long e) | ||
| 913 | { | ||
| 914 | ERR_STRING_DATA d,*p; | ||
| 915 | unsigned long l; | ||
| 916 | |||
| 917 | err_fns_check(); | ||
| 918 | l=ERR_GET_LIB(e); | ||
| 919 | d.error=ERR_PACK(l,0,0); | ||
| 920 | p=ERRFN(err_get_item)(&d); | ||
| 921 | return((p == NULL)?NULL:p->string); | ||
| 922 | } | ||
| 923 | |||
| 924 | const char *ERR_func_error_string(unsigned long e) | ||
| 925 | { | ||
| 926 | ERR_STRING_DATA d,*p; | ||
| 927 | unsigned long l,f; | ||
| 928 | |||
| 929 | err_fns_check(); | ||
| 930 | l=ERR_GET_LIB(e); | ||
| 931 | f=ERR_GET_FUNC(e); | ||
| 932 | d.error=ERR_PACK(l,f,0); | ||
| 933 | p=ERRFN(err_get_item)(&d); | ||
| 934 | return((p == NULL)?NULL:p->string); | ||
| 935 | } | ||
| 936 | |||
| 937 | const char *ERR_reason_error_string(unsigned long e) | ||
| 938 | { | ||
| 939 | ERR_STRING_DATA d,*p=NULL; | ||
| 940 | unsigned long l,r; | ||
| 941 | |||
| 942 | err_fns_check(); | ||
| 943 | l=ERR_GET_LIB(e); | ||
| 944 | r=ERR_GET_REASON(e); | ||
| 945 | d.error=ERR_PACK(l,0,r); | ||
| 946 | p=ERRFN(err_get_item)(&d); | ||
| 947 | if (!p) | ||
| 948 | { | ||
| 949 | d.error=ERR_PACK(0,0,r); | ||
| 950 | p=ERRFN(err_get_item)(&d); | ||
| 951 | } | ||
| 952 | return((p == NULL)?NULL:p->string); | ||
| 953 | } | ||
| 954 | |||
| 955 | /* static unsigned long err_hash(ERR_STRING_DATA *a) */ | ||
| 956 | static unsigned long err_hash(const void *a_void) | ||
| 957 | { | ||
| 958 | unsigned long ret,l; | ||
| 959 | |||
| 960 | l=((const ERR_STRING_DATA *)a_void)->error; | ||
| 961 | ret=l^ERR_GET_LIB(l)^ERR_GET_FUNC(l); | ||
| 962 | return(ret^ret%19*13); | ||
| 963 | } | ||
| 964 | |||
| 965 | /* static int err_cmp(ERR_STRING_DATA *a, ERR_STRING_DATA *b) */ | ||
| 966 | static int err_cmp(const void *a_void, const void *b_void) | ||
| 967 | { | ||
| 968 | return((int)(((const ERR_STRING_DATA *)a_void)->error - | ||
| 969 | ((const ERR_STRING_DATA *)b_void)->error)); | ||
| 970 | } | ||
| 971 | |||
| 972 | /* static unsigned long pid_hash(ERR_STATE *a) */ | ||
| 973 | static unsigned long pid_hash(const void *a_void) | ||
| 974 | { | ||
| 975 | return(((const ERR_STATE *)a_void)->pid*13); | ||
| 976 | } | ||
| 977 | |||
| 978 | /* static int pid_cmp(ERR_STATE *a, ERR_STATE *b) */ | ||
| 979 | static int pid_cmp(const void *a_void, const void *b_void) | ||
| 980 | { | ||
| 981 | return((int)((long)((const ERR_STATE *)a_void)->pid - | ||
| 982 | (long)((const ERR_STATE *)b_void)->pid)); | ||
| 983 | } | ||
| 984 | |||
| 985 | void ERR_remove_state(unsigned long pid) | ||
| 986 | { | ||
| 987 | ERR_STATE tmp; | ||
| 988 | |||
| 989 | err_fns_check(); | ||
| 990 | if (pid == 0) | ||
| 991 | pid=(unsigned long)CRYPTO_thread_id(); | ||
| 992 | tmp.pid=pid; | ||
| 993 | /* thread_del_item automatically destroys the LHASH if the number of | ||
| 994 | * items reaches zero. */ | ||
| 995 | ERRFN(thread_del_item)(&tmp); | ||
| 996 | } | ||
| 997 | |||
| 998 | ERR_STATE *ERR_get_state(void) | ||
| 999 | { | ||
| 1000 | static ERR_STATE fallback; | ||
| 1001 | ERR_STATE *ret,tmp,*tmpp=NULL; | ||
| 1002 | int i; | ||
| 1003 | unsigned long pid; | ||
| 1004 | |||
| 1005 | err_fns_check(); | ||
| 1006 | pid=(unsigned long)CRYPTO_thread_id(); | ||
| 1007 | tmp.pid=pid; | ||
| 1008 | ret=ERRFN(thread_get_item)(&tmp); | ||
| 1009 | |||
| 1010 | /* ret == the error state, if NULL, make a new one */ | ||
| 1011 | if (ret == NULL) | ||
| 1012 | { | ||
| 1013 | ret=(ERR_STATE *)OPENSSL_malloc(sizeof(ERR_STATE)); | ||
| 1014 | if (ret == NULL) return(&fallback); | ||
| 1015 | ret->pid=pid; | ||
| 1016 | ret->top=0; | ||
| 1017 | ret->bottom=0; | ||
| 1018 | for (i=0; i<ERR_NUM_ERRORS; i++) | ||
| 1019 | { | ||
| 1020 | ret->err_data[i]=NULL; | ||
| 1021 | ret->err_data_flags[i]=0; | ||
| 1022 | } | ||
| 1023 | tmpp = ERRFN(thread_set_item)(ret); | ||
| 1024 | /* To check if insertion failed, do a get. */ | ||
| 1025 | if (ERRFN(thread_get_item)(ret) != ret) | ||
| 1026 | { | ||
| 1027 | ERR_STATE_free(ret); /* could not insert it */ | ||
| 1028 | return(&fallback); | ||
| 1029 | } | ||
| 1030 | /* If a race occured in this function and we came second, tmpp | ||
| 1031 | * is the first one that we just replaced. */ | ||
| 1032 | if (tmpp) | ||
| 1033 | ERR_STATE_free(tmpp); | ||
| 1034 | } | ||
| 1035 | return ret; | ||
| 1036 | } | ||
| 1037 | |||
| 1038 | int ERR_get_next_error_library(void) | ||
| 1039 | { | ||
| 1040 | err_fns_check(); | ||
| 1041 | return ERRFN(get_next_lib)(); | ||
| 1042 | } | ||
| 1043 | |||
| 1044 | void ERR_set_error_data(char *data, int flags) | 300 | void ERR_set_error_data(char *data, int flags) |
| 1045 | { | 301 | { |
| 1046 | ERR_STATE *es; | 302 | ERR_STATE *es; |
| @@ -1127,3 +383,34 @@ int ERR_pop_to_mark(void) | |||
| 1127 | es->err_flags[es->top]&=~ERR_FLAG_MARK; | 383 | es->err_flags[es->top]&=~ERR_FLAG_MARK; |
| 1128 | return 1; | 384 | return 1; |
| 1129 | } | 385 | } |
| 386 | |||
| 387 | #ifdef OPENSSL_FIPS | ||
| 388 | |||
| 389 | static ERR_STATE *fget_state(void) | ||
| 390 | { | ||
| 391 | static ERR_STATE fstate; | ||
| 392 | return &fstate; | ||
| 393 | } | ||
| 394 | |||
| 395 | ERR_STATE *(*get_state_func)(void) = fget_state; | ||
| 396 | void (*remove_state_func)(unsigned long pid); | ||
| 397 | |||
| 398 | ERR_STATE *ERR_get_state(void) | ||
| 399 | { | ||
| 400 | return get_state_func(); | ||
| 401 | } | ||
| 402 | |||
| 403 | void int_ERR_set_state_func(ERR_STATE *(*get_func)(void), | ||
| 404 | void (*remove_func)(unsigned long pid)) | ||
| 405 | { | ||
| 406 | get_state_func = get_func; | ||
| 407 | remove_state_func = remove_func; | ||
| 408 | } | ||
| 409 | |||
| 410 | void ERR_remove_state(unsigned long pid) | ||
| 411 | { | ||
| 412 | if (remove_state_func) | ||
| 413 | remove_state_func(pid); | ||
| 414 | } | ||
| 415 | |||
| 416 | #endif | ||
diff --git a/src/lib/libcrypto/err/err.h b/src/lib/libcrypto/err/err.h index bf28fce492..dcac415231 100644 --- a/src/lib/libcrypto/err/err.h +++ b/src/lib/libcrypto/err/err.h | |||
| @@ -140,7 +140,9 @@ typedef struct err_state_st | |||
| 140 | #define ERR_LIB_ECDSA 42 | 140 | #define ERR_LIB_ECDSA 42 |
| 141 | #define ERR_LIB_ECDH 43 | 141 | #define ERR_LIB_ECDH 43 |
| 142 | #define ERR_LIB_STORE 44 | 142 | #define ERR_LIB_STORE 44 |
| 143 | #define ERR_LIB_CMS 45 | 143 | #define ERR_LIB_FIPS 45 |
| 144 | #define ERR_LIB_CMS 46 | ||
| 145 | #define ERR_LIB_JPAKE 47 | ||
| 144 | 146 | ||
| 145 | #define ERR_LIB_USER 128 | 147 | #define ERR_LIB_USER 128 |
| 146 | 148 | ||
| @@ -172,7 +174,9 @@ typedef struct err_state_st | |||
| 172 | #define ECDSAerr(f,r) ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),__FILE__,__LINE__) | 174 | #define ECDSAerr(f,r) ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),__FILE__,__LINE__) |
| 173 | #define ECDHerr(f,r) ERR_PUT_error(ERR_LIB_ECDH,(f),(r),__FILE__,__LINE__) | 175 | #define ECDHerr(f,r) ERR_PUT_error(ERR_LIB_ECDH,(f),(r),__FILE__,__LINE__) |
| 174 | #define STOREerr(f,r) ERR_PUT_error(ERR_LIB_STORE,(f),(r),__FILE__,__LINE__) | 176 | #define STOREerr(f,r) ERR_PUT_error(ERR_LIB_STORE,(f),(r),__FILE__,__LINE__) |
| 177 | #define FIPSerr(f,r) ERR_PUT_error(ERR_LIB_FIPS,(f),(r),__FILE__,__LINE__) | ||
| 175 | #define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),__FILE__,__LINE__) | 178 | #define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),__FILE__,__LINE__) |
| 179 | #define JPAKEerr(f,r) ERR_PUT_error(ERR_LIB_JPAKE,(f),(r),__FILE__,__LINE__) | ||
| 176 | 180 | ||
| 177 | /* Borland C seems too stupid to be able to shift and do longs in | 181 | /* Borland C seems too stupid to be able to shift and do longs in |
| 178 | * the pre-processor :-( */ | 182 | * the pre-processor :-( */ |
| @@ -304,6 +308,12 @@ int ERR_get_next_error_library(void); | |||
| 304 | int ERR_set_mark(void); | 308 | int ERR_set_mark(void); |
| 305 | int ERR_pop_to_mark(void); | 309 | int ERR_pop_to_mark(void); |
| 306 | 310 | ||
| 311 | #ifdef OPENSSL_FIPS | ||
| 312 | void int_ERR_set_state_func(ERR_STATE *(*get_func)(void), | ||
| 313 | void (*remove_func)(unsigned long pid)); | ||
| 314 | void int_ERR_lib_init(void); | ||
| 315 | #endif | ||
| 316 | |||
| 307 | /* Already defined in ossl_typ.h */ | 317 | /* Already defined in ossl_typ.h */ |
| 308 | /* typedef struct st_ERR_FNS ERR_FNS; */ | 318 | /* typedef struct st_ERR_FNS ERR_FNS; */ |
| 309 | /* An application can use this function and provide the return value to loaded | 319 | /* An application can use this function and provide the return value to loaded |
diff --git a/src/lib/libcrypto/err/err_all.c b/src/lib/libcrypto/err/err_all.c index 5813060ce2..f21a5276ed 100644 --- a/src/lib/libcrypto/err/err_all.c +++ b/src/lib/libcrypto/err/err_all.c | |||
| @@ -94,9 +94,16 @@ | |||
| 94 | #include <openssl/ui.h> | 94 | #include <openssl/ui.h> |
| 95 | #include <openssl/ocsp.h> | 95 | #include <openssl/ocsp.h> |
| 96 | #include <openssl/err.h> | 96 | #include <openssl/err.h> |
| 97 | #ifdef OPENSSL_FIPS | ||
| 98 | #include <openssl/fips.h> | ||
| 99 | #endif | ||
| 100 | |||
| 97 | #ifndef OPENSSL_NO_CMS | 101 | #ifndef OPENSSL_NO_CMS |
| 98 | #include <openssl/cms.h> | 102 | #include <openssl/cms.h> |
| 99 | #endif | 103 | #endif |
| 104 | #ifndef OPENSSL_NO_JPAKE | ||
| 105 | #include <openssl/jpake.h> | ||
| 106 | #endif | ||
| 100 | 107 | ||
| 101 | void ERR_load_crypto_strings(void) | 108 | void ERR_load_crypto_strings(void) |
| 102 | { | 109 | { |
| @@ -141,8 +148,14 @@ void ERR_load_crypto_strings(void) | |||
| 141 | #endif | 148 | #endif |
| 142 | ERR_load_OCSP_strings(); | 149 | ERR_load_OCSP_strings(); |
| 143 | ERR_load_UI_strings(); | 150 | ERR_load_UI_strings(); |
| 151 | #ifdef OPENSSL_FIPS | ||
| 152 | ERR_load_FIPS_strings(); | ||
| 153 | #endif | ||
| 144 | #ifndef OPENSSL_NO_CMS | 154 | #ifndef OPENSSL_NO_CMS |
| 145 | ERR_load_CMS_strings(); | 155 | ERR_load_CMS_strings(); |
| 146 | #endif | 156 | #endif |
| 157 | #ifndef OPENSSL_NO_JPAKE | ||
| 158 | ERR_load_JPAKE_strings(); | ||
| 159 | #endif | ||
| 147 | #endif | 160 | #endif |
| 148 | } | 161 | } |
diff --git a/src/lib/libcrypto/err/err_prn.c b/src/lib/libcrypto/err/err_prn.c index 2224a901e5..4cdf342fa6 100644 --- a/src/lib/libcrypto/err/err_prn.c +++ b/src/lib/libcrypto/err/err_prn.c | |||
| @@ -86,12 +86,7 @@ void ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u), | |||
| 86 | #ifndef OPENSSL_NO_FP_API | 86 | #ifndef OPENSSL_NO_FP_API |
| 87 | static int print_fp(const char *str, size_t len, void *fp) | 87 | static int print_fp(const char *str, size_t len, void *fp) |
| 88 | { | 88 | { |
| 89 | BIO bio; | 89 | return fwrite(str, 1, len, fp); |
| 90 | |||
| 91 | BIO_set(&bio,BIO_s_file()); | ||
| 92 | BIO_set_fp(&bio,fp,BIO_NOCLOSE); | ||
| 93 | |||
| 94 | return BIO_printf(&bio, "%s", str); | ||
| 95 | } | 90 | } |
| 96 | void ERR_print_errors_fp(FILE *fp) | 91 | void ERR_print_errors_fp(FILE *fp) |
| 97 | { | 92 | { |
| @@ -99,13 +94,64 @@ void ERR_print_errors_fp(FILE *fp) | |||
| 99 | } | 94 | } |
| 100 | #endif | 95 | #endif |
| 101 | 96 | ||
| 102 | static int print_bio(const char *str, size_t len, void *bp) | 97 | void ERR_error_string_n(unsigned long e, char *buf, size_t len) |
| 103 | { | 98 | { |
| 104 | return BIO_write((BIO *)bp, str, len); | 99 | char lsbuf[64], fsbuf[64], rsbuf[64]; |
| 100 | const char *ls,*fs,*rs; | ||
| 101 | unsigned long l,f,r; | ||
| 102 | |||
| 103 | l=ERR_GET_LIB(e); | ||
| 104 | f=ERR_GET_FUNC(e); | ||
| 105 | r=ERR_GET_REASON(e); | ||
| 106 | |||
| 107 | ls=ERR_lib_error_string(e); | ||
| 108 | fs=ERR_func_error_string(e); | ||
| 109 | rs=ERR_reason_error_string(e); | ||
| 110 | |||
| 111 | if (ls == NULL) | ||
| 112 | BIO_snprintf(lsbuf, sizeof(lsbuf), "lib(%lu)", l); | ||
| 113 | if (fs == NULL) | ||
| 114 | BIO_snprintf(fsbuf, sizeof(fsbuf), "func(%lu)", f); | ||
| 115 | if (rs == NULL) | ||
| 116 | BIO_snprintf(rsbuf, sizeof(rsbuf), "reason(%lu)", r); | ||
| 117 | |||
| 118 | BIO_snprintf(buf, len,"error:%08lX:%s:%s:%s", e, ls?ls:lsbuf, | ||
| 119 | fs?fs:fsbuf, rs?rs:rsbuf); | ||
| 120 | if (strlen(buf) == len-1) | ||
| 121 | { | ||
| 122 | /* output may be truncated; make sure we always have 5 | ||
| 123 | * colon-separated fields, i.e. 4 colons ... */ | ||
| 124 | #define NUM_COLONS 4 | ||
| 125 | if (len > NUM_COLONS) /* ... if possible */ | ||
| 126 | { | ||
| 127 | int i; | ||
| 128 | char *s = buf; | ||
| 129 | |||
| 130 | for (i = 0; i < NUM_COLONS; i++) | ||
| 131 | { | ||
| 132 | char *colon = strchr(s, ':'); | ||
| 133 | if (colon == NULL || colon > &buf[len-1] - NUM_COLONS + i) | ||
| 134 | { | ||
| 135 | /* set colon no. i at last possible position | ||
| 136 | * (buf[len-1] is the terminating 0)*/ | ||
| 137 | colon = &buf[len-1] - NUM_COLONS + i; | ||
| 138 | *colon = ':'; | ||
| 139 | } | ||
| 140 | s = colon + 1; | ||
| 141 | } | ||
| 142 | } | ||
| 143 | } | ||
| 105 | } | 144 | } |
| 106 | void ERR_print_errors(BIO *bp) | 145 | |
| 146 | /* BAD for multi-threading: uses a local buffer if ret == NULL */ | ||
| 147 | /* ERR_error_string_n should be used instead for ret != NULL | ||
| 148 | * as ERR_error_string cannot know how large the buffer is */ | ||
| 149 | char *ERR_error_string(unsigned long e, char *ret) | ||
| 107 | { | 150 | { |
| 108 | ERR_print_errors_cb(print_bio, bp); | 151 | static char buf[256]; |
| 109 | } | 152 | |
| 153 | if (ret == NULL) ret=buf; | ||
| 154 | ERR_error_string_n(e, ret, 256); | ||
| 110 | 155 | ||
| 111 | 156 | return ret; | |
| 157 | } | ||
diff --git a/src/lib/libcrypto/err/openssl.ec b/src/lib/libcrypto/err/openssl.ec index 1938f081ac..868826624d 100644 --- a/src/lib/libcrypto/err/openssl.ec +++ b/src/lib/libcrypto/err/openssl.ec | |||
| @@ -31,7 +31,9 @@ L COMP crypto/comp/comp.h crypto/comp/comp_err.c | |||
| 31 | L ECDSA crypto/ecdsa/ecdsa.h crypto/ecdsa/ecs_err.c | 31 | L ECDSA crypto/ecdsa/ecdsa.h crypto/ecdsa/ecs_err.c |
| 32 | L ECDH crypto/ecdh/ecdh.h crypto/ecdh/ech_err.c | 32 | L ECDH crypto/ecdh/ecdh.h crypto/ecdh/ech_err.c |
| 33 | L STORE crypto/store/store.h crypto/store/str_err.c | 33 | L STORE crypto/store/store.h crypto/store/str_err.c |
| 34 | L FIPS fips/fips.h crypto/fips_err.h | ||
| 34 | L CMS crypto/cms/cms.h crypto/cms/cms_err.c | 35 | L CMS crypto/cms/cms.h crypto/cms/cms_err.c |
| 36 | L JPAKE crypto/jpake/jpake.h crypto/jpake/jpake_err.c | ||
| 35 | 37 | ||
| 36 | # additional header files to be scanned for function names | 38 | # additional header files to be scanned for function names |
| 37 | L NONE crypto/x509/x509_vfy.h NONE | 39 | L NONE crypto/x509/x509_vfy.h NONE |
diff --git a/src/lib/libcrypto/evp/bio_md.c b/src/lib/libcrypto/evp/bio_md.c index d648ac6da6..ed5c1135fd 100644 --- a/src/lib/libcrypto/evp/bio_md.c +++ b/src/lib/libcrypto/evp/bio_md.c | |||
| @@ -192,13 +192,8 @@ static long md_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 192 | ret=0; | 192 | ret=0; |
| 193 | break; | 193 | break; |
| 194 | case BIO_C_GET_MD_CTX: | 194 | case BIO_C_GET_MD_CTX: |
| 195 | if (b->init) | 195 | pctx=ptr; |
| 196 | { | 196 | *pctx=ctx; |
| 197 | pctx=ptr; | ||
| 198 | *pctx=ctx; | ||
| 199 | } | ||
| 200 | else | ||
| 201 | ret=0; | ||
| 202 | break; | 197 | break; |
| 203 | case BIO_C_SET_MD_CTX: | 198 | case BIO_C_SET_MD_CTX: |
| 204 | if (b->init) | 199 | if (b->init) |
diff --git a/src/lib/libcrypto/evp/digest.c b/src/lib/libcrypto/evp/digest.c index 762e6d3450..3bc2d1295c 100644 --- a/src/lib/libcrypto/evp/digest.c +++ b/src/lib/libcrypto/evp/digest.c | |||
| @@ -116,6 +116,7 @@ | |||
| 116 | #ifndef OPENSSL_NO_ENGINE | 116 | #ifndef OPENSSL_NO_ENGINE |
| 117 | #include <openssl/engine.h> | 117 | #include <openssl/engine.h> |
| 118 | #endif | 118 | #endif |
| 119 | #include "evp_locl.h" | ||
| 119 | 120 | ||
| 120 | void EVP_MD_CTX_init(EVP_MD_CTX *ctx) | 121 | void EVP_MD_CTX_init(EVP_MD_CTX *ctx) |
| 121 | { | 122 | { |
| @@ -137,18 +138,77 @@ int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type) | |||
| 137 | return EVP_DigestInit_ex(ctx, type, NULL); | 138 | return EVP_DigestInit_ex(ctx, type, NULL); |
| 138 | } | 139 | } |
| 139 | 140 | ||
| 140 | int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) | 141 | #ifdef OPENSSL_FIPS |
| 142 | |||
| 143 | /* The purpose of these is to trap programs that attempt to use non FIPS | ||
| 144 | * algorithms in FIPS mode and ignore the errors. | ||
| 145 | */ | ||
| 146 | |||
| 147 | static int bad_init(EVP_MD_CTX *ctx) | ||
| 148 | { FIPS_ERROR_IGNORED("Digest init"); return 0;} | ||
| 149 | |||
| 150 | static int bad_update(EVP_MD_CTX *ctx,const void *data,size_t count) | ||
| 151 | { FIPS_ERROR_IGNORED("Digest update"); return 0;} | ||
| 152 | |||
| 153 | static int bad_final(EVP_MD_CTX *ctx,unsigned char *md) | ||
| 154 | { FIPS_ERROR_IGNORED("Digest Final"); return 0;} | ||
| 155 | |||
| 156 | static const EVP_MD bad_md = | ||
| 141 | { | 157 | { |
| 142 | EVP_MD_CTX_clear_flags(ctx,EVP_MD_CTX_FLAG_CLEANED); | 158 | 0, |
| 159 | 0, | ||
| 160 | 0, | ||
| 161 | 0, | ||
| 162 | bad_init, | ||
| 163 | bad_update, | ||
| 164 | bad_final, | ||
| 165 | NULL, | ||
| 166 | NULL, | ||
| 167 | NULL, | ||
| 168 | 0, | ||
| 169 | {0,0,0,0}, | ||
| 170 | }; | ||
| 171 | |||
| 172 | #endif | ||
| 173 | |||
| 143 | #ifndef OPENSSL_NO_ENGINE | 174 | #ifndef OPENSSL_NO_ENGINE |
| 144 | /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts | 175 | |
| 145 | * so this context may already have an ENGINE! Try to avoid releasing | 176 | #ifdef OPENSSL_FIPS |
| 146 | * the previous handle, re-querying for an ENGINE, and having a | 177 | |
| 147 | * reinitialisation, when it may all be unecessary. */ | 178 | static int do_engine_null(ENGINE *impl) { return 0;} |
| 148 | if (ctx->engine && ctx->digest && (!type || | 179 | static int do_evp_md_engine_null(EVP_MD_CTX *ctx, |
| 149 | (type && (type->type == ctx->digest->type)))) | 180 | const EVP_MD **ptype, ENGINE *impl) |
| 150 | goto skip_to_init; | 181 | { return 1; } |
| 151 | if (type) | 182 | |
| 183 | static int (*do_engine_init)(ENGINE *impl) | ||
| 184 | = do_engine_null; | ||
| 185 | |||
| 186 | static int (*do_engine_finish)(ENGINE *impl) | ||
| 187 | = do_engine_null; | ||
| 188 | |||
| 189 | static int (*do_evp_md_engine) | ||
| 190 | (EVP_MD_CTX *ctx, const EVP_MD **ptype, ENGINE *impl) | ||
| 191 | = do_evp_md_engine_null; | ||
| 192 | |||
| 193 | void int_EVP_MD_set_engine_callbacks( | ||
| 194 | int (*eng_md_init)(ENGINE *impl), | ||
| 195 | int (*eng_md_fin)(ENGINE *impl), | ||
| 196 | int (*eng_md_evp) | ||
| 197 | (EVP_MD_CTX *ctx, const EVP_MD **ptype, ENGINE *impl)) | ||
| 198 | { | ||
| 199 | do_engine_init = eng_md_init; | ||
| 200 | do_engine_finish = eng_md_fin; | ||
| 201 | do_evp_md_engine = eng_md_evp; | ||
| 202 | } | ||
| 203 | |||
| 204 | #else | ||
| 205 | |||
| 206 | #define do_engine_init ENGINE_init | ||
| 207 | #define do_engine_finish ENGINE_finish | ||
| 208 | |||
| 209 | static int do_evp_md_engine(EVP_MD_CTX *ctx, const EVP_MD **ptype, ENGINE *impl) | ||
| 210 | { | ||
| 211 | if (*ptype) | ||
| 152 | { | 212 | { |
| 153 | /* Ensure an ENGINE left lying around from last time is cleared | 213 | /* Ensure an ENGINE left lying around from last time is cleared |
| 154 | * (the previous check attempted to avoid this if the same | 214 | * (the previous check attempted to avoid this if the same |
| @@ -159,25 +219,25 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) | |||
| 159 | { | 219 | { |
| 160 | if (!ENGINE_init(impl)) | 220 | if (!ENGINE_init(impl)) |
| 161 | { | 221 | { |
| 162 | EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_INITIALIZATION_ERROR); | 222 | EVPerr(EVP_F_DO_EVP_MD_ENGINE,EVP_R_INITIALIZATION_ERROR); |
| 163 | return 0; | 223 | return 0; |
| 164 | } | 224 | } |
| 165 | } | 225 | } |
| 166 | else | 226 | else |
| 167 | /* Ask if an ENGINE is reserved for this job */ | 227 | /* Ask if an ENGINE is reserved for this job */ |
| 168 | impl = ENGINE_get_digest_engine(type->type); | 228 | impl = ENGINE_get_digest_engine((*ptype)->type); |
| 169 | if(impl) | 229 | if(impl) |
| 170 | { | 230 | { |
| 171 | /* There's an ENGINE for this job ... (apparently) */ | 231 | /* There's an ENGINE for this job ... (apparently) */ |
| 172 | const EVP_MD *d = ENGINE_get_digest(impl, type->type); | 232 | const EVP_MD *d = ENGINE_get_digest(impl, (*ptype)->type); |
| 173 | if(!d) | 233 | if(!d) |
| 174 | { | 234 | { |
| 175 | /* Same comment from evp_enc.c */ | 235 | /* Same comment from evp_enc.c */ |
| 176 | EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_INITIALIZATION_ERROR); | 236 | EVPerr(EVP_F_DO_EVP_MD_ENGINE,EVP_R_INITIALIZATION_ERROR); |
| 177 | return 0; | 237 | return 0; |
| 178 | } | 238 | } |
| 179 | /* We'll use the ENGINE's private digest definition */ | 239 | /* We'll use the ENGINE's private digest definition */ |
| 180 | type = d; | 240 | *ptype = d; |
| 181 | /* Store the ENGINE functional reference so we know | 241 | /* Store the ENGINE functional reference so we know |
| 182 | * 'type' came from an ENGINE and we need to release | 242 | * 'type' came from an ENGINE and we need to release |
| 183 | * it when done. */ | 243 | * it when done. */ |
| @@ -189,12 +249,52 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) | |||
| 189 | else | 249 | else |
| 190 | if(!ctx->digest) | 250 | if(!ctx->digest) |
| 191 | { | 251 | { |
| 192 | EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_NO_DIGEST_SET); | 252 | EVPerr(EVP_F_DO_EVP_MD_ENGINE,EVP_R_NO_DIGEST_SET); |
| 193 | return 0; | 253 | return 0; |
| 194 | } | 254 | } |
| 255 | return 1; | ||
| 256 | } | ||
| 257 | |||
| 258 | #endif | ||
| 259 | |||
| 260 | #endif | ||
| 261 | |||
| 262 | int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) | ||
| 263 | { | ||
| 264 | M_EVP_MD_CTX_clear_flags(ctx,EVP_MD_CTX_FLAG_CLEANED); | ||
| 265 | #ifdef OPENSSL_FIPS | ||
| 266 | if(FIPS_selftest_failed()) | ||
| 267 | { | ||
| 268 | FIPSerr(FIPS_F_EVP_DIGESTINIT_EX,FIPS_R_FIPS_SELFTEST_FAILED); | ||
| 269 | ctx->digest = &bad_md; | ||
| 270 | return 0; | ||
| 271 | } | ||
| 272 | #endif | ||
| 273 | #ifndef OPENSSL_NO_ENGINE | ||
| 274 | /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts | ||
| 275 | * so this context may already have an ENGINE! Try to avoid releasing | ||
| 276 | * the previous handle, re-querying for an ENGINE, and having a | ||
| 277 | * reinitialisation, when it may all be unecessary. */ | ||
| 278 | if (ctx->engine && ctx->digest && (!type || | ||
| 279 | (type && (type->type == ctx->digest->type)))) | ||
| 280 | goto skip_to_init; | ||
| 281 | if (!do_evp_md_engine(ctx, &type, impl)) | ||
| 282 | return 0; | ||
| 195 | #endif | 283 | #endif |
| 196 | if (ctx->digest != type) | 284 | if (ctx->digest != type) |
| 197 | { | 285 | { |
| 286 | #ifdef OPENSSL_FIPS | ||
| 287 | if (FIPS_mode()) | ||
| 288 | { | ||
| 289 | if (!(type->flags & EVP_MD_FLAG_FIPS) | ||
| 290 | && !(ctx->flags & EVP_MD_CTX_FLAG_NON_FIPS_ALLOW)) | ||
| 291 | { | ||
| 292 | EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_DISABLED_FOR_FIPS); | ||
| 293 | ctx->digest = &bad_md; | ||
| 294 | return 0; | ||
| 295 | } | ||
| 296 | } | ||
| 297 | #endif | ||
| 198 | if (ctx->digest && ctx->digest->ctx_size) | 298 | if (ctx->digest && ctx->digest->ctx_size) |
| 199 | OPENSSL_free(ctx->md_data); | 299 | OPENSSL_free(ctx->md_data); |
| 200 | ctx->digest=type; | 300 | ctx->digest=type; |
| @@ -202,7 +302,7 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) | |||
| 202 | ctx->md_data=OPENSSL_malloc(type->ctx_size); | 302 | ctx->md_data=OPENSSL_malloc(type->ctx_size); |
| 203 | } | 303 | } |
| 204 | #ifndef OPENSSL_NO_ENGINE | 304 | #ifndef OPENSSL_NO_ENGINE |
| 205 | skip_to_init: | 305 | skip_to_init: |
| 206 | #endif | 306 | #endif |
| 207 | return ctx->digest->init(ctx); | 307 | return ctx->digest->init(ctx); |
| 208 | } | 308 | } |
| @@ -210,6 +310,9 @@ skip_to_init: | |||
| 210 | int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, | 310 | int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, |
| 211 | size_t count) | 311 | size_t count) |
| 212 | { | 312 | { |
| 313 | #ifdef OPENSSL_FIPS | ||
| 314 | FIPS_selftest_check(); | ||
| 315 | #endif | ||
| 213 | return ctx->digest->update(ctx,data,count); | 316 | return ctx->digest->update(ctx,data,count); |
| 214 | } | 317 | } |
| 215 | 318 | ||
| @@ -226,6 +329,9 @@ int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) | |||
| 226 | int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) | 329 | int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) |
| 227 | { | 330 | { |
| 228 | int ret; | 331 | int ret; |
| 332 | #ifdef OPENSSL_FIPS | ||
| 333 | FIPS_selftest_check(); | ||
| 334 | #endif | ||
| 229 | 335 | ||
| 230 | OPENSSL_assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE); | 336 | OPENSSL_assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE); |
| 231 | ret=ctx->digest->final(ctx,md); | 337 | ret=ctx->digest->final(ctx,md); |
| @@ -234,7 +340,7 @@ int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) | |||
| 234 | if (ctx->digest->cleanup) | 340 | if (ctx->digest->cleanup) |
| 235 | { | 341 | { |
| 236 | ctx->digest->cleanup(ctx); | 342 | ctx->digest->cleanup(ctx); |
| 237 | EVP_MD_CTX_set_flags(ctx,EVP_MD_CTX_FLAG_CLEANED); | 343 | M_EVP_MD_CTX_set_flags(ctx,EVP_MD_CTX_FLAG_CLEANED); |
| 238 | } | 344 | } |
| 239 | memset(ctx->md_data,0,ctx->digest->ctx_size); | 345 | memset(ctx->md_data,0,ctx->digest->ctx_size); |
| 240 | return ret; | 346 | return ret; |
| @@ -256,7 +362,7 @@ int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) | |||
| 256 | } | 362 | } |
| 257 | #ifndef OPENSSL_NO_ENGINE | 363 | #ifndef OPENSSL_NO_ENGINE |
| 258 | /* Make sure it's safe to copy a digest context using an ENGINE */ | 364 | /* Make sure it's safe to copy a digest context using an ENGINE */ |
| 259 | if (in->engine && !ENGINE_init(in->engine)) | 365 | if (in->engine && !do_engine_init(in->engine)) |
| 260 | { | 366 | { |
| 261 | EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,ERR_R_ENGINE_LIB); | 367 | EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,ERR_R_ENGINE_LIB); |
| 262 | return 0; | 368 | return 0; |
| @@ -266,7 +372,7 @@ int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) | |||
| 266 | if (out->digest == in->digest) | 372 | if (out->digest == in->digest) |
| 267 | { | 373 | { |
| 268 | tmp_buf = out->md_data; | 374 | tmp_buf = out->md_data; |
| 269 | EVP_MD_CTX_set_flags(out,EVP_MD_CTX_FLAG_REUSE); | 375 | M_EVP_MD_CTX_set_flags(out,EVP_MD_CTX_FLAG_REUSE); |
| 270 | } | 376 | } |
| 271 | else tmp_buf = NULL; | 377 | else tmp_buf = NULL; |
| 272 | EVP_MD_CTX_cleanup(out); | 378 | EVP_MD_CTX_cleanup(out); |
| @@ -292,7 +398,7 @@ int EVP_Digest(const void *data, size_t count, | |||
| 292 | int ret; | 398 | int ret; |
| 293 | 399 | ||
| 294 | EVP_MD_CTX_init(&ctx); | 400 | EVP_MD_CTX_init(&ctx); |
| 295 | EVP_MD_CTX_set_flags(&ctx,EVP_MD_CTX_FLAG_ONESHOT); | 401 | M_EVP_MD_CTX_set_flags(&ctx,EVP_MD_CTX_FLAG_ONESHOT); |
| 296 | ret=EVP_DigestInit_ex(&ctx, type, impl) | 402 | ret=EVP_DigestInit_ex(&ctx, type, impl) |
| 297 | && EVP_DigestUpdate(&ctx, data, count) | 403 | && EVP_DigestUpdate(&ctx, data, count) |
| 298 | && EVP_DigestFinal_ex(&ctx, md, size); | 404 | && EVP_DigestFinal_ex(&ctx, md, size); |
| @@ -314,10 +420,10 @@ int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) | |||
| 314 | * because sometimes only copies of the context are ever finalised. | 420 | * because sometimes only copies of the context are ever finalised. |
| 315 | */ | 421 | */ |
| 316 | if (ctx->digest && ctx->digest->cleanup | 422 | if (ctx->digest && ctx->digest->cleanup |
| 317 | && !EVP_MD_CTX_test_flags(ctx,EVP_MD_CTX_FLAG_CLEANED)) | 423 | && !M_EVP_MD_CTX_test_flags(ctx,EVP_MD_CTX_FLAG_CLEANED)) |
| 318 | ctx->digest->cleanup(ctx); | 424 | ctx->digest->cleanup(ctx); |
| 319 | if (ctx->digest && ctx->digest->ctx_size && ctx->md_data | 425 | if (ctx->digest && ctx->digest->ctx_size && ctx->md_data |
| 320 | && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) | 426 | && !M_EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) |
| 321 | { | 427 | { |
| 322 | OPENSSL_cleanse(ctx->md_data,ctx->digest->ctx_size); | 428 | OPENSSL_cleanse(ctx->md_data,ctx->digest->ctx_size); |
| 323 | OPENSSL_free(ctx->md_data); | 429 | OPENSSL_free(ctx->md_data); |
| @@ -326,7 +432,7 @@ int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) | |||
| 326 | if(ctx->engine) | 432 | if(ctx->engine) |
| 327 | /* The EVP_MD we used belongs to an ENGINE, release the | 433 | /* The EVP_MD we used belongs to an ENGINE, release the |
| 328 | * functional reference we held for this reason. */ | 434 | * functional reference we held for this reason. */ |
| 329 | ENGINE_finish(ctx->engine); | 435 | do_engine_finish(ctx->engine); |
| 330 | #endif | 436 | #endif |
| 331 | memset(ctx,'\0',sizeof *ctx); | 437 | memset(ctx,'\0',sizeof *ctx); |
| 332 | 438 | ||
diff --git a/src/lib/libcrypto/evp/e_aes.c b/src/lib/libcrypto/evp/e_aes.c index bd6c0a3a62..c9a5ee8d75 100644 --- a/src/lib/libcrypto/evp/e_aes.c +++ b/src/lib/libcrypto/evp/e_aes.c | |||
| @@ -69,32 +69,29 @@ typedef struct | |||
| 69 | 69 | ||
| 70 | IMPLEMENT_BLOCK_CIPHER(aes_128, ks, AES, EVP_AES_KEY, | 70 | IMPLEMENT_BLOCK_CIPHER(aes_128, ks, AES, EVP_AES_KEY, |
| 71 | NID_aes_128, 16, 16, 16, 128, | 71 | NID_aes_128, 16, 16, 16, 128, |
| 72 | 0, aes_init_key, NULL, | 72 | EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 73 | EVP_CIPHER_set_asn1_iv, | 73 | aes_init_key, |
| 74 | EVP_CIPHER_get_asn1_iv, | 74 | NULL, NULL, NULL, NULL) |
| 75 | NULL) | ||
| 76 | IMPLEMENT_BLOCK_CIPHER(aes_192, ks, AES, EVP_AES_KEY, | 75 | IMPLEMENT_BLOCK_CIPHER(aes_192, ks, AES, EVP_AES_KEY, |
| 77 | NID_aes_192, 16, 24, 16, 128, | 76 | NID_aes_192, 16, 24, 16, 128, |
| 78 | 0, aes_init_key, NULL, | 77 | EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 79 | EVP_CIPHER_set_asn1_iv, | 78 | aes_init_key, |
| 80 | EVP_CIPHER_get_asn1_iv, | 79 | NULL, NULL, NULL, NULL) |
| 81 | NULL) | ||
| 82 | IMPLEMENT_BLOCK_CIPHER(aes_256, ks, AES, EVP_AES_KEY, | 80 | IMPLEMENT_BLOCK_CIPHER(aes_256, ks, AES, EVP_AES_KEY, |
| 83 | NID_aes_256, 16, 32, 16, 128, | 81 | NID_aes_256, 16, 32, 16, 128, |
| 84 | 0, aes_init_key, NULL, | 82 | EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 85 | EVP_CIPHER_set_asn1_iv, | 83 | aes_init_key, |
| 86 | EVP_CIPHER_get_asn1_iv, | 84 | NULL, NULL, NULL, NULL) |
| 87 | NULL) | ||
| 88 | 85 | ||
| 89 | #define IMPLEMENT_AES_CFBR(ksize,cbits) IMPLEMENT_CFBR(aes,AES,EVP_AES_KEY,ks,ksize,cbits,16) | 86 | #define IMPLEMENT_AES_CFBR(ksize,cbits,flags) IMPLEMENT_CFBR(aes,AES,EVP_AES_KEY,ks,ksize,cbits,16,flags) |
| 90 | 87 | ||
| 91 | IMPLEMENT_AES_CFBR(128,1) | 88 | IMPLEMENT_AES_CFBR(128,1,EVP_CIPH_FLAG_FIPS) |
| 92 | IMPLEMENT_AES_CFBR(192,1) | 89 | IMPLEMENT_AES_CFBR(192,1,EVP_CIPH_FLAG_FIPS) |
| 93 | IMPLEMENT_AES_CFBR(256,1) | 90 | IMPLEMENT_AES_CFBR(256,1,EVP_CIPH_FLAG_FIPS) |
| 94 | 91 | ||
| 95 | IMPLEMENT_AES_CFBR(128,8) | 92 | IMPLEMENT_AES_CFBR(128,8,EVP_CIPH_FLAG_FIPS) |
| 96 | IMPLEMENT_AES_CFBR(192,8) | 93 | IMPLEMENT_AES_CFBR(192,8,EVP_CIPH_FLAG_FIPS) |
| 97 | IMPLEMENT_AES_CFBR(256,8) | 94 | IMPLEMENT_AES_CFBR(256,8,EVP_CIPH_FLAG_FIPS) |
| 98 | 95 | ||
| 99 | static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 96 | static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
| 100 | const unsigned char *iv, int enc) | 97 | const unsigned char *iv, int enc) |
diff --git a/src/lib/libcrypto/evp/e_camellia.c b/src/lib/libcrypto/evp/e_camellia.c index a7b40d1c60..365d397164 100644 --- a/src/lib/libcrypto/evp/e_camellia.c +++ b/src/lib/libcrypto/evp/e_camellia.c | |||
| @@ -93,7 +93,7 @@ IMPLEMENT_BLOCK_CIPHER(camellia_256, ks, Camellia, EVP_CAMELLIA_KEY, | |||
| 93 | EVP_CIPHER_get_asn1_iv, | 93 | EVP_CIPHER_get_asn1_iv, |
| 94 | NULL) | 94 | NULL) |
| 95 | 95 | ||
| 96 | #define IMPLEMENT_CAMELLIA_CFBR(ksize,cbits) IMPLEMENT_CFBR(camellia,Camellia,EVP_CAMELLIA_KEY,ks,ksize,cbits,16) | 96 | #define IMPLEMENT_CAMELLIA_CFBR(ksize,cbits) IMPLEMENT_CFBR(camellia,Camellia,EVP_CAMELLIA_KEY,ks,ksize,cbits,16,0) |
| 97 | 97 | ||
| 98 | IMPLEMENT_CAMELLIA_CFBR(128,1) | 98 | IMPLEMENT_CAMELLIA_CFBR(128,1) |
| 99 | IMPLEMENT_CAMELLIA_CFBR(192,1) | 99 | IMPLEMENT_CAMELLIA_CFBR(192,1) |
diff --git a/src/lib/libcrypto/evp/e_des.c b/src/lib/libcrypto/evp/e_des.c index 856323648c..04376df232 100644 --- a/src/lib/libcrypto/evp/e_des.c +++ b/src/lib/libcrypto/evp/e_des.c | |||
| @@ -129,18 +129,21 @@ static int des_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | BLOCK_CIPHER_defs(des, DES_key_schedule, NID_des, 8, 8, 8, 64, | 131 | BLOCK_CIPHER_defs(des, DES_key_schedule, NID_des, 8, 8, 8, 64, |
| 132 | EVP_CIPH_RAND_KEY, des_init_key, NULL, | 132 | EVP_CIPH_RAND_KEY, |
| 133 | des_init_key, NULL, | ||
| 133 | EVP_CIPHER_set_asn1_iv, | 134 | EVP_CIPHER_set_asn1_iv, |
| 134 | EVP_CIPHER_get_asn1_iv, | 135 | EVP_CIPHER_get_asn1_iv, |
| 135 | des_ctrl) | 136 | des_ctrl) |
| 136 | 137 | ||
| 137 | BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,1, | 138 | BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,1, |
| 138 | EVP_CIPH_RAND_KEY, des_init_key,NULL, | 139 | EVP_CIPH_RAND_KEY, |
| 140 | des_init_key, NULL, | ||
| 139 | EVP_CIPHER_set_asn1_iv, | 141 | EVP_CIPHER_set_asn1_iv, |
| 140 | EVP_CIPHER_get_asn1_iv,des_ctrl) | 142 | EVP_CIPHER_get_asn1_iv,des_ctrl) |
| 141 | 143 | ||
| 142 | BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,8, | 144 | BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,8, |
| 143 | EVP_CIPH_RAND_KEY,des_init_key,NULL, | 145 | EVP_CIPH_RAND_KEY, |
| 146 | des_init_key,NULL, | ||
| 144 | EVP_CIPHER_set_asn1_iv, | 147 | EVP_CIPHER_set_asn1_iv, |
| 145 | EVP_CIPHER_get_asn1_iv,des_ctrl) | 148 | EVP_CIPHER_get_asn1_iv,des_ctrl) |
| 146 | 149 | ||
diff --git a/src/lib/libcrypto/evp/e_des3.c b/src/lib/libcrypto/evp/e_des3.c index ac148efab2..f910af19b1 100644 --- a/src/lib/libcrypto/evp/e_des3.c +++ b/src/lib/libcrypto/evp/e_des3.c | |||
| @@ -111,8 +111,7 @@ static int des_ede_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
| 111 | #ifdef KSSL_DEBUG | 111 | #ifdef KSSL_DEBUG |
| 112 | { | 112 | { |
| 113 | int i; | 113 | int i; |
| 114 | char *cp; | 114 | printf("des_ede_cbc_cipher(ctx=%lx, buflen=%d)\n", (unsigned long)ctx, ctx->buf_len); |
| 115 | printf("des_ede_cbc_cipher(ctx=%lx, buflen=%d)\n", ctx, ctx->buf_len); | ||
| 116 | printf("\t iv= "); | 115 | printf("\t iv= "); |
| 117 | for(i=0;i<8;i++) | 116 | for(i=0;i<8;i++) |
| 118 | printf("%02X",ctx->iv[i]); | 117 | printf("%02X",ctx->iv[i]); |
| @@ -164,9 +163,9 @@ static int des_ede3_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
| 164 | } | 163 | } |
| 165 | 164 | ||
| 166 | BLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, NID_des_ede, 8, 16, 8, 64, | 165 | BLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, NID_des_ede, 8, 16, 8, 64, |
| 167 | EVP_CIPH_RAND_KEY, des_ede_init_key, NULL, | 166 | EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 168 | EVP_CIPHER_set_asn1_iv, | 167 | des_ede_init_key, |
| 169 | EVP_CIPHER_get_asn1_iv, | 168 | NULL, NULL, NULL, |
| 170 | des3_ctrl) | 169 | des3_ctrl) |
| 171 | 170 | ||
| 172 | #define des_ede3_cfb64_cipher des_ede_cfb64_cipher | 171 | #define des_ede3_cfb64_cipher des_ede_cfb64_cipher |
| @@ -175,21 +174,21 @@ BLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, NID_des_ede, 8, 16, 8, 64, | |||
| 175 | #define des_ede3_ecb_cipher des_ede_ecb_cipher | 174 | #define des_ede3_ecb_cipher des_ede_ecb_cipher |
| 176 | 175 | ||
| 177 | BLOCK_CIPHER_defs(des_ede3, DES_EDE_KEY, NID_des_ede3, 8, 24, 8, 64, | 176 | BLOCK_CIPHER_defs(des_ede3, DES_EDE_KEY, NID_des_ede3, 8, 24, 8, 64, |
| 178 | EVP_CIPH_RAND_KEY, des_ede3_init_key, NULL, | 177 | EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 179 | EVP_CIPHER_set_asn1_iv, | 178 | des_ede3_init_key, |
| 180 | EVP_CIPHER_get_asn1_iv, | 179 | NULL, NULL, NULL, |
| 181 | des3_ctrl) | 180 | des3_ctrl) |
| 182 | 181 | ||
| 183 | BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,1, | 182 | BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,1, |
| 184 | EVP_CIPH_RAND_KEY, des_ede3_init_key,NULL, | 183 | EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 185 | EVP_CIPHER_set_asn1_iv, | 184 | des_ede3_init_key, |
| 186 | EVP_CIPHER_get_asn1_iv, | 185 | NULL, NULL, NULL, |
| 187 | des3_ctrl) | 186 | des3_ctrl) |
| 188 | 187 | ||
| 189 | BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,8, | 188 | BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,8, |
| 190 | EVP_CIPH_RAND_KEY, des_ede3_init_key,NULL, | 189 | EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 191 | EVP_CIPHER_set_asn1_iv, | 190 | des_ede3_init_key, |
| 192 | EVP_CIPHER_get_asn1_iv, | 191 | NULL, NULL, NULL, |
| 193 | des3_ctrl) | 192 | des3_ctrl) |
| 194 | 193 | ||
| 195 | static int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 194 | static int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
| @@ -216,7 +215,7 @@ static int des_ede3_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | |||
| 216 | #ifdef KSSL_DEBUG | 215 | #ifdef KSSL_DEBUG |
| 217 | { | 216 | { |
| 218 | int i; | 217 | int i; |
| 219 | printf("des_ede3_init_key(ctx=%lx)\n", ctx); | 218 | printf("des_ede3_init_key(ctx=%lx)\n", (unsigned long)ctx); |
| 220 | printf("\tKEY= "); | 219 | printf("\tKEY= "); |
| 221 | for(i=0;i<24;i++) printf("%02X",key[i]); printf("\n"); | 220 | for(i=0;i<24;i++) printf("%02X",key[i]); printf("\n"); |
| 222 | printf("\t IV= "); | 221 | printf("\t IV= "); |
diff --git a/src/lib/libcrypto/evp/e_null.c b/src/lib/libcrypto/evp/e_null.c index 5205259f18..0872d733e4 100644 --- a/src/lib/libcrypto/evp/e_null.c +++ b/src/lib/libcrypto/evp/e_null.c | |||
| @@ -69,7 +69,7 @@ static const EVP_CIPHER n_cipher= | |||
| 69 | { | 69 | { |
| 70 | NID_undef, | 70 | NID_undef, |
| 71 | 1,0,0, | 71 | 1,0,0, |
| 72 | 0, | 72 | EVP_CIPH_FLAG_FIPS, |
| 73 | null_init_key, | 73 | null_init_key, |
| 74 | null_cipher, | 74 | null_cipher, |
| 75 | NULL, | 75 | NULL, |
diff --git a/src/lib/libcrypto/evp/e_rc4.c b/src/lib/libcrypto/evp/e_rc4.c index 67af850bea..55baad7446 100644 --- a/src/lib/libcrypto/evp/e_rc4.c +++ b/src/lib/libcrypto/evp/e_rc4.c | |||
| @@ -64,6 +64,7 @@ | |||
| 64 | #include <openssl/evp.h> | 64 | #include <openssl/evp.h> |
| 65 | #include <openssl/objects.h> | 65 | #include <openssl/objects.h> |
| 66 | #include <openssl/rc4.h> | 66 | #include <openssl/rc4.h> |
| 67 | #include "evp_locl.h" | ||
| 67 | 68 | ||
| 68 | /* FIXME: surely this is available elsewhere? */ | 69 | /* FIXME: surely this is available elsewhere? */ |
| 69 | #define EVP_RC4_KEY_SIZE 16 | 70 | #define EVP_RC4_KEY_SIZE 16 |
diff --git a/src/lib/libcrypto/evp/evp.h b/src/lib/libcrypto/evp/evp.h index bdd3b7ecaa..79c097181f 100644 --- a/src/lib/libcrypto/evp/evp.h +++ b/src/lib/libcrypto/evp/evp.h | |||
| @@ -75,6 +75,10 @@ | |||
| 75 | #include <openssl/bio.h> | 75 | #include <openssl/bio.h> |
| 76 | #endif | 76 | #endif |
| 77 | 77 | ||
| 78 | #ifdef OPENSSL_FIPS | ||
| 79 | #include <openssl/fips.h> | ||
| 80 | #endif | ||
| 81 | |||
| 78 | /* | 82 | /* |
| 79 | #define EVP_RC2_KEY_SIZE 16 | 83 | #define EVP_RC2_KEY_SIZE 16 |
| 80 | #define EVP_RC4_KEY_SIZE 16 | 84 | #define EVP_RC4_KEY_SIZE 16 |
| @@ -250,9 +254,19 @@ typedef int evp_verify_method(int type,const unsigned char *m, | |||
| 250 | unsigned int m_length,const unsigned char *sigbuf, | 254 | unsigned int m_length,const unsigned char *sigbuf, |
| 251 | unsigned int siglen, void *key); | 255 | unsigned int siglen, void *key); |
| 252 | 256 | ||
| 257 | typedef struct | ||
| 258 | { | ||
| 259 | EVP_MD_CTX *mctx; | ||
| 260 | void *key; | ||
| 261 | } EVP_MD_SVCTX; | ||
| 262 | |||
| 253 | #define EVP_MD_FLAG_ONESHOT 0x0001 /* digest can only handle a single | 263 | #define EVP_MD_FLAG_ONESHOT 0x0001 /* digest can only handle a single |
| 254 | * block */ | 264 | * block */ |
| 255 | 265 | ||
| 266 | #define EVP_MD_FLAG_FIPS 0x0400 /* Note if suitable for use in FIPS mode */ | ||
| 267 | |||
| 268 | #define EVP_MD_FLAG_SVCTX 0x0800 /* pass EVP_MD_SVCTX to sign/verify */ | ||
| 269 | |||
| 256 | #define EVP_PKEY_NULL_method NULL,NULL,{0,0,0,0} | 270 | #define EVP_PKEY_NULL_method NULL,NULL,{0,0,0,0} |
| 257 | 271 | ||
| 258 | #ifndef OPENSSL_NO_DSA | 272 | #ifndef OPENSSL_NO_DSA |
| @@ -303,6 +317,17 @@ struct env_md_ctx_st | |||
| 303 | * cleaned */ | 317 | * cleaned */ |
| 304 | #define EVP_MD_CTX_FLAG_REUSE 0x0004 /* Don't free up ctx->md_data | 318 | #define EVP_MD_CTX_FLAG_REUSE 0x0004 /* Don't free up ctx->md_data |
| 305 | * in EVP_MD_CTX_cleanup */ | 319 | * in EVP_MD_CTX_cleanup */ |
| 320 | #define EVP_MD_CTX_FLAG_NON_FIPS_ALLOW 0x0008 /* Allow use of non FIPS digest | ||
| 321 | * in FIPS mode */ | ||
| 322 | |||
| 323 | #define EVP_MD_CTX_FLAG_PAD_MASK 0xF0 /* RSA mode to use */ | ||
| 324 | #define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00 /* PKCS#1 v1.5 mode */ | ||
| 325 | #define EVP_MD_CTX_FLAG_PAD_X931 0x10 /* X9.31 mode */ | ||
| 326 | #define EVP_MD_CTX_FLAG_PAD_PSS 0x20 /* PSS mode */ | ||
| 327 | #define M_EVP_MD_CTX_FLAG_PSS_SALT(ctx) \ | ||
| 328 | ((ctx->flags>>16) &0xFFFF) /* seed length */ | ||
| 329 | #define EVP_MD_CTX_FLAG_PSS_MDLEN 0xFFFF /* salt len same as digest */ | ||
| 330 | #define EVP_MD_CTX_FLAG_PSS_MREC 0xFFFE /* salt max or auto recovered */ | ||
| 306 | 331 | ||
| 307 | struct evp_cipher_st | 332 | struct evp_cipher_st |
| 308 | { | 333 | { |
| @@ -347,6 +372,14 @@ struct evp_cipher_st | |||
| 347 | #define EVP_CIPH_NO_PADDING 0x100 | 372 | #define EVP_CIPH_NO_PADDING 0x100 |
| 348 | /* cipher handles random key generation */ | 373 | /* cipher handles random key generation */ |
| 349 | #define EVP_CIPH_RAND_KEY 0x200 | 374 | #define EVP_CIPH_RAND_KEY 0x200 |
| 375 | /* Note if suitable for use in FIPS mode */ | ||
| 376 | #define EVP_CIPH_FLAG_FIPS 0x400 | ||
| 377 | /* Allow non FIPS cipher in FIPS mode */ | ||
| 378 | #define EVP_CIPH_FLAG_NON_FIPS_ALLOW 0x800 | ||
| 379 | /* Allow use default ASN1 get/set iv */ | ||
| 380 | #define EVP_CIPH_FLAG_DEFAULT_ASN1 0x1000 | ||
| 381 | /* Buffer length in bits not bytes: CFB1 mode only */ | ||
| 382 | #define EVP_CIPH_FLAG_LENGTH_BITS 0x2000 | ||
| 350 | 383 | ||
| 351 | /* ctrl() values */ | 384 | /* ctrl() values */ |
| 352 | 385 | ||
| @@ -429,6 +462,18 @@ typedef int (EVP_PBE_KEYGEN)(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, | |||
| 429 | #define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) | 462 | #define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) |
| 430 | #define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) | 463 | #define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) |
| 431 | 464 | ||
| 465 | /* Macros to reduce FIPS dependencies: do NOT use in applications */ | ||
| 466 | #define M_EVP_MD_size(e) ((e)->md_size) | ||
| 467 | #define M_EVP_MD_block_size(e) ((e)->block_size) | ||
| 468 | #define M_EVP_MD_CTX_set_flags(ctx,flgs) ((ctx)->flags|=(flgs)) | ||
| 469 | #define M_EVP_MD_CTX_clear_flags(ctx,flgs) ((ctx)->flags&=~(flgs)) | ||
| 470 | #define M_EVP_MD_CTX_test_flags(ctx,flgs) ((ctx)->flags&(flgs)) | ||
| 471 | #define M_EVP_MD_type(e) ((e)->type) | ||
| 472 | #define M_EVP_MD_CTX_type(e) M_EVP_MD_type(M_EVP_MD_CTX_md(e)) | ||
| 473 | #define M_EVP_MD_CTX_md(e) ((e)->digest) | ||
| 474 | |||
| 475 | #define M_EVP_CIPHER_CTX_set_flags(ctx,flgs) ((ctx)->flags|=(flgs)) | ||
| 476 | |||
| 432 | int EVP_MD_type(const EVP_MD *md); | 477 | int EVP_MD_type(const EVP_MD *md); |
| 433 | #define EVP_MD_nid(e) EVP_MD_type(e) | 478 | #define EVP_MD_nid(e) EVP_MD_type(e) |
| 434 | #define EVP_MD_name(e) OBJ_nid2sn(EVP_MD_nid(e)) | 479 | #define EVP_MD_name(e) OBJ_nid2sn(EVP_MD_nid(e)) |
| @@ -524,6 +569,10 @@ int EVP_BytesToKey(const EVP_CIPHER *type,const EVP_MD *md, | |||
| 524 | const unsigned char *salt, const unsigned char *data, | 569 | const unsigned char *salt, const unsigned char *data, |
| 525 | int datal, int count, unsigned char *key,unsigned char *iv); | 570 | int datal, int count, unsigned char *key,unsigned char *iv); |
| 526 | 571 | ||
| 572 | void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags); | ||
| 573 | void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags); | ||
| 574 | int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx,int flags); | ||
| 575 | |||
| 527 | int EVP_EncryptInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, | 576 | int EVP_EncryptInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, |
| 528 | const unsigned char *key, const unsigned char *iv); | 577 | const unsigned char *key, const unsigned char *iv); |
| 529 | int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl, | 578 | int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl, |
| @@ -879,6 +928,24 @@ int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, | |||
| 879 | EVP_PBE_KEYGEN *keygen); | 928 | EVP_PBE_KEYGEN *keygen); |
| 880 | void EVP_PBE_cleanup(void); | 929 | void EVP_PBE_cleanup(void); |
| 881 | 930 | ||
| 931 | #ifdef OPENSSL_FIPS | ||
| 932 | #ifndef OPENSSL_NO_ENGINE | ||
| 933 | void int_EVP_MD_set_engine_callbacks( | ||
| 934 | int (*eng_md_init)(ENGINE *impl), | ||
| 935 | int (*eng_md_fin)(ENGINE *impl), | ||
| 936 | int (*eng_md_evp) | ||
| 937 | (EVP_MD_CTX *ctx, const EVP_MD **ptype, ENGINE *impl)); | ||
| 938 | void int_EVP_MD_init_engine_callbacks(void); | ||
| 939 | void int_EVP_CIPHER_set_engine_callbacks( | ||
| 940 | int (*eng_ciph_fin)(ENGINE *impl), | ||
| 941 | int (*eng_ciph_evp) | ||
| 942 | (EVP_CIPHER_CTX *ctx, const EVP_CIPHER **pciph, ENGINE *impl)); | ||
| 943 | void int_EVP_CIPHER_init_engine_callbacks(void); | ||
| 944 | #endif | ||
| 945 | #endif | ||
| 946 | |||
| 947 | void EVP_add_alg_module(void); | ||
| 948 | |||
| 882 | /* BEGIN ERROR CODES */ | 949 | /* BEGIN ERROR CODES */ |
| 883 | /* The following lines are auto generated by the script mkerr.pl. Any changes | 950 | /* The following lines are auto generated by the script mkerr.pl. Any changes |
| 884 | * made after this point may be overwritten when the script is next run. | 951 | * made after this point may be overwritten when the script is next run. |
| @@ -889,16 +956,23 @@ void ERR_load_EVP_strings(void); | |||
| 889 | 956 | ||
| 890 | /* Function codes. */ | 957 | /* Function codes. */ |
| 891 | #define EVP_F_AES_INIT_KEY 133 | 958 | #define EVP_F_AES_INIT_KEY 133 |
| 959 | #define EVP_F_ALG_MODULE_INIT 138 | ||
| 892 | #define EVP_F_CAMELLIA_INIT_KEY 159 | 960 | #define EVP_F_CAMELLIA_INIT_KEY 159 |
| 893 | #define EVP_F_D2I_PKEY 100 | 961 | #define EVP_F_D2I_PKEY 100 |
| 962 | #define EVP_F_DO_EVP_ENC_ENGINE 140 | ||
| 963 | #define EVP_F_DO_EVP_ENC_ENGINE_FULL 141 | ||
| 964 | #define EVP_F_DO_EVP_MD_ENGINE 139 | ||
| 965 | #define EVP_F_DO_EVP_MD_ENGINE_FULL 142 | ||
| 894 | #define EVP_F_DSAPKEY2PKCS8 134 | 966 | #define EVP_F_DSAPKEY2PKCS8 134 |
| 895 | #define EVP_F_DSA_PKEY2PKCS8 135 | 967 | #define EVP_F_DSA_PKEY2PKCS8 135 |
| 896 | #define EVP_F_ECDSA_PKEY2PKCS8 129 | 968 | #define EVP_F_ECDSA_PKEY2PKCS8 129 |
| 897 | #define EVP_F_ECKEY_PKEY2PKCS8 132 | 969 | #define EVP_F_ECKEY_PKEY2PKCS8 132 |
| 970 | #define EVP_F_EVP_CIPHERINIT 137 | ||
| 898 | #define EVP_F_EVP_CIPHERINIT_EX 123 | 971 | #define EVP_F_EVP_CIPHERINIT_EX 123 |
| 899 | #define EVP_F_EVP_CIPHER_CTX_CTRL 124 | 972 | #define EVP_F_EVP_CIPHER_CTX_CTRL 124 |
| 900 | #define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH 122 | 973 | #define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH 122 |
| 901 | #define EVP_F_EVP_DECRYPTFINAL_EX 101 | 974 | #define EVP_F_EVP_DECRYPTFINAL_EX 101 |
| 975 | #define EVP_F_EVP_DIGESTINIT 136 | ||
| 902 | #define EVP_F_EVP_DIGESTINIT_EX 128 | 976 | #define EVP_F_EVP_DIGESTINIT_EX 128 |
| 903 | #define EVP_F_EVP_ENCRYPTFINAL_EX 127 | 977 | #define EVP_F_EVP_ENCRYPTFINAL_EX 127 |
| 904 | #define EVP_F_EVP_MD_CTX_COPY_EX 110 | 978 | #define EVP_F_EVP_MD_CTX_COPY_EX 110 |
| @@ -940,15 +1014,20 @@ void ERR_load_EVP_strings(void); | |||
| 940 | #define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH 138 | 1014 | #define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH 138 |
| 941 | #define EVP_R_DECODE_ERROR 114 | 1015 | #define EVP_R_DECODE_ERROR 114 |
| 942 | #define EVP_R_DIFFERENT_KEY_TYPES 101 | 1016 | #define EVP_R_DIFFERENT_KEY_TYPES 101 |
| 1017 | #define EVP_R_DISABLED_FOR_FIPS 144 | ||
| 943 | #define EVP_R_ENCODE_ERROR 115 | 1018 | #define EVP_R_ENCODE_ERROR 115 |
| 1019 | #define EVP_R_ERROR_LOADING_SECTION 145 | ||
| 1020 | #define EVP_R_ERROR_SETTING_FIPS_MODE 146 | ||
| 944 | #define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 | 1021 | #define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 |
| 945 | #define EVP_R_EXPECTING_AN_RSA_KEY 127 | 1022 | #define EVP_R_EXPECTING_AN_RSA_KEY 127 |
| 946 | #define EVP_R_EXPECTING_A_DH_KEY 128 | 1023 | #define EVP_R_EXPECTING_A_DH_KEY 128 |
| 947 | #define EVP_R_EXPECTING_A_DSA_KEY 129 | 1024 | #define EVP_R_EXPECTING_A_DSA_KEY 129 |
| 948 | #define EVP_R_EXPECTING_A_ECDSA_KEY 141 | 1025 | #define EVP_R_EXPECTING_A_ECDSA_KEY 141 |
| 949 | #define EVP_R_EXPECTING_A_EC_KEY 142 | 1026 | #define EVP_R_EXPECTING_A_EC_KEY 142 |
| 1027 | #define EVP_R_FIPS_MODE_NOT_SUPPORTED 147 | ||
| 950 | #define EVP_R_INITIALIZATION_ERROR 134 | 1028 | #define EVP_R_INITIALIZATION_ERROR 134 |
| 951 | #define EVP_R_INPUT_NOT_INITIALIZED 111 | 1029 | #define EVP_R_INPUT_NOT_INITIALIZED 111 |
| 1030 | #define EVP_R_INVALID_FIPS_MODE 148 | ||
| 952 | #define EVP_R_INVALID_KEY_LENGTH 130 | 1031 | #define EVP_R_INVALID_KEY_LENGTH 130 |
| 953 | #define EVP_R_IV_TOO_LARGE 102 | 1032 | #define EVP_R_IV_TOO_LARGE 102 |
| 954 | #define EVP_R_KEYGEN_FAILURE 120 | 1033 | #define EVP_R_KEYGEN_FAILURE 120 |
| @@ -960,6 +1039,7 @@ void ERR_load_EVP_strings(void); | |||
| 960 | #define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED 105 | 1039 | #define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED 105 |
| 961 | #define EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE 117 | 1040 | #define EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE 117 |
| 962 | #define EVP_R_PUBLIC_KEY_NOT_RSA 106 | 1041 | #define EVP_R_PUBLIC_KEY_NOT_RSA 106 |
| 1042 | #define EVP_R_UNKNOWN_OPTION 149 | ||
| 963 | #define EVP_R_UNKNOWN_PBE_ALGORITHM 121 | 1043 | #define EVP_R_UNKNOWN_PBE_ALGORITHM 121 |
| 964 | #define EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS 135 | 1044 | #define EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS 135 |
| 965 | #define EVP_R_UNSUPPORTED_CIPHER 107 | 1045 | #define EVP_R_UNSUPPORTED_CIPHER 107 |
diff --git a/src/lib/libcrypto/evp/evp_enc.c b/src/lib/libcrypto/evp/evp_enc.c index a1904993bf..30e0ca4d9f 100644 --- a/src/lib/libcrypto/evp/evp_enc.c +++ b/src/lib/libcrypto/evp/evp_enc.c | |||
| @@ -66,13 +66,15 @@ | |||
| 66 | #endif | 66 | #endif |
| 67 | #include "evp_locl.h" | 67 | #include "evp_locl.h" |
| 68 | 68 | ||
| 69 | const char EVP_version[]="EVP" OPENSSL_VERSION_PTEXT; | 69 | #ifdef OPENSSL_FIPS |
| 70 | #define M_do_cipher(ctx, out, in, inl) \ | ||
| 71 | EVP_Cipher(ctx,out,in,inl) | ||
| 72 | #else | ||
| 73 | #define M_do_cipher(ctx, out, in, inl) \ | ||
| 74 | ctx->cipher->do_cipher(ctx,out,in,inl) | ||
| 75 | #endif | ||
| 70 | 76 | ||
| 71 | void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx) | 77 | const char EVP_version[]="EVP" OPENSSL_VERSION_PTEXT; |
| 72 | { | ||
| 73 | memset(ctx,0,sizeof(EVP_CIPHER_CTX)); | ||
| 74 | /* ctx->cipher=NULL; */ | ||
| 75 | } | ||
| 76 | 78 | ||
| 77 | EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void) | 79 | EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void) |
| 78 | { | 80 | { |
| @@ -90,144 +92,6 @@ int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, | |||
| 90 | return EVP_CipherInit_ex(ctx,cipher,NULL,key,iv,enc); | 92 | return EVP_CipherInit_ex(ctx,cipher,NULL,key,iv,enc); |
| 91 | } | 93 | } |
| 92 | 94 | ||
| 93 | int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl, | ||
| 94 | const unsigned char *key, const unsigned char *iv, int enc) | ||
| 95 | { | ||
| 96 | if (enc == -1) | ||
| 97 | enc = ctx->encrypt; | ||
| 98 | else | ||
| 99 | { | ||
| 100 | if (enc) | ||
| 101 | enc = 1; | ||
| 102 | ctx->encrypt = enc; | ||
| 103 | } | ||
| 104 | #ifndef OPENSSL_NO_ENGINE | ||
| 105 | /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts | ||
| 106 | * so this context may already have an ENGINE! Try to avoid releasing | ||
| 107 | * the previous handle, re-querying for an ENGINE, and having a | ||
| 108 | * reinitialisation, when it may all be unecessary. */ | ||
| 109 | if (ctx->engine && ctx->cipher && (!cipher || | ||
| 110 | (cipher && (cipher->nid == ctx->cipher->nid)))) | ||
| 111 | goto skip_to_init; | ||
| 112 | #endif | ||
| 113 | if (cipher) | ||
| 114 | { | ||
| 115 | /* Ensure a context left lying around from last time is cleared | ||
| 116 | * (the previous check attempted to avoid this if the same | ||
| 117 | * ENGINE and EVP_CIPHER could be used). */ | ||
| 118 | EVP_CIPHER_CTX_cleanup(ctx); | ||
| 119 | |||
| 120 | /* Restore encrypt field: it is zeroed by cleanup */ | ||
| 121 | ctx->encrypt = enc; | ||
| 122 | #ifndef OPENSSL_NO_ENGINE | ||
| 123 | if(impl) | ||
| 124 | { | ||
| 125 | if (!ENGINE_init(impl)) | ||
| 126 | { | ||
| 127 | EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR); | ||
| 128 | return 0; | ||
| 129 | } | ||
| 130 | } | ||
| 131 | else | ||
| 132 | /* Ask if an ENGINE is reserved for this job */ | ||
| 133 | impl = ENGINE_get_cipher_engine(cipher->nid); | ||
| 134 | if(impl) | ||
| 135 | { | ||
| 136 | /* There's an ENGINE for this job ... (apparently) */ | ||
| 137 | const EVP_CIPHER *c = ENGINE_get_cipher(impl, cipher->nid); | ||
| 138 | if(!c) | ||
| 139 | { | ||
| 140 | /* One positive side-effect of US's export | ||
| 141 | * control history, is that we should at least | ||
| 142 | * be able to avoid using US mispellings of | ||
| 143 | * "initialisation"? */ | ||
| 144 | EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR); | ||
| 145 | return 0; | ||
| 146 | } | ||
| 147 | /* We'll use the ENGINE's private cipher definition */ | ||
| 148 | cipher = c; | ||
| 149 | /* Store the ENGINE functional reference so we know | ||
| 150 | * 'cipher' came from an ENGINE and we need to release | ||
| 151 | * it when done. */ | ||
| 152 | ctx->engine = impl; | ||
| 153 | } | ||
| 154 | else | ||
| 155 | ctx->engine = NULL; | ||
| 156 | #endif | ||
| 157 | |||
| 158 | ctx->cipher=cipher; | ||
| 159 | if (ctx->cipher->ctx_size) | ||
| 160 | { | ||
| 161 | ctx->cipher_data=OPENSSL_malloc(ctx->cipher->ctx_size); | ||
| 162 | if (!ctx->cipher_data) | ||
| 163 | { | ||
| 164 | EVPerr(EVP_F_EVP_CIPHERINIT_EX, ERR_R_MALLOC_FAILURE); | ||
| 165 | return 0; | ||
| 166 | } | ||
| 167 | } | ||
| 168 | else | ||
| 169 | { | ||
| 170 | ctx->cipher_data = NULL; | ||
| 171 | } | ||
| 172 | ctx->key_len = cipher->key_len; | ||
| 173 | ctx->flags = 0; | ||
| 174 | if(ctx->cipher->flags & EVP_CIPH_CTRL_INIT) | ||
| 175 | { | ||
| 176 | if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL)) | ||
| 177 | { | ||
| 178 | EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR); | ||
| 179 | return 0; | ||
| 180 | } | ||
| 181 | } | ||
| 182 | } | ||
| 183 | else if(!ctx->cipher) | ||
| 184 | { | ||
| 185 | EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_NO_CIPHER_SET); | ||
| 186 | return 0; | ||
| 187 | } | ||
| 188 | #ifndef OPENSSL_NO_ENGINE | ||
| 189 | skip_to_init: | ||
| 190 | #endif | ||
| 191 | /* we assume block size is a power of 2 in *cryptUpdate */ | ||
| 192 | OPENSSL_assert(ctx->cipher->block_size == 1 | ||
| 193 | || ctx->cipher->block_size == 8 | ||
| 194 | || ctx->cipher->block_size == 16); | ||
| 195 | |||
| 196 | if(!(EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_CUSTOM_IV)) { | ||
| 197 | switch(EVP_CIPHER_CTX_mode(ctx)) { | ||
| 198 | |||
| 199 | case EVP_CIPH_STREAM_CIPHER: | ||
| 200 | case EVP_CIPH_ECB_MODE: | ||
| 201 | break; | ||
| 202 | |||
| 203 | case EVP_CIPH_CFB_MODE: | ||
| 204 | case EVP_CIPH_OFB_MODE: | ||
| 205 | |||
| 206 | ctx->num = 0; | ||
| 207 | |||
| 208 | case EVP_CIPH_CBC_MODE: | ||
| 209 | |||
| 210 | OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) <= | ||
| 211 | (int)sizeof(ctx->iv)); | ||
| 212 | if(iv) memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx)); | ||
| 213 | memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx)); | ||
| 214 | break; | ||
| 215 | |||
| 216 | default: | ||
| 217 | return 0; | ||
| 218 | break; | ||
| 219 | } | ||
| 220 | } | ||
| 221 | |||
| 222 | if(key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) { | ||
| 223 | if(!ctx->cipher->init(ctx,key,iv,enc)) return 0; | ||
| 224 | } | ||
| 225 | ctx->buf_len=0; | ||
| 226 | ctx->final_used=0; | ||
| 227 | ctx->block_mask=ctx->cipher->block_size-1; | ||
| 228 | return 1; | ||
| 229 | } | ||
| 230 | |||
| 231 | int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | 95 | int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, |
| 232 | const unsigned char *in, int inl) | 96 | const unsigned char *in, int inl) |
| 233 | { | 97 | { |
| @@ -279,10 +143,15 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | |||
| 279 | { | 143 | { |
| 280 | int i,j,bl; | 144 | int i,j,bl; |
| 281 | 145 | ||
| 282 | OPENSSL_assert(inl > 0); | 146 | if (inl <= 0) |
| 147 | { | ||
| 148 | *outl = 0; | ||
| 149 | return inl == 0; | ||
| 150 | } | ||
| 151 | |||
| 283 | if(ctx->buf_len == 0 && (inl&(ctx->block_mask)) == 0) | 152 | if(ctx->buf_len == 0 && (inl&(ctx->block_mask)) == 0) |
| 284 | { | 153 | { |
| 285 | if(ctx->cipher->do_cipher(ctx,out,in,inl)) | 154 | if(M_do_cipher(ctx,out,in,inl)) |
| 286 | { | 155 | { |
| 287 | *outl=inl; | 156 | *outl=inl; |
| 288 | return 1; | 157 | return 1; |
| @@ -309,7 +178,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | |||
| 309 | { | 178 | { |
| 310 | j=bl-i; | 179 | j=bl-i; |
| 311 | memcpy(&(ctx->buf[i]),in,j); | 180 | memcpy(&(ctx->buf[i]),in,j); |
| 312 | if(!ctx->cipher->do_cipher(ctx,out,ctx->buf,bl)) return 0; | 181 | if(!M_do_cipher(ctx,out,ctx->buf,bl)) return 0; |
| 313 | inl-=j; | 182 | inl-=j; |
| 314 | in+=j; | 183 | in+=j; |
| 315 | out+=bl; | 184 | out+=bl; |
| @@ -322,7 +191,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | |||
| 322 | inl-=i; | 191 | inl-=i; |
| 323 | if (inl > 0) | 192 | if (inl > 0) |
| 324 | { | 193 | { |
| 325 | if(!ctx->cipher->do_cipher(ctx,out,in,inl)) return 0; | 194 | if(!M_do_cipher(ctx,out,in,inl)) return 0; |
| 326 | *outl+=inl; | 195 | *outl+=inl; |
| 327 | } | 196 | } |
| 328 | 197 | ||
| @@ -366,7 +235,7 @@ int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) | |||
| 366 | n=b-bl; | 235 | n=b-bl; |
| 367 | for (i=bl; i<b; i++) | 236 | for (i=bl; i<b; i++) |
| 368 | ctx->buf[i]=n; | 237 | ctx->buf[i]=n; |
| 369 | ret=ctx->cipher->do_cipher(ctx,out,ctx->buf,b); | 238 | ret=M_do_cipher(ctx,out,ctx->buf,b); |
| 370 | 239 | ||
| 371 | 240 | ||
| 372 | if(ret) | 241 | if(ret) |
| @@ -381,10 +250,10 @@ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | |||
| 381 | int fix_len; | 250 | int fix_len; |
| 382 | unsigned int b; | 251 | unsigned int b; |
| 383 | 252 | ||
| 384 | if (inl == 0) | 253 | if (inl <= 0) |
| 385 | { | 254 | { |
| 386 | *outl=0; | 255 | *outl = 0; |
| 387 | return 1; | 256 | return inl == 0; |
| 388 | } | 257 | } |
| 389 | 258 | ||
| 390 | if (ctx->flags & EVP_CIPH_NO_PADDING) | 259 | if (ctx->flags & EVP_CIPH_NO_PADDING) |
| @@ -488,28 +357,6 @@ void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx) | |||
| 488 | } | 357 | } |
| 489 | } | 358 | } |
| 490 | 359 | ||
| 491 | int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c) | ||
| 492 | { | ||
| 493 | if (c->cipher != NULL) | ||
| 494 | { | ||
| 495 | if(c->cipher->cleanup && !c->cipher->cleanup(c)) | ||
| 496 | return 0; | ||
| 497 | /* Cleanse cipher context data */ | ||
| 498 | if (c->cipher_data) | ||
| 499 | OPENSSL_cleanse(c->cipher_data, c->cipher->ctx_size); | ||
| 500 | } | ||
| 501 | if (c->cipher_data) | ||
| 502 | OPENSSL_free(c->cipher_data); | ||
| 503 | #ifndef OPENSSL_NO_ENGINE | ||
| 504 | if (c->engine) | ||
| 505 | /* The EVP_CIPHER we used belongs to an ENGINE, release the | ||
| 506 | * functional reference we held for this reason. */ | ||
| 507 | ENGINE_finish(c->engine); | ||
| 508 | #endif | ||
| 509 | memset(c,0,sizeof(EVP_CIPHER_CTX)); | ||
| 510 | return 1; | ||
| 511 | } | ||
| 512 | |||
| 513 | int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen) | 360 | int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen) |
| 514 | { | 361 | { |
| 515 | if(c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH) | 362 | if(c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH) |
| @@ -531,27 +378,6 @@ int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad) | |||
| 531 | return 1; | 378 | return 1; |
| 532 | } | 379 | } |
| 533 | 380 | ||
| 534 | int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) | ||
| 535 | { | ||
| 536 | int ret; | ||
| 537 | if(!ctx->cipher) { | ||
| 538 | EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_NO_CIPHER_SET); | ||
| 539 | return 0; | ||
| 540 | } | ||
| 541 | |||
| 542 | if(!ctx->cipher->ctrl) { | ||
| 543 | EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_NOT_IMPLEMENTED); | ||
| 544 | return 0; | ||
| 545 | } | ||
| 546 | |||
| 547 | ret = ctx->cipher->ctrl(ctx, type, arg, ptr); | ||
| 548 | if(ret == -1) { | ||
| 549 | EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED); | ||
| 550 | return 0; | ||
| 551 | } | ||
| 552 | return ret; | ||
| 553 | } | ||
| 554 | |||
| 555 | int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key) | 381 | int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key) |
| 556 | { | 382 | { |
| 557 | if (ctx->cipher->flags & EVP_CIPH_RAND_KEY) | 383 | if (ctx->cipher->flags & EVP_CIPH_RAND_KEY) |
| @@ -561,3 +387,54 @@ int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key) | |||
| 561 | return 1; | 387 | return 1; |
| 562 | } | 388 | } |
| 563 | 389 | ||
| 390 | #ifndef OPENSSL_NO_ENGINE | ||
| 391 | |||
| 392 | #ifdef OPENSSL_FIPS | ||
| 393 | |||
| 394 | static int do_evp_enc_engine_full(EVP_CIPHER_CTX *ctx, const EVP_CIPHER **pcipher, ENGINE *impl) | ||
| 395 | { | ||
| 396 | if(impl) | ||
| 397 | { | ||
| 398 | if (!ENGINE_init(impl)) | ||
| 399 | { | ||
| 400 | EVPerr(EVP_F_DO_EVP_ENC_ENGINE_FULL, EVP_R_INITIALIZATION_ERROR); | ||
| 401 | return 0; | ||
| 402 | } | ||
| 403 | } | ||
| 404 | else | ||
| 405 | /* Ask if an ENGINE is reserved for this job */ | ||
| 406 | impl = ENGINE_get_cipher_engine((*pcipher)->nid); | ||
| 407 | if(impl) | ||
| 408 | { | ||
| 409 | /* There's an ENGINE for this job ... (apparently) */ | ||
| 410 | const EVP_CIPHER *c = ENGINE_get_cipher(impl, (*pcipher)->nid); | ||
| 411 | if(!c) | ||
| 412 | { | ||
| 413 | /* One positive side-effect of US's export | ||
| 414 | * control history, is that we should at least | ||
| 415 | * be able to avoid using US mispellings of | ||
| 416 | * "initialisation"? */ | ||
| 417 | EVPerr(EVP_F_DO_EVP_ENC_ENGINE_FULL, EVP_R_INITIALIZATION_ERROR); | ||
| 418 | return 0; | ||
| 419 | } | ||
| 420 | /* We'll use the ENGINE's private cipher definition */ | ||
| 421 | *pcipher = c; | ||
| 422 | /* Store the ENGINE functional reference so we know | ||
| 423 | * 'cipher' came from an ENGINE and we need to release | ||
| 424 | * it when done. */ | ||
| 425 | ctx->engine = impl; | ||
| 426 | } | ||
| 427 | else | ||
| 428 | ctx->engine = NULL; | ||
| 429 | return 1; | ||
| 430 | } | ||
| 431 | |||
| 432 | void int_EVP_CIPHER_init_engine_callbacks(void) | ||
| 433 | { | ||
| 434 | int_EVP_CIPHER_set_engine_callbacks( | ||
| 435 | ENGINE_finish, do_evp_enc_engine_full); | ||
| 436 | } | ||
| 437 | |||
| 438 | #endif | ||
| 439 | |||
| 440 | #endif | ||
diff --git a/src/lib/libcrypto/evp/evp_err.c b/src/lib/libcrypto/evp/evp_err.c index e8c9e8de9c..b5b900d4fe 100644 --- a/src/lib/libcrypto/evp/evp_err.c +++ b/src/lib/libcrypto/evp/evp_err.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* crypto/evp/evp_err.c */ | 1 | /* crypto/evp/evp_err.c */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that the following conditions | 6 | * modification, are permitted provided that the following conditions |
| @@ -71,16 +71,23 @@ | |||
| 71 | static ERR_STRING_DATA EVP_str_functs[]= | 71 | static ERR_STRING_DATA EVP_str_functs[]= |
| 72 | { | 72 | { |
| 73 | {ERR_FUNC(EVP_F_AES_INIT_KEY), "AES_INIT_KEY"}, | 73 | {ERR_FUNC(EVP_F_AES_INIT_KEY), "AES_INIT_KEY"}, |
| 74 | {ERR_FUNC(EVP_F_ALG_MODULE_INIT), "ALG_MODULE_INIT"}, | ||
| 74 | {ERR_FUNC(EVP_F_CAMELLIA_INIT_KEY), "CAMELLIA_INIT_KEY"}, | 75 | {ERR_FUNC(EVP_F_CAMELLIA_INIT_KEY), "CAMELLIA_INIT_KEY"}, |
| 75 | {ERR_FUNC(EVP_F_D2I_PKEY), "D2I_PKEY"}, | 76 | {ERR_FUNC(EVP_F_D2I_PKEY), "D2I_PKEY"}, |
| 77 | {ERR_FUNC(EVP_F_DO_EVP_ENC_ENGINE), "DO_EVP_ENC_ENGINE"}, | ||
| 78 | {ERR_FUNC(EVP_F_DO_EVP_ENC_ENGINE_FULL), "DO_EVP_ENC_ENGINE_FULL"}, | ||
| 79 | {ERR_FUNC(EVP_F_DO_EVP_MD_ENGINE), "DO_EVP_MD_ENGINE"}, | ||
| 80 | {ERR_FUNC(EVP_F_DO_EVP_MD_ENGINE_FULL), "DO_EVP_MD_ENGINE_FULL"}, | ||
| 76 | {ERR_FUNC(EVP_F_DSAPKEY2PKCS8), "DSAPKEY2PKCS8"}, | 81 | {ERR_FUNC(EVP_F_DSAPKEY2PKCS8), "DSAPKEY2PKCS8"}, |
| 77 | {ERR_FUNC(EVP_F_DSA_PKEY2PKCS8), "DSA_PKEY2PKCS8"}, | 82 | {ERR_FUNC(EVP_F_DSA_PKEY2PKCS8), "DSA_PKEY2PKCS8"}, |
| 78 | {ERR_FUNC(EVP_F_ECDSA_PKEY2PKCS8), "ECDSA_PKEY2PKCS8"}, | 83 | {ERR_FUNC(EVP_F_ECDSA_PKEY2PKCS8), "ECDSA_PKEY2PKCS8"}, |
| 79 | {ERR_FUNC(EVP_F_ECKEY_PKEY2PKCS8), "ECKEY_PKEY2PKCS8"}, | 84 | {ERR_FUNC(EVP_F_ECKEY_PKEY2PKCS8), "ECKEY_PKEY2PKCS8"}, |
| 85 | {ERR_FUNC(EVP_F_EVP_CIPHERINIT), "EVP_CipherInit"}, | ||
| 80 | {ERR_FUNC(EVP_F_EVP_CIPHERINIT_EX), "EVP_CipherInit_ex"}, | 86 | {ERR_FUNC(EVP_F_EVP_CIPHERINIT_EX), "EVP_CipherInit_ex"}, |
| 81 | {ERR_FUNC(EVP_F_EVP_CIPHER_CTX_CTRL), "EVP_CIPHER_CTX_ctrl"}, | 87 | {ERR_FUNC(EVP_F_EVP_CIPHER_CTX_CTRL), "EVP_CIPHER_CTX_ctrl"}, |
| 82 | {ERR_FUNC(EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH), "EVP_CIPHER_CTX_set_key_length"}, | 88 | {ERR_FUNC(EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH), "EVP_CIPHER_CTX_set_key_length"}, |
| 83 | {ERR_FUNC(EVP_F_EVP_DECRYPTFINAL_EX), "EVP_DecryptFinal_ex"}, | 89 | {ERR_FUNC(EVP_F_EVP_DECRYPTFINAL_EX), "EVP_DecryptFinal_ex"}, |
| 90 | {ERR_FUNC(EVP_F_EVP_DIGESTINIT), "EVP_DigestInit"}, | ||
| 84 | {ERR_FUNC(EVP_F_EVP_DIGESTINIT_EX), "EVP_DigestInit_ex"}, | 91 | {ERR_FUNC(EVP_F_EVP_DIGESTINIT_EX), "EVP_DigestInit_ex"}, |
| 85 | {ERR_FUNC(EVP_F_EVP_ENCRYPTFINAL_EX), "EVP_EncryptFinal_ex"}, | 92 | {ERR_FUNC(EVP_F_EVP_ENCRYPTFINAL_EX), "EVP_EncryptFinal_ex"}, |
| 86 | {ERR_FUNC(EVP_F_EVP_MD_CTX_COPY_EX), "EVP_MD_CTX_copy_ex"}, | 93 | {ERR_FUNC(EVP_F_EVP_MD_CTX_COPY_EX), "EVP_MD_CTX_copy_ex"}, |
| @@ -125,15 +132,20 @@ static ERR_STRING_DATA EVP_str_reasons[]= | |||
| 125 | {ERR_REASON(EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH),"data not multiple of block length"}, | 132 | {ERR_REASON(EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH),"data not multiple of block length"}, |
| 126 | {ERR_REASON(EVP_R_DECODE_ERROR) ,"decode error"}, | 133 | {ERR_REASON(EVP_R_DECODE_ERROR) ,"decode error"}, |
| 127 | {ERR_REASON(EVP_R_DIFFERENT_KEY_TYPES) ,"different key types"}, | 134 | {ERR_REASON(EVP_R_DIFFERENT_KEY_TYPES) ,"different key types"}, |
| 135 | {ERR_REASON(EVP_R_DISABLED_FOR_FIPS) ,"disabled for fips"}, | ||
| 128 | {ERR_REASON(EVP_R_ENCODE_ERROR) ,"encode error"}, | 136 | {ERR_REASON(EVP_R_ENCODE_ERROR) ,"encode error"}, |
| 137 | {ERR_REASON(EVP_R_ERROR_LOADING_SECTION) ,"error loading section"}, | ||
| 138 | {ERR_REASON(EVP_R_ERROR_SETTING_FIPS_MODE),"error setting fips mode"}, | ||
| 129 | {ERR_REASON(EVP_R_EVP_PBE_CIPHERINIT_ERROR),"evp pbe cipherinit error"}, | 139 | {ERR_REASON(EVP_R_EVP_PBE_CIPHERINIT_ERROR),"evp pbe cipherinit error"}, |
| 130 | {ERR_REASON(EVP_R_EXPECTING_AN_RSA_KEY) ,"expecting an rsa key"}, | 140 | {ERR_REASON(EVP_R_EXPECTING_AN_RSA_KEY) ,"expecting an rsa key"}, |
| 131 | {ERR_REASON(EVP_R_EXPECTING_A_DH_KEY) ,"expecting a dh key"}, | 141 | {ERR_REASON(EVP_R_EXPECTING_A_DH_KEY) ,"expecting a dh key"}, |
| 132 | {ERR_REASON(EVP_R_EXPECTING_A_DSA_KEY) ,"expecting a dsa key"}, | 142 | {ERR_REASON(EVP_R_EXPECTING_A_DSA_KEY) ,"expecting a dsa key"}, |
| 133 | {ERR_REASON(EVP_R_EXPECTING_A_ECDSA_KEY) ,"expecting a ecdsa key"}, | 143 | {ERR_REASON(EVP_R_EXPECTING_A_ECDSA_KEY) ,"expecting a ecdsa key"}, |
| 134 | {ERR_REASON(EVP_R_EXPECTING_A_EC_KEY) ,"expecting a ec key"}, | 144 | {ERR_REASON(EVP_R_EXPECTING_A_EC_KEY) ,"expecting a ec key"}, |
| 145 | {ERR_REASON(EVP_R_FIPS_MODE_NOT_SUPPORTED),"fips mode not supported"}, | ||
| 135 | {ERR_REASON(EVP_R_INITIALIZATION_ERROR) ,"initialization error"}, | 146 | {ERR_REASON(EVP_R_INITIALIZATION_ERROR) ,"initialization error"}, |
| 136 | {ERR_REASON(EVP_R_INPUT_NOT_INITIALIZED) ,"input not initialized"}, | 147 | {ERR_REASON(EVP_R_INPUT_NOT_INITIALIZED) ,"input not initialized"}, |
| 148 | {ERR_REASON(EVP_R_INVALID_FIPS_MODE) ,"invalid fips mode"}, | ||
| 137 | {ERR_REASON(EVP_R_INVALID_KEY_LENGTH) ,"invalid key length"}, | 149 | {ERR_REASON(EVP_R_INVALID_KEY_LENGTH) ,"invalid key length"}, |
| 138 | {ERR_REASON(EVP_R_IV_TOO_LARGE) ,"iv too large"}, | 150 | {ERR_REASON(EVP_R_IV_TOO_LARGE) ,"iv too large"}, |
| 139 | {ERR_REASON(EVP_R_KEYGEN_FAILURE) ,"keygen failure"}, | 151 | {ERR_REASON(EVP_R_KEYGEN_FAILURE) ,"keygen failure"}, |
| @@ -145,6 +157,8 @@ static ERR_STRING_DATA EVP_str_reasons[]= | |||
| 145 | {ERR_REASON(EVP_R_NO_VERIFY_FUNCTION_CONFIGURED),"no verify function configured"}, | 157 | {ERR_REASON(EVP_R_NO_VERIFY_FUNCTION_CONFIGURED),"no verify function configured"}, |
| 146 | {ERR_REASON(EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE),"pkcs8 unknown broken type"}, | 158 | {ERR_REASON(EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE),"pkcs8 unknown broken type"}, |
| 147 | {ERR_REASON(EVP_R_PUBLIC_KEY_NOT_RSA) ,"public key not rsa"}, | 159 | {ERR_REASON(EVP_R_PUBLIC_KEY_NOT_RSA) ,"public key not rsa"}, |
| 160 | {ERR_REASON(EVP_R_SEED_KEY_SETUP_FAILED) ,"seed key setup failed"}, | ||
| 161 | {ERR_REASON(EVP_R_UNKNOWN_OPTION) ,"unknown option"}, | ||
| 148 | {ERR_REASON(EVP_R_UNKNOWN_PBE_ALGORITHM) ,"unknown pbe algorithm"}, | 162 | {ERR_REASON(EVP_R_UNKNOWN_PBE_ALGORITHM) ,"unknown pbe algorithm"}, |
| 149 | {ERR_REASON(EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS),"unsuported number of rounds"}, | 163 | {ERR_REASON(EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS),"unsuported number of rounds"}, |
| 150 | {ERR_REASON(EVP_R_UNSUPPORTED_CIPHER) ,"unsupported cipher"}, | 164 | {ERR_REASON(EVP_R_UNSUPPORTED_CIPHER) ,"unsupported cipher"}, |
diff --git a/src/lib/libcrypto/evp/evp_lib.c b/src/lib/libcrypto/evp/evp_lib.c index edb28ef38e..174cf6c594 100644 --- a/src/lib/libcrypto/evp/evp_lib.c +++ b/src/lib/libcrypto/evp/evp_lib.c | |||
| @@ -67,6 +67,8 @@ int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type) | |||
| 67 | 67 | ||
| 68 | if (c->cipher->set_asn1_parameters != NULL) | 68 | if (c->cipher->set_asn1_parameters != NULL) |
| 69 | ret=c->cipher->set_asn1_parameters(c,type); | 69 | ret=c->cipher->set_asn1_parameters(c,type); |
| 70 | else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) | ||
| 71 | ret=EVP_CIPHER_set_asn1_iv(c, type); | ||
| 70 | else | 72 | else |
| 71 | ret=-1; | 73 | ret=-1; |
| 72 | return(ret); | 74 | return(ret); |
| @@ -78,6 +80,8 @@ int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type) | |||
| 78 | 80 | ||
| 79 | if (c->cipher->get_asn1_parameters != NULL) | 81 | if (c->cipher->get_asn1_parameters != NULL) |
| 80 | ret=c->cipher->get_asn1_parameters(c,type); | 82 | ret=c->cipher->get_asn1_parameters(c,type); |
| 83 | else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) | ||
| 84 | ret=EVP_CIPHER_get_asn1_iv(c, type); | ||
| 81 | else | 85 | else |
| 82 | ret=-1; | 86 | ret=-1; |
| 83 | return(ret); | 87 | return(ret); |
| @@ -178,11 +182,6 @@ int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx) | |||
| 178 | return ctx->cipher->block_size; | 182 | return ctx->cipher->block_size; |
| 179 | } | 183 | } |
| 180 | 184 | ||
| 181 | int EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) | ||
| 182 | { | ||
| 183 | return ctx->cipher->do_cipher(ctx,out,in,inl); | ||
| 184 | } | ||
| 185 | |||
| 186 | const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx) | 185 | const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx) |
| 187 | { | 186 | { |
| 188 | return ctx->cipher; | 187 | return ctx->cipher; |
| @@ -193,11 +192,6 @@ unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher) | |||
| 193 | return cipher->flags; | 192 | return cipher->flags; |
| 194 | } | 193 | } |
| 195 | 194 | ||
| 196 | unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx) | ||
| 197 | { | ||
| 198 | return ctx->cipher->flags; | ||
| 199 | } | ||
| 200 | |||
| 201 | void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx) | 195 | void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx) |
| 202 | { | 196 | { |
| 203 | return ctx->app_data; | 197 | return ctx->app_data; |
| @@ -213,11 +207,6 @@ int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher) | |||
| 213 | return cipher->iv_len; | 207 | return cipher->iv_len; |
| 214 | } | 208 | } |
| 215 | 209 | ||
| 216 | int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx) | ||
| 217 | { | ||
| 218 | return ctx->cipher->iv_len; | ||
| 219 | } | ||
| 220 | |||
| 221 | int EVP_CIPHER_key_length(const EVP_CIPHER *cipher) | 210 | int EVP_CIPHER_key_length(const EVP_CIPHER *cipher) |
| 222 | { | 211 | { |
| 223 | return cipher->key_len; | 212 | return cipher->key_len; |
| @@ -228,11 +217,6 @@ int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx) | |||
| 228 | return ctx->key_len; | 217 | return ctx->key_len; |
| 229 | } | 218 | } |
| 230 | 219 | ||
| 231 | int EVP_CIPHER_nid(const EVP_CIPHER *cipher) | ||
| 232 | { | ||
| 233 | return cipher->nid; | ||
| 234 | } | ||
| 235 | |||
| 236 | int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx) | 220 | int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx) |
| 237 | { | 221 | { |
| 238 | return ctx->cipher->nid; | 222 | return ctx->cipher->nid; |
| @@ -277,3 +261,18 @@ int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags) | |||
| 277 | { | 261 | { |
| 278 | return (ctx->flags & flags); | 262 | return (ctx->flags & flags); |
| 279 | } | 263 | } |
| 264 | |||
| 265 | void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags) | ||
| 266 | { | ||
| 267 | ctx->flags |= flags; | ||
| 268 | } | ||
| 269 | |||
| 270 | void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags) | ||
| 271 | { | ||
| 272 | ctx->flags &= ~flags; | ||
| 273 | } | ||
| 274 | |||
| 275 | int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags) | ||
| 276 | { | ||
| 277 | return (ctx->flags & flags); | ||
| 278 | } | ||
diff --git a/src/lib/libcrypto/evp/evp_locl.h b/src/lib/libcrypto/evp/evp_locl.h index 073b0adcff..eabcc96f30 100644 --- a/src/lib/libcrypto/evp/evp_locl.h +++ b/src/lib/libcrypto/evp/evp_locl.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* evp_locl.h */ | 1 | /* evp_locl.h */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -92,7 +92,7 @@ static int cname##_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const uns | |||
| 92 | #define BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \ | 92 | #define BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \ |
| 93 | static int cname##_cfb##cbits##_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \ | 93 | static int cname##_cfb##cbits##_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \ |
| 94 | {\ | 94 | {\ |
| 95 | cprefix##_cfb##cbits##_encrypt(in, out, (long)(cbits==1?inl*8:inl), &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num, ctx->encrypt);\ | 95 | cprefix##_cfb##cbits##_encrypt(in, out, (long)((cbits==1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ?inl*8:inl), &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num, ctx->encrypt);\ |
| 96 | return 1;\ | 96 | return 1;\ |
| 97 | } | 97 | } |
| 98 | 98 | ||
| @@ -226,11 +226,27 @@ const EVP_CIPHER *EVP_##cname##_ecb(void) { return &cname##_ecb; } | |||
| 226 | 226 | ||
| 227 | #define EVP_C_DATA(kstruct, ctx) ((kstruct *)(ctx)->cipher_data) | 227 | #define EVP_C_DATA(kstruct, ctx) ((kstruct *)(ctx)->cipher_data) |
| 228 | 228 | ||
| 229 | #define IMPLEMENT_CFBR(cipher,cprefix,kstruct,ksched,keysize,cbits,iv_len) \ | 229 | #define IMPLEMENT_CFBR(cipher,cprefix,kstruct,ksched,keysize,cbits,iv_len,fl) \ |
| 230 | BLOCK_CIPHER_func_cfb(cipher##_##keysize,cprefix,cbits,kstruct,ksched) \ | 230 | BLOCK_CIPHER_func_cfb(cipher##_##keysize,cprefix,cbits,kstruct,ksched) \ |
| 231 | BLOCK_CIPHER_def_cfb(cipher##_##keysize,kstruct, \ | 231 | BLOCK_CIPHER_def_cfb(cipher##_##keysize,kstruct, \ |
| 232 | NID_##cipher##_##keysize, keysize/8, iv_len, cbits, \ | 232 | NID_##cipher##_##keysize, keysize/8, iv_len, cbits, \ |
| 233 | 0, cipher##_init_key, NULL, \ | 233 | (fl)|EVP_CIPH_FLAG_DEFAULT_ASN1, \ |
| 234 | EVP_CIPHER_set_asn1_iv, \ | 234 | cipher##_init_key, NULL, NULL, NULL, NULL) |
| 235 | EVP_CIPHER_get_asn1_iv, \ | 235 | |
| 236 | NULL) | 236 | #ifdef OPENSSL_FIPS |
| 237 | #define RC2_set_key private_RC2_set_key | ||
| 238 | #define RC4_set_key private_RC4_set_key | ||
| 239 | #define CAST_set_key private_CAST_set_key | ||
| 240 | #define RC5_32_set_key private_RC5_32_set_key | ||
| 241 | #define BF_set_key private_BF_set_key | ||
| 242 | #define Camellia_set_key private_Camellia_set_key | ||
| 243 | #define idea_set_encrypt_key private_idea_set_encrypt_key | ||
| 244 | |||
| 245 | #define MD5_Init private_MD5_Init | ||
| 246 | #define MD4_Init private_MD4_Init | ||
| 247 | #define MD2_Init private_MD2_Init | ||
| 248 | #define MDC2_Init private_MDC2_Init | ||
| 249 | #define SHA_Init private_SHA_Init | ||
| 250 | |||
| 251 | #endif | ||
| 252 | |||
diff --git a/src/lib/libcrypto/evp/evp_pbe.c b/src/lib/libcrypto/evp/evp_pbe.c index c26d2de0f3..5e830be65f 100644 --- a/src/lib/libcrypto/evp/evp_pbe.c +++ b/src/lib/libcrypto/evp/evp_pbe.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* evp_pbe.c */ | 1 | /* evp_pbe.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/evp/evp_pkey.c b/src/lib/libcrypto/evp/evp_pkey.c index 0147f3e02a..10d9e9e772 100644 --- a/src/lib/libcrypto/evp/evp_pkey.c +++ b/src/lib/libcrypto/evp/evp_pkey.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* evp_pkey.c */ | 1 | /* evp_pkey.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/evp/m_dss.c b/src/lib/libcrypto/evp/m_dss.c index a948c77fa4..6b0c0aa7a3 100644 --- a/src/lib/libcrypto/evp/m_dss.c +++ b/src/lib/libcrypto/evp/m_dss.c | |||
| @@ -81,7 +81,7 @@ static const EVP_MD dsa_md= | |||
| 81 | NID_dsaWithSHA, | 81 | NID_dsaWithSHA, |
| 82 | NID_dsaWithSHA, | 82 | NID_dsaWithSHA, |
| 83 | SHA_DIGEST_LENGTH, | 83 | SHA_DIGEST_LENGTH, |
| 84 | 0, | 84 | EVP_MD_FLAG_FIPS, |
| 85 | init, | 85 | init, |
| 86 | update, | 86 | update, |
| 87 | final, | 87 | final, |
diff --git a/src/lib/libcrypto/evp/m_dss1.c b/src/lib/libcrypto/evp/m_dss1.c index c12e13972b..da8babc147 100644 --- a/src/lib/libcrypto/evp/m_dss1.c +++ b/src/lib/libcrypto/evp/m_dss1.c | |||
| @@ -68,6 +68,8 @@ | |||
| 68 | #include <openssl/dsa.h> | 68 | #include <openssl/dsa.h> |
| 69 | #endif | 69 | #endif |
| 70 | 70 | ||
| 71 | #ifndef OPENSSL_FIPS | ||
| 72 | |||
| 71 | static int init(EVP_MD_CTX *ctx) | 73 | static int init(EVP_MD_CTX *ctx) |
| 72 | { return SHA1_Init(ctx->md_data); } | 74 | { return SHA1_Init(ctx->md_data); } |
| 73 | 75 | ||
| @@ -98,3 +100,4 @@ const EVP_MD *EVP_dss1(void) | |||
| 98 | return(&dss1_md); | 100 | return(&dss1_md); |
| 99 | } | 101 | } |
| 100 | #endif | 102 | #endif |
| 103 | #endif | ||
diff --git a/src/lib/libcrypto/evp/m_md4.c b/src/lib/libcrypto/evp/m_md4.c index 1e0b7c5b42..5cd2ab5ade 100644 --- a/src/lib/libcrypto/evp/m_md4.c +++ b/src/lib/libcrypto/evp/m_md4.c | |||
| @@ -58,6 +58,7 @@ | |||
| 58 | 58 | ||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
| 61 | #include "evp_locl.h" | ||
| 61 | 62 | ||
| 62 | #ifndef OPENSSL_NO_MD4 | 63 | #ifndef OPENSSL_NO_MD4 |
| 63 | 64 | ||
diff --git a/src/lib/libcrypto/evp/m_md5.c b/src/lib/libcrypto/evp/m_md5.c index 63c142119e..6455829671 100644 --- a/src/lib/libcrypto/evp/m_md5.c +++ b/src/lib/libcrypto/evp/m_md5.c | |||
| @@ -62,6 +62,7 @@ | |||
| 62 | #ifndef OPENSSL_NO_MD5 | 62 | #ifndef OPENSSL_NO_MD5 |
| 63 | 63 | ||
| 64 | #include <openssl/evp.h> | 64 | #include <openssl/evp.h> |
| 65 | #include "evp_locl.h" | ||
| 65 | #include <openssl/objects.h> | 66 | #include <openssl/objects.h> |
| 66 | #include <openssl/x509.h> | 67 | #include <openssl/x509.h> |
| 67 | #include <openssl/md5.h> | 68 | #include <openssl/md5.h> |
diff --git a/src/lib/libcrypto/evp/m_sha1.c b/src/lib/libcrypto/evp/m_sha1.c index 4679b1c463..471ec30be0 100644 --- a/src/lib/libcrypto/evp/m_sha1.c +++ b/src/lib/libcrypto/evp/m_sha1.c | |||
| @@ -68,6 +68,8 @@ | |||
| 68 | #include <openssl/rsa.h> | 68 | #include <openssl/rsa.h> |
| 69 | #endif | 69 | #endif |
| 70 | 70 | ||
| 71 | #ifndef OPENSSL_FIPS | ||
| 72 | |||
| 71 | static int init(EVP_MD_CTX *ctx) | 73 | static int init(EVP_MD_CTX *ctx) |
| 72 | { return SHA1_Init(ctx->md_data); } | 74 | { return SHA1_Init(ctx->md_data); } |
| 73 | 75 | ||
| @@ -97,7 +99,6 @@ const EVP_MD *EVP_sha1(void) | |||
| 97 | { | 99 | { |
| 98 | return(&sha1_md); | 100 | return(&sha1_md); |
| 99 | } | 101 | } |
| 100 | #endif | ||
| 101 | 102 | ||
| 102 | #ifndef OPENSSL_NO_SHA256 | 103 | #ifndef OPENSSL_NO_SHA256 |
| 103 | static int init224(EVP_MD_CTX *ctx) | 104 | static int init224(EVP_MD_CTX *ctx) |
| @@ -202,3 +203,7 @@ static const EVP_MD sha512_md= | |||
| 202 | const EVP_MD *EVP_sha512(void) | 203 | const EVP_MD *EVP_sha512(void) |
| 203 | { return(&sha512_md); } | 204 | { return(&sha512_md); } |
| 204 | #endif /* ifndef OPENSSL_NO_SHA512 */ | 205 | #endif /* ifndef OPENSSL_NO_SHA512 */ |
| 206 | |||
| 207 | #endif | ||
| 208 | |||
| 209 | #endif | ||
diff --git a/src/lib/libcrypto/evp/names.c b/src/lib/libcrypto/evp/names.c index 88c1e780dd..e2e04c3570 100644 --- a/src/lib/libcrypto/evp/names.c +++ b/src/lib/libcrypto/evp/names.c | |||
| @@ -66,6 +66,10 @@ int EVP_add_cipher(const EVP_CIPHER *c) | |||
| 66 | { | 66 | { |
| 67 | int r; | 67 | int r; |
| 68 | 68 | ||
| 69 | #ifdef OPENSSL_FIPS | ||
| 70 | OPENSSL_init(); | ||
| 71 | #endif | ||
| 72 | |||
| 69 | r=OBJ_NAME_add(OBJ_nid2sn(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); | 73 | r=OBJ_NAME_add(OBJ_nid2sn(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); |
| 70 | if (r == 0) return(0); | 74 | if (r == 0) return(0); |
| 71 | r=OBJ_NAME_add(OBJ_nid2ln(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); | 75 | r=OBJ_NAME_add(OBJ_nid2ln(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); |
| @@ -77,6 +81,9 @@ int EVP_add_digest(const EVP_MD *md) | |||
| 77 | int r; | 81 | int r; |
| 78 | const char *name; | 82 | const char *name; |
| 79 | 83 | ||
| 84 | #ifdef OPENSSL_FIPS | ||
| 85 | OPENSSL_init(); | ||
| 86 | #endif | ||
| 80 | name=OBJ_nid2sn(md->type); | 87 | name=OBJ_nid2sn(md->type); |
| 81 | r=OBJ_NAME_add(name,OBJ_NAME_TYPE_MD_METH,(const char *)md); | 88 | r=OBJ_NAME_add(name,OBJ_NAME_TYPE_MD_METH,(const char *)md); |
| 82 | if (r == 0) return(0); | 89 | if (r == 0) return(0); |
diff --git a/src/lib/libcrypto/evp/p5_crpt.c b/src/lib/libcrypto/evp/p5_crpt.c index 48d50014a0..2a265fdee2 100644 --- a/src/lib/libcrypto/evp/p5_crpt.c +++ b/src/lib/libcrypto/evp/p5_crpt.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p5_crpt.c */ | 1 | /* p5_crpt.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/evp/p5_crpt2.c b/src/lib/libcrypto/evp/p5_crpt2.c index c969d5a206..6bec77baf9 100644 --- a/src/lib/libcrypto/evp/p5_crpt2.c +++ b/src/lib/libcrypto/evp/p5_crpt2.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p5_crpt2.c */ | 1 | /* p5_crpt2.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/evp/p_sign.c b/src/lib/libcrypto/evp/p_sign.c index e4ae5906f5..bf41a0db68 100644 --- a/src/lib/libcrypto/evp/p_sign.c +++ b/src/lib/libcrypto/evp/p_sign.c | |||
| @@ -84,10 +84,6 @@ int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, unsigned int *siglen, | |||
| 84 | MS_STATIC EVP_MD_CTX tmp_ctx; | 84 | MS_STATIC EVP_MD_CTX tmp_ctx; |
| 85 | 85 | ||
| 86 | *siglen=0; | 86 | *siglen=0; |
| 87 | EVP_MD_CTX_init(&tmp_ctx); | ||
| 88 | EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); | ||
| 89 | EVP_DigestFinal_ex(&tmp_ctx,&(m[0]),&m_len); | ||
| 90 | EVP_MD_CTX_cleanup(&tmp_ctx); | ||
| 91 | for (i=0; i<4; i++) | 87 | for (i=0; i<4; i++) |
| 92 | { | 88 | { |
| 93 | v=ctx->digest->required_pkey_type[i]; | 89 | v=ctx->digest->required_pkey_type[i]; |
| @@ -108,7 +104,23 @@ int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, unsigned int *siglen, | |||
| 108 | EVPerr(EVP_F_EVP_SIGNFINAL,EVP_R_NO_SIGN_FUNCTION_CONFIGURED); | 104 | EVPerr(EVP_F_EVP_SIGNFINAL,EVP_R_NO_SIGN_FUNCTION_CONFIGURED); |
| 109 | return(0); | 105 | return(0); |
| 110 | } | 106 | } |
| 111 | return(ctx->digest->sign(ctx->digest->type,m,m_len,sigret,siglen, | 107 | EVP_MD_CTX_init(&tmp_ctx); |
| 112 | pkey->pkey.ptr)); | 108 | EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); |
| 109 | if (ctx->digest->flags & EVP_MD_FLAG_SVCTX) | ||
| 110 | { | ||
| 111 | EVP_MD_SVCTX sctmp; | ||
| 112 | sctmp.mctx = &tmp_ctx; | ||
| 113 | sctmp.key = pkey->pkey.ptr; | ||
| 114 | i = ctx->digest->sign(ctx->digest->type, | ||
| 115 | NULL, -1, sigret, siglen, &sctmp); | ||
| 116 | } | ||
| 117 | else | ||
| 118 | { | ||
| 119 | EVP_DigestFinal_ex(&tmp_ctx,&(m[0]),&m_len); | ||
| 120 | i = ctx->digest->sign(ctx->digest->type,m,m_len,sigret,siglen, | ||
| 121 | pkey->pkey.ptr); | ||
| 122 | } | ||
| 123 | EVP_MD_CTX_cleanup(&tmp_ctx); | ||
| 124 | return i; | ||
| 113 | } | 125 | } |
| 114 | 126 | ||
diff --git a/src/lib/libcrypto/evp/p_verify.c b/src/lib/libcrypto/evp/p_verify.c index 21a40a375e..2d46dffe7e 100644 --- a/src/lib/libcrypto/evp/p_verify.c +++ b/src/lib/libcrypto/evp/p_verify.c | |||
| @@ -85,17 +85,29 @@ int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, | |||
| 85 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_WRONG_PUBLIC_KEY_TYPE); | 85 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_WRONG_PUBLIC_KEY_TYPE); |
| 86 | return(-1); | 86 | return(-1); |
| 87 | } | 87 | } |
| 88 | EVP_MD_CTX_init(&tmp_ctx); | 88 | if (ctx->digest->verify == NULL) |
| 89 | EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); | ||
| 90 | EVP_DigestFinal_ex(&tmp_ctx,&(m[0]),&m_len); | ||
| 91 | EVP_MD_CTX_cleanup(&tmp_ctx); | ||
| 92 | if (ctx->digest->verify == NULL) | ||
| 93 | { | 89 | { |
| 94 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_NO_VERIFY_FUNCTION_CONFIGURED); | 90 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_NO_VERIFY_FUNCTION_CONFIGURED); |
| 95 | return(0); | 91 | return(0); |
| 96 | } | 92 | } |
| 97 | 93 | ||
| 98 | return(ctx->digest->verify(ctx->digest->type,m,m_len, | 94 | EVP_MD_CTX_init(&tmp_ctx); |
| 99 | sigbuf,siglen,pkey->pkey.ptr)); | 95 | EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); |
| 96 | if (ctx->digest->flags & EVP_MD_FLAG_SVCTX) | ||
| 97 | { | ||
| 98 | EVP_MD_SVCTX sctmp; | ||
| 99 | sctmp.mctx = &tmp_ctx; | ||
| 100 | sctmp.key = pkey->pkey.ptr; | ||
| 101 | i = ctx->digest->verify(ctx->digest->type, | ||
| 102 | NULL, -1, sigbuf, siglen, &sctmp); | ||
| 103 | } | ||
| 104 | else | ||
| 105 | { | ||
| 106 | EVP_DigestFinal_ex(&tmp_ctx,&(m[0]),&m_len); | ||
| 107 | i = ctx->digest->verify(ctx->digest->type,m,m_len, | ||
| 108 | sigbuf,siglen,pkey->pkey.ptr); | ||
| 109 | } | ||
| 110 | EVP_MD_CTX_cleanup(&tmp_ctx); | ||
| 111 | return i; | ||
| 100 | } | 112 | } |
| 101 | 113 | ||
diff --git a/src/lib/libcrypto/hmac/hmac.c b/src/lib/libcrypto/hmac/hmac.c index c45e001492..cbc1c76a57 100644 --- a/src/lib/libcrypto/hmac/hmac.c +++ b/src/lib/libcrypto/hmac/hmac.c | |||
| @@ -61,6 +61,8 @@ | |||
| 61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 62 | #include <openssl/hmac.h> | 62 | #include <openssl/hmac.h> |
| 63 | 63 | ||
| 64 | #ifndef OPENSSL_FIPS | ||
| 65 | |||
| 64 | void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, | 66 | void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, |
| 65 | const EVP_MD *md, ENGINE *impl) | 67 | const EVP_MD *md, ENGINE *impl) |
| 66 | { | 68 | { |
| @@ -171,3 +173,11 @@ unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, | |||
| 171 | return(md); | 173 | return(md); |
| 172 | } | 174 | } |
| 173 | 175 | ||
| 176 | void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags) | ||
| 177 | { | ||
| 178 | EVP_MD_CTX_set_flags(&ctx->i_ctx, flags); | ||
| 179 | EVP_MD_CTX_set_flags(&ctx->o_ctx, flags); | ||
| 180 | EVP_MD_CTX_set_flags(&ctx->md_ctx, flags); | ||
| 181 | } | ||
| 182 | |||
| 183 | #endif | ||
diff --git a/src/lib/libcrypto/hmac/hmac.h b/src/lib/libcrypto/hmac/hmac.h index 719fc408ac..fc38ffb52b 100644 --- a/src/lib/libcrypto/hmac/hmac.h +++ b/src/lib/libcrypto/hmac/hmac.h | |||
| @@ -100,6 +100,7 @@ unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, | |||
| 100 | const unsigned char *d, size_t n, unsigned char *md, | 100 | const unsigned char *d, size_t n, unsigned char *md, |
| 101 | unsigned int *md_len); | 101 | unsigned int *md_len); |
| 102 | 102 | ||
| 103 | void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags); | ||
| 103 | 104 | ||
| 104 | #ifdef __cplusplus | 105 | #ifdef __cplusplus |
| 105 | } | 106 | } |
diff --git a/src/lib/libcrypto/idea/idea.h b/src/lib/libcrypto/idea/idea.h index bf97a37e39..a137d4cbce 100644 --- a/src/lib/libcrypto/idea/idea.h +++ b/src/lib/libcrypto/idea/idea.h | |||
| @@ -83,6 +83,9 @@ typedef struct idea_key_st | |||
| 83 | const char *idea_options(void); | 83 | const char *idea_options(void); |
| 84 | void idea_ecb_encrypt(const unsigned char *in, unsigned char *out, | 84 | void idea_ecb_encrypt(const unsigned char *in, unsigned char *out, |
| 85 | IDEA_KEY_SCHEDULE *ks); | 85 | IDEA_KEY_SCHEDULE *ks); |
| 86 | #ifdef OPENSSL_FIPS | ||
| 87 | void private_idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks); | ||
| 88 | #endif | ||
| 86 | void idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks); | 89 | void idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks); |
| 87 | void idea_set_decrypt_key(const IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk); | 90 | void idea_set_decrypt_key(const IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk); |
| 88 | void idea_cbc_encrypt(const unsigned char *in, unsigned char *out, | 91 | void idea_cbc_encrypt(const unsigned char *in, unsigned char *out, |
diff --git a/src/lib/libcrypto/md32_common.h b/src/lib/libcrypto/md32_common.h index 089c450290..61bcd9786f 100644 --- a/src/lib/libcrypto/md32_common.h +++ b/src/lib/libcrypto/md32_common.h | |||
| @@ -301,7 +301,7 @@ int HASH_UPDATE (HASH_CTX *c, const void *data_, size_t len) | |||
| 301 | { | 301 | { |
| 302 | p=(unsigned char *)c->data; | 302 | p=(unsigned char *)c->data; |
| 303 | 303 | ||
| 304 | if ((n+len) >= HASH_CBLOCK) | 304 | if (len >= HASH_CBLOCK || len+n >= HASH_CBLOCK) |
| 305 | { | 305 | { |
| 306 | memcpy (p+n,data,HASH_CBLOCK-n); | 306 | memcpy (p+n,data,HASH_CBLOCK-n); |
| 307 | HASH_BLOCK_DATA_ORDER (c,p,1); | 307 | HASH_BLOCK_DATA_ORDER (c,p,1); |
diff --git a/src/lib/libcrypto/md4/md4.h b/src/lib/libcrypto/md4/md4.h index 5598c93a4f..ba1fe4a6ee 100644 --- a/src/lib/libcrypto/md4/md4.h +++ b/src/lib/libcrypto/md4/md4.h | |||
| @@ -105,6 +105,9 @@ typedef struct MD4state_st | |||
| 105 | unsigned int num; | 105 | unsigned int num; |
| 106 | } MD4_CTX; | 106 | } MD4_CTX; |
| 107 | 107 | ||
| 108 | #ifdef OPENSSL_FIPS | ||
| 109 | int private_MD4_Init(MD4_CTX *c); | ||
| 110 | #endif | ||
| 108 | int MD4_Init(MD4_CTX *c); | 111 | int MD4_Init(MD4_CTX *c); |
| 109 | int MD4_Update(MD4_CTX *c, const void *data, size_t len); | 112 | int MD4_Update(MD4_CTX *c, const void *data, size_t len); |
| 110 | int MD4_Final(unsigned char *md, MD4_CTX *c); | 113 | int MD4_Final(unsigned char *md, MD4_CTX *c); |
diff --git a/src/lib/libcrypto/md4/md4_dgst.c b/src/lib/libcrypto/md4/md4_dgst.c index cfef94af39..0f5448601d 100644 --- a/src/lib/libcrypto/md4/md4_dgst.c +++ b/src/lib/libcrypto/md4/md4_dgst.c | |||
| @@ -59,6 +59,11 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include "md4_locl.h" | 60 | #include "md4_locl.h" |
| 61 | #include <openssl/opensslv.h> | 61 | #include <openssl/opensslv.h> |
| 62 | #include <openssl/err.h> | ||
| 63 | #ifdef OPENSSL_FIPS | ||
| 64 | #include <openssl/fips.h> | ||
| 65 | #endif | ||
| 66 | |||
| 62 | 67 | ||
| 63 | const char MD4_version[]="MD4" OPENSSL_VERSION_PTEXT; | 68 | const char MD4_version[]="MD4" OPENSSL_VERSION_PTEXT; |
| 64 | 69 | ||
| @@ -70,7 +75,7 @@ const char MD4_version[]="MD4" OPENSSL_VERSION_PTEXT; | |||
| 70 | #define INIT_DATA_C (unsigned long)0x98badcfeL | 75 | #define INIT_DATA_C (unsigned long)0x98badcfeL |
| 71 | #define INIT_DATA_D (unsigned long)0x10325476L | 76 | #define INIT_DATA_D (unsigned long)0x10325476L |
| 72 | 77 | ||
| 73 | int MD4_Init(MD4_CTX *c) | 78 | FIPS_NON_FIPS_MD_Init(MD4) |
| 74 | { | 79 | { |
| 75 | c->A=INIT_DATA_A; | 80 | c->A=INIT_DATA_A; |
| 76 | c->B=INIT_DATA_B; | 81 | c->B=INIT_DATA_B; |
diff --git a/src/lib/libcrypto/md5/md5.h b/src/lib/libcrypto/md5/md5.h index dbdc0e1abc..0761f84a27 100644 --- a/src/lib/libcrypto/md5/md5.h +++ b/src/lib/libcrypto/md5/md5.h | |||
| @@ -105,6 +105,9 @@ typedef struct MD5state_st | |||
| 105 | unsigned int num; | 105 | unsigned int num; |
| 106 | } MD5_CTX; | 106 | } MD5_CTX; |
| 107 | 107 | ||
| 108 | #ifdef OPENSSL_FIPS | ||
| 109 | int private_MD5_Init(MD5_CTX *c); | ||
| 110 | #endif | ||
| 108 | int MD5_Init(MD5_CTX *c); | 111 | int MD5_Init(MD5_CTX *c); |
| 109 | int MD5_Update(MD5_CTX *c, const void *data, size_t len); | 112 | int MD5_Update(MD5_CTX *c, const void *data, size_t len); |
| 110 | int MD5_Final(unsigned char *md, MD5_CTX *c); | 113 | int MD5_Final(unsigned char *md, MD5_CTX *c); |
diff --git a/src/lib/libcrypto/md5/md5_dgst.c b/src/lib/libcrypto/md5/md5_dgst.c index b96e332ba4..47bb9020ee 100644 --- a/src/lib/libcrypto/md5/md5_dgst.c +++ b/src/lib/libcrypto/md5/md5_dgst.c | |||
| @@ -59,6 +59,11 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include "md5_locl.h" | 60 | #include "md5_locl.h" |
| 61 | #include <openssl/opensslv.h> | 61 | #include <openssl/opensslv.h> |
| 62 | #include <openssl/err.h> | ||
| 63 | #ifdef OPENSSL_FIPS | ||
| 64 | #include <openssl/fips.h> | ||
| 65 | #endif | ||
| 66 | |||
| 62 | 67 | ||
| 63 | const char MD5_version[]="MD5" OPENSSL_VERSION_PTEXT; | 68 | const char MD5_version[]="MD5" OPENSSL_VERSION_PTEXT; |
| 64 | 69 | ||
| @@ -70,7 +75,7 @@ const char MD5_version[]="MD5" OPENSSL_VERSION_PTEXT; | |||
| 70 | #define INIT_DATA_C (unsigned long)0x98badcfeL | 75 | #define INIT_DATA_C (unsigned long)0x98badcfeL |
| 71 | #define INIT_DATA_D (unsigned long)0x10325476L | 76 | #define INIT_DATA_D (unsigned long)0x10325476L |
| 72 | 77 | ||
| 73 | int MD5_Init(MD5_CTX *c) | 78 | FIPS_NON_FIPS_MD_Init(MD5) |
| 74 | { | 79 | { |
| 75 | c->A=INIT_DATA_A; | 80 | c->A=INIT_DATA_A; |
| 76 | c->B=INIT_DATA_B; | 81 | c->B=INIT_DATA_B; |
diff --git a/src/lib/libcrypto/mem_dbg.c b/src/lib/libcrypto/mem_dbg.c index 8316485217..dfeb084799 100644 --- a/src/lib/libcrypto/mem_dbg.c +++ b/src/lib/libcrypto/mem_dbg.c | |||
| @@ -330,7 +330,7 @@ static APP_INFO *pop_info(void) | |||
| 330 | return(ret); | 330 | return(ret); |
| 331 | } | 331 | } |
| 332 | 332 | ||
| 333 | int CRYPTO_push_info_(const char *info, const char *file, int line) | 333 | int CRYPTO_dbg_push_info(const char *info, const char *file, int line) |
| 334 | { | 334 | { |
| 335 | APP_INFO *ami, *amim; | 335 | APP_INFO *ami, *amim; |
| 336 | int ret=0; | 336 | int ret=0; |
| @@ -380,7 +380,7 @@ int CRYPTO_push_info_(const char *info, const char *file, int line) | |||
| 380 | return(ret); | 380 | return(ret); |
| 381 | } | 381 | } |
| 382 | 382 | ||
| 383 | int CRYPTO_pop_info(void) | 383 | int CRYPTO_dbg_pop_info(void) |
| 384 | { | 384 | { |
| 385 | int ret=0; | 385 | int ret=0; |
| 386 | 386 | ||
| @@ -395,7 +395,7 @@ int CRYPTO_pop_info(void) | |||
| 395 | return(ret); | 395 | return(ret); |
| 396 | } | 396 | } |
| 397 | 397 | ||
| 398 | int CRYPTO_remove_all_info(void) | 398 | int CRYPTO_dbg_remove_all_info(void) |
| 399 | { | 399 | { |
| 400 | int ret=0; | 400 | int ret=0; |
| 401 | 401 | ||
| @@ -793,3 +793,25 @@ void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb) | |||
| 793 | lh_doall_arg(mh, LHASH_DOALL_ARG_FN(cb_leak), &cb); | 793 | lh_doall_arg(mh, LHASH_DOALL_ARG_FN(cb_leak), &cb); |
| 794 | CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2); | 794 | CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2); |
| 795 | } | 795 | } |
| 796 | |||
| 797 | void CRYPTO_malloc_debug_init(void) | ||
| 798 | { | ||
| 799 | CRYPTO_set_mem_debug_functions( | ||
| 800 | CRYPTO_dbg_malloc, | ||
| 801 | CRYPTO_dbg_realloc, | ||
| 802 | CRYPTO_dbg_free, | ||
| 803 | CRYPTO_dbg_set_options, | ||
| 804 | CRYPTO_dbg_get_options); | ||
| 805 | CRYPTO_set_mem_info_functions( | ||
| 806 | CRYPTO_dbg_push_info, | ||
| 807 | CRYPTO_dbg_pop_info, | ||
| 808 | CRYPTO_dbg_remove_all_info); | ||
| 809 | } | ||
| 810 | |||
| 811 | char *CRYPTO_strdup(const char *str, const char *file, int line) | ||
| 812 | { | ||
| 813 | char *ret = CRYPTO_malloc(strlen(str)+1, file, line); | ||
| 814 | |||
| 815 | strcpy(ret, str); | ||
| 816 | return ret; | ||
| 817 | } | ||
diff --git a/src/lib/libcrypto/o_init.c b/src/lib/libcrypto/o_init.c new file mode 100644 index 0000000000..00ed65a6cf --- /dev/null +++ b/src/lib/libcrypto/o_init.c | |||
| @@ -0,0 +1,86 @@ | |||
| 1 | /* o_init.c */ | ||
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | ||
| 3 | * project. | ||
| 4 | */ | ||
| 5 | /* ==================================================================== | ||
| 6 | * Copyright (c) 2007 The OpenSSL Project. All rights reserved. | ||
| 7 | * | ||
| 8 | * Redistribution and use in source and binary forms, with or without | ||
| 9 | * modification, are permitted provided that the following conditions | ||
| 10 | * are met: | ||
| 11 | * | ||
| 12 | * 1. Redistributions of source code must retain the above copyright | ||
| 13 | * notice, this list of conditions and the following disclaimer. | ||
| 14 | * | ||
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 16 | * notice, this list of conditions and the following disclaimer in | ||
| 17 | * the documentation and/or other materials provided with the | ||
| 18 | * distribution. | ||
| 19 | * | ||
| 20 | * 3. All advertising materials mentioning features or use of this | ||
| 21 | * software must display the following acknowledgment: | ||
| 22 | * "This product includes software developed by the OpenSSL Project | ||
| 23 | * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" | ||
| 24 | * | ||
| 25 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
| 26 | * endorse or promote products derived from this software without | ||
| 27 | * prior written permission. For written permission, please contact | ||
| 28 | * openssl-core@openssl.org. | ||
| 29 | * | ||
| 30 | * 5. Products derived from this software may not be called "OpenSSL" | ||
| 31 | * nor may "OpenSSL" appear in their names without prior written | ||
| 32 | * permission of the OpenSSL Project. | ||
| 33 | * | ||
| 34 | * 6. Redistributions of any form whatsoever must retain the following | ||
| 35 | * acknowledgment: | ||
| 36 | * "This product includes software developed by the OpenSSL Project | ||
| 37 | * for use in the OpenSSL Toolkit (http://www.openssl.org/)" | ||
| 38 | * | ||
| 39 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
| 40 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 41 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
| 42 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
| 43 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 44 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 45 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 46 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 47 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 48 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| 49 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
| 50 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 51 | * ==================================================================== | ||
| 52 | * | ||
| 53 | * This product includes cryptographic software written by Eric Young | ||
| 54 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
| 55 | * Hudson (tjh@cryptsoft.com). | ||
| 56 | * | ||
| 57 | */ | ||
| 58 | |||
| 59 | #include <e_os.h> | ||
| 60 | #include <openssl/err.h> | ||
| 61 | |||
| 62 | /* Perform any essential OpenSSL initialization operations. | ||
| 63 | * Currently only sets FIPS callbacks | ||
| 64 | */ | ||
| 65 | |||
| 66 | void OPENSSL_init(void) | ||
| 67 | { | ||
| 68 | #ifdef OPENSSL_FIPS | ||
| 69 | static int done = 0; | ||
| 70 | if (!done) | ||
| 71 | { | ||
| 72 | int_ERR_lib_init(); | ||
| 73 | #ifdef CRYPTO_MDEBUG | ||
| 74 | CRYPTO_malloc_debug_init(); | ||
| 75 | #endif | ||
| 76 | #ifdef OPENSSL_ENGINE | ||
| 77 | int_EVP_MD_init_engine_callbacks(); | ||
| 78 | int_EVP_CIPHER_init_engine_callbacks(); | ||
| 79 | int_RAND_init_engine_callbacks(); | ||
| 80 | #endif | ||
| 81 | done = 1; | ||
| 82 | } | ||
| 83 | #endif | ||
| 84 | } | ||
| 85 | |||
| 86 | |||
diff --git a/src/lib/libcrypto/objects/obj_dat.pl b/src/lib/libcrypto/objects/obj_dat.pl index 8a09a46ee6..7de2f77afd 100644 --- a/src/lib/libcrypto/objects/obj_dat.pl +++ b/src/lib/libcrypto/objects/obj_dat.pl | |||
| @@ -2,7 +2,9 @@ | |||
| 2 | 2 | ||
| 3 | # fixes bug in floating point emulation on sparc64 when | 3 | # fixes bug in floating point emulation on sparc64 when |
| 4 | # this script produces off-by-one output on sparc64 | 4 | # this script produces off-by-one output on sparc64 |
| 5 | use integer; | 5 | eval 'use integer;'; |
| 6 | |||
| 7 | print STDERR "Warning: perl module integer not found.\n" if ($@); | ||
| 6 | 8 | ||
| 7 | sub obj_cmp | 9 | sub obj_cmp |
| 8 | { | 10 | { |
diff --git a/src/lib/libcrypto/objects/obj_mac.num b/src/lib/libcrypto/objects/obj_mac.num index 47815b1e4e..e3f56bc52c 100644 --- a/src/lib/libcrypto/objects/obj_mac.num +++ b/src/lib/libcrypto/objects/obj_mac.num | |||
| @@ -788,3 +788,71 @@ id_ct_asciiTextWithCRLF 787 | |||
| 788 | id_aes128_wrap 788 | 788 | id_aes128_wrap 788 |
| 789 | id_aes192_wrap 789 | 789 | id_aes192_wrap 789 |
| 790 | id_aes256_wrap 790 | 790 | id_aes256_wrap 790 |
| 791 | ecdsa_with_Recommended 791 | ||
| 792 | ecdsa_with_Specified 792 | ||
| 793 | ecdsa_with_SHA224 793 | ||
| 794 | ecdsa_with_SHA256 794 | ||
| 795 | ecdsa_with_SHA384 795 | ||
| 796 | ecdsa_with_SHA512 796 | ||
| 797 | hmacWithMD5 797 | ||
| 798 | hmacWithSHA224 798 | ||
| 799 | hmacWithSHA256 799 | ||
| 800 | hmacWithSHA384 800 | ||
| 801 | hmacWithSHA512 801 | ||
| 802 | dsa_with_SHA224 802 | ||
| 803 | dsa_with_SHA256 803 | ||
| 804 | whirlpool 804 | ||
| 805 | cryptopro 805 | ||
| 806 | cryptocom 806 | ||
| 807 | id_GostR3411_94_with_GostR3410_2001 807 | ||
| 808 | id_GostR3411_94_with_GostR3410_94 808 | ||
| 809 | id_GostR3411_94 809 | ||
| 810 | id_HMACGostR3411_94 810 | ||
| 811 | id_GostR3410_2001 811 | ||
| 812 | id_GostR3410_94 812 | ||
| 813 | id_Gost28147_89 813 | ||
| 814 | gost89_cnt 814 | ||
| 815 | id_Gost28147_89_MAC 815 | ||
| 816 | id_GostR3411_94_prf 816 | ||
| 817 | id_GostR3410_2001DH 817 | ||
| 818 | id_GostR3410_94DH 818 | ||
| 819 | id_Gost28147_89_CryptoPro_KeyMeshing 819 | ||
| 820 | id_Gost28147_89_None_KeyMeshing 820 | ||
| 821 | id_GostR3411_94_TestParamSet 821 | ||
| 822 | id_GostR3411_94_CryptoProParamSet 822 | ||
| 823 | id_Gost28147_89_TestParamSet 823 | ||
| 824 | id_Gost28147_89_CryptoPro_A_ParamSet 824 | ||
| 825 | id_Gost28147_89_CryptoPro_B_ParamSet 825 | ||
| 826 | id_Gost28147_89_CryptoPro_C_ParamSet 826 | ||
| 827 | id_Gost28147_89_CryptoPro_D_ParamSet 827 | ||
| 828 | id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet 828 | ||
| 829 | id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet 829 | ||
| 830 | id_Gost28147_89_CryptoPro_RIC_1_ParamSet 830 | ||
| 831 | id_GostR3410_94_TestParamSet 831 | ||
| 832 | id_GostR3410_94_CryptoPro_A_ParamSet 832 | ||
| 833 | id_GostR3410_94_CryptoPro_B_ParamSet 833 | ||
| 834 | id_GostR3410_94_CryptoPro_C_ParamSet 834 | ||
| 835 | id_GostR3410_94_CryptoPro_D_ParamSet 835 | ||
| 836 | id_GostR3410_94_CryptoPro_XchA_ParamSet 836 | ||
| 837 | id_GostR3410_94_CryptoPro_XchB_ParamSet 837 | ||
| 838 | id_GostR3410_94_CryptoPro_XchC_ParamSet 838 | ||
| 839 | id_GostR3410_2001_TestParamSet 839 | ||
| 840 | id_GostR3410_2001_CryptoPro_A_ParamSet 840 | ||
| 841 | id_GostR3410_2001_CryptoPro_B_ParamSet 841 | ||
| 842 | id_GostR3410_2001_CryptoPro_C_ParamSet 842 | ||
| 843 | id_GostR3410_2001_CryptoPro_XchA_ParamSet 843 | ||
| 844 | id_GostR3410_2001_CryptoPro_XchB_ParamSet 844 | ||
| 845 | id_GostR3410_94_a 845 | ||
| 846 | id_GostR3410_94_aBis 846 | ||
| 847 | id_GostR3410_94_b 847 | ||
| 848 | id_GostR3410_94_bBis 848 | ||
| 849 | id_Gost28147_89_cc 849 | ||
| 850 | id_GostR3410_94_cc 850 | ||
| 851 | id_GostR3410_2001_cc 851 | ||
| 852 | id_GostR3411_94_with_GostR3410_94_cc 852 | ||
| 853 | id_GostR3411_94_with_GostR3410_2001_cc 853 | ||
| 854 | id_GostR3410_2001_ParamSet_cc 854 | ||
| 855 | hmac 855 | ||
| 856 | LocalKeySet 856 | ||
| 857 | freshest_crl 857 | ||
| 858 | id_on_permanentIdentifier 858 | ||
diff --git a/src/lib/libcrypto/objects/objects.txt b/src/lib/libcrypto/objects/objects.txt index 34c8d1d647..a6a811b8e7 100644 --- a/src/lib/libcrypto/objects/objects.txt +++ b/src/lib/libcrypto/objects/objects.txt | |||
| @@ -79,6 +79,12 @@ X9-62_primeCurve 7 : prime256v1 | |||
| 79 | !Alias id-ecSigType ansi-X9-62 4 | 79 | !Alias id-ecSigType ansi-X9-62 4 |
| 80 | !global | 80 | !global |
| 81 | X9-62_id-ecSigType 1 : ecdsa-with-SHA1 | 81 | X9-62_id-ecSigType 1 : ecdsa-with-SHA1 |
| 82 | X9-62_id-ecSigType 2 : ecdsa-with-Recommended | ||
| 83 | X9-62_id-ecSigType 3 : ecdsa-with-Specified | ||
| 84 | ecdsa-with-Specified 1 : ecdsa-with-SHA224 | ||
| 85 | ecdsa-with-Specified 2 : ecdsa-with-SHA256 | ||
| 86 | ecdsa-with-Specified 3 : ecdsa-with-SHA384 | ||
| 87 | ecdsa-with-Specified 4 : ecdsa-with-SHA512 | ||
| 82 | 88 | ||
| 83 | # SECG curve OIDs from "SEC 2: Recommended Elliptic Curve Domain Parameters" | 89 | # SECG curve OIDs from "SEC 2: Recommended Elliptic Curve Domain Parameters" |
| 84 | # (http://www.secg.org/) | 90 | # (http://www.secg.org/) |
| @@ -313,6 +319,7 @@ pkcs9 20 : : friendlyName | |||
| 313 | pkcs9 21 : : localKeyID | 319 | pkcs9 21 : : localKeyID |
| 314 | !Cname ms-csp-name | 320 | !Cname ms-csp-name |
| 315 | 1 3 6 1 4 1 311 17 1 : CSPName : Microsoft CSP Name | 321 | 1 3 6 1 4 1 311 17 1 : CSPName : Microsoft CSP Name |
| 322 | 1 3 6 1 4 1 311 17 2 : LocalKeySet : Microsoft Local Key set | ||
| 316 | !Alias certTypes pkcs9 22 | 323 | !Alias certTypes pkcs9 22 |
| 317 | certTypes 1 : : x509Certificate | 324 | certTypes 1 : : x509Certificate |
| 318 | certTypes 2 : : sdsiCertificate | 325 | certTypes 2 : : sdsiCertificate |
| @@ -348,7 +355,15 @@ rsadsi 2 2 : MD2 : md2 | |||
| 348 | rsadsi 2 4 : MD4 : md4 | 355 | rsadsi 2 4 : MD4 : md4 |
| 349 | rsadsi 2 5 : MD5 : md5 | 356 | rsadsi 2 5 : MD5 : md5 |
| 350 | : MD5-SHA1 : md5-sha1 | 357 | : MD5-SHA1 : md5-sha1 |
| 358 | rsadsi 2 6 : : hmacWithMD5 | ||
| 351 | rsadsi 2 7 : : hmacWithSHA1 | 359 | rsadsi 2 7 : : hmacWithSHA1 |
| 360 | |||
| 361 | # From RFC4231 | ||
| 362 | rsadsi 2 8 : : hmacWithSHA224 | ||
| 363 | rsadsi 2 9 : : hmacWithSHA256 | ||
| 364 | rsadsi 2 10 : : hmacWithSHA384 | ||
| 365 | rsadsi 2 11 : : hmacWithSHA512 | ||
| 366 | |||
| 352 | rsadsi 3 2 : RC2-CBC : rc2-cbc | 367 | rsadsi 3 2 : RC2-CBC : rc2-cbc |
| 353 | : RC2-ECB : rc2-ecb | 368 | : RC2-ECB : rc2-ecb |
| 354 | !Cname rc2-cfb64 | 369 | !Cname rc2-cfb64 |
| @@ -542,6 +557,7 @@ id-cmc 24 : id-cmc-confirmCertAcceptance | |||
| 542 | 557 | ||
| 543 | # other names | 558 | # other names |
| 544 | id-on 1 : id-on-personalData | 559 | id-on 1 : id-on-personalData |
| 560 | id-on 3 : id-on-permanentIdentifier : Permanent Identifier | ||
| 545 | 561 | ||
| 546 | # personal data attributes | 562 | # personal data attributes |
| 547 | id-pda 1 : id-pda-dateOfBirth | 563 | id-pda 1 : id-pda-dateOfBirth |
| @@ -711,6 +727,8 @@ id-ce 35 : authorityKeyIdentifier : X509v3 Authority Key Identifier | |||
| 711 | id-ce 36 : policyConstraints : X509v3 Policy Constraints | 727 | id-ce 36 : policyConstraints : X509v3 Policy Constraints |
| 712 | !Cname ext-key-usage | 728 | !Cname ext-key-usage |
| 713 | id-ce 37 : extendedKeyUsage : X509v3 Extended Key Usage | 729 | id-ce 37 : extendedKeyUsage : X509v3 Extended Key Usage |
| 730 | !Cname freshest-crl | ||
| 731 | id-ce 46 : freshestCRL : X509v3 Freshest CRL | ||
| 714 | !Cname inhibit-any-policy | 732 | !Cname inhibit-any-policy |
| 715 | id-ce 54 : inhibitAnyPolicy : X509v3 Inhibit Any Policy | 733 | id-ce 54 : inhibitAnyPolicy : X509v3 Inhibit Any Policy |
| 716 | !Cname target-information | 734 | !Cname target-information |
| @@ -833,6 +851,11 @@ nist_hashalgs 2 : SHA384 : sha384 | |||
| 833 | nist_hashalgs 3 : SHA512 : sha512 | 851 | nist_hashalgs 3 : SHA512 : sha512 |
| 834 | nist_hashalgs 4 : SHA224 : sha224 | 852 | nist_hashalgs 4 : SHA224 : sha224 |
| 835 | 853 | ||
| 854 | # OIDs for dsa-with-sha224 and dsa-with-sha256 | ||
| 855 | !Alias dsa_with_sha2 nistAlgorithms 3 | ||
| 856 | dsa_with_sha2 1 : dsa_with_SHA224 | ||
| 857 | dsa_with_sha2 2 : dsa_with_SHA256 | ||
| 858 | |||
| 836 | # Hold instruction CRL entry extension | 859 | # Hold instruction CRL entry extension |
| 837 | !Cname hold-instruction-code | 860 | !Cname hold-instruction-code |
| 838 | id-ce 23 : holdInstructionCode : Hold Instruction Code | 861 | id-ce 23 : holdInstructionCode : Hold Instruction Code |
| @@ -1070,13 +1093,93 @@ rsadsi 1 1 6 : rsaOAEPEncryptionSET | |||
| 1070 | : Oakley-EC2N-3 : ipsec3 | 1093 | : Oakley-EC2N-3 : ipsec3 |
| 1071 | : Oakley-EC2N-4 : ipsec4 | 1094 | : Oakley-EC2N-4 : ipsec4 |
| 1072 | 1095 | ||
| 1096 | iso 0 10118 3 0 55 : whirlpool | ||
| 1097 | |||
| 1098 | # GOST OIDs | ||
| 1099 | |||
| 1100 | member-body 643 2 2 : cryptopro | ||
| 1101 | member-body 643 2 9 : cryptocom | ||
| 1102 | |||
| 1103 | cryptopro 3 : id-GostR3411-94-with-GostR3410-2001 : GOST R 34.11-94 with GOST R 34.10-2001 | ||
| 1104 | cryptopro 4 : id-GostR3411-94-with-GostR3410-94 : GOST R 34.11-94 with GOST R 34.10-94 | ||
| 1105 | !Cname id-GostR3411-94 | ||
| 1106 | cryptopro 9 : md_gost94 : GOST R 34.11-94 | ||
| 1107 | cryptopro 10 : id-HMACGostR3411-94 : HMAC GOST 34.11-94 | ||
| 1108 | !Cname id-GostR3410-2001 | ||
| 1109 | cryptopro 19 : gost2001 : GOST R 34.10-2001 | ||
| 1110 | !Cname id-GostR3410-94 | ||
| 1111 | cryptopro 20 : gost94 : GOST R 34.10-94 | ||
| 1112 | !Cname id-Gost28147-89 | ||
| 1113 | cryptopro 21 : gost89 : GOST 28147-89 | ||
| 1114 | : gost89-cnt | ||
| 1115 | !Cname id-Gost28147-89-MAC | ||
| 1116 | cryptopro 22 : gost-mac : GOST 28147-89 MAC | ||
| 1117 | !Cname id-GostR3411-94-prf | ||
| 1118 | cryptopro 23 : prf-gostr3411-94 : GOST R 34.11-94 PRF | ||
| 1119 | cryptopro 98 : id-GostR3410-2001DH : GOST R 34.10-2001 DH | ||
| 1120 | cryptopro 99 : id-GostR3410-94DH : GOST R 34.10-94 DH | ||
| 1121 | |||
| 1122 | cryptopro 14 1 : id-Gost28147-89-CryptoPro-KeyMeshing | ||
| 1123 | cryptopro 14 0 : id-Gost28147-89-None-KeyMeshing | ||
| 1124 | |||
| 1125 | # GOST parameter set OIDs | ||
| 1126 | |||
| 1127 | cryptopro 30 0 : id-GostR3411-94-TestParamSet | ||
| 1128 | cryptopro 30 1 : id-GostR3411-94-CryptoProParamSet | ||
| 1129 | |||
| 1130 | cryptopro 31 0 : id-Gost28147-89-TestParamSet | ||
| 1131 | cryptopro 31 1 : id-Gost28147-89-CryptoPro-A-ParamSet | ||
| 1132 | cryptopro 31 2 : id-Gost28147-89-CryptoPro-B-ParamSet | ||
| 1133 | cryptopro 31 3 : id-Gost28147-89-CryptoPro-C-ParamSet | ||
| 1134 | cryptopro 31 4 : id-Gost28147-89-CryptoPro-D-ParamSet | ||
| 1135 | cryptopro 31 5 : id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet | ||
| 1136 | cryptopro 31 6 : id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet | ||
| 1137 | cryptopro 31 7 : id-Gost28147-89-CryptoPro-RIC-1-ParamSet | ||
| 1138 | |||
| 1139 | cryptopro 32 0 : id-GostR3410-94-TestParamSet | ||
| 1140 | cryptopro 32 2 : id-GostR3410-94-CryptoPro-A-ParamSet | ||
| 1141 | cryptopro 32 3 : id-GostR3410-94-CryptoPro-B-ParamSet | ||
| 1142 | cryptopro 32 4 : id-GostR3410-94-CryptoPro-C-ParamSet | ||
| 1143 | cryptopro 32 5 : id-GostR3410-94-CryptoPro-D-ParamSet | ||
| 1144 | |||
| 1145 | cryptopro 33 1 : id-GostR3410-94-CryptoPro-XchA-ParamSet | ||
| 1146 | cryptopro 33 2 : id-GostR3410-94-CryptoPro-XchB-ParamSet | ||
| 1147 | cryptopro 33 3 : id-GostR3410-94-CryptoPro-XchC-ParamSet | ||
| 1148 | |||
| 1149 | cryptopro 35 0 : id-GostR3410-2001-TestParamSet | ||
| 1150 | cryptopro 35 1 : id-GostR3410-2001-CryptoPro-A-ParamSet | ||
| 1151 | cryptopro 35 2 : id-GostR3410-2001-CryptoPro-B-ParamSet | ||
| 1152 | cryptopro 35 3 : id-GostR3410-2001-CryptoPro-C-ParamSet | ||
| 1153 | |||
| 1154 | cryptopro 36 0 : id-GostR3410-2001-CryptoPro-XchA-ParamSet | ||
| 1155 | cryptopro 36 1 : id-GostR3410-2001-CryptoPro-XchB-ParamSet | ||
| 1156 | |||
| 1157 | id-GostR3410-94 1 : id-GostR3410-94-a | ||
| 1158 | id-GostR3410-94 2 : id-GostR3410-94-aBis | ||
| 1159 | id-GostR3410-94 3 : id-GostR3410-94-b | ||
| 1160 | id-GostR3410-94 4 : id-GostR3410-94-bBis | ||
| 1161 | |||
| 1162 | # Cryptocom LTD GOST OIDs | ||
| 1163 | |||
| 1164 | cryptocom 1 6 1 : id-Gost28147-89-cc : GOST 28147-89 Cryptocom ParamSet | ||
| 1165 | !Cname id-GostR3410-94-cc | ||
| 1166 | cryptocom 1 5 3 : gost94cc : GOST 34.10-94 Cryptocom | ||
| 1167 | !Cname id-GostR3410-2001-cc | ||
| 1168 | cryptocom 1 5 4 : gost2001cc : GOST 34.10-2001 Cryptocom | ||
| 1169 | |||
| 1170 | cryptocom 1 3 3 : id-GostR3411-94-with-GostR3410-94-cc : GOST R 34.11-94 with GOST R 34.10-94 Cryptocom | ||
| 1171 | cryptocom 1 3 4 : id-GostR3411-94-with-GostR3410-2001-cc : GOST R 34.11-94 with GOST R 34.10-2001 Cryptocom | ||
| 1172 | |||
| 1173 | cryptocom 1 8 1 : id-GostR3410-2001-ParamSet-cc : GOST R 3410-2001 Parameter Set Cryptocom | ||
| 1073 | 1174 | ||
| 1074 | # Definitions for Camellia cipher - CBC MODE | 1175 | # Definitions for Camellia cipher - CBC MODE |
| 1176 | |||
| 1075 | 1 2 392 200011 61 1 1 1 2 : CAMELLIA-128-CBC : camellia-128-cbc | 1177 | 1 2 392 200011 61 1 1 1 2 : CAMELLIA-128-CBC : camellia-128-cbc |
| 1076 | 1 2 392 200011 61 1 1 1 3 : CAMELLIA-192-CBC : camellia-192-cbc | 1178 | 1 2 392 200011 61 1 1 1 3 : CAMELLIA-192-CBC : camellia-192-cbc |
| 1077 | 1 2 392 200011 61 1 1 1 4 : CAMELLIA-256-CBC : camellia-256-cbc | 1179 | 1 2 392 200011 61 1 1 1 4 : CAMELLIA-256-CBC : camellia-256-cbc |
| 1078 | 1180 | ||
| 1079 | # Definitions for Camellia cipher - ECB, CFB, OFB MODE | 1181 | # Definitions for Camellia cipher - ECB, CFB, OFB MODE |
| 1182 | |||
| 1080 | !Alias ntt-ds 0 3 4401 5 | 1183 | !Alias ntt-ds 0 3 4401 5 |
| 1081 | !Alias camellia ntt-ds 3 1 9 | 1184 | !Alias camellia ntt-ds 3 1 9 |
| 1082 | 1185 | ||
| @@ -1107,7 +1210,6 @@ camellia 44 : CAMELLIA-256-CFB : camellia-256-cfb | |||
| 1107 | : CAMELLIA-192-CFB8 : camellia-192-cfb8 | 1210 | : CAMELLIA-192-CFB8 : camellia-192-cfb8 |
| 1108 | : CAMELLIA-256-CFB8 : camellia-256-cfb8 | 1211 | : CAMELLIA-256-CFB8 : camellia-256-cfb8 |
| 1109 | 1212 | ||
| 1110 | |||
| 1111 | # Definitions for SEED cipher - ECB, CBC, OFB mode | 1213 | # Definitions for SEED cipher - ECB, CBC, OFB mode |
| 1112 | 1214 | ||
| 1113 | member-body 410 200004 : KISA : kisa | 1215 | member-body 410 200004 : KISA : kisa |
| @@ -1117,3 +1219,7 @@ kisa 1 4 : SEED-CBC : seed-cbc | |||
| 1117 | kisa 1 5 : SEED-CFB : seed-cfb | 1219 | kisa 1 5 : SEED-CFB : seed-cfb |
| 1118 | !Cname seed-ofb128 | 1220 | !Cname seed-ofb128 |
| 1119 | kisa 1 6 : SEED-OFB : seed-ofb | 1221 | kisa 1 6 : SEED-OFB : seed-ofb |
| 1222 | |||
| 1223 | # There is no OID that just denotes "HMAC" oddly enough... | ||
| 1224 | |||
| 1225 | : HMAC : hmac | ||
diff --git a/src/lib/libcrypto/ocsp/ocsp_asn.c b/src/lib/libcrypto/ocsp/ocsp_asn.c index 39b7a1c568..bfe892ac70 100644 --- a/src/lib/libcrypto/ocsp/ocsp_asn.c +++ b/src/lib/libcrypto/ocsp/ocsp_asn.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* ocsp_asn.c */ | 1 | /* ocsp_asn.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/ocsp/ocsp_ht.c b/src/lib/libcrypto/ocsp/ocsp_ht.c index a8e569b74a..6abb30b2c0 100644 --- a/src/lib/libcrypto/ocsp/ocsp_ht.c +++ b/src/lib/libcrypto/ocsp/ocsp_ht.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* ocsp_ht.c */ | 1 | /* ocsp_ht.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2006. | 3 | * project 2006. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -56,11 +56,12 @@ | |||
| 56 | * | 56 | * |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #include <openssl/asn1.h> | ||
| 60 | #include <stdio.h> | 59 | #include <stdio.h> |
| 61 | #include <stdlib.h> | 60 | #include <stdlib.h> |
| 62 | #include <ctype.h> | 61 | #include <ctype.h> |
| 63 | #include <string.h> | 62 | #include <string.h> |
| 63 | #include "e_os.h" | ||
| 64 | #include <openssl/asn1.h> | ||
| 64 | #include <openssl/ocsp.h> | 65 | #include <openssl/ocsp.h> |
| 65 | #include <openssl/err.h> | 66 | #include <openssl/err.h> |
| 66 | #include <openssl/buffer.h> | 67 | #include <openssl/buffer.h> |
diff --git a/src/lib/libcrypto/ocsp/ocsp_srv.c b/src/lib/libcrypto/ocsp/ocsp_srv.c index fffa134e75..1c606dd0b6 100644 --- a/src/lib/libcrypto/ocsp/ocsp_srv.c +++ b/src/lib/libcrypto/ocsp/ocsp_srv.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* ocsp_srv.c */ | 1 | /* ocsp_srv.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/ocsp/ocsp_vfy.c b/src/lib/libcrypto/ocsp/ocsp_vfy.c index 23ea41c847..4a0c3870d8 100644 --- a/src/lib/libcrypto/ocsp/ocsp_vfy.c +++ b/src/lib/libcrypto/ocsp/ocsp_vfy.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* ocsp_vfy.c */ | 1 | /* ocsp_vfy.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/opensslv.h b/src/lib/libcrypto/opensslv.h index b308894f18..09687b5136 100644 --- a/src/lib/libcrypto/opensslv.h +++ b/src/lib/libcrypto/opensslv.h | |||
| @@ -25,11 +25,11 @@ | |||
| 25 | * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for | 25 | * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for |
| 26 | * major minor fix final patch/beta) | 26 | * major minor fix final patch/beta) |
| 27 | */ | 27 | */ |
| 28 | #define OPENSSL_VERSION_NUMBER 0x0090808fL | 28 | #define OPENSSL_VERSION_NUMBER 0x009080afL |
| 29 | #ifdef OPENSSL_FIPS | 29 | #ifdef OPENSSL_FIPS |
| 30 | #define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8h-fips 28 May 2008" | 30 | #define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8j-fips 07 Jan 2009" |
| 31 | #else | 31 | #else |
| 32 | #define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8h 28 May 2008" | 32 | #define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8j 07 Jan 2009" |
| 33 | #endif | 33 | #endif |
| 34 | #define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT | 34 | #define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT |
| 35 | 35 | ||
diff --git a/src/lib/libcrypto/ossl_typ.h b/src/lib/libcrypto/ossl_typ.h index 345fb1dc4d..0e7a380880 100644 --- a/src/lib/libcrypto/ossl_typ.h +++ b/src/lib/libcrypto/ossl_typ.h | |||
| @@ -100,6 +100,8 @@ typedef int ASN1_NULL; | |||
| 100 | #undef X509_EXTENSIONS | 100 | #undef X509_EXTENSIONS |
| 101 | #undef X509_CERT_PAIR | 101 | #undef X509_CERT_PAIR |
| 102 | #undef PKCS7_ISSUER_AND_SERIAL | 102 | #undef PKCS7_ISSUER_AND_SERIAL |
| 103 | #undef OCSP_REQUEST | ||
| 104 | #undef OCSP_RESPONSE | ||
| 103 | #endif | 105 | #endif |
| 104 | 106 | ||
| 105 | #ifdef BIGNUM | 107 | #ifdef BIGNUM |
| @@ -140,6 +142,8 @@ typedef struct X509_crl_st X509_CRL; | |||
| 140 | typedef struct X509_name_st X509_NAME; | 142 | typedef struct X509_name_st X509_NAME; |
| 141 | typedef struct x509_store_st X509_STORE; | 143 | typedef struct x509_store_st X509_STORE; |
| 142 | typedef struct x509_store_ctx_st X509_STORE_CTX; | 144 | typedef struct x509_store_ctx_st X509_STORE_CTX; |
| 145 | typedef struct ssl_st SSL; | ||
| 146 | typedef struct ssl_ctx_st SSL_CTX; | ||
| 143 | 147 | ||
| 144 | typedef struct v3_ext_ctx X509V3_CTX; | 148 | typedef struct v3_ext_ctx X509V3_CTX; |
| 145 | typedef struct conf_st CONF; | 149 | typedef struct conf_st CONF; |
diff --git a/src/lib/libcrypto/pem/pem.h b/src/lib/libcrypto/pem/pem.h index 670afa670b..6f8e01544b 100644 --- a/src/lib/libcrypto/pem/pem.h +++ b/src/lib/libcrypto/pem/pem.h | |||
| @@ -125,6 +125,7 @@ extern "C" { | |||
| 125 | #define PEM_STRING_DSA "DSA PRIVATE KEY" | 125 | #define PEM_STRING_DSA "DSA PRIVATE KEY" |
| 126 | #define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" | 126 | #define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" |
| 127 | #define PEM_STRING_PKCS7 "PKCS7" | 127 | #define PEM_STRING_PKCS7 "PKCS7" |
| 128 | #define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" | ||
| 128 | #define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" | 129 | #define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" |
| 129 | #define PEM_STRING_PKCS8INF "PRIVATE KEY" | 130 | #define PEM_STRING_PKCS8INF "PRIVATE KEY" |
| 130 | #define PEM_STRING_DHPARAMS "DH PARAMETERS" | 131 | #define PEM_STRING_DHPARAMS "DH PARAMETERS" |
diff --git a/src/lib/libcrypto/pem/pem_all.c b/src/lib/libcrypto/pem/pem_all.c index 66cbc7eb82..69dd19bf2e 100644 --- a/src/lib/libcrypto/pem/pem_all.c +++ b/src/lib/libcrypto/pem/pem_all.c | |||
| @@ -194,7 +194,49 @@ RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb, | |||
| 194 | 194 | ||
| 195 | #endif | 195 | #endif |
| 196 | 196 | ||
| 197 | #ifdef OPENSSL_FIPS | ||
| 198 | |||
| 199 | int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc, | ||
| 200 | unsigned char *kstr, int klen, | ||
| 201 | pem_password_cb *cb, void *u) | ||
| 202 | { | ||
| 203 | EVP_PKEY *k; | ||
| 204 | int ret; | ||
| 205 | k = EVP_PKEY_new(); | ||
| 206 | if (!k) | ||
| 207 | return 0; | ||
| 208 | EVP_PKEY_set1_RSA(k, x); | ||
| 209 | |||
| 210 | ret = PEM_write_bio_PrivateKey(bp, k, enc, kstr, klen, cb, u); | ||
| 211 | EVP_PKEY_free(k); | ||
| 212 | return ret; | ||
| 213 | } | ||
| 214 | |||
| 215 | #ifndef OPENSSL_NO_FP_API | ||
| 216 | int PEM_write_RSAPrivateKey(FILE *fp, RSA *x, const EVP_CIPHER *enc, | ||
| 217 | unsigned char *kstr, int klen, | ||
| 218 | pem_password_cb *cb, void *u) | ||
| 219 | { | ||
| 220 | EVP_PKEY *k; | ||
| 221 | int ret; | ||
| 222 | k = EVP_PKEY_new(); | ||
| 223 | if (!k) | ||
| 224 | return 0; | ||
| 225 | |||
| 226 | EVP_PKEY_set1_RSA(k, x); | ||
| 227 | |||
| 228 | ret = PEM_write_PrivateKey(fp, k, enc, kstr, klen, cb, u); | ||
| 229 | EVP_PKEY_free(k); | ||
| 230 | return ret; | ||
| 231 | } | ||
| 232 | #endif | ||
| 233 | |||
| 234 | #else | ||
| 235 | |||
| 197 | IMPLEMENT_PEM_write_cb_const(RSAPrivateKey, RSA, PEM_STRING_RSA, RSAPrivateKey) | 236 | IMPLEMENT_PEM_write_cb_const(RSAPrivateKey, RSA, PEM_STRING_RSA, RSAPrivateKey) |
| 237 | |||
| 238 | #endif | ||
| 239 | |||
| 198 | IMPLEMENT_PEM_rw_const(RSAPublicKey, RSA, PEM_STRING_RSA_PUBLIC, RSAPublicKey) | 240 | IMPLEMENT_PEM_rw_const(RSAPublicKey, RSA, PEM_STRING_RSA_PUBLIC, RSAPublicKey) |
| 199 | IMPLEMENT_PEM_rw(RSA_PUBKEY, RSA, PEM_STRING_PUBLIC, RSA_PUBKEY) | 241 | IMPLEMENT_PEM_rw(RSA_PUBKEY, RSA, PEM_STRING_PUBLIC, RSA_PUBKEY) |
| 200 | 242 | ||
| @@ -224,7 +266,47 @@ DSA *PEM_read_bio_DSAPrivateKey(BIO *bp, DSA **dsa, pem_password_cb *cb, | |||
| 224 | return pkey_get_dsa(pktmp, dsa); | 266 | return pkey_get_dsa(pktmp, dsa); |
| 225 | } | 267 | } |
| 226 | 268 | ||
| 269 | #ifdef OPENSSL_FIPS | ||
| 270 | |||
| 271 | int PEM_write_bio_DSAPrivateKey(BIO *bp, DSA *x, const EVP_CIPHER *enc, | ||
| 272 | unsigned char *kstr, int klen, | ||
| 273 | pem_password_cb *cb, void *u) | ||
| 274 | { | ||
| 275 | EVP_PKEY *k; | ||
| 276 | int ret; | ||
| 277 | k = EVP_PKEY_new(); | ||
| 278 | if (!k) | ||
| 279 | return 0; | ||
| 280 | EVP_PKEY_set1_DSA(k, x); | ||
| 281 | |||
| 282 | ret = PEM_write_bio_PrivateKey(bp, k, enc, kstr, klen, cb, u); | ||
| 283 | EVP_PKEY_free(k); | ||
| 284 | return ret; | ||
| 285 | } | ||
| 286 | |||
| 287 | #ifndef OPENSSL_NO_FP_API | ||
| 288 | int PEM_write_DSAPrivateKey(FILE *fp, DSA *x, const EVP_CIPHER *enc, | ||
| 289 | unsigned char *kstr, int klen, | ||
| 290 | pem_password_cb *cb, void *u) | ||
| 291 | { | ||
| 292 | EVP_PKEY *k; | ||
| 293 | int ret; | ||
| 294 | k = EVP_PKEY_new(); | ||
| 295 | if (!k) | ||
| 296 | return 0; | ||
| 297 | EVP_PKEY_set1_DSA(k, x); | ||
| 298 | ret = PEM_write_PrivateKey(fp, k, enc, kstr, klen, cb, u); | ||
| 299 | EVP_PKEY_free(k); | ||
| 300 | return ret; | ||
| 301 | } | ||
| 302 | #endif | ||
| 303 | |||
| 304 | #else | ||
| 305 | |||
| 227 | IMPLEMENT_PEM_write_cb_const(DSAPrivateKey, DSA, PEM_STRING_DSA, DSAPrivateKey) | 306 | IMPLEMENT_PEM_write_cb_const(DSAPrivateKey, DSA, PEM_STRING_DSA, DSAPrivateKey) |
| 307 | |||
| 308 | #endif | ||
| 309 | |||
| 228 | IMPLEMENT_PEM_rw(DSA_PUBKEY, DSA, PEM_STRING_PUBLIC, DSA_PUBKEY) | 310 | IMPLEMENT_PEM_rw(DSA_PUBKEY, DSA, PEM_STRING_PUBLIC, DSA_PUBKEY) |
| 229 | 311 | ||
| 230 | #ifndef OPENSSL_NO_FP_API | 312 | #ifndef OPENSSL_NO_FP_API |
| @@ -270,8 +352,49 @@ EC_KEY *PEM_read_bio_ECPrivateKey(BIO *bp, EC_KEY **key, pem_password_cb *cb, | |||
| 270 | 352 | ||
| 271 | IMPLEMENT_PEM_rw_const(ECPKParameters, EC_GROUP, PEM_STRING_ECPARAMETERS, ECPKParameters) | 353 | IMPLEMENT_PEM_rw_const(ECPKParameters, EC_GROUP, PEM_STRING_ECPARAMETERS, ECPKParameters) |
| 272 | 354 | ||
| 355 | |||
| 356 | |||
| 357 | #ifdef OPENSSL_FIPS | ||
| 358 | |||
| 359 | int PEM_write_bio_ECPrivateKey(BIO *bp, EC_KEY *x, const EVP_CIPHER *enc, | ||
| 360 | unsigned char *kstr, int klen, | ||
| 361 | pem_password_cb *cb, void *u) | ||
| 362 | { | ||
| 363 | EVP_PKEY *k; | ||
| 364 | int ret; | ||
| 365 | k = EVP_PKEY_new(); | ||
| 366 | if (!k) | ||
| 367 | return 0; | ||
| 368 | EVP_PKEY_set1_EC_KEY(k, x); | ||
| 369 | |||
| 370 | ret = PEM_write_bio_PrivateKey(bp, k, enc, kstr, klen, cb, u); | ||
| 371 | EVP_PKEY_free(k); | ||
| 372 | return ret; | ||
| 373 | } | ||
| 374 | |||
| 375 | #ifndef OPENSSL_NO_FP_API | ||
| 376 | int PEM_write_ECPrivateKey(FILE *fp, EC_KEY *x, const EVP_CIPHER *enc, | ||
| 377 | unsigned char *kstr, int klen, | ||
| 378 | pem_password_cb *cb, void *u) | ||
| 379 | { | ||
| 380 | EVP_PKEY *k; | ||
| 381 | int ret; | ||
| 382 | k = EVP_PKEY_new(); | ||
| 383 | if (!k) | ||
| 384 | return 0; | ||
| 385 | EVP_PKEY_set1_EC_KEY(k, x); | ||
| 386 | ret = PEM_write_PrivateKey(fp, k, enc, kstr, klen, cb, u); | ||
| 387 | EVP_PKEY_free(k); | ||
| 388 | return ret; | ||
| 389 | } | ||
| 390 | #endif | ||
| 391 | |||
| 392 | #else | ||
| 393 | |||
| 273 | IMPLEMENT_PEM_write_cb(ECPrivateKey, EC_KEY, PEM_STRING_ECPRIVATEKEY, ECPrivateKey) | 394 | IMPLEMENT_PEM_write_cb(ECPrivateKey, EC_KEY, PEM_STRING_ECPRIVATEKEY, ECPrivateKey) |
| 274 | 395 | ||
| 396 | #endif | ||
| 397 | |||
| 275 | IMPLEMENT_PEM_rw(EC_PUBKEY, EC_KEY, PEM_STRING_PUBLIC, EC_PUBKEY) | 398 | IMPLEMENT_PEM_rw(EC_PUBKEY, EC_KEY, PEM_STRING_PUBLIC, EC_PUBKEY) |
| 276 | 399 | ||
| 277 | #ifndef OPENSSL_NO_FP_API | 400 | #ifndef OPENSSL_NO_FP_API |
| @@ -301,8 +424,59 @@ IMPLEMENT_PEM_rw_const(DHparams, DH, PEM_STRING_DHPARAMS, DHparams) | |||
| 301 | * (When reading, parameter PEM_STRING_EVP_PKEY is a wildcard for anything | 424 | * (When reading, parameter PEM_STRING_EVP_PKEY is a wildcard for anything |
| 302 | * appropriate.) | 425 | * appropriate.) |
| 303 | */ | 426 | */ |
| 427 | |||
| 428 | #ifdef OPENSSL_FIPS | ||
| 429 | |||
| 430 | static const char *pkey_str(EVP_PKEY *x) | ||
| 431 | { | ||
| 432 | switch (x->type) | ||
| 433 | { | ||
| 434 | case EVP_PKEY_RSA: | ||
| 435 | return PEM_STRING_RSA; | ||
| 436 | |||
| 437 | case EVP_PKEY_DSA: | ||
| 438 | return PEM_STRING_DSA; | ||
| 439 | |||
| 440 | case EVP_PKEY_EC: | ||
| 441 | return PEM_STRING_ECPRIVATEKEY; | ||
| 442 | |||
| 443 | default: | ||
| 444 | return NULL; | ||
| 445 | } | ||
| 446 | } | ||
| 447 | |||
| 448 | |||
| 449 | int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, | ||
| 450 | unsigned char *kstr, int klen, | ||
| 451 | pem_password_cb *cb, void *u) | ||
| 452 | { | ||
| 453 | if (FIPS_mode()) | ||
| 454 | return PEM_write_bio_PKCS8PrivateKey(bp, x, enc, | ||
| 455 | (char *)kstr, klen, cb, u); | ||
| 456 | else | ||
| 457 | return PEM_ASN1_write_bio((i2d_of_void *)i2d_PrivateKey, | ||
| 458 | pkey_str(x), bp,(char *)x,enc,kstr,klen,cb,u); | ||
| 459 | } | ||
| 460 | |||
| 461 | #ifndef OPENSSL_NO_FP_API | ||
| 462 | int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, | ||
| 463 | unsigned char *kstr, int klen, | ||
| 464 | pem_password_cb *cb, void *u) | ||
| 465 | { | ||
| 466 | if (FIPS_mode()) | ||
| 467 | return PEM_write_PKCS8PrivateKey(fp, x, enc, | ||
| 468 | (char *)kstr, klen, cb, u); | ||
| 469 | else | ||
| 470 | return PEM_ASN1_write((i2d_of_void *)i2d_PrivateKey, | ||
| 471 | pkey_str(x), fp,(char *)x,enc,kstr,klen,cb,u); | ||
| 472 | } | ||
| 473 | #endif | ||
| 474 | |||
| 475 | #else | ||
| 304 | IMPLEMENT_PEM_write_cb(PrivateKey, EVP_PKEY, ((x->type == EVP_PKEY_DSA)?PEM_STRING_DSA:\ | 476 | IMPLEMENT_PEM_write_cb(PrivateKey, EVP_PKEY, ((x->type == EVP_PKEY_DSA)?PEM_STRING_DSA:\ |
| 305 | (x->type == EVP_PKEY_RSA)?PEM_STRING_RSA:PEM_STRING_ECPRIVATEKEY), PrivateKey) | 477 | (x->type == EVP_PKEY_RSA)?PEM_STRING_RSA:PEM_STRING_ECPRIVATEKEY), PrivateKey) |
| 306 | 478 | ||
| 479 | #endif | ||
| 480 | |||
| 307 | IMPLEMENT_PEM_rw(PUBKEY, EVP_PKEY, PEM_STRING_PUBLIC, PUBKEY) | 481 | IMPLEMENT_PEM_rw(PUBKEY, EVP_PKEY, PEM_STRING_PUBLIC, PUBKEY) |
| 308 | 482 | ||
diff --git a/src/lib/libcrypto/pem/pem_lib.c b/src/lib/libcrypto/pem/pem_lib.c index 9bae4c8850..cbafefe416 100644 --- a/src/lib/libcrypto/pem/pem_lib.c +++ b/src/lib/libcrypto/pem/pem_lib.c | |||
| @@ -216,6 +216,9 @@ static int check_pem(const char *nm, const char *name) | |||
| 216 | if(!strcmp(nm, PEM_STRING_X509) && | 216 | if(!strcmp(nm, PEM_STRING_X509) && |
| 217 | !strcmp(name, PEM_STRING_PKCS7)) return 1; | 217 | !strcmp(name, PEM_STRING_PKCS7)) return 1; |
| 218 | 218 | ||
| 219 | if(!strcmp(nm, PEM_STRING_PKCS7_SIGNED) && | ||
| 220 | !strcmp(name, PEM_STRING_PKCS7)) return 1; | ||
| 221 | |||
| 219 | return 0; | 222 | return 0; |
| 220 | } | 223 | } |
| 221 | 224 | ||
diff --git a/src/lib/libcrypto/pem/pem_x509.c b/src/lib/libcrypto/pem/pem_x509.c index 19f88d8d3a..3f709f13e6 100644 --- a/src/lib/libcrypto/pem/pem_x509.c +++ b/src/lib/libcrypto/pem/pem_x509.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pem_x509.c */ | 1 | /* pem_x509.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pem/pem_xaux.c b/src/lib/libcrypto/pem/pem_xaux.c index 63ce660cf1..7cc7491009 100644 --- a/src/lib/libcrypto/pem/pem_xaux.c +++ b/src/lib/libcrypto/pem/pem_xaux.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pem_xaux.c */ | 1 | /* pem_xaux.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_add.c b/src/lib/libcrypto/pkcs12/p12_add.c index 41bdc00551..1f3e378f5c 100644 --- a/src/lib/libcrypto/pkcs12/p12_add.c +++ b/src/lib/libcrypto/pkcs12/p12_add.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_add.c */ | 1 | /* p12_add.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_asn.c b/src/lib/libcrypto/pkcs12/p12_asn.c index a3739fee1a..6e27633817 100644 --- a/src/lib/libcrypto/pkcs12/p12_asn.c +++ b/src/lib/libcrypto/pkcs12/p12_asn.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_asn.c */ | 1 | /* p12_asn.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_attr.c b/src/lib/libcrypto/pkcs12/p12_attr.c index 026cf3826a..68d6c5ad15 100644 --- a/src/lib/libcrypto/pkcs12/p12_attr.c +++ b/src/lib/libcrypto/pkcs12/p12_attr.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_attr.c */ | 1 | /* p12_attr.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_crpt.c b/src/lib/libcrypto/pkcs12/p12_crpt.c index 3ad33c49d8..f8b952e27e 100644 --- a/src/lib/libcrypto/pkcs12/p12_crpt.c +++ b/src/lib/libcrypto/pkcs12/p12_crpt.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_crpt.c */ | 1 | /* p12_crpt.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_crt.c b/src/lib/libcrypto/pkcs12/p12_crt.c index dbafda17b6..e863de52ce 100644 --- a/src/lib/libcrypto/pkcs12/p12_crt.c +++ b/src/lib/libcrypto/pkcs12/p12_crt.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_crt.c */ | 1 | /* p12_crt.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project. | 3 | * project. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -59,10 +59,27 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
| 61 | #include <openssl/pkcs12.h> | 61 | #include <openssl/pkcs12.h> |
| 62 | #ifdef OPENSSL_FIPS | ||
| 63 | #include <openssl/fips.h> | ||
| 64 | #endif | ||
| 65 | |||
| 62 | 66 | ||
| 63 | 67 | ||
| 64 | static int pkcs12_add_bag(STACK_OF(PKCS12_SAFEBAG) **pbags, PKCS12_SAFEBAG *bag); | 68 | static int pkcs12_add_bag(STACK_OF(PKCS12_SAFEBAG) **pbags, PKCS12_SAFEBAG *bag); |
| 65 | 69 | ||
| 70 | static int copy_bag_attr(PKCS12_SAFEBAG *bag, EVP_PKEY *pkey, int nid) | ||
| 71 | { | ||
| 72 | int idx; | ||
| 73 | X509_ATTRIBUTE *attr; | ||
| 74 | idx = EVP_PKEY_get_attr_by_NID(pkey, nid, -1); | ||
| 75 | if (idx < 0) | ||
| 76 | return 1; | ||
| 77 | attr = EVP_PKEY_get_attr(pkey, idx); | ||
| 78 | if (!X509at_add1_attr(&bag->attrib, attr)) | ||
| 79 | return 0; | ||
| 80 | return 1; | ||
| 81 | } | ||
| 82 | |||
| 66 | PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, | 83 | PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, |
| 67 | STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, int mac_iter, | 84 | STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, int mac_iter, |
| 68 | int keytype) | 85 | int keytype) |
| @@ -77,7 +94,14 @@ PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, | |||
| 77 | 94 | ||
| 78 | /* Set defaults */ | 95 | /* Set defaults */ |
| 79 | if (!nid_cert) | 96 | if (!nid_cert) |
| 97 | { | ||
| 98 | #ifdef OPENSSL_FIPS | ||
| 99 | if (FIPS_mode()) | ||
| 100 | nid_cert = NID_pbe_WithSHA1And3_Key_TripleDES_CBC; | ||
| 101 | else | ||
| 102 | #endif | ||
| 80 | nid_cert = NID_pbe_WithSHA1And40BitRC2_CBC; | 103 | nid_cert = NID_pbe_WithSHA1And40BitRC2_CBC; |
| 104 | } | ||
| 81 | if (!nid_key) | 105 | if (!nid_key) |
| 82 | nid_key = NID_pbe_WithSHA1And3_Key_TripleDES_CBC; | 106 | nid_key = NID_pbe_WithSHA1And3_Key_TripleDES_CBC; |
| 83 | if (!iter) | 107 | if (!iter) |
| @@ -122,20 +146,15 @@ PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, | |||
| 122 | 146 | ||
| 123 | if (pkey) | 147 | if (pkey) |
| 124 | { | 148 | { |
| 125 | int cspidx; | ||
| 126 | bag = PKCS12_add_key(&bags, pkey, keytype, iter, nid_key, pass); | 149 | bag = PKCS12_add_key(&bags, pkey, keytype, iter, nid_key, pass); |
| 127 | 150 | ||
| 128 | if (!bag) | 151 | if (!bag) |
| 129 | goto err; | 152 | goto err; |
| 130 | 153 | ||
| 131 | cspidx = EVP_PKEY_get_attr_by_NID(pkey, NID_ms_csp_name, -1); | 154 | if (!copy_bag_attr(bag, pkey, NID_ms_csp_name)) |
| 132 | if (cspidx >= 0) | 155 | goto err; |
| 133 | { | 156 | if (!copy_bag_attr(bag, pkey, NID_LocalKeySet)) |
| 134 | X509_ATTRIBUTE *cspattr; | 157 | goto err; |
| 135 | cspattr = EVP_PKEY_get_attr(pkey, cspidx); | ||
| 136 | if (!X509at_add1_attr(&bag->attrib, cspattr)) | ||
| 137 | goto err; | ||
| 138 | } | ||
| 139 | 158 | ||
| 140 | if(name && !PKCS12_add_friendlyname(bag, name, -1)) | 159 | if(name && !PKCS12_add_friendlyname(bag, name, -1)) |
| 141 | goto err; | 160 | goto err; |
diff --git a/src/lib/libcrypto/pkcs12/p12_decr.c b/src/lib/libcrypto/pkcs12/p12_decr.c index 74c961a92b..ba77dbbe32 100644 --- a/src/lib/libcrypto/pkcs12/p12_decr.c +++ b/src/lib/libcrypto/pkcs12/p12_decr.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_decr.c */ | 1 | /* p12_decr.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_init.c b/src/lib/libcrypto/pkcs12/p12_init.c index 6bdc132631..d4d84b056a 100644 --- a/src/lib/libcrypto/pkcs12/p12_init.c +++ b/src/lib/libcrypto/pkcs12/p12_init.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_init.c */ | 1 | /* p12_init.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_key.c b/src/lib/libcrypto/pkcs12/p12_key.c index 18e72d0a1b..9e57eee4a4 100644 --- a/src/lib/libcrypto/pkcs12/p12_key.c +++ b/src/lib/libcrypto/pkcs12/p12_key.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_key.c */ | 1 | /* p12_key.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_kiss.c b/src/lib/libcrypto/pkcs12/p12_kiss.c index c2ee2cc6f3..5c4c6ec988 100644 --- a/src/lib/libcrypto/pkcs12/p12_kiss.c +++ b/src/lib/libcrypto/pkcs12/p12_kiss.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_kiss.c */ | 1 | /* p12_kiss.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_mutl.c b/src/lib/libcrypto/pkcs12/p12_mutl.c index c408cc8ab8..70bfef6e5d 100644 --- a/src/lib/libcrypto/pkcs12/p12_mutl.c +++ b/src/lib/libcrypto/pkcs12/p12_mutl.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_mutl.c */ | 1 | /* p12_mutl.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_npas.c b/src/lib/libcrypto/pkcs12/p12_npas.c index 48eacc5c49..47e5e9c377 100644 --- a/src/lib/libcrypto/pkcs12/p12_npas.c +++ b/src/lib/libcrypto/pkcs12/p12_npas.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_npas.c */ | 1 | /* p12_npas.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_p8d.c b/src/lib/libcrypto/pkcs12/p12_p8d.c index 3c6f377933..deba81e4a9 100644 --- a/src/lib/libcrypto/pkcs12/p12_p8d.c +++ b/src/lib/libcrypto/pkcs12/p12_p8d.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_p8d.c */ | 1 | /* p12_p8d.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_p8e.c b/src/lib/libcrypto/pkcs12/p12_p8e.c index 3d47956652..bf20a77b4c 100644 --- a/src/lib/libcrypto/pkcs12/p12_p8e.c +++ b/src/lib/libcrypto/pkcs12/p12_p8e.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_p8e.c */ | 1 | /* p12_p8e.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/p12_utl.c b/src/lib/libcrypto/pkcs12/p12_utl.c index 243ec76be9..ca30ac4f6d 100644 --- a/src/lib/libcrypto/pkcs12/p12_utl.c +++ b/src/lib/libcrypto/pkcs12/p12_utl.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* p12_utl.c */ | 1 | /* p12_utl.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs12/pkcs12.h b/src/lib/libcrypto/pkcs12/pkcs12.h index a2d7e359a0..4bee605dc0 100644 --- a/src/lib/libcrypto/pkcs12/pkcs12.h +++ b/src/lib/libcrypto/pkcs12/pkcs12.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pkcs12.h */ | 1 | /* pkcs12.h */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs7/pk7_asn1.c b/src/lib/libcrypto/pkcs7/pk7_asn1.c index 77931feeb4..1f70d31386 100644 --- a/src/lib/libcrypto/pkcs7/pk7_asn1.c +++ b/src/lib/libcrypto/pkcs7/pk7_asn1.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pk7_asn.c */ | 1 | /* pk7_asn.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs7/pk7_attr.c b/src/lib/libcrypto/pkcs7/pk7_attr.c index 735c8800e1..d549717169 100644 --- a/src/lib/libcrypto/pkcs7/pk7_attr.c +++ b/src/lib/libcrypto/pkcs7/pk7_attr.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pk7_attr.c */ | 1 | /* pk7_attr.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs7/pk7_mime.c b/src/lib/libcrypto/pkcs7/pk7_mime.c index 17b68992f7..bf190360d7 100644 --- a/src/lib/libcrypto/pkcs7/pk7_mime.c +++ b/src/lib/libcrypto/pkcs7/pk7_mime.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pk7_mime.c */ | 1 | /* pk7_mime.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project. | 3 | * project. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/pkcs7/pk7_smime.c b/src/lib/libcrypto/pkcs7/pk7_smime.c index 5c6b0fe24b..c34db1d6fe 100644 --- a/src/lib/libcrypto/pkcs7/pk7_smime.c +++ b/src/lib/libcrypto/pkcs7/pk7_smime.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pk7_smime.c */ | 1 | /* pk7_smime.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project. | 3 | * project. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -282,6 +282,7 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, | |||
| 282 | PKCS7err(PKCS7_F_PKCS7_VERIFY,ERR_R_MALLOC_FAILURE); | 282 | PKCS7err(PKCS7_F_PKCS7_VERIFY,ERR_R_MALLOC_FAILURE); |
| 283 | goto err; | 283 | goto err; |
| 284 | } | 284 | } |
| 285 | BIO_set_mem_eof_return(tmpout, 0); | ||
| 285 | } else tmpout = out; | 286 | } else tmpout = out; |
| 286 | 287 | ||
| 287 | /* We now have to 'read' from p7bio to calculate digests etc. */ | 288 | /* We now have to 'read' from p7bio to calculate digests etc. */ |
diff --git a/src/lib/libcrypto/rand/rand.h b/src/lib/libcrypto/rand/rand.h index ac6c021763..ea89153cba 100644 --- a/src/lib/libcrypto/rand/rand.h +++ b/src/lib/libcrypto/rand/rand.h | |||
| @@ -72,7 +72,7 @@ extern "C" { | |||
| 72 | #endif | 72 | #endif |
| 73 | 73 | ||
| 74 | #if defined(OPENSSL_FIPS) | 74 | #if defined(OPENSSL_FIPS) |
| 75 | #define FIPS_RAND_SIZE_T size_t | 75 | #define FIPS_RAND_SIZE_T int |
| 76 | #endif | 76 | #endif |
| 77 | 77 | ||
| 78 | /* Already defined in ossl_typ.h */ | 78 | /* Already defined in ossl_typ.h */ |
| @@ -111,6 +111,15 @@ int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes); | |||
| 111 | int RAND_egd(const char *path); | 111 | int RAND_egd(const char *path); |
| 112 | int RAND_egd_bytes(const char *path,int bytes); | 112 | int RAND_egd_bytes(const char *path,int bytes); |
| 113 | int RAND_poll(void); | 113 | int RAND_poll(void); |
| 114 | #ifndef OPENSSL_NO_ENGINE | ||
| 115 | #ifdef OPENSSL_FIPS | ||
| 116 | void int_RAND_init_engine_callbacks(void); | ||
| 117 | void int_RAND_set_callbacks( | ||
| 118 | int (*set_rand_func)(const RAND_METHOD *meth, | ||
| 119 | const RAND_METHOD **pmeth), | ||
| 120 | const RAND_METHOD *(*get_rand_func)(const RAND_METHOD **pmeth)); | ||
| 121 | #endif | ||
| 122 | #endif | ||
| 114 | 123 | ||
| 115 | #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) | 124 | #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) |
| 116 | 125 | ||
| @@ -128,11 +137,29 @@ void ERR_load_RAND_strings(void); | |||
| 128 | /* Error codes for the RAND functions. */ | 137 | /* Error codes for the RAND functions. */ |
| 129 | 138 | ||
| 130 | /* Function codes. */ | 139 | /* Function codes. */ |
| 140 | #define RAND_F_ENG_RAND_GET_RAND_METHOD 108 | ||
| 141 | #define RAND_F_FIPS_RAND 103 | ||
| 142 | #define RAND_F_FIPS_RAND_BYTES 102 | ||
| 143 | #define RAND_F_FIPS_RAND_GET_RAND_METHOD 109 | ||
| 144 | #define RAND_F_FIPS_RAND_SET_DT 106 | ||
| 145 | #define RAND_F_FIPS_SET_DT 104 | ||
| 146 | #define RAND_F_FIPS_SET_PRNG_SEED 107 | ||
| 147 | #define RAND_F_FIPS_SET_TEST_MODE 105 | ||
| 131 | #define RAND_F_RAND_GET_RAND_METHOD 101 | 148 | #define RAND_F_RAND_GET_RAND_METHOD 101 |
| 132 | #define RAND_F_SSLEAY_RAND_BYTES 100 | 149 | #define RAND_F_SSLEAY_RAND_BYTES 100 |
| 133 | 150 | ||
| 134 | /* Reason codes. */ | 151 | /* Reason codes. */ |
| 152 | #define RAND_R_NON_FIPS_METHOD 105 | ||
| 153 | #define RAND_R_NOT_IN_TEST_MODE 106 | ||
| 154 | #define RAND_R_NO_KEY_SET 107 | ||
| 155 | #define RAND_R_PRNG_ASKING_FOR_TOO_MUCH 101 | ||
| 156 | #define RAND_R_PRNG_ERROR 108 | ||
| 157 | #define RAND_R_PRNG_KEYED 109 | ||
| 158 | #define RAND_R_PRNG_NOT_REKEYED 102 | ||
| 159 | #define RAND_R_PRNG_NOT_RESEEDED 103 | ||
| 135 | #define RAND_R_PRNG_NOT_SEEDED 100 | 160 | #define RAND_R_PRNG_NOT_SEEDED 100 |
| 161 | #define RAND_R_PRNG_SEED_MUST_NOT_MATCH_KEY 110 | ||
| 162 | #define RAND_R_PRNG_STUCK 104 | ||
| 136 | 163 | ||
| 137 | #ifdef __cplusplus | 164 | #ifdef __cplusplus |
| 138 | } | 165 | } |
diff --git a/src/lib/libcrypto/rand/rand_err.c b/src/lib/libcrypto/rand/rand_err.c index 386934dcd1..829fb44d77 100644 --- a/src/lib/libcrypto/rand/rand_err.c +++ b/src/lib/libcrypto/rand/rand_err.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* crypto/rand/rand_err.c */ | 1 | /* crypto/rand/rand_err.c */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that the following conditions | 6 | * modification, are permitted provided that the following conditions |
| @@ -70,6 +70,14 @@ | |||
| 70 | 70 | ||
| 71 | static ERR_STRING_DATA RAND_str_functs[]= | 71 | static ERR_STRING_DATA RAND_str_functs[]= |
| 72 | { | 72 | { |
| 73 | {ERR_FUNC(RAND_F_ENG_RAND_GET_RAND_METHOD), "ENG_RAND_GET_RAND_METHOD"}, | ||
| 74 | {ERR_FUNC(RAND_F_FIPS_RAND), "FIPS_RAND"}, | ||
| 75 | {ERR_FUNC(RAND_F_FIPS_RAND_BYTES), "FIPS_RAND_BYTES"}, | ||
| 76 | {ERR_FUNC(RAND_F_FIPS_RAND_GET_RAND_METHOD), "FIPS_RAND_GET_RAND_METHOD"}, | ||
| 77 | {ERR_FUNC(RAND_F_FIPS_RAND_SET_DT), "FIPS_RAND_SET_DT"}, | ||
| 78 | {ERR_FUNC(RAND_F_FIPS_SET_DT), "FIPS_SET_DT"}, | ||
| 79 | {ERR_FUNC(RAND_F_FIPS_SET_PRNG_SEED), "FIPS_SET_PRNG_SEED"}, | ||
| 80 | {ERR_FUNC(RAND_F_FIPS_SET_TEST_MODE), "FIPS_SET_TEST_MODE"}, | ||
| 73 | {ERR_FUNC(RAND_F_RAND_GET_RAND_METHOD), "RAND_get_rand_method"}, | 81 | {ERR_FUNC(RAND_F_RAND_GET_RAND_METHOD), "RAND_get_rand_method"}, |
| 74 | {ERR_FUNC(RAND_F_SSLEAY_RAND_BYTES), "SSLEAY_RAND_BYTES"}, | 82 | {ERR_FUNC(RAND_F_SSLEAY_RAND_BYTES), "SSLEAY_RAND_BYTES"}, |
| 75 | {0,NULL} | 83 | {0,NULL} |
| @@ -77,7 +85,17 @@ static ERR_STRING_DATA RAND_str_functs[]= | |||
| 77 | 85 | ||
| 78 | static ERR_STRING_DATA RAND_str_reasons[]= | 86 | static ERR_STRING_DATA RAND_str_reasons[]= |
| 79 | { | 87 | { |
| 88 | {ERR_REASON(RAND_R_NON_FIPS_METHOD) ,"non fips method"}, | ||
| 89 | {ERR_REASON(RAND_R_NOT_IN_TEST_MODE) ,"not in test mode"}, | ||
| 90 | {ERR_REASON(RAND_R_NO_KEY_SET) ,"no key set"}, | ||
| 91 | {ERR_REASON(RAND_R_PRNG_ASKING_FOR_TOO_MUCH),"prng asking for too much"}, | ||
| 92 | {ERR_REASON(RAND_R_PRNG_ERROR) ,"prng error"}, | ||
| 93 | {ERR_REASON(RAND_R_PRNG_KEYED) ,"prng keyed"}, | ||
| 94 | {ERR_REASON(RAND_R_PRNG_NOT_REKEYED) ,"prng not rekeyed"}, | ||
| 95 | {ERR_REASON(RAND_R_PRNG_NOT_RESEEDED) ,"prng not reseeded"}, | ||
| 80 | {ERR_REASON(RAND_R_PRNG_NOT_SEEDED) ,"PRNG not seeded"}, | 96 | {ERR_REASON(RAND_R_PRNG_NOT_SEEDED) ,"PRNG not seeded"}, |
| 97 | {ERR_REASON(RAND_R_PRNG_SEED_MUST_NOT_MATCH_KEY),"prng seed must not match key"}, | ||
| 98 | {ERR_REASON(RAND_R_PRNG_STUCK) ,"prng stuck"}, | ||
| 81 | {0,NULL} | 99 | {0,NULL} |
| 82 | }; | 100 | }; |
| 83 | 101 | ||
diff --git a/src/lib/libcrypto/rand/rand_lib.c b/src/lib/libcrypto/rand/rand_lib.c index 513e338985..da6b4e0e86 100644 --- a/src/lib/libcrypto/rand/rand_lib.c +++ b/src/lib/libcrypto/rand/rand_lib.c | |||
| @@ -60,15 +60,82 @@ | |||
| 60 | #include <time.h> | 60 | #include <time.h> |
| 61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 62 | #include <openssl/rand.h> | 62 | #include <openssl/rand.h> |
| 63 | #include "rand_lcl.h" | ||
| 64 | #ifdef OPENSSL_FIPS | ||
| 65 | #include <openssl/fips.h> | ||
| 66 | #include <openssl/fips_rand.h> | ||
| 67 | #endif | ||
| 68 | |||
| 63 | #ifndef OPENSSL_NO_ENGINE | 69 | #ifndef OPENSSL_NO_ENGINE |
| 64 | #include <openssl/engine.h> | 70 | #include <openssl/engine.h> |
| 65 | #endif | 71 | #endif |
| 66 | 72 | ||
| 73 | static const RAND_METHOD *default_RAND_meth = NULL; | ||
| 74 | |||
| 75 | #ifdef OPENSSL_FIPS | ||
| 76 | |||
| 77 | static int fips_RAND_set_rand_method(const RAND_METHOD *meth, | ||
| 78 | const RAND_METHOD **pmeth) | ||
| 79 | { | ||
| 80 | *pmeth = meth; | ||
| 81 | return 1; | ||
| 82 | } | ||
| 83 | |||
| 84 | static const RAND_METHOD *fips_RAND_get_rand_method(const RAND_METHOD **pmeth) | ||
| 85 | { | ||
| 86 | if (!*pmeth) | ||
| 87 | { | ||
| 88 | if(FIPS_mode()) | ||
| 89 | *pmeth=FIPS_rand_method(); | ||
| 90 | else | ||
| 91 | *pmeth = RAND_SSLeay(); | ||
| 92 | } | ||
| 93 | |||
| 94 | if(FIPS_mode() | ||
| 95 | && *pmeth != FIPS_rand_check()) | ||
| 96 | { | ||
| 97 | RANDerr(RAND_F_FIPS_RAND_GET_RAND_METHOD,RAND_R_NON_FIPS_METHOD); | ||
| 98 | return 0; | ||
| 99 | } | ||
| 100 | |||
| 101 | return *pmeth; | ||
| 102 | } | ||
| 103 | |||
| 104 | static int (*RAND_set_rand_method_func)(const RAND_METHOD *meth, | ||
| 105 | const RAND_METHOD **pmeth) | ||
| 106 | = fips_RAND_set_rand_method; | ||
| 107 | static const RAND_METHOD *(*RAND_get_rand_method_func) | ||
| 108 | (const RAND_METHOD **pmeth) | ||
| 109 | = fips_RAND_get_rand_method; | ||
| 110 | |||
| 111 | #ifndef OPENSSL_NO_ENGINE | ||
| 112 | void int_RAND_set_callbacks( | ||
| 113 | int (*set_rand_func)(const RAND_METHOD *meth, | ||
| 114 | const RAND_METHOD **pmeth), | ||
| 115 | const RAND_METHOD *(*get_rand_func) | ||
| 116 | (const RAND_METHOD **pmeth)) | ||
| 117 | { | ||
| 118 | RAND_set_rand_method_func = set_rand_func; | ||
| 119 | RAND_get_rand_method_func = get_rand_func; | ||
| 120 | } | ||
| 121 | #endif | ||
| 122 | |||
| 123 | int RAND_set_rand_method(const RAND_METHOD *meth) | ||
| 124 | { | ||
| 125 | return RAND_set_rand_method_func(meth, &default_RAND_meth); | ||
| 126 | } | ||
| 127 | |||
| 128 | const RAND_METHOD *RAND_get_rand_method(void) | ||
| 129 | { | ||
| 130 | return RAND_get_rand_method_func(&default_RAND_meth); | ||
| 131 | } | ||
| 132 | |||
| 133 | #else | ||
| 134 | |||
| 67 | #ifndef OPENSSL_NO_ENGINE | 135 | #ifndef OPENSSL_NO_ENGINE |
| 68 | /* non-NULL if default_RAND_meth is ENGINE-provided */ | 136 | /* non-NULL if default_RAND_meth is ENGINE-provided */ |
| 69 | static ENGINE *funct_ref =NULL; | 137 | static ENGINE *funct_ref =NULL; |
| 70 | #endif | 138 | #endif |
| 71 | static const RAND_METHOD *default_RAND_meth = NULL; | ||
| 72 | 139 | ||
| 73 | int RAND_set_rand_method(const RAND_METHOD *meth) | 140 | int RAND_set_rand_method(const RAND_METHOD *meth) |
| 74 | { | 141 | { |
| @@ -129,6 +196,8 @@ int RAND_set_rand_engine(ENGINE *engine) | |||
| 129 | } | 196 | } |
| 130 | #endif | 197 | #endif |
| 131 | 198 | ||
| 199 | #endif | ||
| 200 | |||
| 132 | void RAND_cleanup(void) | 201 | void RAND_cleanup(void) |
| 133 | { | 202 | { |
| 134 | const RAND_METHOD *meth = RAND_get_rand_method(); | 203 | const RAND_METHOD *meth = RAND_get_rand_method(); |
diff --git a/src/lib/libcrypto/rand/randfile.c b/src/lib/libcrypto/rand/randfile.c index 6c0ec9a41c..d108353bbc 100644 --- a/src/lib/libcrypto/rand/randfile.c +++ b/src/lib/libcrypto/rand/randfile.c | |||
| @@ -81,10 +81,25 @@ | |||
| 81 | # include <sys/stat.h> | 81 | # include <sys/stat.h> |
| 82 | #endif | 82 | #endif |
| 83 | 83 | ||
| 84 | #ifdef _WIN32 | ||
| 85 | #define stat _stat | ||
| 86 | #define chmod _chmod | ||
| 87 | #define open _open | ||
| 88 | #define fdopen _fdopen | ||
| 89 | #endif | ||
| 90 | |||
| 84 | #undef BUFSIZE | 91 | #undef BUFSIZE |
| 85 | #define BUFSIZE 1024 | 92 | #define BUFSIZE 1024 |
| 86 | #define RAND_DATA 1024 | 93 | #define RAND_DATA 1024 |
| 87 | 94 | ||
| 95 | #ifdef OPENSSL_SYS_VMS | ||
| 96 | /* This declaration is a nasty hack to get around vms' extension to fopen | ||
| 97 | * for passing in sharing options being disabled by our /STANDARD=ANSI89 */ | ||
| 98 | static FILE *(*const vms_fopen)(const char *, const char *, ...) = | ||
| 99 | (FILE *(*)(const char *, const char *, ...))fopen; | ||
| 100 | #define VMS_OPEN_ATTRS "shr=get,put,upd,del","ctx=bin,stm","rfm=stm","rat=none","mrs=0" | ||
| 101 | #endif | ||
| 102 | |||
| 88 | /* #define RFILE ".rnd" - defined in ../../e_os.h */ | 103 | /* #define RFILE ".rnd" - defined in ../../e_os.h */ |
| 89 | 104 | ||
| 90 | /* Note that these functions are intended for seed files only. | 105 | /* Note that these functions are intended for seed files only. |
| @@ -106,7 +121,11 @@ int RAND_load_file(const char *file, long bytes) | |||
| 106 | RAND_add(&sb,sizeof(sb),0.0); | 121 | RAND_add(&sb,sizeof(sb),0.0); |
| 107 | if (bytes == 0) return(ret); | 122 | if (bytes == 0) return(ret); |
| 108 | 123 | ||
| 124 | #ifdef OPENSSL_SYS_VMS | ||
| 125 | in=vms_fopen(file,"rb",VMS_OPEN_ATTRS); | ||
| 126 | #else | ||
| 109 | in=fopen(file,"rb"); | 127 | in=fopen(file,"rb"); |
| 128 | #endif | ||
| 110 | if (in == NULL) goto err; | 129 | if (in == NULL) goto err; |
| 111 | #if defined(S_IFBLK) && defined(S_IFCHR) | 130 | #if defined(S_IFBLK) && defined(S_IFCHR) |
| 112 | if (sb.st_mode & (S_IFBLK | S_IFCHR)) { | 131 | if (sb.st_mode & (S_IFBLK | S_IFCHR)) { |
| @@ -167,7 +186,7 @@ int RAND_write_file(const char *file) | |||
| 167 | #endif | 186 | #endif |
| 168 | } | 187 | } |
| 169 | 188 | ||
| 170 | #if defined(O_CREAT) && !defined(OPENSSL_SYS_WIN32) | 189 | #if defined(O_CREAT) && !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_VMS) |
| 171 | { | 190 | { |
| 172 | /* For some reason Win32 can't write to files created this way */ | 191 | /* For some reason Win32 can't write to files created this way */ |
| 173 | 192 | ||
| @@ -178,8 +197,34 @@ int RAND_write_file(const char *file) | |||
| 178 | out = fdopen(fd, "wb"); | 197 | out = fdopen(fd, "wb"); |
| 179 | } | 198 | } |
| 180 | #endif | 199 | #endif |
| 200 | |||
| 201 | #ifdef OPENSSL_SYS_VMS | ||
| 202 | /* VMS NOTE: Prior versions of this routine created a _new_ | ||
| 203 | * version of the rand file for each call into this routine, then | ||
| 204 | * deleted all existing versions named ;-1, and finally renamed | ||
| 205 | * the current version as ';1'. Under concurrent usage, this | ||
| 206 | * resulted in an RMS race condition in rename() which could | ||
| 207 | * orphan files (see vms message help for RMS$_REENT). With the | ||
| 208 | * fopen() calls below, openssl/VMS now shares the top-level | ||
| 209 | * version of the rand file. Note that there may still be | ||
| 210 | * conditions where the top-level rand file is locked. If so, this | ||
| 211 | * code will then create a new version of the rand file. Without | ||
| 212 | * the delete and rename code, this can result in ascending file | ||
| 213 | * versions that stop at version 32767, and this routine will then | ||
| 214 | * return an error. The remedy for this is to recode the calling | ||
| 215 | * application to avoid concurrent use of the rand file, or | ||
| 216 | * synchronize usage at the application level. Also consider | ||
| 217 | * whether or not you NEED a persistent rand file in a concurrent | ||
| 218 | * use situation. | ||
| 219 | */ | ||
| 220 | |||
| 221 | out = vms_fopen(file,"rb+",VMS_OPEN_ATTRS); | ||
| 222 | if (out == NULL) | ||
| 223 | out = vms_fopen(file,"wb",VMS_OPEN_ATTRS); | ||
| 224 | #else | ||
| 181 | if (out == NULL) | 225 | if (out == NULL) |
| 182 | out = fopen(file,"wb"); | 226 | out = fopen(file,"wb"); |
| 227 | #endif | ||
| 183 | if (out == NULL) goto err; | 228 | if (out == NULL) goto err; |
| 184 | 229 | ||
| 185 | #ifndef NO_CHMOD | 230 | #ifndef NO_CHMOD |
| @@ -201,25 +246,6 @@ int RAND_write_file(const char *file) | |||
| 201 | ret+=i; | 246 | ret+=i; |
| 202 | if (n <= 0) break; | 247 | if (n <= 0) break; |
| 203 | } | 248 | } |
| 204 | #ifdef OPENSSL_SYS_VMS | ||
| 205 | /* Try to delete older versions of the file, until there aren't | ||
| 206 | any */ | ||
| 207 | { | ||
| 208 | char *tmpf; | ||
| 209 | |||
| 210 | tmpf = OPENSSL_malloc(strlen(file) + 4); /* to add ";-1" and a nul */ | ||
| 211 | if (tmpf) | ||
| 212 | { | ||
| 213 | strcpy(tmpf, file); | ||
| 214 | strcat(tmpf, ";-1"); | ||
| 215 | while(delete(tmpf) == 0) | ||
| 216 | ; | ||
| 217 | rename(file,";1"); /* Make sure it's version 1, or we | ||
| 218 | will reach the limit (32767) at | ||
| 219 | some point... */ | ||
| 220 | } | ||
| 221 | } | ||
| 222 | #endif /* OPENSSL_SYS_VMS */ | ||
| 223 | 249 | ||
| 224 | fclose(out); | 250 | fclose(out); |
| 225 | OPENSSL_cleanse(buf,BUFSIZE); | 251 | OPENSSL_cleanse(buf,BUFSIZE); |
diff --git a/src/lib/libcrypto/rc2/rc2.h b/src/lib/libcrypto/rc2/rc2.h index 34c8362317..e542ec94ff 100644 --- a/src/lib/libcrypto/rc2/rc2.h +++ b/src/lib/libcrypto/rc2/rc2.h | |||
| @@ -79,7 +79,9 @@ typedef struct rc2_key_st | |||
| 79 | RC2_INT data[64]; | 79 | RC2_INT data[64]; |
| 80 | } RC2_KEY; | 80 | } RC2_KEY; |
| 81 | 81 | ||
| 82 | 82 | #ifdef OPENSSL_FIPS | |
| 83 | void private_RC2_set_key(RC2_KEY *key, int len, const unsigned char *data,int bits); | ||
| 84 | #endif | ||
| 83 | void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data,int bits); | 85 | void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data,int bits); |
| 84 | void RC2_ecb_encrypt(const unsigned char *in,unsigned char *out,RC2_KEY *key, | 86 | void RC2_ecb_encrypt(const unsigned char *in,unsigned char *out,RC2_KEY *key, |
| 85 | int enc); | 87 | int enc); |
diff --git a/src/lib/libcrypto/rc2/rc2_skey.c b/src/lib/libcrypto/rc2/rc2_skey.c index 4953642056..4e000e5b99 100644 --- a/src/lib/libcrypto/rc2/rc2_skey.c +++ b/src/lib/libcrypto/rc2/rc2_skey.c | |||
| @@ -57,6 +57,11 @@ | |||
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #include <openssl/rc2.h> | 59 | #include <openssl/rc2.h> |
| 60 | #include <openssl/crypto.h> | ||
| 61 | #ifdef OPENSSL_FIPS | ||
| 62 | #include <openssl/fips.h> | ||
| 63 | #endif | ||
| 64 | |||
| 60 | #include "rc2_locl.h" | 65 | #include "rc2_locl.h" |
| 61 | 66 | ||
| 62 | static unsigned char key_table[256]={ | 67 | static unsigned char key_table[256]={ |
| @@ -94,8 +99,20 @@ static unsigned char key_table[256]={ | |||
| 94 | * BSAFE uses the 'retarded' version. What I previously shipped is | 99 | * BSAFE uses the 'retarded' version. What I previously shipped is |
| 95 | * the same as specifying 1024 for the 'bits' parameter. Bsafe uses | 100 | * the same as specifying 1024 for the 'bits' parameter. Bsafe uses |
| 96 | * a version where the bits parameter is the same as len*8 */ | 101 | * a version where the bits parameter is the same as len*8 */ |
| 102 | |||
| 103 | #ifdef OPENSSL_FIPS | ||
| 97 | void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits) | 104 | void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits) |
| 98 | { | 105 | { |
| 106 | if (FIPS_mode()) | ||
| 107 | FIPS_BAD_ABORT(RC2) | ||
| 108 | private_RC2_set_key(key, len, data, bits); | ||
| 109 | } | ||
| 110 | void private_RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, | ||
| 111 | int bits) | ||
| 112 | #else | ||
| 113 | void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits) | ||
| 114 | #endif | ||
| 115 | { | ||
| 99 | int i,j; | 116 | int i,j; |
| 100 | unsigned char *k; | 117 | unsigned char *k; |
| 101 | RC2_INT *ki; | 118 | RC2_INT *ki; |
diff --git a/src/lib/libcrypto/rc4/asm/rc4-x86_64.pl b/src/lib/libcrypto/rc4/asm/rc4-x86_64.pl index 2d47320485..00c6fa28aa 100755 --- a/src/lib/libcrypto/rc4/asm/rc4-x86_64.pl +++ b/src/lib/libcrypto/rc4/asm/rc4-x86_64.pl | |||
| @@ -359,6 +359,8 @@ ___ | |||
| 359 | 359 | ||
| 360 | $code =~ s/#([bwd])/$1/gm; | 360 | $code =~ s/#([bwd])/$1/gm; |
| 361 | 361 | ||
| 362 | $code =~ s/RC4_set_key/private_RC4_set_key/g if ($ENV{FIPSCANLIB} ne ""); | ||
| 363 | |||
| 362 | print $code; | 364 | print $code; |
| 363 | 365 | ||
| 364 | close STDOUT; | 366 | close STDOUT; |
diff --git a/src/lib/libcrypto/rc4/rc4.h b/src/lib/libcrypto/rc4/rc4.h index 7aec04fe93..2d8620d33b 100644 --- a/src/lib/libcrypto/rc4/rc4.h +++ b/src/lib/libcrypto/rc4/rc4.h | |||
| @@ -76,6 +76,9 @@ typedef struct rc4_key_st | |||
| 76 | 76 | ||
| 77 | 77 | ||
| 78 | const char *RC4_options(void); | 78 | const char *RC4_options(void); |
| 79 | #ifdef OPENSSL_FIPS | ||
| 80 | void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); | ||
| 81 | #endif | ||
| 79 | void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); | 82 | void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); |
| 80 | void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata, | 83 | void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata, |
| 81 | unsigned char *outdata); | 84 | unsigned char *outdata); |
diff --git a/src/lib/libcrypto/rc4/rc4_skey.c b/src/lib/libcrypto/rc4/rc4_skey.c index 46b77ec321..4478d1a4b3 100644 --- a/src/lib/libcrypto/rc4/rc4_skey.c +++ b/src/lib/libcrypto/rc4/rc4_skey.c | |||
| @@ -59,6 +59,11 @@ | |||
| 59 | #include <openssl/rc4.h> | 59 | #include <openssl/rc4.h> |
| 60 | #include "rc4_locl.h" | 60 | #include "rc4_locl.h" |
| 61 | #include <openssl/opensslv.h> | 61 | #include <openssl/opensslv.h> |
| 62 | #include <openssl/crypto.h> | ||
| 63 | #ifdef OPENSSL_FIPS | ||
| 64 | #include <openssl/fips.h> | ||
| 65 | #endif | ||
| 66 | |||
| 62 | 67 | ||
| 63 | const char RC4_version[]="RC4" OPENSSL_VERSION_PTEXT; | 68 | const char RC4_version[]="RC4" OPENSSL_VERSION_PTEXT; |
| 64 | 69 | ||
| @@ -85,7 +90,11 @@ const char *RC4_options(void) | |||
| 85 | * Date: Wed, 14 Sep 1994 06:35:31 GMT | 90 | * Date: Wed, 14 Sep 1994 06:35:31 GMT |
| 86 | */ | 91 | */ |
| 87 | 92 | ||
| 93 | #ifdef OPENSSL_FIPS | ||
| 94 | void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data) | ||
| 95 | #else | ||
| 88 | void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data) | 96 | void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data) |
| 97 | #endif | ||
| 89 | { | 98 | { |
| 90 | register RC4_INT tmp; | 99 | register RC4_INT tmp; |
| 91 | register int id1,id2; | 100 | register int id1,id2; |
| @@ -127,7 +136,12 @@ void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data) | |||
| 127 | * | 136 | * |
| 128 | * <appro@fy.chalmers.se> | 137 | * <appro@fy.chalmers.se> |
| 129 | */ | 138 | */ |
| 130 | if (OPENSSL_ia32cap_P & (1<<20)) { | 139 | #ifdef OPENSSL_FIPS |
| 140 | unsigned long *ia32cap_ptr = OPENSSL_ia32cap_loc(); | ||
| 141 | if (ia32cap_ptr && (*ia32cap_ptr & (1<<28))) { | ||
| 142 | #else | ||
| 143 | if (OPENSSL_ia32cap_P & (1<<28)) { | ||
| 144 | #endif | ||
| 131 | unsigned char *cp=(unsigned char *)d; | 145 | unsigned char *cp=(unsigned char *)d; |
| 132 | 146 | ||
| 133 | for (i=0;i<256;i++) cp[i]=i; | 147 | for (i=0;i<256;i++) cp[i]=i; |
diff --git a/src/lib/libcrypto/ripemd/ripemd.h b/src/lib/libcrypto/ripemd/ripemd.h index 033a5965b5..3b6d04386d 100644 --- a/src/lib/libcrypto/ripemd/ripemd.h +++ b/src/lib/libcrypto/ripemd/ripemd.h | |||
| @@ -90,7 +90,9 @@ typedef struct RIPEMD160state_st | |||
| 90 | RIPEMD160_LONG data[RIPEMD160_LBLOCK]; | 90 | RIPEMD160_LONG data[RIPEMD160_LBLOCK]; |
| 91 | unsigned int num; | 91 | unsigned int num; |
| 92 | } RIPEMD160_CTX; | 92 | } RIPEMD160_CTX; |
| 93 | 93 | #ifdef OPENSSL_FIPS | |
| 94 | int private_RIPEMD160_Init(RIPEMD160_CTX *c); | ||
| 95 | #endif | ||
| 94 | int RIPEMD160_Init(RIPEMD160_CTX *c); | 96 | int RIPEMD160_Init(RIPEMD160_CTX *c); |
| 95 | int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len); | 97 | int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len); |
| 96 | int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); | 98 | int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); |
diff --git a/src/lib/libcrypto/ripemd/rmd_dgst.c b/src/lib/libcrypto/ripemd/rmd_dgst.c index 61626284b8..ead11d075a 100644 --- a/src/lib/libcrypto/ripemd/rmd_dgst.c +++ b/src/lib/libcrypto/ripemd/rmd_dgst.c | |||
| @@ -59,6 +59,11 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include "rmd_locl.h" | 60 | #include "rmd_locl.h" |
| 61 | #include <openssl/opensslv.h> | 61 | #include <openssl/opensslv.h> |
| 62 | #include <openssl/err.h> | ||
| 63 | #ifdef OPENSSL_FIPS | ||
| 64 | #include <openssl/fips.h> | ||
| 65 | #endif | ||
| 66 | |||
| 62 | 67 | ||
| 63 | const char RMD160_version[]="RIPE-MD160" OPENSSL_VERSION_PTEXT; | 68 | const char RMD160_version[]="RIPE-MD160" OPENSSL_VERSION_PTEXT; |
| 64 | 69 | ||
| @@ -69,7 +74,7 @@ const char RMD160_version[]="RIPE-MD160" OPENSSL_VERSION_PTEXT; | |||
| 69 | void ripemd160_block(RIPEMD160_CTX *c, unsigned long *p,size_t num); | 74 | void ripemd160_block(RIPEMD160_CTX *c, unsigned long *p,size_t num); |
| 70 | # endif | 75 | # endif |
| 71 | 76 | ||
| 72 | int RIPEMD160_Init(RIPEMD160_CTX *c) | 77 | FIPS_NON_FIPS_MD_Init(RIPEMD160) |
| 73 | { | 78 | { |
| 74 | c->A=RIPEMD160_A; | 79 | c->A=RIPEMD160_A; |
| 75 | c->B=RIPEMD160_B; | 80 | c->B=RIPEMD160_B; |
diff --git a/src/lib/libcrypto/ripemd/rmd_locl.h b/src/lib/libcrypto/ripemd/rmd_locl.h index f14b346e66..ce12a8000e 100644 --- a/src/lib/libcrypto/ripemd/rmd_locl.h +++ b/src/lib/libcrypto/ripemd/rmd_locl.h | |||
| @@ -72,7 +72,7 @@ | |||
| 72 | */ | 72 | */ |
| 73 | #ifdef RMD160_ASM | 73 | #ifdef RMD160_ASM |
| 74 | # if defined(__i386) || defined(__i386__) || defined(_M_IX86) || defined(__INTEL__) | 74 | # if defined(__i386) || defined(__i386__) || defined(_M_IX86) || defined(__INTEL__) |
| 75 | # define ripemd160_block_data_order ripemd160_block_asm_data_order | 75 | # define ripemd160_block_host_order ripemd160_block_asm_data_order |
| 76 | # endif | 76 | # endif |
| 77 | #endif | 77 | #endif |
| 78 | 78 | ||
diff --git a/src/lib/libcrypto/rsa/rsa.h b/src/lib/libcrypto/rsa/rsa.h index 6b5e4f8a9a..5bb932ae15 100644 --- a/src/lib/libcrypto/rsa/rsa.h +++ b/src/lib/libcrypto/rsa/rsa.h | |||
| @@ -74,6 +74,25 @@ | |||
| 74 | #error RSA is disabled. | 74 | #error RSA is disabled. |
| 75 | #endif | 75 | #endif |
| 76 | 76 | ||
| 77 | /* If this flag is set the RSA method is FIPS compliant and can be used | ||
| 78 | * in FIPS mode. This is set in the validated module method. If an | ||
| 79 | * application sets this flag in its own methods it is its reposibility | ||
| 80 | * to ensure the result is compliant. | ||
| 81 | */ | ||
| 82 | |||
| 83 | #define RSA_FLAG_FIPS_METHOD 0x0400 | ||
| 84 | |||
| 85 | /* If this flag is set the operations normally disabled in FIPS mode are | ||
| 86 | * permitted it is then the applications responsibility to ensure that the | ||
| 87 | * usage is compliant. | ||
| 88 | */ | ||
| 89 | |||
| 90 | #define RSA_FLAG_NON_FIPS_ALLOW 0x0400 | ||
| 91 | |||
| 92 | #ifdef OPENSSL_FIPS | ||
| 93 | #define FIPS_RSA_SIZE_T int | ||
| 94 | #endif | ||
| 95 | |||
| 77 | #ifdef __cplusplus | 96 | #ifdef __cplusplus |
| 78 | extern "C" { | 97 | extern "C" { |
| 79 | #endif | 98 | #endif |
| @@ -163,6 +182,8 @@ struct rsa_st | |||
| 163 | # define OPENSSL_RSA_MAX_MODULUS_BITS 16384 | 182 | # define OPENSSL_RSA_MAX_MODULUS_BITS 16384 |
| 164 | #endif | 183 | #endif |
| 165 | 184 | ||
| 185 | #define OPENSSL_RSA_FIPS_MIN_MODULUS_BITS 1024 | ||
| 186 | |||
| 166 | #ifndef OPENSSL_RSA_SMALL_MODULUS_BITS | 187 | #ifndef OPENSSL_RSA_SMALL_MODULUS_BITS |
| 167 | # define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 | 188 | # define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 |
| 168 | #endif | 189 | #endif |
| @@ -240,6 +261,11 @@ RSA * RSA_generate_key(int bits, unsigned long e,void | |||
| 240 | 261 | ||
| 241 | /* New version */ | 262 | /* New version */ |
| 242 | int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); | 263 | int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); |
| 264 | int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1, BIGNUM *q2, | ||
| 265 | const BIGNUM *Xp1, const BIGNUM *Xp2, const BIGNUM *Xp, | ||
| 266 | const BIGNUM *Xq1, const BIGNUM *Xq2, const BIGNUM *Xq, | ||
| 267 | const BIGNUM *e, BN_GENCB *cb); | ||
| 268 | int RSA_X931_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e, BN_GENCB *cb); | ||
| 243 | 269 | ||
| 244 | int RSA_check_key(const RSA *); | 270 | int RSA_check_key(const RSA *); |
| 245 | /* next 4 return -1 on error */ | 271 | /* next 4 return -1 on error */ |
| @@ -257,6 +283,11 @@ int RSA_up_ref(RSA *r); | |||
| 257 | 283 | ||
| 258 | int RSA_flags(const RSA *r); | 284 | int RSA_flags(const RSA *r); |
| 259 | 285 | ||
| 286 | #ifdef OPENSSL_FIPS | ||
| 287 | RSA *FIPS_rsa_new(void); | ||
| 288 | void FIPS_rsa_free(RSA *r); | ||
| 289 | #endif | ||
| 290 | |||
| 260 | void RSA_set_default_method(const RSA_METHOD *meth); | 291 | void RSA_set_default_method(const RSA_METHOD *meth); |
| 261 | const RSA_METHOD *RSA_get_default_method(void); | 292 | const RSA_METHOD *RSA_get_default_method(void); |
| 262 | const RSA_METHOD *RSA_get_method(const RSA *rsa); | 293 | const RSA_METHOD *RSA_get_method(const RSA *rsa); |
| @@ -281,6 +312,7 @@ int RSA_print_fp(FILE *fp, const RSA *r,int offset); | |||
| 281 | int RSA_print(BIO *bp, const RSA *r,int offset); | 312 | int RSA_print(BIO *bp, const RSA *r,int offset); |
| 282 | #endif | 313 | #endif |
| 283 | 314 | ||
| 315 | #ifndef OPENSSL_NO_RC4 | ||
| 284 | int i2d_RSA_NET(const RSA *a, unsigned char **pp, | 316 | int i2d_RSA_NET(const RSA *a, unsigned char **pp, |
| 285 | int (*cb)(char *buf, int len, const char *prompt, int verify), | 317 | int (*cb)(char *buf, int len, const char *prompt, int verify), |
| 286 | int sgckey); | 318 | int sgckey); |
| @@ -294,6 +326,7 @@ int i2d_Netscape_RSA(const RSA *a, unsigned char **pp, | |||
| 294 | RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length, | 326 | RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length, |
| 295 | int (*cb)(char *buf, int len, const char *prompt, | 327 | int (*cb)(char *buf, int len, const char *prompt, |
| 296 | int verify)); | 328 | int verify)); |
| 329 | #endif | ||
| 297 | 330 | ||
| 298 | /* The following 2 functions sign and verify a X509_SIG ASN1 object | 331 | /* The following 2 functions sign and verify a X509_SIG ASN1 object |
| 299 | * inside PKCS#1 padded RSA encryption */ | 332 | * inside PKCS#1 padded RSA encryption */ |
| @@ -368,6 +401,8 @@ void ERR_load_RSA_strings(void); | |||
| 368 | /* Error codes for the RSA functions. */ | 401 | /* Error codes for the RSA functions. */ |
| 369 | 402 | ||
| 370 | /* Function codes. */ | 403 | /* Function codes. */ |
| 404 | #define RSA_F_FIPS_RSA_SIGN 140 | ||
| 405 | #define RSA_F_FIPS_RSA_VERIFY 141 | ||
| 371 | #define RSA_F_MEMORY_LOCK 100 | 406 | #define RSA_F_MEMORY_LOCK 100 |
| 372 | #define RSA_F_RSA_BUILTIN_KEYGEN 129 | 407 | #define RSA_F_RSA_BUILTIN_KEYGEN 129 |
| 373 | #define RSA_F_RSA_CHECK_KEY 123 | 408 | #define RSA_F_RSA_CHECK_KEY 123 |
| @@ -399,7 +434,11 @@ void ERR_load_RSA_strings(void); | |||
| 399 | #define RSA_F_RSA_PADDING_CHECK_X931 128 | 434 | #define RSA_F_RSA_PADDING_CHECK_X931 128 |
| 400 | #define RSA_F_RSA_PRINT 115 | 435 | #define RSA_F_RSA_PRINT 115 |
| 401 | #define RSA_F_RSA_PRINT_FP 116 | 436 | #define RSA_F_RSA_PRINT_FP 116 |
| 437 | #define RSA_F_RSA_PRIVATE_ENCRYPT 137 | ||
| 438 | #define RSA_F_RSA_PUBLIC_DECRYPT 138 | ||
| 402 | #define RSA_F_RSA_SETUP_BLINDING 136 | 439 | #define RSA_F_RSA_SETUP_BLINDING 136 |
| 440 | #define RSA_F_RSA_SET_DEFAULT_METHOD 139 | ||
| 441 | #define RSA_F_RSA_SET_METHOD 142 | ||
| 403 | #define RSA_F_RSA_SIGN 117 | 442 | #define RSA_F_RSA_SIGN 117 |
| 404 | #define RSA_F_RSA_SIGN_ASN1_OCTET_STRING 118 | 443 | #define RSA_F_RSA_SIGN_ASN1_OCTET_STRING 118 |
| 405 | #define RSA_F_RSA_VERIFY 119 | 444 | #define RSA_F_RSA_VERIFY 119 |
| @@ -433,10 +472,12 @@ void ERR_load_RSA_strings(void); | |||
| 433 | #define RSA_R_KEY_SIZE_TOO_SMALL 120 | 472 | #define RSA_R_KEY_SIZE_TOO_SMALL 120 |
| 434 | #define RSA_R_LAST_OCTET_INVALID 134 | 473 | #define RSA_R_LAST_OCTET_INVALID 134 |
| 435 | #define RSA_R_MODULUS_TOO_LARGE 105 | 474 | #define RSA_R_MODULUS_TOO_LARGE 105 |
| 475 | #define RSA_R_NON_FIPS_METHOD 141 | ||
| 436 | #define RSA_R_NO_PUBLIC_EXPONENT 140 | 476 | #define RSA_R_NO_PUBLIC_EXPONENT 140 |
| 437 | #define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 | 477 | #define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 |
| 438 | #define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 | 478 | #define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 |
| 439 | #define RSA_R_OAEP_DECODING_ERROR 121 | 479 | #define RSA_R_OAEP_DECODING_ERROR 121 |
| 480 | #define RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE 142 | ||
| 440 | #define RSA_R_PADDING_CHECK_FAILED 114 | 481 | #define RSA_R_PADDING_CHECK_FAILED 114 |
| 441 | #define RSA_R_P_NOT_PRIME 128 | 482 | #define RSA_R_P_NOT_PRIME 128 |
| 442 | #define RSA_R_Q_NOT_PRIME 129 | 483 | #define RSA_R_Q_NOT_PRIME 129 |
diff --git a/src/lib/libcrypto/rsa/rsa_asn1.c b/src/lib/libcrypto/rsa/rsa_asn1.c index bbbf26d50e..6e8a803e81 100644 --- a/src/lib/libcrypto/rsa/rsa_asn1.c +++ b/src/lib/libcrypto/rsa/rsa_asn1.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* rsa_asn1.c */ | 1 | /* rsa_asn1.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2000. | 3 | * project 2000. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/rsa/rsa_eay.c b/src/lib/libcrypto/rsa/rsa_eay.c index ffadaab9a4..0ac6418449 100644 --- a/src/lib/libcrypto/rsa/rsa_eay.c +++ b/src/lib/libcrypto/rsa/rsa_eay.c | |||
| @@ -115,7 +115,7 @@ | |||
| 115 | #include <openssl/rsa.h> | 115 | #include <openssl/rsa.h> |
| 116 | #include <openssl/rand.h> | 116 | #include <openssl/rand.h> |
| 117 | 117 | ||
| 118 | #ifndef RSA_NULL | 118 | #if !defined(RSA_NULL) && !defined(OPENSSL_FIPS) |
| 119 | 119 | ||
| 120 | static int RSA_eay_public_encrypt(int flen, const unsigned char *from, | 120 | static int RSA_eay_public_encrypt(int flen, const unsigned char *from, |
| 121 | unsigned char *to, RSA *rsa,int padding); | 121 | unsigned char *to, RSA *rsa,int padding); |
| @@ -150,16 +150,6 @@ const RSA_METHOD *RSA_PKCS1_SSLeay(void) | |||
| 150 | return(&rsa_pkcs1_eay_meth); | 150 | return(&rsa_pkcs1_eay_meth); |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | /* Usage example; | ||
| 154 | * MONT_HELPER(rsa->_method_mod_p, bn_ctx, rsa->p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err); | ||
| 155 | */ | ||
| 156 | #define MONT_HELPER(method_mod, ctx, m, pre_cond, err_instr) \ | ||
| 157 | if ((pre_cond) && ((method_mod) == NULL) && \ | ||
| 158 | !BN_MONT_CTX_set_locked(&(method_mod), \ | ||
| 159 | CRYPTO_LOCK_RSA, \ | ||
| 160 | (m), (ctx))) \ | ||
| 161 | err_instr | ||
| 162 | |||
| 163 | static int RSA_eay_public_encrypt(int flen, const unsigned char *from, | 153 | static int RSA_eay_public_encrypt(int flen, const unsigned char *from, |
| 164 | unsigned char *to, RSA *rsa, int padding) | 154 | unsigned char *to, RSA *rsa, int padding) |
| 165 | { | 155 | { |
| @@ -233,7 +223,9 @@ static int RSA_eay_public_encrypt(int flen, const unsigned char *from, | |||
| 233 | goto err; | 223 | goto err; |
| 234 | } | 224 | } |
| 235 | 225 | ||
| 236 | MONT_HELPER(rsa->_method_mod_n, ctx, rsa->n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | 226 | if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) |
| 227 | if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) | ||
| 228 | goto err; | ||
| 237 | 229 | ||
| 238 | if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx, | 230 | if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx, |
| 239 | rsa->_method_mod_n)) goto err; | 231 | rsa->_method_mod_n)) goto err; |
| @@ -438,7 +430,9 @@ static int RSA_eay_private_encrypt(int flen, const unsigned char *from, | |||
| 438 | else | 430 | else |
| 439 | d= rsa->d; | 431 | d= rsa->d; |
| 440 | 432 | ||
| 441 | MONT_HELPER(rsa->_method_mod_n, ctx, rsa->n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | 433 | if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) |
| 434 | if(!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) | ||
| 435 | goto err; | ||
| 442 | 436 | ||
| 443 | if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, | 437 | if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, |
| 444 | rsa->_method_mod_n)) goto err; | 438 | rsa->_method_mod_n)) goto err; |
| @@ -559,7 +553,9 @@ static int RSA_eay_private_decrypt(int flen, const unsigned char *from, | |||
| 559 | else | 553 | else |
| 560 | d = rsa->d; | 554 | d = rsa->d; |
| 561 | 555 | ||
| 562 | MONT_HELPER(rsa->_method_mod_n, ctx, rsa->n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | 556 | if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) |
| 557 | if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) | ||
| 558 | goto err; | ||
| 563 | if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, | 559 | if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, |
| 564 | rsa->_method_mod_n)) | 560 | rsa->_method_mod_n)) |
| 565 | goto err; | 561 | goto err; |
| @@ -669,7 +665,9 @@ static int RSA_eay_public_decrypt(int flen, const unsigned char *from, | |||
| 669 | goto err; | 665 | goto err; |
| 670 | } | 666 | } |
| 671 | 667 | ||
| 672 | MONT_HELPER(rsa->_method_mod_n, ctx, rsa->n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | 668 | if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) |
| 669 | if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) | ||
| 670 | goto err; | ||
| 673 | 671 | ||
| 674 | if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx, | 672 | if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx, |
| 675 | rsa->_method_mod_n)) goto err; | 673 | rsa->_method_mod_n)) goto err; |
| @@ -747,11 +745,18 @@ static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) | |||
| 747 | q = rsa->q; | 745 | q = rsa->q; |
| 748 | } | 746 | } |
| 749 | 747 | ||
| 750 | MONT_HELPER(rsa->_method_mod_p, ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err); | 748 | if (rsa->flags & RSA_FLAG_CACHE_PRIVATE) |
| 751 | MONT_HELPER(rsa->_method_mod_q, ctx, q, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err); | 749 | { |
| 750 | if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_p, CRYPTO_LOCK_RSA, p, ctx)) | ||
| 751 | goto err; | ||
| 752 | if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_q, CRYPTO_LOCK_RSA, q, ctx)) | ||
| 753 | goto err; | ||
| 754 | } | ||
| 752 | } | 755 | } |
| 753 | 756 | ||
| 754 | MONT_HELPER(rsa->_method_mod_n, ctx, rsa->n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | 757 | if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) |
| 758 | if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) | ||
| 759 | goto err; | ||
| 755 | 760 | ||
| 756 | /* compute I mod q */ | 761 | /* compute I mod q */ |
| 757 | if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) | 762 | if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) |
diff --git a/src/lib/libcrypto/rsa/rsa_err.c b/src/lib/libcrypto/rsa/rsa_err.c index fe3ba1b44b..501f5ea389 100644 --- a/src/lib/libcrypto/rsa/rsa_err.c +++ b/src/lib/libcrypto/rsa/rsa_err.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* crypto/rsa/rsa_err.c */ | 1 | /* crypto/rsa/rsa_err.c */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that the following conditions | 6 | * modification, are permitted provided that the following conditions |
| @@ -70,6 +70,8 @@ | |||
| 70 | 70 | ||
| 71 | static ERR_STRING_DATA RSA_str_functs[]= | 71 | static ERR_STRING_DATA RSA_str_functs[]= |
| 72 | { | 72 | { |
| 73 | {ERR_FUNC(RSA_F_FIPS_RSA_SIGN), "FIPS_RSA_SIGN"}, | ||
| 74 | {ERR_FUNC(RSA_F_FIPS_RSA_VERIFY), "FIPS_RSA_VERIFY"}, | ||
| 73 | {ERR_FUNC(RSA_F_MEMORY_LOCK), "MEMORY_LOCK"}, | 75 | {ERR_FUNC(RSA_F_MEMORY_LOCK), "MEMORY_LOCK"}, |
| 74 | {ERR_FUNC(RSA_F_RSA_BUILTIN_KEYGEN), "RSA_BUILTIN_KEYGEN"}, | 76 | {ERR_FUNC(RSA_F_RSA_BUILTIN_KEYGEN), "RSA_BUILTIN_KEYGEN"}, |
| 75 | {ERR_FUNC(RSA_F_RSA_CHECK_KEY), "RSA_check_key"}, | 77 | {ERR_FUNC(RSA_F_RSA_CHECK_KEY), "RSA_check_key"}, |
| @@ -101,7 +103,11 @@ static ERR_STRING_DATA RSA_str_functs[]= | |||
| 101 | {ERR_FUNC(RSA_F_RSA_PADDING_CHECK_X931), "RSA_padding_check_X931"}, | 103 | {ERR_FUNC(RSA_F_RSA_PADDING_CHECK_X931), "RSA_padding_check_X931"}, |
| 102 | {ERR_FUNC(RSA_F_RSA_PRINT), "RSA_print"}, | 104 | {ERR_FUNC(RSA_F_RSA_PRINT), "RSA_print"}, |
| 103 | {ERR_FUNC(RSA_F_RSA_PRINT_FP), "RSA_print_fp"}, | 105 | {ERR_FUNC(RSA_F_RSA_PRINT_FP), "RSA_print_fp"}, |
| 106 | {ERR_FUNC(RSA_F_RSA_PRIVATE_ENCRYPT), "RSA_private_encrypt"}, | ||
| 107 | {ERR_FUNC(RSA_F_RSA_PUBLIC_DECRYPT), "RSA_public_decrypt"}, | ||
| 104 | {ERR_FUNC(RSA_F_RSA_SETUP_BLINDING), "RSA_setup_blinding"}, | 108 | {ERR_FUNC(RSA_F_RSA_SETUP_BLINDING), "RSA_setup_blinding"}, |
| 109 | {ERR_FUNC(RSA_F_RSA_SET_DEFAULT_METHOD), "RSA_set_default_method"}, | ||
| 110 | {ERR_FUNC(RSA_F_RSA_SET_METHOD), "RSA_set_method"}, | ||
| 105 | {ERR_FUNC(RSA_F_RSA_SIGN), "RSA_sign"}, | 111 | {ERR_FUNC(RSA_F_RSA_SIGN), "RSA_sign"}, |
| 106 | {ERR_FUNC(RSA_F_RSA_SIGN_ASN1_OCTET_STRING), "RSA_sign_ASN1_OCTET_STRING"}, | 112 | {ERR_FUNC(RSA_F_RSA_SIGN_ASN1_OCTET_STRING), "RSA_sign_ASN1_OCTET_STRING"}, |
| 107 | {ERR_FUNC(RSA_F_RSA_VERIFY), "RSA_verify"}, | 113 | {ERR_FUNC(RSA_F_RSA_VERIFY), "RSA_verify"}, |
| @@ -138,10 +144,12 @@ static ERR_STRING_DATA RSA_str_reasons[]= | |||
| 138 | {ERR_REASON(RSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"}, | 144 | {ERR_REASON(RSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"}, |
| 139 | {ERR_REASON(RSA_R_LAST_OCTET_INVALID) ,"last octet invalid"}, | 145 | {ERR_REASON(RSA_R_LAST_OCTET_INVALID) ,"last octet invalid"}, |
| 140 | {ERR_REASON(RSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, | 146 | {ERR_REASON(RSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, |
| 147 | {ERR_REASON(RSA_R_NON_FIPS_METHOD) ,"non fips method"}, | ||
| 141 | {ERR_REASON(RSA_R_NO_PUBLIC_EXPONENT) ,"no public exponent"}, | 148 | {ERR_REASON(RSA_R_NO_PUBLIC_EXPONENT) ,"no public exponent"}, |
| 142 | {ERR_REASON(RSA_R_NULL_BEFORE_BLOCK_MISSING),"null before block missing"}, | 149 | {ERR_REASON(RSA_R_NULL_BEFORE_BLOCK_MISSING),"null before block missing"}, |
| 143 | {ERR_REASON(RSA_R_N_DOES_NOT_EQUAL_P_Q) ,"n does not equal p q"}, | 150 | {ERR_REASON(RSA_R_N_DOES_NOT_EQUAL_P_Q) ,"n does not equal p q"}, |
| 144 | {ERR_REASON(RSA_R_OAEP_DECODING_ERROR) ,"oaep decoding error"}, | 151 | {ERR_REASON(RSA_R_OAEP_DECODING_ERROR) ,"oaep decoding error"}, |
| 152 | {ERR_REASON(RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE),"operation not allowed in fips mode"}, | ||
| 145 | {ERR_REASON(RSA_R_PADDING_CHECK_FAILED) ,"padding check failed"}, | 153 | {ERR_REASON(RSA_R_PADDING_CHECK_FAILED) ,"padding check failed"}, |
| 146 | {ERR_REASON(RSA_R_P_NOT_PRIME) ,"p not prime"}, | 154 | {ERR_REASON(RSA_R_P_NOT_PRIME) ,"p not prime"}, |
| 147 | {ERR_REASON(RSA_R_Q_NOT_PRIME) ,"q not prime"}, | 155 | {ERR_REASON(RSA_R_Q_NOT_PRIME) ,"q not prime"}, |
diff --git a/src/lib/libcrypto/rsa/rsa_gen.c b/src/lib/libcrypto/rsa/rsa_gen.c index 767f7ab682..41278f83c6 100644 --- a/src/lib/libcrypto/rsa/rsa_gen.c +++ b/src/lib/libcrypto/rsa/rsa_gen.c | |||
| @@ -68,6 +68,8 @@ | |||
| 68 | #include <openssl/bn.h> | 68 | #include <openssl/bn.h> |
| 69 | #include <openssl/rsa.h> | 69 | #include <openssl/rsa.h> |
| 70 | 70 | ||
| 71 | #ifndef OPENSSL_FIPS | ||
| 72 | |||
| 71 | static int rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb); | 73 | static int rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb); |
| 72 | 74 | ||
| 73 | /* NB: this wrapper would normally be placed in rsa_lib.c and the static | 75 | /* NB: this wrapper would normally be placed in rsa_lib.c and the static |
| @@ -217,3 +219,4 @@ err: | |||
| 217 | return ok; | 219 | return ok; |
| 218 | } | 220 | } |
| 219 | 221 | ||
| 222 | #endif | ||
diff --git a/src/lib/libcrypto/rsa/rsa_lib.c b/src/lib/libcrypto/rsa/rsa_lib.c index 104aa4c1f2..5714841f4c 100644 --- a/src/lib/libcrypto/rsa/rsa_lib.c +++ b/src/lib/libcrypto/rsa/rsa_lib.c | |||
| @@ -67,215 +67,6 @@ | |||
| 67 | #include <openssl/engine.h> | 67 | #include <openssl/engine.h> |
| 68 | #endif | 68 | #endif |
| 69 | 69 | ||
| 70 | const char RSA_version[]="RSA" OPENSSL_VERSION_PTEXT; | ||
| 71 | |||
| 72 | static const RSA_METHOD *default_RSA_meth=NULL; | ||
| 73 | |||
| 74 | RSA *RSA_new(void) | ||
| 75 | { | ||
| 76 | RSA *r=RSA_new_method(NULL); | ||
| 77 | |||
| 78 | return r; | ||
| 79 | } | ||
| 80 | |||
| 81 | void RSA_set_default_method(const RSA_METHOD *meth) | ||
| 82 | { | ||
| 83 | default_RSA_meth = meth; | ||
| 84 | } | ||
| 85 | |||
| 86 | const RSA_METHOD *RSA_get_default_method(void) | ||
| 87 | { | ||
| 88 | if (default_RSA_meth == NULL) | ||
| 89 | { | ||
| 90 | #ifdef RSA_NULL | ||
| 91 | default_RSA_meth=RSA_null_method(); | ||
| 92 | #else | ||
| 93 | #if 0 /* was: #ifdef RSAref */ | ||
| 94 | default_RSA_meth=RSA_PKCS1_RSAref(); | ||
| 95 | #else | ||
| 96 | default_RSA_meth=RSA_PKCS1_SSLeay(); | ||
| 97 | #endif | ||
| 98 | #endif | ||
| 99 | } | ||
| 100 | |||
| 101 | return default_RSA_meth; | ||
| 102 | } | ||
| 103 | |||
| 104 | const RSA_METHOD *RSA_get_method(const RSA *rsa) | ||
| 105 | { | ||
| 106 | return rsa->meth; | ||
| 107 | } | ||
| 108 | |||
| 109 | int RSA_set_method(RSA *rsa, const RSA_METHOD *meth) | ||
| 110 | { | ||
| 111 | /* NB: The caller is specifically setting a method, so it's not up to us | ||
| 112 | * to deal with which ENGINE it comes from. */ | ||
| 113 | const RSA_METHOD *mtmp; | ||
| 114 | mtmp = rsa->meth; | ||
| 115 | if (mtmp->finish) mtmp->finish(rsa); | ||
| 116 | #ifndef OPENSSL_NO_ENGINE | ||
| 117 | if (rsa->engine) | ||
| 118 | { | ||
| 119 | ENGINE_finish(rsa->engine); | ||
| 120 | rsa->engine = NULL; | ||
| 121 | } | ||
| 122 | #endif | ||
| 123 | rsa->meth = meth; | ||
| 124 | if (meth->init) meth->init(rsa); | ||
| 125 | return 1; | ||
| 126 | } | ||
| 127 | |||
| 128 | RSA *RSA_new_method(ENGINE *engine) | ||
| 129 | { | ||
| 130 | RSA *ret; | ||
| 131 | |||
| 132 | ret=(RSA *)OPENSSL_malloc(sizeof(RSA)); | ||
| 133 | if (ret == NULL) | ||
| 134 | { | ||
| 135 | RSAerr(RSA_F_RSA_NEW_METHOD,ERR_R_MALLOC_FAILURE); | ||
| 136 | return NULL; | ||
| 137 | } | ||
| 138 | |||
| 139 | ret->meth = RSA_get_default_method(); | ||
| 140 | #ifndef OPENSSL_NO_ENGINE | ||
| 141 | if (engine) | ||
| 142 | { | ||
| 143 | if (!ENGINE_init(engine)) | ||
| 144 | { | ||
| 145 | RSAerr(RSA_F_RSA_NEW_METHOD, ERR_R_ENGINE_LIB); | ||
| 146 | OPENSSL_free(ret); | ||
| 147 | return NULL; | ||
| 148 | } | ||
| 149 | ret->engine = engine; | ||
| 150 | } | ||
| 151 | else | ||
| 152 | ret->engine = ENGINE_get_default_RSA(); | ||
| 153 | if(ret->engine) | ||
| 154 | { | ||
| 155 | ret->meth = ENGINE_get_RSA(ret->engine); | ||
| 156 | if(!ret->meth) | ||
| 157 | { | ||
| 158 | RSAerr(RSA_F_RSA_NEW_METHOD, | ||
| 159 | ERR_R_ENGINE_LIB); | ||
| 160 | ENGINE_finish(ret->engine); | ||
| 161 | OPENSSL_free(ret); | ||
| 162 | return NULL; | ||
| 163 | } | ||
| 164 | } | ||
| 165 | #endif | ||
| 166 | |||
| 167 | ret->pad=0; | ||
| 168 | ret->version=0; | ||
| 169 | ret->n=NULL; | ||
| 170 | ret->e=NULL; | ||
| 171 | ret->d=NULL; | ||
| 172 | ret->p=NULL; | ||
| 173 | ret->q=NULL; | ||
| 174 | ret->dmp1=NULL; | ||
| 175 | ret->dmq1=NULL; | ||
| 176 | ret->iqmp=NULL; | ||
| 177 | ret->references=1; | ||
| 178 | ret->_method_mod_n=NULL; | ||
| 179 | ret->_method_mod_p=NULL; | ||
| 180 | ret->_method_mod_q=NULL; | ||
| 181 | ret->blinding=NULL; | ||
| 182 | ret->mt_blinding=NULL; | ||
| 183 | ret->bignum_data=NULL; | ||
| 184 | ret->flags=ret->meth->flags; | ||
| 185 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data); | ||
| 186 | if ((ret->meth->init != NULL) && !ret->meth->init(ret)) | ||
| 187 | { | ||
| 188 | #ifndef OPENSSL_NO_ENGINE | ||
| 189 | if (ret->engine) | ||
| 190 | ENGINE_finish(ret->engine); | ||
| 191 | #endif | ||
| 192 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data); | ||
| 193 | OPENSSL_free(ret); | ||
| 194 | ret=NULL; | ||
| 195 | } | ||
| 196 | return(ret); | ||
| 197 | } | ||
| 198 | |||
| 199 | void RSA_free(RSA *r) | ||
| 200 | { | ||
| 201 | int i; | ||
| 202 | |||
| 203 | if (r == NULL) return; | ||
| 204 | |||
| 205 | i=CRYPTO_add(&r->references,-1,CRYPTO_LOCK_RSA); | ||
| 206 | #ifdef REF_PRINT | ||
| 207 | REF_PRINT("RSA",r); | ||
| 208 | #endif | ||
| 209 | if (i > 0) return; | ||
| 210 | #ifdef REF_CHECK | ||
| 211 | if (i < 0) | ||
| 212 | { | ||
| 213 | fprintf(stderr,"RSA_free, bad reference count\n"); | ||
| 214 | abort(); | ||
| 215 | } | ||
| 216 | #endif | ||
| 217 | |||
| 218 | if (r->meth->finish) | ||
| 219 | r->meth->finish(r); | ||
| 220 | #ifndef OPENSSL_NO_ENGINE | ||
| 221 | if (r->engine) | ||
| 222 | ENGINE_finish(r->engine); | ||
| 223 | #endif | ||
| 224 | |||
| 225 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_RSA, r, &r->ex_data); | ||
| 226 | |||
| 227 | if (r->n != NULL) BN_clear_free(r->n); | ||
| 228 | if (r->e != NULL) BN_clear_free(r->e); | ||
| 229 | if (r->d != NULL) BN_clear_free(r->d); | ||
| 230 | if (r->p != NULL) BN_clear_free(r->p); | ||
| 231 | if (r->q != NULL) BN_clear_free(r->q); | ||
| 232 | if (r->dmp1 != NULL) BN_clear_free(r->dmp1); | ||
| 233 | if (r->dmq1 != NULL) BN_clear_free(r->dmq1); | ||
| 234 | if (r->iqmp != NULL) BN_clear_free(r->iqmp); | ||
| 235 | if (r->blinding != NULL) BN_BLINDING_free(r->blinding); | ||
| 236 | if (r->mt_blinding != NULL) BN_BLINDING_free(r->mt_blinding); | ||
| 237 | if (r->bignum_data != NULL) OPENSSL_free_locked(r->bignum_data); | ||
| 238 | OPENSSL_free(r); | ||
| 239 | } | ||
| 240 | |||
| 241 | int RSA_up_ref(RSA *r) | ||
| 242 | { | ||
| 243 | int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_RSA); | ||
| 244 | #ifdef REF_PRINT | ||
| 245 | REF_PRINT("RSA",r); | ||
| 246 | #endif | ||
| 247 | #ifdef REF_CHECK | ||
| 248 | if (i < 2) | ||
| 249 | { | ||
| 250 | fprintf(stderr, "RSA_up_ref, bad reference count\n"); | ||
| 251 | abort(); | ||
| 252 | } | ||
| 253 | #endif | ||
| 254 | return ((i > 1) ? 1 : 0); | ||
| 255 | } | ||
| 256 | |||
| 257 | int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | ||
| 258 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | ||
| 259 | { | ||
| 260 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_RSA, argl, argp, | ||
| 261 | new_func, dup_func, free_func); | ||
| 262 | } | ||
| 263 | |||
| 264 | int RSA_set_ex_data(RSA *r, int idx, void *arg) | ||
| 265 | { | ||
| 266 | return(CRYPTO_set_ex_data(&r->ex_data,idx,arg)); | ||
| 267 | } | ||
| 268 | |||
| 269 | void *RSA_get_ex_data(const RSA *r, int idx) | ||
| 270 | { | ||
| 271 | return(CRYPTO_get_ex_data(&r->ex_data,idx)); | ||
| 272 | } | ||
| 273 | |||
| 274 | int RSA_size(const RSA *r) | ||
| 275 | { | ||
| 276 | return(BN_num_bytes(r->n)); | ||
| 277 | } | ||
| 278 | |||
| 279 | int RSA_public_encrypt(int flen, const unsigned char *from, unsigned char *to, | 70 | int RSA_public_encrypt(int flen, const unsigned char *from, unsigned char *to, |
| 280 | RSA *rsa, int padding) | 71 | RSA *rsa, int padding) |
| 281 | { | 72 | { |
| @@ -285,6 +76,13 @@ int RSA_public_encrypt(int flen, const unsigned char *from, unsigned char *to, | |||
| 285 | int RSA_private_encrypt(int flen, const unsigned char *from, unsigned char *to, | 76 | int RSA_private_encrypt(int flen, const unsigned char *from, unsigned char *to, |
| 286 | RSA *rsa, int padding) | 77 | RSA *rsa, int padding) |
| 287 | { | 78 | { |
| 79 | #ifdef OPENSSL_FIPS | ||
| 80 | if(FIPS_mode() && !(rsa->flags & RSA_FLAG_NON_FIPS_ALLOW)) | ||
| 81 | { | ||
| 82 | RSAerr(RSA_F_RSA_PRIVATE_ENCRYPT, RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); | ||
| 83 | return 0; | ||
| 84 | } | ||
| 85 | #endif | ||
| 288 | return(rsa->meth->rsa_priv_enc(flen, from, to, rsa, padding)); | 86 | return(rsa->meth->rsa_priv_enc(flen, from, to, rsa, padding)); |
| 289 | } | 87 | } |
| 290 | 88 | ||
| @@ -297,12 +95,19 @@ int RSA_private_decrypt(int flen, const unsigned char *from, unsigned char *to, | |||
| 297 | int RSA_public_decrypt(int flen, const unsigned char *from, unsigned char *to, | 95 | int RSA_public_decrypt(int flen, const unsigned char *from, unsigned char *to, |
| 298 | RSA *rsa, int padding) | 96 | RSA *rsa, int padding) |
| 299 | { | 97 | { |
| 98 | #ifdef OPENSSL_FIPS | ||
| 99 | if(FIPS_mode() && !(rsa->flags & RSA_FLAG_NON_FIPS_ALLOW)) | ||
| 100 | { | ||
| 101 | RSAerr(RSA_F_RSA_PUBLIC_DECRYPT, RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); | ||
| 102 | return 0; | ||
| 103 | } | ||
| 104 | #endif | ||
| 300 | return(rsa->meth->rsa_pub_dec(flen, from, to, rsa, padding)); | 105 | return(rsa->meth->rsa_pub_dec(flen, from, to, rsa, padding)); |
| 301 | } | 106 | } |
| 302 | 107 | ||
| 303 | int RSA_flags(const RSA *r) | 108 | int RSA_size(const RSA *r) |
| 304 | { | 109 | { |
| 305 | return((r == NULL)?0:r->meth->flags); | 110 | return(BN_num_bytes(r->n)); |
| 306 | } | 111 | } |
| 307 | 112 | ||
| 308 | void RSA_blinding_off(RSA *rsa) | 113 | void RSA_blinding_off(RSA *rsa) |
| @@ -427,48 +232,3 @@ err: | |||
| 427 | 232 | ||
| 428 | return ret; | 233 | return ret; |
| 429 | } | 234 | } |
| 430 | |||
| 431 | int RSA_memory_lock(RSA *r) | ||
| 432 | { | ||
| 433 | int i,j,k,off; | ||
| 434 | char *p; | ||
| 435 | BIGNUM *bn,**t[6],*b; | ||
| 436 | BN_ULONG *ul; | ||
| 437 | |||
| 438 | if (r->d == NULL) return(1); | ||
| 439 | t[0]= &r->d; | ||
| 440 | t[1]= &r->p; | ||
| 441 | t[2]= &r->q; | ||
| 442 | t[3]= &r->dmp1; | ||
| 443 | t[4]= &r->dmq1; | ||
| 444 | t[5]= &r->iqmp; | ||
| 445 | k=sizeof(BIGNUM)*6; | ||
| 446 | off=k/sizeof(BN_ULONG)+1; | ||
| 447 | j=1; | ||
| 448 | for (i=0; i<6; i++) | ||
| 449 | j+= (*t[i])->top; | ||
| 450 | if ((p=OPENSSL_malloc_locked((off+j)*sizeof(BN_ULONG))) == NULL) | ||
| 451 | { | ||
| 452 | RSAerr(RSA_F_RSA_MEMORY_LOCK,ERR_R_MALLOC_FAILURE); | ||
| 453 | return(0); | ||
| 454 | } | ||
| 455 | bn=(BIGNUM *)p; | ||
| 456 | ul=(BN_ULONG *)&(p[off]); | ||
| 457 | for (i=0; i<6; i++) | ||
| 458 | { | ||
| 459 | b= *(t[i]); | ||
| 460 | *(t[i])= &(bn[i]); | ||
| 461 | memcpy((char *)&(bn[i]),(char *)b,sizeof(BIGNUM)); | ||
| 462 | bn[i].flags=BN_FLG_STATIC_DATA; | ||
| 463 | bn[i].d=ul; | ||
| 464 | memcpy((char *)ul,b->d,sizeof(BN_ULONG)*b->top); | ||
| 465 | ul+=b->top; | ||
| 466 | BN_clear_free(b); | ||
| 467 | } | ||
| 468 | |||
| 469 | /* I should fix this so it can still be done */ | ||
| 470 | r->flags&= ~(RSA_FLAG_CACHE_PRIVATE|RSA_FLAG_CACHE_PUBLIC); | ||
| 471 | |||
| 472 | r->bignum_data=p; | ||
| 473 | return(1); | ||
| 474 | } | ||
diff --git a/src/lib/libcrypto/rsa/rsa_oaep.c b/src/lib/libcrypto/rsa/rsa_oaep.c index 3652677a99..4d30c9d2d3 100644 --- a/src/lib/libcrypto/rsa/rsa_oaep.c +++ b/src/lib/libcrypto/rsa/rsa_oaep.c | |||
| @@ -187,7 +187,7 @@ int PKCS1_MGF1(unsigned char *mask, long len, | |||
| 187 | int mdlen; | 187 | int mdlen; |
| 188 | 188 | ||
| 189 | EVP_MD_CTX_init(&c); | 189 | EVP_MD_CTX_init(&c); |
| 190 | mdlen = EVP_MD_size(dgst); | 190 | mdlen = M_EVP_MD_size(dgst); |
| 191 | for (i = 0; outlen < len; i++) | 191 | for (i = 0; outlen < len; i++) |
| 192 | { | 192 | { |
| 193 | cnt[0] = (unsigned char)((i >> 24) & 255); | 193 | cnt[0] = (unsigned char)((i >> 24) & 255); |
diff --git a/src/lib/libcrypto/rsa/rsa_pss.c b/src/lib/libcrypto/rsa/rsa_pss.c index e19d18c5b9..9b993aca49 100644 --- a/src/lib/libcrypto/rsa/rsa_pss.c +++ b/src/lib/libcrypto/rsa/rsa_pss.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* rsa_pss.c */ | 1 | /* rsa_pss.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2005. | 3 | * project 2005. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -81,7 +81,7 @@ int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, | |||
| 81 | EVP_MD_CTX ctx; | 81 | EVP_MD_CTX ctx; |
| 82 | unsigned char H_[EVP_MAX_MD_SIZE]; | 82 | unsigned char H_[EVP_MAX_MD_SIZE]; |
| 83 | 83 | ||
| 84 | hLen = EVP_MD_size(Hash); | 84 | hLen = M_EVP_MD_size(Hash); |
| 85 | /* | 85 | /* |
| 86 | * Negative sLen has special meanings: | 86 | * Negative sLen has special meanings: |
| 87 | * -1 sLen == hLen | 87 | * -1 sLen == hLen |
| @@ -176,7 +176,7 @@ int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, | |||
| 176 | unsigned char *H, *salt = NULL, *p; | 176 | unsigned char *H, *salt = NULL, *p; |
| 177 | EVP_MD_CTX ctx; | 177 | EVP_MD_CTX ctx; |
| 178 | 178 | ||
| 179 | hLen = EVP_MD_size(Hash); | 179 | hLen = M_EVP_MD_size(Hash); |
| 180 | /* | 180 | /* |
| 181 | * Negative sLen has special meanings: | 181 | * Negative sLen has special meanings: |
| 182 | * -1 sLen == hLen | 182 | * -1 sLen == hLen |
diff --git a/src/lib/libcrypto/rsa/rsa_sign.c b/src/lib/libcrypto/rsa/rsa_sign.c index 71aabeea1b..5488c06f6d 100644 --- a/src/lib/libcrypto/rsa/rsa_sign.c +++ b/src/lib/libcrypto/rsa/rsa_sign.c | |||
| @@ -90,6 +90,14 @@ int RSA_sign(int type, const unsigned char *m, unsigned int m_len, | |||
| 90 | i = SSL_SIG_LENGTH; | 90 | i = SSL_SIG_LENGTH; |
| 91 | s = m; | 91 | s = m; |
| 92 | } else { | 92 | } else { |
| 93 | /* NB: in FIPS mode block anything that isn't a TLS signature */ | ||
| 94 | #ifdef OPENSSL_FIPS | ||
| 95 | if(FIPS_mode() && !(rsa->flags & RSA_FLAG_NON_FIPS_ALLOW)) | ||
| 96 | { | ||
| 97 | RSAerr(RSA_F_RSA_SIGN, RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); | ||
| 98 | return 0; | ||
| 99 | } | ||
| 100 | #endif | ||
| 93 | sig.algor= &algor; | 101 | sig.algor= &algor; |
| 94 | sig.algor->algorithm=OBJ_nid2obj(type); | 102 | sig.algor->algorithm=OBJ_nid2obj(type); |
| 95 | if (sig.algor->algorithm == NULL) | 103 | if (sig.algor->algorithm == NULL) |
| @@ -167,10 +175,22 @@ int RSA_verify(int dtype, const unsigned char *m, unsigned int m_len, | |||
| 167 | RSAerr(RSA_F_RSA_VERIFY,ERR_R_MALLOC_FAILURE); | 175 | RSAerr(RSA_F_RSA_VERIFY,ERR_R_MALLOC_FAILURE); |
| 168 | goto err; | 176 | goto err; |
| 169 | } | 177 | } |
| 170 | if((dtype == NID_md5_sha1) && (m_len != SSL_SIG_LENGTH) ) { | 178 | if(dtype == NID_md5_sha1) |
| 179 | { | ||
| 180 | if (m_len != SSL_SIG_LENGTH) | ||
| 181 | { | ||
| 171 | RSAerr(RSA_F_RSA_VERIFY,RSA_R_INVALID_MESSAGE_LENGTH); | 182 | RSAerr(RSA_F_RSA_VERIFY,RSA_R_INVALID_MESSAGE_LENGTH); |
| 172 | goto err; | 183 | goto err; |
| 173 | } | 184 | } |
| 185 | } | ||
| 186 | /* NB: in FIPS mode block anything that isn't a TLS signature */ | ||
| 187 | #ifdef OPENSSL_FIPS | ||
| 188 | else if(FIPS_mode() && !(rsa->flags & RSA_FLAG_NON_FIPS_ALLOW)) | ||
| 189 | { | ||
| 190 | RSAerr(RSA_F_RSA_VERIFY, RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE); | ||
| 191 | return 0; | ||
| 192 | } | ||
| 193 | #endif | ||
| 174 | i=RSA_public_decrypt((int)siglen,sigbuf,s,rsa,RSA_PKCS1_PADDING); | 194 | i=RSA_public_decrypt((int)siglen,sigbuf,s,rsa,RSA_PKCS1_PADDING); |
| 175 | 195 | ||
| 176 | if (i <= 0) goto err; | 196 | if (i <= 0) goto err; |
diff --git a/src/lib/libcrypto/rsa/rsa_ssl.c b/src/lib/libcrypto/rsa/rsa_ssl.c index ea72629494..cfeff15bc9 100644 --- a/src/lib/libcrypto/rsa/rsa_ssl.c +++ b/src/lib/libcrypto/rsa/rsa_ssl.c | |||
| @@ -130,7 +130,7 @@ int RSA_padding_check_SSLv23(unsigned char *to, int tlen, | |||
| 130 | RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_NULL_BEFORE_BLOCK_MISSING); | 130 | RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_NULL_BEFORE_BLOCK_MISSING); |
| 131 | return(-1); | 131 | return(-1); |
| 132 | } | 132 | } |
| 133 | for (k= -8; k<0; k++) | 133 | for (k = -9; k<-1; k++) |
| 134 | { | 134 | { |
| 135 | if (p[k] != 0x03) break; | 135 | if (p[k] != 0x03) break; |
| 136 | } | 136 | } |
diff --git a/src/lib/libcrypto/rsa/rsa_x931.c b/src/lib/libcrypto/rsa/rsa_x931.c index e918654176..21548e37ed 100644 --- a/src/lib/libcrypto/rsa/rsa_x931.c +++ b/src/lib/libcrypto/rsa/rsa_x931.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* rsa_x931.c */ | 1 | /* rsa_x931.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2005. | 3 | * project 2005. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/sha/asm/sha1-586.pl b/src/lib/libcrypto/sha/asm/sha1-586.pl index 0b4dab2bd5..a787dd37da 100644 --- a/src/lib/libcrypto/sha/asm/sha1-586.pl +++ b/src/lib/libcrypto/sha/asm/sha1-586.pl | |||
| @@ -149,7 +149,7 @@ sub BODY_40_59 | |||
| 149 | &add($f,$e); # f+=ROTATE(a,5) | 149 | &add($f,$e); # f+=ROTATE(a,5) |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | &function_begin("sha1_block_data_order",16); | 152 | &function_begin("sha1_block_data_order"); |
| 153 | &mov($tmp1,&wparam(0)); # SHA_CTX *c | 153 | &mov($tmp1,&wparam(0)); # SHA_CTX *c |
| 154 | &mov($T,&wparam(1)); # const void *input | 154 | &mov($T,&wparam(1)); # const void *input |
| 155 | &mov($A,&wparam(2)); # size_t num | 155 | &mov($A,&wparam(2)); # size_t num |
diff --git a/src/lib/libcrypto/sha/sha.h b/src/lib/libcrypto/sha/sha.h index eed44d7f94..47a2c29f66 100644 --- a/src/lib/libcrypto/sha/sha.h +++ b/src/lib/libcrypto/sha/sha.h | |||
| @@ -106,6 +106,9 @@ typedef struct SHAstate_st | |||
| 106 | } SHA_CTX; | 106 | } SHA_CTX; |
| 107 | 107 | ||
| 108 | #ifndef OPENSSL_NO_SHA0 | 108 | #ifndef OPENSSL_NO_SHA0 |
| 109 | #ifdef OPENSSL_FIPS | ||
| 110 | int private_SHA_Init(SHA_CTX *c); | ||
| 111 | #endif | ||
| 109 | int SHA_Init(SHA_CTX *c); | 112 | int SHA_Init(SHA_CTX *c); |
| 110 | int SHA_Update(SHA_CTX *c, const void *data, size_t len); | 113 | int SHA_Update(SHA_CTX *c, const void *data, size_t len); |
| 111 | int SHA_Final(unsigned char *md, SHA_CTX *c); | 114 | int SHA_Final(unsigned char *md, SHA_CTX *c); |
diff --git a/src/lib/libcrypto/sha/sha1_one.c b/src/lib/libcrypto/sha/sha1_one.c index 7c65b60276..4831174198 100644 --- a/src/lib/libcrypto/sha/sha1_one.c +++ b/src/lib/libcrypto/sha/sha1_one.c | |||
| @@ -61,7 +61,7 @@ | |||
| 61 | #include <openssl/sha.h> | 61 | #include <openssl/sha.h> |
| 62 | #include <openssl/crypto.h> | 62 | #include <openssl/crypto.h> |
| 63 | 63 | ||
| 64 | #ifndef OPENSSL_NO_SHA1 | 64 | #if !defined(OPENSSL_NO_SHA1) |
| 65 | unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md) | 65 | unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md) |
| 66 | { | 66 | { |
| 67 | SHA_CTX c; | 67 | SHA_CTX c; |
diff --git a/src/lib/libcrypto/sha/sha1dgst.c b/src/lib/libcrypto/sha/sha1dgst.c index 50d1925cde..d31f0781a0 100644 --- a/src/lib/libcrypto/sha/sha1dgst.c +++ b/src/lib/libcrypto/sha/sha1dgst.c | |||
| @@ -63,6 +63,10 @@ | |||
| 63 | #define SHA_1 | 63 | #define SHA_1 |
| 64 | 64 | ||
| 65 | #include <openssl/opensslv.h> | 65 | #include <openssl/opensslv.h> |
| 66 | #ifdef OPENSSL_FIPS | ||
| 67 | #include <openssl/fips.h> | ||
| 68 | #endif | ||
| 69 | |||
| 66 | 70 | ||
| 67 | const char SHA1_version[]="SHA1" OPENSSL_VERSION_PTEXT; | 71 | const char SHA1_version[]="SHA1" OPENSSL_VERSION_PTEXT; |
| 68 | 72 | ||
diff --git a/src/lib/libcrypto/sha/sha256.c b/src/lib/libcrypto/sha/sha256.c index 867f90cc97..3256a83e98 100644 --- a/src/lib/libcrypto/sha/sha256.c +++ b/src/lib/libcrypto/sha/sha256.c | |||
| @@ -12,12 +12,19 @@ | |||
| 12 | 12 | ||
| 13 | #include <openssl/crypto.h> | 13 | #include <openssl/crypto.h> |
| 14 | #include <openssl/sha.h> | 14 | #include <openssl/sha.h> |
| 15 | #ifdef OPENSSL_FIPS | ||
| 16 | #include <openssl/fips.h> | ||
| 17 | #endif | ||
| 18 | |||
| 15 | #include <openssl/opensslv.h> | 19 | #include <openssl/opensslv.h> |
| 16 | 20 | ||
| 17 | const char SHA256_version[]="SHA-256" OPENSSL_VERSION_PTEXT; | 21 | const char SHA256_version[]="SHA-256" OPENSSL_VERSION_PTEXT; |
| 18 | 22 | ||
| 19 | int SHA224_Init (SHA256_CTX *c) | 23 | int SHA224_Init (SHA256_CTX *c) |
| 20 | { | 24 | { |
| 25 | #ifdef OPENSSL_FIPS | ||
| 26 | FIPS_selftest_check(); | ||
| 27 | #endif | ||
| 21 | c->h[0]=0xc1059ed8UL; c->h[1]=0x367cd507UL; | 28 | c->h[0]=0xc1059ed8UL; c->h[1]=0x367cd507UL; |
| 22 | c->h[2]=0x3070dd17UL; c->h[3]=0xf70e5939UL; | 29 | c->h[2]=0x3070dd17UL; c->h[3]=0xf70e5939UL; |
| 23 | c->h[4]=0xffc00b31UL; c->h[5]=0x68581511UL; | 30 | c->h[4]=0xffc00b31UL; c->h[5]=0x68581511UL; |
| @@ -29,6 +36,9 @@ int SHA224_Init (SHA256_CTX *c) | |||
| 29 | 36 | ||
| 30 | int SHA256_Init (SHA256_CTX *c) | 37 | int SHA256_Init (SHA256_CTX *c) |
| 31 | { | 38 | { |
| 39 | #ifdef OPENSSL_FIPS | ||
| 40 | FIPS_selftest_check(); | ||
| 41 | #endif | ||
| 32 | c->h[0]=0x6a09e667UL; c->h[1]=0xbb67ae85UL; | 42 | c->h[0]=0x6a09e667UL; c->h[1]=0xbb67ae85UL; |
| 33 | c->h[2]=0x3c6ef372UL; c->h[3]=0xa54ff53aUL; | 43 | c->h[2]=0x3c6ef372UL; c->h[3]=0xa54ff53aUL; |
| 34 | c->h[4]=0x510e527fUL; c->h[5]=0x9b05688cUL; | 44 | c->h[4]=0x510e527fUL; c->h[5]=0x9b05688cUL; |
diff --git a/src/lib/libcrypto/sha/sha512.c b/src/lib/libcrypto/sha/sha512.c index 987fc07c99..f5ed468b85 100644 --- a/src/lib/libcrypto/sha/sha512.c +++ b/src/lib/libcrypto/sha/sha512.c | |||
| @@ -5,6 +5,10 @@ | |||
| 5 | * ==================================================================== | 5 | * ==================================================================== |
| 6 | */ | 6 | */ |
| 7 | #include <openssl/opensslconf.h> | 7 | #include <openssl/opensslconf.h> |
| 8 | #ifdef OPENSSL_FIPS | ||
| 9 | #include <openssl/fips.h> | ||
| 10 | #endif | ||
| 11 | |||
| 8 | #if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA512) | 12 | #if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA512) |
| 9 | /* | 13 | /* |
| 10 | * IMPLEMENTATION NOTES. | 14 | * IMPLEMENTATION NOTES. |
| @@ -61,6 +65,9 @@ const char SHA512_version[]="SHA-512" OPENSSL_VERSION_PTEXT; | |||
| 61 | 65 | ||
| 62 | int SHA384_Init (SHA512_CTX *c) | 66 | int SHA384_Init (SHA512_CTX *c) |
| 63 | { | 67 | { |
| 68 | #ifdef OPENSSL_FIPS | ||
| 69 | FIPS_selftest_check(); | ||
| 70 | #endif | ||
| 64 | c->h[0]=U64(0xcbbb9d5dc1059ed8); | 71 | c->h[0]=U64(0xcbbb9d5dc1059ed8); |
| 65 | c->h[1]=U64(0x629a292a367cd507); | 72 | c->h[1]=U64(0x629a292a367cd507); |
| 66 | c->h[2]=U64(0x9159015a3070dd17); | 73 | c->h[2]=U64(0x9159015a3070dd17); |
| @@ -76,6 +83,9 @@ int SHA384_Init (SHA512_CTX *c) | |||
| 76 | 83 | ||
| 77 | int SHA512_Init (SHA512_CTX *c) | 84 | int SHA512_Init (SHA512_CTX *c) |
| 78 | { | 85 | { |
| 86 | #ifdef OPENSSL_FIPS | ||
| 87 | FIPS_selftest_check(); | ||
| 88 | #endif | ||
| 79 | c->h[0]=U64(0x6a09e667f3bcc908); | 89 | c->h[0]=U64(0x6a09e667f3bcc908); |
| 80 | c->h[1]=U64(0xbb67ae8584caa73b); | 90 | c->h[1]=U64(0xbb67ae8584caa73b); |
| 81 | c->h[2]=U64(0x3c6ef372fe94f82b); | 91 | c->h[2]=U64(0x3c6ef372fe94f82b); |
| @@ -327,7 +337,7 @@ static const SHA_LONG64 K512[80] = { | |||
| 327 | ((SHA_LONG64)hi)<<32|lo; }) | 337 | ((SHA_LONG64)hi)<<32|lo; }) |
| 328 | # else | 338 | # else |
| 329 | # define PULL64(x) ({ const unsigned int *p=(const unsigned int *)(&(x));\ | 339 | # define PULL64(x) ({ const unsigned int *p=(const unsigned int *)(&(x));\ |
| 330 | unsigned int hi=p[0],lo=p[1]; \ | 340 | unsigned int hi=p[0],lo=p[1]; \ |
| 331 | asm ("bswapl %0; bswapl %1;" \ | 341 | asm ("bswapl %0; bswapl %1;" \ |
| 332 | : "=r"(lo),"=r"(hi) \ | 342 | : "=r"(lo),"=r"(hi) \ |
| 333 | : "0"(lo),"1"(hi)); \ | 343 | : "0"(lo),"1"(hi)); \ |
diff --git a/src/lib/libcrypto/sha/sha_locl.h b/src/lib/libcrypto/sha/sha_locl.h index e37e5726e3..da46ddfe79 100644 --- a/src/lib/libcrypto/sha/sha_locl.h +++ b/src/lib/libcrypto/sha/sha_locl.h | |||
| @@ -122,8 +122,15 @@ void sha1_block_data_order (SHA_CTX *c, const void *p,size_t num); | |||
| 122 | #define INIT_DATA_h3 0x10325476UL | 122 | #define INIT_DATA_h3 0x10325476UL |
| 123 | #define INIT_DATA_h4 0xc3d2e1f0UL | 123 | #define INIT_DATA_h4 0xc3d2e1f0UL |
| 124 | 124 | ||
| 125 | #if defined(SHA_0) && defined(OPENSSL_FIPS) | ||
| 126 | FIPS_NON_FIPS_MD_Init(SHA) | ||
| 127 | #else | ||
| 125 | int HASH_INIT (SHA_CTX *c) | 128 | int HASH_INIT (SHA_CTX *c) |
| 129 | #endif | ||
| 126 | { | 130 | { |
| 131 | #if defined(SHA_1) && defined(OPENSSL_FIPS) | ||
| 132 | FIPS_selftest_check(); | ||
| 133 | #endif | ||
| 127 | c->h0=INIT_DATA_h0; | 134 | c->h0=INIT_DATA_h0; |
| 128 | c->h1=INIT_DATA_h1; | 135 | c->h1=INIT_DATA_h1; |
| 129 | c->h2=INIT_DATA_h2; | 136 | c->h2=INIT_DATA_h2; |
diff --git a/src/lib/libcrypto/stack/safestack.h b/src/lib/libcrypto/stack/safestack.h index 78cc485e6d..40b17902e0 100644 --- a/src/lib/libcrypto/stack/safestack.h +++ b/src/lib/libcrypto/stack/safestack.h | |||
| @@ -986,6 +986,50 @@ STACK_OF(type) \ | |||
| 986 | #define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st)) | 986 | #define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st)) |
| 987 | #define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st)) | 987 | #define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st)) |
| 988 | 988 | ||
| 989 | #define sk_MIME_HEADER_new(st) SKM_sk_new(MIME_HEADER, (st)) | ||
| 990 | #define sk_MIME_HEADER_new_null() SKM_sk_new_null(MIME_HEADER) | ||
| 991 | #define sk_MIME_HEADER_free(st) SKM_sk_free(MIME_HEADER, (st)) | ||
| 992 | #define sk_MIME_HEADER_num(st) SKM_sk_num(MIME_HEADER, (st)) | ||
| 993 | #define sk_MIME_HEADER_value(st, i) SKM_sk_value(MIME_HEADER, (st), (i)) | ||
| 994 | #define sk_MIME_HEADER_set(st, i, val) SKM_sk_set(MIME_HEADER, (st), (i), (val)) | ||
| 995 | #define sk_MIME_HEADER_zero(st) SKM_sk_zero(MIME_HEADER, (st)) | ||
| 996 | #define sk_MIME_HEADER_push(st, val) SKM_sk_push(MIME_HEADER, (st), (val)) | ||
| 997 | #define sk_MIME_HEADER_unshift(st, val) SKM_sk_unshift(MIME_HEADER, (st), (val)) | ||
| 998 | #define sk_MIME_HEADER_find(st, val) SKM_sk_find(MIME_HEADER, (st), (val)) | ||
| 999 | #define sk_MIME_HEADER_find_ex(st, val) SKM_sk_find_ex(MIME_HEADER, (st), (val)) | ||
| 1000 | #define sk_MIME_HEADER_delete(st, i) SKM_sk_delete(MIME_HEADER, (st), (i)) | ||
| 1001 | #define sk_MIME_HEADER_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_HEADER, (st), (ptr)) | ||
| 1002 | #define sk_MIME_HEADER_insert(st, val, i) SKM_sk_insert(MIME_HEADER, (st), (val), (i)) | ||
| 1003 | #define sk_MIME_HEADER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_HEADER, (st), (cmp)) | ||
| 1004 | #define sk_MIME_HEADER_dup(st) SKM_sk_dup(MIME_HEADER, st) | ||
| 1005 | #define sk_MIME_HEADER_pop_free(st, free_func) SKM_sk_pop_free(MIME_HEADER, (st), (free_func)) | ||
| 1006 | #define sk_MIME_HEADER_shift(st) SKM_sk_shift(MIME_HEADER, (st)) | ||
| 1007 | #define sk_MIME_HEADER_pop(st) SKM_sk_pop(MIME_HEADER, (st)) | ||
| 1008 | #define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st)) | ||
| 1009 | #define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st)) | ||
| 1010 | |||
| 1011 | #define sk_MIME_PARAM_new(st) SKM_sk_new(MIME_PARAM, (st)) | ||
| 1012 | #define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM) | ||
| 1013 | #define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st)) | ||
| 1014 | #define sk_MIME_PARAM_num(st) SKM_sk_num(MIME_PARAM, (st)) | ||
| 1015 | #define sk_MIME_PARAM_value(st, i) SKM_sk_value(MIME_PARAM, (st), (i)) | ||
| 1016 | #define sk_MIME_PARAM_set(st, i, val) SKM_sk_set(MIME_PARAM, (st), (i), (val)) | ||
| 1017 | #define sk_MIME_PARAM_zero(st) SKM_sk_zero(MIME_PARAM, (st)) | ||
| 1018 | #define sk_MIME_PARAM_push(st, val) SKM_sk_push(MIME_PARAM, (st), (val)) | ||
| 1019 | #define sk_MIME_PARAM_unshift(st, val) SKM_sk_unshift(MIME_PARAM, (st), (val)) | ||
| 1020 | #define sk_MIME_PARAM_find(st, val) SKM_sk_find(MIME_PARAM, (st), (val)) | ||
| 1021 | #define sk_MIME_PARAM_find_ex(st, val) SKM_sk_find_ex(MIME_PARAM, (st), (val)) | ||
| 1022 | #define sk_MIME_PARAM_delete(st, i) SKM_sk_delete(MIME_PARAM, (st), (i)) | ||
| 1023 | #define sk_MIME_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_PARAM, (st), (ptr)) | ||
| 1024 | #define sk_MIME_PARAM_insert(st, val, i) SKM_sk_insert(MIME_PARAM, (st), (val), (i)) | ||
| 1025 | #define sk_MIME_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_PARAM, (st), (cmp)) | ||
| 1026 | #define sk_MIME_PARAM_dup(st) SKM_sk_dup(MIME_PARAM, st) | ||
| 1027 | #define sk_MIME_PARAM_pop_free(st, free_func) SKM_sk_pop_free(MIME_PARAM, (st), (free_func)) | ||
| 1028 | #define sk_MIME_PARAM_shift(st) SKM_sk_shift(MIME_PARAM, (st)) | ||
| 1029 | #define sk_MIME_PARAM_pop(st) SKM_sk_pop(MIME_PARAM, (st)) | ||
| 1030 | #define sk_MIME_PARAM_sort(st) SKM_sk_sort(MIME_PARAM, (st)) | ||
| 1031 | #define sk_MIME_PARAM_is_sorted(st) SKM_sk_is_sorted(MIME_PARAM, (st)) | ||
| 1032 | |||
| 989 | #define sk_MIME_PARAM_new(st) SKM_sk_new(MIME_PARAM, (st)) | 1033 | #define sk_MIME_PARAM_new(st) SKM_sk_new(MIME_PARAM, (st)) |
| 990 | #define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM) | 1034 | #define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM) |
| 991 | #define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st)) | 1035 | #define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st)) |
diff --git a/src/lib/libcrypto/ui/ui_openssl.c b/src/lib/libcrypto/ui/ui_openssl.c index 1f23a45a33..ef930bf247 100644 --- a/src/lib/libcrypto/ui/ui_openssl.c +++ b/src/lib/libcrypto/ui/ui_openssl.c | |||
| @@ -677,6 +677,8 @@ static int noecho_fgets(char *buf, int size, FILE *tty) | |||
| 677 | size--; | 677 | size--; |
| 678 | #ifdef WIN16TTY | 678 | #ifdef WIN16TTY |
| 679 | i=_inchar(); | 679 | i=_inchar(); |
| 680 | #elif defined(_WIN32) | ||
| 681 | i=_getch(); | ||
| 680 | #else | 682 | #else |
| 681 | i=getch(); | 683 | i=getch(); |
| 682 | #endif | 684 | #endif |
diff --git a/src/lib/libcrypto/util/mkerr.pl b/src/lib/libcrypto/util/mkerr.pl index 53e14ab4df..554bebb159 100644 --- a/src/lib/libcrypto/util/mkerr.pl +++ b/src/lib/libcrypto/util/mkerr.pl | |||
| @@ -44,7 +44,8 @@ while (@ARGV) { | |||
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | if($recurse) { | 46 | if($recurse) { |
| 47 | @source = (<crypto/*.c>, <crypto/*/*.c>, <ssl/*.c>); | 47 | @source = ( <crypto/*.c>, <crypto/*/*.c>, <ssl/*.c>, |
| 48 | <fips/*.c>, <fips/*/*.c>); | ||
| 48 | } else { | 49 | } else { |
| 49 | @source = @ARGV; | 50 | @source = @ARGV; |
| 50 | } | 51 | } |
diff --git a/src/lib/libcrypto/x509/by_dir.c b/src/lib/libcrypto/x509/by_dir.c index 37f9a48206..341e0ba6a4 100644 --- a/src/lib/libcrypto/x509/by_dir.c +++ b/src/lib/libcrypto/x509/by_dir.c | |||
| @@ -74,6 +74,10 @@ | |||
| 74 | #include <openssl/lhash.h> | 74 | #include <openssl/lhash.h> |
| 75 | #include <openssl/x509.h> | 75 | #include <openssl/x509.h> |
| 76 | 76 | ||
| 77 | #ifdef _WIN32 | ||
| 78 | #define stat _stat | ||
| 79 | #endif | ||
| 80 | |||
| 77 | typedef struct lookup_dir_st | 81 | typedef struct lookup_dir_st |
| 78 | { | 82 | { |
| 79 | BUF_MEM *buffer; | 83 | BUF_MEM *buffer; |
diff --git a/src/lib/libcrypto/x509/x509_att.c b/src/lib/libcrypto/x509/x509_att.c index 511b49d589..98460e8921 100644 --- a/src/lib/libcrypto/x509/x509_att.c +++ b/src/lib/libcrypto/x509/x509_att.c | |||
| @@ -245,7 +245,7 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, | |||
| 245 | goto err; | 245 | goto err; |
| 246 | if (!X509_ATTRIBUTE_set1_data(ret,atrtype,data,len)) | 246 | if (!X509_ATTRIBUTE_set1_data(ret,atrtype,data,len)) |
| 247 | goto err; | 247 | goto err; |
| 248 | 248 | ||
| 249 | if ((attr != NULL) && (*attr == NULL)) *attr=ret; | 249 | if ((attr != NULL) && (*attr == NULL)) *attr=ret; |
| 250 | return(ret); | 250 | return(ret); |
| 251 | err: | 251 | err: |
| @@ -302,8 +302,15 @@ int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *dat | |||
| 302 | atype = attrtype; | 302 | atype = attrtype; |
| 303 | } | 303 | } |
| 304 | if(!(attr->value.set = sk_ASN1_TYPE_new_null())) goto err; | 304 | if(!(attr->value.set = sk_ASN1_TYPE_new_null())) goto err; |
| 305 | attr->single = 0; | ||
| 306 | /* This is a bit naughty because the attribute should really have | ||
| 307 | * at least one value but some types use and zero length SET and | ||
| 308 | * require this. | ||
| 309 | */ | ||
| 310 | if (attrtype == 0) | ||
| 311 | return 1; | ||
| 305 | if(!(ttmp = ASN1_TYPE_new())) goto err; | 312 | if(!(ttmp = ASN1_TYPE_new())) goto err; |
| 306 | if (len == -1) | 313 | if ((len == -1) && !(attrtype & MBSTRING_FLAG)) |
| 307 | { | 314 | { |
| 308 | if (!ASN1_TYPE_set1(ttmp, attrtype, data)) | 315 | if (!ASN1_TYPE_set1(ttmp, attrtype, data)) |
| 309 | goto err; | 316 | goto err; |
| @@ -311,7 +318,6 @@ int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *dat | |||
| 311 | else | 318 | else |
| 312 | ASN1_TYPE_set(ttmp, atype, stmp); | 319 | ASN1_TYPE_set(ttmp, atype, stmp); |
| 313 | if(!sk_ASN1_TYPE_push(attr->value.set, ttmp)) goto err; | 320 | if(!sk_ASN1_TYPE_push(attr->value.set, ttmp)) goto err; |
| 314 | attr->single = 0; | ||
| 315 | return 1; | 321 | return 1; |
| 316 | err: | 322 | err: |
| 317 | X509err(X509_F_X509_ATTRIBUTE_SET1_DATA, ERR_R_MALLOC_FAILURE); | 323 | X509err(X509_F_X509_ATTRIBUTE_SET1_DATA, ERR_R_MALLOC_FAILURE); |
diff --git a/src/lib/libcrypto/x509/x509_cmp.c b/src/lib/libcrypto/x509/x509_cmp.c index 0d6bc653b2..e4c682fc44 100644 --- a/src/lib/libcrypto/x509/x509_cmp.c +++ b/src/lib/libcrypto/x509/x509_cmp.c | |||
| @@ -322,10 +322,16 @@ unsigned long X509_NAME_hash(X509_NAME *x) | |||
| 322 | { | 322 | { |
| 323 | unsigned long ret=0; | 323 | unsigned long ret=0; |
| 324 | unsigned char md[16]; | 324 | unsigned char md[16]; |
| 325 | EVP_MD_CTX md_ctx; | ||
| 325 | 326 | ||
| 326 | /* Make sure X509_NAME structure contains valid cached encoding */ | 327 | /* Make sure X509_NAME structure contains valid cached encoding */ |
| 327 | i2d_X509_NAME(x,NULL); | 328 | i2d_X509_NAME(x,NULL); |
| 328 | EVP_Digest(x->bytes->data, x->bytes->length, md, NULL, EVP_md5(), NULL); | 329 | EVP_MD_CTX_init(&md_ctx); |
| 330 | EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); | ||
| 331 | EVP_DigestInit_ex(&md_ctx, EVP_md5(), NULL); | ||
| 332 | EVP_DigestUpdate(&md_ctx, x->bytes->data, x->bytes->length); | ||
| 333 | EVP_DigestFinal_ex(&md_ctx,md,NULL); | ||
| 334 | EVP_MD_CTX_cleanup(&md_ctx); | ||
| 329 | 335 | ||
| 330 | ret=( ((unsigned long)md[0] )|((unsigned long)md[1]<<8L)| | 336 | ret=( ((unsigned long)md[0] )|((unsigned long)md[1]<<8L)| |
| 331 | ((unsigned long)md[2]<<16L)|((unsigned long)md[3]<<24L) | 337 | ((unsigned long)md[2]<<16L)|((unsigned long)md[3]<<24L) |
diff --git a/src/lib/libcrypto/x509/x509_trs.c b/src/lib/libcrypto/x509/x509_trs.c index 9c84a59d52..ed18700585 100644 --- a/src/lib/libcrypto/x509/x509_trs.c +++ b/src/lib/libcrypto/x509/x509_trs.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* x509_trs.c */ | 1 | /* x509_trs.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509/x509_vfy.c b/src/lib/libcrypto/x509/x509_vfy.c index 9a62ebcf67..336c40ddd7 100644 --- a/src/lib/libcrypto/x509/x509_vfy.c +++ b/src/lib/libcrypto/x509/x509_vfy.c | |||
| @@ -394,7 +394,7 @@ static int check_chain_extensions(X509_STORE_CTX *ctx) | |||
| 394 | #ifdef OPENSSL_NO_CHAIN_VERIFY | 394 | #ifdef OPENSSL_NO_CHAIN_VERIFY |
| 395 | return 1; | 395 | return 1; |
| 396 | #else | 396 | #else |
| 397 | int i, ok=0, must_be_ca; | 397 | int i, ok=0, must_be_ca, plen = 0; |
| 398 | X509 *x; | 398 | X509 *x; |
| 399 | int (*cb)(int xok,X509_STORE_CTX *xctx); | 399 | int (*cb)(int xok,X509_STORE_CTX *xctx); |
| 400 | int proxy_path_length = 0; | 400 | int proxy_path_length = 0; |
| @@ -495,9 +495,10 @@ static int check_chain_extensions(X509_STORE_CTX *ctx) | |||
| 495 | if (!ok) goto end; | 495 | if (!ok) goto end; |
| 496 | } | 496 | } |
| 497 | } | 497 | } |
| 498 | /* Check pathlen */ | 498 | /* Check pathlen if not self issued */ |
| 499 | if ((i > 1) && (x->ex_pathlen != -1) | 499 | if ((i > 1) && !(x->ex_flags & EXFLAG_SI) |
| 500 | && (i > (x->ex_pathlen + proxy_path_length + 1))) | 500 | && (x->ex_pathlen != -1) |
| 501 | && (plen > (x->ex_pathlen + proxy_path_length + 1))) | ||
| 501 | { | 502 | { |
| 502 | ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED; | 503 | ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED; |
| 503 | ctx->error_depth = i; | 504 | ctx->error_depth = i; |
| @@ -505,6 +506,9 @@ static int check_chain_extensions(X509_STORE_CTX *ctx) | |||
| 505 | ok=cb(0,ctx); | 506 | ok=cb(0,ctx); |
| 506 | if (!ok) goto end; | 507 | if (!ok) goto end; |
| 507 | } | 508 | } |
| 509 | /* Increment path length if not self issued */ | ||
| 510 | if (!(x->ex_flags & EXFLAG_SI)) | ||
| 511 | plen++; | ||
| 508 | /* If this certificate is a proxy certificate, the next | 512 | /* If this certificate is a proxy certificate, the next |
| 509 | certificate must be another proxy certificate or a EE | 513 | certificate must be another proxy certificate or a EE |
| 510 | certificate. If not, the next certificate must be a | 514 | certificate. If not, the next certificate must be a |
diff --git a/src/lib/libcrypto/x509/x509_vpm.c b/src/lib/libcrypto/x509/x509_vpm.c index e9db6d62a7..c92e65936f 100644 --- a/src/lib/libcrypto/x509/x509_vpm.c +++ b/src/lib/libcrypto/x509/x509_vpm.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* x509_vpm.c */ | 1 | /* x509_vpm.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2004. | 3 | * project 2004. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509/x509cset.c b/src/lib/libcrypto/x509/x509cset.c index 9d1646d5c8..7f4004b291 100644 --- a/src/lib/libcrypto/x509/x509cset.c +++ b/src/lib/libcrypto/x509/x509cset.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* crypto/x509/x509cset.c */ | 1 | /* crypto/x509/x509cset.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509/x509spki.c b/src/lib/libcrypto/x509/x509spki.c index ed868b838e..02a203d72c 100644 --- a/src/lib/libcrypto/x509/x509spki.c +++ b/src/lib/libcrypto/x509/x509spki.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* x509spki.c */ | 1 | /* x509spki.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/ext_dat.h b/src/lib/libcrypto/x509v3/ext_dat.h index 5c063ac65d..3eaec46f8a 100644 --- a/src/lib/libcrypto/x509v3/ext_dat.h +++ b/src/lib/libcrypto/x509v3/ext_dat.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* ext_dat.h */ | 1 | /* ext_dat.h */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/pcy_cache.c b/src/lib/libcrypto/x509v3/pcy_cache.c index c18beb89f5..1030931b71 100644 --- a/src/lib/libcrypto/x509v3/pcy_cache.c +++ b/src/lib/libcrypto/x509v3/pcy_cache.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pcy_cache.c */ | 1 | /* pcy_cache.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2004. | 3 | * project 2004. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/pcy_data.c b/src/lib/libcrypto/x509v3/pcy_data.c index 614d2b4935..fb392b901f 100644 --- a/src/lib/libcrypto/x509v3/pcy_data.c +++ b/src/lib/libcrypto/x509v3/pcy_data.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pcy_data.c */ | 1 | /* pcy_data.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2004. | 3 | * project 2004. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -87,6 +87,12 @@ X509_POLICY_DATA *policy_data_new(POLICYINFO *policy, ASN1_OBJECT *id, int crit) | |||
| 87 | X509_POLICY_DATA *ret; | 87 | X509_POLICY_DATA *ret; |
| 88 | if (!policy && !id) | 88 | if (!policy && !id) |
| 89 | return NULL; | 89 | return NULL; |
| 90 | if (id) | ||
| 91 | { | ||
| 92 | id = OBJ_dup(id); | ||
| 93 | if (!id) | ||
| 94 | return NULL; | ||
| 95 | } | ||
| 90 | ret = OPENSSL_malloc(sizeof(X509_POLICY_DATA)); | 96 | ret = OPENSSL_malloc(sizeof(X509_POLICY_DATA)); |
| 91 | if (!ret) | 97 | if (!ret) |
| 92 | return NULL; | 98 | return NULL; |
| @@ -94,6 +100,8 @@ X509_POLICY_DATA *policy_data_new(POLICYINFO *policy, ASN1_OBJECT *id, int crit) | |||
| 94 | if (!ret->expected_policy_set) | 100 | if (!ret->expected_policy_set) |
| 95 | { | 101 | { |
| 96 | OPENSSL_free(ret); | 102 | OPENSSL_free(ret); |
| 103 | if (id) | ||
| 104 | ASN1_OBJECT_free(id); | ||
| 97 | return NULL; | 105 | return NULL; |
| 98 | } | 106 | } |
| 99 | 107 | ||
diff --git a/src/lib/libcrypto/x509v3/pcy_int.h b/src/lib/libcrypto/x509v3/pcy_int.h index ba62a209da..3780de4fcd 100644 --- a/src/lib/libcrypto/x509v3/pcy_int.h +++ b/src/lib/libcrypto/x509v3/pcy_int.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pcy_int.h */ | 1 | /* pcy_int.h */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2004. | 3 | * project 2004. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/pcy_lib.c b/src/lib/libcrypto/x509v3/pcy_lib.c index dae4840bc5..93bfd92703 100644 --- a/src/lib/libcrypto/x509v3/pcy_lib.c +++ b/src/lib/libcrypto/x509v3/pcy_lib.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pcy_lib.c */ | 1 | /* pcy_lib.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2004. | 3 | * project 2004. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/pcy_map.c b/src/lib/libcrypto/x509v3/pcy_map.c index 35221e8ba8..f28796e6d4 100644 --- a/src/lib/libcrypto/x509v3/pcy_map.c +++ b/src/lib/libcrypto/x509v3/pcy_map.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pcy_map.c */ | 1 | /* pcy_map.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2004. | 3 | * project 2004. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/pcy_node.c b/src/lib/libcrypto/x509v3/pcy_node.c index dcc1554e29..6587cb05ab 100644 --- a/src/lib/libcrypto/x509v3/pcy_node.c +++ b/src/lib/libcrypto/x509v3/pcy_node.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pcy_node.c */ | 1 | /* pcy_node.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2004. | 3 | * project 2004. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/pcy_tree.c b/src/lib/libcrypto/x509v3/pcy_tree.c index 4fda1d419a..6c87a7f506 100644 --- a/src/lib/libcrypto/x509v3/pcy_tree.c +++ b/src/lib/libcrypto/x509v3/pcy_tree.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pcy_tree.c */ | 1 | /* pcy_tree.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2004. | 3 | * project 2004. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -130,9 +130,9 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs, | |||
| 130 | ret = 2; | 130 | ret = 2; |
| 131 | if (explicit_policy > 0) | 131 | if (explicit_policy > 0) |
| 132 | { | 132 | { |
| 133 | explicit_policy--; | 133 | if (!(x->ex_flags & EXFLAG_SI)) |
| 134 | if (!(x->ex_flags & EXFLAG_SS) | 134 | explicit_policy--; |
| 135 | && (cache->explicit_skip != -1) | 135 | if ((cache->explicit_skip != -1) |
| 136 | && (cache->explicit_skip < explicit_policy)) | 136 | && (cache->explicit_skip < explicit_policy)) |
| 137 | explicit_policy = cache->explicit_skip; | 137 | explicit_policy = cache->explicit_skip; |
| 138 | } | 138 | } |
| @@ -197,13 +197,14 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs, | |||
| 197 | /* Any matching allowed if certificate is self | 197 | /* Any matching allowed if certificate is self |
| 198 | * issued and not the last in the chain. | 198 | * issued and not the last in the chain. |
| 199 | */ | 199 | */ |
| 200 | if (!(x->ex_flags & EXFLAG_SS) || (i == 0)) | 200 | if (!(x->ex_flags & EXFLAG_SI) || (i == 0)) |
| 201 | level->flags |= X509_V_FLAG_INHIBIT_ANY; | 201 | level->flags |= X509_V_FLAG_INHIBIT_ANY; |
| 202 | } | 202 | } |
| 203 | else | 203 | else |
| 204 | { | 204 | { |
| 205 | any_skip--; | 205 | if (!(x->ex_flags & EXFLAG_SI)) |
| 206 | if ((cache->any_skip > 0) | 206 | any_skip--; |
| 207 | if ((cache->any_skip >= 0) | ||
| 207 | && (cache->any_skip < any_skip)) | 208 | && (cache->any_skip < any_skip)) |
| 208 | any_skip = cache->any_skip; | 209 | any_skip = cache->any_skip; |
| 209 | } | 210 | } |
| @@ -213,7 +214,7 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs, | |||
| 213 | else | 214 | else |
| 214 | { | 215 | { |
| 215 | map_skip--; | 216 | map_skip--; |
| 216 | if ((cache->map_skip > 0) | 217 | if ((cache->map_skip >= 0) |
| 217 | && (cache->map_skip < map_skip)) | 218 | && (cache->map_skip < map_skip)) |
| 218 | map_skip = cache->map_skip; | 219 | map_skip = cache->map_skip; |
| 219 | } | 220 | } |
| @@ -310,7 +311,8 @@ static int tree_link_any(X509_POLICY_LEVEL *curr, | |||
| 310 | 311 | ||
| 311 | if (data == NULL) | 312 | if (data == NULL) |
| 312 | return 0; | 313 | return 0; |
| 313 | data->qualifier_set = curr->anyPolicy->data->qualifier_set; | 314 | /* Curr may not have anyPolicy */ |
| 315 | data->qualifier_set = cache->anyPolicy->qualifier_set; | ||
| 314 | data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS; | 316 | data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS; |
| 315 | if (!level_add_node(curr, data, node, tree)) | 317 | if (!level_add_node(curr, data, node, tree)) |
| 316 | { | 318 | { |
diff --git a/src/lib/libcrypto/x509v3/v3_akey.c b/src/lib/libcrypto/x509v3/v3_akey.c index ac0548b775..c6b68ee221 100644 --- a/src/lib/libcrypto/x509v3/v3_akey.c +++ b/src/lib/libcrypto/x509v3/v3_akey.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_akey.c */ | 1 | /* v3_akey.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_akeya.c b/src/lib/libcrypto/x509v3/v3_akeya.c index 2aafa26ba7..2c50f7360e 100644 --- a/src/lib/libcrypto/x509v3/v3_akeya.c +++ b/src/lib/libcrypto/x509v3/v3_akeya.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_akey_asn1.c */ | 1 | /* v3_akey_asn1.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_alt.c b/src/lib/libcrypto/x509v3/v3_alt.c index bb2f5bc54e..58b2952478 100644 --- a/src/lib/libcrypto/x509v3/v3_alt.c +++ b/src/lib/libcrypto/x509v3/v3_alt.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_alt.c */ | 1 | /* v3_alt.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project. | 3 | * project. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -527,7 +527,8 @@ GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, | |||
| 527 | return gen; | 527 | return gen; |
| 528 | 528 | ||
| 529 | err: | 529 | err: |
| 530 | GENERAL_NAME_free(gen); | 530 | if (!out) |
| 531 | GENERAL_NAME_free(gen); | ||
| 531 | return NULL; | 532 | return NULL; |
| 532 | } | 533 | } |
| 533 | 534 | ||
diff --git a/src/lib/libcrypto/x509v3/v3_bcons.c b/src/lib/libcrypto/x509v3/v3_bcons.c index 74b1233071..82aa488f75 100644 --- a/src/lib/libcrypto/x509v3/v3_bcons.c +++ b/src/lib/libcrypto/x509v3/v3_bcons.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_bcons.c */ | 1 | /* v3_bcons.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_bitst.c b/src/lib/libcrypto/x509v3/v3_bitst.c index cf31f0816e..058d0d4dce 100644 --- a/src/lib/libcrypto/x509v3/v3_bitst.c +++ b/src/lib/libcrypto/x509v3/v3_bitst.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_bitst.c */ | 1 | /* v3_bitst.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_conf.c b/src/lib/libcrypto/x509v3/v3_conf.c index 2b867305fb..11eb6b7fd5 100644 --- a/src/lib/libcrypto/x509v3/v3_conf.c +++ b/src/lib/libcrypto/x509v3/v3_conf.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_conf.c */ | 1 | /* v3_conf.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_cpols.c b/src/lib/libcrypto/x509v3/v3_cpols.c index a40f490aa9..95596055ab 100644 --- a/src/lib/libcrypto/x509v3/v3_cpols.c +++ b/src/lib/libcrypto/x509v3/v3_cpols.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_cpols.c */ | 1 | /* v3_cpols.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_crld.c b/src/lib/libcrypto/x509v3/v3_crld.c index c6e3ebae7b..181a8977b1 100644 --- a/src/lib/libcrypto/x509v3/v3_crld.c +++ b/src/lib/libcrypto/x509v3/v3_crld.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_crld.c */ | 1 | /* v3_crld.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_enum.c b/src/lib/libcrypto/x509v3/v3_enum.c index a236cb22e1..36576eaa4d 100644 --- a/src/lib/libcrypto/x509v3/v3_enum.c +++ b/src/lib/libcrypto/x509v3/v3_enum.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_enum.c */ | 1 | /* v3_enum.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_extku.c b/src/lib/libcrypto/x509v3/v3_extku.c index a4efe0031e..c0d14500ed 100644 --- a/src/lib/libcrypto/x509v3/v3_extku.c +++ b/src/lib/libcrypto/x509v3/v3_extku.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_extku.c */ | 1 | /* v3_extku.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_genn.c b/src/lib/libcrypto/x509v3/v3_genn.c index 650b510980..84b4b1c881 100644 --- a/src/lib/libcrypto/x509v3/v3_genn.c +++ b/src/lib/libcrypto/x509v3/v3_genn.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_genn.c */ | 1 | /* v3_genn.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_ia5.c b/src/lib/libcrypto/x509v3/v3_ia5.c index b739ccd036..4ff12b52b5 100644 --- a/src/lib/libcrypto/x509v3/v3_ia5.c +++ b/src/lib/libcrypto/x509v3/v3_ia5.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_ia5.c */ | 1 | /* v3_ia5.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_info.c b/src/lib/libcrypto/x509v3/v3_info.c index e0ef69de42..e1b8699f92 100644 --- a/src/lib/libcrypto/x509v3/v3_info.c +++ b/src/lib/libcrypto/x509v3/v3_info.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_info.c */ | 1 | /* v3_info.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_int.c b/src/lib/libcrypto/x509v3/v3_int.c index 9a48dc1508..4bfd14cf46 100644 --- a/src/lib/libcrypto/x509v3/v3_int.c +++ b/src/lib/libcrypto/x509v3/v3_int.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_int.c */ | 1 | /* v3_int.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_lib.c b/src/lib/libcrypto/x509v3/v3_lib.c index f3015ea610..df3a48f43e 100644 --- a/src/lib/libcrypto/x509v3/v3_lib.c +++ b/src/lib/libcrypto/x509v3/v3_lib.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_lib.c */ | 1 | /* v3_lib.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_ncons.c b/src/lib/libcrypto/x509v3/v3_ncons.c index 42e7f5a879..4e706be3e1 100644 --- a/src/lib/libcrypto/x509v3/v3_ncons.c +++ b/src/lib/libcrypto/x509v3/v3_ncons.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_ncons.c */ | 1 | /* v3_ncons.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project. | 3 | * project. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_ocsp.c b/src/lib/libcrypto/x509v3/v3_ocsp.c index 62aac06335..e426ea930c 100644 --- a/src/lib/libcrypto/x509v3/v3_ocsp.c +++ b/src/lib/libcrypto/x509v3/v3_ocsp.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_ocsp.c */ | 1 | /* v3_ocsp.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_pcons.c b/src/lib/libcrypto/x509v3/v3_pcons.c index 13248c2ada..86c0ff70e6 100644 --- a/src/lib/libcrypto/x509v3/v3_pcons.c +++ b/src/lib/libcrypto/x509v3/v3_pcons.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_pcons.c */ | 1 | /* v3_pcons.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project. | 3 | * project. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_pku.c b/src/lib/libcrypto/x509v3/v3_pku.c index 5c4626e89b..076f3ff48e 100644 --- a/src/lib/libcrypto/x509v3/v3_pku.c +++ b/src/lib/libcrypto/x509v3/v3_pku.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_pku.c */ | 1 | /* v3_pku.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_pmaps.c b/src/lib/libcrypto/x509v3/v3_pmaps.c index 626303264f..da03bbc35d 100644 --- a/src/lib/libcrypto/x509v3/v3_pmaps.c +++ b/src/lib/libcrypto/x509v3/v3_pmaps.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_pmaps.c */ | 1 | /* v3_pmaps.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project. | 3 | * project. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_prn.c b/src/lib/libcrypto/x509v3/v3_prn.c index 20bd9bda19..c1bb17f105 100644 --- a/src/lib/libcrypto/x509v3/v3_prn.c +++ b/src/lib/libcrypto/x509v3/v3_prn.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_prn.c */ | 1 | /* v3_prn.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_purp.c b/src/lib/libcrypto/x509v3/v3_purp.c index b2f5cdfa05..e18751e01c 100644 --- a/src/lib/libcrypto/x509v3/v3_purp.c +++ b/src/lib/libcrypto/x509v3/v3_purp.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_purp.c */ | 1 | /* v3_purp.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -291,7 +291,9 @@ int X509_supported_extension(X509_EXTENSION *ex) | |||
| 291 | NID_sbgp_ipAddrBlock, /* 290 */ | 291 | NID_sbgp_ipAddrBlock, /* 290 */ |
| 292 | NID_sbgp_autonomousSysNum, /* 291 */ | 292 | NID_sbgp_autonomousSysNum, /* 291 */ |
| 293 | #endif | 293 | #endif |
| 294 | NID_proxyCertInfo /* 661 */ | 294 | NID_policy_constraints, /* 401 */ |
| 295 | NID_proxyCertInfo, /* 661 */ | ||
| 296 | NID_inhibit_any_policy /* 748 */ | ||
| 295 | }; | 297 | }; |
| 296 | 298 | ||
| 297 | int ex_nid; | 299 | int ex_nid; |
| @@ -325,7 +327,7 @@ static void x509v3_cache_extensions(X509 *x) | |||
| 325 | #endif | 327 | #endif |
| 326 | /* Does subject name match issuer ? */ | 328 | /* Does subject name match issuer ? */ |
| 327 | if(!X509_NAME_cmp(X509_get_subject_name(x), X509_get_issuer_name(x))) | 329 | if(!X509_NAME_cmp(X509_get_subject_name(x), X509_get_issuer_name(x))) |
| 328 | x->ex_flags |= EXFLAG_SS; | 330 | x->ex_flags |= EXFLAG_SI; |
| 329 | /* V1 should mean no extensions ... */ | 331 | /* V1 should mean no extensions ... */ |
| 330 | if(!X509_get_version(x)) x->ex_flags |= EXFLAG_V1; | 332 | if(!X509_get_version(x)) x->ex_flags |= EXFLAG_V1; |
| 331 | /* Handle basic constraints */ | 333 | /* Handle basic constraints */ |
diff --git a/src/lib/libcrypto/x509v3/v3_skey.c b/src/lib/libcrypto/x509v3/v3_skey.c index da0a3558f6..202c9e4896 100644 --- a/src/lib/libcrypto/x509v3/v3_skey.c +++ b/src/lib/libcrypto/x509v3/v3_skey.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_skey.c */ | 1 | /* v3_skey.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_sxnet.c b/src/lib/libcrypto/x509v3/v3_sxnet.c index eaea9ea01b..2a6bf11b65 100644 --- a/src/lib/libcrypto/x509v3/v3_sxnet.c +++ b/src/lib/libcrypto/x509v3/v3_sxnet.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_sxnet.c */ | 1 | /* v3_sxnet.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
diff --git a/src/lib/libcrypto/x509v3/v3_utl.c b/src/lib/libcrypto/x509v3/v3_utl.c index ac171ca940..a4236bbb6d 100644 --- a/src/lib/libcrypto/x509v3/v3_utl.c +++ b/src/lib/libcrypto/x509v3/v3_utl.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* v3_utl.c */ | 1 | /* v3_utl.c */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project. | 3 | * project. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -736,17 +736,20 @@ static int ipv6_from_asc(unsigned char *v6, const char *in) | |||
| 736 | 736 | ||
| 737 | /* Format result */ | 737 | /* Format result */ |
| 738 | 738 | ||
| 739 | /* Copy initial part */ | 739 | if (v6stat.zero_pos >= 0) |
| 740 | if (v6stat.zero_pos > 0) | 740 | { |
| 741 | /* Copy initial part */ | ||
| 741 | memcpy(v6, v6stat.tmp, v6stat.zero_pos); | 742 | memcpy(v6, v6stat.tmp, v6stat.zero_pos); |
| 742 | /* Zero middle */ | 743 | /* Zero middle */ |
| 743 | if (v6stat.total != 16) | ||
| 744 | memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total); | 744 | memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total); |
| 745 | /* Copy final part */ | 745 | /* Copy final part */ |
| 746 | if (v6stat.total != v6stat.zero_pos) | 746 | if (v6stat.total != v6stat.zero_pos) |
| 747 | memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total, | 747 | memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total, |
| 748 | v6stat.tmp + v6stat.zero_pos, | 748 | v6stat.tmp + v6stat.zero_pos, |
| 749 | v6stat.total - v6stat.zero_pos); | 749 | v6stat.total - v6stat.zero_pos); |
| 750 | } | ||
| 751 | else | ||
| 752 | memcpy(v6, v6stat.tmp, 16); | ||
| 750 | 753 | ||
| 751 | return 1; | 754 | return 1; |
| 752 | } | 755 | } |
diff --git a/src/lib/libcrypto/x509v3/x509v3.h b/src/lib/libcrypto/x509v3/x509v3.h index db2b0482c1..9ef83da755 100644 --- a/src/lib/libcrypto/x509v3/x509v3.h +++ b/src/lib/libcrypto/x509v3/x509v3.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* x509v3.h */ | 1 | /* x509v3.h */ |
| 2 | /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| 5 | /* ==================================================================== | 5 | /* ==================================================================== |
| @@ -363,6 +363,8 @@ DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) | |||
| 363 | #define EXFLAG_NSCERT 0x8 | 363 | #define EXFLAG_NSCERT 0x8 |
| 364 | 364 | ||
| 365 | #define EXFLAG_CA 0x10 | 365 | #define EXFLAG_CA 0x10 |
| 366 | /* Really self issued not necessarily self signed */ | ||
| 367 | #define EXFLAG_SI 0x20 | ||
| 366 | #define EXFLAG_SS 0x20 | 368 | #define EXFLAG_SS 0x20 |
| 367 | #define EXFLAG_V1 0x40 | 369 | #define EXFLAG_V1 0x40 |
| 368 | #define EXFLAG_INVALID 0x80 | 370 | #define EXFLAG_INVALID 0x80 |
| @@ -370,7 +372,7 @@ DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) | |||
| 370 | #define EXFLAG_CRITICAL 0x200 | 372 | #define EXFLAG_CRITICAL 0x200 |
| 371 | #define EXFLAG_PROXY 0x400 | 373 | #define EXFLAG_PROXY 0x400 |
| 372 | 374 | ||
| 373 | #define EXFLAG_INVALID_POLICY 0x400 | 375 | #define EXFLAG_INVALID_POLICY 0x800 |
| 374 | 376 | ||
| 375 | #define KU_DIGITAL_SIGNATURE 0x0080 | 377 | #define KU_DIGITAL_SIGNATURE 0x0080 |
| 376 | #define KU_NON_REPUDIATION 0x0040 | 378 | #define KU_NON_REPUDIATION 0x0040 |
diff --git a/src/lib/libssl/d1_clnt.c b/src/lib/libssl/d1_clnt.c index 5e59dc845a..49c6760d19 100644 --- a/src/lib/libssl/d1_clnt.c +++ b/src/lib/libssl/d1_clnt.c | |||
| @@ -1095,8 +1095,7 @@ int dtls1_send_client_certificate(SSL *s) | |||
| 1095 | * ssl->rwstate=SSL_X509_LOOKUP; return(-1); | 1095 | * ssl->rwstate=SSL_X509_LOOKUP; return(-1); |
| 1096 | * We then get retied later */ | 1096 | * We then get retied later */ |
| 1097 | i=0; | 1097 | i=0; |
| 1098 | if (s->ctx->client_cert_cb != NULL) | 1098 | i = ssl_do_client_cert_cb(s, &x509, &pkey); |
| 1099 | i=s->ctx->client_cert_cb(s,&(x509),&(pkey)); | ||
| 1100 | if (i < 0) | 1099 | if (i < 0) |
| 1101 | { | 1100 | { |
| 1102 | s->rwstate=SSL_X509_LOOKUP; | 1101 | s->rwstate=SSL_X509_LOOKUP; |
diff --git a/src/lib/libssl/d1_enc.c b/src/lib/libssl/d1_enc.c index cbff7495c5..cf3332e4e4 100644 --- a/src/lib/libssl/d1_enc.c +++ b/src/lib/libssl/d1_enc.c | |||
| @@ -115,12 +115,16 @@ | |||
| 115 | 115 | ||
| 116 | #include <stdio.h> | 116 | #include <stdio.h> |
| 117 | #include "ssl_locl.h" | 117 | #include "ssl_locl.h" |
| 118 | #ifndef OPENSSL_NO_COMP | ||
| 118 | #include <openssl/comp.h> | 119 | #include <openssl/comp.h> |
| 120 | #endif | ||
| 119 | #include <openssl/evp.h> | 121 | #include <openssl/evp.h> |
| 120 | #include <openssl/hmac.h> | 122 | #include <openssl/hmac.h> |
| 121 | #include <openssl/md5.h> | 123 | #include <openssl/md5.h> |
| 122 | #include <openssl/rand.h> | 124 | #include <openssl/rand.h> |
| 123 | 125 | #ifdef KSSL_DEBUG | |
| 126 | #include <openssl/des.h> | ||
| 127 | #endif | ||
| 124 | 128 | ||
| 125 | int dtls1_enc(SSL *s, int send) | 129 | int dtls1_enc(SSL *s, int send) |
| 126 | { | 130 | { |
| @@ -202,10 +206,11 @@ int dtls1_enc(SSL *s, int send) | |||
| 202 | { | 206 | { |
| 203 | unsigned long ui; | 207 | unsigned long ui; |
| 204 | printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n", | 208 | printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n", |
| 205 | ds,rec->data,rec->input,l); | 209 | (void *)ds,rec->data,rec->input,l); |
| 206 | printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n", | 210 | printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%ld %ld], %d iv_len\n", |
| 207 | ds->buf_len, ds->cipher->key_len, | 211 | ds->buf_len, ds->cipher->key_len, |
| 208 | DES_KEY_SZ, DES_SCHEDULE_SZ, | 212 | (unsigned long)DES_KEY_SZ, |
| 213 | (unsigned long)DES_SCHEDULE_SZ, | ||
| 209 | ds->cipher->iv_len); | 214 | ds->cipher->iv_len); |
| 210 | printf("\t\tIV: "); | 215 | printf("\t\tIV: "); |
| 211 | for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]); | 216 | for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]); |
| @@ -230,10 +235,10 @@ int dtls1_enc(SSL *s, int send) | |||
| 230 | 235 | ||
| 231 | #ifdef KSSL_DEBUG | 236 | #ifdef KSSL_DEBUG |
| 232 | { | 237 | { |
| 233 | unsigned long i; | 238 | unsigned long ki; |
| 234 | printf("\trec->data="); | 239 | printf("\trec->data="); |
| 235 | for (i=0; i<l; i++) | 240 | for (ki=0; ki<l; ki++) |
| 236 | printf(" %02x", rec->data[i]); printf("\n"); | 241 | printf(" %02x", rec->data[ki]); printf("\n"); |
| 237 | } | 242 | } |
| 238 | #endif /* KSSL_DEBUG */ | 243 | #endif /* KSSL_DEBUG */ |
| 239 | 244 | ||
diff --git a/src/lib/libssl/d1_lib.c b/src/lib/libssl/d1_lib.c index fc088b4148..3568e97a87 100644 --- a/src/lib/libssl/d1_lib.c +++ b/src/lib/libssl/d1_lib.c | |||
| @@ -106,6 +106,7 @@ int dtls1_new(SSL *s) | |||
| 106 | pq_64bit_init(&(d1->bitmap.map)); | 106 | pq_64bit_init(&(d1->bitmap.map)); |
| 107 | pq_64bit_init(&(d1->bitmap.max_seq_num)); | 107 | pq_64bit_init(&(d1->bitmap.max_seq_num)); |
| 108 | 108 | ||
| 109 | d1->next_bitmap.length = d1->bitmap.length; | ||
| 109 | pq_64bit_init(&(d1->next_bitmap.map)); | 110 | pq_64bit_init(&(d1->next_bitmap.map)); |
| 110 | pq_64bit_init(&(d1->next_bitmap.max_seq_num)); | 111 | pq_64bit_init(&(d1->next_bitmap.max_seq_num)); |
| 111 | 112 | ||
diff --git a/src/lib/libssl/d1_pkt.c b/src/lib/libssl/d1_pkt.c index 377696deac..eb56cf987b 100644 --- a/src/lib/libssl/d1_pkt.c +++ b/src/lib/libssl/d1_pkt.c | |||
| @@ -597,6 +597,7 @@ again: | |||
| 597 | /* check whether this is a repeat, or aged record */ | 597 | /* check whether this is a repeat, or aged record */ |
| 598 | if ( ! dtls1_record_replay_check(s, bitmap, &(rr->seq_num))) | 598 | if ( ! dtls1_record_replay_check(s, bitmap, &(rr->seq_num))) |
| 599 | { | 599 | { |
| 600 | rr->length = 0; | ||
| 600 | s->packet_length=0; /* dump this record */ | 601 | s->packet_length=0; /* dump this record */ |
| 601 | goto again; /* get another record */ | 602 | goto again; /* get another record */ |
| 602 | } | 603 | } |
| @@ -811,6 +812,14 @@ start: | |||
| 811 | * may be fragmented--don't always expect dest_maxlen bytes */ | 812 | * may be fragmented--don't always expect dest_maxlen bytes */ |
| 812 | if ( rr->length < dest_maxlen) | 813 | if ( rr->length < dest_maxlen) |
| 813 | { | 814 | { |
| 815 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE | ||
| 816 | /* | ||
| 817 | * for normal alerts rr->length is 2, while | ||
| 818 | * dest_maxlen is 7 if we were to handle this | ||
| 819 | * non-existing alert... | ||
| 820 | */ | ||
| 821 | FIX ME | ||
| 822 | #endif | ||
| 814 | s->rstate=SSL_ST_READ_HEADER; | 823 | s->rstate=SSL_ST_READ_HEADER; |
| 815 | rr->length = 0; | 824 | rr->length = 0; |
| 816 | goto start; | 825 | goto start; |
| @@ -1251,7 +1260,7 @@ int dtls1_write_bytes(SSL *s, int type, const void *buf_, int len) | |||
| 1251 | else | 1260 | else |
| 1252 | s->s3->wnum += i; | 1261 | s->s3->wnum += i; |
| 1253 | 1262 | ||
| 1254 | return tot + i; | 1263 | return i; |
| 1255 | } | 1264 | } |
| 1256 | 1265 | ||
| 1257 | int do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len, int create_empty_fragment) | 1266 | int do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len, int create_empty_fragment) |
| @@ -1576,7 +1585,7 @@ int dtls1_dispatch_alert(SSL *s) | |||
| 1576 | { | 1585 | { |
| 1577 | int i,j; | 1586 | int i,j; |
| 1578 | void (*cb)(const SSL *ssl,int type,int val)=NULL; | 1587 | void (*cb)(const SSL *ssl,int type,int val)=NULL; |
| 1579 | unsigned char buf[2 + 2 + 3]; /* alert level + alert desc + message seq +frag_off */ | 1588 | unsigned char buf[DTLS1_AL_HEADER_LENGTH]; |
| 1580 | unsigned char *ptr = &buf[0]; | 1589 | unsigned char *ptr = &buf[0]; |
| 1581 | 1590 | ||
| 1582 | s->s3->alert_dispatch=0; | 1591 | s->s3->alert_dispatch=0; |
| @@ -1585,6 +1594,7 @@ int dtls1_dispatch_alert(SSL *s) | |||
| 1585 | *ptr++ = s->s3->send_alert[0]; | 1594 | *ptr++ = s->s3->send_alert[0]; |
| 1586 | *ptr++ = s->s3->send_alert[1]; | 1595 | *ptr++ = s->s3->send_alert[1]; |
| 1587 | 1596 | ||
| 1597 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE | ||
| 1588 | if (s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) | 1598 | if (s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) |
| 1589 | { | 1599 | { |
| 1590 | s2n(s->d1->handshake_read_seq, ptr); | 1600 | s2n(s->d1->handshake_read_seq, ptr); |
| @@ -1600,6 +1610,7 @@ int dtls1_dispatch_alert(SSL *s) | |||
| 1600 | #endif | 1610 | #endif |
| 1601 | l2n3(s->d1->r_msg_hdr.frag_off, ptr); | 1611 | l2n3(s->d1->r_msg_hdr.frag_off, ptr); |
| 1602 | } | 1612 | } |
| 1613 | #endif | ||
| 1603 | 1614 | ||
| 1604 | i = do_dtls1_write(s, SSL3_RT_ALERT, &buf[0], sizeof(buf), 0); | 1615 | i = do_dtls1_write(s, SSL3_RT_ALERT, &buf[0], sizeof(buf), 0); |
| 1605 | if (i <= 0) | 1616 | if (i <= 0) |
| @@ -1609,8 +1620,11 @@ int dtls1_dispatch_alert(SSL *s) | |||
| 1609 | } | 1620 | } |
| 1610 | else | 1621 | else |
| 1611 | { | 1622 | { |
| 1612 | if ( s->s3->send_alert[0] == SSL3_AL_FATAL || | 1623 | if (s->s3->send_alert[0] == SSL3_AL_FATAL |
| 1613 | s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) | 1624 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE |
| 1625 | || s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE | ||
| 1626 | #endif | ||
| 1627 | ) | ||
| 1614 | (void)BIO_flush(s->wbio); | 1628 | (void)BIO_flush(s->wbio); |
| 1615 | 1629 | ||
| 1616 | if (s->msg_callback) | 1630 | if (s->msg_callback) |
diff --git a/src/lib/libssl/d1_srvr.c b/src/lib/libssl/d1_srvr.c index 927b01f3c4..0bbf8ae7f3 100644 --- a/src/lib/libssl/d1_srvr.c +++ b/src/lib/libssl/d1_srvr.c | |||
| @@ -732,7 +732,7 @@ int dtls1_send_server_hello(SSL *s) | |||
| 732 | 732 | ||
| 733 | d = dtls1_set_message_header(s, d, SSL3_MT_SERVER_HELLO, l, 0, l); | 733 | d = dtls1_set_message_header(s, d, SSL3_MT_SERVER_HELLO, l, 0, l); |
| 734 | 734 | ||
| 735 | s->state=SSL3_ST_CW_CLNT_HELLO_B; | 735 | s->state=SSL3_ST_SW_SRVR_HELLO_B; |
| 736 | /* number of bytes to write */ | 736 | /* number of bytes to write */ |
| 737 | s->init_num=p-buf; | 737 | s->init_num=p-buf; |
| 738 | s->init_off=0; | 738 | s->init_off=0; |
| @@ -741,7 +741,7 @@ int dtls1_send_server_hello(SSL *s) | |||
| 741 | dtls1_buffer_message(s, 0); | 741 | dtls1_buffer_message(s, 0); |
| 742 | } | 742 | } |
| 743 | 743 | ||
| 744 | /* SSL3_ST_CW_CLNT_HELLO_B */ | 744 | /* SSL3_ST_SW_SRVR_HELLO_B */ |
| 745 | return(dtls1_do_write(s,SSL3_RT_HANDSHAKE)); | 745 | return(dtls1_do_write(s,SSL3_RT_HANDSHAKE)); |
| 746 | } | 746 | } |
| 747 | 747 | ||
| @@ -765,7 +765,7 @@ int dtls1_send_server_done(SSL *s) | |||
| 765 | dtls1_buffer_message(s, 0); | 765 | dtls1_buffer_message(s, 0); |
| 766 | } | 766 | } |
| 767 | 767 | ||
| 768 | /* SSL3_ST_CW_CLNT_HELLO_B */ | 768 | /* SSL3_ST_SW_SRVR_DONE_B */ |
| 769 | return(dtls1_do_write(s,SSL3_RT_HANDSHAKE)); | 769 | return(dtls1_do_write(s,SSL3_RT_HANDSHAKE)); |
| 770 | } | 770 | } |
| 771 | 771 | ||
diff --git a/src/lib/libssl/dtls1.h b/src/lib/libssl/dtls1.h index a663cf85f2..f159d37110 100644 --- a/src/lib/libssl/dtls1.h +++ b/src/lib/libssl/dtls1.h | |||
| @@ -70,7 +70,10 @@ extern "C" { | |||
| 70 | #define DTLS1_VERSION 0xFEFF | 70 | #define DTLS1_VERSION 0xFEFF |
| 71 | #define DTLS1_BAD_VER 0x0100 | 71 | #define DTLS1_BAD_VER 0x0100 |
| 72 | 72 | ||
| 73 | #if 0 | ||
| 74 | /* this alert description is not specified anywhere... */ | ||
| 73 | #define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 110 | 75 | #define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 110 |
| 76 | #endif | ||
| 74 | 77 | ||
| 75 | /* lengths of messages */ | 78 | /* lengths of messages */ |
| 76 | #define DTLS1_COOKIE_LENGTH 32 | 79 | #define DTLS1_COOKIE_LENGTH 32 |
| @@ -84,7 +87,11 @@ extern "C" { | |||
| 84 | 87 | ||
| 85 | #define DTLS1_CCS_HEADER_LENGTH 1 | 88 | #define DTLS1_CCS_HEADER_LENGTH 1 |
| 86 | 89 | ||
| 90 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE | ||
| 87 | #define DTLS1_AL_HEADER_LENGTH 7 | 91 | #define DTLS1_AL_HEADER_LENGTH 7 |
| 92 | #else | ||
| 93 | #define DTLS1_AL_HEADER_LENGTH 2 | ||
| 94 | #endif | ||
| 88 | 95 | ||
| 89 | 96 | ||
| 90 | typedef struct dtls1_bitmap_st | 97 | typedef struct dtls1_bitmap_st |
diff --git a/src/lib/libssl/s23_clnt.c b/src/lib/libssl/s23_clnt.c index c45a8e0a04..bc918170e1 100644 --- a/src/lib/libssl/s23_clnt.c +++ b/src/lib/libssl/s23_clnt.c | |||
| @@ -257,6 +257,14 @@ static int ssl23_client_hello(SSL *s) | |||
| 257 | version_major = TLS1_VERSION_MAJOR; | 257 | version_major = TLS1_VERSION_MAJOR; |
| 258 | version_minor = TLS1_VERSION_MINOR; | 258 | version_minor = TLS1_VERSION_MINOR; |
| 259 | } | 259 | } |
| 260 | #ifdef OPENSSL_FIPS | ||
| 261 | else if(FIPS_mode()) | ||
| 262 | { | ||
| 263 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, | ||
| 264 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | ||
| 265 | return -1; | ||
| 266 | } | ||
| 267 | #endif | ||
| 260 | else if (version == SSL3_VERSION) | 268 | else if (version == SSL3_VERSION) |
| 261 | { | 269 | { |
| 262 | version_major = SSL3_VERSION_MAJOR; | 270 | version_major = SSL3_VERSION_MAJOR; |
| @@ -536,6 +544,14 @@ static int ssl23_get_server_hello(SSL *s) | |||
| 536 | if ((p[2] == SSL3_VERSION_MINOR) && | 544 | if ((p[2] == SSL3_VERSION_MINOR) && |
| 537 | !(s->options & SSL_OP_NO_SSLv3)) | 545 | !(s->options & SSL_OP_NO_SSLv3)) |
| 538 | { | 546 | { |
| 547 | #ifdef OPENSSL_FIPS | ||
| 548 | if(FIPS_mode()) | ||
| 549 | { | ||
| 550 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, | ||
| 551 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | ||
| 552 | goto err; | ||
| 553 | } | ||
| 554 | #endif | ||
| 539 | s->version=SSL3_VERSION; | 555 | s->version=SSL3_VERSION; |
| 540 | s->method=SSLv3_client_method(); | 556 | s->method=SSLv3_client_method(); |
| 541 | } | 557 | } |
diff --git a/src/lib/libssl/s23_srvr.c b/src/lib/libssl/s23_srvr.c index 6637bb9549..ba06e7ae2e 100644 --- a/src/lib/libssl/s23_srvr.c +++ b/src/lib/libssl/s23_srvr.c | |||
| @@ -386,6 +386,15 @@ int ssl23_get_client_hello(SSL *s) | |||
| 386 | } | 386 | } |
| 387 | } | 387 | } |
| 388 | 388 | ||
| 389 | #ifdef OPENSSL_FIPS | ||
| 390 | if (FIPS_mode() && (s->version < TLS1_VERSION)) | ||
| 391 | { | ||
| 392 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, | ||
| 393 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | ||
| 394 | goto err; | ||
| 395 | } | ||
| 396 | #endif | ||
| 397 | |||
| 389 | if (s->state == SSL23_ST_SR_CLNT_HELLO_B) | 398 | if (s->state == SSL23_ST_SR_CLNT_HELLO_B) |
| 390 | { | 399 | { |
| 391 | /* we have SSLv3/TLSv1 in an SSLv2 header | 400 | /* we have SSLv3/TLSv1 in an SSLv2 header |
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c index f6864cdc50..5fd3520caf 100644 --- a/src/lib/libssl/s3_clnt.c +++ b/src/lib/libssl/s3_clnt.c | |||
| @@ -130,10 +130,17 @@ | |||
| 130 | #include <openssl/objects.h> | 130 | #include <openssl/objects.h> |
| 131 | #include <openssl/evp.h> | 131 | #include <openssl/evp.h> |
| 132 | #include <openssl/md5.h> | 132 | #include <openssl/md5.h> |
| 133 | #ifdef OPENSSL_FIPS | ||
| 134 | #include <openssl/fips.h> | ||
| 135 | #endif | ||
| 136 | |||
| 133 | #ifndef OPENSSL_NO_DH | 137 | #ifndef OPENSSL_NO_DH |
| 134 | #include <openssl/dh.h> | 138 | #include <openssl/dh.h> |
| 135 | #endif | 139 | #endif |
| 136 | #include <openssl/bn.h> | 140 | #include <openssl/bn.h> |
| 141 | #ifndef OPENSSL_NO_ENGINE | ||
| 142 | #include <openssl/engine.h> | ||
| 143 | #endif | ||
| 137 | 144 | ||
| 138 | static SSL_METHOD *ssl3_get_client_method(int ver); | 145 | static SSL_METHOD *ssl3_get_client_method(int ver); |
| 139 | static int ca_dn_cmp(const X509_NAME * const *a,const X509_NAME * const *b); | 146 | static int ca_dn_cmp(const X509_NAME * const *a,const X509_NAME * const *b); |
| @@ -965,7 +972,7 @@ int ssl3_get_server_certificate(SSL *s) | |||
| 965 | } | 972 | } |
| 966 | 973 | ||
| 967 | i=ssl_verify_cert_chain(s,sk); | 974 | i=ssl_verify_cert_chain(s,sk); |
| 968 | if ((s->verify_mode != SSL_VERIFY_NONE) && (!i) | 975 | if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0) |
| 969 | #ifndef OPENSSL_NO_KRB5 | 976 | #ifndef OPENSSL_NO_KRB5 |
| 970 | && (s->s3->tmp.new_cipher->algorithms & (SSL_MKEY_MASK|SSL_AUTH_MASK)) | 977 | && (s->s3->tmp.new_cipher->algorithms & (SSL_MKEY_MASK|SSL_AUTH_MASK)) |
| 971 | != (SSL_aKRB5|SSL_kKRB5) | 978 | != (SSL_aKRB5|SSL_kKRB5) |
| @@ -999,7 +1006,7 @@ int ssl3_get_server_certificate(SSL *s) | |||
| 999 | == (SSL_aKRB5|SSL_kKRB5))? 0: 1; | 1006 | == (SSL_aKRB5|SSL_kKRB5))? 0: 1; |
| 1000 | 1007 | ||
| 1001 | #ifdef KSSL_DEBUG | 1008 | #ifdef KSSL_DEBUG |
| 1002 | printf("pkey,x = %p, %p\n", pkey,x); | 1009 | printf("pkey,x = %p, %p\n", (void *)pkey,(void *)x); |
| 1003 | printf("ssl_cert_type(x,pkey) = %d\n", ssl_cert_type(x,pkey)); | 1010 | printf("ssl_cert_type(x,pkey) = %d\n", ssl_cert_type(x,pkey)); |
| 1004 | printf("cipher, alg, nc = %s, %lx, %d\n", s->s3->tmp.new_cipher->name, | 1011 | printf("cipher, alg, nc = %s, %lx, %d\n", s->s3->tmp.new_cipher->name, |
| 1005 | s->s3->tmp.new_cipher->algorithms, need_cert); | 1012 | s->s3->tmp.new_cipher->algorithms, need_cert); |
| @@ -1415,6 +1422,8 @@ int ssl3_get_key_exchange(SSL *s) | |||
| 1415 | q=md_buf; | 1422 | q=md_buf; |
| 1416 | for (num=2; num > 0; num--) | 1423 | for (num=2; num > 0; num--) |
| 1417 | { | 1424 | { |
| 1425 | EVP_MD_CTX_set_flags(&md_ctx, | ||
| 1426 | EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); | ||
| 1418 | EVP_DigestInit_ex(&md_ctx,(num == 2) | 1427 | EVP_DigestInit_ex(&md_ctx,(num == 2) |
| 1419 | ?s->ctx->md5:s->ctx->sha1, NULL); | 1428 | ?s->ctx->md5:s->ctx->sha1, NULL); |
| 1420 | EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); | 1429 | EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); |
| @@ -1450,7 +1459,7 @@ int ssl3_get_key_exchange(SSL *s) | |||
| 1450 | EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); | 1459 | EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); |
| 1451 | EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE); | 1460 | EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE); |
| 1452 | EVP_VerifyUpdate(&md_ctx,param,param_len); | 1461 | EVP_VerifyUpdate(&md_ctx,param,param_len); |
| 1453 | if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey)) | 1462 | if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0) |
| 1454 | { | 1463 | { |
| 1455 | /* bad signature */ | 1464 | /* bad signature */ |
| 1456 | al=SSL_AD_DECRYPT_ERROR; | 1465 | al=SSL_AD_DECRYPT_ERROR; |
| @@ -1468,7 +1477,7 @@ int ssl3_get_key_exchange(SSL *s) | |||
| 1468 | EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); | 1477 | EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); |
| 1469 | EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE); | 1478 | EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE); |
| 1470 | EVP_VerifyUpdate(&md_ctx,param,param_len); | 1479 | EVP_VerifyUpdate(&md_ctx,param,param_len); |
| 1471 | if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey)) | 1480 | if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0) |
| 1472 | { | 1481 | { |
| 1473 | /* bad signature */ | 1482 | /* bad signature */ |
| 1474 | al=SSL_AD_DECRYPT_ERROR; | 1483 | al=SSL_AD_DECRYPT_ERROR; |
| @@ -1768,7 +1777,7 @@ int ssl3_get_cert_status(SSL *s) | |||
| 1768 | goto f_err; | 1777 | goto f_err; |
| 1769 | } | 1778 | } |
| 1770 | n2l3(p, resplen); | 1779 | n2l3(p, resplen); |
| 1771 | if (resplen + 4 != n) | 1780 | if (resplen + 4 != (unsigned long)n) |
| 1772 | { | 1781 | { |
| 1773 | al = SSL_AD_DECODE_ERROR; | 1782 | al = SSL_AD_DECODE_ERROR; |
| 1774 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS,SSL_R_LENGTH_MISMATCH); | 1783 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS,SSL_R_LENGTH_MISMATCH); |
| @@ -2061,12 +2070,12 @@ int ssl3_send_client_key_exchange(SSL *s) | |||
| 2061 | { | 2070 | { |
| 2062 | DH *dh_srvr,*dh_clnt; | 2071 | DH *dh_srvr,*dh_clnt; |
| 2063 | 2072 | ||
| 2064 | if (s->session->sess_cert == NULL) | 2073 | if (s->session->sess_cert == NULL) |
| 2065 | { | 2074 | { |
| 2066 | ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE); | 2075 | ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE); |
| 2067 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE); | 2076 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE); |
| 2068 | goto err; | 2077 | goto err; |
| 2069 | } | 2078 | } |
| 2070 | 2079 | ||
| 2071 | if (s->session->sess_cert->peer_dh_tmp != NULL) | 2080 | if (s->session->sess_cert->peer_dh_tmp != NULL) |
| 2072 | dh_srvr=s->session->sess_cert->peer_dh_tmp; | 2081 | dh_srvr=s->session->sess_cert->peer_dh_tmp; |
| @@ -2448,8 +2457,7 @@ int ssl3_send_client_certificate(SSL *s) | |||
| 2448 | * ssl->rwstate=SSL_X509_LOOKUP; return(-1); | 2457 | * ssl->rwstate=SSL_X509_LOOKUP; return(-1); |
| 2449 | * We then get retied later */ | 2458 | * We then get retied later */ |
| 2450 | i=0; | 2459 | i=0; |
| 2451 | if (s->ctx->client_cert_cb != NULL) | 2460 | i = ssl_do_client_cert_cb(s, &x509, &pkey); |
| 2452 | i=s->ctx->client_cert_cb(s,&(x509),&(pkey)); | ||
| 2453 | if (i < 0) | 2461 | if (i < 0) |
| 2454 | { | 2462 | { |
| 2455 | s->rwstate=SSL_X509_LOOKUP; | 2463 | s->rwstate=SSL_X509_LOOKUP; |
| @@ -2716,3 +2724,21 @@ static int ssl3_check_finished(SSL *s) | |||
| 2716 | return 1; | 2724 | return 1; |
| 2717 | } | 2725 | } |
| 2718 | #endif | 2726 | #endif |
| 2727 | |||
| 2728 | int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey) | ||
| 2729 | { | ||
| 2730 | int i = 0; | ||
| 2731 | #ifndef OPENSSL_NO_ENGINE | ||
| 2732 | if (s->ctx->client_cert_engine) | ||
| 2733 | { | ||
| 2734 | i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s, | ||
| 2735 | SSL_get_client_CA_list(s), | ||
| 2736 | px509, ppkey, NULL, NULL, NULL); | ||
| 2737 | if (i != 0) | ||
| 2738 | return i; | ||
| 2739 | } | ||
| 2740 | #endif | ||
| 2741 | if (s->ctx->client_cert_cb) | ||
| 2742 | i = s->ctx->client_cert_cb(s,px509,ppkey); | ||
| 2743 | return i; | ||
| 2744 | } | ||
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index bdbcd44f27..8916a0b1b3 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c | |||
| @@ -158,7 +158,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 158 | SSL3_TXT_RSA_NULL_SHA, | 158 | SSL3_TXT_RSA_NULL_SHA, |
| 159 | SSL3_CK_RSA_NULL_SHA, | 159 | SSL3_CK_RSA_NULL_SHA, |
| 160 | SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_SHA1|SSL_SSLV3, | 160 | SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_SHA1|SSL_SSLV3, |
| 161 | SSL_NOT_EXP|SSL_STRONG_NONE, | 161 | SSL_NOT_EXP|SSL_STRONG_NONE|SSL_FIPS, |
| 162 | 0, | 162 | 0, |
| 163 | 0, | 163 | 0, |
| 164 | 0, | 164 | 0, |
| @@ -264,7 +264,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 264 | SSL3_TXT_RSA_DES_192_CBC3_SHA, | 264 | SSL3_TXT_RSA_DES_192_CBC3_SHA, |
| 265 | SSL3_CK_RSA_DES_192_CBC3_SHA, | 265 | SSL3_CK_RSA_DES_192_CBC3_SHA, |
| 266 | SSL_kRSA|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_SSLV3, | 266 | SSL_kRSA|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_SSLV3, |
| 267 | SSL_NOT_EXP|SSL_HIGH, | 267 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 268 | 0, | 268 | 0, |
| 269 | 168, | 269 | 168, |
| 270 | 168, | 270 | 168, |
| @@ -304,7 +304,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 304 | SSL3_TXT_DH_DSS_DES_192_CBC3_SHA, | 304 | SSL3_TXT_DH_DSS_DES_192_CBC3_SHA, |
| 305 | SSL3_CK_DH_DSS_DES_192_CBC3_SHA, | 305 | SSL3_CK_DH_DSS_DES_192_CBC3_SHA, |
| 306 | SSL_kDHd |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_SSLV3, | 306 | SSL_kDHd |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_SSLV3, |
| 307 | SSL_NOT_EXP|SSL_HIGH, | 307 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 308 | 0, | 308 | 0, |
| 309 | 168, | 309 | 168, |
| 310 | 168, | 310 | 168, |
| @@ -343,7 +343,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 343 | SSL3_TXT_DH_RSA_DES_192_CBC3_SHA, | 343 | SSL3_TXT_DH_RSA_DES_192_CBC3_SHA, |
| 344 | SSL3_CK_DH_RSA_DES_192_CBC3_SHA, | 344 | SSL3_CK_DH_RSA_DES_192_CBC3_SHA, |
| 345 | SSL_kDHr |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_SSLV3, | 345 | SSL_kDHr |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_SSLV3, |
| 346 | SSL_NOT_EXP|SSL_HIGH, | 346 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 347 | 0, | 347 | 0, |
| 348 | 168, | 348 | 168, |
| 349 | 168, | 349 | 168, |
| @@ -384,7 +384,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 384 | SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA, | 384 | SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA, |
| 385 | SSL3_CK_EDH_DSS_DES_192_CBC3_SHA, | 385 | SSL3_CK_EDH_DSS_DES_192_CBC3_SHA, |
| 386 | SSL_kEDH|SSL_aDSS|SSL_3DES |SSL_SHA1|SSL_SSLV3, | 386 | SSL_kEDH|SSL_aDSS|SSL_3DES |SSL_SHA1|SSL_SSLV3, |
| 387 | SSL_NOT_EXP|SSL_HIGH, | 387 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 388 | 0, | 388 | 0, |
| 389 | 168, | 389 | 168, |
| 390 | 168, | 390 | 168, |
| @@ -423,7 +423,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 423 | SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA, | 423 | SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA, |
| 424 | SSL3_CK_EDH_RSA_DES_192_CBC3_SHA, | 424 | SSL3_CK_EDH_RSA_DES_192_CBC3_SHA, |
| 425 | SSL_kEDH|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_SSLV3, | 425 | SSL_kEDH|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_SSLV3, |
| 426 | SSL_NOT_EXP|SSL_HIGH, | 426 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 427 | 0, | 427 | 0, |
| 428 | 168, | 428 | 168, |
| 429 | 168, | 429 | 168, |
| @@ -488,7 +488,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 488 | SSL3_TXT_ADH_DES_192_CBC_SHA, | 488 | SSL3_TXT_ADH_DES_192_CBC_SHA, |
| 489 | SSL3_CK_ADH_DES_192_CBC_SHA, | 489 | SSL3_CK_ADH_DES_192_CBC_SHA, |
| 490 | SSL_kEDH |SSL_aNULL|SSL_3DES |SSL_SHA1|SSL_SSLV3, | 490 | SSL_kEDH |SSL_aNULL|SSL_3DES |SSL_SHA1|SSL_SSLV3, |
| 491 | SSL_NOT_EXP|SSL_HIGH, | 491 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 492 | 0, | 492 | 0, |
| 493 | 168, | 493 | 168, |
| 494 | 168, | 494 | 168, |
| @@ -563,7 +563,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 563 | SSL3_TXT_KRB5_DES_192_CBC3_SHA, | 563 | SSL3_TXT_KRB5_DES_192_CBC3_SHA, |
| 564 | SSL3_CK_KRB5_DES_192_CBC3_SHA, | 564 | SSL3_CK_KRB5_DES_192_CBC3_SHA, |
| 565 | SSL_kKRB5|SSL_aKRB5| SSL_3DES|SSL_SHA1 |SSL_SSLV3, | 565 | SSL_kKRB5|SSL_aKRB5| SSL_3DES|SSL_SHA1 |SSL_SSLV3, |
| 566 | SSL_NOT_EXP|SSL_HIGH, | 566 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 567 | 0, | 567 | 0, |
| 568 | 168, | 568 | 168, |
| 569 | 168, | 569 | 168, |
| @@ -747,7 +747,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 747 | TLS1_TXT_RSA_WITH_AES_128_SHA, | 747 | TLS1_TXT_RSA_WITH_AES_128_SHA, |
| 748 | TLS1_CK_RSA_WITH_AES_128_SHA, | 748 | TLS1_CK_RSA_WITH_AES_128_SHA, |
| 749 | SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1, | 749 | SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1, |
| 750 | SSL_NOT_EXP|SSL_HIGH, | 750 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 751 | 0, | 751 | 0, |
| 752 | 128, | 752 | 128, |
| 753 | 128, | 753 | 128, |
| @@ -760,7 +760,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 760 | TLS1_TXT_DH_DSS_WITH_AES_128_SHA, | 760 | TLS1_TXT_DH_DSS_WITH_AES_128_SHA, |
| 761 | TLS1_CK_DH_DSS_WITH_AES_128_SHA, | 761 | TLS1_CK_DH_DSS_WITH_AES_128_SHA, |
| 762 | SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, | 762 | SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, |
| 763 | SSL_NOT_EXP|SSL_HIGH, | 763 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 764 | 0, | 764 | 0, |
| 765 | 128, | 765 | 128, |
| 766 | 128, | 766 | 128, |
| @@ -773,7 +773,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 773 | TLS1_TXT_DH_RSA_WITH_AES_128_SHA, | 773 | TLS1_TXT_DH_RSA_WITH_AES_128_SHA, |
| 774 | TLS1_CK_DH_RSA_WITH_AES_128_SHA, | 774 | TLS1_CK_DH_RSA_WITH_AES_128_SHA, |
| 775 | SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, | 775 | SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, |
| 776 | SSL_NOT_EXP|SSL_HIGH, | 776 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 777 | 0, | 777 | 0, |
| 778 | 128, | 778 | 128, |
| 779 | 128, | 779 | 128, |
| @@ -786,7 +786,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 786 | TLS1_TXT_DHE_DSS_WITH_AES_128_SHA, | 786 | TLS1_TXT_DHE_DSS_WITH_AES_128_SHA, |
| 787 | TLS1_CK_DHE_DSS_WITH_AES_128_SHA, | 787 | TLS1_CK_DHE_DSS_WITH_AES_128_SHA, |
| 788 | SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1, | 788 | SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1, |
| 789 | SSL_NOT_EXP|SSL_HIGH, | 789 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 790 | 0, | 790 | 0, |
| 791 | 128, | 791 | 128, |
| 792 | 128, | 792 | 128, |
| @@ -799,7 +799,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 799 | TLS1_TXT_DHE_RSA_WITH_AES_128_SHA, | 799 | TLS1_TXT_DHE_RSA_WITH_AES_128_SHA, |
| 800 | TLS1_CK_DHE_RSA_WITH_AES_128_SHA, | 800 | TLS1_CK_DHE_RSA_WITH_AES_128_SHA, |
| 801 | SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1, | 801 | SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1, |
| 802 | SSL_NOT_EXP|SSL_HIGH, | 802 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 803 | 0, | 803 | 0, |
| 804 | 128, | 804 | 128, |
| 805 | 128, | 805 | 128, |
| @@ -812,7 +812,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 812 | TLS1_TXT_ADH_WITH_AES_128_SHA, | 812 | TLS1_TXT_ADH_WITH_AES_128_SHA, |
| 813 | TLS1_CK_ADH_WITH_AES_128_SHA, | 813 | TLS1_CK_ADH_WITH_AES_128_SHA, |
| 814 | SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1, | 814 | SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1, |
| 815 | SSL_NOT_EXP|SSL_HIGH, | 815 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 816 | 0, | 816 | 0, |
| 817 | 128, | 817 | 128, |
| 818 | 128, | 818 | 128, |
| @@ -826,7 +826,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 826 | TLS1_TXT_RSA_WITH_AES_256_SHA, | 826 | TLS1_TXT_RSA_WITH_AES_256_SHA, |
| 827 | TLS1_CK_RSA_WITH_AES_256_SHA, | 827 | TLS1_CK_RSA_WITH_AES_256_SHA, |
| 828 | SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1, | 828 | SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1, |
| 829 | SSL_NOT_EXP|SSL_HIGH, | 829 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 830 | 0, | 830 | 0, |
| 831 | 256, | 831 | 256, |
| 832 | 256, | 832 | 256, |
| @@ -839,7 +839,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 839 | TLS1_TXT_DH_DSS_WITH_AES_256_SHA, | 839 | TLS1_TXT_DH_DSS_WITH_AES_256_SHA, |
| 840 | TLS1_CK_DH_DSS_WITH_AES_256_SHA, | 840 | TLS1_CK_DH_DSS_WITH_AES_256_SHA, |
| 841 | SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, | 841 | SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, |
| 842 | SSL_NOT_EXP|SSL_HIGH, | 842 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 843 | 0, | 843 | 0, |
| 844 | 256, | 844 | 256, |
| 845 | 256, | 845 | 256, |
| @@ -852,7 +852,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 852 | TLS1_TXT_DH_RSA_WITH_AES_256_SHA, | 852 | TLS1_TXT_DH_RSA_WITH_AES_256_SHA, |
| 853 | TLS1_CK_DH_RSA_WITH_AES_256_SHA, | 853 | TLS1_CK_DH_RSA_WITH_AES_256_SHA, |
| 854 | SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, | 854 | SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, |
| 855 | SSL_NOT_EXP|SSL_HIGH, | 855 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 856 | 0, | 856 | 0, |
| 857 | 256, | 857 | 256, |
| 858 | 256, | 858 | 256, |
| @@ -865,7 +865,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 865 | TLS1_TXT_DHE_DSS_WITH_AES_256_SHA, | 865 | TLS1_TXT_DHE_DSS_WITH_AES_256_SHA, |
| 866 | TLS1_CK_DHE_DSS_WITH_AES_256_SHA, | 866 | TLS1_CK_DHE_DSS_WITH_AES_256_SHA, |
| 867 | SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1, | 867 | SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1, |
| 868 | SSL_NOT_EXP|SSL_HIGH, | 868 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 869 | 0, | 869 | 0, |
| 870 | 256, | 870 | 256, |
| 871 | 256, | 871 | 256, |
| @@ -878,7 +878,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 878 | TLS1_TXT_DHE_RSA_WITH_AES_256_SHA, | 878 | TLS1_TXT_DHE_RSA_WITH_AES_256_SHA, |
| 879 | TLS1_CK_DHE_RSA_WITH_AES_256_SHA, | 879 | TLS1_CK_DHE_RSA_WITH_AES_256_SHA, |
| 880 | SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1, | 880 | SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1, |
| 881 | SSL_NOT_EXP|SSL_HIGH, | 881 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 882 | 0, | 882 | 0, |
| 883 | 256, | 883 | 256, |
| 884 | 256, | 884 | 256, |
| @@ -891,7 +891,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
| 891 | TLS1_TXT_ADH_WITH_AES_256_SHA, | 891 | TLS1_TXT_ADH_WITH_AES_256_SHA, |
| 892 | TLS1_CK_ADH_WITH_AES_256_SHA, | 892 | TLS1_CK_ADH_WITH_AES_256_SHA, |
| 893 | SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1, | 893 | SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1, |
| 894 | SSL_NOT_EXP|SSL_HIGH, | 894 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
| 895 | 0, | 895 | 0, |
| 896 | 256, | 896 | 256, |
| 897 | 256, | 897 | 256, |
diff --git a/src/lib/libssl/s3_pkt.c b/src/lib/libssl/s3_pkt.c index 44c7c143fe..9476dcddf6 100644 --- a/src/lib/libssl/s3_pkt.c +++ b/src/lib/libssl/s3_pkt.c | |||
| @@ -753,8 +753,15 @@ int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, | |||
| 753 | s->rwstate=SSL_NOTHING; | 753 | s->rwstate=SSL_NOTHING; |
| 754 | return(s->s3->wpend_ret); | 754 | return(s->s3->wpend_ret); |
| 755 | } | 755 | } |
| 756 | else if (i <= 0) | 756 | else if (i <= 0) { |
| 757 | if (s->version == DTLS1_VERSION || | ||
| 758 | s->version == DTLS1_BAD_VER) { | ||
| 759 | /* For DTLS, just drop it. That's kind of the whole | ||
| 760 | point in using a datagram service */ | ||
| 761 | s->s3->wbuf.left = 0; | ||
| 762 | } | ||
| 757 | return(i); | 763 | return(i); |
| 764 | } | ||
| 758 | s->s3->wbuf.offset+=i; | 765 | s->s3->wbuf.offset+=i; |
| 759 | s->s3->wbuf.left-=i; | 766 | s->s3->wbuf.left-=i; |
| 760 | } | 767 | } |
| @@ -1225,6 +1232,13 @@ int ssl3_do_change_cipher_spec(SSL *s) | |||
| 1225 | 1232 | ||
| 1226 | if (s->s3->tmp.key_block == NULL) | 1233 | if (s->s3->tmp.key_block == NULL) |
| 1227 | { | 1234 | { |
| 1235 | if (s->session == NULL) | ||
| 1236 | { | ||
| 1237 | /* might happen if dtls1_read_bytes() calls this */ | ||
| 1238 | SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC,SSL_R_CCS_RECEIVED_EARLY); | ||
| 1239 | return (0); | ||
| 1240 | } | ||
| 1241 | |||
| 1228 | s->session->cipher=s->s3->tmp.new_cipher; | 1242 | s->session->cipher=s->s3->tmp.new_cipher; |
| 1229 | if (!s->method->ssl3_enc->setup_key_block(s)) return(0); | 1243 | if (!s->method->ssl3_enc->setup_key_block(s)) return(0); |
| 1230 | } | 1244 | } |
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c index 903522ab59..80b45eb86f 100644 --- a/src/lib/libssl/s3_srvr.c +++ b/src/lib/libssl/s3_srvr.c | |||
| @@ -902,22 +902,28 @@ int ssl3_get_client_hello(SSL *s) | |||
| 902 | break; | 902 | break; |
| 903 | } | 903 | } |
| 904 | } | 904 | } |
| 905 | if (j == 0) | 905 | if (j == 0 && (s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1)) |
| 906 | { | 906 | { |
| 907 | if ((s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1)) | 907 | /* Special case as client bug workaround: the previously used cipher may |
| 908 | { | 908 | * not be in the current list, the client instead might be trying to |
| 909 | /* Very bad for multi-threading.... */ | 909 | * continue using a cipher that before wasn't chosen due to server |
| 910 | s->session->cipher=sk_SSL_CIPHER_value(ciphers, 0); | 910 | * preferences. We'll have to reject the connection if the cipher is not |
| 911 | } | 911 | * enabled, though. */ |
| 912 | else | 912 | c = sk_SSL_CIPHER_value(ciphers, 0); |
| 913 | if (sk_SSL_CIPHER_find(SSL_get_ciphers(s), c) >= 0) | ||
| 913 | { | 914 | { |
| 914 | /* we need to have the cipher in the cipher | 915 | s->session->cipher = c; |
| 915 | * list if we are asked to reuse it */ | 916 | j = 1; |
| 916 | al=SSL_AD_ILLEGAL_PARAMETER; | ||
| 917 | SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING); | ||
| 918 | goto f_err; | ||
| 919 | } | 917 | } |
| 920 | } | 918 | } |
| 919 | if (j == 0) | ||
| 920 | { | ||
| 921 | /* we need to have the cipher in the cipher | ||
| 922 | * list if we are asked to reuse it */ | ||
| 923 | al=SSL_AD_ILLEGAL_PARAMETER; | ||
| 924 | SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING); | ||
| 925 | goto f_err; | ||
| 926 | } | ||
| 921 | } | 927 | } |
| 922 | 928 | ||
| 923 | /* compression */ | 929 | /* compression */ |
| @@ -1172,13 +1178,13 @@ int ssl3_send_server_hello(SSL *s) | |||
| 1172 | *(d++)=SSL3_MT_SERVER_HELLO; | 1178 | *(d++)=SSL3_MT_SERVER_HELLO; |
| 1173 | l2n3(l,d); | 1179 | l2n3(l,d); |
| 1174 | 1180 | ||
| 1175 | s->state=SSL3_ST_CW_CLNT_HELLO_B; | 1181 | s->state=SSL3_ST_SW_SRVR_HELLO_B; |
| 1176 | /* number of bytes to write */ | 1182 | /* number of bytes to write */ |
| 1177 | s->init_num=p-buf; | 1183 | s->init_num=p-buf; |
| 1178 | s->init_off=0; | 1184 | s->init_off=0; |
| 1179 | } | 1185 | } |
| 1180 | 1186 | ||
| 1181 | /* SSL3_ST_CW_CLNT_HELLO_B */ | 1187 | /* SSL3_ST_SW_SRVR_HELLO_B */ |
| 1182 | return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); | 1188 | return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); |
| 1183 | } | 1189 | } |
| 1184 | 1190 | ||
| @@ -1202,7 +1208,7 @@ int ssl3_send_server_done(SSL *s) | |||
| 1202 | s->init_off=0; | 1208 | s->init_off=0; |
| 1203 | } | 1209 | } |
| 1204 | 1210 | ||
| 1205 | /* SSL3_ST_CW_CLNT_HELLO_B */ | 1211 | /* SSL3_ST_SW_SRVR_DONE_B */ |
| 1206 | return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); | 1212 | return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); |
| 1207 | } | 1213 | } |
| 1208 | 1214 | ||
| @@ -1540,6 +1546,8 @@ int ssl3_send_server_key_exchange(SSL *s) | |||
| 1540 | j=0; | 1546 | j=0; |
| 1541 | for (num=2; num > 0; num--) | 1547 | for (num=2; num > 0; num--) |
| 1542 | { | 1548 | { |
| 1549 | EVP_MD_CTX_set_flags(&md_ctx, | ||
| 1550 | EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); | ||
| 1543 | EVP_DigestInit_ex(&md_ctx,(num == 2) | 1551 | EVP_DigestInit_ex(&md_ctx,(num == 2) |
| 1544 | ?s->ctx->md5:s->ctx->sha1, NULL); | 1552 | ?s->ctx->md5:s->ctx->sha1, NULL); |
| 1545 | EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); | 1553 | EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); |
| @@ -2558,7 +2566,7 @@ int ssl3_get_client_certificate(SSL *s) | |||
| 2558 | else | 2566 | else |
| 2559 | { | 2567 | { |
| 2560 | i=ssl_verify_cert_chain(s,sk); | 2568 | i=ssl_verify_cert_chain(s,sk); |
| 2561 | if (!i) | 2569 | if (i <= 0) |
| 2562 | { | 2570 | { |
| 2563 | al=ssl_verify_alarm_type(s->verify_result); | 2571 | al=ssl_verify_alarm_type(s->verify_result); |
| 2564 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED); | 2572 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED); |
diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h index 6df921f3c1..ff8a128d3c 100644 --- a/src/lib/libssl/ssl.h +++ b/src/lib/libssl/ssl.h | |||
| @@ -252,6 +252,7 @@ extern "C" { | |||
| 252 | #define SSL_TXT_LOW "LOW" | 252 | #define SSL_TXT_LOW "LOW" |
| 253 | #define SSL_TXT_MEDIUM "MEDIUM" | 253 | #define SSL_TXT_MEDIUM "MEDIUM" |
| 254 | #define SSL_TXT_HIGH "HIGH" | 254 | #define SSL_TXT_HIGH "HIGH" |
| 255 | #define SSL_TXT_FIPS "FIPS" | ||
| 255 | #define SSL_TXT_kFZA "kFZA" | 256 | #define SSL_TXT_kFZA "kFZA" |
| 256 | #define SSL_TXT_aFZA "aFZA" | 257 | #define SSL_TXT_aFZA "aFZA" |
| 257 | #define SSL_TXT_eFZA "eFZA" | 258 | #define SSL_TXT_eFZA "eFZA" |
| @@ -361,9 +362,6 @@ typedef struct ssl_cipher_st | |||
| 361 | 362 | ||
| 362 | DECLARE_STACK_OF(SSL_CIPHER) | 363 | DECLARE_STACK_OF(SSL_CIPHER) |
| 363 | 364 | ||
| 364 | typedef struct ssl_st SSL; | ||
| 365 | typedef struct ssl_ctx_st SSL_CTX; | ||
| 366 | |||
| 367 | /* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */ | 365 | /* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */ |
| 368 | typedef struct ssl_method_st | 366 | typedef struct ssl_method_st |
| 369 | { | 367 | { |
| @@ -760,6 +758,12 @@ struct ssl_ctx_st | |||
| 760 | 758 | ||
| 761 | int quiet_shutdown; | 759 | int quiet_shutdown; |
| 762 | 760 | ||
| 761 | #ifndef OPENSSL_ENGINE | ||
| 762 | /* Engine to pass requests for client certs to | ||
| 763 | */ | ||
| 764 | ENGINE *client_cert_engine; | ||
| 765 | #endif | ||
| 766 | |||
| 763 | #ifndef OPENSSL_NO_TLSEXT | 767 | #ifndef OPENSSL_NO_TLSEXT |
| 764 | /* TLS extensions servername callback */ | 768 | /* TLS extensions servername callback */ |
| 765 | int (*tlsext_servername_callback)(SSL*, int *, void *); | 769 | int (*tlsext_servername_callback)(SSL*, int *, void *); |
| @@ -829,6 +833,9 @@ void SSL_CTX_set_info_callback(SSL_CTX *ctx, void (*cb)(const SSL *ssl,int type, | |||
| 829 | void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl,int type,int val); | 833 | void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl,int type,int val); |
| 830 | void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, int (*client_cert_cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey)); | 834 | void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, int (*client_cert_cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey)); |
| 831 | int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL *ssl, X509 **x509, EVP_PKEY **pkey); | 835 | int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL *ssl, X509 **x509, EVP_PKEY **pkey); |
| 836 | #ifndef OPENSSL_NO_ENGINE | ||
| 837 | int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e); | ||
| 838 | #endif | ||
| 832 | void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, int (*app_gen_cookie_cb)(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len)); | 839 | void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, int (*app_gen_cookie_cb)(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len)); |
| 833 | void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, int (*app_verify_cookie_cb)(SSL *ssl, unsigned char *cookie, unsigned int cookie_len)); | 840 | void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, int (*app_verify_cookie_cb)(SSL *ssl, unsigned char *cookie, unsigned int cookie_len)); |
| 834 | 841 | ||
| @@ -1702,6 +1709,7 @@ void ERR_load_SSL_strings(void); | |||
| 1702 | #define SSL_F_SSL3_CONNECT 132 | 1709 | #define SSL_F_SSL3_CONNECT 132 |
| 1703 | #define SSL_F_SSL3_CTRL 213 | 1710 | #define SSL_F_SSL3_CTRL 213 |
| 1704 | #define SSL_F_SSL3_CTX_CTRL 133 | 1711 | #define SSL_F_SSL3_CTX_CTRL 133 |
| 1712 | #define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC 279 | ||
| 1705 | #define SSL_F_SSL3_ENC 134 | 1713 | #define SSL_F_SSL3_ENC 134 |
| 1706 | #define SSL_F_SSL3_GENERATE_KEY_BLOCK 238 | 1714 | #define SSL_F_SSL3_GENERATE_KEY_BLOCK 238 |
| 1707 | #define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135 | 1715 | #define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135 |
| @@ -1755,6 +1763,7 @@ void ERR_load_SSL_strings(void); | |||
| 1755 | #define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168 | 1763 | #define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168 |
| 1756 | #define SSL_F_SSL_CTX_NEW 169 | 1764 | #define SSL_F_SSL_CTX_NEW 169 |
| 1757 | #define SSL_F_SSL_CTX_SET_CIPHER_LIST 269 | 1765 | #define SSL_F_SSL_CTX_SET_CIPHER_LIST 269 |
| 1766 | #define SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE 278 | ||
| 1758 | #define SSL_F_SSL_CTX_SET_PURPOSE 226 | 1767 | #define SSL_F_SSL_CTX_SET_PURPOSE 226 |
| 1759 | #define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219 | 1768 | #define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219 |
| 1760 | #define SSL_F_SSL_CTX_SET_SSL_VERSION 170 | 1769 | #define SSL_F_SSL_CTX_SET_SSL_VERSION 170 |
| @@ -1935,6 +1944,7 @@ void ERR_load_SSL_strings(void); | |||
| 1935 | #define SSL_R_NO_CIPHERS_SPECIFIED 183 | 1944 | #define SSL_R_NO_CIPHERS_SPECIFIED 183 |
| 1936 | #define SSL_R_NO_CIPHER_LIST 184 | 1945 | #define SSL_R_NO_CIPHER_LIST 184 |
| 1937 | #define SSL_R_NO_CIPHER_MATCH 185 | 1946 | #define SSL_R_NO_CIPHER_MATCH 185 |
| 1947 | #define SSL_R_NO_CLIENT_CERT_METHOD 317 | ||
| 1938 | #define SSL_R_NO_CLIENT_CERT_RECEIVED 186 | 1948 | #define SSL_R_NO_CLIENT_CERT_RECEIVED 186 |
| 1939 | #define SSL_R_NO_COMPRESSION_SPECIFIED 187 | 1949 | #define SSL_R_NO_COMPRESSION_SPECIFIED 187 |
| 1940 | #define SSL_R_NO_METHOD_SPECIFIED 188 | 1950 | #define SSL_R_NO_METHOD_SPECIFIED 188 |
diff --git a/src/lib/libssl/ssl_asn1.c b/src/lib/libssl/ssl_asn1.c index 6e14f4d834..0f9a3489dd 100644 --- a/src/lib/libssl/ssl_asn1.c +++ b/src/lib/libssl/ssl_asn1.c | |||
| @@ -353,7 +353,7 @@ SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, | |||
| 353 | memcpy(ret->session_id,os.data,os.length); | 353 | memcpy(ret->session_id,os.data,os.length); |
| 354 | 354 | ||
| 355 | M_ASN1_D2I_get_x(ASN1_OCTET_STRING,osp,d2i_ASN1_OCTET_STRING); | 355 | M_ASN1_D2I_get_x(ASN1_OCTET_STRING,osp,d2i_ASN1_OCTET_STRING); |
| 356 | if (ret->master_key_length > SSL_MAX_MASTER_KEY_LENGTH) | 356 | if (os.length > SSL_MAX_MASTER_KEY_LENGTH) |
| 357 | ret->master_key_length=SSL_MAX_MASTER_KEY_LENGTH; | 357 | ret->master_key_length=SSL_MAX_MASTER_KEY_LENGTH; |
| 358 | else | 358 | else |
| 359 | ret->master_key_length=os.length; | 359 | ret->master_key_length=os.length; |
diff --git a/src/lib/libssl/ssl_ciph.c b/src/lib/libssl/ssl_ciph.c index 725f7f3c1f..0c2aa249b4 100644 --- a/src/lib/libssl/ssl_ciph.c +++ b/src/lib/libssl/ssl_ciph.c | |||
| @@ -115,7 +115,10 @@ | |||
| 115 | */ | 115 | */ |
| 116 | #include <stdio.h> | 116 | #include <stdio.h> |
| 117 | #include <openssl/objects.h> | 117 | #include <openssl/objects.h> |
| 118 | #ifndef OPENSSL_NO_COMP | ||
| 118 | #include <openssl/comp.h> | 119 | #include <openssl/comp.h> |
| 120 | #endif | ||
| 121 | |||
| 119 | #include "ssl_locl.h" | 122 | #include "ssl_locl.h" |
| 120 | 123 | ||
| 121 | #define SSL_ENC_DES_IDX 0 | 124 | #define SSL_ENC_DES_IDX 0 |
| @@ -222,6 +225,7 @@ static const SSL_CIPHER cipher_aliases[]={ | |||
| 222 | {0,SSL_TXT_LOW, 0, 0, SSL_LOW, 0,0,0,0,SSL_STRONG_MASK}, | 225 | {0,SSL_TXT_LOW, 0, 0, SSL_LOW, 0,0,0,0,SSL_STRONG_MASK}, |
| 223 | {0,SSL_TXT_MEDIUM,0, 0,SSL_MEDIUM, 0,0,0,0,SSL_STRONG_MASK}, | 226 | {0,SSL_TXT_MEDIUM,0, 0,SSL_MEDIUM, 0,0,0,0,SSL_STRONG_MASK}, |
| 224 | {0,SSL_TXT_HIGH, 0, 0, SSL_HIGH, 0,0,0,0,SSL_STRONG_MASK}, | 227 | {0,SSL_TXT_HIGH, 0, 0, SSL_HIGH, 0,0,0,0,SSL_STRONG_MASK}, |
| 228 | {0,SSL_TXT_FIPS, 0, 0, SSL_FIPS, 0,0,0,0,SSL_FIPS|SSL_STRONG_NONE}, | ||
| 225 | }; | 229 | }; |
| 226 | 230 | ||
| 227 | void ssl_load_ciphers(void) | 231 | void ssl_load_ciphers(void) |
| @@ -515,7 +519,12 @@ static void ssl_cipher_collect_ciphers(const SSL_METHOD *ssl_method, | |||
| 515 | c = ssl_method->get_cipher(i); | 519 | c = ssl_method->get_cipher(i); |
| 516 | #define IS_MASKED(c) ((c)->algorithms & (((c)->alg_bits == 256) ? m256 : mask)) | 520 | #define IS_MASKED(c) ((c)->algorithms & (((c)->alg_bits == 256) ? m256 : mask)) |
| 517 | /* drop those that use any of that is not available */ | 521 | /* drop those that use any of that is not available */ |
| 522 | #ifdef OPENSSL_FIPS | ||
| 523 | if ((c != NULL) && c->valid && !IS_MASKED(c) | ||
| 524 | && (!FIPS_mode() || (c->algo_strength & SSL_FIPS))) | ||
| 525 | #else | ||
| 518 | if ((c != NULL) && c->valid && !IS_MASKED(c)) | 526 | if ((c != NULL) && c->valid && !IS_MASKED(c)) |
| 527 | #endif | ||
| 519 | { | 528 | { |
| 520 | co_list[co_list_num].cipher = c; | 529 | co_list[co_list_num].cipher = c; |
| 521 | co_list[co_list_num].next = NULL; | 530 | co_list[co_list_num].next = NULL; |
| @@ -1054,7 +1063,11 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method, | |||
| 1054 | */ | 1063 | */ |
| 1055 | for (curr = head; curr != NULL; curr = curr->next) | 1064 | for (curr = head; curr != NULL; curr = curr->next) |
| 1056 | { | 1065 | { |
| 1066 | #ifdef OPENSSL_FIPS | ||
| 1067 | if (curr->active && (!FIPS_mode() || curr->cipher->algo_strength & SSL_FIPS)) | ||
| 1068 | #else | ||
| 1057 | if (curr->active) | 1069 | if (curr->active) |
| 1070 | #endif | ||
| 1058 | { | 1071 | { |
| 1059 | sk_SSL_CIPHER_push(cipherstack, curr->cipher); | 1072 | sk_SSL_CIPHER_push(cipherstack, curr->cipher); |
| 1060 | #ifdef CIPHER_DEBUG | 1073 | #ifdef CIPHER_DEBUG |
diff --git a/src/lib/libssl/ssl_err.c b/src/lib/libssl/ssl_err.c index 50779c1632..24a994fe01 100644 --- a/src/lib/libssl/ssl_err.c +++ b/src/lib/libssl/ssl_err.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* ssl/ssl_err.c */ | 1 | /* ssl/ssl_err.c */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1999-2008 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that the following conditions | 6 | * modification, are permitted provided that the following conditions |
| @@ -138,6 +138,7 @@ static ERR_STRING_DATA SSL_str_functs[]= | |||
| 138 | {ERR_FUNC(SSL_F_SSL3_CONNECT), "SSL3_CONNECT"}, | 138 | {ERR_FUNC(SSL_F_SSL3_CONNECT), "SSL3_CONNECT"}, |
| 139 | {ERR_FUNC(SSL_F_SSL3_CTRL), "SSL3_CTRL"}, | 139 | {ERR_FUNC(SSL_F_SSL3_CTRL), "SSL3_CTRL"}, |
| 140 | {ERR_FUNC(SSL_F_SSL3_CTX_CTRL), "SSL3_CTX_CTRL"}, | 140 | {ERR_FUNC(SSL_F_SSL3_CTX_CTRL), "SSL3_CTX_CTRL"}, |
| 141 | {ERR_FUNC(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC), "SSL3_DO_CHANGE_CIPHER_SPEC"}, | ||
| 141 | {ERR_FUNC(SSL_F_SSL3_ENC), "SSL3_ENC"}, | 142 | {ERR_FUNC(SSL_F_SSL3_ENC), "SSL3_ENC"}, |
| 142 | {ERR_FUNC(SSL_F_SSL3_GENERATE_KEY_BLOCK), "SSL3_GENERATE_KEY_BLOCK"}, | 143 | {ERR_FUNC(SSL_F_SSL3_GENERATE_KEY_BLOCK), "SSL3_GENERATE_KEY_BLOCK"}, |
| 143 | {ERR_FUNC(SSL_F_SSL3_GET_CERTIFICATE_REQUEST), "SSL3_GET_CERTIFICATE_REQUEST"}, | 144 | {ERR_FUNC(SSL_F_SSL3_GET_CERTIFICATE_REQUEST), "SSL3_GET_CERTIFICATE_REQUEST"}, |
| @@ -191,6 +192,7 @@ static ERR_STRING_DATA SSL_str_functs[]= | |||
| 191 | {ERR_FUNC(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY), "SSL_CTX_check_private_key"}, | 192 | {ERR_FUNC(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY), "SSL_CTX_check_private_key"}, |
| 192 | {ERR_FUNC(SSL_F_SSL_CTX_NEW), "SSL_CTX_new"}, | 193 | {ERR_FUNC(SSL_F_SSL_CTX_NEW), "SSL_CTX_new"}, |
| 193 | {ERR_FUNC(SSL_F_SSL_CTX_SET_CIPHER_LIST), "SSL_CTX_set_cipher_list"}, | 194 | {ERR_FUNC(SSL_F_SSL_CTX_SET_CIPHER_LIST), "SSL_CTX_set_cipher_list"}, |
| 195 | {ERR_FUNC(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE), "SSL_CTX_set_client_cert_engine"}, | ||
| 194 | {ERR_FUNC(SSL_F_SSL_CTX_SET_PURPOSE), "SSL_CTX_set_purpose"}, | 196 | {ERR_FUNC(SSL_F_SSL_CTX_SET_PURPOSE), "SSL_CTX_set_purpose"}, |
| 195 | {ERR_FUNC(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT), "SSL_CTX_set_session_id_context"}, | 197 | {ERR_FUNC(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT), "SSL_CTX_set_session_id_context"}, |
| 196 | {ERR_FUNC(SSL_F_SSL_CTX_SET_SSL_VERSION), "SSL_CTX_set_ssl_version"}, | 198 | {ERR_FUNC(SSL_F_SSL_CTX_SET_SSL_VERSION), "SSL_CTX_set_ssl_version"}, |
| @@ -374,6 +376,7 @@ static ERR_STRING_DATA SSL_str_reasons[]= | |||
| 374 | {ERR_REASON(SSL_R_NO_CIPHERS_SPECIFIED) ,"no ciphers specified"}, | 376 | {ERR_REASON(SSL_R_NO_CIPHERS_SPECIFIED) ,"no ciphers specified"}, |
| 375 | {ERR_REASON(SSL_R_NO_CIPHER_LIST) ,"no cipher list"}, | 377 | {ERR_REASON(SSL_R_NO_CIPHER_LIST) ,"no cipher list"}, |
| 376 | {ERR_REASON(SSL_R_NO_CIPHER_MATCH) ,"no cipher match"}, | 378 | {ERR_REASON(SSL_R_NO_CIPHER_MATCH) ,"no cipher match"}, |
| 379 | {ERR_REASON(SSL_R_NO_CLIENT_CERT_METHOD) ,"no client cert method"}, | ||
| 377 | {ERR_REASON(SSL_R_NO_CLIENT_CERT_RECEIVED),"no client cert received"}, | 380 | {ERR_REASON(SSL_R_NO_CLIENT_CERT_RECEIVED),"no client cert received"}, |
| 378 | {ERR_REASON(SSL_R_NO_COMPRESSION_SPECIFIED),"no compression specified"}, | 381 | {ERR_REASON(SSL_R_NO_COMPRESSION_SPECIFIED),"no compression specified"}, |
| 379 | {ERR_REASON(SSL_R_NO_METHOD_SPECIFIED) ,"no method specified"}, | 382 | {ERR_REASON(SSL_R_NO_METHOD_SPECIFIED) ,"no method specified"}, |
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index 065411aea8..68eee77e6f 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
| @@ -130,6 +130,9 @@ | |||
| 130 | #ifndef OPENSSL_NO_DH | 130 | #ifndef OPENSSL_NO_DH |
| 131 | #include <openssl/dh.h> | 131 | #include <openssl/dh.h> |
| 132 | #endif | 132 | #endif |
| 133 | #ifndef OPENSSL_NO_ENGINE | ||
| 134 | #include <openssl/engine.h> | ||
| 135 | #endif | ||
| 133 | 136 | ||
| 134 | const char *SSL_version_str=OPENSSL_VERSION_TEXT; | 137 | const char *SSL_version_str=OPENSSL_VERSION_TEXT; |
| 135 | 138 | ||
| @@ -1393,6 +1396,14 @@ SSL_CTX *SSL_CTX_new(SSL_METHOD *meth) | |||
| 1393 | return(NULL); | 1396 | return(NULL); |
| 1394 | } | 1397 | } |
| 1395 | 1398 | ||
| 1399 | #ifdef OPENSSL_FIPS | ||
| 1400 | if (FIPS_mode() && (meth->version < TLS1_VERSION)) | ||
| 1401 | { | ||
| 1402 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | ||
| 1403 | return NULL; | ||
| 1404 | } | ||
| 1405 | #endif | ||
| 1406 | |||
| 1396 | if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0) | 1407 | if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0) |
| 1397 | { | 1408 | { |
| 1398 | SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS); | 1409 | SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS); |
| @@ -1513,6 +1524,27 @@ SSL_CTX *SSL_CTX_new(SSL_METHOD *meth) | |||
| 1513 | 1524 | ||
| 1514 | #endif | 1525 | #endif |
| 1515 | 1526 | ||
| 1527 | #ifndef OPENSSL_NO_ENGINE | ||
| 1528 | ret->client_cert_engine = NULL; | ||
| 1529 | #ifdef OPENSSL_SSL_CLIENT_ENGINE_AUTO | ||
| 1530 | #define eng_strx(x) #x | ||
| 1531 | #define eng_str(x) eng_strx(x) | ||
| 1532 | /* Use specific client engine automatically... ignore errors */ | ||
| 1533 | { | ||
| 1534 | ENGINE *eng; | ||
| 1535 | eng = ENGINE_by_id(eng_str(OPENSSL_SSL_CLIENT_ENGINE_AUTO)); | ||
| 1536 | if (!eng) | ||
| 1537 | { | ||
| 1538 | ERR_clear_error(); | ||
| 1539 | ENGINE_load_builtin_engines(); | ||
| 1540 | eng = ENGINE_by_id(eng_str(OPENSSL_SSL_CLIENT_ENGINE_AUTO)); | ||
| 1541 | } | ||
| 1542 | if (!eng || !SSL_CTX_set_client_cert_engine(ret, eng)) | ||
| 1543 | ERR_clear_error(); | ||
| 1544 | } | ||
| 1545 | #endif | ||
| 1546 | #endif | ||
| 1547 | |||
| 1516 | return(ret); | 1548 | return(ret); |
| 1517 | err: | 1549 | err: |
| 1518 | SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE); | 1550 | SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE); |
| @@ -1583,6 +1615,10 @@ void SSL_CTX_free(SSL_CTX *a) | |||
| 1583 | #else | 1615 | #else |
| 1584 | a->comp_methods = NULL; | 1616 | a->comp_methods = NULL; |
| 1585 | #endif | 1617 | #endif |
| 1618 | #ifndef OPENSSL_NO_ENGINE | ||
| 1619 | if (a->client_cert_engine) | ||
| 1620 | ENGINE_finish(a->client_cert_engine); | ||
| 1621 | #endif | ||
| 1586 | OPENSSL_free(a); | 1622 | OPENSSL_free(a); |
| 1587 | } | 1623 | } |
| 1588 | 1624 | ||
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index de94c0d0c7..ed4ddbbae6 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h | |||
| @@ -124,7 +124,9 @@ | |||
| 124 | #include "e_os.h" | 124 | #include "e_os.h" |
| 125 | 125 | ||
| 126 | #include <openssl/buffer.h> | 126 | #include <openssl/buffer.h> |
| 127 | #ifndef OPENSSL_NO_COMP | ||
| 127 | #include <openssl/comp.h> | 128 | #include <openssl/comp.h> |
| 129 | #endif | ||
| 128 | #include <openssl/bio.h> | 130 | #include <openssl/bio.h> |
| 129 | #include <openssl/stack.h> | 131 | #include <openssl/stack.h> |
| 130 | #ifndef OPENSSL_NO_RSA | 132 | #ifndef OPENSSL_NO_RSA |
| @@ -330,8 +332,9 @@ | |||
| 330 | #define SSL_LOW 0x00000020L | 332 | #define SSL_LOW 0x00000020L |
| 331 | #define SSL_MEDIUM 0x00000040L | 333 | #define SSL_MEDIUM 0x00000040L |
| 332 | #define SSL_HIGH 0x00000080L | 334 | #define SSL_HIGH 0x00000080L |
| 335 | #define SSL_FIPS 0x00000100L | ||
| 333 | 336 | ||
| 334 | /* we have used 000000ff - 24 bits left to go */ | 337 | /* we have used 000001ff - 23 bits left to go */ |
| 335 | 338 | ||
| 336 | /* | 339 | /* |
| 337 | * Macros to check the export status and cipher strength for export ciphers. | 340 | * Macros to check the export status and cipher strength for export ciphers. |
| @@ -499,6 +502,7 @@ typedef struct ssl3_enc_method | |||
| 499 | int (*alert_value)(int); | 502 | int (*alert_value)(int); |
| 500 | } SSL3_ENC_METHOD; | 503 | } SSL3_ENC_METHOD; |
| 501 | 504 | ||
| 505 | #ifndef OPENSSL_NO_COMP | ||
| 502 | /* Used for holding the relevant compression methods loaded into SSL_CTX */ | 506 | /* Used for holding the relevant compression methods loaded into SSL_CTX */ |
| 503 | typedef struct ssl3_comp_st | 507 | typedef struct ssl3_comp_st |
| 504 | { | 508 | { |
| @@ -506,6 +510,7 @@ typedef struct ssl3_comp_st | |||
| 506 | char *name; /* Text name used for the compression type */ | 510 | char *name; /* Text name used for the compression type */ |
| 507 | COMP_METHOD *method; /* The method :-) */ | 511 | COMP_METHOD *method; /* The method :-) */ |
| 508 | } SSL3_COMP; | 512 | } SSL3_COMP; |
| 513 | #endif | ||
| 509 | 514 | ||
| 510 | extern SSL3_ENC_METHOD ssl3_undef_enc_method; | 515 | extern SSL3_ENC_METHOD ssl3_undef_enc_method; |
| 511 | OPENSSL_EXTERN SSL_CIPHER ssl2_ciphers[]; | 516 | OPENSSL_EXTERN SSL_CIPHER ssl2_ciphers[]; |
| @@ -874,6 +879,7 @@ int ssl3_get_new_session_ticket(SSL *s); | |||
| 874 | int ssl3_get_cert_status(SSL *s); | 879 | int ssl3_get_cert_status(SSL *s); |
| 875 | int ssl3_get_server_done(SSL *s); | 880 | int ssl3_get_server_done(SSL *s); |
| 876 | int ssl3_send_client_verify(SSL *s); | 881 | int ssl3_send_client_verify(SSL *s); |
| 882 | int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey); | ||
| 877 | int ssl3_send_client_certificate(SSL *s); | 883 | int ssl3_send_client_certificate(SSL *s); |
| 878 | int ssl3_send_client_key_exchange(SSL *s); | 884 | int ssl3_send_client_key_exchange(SSL *s); |
| 879 | int ssl3_get_key_exchange(SSL *s); | 885 | int ssl3_get_key_exchange(SSL *s); |
diff --git a/src/lib/libssl/ssl_sess.c b/src/lib/libssl/ssl_sess.c index ee88be2b88..8391d62212 100644 --- a/src/lib/libssl/ssl_sess.c +++ b/src/lib/libssl/ssl_sess.c | |||
| @@ -59,6 +59,9 @@ | |||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> |
| 60 | #include <openssl/lhash.h> | 60 | #include <openssl/lhash.h> |
| 61 | #include <openssl/rand.h> | 61 | #include <openssl/rand.h> |
| 62 | #ifndef OPENSSL_NO_ENGINE | ||
| 63 | #include <openssl/engine.h> | ||
| 64 | #endif | ||
| 62 | #include "ssl_locl.h" | 65 | #include "ssl_locl.h" |
| 63 | 66 | ||
| 64 | static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s); | 67 | static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s); |
| @@ -870,6 +873,25 @@ int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL * ssl, X509 ** x509 , EVP_PK | |||
| 870 | return ctx->client_cert_cb; | 873 | return ctx->client_cert_cb; |
| 871 | } | 874 | } |
| 872 | 875 | ||
| 876 | #ifndef OPENSSL_NO_ENGINE | ||
| 877 | int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e) | ||
| 878 | { | ||
| 879 | if (!ENGINE_init(e)) | ||
| 880 | { | ||
| 881 | SSLerr(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE, ERR_R_ENGINE_LIB); | ||
| 882 | return 0; | ||
| 883 | } | ||
| 884 | if(!ENGINE_get_ssl_client_cert_function(e)) | ||
| 885 | { | ||
| 886 | SSLerr(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE, SSL_R_NO_CLIENT_CERT_METHOD); | ||
| 887 | ENGINE_finish(e); | ||
| 888 | return 0; | ||
| 889 | } | ||
| 890 | ctx->client_cert_engine = e; | ||
| 891 | return 1; | ||
| 892 | } | ||
| 893 | #endif | ||
| 894 | |||
| 873 | void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, | 895 | void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, |
| 874 | int (*cb)(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len)) | 896 | int (*cb)(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len)) |
| 875 | { | 897 | { |
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c index ed5a4a7255..7cb3e29a41 100644 --- a/src/lib/libssl/t1_enc.c +++ b/src/lib/libssl/t1_enc.c | |||
| @@ -111,10 +111,15 @@ | |||
| 111 | 111 | ||
| 112 | #include <stdio.h> | 112 | #include <stdio.h> |
| 113 | #include "ssl_locl.h" | 113 | #include "ssl_locl.h" |
| 114 | #ifndef OPENSSL_NO_COMP | ||
| 114 | #include <openssl/comp.h> | 115 | #include <openssl/comp.h> |
| 116 | #endif | ||
| 115 | #include <openssl/evp.h> | 117 | #include <openssl/evp.h> |
| 116 | #include <openssl/hmac.h> | 118 | #include <openssl/hmac.h> |
| 117 | #include <openssl/md5.h> | 119 | #include <openssl/md5.h> |
| 120 | #ifdef KSSL_DEBUG | ||
| 121 | #include <openssl/des.h> | ||
| 122 | #endif | ||
| 118 | 123 | ||
| 119 | static void tls1_P_hash(const EVP_MD *md, const unsigned char *sec, | 124 | static void tls1_P_hash(const EVP_MD *md, const unsigned char *sec, |
| 120 | int sec_len, unsigned char *seed, int seed_len, | 125 | int sec_len, unsigned char *seed, int seed_len, |
| @@ -131,6 +136,8 @@ static void tls1_P_hash(const EVP_MD *md, const unsigned char *sec, | |||
| 131 | 136 | ||
| 132 | HMAC_CTX_init(&ctx); | 137 | HMAC_CTX_init(&ctx); |
| 133 | HMAC_CTX_init(&ctx_tmp); | 138 | HMAC_CTX_init(&ctx_tmp); |
| 139 | HMAC_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); | ||
| 140 | HMAC_CTX_set_flags(&ctx_tmp, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); | ||
| 134 | HMAC_Init_ex(&ctx,sec,sec_len,md, NULL); | 141 | HMAC_Init_ex(&ctx,sec,sec_len,md, NULL); |
| 135 | HMAC_Init_ex(&ctx_tmp,sec,sec_len,md, NULL); | 142 | HMAC_Init_ex(&ctx_tmp,sec,sec_len,md, NULL); |
| 136 | HMAC_Update(&ctx,seed,seed_len); | 143 | HMAC_Update(&ctx,seed,seed_len); |
| @@ -249,15 +256,15 @@ int tls1_change_cipher_state(SSL *s, int which) | |||
| 249 | #ifdef KSSL_DEBUG | 256 | #ifdef KSSL_DEBUG |
| 250 | printf("tls1_change_cipher_state(which= %d) w/\n", which); | 257 | printf("tls1_change_cipher_state(which= %d) w/\n", which); |
| 251 | printf("\talg= %ld, comp= %p\n", s->s3->tmp.new_cipher->algorithms, | 258 | printf("\talg= %ld, comp= %p\n", s->s3->tmp.new_cipher->algorithms, |
| 252 | comp); | 259 | (void *)comp); |
| 253 | printf("\tevp_cipher == %p ==? &d_cbc_ede_cipher3\n", c); | 260 | printf("\tevp_cipher == %p ==? &d_cbc_ede_cipher3\n", (void *)c); |
| 254 | printf("\tevp_cipher: nid, blksz= %d, %d, keylen=%d, ivlen=%d\n", | 261 | printf("\tevp_cipher: nid, blksz= %d, %d, keylen=%d, ivlen=%d\n", |
| 255 | c->nid,c->block_size,c->key_len,c->iv_len); | 262 | c->nid,c->block_size,c->key_len,c->iv_len); |
| 256 | printf("\tkey_block: len= %d, data= ", s->s3->tmp.key_block_length); | 263 | printf("\tkey_block: len= %d, data= ", s->s3->tmp.key_block_length); |
| 257 | { | 264 | { |
| 258 | int i; | 265 | int ki; |
| 259 | for (i=0; i<s->s3->tmp.key_block_length; i++) | 266 | for (ki=0; ki<s->s3->tmp.key_block_length; ki++) |
| 260 | printf("%02x", key_block[i]); printf("\n"); | 267 | printf("%02x", key_block[ki]); printf("\n"); |
| 261 | } | 268 | } |
| 262 | #endif /* KSSL_DEBUG */ | 269 | #endif /* KSSL_DEBUG */ |
| 263 | 270 | ||
| @@ -413,11 +420,13 @@ printf("which = %04X\nmac key=",which); | |||
| 413 | s->session->key_arg_length=0; | 420 | s->session->key_arg_length=0; |
| 414 | #ifdef KSSL_DEBUG | 421 | #ifdef KSSL_DEBUG |
| 415 | { | 422 | { |
| 416 | int i; | 423 | int ki; |
| 417 | printf("EVP_CipherInit_ex(dd,c,key=,iv=,which)\n"); | 424 | printf("EVP_CipherInit_ex(dd,c,key=,iv=,which)\n"); |
| 418 | printf("\tkey= "); for (i=0; i<c->key_len; i++) printf("%02x", key[i]); | 425 | printf("\tkey= "); |
| 426 | for (ki=0; ki<c->key_len; ki++) printf("%02x", key[ki]); | ||
| 419 | printf("\n"); | 427 | printf("\n"); |
| 420 | printf("\t iv= "); for (i=0; i<c->iv_len; i++) printf("%02x", iv[i]); | 428 | printf("\t iv= "); |
| 429 | for (ki=0; ki<c->iv_len; ki++) printf("%02x", iv[ki]); | ||
| 421 | printf("\n"); | 430 | printf("\n"); |
| 422 | } | 431 | } |
| 423 | #endif /* KSSL_DEBUG */ | 432 | #endif /* KSSL_DEBUG */ |
| @@ -590,10 +599,11 @@ int tls1_enc(SSL *s, int send) | |||
| 590 | { | 599 | { |
| 591 | unsigned long ui; | 600 | unsigned long ui; |
| 592 | printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n", | 601 | printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n", |
| 593 | ds,rec->data,rec->input,l); | 602 | (void *)ds,rec->data,rec->input,l); |
| 594 | printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n", | 603 | printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%ld %ld], %d iv_len\n", |
| 595 | ds->buf_len, ds->cipher->key_len, | 604 | ds->buf_len, ds->cipher->key_len, |
| 596 | DES_KEY_SZ, DES_SCHEDULE_SZ, | 605 | (unsigned long)DES_KEY_SZ, |
| 606 | (unsigned long)DES_SCHEDULE_SZ, | ||
| 597 | ds->cipher->iv_len); | 607 | ds->cipher->iv_len); |
| 598 | printf("\t\tIV: "); | 608 | printf("\t\tIV: "); |
| 599 | for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]); | 609 | for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]); |
| @@ -618,10 +628,10 @@ int tls1_enc(SSL *s, int send) | |||
| 618 | 628 | ||
| 619 | #ifdef KSSL_DEBUG | 629 | #ifdef KSSL_DEBUG |
| 620 | { | 630 | { |
| 621 | unsigned long i; | 631 | unsigned long ki; |
| 622 | printf("\trec->data="); | 632 | printf("\trec->data="); |
| 623 | for (i=0; i<l; i++) | 633 | for (ki=0; ki<l; i++) |
| 624 | printf(" %02x", rec->data[i]); printf("\n"); | 634 | printf(" %02x", rec->data[ki]); printf("\n"); |
| 625 | } | 635 | } |
| 626 | #endif /* KSSL_DEBUG */ | 636 | #endif /* KSSL_DEBUG */ |
| 627 | 637 | ||
| @@ -805,7 +815,7 @@ int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p, | |||
| 805 | unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH]; | 815 | unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH]; |
| 806 | 816 | ||
| 807 | #ifdef KSSL_DEBUG | 817 | #ifdef KSSL_DEBUG |
| 808 | printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len); | 818 | printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", (void *)s,out, p,len); |
| 809 | #endif /* KSSL_DEBUG */ | 819 | #endif /* KSSL_DEBUG */ |
| 810 | 820 | ||
| 811 | /* Setup the stuff to munge */ | 821 | /* Setup the stuff to munge */ |
| @@ -852,8 +862,10 @@ int tls1_alert_code(int code) | |||
| 852 | case SSL_AD_INTERNAL_ERROR: return(TLS1_AD_INTERNAL_ERROR); | 862 | case SSL_AD_INTERNAL_ERROR: return(TLS1_AD_INTERNAL_ERROR); |
| 853 | case SSL_AD_USER_CANCELLED: return(TLS1_AD_USER_CANCELLED); | 863 | case SSL_AD_USER_CANCELLED: return(TLS1_AD_USER_CANCELLED); |
| 854 | case SSL_AD_NO_RENEGOTIATION: return(TLS1_AD_NO_RENEGOTIATION); | 864 | case SSL_AD_NO_RENEGOTIATION: return(TLS1_AD_NO_RENEGOTIATION); |
| 865 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE | ||
| 855 | case DTLS1_AD_MISSING_HANDSHAKE_MESSAGE: return | 866 | case DTLS1_AD_MISSING_HANDSHAKE_MESSAGE: return |
| 856 | (DTLS1_AD_MISSING_HANDSHAKE_MESSAGE); | 867 | (DTLS1_AD_MISSING_HANDSHAKE_MESSAGE); |
| 868 | #endif | ||
| 857 | default: return(-1); | 869 | default: return(-1); |
| 858 | } | 870 | } |
| 859 | } | 871 | } |
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c index 35f04afa4a..9ce726996d 100644 --- a/src/lib/libssl/t1_lib.c +++ b/src/lib/libssl/t1_lib.c | |||
| @@ -734,6 +734,13 @@ int tls1_process_ticket(SSL *s, unsigned char *session_id, int len, | |||
| 734 | /* Point after session ID in client hello */ | 734 | /* Point after session ID in client hello */ |
| 735 | const unsigned char *p = session_id + len; | 735 | const unsigned char *p = session_id + len; |
| 736 | unsigned short i; | 736 | unsigned short i; |
| 737 | |||
| 738 | /* If tickets disabled behave as if no ticket present | ||
| 739 | * to permit stateful resumption. | ||
| 740 | */ | ||
| 741 | if (SSL_get_options(s) & SSL_OP_NO_TICKET) | ||
| 742 | return 1; | ||
| 743 | |||
| 737 | if ((s->version <= SSL3_VERSION) || !limit) | 744 | if ((s->version <= SSL3_VERSION) || !limit) |
| 738 | return 1; | 745 | return 1; |
| 739 | if (p >= limit) | 746 | if (p >= limit) |
| @@ -761,12 +768,7 @@ int tls1_process_ticket(SSL *s, unsigned char *session_id, int len, | |||
| 761 | return 1; | 768 | return 1; |
| 762 | if (type == TLSEXT_TYPE_session_ticket) | 769 | if (type == TLSEXT_TYPE_session_ticket) |
| 763 | { | 770 | { |
| 764 | /* If tickets disabled indicate cache miss which will | 771 | /* If zero length note client will accept a ticket |
| 765 | * trigger a full handshake | ||
| 766 | */ | ||
| 767 | if (SSL_get_options(s) & SSL_OP_NO_TICKET) | ||
| 768 | return 0; | ||
| 769 | /* If zero length not client will accept a ticket | ||
| 770 | * and indicate cache miss to trigger full handshake | 772 | * and indicate cache miss to trigger full handshake |
| 771 | */ | 773 | */ |
| 772 | if (size == 0) | 774 | if (size == 0) |
diff --git a/src/lib/libssl/test/CAss.cnf b/src/lib/libssl/test/CAss.cnf index 20f8f05e3d..546e660626 100644 --- a/src/lib/libssl/test/CAss.cnf +++ b/src/lib/libssl/test/CAss.cnf | |||
| @@ -7,7 +7,7 @@ RANDFILE = ./.rnd | |||
| 7 | 7 | ||
| 8 | #################################################################### | 8 | #################################################################### |
| 9 | [ req ] | 9 | [ req ] |
| 10 | default_bits = 512 | 10 | default_bits = 1024 |
| 11 | default_keyfile = keySS.pem | 11 | default_keyfile = keySS.pem |
| 12 | distinguished_name = req_distinguished_name | 12 | distinguished_name = req_distinguished_name |
| 13 | encrypt_rsa_key = no | 13 | encrypt_rsa_key = no |
diff --git a/src/lib/libssl/test/Uss.cnf b/src/lib/libssl/test/Uss.cnf index 0c0ebb5f67..98b2e054b7 100644 --- a/src/lib/libssl/test/Uss.cnf +++ b/src/lib/libssl/test/Uss.cnf | |||
| @@ -7,7 +7,7 @@ RANDFILE = ./.rnd | |||
| 7 | 7 | ||
| 8 | #################################################################### | 8 | #################################################################### |
| 9 | [ req ] | 9 | [ req ] |
| 10 | default_bits = 512 | 10 | default_bits = 1024 |
| 11 | default_keyfile = keySS.pem | 11 | default_keyfile = keySS.pem |
| 12 | distinguished_name = req_distinguished_name | 12 | distinguished_name = req_distinguished_name |
| 13 | encrypt_rsa_key = no | 13 | encrypt_rsa_key = no |
