Compare commits
	
		
			131 Commits
		
	
	
		
			OpenSSL_1_
			...
			OpenSSL_1_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d9e048ceac | ||
| 
						 | 
					65a9383e6b | ||
| 
						 | 
					c6b82f7ee9 | ||
| 
						 | 
					25590043d1 | ||
| 
						 | 
					8a5d624d5b | ||
| 
						 | 
					ae4a75cecf | ||
| 
						 | 
					2e884ce11d | ||
| 
						 | 
					da8f1b738c | ||
| 
						 | 
					33f44acbbe | ||
| 
						 | 
					11c48a0fd2 | ||
| 
						 | 
					3cdaca2436 | ||
| 
						 | 
					b23da2919b | ||
| 
						 | 
					610dfc3ef4 | ||
| 
						 | 
					080f395392 | ||
| 
						 | 
					f852b60797 | ||
| 
						 | 
					e2356454c8 | ||
| 
						 | 
					e5420be6cd | ||
| 
						 | 
					9c00a95060 | ||
| 
						 | 
					ebc71865f0 | ||
| 
						 | 
					1dfa62d4c8 | ||
| 
						 | 
					8c6364e198 | ||
| 
						 | 
					98c2e93723 | ||
| 
						 | 
					c053e538b4 | ||
| 
						 | 
					6386647298 | ||
| 
						 | 
					4b24b754f5 | ||
| 
						 | 
					bfff2cc192 | ||
| 
						 | 
					d8b177719a | ||
| 
						 | 
					d985a68c89 | ||
| 
						 | 
					8dad8bc465 | ||
| 
						 | 
					235e76bce1 | ||
| 
						 | 
					d38c549e60 | ||
| 
						 | 
					558189183f | ||
| 
						 | 
					77ada38dbd | ||
| 
						 | 
					8124ebcd78 | ||
| 
						 | 
					04fde2025b | ||
| 
						 | 
					6bd61198fb | ||
| 
						 | 
					23b5e47ffc | ||
| 
						 | 
					fb81e6d300 | ||
| 
						 | 
					50ff4afb03 | ||
| 
						 | 
					c51f6bccea | ||
| 
						 | 
					836a811604 | ||
| 
						 | 
					bb65e3f22b | ||
| 
						 | 
					b8719c753e | ||
| 
						 | 
					92b2530acd | ||
| 
						 | 
					9ff94ad7ae | ||
| 
						 | 
					60ccb02c4a | ||
| 
						 | 
					094fb13876 | ||
| 
						 | 
					9c5d75d5a9 | ||
| 
						 | 
					ca461ecd11 | ||
| 
						 | 
					0ad9fe2d59 | ||
| 
						 | 
					a203df7521 | ||
| 
						 | 
					144517299c | ||
| 
						 | 
					5c468f0c1f | ||
| 
						 | 
					83a4ae6b0b | ||
| 
						 | 
					9374bc1c10 | ||
| 
						 | 
					e9c563fc29 | ||
| 
						 | 
					4887e07819 | ||
| 
						 | 
					652ac3e93a | ||
| 
						 | 
					8d2f61ac70 | ||
| 
						 | 
					02a23fa309 | ||
| 
						 | 
					bef20d4a68 | ||
| 
						 | 
					dddddb2e6c | ||
| 
						 | 
					8fcb93613a | ||
| 
						 | 
					ecb58c1628 | ||
| 
						 | 
					a969ca5cc8 | ||
| 
						 | 
					1e4406a854 | ||
| 
						 | 
					94fbee800b | ||
| 
						 | 
					c50847c28b | ||
| 
						 | 
					b1ce2d24dd | ||
| 
						 | 
					743fb51d2c | ||
| 
						 | 
					0ed781740d | ||
| 
						 | 
					d0e542fdc9 | ||
| 
						 | 
					457863efdf | ||
| 
						 | 
					5bd4fcc5c2 | ||
| 
						 | 
					3dd2eebfbc | ||
| 
						 | 
					d079b387a3 | ||
| 
						 | 
					8eeaeb4b04 | ||
| 
						 | 
					0041925844 | ||
| 
						 | 
					14fa016b2b | ||
| 
						 | 
					7fdccda37d | ||
| 
						 | 
					cdc575c46b | ||
| 
						 | 
					2f0aaf76f3 | ||
| 
						 | 
					6b7887b0ab | ||
| 
						 | 
					9ad1b440ae | ||
| 
						 | 
					9275ad321f | ||
| 
						 | 
					216a2a5fc6 | ||
| 
						 | 
					c2c6044933 | ||
| 
						 | 
					dc95c53c6f | ||
| 
						 | 
					b24a53dd9a | ||
| 
						 | 
					ffbe7cd0c5 | ||
| 
						 | 
					97183a312e | ||
| 
						 | 
					46ed8aff6d | ||
| 
						 | 
					6a0a48433b | ||
| 
						 | 
					ad3d95222d | ||
| 
						 | 
					18ea747ce4 | ||
| 
						 | 
					f4f512a853 | ||
| 
						 | 
					9c2bed0b65 | ||
| 
						 | 
					ad83334e73 | ||
| 
						 | 
					2cf4bc9ecd | ||
| 
						 | 
					c8ac945d59 | ||
| 
						 | 
					92aa50bc03 | ||
| 
						 | 
					2f31308b17 | ||
| 
						 | 
					468d58e712 | ||
| 
						 | 
					dd4b50ff6a | ||
| 
						 | 
					030d5b8c97 | ||
| 
						 | 
					9b73be38ab | ||
| 
						 | 
					e5bf2f5d4c | ||
| 
						 | 
					a7096946fa | ||
| 
						 | 
					4a8362a68b | ||
| 
						 | 
					25128a11fb | ||
| 
						 | 
					3deb968fec | ||
| 
						 | 
					276eb93218 | ||
| 
						 | 
					29c33e16ac | ||
| 
						 | 
					bffb696f65 | ||
| 
						 | 
					fd2d78e70b | ||
| 
						 | 
					6b1fb9179e | ||
| 
						 | 
					702175817f | ||
| 
						 | 
					703ec840dc | ||
| 
						 | 
					04d706d42a | ||
| 
						 | 
					b996cecc32 | ||
| 
						 | 
					7e927da2a5 | ||
| 
						 | 
					7aa6d2fcf9 | ||
| 
						 | 
					27b1f137ff | ||
| 
						 | 
					f63c927e8e | ||
| 
						 | 
					d572544a2c | ||
| 
						 | 
					9100840258 | ||
| 
						 | 
					0f32c83c91 | ||
| 
						 | 
					80b570142d | ||
| 
						 | 
					a99b6fcb7c | ||
| 
						 | 
					02d1a6b3aa | ||
| 
						 | 
					08e8d58785 | 
							
								
								
									
										77
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
# Object files
 | 
			
		||||
*.o
 | 
			
		||||
 | 
			
		||||
# editor artefacts
 | 
			
		||||
*.swp
 | 
			
		||||
.#*
 | 
			
		||||
#*#
 | 
			
		||||
*~
 | 
			
		||||
 | 
			
		||||
# Top level excludes
 | 
			
		||||
/Makefile.bak
 | 
			
		||||
/Makefile
 | 
			
		||||
