Add changes from the 0.9.6-stable branch.
This commit is contained in:
44
CHANGES
44
CHANGES
@@ -4,6 +4,48 @@
|
|||||||
|
|
||||||
Changes between 0.9.6a and 0.9.6b [XX xxx XXXX]
|
Changes between 0.9.6a and 0.9.6b [XX xxx XXXX]
|
||||||
|
|
||||||
|
*) The countermeasure against Bleichbacher's attack on PKCS #1 v1.5
|
||||||
|
RSA encryption was accidentily removed in s3_srvr.c in OpenSSL 0.9.5
|
||||||
|
when fixing the server behaviour for backwards-compatible 'client
|
||||||
|
hello' messages. (Note that the attack is impractical against
|
||||||
|
SSL 3.0 and TLS 1.0 anyway because length and version checking
|
||||||
|
means that the probability of guessing a valid ciphertext is
|
||||||
|
around 2^-40; see section 5 in Bleichenbacher's CRYPTO '98
|
||||||
|
paper.)
|
||||||
|
|
||||||
|
Before 0.9.5, the countermeasure (hide the error by generating a
|
||||||
|
random 'decryption result') did not work properly because
|
||||||
|
ERR_clear_error() was missing, meaning that SSL_get_error() would
|
||||||
|
detect the supposedly ignored error.
|
||||||
|
|
||||||
|
Both problems are now fixed.
|
||||||
|
[Bodo Moeller]
|
||||||
|
|
||||||
|
*) In crypto/bio/bf_buff.c, increase DEFAULT_BUFFER_SIZE to 4096
|
||||||
|
(previously it was 1024).
|
||||||
|
[Bodo Moeller]
|
||||||
|
|
||||||
|
*) Fix for compatibility mode trust settings: ignore trust settings
|
||||||
|
unless some valid trust or reject settings are present.
|
||||||
|
[Steve Henson]
|
||||||
|
|
||||||
|
*) Fix for blowfish EVP: its a variable length cipher.
|
||||||
|
[Steve Henson]
|
||||||
|
|
||||||
|
*) Fix various bugs related to DSA S/MIME verification. Handle missing
|
||||||
|
parameters in DSA public key structures and return an error in the
|
||||||
|
DSA routines if parameters are absent.
|
||||||
|
[Steve Henson]
|
||||||
|
|
||||||
|
*) In versions up to 0.9.6, RAND_file_name() resorted to file ".rnd"
|
||||||
|
in the current directory if neither $RANDFILE nor $HOME was set.
|
||||||
|
RAND_file_name() in 0.9.6a returned NULL in this case. This has
|
||||||
|
caused some confusion to Windows users who haven't defined $HOME.
|
||||||
|
Thus RAND_file_name() is changed again: e_os.h can define a
|
||||||
|
DEFAULT_HOME, which will be used if $HOME is not set.
|
||||||
|
For Windows, we use "C:"; on other platforms, we still require
|
||||||
|
environment variables.
|
||||||
|
|
||||||
*) Move 'if (!initialized) RAND_poll()' into regions protected by
|
*) Move 'if (!initialized) RAND_poll()' into regions protected by
|
||||||
CRYPTO_LOCK_RAND. This is not strictly necessary, but avoids
|
CRYPTO_LOCK_RAND. This is not strictly necessary, but avoids
|
||||||
having multiple threads call RAND_poll() concurrently.
|
having multiple threads call RAND_poll() concurrently.
|
||||||
@@ -2382,7 +2424,7 @@
|
|||||||
copied!)
|
copied!)
|
||||||
[Bodo Moeller]
|
[Bodo Moeller]
|
||||||
|
|
||||||
*) Bugfix: SSL_set_mode ignored its parameter, only SSL_CTX_set_mode
|
*) Bugfix: SSL_set_options ignored its parameter, only SSL_CTX_set_options
|
||||||
worked.
|
worked.
|
||||||
|
|
||||||
*) Fix problems with no-hmac etc.
|
*) Fix problems with no-hmac etc.
|
||||||
|
|||||||
@@ -143,6 +143,9 @@ my %table=(
|
|||||||
# error message.
|
# error message.
|
||||||
"solaris-x86-gcc","gcc:-O3 -fomit-frame-pointer -m486 -Wall -DL_ENDIAN -DNO_INLINE_ASM::-D_REENTRANT:-lsocket -lnsl -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_sol_asm}:dlfcn:gnu-shared:-fPIC:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
"solaris-x86-gcc","gcc:-O3 -fomit-frame-pointer -m486 -Wall -DL_ENDIAN -DNO_INLINE_ASM::-D_REENTRANT:-lsocket -lnsl -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_sol_asm}:dlfcn:gnu-shared:-fPIC:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
||||||
|
|
||||||
|
#### Solaris x86 with Sun C setups
|
||||||
|
"solaris-x86-cc","cc:-fast -O -Xa::-D_REENTRANT:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_UNROLL BF_PTR::::::::::dlfcn:solaris-shared:-KPIC:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
||||||
|
|
||||||
#### SPARC Solaris with GNU C setups
|
#### SPARC Solaris with GNU C setups
|
||||||
"solaris-sparcv7-gcc","gcc:-O3 -fomit-frame-pointer -Wall -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::::::::::dlfcn:gnu-shared:-fPIC:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
"solaris-sparcv7-gcc","gcc:-O3 -fomit-frame-pointer -Wall -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::::::::::dlfcn:gnu-shared:-fPIC:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
||||||
"solaris-sparcv8-gcc","gcc:-mv8 -O3 -fomit-frame-pointer -Wall -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:asm/sparcv8.o:::::::::dlfcn:gnu-shared:-fPIC:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
"solaris-sparcv8-gcc","gcc:-mv8 -O3 -fomit-frame-pointer -Wall -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:asm/sparcv8.o:::::::::dlfcn:gnu-shared:-fPIC:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
||||||
|
|||||||
52
FAQ
52
FAQ
@@ -17,6 +17,7 @@ OpenSSL - Frequently Asked Questions
|
|||||||
[USER] Questions on using the OpenSSL applications
|
[USER] Questions on using the OpenSSL applications
|
||||||
|
|
||||||
* Why do I get a "PRNG not seeded" error message?
|
* Why do I get a "PRNG not seeded" error message?
|
||||||
|
* Why do I get an "unable to write 'random state'" error message?
|
||||||
* How do I create certificates or certificate requests?
|
* How do I create certificates or certificate requests?
|
||||||
* Why can't I create certificate requests?
|
* Why can't I create certificate requests?
|
||||||
* Why does <SSL program> fail with a certificate verify error?
|
* Why does <SSL program> fail with a certificate verify error?
|
||||||
@@ -161,6 +162,7 @@ correctly. Many open source operating systems provide a "randomness
|
|||||||
device" that serves this purpose. On other systems, applications have
|
device" that serves this purpose. On other systems, applications have
|
||||||
to call the RAND_add() or RAND_seed() function with appropriate data
|
to call the RAND_add() or RAND_seed() function with appropriate data
|
||||||
before generating keys or performing public key encryption.
|
before generating keys or performing public key encryption.
|
||||||
|
(These functions initialize the pseudo-random number generator, PRNG.)
|
||||||
|
|
||||||
Some broken applications do not do this. As of version 0.9.5, the
|
Some broken applications do not do this. As of version 0.9.5, the
|
||||||
OpenSSL functions that need randomness report an error if the random
|
OpenSSL functions that need randomness report an error if the random
|
||||||
@@ -170,18 +172,36 @@ application you are using. It is likely that it never worked
|
|||||||
correctly. OpenSSL 0.9.5 and later make the error visible by refusing
|
correctly. OpenSSL 0.9.5 and later make the error visible by refusing
|
||||||
to perform potentially insecure encryption.
|
to perform potentially insecure encryption.
|
||||||
|
|
||||||
On systems without /dev/urandom, it is a good idea to use the Entropy
|
On systems without /dev/urandom and /dev/random, it is a good idea to
|
||||||
Gathering Demon; see the RAND_egd() manpage for details.
|
use the Entropy Gathering Demon (EGD); see the RAND_egd() manpage for
|
||||||
|
details. Starting with version 0.9.7, OpenSSL will automatically look
|
||||||
|
for an EGD socket at /var/run/egd-pool, /dev/egd-pool, /etc/egd-pool and
|
||||||
|
/etc/entropy.
|
||||||
|
|
||||||
Most components of the openssl command line tool try to use the
|
Most components of the openssl command line utility automatically try
|
||||||
file $HOME/.rnd (or $RANDFILE, if this environment variable is set)
|
to seed the random number generator from a file. The name of the
|
||||||
for seeding the PRNG. If this file does not exist or is too short,
|
default seeding file is determined as follows: If environment variable
|
||||||
the "PRNG not seeded" error message may occur.
|
RANDFILE is set, then it names the seeding file. Otherwise if
|
||||||
|
environment variable HOME is set, then the seeding file is $HOME/.rnd.
|
||||||
|
If neither RANDFILE nor HOME is set, versions up to OpenSSL 0.9.6 will
|
||||||
|
use file .rnd in the current directory while OpenSSL 0.9.6a uses no
|
||||||
|
default seeding file at all. OpenSSL 0.9.6b and later will behave
|
||||||
|
similarly to 0.9.6a, but will use a default of "C:" for HOME on
|
||||||
|
Windows systems if the environment variable has not been set.
|
||||||
|
|
||||||
[Note to OpenSSL 0.9.5 users: The command "openssl rsa" in version
|
If the default seeding file does not exist or is too short, the "PRNG
|
||||||
0.9.5 does not do this and will fail on systems without /dev/urandom
|
not seeded" error message may occur.
|
||||||
when trying to password-encrypt an RSA key! This is a bug in the
|
|
||||||
library; try a later version instead.]
|
The openssl command line utility will write back a new state to the
|
||||||
|
default seeding file (and create this file if necessary) unless
|
||||||
|
there was no sufficient seeding.
|
||||||
|
|
||||||
|
Pointing $RANDFILE to an Entropy Gathering Daemon socket does not work.
|
||||||
|
Use the "-rand" option of the OpenSSL command line tools instead.
|
||||||
|
The $RANDFILE environment variable and $HOME/.rnd are only used by the
|
||||||
|
OpenSSL command line tools. Applications using the OpenSSL library
|
||||||
|
provide their own configuration options to specify the entropy source,
|
||||||
|
please check out the documentation coming the with application.
|
||||||
|
|
||||||
For Solaris 2.6, Tim Nibbe <tnibbe@sprint.net> and others have suggested
|
For Solaris 2.6, Tim Nibbe <tnibbe@sprint.net> and others have suggested
|
||||||
installing the SUNski package from Sun patch 105710-01 (Sparc) which
|
installing the SUNski package from Sun patch 105710-01 (Sparc) which
|
||||||
@@ -191,6 +211,18 @@ versions. However, be warned that /dev/random is usually a blocking
|
|||||||
device, which may have some effects on OpenSSL.
|
device, which may have some effects on OpenSSL.
|
||||||
|
|
||||||
|
|
||||||
|
* Why do I get an "unable to write 'random state'" error message?
|
||||||
|
|
||||||
|
|
||||||
|
Sometimes the openssl command line utility does not abort with
|
||||||
|
a "PRNG not seeded" error message, but complains that it is
|
||||||
|
"unable to write 'random state'". This message refers to the
|
||||||
|
default seeding file (see previous answer). A possible reason
|
||||||
|
is that no default filename is known because neither RANDFILE
|
||||||
|
nor HOME is set. (Versions up to 0.9.6 used file ".rnd" in the
|
||||||
|
current directory in this case, but this has changed with 0.9.6a.)
|
||||||
|
|
||||||
|
|
||||||
* How do I create certificates or certificate requests?
|
* How do I create certificates or certificate requests?
|
||||||
|
|
||||||
Check out the CA.pl(1) manual page. This provides a simple wrapper round
|
Check out the CA.pl(1) manual page. This provides a simple wrapper round
|
||||||
|
|||||||
8
INSTALL
8
INSTALL
@@ -7,8 +7,11 @@
|
|||||||
|
|
||||||
To install OpenSSL, you will need:
|
To install OpenSSL, you will need:
|
||||||
|
|
||||||
|
* make
|
||||||
* Perl 5
|
* Perl 5
|
||||||
* an ANSI C compiler
|
* an ANSI C compiler
|
||||||
|
* a development environment in form of development libraries and C
|
||||||
|
header files
|
||||||
* a supported Unix operating system
|
* a supported Unix operating system
|
||||||
|
|
||||||
Quick Start
|
Quick Start
|
||||||
@@ -43,9 +46,6 @@
|
|||||||
--openssldir=DIR Directory for OpenSSL files. If no prefix is specified,
|
--openssldir=DIR Directory for OpenSSL files. If no prefix is specified,
|
||||||
the library files and binaries are also installed there.
|
the library files and binaries are also installed there.
|
||||||
|
|
||||||
rsaref Build with RSADSI's RSAREF toolkit (this assumes that
|
|
||||||
librsaref.a is in the library search path).
|
|
||||||
|
|
||||||
no-threads Don't try to build with support for multi-threaded
|
no-threads Don't try to build with support for multi-threaded
|
||||||
applications.
|
applications.
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@
|
|||||||
directory, and the binary will be in the "apps" directory.
|
directory, and the binary will be in the "apps" directory.
|
||||||
|
|
||||||
If "make" fails, look at the output. There may be reasons for
|
If "make" fails, look at the output. There may be reasons for
|
||||||
the failure that isn't a problem in OpenSSL itself (like missing
|
the failure that aren't problems in OpenSSL itself (like missing
|
||||||
standard headers). If it is a problem with OpenSSL itself, please
|
standard headers). If it is a problem with OpenSSL itself, please
|
||||||
report the problem to <openssl-bugs@openssl.org> (note that your
|
report the problem to <openssl-bugs@openssl.org> (note that your
|
||||||
message will be forwarded to a public mailing list). Include the
|
message will be forwarded to a public mailing list). Include the
|
||||||
|
|||||||
10
INSTALL.VMS
10
INSTALL.VMS
@@ -8,6 +8,7 @@ Intro:
|
|||||||
|
|
||||||
This file is divided in the following parts:
|
This file is divided in the following parts:
|
||||||
|
|
||||||
|
Requirements - Mandatory reading.
|
||||||
Checking the distribution - Mandatory reading.
|
Checking the distribution - Mandatory reading.
|
||||||
Compilation - Mandatory reading.
|
Compilation - Mandatory reading.
|
||||||
Logical names - Mandatory reading.
|
Logical names - Mandatory reading.
|
||||||
@@ -19,6 +20,15 @@ This file is divided in the following parts:
|
|||||||
TODO - Things that are to come.
|
TODO - Things that are to come.
|
||||||
|
|
||||||
|
|
||||||
|
Requirements:
|
||||||
|
=============
|
||||||
|
|
||||||
|
To build and install OpenSSL, you will need:
|
||||||
|
|
||||||
|
* DEC C or some other ANSI C compiler. VAX C is *not* supported.
|
||||||
|
[Note: OpenSSL has only been tested with DEC C. Compiling with
|
||||||
|
a different ANSI C compiler may require some work]
|
||||||
|
|
||||||
Checking the distribution:
|
Checking the distribution:
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
|
|||||||
@@ -1247,7 +1247,11 @@ bad:
|
|||||||
X509_free(revcert);
|
X509_free(revcert);
|
||||||
|
|
||||||
strncpy(buf[0],dbfile,BSIZE-4);
|
strncpy(buf[0],dbfile,BSIZE-4);
|
||||||
|
#ifndef VMS
|
||||||
strcat(buf[0],".new");
|
strcat(buf[0],".new");
|
||||||
|
#else
|
||||||
|
strcat(buf[0],"-new");
|
||||||
|
#endif
|
||||||
if (BIO_write_filename(out,buf[0]) <= 0)
|
if (BIO_write_filename(out,buf[0]) <= 0)
|
||||||
{
|
{
|
||||||
perror(dbfile);
|
perror(dbfile);
|
||||||
@@ -1257,7 +1261,11 @@ bad:
|
|||||||
j=TXT_DB_write(out,db);
|
j=TXT_DB_write(out,db);
|
||||||
if (j <= 0) goto err;
|
if (j <= 0) goto err;
|
||||||
strncpy(buf[1],dbfile,BSIZE-4);
|
strncpy(buf[1],dbfile,BSIZE-4);
|
||||||
|
#ifndef VMS
|
||||||
strcat(buf[1],".old");
|
strcat(buf[1],".old");
|
||||||
|
#else
|
||||||
|
strcat(buf[1],"-old");
|
||||||
|
#endif
|
||||||
if (rename(dbfile,buf[1]) < 0)
|
if (rename(dbfile,buf[1]) < 0)
|
||||||
{
|
{
|
||||||
BIO_printf(bio_err,"unable to rename %s to %s\n", dbfile, buf[1]);
|
BIO_printf(bio_err,"unable to rename %s to %s\n", dbfile, buf[1]);
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key)
|
|||||||
a=key->algor;
|
a=key->algor;
|
||||||
if (ret->type == EVP_PKEY_DSA)
|
if (ret->type == EVP_PKEY_DSA)
|
||||||
{
|
{
|
||||||
if (a->parameter->type == V_ASN1_SEQUENCE)
|
if (a->parameter && (a->parameter->type == V_ASN1_SEQUENCE))
|
||||||
{
|
{
|
||||||
ret->pkey.dsa->write_params=0;
|
ret->pkey.dsa->write_params=0;
|
||||||
p=a->parameter->value.sequence->data;
|
p=a->parameter->value.sequence->data;
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ static long buffer_ctrl(BIO *h, int cmd, long arg1, void *arg2);
|
|||||||
static int buffer_new(BIO *h);
|
static int buffer_new(BIO *h);
|
||||||
static int buffer_free(BIO *data);
|
static int buffer_free(BIO *data);
|
||||||
static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
|
static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
|
||||||
#define DEFAULT_BUFFER_SIZE 1024
|
#define DEFAULT_BUFFER_SIZE 4096
|
||||||
|
|
||||||
static BIO_METHOD methods_buffer=
|
static BIO_METHOD methods_buffer=
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -248,6 +248,7 @@ DH *DSA_dup_DH(DSA *r);
|
|||||||
|
|
||||||
/* Reason codes. */
|
/* Reason codes. */
|
||||||
#define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100
|
#define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100
|
||||||
|
#define DSA_R_MISSING_PARAMETERS 101
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ static ERR_STRING_DATA DSA_str_functs[]=
|
|||||||
static ERR_STRING_DATA DSA_str_reasons[]=
|
static ERR_STRING_DATA DSA_str_reasons[]=
|
||||||
{
|
{
|
||||||
{DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE ,"data too large for key size"},
|
{DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE ,"data too large for key size"},
|
||||||
|
{DSA_R_MISSING_PARAMETERS ,"missing parameters"},
|
||||||
{0,NULL}
|
{0,NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -106,6 +106,11 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
|
|||||||
int i,reason=ERR_R_BN_LIB;
|
int i,reason=ERR_R_BN_LIB;
|
||||||
DSA_SIG *ret=NULL;
|
DSA_SIG *ret=NULL;
|
||||||
|
|
||||||
|
if (!dsa->p || !dsa->q || !dsa->g)
|
||||||
|
{
|
||||||
|
reason=DSA_R_MISSING_PARAMETERS;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
BN_init(&m);
|
BN_init(&m);
|
||||||
BN_init(&xr);
|
BN_init(&xr);
|
||||||
s=BN_new();
|
s=BN_new();
|
||||||
@@ -168,6 +173,11 @@ static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp)
|
|||||||
BIGNUM k,*kinv=NULL,*r=NULL;
|
BIGNUM k,*kinv=NULL,*r=NULL;
|
||||||
int ret=0;
|
int ret=0;
|
||||||
|
|
||||||
|
if (!dsa->p || !dsa->q || !dsa->g)
|
||||||
|
{
|
||||||
|
DSAerr(DSA_F_DSA_SIGN_SETUP,DSA_R_MISSING_PARAMETERS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if (ctx_in == NULL)
|
if (ctx_in == NULL)
|
||||||
{
|
{
|
||||||
if ((ctx=BN_CTX_new()) == NULL) goto err;
|
if ((ctx=BN_CTX_new()) == NULL) goto err;
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ static int bf_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
|
|||||||
const unsigned char *iv, int enc);
|
const unsigned char *iv, int enc);
|
||||||
|
|
||||||
IMPLEMENT_BLOCK_CIPHER(bf, bf_ks, BF, bf_ks, NID_bf, 8, 16, 8,
|
IMPLEMENT_BLOCK_CIPHER(bf, bf_ks, BF, bf_ks, NID_bf, 8, 16, 8,
|
||||||
0, bf_init_key, NULL,
|
EVP_CIPH_VARIABLE_LENGTH, bf_init_key, NULL,
|
||||||
EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv, NULL)
|
EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv, NULL)
|
||||||
|
|
||||||
static int bf_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
|
static int bf_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ sub main'DWP
|
|||||||
local($addr,$reg1,$reg2,$idx)=@_;
|
local($addr,$reg1,$reg2,$idx)=@_;
|
||||||
|
|
||||||
$ret="";
|
$ret="";
|
||||||
$addr =~ s/(^|[+ \t])([A-Za-z_]+)($|[+ \t])/$1$under$2$3/;
|
$addr =~ s/(^|[+ \t])([A-Za-z_]+[A-Za-z0-9_]+)($|[+ \t])/$1$under$2$3/;
|
||||||
$reg1="$regs{$reg1}" if defined($regs{$reg1});
|
$reg1="$regs{$reg1}" if defined($regs{$reg1});
|
||||||
$reg2="$regs{$reg2}" if defined($regs{$reg2});
|
$reg2="$regs{$reg2}" if defined($regs{$reg2});
|
||||||
$ret.=$addr if ($addr ne "") && ($addr ne 0);
|
$ret.=$addr if ($addr ne "") && ($addr ne 0);
|
||||||
|
|||||||
@@ -211,6 +211,12 @@ const char *RAND_file_name(char *buf, size_t size)
|
|||||||
{
|
{
|
||||||
if (OPENSSL_issetugid() == 0)
|
if (OPENSSL_issetugid() == 0)
|
||||||
s=getenv("HOME");
|
s=getenv("HOME");
|
||||||
|
#ifdef DEFAULT_HOME
|
||||||
|
if (s == NULL)
|
||||||
|
{
|
||||||
|
s = DEFAULT_HOME;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (s != NULL && (strlen(s)+strlen(RFILE)+2 < size))
|
if (s != NULL && (strlen(s)+strlen(RFILE)+2 < size))
|
||||||
{
|
{
|
||||||
strcpy(buf,s);
|
strcpy(buf,s);
|
||||||
@@ -220,7 +226,7 @@ const char *RAND_file_name(char *buf, size_t size)
|
|||||||
strcat(buf,RFILE);
|
strcat(buf,RFILE);
|
||||||
ret=buf;
|
ret=buf;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
buf[0] = '\0'; /* no file name */
|
buf[0] = '\0'; /* no file name */
|
||||||
}
|
}
|
||||||
return(ret);
|
return(ret);
|
||||||
|
|||||||
@@ -228,7 +228,8 @@ int X509_TRUST_get_trust(X509_TRUST *xp)
|
|||||||
|
|
||||||
static int trust_1oidany(X509_TRUST *trust, X509 *x, int flags)
|
static int trust_1oidany(X509_TRUST *trust, X509 *x, int flags)
|
||||||
{
|
{
|
||||||
if(x->aux) return obj_trust(trust->arg1, x, flags);
|
if(x->aux && (x->aux->trust || x->aux->reject))
|
||||||
|
return obj_trust(trust->arg1, x, flags);
|
||||||
/* we don't have any trust settings: for compatibility
|
/* we don't have any trust settings: for compatibility
|
||||||
* we return trusted if it is self signed
|
* we return trusted if it is self signed
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ SSL_CTX_get_ex_data() is used to retrieve the information for B<idx> from
|
|||||||
B<ctx>.
|
B<ctx>.
|
||||||
|
|
||||||
A detailed description for the B<*_get_ex_new_index()> functionality
|
A detailed description for the B<*_get_ex_new_index()> functionality
|
||||||
can be found in L<RSA_get_ex_new_index.pod(3)|RSA_get_ex_new_index.pod(3)>.
|
can be found in L<RSA_get_ex_new_index(3)|RSA_get_ex_new_index(3)>.
|
||||||
The B<*_get_ex_data()> and B<*_set_ex_data()> functionality is described in
|
The B<*_get_ex_data()> and B<*_set_ex_data()> functionality is described in
|
||||||
L<CRYPTO_set_ex_data(3)|CRYPTO_set_ex_data(3)>.
|
L<CRYPTO_set_ex_data(3)|CRYPTO_set_ex_data(3)>.
|
||||||
|
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ L<SSL_CTX_sess_number(3)|SSL_CTX_sess_number(3)>,
|
|||||||
L<SSL_CTX_sess_set_cache_size(3)|SSL_CTX_sess_set_cache_size(3)>,
|
L<SSL_CTX_sess_set_cache_size(3)|SSL_CTX_sess_set_cache_size(3)>,
|
||||||
L<SSL_CTX_sess_set_get_cb(3)|SSL_CTX_sess_set_get_cb(3)>,
|
L<SSL_CTX_sess_set_get_cb(3)|SSL_CTX_sess_set_get_cb(3)>,
|
||||||
L<SSL_CTX_set_session_id_context(3)|SSL_CTX_set_session_id_context(3)>,
|
L<SSL_CTX_set_session_id_context(3)|SSL_CTX_set_session_id_context(3)>,
|
||||||
L<SSL_CTX_set_timeout.pod(3)|SSL_CTX_set_timeout.pod(3)>,
|
L<SSL_CTX_set_timeout(3)|SSL_CTX_set_timeout(3)>,
|
||||||
L<SSL_CTX_flush_sessions(3)|SSL_CTX_flush_sessions(3)>
|
L<SSL_CTX_flush_sessions(3)|SSL_CTX_flush_sessions(3)>
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ SSL_SESSION_get_ex_data() is used to retrieve the information for B<idx> from
|
|||||||
B<session>.
|
B<session>.
|
||||||
|
|
||||||
A detailed description for the B<*_get_ex_new_index()> functionality
|
A detailed description for the B<*_get_ex_new_index()> functionality
|
||||||
can be found in L<RSA_get_ex_new_index.pod(3)|RSA_get_ex_new_index.pod(3)>.
|
can be found in L<RSA_get_ex_new_index(3)|RSA_get_ex_new_index(3)>.
|
||||||
The B<*_get_ex_data()> and B<*_set_ex_data()> functionality is described in
|
The B<*_get_ex_data()> and B<*_set_ex_data()> functionality is described in
|
||||||
L<CRYPTO_set_ex_data(3)|CRYPTO_set_ex_data(3)>.
|
L<CRYPTO_set_ex_data(3)|CRYPTO_set_ex_data(3)>.
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,17 @@ to read data. This is mainly because TLS/SSL handshakes may occur at any
|
|||||||
time during the protocol (initiated by either the client or the server);
|
time during the protocol (initiated by either the client or the server);
|
||||||
SSL_read(), SSL_peek(), and SSL_write() will handle any pending handshakes.
|
SSL_read(), SSL_peek(), and SSL_write() will handle any pending handshakes.
|
||||||
|
|
||||||
|
=item SSL_ERROR_WANT_CONNECT
|
||||||
|
|
||||||
|
The operation did not complete; the same TLS/SSL I/O function should be
|
||||||
|
called again later. The underlying BIO was not connected yet to the peer
|
||||||
|
and the call would block in connect(). The SSL function should be
|
||||||
|
called again when the connection is established. This messages can only
|
||||||
|
appear with a BIO_s_connect() BIO.
|
||||||
|
In order to find out, when the connection has been successfully established,
|
||||||
|
on many platforms select() or poll() for writing on the socket file descriptor
|
||||||
|
can be used.
|
||||||
|
|
||||||
=item SSL_ERROR_WANT_X509_LOOKUP
|
=item SSL_ERROR_WANT_X509_LOOKUP
|
||||||
|
|
||||||
The operation did not complete because an application callback set by
|
The operation did not complete because an application callback set by
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ SSL_get_ex_data() is used to retrieve the information for B<idx> from
|
|||||||
B<ssl>.
|
B<ssl>.
|
||||||
|
|
||||||
A detailed description for the B<*_get_ex_new_index()> functionality
|
A detailed description for the B<*_get_ex_new_index()> functionality
|
||||||
can be found in L<RSA_get_ex_new_index.pod(3)|RSA_get_ex_new_index.pod(3)>.
|
can be found in L<RSA_get_ex_new_index(3)|RSA_get_ex_new_index(3)>.
|
||||||
The B<*_get_ex_data()> and B<*_set_ex_data()> functionality is described in
|
The B<*_get_ex_data()> and B<*_set_ex_data()> functionality is described in
|
||||||
L<CRYPTO_set_ex_data(3)|CRYPTO_set_ex_data(3)>.
|
L<CRYPTO_set_ex_data(3)|CRYPTO_set_ex_data(3)>.
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,22 @@ initialized to client or server mode. This is not the case if a generic
|
|||||||
method is being used (see L<SSL_CTX_new(3)|SSL_CTX_new(3)>, so that
|
method is being used (see L<SSL_CTX_new(3)|SSL_CTX_new(3)>, so that
|
||||||
L<SSL_set_connect_state(3)|SSL_set_connect_state(3)> or SSL_set_accept_state()
|
L<SSL_set_connect_state(3)|SSL_set_connect_state(3)> or SSL_set_accept_state()
|
||||||
must be used before the first call to an SSL_read() or
|
must be used before the first call to an SSL_read() or
|
||||||
L<SSL_write(3)|SSL_write(3)> function.
|
L<SSL_write(3)|SSL_write(3)> function).
|
||||||
|
|
||||||
|
SSL_read() works based on the SSL/TLS records. The data are received in
|
||||||
|
records (with a maximum record size of 16kB for SSLv3/TLSv1). Only when a
|
||||||
|
record has been completely received, it can be processed (decryption and
|
||||||
|
check of integrity). Therefore data that was not retrieved at the last
|
||||||
|
call of SSL_read() can still be buffered inside the SSL layer and will be
|
||||||
|
retrieved on the next call to SSL_read(). If B<num> is higher than the
|
||||||
|
number of bytes buffered, SSL_read() will return with the bytes buffered.
|
||||||
|
If no more bytes are in the buffer, SSL_read() will trigger the processing
|
||||||
|
of the next record. Only when the record has been received and processed
|
||||||
|
completely, SSL_read() will return reporting success. At most the contents
|
||||||
|
of the record will be returned. As the size of an SSL/TLS record may exceed
|
||||||
|
the maximum packet size of the underlying transport (e.g. TCP), it may
|
||||||
|
be necessary to read several packets from the transport layer before the
|
||||||
|
record is complete and SSL_read() can succeed.
|
||||||
|
|
||||||
If the underlying BIO is B<blocking>, SSL_read() will only return, once the
|
If the underlying BIO is B<blocking>, SSL_read() will only return, once the
|
||||||
read operation has been finished or an error occurred, except when a
|
read operation has been finished or an error occurred, except when a
|
||||||
|
|||||||
@@ -50,6 +50,17 @@ non-blocking socket, nothing is to be done, but select() can be used to check
|
|||||||
for the required condition. When using a buffering BIO, like a BIO pair, data
|
for the required condition. When using a buffering BIO, like a BIO pair, data
|
||||||
must be written into or retrieved out of the BIO before being able to continue.
|
must be written into or retrieved out of the BIO before being able to continue.
|
||||||
|
|
||||||
|
SSL_write() will only return with success, when the complete contents
|
||||||
|
of B<buf> of length B<num> has been written. This default behaviour
|
||||||
|
can be changed with the SSL_MODE_ENABLE_PARTIAL_WRITE option of
|
||||||
|
L<SSL_CTX_set_mode(3)|SSL_CTX_set_mode(3)>. When this flag is set,
|
||||||
|
SSL_write() will also return with success, when a partial write has been
|
||||||
|
successfully completed. In this case the SSL_write() operation is considered
|
||||||
|
completed. The bytes are sent and a new SSL_write() operation with a new
|
||||||
|
buffer (with the already sent bytes removed) must be started.
|
||||||
|
A partial write is performed with the size of a message block, which is
|
||||||
|
16kB for SSLv3/TLSv1.
|
||||||
|
|
||||||
=head1 WARNING
|
=head1 WARNING
|
||||||
|
|
||||||
When an SSL_write() operation has to be repeated because of
|
When an SSL_write() operation has to be repeated because of
|
||||||
|
|||||||
1
e_os.h
1
e_os.h
@@ -224,6 +224,7 @@ extern "C" {
|
|||||||
# define SSLEAY_CONF OPENSSL_CONF
|
# define SSLEAY_CONF OPENSSL_CONF
|
||||||
# define NUL_DEV "nul"
|
# define NUL_DEV "nul"
|
||||||
# define RFILE ".rnd"
|
# define RFILE ".rnd"
|
||||||
|
# define DEFAULT_HOME "C:"
|
||||||
|
|
||||||
#else /* The non-microsoft world world */
|
#else /* The non-microsoft world world */
|
||||||
|
|
||||||
|
|||||||
@@ -405,12 +405,13 @@ static int get_client_master_key(SSL *s)
|
|||||||
/* bad decrypt */
|
/* bad decrypt */
|
||||||
#if 1
|
#if 1
|
||||||
/* If a bad decrypt, continue with protocol but with a
|
/* If a bad decrypt, continue with protocol but with a
|
||||||
* dud master secret */
|
* random master secret (Bleichenbacher attack) */
|
||||||
if ((i < 0) ||
|
if ((i < 0) ||
|
||||||
((!is_export && (i != EVP_CIPHER_key_length(c)))
|
((!is_export && (i != EVP_CIPHER_key_length(c)))
|
||||||
|| (is_export && ((i != ek) || (s->s2->tmp.clear+i !=
|
|| (is_export && ((i != ek) || (s->s2->tmp.clear+i !=
|
||||||
EVP_CIPHER_key_length(c))))))
|
EVP_CIPHER_key_length(c))))))
|
||||||
{
|
{
|
||||||
|
ERR_clear_error();
|
||||||
if (is_export)
|
if (is_export)
|
||||||
i=ek;
|
i=ek;
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1322,14 +1322,15 @@ static int ssl3_get_client_key_exchange(SSL *s)
|
|||||||
|
|
||||||
i=RSA_private_decrypt((int)n,p,p,rsa,RSA_PKCS1_PADDING);
|
i=RSA_private_decrypt((int)n,p,p,rsa,RSA_PKCS1_PADDING);
|
||||||
|
|
||||||
|
al = -1;
|
||||||
|
|
||||||
if (i != SSL_MAX_MASTER_KEY_LENGTH)
|
if (i != SSL_MAX_MASTER_KEY_LENGTH)
|
||||||
{
|
{
|
||||||
al=SSL_AD_DECODE_ERROR;
|
al=SSL_AD_DECODE_ERROR;
|
||||||
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
|
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
|
||||||
goto f_err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!((p[0] == (s->client_version>>8)) && (p[1] == (s->client_version & 0xff))))
|
if ((al == -1) && !((p[0] == (s->client_version>>8)) && (p[1] == (s->client_version & 0xff))))
|
||||||
{
|
{
|
||||||
/* The premaster secret must contain the same version number as the
|
/* The premaster secret must contain the same version number as the
|
||||||
* ClientHello to detect version rollback attacks (strangely, the
|
* ClientHello to detect version rollback attacks (strangely, the
|
||||||
@@ -1347,6 +1348,27 @@ static int ssl3_get_client_key_exchange(SSL *s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (al != -1)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
goto f_err;
|
||||||
|
#else
|
||||||
|
/* Some decryption failure -- use random value instead as countermeasure
|
||||||
|
* against Bleichenbacher's attack on PKCS #1 v1.5 RSA padding
|
||||||
|
* (see RFC 2246, section 7.4.7.1).
|
||||||
|
* But note that due to length and protocol version checking, the
|
||||||
|
* attack is impractical anyway (see section 5 in D. Bleichenbacher:
|
||||||
|
* "Chosen Ciphertext Attacks Against Protocols Based on the RSA
|
||||||
|
* Encryption Standard PKCS #1", CRYPTO '98, LNCS 1462, pp. 1-12).
|
||||||
|
*/
|
||||||
|
ERR_clear_error();
|
||||||
|
i = SSL_MAX_MASTER_KEY_LENGTH;
|
||||||
|
p[0] = s->client_version >> 8;
|
||||||
|
p[1] = s->client_version & 0xff;
|
||||||
|
RAND_pseudo_bytes(p+2, i-2); /* should be RAND_bytes, but we cannot work around a failure */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
s->session->master_key_length=
|
s->session->master_key_length=
|
||||||
s->method->ssl3_enc->generate_master_secret(s,
|
s->method->ssl3_enc->generate_master_secret(s,
|
||||||
s->session->master_key,
|
s->session->master_key,
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ test_bn:
|
|||||||
@./$(BNTEST) >tmp.bntest
|
@./$(BNTEST) >tmp.bntest
|
||||||
@echo quit >>tmp.bntest
|
@echo quit >>tmp.bntest
|
||||||
@echo "running bc"
|
@echo "running bc"
|
||||||
@<tmp.bntest sh -c "`sh ./bctest; true`" | $(PERL) -e '$$i=0; while (<STDIN>) {if (/^test (.*)/) {print STDERR "\nverify $$1";} elsif (!/^0$$/) {die "\nFailed! bc: $$_";} else {print STDERR "."; $$i++;}} print STDERR "\n$$i tests passed\n"'
|
@<tmp.bntest sh -c "`sh ./bctest ignore`" | $(PERL) -e '$$i=0; while (<STDIN>) {if (/^test (.*)/) {print STDERR "\nverify $$1";} elsif (!/^0$$/) {die "\nFailed! bc: $$_";} else {print STDERR "."; $$i++;}} print STDERR "\n$$i tests passed\n"'
|
||||||
@echo 'test a^b%c implementations'
|
@echo 'test a^b%c implementations'
|
||||||
./$(EXPTEST)
|
./$(EXPTEST)
|
||||||
|
|
||||||
|
|||||||
@@ -104,5 +104,8 @@ EOF
|
|||||||
done
|
done
|
||||||
|
|
||||||
echo "No working bc found. Consider installing GNU bc." >&2
|
echo "No working bc found. Consider installing GNU bc." >&2
|
||||||
echo "cat >/dev/null"
|
if [ "$1" = ignore ]; then
|
||||||
|
echo "cat >/dev/null"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
Reference in New Issue
Block a user