Compare commits
10 Commits
OpenSSL-en
...
OpenSSL-en
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7b24a1a33b | ||
|
|
393a9b68cf | ||
|
|
4ae5099856 | ||
|
|
5c36f01000 | ||
|
|
6ef9d8328b | ||
|
|
5a9c441c6e | ||
|
|
d69d8b5ffa | ||
|
|
9aef355cf0 | ||
|
|
11f3f9f4a1 | ||
|
|
ef9088c9ec |
131
CHANGES
131
CHANGES
@@ -2,7 +2,129 @@
|
|||||||
OpenSSL CHANGES
|
OpenSSL CHANGES
|
||||||
_______________
|
_______________
|
||||||
|
|
||||||
Changes between 0.9.6 and 0.9.6a [xx XXX 2001]
|
Changes between 0.9.6a and 0.9.6b [9 Jul 2001]
|
||||||
|
|
||||||
|
*) Change ssleay_rand_bytes (crypto/rand/md_rand.c)
|
||||||
|
to avoid a SSLeay/OpenSSL PRNG weakness pointed out by
|
||||||
|
Markku-Juhani O. Saarinen <markku-juhani.saarinen@nokia.com>:
|
||||||
|
PRNG state recovery was possible based on the output of
|
||||||
|
one PRNG request appropriately sized to gain knowledge on
|
||||||
|
'md' followed by enough consecutive 1-byte PRNG requests
|
||||||
|
to traverse all of 'state'.
|
||||||
|
|
||||||
|
1. When updating 'md_local' (the current thread's copy of 'md')
|
||||||
|
during PRNG output generation, hash all of the previous
|
||||||
|
'md_local' value, not just the half used for PRNG output.
|
||||||
|
|
||||||
|
2. Make the number of bytes from 'state' included into the hash
|
||||||
|
independent from the number of PRNG bytes requested.
|
||||||
|
|
||||||
|
The first measure alone would be sufficient to avoid
|
||||||
|
Markku-Juhani's attack. (Actually it had never occurred
|
||||||
|
to me that the half of 'md_local' used for chaining was the
|
||||||
|
half from which PRNG output bytes were taken -- I had always
|
||||||
|
assumed that the secret half would be used.) The second
|
||||||
|
measure makes sure that additional data from 'state' is never
|
||||||
|
mixed into 'md_local' in small portions; this heuristically
|
||||||
|
further strengthens the PRNG.
|
||||||
|
[Bodo Moeller]
|
||||||
|
|
||||||
|
*) Fix crypto/bn/asm/mips3.s.
|
||||||
|
[Andy Polyakov]
|
||||||
|
|
||||||
|
*) When only the key is given to "enc", the IV is undefined. Print out
|
||||||
|
an error message in this case.
|
||||||
|
[Lutz Jaenicke]
|
||||||
|
|
||||||
|
*) Handle special case when X509_NAME is empty in X509 printing routines.
|
||||||
|
[Steve Henson]
|
||||||
|
|
||||||
|
*) In dsa_do_verify (crypto/dsa/dsa_ossl.c), verify that r and s are
|
||||||
|
positive and less than q.
|
||||||
|
[Bodo Moeller]
|
||||||
|
|
||||||
|
*) Don't change *pointer in CRYPTO_add_lock() is add_lock_callback is
|
||||||
|
used: it isn't thread safe and the add_lock_callback should handle
|
||||||
|
that itself.
|
||||||
|
[Paul Rose <Paul.Rose@bridge.com>]
|
||||||
|
|
||||||
|
*) Verify that incoming data obeys the block size in
|
||||||
|
ssl3_enc (ssl/s3_enc.c) and tls1_enc (ssl/t1_enc.c).
|
||||||
|
[Bodo Moeller]
|
||||||
|
|
||||||
|
*) Fix OAEP check.
|
||||||
|
[Ulf M<>ller, Bodo M<>ller]
|
||||||
|
|
||||||
|
*) 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
|
||||||
|
CRYPTO_LOCK_RAND. This is not strictly necessary, but avoids
|
||||||
|
having multiple threads call RAND_poll() concurrently.
|
||||||
|
[Bodo Moeller]
|
||||||
|
|
||||||
|
*) In crypto/rand/md_rand.c, replace 'add_do_not_lock' flag by a
|
||||||
|
combination of a flag and a thread ID variable.
|
||||||
|
Otherwise while one thread is in ssleay_rand_bytes (which sets the
|
||||||
|
flag), *other* threads can enter ssleay_add_bytes without obeying
|
||||||
|
the CRYPTO_LOCK_RAND lock (and may even illegaly release the lock
|
||||||
|
that they do not hold after the first thread unsets add_do_not_lock).
|
||||||
|
[Bodo Moeller]
|
||||||
|
|
||||||
|
*) Change bctest again: '-x' expressions are not available in all
|
||||||
|
versions of 'test'.
|
||||||
|
[Bodo Moeller]
|
||||||
|
|
||||||
|
Changes between 0.9.6 and 0.9.6a [5 Apr 2001]
|
||||||
|
|
||||||
|
*) Fix a couple of memory leaks in PKCS7_dataDecode()
|
||||||
|
[Steve Henson, reported by Heyun Zheng <hzheng@atdsprint.com>]
|
||||||
|
|
||||||
|
*) Change Configure and Makefiles to provide EXE_EXT, which will contain
|
||||||
|
the default extension for executables, if any. Also, make the perl
|
||||||
|
scripts that use symlink() to test if it really exists and use "cp"
|
||||||
|
if it doesn't. All this made OpenSSL compilable and installable in
|
||||||
|
CygWin.
|
||||||
|
[Richard Levitte]
|
||||||
|
|
||||||
*) Fix for asn1_GetSequence() for indefinite length constructed data.
|
*) Fix for asn1_GetSequence() for indefinite length constructed data.
|
||||||
If SEQUENCE is length is indefinite just set c->slen to the total
|
If SEQUENCE is length is indefinite just set c->slen to the total
|
||||||
@@ -12,6 +134,8 @@
|
|||||||
|
|
||||||
*) Change bctest to avoid here-documents inside command substitution
|
*) Change bctest to avoid here-documents inside command substitution
|
||||||
(workaround for FreeBSD /bin/sh bug).
|
(workaround for FreeBSD /bin/sh bug).
|
||||||
|
For compatibility with Ultrix, avoid shell functions (introduced
|
||||||
|
in the bctest version that searches along $PATH).
|
||||||
[Bodo Moeller]
|
[Bodo Moeller]
|
||||||
|
|
||||||
*) Rename 'des_encrypt' to 'des_encrypt1'. This avoids the clashes
|
*) Rename 'des_encrypt' to 'des_encrypt1'. This avoids the clashes
|
||||||
@@ -28,6 +152,9 @@
|
|||||||
*) MIPS assembler BIGNUM division bug fix.
|
*) MIPS assembler BIGNUM division bug fix.
|
||||||
[Andy Polyakov]
|
[Andy Polyakov]
|
||||||
|
|
||||||
|
*) Disabled incorrect Alpha assembler code.
|
||||||
|
[Richard Levitte]
|
||||||
|
|
||||||
*) Fix PKCS#7 decode routines so they correctly update the length
|
*) Fix PKCS#7 decode routines so they correctly update the length
|
||||||
after reading an EOC for the EXPLICIT tag.
|
after reading an EOC for the EXPLICIT tag.
|
||||||
[Steve Henson]
|
[Steve Henson]
|
||||||
@@ -2348,7 +2475,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.
|
||||||
|
|||||||
16
Configure
16
Configure
@@ -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)",
|
||||||
@@ -333,7 +336,7 @@ my %table=(
|
|||||||
|
|
||||||
# UnixWare 2.0x fails destest with -O
|
# UnixWare 2.0x fails destest with -O
|
||||||
"unixware-2.0","cc:-DFILIO_H::-Kthread:-lsocket -lnsl -lx:${x86_gcc_des} ${x86_gcc_opts}:::",
|
"unixware-2.0","cc:-DFILIO_H::-Kthread:-lsocket -lnsl -lx:${x86_gcc_des} ${x86_gcc_opts}:::",
|
||||||
"unixware-2.0-pentium","cc:-DFILIO_H -Kpentium:-Kthread:-lsocket -lnsl -lx:MD2_CHAR RC4_INDEX ${x86_gcc_des}::",
|
"unixware-2.0-pentium","cc:-DFILIO_H -Kpentium::-Kthread:-lsocket -lnsl -lx:MD2_CHAR RC4_INDEX ${x86_gcc_des}::",
|
||||||
|
|
||||||
# UnixWare 2.1
|
# UnixWare 2.1
|
||||||
"unixware-2.1","cc:-O -DFILIO_H::-Kthread:-lsocket -lnsl -lx:${x86_gcc_des} ${x86_gcc_opts}:::",
|
"unixware-2.1","cc:-O -DFILIO_H::-Kthread:-lsocket -lnsl -lx:${x86_gcc_des} ${x86_gcc_opts}:::",
|
||||||
@@ -341,7 +344,9 @@ my %table=(
|
|||||||
"unixware-2.1-p6","cc:-O -DFILIO_H -Kp6::-Kthread:-lsocket -lnsl -lx:MD2_CHAR RC4_INDEX ${x86_gcc_des}::",
|
"unixware-2.1-p6","cc:-O -DFILIO_H -Kp6::-Kthread:-lsocket -lnsl -lx:MD2_CHAR RC4_INDEX ${x86_gcc_des}::",
|
||||||
|
|
||||||
# UnixWare 7
|
# UnixWare 7
|
||||||
"unixware-7","cc:-O -DFILIO_H -Kalloca::-Kthread:-lsocket -lnsl:MD2_CHAR RC4_INDEX ${x86_gcc_des}::",
|
"unixware-7","cc:-O -DFILIO_H -Kalloca::-Kthread:-lsocket -lnsl:BN_LLONG MD2_CHAR RC4_INDEX ${x86_gcc_des}::",
|
||||||
|
"unixware-7-pentium","cc:-O -DFILIO_H -Kalloca -Kpentium::-Kthread:-lsocket -lnsl:BN_LLONG MD2_CHAR RC4_INDEX ${x86_gcc_des}::",
|
||||||
|
"unixware-7-pentium_pro","cc:-O -DFILIO_H -Kalloca -Kpentium_pro::-Kthread:-lsocket -lnsl:BN_LLONG MD2_CHAR RC4_INDEX ${x86_gcc_des}::",
|
||||||
|
|
||||||
# IBM's AIX.
|
# IBM's AIX.
|
||||||
"aix-cc", "cc:-O -DAIX -DB_ENDIAN -qmaxmem=16384::(unknown)::BN_LLONG RC4_CHAR:::",
|
"aix-cc", "cc:-O -DAIX -DB_ENDIAN -qmaxmem=16384::(unknown)::BN_LLONG RC4_CHAR:::",
|
||||||
@@ -374,11 +379,11 @@ my %table=(
|
|||||||
|
|
||||||
# DGUX, 88100.
|
# DGUX, 88100.
|
||||||
"dgux-R3-gcc", "gcc:-O3 -fomit-frame-pointer::(unknown)::RC4_INDEX DES_UNROLL:::",
|
"dgux-R3-gcc", "gcc:-O3 -fomit-frame-pointer::(unknown)::RC4_INDEX DES_UNROLL:::",
|
||||||
"dgux-R4-gcc", "gcc:-O3 -fomit-frame-pointer::(unknown):-lnsl -lsocket:RC4_INDEX:RC4_INDEX DES_UNROLL:::",
|
"dgux-R4-gcc", "gcc:-O3 -fomit-frame-pointer::(unknown):-lnsl -lsocket:RC4_INDEX DES_UNROLL:::",
|
||||||
"dgux-R4-x86-gcc", "gcc:-O3 -fomit-frame-pointer -DL_ENDIAN::(unknown):-lnsl -lsocket:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}",
|
"dgux-R4-x86-gcc", "gcc:-O3 -fomit-frame-pointer -DL_ENDIAN::(unknown):-lnsl -lsocket:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}",
|
||||||
|
|
||||||
# SCO 3 - Tim Rice <tim@multitalents.net>
|
# SCO 3 - Tim Rice <tim@multitalents.net>
|
||||||
"sco3-gcc", "gcc:-O3 -fomit-frame-pointer -Dssize_t=int -DNO_SYS_UN_H::(unknown)::-lsocket:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:::", # the SCO assembler doesn't seem to like our assembler files ...
|
"sco3-gcc", "gcc:-O3 -fomit-frame-pointer -Dssize_t=int -DNO_SYS_UN_H::(unknown):-lsocket:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:::", # the SCO assembler doesn't seem to like our assembler files ...
|
||||||
|
|
||||||
# SCO 5 - Ben Laurie <ben@algroup.co.uk> says the -O breaks the
|
# SCO 5 - Ben Laurie <ben@algroup.co.uk> says the -O breaks the
|
||||||
# SCO cc.
|
# SCO cc.
|
||||||
@@ -441,6 +446,7 @@ my @WinTargets=qw(VC-NT VC-WIN32 VC-WIN16 VC-W31-16 VC-W31-32 VC-MSDOS BC-32
|
|||||||
|
|
||||||
my $prefix="";
|
my $prefix="";
|
||||||
my $openssldir="";
|
my $openssldir="";
|
||||||
|
my $exe_ext="";
|
||||||
my $install_prefix="";
|
my $install_prefix="";
|
||||||
my $no_threads=0;
|
my $no_threads=0;
|
||||||
my $no_shared=1;
|
my $no_shared=1;
|
||||||
@@ -657,6 +663,7 @@ print "Configuring for $target\n";
|
|||||||
|
|
||||||
my $IsWindows=scalar grep /^$target$/,@WinTargets;
|
my $IsWindows=scalar grep /^$target$/,@WinTargets;
|
||||||
|
|
||||||
|
$exe_ext=".exe" if ($target eq "CygWin32");
|
||||||
$openssldir="/usr/local/ssl" if ($openssldir eq "" and $prefix eq "");
|
$openssldir="/usr/local/ssl" if ($openssldir eq "" and $prefix eq "");
|
||||||
$prefix=$openssldir if $prefix eq "";
|
$prefix=$openssldir if $prefix eq "";
|
||||||
|
|
||||||
@@ -859,6 +866,7 @@ while (<IN>)
|
|||||||
s/^CFLAG=.*$/CFLAG= $cflags/;
|
s/^CFLAG=.*$/CFLAG= $cflags/;
|
||||||
s/^DEPFLAG=.*$/DEPFLAG= $depflags/;
|
s/^DEPFLAG=.*$/DEPFLAG= $depflags/;
|
||||||
s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
|
s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
|
||||||
|
s/^EXE_EXT=.*$/EXE_EXT= $exe_ext/;
|
||||||
s/^BN_ASM=.*$/BN_ASM= $bn_obj/;
|
s/^BN_ASM=.*$/BN_ASM= $bn_obj/;
|
||||||
s/^DES_ENC=.*$/DES_ENC= $des_obj/;
|
s/^DES_ENC=.*$/DES_ENC= $des_obj/;
|
||||||
s/^BF_ENC=.*$/BF_ENC= $bf_obj/;
|
s/^BF_ENC=.*$/BF_ENC= $bf_obj/;
|
||||||
|
|||||||
477
FAQ
477
FAQ
@@ -1,20 +1,23 @@
|
|||||||
OpenSSL - Frequently Asked Questions
|
OpenSSL - Frequently Asked Questions
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
|
|
||||||
|
[MISC] Miscellaneous questions
|
||||||
|
|
||||||
* Which is the current version of OpenSSL?
|
* Which is the current version of OpenSSL?
|
||||||
* Where is the documentation?
|
* Where is the documentation?
|
||||||
* How can I contact the OpenSSL developers?
|
* How can I contact the OpenSSL developers?
|
||||||
* Do I need patent licenses to use OpenSSL?
|
|
||||||
* Is OpenSSL thread-safe?
|
|
||||||
* Why do I get a "PRNG not seeded" error message?
|
|
||||||
* Why does the linker complain about undefined symbols?
|
|
||||||
* Where can I get a compiled version of OpenSSL?
|
* Where can I get a compiled version of OpenSSL?
|
||||||
* I've compiled a program under Windows and it crashes: why?
|
* Why aren't tools like 'autoconf' and 'libtool' used?
|
||||||
* How do I read or write a DER encoded buffer using the ASN1 functions?
|
|
||||||
* I've tried using <M_some_evil_pkcs12_macro> and I get errors why?
|
[LEGAL] Legal questions
|
||||||
* I've called <some function> and it fails, why?
|
|
||||||
* I just get a load of numbers for the error output, what do they mean?
|
* Do I need patent licenses to use OpenSSL?
|
||||||
* Why do I get errors about unknown algorithms?
|
* Can I use OpenSSL with GPL software?
|
||||||
|
|
||||||
|
[USER] Questions on using the OpenSSL applications
|
||||||
|
|
||||||
|
* 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?
|
||||||
@@ -22,17 +25,39 @@ OpenSSL - Frequently Asked Questions
|
|||||||
* How can I create DSA certificates?
|
* How can I create DSA certificates?
|
||||||
* Why can't I make an SSL connection using a DSA certificate?
|
* Why can't I make an SSL connection using a DSA certificate?
|
||||||
* How can I remove the passphrase on a private key?
|
* How can I remove the passphrase on a private key?
|
||||||
* Why can't the OpenSSH configure script detect OpenSSL?
|
* Why can't I use OpenSSL certificates with SSL client authentication?
|
||||||
|
* Why does my browser give a warning about a mismatched hostname?
|
||||||
|
|
||||||
|
[BUILD] Questions about building and testing OpenSSL
|
||||||
|
|
||||||
|
* Why does the linker complain about undefined symbols?
|
||||||
* Why does the OpenSSL test fail with "bc: command not found"?
|
* Why does the OpenSSL test fail with "bc: command not found"?
|
||||||
* Why does the OpenSSL test fail with "bc: 1 no implemented"?
|
* Why does the OpenSSL test fail with "bc: 1 no implemented"?
|
||||||
* Why does the OpenSSL compilation fail on Alpha True64 Unix?
|
* Why does the OpenSSL compilation fail on Alpha True64 Unix?
|
||||||
* Why does the OpenSSL compilation fail with "ar: command not found"?
|
* Why does the OpenSSL compilation fail with "ar: command not found"?
|
||||||
|
* Why does the OpenSSL compilation fail on Win32 with VC++?
|
||||||
|
|
||||||
|
[PROG] Questions about programming with OpenSSL
|
||||||
|
|
||||||
|
* Is OpenSSL thread-safe?
|
||||||
|
* I've compiled a program under Windows and it crashes: why?
|
||||||
|
* How do I read or write a DER encoded buffer using the ASN1 functions?
|
||||||
|
* I've tried using <M_some_evil_pkcs12_macro> and I get errors why?
|
||||||
|
* I've called <some function> and it fails, why?
|
||||||
|
* I just get a load of numbers for the error output, what do they mean?
|
||||||
|
* Why do I get errors about unknown algorithms?
|
||||||
|
* Why can't the OpenSSH configure script detect OpenSSL?
|
||||||
|
* Can I use OpenSSL's SSL library with non-blocking I/O?
|
||||||
|
* Why doesn't my server application receive a client certificate?
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
[MISC] ========================================================================
|
||||||
|
|
||||||
* Which is the current version of OpenSSL?
|
* Which is the current version of OpenSSL?
|
||||||
|
|
||||||
The current version is available from <URL: http://www.openssl.org>.
|
The current version is available from <URL: http://www.openssl.org>.
|
||||||
OpenSSL 0.9.6 was released on September 24th, 2000.
|
OpenSSL 0.9.6b was released on July 9th, 2001.
|
||||||
|
|
||||||
In addition to the current stable release, you can also access daily
|
In addition to the current stable release, you can also access daily
|
||||||
snapshots of the OpenSSL development version at <URL:
|
snapshots of the OpenSSL development version at <URL:
|
||||||
@@ -78,6 +103,27 @@ OpenSSL. Information on the OpenSSL mailing lists is available from
|
|||||||
<URL: http://www.openssl.org>.
|
<URL: http://www.openssl.org>.
|
||||||
|
|
||||||
|
|
||||||
|
* Where can I get a compiled version of OpenSSL?
|
||||||
|
|
||||||
|
Some applications that use OpenSSL are distributed in binary form.
|
||||||
|
When using such an application, you don't need to install OpenSSL
|
||||||
|
yourself; the application will include the required parts (e.g. DLLs).
|
||||||
|
|
||||||
|
If you want to install OpenSSL on a Windows system and you don't have
|
||||||
|
a C compiler, read the "Mingw32" section of INSTALL.W32 for information
|
||||||
|
on how to obtain and install the free GNU C compiler.
|
||||||
|
|
||||||
|
A number of Linux and *BSD distributions include OpenSSL.
|
||||||
|
|
||||||
|
|
||||||
|
* Why aren't tools like 'autoconf' and 'libtool' used?
|
||||||
|
|
||||||
|
autoconf will probably be used in future OpenSSL versions. If it was
|
||||||
|
less Unix-centric, it might have been used much earlier.
|
||||||
|
|
||||||
|
|
||||||
|
[LEGAL] =======================================================================
|
||||||
|
|
||||||
* Do I need patent licenses to use OpenSSL?
|
* Do I need patent licenses to use OpenSSL?
|
||||||
|
|
||||||
The patents section of the README file lists patents that may apply to
|
The patents section of the README file lists patents that may apply to
|
||||||
@@ -89,17 +135,25 @@ You can configure OpenSSL so as not to use RC5 and IDEA by using
|
|||||||
./config no-rc5 no-idea
|
./config no-rc5 no-idea
|
||||||
|
|
||||||
|
|
||||||
* Is OpenSSL thread-safe?
|
* Can I use OpenSSL with GPL software?
|
||||||
|
|
||||||
Yes (with limitations: an SSL connection may not concurrently be used
|
On many systems including the major Linux and BSD distributions, yes (the
|
||||||
by multiple threads). On Windows and many Unix systems, OpenSSL
|
GPL does not place restrictions on using libraries that are part of the
|
||||||
automatically uses the multi-threaded versions of the standard
|
normal operating system distribution).
|
||||||
libraries. If your platform is not one of these, consult the INSTALL
|
|
||||||
file.
|
|
||||||
|
|
||||||
Multi-threaded applications must provide two callback functions to
|
On other systems, the situation is less clear. Some GPL software copyright
|
||||||
OpenSSL. This is described in the threads(3) manpage.
|
holders claim that you infringe on their rights if you use OpenSSL with
|
||||||
|
their software on operating systems that don't normally include OpenSSL.
|
||||||
|
|
||||||
|
If you develop open source software that uses OpenSSL, you may find it
|
||||||
|
useful to choose an other license than the GPL, or state explicitely that
|
||||||
|
"This program is released under the GPL with the additional exemption that
|
||||||
|
compiling, linking, and/or using OpenSSL is allowed." If you are using
|
||||||
|
GPL software developed by others, you may want to ask the copyright holder
|
||||||
|
for permission to use their software with OpenSSL.
|
||||||
|
|
||||||
|
|
||||||
|
[USER] ========================================================================
|
||||||
|
|
||||||
* Why do I get a "PRNG not seeded" error message?
|
* Why do I get a "PRNG not seeded" error message?
|
||||||
|
|
||||||
@@ -108,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
|
||||||
@@ -117,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
|
||||||
@@ -138,6 +211,113 @@ 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?
|
||||||
|
|
||||||
|
Check out the CA.pl(1) manual page. This provides a simple wrapper round
|
||||||
|
the 'req', 'verify', 'ca' and 'pkcs12' utilities. For finer control check
|
||||||
|
out the manual pages for the individual utilities and the certificate
|
||||||
|
extensions documentation (currently in doc/openssl.txt).
|
||||||
|
|
||||||
|
|
||||||
|
* Why can't I create certificate requests?
|
||||||
|
|
||||||
|
You typically get the error:
|
||||||
|
|
||||||
|
unable to find 'distinguished_name' in config
|
||||||
|
problems making Certificate Request
|
||||||
|
|
||||||
|
This is because it can't find the configuration file. Check out the
|
||||||
|
DIAGNOSTICS section of req(1) for more information.
|
||||||
|
|
||||||
|
|
||||||
|
* Why does <SSL program> fail with a certificate verify error?
|
||||||
|
|
||||||
|
This problem is usually indicated by log messages saying something like
|
||||||
|
"unable to get local issuer certificate" or "self signed certificate".
|
||||||
|
When a certificate is verified its root CA must be "trusted" by OpenSSL
|
||||||
|
this typically means that the CA certificate must be placed in a directory
|
||||||
|
or file and the relevant program configured to read it. The OpenSSL program
|
||||||
|
'verify' behaves in a similar way and issues similar error messages: check
|
||||||
|
the verify(1) program manual page for more information.
|
||||||
|
|
||||||
|
|
||||||
|
* Why can I only use weak ciphers when I connect to a server using OpenSSL?
|
||||||
|
|
||||||
|
This is almost certainly because you are using an old "export grade" browser
|
||||||
|
which only supports weak encryption. Upgrade your browser to support 128 bit
|
||||||
|
ciphers.
|
||||||
|
|
||||||
|
|
||||||
|
* How can I create DSA certificates?
|
||||||
|
|
||||||
|
Check the CA.pl(1) manual page for a DSA certificate example.
|
||||||
|
|
||||||
|
|
||||||
|
* Why can't I make an SSL connection to a server using a DSA certificate?
|
||||||
|
|
||||||
|
Typically you'll see a message saying there are no shared ciphers when
|
||||||
|
the same setup works fine with an RSA certificate. There are two possible
|
||||||
|
causes. The client may not support connections to DSA servers most web
|
||||||
|
browsers (including Netscape and MSIE) only support connections to servers
|
||||||
|
supporting RSA cipher suites. The other cause is that a set of DH parameters
|
||||||
|
has not been supplied to the server. DH parameters can be created with the
|
||||||
|
dhparam(1) command and loaded using the SSL_CTX_set_tmp_dh() for example:
|
||||||
|
check the source to s_server in apps/s_server.c for an example.
|
||||||
|
|
||||||
|
|
||||||
|
* How can I remove the passphrase on a private key?
|
||||||
|
|
||||||
|
Firstly you should be really *really* sure you want to do this. Leaving
|
||||||
|
a private key unencrypted is a major security risk. If you decide that
|
||||||
|
you do have to do this check the EXAMPLES sections of the rsa(1) and
|
||||||
|
dsa(1) manual pages.
|
||||||
|
|
||||||
|
|
||||||
|
* Why can't I use OpenSSL certificates with SSL client authentication?
|
||||||
|
|
||||||
|
What will typically happen is that when a server requests authentication
|
||||||
|
it will either not include your certificate or tell you that you have
|
||||||
|
no client certificates (Netscape) or present you with an empty list box
|
||||||
|
(MSIE). The reason for this is that when a server requests a client
|
||||||
|
certificate it includes a list of CAs names which it will accept. Browsers
|
||||||
|
will only let you select certificates from the list on the grounds that
|
||||||
|
there is little point presenting a certificate which the server will
|
||||||
|
reject.
|
||||||
|
|
||||||
|
The solution is to add the relevant CA certificate to your servers "trusted
|
||||||
|
CA list". How you do this depends on the server sofware in uses. You can
|
||||||
|
print out the servers list of acceptable CAs using the OpenSSL s_client tool:
|
||||||
|
|
||||||
|
openssl s_client -connect www.some.host:443 -prexit
|
||||||
|
|
||||||
|
If your server only requests certificates on certain URLs then you may need
|
||||||
|
to manually issue an HTTP GET command to get the list when s_client connects:
|
||||||
|
|
||||||
|
GET /some/page/needing/a/certificate.html
|
||||||
|
|
||||||
|
If your CA does not appear in the list then this confirms the problem.
|
||||||
|
|
||||||
|
|
||||||
|
* Why does my browser give a warning about a mismatched hostname?
|
||||||
|
|
||||||
|
Browsers expect the server's hostname to match the value in the commonName
|
||||||
|
(CN) field of the certificate. If it does not then you get a warning.
|
||||||
|
|
||||||
|
|
||||||
|
[BUILD] =======================================================================
|
||||||
|
|
||||||
* Why does the linker complain about undefined symbols?
|
* Why does the linker complain about undefined symbols?
|
||||||
|
|
||||||
Maybe the compilation was interrupted, and make doesn't notice that
|
Maybe the compilation was interrupted, and make doesn't notice that
|
||||||
@@ -162,17 +342,99 @@ If none of these helps, you may want to try using the current snapshot.
|
|||||||
If the problem persists, please submit a bug report.
|
If the problem persists, please submit a bug report.
|
||||||
|
|
||||||
|
|
||||||
* Where can I get a compiled version of OpenSSL?
|
* Why does the OpenSSL test fail with "bc: command not found"?
|
||||||
|
|
||||||
Some applications that use OpenSSL are distributed in binary form.
|
You didn't install "bc", the Unix calculator. If you want to run the
|
||||||
When using such an application, you don't need to install OpenSSL
|
tests, get GNU bc from ftp://ftp.gnu.org or from your OS distributor.
|
||||||
yourself; the application will include the required parts (e.g. DLLs).
|
|
||||||
|
|
||||||
If you want to install OpenSSL on a Windows system and you don't have
|
|
||||||
a C compiler, read the "Mingw32" section of INSTALL.W32 for information
|
|
||||||
on how to obtain and install the free GNU C compiler.
|
|
||||||
|
|
||||||
A number of Linux and *BSD distributions include OpenSSL.
|
* Why does the OpenSSL test fail with "bc: 1 no implemented"?
|
||||||
|
|
||||||
|
On some SCO installations or versions, bc has a bug that gets triggered
|
||||||
|
when you run the test suite (using "make test"). The message returned is
|
||||||
|
"bc: 1 not implemented".
|
||||||
|
|
||||||
|
The best way to deal with this is to find another implementation of bc
|
||||||
|
and compile/install it. GNU bc (see http://www.gnu.org/software/software.html
|
||||||
|
for download instructions) can be safely used, for example.
|
||||||
|
|
||||||
|
|
||||||
|
* Why does the OpenSSL compilation fail on Alpha True64 Unix?
|
||||||
|
|
||||||
|
On some Alpha installations running True64 Unix and Compaq C, the compilation
|
||||||
|
of crypto/sha/sha_dgst.c fails with the message 'Fatal: Insufficient virtual
|
||||||
|
memory to continue compilation.' As far as the tests have shown, this may be
|
||||||
|
a compiler bug. What happens is that it eats up a lot of resident memory
|
||||||
|
to build something, probably a table. The problem is clearly in the
|
||||||
|
optimization code, because if one eliminates optimization completely (-O0),
|
||||||
|
the compilation goes through (and the compiler consumes about 2MB of resident
|
||||||
|
memory instead of 240MB or whatever one's limit is currently).
|
||||||
|
|
||||||
|
There are three options to solve this problem:
|
||||||
|
|
||||||
|
1. set your current data segment size soft limit higher. Experience shows
|
||||||
|
that about 241000 kbytes seems to be enough on an AlphaServer DS10. You do
|
||||||
|
this with the command 'ulimit -Sd nnnnnn', where 'nnnnnn' is the number of
|
||||||
|
kbytes to set the limit to.
|
||||||
|
|
||||||
|
2. If you have a hard limit that is lower than what you need and you can't
|
||||||
|
get it changed, you can compile all of OpenSSL with -O0 as optimization
|
||||||
|
level. This is however not a very nice thing to do for those who expect to
|
||||||
|
get the best result from OpenSSL. A bit more complicated solution is the
|
||||||
|
following:
|
||||||
|
|
||||||
|
----- snip:start -----
|
||||||
|
make DIRS=crypto SDIRS=sha "`grep '^CFLAG=' Makefile.ssl | \
|
||||||
|
sed -e 's/ -O[0-9] / -O0 /'`"
|
||||||
|
rm `ls crypto/*.o crypto/sha/*.o | grep -v 'sha_dgst\.o'`
|
||||||
|
make
|
||||||
|
----- snip:end -----
|
||||||
|
|
||||||
|
This will only compile sha_dgst.c with -O0, the rest with the optimization
|
||||||
|
level chosen by the configuration process. When the above is done, do the
|
||||||
|
test and installation and you're set.
|
||||||
|
|
||||||
|
|
||||||
|
* Why does the OpenSSL compilation fail with "ar: command not found"?
|
||||||
|
|
||||||
|
Getting this message is quite usual on Solaris 2, because Sun has hidden
|
||||||
|
away 'ar' and other development commands in directories that aren't in
|
||||||
|
$PATH by default. One of those directories is '/usr/ccs/bin'. The
|
||||||
|
quickest way to fix this is to do the following (it assumes you use sh
|
||||||
|
or any sh-compatible shell):
|
||||||
|
|
||||||
|
----- snip:start -----
|
||||||
|
PATH=${PATH}:/usr/ccs/bin; export PATH
|
||||||
|
----- snip:end -----
|
||||||
|
|
||||||
|
and then redo the compilation. What you should really do is make sure
|
||||||
|
'/usr/ccs/bin' is permanently in your $PATH, for example through your
|
||||||
|
'.profile' (again, assuming you use a sh-compatible shell).
|
||||||
|
|
||||||
|
|
||||||
|
* Why does the OpenSSL compilation fail on Win32 with VC++?
|
||||||
|
|
||||||
|
Sometimes, you may get reports from VC++ command line (cl) that it
|
||||||
|
can't find standard include files like stdio.h and other weirdnesses.
|
||||||
|
One possible cause is that the environment isn't correctly set up.
|
||||||
|
To solve that problem, one should run VCVARS32.BAT which is found in
|
||||||
|
the 'bin' subdirectory of the VC++ installation directory (somewhere
|
||||||
|
under 'Program Files'). This needs to be done prior to running NMAKE,
|
||||||
|
and the changes are only valid for the current DOS session.
|
||||||
|
|
||||||
|
|
||||||
|
[PROG] ========================================================================
|
||||||
|
|
||||||
|
* Is OpenSSL thread-safe?
|
||||||
|
|
||||||
|
Yes (with limitations: an SSL connection may not concurrently be used
|
||||||
|
by multiple threads). On Windows and many Unix systems, OpenSSL
|
||||||
|
automatically uses the multi-threaded versions of the standard
|
||||||
|
libraries. If your platform is not one of these, consult the INSTALL
|
||||||
|
file.
|
||||||
|
|
||||||
|
Multi-threaded applications must provide two callback functions to
|
||||||
|
OpenSSL. This is described in the threads(3) manpage.
|
||||||
|
|
||||||
|
|
||||||
* I've compiled a program under Windows and it crashes: why?
|
* I've compiled a program under Windows and it crashes: why?
|
||||||
@@ -259,68 +521,6 @@ is forgetting to load OpenSSL's table of algorithms with
|
|||||||
OpenSSL_add_all_algorithms(). See the manual page for more information.
|
OpenSSL_add_all_algorithms(). See the manual page for more information.
|
||||||
|
|
||||||
|
|
||||||
* How do I create certificates or certificate requests?
|
|
||||||
|
|
||||||
Check out the CA.pl(1) manual page. This provides a simple wrapper round
|
|
||||||
the 'req', 'verify', 'ca' and 'pkcs12' utilities. For finer control check
|
|
||||||
out the manual pages for the individual utilities and the certificate
|
|
||||||
extensions documentation (currently in doc/openssl.txt).
|
|
||||||
|
|
||||||
|
|
||||||
* Why can't I create certificate requests?
|
|
||||||
|
|
||||||
You typically get the error:
|
|
||||||
|
|
||||||
unable to find 'distinguished_name' in config
|
|
||||||
problems making Certificate Request
|
|
||||||
|
|
||||||
This is because it can't find the configuration file. Check out the
|
|
||||||
DIAGNOSTICS section of req(1) for more information.
|
|
||||||
|
|
||||||
|
|
||||||
* Why does <SSL program> fail with a certificate verify error?
|
|
||||||
|
|
||||||
This problem is usually indicated by log messages saying something like
|
|
||||||
"unable to get local issuer certificate" or "self signed certificate".
|
|
||||||
When a certificate is verified its root CA must be "trusted" by OpenSSL
|
|
||||||
this typically means that the CA certificate must be placed in a directory
|
|
||||||
or file and the relevant program configured to read it. The OpenSSL program
|
|
||||||
'verify' behaves in a similar way and issues similar error messages: check
|
|
||||||
the verify(1) program manual page for more information.
|
|
||||||
|
|
||||||
|
|
||||||
* Why can I only use weak ciphers when I connect to a server using OpenSSL?
|
|
||||||
|
|
||||||
This is almost certainly because you are using an old "export grade" browser
|
|
||||||
which only supports weak encryption. Upgrade your browser to support 128 bit
|
|
||||||
ciphers.
|
|
||||||
|
|
||||||
|
|
||||||
* How can I create DSA certificates?
|
|
||||||
|
|
||||||
Check the CA.pl(1) manual page for a DSA certificate example.
|
|
||||||
|
|
||||||
|
|
||||||
* Why can't I make an SSL connection to a server using a DSA certificate?
|
|
||||||
|
|
||||||
Typically you'll see a message saying there are no shared ciphers when
|
|
||||||
the same setup works fine with an RSA certificate. There are two possible
|
|
||||||
causes. The client may not support connections to DSA servers most web
|
|
||||||
browsers (including Netscape and MSIE) only support connections to servers
|
|
||||||
supporting RSA cipher suites. The other cause is that a set of DH parameters
|
|
||||||
has not been supplied to the server. DH parameters can be created with the
|
|
||||||
dhparam(1) command and loaded using the SSL_CTX_set_tmp_dh() for example:
|
|
||||||
check the source to s_server in apps/s_server.c for an example.
|
|
||||||
|
|
||||||
|
|
||||||
* How can I remove the passphrase on a private key?
|
|
||||||
|
|
||||||
Firstly you should be really *really* sure you want to do this. Leaving
|
|
||||||
a private key unencrypted is a major security risk. If you decide that
|
|
||||||
you do have to do this check the EXAMPLES sections of the rsa(1) and
|
|
||||||
dsa(1) manual pages.
|
|
||||||
|
|
||||||
|
|
||||||
* Why can't the OpenSSH configure script detect OpenSSL?
|
* Why can't the OpenSSH configure script detect OpenSSL?
|
||||||
|
|
||||||
There is a problem with OpenSSH 1.2.2p1, in that the configure script
|
There is a problem with OpenSSH 1.2.2p1, in that the configure script
|
||||||
@@ -362,71 +562,26 @@ applied to the OpenSSH distribution:
|
|||||||
----- snip:end -----
|
----- snip:end -----
|
||||||
|
|
||||||
|
|
||||||
* Why does the OpenSSL test fail with "bc: command not found"?
|
* Can I use OpenSSL's SSL library with non-blocking I/O?
|
||||||
|
|
||||||
You didn't install "bc", the Unix calculator. If you want to run the
|
Yes; make sure to read the SSL_get_error(3) manual page!
|
||||||
tests, get GNU bc from ftp://ftp.gnu.org or from your OS distributor.
|
|
||||||
|
A pitfall to avoid: Don't assume that SSL_read() will just read from
|
||||||
|
the underlying transport or that SSL_write() will just write to it --
|
||||||
|
it is also possible that SSL_write() cannot do any useful work until
|
||||||
|
there is data to read, or that SSL_read() cannot do anything until it
|
||||||
|
is possible to send data. One reason for this is that the peer may
|
||||||
|
request a new TLS/SSL handshake at any time during the protocol,
|
||||||
|
requiring a bi-directional message exchange; both SSL_read() and
|
||||||
|
SSL_write() will try to continue any pending handshake.
|
||||||
|
|
||||||
|
|
||||||
* Why does the OpenSSL test fail with "bc: 1 no implemented"?
|
* Why doesn't my server application receive a client certificate?
|
||||||
|
|
||||||
On some SCO installations or versions, bc has a bug that gets triggered when
|
Due to the TLS protocol definition, a client will only send a certificate,
|
||||||
you run the test suite (using "make test"). The message returned is "bc:
|
if explicitely asked by the server. Use the SSL_VERIFY_PEER flag of the
|
||||||
1 not implemented". The best way to deal with this is to find another
|
SSL_CTX_set_verify() function to enable the use of client certificates.
|
||||||
implementation of bc and compile/install it. For example, GNU bc (see
|
|
||||||
http://www.gnu.org/software/software.html for download instructions) can
|
|
||||||
be safely used.
|
|
||||||
|
|
||||||
|
|
||||||
* Why does the OpenSSL compilation fail on Alpha True64 Unix?
|
===============================================================================
|
||||||
|
|
||||||
On some Alpha installations running True64 Unix and Compaq C, the compilation
|
|
||||||
of crypto/sha/sha_dgst.c fails with the message 'Fatal: Insufficient virtual
|
|
||||||
memory to continue compilation.' As far as the tests have shown, this may be
|
|
||||||
a compiler bug. What happens is that it eats up a lot of resident memory
|
|
||||||
to build something, probably a table. The problem is clearly in the
|
|
||||||
optimization code, because if one eliminates optimization completely (-O0),
|
|
||||||
the compilation goes through (and the compiler consumes about 2MB of resident
|
|
||||||
memory instead of 240MB or whatever one's limit is currently).
|
|
||||||
|
|
||||||
There are three options to solve this problem:
|
|
||||||
|
|
||||||
1. set your current data segment size soft limit higher. Experience shows
|
|
||||||
that about 241000 kbytes seems to be enough on an AlphaServer DS10. You do
|
|
||||||
this with the command 'ulimit -Sd nnnnnn', where 'nnnnnn' is the number of
|
|
||||||
kbytes to set the limit to.
|
|
||||||
|
|
||||||
2. If you have a hard limit that is lower than what you need and you can't
|
|
||||||
get it changed, you can compile all of OpenSSL with -O0 as optimization
|
|
||||||
level. This is however not a very nice thing to do for those who expect to
|
|
||||||
get the best result from OpenSSL. A bit more complicated solution is the
|
|
||||||
following:
|
|
||||||
|
|
||||||
----- snip:start -----
|
|
||||||
make DIRS=crypto SDIRS=sha "`grep '^CFLAG=' Makefile.ssl | \
|
|
||||||
sed -e 's/ -O[0-9] / -O0 /'`"
|
|
||||||
rm `ls crypto/*.o crypto/sha/*.o | grep -v 'sha_dgst\.o'`
|
|
||||||
make
|
|
||||||
----- snip:end -----
|
|
||||||
|
|
||||||
This will only compile sha_dgst.c with -O0, the rest with the optimization
|
|
||||||
level chosen by the configuration process. When the above is done, do the
|
|
||||||
test and installation and you're set.
|
|
||||||
|
|
||||||
|
|
||||||
* Why does the OpenSSL compilation fail with "ar: command not found"?
|
|
||||||
|
|
||||||
Getting this message is quite usual on Solaris 2, because Sun has hidden
|
|
||||||
away 'ar' and other development commands in directories that aren't in
|
|
||||||
$PATH by default. One of those directories is '/usr/ccs/bin'. The
|
|
||||||
quickest way to fix this is to do the following (it assumes you use sh
|
|
||||||
or any sh-compatible shell):
|
|
||||||
|
|
||||||
----- snip:start -----
|
|
||||||
PATH=${PATH}:/usr/ccs/bin; export PATH
|
|
||||||
----- snip:end -----
|
|
||||||
|
|
||||||
and then redo the compilation. What you should really do is make sure
|
|
||||||
'/usr/ccs/bin' is permanently in your $PATH, for example through your
|
|
||||||
'.profile' (again, assuming you use a sh-compatible shell).
|
|
||||||
|
|
||||||
|
|||||||
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:
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
|
|||||||
17
Makefile.org
17
Makefile.org
@@ -59,6 +59,7 @@ CFLAG= -DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -m486 -Wall -DSHA1_ASM -DMD
|
|||||||
DEPFLAG=
|
DEPFLAG=
|
||||||
PEX_LIBS=
|
PEX_LIBS=
|
||||||
EX_LIBS=
|
EX_LIBS=
|
||||||
|
EXE_EXT=
|
||||||
AR=ar r
|
AR=ar r
|
||||||
RANLIB= ranlib
|
RANLIB= ranlib
|
||||||
PERL= perl
|
PERL= perl
|
||||||
@@ -201,7 +202,7 @@ sub_all:
|
|||||||
do \
|
do \
|
||||||
if [ -d "$$i" ]; then \
|
if [ -d "$$i" ]; then \
|
||||||
(cd $$i && echo "making all in $$i..." && \
|
(cd $$i && echo "making all in $$i..." && \
|
||||||
$(MAKE) CC='${CC}' PLATFORM='${PLATFORM}' CFLAG='${CFLAG}' SDIRS='$(SDIRS)' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' PROCESSOR='${PROCESSOR}' PERL='${PERL}' RANLIB='${RANLIB}' all ) || exit 1; \
|
$(MAKE) CC='${CC}' PLATFORM='${PLATFORM}' CFLAG='${CFLAG}' SDIRS='$(SDIRS)' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' PROCESSOR='${PROCESSOR}' PERL='${PERL}' RANLIB='${RANLIB}' EXE_EXT='${EXE_EXT}' all ) || exit 1; \
|
||||||
else \
|
else \
|
||||||
$(MAKE) $$i; \
|
$(MAKE) $$i; \
|
||||||
fi; \
|
fi; \
|
||||||
@@ -250,7 +251,7 @@ link-shared:
|
|||||||
|
|
||||||
build-shared: clean-shared do_$(SHLIB_TARGET) link-shared
|
build-shared: clean-shared do_$(SHLIB_TARGET) link-shared
|
||||||
|
|
||||||
do_bsd-gcc-shared: linux-shared
|
do_bsd-gcc-shared: do_gnu-shared
|
||||||
do_linux-shared: do_gnu-shared
|
do_linux-shared: do_gnu-shared
|
||||||
do_gnu-shared:
|
do_gnu-shared:
|
||||||
libs='-L. ${SHLIBDEPS}'; for i in ${SHLIBDIRS}; do \
|
libs='-L. ${SHLIBDEPS}'; for i in ${SHLIBDIRS}; do \
|
||||||
@@ -349,7 +350,7 @@ test: tests
|
|||||||
|
|
||||||
tests: rehash
|
tests: rehash
|
||||||
@(cd test && echo "testing..." && \
|
@(cd test && echo "testing..." && \
|
||||||
$(MAKE) CC='${CC}' CFLAG='${CFLAG}' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SDIRS='${SDIRS}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' tests );
|
$(MAKE) CC='${CC}' CFLAG='${CFLAG}' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SDIRS='${SDIRS}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' EXE_EXT='${EXE_EXT}' tests );
|
||||||
@apps/openssl version -a
|
@apps/openssl version -a
|
||||||
|
|
||||||
report:
|
report:
|
||||||
@@ -440,7 +441,7 @@ install: all install_docs
|
|||||||
do \
|
do \
|
||||||
if [ -d "$$i" ]; then \
|
if [ -d "$$i" ]; then \
|
||||||
(cd $$i; echo "installing $$i..."; \
|
(cd $$i; echo "installing $$i..."; \
|
||||||
$(MAKE) CC='${CC}' CFLAG='${CFLAG}' INSTALL_PREFIX='${INSTALL_PREFIX}' INSTALLTOP='${INSTALLTOP}' OPENSSLDIR='${OPENSSLDIR}' EX_LIBS='${EX_LIBS}' SDIRS='${SDIRS}' RANLIB='${RANLIB}' install ); \
|
$(MAKE) CC='${CC}' CFLAG='${CFLAG}' INSTALL_PREFIX='${INSTALL_PREFIX}' INSTALLTOP='${INSTALLTOP}' OPENSSLDIR='${OPENSSLDIR}' EX_LIBS='${EX_LIBS}' SDIRS='${SDIRS}' RANLIB='${RANLIB}' EXE_EXT='${EXE_EXT}' install ); \
|
||||||
fi; \
|
fi; \
|
||||||
done
|
done
|
||||||
@for i in $(LIBS) ;\
|
@for i in $(LIBS) ;\
|
||||||
@@ -473,19 +474,19 @@ install_docs:
|
|||||||
$(INSTALL_PREFIX)$(MANDIR)/man3 \
|
$(INSTALL_PREFIX)$(MANDIR)/man3 \
|
||||||
$(INSTALL_PREFIX)$(MANDIR)/man5 \
|
$(INSTALL_PREFIX)$(MANDIR)/man5 \
|
||||||
$(INSTALL_PREFIX)$(MANDIR)/man7
|
$(INSTALL_PREFIX)$(MANDIR)/man7
|
||||||
@echo installing man 1 and man 5
|
|
||||||
@for i in doc/apps/*.pod; do \
|
@for i in doc/apps/*.pod; do \
|
||||||
fn=`basename $$i .pod`; \
|
fn=`basename $$i .pod`; \
|
||||||
sec=`[ "$$fn" = "config" ] && echo 5 || echo 1`; \
|
if [ "$$fn" = "config" ]; then sec=5; else sec=1; fi; \
|
||||||
|
echo "installing man$$sec/`basename $$i .pod`.$$sec"; \
|
||||||
(cd `dirname $$i`; \
|
(cd `dirname $$i`; \
|
||||||
$(PERL) ../../util/pod2man.pl --section=$$sec --center=OpenSSL \
|
$(PERL) ../../util/pod2man.pl --section=$$sec --center=OpenSSL \
|
||||||
--release=$(VERSION) `basename $$i`) \
|
--release=$(VERSION) `basename $$i`) \
|
||||||
> $(INSTALL_PREFIX)$(MANDIR)/man$$sec/`basename $$i .pod`.$$sec; \
|
> $(INSTALL_PREFIX)$(MANDIR)/man$$sec/`basename $$i .pod`.$$sec; \
|
||||||
done
|
done
|
||||||
@echo installing man 3 and man 7
|
|
||||||
@for i in doc/crypto/*.pod doc/ssl/*.pod; do \
|
@for i in doc/crypto/*.pod doc/ssl/*.pod; do \
|
||||||
fn=`basename $$i .pod`; \
|
fn=`basename $$i .pod`; \
|
||||||
sec=`[ "$$fn" = "des_modes" ] && echo 7 || echo 3`; \
|
if [ "$$fn" = "des_modes" ]; then sec=7; else sec=3; fi; \
|
||||||
|
echo "installing man$$sec/`basename $$i .pod`.$$sec"; \
|
||||||
(cd `dirname $$i`; \
|
(cd `dirname $$i`; \
|
||||||
$(PERL) ../../util/pod2man.pl --section=$$sec --center=OpenSSL \
|
$(PERL) ../../util/pod2man.pl --section=$$sec --center=OpenSSL \
|
||||||
--release=$(VERSION) `basename $$i`) \
|
--release=$(VERSION) `basename $$i`) \
|
||||||
|
|||||||
17
NEWS
17
NEWS
@@ -5,6 +5,23 @@
|
|||||||
This file gives a brief overview of the major changes between each OpenSSL
|
This file gives a brief overview of the major changes between each OpenSSL
|
||||||
release. For more details please read the CHANGES file.
|
release. For more details please read the CHANGES file.
|
||||||
|
|
||||||
|
Changes between OpenSSL 0.9.6a and OpenSSL 0.9.6b:
|
||||||
|
|
||||||
|
o Security fix: PRNG improvements.
|
||||||
|
o Security fix: RSA OAEP check.
|
||||||
|
o Security fix: Reinsert and fix countermeasure to Bleichbacher's
|
||||||
|
attack.
|
||||||
|
o MIPS bug fix in BIGNUM.
|
||||||
|
o Bug fix in "openssl enc".
|
||||||
|
o Bug fix in X.509 printing routine.
|
||||||
|
o Bug fix in DSA verification routine and DSA S/MIME verification.
|
||||||
|
o Bug fix to make PRNG thread-safe.
|
||||||
|
o Bug fix in RAND_file_name().
|
||||||
|
o Bug fix in compatibility mode trust settings.
|
||||||
|
o Bug fix in blowfish EVP.
|
||||||
|
o Increase default size for BIO buffering filter.
|
||||||
|
o Compatibility fixes in some scripts.
|
||||||
|
|
||||||
Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.6a:
|
Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.6a:
|
||||||
|
|
||||||
o Security fix: change behavior of OpenSSL to avoid using
|
o Security fix: change behavior of OpenSSL to avoid using
|
||||||
|
|||||||
4
README
4
README
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
OpenSSL 0.9.6a-beta3 [engine] 30 Mar 2001
|
OpenSSL 0.9.6b [engine] 9 Jul 2001
|
||||||
|
|
||||||
Copyright (c) 1998-2000 The OpenSSL Project
|
Copyright (c) 1998-2001 The OpenSSL Project
|
||||||
Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson
|
Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|||||||
40
STATUS
40
STATUS
@@ -1,46 +1,10 @@
|
|||||||
|
|
||||||
OpenSSL STATUS Last modified at
|
OpenSSL STATUS Last modified at
|
||||||
______________ $Date: 2001/03/26 17:09:12 $
|
______________ $Date: 2001/04/05 17:48:02 $
|
||||||
|
|
||||||
DEVELOPMENT STATE
|
DEVELOPMENT STATE
|
||||||
|
|
||||||
o OpenSSL 0.9.6a: Bugfix release -- under development...
|
o OpenSSL 0.9.6a: Released on April 5th, 2001
|
||||||
Beta 1 released on March 13th, 2001
|
|
||||||
HP-UX 10.20 (hpux-parisc-cc) - PASSED [normal+engine]
|
|
||||||
HP-UX 10.20 (hpux-parisc-gcc) - PASSED [normal+engine]
|
|
||||||
HP-UX 11.00 32bit (hpux-parisc-gcc) - FAILED [engine]
|
|
||||||
"openssl speed rsa1024 -engine cswift" fails unless
|
|
||||||
libswift.sl is renamed to libswift.so.
|
|
||||||
[CORRECTED]
|
|
||||||
HP MPE/iX - PASSED [presumed normal]
|
|
||||||
Linux 2.2.17 SMP (linux-elf) - PASSED [normal+engine]
|
|
||||||
Windows (VC-WIN32) - FAILED [presumed normal]
|
|
||||||
Missing line in ms/32all.bat:
|
|
||||||
perl util\mkfiles.pl >MINFO
|
|
||||||
[CORRECTED]
|
|
||||||
In randfile.c, line 214, signed and unsigned int are mixed.
|
|
||||||
[CORRECTED]
|
|
||||||
In s_client.c and s_server.c, RAND_status() needs to get
|
|
||||||
declared (#include <openssl/rand.h>)
|
|
||||||
[CORRECTED]
|
|
||||||
OpenVMS (any version) - FAILED [normal+engine]
|
|
||||||
Missing instructions in building script.
|
|
||||||
[CORRECTED]
|
|
||||||
AIX 4.3 - FAILED [engine]
|
|
||||||
Needs -DDSO_DLFCN and -DHAVE_DLFCN_H to work.
|
|
||||||
[CORRECTED] (but will not be automagically configured)
|
|
||||||
Irix 6.5.11 - FAILED [presumed normal]
|
|
||||||
BN_sqr test fails.
|
|
||||||
solaris64-sparcv9-cc (SunOS 5.8) - PASSED [normal+engine]
|
|
||||||
BSDI 4.0.1 (bsdi-elf-gcc) - FAILED [engine]
|
|
||||||
Needs -DDSO_DLFCN, -DHAVE_DLFCN_H and -ldl to work.
|
|
||||||
[CORRECTED]
|
|
||||||
mingw32 w/ gcc 2.95.2 - PASSED [presumed normal]
|
|
||||||
|
|
||||||
Beta 2 released on March 21st, 2001
|
|
||||||
OpenVMS (tested on VMS 7.2-1 for Alpha) - PASSED [presumed normal]
|
|
||||||
solaris64-sparcv9-cc (SunOS 5.8) - PASSED [normal]
|
|
||||||
|
|
||||||
o OpenSSL 0.9.6: Released on September 24th, 2000
|
o OpenSSL 0.9.6: Released on September 24th, 2000
|
||||||
o OpenSSL 0.9.5a: Released on April 1st, 2000
|
o OpenSSL 0.9.5a: Released on April 1st, 2000
|
||||||
o OpenSSL 0.9.5: Released on February 28th, 2000
|
o OpenSSL 0.9.5: Released on February 28th, 2000
|
||||||
|
|||||||
86
TABLE
86
TABLE
@@ -1172,8 +1172,8 @@ $cflags = -O3 -fomit-frame-pointer
|
|||||||
$unistd =
|
$unistd =
|
||||||
$thread_cflag = (unknown)
|
$thread_cflag = (unknown)
|
||||||
$lflags = -lnsl -lsocket
|
$lflags = -lnsl -lsocket
|
||||||
$bn_ops = RC4_INDEX
|
$bn_ops = RC4_INDEX DES_UNROLL
|
||||||
$bn_obj = RC4_INDEX DES_UNROLL
|
$bn_obj =
|
||||||
$des_obj =
|
$des_obj =
|
||||||
$bf_obj =
|
$bf_obj =
|
||||||
$md5_obj =
|
$md5_obj =
|
||||||
@@ -2205,9 +2205,9 @@ $cc = gcc
|
|||||||
$cflags = -O3 -fomit-frame-pointer -Dssize_t=int -DNO_SYS_UN_H
|
$cflags = -O3 -fomit-frame-pointer -Dssize_t=int -DNO_SYS_UN_H
|
||||||
$unistd =
|
$unistd =
|
||||||
$thread_cflag = (unknown)
|
$thread_cflag = (unknown)
|
||||||
$lflags =
|
$lflags = -lsocket
|
||||||
$bn_ops = -lsocket
|
$bn_ops = BN_LLONG DES_PTR DES_RISC1 DES_UNROLL RC4_INDEX MD2_INT
|
||||||
$bn_obj = BN_LLONG DES_PTR DES_RISC1 DES_UNROLL RC4_INDEX MD2_INT
|
$bn_obj =
|
||||||
$des_obj =
|
$des_obj =
|
||||||
$bf_obj =
|
$bf_obj =
|
||||||
$md5_obj =
|
$md5_obj =
|
||||||
@@ -2464,6 +2464,28 @@ $shared_cflag = -fPIC
|
|||||||
$shared_extension = .so.$(SHLIB_MAJOR).$(SHLIB_MINOR)
|
$shared_extension = .so.$(SHLIB_MAJOR).$(SHLIB_MINOR)
|
||||||
$ranlib =
|
$ranlib =
|
||||||
|
|
||||||
|
*** solaris-x86-cc
|
||||||
|
$cc = cc
|
||||||
|
$cflags = -fast -O -Xa
|
||||||
|
$unistd =
|
||||||
|
$thread_cflag = -D_REENTRANT
|
||||||
|
$lflags = -lsocket -lnsl -ldl
|
||||||
|
$bn_ops = BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_UNROLL BF_PTR
|
||||||
|
$bn_obj =
|
||||||
|
$des_obj =
|
||||||
|
$bf_obj =
|
||||||
|
$md5_obj =
|
||||||
|
$sha1_obj =
|
||||||
|
$cast_obj =
|
||||||
|
$rc4_obj =
|
||||||
|
$rmd160_obj =
|
||||||
|
$rc5_obj =
|
||||||
|
$dso_scheme = dlfcn
|
||||||
|
$shared_target= solaris-shared
|
||||||
|
$shared_cflag = -KPIC
|
||||||
|
$shared_extension = .so.$(SHLIB_MAJOR).$(SHLIB_MINOR)
|
||||||
|
$ranlib =
|
||||||
|
|
||||||
*** solaris-x86-gcc
|
*** solaris-x86-gcc
|
||||||
$cc = gcc
|
$cc = gcc
|
||||||
$cflags = -O3 -fomit-frame-pointer -m486 -Wall -DL_ENDIAN -DNO_INLINE_ASM
|
$cflags = -O3 -fomit-frame-pointer -m486 -Wall -DL_ENDIAN -DNO_INLINE_ASM
|
||||||
@@ -2599,10 +2621,10 @@ $ranlib =
|
|||||||
*** unixware-2.0-pentium
|
*** unixware-2.0-pentium
|
||||||
$cc = cc
|
$cc = cc
|
||||||
$cflags = -DFILIO_H -Kpentium
|
$cflags = -DFILIO_H -Kpentium
|
||||||
$unistd = -Kthread
|
$unistd =
|
||||||
$thread_cflag = -lsocket -lnsl -lx
|
$thread_cflag = -Kthread
|
||||||
$lflags = MD2_CHAR RC4_INDEX DES_PTR DES_RISC1 DES_UNROLL
|
$lflags = -lsocket -lnsl -lx
|
||||||
$bn_ops =
|
$bn_ops = MD2_CHAR RC4_INDEX DES_PTR DES_RISC1 DES_UNROLL
|
||||||
$bn_obj =
|
$bn_obj =
|
||||||
$des_obj =
|
$des_obj =
|
||||||
$bf_obj =
|
$bf_obj =
|
||||||
@@ -2690,7 +2712,51 @@ $cflags = -O -DFILIO_H -Kalloca
|
|||||||
$unistd =
|
$unistd =
|
||||||
$thread_cflag = -Kthread
|
$thread_cflag = -Kthread
|
||||||
$lflags = -lsocket -lnsl
|
$lflags = -lsocket -lnsl
|
||||||
$bn_ops = MD2_CHAR RC4_INDEX DES_PTR DES_RISC1 DES_UNROLL
|
$bn_ops = BN_LLONG MD2_CHAR RC4_INDEX DES_PTR DES_RISC1 DES_UNROLL
|
||||||
|
$bn_obj =
|
||||||
|
$des_obj =
|
||||||
|
$bf_obj =
|
||||||
|
$md5_obj =
|
||||||
|
$sha1_obj =
|
||||||
|
$cast_obj =
|
||||||
|
$rc4_obj =
|
||||||
|
$rmd160_obj =
|
||||||
|
$rc5_obj =
|
||||||
|
$dso_scheme =
|
||||||
|
$shared_target=
|
||||||
|
$shared_cflag =
|
||||||
|
$shared_extension =
|
||||||
|
$ranlib =
|
||||||
|
|
||||||
|
*** unixware-7-pentium
|
||||||
|
$cc = cc
|
||||||
|
$cflags = -O -DFILIO_H -Kalloca -Kpentium
|
||||||
|
$unistd =
|
||||||
|
$thread_cflag = -Kthread
|
||||||
|
$lflags = -lsocket -lnsl
|
||||||
|
$bn_ops = BN_LLONG MD2_CHAR RC4_INDEX DES_PTR DES_RISC1 DES_UNROLL
|
||||||
|
$bn_obj =
|
||||||
|
$des_obj =
|
||||||
|
$bf_obj =
|
||||||
|
$md5_obj =
|
||||||
|
$sha1_obj =
|
||||||
|
$cast_obj =
|
||||||
|
$rc4_obj =
|
||||||
|
$rmd160_obj =
|
||||||
|
$rc5_obj =
|
||||||
|
$dso_scheme =
|
||||||
|
$shared_target=
|
||||||
|
$shared_cflag =
|
||||||
|
$shared_extension =
|
||||||
|
$ranlib =
|
||||||
|
|
||||||
|
*** unixware-7-pentium_pro
|
||||||
|
$cc = cc
|
||||||
|
$cflags = -O -DFILIO_H -Kalloca -Kpentium_pro
|
||||||
|
$unistd =
|
||||||
|
$thread_cflag = -Kthread
|
||||||
|
$lflags = -lsocket -lnsl
|
||||||
|
$bn_ops = BN_LLONG MD2_CHAR RC4_INDEX DES_PTR DES_RISC1 DES_UNROLL
|
||||||
$bn_obj =
|
$bn_obj =
|
||||||
$des_obj =
|
$des_obj =
|
||||||
$bf_obj =
|
$bf_obj =
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ RM= rm -f
|
|||||||
|
|
||||||
PEX_LIBS=
|
PEX_LIBS=
|
||||||
EX_LIBS=
|
EX_LIBS=
|
||||||
|
EXE_EXT=
|
||||||
|
|
||||||
CFLAGS= -DMONOLITH $(INCLUDES) $(CFLAG)
|
CFLAGS= -DMONOLITH $(INCLUDES) $(CFLAG)
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ PROGRAM= openssl
|
|||||||
|
|
||||||
SCRIPTS=CA.sh CA.pl der_chop
|
SCRIPTS=CA.sh CA.pl der_chop
|
||||||
|
|
||||||
EXE= $(PROGRAM)
|
EXE= $(PROGRAM)$(EXE_EXT)
|
||||||
|
|
||||||
E_EXE= verify asn1pars req dgst dh dhparam enc passwd gendh errstr \
|
E_EXE= verify asn1pars req dgst dh dhparam enc passwd gendh errstr \
|
||||||
ca crl rsa rsautl dsa dsaparam \
|
ca crl rsa rsautl dsa dsaparam \
|
||||||
@@ -77,7 +78,7 @@ top:
|
|||||||
|
|
||||||
all: exe
|
all: exe
|
||||||
|
|
||||||
exe: $(EXE)
|
exe: $(PROGRAM)
|
||||||
|
|
||||||
req: sreq.o $(A_OBJ) $(DLIBCRYPTO)
|
req: sreq.o $(A_OBJ) $(DLIBCRYPTO)
|
||||||
$(CC) -o req $(CFLAG) sreq.o $(A_OBJ) $(RAND_OBJ) $(PEX_LIBS) $(LIBCRYPTO) $(EX_LIBS)
|
$(CC) -o req $(CFLAG) sreq.o $(A_OBJ) $(RAND_OBJ) $(PEX_LIBS) $(LIBCRYPTO) $(EX_LIBS)
|
||||||
|
|||||||
@@ -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]);
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
#undef PROG
|
#undef PROG
|
||||||
#define PROG dgst_main
|
#define PROG dgst_main
|
||||||
|
|
||||||
void do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, char binout,
|
void do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, int binout,
|
||||||
EVP_PKEY *key, unsigned char *sigin, int siglen);
|
EVP_PKEY *key, unsigned char *sigin, int siglen);
|
||||||
|
|
||||||
int MAIN(int, char **);
|
int MAIN(int, char **);
|
||||||
@@ -95,7 +95,7 @@ int MAIN(int argc, char **argv)
|
|||||||
int debug=0;
|
int debug=0;
|
||||||
const char *outfile = NULL, *keyfile = NULL;
|
const char *outfile = NULL, *keyfile = NULL;
|
||||||
const char *sigfile = NULL, *randfile = NULL;
|
const char *sigfile = NULL, *randfile = NULL;
|
||||||
char out_bin = -1, want_pub = 0, do_verify = 0;
|
int out_bin = -1, want_pub = 0, do_verify = 0;
|
||||||
EVP_PKEY *sigkey = NULL;
|
EVP_PKEY *sigkey = NULL;
|
||||||
unsigned char *sigbuf = NULL;
|
unsigned char *sigbuf = NULL;
|
||||||
int siglen = 0;
|
int siglen = 0;
|
||||||
@@ -365,7 +365,7 @@ end:
|
|||||||
EXIT(err);
|
EXIT(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, char binout,
|
void do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, int binout,
|
||||||
EVP_PKEY *key, unsigned char *sigin, int siglen)
|
EVP_PKEY *key, unsigned char *sigin, int siglen)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
|
|||||||
@@ -542,6 +542,14 @@ bad:
|
|||||||
BIO_printf(bio_err,"invalid hex iv value\n");
|
BIO_printf(bio_err,"invalid hex iv value\n");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
if ((hiv == NULL) && (str == NULL))
|
||||||
|
{
|
||||||
|
/* No IV was explicitly set and no IV was generated
|
||||||
|
* during EVP_BytesToKey. Hence the IV is undefined,
|
||||||
|
* making correct decryption impossible. */
|
||||||
|
BIO_printf(bio_err, "iv undefined\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
if ((hkey != NULL) && !set_hex(hkey,key,24))
|
if ((hkey != NULL) && !set_hex(hkey,key,24))
|
||||||
{
|
{
|
||||||
BIO_printf(bio_err,"invalid hex key value\n");
|
BIO_printf(bio_err,"invalid hex key value\n");
|
||||||
|
|||||||
@@ -1432,9 +1432,11 @@ static int www_body(char *hostname, int s, unsigned char *context)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
/* append if a directory lookup */
|
/* append if a directory lookup */
|
||||||
if (e[-1] == '/')
|
if (e[-1] == '/')
|
||||||
strcat(p,"index.html");
|
strcat(p,"index.html");
|
||||||
|
#endif
|
||||||
|
|
||||||
/* if a directory, do the index thang */
|
/* if a directory, do the index thang */
|
||||||
if (stat(p,&st_buf) < 0)
|
if (stat(p,&st_buf) < 0)
|
||||||
@@ -1446,7 +1448,13 @@ static int www_body(char *hostname, int s, unsigned char *context)
|
|||||||
}
|
}
|
||||||
if (S_ISDIR(st_buf.st_mode))
|
if (S_ISDIR(st_buf.st_mode))
|
||||||
{
|
{
|
||||||
|
#if 0 /* must check buffer size */
|
||||||
strcat(p,"/index.html");
|
strcat(p,"/index.html");
|
||||||
|
#else
|
||||||
|
BIO_puts(io,text);
|
||||||
|
BIO_printf(io,"'%s' is a directory\r\n",p);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((file=BIO_new_file(p,"r")) == NULL)
|
if ((file=BIO_new_file(p,"r")) == NULL)
|
||||||
|
|||||||
@@ -299,6 +299,7 @@ int MAIN(int argc, char **argv)
|
|||||||
BIO_printf (bio_err, "-CApath dir trusted certificates directory\n");
|
BIO_printf (bio_err, "-CApath dir trusted certificates directory\n");
|
||||||
BIO_printf (bio_err, "-CAfile file trusted certificates file\n");
|
BIO_printf (bio_err, "-CAfile file trusted certificates file\n");
|
||||||
BIO_printf (bio_err, "-engine e use engine e, possibly a hardware device.\n");
|
BIO_printf (bio_err, "-engine e use engine e, possibly a hardware device.\n");
|
||||||
|
BIO_printf (bio_err, "-passin arg input file pass phrase source\n");
|
||||||
BIO_printf(bio_err, "-rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
|
BIO_printf(bio_err, "-rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
|
||||||
BIO_printf(bio_err, " load the file (or the files in the directory) into\n");
|
BIO_printf(bio_err, " load the file (or the files in the directory) into\n");
|
||||||
BIO_printf(bio_err, " the random number generator\n");
|
BIO_printf(bio_err, " the random number generator\n");
|
||||||
|
|||||||
@@ -83,12 +83,12 @@
|
|||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/engine.h>
|
#include <openssl/engine.h>
|
||||||
|
|
||||||
#if defined(__FreeBSD__)
|
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
# define USE_TOD
|
# define USE_TOD
|
||||||
#elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
|
#elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
|
||||||
# define TIMES
|
# define TIMES
|
||||||
#endif
|
#endif
|
||||||
#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE)
|
#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE) && !defined(__NetBSD__)
|
||||||
# define TIMEB
|
# define TIMEB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -349,6 +349,8 @@ int X509_NAME_print(BIO *bp, X509_NAME *name, int obase)
|
|||||||
ll=80-2-obase;
|
ll=80-2-obase;
|
||||||
|
|
||||||
s=X509_NAME_oneline(name,buf,256);
|
s=X509_NAME_oneline(name,buf,256);
|
||||||
|
if (!*s)
|
||||||
|
return 1;
|
||||||
s++; /* skip the first slash */
|
s++; /* skip the first slash */
|
||||||
|
|
||||||
l=ll;
|
l=ll;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -109,7 +109,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_LONG_LONG
|
#if HAVE_LONG_LONG
|
||||||
|
# if defined(WIN32) && !defined(__GNUC__)
|
||||||
|
# define LLONG _int64
|
||||||
|
# else
|
||||||
# define LLONG long long
|
# define LLONG long long
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
#define LLONG long
|
#define LLONG long
|
||||||
#endif
|
#endif
|
||||||
@@ -152,7 +156,7 @@ static void _dopr(char **sbuffer, char **buffer,
|
|||||||
|
|
||||||
/* some handy macros */
|
/* some handy macros */
|
||||||
#define char_to_int(p) (p - '0')
|
#define char_to_int(p) (p - '0')
|
||||||
#define MAX(p,q) ((p >= q) ? p : q)
|
#define OSSL_MAX(p,q) ((p >= q) ? p : q)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_dopr(
|
_dopr(
|
||||||
@@ -503,13 +507,13 @@ fmtint(
|
|||||||
convert[place] = 0;
|
convert[place] = 0;
|
||||||
|
|
||||||
zpadlen = max - place;
|
zpadlen = max - place;
|
||||||
spadlen = min - MAX(max, place) - (signvalue ? 1 : 0);
|
spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0);
|
||||||
if (zpadlen < 0)
|
if (zpadlen < 0)
|
||||||
zpadlen = 0;
|
zpadlen = 0;
|
||||||
if (spadlen < 0)
|
if (spadlen < 0)
|
||||||
spadlen = 0;
|
spadlen = 0;
|
||||||
if (flags & DP_F_ZERO) {
|
if (flags & DP_F_ZERO) {
|
||||||
zpadlen = MAX(zpadlen, spadlen);
|
zpadlen = OSSL_MAX(zpadlen, spadlen);
|
||||||
spadlen = 0;
|
spadlen = 0;
|
||||||
}
|
}
|
||||||
if (flags & DP_F_MINUS)
|
if (flags & DP_F_MINUS)
|
||||||
@@ -641,7 +645,7 @@ fmtfp(
|
|||||||
(caps ? "0123456789ABCDEF"
|
(caps ? "0123456789ABCDEF"
|
||||||
: "0123456789abcdef")[fracpart % 10];
|
: "0123456789abcdef")[fracpart % 10];
|
||||||
fracpart = (fracpart / 10);
|
fracpart = (fracpart / 10);
|
||||||
} while (fracpart && (fplace < 20));
|
} while (fplace < max);
|
||||||
if (fplace == 20)
|
if (fplace == 20)
|
||||||
fplace--;
|
fplace--;
|
||||||
fconvert[fplace] = 0;
|
fconvert[fplace] = 0;
|
||||||
|
|||||||
@@ -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=
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
.rdata
|
.rdata
|
||||||
.asciiz "mips3.s, Version 1.0"
|
.asciiz "mips3.s, Version 1.1"
|
||||||
.asciiz "MIPS III/IV ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
|
.asciiz "MIPS III/IV ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -849,6 +849,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
|
sltu c_3,c_2,t_2
|
||||||
dmultu a_1,b_2 /* mul_add_c(a[1],b[2],c1,c2,c3); */
|
dmultu a_1,b_2 /* mul_add_c(a[1],b[2],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -856,7 +857,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
sltu c_3,c_2,t_2
|
sltu AT,c_2,t_2
|
||||||
|
daddu c_3,AT
|
||||||
dmultu a_2,b_1 /* mul_add_c(a[2],b[1],c1,c2,c3); */
|
dmultu a_2,b_1 /* mul_add_c(a[2],b[1],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -884,6 +886,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
|
sltu c_1,c_3,t_2
|
||||||
dmultu a_3,b_1 /* mul_add_c(a[3],b[1],c2,c3,c1); */
|
dmultu a_3,b_1 /* mul_add_c(a[3],b[1],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -891,7 +894,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
sltu c_1,c_3,t_2
|
sltu AT,c_3,t_2
|
||||||
|
daddu c_1,AT
|
||||||
dmultu a_2,b_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
|
dmultu a_2,b_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -928,6 +932,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
|
sltu c_2,c_1,t_2
|
||||||
dmultu a_1,b_4 /* mul_add_c(a[1],b[4],c3,c1,c2); */
|
dmultu a_1,b_4 /* mul_add_c(a[1],b[4],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -935,7 +940,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
sltu c_2,c_1,t_2
|
sltu AT,c_1,t_2
|
||||||
|
daddu c_2,AT
|
||||||
dmultu a_2,b_3 /* mul_add_c(a[2],b[3],c3,c1,c2); */
|
dmultu a_2,b_3 /* mul_add_c(a[2],b[3],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -981,6 +987,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
|
sltu c_3,c_2,t_2
|
||||||
dmultu a_5,b_1 /* mul_add_c(a[5],b[1],c1,c2,c3); */
|
dmultu a_5,b_1 /* mul_add_c(a[5],b[1],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -988,7 +995,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
sltu c_3,c_2,t_2
|
sltu AT,c_2,t_2
|
||||||
|
daddu c_3,AT
|
||||||
dmultu a_4,b_2 /* mul_add_c(a[4],b[2],c1,c2,c3); */
|
dmultu a_4,b_2 /* mul_add_c(a[4],b[2],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1043,6 +1051,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
|
sltu c_1,c_3,t_2
|
||||||
dmultu a_1,b_6 /* mul_add_c(a[1],b[6],c2,c3,c1); */
|
dmultu a_1,b_6 /* mul_add_c(a[1],b[6],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1050,7 +1059,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
sltu c_1,c_3,t_2
|
sltu AT,c_3,t_2
|
||||||
|
daddu c_1,AT
|
||||||
dmultu a_2,b_5 /* mul_add_c(a[2],b[5],c2,c3,c1); */
|
dmultu a_2,b_5 /* mul_add_c(a[2],b[5],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1114,6 +1124,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
|
sltu c_2,c_1,t_2
|
||||||
dmultu a_6,b_2 /* mul_add_c(a[6],b[2],c3,c1,c2); */
|
dmultu a_6,b_2 /* mul_add_c(a[6],b[2],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1121,7 +1132,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
sltu c_2,c_1,t_2
|
sltu AT,c_1,t_2
|
||||||
|
daddu c_2,AT
|
||||||
dmultu a_5,b_3 /* mul_add_c(a[5],b[3],c3,c1,c2); */
|
dmultu a_5,b_3 /* mul_add_c(a[5],b[3],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1176,6 +1188,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
|
sltu c_3,c_2,t_2
|
||||||
dmultu a_3,b_6 /* mul_add_c(a[3],b[6],c1,c2,c3); */
|
dmultu a_3,b_6 /* mul_add_c(a[3],b[6],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1183,7 +1196,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
sltu c_3,c_2,t_2
|
sltu AT,c_2,t_2
|
||||||
|
daddu c_3,AT
|
||||||
dmultu a_4,b_5 /* mul_add_c(a[4],b[5],c1,c2,c3); */
|
dmultu a_4,b_5 /* mul_add_c(a[4],b[5],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1229,6 +1243,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
|
sltu c_1,c_3,t_2
|
||||||
dmultu a_6,b_4 /* mul_add_c(a[6],b[4],c2,c3,c1); */
|
dmultu a_6,b_4 /* mul_add_c(a[6],b[4],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1236,7 +1251,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
sltu c_1,c_3,t_2
|
sltu AT,c_3,t_2
|
||||||
|
daddu c_1,AT
|
||||||
dmultu a_5,b_5 /* mul_add_c(a[5],b[5],c2,c3,c1); */
|
dmultu a_5,b_5 /* mul_add_c(a[5],b[5],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1273,6 +1289,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
|
sltu c_2,c_1,t_2
|
||||||
dmultu a_5,b_6 /* mul_add_c(a[5],b[6],c3,c1,c2); */
|
dmultu a_5,b_6 /* mul_add_c(a[5],b[6],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1280,7 +1297,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
sltu c_2,c_1,t_2
|
sltu AT,c_1,t_2
|
||||||
|
daddu c_2,AT
|
||||||
dmultu a_6,b_5 /* mul_add_c(a[6],b[5],c3,c1,c2); */
|
dmultu a_6,b_5 /* mul_add_c(a[6],b[5],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1308,6 +1326,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
|
sltu c_3,c_2,t_2
|
||||||
dmultu a_6,b_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */
|
dmultu a_6,b_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1315,7 +1334,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
sltu c_3,c_2,t_2
|
sltu AT,c_2,t_2
|
||||||
|
daddu c_3,AT
|
||||||
dmultu a_5,b_7 /* mul_add_c(a[5],b[7],c1,c2,c3); */
|
dmultu a_5,b_7 /* mul_add_c(a[5],b[7],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1334,6 +1354,7 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
|
sltu c_1,c_3,t_2
|
||||||
dmultu a_7,b_6 /* mul_add_c(a[7],b[6],c2,c3,c1); */
|
dmultu a_7,b_6 /* mul_add_c(a[7],b[6],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1341,7 +1362,8 @@ LEAF(bn_mul_comba8)
|
|||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
sltu c_1,c_3,t_2
|
sltu AT,c_3,t_2
|
||||||
|
daddu c_1,AT
|
||||||
sd c_2,104(a0) /* r[13]=c2; */
|
sd c_2,104(a0) /* r[13]=c2; */
|
||||||
|
|
||||||
dmultu a_7,b_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */
|
dmultu a_7,b_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */
|
||||||
@@ -1430,6 +1452,7 @@ LEAF(bn_mul_comba4)
|
|||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
|
sltu c_3,c_2,t_2
|
||||||
dmultu a_1,b_2 /* mul_add_c(a[1],b[2],c1,c2,c3); */
|
dmultu a_1,b_2 /* mul_add_c(a[1],b[2],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1437,7 +1460,8 @@ LEAF(bn_mul_comba4)
|
|||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
sltu c_3,c_2,t_2
|
sltu AT,c_2,t_2
|
||||||
|
daddu c_3,AT
|
||||||
dmultu a_2,b_1 /* mul_add_c(a[2],b[1],c1,c2,c3); */
|
dmultu a_2,b_1 /* mul_add_c(a[2],b[1],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1465,6 +1489,7 @@ LEAF(bn_mul_comba4)
|
|||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
|
sltu c_1,c_3,t_2
|
||||||
dmultu a_2,b_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
|
dmultu a_2,b_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1472,7 +1497,8 @@ LEAF(bn_mul_comba4)
|
|||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
sltu c_1,c_3,t_2
|
sltu AT,c_3,t_2
|
||||||
|
daddu c_1,AT
|
||||||
dmultu a_1,b_3 /* mul_add_c(a[1],b[3],c2,c3,c1); */
|
dmultu a_1,b_3 /* mul_add_c(a[1],b[3],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1491,6 +1517,7 @@ LEAF(bn_mul_comba4)
|
|||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
|
sltu c_2,c_1,t_2
|
||||||
dmultu a_3,b_2 /* mul_add_c(a[3],b[2],c3,c1,c2); */
|
dmultu a_3,b_2 /* mul_add_c(a[3],b[2],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1498,7 +1525,8 @@ LEAF(bn_mul_comba4)
|
|||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
sltu c_2,c_1,t_2
|
sltu AT,c_1,t_2
|
||||||
|
daddu c_2,AT
|
||||||
sd c_3,40(a0)
|
sd c_3,40(a0)
|
||||||
|
|
||||||
dmultu a_3,b_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */
|
dmultu a_3,b_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */
|
||||||
@@ -1543,28 +1571,30 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_0,a_1 /* mul_add_c2(a[0],b[1],c2,c3,c1); */
|
dmultu a_0,a_1 /* mul_add_c2(a[0],b[1],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
|
slt c_1,t_2,zero
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu c_3,t_2,AT
|
daddu c_3,t_2,AT
|
||||||
daddu c_2,t_1
|
|
||||||
sltu AT,c_2,t_1
|
|
||||||
daddu t_2,AT
|
|
||||||
daddu c_3,t_2
|
|
||||||
sltu c_1,c_3,t_2
|
|
||||||
sd c_2,8(a0)
|
sd c_2,8(a0)
|
||||||
|
|
||||||
dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */
|
dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt c_2,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_1,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
sltu c_2,c_1,t_2
|
sltu AT,c_1,t_2
|
||||||
|
daddu c_2,AT
|
||||||
dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */
|
dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1579,24 +1609,26 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */
|
dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt c_3,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_2,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
sltu c_3,c_2,t_2
|
sltu AT,c_2,t_2
|
||||||
|
daddu c_3,AT
|
||||||
dmultu a_1,a_2 /* mul_add_c2(a[1],b[2],c1,c2,c3); */
|
dmultu a_1,a_2 /* mul_add_c2(a[1],b[2],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_2,a2
|
|
||||||
sltu AT,c_2,a2
|
|
||||||
daddu c_3,AT
|
daddu c_3,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1608,24 +1640,26 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_4,a_0 /* mul_add_c2(a[4],b[0],c2,c3,c1); */
|
dmultu a_4,a_0 /* mul_add_c2(a[4],b[0],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_2,t_1
|
slt c_1,t_2,zero
|
||||||
sltu AT,c_2,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_3,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
sltu c_1,c_3,t_2
|
sltu AT,c_3,t_2
|
||||||
|
daddu c_1,AT
|
||||||
dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */
|
dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_2,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_2,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_3,a2
|
|
||||||
sltu AT,c_3,a2
|
|
||||||
daddu c_1,AT
|
daddu c_1,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1646,24 +1680,26 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_0,a_5 /* mul_add_c2(a[0],b[5],c3,c1,c2); */
|
dmultu a_0,a_5 /* mul_add_c2(a[0],b[5],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt c_2,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_1,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
sltu c_2,c_1,t_2
|
sltu AT,c_1,t_2
|
||||||
|
daddu c_2,AT
|
||||||
dmultu a_1,a_4 /* mul_add_c2(a[1],b[4],c3,c1,c2); */
|
dmultu a_1,a_4 /* mul_add_c2(a[1],b[4],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_1,a2
|
|
||||||
sltu AT,c_1,a2
|
|
||||||
daddu c_2,AT
|
daddu c_2,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1673,12 +1709,12 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */
|
dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_1,a2
|
|
||||||
sltu AT,c_1,a2
|
|
||||||
daddu c_2,AT
|
daddu c_2,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1690,24 +1726,26 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_6,a_0 /* mul_add_c2(a[6],b[0],c1,c2,c3); */
|
dmultu a_6,a_0 /* mul_add_c2(a[6],b[0],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt c_3,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_2,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
sltu c_3,c_2,t_2
|
sltu AT,c_2,t_2
|
||||||
|
daddu c_3,AT
|
||||||
dmultu a_5,a_1 /* mul_add_c2(a[5],b[1],c1,c2,c3); */
|
dmultu a_5,a_1 /* mul_add_c2(a[5],b[1],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_2,a2
|
|
||||||
sltu AT,c_2,a2
|
|
||||||
daddu c_3,AT
|
daddu c_3,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1717,12 +1755,12 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_4,a_2 /* mul_add_c2(a[4],b[2],c1,c2,c3); */
|
dmultu a_4,a_2 /* mul_add_c2(a[4],b[2],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_2,a2
|
|
||||||
sltu AT,c_2,a2
|
|
||||||
daddu c_3,AT
|
daddu c_3,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1743,24 +1781,26 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_0,a_7 /* mul_add_c2(a[0],b[7],c2,c3,c1); */
|
dmultu a_0,a_7 /* mul_add_c2(a[0],b[7],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_2,t_1
|
slt c_1,t_2,zero
|
||||||
sltu AT,c_2,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_3,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
sltu c_1,c_3,t_2
|
sltu AT,c_3,t_2
|
||||||
|
daddu c_1,AT
|
||||||
dmultu a_1,a_6 /* mul_add_c2(a[1],b[6],c2,c3,c1); */
|
dmultu a_1,a_6 /* mul_add_c2(a[1],b[6],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_2,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_2,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_3,a2
|
|
||||||
sltu AT,c_3,a2
|
|
||||||
daddu c_1,AT
|
daddu c_1,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1770,12 +1810,12 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_2,a_5 /* mul_add_c2(a[2],b[5],c2,c3,c1); */
|
dmultu a_2,a_5 /* mul_add_c2(a[2],b[5],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_2,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_2,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_3,a2
|
|
||||||
sltu AT,c_3,a2
|
|
||||||
daddu c_1,AT
|
daddu c_1,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1785,12 +1825,12 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_3,a_4 /* mul_add_c2(a[3],b[4],c2,c3,c1); */
|
dmultu a_3,a_4 /* mul_add_c2(a[3],b[4],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_2,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_2,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_3,a2
|
|
||||||
sltu AT,c_3,a2
|
|
||||||
daddu c_1,AT
|
daddu c_1,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1802,24 +1842,26 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_7,a_1 /* mul_add_c2(a[7],b[1],c3,c1,c2); */
|
dmultu a_7,a_1 /* mul_add_c2(a[7],b[1],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt c_2,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_1,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
sltu c_2,c_1,t_2
|
sltu AT,c_1,t_2
|
||||||
|
daddu c_2,AT
|
||||||
dmultu a_6,a_2 /* mul_add_c2(a[6],b[2],c3,c1,c2); */
|
dmultu a_6,a_2 /* mul_add_c2(a[6],b[2],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_1,a2
|
|
||||||
sltu AT,c_1,a2
|
|
||||||
daddu c_2,AT
|
daddu c_2,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1829,12 +1871,12 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_5,a_3 /* mul_add_c2(a[5],b[3],c3,c1,c2); */
|
dmultu a_5,a_3 /* mul_add_c2(a[5],b[3],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_1,a2
|
|
||||||
sltu AT,c_1,a2
|
|
||||||
daddu c_2,AT
|
daddu c_2,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1855,24 +1897,26 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_2,a_7 /* mul_add_c2(a[2],b[7],c1,c2,c3); */
|
dmultu a_2,a_7 /* mul_add_c2(a[2],b[7],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt c_3,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_2,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
sltu c_3,c_2,t_2
|
sltu AT,c_2,t_2
|
||||||
|
daddu c_3,AT
|
||||||
dmultu a_3,a_6 /* mul_add_c2(a[3],b[6],c1,c2,c3); */
|
dmultu a_3,a_6 /* mul_add_c2(a[3],b[6],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_2,a2
|
|
||||||
sltu AT,c_2,a2
|
|
||||||
daddu c_3,AT
|
daddu c_3,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1882,12 +1926,12 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_4,a_5 /* mul_add_c2(a[4],b[5],c1,c2,c3); */
|
dmultu a_4,a_5 /* mul_add_c2(a[4],b[5],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_2,a2
|
|
||||||
sltu AT,c_2,a2
|
|
||||||
daddu c_3,AT
|
daddu c_3,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1899,24 +1943,26 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_7,a_3 /* mul_add_c2(a[7],b[3],c2,c3,c1); */
|
dmultu a_7,a_3 /* mul_add_c2(a[7],b[3],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_2,t_1
|
slt c_1,t_2,zero
|
||||||
sltu AT,c_2,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_3,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
sltu c_1,c_3,t_2
|
sltu AT,c_3,t_2
|
||||||
|
daddu c_1,AT
|
||||||
dmultu a_6,a_4 /* mul_add_c2(a[6],b[4],c2,c3,c1); */
|
dmultu a_6,a_4 /* mul_add_c2(a[6],b[4],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_2,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_2,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_3,a2
|
|
||||||
sltu AT,c_3,a2
|
|
||||||
daddu c_1,AT
|
daddu c_1,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1937,24 +1983,26 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_4,a_7 /* mul_add_c2(a[4],b[7],c3,c1,c2); */
|
dmultu a_4,a_7 /* mul_add_c2(a[4],b[7],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt c_2,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_1,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
sltu c_2,c_1,t_2
|
sltu AT,c_1,t_2
|
||||||
|
daddu c_2,AT
|
||||||
dmultu a_5,a_6 /* mul_add_c2(a[5],b[6],c3,c1,c2); */
|
dmultu a_5,a_6 /* mul_add_c2(a[5],b[6],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_1,a2
|
|
||||||
sltu AT,c_1,a2
|
|
||||||
daddu c_2,AT
|
daddu c_2,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -1966,15 +2014,17 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_7,a_5 /* mul_add_c2(a[7],b[5],c1,c2,c3); */
|
dmultu a_7,a_5 /* mul_add_c2(a[7],b[5],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt c_3,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_2,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
sltu c_3,c_2,t_2
|
sltu AT,c_2,t_2
|
||||||
|
daddu c_3,AT
|
||||||
dmultu a_6,a_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */
|
dmultu a_6,a_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -1989,15 +2039,17 @@ LEAF(bn_sqr_comba8)
|
|||||||
dmultu a_6,a_7 /* mul_add_c2(a[6],b[7],c2,c3,c1); */
|
dmultu a_6,a_7 /* mul_add_c2(a[6],b[7],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_2,t_1
|
slt c_1,t_2,zero
|
||||||
sltu AT,c_2,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_3,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
sltu c_1,c_3,t_2
|
sltu AT,c_3,t_2
|
||||||
|
daddu c_1,AT
|
||||||
sd c_2,104(a0)
|
sd c_2,104(a0)
|
||||||
|
|
||||||
dmultu a_7,a_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */
|
dmultu a_7,a_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */
|
||||||
@@ -2028,28 +2080,30 @@ LEAF(bn_sqr_comba4)
|
|||||||
dmultu a_0,a_1 /* mul_add_c2(a[0],b[1],c2,c3,c1); */
|
dmultu a_0,a_1 /* mul_add_c2(a[0],b[1],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
|
slt c_1,t_2,zero
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu c_3,t_2,AT
|
daddu c_3,t_2,AT
|
||||||
daddu c_2,t_1
|
|
||||||
sltu AT,c_2,t_1
|
|
||||||
daddu t_2,AT
|
|
||||||
daddu c_3,t_2
|
|
||||||
sltu c_1,c_3,t_2
|
|
||||||
sd c_2,8(a0)
|
sd c_2,8(a0)
|
||||||
|
|
||||||
dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */
|
dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt c_2,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_1,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
sltu c_2,c_1,t_2
|
sltu AT,c_1,t_2
|
||||||
|
daddu c_2,AT
|
||||||
dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */
|
dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -2064,24 +2118,26 @@ LEAF(bn_sqr_comba4)
|
|||||||
dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */
|
dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt c_3,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_2,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_2,t_2
|
daddu c_2,t_2
|
||||||
sltu c_3,c_2,t_2
|
sltu AT,c_2,t_2
|
||||||
|
daddu c_3,AT
|
||||||
dmultu a_1,a_2 /* mul_add_c(a2[1],b[2],c1,c2,c3); */
|
dmultu a_1,a_2 /* mul_add_c(a2[1],b[2],c1,c2,c3); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_1,t_1
|
slt AT,t_2,zero
|
||||||
sltu AT,c_1,t_1
|
|
||||||
daddu a2,t_2,AT
|
|
||||||
daddu c_2,a2
|
|
||||||
sltu AT,c_2,a2
|
|
||||||
daddu c_3,AT
|
daddu c_3,AT
|
||||||
|
dsll t_2,1
|
||||||
|
slt a2,t_1,zero
|
||||||
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_1,t_1
|
daddu c_1,t_1
|
||||||
sltu AT,c_1,t_1
|
sltu AT,c_1,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
@@ -2093,15 +2149,17 @@ LEAF(bn_sqr_comba4)
|
|||||||
dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */
|
dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_2,t_1
|
slt c_1,t_2,zero
|
||||||
sltu AT,c_2,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_3,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_2,t_1
|
daddu c_2,t_1
|
||||||
sltu AT,c_2,t_1
|
sltu AT,c_2,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_3,t_2
|
daddu c_3,t_2
|
||||||
sltu c_1,c_3,t_2
|
sltu AT,c_3,t_2
|
||||||
|
daddu c_1,AT
|
||||||
dmultu a_2,a_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
|
dmultu a_2,a_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
@@ -2116,15 +2174,17 @@ LEAF(bn_sqr_comba4)
|
|||||||
dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */
|
dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */
|
||||||
mflo t_1
|
mflo t_1
|
||||||
mfhi t_2
|
mfhi t_2
|
||||||
daddu c_3,t_1
|
slt c_2,t_2,zero
|
||||||
sltu AT,c_3,t_1
|
dsll t_2,1
|
||||||
daddu a2,t_2,AT
|
slt a2,t_1,zero
|
||||||
daddu c_1,a2
|
daddu t_2,a2
|
||||||
|
dsll t_1,1
|
||||||
daddu c_3,t_1
|
daddu c_3,t_1
|
||||||
sltu AT,c_3,t_1
|
sltu AT,c_3,t_1
|
||||||
daddu t_2,AT
|
daddu t_2,AT
|
||||||
daddu c_1,t_2
|
daddu c_1,t_2
|
||||||
sltu c_2,c_1,t_2
|
sltu AT,c_1,t_2
|
||||||
|
daddu c_2,AT
|
||||||
sd c_3,40(a0)
|
sd c_3,40(a0)
|
||||||
|
|
||||||
dmultu a_3,a_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */
|
dmultu a_3,a_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ void CRYPTO_destroy_dynlockid(int i)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if (--(pointer->references) <= 0)
|
if (pointer->references <= 0)
|
||||||
{
|
{
|
||||||
sk_CRYPTO_dynlock_set(dyn_locks, i, NULL);
|
sk_CRYPTO_dynlock_set(dyn_locks, i, NULL);
|
||||||
}
|
}
|
||||||
@@ -396,16 +396,15 @@ void CRYPTO_lock(int mode, int type, const char *file, int line)
|
|||||||
#endif
|
#endif
|
||||||
if (type < 0)
|
if (type < 0)
|
||||||
{
|
{
|
||||||
int i = -type - 1;
|
|
||||||
struct CRYPTO_dynlock_value *pointer
|
struct CRYPTO_dynlock_value *pointer
|
||||||
= CRYPTO_get_dynlock_value(i);
|
= CRYPTO_get_dynlock_value(type);
|
||||||
|
|
||||||
if (pointer)
|
if (pointer && dynlock_lock_callback)
|
||||||
{
|
{
|
||||||
dynlock_lock_callback(mode, pointer, file, line);
|
dynlock_lock_callback(mode, pointer, file, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
CRYPTO_destroy_dynlockid(i);
|
CRYPTO_destroy_dynlockid(type);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (locking_callback != NULL)
|
if (locking_callback != NULL)
|
||||||
@@ -431,7 +430,6 @@ int CRYPTO_add_lock(int *pointer, int amount, int type, const char *file,
|
|||||||
CRYPTO_get_lock_name(type),
|
CRYPTO_get_lock_name(type),
|
||||||
file,line);
|
file,line);
|
||||||
#endif
|
#endif
|
||||||
*pointer=ret;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -231,6 +241,17 @@ static int dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig,
|
|||||||
BN_init(&u2);
|
BN_init(&u2);
|
||||||
BN_init(&t1);
|
BN_init(&t1);
|
||||||
|
|
||||||
|
if (BN_is_zero(sig->r) || sig->r->neg || BN_ucmp(sig->r, dsa->q) >= 0)
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
if (BN_is_zero(sig->s) || sig->s->neg || BN_ucmp(sig->s, dsa->q) >= 0)
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
/* Calculate W = inv(S) mod Q
|
/* Calculate W = inv(S) mod Q
|
||||||
* save W in u2 */
|
* save W in u2 */
|
||||||
if ((BN_mod_inverse(&u2,sig->s,dsa->q,ctx)) == NULL) goto err;
|
if ((BN_mod_inverse(&u2,sig->s,dsa->q,ctx)) == NULL) goto err;
|
||||||
|
|||||||
@@ -62,7 +62,6 @@
|
|||||||
#ifdef VMS
|
#ifdef VMS
|
||||||
#pragma message disable DOLLARID
|
#pragma message disable DOLLARID
|
||||||
#include <lib$routines.h>
|
#include <lib$routines.h>
|
||||||
#include <libfisdef.h>
|
|
||||||
#include <stsdef.h>
|
#include <stsdef.h>
|
||||||
#include <descrip.h>
|
#include <descrip.h>
|
||||||
#include <starlet.h>
|
#include <starlet.h>
|
||||||
@@ -260,7 +259,8 @@ void vms_bind_sym(DSO *dso, const char *symname, void **sym)
|
|||||||
{
|
{
|
||||||
DSO_VMS_INTERNAL *ptr;
|
DSO_VMS_INTERNAL *ptr;
|
||||||
int status;
|
int status;
|
||||||
int flags = LIB$M_FIS_MIXEDCASE;
|
int flags = (1<<4); /* LIB$M_FIS_MIXEDCASE, but this symbol isn't
|
||||||
|
defined in VMS older than 7.0 or so */
|
||||||
struct dsc$descriptor_s symname_dsc;
|
struct dsc$descriptor_s symname_dsc;
|
||||||
*sym = NULL;
|
*sym = NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ ascii2ebcdic(void *dest, const void *srce, size_t count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else /*CHARSET_EBCDIC*/
|
#else /*CHARSET_EBCDIC*/
|
||||||
#ifdef PEDANTIC
|
#if defined(PEDANTIC) || defined(VMS) || defined(__VMS)
|
||||||
static void *dummy=&dummy;
|
static void *dummy=&dummy;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -230,17 +230,18 @@ EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id,
|
|||||||
CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
|
CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
|
||||||
if(e->funct_ref == 0)
|
if(e->funct_ref == 0)
|
||||||
{
|
{
|
||||||
|
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
|
||||||
ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY,
|
ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY,
|
||||||
ENGINE_R_NOT_INITIALISED);
|
ENGINE_R_NOT_INITIALISED);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
|
||||||
if (!e->load_privkey)
|
if (!e->load_privkey)
|
||||||
{
|
{
|
||||||
ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY,
|
ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY,
|
||||||
ENGINE_R_NO_LOAD_FUNCTION);
|
ENGINE_R_NO_LOAD_FUNCTION);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
|
|
||||||
pkey = e->load_privkey(key_id, passphrase);
|
pkey = e->load_privkey(key_id, passphrase);
|
||||||
if (!pkey)
|
if (!pkey)
|
||||||
{
|
{
|
||||||
@@ -265,17 +266,18 @@ EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id,
|
|||||||
CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
|
CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
|
||||||
if(e->funct_ref == 0)
|
if(e->funct_ref == 0)
|
||||||
{
|
{
|
||||||
|
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
|
||||||
ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY,
|
ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY,
|
||||||
ENGINE_R_NOT_INITIALISED);
|
ENGINE_R_NOT_INITIALISED);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
|
||||||
if (!e->load_pubkey)
|
if (!e->load_pubkey)
|
||||||
{
|
{
|
||||||
ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY,
|
ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY,
|
||||||
ENGINE_R_NO_LOAD_FUNCTION);
|
ENGINE_R_NO_LOAD_FUNCTION);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
|
|
||||||
pkey = e->load_pubkey(key_id, passphrase);
|
pkey = e->load_pubkey(key_id, passphrase);
|
||||||
if (!pkey)
|
if (!pkey)
|
||||||
{
|
{
|
||||||
@@ -286,8 +288,6 @@ EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id,
|
|||||||
return pkey;
|
return pkey;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialise a engine type for use (or up its functional reference count
|
|
||||||
* if it's already in use). */
|
|
||||||
int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)())
|
int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)())
|
||||||
{
|
{
|
||||||
if(e == NULL)
|
if(e == NULL)
|
||||||
@@ -298,15 +298,16 @@ int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)())
|
|||||||
CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
|
CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
|
||||||
if(e->struct_ref == 0)
|
if(e->struct_ref == 0)
|
||||||
{
|
{
|
||||||
|
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
|
||||||
ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_REFERENCE);
|
ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_REFERENCE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
|
||||||
if (!e->ctrl)
|
if (!e->ctrl)
|
||||||
{
|
{
|
||||||
ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_CONTROL_FUNCTION);
|
ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_CONTROL_FUNCTION);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
|
|
||||||
return e->ctrl(cmd, i, p, f);
|
return e->ctrl(cmd, i, p, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -554,9 +554,9 @@ int EVP_read_pw_string(char *buf,int length,const char *prompt,int verify);
|
|||||||
void EVP_set_pw_prompt(char *prompt);
|
void EVP_set_pw_prompt(char *prompt);
|
||||||
char * EVP_get_pw_prompt(void);
|
char * EVP_get_pw_prompt(void);
|
||||||
|
|
||||||
int EVP_BytesToKey(const EVP_CIPHER *type,EVP_MD *md,unsigned char *salt,
|
int EVP_BytesToKey(const EVP_CIPHER *type, EVP_MD *md,
|
||||||
unsigned char *data, int datal, int count,
|
const unsigned char *salt, const unsigned char *data, int datal,
|
||||||
unsigned char *key,unsigned char *iv);
|
int count, unsigned char *key, unsigned char *iv);
|
||||||
|
|
||||||
int EVP_EncryptInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *type,
|
int EVP_EncryptInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *type,
|
||||||
unsigned char *key, unsigned char *iv);
|
unsigned char *key, unsigned char *iv);
|
||||||
|
|||||||
@@ -95,9 +95,9 @@ int EVP_read_pw_string(char *buf, int len, const char *prompt, int verify)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int EVP_BytesToKey(const EVP_CIPHER *type, EVP_MD *md, unsigned char *salt,
|
int EVP_BytesToKey(const EVP_CIPHER *type, EVP_MD *md,
|
||||||
unsigned char *data, int datal, int count, unsigned char *key,
|
const unsigned char *salt, const unsigned char *data, int datal,
|
||||||
unsigned char *iv)
|
int count, unsigned char *key, unsigned char *iv)
|
||||||
{
|
{
|
||||||
EVP_MD_CTX c;
|
EVP_MD_CTX c;
|
||||||
unsigned char md_buf[EVP_MAX_MD_SIZE];
|
unsigned char md_buf[EVP_MAX_MD_SIZE];
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#define HEADER_OPENSSLV_H
|
#define HEADER_OPENSSLV_H
|
||||||
|
|
||||||
/* Numeric release version identifier:
|
/* Numeric release version identifier:
|
||||||
* MMNNFFPPS: major minor fix patch status
|
* MNNFFPPS: major minor fix patch status
|
||||||
* The status nibble has one of the values 0 for development, 1 to e for betas
|
* The status nibble has one of the values 0 for development, 1 to e for betas
|
||||||
* 1 to 14, and f for release. The patch level is exactly that.
|
* 1 to 14, and f for release. The patch level is exactly that.
|
||||||
* For example:
|
* For example:
|
||||||
@@ -25,8 +25,8 @@
|
|||||||
* (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
|
* (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
|
||||||
* major minor fix final patch/beta)
|
* major minor fix final patch/beta)
|
||||||
*/
|
*/
|
||||||
#define OPENSSL_VERSION_NUMBER 0x00906013L
|
#define OPENSSL_VERSION_NUMBER 0x0090602fL
|
||||||
#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.6a-beta3 [engine] 30 Mar 2001"
|
#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.6b [engine] 9 Jul 2001"
|
||||||
#define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT
|
#define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -264,6 +264,7 @@ static int parse_bag(PKCS12_SAFEBAG *bag, const char *pass, int passlen,
|
|||||||
if (lkey) {
|
if (lkey) {
|
||||||
*keymatch |= MATCH_CERT;
|
*keymatch |= MATCH_CERT;
|
||||||
if (cert) *cert = x509;
|
if (cert) *cert = x509;
|
||||||
|
else X509_free(x509);
|
||||||
} else {
|
} else {
|
||||||
if(ca) sk_X509_push (*ca, x509);
|
if(ca) sk_X509_push (*ca, x509);
|
||||||
else X509_free(x509);
|
else X509_free(x509);
|
||||||
|
|||||||
@@ -370,7 +370,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
|
|||||||
if (ri == NULL) {
|
if (ri == NULL) {
|
||||||
PKCS7err(PKCS7_F_PKCS7_DATADECODE,
|
PKCS7err(PKCS7_F_PKCS7_DATADECODE,
|
||||||
PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE);
|
PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE);
|
||||||
return(NULL);
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
jj=EVP_PKEY_size(pkey);
|
jj=EVP_PKEY_size(pkey);
|
||||||
@@ -393,7 +393,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
|
|||||||
BIO_get_cipher_ctx(etmp,&evp_ctx);
|
BIO_get_cipher_ctx(etmp,&evp_ctx);
|
||||||
EVP_CipherInit(evp_ctx,evp_cipher,NULL,NULL,0);
|
EVP_CipherInit(evp_ctx,evp_cipher,NULL,NULL,0);
|
||||||
if (EVP_CIPHER_asn1_to_param(evp_ctx,enc_alg->parameter) < 0)
|
if (EVP_CIPHER_asn1_to_param(evp_ctx,enc_alg->parameter) < 0)
|
||||||
return(NULL);
|
goto err;
|
||||||
|
|
||||||
if (jj != EVP_CIPHER_CTX_key_length(evp_ctx)) {
|
if (jj != EVP_CIPHER_CTX_key_length(evp_ctx)) {
|
||||||
/* Some S/MIME clients don't use the same key
|
/* Some S/MIME clients don't use the same key
|
||||||
|
|||||||
@@ -141,10 +141,11 @@ static long md_count[2]={0,0};
|
|||||||
static double entropy=0;
|
static double entropy=0;
|
||||||
static int initialized=0;
|
static int initialized=0;
|
||||||
|
|
||||||
/* This should be set to 1 only when ssleay_rand_add() is called inside
|
static unsigned int crypto_lock_rand = 0; /* may be set only when a thread
|
||||||
an already locked state, so it doesn't try to lock and thereby cause
|
* holds CRYPTO_LOCK_RAND
|
||||||
a hang. And it should always be reset back to 0 before unlocking. */
|
* (to prevent double locking) */
|
||||||
static int add_do_not_lock=0;
|
static unsigned long locking_thread = 0; /* valid iff crypto_lock_rand is set */
|
||||||
|
|
||||||
|
|
||||||
#ifdef PREDICT
|
#ifdef PREDICT
|
||||||
int rand_predictable=0;
|
int rand_predictable=0;
|
||||||
@@ -191,6 +192,7 @@ static void ssleay_rand_add(const void *buf, int num, double add)
|
|||||||
long md_c[2];
|
long md_c[2];
|
||||||
unsigned char local_md[MD_DIGEST_LENGTH];
|
unsigned char local_md[MD_DIGEST_LENGTH];
|
||||||
MD_CTX m;
|
MD_CTX m;
|
||||||
|
int do_not_lock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (Based on the rand(3) manpage)
|
* (Based on the rand(3) manpage)
|
||||||
@@ -207,7 +209,10 @@ static void ssleay_rand_add(const void *buf, int num, double add)
|
|||||||
* hash function.
|
* hash function.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!add_do_not_lock) CRYPTO_w_lock(CRYPTO_LOCK_RAND);
|
/* check if we already have the lock */
|
||||||
|
do_not_lock = crypto_lock_rand && (locking_thread == CRYPTO_thread_id());
|
||||||
|
|
||||||
|
if (!do_not_lock) CRYPTO_w_lock(CRYPTO_LOCK_RAND);
|
||||||
st_idx=state_index;
|
st_idx=state_index;
|
||||||
|
|
||||||
/* use our own copies of the counters so that even
|
/* use our own copies of the counters so that even
|
||||||
@@ -239,7 +244,7 @@ static void ssleay_rand_add(const void *buf, int num, double add)
|
|||||||
|
|
||||||
md_count[1] += (num / MD_DIGEST_LENGTH) + (num % MD_DIGEST_LENGTH > 0);
|
md_count[1] += (num / MD_DIGEST_LENGTH) + (num % MD_DIGEST_LENGTH > 0);
|
||||||
|
|
||||||
if (!add_do_not_lock) CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
|
if (!do_not_lock) CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
|
||||||
|
|
||||||
for (i=0; i<num; i+=MD_DIGEST_LENGTH)
|
for (i=0; i<num; i+=MD_DIGEST_LENGTH)
|
||||||
{
|
{
|
||||||
@@ -281,7 +286,7 @@ static void ssleay_rand_add(const void *buf, int num, double add)
|
|||||||
}
|
}
|
||||||
memset((char *)&m,0,sizeof(m));
|
memset((char *)&m,0,sizeof(m));
|
||||||
|
|
||||||
if (!add_do_not_lock) CRYPTO_w_lock(CRYPTO_LOCK_RAND);
|
if (!do_not_lock) CRYPTO_w_lock(CRYPTO_LOCK_RAND);
|
||||||
/* Don't just copy back local_md into md -- this could mean that
|
/* Don't just copy back local_md into md -- this could mean that
|
||||||
* other thread's seeding remains without effect (except for
|
* other thread's seeding remains without effect (except for
|
||||||
* the incremented counter). By XORing it we keep at least as
|
* the incremented counter). By XORing it we keep at least as
|
||||||
@@ -292,7 +297,7 @@ static void ssleay_rand_add(const void *buf, int num, double add)
|
|||||||
}
|
}
|
||||||
if (entropy < ENTROPY_NEEDED) /* stop counting when we have enough */
|
if (entropy < ENTROPY_NEEDED) /* stop counting when we have enough */
|
||||||
entropy += add;
|
entropy += add;
|
||||||
if (!add_do_not_lock) CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
|
if (!do_not_lock) CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
|
||||||
|
|
||||||
#if !defined(THREADS) && !defined(WIN32)
|
#if !defined(THREADS) && !defined(WIN32)
|
||||||
assert(md_c[1] == md_count[1]);
|
assert(md_c[1] == md_count[1]);
|
||||||
@@ -308,6 +313,7 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
|
|||||||
{
|
{
|
||||||
static volatile int stirred_pool = 0;
|
static volatile int stirred_pool = 0;
|
||||||
int i,j,k,st_num,st_idx;
|
int i,j,k,st_num,st_idx;
|
||||||
|
int num_ceil;
|
||||||
int ok;
|
int ok;
|
||||||
long md_c[2];
|
long md_c[2];
|
||||||
unsigned char local_md[MD_DIGEST_LENGTH];
|
unsigned char local_md[MD_DIGEST_LENGTH];
|
||||||
@@ -328,33 +334,42 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (num <= 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* round upwards to multiple of MD_DIGEST_LENGTH/2 */
|
||||||
|
num_ceil = (1 + (num-1)/(MD_DIGEST_LENGTH/2)) * (MD_DIGEST_LENGTH/2);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (Based on the rand(3) manpage:)
|
* (Based on the rand(3) manpage:)
|
||||||
*
|
*
|
||||||
* For each group of 10 bytes (or less), we do the following:
|
* For each group of 10 bytes (or less), we do the following:
|
||||||
*
|
*
|
||||||
* Input into the hash function the top 10 bytes from the
|
* Input into the hash function the local 'md' (which is initialized from
|
||||||
* local 'md' (which is initialized from the global 'md'
|
* the global 'md' before any bytes are generated), the bytes that are to
|
||||||
* before any bytes are generated), the bytes that are
|
* be overwritten by the random bytes, and bytes from the 'state'
|
||||||
* to be overwritten by the random bytes, and bytes from the
|
* (incrementing looping index). From this digest output (which is kept
|
||||||
* 'state' (incrementing looping index). From this digest output
|
* in 'md'), the top (up to) 10 bytes are returned to the caller and the
|
||||||
* (which is kept in 'md'), the top (up to) 10 bytes are
|
* bottom 10 bytes are xored into the 'state'.
|
||||||
* returned to the caller and the bottom (up to) 10 bytes are xored
|
*
|
||||||
* into the 'state'.
|
|
||||||
* Finally, after we have finished 'num' random bytes for the
|
* Finally, after we have finished 'num' random bytes for the
|
||||||
* caller, 'count' (which is incremented) and the local and global 'md'
|
* caller, 'count' (which is incremented) and the local and global 'md'
|
||||||
* are fed into the hash function and the results are kept in the
|
* are fed into the hash function and the results are kept in the
|
||||||
* global 'md'.
|
* global 'md'.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!initialized)
|
|
||||||
RAND_poll();
|
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_RAND);
|
CRYPTO_w_lock(CRYPTO_LOCK_RAND);
|
||||||
add_do_not_lock = 1; /* Since we call ssleay_rand_add while in
|
|
||||||
this locked state. */
|
|
||||||
|
|
||||||
|
/* prevent ssleay_rand_bytes() from trying to obtain the lock again */
|
||||||
|
crypto_lock_rand = 1;
|
||||||
|
locking_thread = CRYPTO_thread_id();
|
||||||
|
|
||||||
|
if (!initialized)
|
||||||
|
{
|
||||||
|
RAND_poll();
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!stirred_pool)
|
if (!stirred_pool)
|
||||||
do_stir_pool = 1;
|
do_stir_pool = 1;
|
||||||
|
|
||||||
@@ -380,11 +395,11 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
|
|||||||
|
|
||||||
if (do_stir_pool)
|
if (do_stir_pool)
|
||||||
{
|
{
|
||||||
/* Our output function chains only half of 'md', so we better
|
/* In the output function only half of 'md' remains secret,
|
||||||
* make sure that the required entropy gets 'evenly distributed'
|
* so we better make sure that the required entropy gets
|
||||||
* through 'state', our randomness pool. The input function
|
* 'evenly distributed' through 'state', our randomness pool.
|
||||||
* (ssleay_rand_add) chains all of 'md', which makes it more
|
* The input function (ssleay_rand_add) chains all of 'md',
|
||||||
* suitable for this purpose.
|
* which makes it more suitable for this purpose.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int n = STATE_SIZE; /* so that the complete pool gets accessed */
|
int n = STATE_SIZE; /* so that the complete pool gets accessed */
|
||||||
@@ -409,21 +424,23 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
|
|||||||
md_c[1] = md_count[1];
|
md_c[1] = md_count[1];
|
||||||
memcpy(local_md, md, sizeof md);
|
memcpy(local_md, md, sizeof md);
|
||||||
|
|
||||||
state_index+=num;
|
state_index+=num_ceil;
|
||||||
if (state_index > state_num)
|
if (state_index > state_num)
|
||||||
state_index %= state_num;
|
state_index %= state_num;
|
||||||
|
|
||||||
/* state[st_idx], ..., state[(st_idx + num - 1) % st_num]
|
/* state[st_idx], ..., state[(st_idx + num_ceil - 1) % st_num]
|
||||||
* are now ours (but other threads may use them too) */
|
* are now ours (but other threads may use them too) */
|
||||||
|
|
||||||
md_count[0] += 1;
|
md_count[0] += 1;
|
||||||
|
|
||||||
add_do_not_lock = 0; /* If this would ever be forgotten, we can
|
/* before unlocking, we must clear 'crypto_lock_rand' */
|
||||||
expect any evil god to eat our souls. */
|
crypto_lock_rand = 0;
|
||||||
|
locking_thread = 0;
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
|
CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
|
||||||
|
|
||||||
while (num > 0)
|
while (num > 0)
|
||||||
{
|
{
|
||||||
|
/* num_ceil -= MD_DIGEST_LENGTH/2 */
|
||||||
j=(num >= MD_DIGEST_LENGTH/2)?MD_DIGEST_LENGTH/2:num;
|
j=(num >= MD_DIGEST_LENGTH/2)?MD_DIGEST_LENGTH/2:num;
|
||||||
num-=j;
|
num-=j;
|
||||||
MD_Init(&m);
|
MD_Init(&m);
|
||||||
@@ -434,27 +451,28 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
|
|||||||
curr_pid = 0;
|
curr_pid = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
MD_Update(&m,&(local_md[MD_DIGEST_LENGTH/2]),MD_DIGEST_LENGTH/2);
|
MD_Update(&m,local_md,MD_DIGEST_LENGTH);
|
||||||
MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
|
MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
|
||||||
#ifndef PURIFY
|
#ifndef PURIFY
|
||||||
MD_Update(&m,buf,j); /* purify complains */
|
MD_Update(&m,buf,j); /* purify complains */
|
||||||
#endif
|
#endif
|
||||||
k=(st_idx+j)-st_num;
|
k=(st_idx+MD_DIGEST_LENGTH/2)-st_num;
|
||||||
if (k > 0)
|
if (k > 0)
|
||||||
{
|
{
|
||||||
MD_Update(&m,&(state[st_idx]),j-k);
|
MD_Update(&m,&(state[st_idx]),MD_DIGEST_LENGTH/2-k);
|
||||||
MD_Update(&m,&(state[0]),k);
|
MD_Update(&m,&(state[0]),k);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
MD_Update(&m,&(state[st_idx]),j);
|
MD_Update(&m,&(state[st_idx]),MD_DIGEST_LENGTH/2);
|
||||||
MD_Final(local_md,&m);
|
MD_Final(local_md,&m);
|
||||||
|
|
||||||
for (i=0; i<j; i++)
|
for (i=0; i<MD_DIGEST_LENGTH/2; i++)
|
||||||
{
|
{
|
||||||
state[st_idx++]^=local_md[i]; /* may compete with other threads */
|
state[st_idx++]^=local_md[i]; /* may compete with other threads */
|
||||||
*(buf++)=local_md[i+MD_DIGEST_LENGTH/2];
|
|
||||||
if (st_idx >= st_num)
|
if (st_idx >= st_num)
|
||||||
st_idx=0;
|
st_idx=0;
|
||||||
|
if (i < j)
|
||||||
|
*(buf++)=local_md[i+MD_DIGEST_LENGTH/2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,11 +501,12 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
|
|||||||
static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num)
|
static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
unsigned long err;
|
||||||
|
|
||||||
ret = RAND_bytes(buf, num);
|
ret = RAND_bytes(buf, num);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
long err = ERR_peek_error();
|
err = ERR_peek_error();
|
||||||
if (ERR_GET_LIB(err) == ERR_LIB_RAND &&
|
if (ERR_GET_LIB(err) == ERR_LIB_RAND &&
|
||||||
ERR_GET_REASON(err) == RAND_R_PRNG_NOT_SEEDED)
|
ERR_GET_REASON(err) == RAND_R_PRNG_NOT_SEEDED)
|
||||||
(void)ERR_get_error();
|
(void)ERR_get_error();
|
||||||
@@ -498,14 +517,37 @@ static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num)
|
|||||||
static int ssleay_rand_status(void)
|
static int ssleay_rand_status(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
int do_not_lock;
|
||||||
|
|
||||||
|
/* check if we already have the lock
|
||||||
|
* (could happen if a RAND_poll() implementation calls RAND_status()) */
|
||||||
|
do_not_lock = crypto_lock_rand && (locking_thread == CRYPTO_thread_id());
|
||||||
|
|
||||||
|
if (!do_not_lock)
|
||||||
|
{
|
||||||
|
CRYPTO_w_lock(CRYPTO_LOCK_RAND);
|
||||||
|
|
||||||
|
/* prevent ssleay_rand_bytes() from trying to obtain the lock again */
|
||||||
|
crypto_lock_rand = 1;
|
||||||
|
locking_thread = CRYPTO_thread_id();
|
||||||
|
}
|
||||||
|
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
|
{
|
||||||
RAND_poll();
|
RAND_poll();
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_RAND);
|
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
|
}
|
||||||
|
|
||||||
ret = entropy >= ENTROPY_NEEDED;
|
ret = entropy >= ENTROPY_NEEDED;
|
||||||
|
|
||||||
|
if (!do_not_lock)
|
||||||
|
{
|
||||||
|
/* before unlocking, we must clear 'crypto_lock_rand' */
|
||||||
|
crypto_lock_rand = 0;
|
||||||
|
locking_thread = 0;
|
||||||
|
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
|
CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -77,13 +77,15 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
|
|||||||
int i, dblen, mlen = -1;
|
int i, dblen, mlen = -1;
|
||||||
unsigned char *maskeddb;
|
unsigned char *maskeddb;
|
||||||
int lzero;
|
int lzero;
|
||||||
unsigned char *db, seed[SHA_DIGEST_LENGTH], phash[SHA_DIGEST_LENGTH];
|
unsigned char *db = NULL, seed[SHA_DIGEST_LENGTH], phash[SHA_DIGEST_LENGTH];
|
||||||
|
|
||||||
if (--num < 2 * SHA_DIGEST_LENGTH + 1)
|
if (--num < 2 * SHA_DIGEST_LENGTH + 1)
|
||||||
{
|
goto decoding_err;
|
||||||
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, RSA_R_OAEP_DECODING_ERROR);
|
|
||||||
return (-1);
|
lzero = num - flen;
|
||||||
}
|
if (lzero < 0)
|
||||||
|
goto decoding_err;
|
||||||
|
maskeddb = from - lzero + SHA_DIGEST_LENGTH;
|
||||||
|
|
||||||
dblen = num - SHA_DIGEST_LENGTH;
|
dblen = num - SHA_DIGEST_LENGTH;
|
||||||
db = OPENSSL_malloc(dblen);
|
db = OPENSSL_malloc(dblen);
|
||||||
@@ -93,9 +95,6 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
lzero = num - flen;
|
|
||||||
maskeddb = from - lzero + SHA_DIGEST_LENGTH;
|
|
||||||
|
|
||||||
MGF1(seed, SHA_DIGEST_LENGTH, maskeddb, dblen);
|
MGF1(seed, SHA_DIGEST_LENGTH, maskeddb, dblen);
|
||||||
for (i = lzero; i < SHA_DIGEST_LENGTH; i++)
|
for (i = lzero; i < SHA_DIGEST_LENGTH; i++)
|
||||||
seed[i] ^= from[i - lzero];
|
seed[i] ^= from[i - lzero];
|
||||||
@@ -107,21 +106,20 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
|
|||||||
SHA1(param, plen, phash);
|
SHA1(param, plen, phash);
|
||||||
|
|
||||||
if (memcmp(db, phash, SHA_DIGEST_LENGTH) != 0)
|
if (memcmp(db, phash, SHA_DIGEST_LENGTH) != 0)
|
||||||
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, RSA_R_OAEP_DECODING_ERROR);
|
goto decoding_err;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (i = SHA_DIGEST_LENGTH; i < dblen; i++)
|
for (i = SHA_DIGEST_LENGTH; i < dblen; i++)
|
||||||
if (db[i] != 0x00)
|
if (db[i] != 0x00)
|
||||||
break;
|
break;
|
||||||
if (db[i] != 0x01 || i++ >= dblen)
|
if (db[i] != 0x01 || i++ >= dblen)
|
||||||
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP,
|
goto decoding_err;
|
||||||
RSA_R_OAEP_DECODING_ERROR);
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mlen = dblen - i;
|
mlen = dblen - i;
|
||||||
if (tlen < mlen)
|
if (tlen < mlen)
|
||||||
{
|
{
|
||||||
RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_OAEP, RSA_R_DATA_TOO_LARGE);
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, RSA_R_DATA_TOO_LARGE);
|
||||||
mlen = -1;
|
mlen = -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -130,6 +128,13 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
|
|||||||
}
|
}
|
||||||
OPENSSL_free(db);
|
OPENSSL_free(db);
|
||||||
return (mlen);
|
return (mlen);
|
||||||
|
|
||||||
|
decoding_err:
|
||||||
|
/* to avoid chosen ciphertext attacks, the error message should not reveal
|
||||||
|
* which kind of decoding error happened */
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, RSA_R_OAEP_DECODING_ERROR);
|
||||||
|
if (db != NULL) OPENSSL_free(db);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int MGF1(unsigned char *mask, long len, unsigned char *seed, long seedlen)
|
int MGF1(unsigned char *mask, long len, unsigned char *seed, long seedlen)
|
||||||
|
|||||||
@@ -214,6 +214,8 @@ int i;
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
p=buf;
|
p=buf;
|
||||||
|
if (i == 0)
|
||||||
|
*p = '\0';
|
||||||
return(p);
|
return(p);
|
||||||
err:
|
err:
|
||||||
X509err(X509_F_X509_NAME_ONELINE,ERR_R_MALLOC_FAILURE);
|
X509err(X509_F_X509_NAME_ONELINE,ERR_R_MALLOC_FAILURE);
|
||||||
|
|||||||
@@ -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
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -96,12 +96,18 @@ of hex digits.
|
|||||||
=item B<-K key>
|
=item B<-K key>
|
||||||
|
|
||||||
the actual key to use: this must be represented as a string comprised only
|
the actual key to use: this must be represented as a string comprised only
|
||||||
of hex digits.
|
of hex digits. If only the key is specified, the IV must additionally specified
|
||||||
|
using the B<-iv> option. When both a key and a password are specified, the
|
||||||
|
key given with the B<-K> option will be used and the IV generated from the
|
||||||
|
password will be taken. It probably does not make much sense to specify
|
||||||
|
both key and password.
|
||||||
|
|
||||||
=item B<-iv IV>
|
=item B<-iv IV>
|
||||||
|
|
||||||
the actual IV to use: this must be represented as a string comprised only
|
the actual IV to use: this must be represented as a string comprised only
|
||||||
of hex digits.
|
of hex digits. When only the key is specified using the B<-K> option, the
|
||||||
|
IV must explicitly be defined. When a password is being specified using
|
||||||
|
one of the other options, the IV is generated from this password.
|
||||||
|
|
||||||
=item B<-p>
|
=item B<-p>
|
||||||
|
|
||||||
|
|||||||
@@ -101,11 +101,11 @@ Sign some data using a private key:
|
|||||||
|
|
||||||
Recover the signed data
|
Recover the signed data
|
||||||
|
|
||||||
openssl rsautl -sign -in sig -inkey key.pem
|
openssl rsautl -verify -in sig -inkey key.pem
|
||||||
|
|
||||||
Examine the raw signed data:
|
Examine the raw signed data:
|
||||||
|
|
||||||
openssl rsautl -sign -in file -inkey key.pem -raw -hexdump
|
openssl rsautl -verify -in file -inkey key.pem -raw -hexdump
|
||||||
|
|
||||||
0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
|
0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
|
||||||
0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
|
0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ s_server - SSL/TLS server program
|
|||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
B<openssl> B<s_client>
|
B<openssl> B<s_server>
|
||||||
[B<-accept port>]
|
[B<-accept port>]
|
||||||
[B<-context id>]
|
[B<-context id>]
|
||||||
[B<-verify depth>]
|
[B<-verify depth>]
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ BIO).
|
|||||||
=head1 SEE ALSO
|
=head1 SEE ALSO
|
||||||
|
|
||||||
L<BIO_ctrl(3)|BIO_ctrl(3)>,
|
L<BIO_ctrl(3)|BIO_ctrl(3)>,
|
||||||
L<BIO_f_base64(3)|BIO_f_base64(3)>,
|
L<BIO_f_base64(3)|BIO_f_base64(3)>, L<BIO_f_buffer(3)|BIO_f_buffer(3)>,
|
||||||
L<BIO_f_cipher(3)|BIO_f_cipher(3)>, L<BIO_f_md(3)|BIO_f_md(3)>,
|
L<BIO_f_cipher(3)|BIO_f_cipher(3)>, L<BIO_f_md(3)|BIO_f_md(3)>,
|
||||||
L<BIO_f_null(3)|BIO_f_null(3)>, L<BIO_f_ssl(3)|BIO_f_ssl(3)>,
|
L<BIO_f_null(3)|BIO_f_null(3)>, L<BIO_f_ssl(3)|BIO_f_ssl(3)>,
|
||||||
L<BIO_find_type(3)|BIO_find_type(3)>, L<BIO_new(3)|BIO_new(3)>,
|
L<BIO_find_type(3)|BIO_find_type(3)>, L<BIO_new(3)|BIO_new(3)>,
|
||||||
|
|||||||
@@ -127,13 +127,12 @@ function and xor).
|
|||||||
When bytes are extracted from the RNG, the following process is used.
|
When bytes are extracted from the RNG, the following process is used.
|
||||||
For each group of 10 bytes (or less), we do the following:
|
For each group of 10 bytes (or less), we do the following:
|
||||||
|
|
||||||
Input into the hash function the top 10 bytes from the local 'md'
|
Input into the hash function the local 'md' (which is initialized from
|
||||||
(which is initialized from the global 'md' before any bytes are
|
the global 'md' before any bytes are generated), the bytes that are to
|
||||||
generated), the bytes that are to be overwritten by the random bytes,
|
be overwritten by the random bytes, and bytes from the 'state'
|
||||||
and bytes from the 'state' (incrementing looping index). From this
|
(incrementing looping index). From this digest output (which is kept
|
||||||
digest output (which is kept in 'md'), the top (up to) 10 bytes are
|
in 'md'), the top (up to) 10 bytes are returned to the caller and the
|
||||||
returned to the caller and the bottom (up to) 10 bytes are xored into
|
bottom 10 bytes are xored into the 'state'.
|
||||||
the 'state'.
|
|
||||||
|
|
||||||
Finally, after we have finished 'num' random bytes for the caller,
|
Finally, after we have finished 'num' random bytes for the caller,
|
||||||
'count' (which is incremented) and the local and global 'md' are fed
|
'count' (which is incremented) and the local and global 'md' are fed
|
||||||
|
|||||||
@@ -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)>.
|
||||||
|
|
||||||
|
|||||||
@@ -33,10 +33,6 @@ which can be used e.g. for descriptions of the certificates.
|
|||||||
The B<CAfile> is processed on execution of the SSL_CTX_load_verify_locations()
|
The B<CAfile> is processed on execution of the SSL_CTX_load_verify_locations()
|
||||||
function.
|
function.
|
||||||
|
|
||||||
If on an TLS/SSL server no special setting is performed using *client_CA_list()
|
|
||||||
functions, the certificates contained in B<CAfile> are listed to the client
|
|
||||||
as available CAs during the TLS/SSL handshake.
|
|
||||||
|
|
||||||
If B<CApath> is not NULL, it points to a directory containing CA certificates
|
If B<CApath> is not NULL, it points to a directory containing CA certificates
|
||||||
in PEM format. The files each contain one CA certificate. The files are
|
in PEM format. The files each contain one CA certificate. The files are
|
||||||
looked up by the CA subject name hash value, which must hence be available.
|
looked up by the CA subject name hash value, which must hence be available.
|
||||||
@@ -50,9 +46,6 @@ The certificates in B<CApath> are only looked up when required, e.g. when
|
|||||||
building the certificate chain or when actually performing the verification
|
building the certificate chain or when actually performing the verification
|
||||||
of a peer certificate.
|
of a peer certificate.
|
||||||
|
|
||||||
On a server, the certificates in B<CApath> are not listed as available
|
|
||||||
CA certificates to a client during a TLS/SSL handshake.
|
|
||||||
|
|
||||||
When looking up CA certificates, the OpenSSL library will first search the
|
When looking up CA certificates, the OpenSSL library will first search the
|
||||||
certificates in B<CAfile>, then those in B<CApath>. Certificate matching
|
certificates in B<CAfile>, then those in B<CApath>. Certificate matching
|
||||||
is done based on the subject name, the key identifier (if present), and the
|
is done based on the subject name, the key identifier (if present), and the
|
||||||
@@ -62,6 +55,13 @@ matching the parameters is found, the verification process will be performed;
|
|||||||
no other certificates for the same parameters will be searched in case of
|
no other certificates for the same parameters will be searched in case of
|
||||||
failure.
|
failure.
|
||||||
|
|
||||||
|
In server mode, when requesting a client certificate, the server must send
|
||||||
|
the list of CAs of which it will accept client certificates. This list
|
||||||
|
is not influenced by the contents of B<CAfile> or B<CApath> and must
|
||||||
|
explicitely be set using the
|
||||||
|
L<SSL_CTX_set_client_CA_list(3)|SSL_CTX_set_client_CA_list(3)>
|
||||||
|
family of functions.
|
||||||
|
|
||||||
When building its own certificate chain, an OpenSSL client/server will
|
When building its own certificate chain, an OpenSSL client/server will
|
||||||
try to fill in missing certificates from B<CAfile>/B<CApath>, if the
|
try to fill in missing certificates from B<CAfile>/B<CApath>, if the
|
||||||
certificate chain was not explicitly specified (see
|
certificate chain was not explicitly specified (see
|
||||||
|
|||||||
@@ -36,25 +36,23 @@ the chosen B<ssl>, overriding the setting valid for B<ssl>'s SSL_CTX object.
|
|||||||
|
|
||||||
When a TLS/SSL server requests a client certificate (see
|
When a TLS/SSL server requests a client certificate (see
|
||||||
B<SSL_CTX_set_verify_options()>), it sends a list of CAs, for which
|
B<SSL_CTX_set_verify_options()>), it sends a list of CAs, for which
|
||||||
it will accept certificates, to the client. If no special list is provided,
|
it will accept certificates, to the client.
|
||||||
the CAs available using the B<CAfile> option in
|
|
||||||
L<SSL_CTX_load_verify_locations(3)|SSL_CTX_load_verify_locations(3)>
|
|
||||||
are sent.
|
|
||||||
|
|
||||||
This list can be explicitly set using the SSL_CTX_set_client_CA_list() for
|
This list must explicitly be set using SSL_CTX_set_client_CA_list() for
|
||||||
B<ctx> and SSL_set_client_CA_list() for the specific B<ssl>. The list
|
B<ctx> and SSL_set_client_CA_list() for the specific B<ssl>. The list
|
||||||
specified overrides the previous setting. The CAs listed do not become
|
specified overrides the previous setting. The CAs listed do not become
|
||||||
trusted (B<list> only contains the names, not the complete certificates); use
|
trusted (B<list> only contains the names, not the complete certificates); use
|
||||||
L<SSL_CTX_load_verify_locations(3)|SSL_CTX_load_verify_locations(3)>
|
L<SSL_CTX_load_verify_locations(3)|SSL_CTX_load_verify_locations(3)>
|
||||||
to additionally load them for verification.
|
to additionally load them for verification.
|
||||||
|
|
||||||
|
If the list of acceptable CAs is compiled in a file, the
|
||||||
|
L<SSL_load_client_CA_file(3)|SSL_load_client_CA_file(3)>
|
||||||
|
function can be used to help importing the necessary data.
|
||||||
|
|
||||||
SSL_CTX_add_client_CA() and SSL_add_client_CA() can be used to add additional
|
SSL_CTX_add_client_CA() and SSL_add_client_CA() can be used to add additional
|
||||||
items the list of client CAs. If no list was specified before using
|
items the list of client CAs. If no list was specified before using
|
||||||
SSL_CTX_set_client_CA_list() or SSL_set_client_CA_list(), a new client
|
SSL_CTX_set_client_CA_list() or SSL_set_client_CA_list(), a new client
|
||||||
CA list for B<ctx> or B<ssl> (as appropriate) is opened. The CAs implicitly
|
CA list for B<ctx> or B<ssl> (as appropriate) is opened.
|
||||||
specified using
|
|
||||||
L<SSL_CTX_load_verify_locations(3)|SSL_CTX_load_verify_locations(3)>
|
|
||||||
are no longer used automatically.
|
|
||||||
|
|
||||||
These functions are only useful for TLS/SSL servers.
|
These functions are only useful for TLS/SSL servers.
|
||||||
|
|
||||||
@@ -80,11 +78,17 @@ to find out the reason.
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
|
=head1 EXAMPLES
|
||||||
|
|
||||||
|
Scan all certificates in B<CAfile> and list them as acceptable CAs:
|
||||||
|
|
||||||
|
SSL_CTX_set_client_CA_list(ctx,SSL_load_client_CA_file(CAfile));
|
||||||
|
|
||||||
=head1 SEE ALSO
|
=head1 SEE ALSO
|
||||||
|
|
||||||
L<ssl(3)|ssl(3)>,
|
L<ssl(3)|ssl(3)>,
|
||||||
L<SSL_get_client_CA_list(3)|SSL_get_client_CA_list(3)>,
|
L<SSL_get_client_CA_list(3)|SSL_get_client_CA_list(3)>,
|
||||||
L<SSL_load_client_CA_file(3)|SSL_load_client_CA_file(3)>
|
L<SSL_load_client_CA_file(3)|SSL_load_client_CA_file(3)>,
|
||||||
L<SSL_CTX_load_verify_locations(3)|SSL_CTX_load_verify_locations(3)>
|
L<SSL_CTX_load_verify_locations(3)|SSL_CTX_load_verify_locations(3)>
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -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)>.
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,12 @@ peer presented. If the peer did not present a certificate, NULL is returned.
|
|||||||
|
|
||||||
=head1 NOTES
|
=head1 NOTES
|
||||||
|
|
||||||
|
Due to the protocol definition, a TLS/SSL server will always send a
|
||||||
|
certificate, if present. A client will only send a certificate when
|
||||||
|
explicitely requested to do so by the server (see
|
||||||
|
L<SSL_CTX_set_verify(3)|SSL_CTX_set_verify(3)>). If an anonymous cipher
|
||||||
|
is used, no certificates are sent.
|
||||||
|
|
||||||
That a certificate is returned does not indicate information about the
|
That a certificate is returned does not indicate information about the
|
||||||
verification state, use L<SSL_get_verify_result(3)|SSL_get_verify_result(3)>
|
verification state, use L<SSL_get_verify_result(3)|SSL_get_verify_result(3)>
|
||||||
to check the verification state.
|
to check the verification state.
|
||||||
@@ -43,6 +49,7 @@ The return value points to the certificate presented by the peer.
|
|||||||
|
|
||||||
=head1 SEE ALSO
|
=head1 SEE ALSO
|
||||||
|
|
||||||
L<ssl(3)|ssl(3)>, L<SSL_get_verify_result(3)|SSL_get_verify_result(3)>
|
L<ssl(3)|ssl(3)>, L<SSL_get_verify_result(3)|SSL_get_verify_result(3)>,
|
||||||
|
L<SSL_CTX_set_verify(3)|SSL_CTX_set_verify(3)>
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ Call SSL_get_error() with the return value B<ret> to find out the reason.
|
|||||||
|
|
||||||
L<SSL_get_error(3)|SSL_get_error(3)>, L<SSL_connect(3)|SSL_connect(3)>,
|
L<SSL_get_error(3)|SSL_get_error(3)>, L<SSL_connect(3)|SSL_connect(3)>,
|
||||||
L<SSL_accept(3)|SSL_accept(3)>, L<SSL_set_shutdown(3)|SSL_set_shutdown(3)>,
|
L<SSL_accept(3)|SSL_accept(3)>, L<SSL_set_shutdown(3)|SSL_set_shutdown(3)>,
|
||||||
L<SSL_clear(3)|SSL_clear(3), L<SSL_free(3)|SSL_free(3)>,
|
L<SSL_clear(3)|SSL_clear(3)>, L<SSL_free(3)|SSL_free(3)>,
|
||||||
L<ssl(3)|ssl(3)>, L<bio(3)|bio(3)>
|
L<ssl(3)|ssl(3)>, L<bio(3)|bio(3)>
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
20
ssl/s3_enc.c
20
ssl/s3_enc.c
@@ -356,7 +356,7 @@ int ssl3_enc(SSL *s, int send)
|
|||||||
if ((s->session == NULL) || (ds == NULL) ||
|
if ((s->session == NULL) || (ds == NULL) ||
|
||||||
(enc == NULL))
|
(enc == NULL))
|
||||||
{
|
{
|
||||||
memcpy(rec->data,rec->input,rec->length);
|
memmove(rec->data,rec->input,rec->length);
|
||||||
rec->input=rec->data;
|
rec->input=rec->data;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -366,7 +366,6 @@ int ssl3_enc(SSL *s, int send)
|
|||||||
|
|
||||||
/* COMPRESS */
|
/* COMPRESS */
|
||||||
|
|
||||||
/* This should be using (bs-1) and bs instead of 7 and 8 */
|
|
||||||
if ((bs != 1) && send)
|
if ((bs != 1) && send)
|
||||||
{
|
{
|
||||||
i=bs-((int)l%bs);
|
i=bs-((int)l%bs);
|
||||||
@@ -377,11 +376,23 @@ int ssl3_enc(SSL *s, int send)
|
|||||||
rec->input[l-1]=(i-1);
|
rec->input[l-1]=(i-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!send)
|
||||||
|
{
|
||||||
|
if (l == 0 || l%bs != 0)
|
||||||
|
{
|
||||||
|
SSLerr(SSL_F_SSL3_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
|
||||||
|
ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPT_ERROR);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EVP_Cipher(ds,rec->data,rec->input,l);
|
EVP_Cipher(ds,rec->data,rec->input,l);
|
||||||
|
|
||||||
if ((bs != 1) && !send)
|
if ((bs != 1) && !send)
|
||||||
{
|
{
|
||||||
i=rec->data[l-1]+1;
|
i=rec->data[l-1]+1;
|
||||||
|
/* SSL 3.0 bounds the number of padding bytes by the block size;
|
||||||
|
* padding bytes (except that last) are arbitrary */
|
||||||
if (i > bs)
|
if (i > bs)
|
||||||
{
|
{
|
||||||
SSLerr(SSL_F_SSL3_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
|
SSLerr(SSL_F_SSL3_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
|
||||||
@@ -504,7 +515,10 @@ int ssl3_mac(SSL *ssl, unsigned char *md, int send)
|
|||||||
EVP_DigestFinal( &md_ctx,md,&md_size);
|
EVP_DigestFinal( &md_ctx,md,&md_size);
|
||||||
|
|
||||||
for (i=7; i>=0; i--)
|
for (i=7; i>=0; i--)
|
||||||
if (++seq[i]) break;
|
{
|
||||||
|
++seq[i];
|
||||||
|
if (seq[i] != 0) break;
|
||||||
|
}
|
||||||
|
|
||||||
return(md_size);
|
return(md_size);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
21
ssl/t1_enc.c
21
ssl/t1_enc.c
@@ -420,7 +420,7 @@ int tls1_enc(SSL *s, int send)
|
|||||||
if ((s->session == NULL) || (ds == NULL) ||
|
if ((s->session == NULL) || (ds == NULL) ||
|
||||||
(enc == NULL))
|
(enc == NULL))
|
||||||
{
|
{
|
||||||
memcpy(rec->data,rec->input,rec->length);
|
memmove(rec->data,rec->input,rec->length);
|
||||||
rec->input=rec->data;
|
rec->input=rec->data;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -447,11 +447,21 @@ int tls1_enc(SSL *s, int send)
|
|||||||
rec->length+=i;
|
rec->length+=i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!send)
|
||||||
|
{
|
||||||
|
if (l == 0 || l%bs != 0)
|
||||||
|
{
|
||||||
|
SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
|
||||||
|
ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPT_ERROR);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EVP_Cipher(ds,rec->data,rec->input,l);
|
EVP_Cipher(ds,rec->data,rec->input,l);
|
||||||
|
|
||||||
if ((bs != 1) && !send)
|
if ((bs != 1) && !send)
|
||||||
{
|
{
|
||||||
ii=i=rec->data[l-1];
|
ii=i=rec->data[l-1]; /* padding_length */
|
||||||
i++;
|
i++;
|
||||||
if (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG)
|
if (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG)
|
||||||
{
|
{
|
||||||
@@ -462,6 +472,8 @@ int tls1_enc(SSL *s, int send)
|
|||||||
if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
|
if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
|
/* TLS 1.0 does not bound the number of padding bytes by the block size.
|
||||||
|
* All of them must have value 'padding_length'. */
|
||||||
if (i > (int)rec->length)
|
if (i > (int)rec->length)
|
||||||
{
|
{
|
||||||
SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
|
SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
|
||||||
@@ -572,7 +584,10 @@ printf("rec=");
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i=7; i>=0; i--)
|
for (i=7; i>=0; i--)
|
||||||
if (++seq[i]) break;
|
{
|
||||||
|
++seq[i];
|
||||||
|
if (seq[i] != 0) break;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef TLS_DEBUG
|
#ifdef TLS_DEBUG
|
||||||
{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
|
{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
|
||||||
|
|||||||
@@ -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`" | $(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)
|
||||||
|
|
||||||
|
|||||||
54
test/bctest
54
test/bctest
@@ -11,9 +11,28 @@
|
|||||||
# running) bc.
|
# running) bc.
|
||||||
|
|
||||||
|
|
||||||
|
IFS=:
|
||||||
|
try_without_dir=true
|
||||||
|
# First we try "bc", then "$dir/bc" for each item in $PATH.
|
||||||
|
for dir in dummy:$PATH; do
|
||||||
|
if [ "$try_without_dir" = true ]; then
|
||||||
|
# first iteration
|
||||||
|
bc=bc
|
||||||
|
try_without_dir=false
|
||||||
|
else
|
||||||
|
# second and later iterations
|
||||||
|
bc="$dir/bc"
|
||||||
|
if [ ! -f "$bc" ]; then # '-x' is not available on Ultrix
|
||||||
|
bc=''
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! "$bc" = '' ]; then
|
||||||
|
failure=none
|
||||||
|
|
||||||
|
|
||||||
# Test for SunOS 5.[78] bc bug
|
# Test for SunOS 5.[78] bc bug
|
||||||
SunOStest() {
|
"$bc" >tmp.bctest <<\EOF
|
||||||
${1} >tmp.bctest <<\EOF
|
|
||||||
obase=16
|
obase=16
|
||||||
ibase=16
|
ibase=16
|
||||||
a=AD88C418F31B3FC712D0425001D522B3AE9134FF3A98C13C1FCC1682211195406C1A6C66C6A\
|
a=AD88C418F31B3FC712D0425001D522B3AE9134FF3A98C13C1FCC1682211195406C1A6C66C6A\
|
||||||
@@ -28,17 +47,14 @@ b=DCE91E7D120B983EA9A104B5A96D634DD644C37657B1C7860B45E6838999B3DCE5A555583C6\
|
|||||||
3ED0E2017D60A68775B75481449
|
3ED0E2017D60A68775B75481449
|
||||||
(a/b)*b + (a%b) - a
|
(a/b)*b + (a%b) - a
|
||||||
EOF
|
EOF
|
||||||
if [ 0 != "`cat tmp.bctest`" ]
|
if [ 0 != "`cat tmp.bctest`" ]; then
|
||||||
then
|
failure=SunOStest
|
||||||
# failure
|
|
||||||
return 1
|
|
||||||
fi
|
fi
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$failure" = none ]; then
|
||||||
# Test for SCO bc bug.
|
# Test for SCO bc bug.
|
||||||
SCOtest() {
|
"$bc" >tmp.bctest <<\EOF
|
||||||
${1} >tmp.bctest <<\EOF
|
|
||||||
obase=16
|
obase=16
|
||||||
ibase=16
|
ibase=16
|
||||||
-FFDD63BA1A4648F0D804F8A1C66C53F0D2110590E8A3907EC73B4AEC6F15AC177F176F2274D2\
|
-FFDD63BA1A4648F0D804F8A1C66C53F0D2110590E8A3907EC73B4AEC6F15AC177F176F2274D2\
|
||||||
@@ -66,20 +82,13 @@ D97935A7E1A14AD209D6CF811F55C6DB83AA9E6DFECFCD6669DED7171EE22A40C6181615CAF3F\
|
|||||||
5296964
|
5296964
|
||||||
EOF
|
EOF
|
||||||
if [ "0
|
if [ "0
|
||||||
0" != "`cat tmp.bctest`" ]
|
0" != "`cat tmp.bctest`" ]; then
|
||||||
then
|
failure=SCOtest
|
||||||
# failure
|
fi
|
||||||
return 1
|
|
||||||
fi
|
fi
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
IFS=:
|
if [ "$failure" = none ]; then
|
||||||
for dir in $PATH; do
|
|
||||||
bc="$dir/bc"
|
|
||||||
|
|
||||||
if [ -x "$bc" -a ! -d "$bc" ]; then
|
|
||||||
if SunOStest "$bc" && SCOtest "$bc"; then
|
|
||||||
# bc works; now check if it knows the 'print' command.
|
# bc works; now check if it knows the 'print' command.
|
||||||
if [ "OK" = "`echo 'print \"OK\"' | $bc 2>/dev/null`" ]
|
if [ "OK" = "`echo 'print \"OK\"' | $bc 2>/dev/null`" ]
|
||||||
then
|
then
|
||||||
@@ -90,10 +99,13 @@ for dir in $PATH; do
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "$bc does not work properly. Looking for another bc ..." >&2
|
echo "$bc does not work properly ('$failure' failed). Looking for another bc ..." >&2
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "No working bc found. Consider installing GNU bc." >&2
|
echo "No working bc found. Consider installing GNU bc." >&2
|
||||||
|
if [ "$1" = ignore ]; then
|
||||||
echo "cat >/dev/null"
|
echo "cat >/dev/null"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -117,7 +117,12 @@ sub link_hash_cert {
|
|||||||
}
|
}
|
||||||
$hash .= ".$suffix";
|
$hash .= ".$suffix";
|
||||||
print "$fname => $hash\n";
|
print "$fname => $hash\n";
|
||||||
|
$symlink_exists=eval {symlink("",""); 1};
|
||||||
|
if ($symlink_exists) {
|
||||||
symlink $fname, $hash;
|
symlink $fname, $hash;
|
||||||
|
} else {
|
||||||
|
system ("cp", $fname, $hash);
|
||||||
|
}
|
||||||
$hashlist{$hash} = $fprint;
|
$hashlist{$hash} = $fprint;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,7 +147,12 @@ sub link_hash_crl {
|
|||||||
}
|
}
|
||||||
$hash .= ".r$suffix";
|
$hash .= ".r$suffix";
|
||||||
print "$fname => $hash\n";
|
print "$fname => $hash\n";
|
||||||
|
$symlink_exists=eval {symlink("",""); 1};
|
||||||
|
if ($symlink_exists) {
|
||||||
symlink $fname, $hash;
|
symlink $fname, $hash;
|
||||||
|
} else {
|
||||||
|
system ("cp", $fname, $hash);
|
||||||
|
}
|
||||||
$hashlist{$hash} = $fprint;
|
$hashlist{$hash} = $fprint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,8 +48,13 @@ foreach $dirname (@from_path) {
|
|||||||
my $to = join('/', @to_path);
|
my $to = join('/', @to_path);
|
||||||
|
|
||||||
my $file;
|
my $file;
|
||||||
|
$symlink_exists=eval {symlink("",""); 1};
|
||||||
foreach $file (@files) {
|
foreach $file (@files) {
|
||||||
my $err = "";
|
my $err = "";
|
||||||
|
if ($symlink_exists) {
|
||||||
symlink("$to/$file", "$from/$file") or $err = " [$!]";
|
symlink("$to/$file", "$from/$file") or $err = " [$!]";
|
||||||
|
} else {
|
||||||
|
system ("cp", "$file", "$from/$file") and $err = " [$!]";
|
||||||
|
}
|
||||||
print $file . " => $from/$file$err\n";
|
print $file . " => $from/$file$err\n";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user