/*.a
 | 
			
		||||
/include
 | 
			
		||||
/*.pc
 | 
			
		||||
/rehash.time
 | 
			
		||||
 | 
			
		||||
# Most *.c files under test/ are symlinks
 | 
			
		||||
/test/*.c
 | 
			
		||||
# Apart from these
 | 
			
		||||
!/test/asn1test.c
 | 
			
		||||
!/test/methtest.c
 | 
			
		||||
!/test/dummytest.c
 | 
			
		||||
!/test/igetest.c
 | 
			
		||||
!/test/r160test.c
 | 
			
		||||
!/test/fips_algvs.c
 | 
			
		||||
 | 
			
		||||
/test/*.ss
 | 
			
		||||
/test/*.srl
 | 
			
		||||
/test/.rnd
 | 
			
		||||
/test/test*.pem
 | 
			
		||||
/test/newkey.pem
 | 
			
		||||
 | 
			
		||||
# Certificate symbolic links
 | 
			
		||||
*.0
 | 
			
		||||
 | 
			
		||||
# Links under apps
 | 
			
		||||
/apps/CA.pl
 | 
			
		||||
/apps/md4.c
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Auto generated headers
 | 
			
		||||
/crypto/buildinf.h
 | 
			
		||||
/crypto/opensslconf.h
 | 
			
		||||
 | 
			
		||||
# Auto generated assembly language source files
 | 
			
		||||
*.s
 | 
			
		||||
!/crypto/bn/asm/pa-risc2.s
 | 
			
		||||
!/crypto/bn/asm/pa-risc2W.s
 | 
			
		||||
 | 
			
		||||
# Executables
 | 
			
		||||
/apps/openssl
 | 
			
		||||
/test/sha256t
 | 
			
		||||
/test/sha512t
 | 
			
		||||
/test/*test
 | 
			
		||||
/test/fips_aesavs
 | 
			
		||||
/test/fips_desmovs
 | 
			
		||||
/test/fips_dhvs
 | 
			
		||||
/test/fips_drbgvs
 | 
			
		||||
/test/fips_dssvs
 | 
			
		||||
/test/fips_ecdhvs
 | 
			
		||||
/test/fips_ecdsavs
 | 
			
		||||
/test/fips_rngvs
 | 
			
		||||
/test/fips_test_suite
 | 
			
		||||
*.so*
 | 
			
		||||
*.dylib*
 | 
			
		||||
*.dll*
 | 
			
		||||
# Exceptions
 | 
			
		||||
!/test/bctest
 | 
			
		||||
!/crypto/des/times/486-50.sol
 | 
			
		||||
 | 
			
		||||
# Misc auto generated files
 | 
			
		||||
/tools/c_rehash
 | 
			
		||||
/test/evptests.txt
 | 
			
		||||
lib
 | 
			
		||||
Makefile.save
 | 
			
		||||
*.bak
 | 
			
		||||
							
								
								
									
										125
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								CHANGES
									
									
									
									
									
								
							@@ -2,6 +2,86 @@
 | 
			
		||||
 OpenSSL CHANGES
 | 
			
		||||
 _______________
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0j and 1.0.0k [5 Feb 2013]
 | 
			
		||||
 | 
			
		||||
  *) Make the decoding of SSLv3, TLS and DTLS CBC records constant time.
 | 
			
		||||
 | 
			
		||||
     This addresses the flaw in CBC record processing discovered by 
 | 
			
		||||
     Nadhem Alfardan and Kenny Paterson. Details of this attack can be found
 | 
			
		||||
     at: http://www.isg.rhul.ac.uk/tls/     
 | 
			
		||||
 | 
			
		||||
     Thanks go to Nadhem Alfardan and Kenny Paterson of the Information
 | 
			
		||||
     Security Group at Royal Holloway, University of London
 | 
			
		||||
     (www.isg.rhul.ac.uk) for discovering this flaw and Adam Langley and
 | 
			
		||||
     Emilia K<>sper for the initial patch.
 | 
			
		||||
     (CVE-2013-0169)
 | 
			
		||||
     [Emilia K<>sper, Adam Langley, Ben Laurie, Andy Polyakov, Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Return an error when checking OCSP signatures when key is NULL.
 | 
			
		||||
     This fixes a DoS attack. (CVE-2013-0166)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Call OCSP Stapling callback after ciphersuite has been chosen, so
 | 
			
		||||
     the right response is stapled. Also change SSL_get_certificate()
 | 
			
		||||
     so it returns the certificate actually sent.
 | 
			
		||||
     See http://rt.openssl.org/Ticket/Display.html?id=2836.
 | 
			
		||||
     (This is a backport)
 | 
			
		||||
     [Rob Stradling <rob.stradling@comodo.com>]
 | 
			
		||||
 | 
			
		||||
  *) Fix possible deadlock when decoding public keys.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0i and 1.0.0j [10 May 2012]
 | 
			
		||||
 | 
			
		||||
  *) Sanity check record length before skipping explicit IV in DTLS
 | 
			
		||||
     to fix DoS attack.
 | 
			
		||||
 | 
			
		||||
     Thanks to Codenomicon for discovering this issue using Fuzz-o-Matic
 | 
			
		||||
     fuzzing as a service testing platform.
 | 
			
		||||
     (CVE-2012-2333)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Initialise tkeylen properly when encrypting CMS messages.
 | 
			
		||||
     Thanks to Solar Designer of Openwall for reporting this issue.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0h and 1.0.0i [19 Apr 2012]
 | 
			
		||||
 | 
			
		||||
  *) Check for potentially exploitable overflows in asn1_d2i_read_bio
 | 
			
		||||
     BUF_mem_grow and BUF_mem_grow_clean. Refuse attempts to shrink buffer
 | 
			
		||||
     in CRYPTO_realloc_clean.
 | 
			
		||||
 | 
			
		||||
     Thanks to Tavis Ormandy, Google Security Team, for discovering this
 | 
			
		||||
     issue and to Adam Langley <agl@chromium.org> for fixing it.
 | 
			
		||||
     (CVE-2012-2110)
 | 
			
		||||
     [Adam Langley (Google), Tavis Ormandy, Google Security Team]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0g and 1.0.0h [12 Mar 2012]
 | 
			
		||||
 | 
			
		||||
  *) Fix MMA (Bleichenbacher's attack on PKCS #1 v1.5 RSA padding) weakness
 | 
			
		||||
     in CMS and PKCS7 code. When RSA decryption fails use a random key for
 | 
			
		||||
     content decryption and always return the same error. Note: this attack
 | 
			
		||||
     needs on average 2^20 messages so it only affects automated senders. The
 | 
			
		||||
     old behaviour can be reenabled in the CMS code by setting the
 | 
			
		||||
     CMS_DEBUG_DECRYPT flag: this is useful for debugging and testing where
 | 
			
		||||
     an MMA defence is not necessary.
 | 
			
		||||
     Thanks to Ivan Nestlerode <inestlerode@us.ibm.com> for discovering
 | 
			
		||||
     this issue. (CVE-2012-0884)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Fix CVE-2011-4619: make sure we really are receiving a 
 | 
			
		||||
     client hello before rejecting multiple SGC restarts. Thanks to
 | 
			
		||||
     Ivan Nestlerode <inestlerode@us.ibm.com> for discovering this bug.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0f and 1.0.0g [18 Jan 2012]
 | 
			
		||||
 | 
			
		||||
  *) Fix for DTLS DoS issue introduced by fix for CVE-2011-4109.
 | 
			
		||||
     Thanks to Antonio Martin, Enterprise Secure Access Research and
 | 
			
		||||
     Development, Cisco Systems, Inc. for discovering this bug and
 | 
			
		||||
     preparing a fix. (CVE-2012-0050)
 | 
			
		||||
     [Antonio Martin]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0e and 1.0.0f [4 Jan 2012]
 | 
			
		||||
 | 
			
		||||
  *) Nadhem Alfardan and Kenny Paterson have discovered an extension
 | 
			
		||||
@@ -22,7 +102,9 @@
 | 
			
		||||
     (CVE-2011-4576)
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Only allow one SGC handshake restart for SSL/TLS. (CVE-2011-4619)
 | 
			
		||||
  *) Only allow one SGC handshake restart for SSL/TLS. Thanks to George
 | 
			
		||||
     Kadianakis <desnacked@gmail.com> for discovering this issue and
 | 
			
		||||
     Adam Langley for preparing the fix. (CVE-2011-4619)
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Check parameters are not NULL in GOST ENGINE. (CVE-2012-0027)
 | 
			
		||||
@@ -963,8 +1045,47 @@
 | 
			
		||||
 | 
			
		||||
  *) Change 'Configure' script to enable Camellia by default.
 | 
			
		||||
     [NTT]
 | 
			
		||||
 | 
			
		||||
 Changes between 0.9.8s and 0.9.8t [18 Jan 2012]
 | 
			
		||||
 | 
			
		||||
  *) Fix for DTLS DoS issue introduced by fix for CVE-2011-4109.
 | 
			
		||||
     Thanks to Antonio Martin, Enterprise Secure Access Research and
 | 
			
		||||
     Development, Cisco Systems, Inc. for discovering this bug and
 | 
			
		||||
     preparing a fix. (CVE-2012-0050)
 | 
			
		||||
     [Antonio Martin]
 | 
			
		||||
  
 | 
			
		||||
 Changes between 0.9.8r and 0.9.8s [xx XXX xxxx]
 | 
			
		||||
 Changes between 0.9.8r and 0.9.8s [4 Jan 2012]
 | 
			
		||||
 | 
			
		||||
  *) Nadhem Alfardan and Kenny Paterson have discovered an extension
 | 
			
		||||
     of the Vaudenay padding oracle attack on CBC mode encryption
 | 
			
		||||
     which enables an efficient plaintext recovery attack against
 | 
			
		||||
     the OpenSSL implementation of DTLS. Their attack exploits timing
 | 
			
		||||
     differences arising during decryption processing. A research
 | 
			
		||||
     paper describing this attack can be found at:
 | 
			
		||||
                  http://www.isg.rhul.ac.uk/~kp/dtls.pdf
 | 
			
		||||
     Thanks go to Nadhem Alfardan and Kenny Paterson of the Information
 | 
			
		||||
     Security Group at Royal Holloway, University of London
 | 
			
		||||
     (www.isg.rhul.ac.uk) for discovering this flaw and to Robin Seggelmann
 | 
			
		||||
     <seggelmann@fh-muenster.de> and Michael Tuexen <tuexen@fh-muenster.de>
 | 
			
		||||
     for preparing the fix. (CVE-2011-4108)
 | 
			
		||||
     [Robin Seggelmann, Michael Tuexen]
 | 
			
		||||
 | 
			
		||||
  *) Stop policy check failure freeing same buffer twice. (CVE-2011-4109)
 | 
			
		||||
     [Ben Laurie, Kasper <ekasper@google.com>]
 | 
			
		||||
 | 
			
		||||
  *) Clear bytes used for block padding of SSL 3.0 records.
 | 
			
		||||
     (CVE-2011-4576)
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Only allow one SGC handshake restart for SSL/TLS. Thanks to George
 | 
			
		||||
     Kadianakis <desnacked@gmail.com> for discovering this issue and
 | 
			
		||||
     Adam Langley for preparing the fix. (CVE-2011-4619)
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 
 | 
			
		||||
  *) Prevent malformed RFC3779 data triggering an assertion failure.
 | 
			
		||||
     Thanks to Andrew Chi, BBN Technologies, for discovering the flaw
 | 
			
		||||
     and Rob Austein <sra@hactrn.net> for fixing it. (CVE-2011-4577)
 | 
			
		||||
     [Rob Austein <sra@hactrn.net>]
 | 
			
		||||
 | 
			
		||||
  *) Fix ssl_ciph.c set-up race.
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								Configure
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								Configure
									
									
									
									
									
								
							@@ -167,6 +167,7 @@ my %table=(
 | 
			
		||||
"debug-ben-openbsd","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DOPENSSL_OPENBSD_DEV_CRYPTO -DOPENSSL_NO_ASM -O2 -pedantic -Wall -Wshadow -Werror -pipe::(unknown)::::",
 | 
			
		||||
"debug-ben-openbsd-debug","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DOPENSSL_OPENBSD_DEV_CRYPTO -DOPENSSL_NO_ASM -g3 -O2 -pedantic -Wall -Wshadow -Werror -pipe::(unknown)::::",
 | 
			
		||||
"debug-ben-debug",	"gcc44:$gcc_devteam_warn -DBN_DEBUG -DCONF_DEBUG -DDEBUG_SAFESTACK -DDEBUG_UNUSED -g3 -O2 -pipe::(unknown)::::::",
 | 
			
		||||
"debug-ben-debug-64",	"gcc:$gcc_devteam_warn -Wno-error=overlength-strings -Wno-error=strict-aliasing -Wno-error=uninitialized -DBN_DEBUG -DCONF_DEBUG -DDEBUG_SAFESTACK -DDEBUG_UNUSED -g3 -O3 -pipe::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-ben-no-opt",	"gcc: -Wall -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -DDEBUG_SAFESTACK -DCRYPTO_MDEBUG -Werror -DL_ENDIAN -DTERMIOS -Wall -g3::(unknown)::::::",
 | 
			
		||||
"debug-ben-strict",	"gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DCONST_STRICT -O2 -Wall -Wshadow -Werror -Wpointer-arith -Wcast-qual -Wwrite-strings -pipe::(unknown)::::::",
 | 
			
		||||
"debug-rse","cc:-DTERMIOS -DL_ENDIAN -pipe -O -g -ggdb3 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}",
 | 
			
		||||
@@ -175,10 +176,10 @@ my %table=(
 | 
			
		||||
"debug-steve64", "gcc:$gcc_devteam_warn -m64 -DL_ENDIAN -DTERMIO -DCONF_DEBUG -DDEBUG_SAFESTACK -g -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-steve32", "gcc:$gcc_devteam_warn -m32 -DL_ENDIAN -DCONF_DEBUG -DDEBUG_SAFESTACK -g -pipe::-D_REENTRANT::-rdynamic -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC:-m32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-steve-opt", "gcc:$gcc_devteam_warn -m64 -O3 -DL_ENDIAN -DTERMIO -DCONF_DEBUG -DDEBUG_SAFESTACK -g -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-elf","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-noasm","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-elf-extreme","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-noasm-extreme","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-elf","gcc:-DLEVITTE_DEBUG -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -ggdb -g3 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-noasm","gcc:-DLEVITTE_DEBUG -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -ggdb -g3 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-elf-extreme","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -DPEDANTIC -ggdb -g3 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-noasm-extreme","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -DPEDANTIC -ggdb -g3 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-geoff32","gcc:-DBN_DEBUG -DBN_DEBUG_RAND -DBN_STRICT -DPURIFY -DOPENSSL_NO_DEPRECATED -DOPENSSL_NO_ASM -DOPENSSL_NO_INLINE_ASM -DL_ENDIAN -DTERMIO -DPEDANTIC -DMD32_REG_T=int -O1 -ggdb2 -Wall -Werror -Wundef -pedantic -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wsign-compare -Wmissing-prototypes -Wmissing-declarations -Wno-long-long::-D_REENTRANT::-ldl:BN_LLONG:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-geoff64","gcc:-DBN_DEBUG -DBN_DEBUG_RAND -DBN_STRICT -DPURIFY -DOPENSSL_NO_DEPRECATED -DOPENSSL_NO_ASM -DOPENSSL_NO_INLINE_ASM -DL_ENDIAN -DTERMIO -DPEDANTIC -DMD32_REG_T=int -O1 -ggdb2 -Wall -Werror -Wundef -pedantic -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wsign-compare -Wmissing-prototypes -Wmissing-declarations -Wno-long-long::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-linux-pentium","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -mcpu=pentium -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn",
 | 
			
		||||
@@ -237,7 +238,7 @@ my %table=(
 | 
			
		||||
"solaris-sparcv7-cc","cc:-xO5 -xstrconst -xdepend -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${no_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"solaris-sparcv8-cc","cc:-xarch=v8 -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv8_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"solaris-sparcv9-cc","cc:-xtarget=ultra -xarch=v8plus -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK_LL DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"solaris64-sparcv9-cc","cc:-xtarget=ultra -xarch=v9 -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-xarch=v9 -G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):/usr/ccs/bin/ar rs::/64",
 | 
			
		||||
"solaris64-sparcv9-cc","cc:-xtarget=ultra -xarch=v9 -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-xarch=v9 -G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/64",
 | 
			
		||||
####
 | 
			
		||||
"debug-solaris-sparcv8-cc","cc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG_ALL -xarch=v8 -g -O -xstrconst -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv8_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-solaris-sparcv9-cc","cc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG_ALL -xtarget=ultra -xarch=v8plus -g -O -xstrconst -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK_LL DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", 
 | 
			
		||||
@@ -438,8 +439,8 @@ my %table=(
 | 
			
		||||
"aix64-gcc","gcc:-maix64 -O -DB_ENDIAN::-pthread:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-maix64 -shared -Wl,-G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X64",
 | 
			
		||||
# Below targets assume AIX 5. Idea is to effectively disregard $OBJECT_MODE
 | 
			
		||||
# at build time. $OBJECT_MODE is respected at ./config stage!
 | 
			
		||||
"aix-cc",   "cc:-q32 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded:AIX::BN_LLONG RC4_CHAR:${ppc32_asm}:aix32:dlfcn:aix-shared::-q32 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 32",
 | 
			
		||||
"aix64-cc", "cc:-q64 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-q64 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 64",
 | 
			
		||||
"aix-cc",   "cc:-q32 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded -D_THREAD_SAFE:AIX::BN_LLONG RC4_CHAR:${ppc32_asm}:aix32:dlfcn:aix-shared::-q32 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 32",
 | 
			
		||||
"aix64-cc", "cc:-q64 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded -D_THREAD_SAFE:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-q64 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 64",
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Cray T90 and similar (SDSC)
 | 
			
		||||
@@ -1015,6 +1016,8 @@ foreach (sort (keys %disabled))
 | 
			
		||||
			else
 | 
			
		||||
				{
 | 
			
		||||
				push @skip, $algo;
 | 
			
		||||
				# fix-up crypto/directory name(s)
 | 
			
		||||
				@skip[$#skip]="whrlpool" if $algo eq "whirlpool";
 | 
			
		||||
				print " (skip dir)";
 | 
			
		||||
 | 
			
		||||
				$depflags .= " -DOPENSSL_NO_$ALGO";
 | 
			
		||||
@@ -1415,7 +1418,7 @@ else	{
 | 
			
		||||
	$aes_obj=$aes_enc;
 | 
			
		||||
	}
 | 
			
		||||
$wp_obj="" if ($wp_obj =~ /mmx/ && $processor eq "386");
 | 
			
		||||
if ($wp_obj =~ /\.o$/)
 | 
			
		||||
if ($wp_obj =~ /\.o$/ && !$disabled{"whirlpool"})
 | 
			
		||||
	{
 | 
			
		||||
	$cflags.=" -DWHIRLPOOL_ASM";
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								FAQ
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								FAQ
									
									
									
									
									
								
							@@ -10,6 +10,7 @@ OpenSSL  -  Frequently Asked Questions
 | 
			
		||||
* Why aren't tools like 'autoconf' and 'libtool' used?
 | 
			
		||||
* What is an 'engine' version?
 | 
			
		||||
* How do I check the authenticity of the OpenSSL distribution?
 | 
			
		||||
* How does the versioning scheme work?
 | 
			
		||||
 | 
			
		||||
[LEGAL] Legal questions
 | 
			
		||||
 | 
			
		||||
@@ -82,7 +83,7 @@ OpenSSL  -  Frequently Asked Questions
 | 
			
		||||
* Which is the current version of OpenSSL?
 | 
			
		||||
 | 
			
		||||
The current version is available from <URL: http://www.openssl.org>.
 | 
			
		||||
OpenSSL 1.0.0f was released on Jan 4th, 2012.
 | 
			
		||||
OpenSSL 1.0.1c was released on Feb 5th, 2013.
 | 
			
		||||
 | 
			
		||||
In addition to the current stable release, you can also access daily
 | 
			
		||||
snapshots of the OpenSSL development version at <URL:
 | 
			
		||||
@@ -108,7 +109,9 @@ In addition, you can read the most current versions at
 | 
			
		||||
<URL: http://www.openssl.org/docs/>. Note that the online documents refer
 | 
			
		||||
to the very latest development versions of OpenSSL and may include features
 | 
			
		||||
not present in released versions. If in doubt refer to the documentation
 | 
			
		||||
that came with the version of OpenSSL you are using.
 | 
			
		||||
that came with the version of OpenSSL you are using. The pod format
 | 
			
		||||
documentation is included in each OpenSSL distribution under the docs
 | 
			
		||||
directory.
 | 
			
		||||
 | 
			
		||||
For information on parts of libcrypto that are not yet documented, you
 | 
			
		||||
might want to read Ariel Glenn's documentation on SSLeay 0.9, OpenSSL's
 | 
			
		||||
@@ -173,6 +176,19 @@ just do:
 | 
			
		||||
 | 
			
		||||
   pgp TARBALL.asc
 | 
			
		||||
 | 
			
		||||
* How does the versioning scheme work?
 | 
			
		||||
 | 
			
		||||
After the release of OpenSSL 1.0.0 the versioning scheme changed. Letter 
 | 
			
		||||
releases (e.g. 1.0.1a) can only contain bug and security fixes and no
 | 
			
		||||
new features. Minor releases change the last number (e.g. 1.0.2) and 
 | 
			
		||||
can contain new features that retain binary compatibility. Changes to
 | 
			
		||||
the middle number are considered major releases and neither source nor
 | 
			
		||||
binary compatibility is guaranteed.
 | 
			
		||||
 | 
			
		||||
Therefore the answer to the common question "when will feature X be
 | 
			
		||||
backported to OpenSSL 1.0.0/0.9.8?" is "never" but it could appear
 | 
			
		||||
in the next minor release.
 | 
			
		||||
 | 
			
		||||
[LEGAL] =======================================================================
 | 
			
		||||
 | 
			
		||||
* Do I need patent licenses to use OpenSSL?
 | 
			
		||||
@@ -284,7 +300,7 @@ current directory in this case, but this has changed with 0.9.6a.)
 | 
			
		||||
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).
 | 
			
		||||
extensions documentation (in ca(1), req(1), x509v3_config(5) )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
* Why can't I create certificate requests?
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								Makefile.org
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								Makefile.org
									
									
									
									
									
								
							@@ -172,7 +172,7 @@ CLEARENV=	TOP= && unset TOP $${LIB+LIB} $${LIBS+LIBS}	\
 | 
			
		||||
		$${EXHEADER+EXHEADER} $${HEADER+HEADER}		\
 | 
			
		||||
		$${GENERAL+GENERAL} $${CFLAGS+CFLAGS}		\
 | 
			
		||||
		$${ASFLAGS+ASFLAGS} $${AFLAGS+AFLAGS}		\
 | 
			
		||||
		$${LDCMD+LDCMD} $${LDFLAGS+LDFLAGS}		\
 | 
			
		||||
		$${LDCMD+LDCMD} $${LDFLAGS+LDFLAGS} $${SCRIPTS+SCRIPTS}	\
 | 
			
		||||
		$${SHAREDCMD+SHAREDCMD} $${SHAREDFLAGS+SHAREDFLAGS}	\
 | 
			
		||||
		$${SHARED_LIB+SHARED_LIB} $${LIBEXTRAS+LIBEXTRAS}
 | 
			
		||||
 | 
			
		||||
@@ -322,7 +322,8 @@ libcrypto.pc: Makefile
 | 
			
		||||
	    echo 'Description: OpenSSL cryptography library'; \
 | 
			
		||||
	    echo 'Version: '$(VERSION); \
 | 
			
		||||
	    echo 'Requires: '; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lcrypto $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lcrypto'; \
 | 
			
		||||
	    echo 'Libs.private: $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libcrypto.pc
 | 
			
		||||
 | 
			
		||||
libssl.pc: Makefile
 | 
			
		||||
@@ -335,7 +336,8 @@ libssl.pc: Makefile
 | 
			
		||||
	    echo 'Description: Secure Sockets Layer and cryptography libraries'; \
 | 
			
		||||
	    echo 'Version: '$(VERSION); \
 | 
			
		||||
	    echo 'Requires: '; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lssl -lcrypto'; \
 | 
			
		||||
	    echo 'Libs.private: $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libssl.pc
 | 
			
		||||
 | 
			
		||||
openssl.pc: Makefile
 | 
			
		||||
@@ -348,7 +350,8 @@ openssl.pc: Makefile
 | 
			
		||||
	    echo 'Description: Secure Sockets Layer and cryptography libraries and tools'; \
 | 
			
		||||
	    echo 'Version: '$(VERSION); \
 | 
			
		||||
	    echo 'Requires: '; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lssl -lcrypto'; \
 | 
			
		||||
	    echo 'Libs.private: $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > openssl.pc
 | 
			
		||||
 | 
			
		||||
Makefile: Makefile.org Configure config
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								NEWS
									
									
									
									
									
								
							@@ -5,6 +5,29 @@
 | 
			
		||||
  This file gives a brief overview of the major changes between each OpenSSL
 | 
			
		||||
  release. For more details please read the CHANGES file.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0j and OpenSSL 1.0.0k:
 | 
			
		||||
 | 
			
		||||
      o Fix for SSL/TLS/DTLS CBC plaintext recovery attack CVE-2013-0169
 | 
			
		||||
      o Fix OCSP bad key DoS attack CVE-2013-0166
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0i and OpenSSL 1.0.0j:
 | 
			
		||||
 | 
			
		||||
      o Fix DTLS record length checking bug CVE-2012-2333
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0h and OpenSSL 1.0.0i:
 | 
			
		||||
 | 
			
		||||
      o Fix for ASN1 overflow bug CVE-2012-2110
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0g and OpenSSL 1.0.0h:
 | 
			
		||||
 | 
			
		||||
      o Fix for CMS/PKCS#7 MMA CVE-2012-0884
 | 
			
		||||
      o Corrected fix for CVE-2011-4619
 | 
			
		||||
      o Various DTLS fixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0f and OpenSSL 1.0.0g:
 | 
			
		||||
 | 
			
		||||
      o Fix for DTLS DoS issue CVE-2012-0050
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0e and OpenSSL 1.0.0f:
 | 
			
		||||
 | 
			
		||||
      o Fix for DTLS plaintext recovery attack CVE-2011-4108
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								PROBLEMS
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								PROBLEMS
									
									
									
									
									
								
							@@ -197,3 +197,17 @@ reconfigure with additional no-sse2 [or 386] option passed to ./config.
 | 
			
		||||
We don't have framework to associate -ldl with no-dso, therefore the only
 | 
			
		||||
way is to edit Makefile right after ./config no-dso and remove -ldl from
 | 
			
		||||
EX_LIBS line.
 | 
			
		||||
 | 
			
		||||
* hpux-parisc2-cc no-asm build fails with SEGV in ECDSA/DH.
 | 
			
		||||
 | 
			
		||||
Compiler bug, presumably at particular patch level. Remaining
 | 
			
		||||
hpux*-parisc*-cc configurations can be affected too. Drop optimization
 | 
			
		||||
level to +O2 when compiling bn_nist.o.
 | 
			
		||||
 | 
			
		||||
* solaris64-sparcv9-cc link failure
 | 
			
		||||
 | 
			
		||||
Solaris 8 ar can fail to maintain symbol table in .a, which results in
 | 
			
		||||
link failures. Apply 109147-09 or later or modify Makefile generated
 | 
			
		||||
by ./Configure solaris64-sparcv9-cc and replace RANLIB assignment with
 | 
			
		||||
 | 
			
		||||
	RANLIB= /usr/ccs/bin/ar rs
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								README
									
									
									
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
 | 
			
		||||
 OpenSSL 1.0.0f 4 Jan 2012
 | 
			
		||||
 OpenSSL 1.0.0k 5 Feb 2013
 | 
			
		||||
 | 
			
		||||
 Copyright (c) 1998-2011 The OpenSSL Project
 | 
			
		||||
 Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								STATUS
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								STATUS
									
									
									
									
									
								
							@@ -1,11 +1,16 @@
 | 
			
		||||
 | 
			
		||||
  OpenSSL STATUS                           Last modified at
 | 
			
		||||
  ______________                           $Date: 2012/01/04 17:01:30 $
 | 
			
		||||
  ______________                           $Date: 2012/05/10 14:48:54 $
 | 
			
		||||
 | 
			
		||||
  DEVELOPMENT STATE
 | 
			
		||||
 | 
			
		||||
    o  OpenSSL 1.1.0:  Under development...
 | 
			
		||||
    o  OpenSSL 1.0.1:  Under development...
 | 
			
		||||
    o  OpenSSL 1.0.0k: Released on February   5th, 2013
 | 
			
		||||
    o  OpenSSL 1.0.0j: Released on May       10th, 2012
 | 
			
		||||
    o  OpenSSL 1.0.0i: Released on April     19th, 2012
 | 
			
		||||
    o  OpenSSL 1.0.0h: Released on March     12th, 2012
 | 
			
		||||
    o  OpenSSL 1.0.0g: Released on January   18th, 2012
 | 
			
		||||
    o  OpenSSL 1.0.0f: Released on January    4th, 2012
 | 
			
		||||
    o  OpenSSL 1.0.0e: Released on September  6th, 2011
 | 
			
		||||
    o  OpenSSL 1.0.0d: Released on February   8nd, 2011
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								TABLE
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								TABLE
									
									
									
									
									
								
							@@ -810,7 +810,7 @@ $multilib     =
 | 
			
		||||
$cc           = cc
 | 
			
		||||
$cflags       = -q32 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst
 | 
			
		||||
$unistd       = 
 | 
			
		||||
$thread_cflag = -qthreaded
 | 
			
		||||
$thread_cflag = -qthreaded -D_THREAD_SAFE
 | 
			
		||||
$sys_id       = AIX
 | 
			
		||||
$lflags       = 
 | 
			
		||||
$bn_ops       = BN_LLONG RC4_CHAR
 | 
			
		||||
@@ -903,7 +903,7 @@ $multilib     =
 | 
			
		||||
$cc           = cc
 | 
			
		||||
$cflags       = -q64 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst
 | 
			
		||||
$unistd       = 
 | 
			
		||||
$thread_cflag = -qthreaded
 | 
			
		||||
$thread_cflag = -qthreaded -D_THREAD_SAFE
 | 
			
		||||
$sys_id       = AIX
 | 
			
		||||
$lflags       = 
 | 
			
		||||
$bn_ops       = SIXTY_FOUR_BIT_LONG RC4_CHAR
 | 
			
		||||
@@ -1831,7 +1831,7 @@ $multilib     =
 | 
			
		||||
 | 
			
		||||
*** debug-levitte-linux-elf
 | 
			
		||||
$cc           = gcc
 | 
			
		||||
$cflags       = -DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe
 | 
			
		||||
$cflags       = -DLEVITTE_DEBUG -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -ggdb -g3 -Wall
 | 
			
		||||
$unistd       = 
 | 
			
		||||
$thread_cflag = -D_REENTRANT
 | 
			
		||||
$sys_id       = 
 | 
			
		||||
@@ -1862,7 +1862,7 @@ $multilib     =
 | 
			
		||||
 | 
			
		||||
*** debug-levitte-linux-elf-extreme
 | 
			
		||||
$cc           = gcc
 | 
			
		||||
$cflags       = -DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe
 | 
			
		||||
$cflags       = -DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -DPEDANTIC -ggdb -g3 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe
 | 
			
		||||
$unistd       = 
 | 
			
		||||
$thread_cflag = -D_REENTRANT
 | 
			
		||||
$sys_id       = 
 | 
			
		||||
@@ -1893,7 +1893,7 @@ $multilib     =
 | 
			
		||||
 | 
			
		||||
*** debug-levitte-linux-noasm
 | 
			
		||||
$cc           = gcc
 | 
			
		||||
$cflags       = -DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe
 | 
			
		||||
$cflags       = -DLEVITTE_DEBUG -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -ggdb -g3 -Wall
 | 
			
		||||
$unistd       = 
 | 
			
		||||
$thread_cflag = -D_REENTRANT
 | 
			
		||||
$sys_id       = 
 | 
			
		||||
@@ -1924,7 +1924,7 @@ $multilib     =
 | 
			
		||||
 | 
			
		||||
*** debug-levitte-linux-noasm-extreme
 | 
			
		||||
$cc           = gcc
 | 
			
		||||
$cflags       = -DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe
 | 
			
		||||
$cflags       = -DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -DPEDANTIC -ggdb -g3 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe
 | 
			
		||||
$unistd       = 
 | 
			
		||||
$thread_cflag = -D_REENTRANT
 | 
			
		||||
$sys_id       = 
 | 
			
		||||
@@ -4863,7 +4863,7 @@ $shared_target= solaris-shared
 | 
			
		||||
$shared_cflag = -KPIC
 | 
			
		||||
$shared_ldflag = -xarch=v9 -G -dy -z text
 | 
			
		||||
$shared_extension = .so.$(SHLIB_MAJOR).$(SHLIB_MINOR)
 | 
			
		||||
$ranlib       = /usr/ccs/bin/ar rs
 | 
			
		||||
$ranlib       = 
 | 
			
		||||
$arflags      = 
 | 
			
		||||
$multilib     = /64
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								apps/apps.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								apps/apps.c
									
									
									
									
									
								
							@@ -109,7 +109,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _POSIX_C_SOURCE
 | 
			
		||||
#if !defined(_POSIX_C_SOURCE) && defined(OPENSSL_SYS_VMS)
 | 
			
		||||
#define _POSIX_C_SOURCE 2	/* On VMS, you need to define this to get
 | 
			
		||||
				   the declaration of fileno().  The value
 | 
			
		||||
				   2 is to make sure no function defined
 | 
			
		||||
@@ -1215,7 +1215,8 @@ STACK_OF(X509) *load_certs(BIO *err, const char *file, int format,
 | 
			
		||||
	const char *pass, ENGINE *e, const char *desc)
 | 
			
		||||
	{
 | 
			
		||||
	STACK_OF(X509) *certs;
 | 
			
		||||
	load_certs_crls(err, file, format, pass, e, desc, &certs, NULL);
 | 
			
		||||
	if (!load_certs_crls(err, file, format, pass, e, desc, &certs, NULL))
 | 
			
		||||
		return NULL;
 | 
			
		||||
	return certs;
 | 
			
		||||
	}	
 | 
			
		||||
 | 
			
		||||
@@ -1223,7 +1224,8 @@ STACK_OF(X509_CRL) *load_crls(BIO *err, const char *file, int format,
 | 
			
		||||
	const char *pass, ENGINE *e, const char *desc)
 | 
			
		||||
	{
 | 
			
		||||
	STACK_OF(X509_CRL) *crls;
 | 
			
		||||
	load_certs_crls(err, file, format, pass, e, desc, NULL, &crls);
 | 
			
		||||
	if (!load_certs_crls(err, file, format, pass, e, desc, NULL, &crls))
 | 
			
		||||
		return NULL;
 | 
			
		||||
	return crls;
 | 
			
		||||
	}	
 | 
			
		||||
 | 
			
		||||
@@ -2130,7 +2132,7 @@ X509_NAME *parse_name(char *subject, long chtype, int multirdn)
 | 
			
		||||
	X509_NAME *n = NULL;
 | 
			
		||||
	int nid;
 | 
			
		||||
 | 
			
		||||
	if (!buf || !ne_types || !ne_values)
 | 
			
		||||
	if (!buf || !ne_types || !ne_values || !mval)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio_err, "malloc error\n");
 | 
			
		||||
		goto error;
 | 
			
		||||
@@ -2234,6 +2236,7 @@ X509_NAME *parse_name(char *subject, long chtype, int multirdn)
 | 
			
		||||
	OPENSSL_free(ne_values);
 | 
			
		||||
	OPENSSL_free(ne_types);
 | 
			
		||||
	OPENSSL_free(buf);
 | 
			
		||||
	OPENSSL_free(mval);
 | 
			
		||||
	return n;
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
@@ -2242,6 +2245,8 @@ error:
 | 
			
		||||
		OPENSSL_free(ne_values);
 | 
			
		||||
	if (ne_types)
 | 
			
		||||
		OPENSSL_free(ne_types);
 | 
			
		||||
	if (mval)
 | 
			
		||||
		OPENSSL_free(mval);
 | 
			
		||||
	if (buf)
 | 
			
		||||
		OPENSSL_free(buf);
 | 
			
		||||
	return NULL;
 | 
			
		||||
 
 | 
			
		||||
@@ -2536,7 +2536,7 @@ static int get_certificate_status(const char *serial, CA_DB *db)
 | 
			
		||||
			
 | 
			
		||||
	/* Make it Upper Case */
 | 
			
		||||
	for (i=0; row[DB_serial][i] != '\0'; i++)
 | 
			
		||||
		row[DB_serial][i] = toupper(row[DB_serial][i]);
 | 
			
		||||
		row[DB_serial][i] = toupper((unsigned char)row[DB_serial][i]);
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	ok=1;
 | 
			
		||||
 
 | 
			
		||||
@@ -232,6 +232,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		else if (!strcmp(*args,"-camellia256"))
 | 
			
		||||
				cipher = EVP_camellia_256_cbc();
 | 
			
		||||
#endif
 | 
			
		||||
		else if (!strcmp (*args, "-debug_decrypt")) 
 | 
			
		||||
				flags |= CMS_DEBUG_DECRYPT;
 | 
			
		||||
		else if (!strcmp (*args, "-text")) 
 | 
			
		||||
				flags |= CMS_TEXT;
 | 
			
		||||
		else if (!strcmp (*args, "-nointern")) 
 | 
			
		||||
@@ -618,7 +620,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		BIO_printf (bio_err, "-certsout file certificate output file\n");
 | 
			
		||||
		BIO_printf (bio_err, "-signer file   signer certificate file\n");
 | 
			
		||||
		BIO_printf (bio_err, "-recip  file   recipient certificate file for decryption\n");
 | 
			
		||||
		BIO_printf (bio_err, "-keyid        use subject key identifier\n");
 | 
			
		||||
		BIO_printf (bio_err, "-keyid         use subject key identifier\n");
 | 
			
		||||
		BIO_printf (bio_err, "-in file       input file\n");
 | 
			
		||||
		BIO_printf (bio_err, "-inform arg    input format SMIME (default), PEM or DER\n");
 | 
			
		||||
		BIO_printf (bio_err, "-inkey file    input private key (if not signer or recipient)\n");
 | 
			
		||||
@@ -1020,6 +1022,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	ret = 4;
 | 
			
		||||
	if (operation == SMIME_DECRYPT)
 | 
			
		||||
		{
 | 
			
		||||
		if (flags & CMS_DEBUG_DECRYPT)
 | 
			
		||||
			CMS_decrypt(cms, NULL, NULL, NULL, NULL, flags);
 | 
			
		||||
 | 
			
		||||
		if (secret_key)
 | 
			
		||||
			{
 | 
			
		||||
 
 | 
			
		||||
@@ -332,7 +332,6 @@ bad:
 | 
			
		||||
			BIO_printf(bio_err,"This is going to take a long time\n");
 | 
			
		||||
			if(!dh || !DH_generate_parameters_ex(dh, num, g, &cb))
 | 
			
		||||
				{
 | 
			
		||||
				if(dh) DH_free(dh);
 | 
			
		||||
				ERR_print_errors(bio_err);
 | 
			
		||||
				goto end;
 | 
			
		||||
				}
 | 
			
		||||
 
 | 
			
		||||
@@ -617,7 +617,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		BIO_printf (bio_err, "-ndays n	 	 number of days before next update\n");
 | 
			
		||||
		BIO_printf (bio_err, "-resp_key_id       identify reponse by signing certificate key ID\n");
 | 
			
		||||
		BIO_printf (bio_err, "-nrequest n        number of requests to accept (default unlimited)\n");
 | 
			
		||||
		BIO_printf (bio_err, "-<dgst alg>     use specified digest in the request");
 | 
			
		||||
		BIO_printf (bio_err, "-<dgst alg>     use specified digest in the request\n");
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -440,13 +440,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	char *jpake_secret = NULL;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
 | 
			
		||||
	meth=SSLv23_client_method();
 | 
			
		||||
#elif !defined(OPENSSL_NO_SSL3)
 | 
			
		||||
	meth=SSLv3_client_method();
 | 
			
		||||
#elif !defined(OPENSSL_NO_SSL2)
 | 
			
		||||
	meth=SSLv2_client_method();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	apps_startup();
 | 
			
		||||
	c_Pause=0;
 | 
			
		||||
@@ -581,7 +575,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			psk_key=*(++argv);
 | 
			
		||||
			for (j = 0; j < strlen(psk_key); j++)
 | 
			
		||||
                                {
 | 
			
		||||
                                if (isxdigit((int)psk_key[j]))
 | 
			
		||||
                                if (isxdigit((unsigned char)psk_key[j]))
 | 
			
		||||
                                        continue;
 | 
			
		||||
                                BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
 | 
			
		||||
                                goto bad;
 | 
			
		||||
@@ -749,14 +743,13 @@ bad:
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
		psk_identity = "JPAKE";
 | 
			
		||||
		if (cipher)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
		cipher = "PSK";
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (cipher)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
	cipher = "PSK";
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	OpenSSL_add_ssl_algorithms();
 | 
			
		||||
@@ -1603,6 +1596,8 @@ end:
 | 
			
		||||
		EVP_PKEY_free(key);
 | 
			
		||||
	if (pass)
 | 
			
		||||
		OPENSSL_free(pass);
 | 
			
		||||
	if (vpm)
 | 
			
		||||
		X509_VERIFY_PARAM_free(vpm);
 | 
			
		||||
	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
 | 
			
		||||
	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
 | 
			
		||||
	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
 | 
			
		||||
 
 | 
			
		||||
@@ -872,13 +872,7 @@ int MAIN(int argc, char *argv[])
 | 
			
		||||
	/* by default do not send a PSK identity hint */
 | 
			
		||||
	static char *psk_identity_hint=NULL;
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
 | 
			
		||||
	meth=SSLv23_server_method();
 | 
			
		||||
#elif !defined(OPENSSL_NO_SSL3)
 | 
			
		||||
	meth=SSLv3_server_method();
 | 
			
		||||
#elif !defined(OPENSSL_NO_SSL2)
 | 
			
		||||
	meth=SSLv2_server_method();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	local_argc=argc;
 | 
			
		||||
	local_argv=argv;
 | 
			
		||||
@@ -1103,7 +1097,7 @@ int MAIN(int argc, char *argv[])
 | 
			
		||||
			psk_key=*(++argv);
 | 
			
		||||
			for (i=0; i<strlen(psk_key); i++)
 | 
			
		||||
				{
 | 
			
		||||
				if (isxdigit((int)psk_key[i]))
 | 
			
		||||
				if (isxdigit((unsigned char)psk_key[i]))
 | 
			
		||||
					continue;
 | 
			
		||||
				BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
 | 
			
		||||
				goto bad;
 | 
			
		||||
@@ -1715,7 +1709,15 @@ end:
 | 
			
		||||
		OPENSSL_free(pass);
 | 
			
		||||
	if (dpass)
 | 
			
		||||
		OPENSSL_free(dpass);
 | 
			
		||||
	if (vpm)
 | 
			
		||||
		X509_VERIFY_PARAM_free(vpm);
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
	if (tlscstatp.host)
 | 
			
		||||
		OPENSSL_free(tlscstatp.host);
 | 
			
		||||
	if (tlscstatp.port)
 | 
			
		||||
		OPENSSL_free(tlscstatp.port);
 | 
			
		||||
	if (tlscstatp.path)
 | 
			
		||||
		OPENSSL_free(tlscstatp.path);
 | 
			
		||||
	if (ctx2 != NULL) SSL_CTX_free(ctx2);
 | 
			
		||||
	if (s_cert2)
 | 
			
		||||
		X509_free(s_cert2);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								config
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								config
									
									
									
									
									
								
							@@ -825,9 +825,11 @@ esac
 | 
			
		||||
#  options="$options -DATALLA"
 | 
			
		||||
#fi
 | 
			
		||||
 | 
			
		||||
($CC -Wa,--help -c -o /dev/null -x assembler /dev/null 2>&1 | \
 | 
			
		||||
 grep \\--noexecstack) 2>&1 > /dev/null && \
 | 
			
		||||
if expr "$options" : '.*no\-asm' > /dev/null; then :; else
 | 
			
		||||
  sh -c "$CROSS_COMPILE${CC:-gcc} -Wa,--help -c -o /tmp/null.$$.o -x assembler /dev/null && rm /tmp/null.$$.o" 2>&1 | \
 | 
			
		||||
  grep \\--noexecstack >/dev/null && \
 | 
			
		||||
  options="$options -Wa,--noexecstack"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# gcc < 2.8 does not support -march=ultrasparc
 | 
			
		||||
if [ "$OUT" = solaris-sparcv9-gcc -a $GCCVER -lt 28 ]
 | 
			
		||||
 
 | 
			
		||||
@@ -1176,6 +1176,7 @@ ___
 | 
			
		||||
# As UltraSPARC T1, a.k.a. Niagara, has shared FPU, FP nops can have
 | 
			
		||||
# undesired effect, so just omit them and sacrifice some portion of
 | 
			
		||||
# percent in performance...
 | 
			
		||||
$code =~ s/fmovs.*$//gem;
 | 
			
		||||
$code =~ s/fmovs.*$//gm;
 | 
			
		||||
 | 
			
		||||
print $code;
 | 
			
		||||
close STDOUT;	# ensure flush
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,8 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 | 
			
		||||
die "can't locate x86_64-xlate.pl";
 | 
			
		||||
 | 
			
		||||
open STDOUT,"| $^X $xlate $flavour $output";
 | 
			
		||||
open OUT,"| \"$^X\" $xlate $flavour $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
 | 
			
		||||
$verticalspin=1;	# unlike 32-bit version $verticalspin performs
 | 
			
		||||
			# ~15% better on both AMD and Intel cores
 | 
			
		||||
 
 | 
			
		||||
@@ -57,6 +57,7 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include "cryptlib.h"
 | 
			
		||||
#include <openssl/buffer.h>
 | 
			
		||||
#include <openssl/asn1_mac.h>
 | 
			
		||||
@@ -143,17 +144,11 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
 | 
			
		||||
	BUF_MEM *b;
 | 
			
		||||
	unsigned char *p;
 | 
			
		||||
	int i;
 | 
			
		||||
	int ret=-1;
 | 
			
		||||
	ASN1_const_CTX c;
 | 
			
		||||
	int want=HEADER_SIZE;
 | 
			
		||||
	size_t want=HEADER_SIZE;
 | 
			
		||||
	int eos=0;
 | 
			
		||||
#if defined(__GNUC__) && defined(__ia64)
 | 
			
		||||
	/* pathetic compiler bug in all known versions as of Nov. 2002 */
 | 
			
		||||
	long off=0;
 | 
			
		||||
#else
 | 
			
		||||
	int off=0;
 | 
			
		||||
#endif
 | 
			
		||||
	int len=0;
 | 
			
		||||
	size_t off=0;
 | 
			
		||||
	size_t len=0;
 | 
			
		||||
 | 
			
		||||
	b=BUF_MEM_new();
 | 
			
		||||
	if (b == NULL)
 | 
			
		||||
@@ -169,7 +164,7 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
 | 
			
		||||
			{
 | 
			
		||||
			want-=(len-off);
 | 
			
		||||
 | 
			
		||||
			if (!BUF_MEM_grow_clean(b,len+want))
 | 
			
		||||
			if (len + want < len || !BUF_MEM_grow_clean(b,len+want))
 | 
			
		||||
				{
 | 
			
		||||
				ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ERR_R_MALLOC_FAILURE);
 | 
			
		||||
				goto err;
 | 
			
		||||
@@ -181,7 +176,14 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
 | 
			
		||||
				goto err;
 | 
			
		||||
				}
 | 
			
		||||
			if (i > 0)
 | 
			
		||||
				{
 | 
			
		||||
				if (len+i < len)
 | 
			
		||||
					{
 | 
			
		||||
					ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG);
 | 
			
		||||
					goto err;
 | 
			
		||||
					}
 | 
			
		||||
				len+=i;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		/* else data already loaded */
 | 
			
		||||
 | 
			
		||||
@@ -206,6 +208,11 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
 | 
			
		||||
			{
 | 
			
		||||
			/* no data body so go round again */
 | 
			
		||||
			eos++;
 | 
			
		||||
			if (eos < 0)
 | 
			
		||||
				{
 | 
			
		||||
				ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_HEADER_TOO_LONG);
 | 
			
		||||
				goto err;
 | 
			
		||||
				}
 | 
			
		||||
			want=HEADER_SIZE;
 | 
			
		||||
			}
 | 
			
		||||
		else if (eos && (c.slen == 0) && (c.tag == V_ASN1_EOC))
 | 
			
		||||
@@ -220,10 +227,16 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
 | 
			
		||||
		else 
 | 
			
		||||
			{
 | 
			
		||||
			/* suck in c.slen bytes of data */
 | 
			
		||||
			want=(int)c.slen;
 | 
			
		||||
			want=c.slen;
 | 
			
		||||
			if (want > (len-off))
 | 
			
		||||
				{
 | 
			
		||||
				want-=(len-off);
 | 
			
		||||
				if (want > INT_MAX /* BIO_read takes an int length */ ||
 | 
			
		||||
					len+want < len)
 | 
			
		||||
						{
 | 
			
		||||
						ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG);
 | 
			
		||||
						goto err;
 | 
			
		||||
						}
 | 
			
		||||
				if (!BUF_MEM_grow_clean(b,len+want))
 | 
			
		||||
					{
 | 
			
		||||
					ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ERR_R_MALLOC_FAILURE);
 | 
			
		||||
@@ -238,11 +251,18 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
 | 
			
		||||
						    ASN1_R_NOT_ENOUGH_DATA);
 | 
			
		||||
						goto err;
 | 
			
		||||
						}
 | 
			
		||||
					/* This can't overflow because
 | 
			
		||||
					 * |len+want| didn't overflow. */
 | 
			
		||||
					len+=i;
 | 
			
		||||
					want -= i;
 | 
			
		||||
					want-=i;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			off+=(int)c.slen;
 | 
			
		||||
			if (off + c.slen < off)
 | 
			
		||||
				{
 | 
			
		||||
				ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG);
 | 
			
		||||
				goto err;
 | 
			
		||||
				}
 | 
			
		||||
			off+=c.slen;
 | 
			
		||||
			if (eos <= 0)
 | 
			
		||||
				{
 | 
			
		||||
				break;
 | 
			
		||||
@@ -252,9 +272,15 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (off > INT_MAX)
 | 
			
		||||
		{
 | 
			
		||||
		ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG);
 | 
			
		||||
		goto err;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	*pb = b;
 | 
			
		||||
	return off;
 | 
			
		||||
err:
 | 
			
		||||
	if (b != NULL) BUF_MEM_free(b);
 | 
			
		||||
	return(ret);
 | 
			
		||||
	return -1;
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -386,8 +386,8 @@ long ASN1_INTEGER_get(const ASN1_INTEGER *a)
 | 
			
		||||
	
 | 
			
		||||
	if (a->length > (int)sizeof(long))
 | 
			
		||||
		{
 | 
			
		||||
		/* hmm... a bit ugly */
 | 
			
		||||
		return(0xffffffffL);
 | 
			
		||||
		/* hmm... a bit ugly, return all ones */
 | 
			
		||||
		return -1;
 | 
			
		||||
		}
 | 
			
		||||
	if (a->data == NULL)
 | 
			
		||||
		return 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -567,6 +567,7 @@ int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in)
 | 
			
		||||
	if(mbflag == -1) return -1;
 | 
			
		||||
	mbflag |= MBSTRING_FLAG;
 | 
			
		||||
	stmp.data = NULL;
 | 
			
		||||
	stmp.length = 0;
 | 
			
		||||
	ret = ASN1_mbstring_copy(&str, in->data, in->length, mbflag, B_ASN1_UTF8STRING);
 | 
			
		||||
	if(ret < 0) return ret;
 | 
			
		||||
	*out = stmp.data;
 | 
			
		||||
 
 | 
			
		||||
@@ -136,6 +136,12 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a, ASN1_BIT_STRING *signat
 | 
			
		||||
 | 
			
		||||
	int mdnid, pknid;
 | 
			
		||||
 | 
			
		||||
	if (!pkey)
 | 
			
		||||
		{
 | 
			
		||||
		ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ERR_R_PASSED_NULL_PARAMETER);
 | 
			
		||||
		return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	EVP_MD_CTX_init(&ctx);
 | 
			
		||||
 | 
			
		||||
	/* Convert signature OID into digest and public key OIDs */
 | 
			
		||||
 
 | 
			
		||||
@@ -377,8 +377,12 @@ static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags,
 | 
			
		||||
	BIO *tmpbio;
 | 
			
		||||
	const ASN1_AUX *aux = it->funcs;
 | 
			
		||||
	ASN1_STREAM_ARG sarg;
 | 
			
		||||
	int rv = 1;
 | 
			
		||||
 | 
			
		||||
	if (!(flags & SMIME_DETACHED))
 | 
			
		||||
	/* If data is not deteched or resigning then the output BIO is
 | 
			
		||||
	 * already set up to finalise when it is written through.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!(flags & SMIME_DETACHED) || (flags & PKCS7_REUSE_DIGEST))
 | 
			
		||||
		{
 | 
			
		||||
		SMIME_crlf_copy(data, out, flags);
 | 
			
		||||
		return 1;
 | 
			
		||||
@@ -405,7 +409,7 @@ static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags,
 | 
			
		||||
 | 
			
		||||
	/* Finalize structure */
 | 
			
		||||
	if (aux->asn1_cb(ASN1_OP_DETACHED_POST, &val, it, &sarg) <= 0)
 | 
			
		||||
		return 0;
 | 
			
		||||
		rv = 0;
 | 
			
		||||
 | 
			
		||||
	/* Now remove any digests prepended to the BIO */
 | 
			
		||||
 | 
			
		||||
@@ -416,7 +420,7 @@ static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags,
 | 
			
		||||
		sarg.ndef_bio = tmpbio;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
	return rv;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -486,9 +490,9 @@ ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it)
 | 
			
		||||
 | 
			
		||||
		if(strcmp(hdr->value, "application/x-pkcs7-signature") &&
 | 
			
		||||
			strcmp(hdr->value, "application/pkcs7-signature")) {
 | 
			
		||||
			sk_MIME_HEADER_pop_free(headers, mime_hdr_free);
 | 
			
		||||
			ASN1err(ASN1_F_SMIME_READ_ASN1,ASN1_R_SIG_INVALID_MIME_TYPE);
 | 
			
		||||
			ERR_add_error_data(2, "type: ", hdr->value);
 | 
			
		||||
			sk_MIME_HEADER_pop_free(headers, mime_hdr_free);
 | 
			
		||||
			sk_BIO_pop_free(parts, BIO_vfree);
 | 
			
		||||
			return NULL;
 | 
			
		||||
		}
 | 
			
		||||
@@ -801,7 +805,7 @@ static MIME_HEADER *mime_hdr_new(char *name, char *value)
 | 
			
		||||
	if(name) {
 | 
			
		||||
		if(!(tmpname = BUF_strdup(name))) return NULL;
 | 
			
		||||
		for(p = tmpname ; *p; p++) {
 | 
			
		||||
			c = *p;
 | 
			
		||||
			c = (unsigned char)*p;
 | 
			
		||||
			if(isupper(c)) {
 | 
			
		||||
				c = tolower(c);
 | 
			
		||||
				*p = c;
 | 
			
		||||
@@ -811,7 +815,7 @@ static MIME_HEADER *mime_hdr_new(char *name, char *value)
 | 
			
		||||
	if(value) {
 | 
			
		||||
		if(!(tmpval = BUF_strdup(value))) return NULL;
 | 
			
		||||
		for(p = tmpval ; *p; p++) {
 | 
			
		||||
			c = *p;
 | 
			
		||||
			c = (unsigned char)*p;
 | 
			
		||||
			if(isupper(c)) {
 | 
			
		||||
				c = tolower(c);
 | 
			
		||||
				*p = c;
 | 
			
		||||
@@ -835,7 +839,7 @@ static int mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value)
 | 
			
		||||
		tmpname = BUF_strdup(name);
 | 
			
		||||
		if(!tmpname) return 0;
 | 
			
		||||
		for(p = tmpname ; *p; p++) {
 | 
			
		||||
			c = *p;
 | 
			
		||||
			c = (unsigned char)*p;
 | 
			
		||||
			if(isupper(c)) {
 | 
			
		||||
				c = tolower(c);
 | 
			
		||||
				*p = c;
 | 
			
		||||
@@ -858,12 +862,17 @@ static int mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value)
 | 
			
		||||
static int mime_hdr_cmp(const MIME_HEADER * const *a,
 | 
			
		||||
			const MIME_HEADER * const *b)
 | 
			
		||||
{
 | 
			
		||||
	if (!(*a)->name || !(*b)->name)
 | 
			
		||||
		return !!(*a)->name - !!(*b)->name;
 | 
			
		||||
 | 
			
		||||
	return(strcmp((*a)->name, (*b)->name));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int mime_param_cmp(const MIME_PARAM * const *a,
 | 
			
		||||
			const MIME_PARAM * const *b)
 | 
			
		||||
{
 | 
			
		||||
	if (!(*a)->param_name || !(*b)->param_name)
 | 
			
		||||
		return !!(*a)->param_name - !!(*b)->param_name;
 | 
			
		||||
	return(strcmp((*a)->param_name, (*b)->param_name));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -140,7 +140,7 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, unsigned long cflag)
 | 
			
		||||
		if (bs->length <= 4)
 | 
			
		||||
			{
 | 
			
		||||
			l=ASN1_INTEGER_get(bs);
 | 
			
		||||
			if (l < 0)
 | 
			
		||||
			if (bs->type == V_ASN1_NEG_INTEGER)
 | 
			
		||||
				{
 | 
			
		||||
				l= -l;
 | 
			
		||||
				neg="-";
 | 
			
		||||
 
 | 
			
		||||
@@ -446,11 +446,11 @@ static int asn1_print_fsname(BIO *out, int indent,
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int asn1_print_boolean_ctx(BIO *out, const int bool,
 | 
			
		||||
static int asn1_print_boolean_ctx(BIO *out, int boolval,
 | 
			
		||||
							const ASN1_PCTX *pctx)
 | 
			
		||||
	{
 | 
			
		||||
	const char *str;
 | 
			
		||||
	switch (bool)
 | 
			
		||||
	switch (boolval)
 | 
			
		||||
		{
 | 
			
		||||
		case -1:
 | 
			
		||||
		str = "BOOL ABSENT";
 | 
			
		||||
@@ -574,10 +574,10 @@ static int asn1_primitive_print(BIO *out, ASN1_VALUE **fld,
 | 
			
		||||
		{
 | 
			
		||||
		case V_ASN1_BOOLEAN:
 | 
			
		||||
			{
 | 
			
		||||
			int bool = *(int *)fld;
 | 
			
		||||
			if (bool == -1)
 | 
			
		||||
				bool = it->size;
 | 
			
		||||
			ret = asn1_print_boolean_ctx(out, bool, pctx);
 | 
			
		||||
			int boolval = *(int *)fld;
 | 
			
		||||
			if (boolval == -1)
 | 
			
		||||
				boolval = it->size;
 | 
			
		||||
			ret = asn1_print_boolean_ctx(out, boolval, pctx);
 | 
			
		||||
			}
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -399,8 +399,7 @@ static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in)
 | 
			
		||||
	/* If type not in bitmask just copy string across */
 | 
			
		||||
	if (!(ASN1_tag2bit(in->type) & ASN1_MASK_CANON))
 | 
			
		||||
		{
 | 
			
		||||
		out->type = in->type;
 | 
			
		||||
		if (!ASN1_STRING_set(out, in->data, in->length))
 | 
			
		||||
		if (!ASN1_STRING_copy(out, in))
 | 
			
		||||
			return 0;
 | 
			
		||||
		return 1;
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -171,7 +171,19 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key)
 | 
			
		||||
		goto error;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	key->pkey = ret;
 | 
			
		||||
	/* Check to see if another thread set key->pkey first */
 | 
			
		||||
	CRYPTO_w_lock(CRYPTO_LOCK_EVP_PKEY);
 | 
			
		||||
	if (key->pkey)
 | 
			
		||||
		{
 | 
			
		||||
		CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY);
 | 
			
		||||
		EVP_PKEY_free(ret);
 | 
			
		||||
		ret = key->pkey;
 | 
			
		||||
		}
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
		key->pkey = ret;
 | 
			
		||||
		CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY);
 | 
			
		||||
		}
 | 
			
		||||
	CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_EVP_PKEY);
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
 
 | 
			
		||||
@@ -960,7 +960,6 @@ int BIO_set_tcp_ndelay(int s, int on)
 | 
			
		||||
#endif
 | 
			
		||||
	return(ret == 0);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int BIO_socket_nbio(int s, int mode)
 | 
			
		||||
	{
 | 
			
		||||
@@ -973,3 +972,4 @@ int BIO_socket_nbio(int s, int mode)
 | 
			
		||||
#endif
 | 
			
		||||
	return(ret == 0);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -146,6 +146,7 @@ extern "C" {
 | 
			
		||||
/* #endif */
 | 
			
		||||
 | 
			
		||||
#define BIO_CTRL_DGRAM_QUERY_MTU          40 /* as kernel for current MTU */
 | 
			
		||||
#define BIO_CTRL_DGRAM_GET_FALLBACK_MTU   47
 | 
			
		||||
#define BIO_CTRL_DGRAM_GET_MTU            41 /* get cached value for MTU */
 | 
			
		||||
#define BIO_CTRL_DGRAM_SET_MTU            42 /* set cached value for
 | 
			
		||||
					      * MTU. want to use this
 | 
			
		||||
 
 | 
			
		||||
@@ -521,40 +521,40 @@ void BIO_free_all(BIO *bio)
 | 
			
		||||
 | 
			
		||||
BIO *BIO_dup_chain(BIO *in)
 | 
			
		||||
	{
 | 
			
		||||
	BIO *ret=NULL,*eoc=NULL,*bio,*new;
 | 
			
		||||
	BIO *ret=NULL,*eoc=NULL,*bio,*new_bio;
 | 
			
		||||
 | 
			
		||||
	for (bio=in; bio != NULL; bio=bio->next_bio)
 | 
			
		||||
		{
 | 
			
		||||
		if ((new=BIO_new(bio->method)) == NULL) goto err;
 | 
			
		||||
		new->callback=bio->callback;
 | 
			
		||||
		new->cb_arg=bio->cb_arg;
 | 
			
		||||
		new->init=bio->init;
 | 
			
		||||
		new->shutdown=bio->shutdown;
 | 
			
		||||
		new->flags=bio->flags;
 | 
			
		||||
		if ((new_bio=BIO_new(bio->method)) == NULL) goto err;
 | 
			
		||||
		new_bio->callback=bio->callback;
 | 
			
		||||
		new_bio->cb_arg=bio->cb_arg;
 | 
			
		||||
		new_bio->init=bio->init;
 | 
			
		||||
		new_bio->shutdown=bio->shutdown;
 | 
			
		||||
		new_bio->flags=bio->flags;
 | 
			
		||||
 | 
			
		||||
		/* This will let SSL_s_sock() work with stdin/stdout */
 | 
			
		||||
		new->num=bio->num;
 | 
			
		||||
		new_bio->num=bio->num;
 | 
			
		||||
 | 
			
		||||
		if (!BIO_dup_state(bio,(char *)new))
 | 
			
		||||
		if (!BIO_dup_state(bio,(char *)new_bio))
 | 
			
		||||
			{
 | 
			
		||||
			BIO_free(new);
 | 
			
		||||
			BIO_free(new_bio);
 | 
			
		||||
			goto err;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		/* copy app data */
 | 
			
		||||
		if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new->ex_data,
 | 
			
		||||
		if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new_bio->ex_data,
 | 
			
		||||
					&bio->ex_data))
 | 
			
		||||
			goto err;
 | 
			
		||||
 | 
			
		||||
		if (ret == NULL)
 | 
			
		||||
			{
 | 
			
		||||
			eoc=new;
 | 
			
		||||
			eoc=new_bio;
 | 
			
		||||
			ret=eoc;
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
			BIO_push(eoc,new);
 | 
			
		||||
			eoc=new;
 | 
			
		||||
			BIO_push(eoc,new_bio);
 | 
			
		||||
			eoc=new_bio;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	return(ret);
 | 
			
		||||
 
 | 
			
		||||
@@ -186,7 +186,7 @@ static void dgram_adjust_rcv_timeout(BIO *b)
 | 
			
		||||
	{
 | 
			
		||||
#if defined(SO_RCVTIMEO)
 | 
			
		||||
	bio_dgram_data *data = (bio_dgram_data *)b->ptr;
 | 
			
		||||
	int sz = sizeof(int);
 | 
			
		||||
	union { size_t s; int i; } sz = {0};
 | 
			
		||||
 | 
			
		||||
	/* Is a timer active? */
 | 
			
		||||
	if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0)
 | 
			
		||||
@@ -196,8 +196,10 @@ static void dgram_adjust_rcv_timeout(BIO *b)
 | 
			
		||||
		/* Read current socket timeout */
 | 
			
		||||
#ifdef OPENSSL_SYS_WINDOWS
 | 
			
		||||
		int timeout;
 | 
			
		||||
 | 
			
		||||
		sz.i = sizeof(timeout);
 | 
			
		||||
		if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
 | 
			
		||||
					   (void*)&timeout, &sz) < 0)
 | 
			
		||||
					   (void*)&timeout, &sz.i) < 0)
 | 
			
		||||
			{ perror("getsockopt"); }
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
@@ -205,9 +207,12 @@ static void dgram_adjust_rcv_timeout(BIO *b)
 | 
			
		||||
			data->socket_timeout.tv_usec = (timeout % 1000) * 1000;
 | 
			
		||||
			}
 | 
			
		||||
#else
 | 
			
		||||
		sz.i = sizeof(data->socket_timeout);
 | 
			
		||||
		if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 
 | 
			
		||||
						&(data->socket_timeout), (void *)&sz) < 0)
 | 
			
		||||
			{ perror("getsockopt"); }
 | 
			
		||||
		else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
 | 
			
		||||
			OPENSSL_assert(sz.s<=sizeof(data->socket_timeout));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		/* Get current time */
 | 
			
		||||
@@ -376,11 +381,10 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
	int *ip;
 | 
			
		||||
	struct sockaddr *to = NULL;
 | 
			
		||||
	bio_dgram_data *data = NULL;
 | 
			
		||||
#if defined(IP_MTU_DISCOVER) || defined(IP_MTU)
 | 
			
		||||
	long sockopt_val = 0;
 | 
			
		||||
	unsigned int sockopt_len = 0;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef OPENSSL_SYS_LINUX
 | 
			
		||||
#if defined(OPENSSL_SYS_LINUX) && (defined(IP_MTU_DISCOVER) || defined(IP_MTU))
 | 
			
		||||
	int sockopt_val = 0;
 | 
			
		||||
	socklen_t sockopt_len;	/* assume that system supporting IP_MTU is
 | 
			
		||||
				 * modern enough to define socklen_t */
 | 
			
		||||
	socklen_t addr_len;
 | 
			
		||||
	union	{
 | 
			
		||||
		struct sockaddr	sa;
 | 
			
		||||
@@ -462,7 +466,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
		break;
 | 
			
		||||
		/* (Linux)kernel sets DF bit on outgoing IP packets */
 | 
			
		||||
	case BIO_CTRL_DGRAM_MTU_DISCOVER:
 | 
			
		||||
#ifdef OPENSSL_SYS_LINUX
 | 
			
		||||
#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO)
 | 
			
		||||
		addr_len = (socklen_t)sizeof(addr);
 | 
			
		||||
		memset((void *)&addr, 0, sizeof(addr));
 | 
			
		||||
		if (getsockname(b->num, &addr.sa, &addr_len) < 0)
 | 
			
		||||
@@ -470,7 +474,6 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
			ret = 0;
 | 
			
		||||
			break;
 | 
			
		||||
			}
 | 
			
		||||
		sockopt_len = sizeof(sockopt_val);
 | 
			
		||||
		switch (addr.sa.sa_family)
 | 
			
		||||
			{
 | 
			
		||||
		case AF_INET:
 | 
			
		||||
@@ -479,7 +482,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
				&sockopt_val, sizeof(sockopt_val))) < 0)
 | 
			
		||||
				perror("setsockopt");
 | 
			
		||||
			break;
 | 
			
		||||
#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER)
 | 
			
		||||
#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO)
 | 
			
		||||
		case AF_INET6:
 | 
			
		||||
			sockopt_val = IPV6_PMTUDISC_DO;
 | 
			
		||||
			if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
 | 
			
		||||
@@ -496,7 +499,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
		break;
 | 
			
		||||
#endif
 | 
			
		||||
	case BIO_CTRL_DGRAM_QUERY_MTU:
 | 
			
		||||
#ifdef OPENSSL_SYS_LINUX
 | 
			
		||||
#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU)
 | 
			
		||||
		addr_len = (socklen_t)sizeof(addr);
 | 
			
		||||
		memset((void *)&addr, 0, sizeof(addr));
 | 
			
		||||
		if (getsockname(b->num, &addr.sa, &addr_len) < 0)
 | 
			
		||||
@@ -547,6 +550,27 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
		ret = 0;
 | 
			
		||||
#endif
 | 
			
		||||
		break;
 | 
			
		||||
	case BIO_CTRL_DGRAM_GET_FALLBACK_MTU:
 | 
			
		||||
		switch (data->peer.sa.sa_family)
 | 
			
		||||
			{
 | 
			
		||||
			case AF_INET:
 | 
			
		||||
				ret = 576 - 20 - 8;
 | 
			
		||||
				break;
 | 
			
		||||
#if OPENSSL_USE_IPV6
 | 
			
		||||
			case AF_INET6:
 | 
			
		||||
#ifdef IN6_IS_ADDR_V4MAPPED
 | 
			
		||||
				if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr))
 | 
			
		||||
					ret = 576 - 20 - 8;
 | 
			
		||||
				else
 | 
			
		||||
#endif
 | 
			
		||||
					ret = 1280 - 40 - 8;
 | 
			
		||||
				break;
 | 
			
		||||
#endif
 | 
			
		||||
			default:
 | 
			
		||||
				ret = 576 - 20 - 8;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		break;
 | 
			
		||||
	case BIO_CTRL_DGRAM_GET_MTU:
 | 
			
		||||
		return data->mtu;
 | 
			
		||||
		break;
 | 
			
		||||
@@ -637,12 +661,15 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
#endif
 | 
			
		||||
		break;
 | 
			
		||||
	case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
 | 
			
		||||
#ifdef OPENSSL_SYS_WINDOWS
 | 
			
		||||
		{
 | 
			
		||||
		int timeout, sz = sizeof(timeout);
 | 
			
		||||
		union { size_t s; int i; } sz = {0};
 | 
			
		||||
#ifdef OPENSSL_SYS_WINDOWS
 | 
			
		||||
		int timeout;
 | 
			
		||||
		struct timeval *tv = (struct timeval *)ptr;
 | 
			
		||||
 | 
			
		||||
		sz.i = sizeof(timeout);
 | 
			
		||||
		if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
 | 
			
		||||
			(void*)&timeout, &sz) < 0)
 | 
			
		||||
			(void*)&timeout, &sz.i) < 0)
 | 
			
		||||
			{ perror("getsockopt"); ret = -1; }
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
@@ -650,12 +677,20 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
			tv->tv_usec = (timeout % 1000) * 1000;
 | 
			
		||||
			ret = sizeof(*tv);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
#else
 | 
			
		||||
		sz.i = sizeof(struct timeval);
 | 
			
		||||
		if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 
 | 
			
		||||
			ptr, (void *)&ret) < 0)
 | 
			
		||||
			ptr, (void *)&sz) < 0)
 | 
			
		||||
			{ perror("getsockopt"); ret = -1; }
 | 
			
		||||
		else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
 | 
			
		||||
			{
 | 
			
		||||
			OPENSSL_assert(sz.s<=sizeof(struct timeval));
 | 
			
		||||
			ret = (int)sz.s;
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			ret = sz.i;
 | 
			
		||||
#endif
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(SO_SNDTIMEO)
 | 
			
		||||
@@ -675,12 +710,15 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
#endif
 | 
			
		||||
		break;
 | 
			
		||||
	case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
 | 
			
		||||
#ifdef OPENSSL_SYS_WINDOWS
 | 
			
		||||
		{
 | 
			
		||||
		int timeout, sz = sizeof(timeout);
 | 
			
		||||
		union { size_t s; int i; } sz = {0};
 | 
			
		||||
#ifdef OPENSSL_SYS_WINDOWS
 | 
			
		||||
		int timeout;
 | 
			
		||||
		struct timeval *tv = (struct timeval *)ptr;
 | 
			
		||||
 | 
			
		||||
		sz.i = sizeof(timeout);
 | 
			
		||||
		if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
 | 
			
		||||
			(void*)&timeout, &sz) < 0)
 | 
			
		||||
			(void*)&timeout, &sz.i) < 0)
 | 
			
		||||
			{ perror("getsockopt"); ret = -1; }
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
@@ -688,12 +726,20 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
			tv->tv_usec = (timeout % 1000) * 1000;
 | 
			
		||||
			ret = sizeof(*tv);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
#else
 | 
			
		||||
		sz.i = sizeof(struct timeval);
 | 
			
		||||
		if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 
 | 
			
		||||
			ptr, (void *)&ret) < 0)
 | 
			
		||||
			ptr, (void *)&sz) < 0)
 | 
			
		||||
			{ perror("getsockopt"); ret = -1; }
 | 
			
		||||
		else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
 | 
			
		||||
			{
 | 
			
		||||
			OPENSSL_assert(sz.s<=sizeof(struct timeval));
 | 
			
		||||
			ret = (int)sz.s;
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			ret = sz.i;
 | 
			
		||||
#endif
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
#endif
 | 
			
		||||
	case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,8 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 | 
			
		||||
die "can't locate x86_64-xlate.pl";
 | 
			
		||||
 | 
			
		||||
open STDOUT,"| $^X $xlate $flavour $output";
 | 
			
		||||
open OUT,"| \"$^X\" $xlate $flavour $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
 | 
			
		||||
# int bn_mul_mont(
 | 
			
		||||
$rp="%rdi";	# BN_ULONG *rp,
 | 
			
		||||
 
 | 
			
		||||
@@ -144,26 +144,17 @@ int BN_add_word(BIGNUM *a, BN_ULONG w)
 | 
			
		||||
			a->neg=!(a->neg);
 | 
			
		||||
		return(i);
 | 
			
		||||
		}
 | 
			
		||||
	/* Only expand (and risk failing) if it's possibly necessary */
 | 
			
		||||
	if (((BN_ULONG)(a->d[a->top - 1] + 1) == 0) &&
 | 
			
		||||
			(bn_wexpand(a,a->top+1) == NULL))
 | 
			
		||||
		return(0);
 | 
			
		||||
	i=0;
 | 
			
		||||
	for (;;)
 | 
			
		||||
	for (i=0;w!=0 && i<a->top;i++)
 | 
			
		||||
		{
 | 
			
		||||
		if (i >= a->top)
 | 
			
		||||
			l=w;
 | 
			
		||||
		else
 | 
			
		||||
			l=(a->d[i]+w)&BN_MASK2;
 | 
			
		||||
		a->d[i]=l;
 | 
			
		||||
		if (w > l)
 | 
			
		||||
			w=1;
 | 
			
		||||
		else
 | 
			
		||||
			break;
 | 
			
		||||
		i++;
 | 
			
		||||
		a->d[i] = l = (a->d[i]+w)&BN_MASK2;
 | 
			
		||||
		w = (w>l)?1:0;
 | 
			
		||||
		}
 | 
			
		||||
	if (i >= a->top)
 | 
			
		||||
	if (w && i==a->top)
 | 
			
		||||
		{
 | 
			
		||||
		if (bn_wexpand(a,a->top+1) == NULL) return 0;
 | 
			
		||||
		a->top++;
 | 
			
		||||
		a->d[i]=w;
 | 
			
		||||
		}
 | 
			
		||||
	bn_check_top(a);
 | 
			
		||||
	return(1);
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -60,6 +60,11 @@
 | 
			
		||||
#include "cryptlib.h"
 | 
			
		||||
#include <openssl/buffer.h>
 | 
			
		||||
 | 
			
		||||
/* LIMIT_BEFORE_EXPANSION is the maximum n such that (n+3)/3*4 < 2**31. That
 | 
			
		||||
 * function is applied in several functions in this file and this limit ensures
 | 
			
		||||
 * that the result fits in an int. */
 | 
			
		||||
#define LIMIT_BEFORE_EXPANSION 0x5ffffffc
 | 
			
		||||
 | 
			
		||||
BUF_MEM *BUF_MEM_new(void)
 | 
			
		||||
	{
 | 
			
		||||
	BUF_MEM *ret;
 | 
			
		||||
@@ -105,6 +110,12 @@ int BUF_MEM_grow(BUF_MEM *str, size_t len)
 | 
			
		||||
		str->length=len;
 | 
			
		||||
		return(len);
 | 
			
		||||
		}
 | 
			
		||||
	/* This limit is sufficient to ensure (len+3)/3*4 < 2**31 */
 | 
			
		||||
	if (len > LIMIT_BEFORE_EXPANSION)
 | 
			
		||||
		{
 | 
			
		||||
		BUFerr(BUF_F_BUF_MEM_GROW,ERR_R_MALLOC_FAILURE);
 | 
			
		||||
		return 0;
 | 
			
		||||
		}
 | 
			
		||||
	n=(len+3)/3*4;
 | 
			
		||||
	if (str->data == NULL)
 | 
			
		||||
		ret=OPENSSL_malloc(n);
 | 
			
		||||
@@ -142,6 +153,12 @@ int BUF_MEM_grow_clean(BUF_MEM *str, size_t len)
 | 
			
		||||
		str->length=len;
 | 
			
		||||
		return(len);
 | 
			
		||||
		}
 | 
			
		||||
	/* This limit is sufficient to ensure (len+3)/3*4 < 2**31 */
 | 
			
		||||
	if (len > LIMIT_BEFORE_EXPANSION)
 | 
			
		||||
		{
 | 
			
		||||
		BUFerr(BUF_F_BUF_MEM_GROW_CLEAN,ERR_R_MALLOC_FAILURE);
 | 
			
		||||
		return 0;
 | 
			
		||||
		}
 | 
			
		||||
	n=(len+3)/3*4;
 | 
			
		||||
	if (str->data == NULL)
 | 
			
		||||
		ret=OPENSSL_malloc(n);
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,8 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 | 
			
		||||
die "can't locate x86_64-xlate.pl";
 | 
			
		||||
 | 
			
		||||
open STDOUT,"| $^X $xlate $flavour $output";
 | 
			
		||||
open OUT,"| \"$^X\" $xlate $flavour $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
 | 
			
		||||
sub hi() { my $r=shift; $r =~ s/%[er]([a-d])x/%\1h/;    $r; }
 | 
			
		||||
sub lo() { my $r=shift; $r =~ s/%[er]([a-d])x/%\1l/;
 | 
			
		||||
 
 | 
			
		||||
@@ -111,6 +111,7 @@ DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo)
 | 
			
		||||
#define CMS_PARTIAL			0x4000
 | 
			
		||||
#define CMS_REUSE_DIGEST		0x8000
 | 
			
		||||
#define CMS_USE_KEYID			0x10000
 | 
			
		||||
#define CMS_DEBUG_DECRYPT		0x20000
 | 
			
		||||
 | 
			
		||||
const ASN1_OBJECT *CMS_get0_type(CMS_ContentInfo *cms);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -58,7 +58,9 @@
 | 
			
		||||
#include <openssl/err.h>
 | 
			
		||||
#include <openssl/cms.h>
 | 
			
		||||
#include <openssl/bio.h>
 | 
			
		||||
#ifndef OPENSSL_NO_COMP
 | 
			
		||||
#include <openssl/comp.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include "cms_lcl.h"
 | 
			
		||||
 | 
			
		||||
DECLARE_ASN1_ITEM(CMS_CompressedData)
 | 
			
		||||
 
 | 
			
		||||
@@ -73,6 +73,8 @@ BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec)
 | 
			
		||||
	const EVP_CIPHER *ciph;
 | 
			
		||||
	X509_ALGOR *calg = ec->contentEncryptionAlgorithm;
 | 
			
		||||
	unsigned char iv[EVP_MAX_IV_LENGTH], *piv = NULL;
 | 
			
		||||
	unsigned char *tkey = NULL;
 | 
			
		||||
	size_t tkeylen = 0;
 | 
			
		||||
 | 
			
		||||
	int ok = 0;
 | 
			
		||||
 | 
			
		||||
@@ -137,32 +139,57 @@ BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec)
 | 
			
		||||
				CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR);
 | 
			
		||||
		goto err;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	if (enc && !ec->key)
 | 
			
		||||
	tkeylen = EVP_CIPHER_CTX_key_length(ctx);
 | 
			
		||||
	/* Generate random session key */
 | 
			
		||||
	if (!enc || !ec->key)
 | 
			
		||||
		{
 | 
			
		||||
		/* Generate random key */
 | 
			
		||||
		if (!ec->keylen)
 | 
			
		||||
			ec->keylen = EVP_CIPHER_CTX_key_length(ctx);
 | 
			
		||||
		ec->key = OPENSSL_malloc(ec->keylen);
 | 
			
		||||
		if (!ec->key)
 | 
			
		||||
		tkey = OPENSSL_malloc(tkeylen);
 | 
			
		||||
		if (!tkey)
 | 
			
		||||
			{
 | 
			
		||||
			CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO,
 | 
			
		||||
							ERR_R_MALLOC_FAILURE);
 | 
			
		||||
			goto err;
 | 
			
		||||
			}
 | 
			
		||||
		if (EVP_CIPHER_CTX_rand_key(ctx, ec->key) <= 0)
 | 
			
		||||
		if (EVP_CIPHER_CTX_rand_key(ctx, tkey) <= 0)
 | 
			
		||||
			goto err;
 | 
			
		||||
		keep_key = 1;
 | 
			
		||||
		}
 | 
			
		||||
	else if (ec->keylen != (unsigned int)EVP_CIPHER_CTX_key_length(ctx))
 | 
			
		||||
 | 
			
		||||
	if (!ec->key)
 | 
			
		||||
		{
 | 
			
		||||
		ec->key = tkey;
 | 
			
		||||
		ec->keylen = tkeylen;
 | 
			
		||||
		tkey = NULL;
 | 
			
		||||
		if (enc)
 | 
			
		||||
			keep_key = 1;
 | 
			
		||||
		else
 | 
			
		||||
			ERR_clear_error();
 | 
			
		||||
		
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (ec->keylen != tkeylen)
 | 
			
		||||
		{
 | 
			
		||||
		/* If necessary set key length */
 | 
			
		||||
		if (EVP_CIPHER_CTX_set_key_length(ctx, ec->keylen) <= 0)
 | 
			
		||||
			{
 | 
			
		||||
			CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO,
 | 
			
		||||
				CMS_R_INVALID_KEY_LENGTH);
 | 
			
		||||
			goto err;
 | 
			
		||||
			/* Only reveal failure if debugging so we don't
 | 
			
		||||
			 * leak information which may be useful in MMA.
 | 
			
		||||
			 */
 | 
			
		||||
			if (enc || ec->debug)
 | 
			
		||||
				{
 | 
			
		||||
				CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO,
 | 
			
		||||
						CMS_R_INVALID_KEY_LENGTH);
 | 
			
		||||
				goto err;
 | 
			
		||||
				}
 | 
			
		||||
			else
 | 
			
		||||
				{
 | 
			
		||||
				/* Use random key */
 | 
			
		||||
				OPENSSL_cleanse(ec->key, ec->keylen);
 | 
			
		||||
				OPENSSL_free(ec->key);
 | 
			
		||||
				ec->key = tkey;
 | 
			
		||||
				ec->keylen = tkeylen;
 | 
			
		||||
				tkey = NULL;
 | 
			
		||||
				ERR_clear_error();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -198,6 +225,11 @@ BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec)
 | 
			
		||||
		OPENSSL_free(ec->key);
 | 
			
		||||
		ec->key = NULL;
 | 
			
		||||
		}
 | 
			
		||||
	if (tkey)
 | 
			
		||||
		{
 | 
			
		||||
		OPENSSL_cleanse(tkey, tkeylen);
 | 
			
		||||
		OPENSSL_free(tkey);
 | 
			
		||||
		}
 | 
			
		||||
	if (ok)
 | 
			
		||||
		return b;
 | 
			
		||||
	BIO_free(b);
 | 
			
		||||
 
 | 
			
		||||
@@ -371,6 +371,8 @@ static int cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms,
 | 
			
		||||
	unsigned char *ek = NULL;
 | 
			
		||||
	size_t eklen;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	CMS_EncryptedContentInfo *ec;
 | 
			
		||||
	ec = cms->d.envelopedData->encryptedContentInfo;
 | 
			
		||||
 | 
			
		||||
	if (ktri->pkey == NULL)
 | 
			
		||||
		{
 | 
			
		||||
@@ -417,8 +419,14 @@ static int cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms,
 | 
			
		||||
 | 
			
		||||
	ret = 1;
 | 
			
		||||
 | 
			
		||||
	cms->d.envelopedData->encryptedContentInfo->key = ek;
 | 
			
		||||
	cms->d.envelopedData->encryptedContentInfo->keylen = eklen;
 | 
			
		||||
	if (ec->key)
 | 
			
		||||
		{
 | 
			
		||||
		OPENSSL_cleanse(ec->key, ec->keylen);
 | 
			
		||||
		OPENSSL_free(ec->key);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	ec->key = ek;
 | 
			
		||||
	ec->keylen = eklen;
 | 
			
		||||
 | 
			
		||||
	err:
 | 
			
		||||
	if (pctx)
 | 
			
		||||
 
 | 
			
		||||
@@ -175,6 +175,8 @@ struct CMS_EncryptedContentInfo_st
 | 
			
		||||
	const EVP_CIPHER *cipher;
 | 
			
		||||
	unsigned char *key;
 | 
			
		||||
	size_t keylen;
 | 
			
		||||
	/* Set to 1 if we are debugging decrypt and don't fake keys for MMA */
 | 
			
		||||
	int debug;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
struct CMS_RecipientInfo_st
 | 
			
		||||
 
 | 
			
		||||
@@ -611,7 +611,10 @@ int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert)
 | 
			
		||||
	STACK_OF(CMS_RecipientInfo) *ris;
 | 
			
		||||
	CMS_RecipientInfo *ri;
 | 
			
		||||
	int i, r;
 | 
			
		||||
	int debug = 0;
 | 
			
		||||
	ris = CMS_get0_RecipientInfos(cms);
 | 
			
		||||
	if (ris)
 | 
			
		||||
		debug = cms->d.envelopedData->encryptedContentInfo->debug;
 | 
			
		||||
	for (i = 0; i < sk_CMS_RecipientInfo_num(ris); i++)
 | 
			
		||||
		{
 | 
			
		||||
		ri = sk_CMS_RecipientInfo_value(ris, i);
 | 
			
		||||
@@ -625,17 +628,38 @@ int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert)
 | 
			
		||||
			CMS_RecipientInfo_set0_pkey(ri, pk);
 | 
			
		||||
			r = CMS_RecipientInfo_decrypt(cms, ri);
 | 
			
		||||
			CMS_RecipientInfo_set0_pkey(ri, NULL);
 | 
			
		||||
			if (r > 0)
 | 
			
		||||
				return 1;
 | 
			
		||||
			if (cert)
 | 
			
		||||
				{
 | 
			
		||||
				/* If not debugging clear any error and
 | 
			
		||||
				 * return success to avoid leaking of
 | 
			
		||||
				 * information useful to MMA
 | 
			
		||||
				 */
 | 
			
		||||
				if (!debug)
 | 
			
		||||
					{
 | 
			
		||||
					ERR_clear_error();
 | 
			
		||||
					return 1;
 | 
			
		||||
					}
 | 
			
		||||
				if (r > 0)
 | 
			
		||||
					return 1;
 | 
			
		||||
				CMSerr(CMS_F_CMS_DECRYPT_SET1_PKEY,
 | 
			
		||||
						CMS_R_DECRYPT_ERROR);
 | 
			
		||||
				return 0;
 | 
			
		||||
				}
 | 
			
		||||
			ERR_clear_error();
 | 
			
		||||
			/* If no cert and not debugging don't leave loop
 | 
			
		||||
			 * after first successful decrypt. Always attempt
 | 
			
		||||
			 * to decrypt all recipients to avoid leaking timing
 | 
			
		||||
			 * of a successful decrypt.
 | 
			
		||||
			 */
 | 
			
		||||
			else if (r > 0 && debug)
 | 
			
		||||
				return 1;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	/* If no cert and not debugging always return success */
 | 
			
		||||
	if (!cert && !debug)
 | 
			
		||||
		{
 | 
			
		||||
		ERR_clear_error();
 | 
			
		||||
		return 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	CMSerr(CMS_F_CMS_DECRYPT_SET1_PKEY, CMS_R_NO_MATCHING_RECIPIENT);
 | 
			
		||||
	return 0;
 | 
			
		||||
@@ -694,9 +718,14 @@ int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert,
 | 
			
		||||
		}
 | 
			
		||||
	if (!dcont && !check_content(cms))
 | 
			
		||||
		return 0;
 | 
			
		||||
	if (flags & CMS_DEBUG_DECRYPT)
 | 
			
		||||
		cms->d.envelopedData->encryptedContentInfo->debug = 1;
 | 
			
		||||
	else
 | 
			
		||||
		cms->d.envelopedData->encryptedContentInfo->debug = 0;
 | 
			
		||||
	if (!pk && !cert && !dcont && !out)
 | 
			
		||||
		return 1;
 | 
			
		||||
	if (pk && !CMS_decrypt_set1_pkey(cms, pk, cert))
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	cont = CMS_dataInit(cms, dcont);
 | 
			
		||||
	if (!cont)
 | 
			
		||||
		return 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -500,7 +500,7 @@ void CRYPTO_THREADID_current(CRYPTO_THREADID *id)
 | 
			
		||||
	CRYPTO_THREADID_set_numeric(id, (unsigned long)find_thread(NULL));
 | 
			
		||||
#else
 | 
			
		||||
	/* For everything else, default to using the address of 'errno' */
 | 
			
		||||
	CRYPTO_THREADID_set_pointer(id, &errno);
 | 
			
		||||
	CRYPTO_THREADID_set_pointer(id, (void*)&errno);
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -896,3 +896,16 @@ void OpenSSLDie(const char *file,int line,const char *assertion)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
void *OPENSSL_stderr(void)	{ return stderr; }
 | 
			
		||||
 | 
			
		||||
int CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len)
 | 
			
		||||
	{
 | 
			
		||||
	size_t i;
 | 
			
		||||
	const unsigned char *a = in_a;
 | 
			
		||||
	const unsigned char *b = in_b;
 | 
			
		||||
	unsigned char x = 0;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < len; i++)
 | 
			
		||||
		x |= a[i] ^ b[i];
 | 
			
		||||
 | 
			
		||||
	return x;
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -117,7 +117,7 @@ $ ENCRYPT_TYPES = "Basic,"+ -
 | 
			
		||||
		  "BUFFER,BIO,STACK,LHASH,RAND,ERR,"+ -
 | 
			
		||||
		  "EVP,EVP_2,EVP_3,ASN1,ASN1_2,PEM,X509,X509V3,"+ -
 | 
			
		||||
		  "CONF,TXT_DB,PKCS7,PKCS12,COMP,OCSP,UI,KRB5,"+ -
 | 
			
		||||
		  "STORE,CMS,PQUEUE,TS,JPAKE"
 | 
			
		||||
		  "CMS,PQUEUE,TS,JPAKE,STORE"
 | 
			
		||||
$!
 | 
			
		||||
$! Check To Make Sure We Have Valid Command Line Parameters.
 | 
			
		||||
$!
 | 
			
		||||
@@ -1021,7 +1021,7 @@ $!
 | 
			
		||||
$! Set basic C compiler /INCLUDE directories.
 | 
			
		||||
$!
 | 
			
		||||
$ CC_INCLUDES = "SYS$DISK:[.''ARCHD'],SYS$DISK:[],SYS$DISK:[-],"+ -
 | 
			
		||||
   "SYS$DISK:[.ENGINE.VENDOR_DEFNS],SYS$DISK:[.EVP],SYS$DISK:[.ASN1]"
 | 
			
		||||
   "SYS$DISK:[.ENGINE.VENDOR_DEFNS],SYS$DISK:[.ASN1],SYS$DISK:[.EVP]"
 | 
			
		||||
$!
 | 
			
		||||
$! Check To See If P3 Is Blank.
 | 
			
		||||
$!
 | 
			
		||||
 
 | 
			
		||||
@@ -547,6 +547,13 @@ unsigned long *OPENSSL_ia32cap_loc(void);
 | 
			
		||||
#define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc()))
 | 
			
		||||
int OPENSSL_isservice(void);
 | 
			
		||||
 | 
			
		||||
/* CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. It
 | 
			
		||||
 * takes an amount of time dependent on |len|, but independent of the contents
 | 
			
		||||
 * of |a| and |b|. Unlike memcmp, it cannot be used to put elements into a
 | 
			
		||||
 * defined order as the return value when a != b is undefined, other than to be
 | 
			
		||||
 * non-zero. */
 | 
			
		||||
int CRYPTO_memcmp(const void *a, const void *b, size_t len);
 | 
			
		||||
 | 
			
		||||
/* BEGIN ERROR CODES */
 | 
			
		||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
 | 
			
		||||
 * made after this point may be overwritten when the script is next run.
 | 
			
		||||
 
 | 
			
		||||
@@ -774,7 +774,15 @@ void EC_KEY_set_conv_form(EC_KEY *, point_conversion_form_t);
 | 
			
		||||
/* functions to set/get method specific data  */
 | 
			
		||||
void *EC_KEY_get_key_method_data(EC_KEY *, 
 | 
			
		||||
	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
 | 
			
		||||
void EC_KEY_insert_key_method_data(EC_KEY *, void *data,
 | 
			
		||||
/** Sets the key method data of an EC_KEY object, if none has yet been set.
 | 
			
		||||
 *  \param  key              EC_KEY object
 | 
			
		||||
 *  \param  data             opaque data to install.
 | 
			
		||||
 *  \param  dup_func         a function that duplicates |data|.
 | 
			
		||||
 *  \param  free_func        a function that frees |data|.
 | 
			
		||||
 *  \param  clear_free_func  a function that wipes and frees |data|.
 | 
			
		||||
 *  \return the previously set data pointer, or NULL if |data| was inserted.
 | 
			
		||||
 */
 | 
			
		||||
void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data,
 | 
			
		||||
	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
 | 
			
		||||
/* wrapper functions for the underlying EC_GROUP object */
 | 
			
		||||
void EC_KEY_set_asn1_flag(EC_KEY *, int);
 | 
			
		||||
 
 | 
			
		||||
@@ -435,18 +435,27 @@ void EC_KEY_set_conv_form(EC_KEY *key, point_conversion_form_t cform)
 | 
			
		||||
void *EC_KEY_get_key_method_data(EC_KEY *key,
 | 
			
		||||
	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *))
 | 
			
		||||
	{
 | 
			
		||||
	return EC_EX_DATA_get_data(key->method_data, dup_func, free_func, clear_free_func);
 | 
			
		||||
	void *ret;
 | 
			
		||||
 | 
			
		||||
	CRYPTO_r_lock(CRYPTO_LOCK_EC);
 | 
			
		||||
	ret = EC_EX_DATA_get_data(key->method_data, dup_func, free_func, clear_free_func);
 | 
			
		||||
	CRYPTO_r_unlock(CRYPTO_LOCK_EC);
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
void EC_KEY_insert_key_method_data(EC_KEY *key, void *data,
 | 
			
		||||
void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data,
 | 
			
		||||
	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *))
 | 
			
		||||
	{
 | 
			
		||||
	EC_EXTRA_DATA *ex_data;
 | 
			
		||||
 | 
			
		||||
	CRYPTO_w_lock(CRYPTO_LOCK_EC);
 | 
			
		||||
	ex_data = EC_EX_DATA_get_data(key->method_data, dup_func, free_func, clear_free_func);
 | 
			
		||||
	if (ex_data == NULL)
 | 
			
		||||
		EC_EX_DATA_set_data(&key->method_data, data, dup_func, free_func, clear_free_func);
 | 
			
		||||
	CRYPTO_w_unlock(CRYPTO_LOCK_EC);
 | 
			
		||||
 | 
			
		||||
	return ex_data;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
void EC_KEY_set_asn1_flag(EC_KEY *key, int flag)
 | 
			
		||||
 
 | 
			
		||||
@@ -210,8 +210,15 @@ ECDH_DATA *ecdh_check(EC_KEY *key)
 | 
			
		||||
		ecdh_data = (ECDH_DATA *)ecdh_data_new();
 | 
			
		||||
		if (ecdh_data == NULL)
 | 
			
		||||
			return NULL;
 | 
			
		||||
		EC_KEY_insert_key_method_data(key, (void *)ecdh_data,
 | 
			
		||||
			ecdh_data_dup, ecdh_data_free, ecdh_data_free);
 | 
			
		||||
		data = EC_KEY_insert_key_method_data(key, (void *)ecdh_data,
 | 
			
		||||
			   ecdh_data_dup, ecdh_data_free, ecdh_data_free);
 | 
			
		||||
		if (data != NULL)
 | 
			
		||||
			{
 | 
			
		||||
			/* Another thread raced us to install the key_method
 | 
			
		||||
			 * data and won. */
 | 
			
		||||
			ecdh_data_free(ecdh_data);
 | 
			
		||||
			ecdh_data = (ECDH_DATA *)data;
 | 
			
		||||
			}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		ecdh_data = (ECDH_DATA *)data;
 | 
			
		||||
 
 | 
			
		||||
@@ -289,7 +289,8 @@ int test_builtin(BIO *out)
 | 
			
		||||
	ECDSA_SIG	*ecdsa_sig = NULL;
 | 
			
		||||
	unsigned char	digest[20], wrong_digest[20];
 | 
			
		||||
	unsigned char	*signature = NULL;
 | 
			
		||||
	unsigned char	*sig_ptr;
 | 
			
		||||
	const unsigned char	*sig_ptr;
 | 
			
		||||
	unsigned char	*sig_ptr2;
 | 
			
		||||
	unsigned char	*raw_buf = NULL;
 | 
			
		||||
	unsigned int	sig_len, degree, r_len, s_len, bn_len, buf_len;
 | 
			
		||||
	int		nid, ret =  0;
 | 
			
		||||
@@ -464,8 +465,8 @@ int test_builtin(BIO *out)
 | 
			
		||||
			(BN_bin2bn(raw_buf + bn_len, bn_len, ecdsa_sig->s) == NULL))
 | 
			
		||||
			goto builtin_err;
 | 
			
		||||
 | 
			
		||||
		sig_ptr = signature;
 | 
			
		||||
		sig_len = i2d_ECDSA_SIG(ecdsa_sig, &sig_ptr);
 | 
			
		||||
		sig_ptr2 = signature;
 | 
			
		||||
		sig_len = i2d_ECDSA_SIG(ecdsa_sig, &sig_ptr2);
 | 
			
		||||
		if (ECDSA_verify(0, digest, 20, signature, sig_len, eckey) == 1)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(out, " failed\n");
 | 
			
		||||
@@ -477,8 +478,8 @@ int test_builtin(BIO *out)
 | 
			
		||||
			(BN_bin2bn(raw_buf + bn_len, bn_len, ecdsa_sig->s) == NULL))
 | 
			
		||||
			goto builtin_err;
 | 
			
		||||
 | 
			
		||||
		sig_ptr = signature;
 | 
			
		||||
		sig_len = i2d_ECDSA_SIG(ecdsa_sig, &sig_ptr);
 | 
			
		||||
		sig_ptr2 = signature;
 | 
			
		||||
		sig_len = i2d_ECDSA_SIG(ecdsa_sig, &sig_ptr2);
 | 
			
		||||
		if (ECDSA_verify(0, digest, 20, signature, sig_len, eckey) != 1)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(out, " failed\n");
 | 
			
		||||
 
 | 
			
		||||
@@ -188,8 +188,15 @@ ECDSA_DATA *ecdsa_check(EC_KEY *key)
 | 
			
		||||
		ecdsa_data = (ECDSA_DATA *)ecdsa_data_new();
 | 
			
		||||
		if (ecdsa_data == NULL)
 | 
			
		||||
			return NULL;
 | 
			
		||||
		EC_KEY_insert_key_method_data(key, (void *)ecdsa_data,
 | 
			
		||||
			ecdsa_data_dup, ecdsa_data_free, ecdsa_data_free);
 | 
			
		||||
		data = EC_KEY_insert_key_method_data(key, (void *)ecdsa_data,
 | 
			
		||||
			   ecdsa_data_dup, ecdsa_data_free, ecdsa_data_free);
 | 
			
		||||
		if (data != NULL)
 | 
			
		||||
			{
 | 
			
		||||
			/* Another thread raced us to install the key_method
 | 
			
		||||
			 * data and won. */
 | 
			
		||||
			ecdsa_data_free(ecdsa_data);
 | 
			
		||||
			ecdsa_data = (ECDSA_DATA *)data;
 | 
			
		||||
			}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		ecdsa_data = (ECDSA_DATA *)data;
 | 
			
		||||
 
 | 
			
		||||
@@ -79,8 +79,6 @@ struct dev_crypto_state {
 | 
			
		||||
	unsigned char digest_res[HASH_MAX_LEN];
 | 
			
		||||
	char *mac_data;
 | 
			
		||||
	int mac_len;
 | 
			
		||||
 | 
			
		||||
	int copy;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -200,6 +198,7 @@ get_dev_crypto(void)
 | 
			
		||||
 | 
			
		||||
	if ((fd = open_dev_crypto()) == -1)
 | 
			
		||||
		return (-1);
 | 
			
		||||
#ifndef CRIOGET_NOT_NEEDED
 | 
			
		||||
	if (ioctl(fd, CRIOGET, &retfd) == -1)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
@@ -208,9 +207,19 @@ get_dev_crypto(void)
 | 
			
		||||
		close(retfd);
 | 
			
		||||
		return (-1);
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
        retfd = fd;
 | 
			
		||||
#endif
 | 
			
		||||
	return (retfd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void put_dev_crypto(int fd)
 | 
			
		||||
{
 | 
			
		||||
#ifndef CRIOGET_NOT_NEEDED
 | 
			
		||||
	close(fd);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Caching version for asym operations */
 | 
			
		||||
static int
 | 
			
		||||
get_asym_dev_crypto(void)
 | 
			
		||||
@@ -252,7 +261,7 @@ get_cryptodev_ciphers(const int **cnids)
 | 
			
		||||
		    ioctl(fd, CIOCFSESSION, &sess.ses) != -1)
 | 
			
		||||
			nids[count++] = ciphers[i].nid;
 | 
			
		||||
	}
 | 
			
		||||
	close(fd);
 | 
			
		||||
	put_dev_crypto(fd);
 | 
			
		||||
 | 
			
		||||
	if (count > 0)
 | 
			
		||||
		*cnids = nids;
 | 
			
		||||
@@ -291,7 +300,7 @@ get_cryptodev_digests(const int **cnids)
 | 
			
		||||
		    ioctl(fd, CIOCFSESSION, &sess.ses) != -1)
 | 
			
		||||
			nids[count++] = digests[i].nid;
 | 
			
		||||
	}
 | 
			
		||||
	close(fd);
 | 
			
		||||
	put_dev_crypto(fd);
 | 
			
		||||
 | 
			
		||||
	if (count > 0)
 | 
			
		||||
		*cnids = nids;
 | 
			
		||||
@@ -436,7 +445,7 @@ cryptodev_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
 | 
			
		||||
	sess->cipher = cipher;
 | 
			
		||||
 | 
			
		||||
	if (ioctl(state->d_fd, CIOCGSESSION, sess) == -1) {
 | 
			
		||||
		close(state->d_fd);
 | 
			
		||||
		put_dev_crypto(state->d_fd);
 | 
			
		||||
		state->d_fd = -1;
 | 
			
		||||
		return (0);
 | 
			
		||||
	}
 | 
			
		||||
@@ -473,7 +482,7 @@ cryptodev_cleanup(EVP_CIPHER_CTX *ctx)
 | 
			
		||||
	} else {
 | 
			
		||||
		ret = 1;
 | 
			
		||||
	}
 | 
			
		||||
	close(state->d_fd);
 | 
			
		||||
	put_dev_crypto(state->d_fd);
 | 
			
		||||
	state->d_fd = -1;
 | 
			
		||||
 | 
			
		||||
	return (ret);
 | 
			
		||||
@@ -686,7 +695,7 @@ static int cryptodev_digest_init(EVP_MD_CTX *ctx)
 | 
			
		||||
	sess->mac = digest;
 | 
			
		||||
 | 
			
		||||
	if (ioctl(state->d_fd, CIOCGSESSION, sess) < 0) {
 | 
			
		||||
		close(state->d_fd);
 | 
			
		||||
		put_dev_crypto(state->d_fd);
 | 
			
		||||
		state->d_fd = -1;
 | 
			
		||||
		printf("cryptodev_digest_init: Open session failed\n");
 | 
			
		||||
		return (0);
 | 
			
		||||
@@ -758,14 +767,12 @@ static int cryptodev_digest_final(EVP_MD_CTX *ctx, unsigned char *md)
 | 
			
		||||
	if (! (ctx->flags & EVP_MD_CTX_FLAG_ONESHOT) ) {
 | 
			
		||||
		/* if application doesn't support one buffer */
 | 
			
		||||
		memset(&cryp, 0, sizeof(cryp));
 | 
			
		||||
 | 
			
		||||
		cryp.ses = sess->ses;
 | 
			
		||||
		cryp.flags = 0;
 | 
			
		||||
		cryp.len = state->mac_len;
 | 
			
		||||
		cryp.src = state->mac_data;
 | 
			
		||||
		cryp.dst = NULL;
 | 
			
		||||
		cryp.mac = (caddr_t)md;
 | 
			
		||||
 | 
			
		||||
		if (ioctl(state->d_fd, CIOCCRYPT, &cryp) < 0) {
 | 
			
		||||
			printf("cryptodev_digest_final: digest failed\n");
 | 
			
		||||
			return (0);
 | 
			
		||||
@@ -786,6 +793,9 @@ static int cryptodev_digest_cleanup(EVP_MD_CTX *ctx)
 | 
			
		||||
	struct dev_crypto_state *state = ctx->md_data;
 | 
			
		||||
	struct session_op *sess = &state->d_sess;
 | 
			
		||||
 | 
			
		||||
	if (state == NULL)
 | 
			
		||||
	  return 0;
 | 
			
		||||
 | 
			
		||||
	if (state->d_fd < 0) {
 | 
			
		||||
		printf("cryptodev_digest_cleanup: illegal input\n");
 | 
			
		||||
		return (0);
 | 
			
		||||
@@ -797,16 +807,13 @@ static int cryptodev_digest_cleanup(EVP_MD_CTX *ctx)
 | 
			
		||||
		state->mac_len = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (state->copy)
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	if (ioctl(state->d_fd, CIOCFSESSION, &sess->ses) < 0) {
 | 
			
		||||
		printf("cryptodev_digest_cleanup: failed to close session\n");
 | 
			
		||||
		ret = 0;
 | 
			
		||||
	} else {
 | 
			
		||||
		ret = 1;
 | 
			
		||||
	}
 | 
			
		||||
	close(state->d_fd);	
 | 
			
		||||
	put_dev_crypto(state->d_fd);	
 | 
			
		||||
	state->d_fd = -1;
 | 
			
		||||
 | 
			
		||||
	return (ret);
 | 
			
		||||
@@ -816,15 +823,39 @@ static int cryptodev_digest_copy(EVP_MD_CTX *to,const EVP_MD_CTX *from)
 | 
			
		||||
{
 | 
			
		||||
	struct dev_crypto_state *fstate = from->md_data;
 | 
			
		||||
	struct dev_crypto_state *dstate = to->md_data;
 | 
			
		||||
	struct session_op *sess;
 | 
			
		||||
	int digest;
 | 
			
		||||
 | 
			
		||||
	memcpy(dstate, fstate, sizeof(struct dev_crypto_state));
 | 
			
		||||
	if (dstate == NULL || fstate == NULL)
 | 
			
		||||
	  return 1;
 | 
			
		||||
 | 
			
		||||
	if (fstate->mac_len != 0) {
 | 
			
		||||
		dstate->mac_data = OPENSSL_malloc(fstate->mac_len);
 | 
			
		||||
		memcpy(dstate->mac_data, fstate->mac_data, fstate->mac_len);
 | 
			
		||||
       	memcpy(dstate, fstate, sizeof(struct dev_crypto_state));
 | 
			
		||||
 | 
			
		||||
	sess = &dstate->d_sess;
 | 
			
		||||
 | 
			
		||||
	digest = digest_nid_to_cryptodev(to->digest->type);
 | 
			
		||||
 | 
			
		||||
	sess->mackey = dstate->dummy_mac_key;
 | 
			
		||||
	sess->mackeylen = digest_key_length(to->digest->type);
 | 
			
		||||
	sess->mac = digest;
 | 
			
		||||
 | 
			
		||||
	dstate->d_fd = get_dev_crypto();
 | 
			
		||||
 | 
			
		||||
	if (ioctl(dstate->d_fd, CIOCGSESSION, sess) < 0) {
 | 
			
		||||
		put_dev_crypto(dstate->d_fd);
 | 
			
		||||
		dstate->d_fd = -1;
 | 
			
		||||
		printf("cryptodev_digest_init: Open session failed\n");
 | 
			
		||||
		return (0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dstate->copy = 1;
 | 
			
		||||
	if (fstate->mac_len != 0) {
 | 
			
		||||
	        if (fstate->mac_data != NULL)
 | 
			
		||||
	                {
 | 
			
		||||
        		dstate->mac_data = OPENSSL_malloc(fstate->mac_len);
 | 
			
		||||
	        	memcpy(dstate->mac_data, fstate->mac_data, fstate->mac_len);
 | 
			
		||||
           		dstate->mac_len = fstate->mac_len;
 | 
			
		||||
	        	}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
@@ -1347,11 +1378,11 @@ ENGINE_load_cryptodev(void)
 | 
			
		||||
	 * find out what asymmetric crypto algorithms we support
 | 
			
		||||
	 */
 | 
			
		||||
	if (ioctl(fd, CIOCASYMFEAT, &cryptodev_asymfeat) == -1) {
 | 
			
		||||
		close(fd);
 | 
			
		||||
		put_dev_crypto(fd);
 | 
			
		||||
		ENGINE_free(engine);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	close(fd);
 | 
			
		||||
	put_dev_crypto(fd);
 | 
			
		||||
 | 
			
		||||
	if (!ENGINE_set_id(engine, "cryptodev") ||
 | 
			
		||||
	    !ENGINE_set_name(engine, "BSD cryptodev engine") ||
 | 
			
		||||
 
 | 
			
		||||
@@ -64,7 +64,9 @@
 | 
			
		||||
#endif
 | 
			
		||||
#include <openssl/buffer.h>
 | 
			
		||||
#include <openssl/bio.h>
 | 
			
		||||
#ifndef OPENSSL_NO_COMP
 | 
			
		||||
#include <openssl/comp.h>
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef OPENSSL_NO_RSA
 | 
			
		||||
#include <openssl/rsa.h>
 | 
			
		||||
#endif
 | 
			
		||||
@@ -102,7 +104,6 @@
 | 
			
		||||
#ifndef OPENSSL_NO_JPAKE
 | 
			
		||||
#include <openssl/jpake.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <openssl/comp.h>
 | 
			
		||||
 | 
			
		||||
void ERR_load_crypto_strings(void)
 | 
			
		||||
	{
 | 
			
		||||
@@ -126,7 +127,9 @@ void ERR_load_crypto_strings(void)
 | 
			
		||||
	ERR_load_ASN1_strings();
 | 
			
		||||
	ERR_load_CONF_strings();
 | 
			
		||||
	ERR_load_CRYPTO_strings();
 | 
			
		||||
#ifndef OPENSSL_NO_COMP
 | 
			
		||||
	ERR_load_COMP_strings();
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef OPENSSL_NO_EC
 | 
			
		||||
	ERR_load_EC_strings();
 | 
			
		||||
#endif
 | 
			
		||||
@@ -155,6 +158,5 @@ void ERR_load_crypto_strings(void)
 | 
			
		||||
#ifndef OPENSSL_NO_JPAKE
 | 
			
		||||
	ERR_load_JPAKE_strings();
 | 
			
		||||
#endif
 | 
			
		||||
	ERR_load_COMP_strings();
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -120,7 +120,8 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; my $dir=$1; my $xlate;
 | 
			
		||||
die "can't locate x86_64-xlate.pl";
 | 
			
		||||
 | 
			
		||||
no warnings qw(uninitialized);
 | 
			
		||||
open STDOUT,"| $^X $xlate $flavour $output";
 | 
			
		||||
open OUT,"| \"$^X\" $xlate $flavour $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
 | 
			
		||||
$code .= <<EOF;
 | 
			
		||||
.text
 | 
			
		||||
 
 | 
			
		||||
@@ -361,6 +361,10 @@ void *CRYPTO_realloc_clean(void *str, int old_len, int num, const char *file,
 | 
			
		||||
 | 
			
		||||
	if (num <= 0) return NULL;
 | 
			
		||||
 | 
			
		||||
	/* We don't support shrinking the buffer. Note the memcpy that copies
 | 
			
		||||
	 * |old_len| bytes to the new buffer, below. */
 | 
			
		||||
	if (num < old_len) return NULL;
 | 
			
		||||
 | 
			
		||||
	if (realloc_debug_func != NULL)
 | 
			
		||||
		realloc_debug_func(str, NULL, num, file, line, 0);
 | 
			
		||||
	ret=malloc_ex_func(num,file,line);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* AUTOGENERATED BY objxref.pl, DO NOT EDIT */
 | 
			
		||||
/* AUTOGENERATED BY crypto/objects/objxref.pl, DO NOT EDIT */
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
@@ -91,9 +91,12 @@ int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs,
 | 
			
		||||
		{
 | 
			
		||||
		EVP_PKEY *skey;
 | 
			
		||||
		skey = X509_get_pubkey(signer);
 | 
			
		||||
		ret = OCSP_BASICRESP_verify(bs, skey, 0);
 | 
			
		||||
		EVP_PKEY_free(skey);
 | 
			
		||||
		if(ret <= 0)
 | 
			
		||||
		if (skey)
 | 
			
		||||
			{
 | 
			
		||||
			ret = OCSP_BASICRESP_verify(bs, skey, 0);
 | 
			
		||||
			EVP_PKEY_free(skey);
 | 
			
		||||
			}
 | 
			
		||||
		if(!skey || ret <= 0)
 | 
			
		||||
			{
 | 
			
		||||
			OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_SIGNATURE_FAILURE);
 | 
			
		||||
			goto end;
 | 
			
		||||
@@ -108,6 +111,7 @@ int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs,
 | 
			
		||||
			init_res = X509_STORE_CTX_init(&ctx, st, signer, bs->certs);
 | 
			
		||||
		if(!init_res)
 | 
			
		||||
			{
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,ERR_R_X509_LIB);
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,11 +25,11 @@
 | 
			
		||||
 * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
 | 
			
		||||
 *  major minor fix final patch/beta)
 | 
			
		||||
 */
 | 
			
		||||
#define OPENSSL_VERSION_NUMBER	0x1000006fL
 | 
			
		||||
#define OPENSSL_VERSION_NUMBER	0x100000bfL
 | 
			
		||||
#ifdef OPENSSL_FIPS
 | 
			
		||||
#define OPENSSL_VERSION_TEXT	"OpenSSL 1.0.0f-fips 4 Jan 2012"
 | 
			
		||||
#define OPENSSL_VERSION_TEXT	"OpenSSL 1.0.0k-fips 5 Feb 2013"
 | 
			
		||||
#else
 | 
			
		||||
#define OPENSSL_VERSION_TEXT	"OpenSSL 1.0.0f 4 Jan 2012"
 | 
			
		||||
#define OPENSSL_VERSION_TEXT	"OpenSSL 1.0.0k 5 Feb 2013"
 | 
			
		||||
#endif
 | 
			
		||||
#define OPENSSL_VERSION_PTEXT	" part of " OPENSSL_VERSION_TEXT
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -62,12 +62,8 @@ my $flavour = shift;
 | 
			
		||||
my $output  = shift;
 | 
			
		||||
if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }
 | 
			
		||||
 | 
			
		||||
{ my ($stddev,$stdino,@junk)=stat(STDOUT);
 | 
			
		||||
  my ($outdev,$outino,@junk)=stat($output);
 | 
			
		||||
 | 
			
		||||
    open STDOUT,">$output" || die "can't open $output: $!"
 | 
			
		||||
	if ($stddev!=$outdev || $stdino!=$outino);
 | 
			
		||||
}
 | 
			
		||||
open STDOUT,">$output" || die "can't open $output: $!"
 | 
			
		||||
	if (defined($output));
 | 
			
		||||
 | 
			
		||||
my $gas=1;	$gas=0 if ($output =~ /\.asm$/);
 | 
			
		||||
my $elf=1;	$elf=0 if (!$gas);
 | 
			
		||||
@@ -555,7 +551,8 @@ my %globals;
 | 
			
		||||
					    $v.=" READONLY";
 | 
			
		||||
					    $v.=" ALIGN(".($1 eq "p" ? 4 : 8).")" if ($masm>=$masmref);
 | 
			
		||||
					} elsif ($line=~/\.CRT\$/i) {
 | 
			
		||||
					    $v.=" READONLY DWORD";
 | 
			
		||||
					    $v.=" READONLY ";
 | 
			
		||||
					    $v.=$masm>=$masmref ? "ALIGN(8)" : "DWORD";
 | 
			
		||||
					}
 | 
			
		||||
				    }
 | 
			
		||||
				    $current_segment = $line;
 | 
			
		||||
 
 | 
			
		||||
@@ -167,7 +167,7 @@ int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert,
 | 
			
		||||
	if (cert && *cert)
 | 
			
		||||
		X509_free(*cert);
 | 
			
		||||
	if (x)
 | 
			
		||||
		X509_free(*cert);
 | 
			
		||||
		X509_free(x);
 | 
			
		||||
	if (ocerts)
 | 
			
		||||
		sk_X509_pop_free(ocerts, X509_free);
 | 
			
		||||
	return 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -204,11 +204,11 @@ static int pkcs7_decrypt_rinfo(unsigned char **pek, int *peklen,
 | 
			
		||||
	unsigned char *ek = NULL;
 | 
			
		||||
	size_t eklen;
 | 
			
		||||
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	int ret = -1;
 | 
			
		||||
 | 
			
		||||
	pctx = EVP_PKEY_CTX_new(pkey, NULL);
 | 
			
		||||
	if (!pctx)
 | 
			
		||||
		return 0;
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	if (EVP_PKEY_decrypt_init(pctx) <= 0)
 | 
			
		||||
		goto err;
 | 
			
		||||
@@ -235,12 +235,19 @@ static int pkcs7_decrypt_rinfo(unsigned char **pek, int *peklen,
 | 
			
		||||
	if (EVP_PKEY_decrypt(pctx, ek, &eklen,
 | 
			
		||||
				ri->enc_key->data, ri->enc_key->length) <= 0)
 | 
			
		||||
		{
 | 
			
		||||
		ret = 0;
 | 
			
		||||
		PKCS7err(PKCS7_F_PKCS7_DECRYPT_RINFO, ERR_R_EVP_LIB);
 | 
			
		||||
		goto err;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	ret = 1;
 | 
			
		||||
 | 
			
		||||
	if (*pek)
 | 
			
		||||
		{
 | 
			
		||||
		OPENSSL_cleanse(*pek, *peklen);
 | 
			
		||||
		OPENSSL_free(*pek);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	*pek = ek;
 | 
			
		||||
	*peklen = eklen;
 | 
			
		||||
 | 
			
		||||
@@ -423,6 +430,8 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
 | 
			
		||||
	STACK_OF(X509_ALGOR) *md_sk=NULL;
 | 
			
		||||
	STACK_OF(PKCS7_RECIP_INFO) *rsk=NULL;
 | 
			
		||||
	PKCS7_RECIP_INFO *ri=NULL;
 | 
			
		||||
       unsigned char *ek = NULL, *tkey = NULL;
 | 
			
		||||
       int eklen = 0, tkeylen = 0;
 | 
			
		||||
 | 
			
		||||
	i=OBJ_obj2nid(p7->type);
 | 
			
		||||
	p7->state=PKCS7_S_HEADER;
 | 
			
		||||
@@ -500,8 +509,6 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
 | 
			
		||||
		int max;
 | 
			
		||||
		X509_OBJECT ret;
 | 
			
		||||
#endif
 | 
			
		||||
		unsigned char *ek = NULL;
 | 
			
		||||
		int eklen;
 | 
			
		||||
 | 
			
		||||
		if ((etmp=BIO_new(BIO_f_cipher())) == NULL)
 | 
			
		||||
			{
 | 
			
		||||
@@ -534,29 +541,28 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		/* If we haven't got a certificate try each ri in turn */
 | 
			
		||||
 | 
			
		||||
		if (pcert == NULL)
 | 
			
		||||
			{
 | 
			
		||||
			/* Always attempt to decrypt all rinfo even
 | 
			
		||||
			 * after sucess as a defence against MMA timing
 | 
			
		||||
			 * attacks.
 | 
			
		||||
			 */
 | 
			
		||||
			for (i=0; i<sk_PKCS7_RECIP_INFO_num(rsk); i++)
 | 
			
		||||
				{
 | 
			
		||||
				ri=sk_PKCS7_RECIP_INFO_value(rsk,i);
 | 
			
		||||
				
 | 
			
		||||
				if (pkcs7_decrypt_rinfo(&ek, &eklen,
 | 
			
		||||
							ri, pkey) > 0)
 | 
			
		||||
					break;
 | 
			
		||||
							ri, pkey) < 0)
 | 
			
		||||
					goto err;
 | 
			
		||||
				ERR_clear_error();
 | 
			
		||||
				ri = NULL;
 | 
			
		||||
				}
 | 
			
		||||
			if (ri == NULL)
 | 
			
		||||
				{
 | 
			
		||||
				PKCS7err(PKCS7_F_PKCS7_DATADECODE,
 | 
			
		||||
				      PKCS7_R_NO_RECIPIENT_MATCHES_KEY);
 | 
			
		||||
				goto err;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
			if (pkcs7_decrypt_rinfo(&ek, &eklen, ri, pkey) <= 0)
 | 
			
		||||
			/* Only exit on fatal errors, not decrypt failure */
 | 
			
		||||
			if (pkcs7_decrypt_rinfo(&ek, &eklen, ri, pkey) < 0)
 | 
			
		||||
				goto err;
 | 
			
		||||
			ERR_clear_error();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		evp_ctx=NULL;
 | 
			
		||||
@@ -565,6 +571,19 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
 | 
			
		||||
			goto err;
 | 
			
		||||
		if (EVP_CIPHER_asn1_to_param(evp_ctx,enc_alg->parameter) < 0)
 | 
			
		||||
			goto err;
 | 
			
		||||
		/* Generate random key as MMA defence */
 | 
			
		||||
		tkeylen = EVP_CIPHER_CTX_key_length(evp_ctx);
 | 
			
		||||
		tkey = OPENSSL_malloc(tkeylen);
 | 
			
		||||
		if (!tkey)
 | 
			
		||||
			goto err;
 | 
			
		||||
		if (EVP_CIPHER_CTX_rand_key(evp_ctx, tkey) <= 0)
 | 
			
		||||
			goto err;
 | 
			
		||||
		if (ek == NULL)
 | 
			
		||||
			{
 | 
			
		||||
			ek = tkey;
 | 
			
		||||
			eklen = tkeylen;
 | 
			
		||||
			tkey = NULL;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		if (eklen != EVP_CIPHER_CTX_key_length(evp_ctx)) {
 | 
			
		||||
			/* Some S/MIME clients don't use the same key
 | 
			
		||||
@@ -573,11 +592,16 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
 | 
			
		||||
			 */
 | 
			
		||||
			if(!EVP_CIPHER_CTX_set_key_length(evp_ctx, eklen))
 | 
			
		||||
				{
 | 
			
		||||
				PKCS7err(PKCS7_F_PKCS7_DATADECODE,
 | 
			
		||||
					PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH);
 | 
			
		||||
				goto err;
 | 
			
		||||
				/* Use random key as MMA defence */
 | 
			
		||||
				OPENSSL_cleanse(ek, eklen);
 | 
			
		||||
				OPENSSL_free(ek);
 | 
			
		||||
				ek = tkey;
 | 
			
		||||
				eklen = tkeylen;
 | 
			
		||||
				tkey = NULL;
 | 
			
		||||
				}
 | 
			
		||||
		} 
 | 
			
		||||
		/* Clear errors so we don't leak information useful in MMA */
 | 
			
		||||
		ERR_clear_error();
 | 
			
		||||
		if (EVP_CipherInit_ex(evp_ctx,NULL,NULL,ek,NULL,0) <= 0)
 | 
			
		||||
			goto err;
 | 
			
		||||
 | 
			
		||||
@@ -585,6 +609,13 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
 | 
			
		||||
			{
 | 
			
		||||
			OPENSSL_cleanse(ek,eklen);
 | 
			
		||||
			OPENSSL_free(ek);
 | 
			
		||||
                       ek = NULL;
 | 
			
		||||
			}
 | 
			
		||||
		if (tkey)
 | 
			
		||||
			{
 | 
			
		||||
			OPENSSL_cleanse(tkey,tkeylen);
 | 
			
		||||
			OPENSSL_free(tkey);
 | 
			
		||||
                       tkey = NULL;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		if (out == NULL)
 | 
			
		||||
@@ -627,6 +658,16 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
 | 
			
		||||
	if (0)
 | 
			
		||||
		{
 | 
			
		||||
err:
 | 
			
		||||
               if (ek)
 | 
			
		||||
                       {
 | 
			
		||||
                       OPENSSL_cleanse(ek,eklen);
 | 
			
		||||
                       OPENSSL_free(ek);
 | 
			
		||||
                       }
 | 
			
		||||
               if (tkey)
 | 
			
		||||
                       {
 | 
			
		||||
                       OPENSSL_cleanse(tkey,tkeylen);
 | 
			
		||||
                       OPENSSL_free(tkey);
 | 
			
		||||
                       }
 | 
			
		||||
		if (out != NULL) BIO_free_all(out);
 | 
			
		||||
		if (btmp != NULL) BIO_free_all(btmp);
 | 
			
		||||
		if (etmp != NULL) BIO_free_all(etmp);
 | 
			
		||||
 
 | 
			
		||||
@@ -573,15 +573,34 @@ int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags)
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
		ret = SMIME_text(bread, data);
 | 
			
		||||
		if (ret > 0 && BIO_method_type(tmpmem) == BIO_TYPE_CIPHER)
 | 
			
		||||
			{
 | 
			
		||||
			if (!BIO_get_cipher_status(tmpmem))
 | 
			
		||||
				ret = 0;
 | 
			
		||||
			}
 | 
			
		||||
		BIO_free_all(bread);
 | 
			
		||||
		return ret;
 | 
			
		||||
	} else {
 | 
			
		||||
		for(;;) {
 | 
			
		||||
			i = BIO_read(tmpmem, buf, sizeof(buf));
 | 
			
		||||
			if(i <= 0) break;
 | 
			
		||||
			BIO_write(data, buf, i);
 | 
			
		||||
			if(i <= 0)
 | 
			
		||||
				{
 | 
			
		||||
				ret = 1;
 | 
			
		||||
				if (BIO_method_type(tmpmem) == BIO_TYPE_CIPHER)
 | 
			
		||||
					{
 | 
			
		||||
					if (!BIO_get_cipher_status(tmpmem))
 | 
			
		||||
						ret = 0;
 | 
			
		||||
					}
 | 
			
		||||
					
 | 
			
		||||
				break;
 | 
			
		||||
				}
 | 
			
		||||
			if (BIO_write(data, buf, i) != i)
 | 
			
		||||
				{
 | 
			
		||||
				ret = 0;
 | 
			
		||||
				break;
 | 
			
		||||
				}
 | 
			
		||||
		}
 | 
			
		||||
		BIO_free_all(tmpmem);
 | 
			
		||||
		return 1;
 | 
			
		||||
		return ret;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,7 @@ Loop:	lwarx	r5,0,r3
 | 
			
		||||
Little:	mtctr	r4
 | 
			
		||||
	stb	r0,0(r3)
 | 
			
		||||
	addi	r3,r3,1
 | 
			
		||||
	bdnz-	\$-8
 | 
			
		||||
	bdnz	\$-8
 | 
			
		||||
	blr
 | 
			
		||||
Lot:	andi.	r5,r3,3
 | 
			
		||||
	beq	Laligned
 | 
			
		||||
@@ -85,7 +85,7 @@ Laligned:
 | 
			
		||||
	mtctr	r5
 | 
			
		||||
	stw	r0,0(r3)
 | 
			
		||||
	addi	r3,r3,4
 | 
			
		||||
	bdnz-	\$-8
 | 
			
		||||
	bdnz	\$-8
 | 
			
		||||
	andi.	r4,r4,3
 | 
			
		||||
	bne	Little
 | 
			
		||||
	blr
 | 
			
		||||
 
 | 
			
		||||
@@ -137,7 +137,7 @@ int RAND_load_file(const char *file, long bytes)
 | 
			
		||||
	in=fopen(file,"rb");
 | 
			
		||||
#endif
 | 
			
		||||
	if (in == NULL) goto err;
 | 
			
		||||
#if defined(S_IFBLK) && defined(S_IFCHR) && !defined(OPNESSL_NO_POSIX_IO)
 | 
			
		||||
#if defined(S_IFBLK) && defined(S_IFCHR) && !defined(OPENSSL_NO_POSIX_IO)
 | 
			
		||||
	if (sb.st_mode & (S_IFBLK | S_IFCHR)) {
 | 
			
		||||
	  /* this file is a device. we don't want read an infinite number
 | 
			
		||||
	   * of bytes from a random device, nor do we want to use buffered
 | 
			
		||||
 
 | 
			
		||||
@@ -69,7 +69,8 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 | 
			
		||||
die "can't locate x86_64-xlate.pl";
 | 
			
		||||
 | 
			
		||||
open STDOUT,"| $^X $xlate $flavour $output";
 | 
			
		||||
open OUT,"| \"$^X\" $xlate $flavour $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
 | 
			
		||||
$dat="%rdi";	    # arg1
 | 
			
		||||
$len="%rsi";	    # arg2
 | 
			
		||||
 
 | 
			
		||||
@@ -147,7 +147,7 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
 | 
			
		||||
 | 
			
		||||
	EVP_Digest((void *)param, plen, phash, NULL, EVP_sha1(), NULL);
 | 
			
		||||
 | 
			
		||||
	if (memcmp(db, phash, SHA_DIGEST_LENGTH) != 0 || bad)
 | 
			
		||||
	if (CRYPTO_memcmp(db, phash, SHA_DIGEST_LENGTH) != 0 || bad)
 | 
			
		||||
		goto decoding_err;
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -161,6 +161,7 @@ for($i=0;$i<5;$i++) {
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	teq	$Xi,sp
 | 
			
		||||
	bne	.L_00_15		@ [((11+4)*5+2)*3]
 | 
			
		||||
	sub	sp,sp,#25*4
 | 
			
		||||
___
 | 
			
		||||
	&BODY_00_15(@V);	unshift(@V,pop(@V));
 | 
			
		||||
	&BODY_16_19(@V);	unshift(@V,pop(@V));
 | 
			
		||||
@@ -170,7 +171,6 @@ ___
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
 | 
			
		||||
	ldr	$K,.LK_20_39		@ [+15+16*4]
 | 
			
		||||
	sub	sp,sp,#25*4
 | 
			
		||||
	cmn	sp,#0			@ [+3], clear carry to denote 20_39
 | 
			
		||||
.L_20_39_or_60_79:
 | 
			
		||||
___
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,8 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 | 
			
		||||
die "can't locate x86_64-xlate.pl";
 | 
			
		||||
 | 
			
		||||
open STDOUT,"| $^X $xlate $flavour $output";
 | 
			
		||||
open OUT,"| \"$^X\" $xlate $flavour $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
 | 
			
		||||
$ctx="%rdi";	# 1st arg
 | 
			
		||||
$inp="%rsi";	# 2nd arg
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,8 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 | 
			
		||||
die "can't locate x86_64-xlate.pl";
 | 
			
		||||
 | 
			
		||||
open STDOUT,"| $^X $xlate $flavour $output";
 | 
			
		||||
open OUT,"| \"$^X\" $xlate $flavour $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
 | 
			
		||||
if ($output =~ /512/) {
 | 
			
		||||
	$func="sha512_block_data_order";
 | 
			
		||||
 
 | 
			
		||||
@@ -2056,31 +2056,6 @@ DECLARE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void)
 | 
			
		||||
#define sk_OPENSSL_STRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_STRING, (st))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define sk_OPENSSL_PSTRING_new(cmp) ((STACK_OF(OPENSSL_PSTRING) *)sk_new(CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp)))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_new_null() ((STACK_OF(OPENSSL_PSTRING) *)sk_new_null())
 | 
			
		||||
#define sk_OPENSSL_PSTRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_value(st, i) ((OPENSSL_PSTRING)sk_value(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_num(st) SKM_sk_num(OPENSSL_PSTRING, st)
 | 
			
		||||
#define sk_OPENSSL_PSTRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_FREE_FUNC2(OPENSSL_PSTRING, free_func))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val), i)
 | 
			
		||||
#define sk_OPENSSL_PSTRING_free(st) SKM_sk_free(OPENSSL_PSTRING, st)
 | 
			
		||||
#define sk_OPENSSL_PSTRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i, CHECKED_PTR_OF(OPENSSL_STRING, val))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_zero(st) SKM_sk_zero(OPENSSL_PSTRING, (st))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_PSTRING), st), CHECKED_CONST_PTR_OF(OPENSSL_STRING, val))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_delete(st, i) SKM_sk_delete(OPENSSL_PSTRING, (st), (i))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_delete_ptr(st, ptr) (OPENSSL_PSTRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, ptr))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_set_cmp_func(st, cmp)  \
 | 
			
		||||
	((int (*)(const OPENSSL_STRING * const *,const OPENSSL_STRING * const *)) \
 | 
			
		||||
	sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp)))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_dup(st) SKM_sk_dup(OPENSSL_PSTRING, st)
 | 
			
		||||
#define sk_OPENSSL_PSTRING_shift(st) SKM_sk_shift(OPENSSL_PSTRING, (st))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_pop(st) (OPENSSL_STRING *)sk_pop(CHECKED_STACK_OF(OPENSSL_PSTRING, st))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_sort(st) SKM_sk_sort(OPENSSL_PSTRING, (st))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_PSTRING, (st))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define sk_OPENSSL_BLOCK_new(cmp) ((STACK_OF(OPENSSL_BLOCK) *)sk_new(CHECKED_SK_CMP_FUNC(void, cmp)))
 | 
			
		||||
#define sk_OPENSSL_BLOCK_new_null() ((STACK_OF(OPENSSL_BLOCK) *)sk_new_null())
 | 
			
		||||
#define sk_OPENSSL_BLOCK_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val))
 | 
			
		||||
@@ -2106,6 +2081,31 @@ DECLARE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void)
 | 
			
		||||
#define sk_OPENSSL_BLOCK_is_sorted(st) SKM_sk_is_sorted(OPENSSL_BLOCK, (st))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define sk_OPENSSL_PSTRING_new(cmp) ((STACK_OF(OPENSSL_PSTRING) *)sk_new(CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp)))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_new_null() ((STACK_OF(OPENSSL_PSTRING) *)sk_new_null())
 | 
			
		||||
#define sk_OPENSSL_PSTRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_value(st, i) ((OPENSSL_PSTRING)sk_value(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_num(st) SKM_sk_num(OPENSSL_PSTRING, st)
 | 
			
		||||
#define sk_OPENSSL_PSTRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_FREE_FUNC2(OPENSSL_PSTRING, free_func))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val), i)
 | 
			
		||||
#define sk_OPENSSL_PSTRING_free(st) SKM_sk_free(OPENSSL_PSTRING, st)
 | 
			
		||||
#define sk_OPENSSL_PSTRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i, CHECKED_PTR_OF(OPENSSL_STRING, val))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_zero(st) SKM_sk_zero(OPENSSL_PSTRING, (st))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_PSTRING), st), CHECKED_CONST_PTR_OF(OPENSSL_STRING, val))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_delete(st, i) SKM_sk_delete(OPENSSL_PSTRING, (st), (i))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_delete_ptr(st, ptr) (OPENSSL_PSTRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, ptr))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_set_cmp_func(st, cmp)  \
 | 
			
		||||
	((int (*)(const OPENSSL_STRING * const *,const OPENSSL_STRING * const *)) \
 | 
			
		||||
	sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp)))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_dup(st) SKM_sk_dup(OPENSSL_PSTRING, st)
 | 
			
		||||
#define sk_OPENSSL_PSTRING_shift(st) SKM_sk_shift(OPENSSL_PSTRING, (st))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_pop(st) (OPENSSL_STRING *)sk_pop(CHECKED_STACK_OF(OPENSSL_PSTRING, st))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_sort(st) SKM_sk_sort(OPENSSL_PSTRING, (st))
 | 
			
		||||
#define sk_OPENSSL_PSTRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_PSTRING, (st))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
 | 
			
		||||
	SKM_ASN1_SET_OF_d2i(ACCESS_DESCRIPTION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
 | 
			
		||||
#define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, i2d_func, ex_tag, ex_class, is_set) \
 | 
			
		||||
 
 | 
			
		||||
@@ -294,8 +294,6 @@
 | 
			
		||||
#define ec_GFp_simple_point_set_to_infinity     ec_GFp_simple_pt_set_to_inf
 | 
			
		||||
#undef ec_GFp_simple_points_make_affine
 | 
			
		||||
#define ec_GFp_simple_points_make_affine	ec_GFp_simple_pts_make_affine
 | 
			
		||||
#undef ec_GFp_simple_group_get_curve_GFp
 | 
			
		||||
#define ec_GFp_simple_group_get_curve_GFp       ec_GFp_simple_grp_get_curve_GFp
 | 
			
		||||
#undef ec_GFp_simple_set_Jprojective_coordinates_GFp
 | 
			
		||||
#define ec_GFp_simple_set_Jprojective_coordinates_GFp \
 | 
			
		||||
                                                ec_GFp_smp_set_Jproj_coords_GFp
 | 
			
		||||
 
 | 
			
		||||
@@ -122,7 +122,7 @@
 | 
			
		||||
 * sigaction and fileno included. -pedantic would be more appropriate for
 | 
			
		||||
 * the intended purposes, but we can't prevent users from adding -ansi.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef _POSIX_C_SOURCE
 | 
			
		||||
#if !defined(_POSIX_C_SOURCE) && defined(OPENSSL_SYS_VMS)
 | 
			
		||||
#define _POSIX_C_SOURCE 2
 | 
			
		||||
#endif
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,8 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; my $dir=$1; my $xlate;
 | 
			
		||||
( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 | 
			
		||||
die "can't locate x86_64-xlate.pl";
 | 
			
		||||
 | 
			
		||||
open STDOUT,"| $^X $xlate $flavour $output";
 | 
			
		||||
open OUT,"| \"$^X\" $xlate $flavour $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
 | 
			
		||||
sub L() { $code.=".byte	".join(',',@_)."\n"; }
 | 
			
		||||
sub LL(){ $code.=".byte	".join(',',@_).",".join(',',@_)."\n"; }
 | 
			
		||||
 
 | 
			
		||||
@@ -87,7 +87,7 @@ void X509_LOOKUP_free(X509_LOOKUP *ctx)
 | 
			
		||||
	if (ctx == NULL) return;
 | 
			
		||||
	if (	(ctx->method != NULL) &&
 | 
			
		||||
		(ctx->method->free != NULL))
 | 
			
		||||
		ctx->method->free(ctx);
 | 
			
		||||
		(*ctx->method->free)(ctx);
 | 
			
		||||
	OPENSSL_free(ctx);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -153,7 +153,6 @@ static int x509_subject_cmp(X509 **a, X509 **b)
 | 
			
		||||
int X509_verify_cert(X509_STORE_CTX *ctx)
 | 
			
		||||
	{
 | 
			
		||||
	X509 *x,*xtmp,*chain_ss=NULL;
 | 
			
		||||
	X509_NAME *xn;
 | 
			
		||||
	int bad_chain = 0;
 | 
			
		||||
	X509_VERIFY_PARAM *param = ctx->param;
 | 
			
		||||
	int depth,i,ok=0;
 | 
			
		||||
@@ -205,7 +204,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx)
 | 
			
		||||
		                         */
 | 
			
		||||
 | 
			
		||||
		/* If we are self signed, we break */
 | 
			
		||||
		xn=X509_get_issuer_name(x);
 | 
			
		||||
		if (ctx->check_issued(ctx, x,x)) break;
 | 
			
		||||
 | 
			
		||||
		/* If we were passed a cert chain, use it first */
 | 
			
		||||
@@ -242,7 +240,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx)
 | 
			
		||||
 | 
			
		||||
	i=sk_X509_num(ctx->chain);
 | 
			
		||||
	x=sk_X509_value(ctx->chain,i-1);
 | 
			
		||||
	xn = X509_get_subject_name(x);
 | 
			
		||||
	if (ctx->check_issued(ctx, x, x))
 | 
			
		||||
		{
 | 
			
		||||
		/* we have a self signed certificate */
 | 
			
		||||
@@ -291,7 +288,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx)
 | 
			
		||||
		if (depth < num) break;
 | 
			
		||||
 | 
			
		||||
		/* If we are self signed, we break */
 | 
			
		||||
		xn=X509_get_issuer_name(x);
 | 
			
		||||
		if (ctx->check_issued(ctx,x,x)) break;
 | 
			
		||||
 | 
			
		||||
		ok = ctx->get_issuer(&xtmp, ctx, x);
 | 
			
		||||
@@ -310,7 +306,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	/* we now have our chain, lets check it... */
 | 
			
		||||
	xn=X509_get_issuer_name(x);
 | 
			
		||||
 | 
			
		||||
	/* Is last certificate looked up self signed? */
 | 
			
		||||
	if (!ctx->check_issued(ctx,x,x))
 | 
			
		||||
@@ -877,7 +872,7 @@ static int crl_extension_match(X509_CRL *a, X509_CRL *b, int nid)
 | 
			
		||||
	{
 | 
			
		||||
	ASN1_OCTET_STRING *exta, *extb;
 | 
			
		||||
	int i;
 | 
			
		||||
	i = X509_CRL_get_ext_by_NID(a, nid, 0);
 | 
			
		||||
	i = X509_CRL_get_ext_by_NID(a, nid, -1);
 | 
			
		||||
	if (i >= 0)
 | 
			
		||||
		{
 | 
			
		||||
		/* Can't have multiple occurrences */
 | 
			
		||||
@@ -888,7 +883,7 @@ static int crl_extension_match(X509_CRL *a, X509_CRL *b, int nid)
 | 
			
		||||
	else
 | 
			
		||||
		exta = NULL;
 | 
			
		||||
 | 
			
		||||
	i = X509_CRL_get_ext_by_NID(b, nid, 0);
 | 
			
		||||
	i = X509_CRL_get_ext_by_NID(b, nid, -1);
 | 
			
		||||
 | 
			
		||||
	if (i >= 0)
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -358,6 +358,20 @@ static int ASIdentifierChoice_is_canonical(ASIdentifierChoice *choice)
 | 
			
		||||
      goto done;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Check for inverted range.
 | 
			
		||||
   */
 | 
			
		||||
  i = sk_ASIdOrRange_num(choice->u.asIdsOrRanges) - 1;
 | 
			
		||||
  {
 | 
			
		||||
    ASIdOrRange *a = sk_ASIdOrRange_value(choice->u.asIdsOrRanges, i);
 | 
			
		||||
    ASN1_INTEGER *a_min, *a_max;
 | 
			
		||||
    if (a != NULL && a->type == ASIdOrRange_range) {
 | 
			
		||||
      extract_min_max(a, &a_min, &a_max);
 | 
			
		||||
      if (ASN1_INTEGER_cmp(a_min, a_max) > 0)
 | 
			
		||||
	goto done;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ret = 1;
 | 
			
		||||
 | 
			
		||||
 done:
 | 
			
		||||
@@ -392,9 +406,18 @@ static int ASIdentifierChoice_canonize(ASIdentifierChoice *choice)
 | 
			
		||||
    return 1;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * We have a list.  Sort it.
 | 
			
		||||
   * If not a list, or if empty list, it's broken.
 | 
			
		||||
   */
 | 
			
		||||
  if (choice->type != ASIdentifierChoice_asIdsOrRanges ||
 | 
			
		||||
      sk_ASIdOrRange_num(choice->u.asIdsOrRanges) == 0) {
 | 
			
		||||
    X509V3err(X509V3_F_ASIDENTIFIERCHOICE_CANONIZE,
 | 
			
		||||
	      X509V3_R_EXTENSION_VALUE_ERROR);
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * We have a non-empty list.  Sort it.
 | 
			
		||||
   */
 | 
			
		||||
  OPENSSL_assert(choice->type == ASIdentifierChoice_asIdsOrRanges);
 | 
			
		||||
  sk_ASIdOrRange_sort(choice->u.asIdsOrRanges);
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
@@ -414,6 +437,13 @@ static int ASIdentifierChoice_canonize(ASIdentifierChoice *choice)
 | 
			
		||||
     */
 | 
			
		||||
    OPENSSL_assert(ASN1_INTEGER_cmp(a_min, b_min) <= 0);
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Punt inverted ranges.
 | 
			
		||||
     */
 | 
			
		||||
    if (ASN1_INTEGER_cmp(a_min, a_max) > 0 ||
 | 
			
		||||
	ASN1_INTEGER_cmp(b_min, b_max) > 0)
 | 
			
		||||
      goto done;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Check for overlaps.
 | 
			
		||||
     */
 | 
			
		||||
@@ -465,12 +495,26 @@ static int ASIdentifierChoice_canonize(ASIdentifierChoice *choice)
 | 
			
		||||
	break;
 | 
			
		||||
      }
 | 
			
		||||
      ASIdOrRange_free(b);
 | 
			
		||||
      sk_ASIdOrRange_delete(choice->u.asIdsOrRanges, i + 1);
 | 
			
		||||
      (void) sk_ASIdOrRange_delete(choice->u.asIdsOrRanges, i + 1);
 | 
			
		||||
      i--;
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Check for final inverted range.
 | 
			
		||||
   */
 | 
			
		||||
  i = sk_ASIdOrRange_num(choice->u.asIdsOrRanges) - 1;
 | 
			
		||||
  {
 | 
			
		||||
    ASIdOrRange *a = sk_ASIdOrRange_value(choice->u.asIdsOrRanges, i);
 | 
			
		||||
    ASN1_INTEGER *a_min, *a_max;
 | 
			
		||||
    if (a != NULL && a->type == ASIdOrRange_range) {
 | 
			
		||||
      extract_min_max(a, &a_min, &a_max);
 | 
			
		||||
      if (ASN1_INTEGER_cmp(a_min, a_max) > 0)
 | 
			
		||||
	goto done;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  OPENSSL_assert(ASIdentifierChoice_is_canonical(choice)); /* Paranoia */
 | 
			
		||||
 | 
			
		||||
  ret = 1;
 | 
			
		||||
@@ -498,6 +542,7 @@ static void *v2i_ASIdentifiers(const struct v3_ext_method *method,
 | 
			
		||||
			       struct v3_ext_ctx *ctx,
 | 
			
		||||
			       STACK_OF(CONF_VALUE) *values)
 | 
			
		||||
{
 | 
			
		||||
  ASN1_INTEGER *min = NULL, *max = NULL;
 | 
			
		||||
  ASIdentifiers *asid = NULL;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
@@ -508,7 +553,6 @@ static void *v2i_ASIdentifiers(const struct v3_ext_method *method,
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
 | 
			
		||||
    CONF_VALUE *val = sk_CONF_VALUE_value(values, i);
 | 
			
		||||
    ASN1_INTEGER *min = NULL, *max = NULL;
 | 
			
		||||
    int i1, i2, i3, is_range, which;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
@@ -578,18 +622,19 @@ static void *v2i_ASIdentifiers(const struct v3_ext_method *method,
 | 
			
		||||
      max = s2i_ASN1_INTEGER(NULL, s + i2);
 | 
			
		||||
      OPENSSL_free(s);
 | 
			
		||||
      if (min == NULL || max == NULL) {
 | 
			
		||||
	ASN1_INTEGER_free(min);
 | 
			
		||||
	ASN1_INTEGER_free(max);
 | 
			
		||||
	X509V3err(X509V3_F_V2I_ASIDENTIFIERS, ERR_R_MALLOC_FAILURE);
 | 
			
		||||
	goto err;
 | 
			
		||||
      }
 | 
			
		||||
      if (ASN1_INTEGER_cmp(min, max) > 0) {
 | 
			
		||||
	X509V3err(X509V3_F_V2I_ASIDENTIFIERS, X509V3_R_EXTENSION_VALUE_ERROR);
 | 
			
		||||
	goto err;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (!v3_asid_add_id_or_range(asid, which, min, max)) {
 | 
			
		||||
      ASN1_INTEGER_free(min);
 | 
			
		||||
      ASN1_INTEGER_free(max);
 | 
			
		||||
      X509V3err(X509V3_F_V2I_ASIDENTIFIERS, ERR_R_MALLOC_FAILURE);
 | 
			
		||||
      goto err;
 | 
			
		||||
    }
 | 
			
		||||
    min = max = NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
@@ -601,6 +646,8 @@ static void *v2i_ASIdentifiers(const struct v3_ext_method *method,
 | 
			
		||||
 | 
			
		||||
 err:
 | 
			
		||||
  ASIdentifiers_free(asid);
 | 
			
		||||
  ASN1_INTEGER_free(min);
 | 
			
		||||
  ASN1_INTEGER_free(max);
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -474,11 +474,11 @@ static void x509v3_cache_extensions(X509 *x)
 | 
			
		||||
	for (i = 0; i < X509_get_ext_count(x); i++)
 | 
			
		||||
		{
 | 
			
		||||
		ex = X509_get_ext(x, i);
 | 
			
		||||
		if (!X509_EXTENSION_get_critical(ex))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (OBJ_obj2nid(X509_EXTENSION_get_object(ex))
 | 
			
		||||
					== NID_freshest_crl)
 | 
			
		||||
			x->ex_flags |= EXFLAG_FRESHEST;
 | 
			
		||||
		if (!X509_EXTENSION_get_critical(ex))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (!X509_supported_extension(ex))
 | 
			
		||||
			{
 | 
			
		||||
			x->ex_flags |= EXFLAG_CRITICAL;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,8 @@ if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }
 | 
			
		||||
$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);
 | 
			
		||||
 | 
			
		||||
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
open STDOUT,"| $^X ${dir}perlasm/x86_64-xlate.pl $flavour $output";
 | 
			
		||||
open OUT,"| \"$^X\" ${dir}perlasm/x86_64-xlate.pl $flavour $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
 | 
			
		||||
if ($win64)	{ $arg1="%rcx"; $arg2="%rdx"; }
 | 
			
		||||
else		{ $arg1="%rdi"; $arg2="%rsi"; }
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ following methods:
 | 
			
		||||
 | 
			
		||||
 - in all other cases, proxy certificate validation can be enabled
 | 
			
		||||
   before starting the application by setting the envirnoment variable
 | 
			
		||||
   OPENSSL_ALLOW_PROXY with some non-empty value.
 | 
			
		||||
   OPENSSL_ALLOW_PROXY_CERTS with some non-empty value.
 | 
			
		||||
 | 
			
		||||
There are thoughts to allow proxy certificates with a line in the
 | 
			
		||||
default openssl.cnf, but that's still in the future.
 | 
			
		||||
 
 | 
			
		||||
@@ -39,13 +39,13 @@ prints a usage message.
 | 
			
		||||
 | 
			
		||||
=item B<-newcert>
 | 
			
		||||
 | 
			
		||||
creates a new self signed certificate. The private key and certificate are
 | 
			
		||||
written to the file "newreq.pem".
 | 
			
		||||
creates a new self signed certificate. The private key is written to the file
 | 
			
		||||
"newkey.pem" and the request written to the file "newreq.pem".
 | 
			
		||||
 | 
			
		||||
=item B<-newreq>
 | 
			
		||||
 | 
			
		||||
creates a new certificate request. The private key and request are
 | 
			
		||||
written to the file "newreq.pem".
 | 
			
		||||
creates a new certificate request. The private key is written to the file
 | 
			
		||||
"newkey.pem" and the request written to the file "newreq.pem".
 | 
			
		||||
 | 
			
		||||
=item B<-newreq-nodes>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,8 @@ EVP_MD_CTX_init, EVP_MD_CTX_create, EVP_DigestInit_ex, EVP_DigestUpdate,
 | 
			
		||||
EVP_DigestFinal_ex, EVP_MD_CTX_cleanup, EVP_MD_CTX_destroy, EVP_MAX_MD_SIZE,
 | 
			
		||||
EVP_MD_CTX_copy_ex, EVP_MD_CTX_copy, EVP_MD_type, EVP_MD_pkey_type, EVP_MD_size,
 | 
			
		||||
EVP_MD_block_size, EVP_MD_CTX_md, EVP_MD_CTX_size, EVP_MD_CTX_block_size, EVP_MD_CTX_type,
 | 
			
		||||
EVP_md_null, EVP_md2, EVP_md5, EVP_sha, EVP_sha1, EVP_dss, EVP_dss1, EVP_mdc2,
 | 
			
		||||
EVP_md_null, EVP_md2, EVP_md5, EVP_sha, EVP_sha1, EVP_sha224, EVP_sha256,
 | 
			
		||||
EVP_sha384, EVP_sha512, EVP_dss, EVP_dss1, EVP_mdc2,
 | 
			
		||||
EVP_ripemd160, EVP_get_digestbyname, EVP_get_digestbynid, EVP_get_digestbyobj -
 | 
			
		||||
EVP digest routines
 | 
			
		||||
 | 
			
		||||
@@ -33,16 +34,15 @@ EVP digest routines
 | 
			
		||||
 | 
			
		||||
 int EVP_MD_CTX_copy(EVP_MD_CTX *out,EVP_MD_CTX *in);  
 | 
			
		||||
 | 
			
		||||
 #define EVP_MAX_MD_SIZE (16+20) /* The SSLv3 md5+sha1 type */
 | 
			
		||||
 #define EVP_MAX_MD_SIZE 64	/* SHA512 */
 | 
			
		||||
 | 
			
		||||
 int EVP_MD_type(const EVP_MD *md);
 | 
			
		||||
 int EVP_MD_pkey_type(const EVP_MD *md);	
 | 
			
		||||
 int EVP_MD_size(const EVP_MD *md);
 | 
			
		||||
 int EVP_MD_block_size(const EVP_MD *md);
 | 
			
		||||
 | 
			
		||||
 #define EVP_MD_type(e)			((e)->type)
 | 
			
		||||
 #define EVP_MD_pkey_type(e)		((e)->pkey_type)
 | 
			
		||||
 #define EVP_MD_size(e)			((e)->md_size)
 | 
			
		||||
 #define EVP_MD_block_size(e)		((e)->block_size)
 | 
			
		||||
 | 
			
		||||
 #define EVP_MD_CTX_md(e)		(e)->digest)
 | 
			
		||||
 #define EVP_MD_CTX_size(e)		EVP_MD_size((e)->digest)
 | 
			
		||||
 const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx);
 | 
			
		||||
 #define EVP_MD_CTX_size(e)		EVP_MD_size(EVP_MD_CTX_md(e))
 | 
			
		||||
 #define EVP_MD_CTX_block_size(e)	EVP_MD_block_size((e)->digest)
 | 
			
		||||
 #define EVP_MD_CTX_type(e)		EVP_MD_type((e)->digest)
 | 
			
		||||
 | 
			
		||||
@@ -56,6 +56,11 @@ EVP digest routines
 | 
			
		||||
 const EVP_MD *EVP_mdc2(void);
 | 
			
		||||
 const EVP_MD *EVP_ripemd160(void);
 | 
			
		||||
 | 
			
		||||
 const EVP_MD *EVP_sha224(void);
 | 
			
		||||
 const EVP_MD *EVP_sha256(void);
 | 
			
		||||
 const EVP_MD *EVP_sha384(void);
 | 
			
		||||
 const EVP_MD *EVP_sha512(void);
 | 
			
		||||
 | 
			
		||||
 const EVP_MD *EVP_get_digestbyname(const char *name);
 | 
			
		||||
 #define EVP_get_digestbynid(a) EVP_get_digestbyname(OBJ_nid2sn(a))
 | 
			
		||||
 #define EVP_get_digestbyobj(a) EVP_get_digestbynid(OBJ_obj2nid(a))
 | 
			
		||||
@@ -124,12 +129,14 @@ B<EVP_MD_CTX>.
 | 
			
		||||
 | 
			
		||||
EVP_MD_pkey_type() returns the NID of the public key signing algorithm associated
 | 
			
		||||
with this digest. For example EVP_sha1() is associated with RSA so this will
 | 
			
		||||
return B<NID_sha1WithRSAEncryption>. This "link" between digests and signature
 | 
			
		||||
algorithms may not be retained in future versions of OpenSSL.
 | 
			
		||||
return B<NID_sha1WithRSAEncryption>. Since digests and signature algorithms
 | 
			
		||||
are no longer linked this function is only retained for compatibility
 | 
			
		||||
reasons.
 | 
			
		||||
 | 
			
		||||
EVP_md2(), EVP_md5(), EVP_sha(), EVP_sha1(), EVP_mdc2() and EVP_ripemd160()
 | 
			
		||||
return B<EVP_MD> structures for the MD2, MD5, SHA, SHA1, MDC2 and RIPEMD160 digest
 | 
			
		||||
algorithms respectively. The associated signature algorithm is RSA in each case.
 | 
			
		||||
EVP_md2(), EVP_md5(), EVP_sha(), EVP_sha1(), EVP_sha224(), EVP_sha256(),
 | 
			
		||||
EVP_sha384(), EVP_sha512(), EVP_mdc2() and EVP_ripemd160() return B<EVP_MD>
 | 
			
		||||
structures for the MD2, MD5, SHA, SHA1, SHA224, SHA256, SHA384, SHA512, MDC2
 | 
			
		||||
and RIPEMD160 digest algorithms respectively. 
 | 
			
		||||
 | 
			
		||||
EVP_dss() and EVP_dss1() return B<EVP_MD> structures for SHA and SHA1 digest
 | 
			
		||||
algorithms but using DSS (DSA) for the signature algorithm. Note: there is 
 | 
			
		||||
@@ -171,8 +178,8 @@ The B<EVP> interface to message digests should almost always be used in
 | 
			
		||||
preference to the low level interfaces. This is because the code then becomes
 | 
			
		||||
transparent to the digest used and much more flexible.
 | 
			
		||||
 | 
			
		||||
SHA1 is the digest of choice for new applications. The other digest algorithms
 | 
			
		||||
are still in common use.
 | 
			
		||||
New applications should use the SHA2 digest algorithms such as SHA256. 
 | 
			
		||||
The other digest algorithms are still in common use.
 | 
			
		||||
 | 
			
		||||
For most applications the B<impl> parameter to EVP_DigestInit_ex() will be
 | 
			
		||||
set to NULL to use the default digest implementation.
 | 
			
		||||
@@ -187,6 +194,19 @@ implementations of digests to be specified.
 | 
			
		||||
In OpenSSL 0.9.7 and later if digest contexts are not cleaned up after use
 | 
			
		||||
memory leaks will occur. 
 | 
			
		||||
 | 
			
		||||
Stack allocation of EVP_MD_CTX structures is common, for example:
 | 
			
		||||
 | 
			
		||||
 EVP_MD_CTX mctx;
 | 
			
		||||
 EVP_MD_CTX_init(&mctx);
 | 
			
		||||
 | 
			
		||||
This will cause binary compatibility issues if the size of EVP_MD_CTX
 | 
			
		||||
structure changes (this will only happen with a major release of OpenSSL).
 | 
			
		||||
Applications wishing to avoid this should use EVP_MD_CTX_create() instead:
 | 
			
		||||
 | 
			
		||||
 EVP_MD_CTX *mctx;
 | 
			
		||||
 mctx = EVP_MD_CTX_create();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 EXAMPLE
 | 
			
		||||
 | 
			
		||||
This example digests the data "Test Message\n" and "Hello World\n", using the
 | 
			
		||||
@@ -197,7 +217,7 @@ digest name passed on the command line.
 | 
			
		||||
 | 
			
		||||
 main(int argc, char *argv[])
 | 
			
		||||
 {
 | 
			
		||||
 EVP_MD_CTX mdctx;
 | 
			
		||||
 EVP_MD_CTX *mdctx;
 | 
			
		||||
 const EVP_MD *md;
 | 
			
		||||
 char mess1[] = "Test Message\n";
 | 
			
		||||
 char mess2[] = "Hello World\n";
 | 
			
		||||
@@ -218,12 +238,12 @@ digest name passed on the command line.
 | 
			
		||||
	exit(1);
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
 EVP_MD_CTX_init(&mdctx);
 | 
			
		||||
 EVP_DigestInit_ex(&mdctx, md, NULL);
 | 
			
		||||
 EVP_DigestUpdate(&mdctx, mess1, strlen(mess1));
 | 
			
		||||
 EVP_DigestUpdate(&mdctx, mess2, strlen(mess2));
 | 
			
		||||
 EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
 | 
			
		||||
 EVP_MD_CTX_cleanup(&mdctx);
 | 
			
		||||
 mdctx = EVP_MD_CTX_create();
 | 
			
		||||
 EVP_DigestInit_ex(mdctx, md, NULL);
 | 
			
		||||
 EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
 | 
			
		||||
 EVP_DigestUpdate(mdctx, mess2, strlen(mess2));
 | 
			
		||||
 EVP_DigestFinal_ex(mdctx, md_value, &md_len);
 | 
			
		||||
 EVP_MD_CTX_destroy(mdctx);
 | 
			
		||||
 | 
			
		||||
 printf("Digest is: ");
 | 
			
		||||
 for(i = 0; i < md_len; i++) printf("%02x", md_value[i]);
 | 
			
		||||
 
 | 
			
		||||
@@ -117,7 +117,7 @@ L<EVP_PKEY_encrypt(3)|EVP_PKEY_encrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_decrypt(3)|EVP_PKEY_decrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_sign(3)|EVP_PKEY_sign(3)>,
 | 
			
		||||
L<EVP_PKEY_verify(3)|EVP_PKEY_verify(3)>,
 | 
			
		||||
L<EVP_PKEY_verifyrecover(3)|EVP_PKEY_verifyrecover(3)>,
 | 
			
		||||
L<EVP_PKEY_verify_recover(3)|EVP_PKEY_verify_recover(3)>,
 | 
			
		||||
L<EVP_PKEY_derive(3)|EVP_PKEY_derive(3)> 
 | 
			
		||||
L<EVP_PKEY_keygen(3)|EVP_PKEY_keygen(3)> 
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -83,7 +83,7 @@ L<EVP_PKEY_CTX_new(3)|EVP_PKEY_CTX_new(3)>,
 | 
			
		||||
L<EVP_PKEY_encrypt(3)|EVP_PKEY_encrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_sign(3)|EVP_PKEY_sign(3)>,
 | 
			
		||||
L<EVP_PKEY_verify(3)|EVP_PKEY_verify(3)>,
 | 
			
		||||
L<EVP_PKEY_verifyrecover(3)|EVP_PKEY_verifyrecover(3)>,
 | 
			
		||||
L<EVP_PKEY_verify_recover(3)|EVP_PKEY_verify_recover(3)>,
 | 
			
		||||
L<EVP_PKEY_derive(3)|EVP_PKEY_derive(3)> 
 | 
			
		||||
 | 
			
		||||
=head1 HISTORY
 | 
			
		||||
 
 | 
			
		||||
@@ -84,7 +84,7 @@ L<EVP_PKEY_encrypt(3)|EVP_PKEY_encrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_decrypt(3)|EVP_PKEY_decrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_sign(3)|EVP_PKEY_sign(3)>,
 | 
			
		||||
L<EVP_PKEY_verify(3)|EVP_PKEY_verify(3)>,
 | 
			
		||||
L<EVP_PKEY_verifyrecover(3)|EVP_PKEY_verifyrecover(3)>,
 | 
			
		||||
L<EVP_PKEY_verify_recover(3)|EVP_PKEY_verify_recover(3)>,
 | 
			
		||||
 | 
			
		||||
=head1 HISTORY
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -83,7 +83,7 @@ L<EVP_PKEY_CTX_new(3)|EVP_PKEY_CTX_new(3)>,
 | 
			
		||||
L<EVP_PKEY_decrypt(3)|EVP_PKEY_decrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_sign(3)|EVP_PKEY_sign(3)>,
 | 
			
		||||
L<EVP_PKEY_verify(3)|EVP_PKEY_verify(3)>,
 | 
			
		||||
L<EVP_PKEY_verifyrecover(3)|EVP_PKEY_verifyrecover(3)>,
 | 
			
		||||
L<EVP_PKEY_verify_recover(3)|EVP_PKEY_verify_recover(3)>,
 | 
			
		||||
L<EVP_PKEY_derive(3)|EVP_PKEY_derive(3)> 
 | 
			
		||||
 | 
			
		||||
=head1 HISTORY
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ public key algorithm.
 | 
			
		||||
L<EVP_PKEY_CTX_new(3)|EVP_PKEY_CTX_new(3)>,
 | 
			
		||||
L<EVP_PKEY_sign(3)|EVP_PKEY_sign(3)>,
 | 
			
		||||
L<EVP_PKEY_verify(3)|EVP_PKEY_verify(3)>,
 | 
			
		||||
L<EVP_PKEY_verifyrecover(3)|EVP_PKEY_verifyrecover(3)>,
 | 
			
		||||
L<EVP_PKEY_verify_recover(3)|EVP_PKEY_verify_recover(3)>,
 | 
			
		||||
 | 
			
		||||
=head1 HISTORY
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -151,7 +151,7 @@ L<EVP_PKEY_encrypt(3)|EVP_PKEY_encrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_decrypt(3)|EVP_PKEY_decrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_sign(3)|EVP_PKEY_sign(3)>,
 | 
			
		||||
L<EVP_PKEY_verify(3)|EVP_PKEY_verify(3)>,
 | 
			
		||||
L<EVP_PKEY_verifyrecover(3)|EVP_PKEY_verifyrecover(3)>,
 | 
			
		||||
L<EVP_PKEY_verify_recover(3)|EVP_PKEY_verify_recover(3)>,
 | 
			
		||||
L<EVP_PKEY_derive(3)|EVP_PKEY_derive(3)> 
 | 
			
		||||
 | 
			
		||||
=head1 HISTORY
 | 
			
		||||
 
 | 
			
		||||
@@ -86,7 +86,7 @@ L<EVP_PKEY_CTX_new(3)|EVP_PKEY_CTX_new(3)>,
 | 
			
		||||
L<EVP_PKEY_encrypt(3)|EVP_PKEY_encrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_decrypt(3)|EVP_PKEY_decrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_verify(3)|EVP_PKEY_verify(3)>,
 | 
			
		||||
L<EVP_PKEY_verifyrecover(3)|EVP_PKEY_verifyrecover(3)>,
 | 
			
		||||
L<EVP_PKEY_verify_recover(3)|EVP_PKEY_verify_recover(3)>,
 | 
			
		||||
L<EVP_PKEY_derive(3)|EVP_PKEY_derive(3)> 
 | 
			
		||||
 | 
			
		||||
=head1 HISTORY
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,7 @@ L<EVP_PKEY_CTX_new(3)|EVP_PKEY_CTX_new(3)>,
 | 
			
		||||
L<EVP_PKEY_encrypt(3)|EVP_PKEY_encrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_decrypt(3)|EVP_PKEY_decrypt(3)>,
 | 
			
		||||
L<EVP_PKEY_sign(3)|EVP_PKEY_sign(3)>,
 | 
			
		||||
L<EVP_PKEY_verifyrecover(3)|EVP_PKEY_verifyrecover(3)>,
 | 
			
		||||
L<EVP_PKEY_verify_recover(3)|EVP_PKEY_verify_recover(3)>,
 | 
			
		||||
L<EVP_PKEY_derive(3)|EVP_PKEY_derive(3)> 
 | 
			
		||||
 | 
			
		||||
=head1 HISTORY
 | 
			
		||||
 
 | 
			
		||||
@@ -2,23 +2,23 @@
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
EVP_PKEY_verifyrecover_init, EVP_PKEY_verifyrecover - recover signature using a public key algorithm
 | 
			
		||||
EVP_PKEY_verify_recover_init, EVP_PKEY_verify_recover - recover signature using a public key algorithm
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 #include <openssl/evp.h>
 | 
			
		||||
 | 
			
		||||
 int EVP_PKEY_verifyrecover_init(EVP_PKEY_CTX *ctx);
 | 
			
		||||
 int EVP_PKEY_verifyrecover(EVP_PKEY_CTX *ctx,
 | 
			
		||||
 int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx);
 | 
			
		||||
 int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx,
 | 
			
		||||
			unsigned char *rout, size_t *routlen,
 | 
			
		||||
			const unsigned char *sig, size_t siglen);
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The EVP_PKEY_verifyrecover_init() function initializes a public key algorithm
 | 
			
		||||
The EVP_PKEY_verify_recover_init() function initializes a public key algorithm
 | 
			
		||||
context using key B<pkey> for a verify recover operation.
 | 
			
		||||
 | 
			
		||||
The EVP_PKEY_verifyrecover() function recovers signed data
 | 
			
		||||
The EVP_PKEY_verify_recover() function recovers signed data
 | 
			
		||||
using B<ctx>. The signature is specified using the B<sig> and
 | 
			
		||||
B<siglen> parameters. If B<rout> is B<NULL> then the maximum size of the output
 | 
			
		||||
buffer is written to the B<routlen> parameter. If B<rout> is not B<NULL> then
 | 
			
		||||
@@ -36,16 +36,16 @@ Sometimes however it is useful to obtain the data originally signed using a
 | 
			
		||||
signing operation. Only certain public key algorithms can recover a signature
 | 
			
		||||
in this way (for example RSA in PKCS padding mode).
 | 
			
		||||
 | 
			
		||||
After the call to EVP_PKEY_verifyrecover_init() algorithm specific control
 | 
			
		||||
After the call to EVP_PKEY_verify_recover_init() algorithm specific control
 | 
			
		||||
operations can be performed to set any appropriate parameters for the
 | 
			
		||||
operation.
 | 
			
		||||
 | 
			
		||||
The function EVP_PKEY_verifyrecover() can be called more than once on the same
 | 
			
		||||
The function EVP_PKEY_verify_recover() can be called more than once on the same
 | 
			
		||||
context if several operations are performed using the same parameters.
 | 
			
		||||
 | 
			
		||||
=head1 RETURN VALUES
 | 
			
		||||
 | 
			
		||||
EVP_PKEY_verifyrecover_init() and EVP_PKEY_verifyrecover() return 1 for success
 | 
			
		||||
EVP_PKEY_verify_recover_init() and EVP_PKEY_verify_recover() return 1 for success
 | 
			
		||||
and 0 or a negative value for failure. In particular a return value of -2
 | 
			
		||||
indicates the operation is not supported by the public key algorithm.
 | 
			
		||||
 | 
			
		||||
@@ -66,7 +66,7 @@ Recover digest originally signed using PKCS#1 and SHA256 digest:
 | 
			
		||||
 ctx = EVP_PKEY_CTX_new(verify_key);
 | 
			
		||||
 if (!ctx)
 | 
			
		||||
	/* Error occurred */
 | 
			
		||||
 if (EVP_PKEY_verifyrecover_init(ctx) <= 0)
 | 
			
		||||
 if (EVP_PKEY_verify_recover_init(ctx) <= 0)
 | 
			
		||||
	/* Error */
 | 
			
		||||
 if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0)
 | 
			
		||||
	/* Error */
 | 
			
		||||
@@ -74,7 +74,7 @@ Recover digest originally signed using PKCS#1 and SHA256 digest:
 | 
			
		||||
	/* Error */
 | 
			
		||||
 | 
			
		||||
 /* Determine buffer length */
 | 
			
		||||
 if (EVP_PKEY_verifyrecover(ctx, NULL, &routlen, sig, siglen) <= 0)
 | 
			
		||||
 if (EVP_PKEY_verify_recover(ctx, NULL, &routlen, sig, siglen) <= 0)
 | 
			
		||||
	/* Error */
 | 
			
		||||
 | 
			
		||||
 rout = OPENSSL_malloc(routlen);
 | 
			
		||||
@@ -82,7 +82,7 @@ Recover digest originally signed using PKCS#1 and SHA256 digest:
 | 
			
		||||
 if (!rout)
 | 
			
		||||
	/* malloc failure */
 | 
			
		||||
 
 | 
			
		||||
 if (EVP_PKEY_verifyrecover(ctx, rout, &routlen, sig, siglen) <= 0)
 | 
			
		||||
 if (EVP_PKEY_verify_recover(ctx, rout, &routlen, sig, siglen) <= 0)
 | 
			
		||||
	/* Error */
 | 
			
		||||
 | 
			
		||||
 /* Recovered data is routlen bytes written to buffer rout */
 | 
			
		||||
@@ -114,7 +114,7 @@ using the public key B<eckey>.
 | 
			
		||||
 | 
			
		||||
ECDSA_size() returns the maximum length signature or 0 on error.
 | 
			
		||||
 | 
			
		||||
ECDSA_sign_setup() and ECDSA_sign() return 1 if successful or -1
 | 
			
		||||
ECDSA_sign_setup() and ECDSA_sign() return 1 if successful or 0
 | 
			
		||||
on error.
 | 
			
		||||
 | 
			
		||||
ECDSA_verify() and ECDSA_do_verify() return 1 for a valid
 | 
			
		||||
 
 | 
			
		||||
@@ -369,7 +369,13 @@ int gost_mac(gost_ctx *ctx,int mac_len,const unsigned char *data,
 | 
			
		||||
		memset(buf2,0,8);
 | 
			
		||||
		memcpy(buf2,data+i,data_len-i);
 | 
			
		||||
		mac_block(ctx,buffer,buf2);
 | 
			
		||||
		}	
 | 
			
		||||
		i+=8;
 | 
			
		||||
		}
 | 
			
		||||
	if (i==8)
 | 
			
		||||
		{
 | 
			
		||||
		memset(buf2,0,8);
 | 
			
		||||
		mac_block(ctx,buffer,buf2);
 | 
			
		||||
		}
 | 
			
		||||
	get_mac(buffer,mac_len,mac);
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
@@ -389,7 +395,13 @@ int gost_mac_iv(gost_ctx *ctx,int mac_len,const unsigned char *iv,const unsigned
 | 
			
		||||
		memset(buf2,0,8);
 | 
			
		||||
		memcpy(buf2,data+i,data_len-i);
 | 
			
		||||
		mac_block(ctx,buffer,buf2);
 | 
			
		||||
		i+=8;
 | 
			
		||||
		}	
 | 
			
		||||
	if (i==8)
 | 
			
		||||
		{
 | 
			
		||||
		memset(buf2,0,8);
 | 
			
		||||
		mac_block(ctx,buffer,buf2);
 | 
			
		||||
		}
 | 
			
		||||
	get_mac(buffer,mac_len,mac);
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,14 @@
 | 
			
		||||
#include <openssl/rand.h>
 | 
			
		||||
#include "e_gost_err.h"
 | 
			
		||||
#include "gost_lcl.h"
 | 
			
		||||
 | 
			
		||||
#if !defined(CCGOST_DEBUG) && !defined(DEBUG)
 | 
			
		||||
# ifndef NDEBUG
 | 
			
		||||
#  define NDEBUG
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
static int gost_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, 
 | 
			
		||||
	const unsigned char *iv, int enc);
 | 
			
		||||
static int	gost_cipher_init_cpa(EVP_CIPHER_CTX *ctx, const unsigned char *key,
 | 
			
		||||
@@ -206,12 +214,13 @@ int gost_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
 | 
			
		||||
static void gost_crypt_mesh (void *ctx,unsigned char *iv,unsigned char *buf)
 | 
			
		||||
	{
 | 
			
		||||
	struct ossl_gost_cipher_ctx *c = ctx;
 | 
			
		||||
	if (c->count&&c->key_meshing && c->count%1024==0)
 | 
			
		||||
	assert(c->count%8 == 0 && c->count <= 1024);
 | 
			
		||||
	if (c->key_meshing && c->count==1024)
 | 
			
		||||
		{
 | 
			
		||||
		cryptopro_key_meshing(&(c->cctx),iv);
 | 
			
		||||
		}	
 | 
			
		||||
	gostcrypt(&(c->cctx),iv,buf);
 | 
			
		||||
	c->count+=8;
 | 
			
		||||
	c->count = c->count%1024 + 8;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static void gost_cnt_next (void *ctx, unsigned char *iv, unsigned char *buf)
 | 
			
		||||
@@ -219,7 +228,8 @@ static void gost_cnt_next (void *ctx, unsigned char *iv, unsigned char *buf)
 | 
			
		||||
	struct ossl_gost_cipher_ctx *c = ctx;
 | 
			
		||||
	word32 g,go;
 | 
			
		||||
	unsigned char buf1[8];
 | 
			
		||||
	if (c->count && c->key_meshing && c->count %1024 ==0)
 | 
			
		||||
	assert(c->count%8 == 0 && c->count <= 1024);
 | 
			
		||||
	if (c->key_meshing && c->count==1024)
 | 
			
		||||
		{
 | 
			
		||||
		cryptopro_key_meshing(&(c->cctx),iv);
 | 
			
		||||
		}
 | 
			
		||||
@@ -248,7 +258,7 @@ static void gost_cnt_next (void *ctx, unsigned char *iv, unsigned char *buf)
 | 
			
		||||
	buf1[7]=(unsigned char)((g>>24)&0xff);
 | 
			
		||||
	memcpy(iv,buf1,8);
 | 
			
		||||
	gostcrypt(&(c->cctx),buf1,buf);
 | 
			
		||||
	c->count +=8;
 | 
			
		||||
	c->count = c->count%1024 + 8;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
/* GOST encryption in CFB mode */
 | 
			
		||||
@@ -511,12 +521,13 @@ static void mac_block_mesh(struct ossl_gost_imit_ctx *c,const unsigned char *dat
 | 
			
		||||
	 * interpret internal state of MAC algorithm as iv during keymeshing
 | 
			
		||||
	 * (but does initialize internal state from iv in key transport
 | 
			
		||||
	 */
 | 
			
		||||
	if (c->key_meshing&& c->count && c->count %1024 ==0)
 | 
			
		||||
	assert(c->count%8 == 0 && c->count <= 1024);
 | 
			
		||||
	if (c->key_meshing && c->count==1024)
 | 
			
		||||
		{
 | 
			
		||||
		cryptopro_key_meshing(&(c->cctx),buffer);
 | 
			
		||||
		}
 | 
			
		||||
	mac_block(&(c->cctx),c->buffer,data);
 | 
			
		||||
	c->count +=8;
 | 
			
		||||
	c->count = c->count%1024 + 8;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
int gost_imit_update(EVP_MD_CTX *ctx, const void *data, size_t count)
 | 
			
		||||
@@ -565,6 +576,12 @@ int gost_imit_final(EVP_MD_CTX *ctx,unsigned char *md)
 | 
			
		||||
		GOSTerr(GOST_F_GOST_IMIT_FINAL, GOST_R_MAC_KEY_NOT_SET);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	if (c->count==0 && c->bytes_left)
 | 
			
		||||
		{
 | 
			
		||||
		unsigned char buffer[8];
 | 
			
		||||
		memset(buffer, 0, 8);
 | 
			
		||||
		gost_imit_update(ctx, buffer, 8);
 | 
			
		||||
		}
 | 
			
		||||
	if (c->bytes_left)
 | 
			
		||||
		{
 | 
			
		||||
		int i;
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,13 @@ static int gost_engine_finish(ENGINE *e)
 | 
			
		||||
static int gost_engine_destroy(ENGINE *e)
 | 
			
		||||
	{ 
 | 
			
		||||
	gost_param_free();
 | 
			
		||||
 | 
			
		||||
	pmeth_GostR3410_94 = NULL;
 | 
			
		||||
	pmeth_GostR3410_2001 = NULL;
 | 
			
		||||
	pmeth_Gost28147_MAC = NULL;
 | 
			
		||||
	ameth_GostR3410_94 = NULL;
 | 
			
		||||
	ameth_GostR3410_2001 = NULL;
 | 
			
		||||
	ameth_Gost28147_MAC = NULL;
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -263,7 +270,10 @@ static ENGINE *engine_gost(void)
 | 
			
		||||
	
 | 
			
		||||
void ENGINE_load_gost(void)
 | 
			
		||||
	{
 | 
			
		||||
	ENGINE *toadd =engine_gost();
 | 
			
		||||
	ENGINE *toadd;
 | 
			
		||||
	if (pmeth_GostR3410_94)
 | 
			
		||||
		return;
 | 
			
		||||
	toadd = engine_gost();
 | 
			
		||||
	if (!toadd) return;
 | 
			
		||||
	ENGINE_add(toadd);
 | 
			
		||||
	ENGINE_free(toadd);
 | 
			
		||||
 
 | 
			
		||||
@@ -136,7 +136,7 @@ extern EVP_MD imit_gost_cpa;
 | 
			
		||||
/* Cipher context used for EVP_CIPHER operation */
 | 
			
		||||
struct ossl_gost_cipher_ctx {
 | 
			
		||||
	int paramNID;
 | 
			
		||||
	off_t count;
 | 
			
		||||
	unsigned int count;
 | 
			
		||||
	int key_meshing;
 | 
			
		||||
	gost_ctx cctx;
 | 
			
		||||
};	
 | 
			
		||||
@@ -151,7 +151,7 @@ struct ossl_gost_imit_ctx {
 | 
			
		||||
	gost_ctx cctx;
 | 
			
		||||
	unsigned char buffer[8];
 | 
			
		||||
	unsigned char partial_block[8];
 | 
			
		||||
	off_t count;
 | 
			
		||||
	unsigned int count;
 | 
			
		||||
	int key_meshing;
 | 
			
		||||
	int bytes_left;
 | 
			
		||||
	int key_set;
 | 
			
		||||
 
 | 
			
		||||
@@ -123,7 +123,7 @@ static int pkey_gost_ctrl94_str(EVP_PKEY_CTX *ctx,
 | 
			
		||||
			}
 | 
			
		||||
		if (strlen(value) == 1)
 | 
			
		||||
			{
 | 
			
		||||
			switch(toupper(value[0]))
 | 
			
		||||
			switch(toupper((unsigned char)value[0]))
 | 
			
		||||
				{
 | 
			
		||||
				case 'A':
 | 
			
		||||
					param_nid = NID_id_GostR3410_94_CryptoPro_A_ParamSet;
 | 
			
		||||
@@ -142,9 +142,9 @@ static int pkey_gost_ctrl94_str(EVP_PKEY_CTX *ctx,
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		else if ((strlen(value) == 2) && (toupper(value[0]) == 'X'))
 | 
			
		||||
		else if ((strlen(value) == 2) && (toupper((unsigned char)value[0]) == 'X'))
 | 
			
		||||
			{
 | 
			
		||||
			switch (toupper(value[1]))
 | 
			
		||||
			switch (toupper((unsigned char)value[1]))
 | 
			
		||||
				{
 | 
			
		||||
				case 'A':
 | 
			
		||||
					param_nid = NID_id_GostR3410_94_CryptoPro_XchA_ParamSet;
 | 
			
		||||
@@ -198,7 +198,7 @@ static int pkey_gost_ctrl01_str(EVP_PKEY_CTX *ctx,
 | 
			
		||||
			}
 | 
			
		||||
		if (strlen(value) == 1)
 | 
			
		||||
			{
 | 
			
		||||
			switch(toupper(value[0]))
 | 
			
		||||
			switch(toupper((unsigned char)value[0]))
 | 
			
		||||
				{
 | 
			
		||||
				case 'A':
 | 
			
		||||
					param_nid = NID_id_GostR3410_2001_CryptoPro_A_ParamSet;
 | 
			
		||||
@@ -217,9 +217,9 @@ static int pkey_gost_ctrl01_str(EVP_PKEY_CTX *ctx,
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		else if ((strlen(value) == 2) && (toupper(value[0]) == 'X'))
 | 
			
		||||
		else if ((strlen(value) == 2) && (toupper((unsigned char)value[0]) == 'X'))
 | 
			
		||||
			{
 | 
			
		||||
			switch (toupper(value[1]))
 | 
			
		||||
			switch (toupper((unsigned char)value[1]))
 | 
			
		||||
				{
 | 
			
		||||
				case 'A':
 | 
			
		||||
					param_nid = NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet;
 | 
			
		||||
@@ -521,6 +521,7 @@ static int pkey_gost_mac_ctrl_str(EVP_PKEY_CTX *ctx,
 | 
			
		||||
				{
 | 
			
		||||
				GOSTerr(GOST_F_PKEY_GOST_MAC_CTRL_STR,
 | 
			
		||||
					GOST_R_INVALID_MAC_KEY_LENGTH);
 | 
			
		||||
				OPENSSL_free(keybuf);
 | 
			
		||||
				return 0;	
 | 
			
		||||
				}
 | 
			
		||||
			ret= pkey_gost_mac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY,
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ static void circle_xor8 (const byte *w, byte *k)
 | 
			
		||||
	byte buf[8];
 | 
			
		||||
	int i;
 | 
			
		||||
	memcpy(buf,w,8);
 | 
			
		||||
	memcpy(k,w+8,24);
 | 
			
		||||
	memmove(k,w+8,24);
 | 
			
		||||
	for(i=0;i<8;i++) 
 | 
			
		||||
		k[i+24]=buf[i]^k[i];
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -442,28 +442,36 @@ static int capi_init(ENGINE *e)
 | 
			
		||||
	CAPI_CTX *ctx;
 | 
			
		||||
	const RSA_METHOD *ossl_rsa_meth;
 | 
			
		||||
	const DSA_METHOD *ossl_dsa_meth;
 | 
			
		||||
	capi_idx = ENGINE_get_ex_new_index(0, NULL, NULL, NULL, 0);
 | 
			
		||||
	cert_capi_idx = X509_get_ex_new_index(0, NULL, NULL, NULL, 0);
 | 
			
		||||
 | 
			
		||||
	if (capi_idx < 0)
 | 
			
		||||
		{
 | 
			
		||||
		capi_idx = ENGINE_get_ex_new_index(0, NULL, NULL, NULL, 0);
 | 
			
		||||
		if (capi_idx < 0)
 | 
			
		||||
			goto memerr;
 | 
			
		||||
 | 
			
		||||
		cert_capi_idx = X509_get_ex_new_index(0, NULL, NULL, NULL, 0);
 | 
			
		||||
 | 
			
		||||
		/* Setup RSA_METHOD */
 | 
			
		||||
		rsa_capi_idx = RSA_get_ex_new_index(0, NULL, NULL, NULL, 0);
 | 
			
		||||
		ossl_rsa_meth = RSA_PKCS1_SSLeay();
 | 
			
		||||
		capi_rsa_method.rsa_pub_enc = ossl_rsa_meth->rsa_pub_enc;
 | 
			
		||||
		capi_rsa_method.rsa_pub_dec = ossl_rsa_meth->rsa_pub_dec;
 | 
			
		||||
		capi_rsa_method.rsa_mod_exp = ossl_rsa_meth->rsa_mod_exp;
 | 
			
		||||
		capi_rsa_method.bn_mod_exp = ossl_rsa_meth->bn_mod_exp;
 | 
			
		||||
 | 
			
		||||
		/* Setup DSA Method */
 | 
			
		||||
		dsa_capi_idx = DSA_get_ex_new_index(0, NULL, NULL, NULL, 0);
 | 
			
		||||
		ossl_dsa_meth = DSA_OpenSSL();
 | 
			
		||||
		capi_dsa_method.dsa_do_verify = ossl_dsa_meth->dsa_do_verify;
 | 
			
		||||
		capi_dsa_method.dsa_mod_exp = ossl_dsa_meth->dsa_mod_exp;
 | 
			
		||||
		capi_dsa_method.bn_mod_exp = ossl_dsa_meth->bn_mod_exp;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	ctx = capi_ctx_new();
 | 
			
		||||
	if (!ctx || (capi_idx < 0))
 | 
			
		||||
	if (!ctx)
 | 
			
		||||
		goto memerr;
 | 
			
		||||
 | 
			
		||||
	ENGINE_set_ex_data(e, capi_idx, ctx);
 | 
			
		||||
	/* Setup RSA_METHOD */
 | 
			
		||||
	rsa_capi_idx = RSA_get_ex_new_index(0, NULL, NULL, NULL, 0);
 | 
			
		||||
	ossl_rsa_meth = RSA_PKCS1_SSLeay();
 | 
			
		||||
	capi_rsa_method.rsa_pub_enc = ossl_rsa_meth->rsa_pub_enc;
 | 
			
		||||
	capi_rsa_method.rsa_pub_dec = ossl_rsa_meth->rsa_pub_dec;
 | 
			
		||||
	capi_rsa_method.rsa_mod_exp = ossl_rsa_meth->rsa_mod_exp;
 | 
			
		||||
	capi_rsa_method.bn_mod_exp = ossl_rsa_meth->bn_mod_exp;
 | 
			
		||||
 | 
			
		||||
	/* Setup DSA Method */
 | 
			
		||||
	dsa_capi_idx = DSA_get_ex_new_index(0, NULL, NULL, NULL, 0);
 | 
			
		||||
	ossl_dsa_meth = DSA_OpenSSL();
 | 
			
		||||
	capi_dsa_method.dsa_do_verify = ossl_dsa_meth->dsa_do_verify;
 | 
			
		||||
	capi_dsa_method.dsa_mod_exp = ossl_dsa_meth->dsa_mod_exp;
 | 
			
		||||
	capi_dsa_method.bn_mod_exp = ossl_dsa_meth->bn_mod_exp;
 | 
			
		||||
 | 
			
		||||
#ifdef OPENSSL_CAPIENG_DIALOG
 | 
			
		||||
	{
 | 
			
		||||
@@ -1155,6 +1163,7 @@ static int capi_list_containers(CAPI_CTX *ctx, BIO *out)
 | 
			
		||||
		{
 | 
			
		||||
		CAPIerr(CAPI_F_CAPI_LIST_CONTAINERS, CAPI_R_ENUMCONTAINERS_ERROR);
 | 
			
		||||
		capi_addlasterror();
 | 
			
		||||
		CryptReleaseContext(hprov, 0);
 | 
			
		||||
		return 0;
 | 
			
		||||
		}
 | 
			
		||||
	CAPI_trace(ctx, "Got max container len %d\n", buflen);
 | 
			
		||||
@@ -1422,10 +1431,13 @@ static PCCERT_CONTEXT capi_find_cert(CAPI_CTX *ctx, const char *id, HCERTSTORE h
 | 
			
		||||
static CAPI_KEY *capi_get_key(CAPI_CTX *ctx, const char *contname, char *provname, DWORD ptype, DWORD keyspec)
 | 
			
		||||
	{
 | 
			
		||||
	CAPI_KEY *key;
 | 
			
		||||
    DWORD dwFlags = 0; 
 | 
			
		||||
	key = OPENSSL_malloc(sizeof(CAPI_KEY));
 | 
			
		||||
	CAPI_trace(ctx, "capi_get_key, contname=%s, provname=%s, type=%d\n", 
 | 
			
		||||
						contname, provname, ptype);
 | 
			
		||||
	if (!CryptAcquireContextA(&key->hprov, contname, provname, ptype, 0))
 | 
			
		||||
    if(ctx->store_flags & CERT_SYSTEM_STORE_LOCAL_MACHINE)
 | 
			
		||||
        dwFlags = CRYPT_MACHINE_KEYSET;
 | 
			
		||||
    if (!CryptAcquireContextA(&key->hprov, contname, provname, ptype, dwFlags)) 
 | 
			
		||||
		{
 | 
			
		||||
		CAPIerr(CAPI_F_CAPI_GET_KEY, CAPI_R_CRYPTACQUIRECONTEXT_ERROR);
 | 
			
		||||
		capi_addlasterror();
 | 
			
		||||
@@ -1572,6 +1584,8 @@ static int capi_ctx_set_provname(CAPI_CTX *ctx, LPSTR pname, DWORD type, int che
 | 
			
		||||
			}
 | 
			
		||||
		CryptReleaseContext(hprov, 0);
 | 
			
		||||
		}
 | 
			
		||||
	if (ctx->cspname)
 | 
			
		||||
		OPENSSL_free(ctx->cspname);
 | 
			
		||||
	ctx->cspname = BUF_strdup(pname);
 | 
			
		||||
	ctx->csptype = type;
 | 
			
		||||
	return 1;
 | 
			
		||||
@@ -1581,9 +1595,12 @@ static int capi_ctx_set_provname_idx(CAPI_CTX *ctx, int idx)
 | 
			
		||||
	{
 | 
			
		||||
	LPSTR pname;
 | 
			
		||||
	DWORD type;
 | 
			
		||||
	int res;
 | 
			
		||||
	if (capi_get_provname(ctx, &pname, &type, idx) != 1)
 | 
			
		||||
		return 0;
 | 
			
		||||
	return capi_ctx_set_provname(ctx, pname, type, 0);
 | 
			
		||||
	res = capi_ctx_set_provname(ctx, pname, type, 0);
 | 
			
		||||
	OPENSSL_free(pname);
 | 
			
		||||
	return res;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int cert_issuer_match(STACK_OF(X509_NAME) *ca_dn, X509 *x)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,8 @@
 | 
			
		||||
 | 
			
		||||
$output=shift;
 | 
			
		||||
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
open STDOUT,"| $^X ${dir}../crypto/perlasm/x86_64-xlate.pl $output";
 | 
			
		||||
open OUT,"| \"$^X\" ${dir}../crypto/perlasm/x86_64-xlate.pl $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
push(@INC,"${dir}.");
 | 
			
		||||
 | 
			
		||||
require "uplink-common.pl";
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
%define libmaj 1
 | 
			
		||||
%define libmin 0
 | 
			
		||||
%define librel 0
 | 
			
		||||
%define librev f
 | 
			
		||||
%define librev k
 | 
			
		||||
Release: 1
 | 
			
		||||
 | 
			
		||||
%define openssldir /var/ssl
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user