Compare commits

..

1378 Commits

Author SHA1 Message Date
Ben Laurie
55e81315dc Fix selftest. 2004-05-06 15:36:28 +00:00
Richard Levitte
9227a5912f Recent changes from 0.9.7-stable. 2004-05-06 09:54:50 +00:00
Ben Laurie
f7376e8ebc Final(?) version of test suite. 2004-04-30 09:14:48 +00:00
Richard Levitte
75fb38c7eb Recent changes from 0.9.7-stable. 2004-04-29 19:10:52 +00:00
Ben Laurie
ccabc6f49a P, not T. 2004-04-28 10:20:21 +00:00
Ben Laurie
8343bcfb2b Fix self-test. 2004-04-28 10:20:03 +00:00
Ben Laurie
8435dc4e8d Finish moving FIPS_allow_md5(). 2004-04-27 13:38:14 +00:00
Dr. Stephen Henson
50c3727624 Update from main branch. 2004-04-22 12:37:53 +00:00
Richard Levitte
15c6cbd464 Recent changes from 0.9.7-stable. 2004-04-21 16:03:00 +00:00
Richard Levitte
a6b8e925bc Another small bug fix. Notified by cipo <cseplo_l@netlock.net> 2004-04-20 10:27:03 +00:00
Richard Levitte
d2fca2c59a Small bug fixes.
Move the declaration of FIPS_allow_md5() from fips_locl.h to fips.h.
Consequently, util/mkdef.pl doesn't need to look at fips_locl.h any
more.
2004-04-20 10:26:13 +00:00
Richard Levitte
7028b83a35 Recent changes from 0.9.7-stable. 2004-04-20 10:00:33 +00:00
Richard Levitte
f0ad625606 Tests have shown that setargv.obj isn't really needed (at least as far
as we can tell).  This is good, because it doesn't seem to exist on
some newer Windows installations.
2004-04-16 10:39:33 +00:00
Richard Levitte
6bce1a8dca make update 2004-04-16 09:53:22 +00:00
Richard Levitte
9e9f48f0b1 Don't use global variables. Instead, use a function that returns the
proper value.

There are a few more spots where FIPS makes use of global variables.
This is problematic on some non-Unix platforms.  I will deal with them
later.
2004-04-16 09:52:50 +00:00
Richard Levitte
0cd83fa586 Wrap with a check for OPENSSL_FIPS. We need that to have mkdef.pl
work properly.
Add C++ protection.
2004-04-16 09:50:49 +00:00
Richard Levitte
1d8f39c144 Add the first half of the C++ protection :-). 2004-04-16 09:49:41 +00:00
Richard Levitte
e523b0ab4d Add fips_rand.h among the header files to look at.
Fix a silly warning.
2004-04-15 23:13:45 +00:00
Richard Levitte
f54026eb9d Fix sign vs. unsigned warning. 2004-04-15 20:50:08 +00:00
Richard Levitte
f718b2f489 Make sure mkdef.pl is called with optional "fips" as well. 2004-04-15 20:49:46 +00:00
Richard Levitte
9fb37ebe00 make update 2004-04-15 20:48:59 +00:00
Richard Levitte
88780bcdc7 Look at a few FIPS-related headers and process FIPS-related symbols
properly.
2004-04-15 20:48:42 +00:00
Richard Levitte
c1b971d5b2 Make the Windows/DOS build system understand "fips". 2004-04-15 19:35:30 +00:00
Richard Levitte
640d212a4c make update 2004-04-15 17:28:06 +00:00
Richard Levitte
9e8473347a Now that we look in fips/rsa, there's no need to erroneously exclude
the functions RSA_PKCS1_SSLeay and RSA_generate_key.
2004-04-15 17:27:54 +00:00
Richard Levitte
874d408909 Include fips/rsa among the directories to look in. 2004-04-15 17:27:09 +00:00
Richard Levitte
8dc3253141 make update 2004-04-15 17:21:08 +00:00
Richard Levitte
83a542996c make update 2004-04-15 16:30:39 +00:00
Richard Levitte
93dcdddbfd Some platforms (Win32, it seems) do not have PATH_MAX, so let's define
it with a generic value (1024) if it isn't already defined.
2004-04-15 16:29:44 +00:00
Richard Levitte
f291e0eb32 Recognise the "platform" OPENSSL_FIPS. 2004-04-15 16:28:54 +00:00
Richard Levitte
7f71a94cc5 Use OPENSSL_FIPS instead of just FIPS. 2004-04-15 16:28:30 +00:00
Richard Levitte
0ae9a77679 Make fips_gettime work on Win32 (lets hope the Win32 function we use
is OK with NIST.  Otherwise, we have a problem).

Avoid depending on 32-bit longs.

Provided by Dr Stephen Henson <shenson@drh-consultancy.co.uk>
2004-04-15 16:28:05 +00:00
Richard Levitte
1e4ae04e79 Include string.h to get a proper declaration of memcmp() 2004-04-15 16:25:32 +00:00
Richard Levitte
54f581d3c7 Make sure this script works with shared library builds as well. 2004-04-15 16:24:44 +00:00
Richard Levitte
5d4558d1eb Allow the possibility to say no-fips, and make Ben build his debug
variant properly :-).
2004-04-15 16:21:53 +00:00
Ben Laurie
343e6a4950 Add corruptors so KATs can be made to fail. 2004-04-14 17:58:54 +00:00
Ben Laurie
0c0bba9776 2-key 3DES KAT. 2004-04-13 19:46:13 +00:00
Dr. Stephen Henson
459379296a Add some root CAs. 2004-04-13 17:50:20 +00:00
cvs2svn
1d3c933a32 This commit was manufactured by cvs2svn to create branch 'OpenSSL-fips-
0_9_7-stable'.
2004-04-13 17:47:39 +00:00
cvs2svn
462a286eeb This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2004-04-13 17:47:38 +00:00
Ben Laurie
e68eff1465 Fingerprint SHA-1 asm. 2004-04-11 16:53:43 +00:00
Ben Laurie
43a6d78bcc Add SHA-1 assembler. 2004-04-11 15:59:57 +00:00
Ben Laurie
364f6fb504 Remove crib and sabotage. 2004-04-11 12:32:43 +00:00
Dr. Stephen Henson
21b9c11e99 Fix memory leak. 2004-04-09 22:14:57 +00:00
Dr. Stephen Henson
dee67db36c Stop warnings:
Signed/unsigned mismatches.
Unused functions.
C++ style coments.
2004-04-09 21:56:14 +00:00
Ben Laurie
aba2163a06 Add x86 assembler. 2004-04-09 15:48:50 +00:00
Ben Laurie
bedc89e7af Use HMAC instead of straight SHA-1. 2004-04-09 14:55:43 +00:00
Ben Laurie
d46359842f Don't make, $(MAKE). 2004-04-09 11:18:13 +00:00
Ben Laurie
b452e706e3 Do HMAC. 2004-04-04 18:59:33 +00:00
Ben Laurie
08198b1b5c Signature verification test. Enable all tests. 2004-04-04 14:16:29 +00:00
Ben Laurie
16d5c926de SigGen test. 2004-04-03 20:05:33 +00:00
Ben Laurie
f27846cc2c Key pair test. 2004-04-03 17:24:40 +00:00
Ben Laurie
dcd44b5121 New style PQGGen test. 2004-04-03 17:01:51 +00:00
Richard Levitte
75dca32a6c Recent changes from 0.9.7-stable. 2004-04-03 11:54:59 +00:00
Richard Levitte
0c337a0254 Type. "pa-rics2W" -> "pa-risc2W" 2004-04-03 09:42:16 +00:00
Richard Levitte
a110d01771 Typo. "pa-rics2W" corrected to "pa-risc2W".
PR: 868
2004-04-02 12:39:54 +00:00
Geoff Thorpe
7ef7a1b3de Avoid undefined results when the parameter is out of range. 2004-04-02 06:25:53 +00:00
Richard Levitte
8797be2dce Recent changes from 0.9.7-stable
Since we have changed from using Makefile instead of Makefile.ssl, we
need to complete the work by changing all references.

make update
2004-03-30 16:58:44 +00:00
Dr. Stephen Henson
48e1c0c012 Obsolete files 2004-03-28 12:30:34 +00:00
Dr. Stephen Henson
f36f469430 Obsolete files. 2004-03-28 12:29:53 +00:00
Richard Levitte
5cf7908a86 Move the definition of Win32_rename(), since the macro rename gets undefined
in the middle of the code on Windows, and that disrupts operations in functions
later that use rename()...
PR: 853
2004-03-25 20:09:02 +00:00
Richard Levitte
b7e3c73d7c Wrap code starting with a definition.
PR: 854
2004-03-25 20:01:08 +00:00
Richard Levitte
e6784a47e9 Change spaces to symbols in names.
PR: 856
2004-03-25 19:52:36 +00:00
Dr. Stephen Henson
d0344d06a8 Make S/MIME encrypt work again. 2004-03-25 00:58:59 +00:00
Dr. Stephen Henson
a0cac0ff75 Make S/MIME encrypt work again. 2004-03-25 00:57:23 +00:00
Richard Levitte
817089b66d Don't define fd for platforms that do not use it, as some may not declare fileno() properly 2004-03-24 10:55:50 +00:00
Richard Levitte
50f482374d Make it clear that for RSA_NO_PADDING, flen must be RSA_size(rsa) 2004-03-23 21:01:42 +00:00
Richard Levitte
ff60944b28 make update 2004-03-23 17:52:25 +00:00
Richard Levitte
d349b2fffe make update 2004-03-23 15:31:30 +00:00
Richard Levitte
6906a81215 Makefile.ssl is no more. We generate Makefile directly. 2004-03-23 15:28:21 +00:00
Richard Levitte
81dd23e65d It's a mistake to commit the generated Makefile 2004-03-23 15:24:31 +00:00
Richard Levitte
2fb2e00d94 Recent changes from 0.9.7-stable. 2004-03-23 15:01:13 +00:00
Richard Levitte
00294d0df7 Correct minor spelling error.
PR: 845
2004-03-21 23:03:55 +00:00
Richard Levitte
fba03c479f Change \t to real tab in echo argument.
PR: 847
2004-03-21 22:50:24 +00:00
Richard Levitte
27bf518087 Remove a warning for conversion double->long. This has impacts on Windows.
PR: 849
2004-03-21 22:39:59 +00:00
Richard Levitte
96a99d63c2 Make sure fd is defined where it should.
PR: 849
2004-03-21 22:36:30 +00:00
Richard Levitte
a9d9b07167 Merge from HEAD:
2003-04-03 22:03  levitte

	* apps/apps.c (1.70): Don't try to free NULL values...

Notified by "Steven Reddie" <smr@essemer.com.au>
2004-03-19 00:20:12 +00:00
Mark J. Cox
494593845c After tagging 2004-03-17 12:03:38 +00:00
Mark J. Cox
82d63d3028 Fix null-pointer assignment in do_change_cipher_spec() revealed
by using the Codenomicon TLS Test Tool (CAN-2004-0079)
Fix flaw in SSL/TLS handshaking when using Kerberos ciphersuites
(CAN-2004-0112)
Ready for 0.9.7d build

Submitted by: Steven Henson
Reviewed by: Joe Orton
Approved by: Mark Cox
2004-03-17 12:01:19 +00:00
Dr. Stephen Henson
8e6a84e730 Avoid warnings. 2004-03-16 13:50:18 +00:00
Richard Levitte
95475b1c7a As in 0.9.8-dev, make sure we use unsigned constants, or some
compilers may complain.
2004-03-15 23:06:59 +00:00
Ben Laurie
e51f113ad8 Add FIPS mode to openssl app. 2004-03-13 20:34:08 +00:00
Ben Laurie
839032c34d Improve test output. 2004-03-13 17:46:12 +00:00
Andy Polyakov
a2cfc0d50c IRIX 6.x shared build fix-up. 2004-03-12 21:33:49 +00:00
Andy Polyakov
86f941c936 Fix typo in "IRIX 6.x shared build fix-up." 2004-03-12 21:33:04 +00:00
Andy Polyakov
387fd00c47 IRIX 6.x shared build fix-up. 2004-03-12 21:24:45 +00:00
Ben Laurie
766519fc12 Spelling the test right helps. 2004-03-11 17:39:49 +00:00
Ben Laurie
6e07f8a4ba Finish elimination of Makefile.ssl 2004-03-11 12:31:43 +00:00
Ben Laurie
a82d1527c4 Step 1 in blowing away Makefile.ssl 2004-03-10 09:23:51 +00:00
Richard Levitte
5a8fe26720 Recent changes from 0.9.7-stable. 2004-03-08 14:14:21 +00:00
Dr. Stephen Henson
00b9c1be7d Incorporate crlNumber functionality from 0.9.8 except it is commented out
in openssl.cnf .
2004-03-08 13:07:07 +00:00
Richard Levitte
3f7067e3b6 Recent changes from 0.9.7-stable. 2004-03-08 04:36:19 +00:00
Richard Levitte
051bb5c457 Incorporate the following changes from 0.9.8-dev:
2003-04-04 17:10  levitte

	* apps/: apps.c (1.72), apps.h (1.56), ca.c (1.135), x509.c (1.82):
	  Convert save_serial() to work like save_index(), and add a
	  rotate_serial() that works like rotate_index().

2003-04-03 20:07  levitte

	* apps/: apps.c (1.69), ca.c (1.130): Conditionalise all debug
	  strings.

2003-04-03 18:33  levitte

	* apps/apps.c (1.68), apps/apps.h (1.55), apps/ca.c (1.129),
	  apps/ocsp.c (1.31), apps/openssl.cnf (1.24), apps/x509.c (1.80),
	  CHANGES (1.1139): Make it possible to have multiple active
	  certificates with the same subject.
2004-03-08 02:53:46 +00:00
Dr. Stephen Henson
931a031916 Cleanup ASN1 OID module when it exits. 2004-03-05 23:47:39 +00:00
Dr. Stephen Henson
be21fe59aa Call autoconfig code in pkcs7 utility. 2004-03-05 23:45:08 +00:00
Dr. Stephen Henson
ef3565aed2 Memory leak fix. 2004-03-05 23:39:12 +00:00
Dr. Stephen Henson
01fc051e8a Various X509 fixes. Disable broken certificate workarounds
when X509_V_FLAG_X509_STRICT is set. Check for CRLSign in
CRL issuer certificates. Reject CRLs with unhandled (any)
critical extensions.
2004-03-05 17:16:06 +00:00
Ben Laurie
09773532ed Add pairwise tests, fix makefiles. 2004-03-05 08:28:01 +00:00
Dr. Stephen Henson
ae43f344af -passin argument to rsautl 2004-03-04 21:58:13 +00:00
Dr. Stephen Henson
cc77f7c595 Typos.
Reported by: Jose Castejon-Amenedo <Jose.Castejon-Amenedo@hp.com>
2004-03-04 21:45:16 +00:00
Dr. Stephen Henson
0902c559fb Typos.
Reported by: Jose Castejon-Amenedo <Jose.Castejon-Amenedo@hp.com>
2004-03-04 21:41:59 +00:00
Richard Levitte
58b6a165a5 Make our page with pointers to binary distributions visible in the FAQ 2004-03-04 07:48:00 +00:00
Ben Laurie
0f0e53db43 Superfluous bracket. 2004-03-03 18:25:12 +00:00
Ben Laurie
60ace8f3fc In FIPS mode ranlib before hashing. 2004-03-03 15:10:09 +00:00
Dr. Stephen Henson
9d4e2f891b More configuration docs. 2004-03-02 13:33:52 +00:00
cvs2svn
be187e32c9 This commit was manufactured by cvs2svn to create branch 'OpenSSL-fips-
0_9_7-stable'.
2004-03-02 13:31:33 +00:00
Dr. Stephen Henson
641c55342b More configuration docs. 2004-03-02 12:46:30 +00:00
Richard Levitte
811756e644 Some changes from 0.9.7-stable that haven't been merged in yet. 2004-03-02 03:31:57 +00:00
Dr. Stephen Henson
8c496048b7 Documentation of the KISS autoconfig functions. 2004-03-02 01:02:08 +00:00
cvs2svn
51212a7a40 This commit was manufactured by cvs2svn to create branch 'OpenSSL-fips-
0_9_7-stable'.
2004-03-02 01:01:12 +00:00
Dr. Stephen Henson
e390f5d684 Documentation of the KISS autoconfig functions. 2004-03-02 01:00:24 +00:00
Dr. Stephen Henson
ce974305c4 More autoconfig docs. 2004-03-01 19:16:45 +00:00
Dr. Stephen Henson
078a97791d More autoconfig docs. 2004-03-01 19:15:54 +00:00
Richard Levitte
4d6b383680 Avoid a memory leak in OCSP_parse_url().
Notified by Paul Siegel <psiegel@corestreet.com>
2004-03-01 14:58:25 +00:00
Dr. Stephen Henson
3b7dd6d34c Fix from head. 2004-03-01 13:24:08 +00:00
Dr. Stephen Henson
489885cf84 Fix from head. 2004-03-01 13:23:41 +00:00
Dr. Stephen Henson
d60425034f Since the last commit also included the OCSP nonce change
(which I thought I'd included before). I'd better add the
corresponding CHANGES entry.
2004-03-01 01:10:26 +00:00
Dr. Stephen Henson
254700b1d6 Initial docs for the OpenSSL library configuration via openssl.cnf 2004-03-01 01:05:53 +00:00
Dr. Stephen Henson
850be8f18d Initial docs for the OpenSSL library configuration via openssl.cnf 2004-03-01 01:04:58 +00:00
Ben Laurie
5713956f61 Fix broken test vectors. 2004-02-29 19:18:15 +00:00
Richard Levitte
a22d40dde2 AES is spelled AES, not ASE. Oops... 2004-02-27 02:24:54 +00:00
Richard Levitte
ee121033dc Make sure the given EVP_PKEY is updated in the PEM_STRING_PKCS8INF case also.
PR: 833
2004-02-26 22:07:47 +00:00
Richard Levitte
4090b56b4d Document the AES options for 'openssl smime'.
PR: 834
2004-02-26 21:44:43 +00:00
Dr. Stephen Henson
33ad6eca7a Use an OCTET STRING for the encoding of an OCSP nonce value.
The old raw format can't be handled by some implementations
and updates to RFC2560 will make the OCTET STRING mandatory.
2004-02-19 18:17:35 +00:00
Ben Laurie
a5ad942b70 Improve selftests, check for stuck PRNG(!). 2004-02-17 11:51:54 +00:00
Richard Levitte
0ae3ca9ec4 Recent changes from 0.9.7-stable.
make update
2004-02-13 21:57:51 +00:00
Richard Levitte
33dd54d4b0 Files to ignore 2004-02-13 21:56:23 +00:00
Ben Laurie
0f7ff5b809 We have to save text0 each time round the outer loop. 2004-02-12 19:32:57 +00:00
Dr. Stephen Henson
820fb35a21 Fix handling of -offset and -length in asn1parse tool.
If -offset exceeds -length of data available exit with an error.

Don't read past end of total data available when -offset supplied.

If -length exceeds total available truncate it.
2004-02-08 13:31:53 +00:00
Dr. Stephen Henson
dd10343e75 Fix handling of -offset and -length in asn1parse tool.
If -offset exceeds -length of data available exit with an error.

Don't read past end of total data available when -offset supplied.

If -length exceeds total available truncate it.
2004-02-08 13:30:33 +00:00
Andy Polyakov
b47178f0ed Typo in crypto/bn/asm/x86_64.c, bn_div_words().
PR: 821
2004-02-07 09:50:46 +00:00
Andy Polyakov
ad55502092 Typo in crypto/bn/asm/x86_64.c, bn_div_words().
PR: 821
2004-02-07 09:46:47 +00:00
Ben Laurie
e6738d4be8 Improve test suite. 2004-02-02 15:25:30 +00:00
Dr. Stephen Henson
31edde3edc Add flag to avoid continuous
memory allocate when calling EVP_MD_CTX_copy_ex().

Without this HMAC is several times slower than
< 0.9.7.
2004-02-01 13:37:56 +00:00
Ben Laurie
4c6d0b7069 Wrong variable! 2004-01-31 17:18:02 +00:00
Ben Laurie
135891a9d5 Force odd parity. 2004-01-31 16:39:59 +00:00
Ben Laurie
bcb0a64421 Eliminate pointless variable. 2004-01-31 16:30:13 +00:00
Ben Laurie
7575c7e3bb Test suite plus failure if selftest fails. 2004-01-30 19:22:22 +00:00
Richard Levitte
381a693c39 make update 2004-01-29 10:23:54 +00:00
Richard Levitte
6a0fc3b6e1 Recent changes from 0.9.7-stable 2004-01-29 09:48:49 +00:00
Richard Levitte
86cb571e28 Have the declarations match the definitions. 2004-01-29 09:41:01 +00:00
Richard Levitte
ee2cffeb56 Recent changes from 0.9.7-stable 2004-01-29 09:40:44 +00:00
Richard Levitte
319a2c5f65 Typo 2004-01-29 02:55:47 +00:00
Richard Levitte
9d0e895120 Make n unsigned, to avoid signed vs. unsigned conflicts. 2004-01-29 00:05:54 +00:00
Richard Levitte
44ee32ed30 -Wstrict-prototypes is too much for 0.9.7-stable (there are tons of
non-strict prototypes, all right?  Kind of shadows the few other
warnings so I keep missing them :-)).
2004-01-29 00:03:05 +00:00
Richard Levitte
5922128732 0.9.7-stable is in freeze. That means we do bug fixes only, not new
functionality.  Therefore, I'm backing out most of the "CFB DES
sync-up with FIPS branch" commit (I'm keeping the corrections of
DES_cfb_encrypt()).
2004-01-28 23:31:20 +00:00
Richard Levitte
cb37947a71 Unsigned vs. signed problem removed 2004-01-28 08:48:15 +00:00
Andy Polyakov
4668056fc9 CFB DES sync-up with FIPS branch. 2004-01-27 21:46:19 +00:00
Richard Levitte
de23af982a Avoid signed vs. unsigned warnings (which are treated like errors on
Windows).
2004-01-27 01:16:09 +00:00
Richard Levitte
3a5a176ea0 S_IFBLK and S_IFCHR may not exist in some places (like Windows), so
let's check for those macros, and if they aren't defined, let's assume
there aren't Unixly devices on this platform.
2004-01-26 23:46:03 +00:00
Andy Polyakov
326e02b260 Reserve for unaligned buffer. The problem was "pointed out" be HPUX64
gcc, which failed to compile it with "not aligned" at higher optimization
levels.
2004-01-24 15:04:38 +00:00
Andy Polyakov
50f40631d0 Fix for DES_cfb_encrypt corrupting output buffer. This renders certain
code in corresponding EVP modules obsolete, which I remove at once.
2004-01-24 10:33:33 +00:00
Richard Levitte
370d5a72db Recent changes from 0.9.7-stable. 2004-01-23 16:09:01 +00:00
Richard Levitte
a1d37a96df Typo... 2004-01-22 22:36:48 +00:00
Dr. Stephen Henson
de56817c9c Replace expired certificate. 2004-01-21 13:09:27 +00:00
cvs2svn
83d1298fa0 This commit was manufactured by cvs2svn to create branch 'OpenSSL-fips-
0_9_7-stable'.
2004-01-21 13:08:15 +00:00
Dr. Stephen Henson
6bff79629e Replace expired certificate. 2004-01-21 13:04:58 +00:00
Andy Polyakov
db452cdba0 TABLE update for hpux64-paric2-gcc, addenum for HPUX64 gcc build update. 2004-01-21 10:07:23 +00:00
Andy Polyakov
d435752b0a Proper support for HP-UX64 gcc build.
PR: 772
2004-01-21 09:58:18 +00:00
Andy Polyakov
c8b14ca177 SHA-1 assembler tune-up for Intel P4 2004-01-21 08:19:36 +00:00
Richard Levitte
8b79f2051d Recent and not so recent changes from 0.9.7-stable, all conflicts resolved. 2004-01-19 08:53:02 +00:00
Richard Levitte
8ba5c63de9 Adding a slash between the directoryt and the file is a problem with
VMS.  The C RTL can handle it well if the "directory" is a logical
name with no colon, therefore ending being 'logname/file'.  However,
if the given logical names actually has a colon, or if you use a full
VMS-syntax directory, you end up with 'logname:/file' or
'dev:[dir1.dir2]/file', and that isn't handled in any good way.

So, on VMS, we need to check if the directory string ends with a
separator (one of ':', ']' or '>' (< and > can be used instead [ and
])), and handle that by not inserting anything between the directory
spec and the file name.  In all other cases, it's assumed the
directory spec is a logical name, so we need to place a colon between
it and the file.

Notified by Kevin Greaney <kevin.greaney@hp.com>.
2004-01-10 18:04:36 +00:00
Lutz Jänicke
3a0ede0ffd Cover all DSA setups when running tests
PR: #748
Submitted by: Kirill Kochetkov <kochet@ixbt.com>
2004-01-08 07:46:12 +00:00
Lutz Jänicke
9cde81c2dd Updates to s_time manual page
PR: #570
Submitted by: Martin Witzel <MWITZEL@de.ibm.com>
2004-01-08 07:39:33 +00:00
cvs2svn
7995627040 This commit was manufactured by cvs2svn to create branch 'OpenSSL-fips-
0_9_7-stable'.
2004-01-08 07:38:16 +00:00
Ben Laurie
6062460131 Improve debugging. 2004-01-06 18:02:32 +00:00
Lutz Jänicke
62bd487421 One more change to merge from -dev. 2004-01-04 19:03:51 +00:00
Lutz Jänicke
4ef740a632 Add s_time manual page
Submitted by: "Martin Witzel" <MWITZEL@de.ibm.com>

PR: #570
2004-01-04 19:00:17 +00:00
cvs2svn
7f36acd8fe This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2004-01-04 18:59:15 +00:00
Lutz Jänicke
09d7c42a7c Update URI
Submitted by: Gertjan van Oosten <gertjan@West.NL>

PR: #804
2004-01-04 18:06:51 +00:00
Lutz Jänicke
3fbbd1e1d7 unintptr_t and <inttypes.h> are not strictly portable with respect to
ANSI C 89.
Undo change to maintain compatibility.
2004-01-04 17:54:02 +00:00
Richard Levitte
faa9c5cbdc Fix Perl problems on sparc64.
This is part of a large change submitted by Markus Friedl <markus@openbsd.org>
2003-12-27 16:13:16 +00:00
Richard Levitte
d2c786db37 Avoid including cryptlib.h, it's not really needed.
Check if IDEA is being built or not.
This is part of a large change submitted by Markus Friedl <markus@openbsd.org>
2003-12-27 16:09:59 +00:00
Richard Levitte
3e786f4b0d Only use environment variables if uid and gid are the same as euid and egid.
This is part of a large change submitted by Markus Friedl <markus@openbsd.org>
2003-12-27 16:07:18 +00:00
Richard Levitte
4b66e713de Check if a random "file" is really a device file, and treat it
specially if it is.
Add a few OpenBSD-specific cases.
This is part of a large change submitted by Markus Friedl <markus@openbsd.org>
2003-12-27 16:01:52 +00:00
Richard Levitte
90dd4d34bb Correct documentation typos.
This is part of a large change submitted by Markus Friedl <markus@openbsd.org>
2003-12-27 15:05:26 +00:00
Richard Levitte
2d6452cdf9 OpenBSD-internal changes.
This is part of a large change submitted by Markus Friedl <markus@openbsd.org>
2003-12-27 15:02:54 +00:00
Richard Levitte
cc056d6395 Use sh explicitely to run point.sh
This is part of a large change submitted by Markus Friedl <markus@openbsd.org>
2003-12-27 15:00:24 +00:00
Richard Levitte
394178c94c Use BUF_strlcpy() instead of strcpy().
Use BUF_strlcat() instead of strcat().
Use BIO_snprintf() instead of sprintf().
In some cases, keep better track of buffer lengths.
This is part of a large change submitted by Markus Friedl <markus@openbsd.org>
2003-12-27 14:40:57 +00:00
Richard Levitte
61590d8945 Add a newline at the end of the last line.
This is part of a large change submitted by Markus Friedl <markus@openbsd.org>
2003-12-27 14:26:15 +00:00
Richard Levitte
ec2a595627 Change 'exp' to something else, as 'exp' is predefined by GNU C. This
was already done in HEAD, but not in this branch (I wonder why...).
2003-12-27 14:24:20 +00:00
Dr. Stephen Henson
8f5c833f3c Typos. 2003-12-20 22:49:05 +00:00
Richard Levitte
10fdd8d5fd I haven't merged from 0.9.7-stable in a loooong time. It shows :-). 2003-12-18 19:26:40 +00:00
Ben Laurie
9c2fcb789e Make OFB MCT work. 2003-12-18 17:21:18 +00:00
Ben Laurie
01d49d19e0 Even ECB needs new keys. 2003-12-18 15:39:16 +00:00
Ben Laurie
380537d9ff All CFB modes have to do magic on decrypt. 2003-12-18 15:38:58 +00:00
Ben Laurie
3229fd6afe Who invented these tests? Reconstruct internal state in order to follow
bizarre CFB test algorithm.
2003-12-18 14:26:50 +00:00
Ben Laurie
cba1c06e5f CFB-64 needs to use the saved IV too. 2003-12-18 14:10:53 +00:00
Ben Laurie
bebc48c72f Decrypt correctly. 2003-12-18 13:57:24 +00:00
Ben Laurie
50bd5b852a Derive new keys correctly. 2003-12-18 13:33:12 +00:00
Ben Laurie
91182b1b28 Output keys correctly. 2003-12-18 12:44:27 +00:00
Ben Laurie
21a5b6c521 Count was missing in MCT output. 2003-12-18 10:08:01 +00:00
Richard Levitte
ffe966b0fa To figure out if we're going outside the buffer, use the size of the buffer,
not the size of the integer used to index in said buffer.

PR: 794
Notified by: Rhett Garber <rhett_garber@hp.com>
2003-12-11 18:01:06 +00:00
Richard Levitte
bb3de147b3 Document that you need to include x509.h (to get [i2d|d2i]_RSA_PUBKEY()).
Correct the typo PUKEY...
2003-12-10 14:31:57 +00:00
Richard Levitte
95ec1a717b Document that you need to include x509.h (to get [i2d|d2i]_DSA_PUBKEY()).
Correct the typo PUKEY...
2003-12-10 13:57:52 +00:00
Lutz Jänicke
325829a9bc Restructure make targets to allow parallel make.
Submitted by: Witold Filipczyk <witekfl@poczta.gazeta.pl>

PR: #513
2003-12-03 16:29:16 +00:00
Richard Levitte
b0ea8b160c It was pointed out to me that if the requested size is 0, we shouldn't
ty to allocate anything at all.  This will allow eNULL to still work.

PR: 751
Notified by: Lutz Jaenicke
2003-12-01 13:25:39 +00:00
Richard Levitte
bb569f97b9 Check that OPENSSL_malloc() really returned some memory.
PR: 751
Notified by: meder@mcs.anl.gov
Reviewed by: Lutz Jaenicke, Richard Levitte
2003-12-01 12:11:57 +00:00
Richard Levitte
31670c94bc CRYPTO_malloc(), CRYPTO_realloc() and variants of them should return NULL
if the give size is 0.

This is a thought that came up in PR 751.
2003-12-01 12:06:19 +00:00
Lutz Jänicke
67e5d33dd7 Some more ASFLAGS settings required
PR: #735
Submitted by: Tim Rice <tim@multitalents.net>
2003-12-01 08:12:01 +00:00
Richard Levitte
da17495b65 Make sure the documentation matches reality.
PR: 755
Notified by: Jakub Bogusz <qboosh@pld-linux.org>
2003-11-29 10:33:28 +00:00
Richard Levitte
b64614adfe We're getting a clash with C++ because it has a type called 'list'.
Therefore, change all instances of the symbol 'list' to something else.

PR: 758
Submitted by: Frédéric Giudicelli <groups@newpki.org>
2003-11-29 10:25:42 +00:00
Richard Levitte
6a6a08cbea RSA_size() and DH_size() return the amount of bytes in a key, and we
compared it to the amount of bits required...
PR: 770
Submitted by: c zhang <czhang2005@hotmail.com>
2003-11-28 23:03:19 +00:00
Richard Levitte
753cbc2857 1024 is the export key bits limit according to current regulations, not 512.
PR: 771
Submitted by: c zhang <czhang2005@hotmail.com>
2003-11-28 22:39:23 +00:00
cvs2svn
67be54edfb This commit was manufactured by cvs2svn to create branch 'OpenSSL-fips-
0_9_7-stable'.
2003-11-28 14:51:31 +00:00
Richard Levitte
9d68b289a0 Make a number of changes to the OS/2 build. Submitter's comment below.
PR: 732
Submitted by: Ilya Zakharevich <nospam-abuse@ilyaz.org>

Submitter's comment:

This patch:

a) Introduces a new file os2/backwardify.pl.

b) Introduces a new mk1mf.pl variable $preamble.  As you can see, it may
   be used also to move some OS-specific code to VC-CE too (the the
   first chunk of the patch);

c) The DESCRIPTION specifier of the .def file is made more informative:
   now it contains the version number too.  On OS/2 it is made conformant
   to OS/2 conventions; in particular, when one runs the standard command
	BLDLEVEL this.DLL
   one can see:

   Vendor:      www.openssl.org/
   Revision:    0.9.7c
   Description: OpenSSL: implementation of Secure Socket Layer; DLL for library crypto.  Build for EMX -Zmtd

   [I did not make Win32 descriptions as informative as this - I'm afraid to
    break something.  Be welcome to fix this.]

d) On OS/2 the generated DLL was hardly usable (it had a shared initialized
   data segment).

e) On OS/2 the generated DLLs had names like ssl.dll.  However, DLL names on
   OS/2 are "global data".  It is hard to have several DLLs with the same
   name on the system.  Thus this precluded coexistence of OpenSSL with DLLs
   for other SLL implementations - or other name clashes.  I transparently
   changed the names of the DLLs to open_ssl.dll and cryptssl.dll.

f) The file added in (a) is used to create "forwarder" DLLs, so the
   applications expecting the "old" DLL names may use the new DLLs
   transparently.  (A presence of these DLLs on the system nullifies (e),
   but makes old applications work.  This is a stopgap measure until the
   old applications are relinked.  Systems with no old applications do not
   need these DLLs, so may enjoy all the benefits of (e).)

   The new DLLs are placed in os2/ and os2/noname subdirectories.

g) The makefiles created with os2/OS2-EMX.cmd did not work (some mysterious
   meaningless failures).  The change to util/pl/OS2-EMX.pl uses the
   variable introduced in (b) to switch the Makefiles to SHELL=sh syntax.
   All these backslashes are removed, and the generated Makefiles started to
   work.

h) Running os2/OS2-EMX.cmd now prints out what to do next.
2003-11-28 14:51:17 +00:00
Richard Levitte
eb5f555ffb Let's use text/plain in the example instead of crapy HTML.
PR: 777
Submitted by: Michael Shields <mshields@sunblocksystems.com>
2003-11-28 14:32:35 +00:00
Richard Levitte
04dc4edb44 If dynamically-loadable ENGINEs are linked against a shared-library version
of libcrypto, then it is possible that when they are loaded they will share
the same static data as the loading application/library. This means it will
be too late to set memory/ERR/ex_data/[etc] callbacks, but entirely
unnecessary to try.

This change (and a great part of this comment) was implemented in
0.9.8-dev a long time ago, but slightly differently.  In 0.9.8-dev, a
specific function that just returns a pointer to some static object is
used. For 0.9.7x, we couldn't do that, since the way we handle feature
freezes is, among other, to not add any more non-static functions.
Instead, we use the function ERR_get_implementation() and compare the
returned value with fns->err_fns, a member of fns that already is
there, and which therefore can safely be used in this manner.

What happens is that if the loaded ENGINE's return value from this
function matches the loading application/library's return value - they
share static data. If they don't match, the loaded ENGINE has its own
copy of libcrypto's static data and so the callbacks need to be set.
2003-11-27 16:41:26 +00:00
Lutz Jänicke
d161f5a9b2 Free "engine" resource in case of failure to prevent memory leak
PR: #778
Submitted by: George Mitchell <george@m5p.com>
2003-11-24 16:47:44 +00:00
Ulf Möller
28474e26f4 bn_sub_part_words() is unused in 0.9.7.
Spotted by Markus Friedl.
2003-11-22 10:42:33 +00:00
Dr. Stephen Henson
85421c7148 Give CRLDP its standard name.
Max req -x509 use V1 if extensions section absent.
2003-11-20 22:43:28 +00:00
Geoff Thorpe
77cc150b61 Remove duplicate prototypes have already been (correctly) added to rsa.h,
as this is already included by x509.h anyway.
2003-11-19 05:18:54 +00:00
Lutz Jänicke
890b2abf19 Make sure to initialize AES counters to obtain proper results.
Submitted by: Kirill Kochetkov <kochet@ixbt.com>

PR: #748
2003-11-18 18:26:32 +00:00
Lutz Jänicke
6b051c4ebc Catch error condition to prevent NULL pointer dereference.
Submitted by: Goetz Babin-Ebell <babin-ebell@trustcenter.de>

PR: #766
2003-11-16 16:31:22 +00:00
Lutz Jänicke
a601df36f3 Provide ASFLAGS in the subdirectories handling assembler code.
Submitted by: Tim Rice <tim@multitalents.net>

PR: #735, #765
2003-11-16 14:37:48 +00:00
Dr. Stephen Henson
2d4b834926 Oops! 2003-11-10 01:29:27 +00:00
Dr. Stephen Henson
c22e6753ef Print out GeneralizedTime and UTCTime in ASN1_STRING_print_ex(). 2003-11-10 01:25:11 +00:00
Richard Levitte
84bf37057c Changes from 0.9.7. 2003-11-03 00:06:02 +00:00
Richard Levitte
db5b10fab5 Removing those memcpy()s also took away the possibility for in and out to
be the same.  Therefore, the removed memcpy()s need to be restored.
2003-10-29 06:21:25 +00:00
Ben Laurie
ffe8370a18 Targets build too fast. 2003-10-28 14:56:14 +00:00
Ben Laurie
fdf12fd455 Change scary wording. 2003-10-22 11:28:25 +00:00
Ben Laurie
50c71f8701 Include extra libraries/flags. 2003-10-22 11:05:19 +00:00
Richard Levitte
fa5846e58b Correct serious bug in AES-CBC decryption when the message length isn't
a multiple of AES_BLOCK_SIZE.
Optimize decryption of all complete blocks in AES-CBC by removing an
unnecessary memcpy().

The error was notified by James Fernandes <jf210032@exchange.DAYTONOH.NCR.com>.
The unnecessary memcpy() was found as an effect of investigating that error.
2003-10-15 09:00:18 +00:00
Dr. Stephen Henson
79e4022a33 Simplify cipher and digest lookup in PKCS#7 code. 2003-10-11 16:47:44 +00:00
Dr. Stephen Henson
80986c9ced Retrieve correct content to sign when the
type is "other".
2003-10-10 23:24:10 +00:00
Ben Laurie
f25b0dddbb Another stupid diff. 2003-10-08 13:12:50 +00:00
Ben Laurie
871743aea9 FIPS depends on object, so crypto must be built before fips. 2003-10-08 10:18:02 +00:00
Richard Levitte
ede7c28eb7 In realloc, don't destroy the old memory area if a new one couldn't be
allocated.
Notified by Daniel Lucq <daniel@lucq.org>
2003-10-07 12:09:42 +00:00
Ben Laurie
2821a5e587 Don't assume diff is any good. 2003-10-07 10:55:36 +00:00
Ben Laurie
739320b840 No test. 2003-10-05 22:22:15 +00:00
Ben Laurie
c9ee3ccd45 Fingerprinting needs to work even if OpenSSL isn't installed yet. 2003-10-04 14:11:45 +00:00
Richard Levitte
95a64aa4b8 Recent changes from 0.9.7-stable 2003-10-02 10:55:25 +00:00
Richard Levitte
c9d3957986 Check for errors from SSL_COMP_add_compression_method().
Notified by Andrew Marlow <AMARLOW1@bloomberg.net>
2003-10-02 10:41:50 +00:00
Richard Levitte
05e962ddf8 Correct a mixup of return values 2003-10-02 10:38:46 +00:00
Richard Levitte
d680c13060 Include e_os.h to get a proper definition for memmove() for the
platforms that don't have it.
2003-10-01 20:41:49 +00:00
Richard Levitte
a510e9e4fc Remove leading and trailing spaces and tabs 2003-10-01 15:04:15 +00:00
Richard Levitte
1a9e663b20 Avoid 'file names' with spaces 2003-10-01 15:03:18 +00:00
Richard Levitte
0dd675509c Use correct case for manual page references 2003-10-01 15:02:48 +00:00
Richard Levitte
144aa3c56e Correct incorrect mode bits change. 2003-09-30 17:31:50 +00:00
Richard Levitte
202892dfd6 Correct buggy PODs (missing commas and a prepended space). 2003-09-30 17:22:21 +00:00
Ben Laurie
80be2f484f setkey is already defined on HP/UX. 2003-09-30 16:15:49 +00:00
Dr. Stephen Henson
0c6fa13fee In order to get the expected self signed error when
calling X509_verify_cert() in x509.c the cert should
not be added to the trusted store.
2003-09-30 13:10:48 +00:00
Dr. Stephen Henson
68f0bcfbc3 Changes for release 2003-09-30 12:08:23 +00:00
Dr. Stephen Henson
662ede2370 Fix for ASN1 parsing bugs. 2003-09-30 12:05:44 +00:00
Richard Levitte
cf54f06dcb Make sure we get OPENSSL_FIPS. 2003-09-29 22:29:03 +00:00
Dr. Stephen Henson
d0edf6e593 make update 2003-09-29 20:17:37 +00:00
Richard Levitte
5389c2dfa1 Recent changes from 0.9.7-stable 2003-09-29 19:02:26 +00:00
Richard Levitte
4e2307ebdc Detect correctly that we're in FIPS mode.
Don't run testfipsssl unless in FIPS mode.
2003-09-29 18:46:31 +00:00
Dr. Stephen Henson
c93f908f7f Fix to make it compile under Win32. 2003-09-29 17:10:01 +00:00
Richard Levitte
64961dc3c5 Recent changes from 0.9.7-stable 2003-09-29 15:10:24 +00:00
Richard Levitte
16d2a7caef Further VxWorks changes from Bob Bradley <bob@chaoticsoftware.com>, this
time involving VxWorks on MIPS
2003-09-28 14:07:01 +00:00
Richard Levitte
ed2e0e3988 Synchronise util/libeay.num with the 0.9.7-stable one.
Correct some depend targets in the fips directory tree.
make update
2003-09-28 09:26:37 +00:00
Richard Levitte
b7b5cd6132 make update 2003-09-28 09:25:33 +00:00
Richard Levitte
7027553741 Recent changes from 0.9.7-stable 2003-09-28 09:07:11 +00:00
Richard Levitte
71583fb0d7 Uhmm, It seem to have forgotten one file when I committed the MSDOS
change yesterday.
PR: 669
2003-09-28 07:11:37 +00:00
Richard Levitte
058f86e9e0 Change the indentation from 12 to indent+4.
PR: 657
2003-09-27 22:48:36 +00:00
Richard Levitte
4509102cb9 Make MD5 assembler code able to handle messages larger than 2GB on 32-bit
systems and above.
PR: 664
2003-09-27 22:14:47 +00:00
Richard Levitte
87c99c59bd Selected changes for MSDOS, contributed by Gisle Vanem <giva@bgnett.no>.
PR: 669
2003-09-27 21:56:12 +00:00
Richard Levitte
732d1bf43a Add reference counting around the thread state hash table.
Unfortunately, this means that the dynamic ENGINE version just went up, and
isn't backward compatible.
PR: 678
2003-09-27 20:29:11 +00:00
Ben Laurie
445aa1c44a DSA self-test. 2003-09-27 20:07:17 +00:00
Richard Levitte
88fd7424f6 Have ssl3_ssl3_send_client_verify() change the state to SSL3_ST_SW_CERT_VRFY_B.
PR: 679
2003-09-27 19:32:09 +00:00
Richard Levitte
30a452ab32 Have ssl3_send_certificate_request() change the state to SSL3_ST_SW_CERT_REQ_B.
PR: 680
2003-09-27 19:27:09 +00:00
Richard Levitte
9c90f27dac Remove extra argument to BIO_printf().
PR: 685
2003-09-27 18:31:41 +00:00
Richard Levitte
ec4e600da6 Include the instance in the Kerberos ticket information.
In s_server, print the received Kerberos information.
PR: 693
2003-09-27 17:55:18 +00:00
Ben Laurie
2343078660 Selftest RSA and some fixes. 2003-09-27 15:54:43 +00:00
Richard Levitte
4097dce455 Correct small documentation error.
PR: 698
2003-09-27 10:39:19 +00:00
Richard Levitte
2fe7c59277 Recent changes from 0.9.7-stable. 2003-09-27 10:13:11 +00:00
Richard Levitte
c9b552534e Free the Kerberos context upon freeing the SSL.
Contributed by Andrew Mann <amann@tccgi.com>
2003-09-27 07:33:28 +00:00
Richard Levitte
f0ad5fc2ab Add necessary changes to be able to build on VxWorks for PPC860.
Contributed by Bob Bradley <bob@chaoticsoftware.com>
2003-09-27 07:24:47 +00:00
Ben Laurie
899ffab2c9 Make FIPS work again. 2003-09-25 20:04:40 +00:00
Ben Laurie
577332db14 Constification. 2003-09-25 20:01:57 +00:00
Richard Levitte
3b84ce3b6f Use OPENSSL_FIPS instead of FIPS. 2003-09-25 12:24:52 +00:00
Richard Levitte
2667b068a1 Uhmm, o_str.o, not o_str.c... 2003-09-25 12:22:46 +00:00
Dr. Stephen Henson
5f444c8fcd In order to get the expected self signed error when
calling X509_verify_cert() in x509.c the cert should
not be added to the trusted store.
2003-09-21 02:15:07 +00:00
Dr. Stephen Henson
a26be0386e In order to get the expected self signed error when
calling X509_verify_cert() in x509.c the cert should
not be added to the trusted store.
2003-09-21 02:12:36 +00:00
Ben Laurie
d5adc4b475 Missing file. 2003-09-14 13:01:54 +00:00
Ben Laurie
fe2d15d814 Don't debug. 2003-09-13 20:41:53 +00:00
Ben Laurie
c45c8f3f1c Make TLSv1 work in FIPS mode. 2003-09-13 17:03:54 +00:00
Ben Laurie
b09c9a91cb Add a debug flag. 2003-09-13 16:57:56 +00:00
Ben Laurie
a2fd4d03e8 Temporarily remove FIPS test that doesn't work. 2003-09-13 13:36:13 +00:00
Ben Laurie
52fc641da0 Add RSA to FIPS. 2003-09-11 21:37:01 +00:00
Richard Levitte
f29f610bf5 make update 2003-09-10 09:15:22 +00:00
Richard Levitte
27d63818e1 Include "e_os.h" instead of "../e_os.h", and trust the building
procedure to give the correct -I options to the compiler.  This is
*especially* true for test programs that appear in two places, with
different paths to e_os.h depending on where they are built.
2003-09-10 09:15:09 +00:00
Richard Levitte
fa68935f57 Include openssl/fips.h outside of the check for FIPS, so make depend
doesn't differ between FIPS and non-FIPS modes.
2003-09-10 09:06:01 +00:00
Richard Levitte
b2f94f81e1 We currently define FIPS, not OPENSSL_FIPS. The reason for this is
(probably) that FIPS is an entirely internal macro, and is not
accessible by third-party authors.
2003-09-10 09:05:06 +00:00
Dr. Stephen Henson
ad6eec30a3 Use BIO_snprintf() instead of snprintf().
Update hashes.
2003-09-10 00:44:53 +00:00
Dr. Stephen Henson
25c578f3ca Typo. 2003-09-10 00:16:42 +00:00
Dr. Stephen Henson
22f083815c Include e_os.h in a few cases (to pick up
str(n)icmp defs).

Disable a few tests if not FIPS.
2003-09-10 00:10:34 +00:00
Dr. Stephen Henson
c61e45fba0 Update hashes. Fix a few typos in o_str.c 2003-09-09 23:43:29 +00:00
Richard Levitte
7418027279 make update 2003-09-09 16:39:41 +00:00
Richard Levitte
d3446728f9 Move the FIPS check so make depend doesn't give different results
depending on FIPS mode.
2003-09-09 16:38:16 +00:00
Richard Levitte
245dac4d17 Generalise the definition of strcasecmp() and strncasecmp() for
platforms that don't (necessarely) have it.  In the case of VMS, this
means moving a couple of functions from apps/ to crypto/ and make them
general (although only used privately).
2003-09-09 14:48:52 +00:00
cvs2svn
c377882c39 This commit was manufactured by cvs2svn to create branch 'OpenSSL-fips-
0_9_7-stable'.
2003-09-09 14:48:37 +00:00
Richard Levitte
c2cdb1a877 Test data files should not be part of the TEST value, or util/mk1mf.pl
gets confused...  The separate TESTDATA variable was inspired from
crypto/evp/Makefile.ssl.
2003-09-09 09:10:45 +00:00
Dr. Stephen Henson
31b28f95be Put #ifdef FIPS round FIPS DSA_generate_parameters .
#if 0 unimplemented ciphers so mkdef.pl doesn't pick
them up.
2003-09-08 17:01:48 +00:00
Richard Levitte
f61bc950c1 Recent changes from 0.9.7-stable. 2003-09-08 16:49:37 +00:00
Richard Levitte
64a014a6d2 Make it builadable in non-FIPS mode.
The current solution is very Unix-bound, and there is probably a better way to do this.
2003-09-08 16:43:55 +00:00
Geoff Thorpe
62afa8bd58 These should be write-locks, not read-locks. 2003-09-08 16:00:46 +00:00
Dr. Stephen Henson
a86eff4296 included <string.h> in fips.c to pick up
memcmp definition.

update fips_make_sha1 to use fips_err.h

update hashes.
2003-09-08 12:49:08 +00:00
Dr. Stephen Henson
4c4ef336a9 Update dependencies. 2003-09-08 12:39:13 +00:00
Richard Levitte
1ce9c76f8e More files to ignore. 2003-09-08 11:37:31 +00:00
Richard Levitte
19c8d4a5f8 Ignore the directory rsp (introduced when running tests). 2003-09-08 11:36:32 +00:00
Richard Levitte
e7d580a924 Some more files to ignore. 2003-09-08 11:35:23 +00:00
Richard Levitte
1f8e046af9 Since fips_err is really just used as a header by fips_err_wrapper.c,
let's change it's suffix from .c to .h.  This also avoids some
otherwise very mysterious (and probably sensible from a historical
point of view :-)) name changes done by mk1mf.pl.
2003-09-08 11:33:07 +00:00
Richard Levitte
7e1ef2d62a When building the FIPS test binaries, also build the corresponding
fingerprints.
2003-09-08 10:00:23 +00:00
Richard Levitte
ccf61c87fe Remove some unneeded space. 2003-09-08 09:59:43 +00:00
Richard Levitte
6d02c53762 Use $(TOP) instead of ../.. as much as possible. 2003-09-08 09:59:11 +00:00
Richard Levitte
dac0d334ad Because of changes in Makefile.ssl, the files got reordered. 2003-09-08 09:57:57 +00:00
Richard Levitte
f63ff4a1a3 Produce libcrypto.sha1 directly after building the libraries.
Otherwise, the test target will fail because libcrypto.sha1 is missing
or not up to date.
2003-09-08 09:57:27 +00:00
Richard Levitte
9ef37a8dc9 make update. 2003-09-08 09:17:36 +00:00
Richard Levitte
fbb40083c1 fips_err.c doesn't belong with the headers. 2003-09-08 09:17:13 +00:00
Richard Levitte
549d89f7ed Include all the fips directories. 2003-09-08 09:16:39 +00:00
Richard Levitte
5db9e7bec8 Handle the "fips" option. 2003-09-08 09:16:17 +00:00
Ben Laurie
104f570c73 Missing file. 2003-09-07 11:13:54 +00:00
Ben Laurie
e1015c1fe7 Samples. 2003-09-07 10:59:34 +00:00
Ben Laurie
97e62d5554 Add samples. 2003-09-07 10:53:13 +00:00
Dr. Stephen Henson
9aca5b2259 Fix signed/unsigned warning. 2003-09-06 16:57:16 +00:00
Ben Laurie
b8b47f67d0 Add fingerprint chain and checking. 2003-09-06 13:31:40 +00:00
Ben Laurie
b5da126b21 Make the problem clearer. 2003-09-06 10:41:27 +00:00
Richard Levitte
a7d64957b9 Include e_os.h to get the proper definition of OPENSSL_UNISTD, and use
that macro.

It's possible that OPENSSL_UNISTD_IO should be used instead of
OPENSSL_UNISTD, for the MSDOS case...
2003-09-05 14:09:40 +00:00
Richard Levitte
f743ef233a make update 2003-09-05 13:41:04 +00:00
Richard Levitte
79176d6053 ALWAYS check the standalone source.
make update.
2003-09-05 13:37:28 +00:00
Richard Levitte
e726e5f170 Make sure the compilation of the FIPS stuff goes through even in
non-FIPS mode.

Update the appropriate fingerprints accordingly.
(something is weird, someone else was working on the same stuff, and
removed fips_sha1_selftest.c from fips/sha1/standalone.sha1...)
2003-09-05 13:26:52 +00:00
Dr. Stephen Henson
c1a32376db Fix signed/unsigned warnings and C++ comments. Update hashes 2003-09-05 13:00:34 +00:00
Richard Levitte
6b211d8cd2 Include string.h and stdlib.h where needed, to avoid warnings about
strlen(), memcmp(), exit() and others to be used without a proper
declaration.

Update the appropriate fingerprints accordingly.
2003-09-05 12:22:21 +00:00
Ben Laurie
f3bda010df Missing files. 2003-09-04 16:46:42 +00:00
Bodo Möller
2689b8f326 certain changes have to be listed twice in this file because OpenSSL
0.9.6h forked into 0.9.6i and 0.9.7 ...
2003-09-04 12:52:10 +00:00
Ben Laurie
4ccac96346 Automagically seed FIPS PRNG. Add OPENSSL_FIPS flag. 2003-09-04 10:22:13 +00:00
Ben Laurie
4ef3352608 -DFIPS may be the last thing on the line. 2003-09-04 09:04:24 +00:00
Ben Laurie
1f1bd3a51a Selftests. 2003-09-04 07:17:43 +00:00
Dr. Stephen Henson
bd69ac5c93 New -ignore_err option in ocsp application to stop the server
exiting on the first error in a request.
2003-09-03 23:54:00 +00:00
Dr. Stephen Henson
33ed371ec9 Only accept a client certificate if the server requests
one, as required by SSL/TLS specs.
2003-09-03 23:42:17 +00:00
Ben Laurie
b2293a6cc6 DSA stuff and tests. 2003-09-03 14:11:33 +00:00
Ben Laurie
766332ac11 More test vectors. 2003-08-31 09:50:11 +00:00
Ben Laurie
51f7c5a6ea Add test. 2003-08-31 08:52:39 +00:00
Ben Laurie
fc0376e257 Handle 3DES tests. 2003-08-30 17:28:08 +00:00
Ben Laurie
51c568b309 Add 3-DES CFB-r mode (no test vectors yet). 2003-08-30 15:50:26 +00:00
Ben Laurie
2b3784c235 Updated test vectors (probably incorrect, but who am I to question?). 2003-08-30 15:35:37 +00:00
Ben Laurie
2e9f3c4636 Oops. Need to allocate extra buffer. 2003-08-30 14:49:08 +00:00
Ben Laurie
aac3861773 Build the test program when needed. 2003-08-30 13:19:03 +00:00
Ben Laurie
e0162fa745 Remove unused functions/data. 2003-08-29 18:58:03 +00:00
Dr. Stephen Henson
3b07c32fe7 outlen should be int * in out_utf8. 2003-08-21 12:31:17 +00:00
Bodo Möller
9cc513a000 fix out-of-bounds check in lock_dbg_cb (was too lose to detect all
invalid cases)

PR: 674
2003-08-14 10:33:26 +00:00
Richard Levitte
a8e3195083 Undo the change that left LD_LIBRARY_PATH unchanged. The errors I saw
weren't due to that, but to a change on the SCO machines I used for
testing, where my $PATH was suddenly incorrect.
2003-08-14 07:02:27 +00:00
Richard Levitte
cac32e5acd Undo the change that left LD_LIBRARY_PATH unchanged. The errors I saw
weren't due to that, but to a change on the SCO machines I used for
testing, where my $PATH was suddenly incorrect.
2003-08-14 06:54:29 +00:00
Bodo Möller
0e9edc98d4 make sure no error is left in the queue that is intentionally ignored 2003-08-11 18:56:19 +00:00
Richard Levitte
27bd937cc0 Don't fiddle with LD_LIBRARY_PATH when building non-static. 2003-08-11 11:46:01 +00:00
Richard Levitte
4435349cc6 Make sure the order matches the command line in Makefile.ssl. 2003-08-11 10:31:21 +00:00
Richard Levitte
ec47bb7c81 - Add a configuration keyword "fips" to compile with FIPS
implementations.
- Reorder the build so the standalone FIPS SHA1 checker is built
  first.
- Add necessary defines to avoid symbol clashes between FIPS and
  non-FIPS implementations.
- Change necessary signatures.
- Correct bugs in FIPS build Makefiles.
- make update
2003-08-11 10:24:52 +00:00
Richard Levitte
f56c451143 Oops, removed a little too much. 2003-08-11 09:56:17 +00:00
Richard Levitte
05a1f76093 make update 2003-08-11 09:53:24 +00:00
Richard Levitte
4ed9388e5d A new branch for FIPS-related changes has been created with the name
OpenSSL-fips-0_9_7-stable.

Since the 0.9.7-stable branch is supposed to be in freeze and should
only contain bug corrections, this change removes the FIPS changes
from that branch.
2003-08-11 09:37:17 +00:00
cvs2svn
bf50d5b4ac This commit was manufactured by cvs2svn to create branch 'OpenSSL-fips-
0_9_7-stable'.
2003-08-08 10:08:15 +00:00
Richard Levitte
94a1183fab Avoid clashing with the regular DES functions when not compiling with
-DFIPS.  This is basically only visible when building with shared
library supoort...
2003-08-08 10:08:14 +00:00
Richard Levitte
30e4269241 Correct two problems, found by Martin Kochanski <cardbox@easynet.co.uk>:
1. CreateToolhelp32Snapshot returns INVALID_HANDLE_VALUE, not NULL, on error.
2. On Windows CE, a snapshot handle is closed with CloseToolhelp32Snapshot,
   not CloseHandle.
2003-08-07 11:57:21 +00:00
Bodo Möller
59315df637 add OpenSSL license
fix typo
2003-08-06 10:38:37 +00:00
Richard Levitte
3659df7d15 make update
(I'm quite worried about what this will do to compatibility with
earlier 0.9.7 versions)
2003-08-04 13:26:14 +00:00
Richard Levitte
16f1fdbc8b Add an empty list of AES tests. At least, the test suite will pass,
and perhaps the conflict this generates on the person that hasn't yet
committed the real file will prompt him to do so :-).
2003-08-04 12:03:56 +00:00
Richard Levitte
98c1a4900c Inclusion of openssl/engine.h should always be wrapped with a check that
OPENSSL_NO_ENGINE is not defined.
2003-08-04 10:12:38 +00:00
Ben Laurie
2541f58309 Make tests work (CFB1 still doesn't produce the right answers, strangely). 2003-08-03 12:22:35 +00:00
Dr. Stephen Henson
6b063f32d9 Make the EFB NIDs have empty OIDs aliased to the real EFB OID. 2003-08-01 17:06:48 +00:00
Dr. Stephen Henson
693f2e3625 Replace C++ style comments. 2003-08-01 13:07:29 +00:00
Ben Laurie
afab06d3f5 DES CFB8 test. 2003-08-01 10:31:25 +00:00
Ben Laurie
8fb97c9acd Fix DES CFB-r. 2003-08-01 10:25:58 +00:00
Richard Levitte
7312a38d9e No C++ comments in C programs! 2003-07-31 21:41:51 +00:00
Richard Levitte
475e8d3d1d If FDIRS is to be treated like SDIRS, let's not forget to initialize
it in Makefile.org.
2003-07-31 21:30:07 +00:00
Ben Laurie
c5f070d5d5 Whoops, forgot FIPS DES, also add EVPs for DES CFB1 and 8. 2003-07-30 18:30:18 +00:00
Ben Laurie
1b9e855744 Test vectors and useless samples. 2003-07-29 17:53:41 +00:00
Ben Laurie
f3b2ea53e2 AES CFB8. 2003-07-29 17:05:16 +00:00
Ben Laurie
ed71769948 Missing files. 2003-07-29 15:17:22 +00:00
Ben Laurie
e1c0a9c416 MMT for CFB1 2003-07-29 14:34:48 +00:00
Ben Laurie
0b8c5413a4 Reformat. 2003-07-29 14:06:02 +00:00
Ben Laurie
c473d53898 The rest of the keysizes for CFB1, working AES AVS test for CFB1. 2003-07-29 13:24:27 +00:00
Ben Laurie
e8f8249319 Working CFB1 and test vectors. 2003-07-29 10:56:56 +00:00
Ben Laurie
e2ced802b4 Add support for partial CFB modes, make tests work, update dependencies. 2003-07-28 15:08:00 +00:00
Ben Laurie
9163658aa8 New fingerprints. 2003-07-28 09:56:08 +00:00
Ben Laurie
d3a15e132d Build when not FIPS. 2003-07-27 21:13:35 +00:00
Ben Laurie
47954f114c Build in non-FIPS mode. 2003-07-27 17:23:08 +00:00
Ben Laurie
3ef747c8b6 Use unified diff. 2003-07-27 17:19:28 +00:00
Ben Laurie
75622f1ece Unfinished FIPS stuff for review/improvement. 2003-07-27 17:00:51 +00:00
Ben Laurie
a052dd6532 Add untested CFB-r mode. Will be tested soon. 2003-07-27 13:46:57 +00:00
Bodo Möller
5cc2658cff tolerate extra data at end of client hello for SSL 3.0
PR: 659
2003-07-21 15:17:49 +00:00
Bodo Möller
2f4335ec2b fix: 0.9.7 is based on 0.9.6h, not on 0.9.6k
typo in 0.9.6k section
2003-07-21 15:08:03 +00:00
Richard Levitte
2ab0740785 Make sure openssl.pc is readable by everyone.
PR: 654
2003-07-04 11:41:15 +00:00
Richard Levitte
82f676c633 Add a slash so grep doesn't return both ./crypto/bio/bss_mem.o and
./crypto/mem.o when we're looking for mem.o.
2003-07-03 21:43:39 +00:00
Richard Levitte
5f24adda77 Oops, I forgot to replace 'counter' with 'ivec' when used... 2003-07-03 20:50:46 +00:00
Richard Levitte
900f062d1f The convenience argumetn for -nameopt and -certopt is ca_default, not
default_ca.
PR: 653
2003-07-03 07:46:54 +00:00
Richard Levitte
ba64c2cc8f The 'counter' is really the IV. 2003-07-03 06:42:45 +00:00
Richard Levitte
29e62e487f Change AES-CTR to increment the IV by 1 instead of 2^64. 2003-07-03 06:41:33 +00:00
Lutz Jänicke
ec28f9c12c Clarify wording of verify_callback() behaviour. 2003-06-26 14:03:33 +00:00
Richard Levitte
4e6480faf8 Only remove old files if they exist. [Maing32].
Notified by Michael Gerdau <mgd@technosis.de>
2003-06-26 11:58:04 +00:00
Dr. Stephen Henson
00dc2d7551 Return EOF when an S/MIME part have been read. 2003-06-24 17:12:22 +00:00
Richard Levitte
27346c53b1 make update 2003-06-19 22:26:29 +00:00
Richard Levitte
e2491c45ab Document the last change.
PR: 587
2003-06-19 19:04:20 +00:00
Richard Levitte
398cd7276f Prepare for changes in the 0.9.6 branch 2003-06-19 19:01:11 +00:00
Richard Levitte
873ddf7c0c Prepare for changes in the 0.9.6 branch 2003-06-19 18:59:30 +00:00
Richard Levitte
4aae637f6c We set the export flag for 512 *bit* keys, not 512 *byte* ones.
PR: 587
2003-06-19 18:55:56 +00:00
Richard Levitte
705d0f5c8d Typo. 2003-06-19 17:50:27 +00:00
Richard Levitte
844df66895 EXIT() should mainly be exit(n), not return(n). OPENSSL_EXIT() will
take care of returning if necessary.
2003-06-19 17:01:42 +00:00
Richard Levitte
0d5b4f594d Typo.
PR: 584
2003-06-12 01:04:12 +00:00
Richard Levitte
8c2786fff7 Do not try to use non-existent gmtime_r() on SunOS4.
PR: 585
2003-06-12 00:57:27 +00:00
Richard Levitte
66ce343361 Make sure ssize_t is defined on SunOS4.
PR: 585
2003-06-12 00:56:33 +00:00
Richard Levitte
1b9f21fdc8 Make sure DSO-dlfcn works properly on SunOS4.
PR: 585
2003-06-12 00:51:59 +00:00
Richard Levitte
f3031b106d Typo.
PR: 593
2003-06-11 22:45:55 +00:00
Richard Levitte
6e260c4093 Add an entry for X509_TRUST_OBJECT_SIGN in trstandard[].
PR: 617
2003-06-11 21:22:34 +00:00
Richard Levitte
f19d064087 Handle des_modes.pod properly.
PR: 634
2003-06-11 19:44:40 +00:00
Richard Levitte
25a1259911 Make sure to NUL-terminate the string on end-of-file (and error)
PR: 643
2003-06-11 18:43:49 +00:00
Richard Levitte
f63f51dc22 Document the AES_cbc_encrypt() change 2003-06-10 04:42:42 +00:00
Richard Levitte
4eebab0d22 The output from AES_cbc_encrypt() should be exact multiple blocks when encrypting 2003-06-10 04:11:46 +00:00
Geoff Thorpe
bc63a2ee0e This memset() in the ubsec ENGINE is a bug. Zeroing out the result array
should not be necessary in any case, but more importantly the result and
input BIGNUMs could be the same, in which case this is clearly a problem.

Submitted by: Jonathan Hersch
Reviewed by: Joe Orton
Approved by: Geoff Thorpe
2003-06-06 17:53:24 +00:00
Dr. Stephen Henson
476f09712c Really get X509_CRL_CHECK_ALL right this time... 2003-06-04 00:40:47 +00:00
Lutz Jänicke
fe0444b17e Clarify return value of SSL_connect() and SSL_accept() in case of the
WANT_READ and WANT_WRITE conditions.
2003-06-03 09:59:10 +00:00
Dr. Stephen Henson
16c9148220 Move the base64 BIO fixes to 0.9.7-stable 2003-06-03 00:11:37 +00:00
Dr. Stephen Henson
9d92486cfb Only count 'LF' as EOL in pk7_mime.c, this avoids incorrect
results if CR+LF straddles the line buffer.
2003-06-02 17:52:19 +00:00
Dr. Stephen Henson
bb41fdb5ec Stop checking for CRLF when start of buffer is reached. 2003-06-02 01:03:08 +00:00
Dr. Stephen Henson
3410aa1aa8 Various S/MIME bug and compatibility fixes. 2003-06-01 20:45:44 +00:00
Lutz Jänicke
f50b911a3f Clarify ordering of certificates when using certificate chains 2003-05-30 07:45:50 +00:00
Richard Levitte
2a948bd306 Include openssl/e_os.h so OPENSSL_SYSNAME_ULTRASPARC and other configuration
macros get properly defined.
2003-05-29 22:22:34 +00:00
Richard Levitte
d4e35514ba Have ASFLAGS be defined the same way as CFLAGS 2003-05-29 22:20:57 +00:00
Richard Levitte
3fd6b9f6d4 PR: 630
Avoid looking outside the key_data array.
2003-05-29 20:59:30 +00:00
Lutz Jänicke
a598524ad6 Add minimum POP3 STLS hack to s_client.c (as was provided for STARTTLS before)
Submitted by: dg@sunet.ru (Daniel Ginsburg)

PR: #613
2003-05-28 20:24:20 +00:00
Lutz Jänicke
828ce10ce7 Move header file inclusion to prevent irritation of users forgetting to
call "make depend" after enabling or disabling ciphers...
Submitted by: Tal Mozes <talm@cyber-ark.com>

PR: #628
2003-05-28 19:56:04 +00:00
Dr. Stephen Henson
8939adbad9 PR: 627
Allocate certificatePolicies correctly if CPS field is absent.

Fix various memory leaks in certificatePolicies.
2003-05-28 17:28:42 +00:00
Dr. Stephen Henson
ff160dba54 PR: 631
Submitted by: Doug Sauder <dws+001@hunnysoft.com>

Fix bug in X509V3_get_d2i() when idx in not NULL.
2003-05-28 16:57:22 +00:00
Richard Levitte
fb5b7317a7 Make sure to compare unsigned against unsigned. 2003-05-28 10:34:04 +00:00
Richard Levitte
457f692eab Fix sign bugs.
PR: 621
2003-05-21 14:29:33 +00:00
Richard Levitte
e077b5452f Make sure EC_window_bits_for_scalar_size() returns a size_t 2003-05-21 08:40:18 +00:00
Dr. Stephen Henson
a9cfd20da7 Fix docs. 2003-05-18 23:10:22 +00:00
Dr. Stephen Henson
22e6c2524e Add correct DN entry for serialNumber. 2003-05-07 23:20:41 +00:00
Richard Levitte
6d8cbdcb53 /usr/lib/pkgconfig/openssl.pc was never installed in the RPM.
Notified by Bennett Todd <bet@rahul.net>.
2003-05-07 12:02:34 +00:00
Richard Levitte
54a7ea6f36 DO NOT constify RSA* in RSA_sign() and RSA_verify(), since there are function
called downstream that need it to be non-const.  The fact that the RSA_METHOD
functions take the RSA* as a const doesn't matter, it just expresses that
*they* won't touch it.
PR: 602
2003-05-07 11:38:13 +00:00
Richard Levitte
0e2f5ec2d2 Constify RSA_sign() and RSA_verify().
PR: 602
2003-05-05 13:55:23 +00:00
Dr. Stephen Henson
8c5e375c8e Typo. 2003-05-02 11:42:17 +00:00
Bodo Möller
ce8a202831 fix typo
Submitted by: Nils Larsch
2003-04-22 12:44:58 +00:00
Richard Levitte
0ece1d304d Make it possible to affect the extension of man pages.
PR: 578
2003-04-21 22:00:49 +00:00
Richard Levitte
7f0f9f1934 Memory leak fix: RSA_blinding_on() didn't free Ai under certain circumstances.
Memory leak fix: RSA_blinding_on() would leave a dangling pointer in
                 rsa->blinding under certain circumstances.
Double definition fix: RSA_FLAG_NO_BLINDING was defined twice.
2003-04-16 06:25:29 +00:00
Richard Levitte
8f09a154e3 Memory leak fix: local blinding structure not freed in rsa_eay_private_decrypt() 2003-04-15 13:01:50 +00:00
Bodo Möller
4e7566579e include 'Changes between 0.9.6i and 0.9.6j' 2003-04-11 15:01:42 +00:00
Richard Levitte
fba1cfa06d The release is tagged, time to work on 0.9.7c. 2003-04-10 20:40:19 +00:00
Richard Levitte
110c6f72ec Include the 0.9.6j news.
This file will be retagged.
2003-04-10 20:37:53 +00:00
Richard Levitte
27f7d430ce Forgot to code the status bits for release. This file will be
retagged.
2003-04-10 20:29:08 +00:00
Richard Levitte
5964e95c0a Time to release 0.9.7b.
The tag will be OpenSSL_0_9_7b.
2003-04-10 20:22:15 +00:00
Richard Levitte
f78ae9c0f2 make update. 2003-04-10 20:10:22 +00:00
Richard Levitte
e072e16e92 New NEWS 2003-04-10 19:33:11 +00:00
Richard Levitte
7a79b5601a Remove all those infernal stupid CR characters 2003-04-10 19:11:35 +00:00
Richard Levitte
74b0c41e47 There's a problem building shared libraries on the sco5-gcc target. However,
it's time for a release, so I'm just adding an enty in PROBLEMS, and will
hopefully solve this for a later release
2003-04-10 18:36:34 +00:00
Richard Levitte
bbfbd4b270 Explicitely tell the compiler we're mips3 for the target irix-mips3-cc. 2003-04-10 05:46:55 +00:00
Dr. Stephen Henson
88ec5a637f Only call redirected rsa_sign or rsa_verify if the pointer is set.
This allows, for example, a smart card to redirect rsa_sign and keep
the default rsa_verify.
2003-04-10 01:13:37 +00:00
Dr. Stephen Henson
75fcbb43a7 Typo. 2003-04-10 00:03:22 +00:00
Richard Levitte
e4e049e489 Dont forget req. 2003-04-09 06:50:39 +00:00
Richard Levitte
225e35bd36 Typo 2003-04-09 05:25:22 +00:00
Richard Levitte
9f81f23742 Set LD_LIBRARY_PATH when linking, since OpenUnix' ld uses it to create
a library search path.

Correct typos.
2003-04-08 11:54:32 +00:00
Richard Levitte
0ae4ad9e9f Include rand.h, so RAND_status() and friends get properly declared. 2003-04-08 11:07:13 +00:00
Lutz Jänicke
a157379adc Fix ordering of compare functions: strncmp() must be used first, as it
the cipher name in the list is not guaranteed to be at least "buflen"
long.
PR: 567
Submitted by: "Matt Harren" <matth@cs.berkeley.edu>
2003-04-08 06:28:34 +00:00
Richard Levitte
1ed3815650 We seem to carry some rests of the 0.9.6 [engine] ENGINE framework, here in
form of unneeded direct calls through the engine pointer..
2003-04-08 06:02:00 +00:00
Richard Levitte
27310553b1 We seem to carry some rests of the 0.9.6 [engine] ENGINE framework in form
of unneeded includes of openssl/engine.h.
2003-04-08 06:00:17 +00:00
Richard Levitte
78490b9cc2 RSA_FLAG_SIGN_VER indicates the special rsa_sign and rsa_verify function
pointers should be used.  It doesn't necessarely mean it should go through
the ENGINE framework.
2003-04-07 19:15:29 +00:00
Richard Levitte
86ccb91ddb Do not call ENGINE_setup_bsd_cryptodev() when OPENSSL_NO_ENGINE is defined.
PR: 564
2003-04-05 21:21:29 +00:00
Richard Levitte
8e4552ed30 make update 2003-04-04 14:41:40 +00:00
Richard Levitte
bc4a5ed341 Transfer the changes to detect multiline comments and the GCC
extension __attribute__.
2003-04-04 14:21:04 +00:00
Richard Levitte
d5157a6244 Make %p and %# work properly, at least with pointers and floats. 2003-04-03 23:35:16 +00:00
Richard Levitte
d07e7c32c2 It's recommended to use req rather than x509 to create self-signed certificates 2003-04-03 22:12:50 +00:00
Richard Levitte
8f35294c1b Typo correction 2003-04-03 21:55:57 +00:00
Richard Levitte
2bdcfbd7a3 Reset the version number of the issuer certificate? I believe this
hasn't been tested in a long while...
2003-04-03 18:50:48 +00:00
Bodo Möller
46b695d850 make RSA blinding thread-safe 2003-04-02 09:50:55 +00:00
Richard Levitte
6076f21f5e It seems like gcc-drivven shared library building on OpenUnix 8 requires
-shared rather than -G.
2003-04-01 10:59:40 +00:00
Richard Levitte
be34231656 No need to test -setalias twice.
PR: 556
2003-03-31 13:56:55 +00:00
Richard Levitte
54e73364f1 Don't feil when indent is 0.
PR: 559
2003-03-31 13:24:04 +00:00
Richard Levitte
c6b220d933 Add usage string for -fingerprint.
PR: 560
2003-03-31 13:06:27 +00:00
Richard Levitte
d1c5c168b5 OpenUNIX 8 has some problems using -G with gcc. Maybe using gnu-shared works better (will be tested tonight). 2003-03-28 08:57:09 +00:00
Lutz Jänicke
931756b833 Add warning about unwanted side effect when calling SSL_CTX_free():
sessions in the external session cache might be removed.
Submitted by: "Nadav Har'El" <nyh@math.technion.ac.il>

PR: 547
2003-03-27 22:03:11 +00:00
Dr. Stephen Henson
39e76bc454 Update ocsp usage message and docs. 2003-03-26 00:47:07 +00:00
Richard Levitte
961b565690 Let's limit the extent of the definition of _XOPEN_SOURCE. 2003-03-25 21:17:31 +00:00
Richard Levitte
142cdf5ec9 Missed a few dollars.
PR: 528
2003-03-25 20:56:10 +00:00
Dr. Stephen Henson
1e2b14e9ca Get X509_V_FLAG_CRL_CHECK_ALL logic the right way round.
PR:544
2003-03-24 16:58:01 +00:00
Dr. Stephen Henson
4fe70c7812 Get X509_V_FLAG_CRL_CHECK_ALL logic the right way round.
PR:544
2003-03-24 16:57:08 +00:00
Lutz Jänicke
21eb91c79e Add SCO5 shared library scripts.
Upate SVR5 scripts for the upcoming 0.9.7b.
Submitted by: Boyd Lynn Gerber <gerberb@zenez.com>
2003-03-23 10:16:04 +00:00
Richard Levitte
9d80973ea1 Add documentation for -starttls (s_client) and -id_prefix (s_server).
PR: 542
2003-03-20 16:34:29 +00:00
Richard Levitte
e4fb312330 Some shells (ksh in this case) don't say 'command not found'.
PR: 540
2003-03-20 11:44:31 +00:00
Richard Levitte
1296e72d1d Spelling errors.
PR: 538
2003-03-20 11:42:01 +00:00
Richard Levitte
f077cf68af Make sure that all the library paths are modified in prepend mode, not
replace mode.
PR: 528
2003-03-20 11:37:55 +00:00
Richard Levitte
a69cc10af1 hinv may generate more than one line (1 line per CPU).
PR: 520
2003-03-20 11:15:16 +00:00
Richard Levitte
2dd060d94e Shut up an ANSI compiler about uninitialised variables.
PR: 517
2003-03-20 10:57:12 +00:00
Richard Levitte
546490c00e Add the target linux-ia64-ecc, suggested by Keith Thompson <kst@sdsc.edu>.
PR: 516
2003-03-20 10:50:40 +00:00
Bodo Möller
409a5de586 countermeasure against new Klima-Pokorny-Rosa atack 2003-03-19 19:19:58 +00:00
Bodo Möller
84b1e84af1 make sure RSA blinding works when the PRNG is not properly seeded;
enable it automatically only for the built-in engine
2003-03-19 18:58:55 +00:00
Dr. Stephen Henson
5250725ba5 Fix Certificate and CRL adding in X509_load_cert_crl_file:
an X509_INFO structure can contain more than one object,
for example a certififcate and a CRL.
2003-03-19 13:56:32 +00:00
Bodo Möller
84d5ad6181 fix formatting 2003-03-18 12:50:21 +00:00
Ben Laurie
96c15b8aad Turn on RSA blinding by default. 2003-03-18 12:12:10 +00:00
Dr. Stephen Henson
4fc2bf07b5 Fix for no-ec on Windows. 2003-03-15 01:29:18 +00:00
Dr. Stephen Henson
2007fe63f8 Don't give an error if response reason absent in OCSP HTTP. 2003-03-14 23:37:17 +00:00
Dr. Stephen Henson
ee435c0d9c Add entry for domainComponent so it is treated correctly.
Add table order test to end of a_strnid.c
2003-03-14 01:45:44 +00:00
Dr. Stephen Henson
3f691235da Get the PEDANTIC stuff right this time... 2003-03-13 21:26:31 +00:00
Geoff Thorpe
86a925b27e Fix a bone-head bug. This warrants a CHANGES entry because it could affect
applications if they were passing a bogus 'flags' parameter yet having
things work as they wanted anyway.
2003-03-13 20:23:19 +00:00
Dr. Stephen Henson
954d8e4f79 Return an error if gmtime returns NULL. 2003-03-13 14:10:11 +00:00
Dr. Stephen Henson
b575dff21a Avoid warnings for no-engine and PEDANTIC 2003-03-12 02:38:35 +00:00
Dr. Stephen Henson
b35ca7b257 Fixes for EVP_DigestInit_ex() and OPENSSL_NO_ENGINE. 2003-03-12 02:31:12 +00:00
Bodo Möller
0102bb94cb memset problem has been handled
PR: 343
2003-02-28 15:16:30 +00:00
Dr. Stephen Henson
57bc7769b7 Encryption BIOs misbehave when used with non blocking I/O.
Two fixes:

1. If BIO_write() fails inside enc_write() it should return the
   total number of bytes successfully written.

2. If BIO_write() fails during BIO_flush() it should return immediately
   with the error code: previously it would fall through to the final
   encrypt, corrupting the buffer.
2003-02-27 14:08:44 +00:00
Dr. Stephen Henson
0461b8c90b Typo. 2003-02-27 13:03:27 +00:00
Bodo Möller
bd8e228d60 year 2003 2003-02-24 17:16:32 +00:00
Ulf Möller
bad99f6a9d get rid of a bad character 2003-02-22 23:13:55 +00:00
Ulf Möller
5600a9cba1 Add instructions for building the MinGW target in Cygwin, and
rearrange some of the other text for better readability.
2003-02-22 23:00:25 +00:00
Ulf Möller
607ae30be8 replace symlink with copy, as in head 2003-02-22 22:59:01 +00:00
Ulf Möller
37d9503a67 mingw related cleanups, as in head 2003-02-22 18:02:46 +00:00
Richard Levitte
a1033894d7 Remove duplication and have clean depend on libclean 2003-02-22 15:04:06 +00:00
Ulf Möller
0480574310 mingw related changes as in head 2003-02-22 01:25:37 +00:00
Richard Levitte
dab0aaa612 Let's move on to development of 0.9.7b. 2003-02-19 12:55:39 +00:00
Richard Levitte
6fcf1dbc50 Time to release 0.9.7a.
The tag will be OpenSSL_0_9_7a.
2003-02-19 12:33:55 +00:00
Richard Levitte
352df99302 Security fix: Vaudenay timing attack on CBC.
An advisory will be posted to the web.  Expect a release within the hour.
2003-02-19 12:04:16 +00:00
Richard Levitte
a3063b37ef Make sure the memory allocation routines check for negative sizes 2003-02-19 11:54:57 +00:00
Richard Levitte
cf13eaf1a1 Borland C++ Builder 5 complains about unreachable statements. 2003-02-19 11:22:18 +00:00
Richard Levitte
cc811b1d7e Make the no-err option work properly 2003-02-18 12:15:13 +00:00
Bodo Möller
a81d9af7f7 Remove "+Olibcalls" option from HPUX targets.
Reportedly this option is deprecated, and on some systems
"make test" fails if it is included.

PR: 495
2003-02-16 20:10:26 +00:00
Bodo Möller
1dc94d4dcc mask old error codes so that mkerr.pl does not re-add them 2003-02-14 14:43:31 +00:00
Bodo Möller
5a2485ce12 make update 2003-02-14 14:40:04 +00:00
Richard Levitte
142398d3a7 Add support for IA64.
PR: 454
2003-02-14 13:30:43 +00:00
Richard Levitte
6c0118ee8e Handle krb5 libraries separately and make sure only libssl.so depends
on it.
2003-02-14 13:11:44 +00:00
Richard Levitte
765ca5ea06 Update linux-mips and linux-mipsel to support threads and shared libraries.
I also updated the bn_ops field with values taken from OpenBSD-mips.
PR: 498
2003-02-14 08:56:25 +00:00
Richard Levitte
97333eaff7 Pay attention to disabled SSL versions.
PR: 500
2003-02-14 05:24:25 +00:00
Richard Levitte
b088a2d3f9 Change no_rmd160 to no_ripemd for consistency.
PR: 500
2003-02-14 05:20:28 +00:00
Richard Levitte
b9447ec1bc Make it possible to disable OCSP, the speed application, and the use of sockets.
PR: 358
2003-02-14 01:03:06 +00:00
Richard Levitte
73bec6d4b7 Oh, the destest program did look at the return value... 2003-02-13 08:53:43 +00:00
Richard Levitte
e4b95737f0 Adjust DES_cbc_cksum() so the returned value is the same as MIT's
mit_des_cbc_cksum().  The difference was first observed, then verified by
looking at the MIT source.
2003-02-12 17:20:50 +00:00
Dr. Stephen Henson
c13eba970c Option to disable auto SSL chain building. 2003-02-12 17:05:17 +00:00
Bodo Möller
4309b740ce comments 2003-02-12 14:17:38 +00:00
Richard Levitte
c0d4f622eb PKCS#1 has a new RFC, which we do implement 2003-02-06 19:30:14 +00:00
Bodo Möller
a004b06237 additional sanity checks for arguments to EC_POINTs_mul() 2003-02-06 18:07:23 +00:00
Bodo Möller
98eab43915 EC_GROUP_get_extra_data() should not set an error when it returns NULL.
(NB: this is not an API change because this internal function is unused
in 0.9.7.  0.9.8-dev will use it, and will contain a similar change).
2003-02-06 18:00:20 +00:00
Bodo Möller
ef03883edd typo in WIN16 section
Submitted by: Toni Andjelkovic <toni@soth.at>
2003-02-05 16:50:50 +00:00
Bodo Möller
636631cdd5 SSL_add_dir_cert_subjects_to_stack now exists for WIN32 2003-02-05 16:37:17 +00:00
Bodo Möller
02ff8c1b66 typo 2003-02-04 12:57:37 +00:00
Bodo Möller
0b0be7a381 Update PRNG entry:
- OpenSSL version differences
- Sun /dev/urandom patch information
2003-02-04 12:26:48 +00:00
Richard Levitte
83df7b20c4 We can't say in advance what the argument to BIO_socket_ioctl() should be, so
let's make that a void *.  Also, BIO_socket_nbio() should send it an int
argument, not a long.
PR: 457
2003-01-31 12:20:41 +00:00
Richard Levitte
90c60eee9d Document -engine where missing.
PR: 424
2003-01-30 22:02:31 +00:00
Richard Levitte
8e1e238219 A few small bugs with BIO popping.
PR: 364
2003-01-30 21:49:16 +00:00
Richard Levitte
88c1fec923 The util scripts need to handled no-hw.
PR: 327
2003-01-30 20:03:48 +00:00
Richard Levitte
981469c80d The MASM situation is more difficult than described so far. It is part of VC++ 7.
PR: 327
2003-01-30 19:05:27 +00:00
Richard Levitte
b5a4fd98a5 For VC++7 and up, the file is VSVARS32.BAT.
PR: 327
2003-01-30 19:01:59 +00:00
Richard Levitte
bd573ee31a The OPENSSL_NO_ENGINE has small problem: it changes certain structures. That's
bad, so let's not check OPENSSL_NO_ENGINE in those places.  Fortunately, all
the header files where the problem existed include ossl_typ.h, which makes
a 'forward declaration' of the ENGINE type.
2003-01-30 18:52:52 +00:00
Richard Levitte
20dc821092 make update 2003-01-30 17:58:25 +00:00
Richard Levitte
6d85cd36e2 Add the possibility to build without the ENGINE framework.
PR: 287
2003-01-30 17:37:49 +00:00
Richard Levitte
10ac28e26d Small typo, OENSSL should really be spelled OPENSSL.
PR: 476
2003-01-30 11:08:47 +00:00
Richard Levitte
8f94b2010f Fix a memory leak in SSL.
PR: 477
2003-01-30 11:00:37 +00:00
Richard Levitte
d48e6a47bd cert_sk isn't always allocated, so freeing it may cause a crash.
PR: 481
2003-01-30 10:27:47 +00:00
Richard Levitte
40b676aa4f DVCS (see RFC 3029) was missing among the possible purposes.
Notified privately to me by Peter Sylvester <Peter.Sylvester@EdelWeb.fr>,
one of the authors of said RFC
2003-01-29 15:06:38 +00:00
Dr. Stephen Henson
7e4e392b07 Correct EVP_SealInit() documentation, iv is an output
parameter.
2003-01-26 13:39:24 +00:00
Bodo Möller
30e3c99d9f consistency 2003-01-24 22:27:00 +00:00
Andy Polyakov
0f618d0576 Provide "dummy" &main::picmeup even in Windows perlasm modules. 2003-01-24 09:38:18 +00:00
Dr. Stephen Henson
624feae8af Check return value of gmtime() and add error codes
where it fails in ASN1_TIME_set().

Clear error queue in req.c if *_min or *_max is absent.
2003-01-24 00:42:50 +00:00
Andy Polyakov
246f2b016b Workaround for lame compiler bug introduced in "CPU pack" for MSVC6SP5. 2003-01-23 10:05:59 +00:00
Andy Polyakov
118204f9a7 The patch speaks for itself. 2003-01-23 09:51:55 +00:00
Richard Levitte
60d16c258a Missing 0 broke FreeBSD build.
PR: 470
2003-01-23 08:10:07 +00:00
Andy Polyakov
c56dbabcfd Suggestion was to change ${MACHINE} to i586 in lines in question. Well,
"whatever" doesn't the same (avoids 386 being passed to ./Configure),
consistent with other elder SCO targets and denotes that we probably
shouldn't care much about every out-of-date platform.
2003-01-19 21:45:52 +00:00
Andy Polyakov
30167ace51 This is an *initial* tune-up. This update puts Itanium2 back on par with
Itanium. I mean if overall performance improvement over C version was X
for Itanium, it's now X even for Itanium2.
2003-01-19 21:31:20 +00:00
Andy Polyakov
b01db3b279 Oops! Missed closing quote... Didn't have time to verify before a snapshot
was cut...
2003-01-19 11:39:56 +00:00
Andy Polyakov
2af5880cfd SCO target missed .so definition. 2003-01-18 21:59:19 +00:00
Andy Polyakov
ff3fa159d0 -lresolv is not present on SCO Unix, RT#460. 2003-01-18 18:11:10 +00:00
Andy Polyakov
c440333535 Caldera/SCO targets erroneously limit themselves to 386. See RT#464. 2003-01-18 14:59:19 +00:00
Andy Polyakov
5322333b7b Fix for AIX shared build, see RT#463. 2003-01-18 13:10:23 +00:00
Dr. Stephen Henson
e98823d847 EVP_DecryptInit() should call EVP_CipherInit() not EVP_CipherInit_ex(). 2003-01-17 00:46:08 +00:00
Richard Levitte
d87a127837 A few more files to ignore 2003-01-16 21:33:06 +00:00
Richard Levitte
0062e618f0 FreeBSD has /dev/crypto as well.
PR: 462
2003-01-16 18:29:34 +00:00
Lutz Jänicke
282382cc14 Armor against systems without ranlib...
Submitted by: Thierry Lelegard <thierry.lelegard@canal-plus.fr>

PR: 461
2003-01-16 17:21:15 +00:00
Lutz Jänicke
0a3aece096 ncr-scde target needs -lc89 for strcasecmp() and ftime() (Tim Rice, Martin
Megele).

PR: 450
2003-01-16 07:54:12 +00:00
Richard Levitte
bc35d57932 Fix possible NULL dereferencial.
Notified by Verdon Walker <VWalker@novell.com>
2003-01-16 06:00:59 +00:00
Richard Levitte
dd1a3c26ba Add verbosity 2003-01-15 17:23:28 +00:00
Richard Levitte
5f988984e4 make update 2003-01-15 17:19:38 +00:00
Lutz Jänicke
0748cdc7f1 Fix initialization sequence to prevent freeing of unitialized objects.
Submitted by: Nils Larsch <nla@trustcenter.de>

PR: 459
2003-01-15 14:56:47 +00:00
Lutz Jänicke
b2c71c489d Really fix SSLv2 session ID handling
PR: 377
2003-01-15 09:48:29 +00:00
Dr. Stephen Henson
2ce906cee7 Set EXPORT_VAR_AS_FN for BC-32 to work around a compiler bug, 2003-01-14 20:52:58 +00:00
Richard Levitte
23b1ff0970 Extend the HOWTO on creating certificates, and add a HOWTO in creating keys.
PR: 422
2003-01-14 15:46:36 +00:00
cvs2svn
c2777386fc This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2003-01-14 15:42:19 +00:00
Richard Levitte
7a48984dd5 Correct an example that has a few typos.
PR: 458
2003-01-14 13:56:41 +00:00
Lutz Jänicke
96f2552c8a Document hpux-parisc2-cc problems, probably due to optimizer bug.
PR: 426
2003-01-14 13:56:26 +00:00
Andy Polyakov
e5658b9331 Note IA-32 assembler support enhancements in CHANGES. 2003-01-13 16:39:41 +00:00
Andy Polyakov
ac2336adb0 Minor FAQ update. 2003-01-13 16:34:56 +00:00
Bodo Möller
5da8738fea "!Cname surname" has now become redundant ... 2003-01-13 15:55:52 +00:00
Bodo Möller
f9f6c92c52 undo part of a recent change: it's "surname", not "surName"
(see X.520 aka ISO/IEC 9594-6)
2003-01-13 15:51:33 +00:00
Richard Levitte
98753dd088 Make sure not to declare a clashing read() for DJGPP.
PR: 440
2003-01-13 15:35:27 +00:00
Richard Levitte
881cb8b108 DJGPP doesn't have DLLs, so skip adding to %PATH% in that environment.
PR: 453
2003-01-13 15:16:48 +00:00
Bodo Möller
66bca12856 add something to the '$no_shared_warn' text 2003-01-13 14:59:07 +00:00
Richard Levitte
256c5769b4 Correct a misleading comment.
PR: 456
2003-01-13 14:53:46 +00:00
Richard Levitte
b36ea7636b Revert: the names of the cygwin distribution will not be named openssl2-*.
Requested by Corinna Vinschen <vinschen@redhat.com>
2003-01-13 14:47:55 +00:00
Richard Levitte
1f7238a434 UI_UTIL_read_pw() misinterpreted the values returned from UI functions.
PR: 456
2003-01-13 14:17:47 +00:00
Bodo Möller
2944c9c665 typo 2003-01-13 13:16:46 +00:00
Richard Levitte
129bd04329 tty_in will never be stderr, so it will always be closed, which means stdin
might get closed...
Reported by Mark Daniel <Mark.Daniel@wasd.vsm.com.au>
2003-01-13 13:15:19 +00:00
Andy Polyakov
a6816db813 Addenum to IA-32 assembler support enhancements from HEAD branch. 2003-01-12 22:40:09 +00:00
Andy Polyakov
1d76d78858 OpenBSD FAQ update. Apparently gas from binutils-2.x makes it impossible to
use gcc -fPIC ... on OpenBSD-i386. Alternative solution is provided.
2003-01-12 21:40:15 +00:00
Andy Polyakov
fb70607064 IA-32 assembler support enhancements from HEAD branch: unified ELF,
support for SCO/Caldera targets and for Cygwin shared build.
2003-01-12 16:35:30 +00:00
Richard Levitte
959ba907df Add better support for FreeBSD on non-x86 machines.
Add specific support for FreeBSD on sparc64.
PR: 427
2003-01-12 04:43:52 +00:00
Richard Levitte
dfc3b51e78 If the user said 'shared' and we haven't included support for shared libraries,
warn him or her.
Reminder by Andrew Marlow <apm35@student.open.ac.uk>
2003-01-11 11:40:43 +00:00
Richard Levitte
7f2e024e78 Double the dollars that are intended for the command line.
PR: 423
2003-01-10 16:32:36 +00:00
Richard Levitte
193e764c0b Add documentation on how to handle the shared libaries.
PR: 423
2003-01-10 16:14:37 +00:00
cvs2svn
6b20c70b52 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2003-01-10 16:14:35 +00:00
Richard Levitte
69c5d47bd4 CFLAG, not CFLAGS 2003-01-10 11:30:47 +00:00
Richard Levitte
daf5fafced It's recommended to do 'make clean' after having prepared a new build tree.
PR: 437
2003-01-10 11:00:52 +00:00
Richard Levitte
fa47b4d8b8 When preparing a separate build tree, don't make softlinks to softlinks.
Add instructions in INSTALL, for easy access.
PR: 437
2003-01-10 10:56:21 +00:00
Richard Levitte
661ef5eead Force the removal.
PR: 437
2003-01-10 10:55:01 +00:00
Richard Levitte
d38ef273cc Certain files must be removed before generating them, in case they point
into a read-only source tree.
PR: 437
2003-01-10 10:54:21 +00:00
Richard Levitte
85ca752e33 Make sure everything that may be freed is allocated or initiated.
PR: 446
2003-01-10 08:59:48 +00:00
Richard Levitte
17244d193b Typos corrected.
PR: 445
2003-01-10 08:54:04 +00:00
Dr. Stephen Henson
df77232bdc Oops, left debugging malloc include file in... 2003-01-09 16:53:26 +00:00
Richard Levitte
2ae5bd9bb6 The naming scheme wasn't quite correct for Cygwin 2003-01-09 16:15:48 +00:00
Dr. Stephen Henson
8ce7348625 NULL tofree when it is freed to avoid double free.
Make sure key is not NULL before freeing it.
2003-01-09 13:05:57 +00:00
Lutz Jänicke
3f1cbad2e7 Third argument to shl_load() is "long address", not a pointer.
(Didn't influence functionality, as on HP-UX 32bit the NULL pointer
is a 32bit 0-value and thus is identical to the required 0L.)

PR: 443
2003-01-08 08:26:59 +00:00
Dr. Stephen Henson
e78a012305 Add EVP_CIPHER_CTX_cleanup() to avoid memory leak. 2003-01-04 18:23:11 +00:00
Andy Polyakov
4d1e5535b2 Support for ILP32 on HPUX-IA64. 2003-01-03 15:19:55 +00:00
Andy Polyakov
1954767b45 pa-risc2.s was not PIC, see RT#426. I strip call to fprintf as it's
never called anyway (it's a debugging assertion). If pa-risc2W.s is
PIC remains to be seen...
2003-01-03 10:50:38 +00:00
Richard Levitte
0bc81d5135 Rijndael should be called AES everywhere 2003-01-03 08:51:48 +00:00
Richard Levitte
6983b4615c Adjust the parameter lists in some not commonly used files.
PR: 428
2003-01-01 23:41:50 +00:00
Ben Laurie
339e4dd3ef Fix warnings, use correct -Ds. 2003-01-01 15:48:38 +00:00
Richard Levitte
d57084f235 Make sure the last character of the ASN.1 time string (the 'Z') is copied.
PR: 429
2003-01-01 03:41:01 +00:00
Richard Levitte
4a2e36b19e It's rather silly to believe we'd release 0.9.7a in 2002 :-). 2002-12-31 00:59:36 +00:00
Richard Levitte
1c2018f37f Tagging is done, move on to development of 0.9.7a. 2002-12-31 00:02:34 +00:00
Richard Levitte
04572965ea Time for release of OpenSSL 0.9.7.
The tag will be OpenSSL_0_9_7.
2002-12-30 23:54:11 +00:00
Andy Polyakov
1832f5e751 My English is definitely not good as my assembly skills:-) And it looks
like titles can't be multi-line (it doesn't look good on the FAQ web-page).
2002-12-30 20:20:25 +00:00
Andy Polyakov
d3f56a69fb It probably belongs in PROBLEMS, but it's more likely to be a FAQ. 2002-12-30 11:08:56 +00:00
Richard Levitte
bfbc667397 Since we're including Kerberos 5 headers in our exported header files (when
OpenSSL is configured to use Kerberos), we'd better tell pkg-config users
where they can be found.
PR: 421
2002-12-29 23:03:16 +00:00
Lutz Jänicke
cb284033f5 Add information about AES cipher suites to ciphers manual page.
If no authentication method is mentioned in the cipher suite name (e.g.
AES128-SHA), RSA authentication is used (PR #396).
2002-12-29 21:23:43 +00:00
Lutz Jänicke
ef9d3a10c3 Fix wrong handling of session ID in SSLv2 client code.
PR: 377
2002-12-29 20:58:55 +00:00
Richard Levitte
20c9a50710 OS/2 does binary by default, apparently.
Reported by Brian Havard <brianh@kheldar.apana.org.au>.
2002-12-29 10:20:01 +00:00
Richard Levitte
5b9aa0e474 Make sure OPENSSL_SYS_ macros are defined. 2002-12-28 02:37:05 +00:00
Richard Levitte
475cc45a61 make update 2002-12-28 02:30:47 +00:00
Richard Levitte
21fa937c9f Make sure OPENSSL_SYS_ macros are defined, and in md5_locl.h, switch
back to using OPENSSL_SYS_ULTRASPARC.
2002-12-28 02:30:26 +00:00
Richard Levitte
bae500aa21 make update 2002-12-28 01:35:25 +00:00
Richard Levitte
5534b7f133 Hmm, the variables $x96_elf_asm and others contain a number of colons,
so when removing one reference, if should be replaced with the
appropriate number of colons, or chaos will follow...
2002-12-28 01:35:11 +00:00
Andy Polyakov
163d6401c5 According to Tim Rice <tim@multitalents.net> assembler support in SCO5
never worked anyway. Note this is not going to HEAD as we intend to
provide an alternative solution as soon as 0.9.7 is out.
2002-12-27 16:49:47 +00:00
Andy Polyakov
fc24169eaf I can't confirm the claim being removed and nobody seems to speak up for it.
Yes, this implies that corresponding targets in beta6 pass the test suite.
2002-12-27 15:06:13 +00:00
Andy Polyakov
0c78046356 UltraSPARC performance "tune-up." 2002-12-27 14:50:13 +00:00
Andy Polyakov
4b8e01a22f FAQ addenum as discussed in RT#417. 2002-12-27 14:29:18 +00:00
Richard Levitte
a882c80e6f Kenneth R. Robinette just told me the latest snapshot works well with
MIT Kerberos.
2002-12-27 14:01:42 +00:00
Richard Levitte
5de00c254d Can't find the referense to errors on XP with Kerberos 2002-12-27 08:09:11 +00:00
Richard Levitte
d7b612e737 Add SPKM among the related stanrds. 2002-12-26 22:35:07 +00:00
Richard Levitte
d95b69b32c Updates 2002-12-26 22:25:04 +00:00
Richard Levitte
1dbfa26b5a Update our list of implemented and related standards. 2002-12-26 00:21:55 +00:00
Richard Levitte
342a584c2b Update our list of implemented and related standards. 2002-12-26 00:17:49 +00:00
Richard Levitte
718d8a931d Spelling error.
This patch was taken from the OpenBSD copy of OpenSSL 0.9.7 beta3 with patches
2002-12-25 22:17:00 +00:00
Richard Levitte
39db27cb83 Avoid double definition of config.
PR: 420
2002-12-24 23:53:50 +00:00
Richard Levitte
cc81432b5b Updates 2002-12-24 23:52:10 +00:00
Lutz Jänicke
c71414b3a9 Some more adjustments
Submitted by: Jeffrey Altman <jaltman@columbia.edu>, "Kenneth R. Robinette" <support@securenetterm.com>
2002-12-24 21:53:34 +00:00
Richard Levitte
542e010aa5 Cygwin needs the library locatin for .DLLs to be set in PATH. Unfortunately,
the conditional was set to add the library directory to PATH when the
platform is NOT Cygwin.  Corrected.
PR: 404
2002-12-24 10:50:18 +00:00
Richard Levitte
84ce9aa177 All VMS-specific problems have been solved.
Confirmed by Mark Daniel <Mark.Daniel@wasd.vsm.com.au>
2002-12-24 10:38:08 +00:00
Richard Levitte
4c94c028a7 Finally, a bn_div_words() in VAX assembler that goes through all tests.
PR: 413
2002-12-23 11:25:55 +00:00
Richard Levitte
88a908e50d Stop a possible memory leak.
(I wonder why s2_connect() handles the initial buffer allocation slightly
differently...)
PR: 416
2002-12-21 23:49:25 +00:00
Richard Levitte
d7de7bcf3e Make AES_ENCRYPT and AES_DECRYPT macros instead of static constants.
PR: 411
2002-12-20 18:21:38 +00:00
Andy Polyakov
cbdda5cc87 Fix for "shift count too large" when compiling for hpux-parisc2 and
irix-mips. The bug was introduced with accelerated support for x86_64.
My fault! Fixed now.
2002-12-20 18:10:39 +00:00
Richard Levitte
4e356d9876 More accurate comments. 2002-12-20 16:38:40 +00:00
Richard Levitte
ff3ab1699b A little debugging. 2002-12-20 16:38:09 +00:00
Richard Levitte
8eeefabf32 Propagate MAKEDEPPROG to the subdirs under crypto/. 2002-12-20 15:28:45 +00:00
Lutz Jänicke
214b8b998a Fix Kerberos5/SSL interaction
Submitted by: "Kenneth R. Robinette" <support@securenetterm.com>
Reviewed by:
PR:
2002-12-20 12:47:16 +00:00
Richard Levitte
2ef9e7efe6 Keep the internal lowercase 'surname', for programmer's sake. 2002-12-20 09:39:42 +00:00
Richard Levitte
449598e723 Be consistent with capitalisation of object names. 2002-12-20 09:24:24 +00:00
Richard Levitte
5201cb5acb Be consistent with capitalisation of object names. 2002-12-20 09:18:21 +00:00
Richard Levitte
ab79ac44d5 There was a mixup between INSTALLTOP and OPENSSLDIR... 2002-12-20 07:51:08 +00:00
Richard Levitte
e286dfe6ed We stupidly had a separate LIBKRB5 variable for KRB5 library dependencies,
and then didn't support it very well.  And that when there already is a
useful variable for exactly this kind of thing; EX_LIBS...
2002-12-19 22:10:20 +00:00
Richard Levitte
17e3b273e6 Because the contents of openssl.pc may have to change when a configuration
has been performed (and possibly changed), have it depend on Makefile.ssl.
2002-12-19 21:56:42 +00:00
Richard Levitte
c93c8d1123 Small tweaks for code consistency. 2002-12-19 21:55:50 +00:00
Richard Levitte
d5bf2e06b3 I have no idea what possesed me to compile s_socket.c as POSIXly code.
Incidently, it now compiles so much better without _POSIX_C_SOURCE.
2002-12-19 19:42:55 +00:00
Richard Levitte
bbd6c8bd16 If _XOPEN_SOURCE_EXTENDED or _XOPEN_SOURCE are defined, _POSIX_C_SOURCE gets
defined in DECC$TYPES.H.  If _POSIX_C_SOURCE is defined, certain types do
not get defined (u_char, u_int, ...).  DECC.H gets included by assert.h
and others.  Now, in6.h uses the types u_char, u_int and so on, and gets
included as part of other header inclusions, and will of course fail because
of the missing types.

On the other hand, _XOPEN_SOURCE_EXTENDED is needed to get gethostname()
properly declared...

Solution: define _XOPEN_SOURCE_EXTENDED much later, so DECC$TYPES.H has
a chance to be included *first*, so the otherwise missing types get defined
properly.

Personal: *mumble* *mumble*
2002-12-19 19:38:51 +00:00
Richard Levitte
00f76ad0df It was pointed out to me that .pc files are normally stored in
${prefix}/lib/pkgconfig, not ${prefix}/lib/pkginfo.
2002-12-19 17:44:45 +00:00
Richard Levitte
4b70367430 It was pointed out to me that .pc files are normally stored in
${prefix}/lib/pkgconfig, not ${prefix}/lib/pkginfo.
2002-12-19 17:42:25 +00:00
Richard Levitte
ce9cbfc815 Update the current status 2002-12-18 10:24:04 +00:00
Andy Polyakov
a92a9f02fb Fix for RT#405, Solaris refuses to invoke preprocessor if egrep returns 1.
Linux for example doesn't exhibit this behaviour, but I add "exit 0" to all
potentially affected rules, just to be on the safe side.
2002-12-18 09:02:07 +00:00
Richard Levitte
b65d3741b3 Move on to beta7 (hopefully, that will never appear) 2002-12-17 14:48:24 +00:00
Richard Levitte
fcf8f4d453 Time to release OpenSSL 0.9.7 beta6.
The tag will be OpenSSL_0_9_7-beta6.
2002-12-17 14:24:51 +00:00
Richard Levitte
13617646da A few more NEWS items. 2002-12-17 14:21:55 +00:00
Andy Polyakov
7a3565009e Make "perl des-586.pl a.out" work, see RT#402 2002-12-17 08:01:28 +00:00
Andy Polyakov
9f3864fde3 Some of Sun compiler drivers (well, one of those I have) collect all
options specified with -Wl in the beginnig of the ld command line which
kind of obsoletes the idea as it's -z defaultextract that will be
closest to lib*.a and not -z allextract:-(
2002-12-16 18:59:05 +00:00
Andy Polyakov
db186beee4 This is rollback to 0.9.6h bn_mul.c to address problem reported in RT#272. 2002-12-16 18:17:24 +00:00
Richard Levitte
1f1a32541f Protect loading routines with a lock.
PR: 373
2002-12-16 06:06:06 +00:00
Geoff Thorpe
0465313e70 "=head3" tags only work with recent versions of the pod tools and 0.9.7
should cooperate with older environments. This replaces them with "I<..>"
tags.
2002-12-15 21:20:25 +00:00
Geoff Thorpe
8d2563f136 The ampersand is not required in these constructs, and was giving AIX
warnings.

Reported by: Bernhard Simon.
2002-12-15 16:45:28 +00:00
Andy Polyakov
21996c6d8e Always forget this one... 2002-12-15 16:00:26 +00:00
Andy Polyakov
fcc5349156 Another Solaris shared build clean-up. This is not actually needed if one
uses WorkShop C. It's gcc driver that brings copy of libgcc.a into .so
otherwise. In case you wonder what it's -Wl,-z... and not just -z. Problem
is that gcc driver apparently omits all -z options but -z text. Don't ask
me why. I'm not committing corresponding workaround into the HEAD as
Makefile.shared reportedly needs even more work...
2002-12-15 15:27:53 +00:00
Andy Polyakov
1a07628209 DES PIC-ification. "Cygwin" companion. Problem was that preprocessor macro
is not expanded if prepended with a $-sign.
2002-12-15 10:05:29 +00:00
Richard Levitte
814af7e175 Make sure manual pages are properly linked to on systems that have case
insensitive file names, as well as those that do not have symlinks.
Incidently, both these cases apply on DOS/Windows...
2002-12-15 06:45:46 +00:00
Richard Levitte
bf683ec609 Update the make system for installations:
- define a HERE variable to indicate where the source tree is (not
  used right now)
- make more use of copying and making attribute changes to {file}.new,
  and then move it to {file}
- use 'mv -f' to avoid all those questions to the user when the file
  in question doesn't have write attributes for that user.
2002-12-15 06:00:29 +00:00
Richard Levitte
e851895f04 Don't define macros in terms of asm() when __STRICT_ANSI is defined. 2002-12-15 05:54:58 +00:00
Andy Polyakov
a2049ba394 Ooops! No ROTATE on some platforms after x86_64 performance patch... 2002-12-15 00:44:00 +00:00
Andy Polyakov
a8239afc86 As you might have noticed I tried to change for . prefix, because it's
the one to be used to denote local labels in single function scope.
Problem is that SHA uses same label set across functions, therefore I
have to switch back to $ prefix.
2002-12-14 23:13:19 +00:00
Andy Polyakov
bb38cd49e4 Solaris shared build fix-ups. See RT#238,239 for details. 2002-12-14 21:51:23 +00:00
Andy Polyakov
1cbdbcd587 x86_64 performance patch. 2002-12-14 20:45:39 +00:00
cvs2svn
7e201e9f73 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-12-14 20:42:08 +00:00
Andy Polyakov
9fc866c5eb DES PIC-ification. Windows companion. 2002-12-14 17:52:35 +00:00
Andy Polyakov
b0e88fb11b IA-32 assembler modules (primarily DES) PIC-ification. Idea is to keep
shared libraries shared.
2002-12-13 17:31:01 +00:00
Richard Levitte
04c71cd725 OK, there's at least one application author who has provided dynamic locking
callbacks
2002-12-13 07:30:59 +00:00
Richard Levitte
d64b16ab25 BIO_new_bio_pair() was unnecessarily described in it's own page as well as in
BIO_s_bio.pod.  The most logical is to move everything needed from
BIO_new_bio_pair.pod to BIO_s_bio.pod (including the nice example)
and toss BIO_new_bio_pair.pod.  I hope I got all the info over properly.
PR: 370
2002-12-12 22:12:04 +00:00
Richard Levitte
f30b793779 BIO_set_nbio() is enumerated, but not explained. Remove it from enumeration
since it's both enumerated and explained in BIO_s_connect.pod.
PR: 370
2002-12-12 22:08:52 +00:00
Richard Levitte
94ea9c84c5 Skip DH-specific tests when no-dh has been configured.
PR: 353
2002-12-12 18:43:32 +00:00
Richard Levitte
5c72869563 Add a static lock called HWCRHK, for the case of having an application
that wants to use the hw_ncipher engine without having given any
callbacks for the dynamic type of locks.
2002-12-12 17:41:36 +00:00
Richard Levitte
712419b73a In CRYPTO_lock(), check that the application cares about locking (provided
callbacks) before attempting to lock.
2002-12-11 08:56:42 +00:00
Richard Levitte
7627efc92f sk_*_push() returns the number of items on the stack, not the index of the
pushed item.  The index is the number of items - 1.  And if a NULL item was
found, actually use it.
Finally, provide a little bit of safety in CRYPTO_lock() by asserting the a
requested dynamic lock really must exist, instead of just being silent about it
2002-12-11 08:33:37 +00:00
Richard Levitte
cd7f458e28 Let's not forget the other places where HEADER_DES_H and HEADER_DES_OLD_H
were defined.
2002-12-11 07:37:57 +00:00
Richard Levitte
ea01493df0 Let's not forget the other places where HEADER_DES_H and HEADER_DES_OLD_H
were defined.
2002-12-11 07:24:47 +00:00
Richard Levitte
323edf1908 Since HEADER_DES_H has been the protector of des.h since libdes
(before SSLeay, maybe?), it's better to have that macro protect
the compatibility header des_old.h.  In the new des.h, let's use
a slightly different protecting macro.

The rationale is that there are application that might include (via
other header files, perhaps) both an old libdes des.h and OpenSSL's
des.h.  Whichever comes first would overshadow the other because of
the clash in protecting macro.  This fix solves that problem.
2002-12-11 06:59:49 +00:00
Lutz Jänicke
ba9cf37d59 Update -Olimit setting.
Submitted by: Bernhard Simon <simon@zid.tuwien.ac.at>
Reviewed by:
PR:
2002-12-10 18:47:31 +00:00
Richard Levitte
2581aacd52 A memset() too many got converted into a OPENSSL_cleanse().
PR: 393
2002-12-10 08:26:10 +00:00
Lutz Jänicke
533a0c4ce7 Fix wrong URI.
Submitted by: assar@kth.se
Reviewed by:
PR: 390
2002-12-09 08:49:35 +00:00
Richard Levitte
93f3decc4f I haven't worked on OCSP at all for a long time, and my KRB5 work will
be concentrated on Heimdal support.
2002-12-07 19:59:54 +00:00
Andy Polyakov
1c799131ae Workaround for GCC-ia64 compiler bug.
Submitted by: <appro>
Reviewed by:
PR:
2002-12-06 17:16:25 +00:00
Andy Polyakov
b1d4b48d39 linux64-sparcv9 support
Submitted by: <appro>
Reviewed by:
PR:
2002-12-06 16:45:11 +00:00
Richard Levitte
bed4559052 Some compilers are quite picky about non-void functions that don't return
anything.
2002-12-06 08:50:25 +00:00
Richard Levitte
7f87c1c0fc Apparently, bash is more forgiving than sh. To be backward
compatible, don't use ==, use = instead...
2002-12-06 08:44:24 +00:00
Richard Levitte
aaf7b47abe The news were not updated in time... 2002-12-06 00:37:20 +00:00
Richard Levitte
af0b30e77c Tagging has been done, time to move the branch to 0.9.7-beta6
development.
2002-12-05 23:10:01 +00:00
Richard Levitte
9494e3cc40 Time to release 0.9.7-beta5.
The tag will be OpenSSL_0_9_7-beta5.
2002-12-05 22:51:19 +00:00
Richard Levitte
a272f7eb08 Merge in relevant changes from the OpenSSL 0.9.6h release. 2002-12-05 21:51:57 +00:00
Richard Levitte
b3dd9f3bb5 SSL_CERT_FILE should be used in place of the system default file, not as
a first alternative to try
2002-12-05 21:07:35 +00:00
Richard Levitte
bb9104f0ee Corrected DJGPP patch 2002-12-05 20:50:52 +00:00
Richard Levitte
ae0b7667a9 Make sure to implement the cryptodev engine only when /dev/crypto exists.
PR: 385
2002-12-05 10:17:08 +00:00
Richard Levitte
fabf7d3a67 make update 2002-12-05 01:55:24 +00:00
Richard Levitte
54307ce955 Allow users to modify /MD to /MT.
PR: 380
2002-12-05 01:35:09 +00:00
Richard Levitte
2589b74fd8 Make sure using SSL_CERT_FILE actually works, and has priority over system defaults.
PR: 376
2002-12-05 01:20:59 +00:00
Richard Levitte
d9090acdfb If an application supports static locks, it MUST support dynamic locks as
well to be able to use the CHIL engine.
PR: 281
2002-12-05 00:57:20 +00:00
Richard Levitte
72951df799 Only check for a result buffer if the allocated string is a prompt string.
PR: 381
2002-12-05 00:04:40 +00:00
Richard Levitte
a9b41af71c Do not implement RC4 stuff if RC4 is disabled. Concequently, apply the same
rule for SHA stuff.
PR: 381
2002-12-04 22:54:13 +00:00
Richard Levitte
a0ed612fef gethostname() is more a BSD feature than an XOPEN one.
PR: 379
2002-12-04 22:48:10 +00:00
Richard Levitte
afdec73ca5 Correct a few typos that I introduced after applying DJGPP patches. 2002-12-04 19:13:49 +00:00
Lutz Jänicke
2e70cb6506 Missing "("
Submitted by: Christian Hohnstaedt <chohnstaedt@innominate.com>
Reviewed by:
PR:
2002-12-04 13:29:14 +00:00
Richard Levitte
1794904a4a DJGPP patches.
PR: 347
2002-12-04 09:54:31 +00:00
Richard Levitte
fd28279a62 Add support for x86_64.
PR: 348
2002-12-04 09:17:54 +00:00
Richard Levitte
6b27ae1d94 A gcc 3.0 bug is triggered by our code. Add a section about it in PROBLEMS.
PR: 375
2002-12-04 08:24:28 +00:00
Dr. Stephen Henson
a6ee8fe26a Make ASN1_TYPE_get() work for V_ASN1_NULL type. 2002-12-04 00:50:20 +00:00
Dr. Stephen Henson
e758ce69a3 Typo in X509v3_get_ext_by_critical 2002-12-04 00:14:00 +00:00
Dr. Stephen Henson
38b085902f In asn1_d2i_read_bio, don't assume BIO_read will
return the requested number of bytes when reading
content.
2002-12-03 23:49:12 +00:00
Richard Levitte
27498a3330 EXIT() may mean return(). That's confusing, so let's have it really mean
exit() in whatever way works for the intended platform, and define
OPENSSL_EXIT() to have the old meaning (the name is of course because
it's only used in the openssl program)
2002-12-03 16:34:28 +00:00
Richard Levitte
49cd4b7316 Make CRYPTO_cleanse() independent of endianness. 2002-12-03 16:07:03 +00:00
Richard Levitte
a067cba35b Windows CE updates, contributed by Steven Reddie <smr@essemer.com.au> 2002-12-03 14:21:32 +00:00
Richard Levitte
2905015c6e Merge from HEAD 2002-12-02 22:56:43 +00:00
Richard Levitte
610abd4c52 define USE_SOCKETS so sys/param.h gets included (and thusly, MAXHOSTNAMELEN
gets defined).
PR: 371
2002-12-02 22:49:12 +00:00
Richard Levitte
ddc6ea162f Merge from HEAD 2002-12-02 02:40:42 +00:00
Richard Levitte
b8804bf15d Small bugfix: even when r == d, we need to adjust r and q.
PR: 366
2002-12-01 02:17:30 +00:00
Richard Levitte
d03ad453a5 EXIT() needs to be in a function that returns int. 2002-12-01 01:23:39 +00:00
Richard Levitte
3f71579dfc Redo the VAX assembler version of bn_div_words().
PR: 366
2002-12-01 00:49:45 +00:00
Richard Levitte
f217439ee2 Remove incorrect assert.
PR: 360
2002-11-29 15:18:28 +00:00
Richard Levitte
9d8f3cfb7f Make it so all names mentioned in the NAME section of each manpage becomes a
symlink to said manpage.
PR: 242
2002-11-29 15:01:12 +00:00
cvs2svn
d5c79928ef This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-11-29 15:01:01 +00:00
Richard Levitte
37529750e2 Correct some names. 2002-11-29 14:22:05 +00:00
Richard Levitte
c9ea7400b4 A few more memset()s converted to OPENSSL_cleanse().
I *think* I got them all covered by now, bu please, if you find any more,
tell me and I'll correct it.
PR: 343
2002-11-29 11:31:51 +00:00
Richard Levitte
9fa15b6ff8 Have all tests use EXIT() to exit rather than exit(), since the latter doesn't
always give the expected result on some platforms.
2002-11-28 18:57:30 +00:00
Richard Levitte
9c44ebc1e2 Make sure EXIT() can always be used as one statement. 2002-11-28 18:52:24 +00:00
Richard Levitte
75e3026a14 Cleanse memory using the new OPENSSL_cleanse() function.
I've covered all the memset()s I felt safe modifying, but may have missed some.
2002-11-28 08:09:03 +00:00
Richard Levitte
0a3af9a403 Add OPENSSL_cleanse() to help cleanse memory and avoid certain compiler
and linker optimizations.
PR: 343
2002-11-27 12:25:52 +00:00
cvs2svn
3a08cf3bfb This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-11-27 12:24:10 +00:00
Richard Levitte
8826087a97 I forgot that @ in strings must be escaped in Perl 2002-11-26 15:26:55 +00:00
Richard Levitte
8aa09a245c The logic in the main signing and verifying functions to check lengths was
incorrect.  Fortunately, there is a second check that's correct, when adding
the pads.
PR: 355
2002-11-26 11:14:45 +00:00
Richard Levitte
a5fd84de41 Heimdal isn't really supported right now. Say so, and offer a possibility
to force the use of Heimdal, and warn if that's used.
PR: 346
2002-11-26 10:11:25 +00:00
Richard Levitte
dc199cfaa2 Small bugfixes to the KSSL implementation.
PR: 349
2002-11-26 10:09:28 +00:00
Richard Levitte
b81ef84227 Heimdal isn't really supported right now. Say so, and offer a possibility
to force the use of Heimdal, and warn if that's used.
PR: 346
2002-11-26 09:19:06 +00:00
Richard Levitte
91203a9482 Mention a current showstopper 2002-11-21 22:39:25 +00:00
Bodo Möller
134fea9d0f avoid uninitialized memory read
Submitted by: Nils Larsch
2002-11-20 14:14:45 +00:00
Lutz Jänicke
a153c46d7f Fix bug introduced by the attempt to fix client side external session
caching (#288): now internal caching failed (#351):
Make sure, that cipher_id is set before comparing.
Submitted by:
Reviewed by:
PR: 288 (and 351)
2002-11-20 10:46:35 +00:00
Bodo Möller
8faad520ae allocate bio_err before memory debugging is enabled to avoid memory leaks
(we can't release it before the CRYPTO_mem_leaks() call!)

Submitted by: Nils Larsch
2002-11-19 11:55:47 +00:00
Richard Levitte
8f89ae928b We now work with the development of 0.9.7 beta 5. 2002-11-19 11:37:03 +00:00
Richard Levitte
782ded56e5 Update STATUS 2002-11-19 09:34:38 +00:00
Richard Levitte
8e458d52b5 Time to release 0.9.7-beta4.
The tag will be OpenSSL_0_9_7-beta4
2002-11-19 09:34:29 +00:00
Richard Levitte
1f475c1f6f make update 2002-11-19 08:55:06 +00:00
Richard Levitte
bc9867e672 Add news items for 0.9.6h and expand on the 0.9.7 news as well. 2002-11-18 23:58:33 +00:00
Richard Levitte
412fd4708d Determine HZ exactly as in apps/speed.c. 2002-11-18 23:06:46 +00:00
Richard Levitte
273c624442 Make sure sysconf exists (it doesn't in the VMS C RTL lesser than version 7). 2002-11-18 23:05:50 +00:00
Bodo Möller
8b591c2f8e fix memory leak in memory debuggin code ...
Submitted by: Nils Larsch
2002-11-18 14:01:24 +00:00
Bodo Möller
8f4a23e3b7 allocate bio_err before memory debugging is enabled to avoid memory leaks
(we can't release it before the CRYPTO_mem_leaks() call!)

Submitted by: Nils Larsch
2002-11-18 13:38:30 +00:00
Richard Levitte
c83d8e2ba6 A variable of type time_t is supposed to be a time measurement starting at
Epoch.  offset isn't such a measurement, so let's stop pretend it is.
2002-11-18 13:04:29 +00:00
Lutz Jänicke
6afc70be84 Better workaround to the "=head1 NAME OPTIONS" pod2latex problem:
NAME OPTIONS are a subset of OPTIONS, so just make it =head2!
Submitted by:
Reviewed by:
PR: 333
2002-11-18 08:14:20 +00:00
Richard Levitte
f503c2c9e6 Make it possible to build for more than one CPU.
Clarify what the CE tests do.
2002-11-17 19:48:34 +00:00
Richard Levitte
7656893d51 Ignore openssl.pc. This way, there's no risk that I'll add it again :-). 2002-11-17 08:07:12 +00:00
Richard Levitte
ff38d68237 Adding openssl.pc to the repository was a mistake,
since it's generated.
2002-11-17 08:05:43 +00:00
Richard Levitte
aff3e60754 Add the file openssl.pc that I forgot a while ago. 2002-11-17 07:47:25 +00:00
Richard Levitte
8196d87371 I forgot this is compiled in test/, not crypto/ec/... 2002-11-16 10:10:49 +00:00
Richard Levitte
61b1ad197a We don't want TARGETCPU expanded here. 2002-11-16 09:42:17 +00:00
Richard Levitte
293bb4b1b8 Mention ActiveState Perl much earlier in INSTALL.WCE. 2002-11-15 22:54:26 +00:00
Richard Levitte
29ca164513 WinCE patches 2002-11-15 22:44:08 +00:00
cvs2svn
97d58eadbf This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-11-15 22:37:19 +00:00
Lutz Jänicke
8cdeec9f54 Fix buggy #! magic and update ssleay->openssl
Submitted by:
Reviewed by:
PR: 305
2002-11-15 21:26:02 +00:00
Richard Levitte
082cd4e564 Changes to make shared library building and use work better with Cygwin 2002-11-15 16:49:34 +00:00
Richard Levitte
2115a89212 Document the change to remove the 'done' flag variable in the
OpenSSL_add_all_*() routines
2002-11-15 14:01:15 +00:00
Richard Levitte
af3ec1e24e make update 2002-11-15 11:22:25 +00:00
Richard Levitte
f275683ae8 A few more Microsoft OIDs added 2002-11-15 11:18:22 +00:00
Lutz Jänicke
da91e37d37 The pointer to the cipher object is not yet set, when session was reloaded
from external cache (using d2i_SSL_SESSION). Perform comparison based on
the cipher's id instead.
Submitted by: Steve Haslam <araqnid@innocent.com>
Reviewed by:
PR: 288
2002-11-15 10:51:40 +00:00
Richard Levitte
2758c44398 The architecture name is i486, not just 486 2002-11-15 10:28:55 +00:00
Richard Levitte
4e056a2894 -Wid-clash-n isn't support in gcc 3, and I get better result from continuously
rebuilding on a VMS box.
2002-11-15 10:19:47 +00:00
Richard Levitte
f60b017da8 I know ANSI C doesn't like 'long long', and I don't want to see it 2002-11-15 10:16:07 +00:00
Richard Levitte
08634f1156 Spell prototypes correctly :-) 2002-11-15 09:56:41 +00:00
Richard Levitte
a50d6a801f Add -Wstrict-prototype and -Wmissing-prototype to my debugging targets 2002-11-15 09:54:06 +00:00
Richard Levitte
0439a5a8a7 We need to read one more byte of the REQUEST-CERTIFICATE message.
PR: 300
2002-11-15 09:17:45 +00:00
Richard Levitte
8ffe66b4ce make update 2002-11-14 23:54:12 +00:00
Richard Levitte
d62ec8362a Close the implicitely opened registry key.
PR: 264
2002-11-14 23:34:07 +00:00
Lutz Jänicke
259b33d5a3 No such reference to link to (found running pod2latex).
Submitted by:
Reviewed by:
PR:
2002-11-14 21:40:12 +00:00
Dr. Stephen Henson
6393c09cda Fix documentation of i2d_X509_fp and i2d_X509_bio. 2002-11-14 18:12:45 +00:00
Richard Levitte
9421f1ab9c Add Tandem OSS target.
PR: 192
2002-11-14 16:30:44 +00:00
Richard Levitte
5bf0d0ea1e Remove warnings. 2002-11-14 15:58:01 +00:00
Richard Levitte
769f74b818 It seems like gcc 2.9aix5.1 doesn't do will with optimization level 3.
PR: 115
2002-11-14 14:08:21 +00:00
Richard Levitte
64051a3a71 Add a FAQ on how to check the authenticity of the openSSL distribution.
PR: 292
2002-11-14 13:01:35 +00:00
Richard Levitte
8260eded07 Cygwin fixes 2002-11-14 12:39:56 +00:00
Bodo Möller
402b4a784d use same entry as in more recent CHANGES revision in CVS head 2002-11-14 12:11:44 +00:00
Bodo Möller
651e7ddf7e fix order again 2002-11-14 12:08:16 +00:00
Richard Levitte
40bace2da6 Fix to build better with DJGPP.
PR: 338

Here's the description, submitted by Gisle Vanem <giva@bgnett.no>:

1. sock_init() renamed to ssl_sock_init() in ./apps/s_socket.c due
   to name-clash with Watt-32.

2. rand() renamed to Rand() in ./crypto/bn/divtest.c due to name-clash
   with <stdlib.h>

3. Added calls to dbug_init()/sock_init() in some demo programs.

4. Changed cflags/lflags in configure. Watt-32 install root now taken
   from $WATT_ROOT.
2002-11-14 11:22:46 +00:00
Lutz Jänicke
e89c82f549 Don't declare 2 WARNINGS sections
Submitted by:
Reviewed by:
PR:
2002-11-14 11:12:14 +00:00
Lutz Jänicke
812d100d06 Opportunistic change to work around pod2latex bug: rename NAME OPTIONS
section to SUBJECT AND ISSUER NAME OPTIONS
Submitted by:
Reviewed by:
PR: 333
2002-11-14 11:08:23 +00:00
Lutz Jänicke
b759742352 Correct reference to section name.
Submitted by:
Reviewed by:
PR:
2002-11-14 11:02:25 +00:00
Lutz Jänicke
475e4d23bd Missing =back
Submitted by:
Reviewed by:
PR:
2002-11-14 10:49:42 +00:00
Richard Levitte
bf4ae6dcfa The directory 'rijndael' doesn't exist any more, let's check the aes
directory instead (this should have been done long ago...).
2002-11-14 08:23:37 +00:00
Richard Levitte
17d4f07658 When AES is skipped because the option 'no-rijndael' was given,
make sure it's skipped from SDIRS as well.
2002-11-14 08:20:50 +00:00
Richard Levitte
5ec797f263 Make the Windows test scripts consistent in their echoing 2002-11-14 08:09:07 +00:00
Richard Levitte
5b1aea7afe Handle last lines that aren't properly terminated.
PR: 308
2002-11-14 06:50:32 +00:00
Dr. Stephen Henson
327e113775 Fix get_email: 0 is a valid return value 2002-11-14 00:45:04 +00:00
Richard Levitte
58f3009aba Constification needed.
PR: 241
2002-11-13 23:47:52 +00:00
Richard Levitte
b193f29a9b free() -> OPENSSL_free() 2002-11-13 20:25:56 +00:00
Richard Levitte
7ab58bf012 Correct support for SunOS 4.1.3_U1.
PR: 227
2002-11-13 15:49:51 +00:00
Richard Levitte
cd10ba9c39 When build as dynamic engines, the loading functions should be defined
static.
2002-11-13 15:29:01 +00:00
Richard Levitte
96a3369c4a Make internal functions static. 2002-11-13 14:31:55 +00:00
Richard Levitte
e8ad570e3f Changes from HEAD. 2002-11-13 14:31:01 +00:00
Richard Levitte
ad1ddf413c The loading functions should be static if we build a dynamic engine. 2002-11-13 14:30:34 +00:00
Bodo Möller
e2c2152be9 disable weird assert()s 2002-11-13 14:01:19 +00:00
Bodo Möller
919b2a9673 remove unused old directory crypto/rijndael (superseded by crypto/aes) 2002-11-13 13:55:24 +00:00
Richard Levitte
024a20905d C++ comments in C code, 'nuff said... 2002-11-13 13:36:29 +00:00
Richard Levitte
69ba8a00ad make update 2002-11-13 11:35:51 +00:00
Richard Levitte
f6a0c4f853 Make OpenSSLdie() visible (it's a must to get a proper reference in
libeay.num).
2002-11-13 11:35:12 +00:00
Dr. Stephen Henson
040ade9bee As main trun 2002-11-13 01:22:40 +00:00
Bodo Möller
46ce790727 fix order of changes -- if B depends on A, A should be listed
after B (reversed 'chronological' order)
2002-11-12 13:35:27 +00:00
Ben Laurie
9831d941ca Many security improvements (CHATS) and a warning fix. 2002-11-12 13:23:40 +00:00
Richard Levitte
707ceb29e0 Make it possible to run individual tests even when linked with libcrypto.so and libssl.so 2002-11-12 11:25:33 +00:00
Richard Levitte
3d470fc7b7 Make the CBC mode od AES accept lengths that aren't multiples of 16.
PR: 330
2002-11-12 11:00:35 +00:00
Richard Levitte
edb7b28a00 Variables on the stack must be initialized or we can't depend on any
initial value.  For errline/errorline, we did depend on that, erroneously
2002-11-11 21:35:00 +00:00
Richard Levitte
c4efde7403 make update 2002-11-11 20:51:06 +00:00
Richard Levitte
a1edc87664 Make the programs link against the static library on MacOS X.
PR: 335
2002-11-11 20:49:01 +00:00
Lutz Jänicke
9cbc3356e7 Typo.
Submitted by: assar <assar@kth.se>
Reviewed by:
PR:
2002-11-11 11:18:19 +00:00
Lutz Jänicke
9161c2ff51 Make sure permissions are friendly when building release tar file.
Submitted by:
Reviewed by:
PR: 171
2002-11-11 08:56:37 +00:00
Lutz Jänicke
21f8cf65e6 More information to the important issue of seeding the PRNG
Submitted by:
Reviewed by:
PR: 285
2002-11-11 08:32:37 +00:00
Richard Levitte
8bcc049399 X509_NAME_cmp() now compares PrintableString and emailAddress with a value of type
ia5String correctly.
PR: 244
2002-11-09 21:55:12 +00:00
Richard Levitte
95900b8592 -CAserial does take a filename argument.
PR: 332
2002-11-09 21:53:56 +00:00
Dr. Stephen Henson
20a50cb517 Typo 2002-11-09 18:11:15 +00:00
Richard Levitte
a71a482250 -CAcreateserial doesn't take a filename argument.
PR: 332
2002-11-08 21:51:33 +00:00
Richard Levitte
8b6ee018c2 Windows doesn't know sys/file.h 2002-11-07 21:40:17 +00:00
Dr. Stephen Henson
ddab3c9327 Typo in OCSP ASN1 module 2002-11-07 17:43:45 +00:00
Richard Levitte
6a9a7ff259 Keep on using ${CC}, since gcc may act in disguise.
PR: 329
2002-11-06 23:47:16 +00:00
Richard Levitte
f7cd5462c9 Generate openssl.pc so pkg-config can return proper data.
PR: 163
2002-11-06 23:34:17 +00:00
Richard Levitte
d268511c84 some people just can't read the instructions 2002-11-06 06:03:07 +00:00
Dr. Stephen Henson
190467767e CRL revocation reason docs. 2002-11-06 01:27:16 +00:00
Dr. Stephen Henson
8d699c8c93 Check for NULL ASN1_ITEM when initializeing
boolean option in ASN1_TYPE.
2002-11-05 13:49:04 +00:00
Bodo Möller
e2a93e38d6 avoid Purify warnings
Submitted by: Nils Larsch
2002-11-05 12:28:10 +00:00
Richard Levitte
41c2fb962c Return my normal debug targets to something not so extreme, and make
the extreme ones special (or 'extreme', if you will :-)).
2002-11-04 16:33:59 +00:00
Richard Levitte
455bacd4d3 Off-by-one-error corrected.
PR: 235
2002-11-04 11:30:38 +00:00
Richard Levitte
e85cbdad7a Cosmetic change 2002-11-04 06:26:27 +00:00
Richard Levitte
c752563e43 Remove all referenses to RSAref, since that's been gone for more than
a year.
2002-10-31 16:46:18 +00:00
Richard Levitte
0eae6cd5f2 Plug potential memory leak.
Identified by Goetz Babin-Ebell <babinebell@trustcenter.de>
2002-10-30 09:42:47 +00:00
Geoff Thorpe
0bf707e346 Add a HISTORY section to the man page to mention the new flags. 2002-10-29 18:06:09 +00:00
Geoff Thorpe
96a2c35d91 The recent CHANGES note between 0.9.6g and 0.9.6h needs copying into the
other branches.
2002-10-29 17:59:18 +00:00
Geoff Thorpe
f9fde13590 Correct another inconsistency in my recent commits. 2002-10-29 17:47:43 +00:00
Geoff Thorpe
74174b9d05 Bodo spotted this keyslip in my patch to 0.9.7-stable. 2002-10-29 17:00:33 +00:00
Richard Levitte
89eda1fc01 Revert, that was an incorrect change.
PR: 156
2002-10-29 04:34:13 +00:00
Richard Levitte
bbec79a0c1 A small detail: since 0.9.7, DH_new_method() and DSA_new_method()
don't take an ENGINE* as parameter any more.
PR: 156
2002-10-29 04:31:13 +00:00
Geoff Thorpe
6f7ba4be1f Correct and enhance the behaviour of "internal" session caching as it
relates to SSL_CTX flags and the use of "external" session caching. The
existing flag, "SSL_SESS_CACHE_NO_INTERNAL_LOOKUP" remains but is
supplemented with a complimentary flag, "SSL_SESS_CACHE_NO_INTERNAL_STORE".
The bitwise OR of the two flags is also defined as
"SSL_SESS_CACHE_NO_INTERNAL" and is the flag that should be used by most
applications wanting to implement session caching *entirely* by its own
provided callbacks. As the documented behaviour contradicted actual
behaviour up until recently, and since that point behaviour has itself been
inconsistent anyway, this change should not introduce any compatibility
problems. I've adjusted the relevant documentation to elaborate about how
this works.

Kudos to "Nadav Har'El" <nyh@math.technion.ac.il> for diagnosing these
anomalies and testing this patch for correctness.

PR: 311
2002-10-29 00:31:14 +00:00
Bodo Möller
2ccb522c5b increase permissible message length so that we can handle
CertificateVerify for 4096 bit RSA signatures
2002-10-28 15:47:44 +00:00
Richard Levitte
0bf76767b0 Make sure toupper() is declared 2002-10-25 09:51:50 +00:00
Richard Levitte
732c9fe179 There's a name clash between OpenSSL and RSAref. Since this engine handles
RSAref data, pretend we don't care for OpenSSL's MD2 and MD5 structures or
implementation.
Remove all kinds of silly warning
2002-10-24 17:02:42 +00:00
Richard Levitte
4f99ab58f7 On certain platforms, we redefine certain symbols using macros in
apps.h.  For those, it's better to include apps.h after the system
headers where those symbols may be defined, since there's otherwise a
chance that the C compiler will barf when it sees something that looks
like this after expansion:

int VMS_strcasecmp((str1),(str2))(const char *, const char *);
2002-10-24 09:41:45 +00:00
Richard Levitte
339abc9bd9 An engine changed name. 2002-10-23 22:09:08 +00:00
Richard Levitte
4407fbc2d4 Signal an error if the entered output password didn't match itself.
PR: 314
2002-10-23 15:07:18 +00:00
Bodo Möller
27f08d6d48 fix warnings, and harmonize indentation 2002-10-23 13:14:10 +00:00
Bodo Möller
a9e0953900 I don't like c-tab-always-indent ... 2002-10-23 13:09:11 +00:00
Dr. Stephen Henson
9597027693 Typo. 2002-10-21 00:10:55 +00:00
Dr. Stephen Henson
78f41a4e89 Update docs. 2002-10-20 13:25:34 +00:00
cvs2svn
76dcae8020 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-10-20 13:20:58 +00:00
Geoff Thorpe
190ef122b2 Make pod2man happier. 2002-10-18 22:05:19 +00:00
Lutz Jänicke
dc74e7d5d7 Corrected exchanged parameters in example for EVP_EncryptInit_ex()
Submitted by: "Marcus Carey" <marcus.carey@verizon.net>
Reviewed by:
PR: 265
2002-10-18 09:46:01 +00:00
Bodo Möller
3d76ceddff change Emacs indentation style to make it easier to insert
tabs manually

Submitted by: Pierre Bacquet <pbacquet@delta.fr>
2002-10-17 09:17:28 +00:00
Geoff Thorpe
b963f807be - Remo Inverardi noticed that ENGINEs don't have an "up_ref" function in the
normal 'structural' case (ENGINE_init() satisfies this in the less normal
'functional' case). This change provides such a function.

- Correct some "read" locks that should actually be "write" locks.

- make update.
2002-10-16 01:32:46 +00:00
Richard Levitte
005bbb52ff Typos.
PR: 189
2002-10-15 20:31:07 +00:00
Richard Levitte
a690102da2 Typos.
PR: 189
2002-10-15 20:29:27 +00:00
Richard Levitte
09db11783d When BN_add_word() reaches top, it shouldn't try to add the the corresponding
word, since that word may not be zero.
2002-10-14 11:27:16 +00:00
Richard Levitte
f6733ae577 makedepend complains when a header file is included more than once in
the same source file.
2002-10-14 09:53:46 +00:00
Richard Levitte
2d2ca3aab1 Complete the VxWorks fix by implementing a NULL RAND_poll() for it.
PR: 253
2002-10-14 09:44:51 +00:00
Richard Levitte
cfc7620572 make update 2002-10-14 09:40:46 +00:00
Richard Levitte
9a01bc0732 Add more commentary. Check that *num is smaller than the block size. 2002-10-11 22:42:40 +00:00
Richard Levitte
dbcc560717 The AES CTR API was buggy, we need to save the encrypted counter as well
between calls, or that will be lost if it returned with *num non-zero.
2002-10-11 22:37:44 +00:00
Richard Levitte
449d39f41c Merge string protection from main trunk 2002-10-11 20:35:45 +00:00
Bodo Möller
84236041c1 synchronize with 0.9.6-stable version of this file 2002-10-11 17:53:21 +00:00
Bodo Möller
8d44d96ec3 remove redundant empty line 2002-10-11 17:29:07 +00:00
Richard Levitte
707e098687 Add a configuration target for A/UX.
PR: 271
2002-10-11 14:39:12 +00:00
Richard Levitte
88de74ad83 make update 2002-10-11 12:23:49 +00:00
Richard Levitte
97b8718f15 There may be more than one single quote to fix.
PR: 256
2002-10-11 11:34:28 +00:00
Richard Levitte
388a6f937f Make sure $fname will not give us any surprises with any funny characters.
PR: 256
2002-10-11 11:07:39 +00:00
Richard Levitte
a61050ad96 BN_bn2hex() returns "0" instead of "00" for zero. This disrputs the
requirement that the serial number always be an even amount of characters.
PR: 248
2002-10-11 09:39:32 +00:00
Richard Levitte
baaeac3036 Rhapsody had ftime, Darwin doesn't (any longer?) 2002-10-10 13:36:04 +00:00
Richard Levitte
d19370b617 VMS below version 7 doesn't have strcasecmp, so let's roll our own on VMS.
PR: 184
2002-10-10 09:05:46 +00:00
Richard Levitte
8376acbf7f Typo 2002-10-10 08:32:45 +00:00
Richard Levitte
12a2ff9625 RFC 2712 redefines the codes for use of Kerberos 5 in SSL/TLS.
PR: 189
2002-10-10 07:59:45 +00:00
Dr. Stephen Henson
292a217b51 More docs. 2002-10-09 17:18:58 +00:00
Dr. Stephen Henson
104117c5e7 New documentation from main trunk. 2002-10-09 17:14:41 +00:00
cvs2svn
7ab3c662e3 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-10-09 17:05:06 +00:00
Richard Levitte
4fd5e85a18 Make sure that the 'config' variable is correctly defined and declared
for monolithic as well as non-monolithic biuld.
More work is probably needed in this area.
PR: 144
2002-10-09 15:36:42 +00:00
Richard Levitte
e9a9211e75 Remove redundancy and use the main makefile better 2002-10-09 15:13:34 +00:00
Richard Levitte
d438845ac8 Don't fuss with the demo binaries 2002-10-09 13:58:03 +00:00
cvs2svn
b1d495b2c4 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-10-09 13:57:58 +00:00
Richard Levitte
6b7a46b721 Add a few more VxWorks targets.
Correct misspelled VXWORKS macros.
Add VXWORKS identifying macros to e_os2.h.
Add required inclusions and mappings for VxWorks in e_os.h.
A few small modifications to make OpenSSL build and work on VxWorks.
PR: 253, except for the  change that was handled in an earlier
         commit, and a request for easy build of just parts of OpenSSL.
2002-10-09 13:41:31 +00:00
Richard Levitte
ff90d659e6 Use double dashes so makedepend doesn't misunderstand the flags we
give it.
For 0.9.7 and up, that means util/domd needs to remove those double
dashes from the argument list when gcc is used to find the
dependencies.
2002-10-09 13:21:33 +00:00
Richard Levitte
8f841c70c4 The dissapearing destroy callback reappears 2002-10-09 12:19:13 +00:00
Richard Levitte
052c0f276e Add missing LF 2002-10-09 06:36:30 +00:00
Richard Levitte
1e7e392419 Since crypt() isn't defined anywhere, define it locally in destest.c 2002-10-06 00:41:17 +00:00
Richard Levitte
e11b82c337 Do not define crypt(). The supported function is DES_crypt() (an des_crypt()
when backward compatibility is desired).
2002-10-06 00:23:32 +00:00
Dr. Stephen Henson
04ad43af9e Win32 fix (signed/unsigned compare error). 2002-10-05 11:59:51 +00:00
Richard Levitte
227aec9a0f Installed libraries should not be overwritten, especially shared ones.
Use mv to make sure the old copy is unlinked instead of overwritten.
PR: 273, and probably others...
2002-10-04 13:44:00 +00:00
Richard Levitte
b0165ce439 Add random number generation capability to the cswift engine.
Should this be added to 0.9.6-stable as well?
PR: 275
2002-10-04 13:31:06 +00:00
Richard Levitte
3c8756f024 If we're loading libz dynamically, and COMP_zlib() is called more than once,
only the first call would provide the correct result.
PR: 277
2002-10-04 13:04:44 +00:00
Richard Levitte
1801bc0658 Add a small note saying the 'debug' option should come before the platform in
the arguments to mk1mf.pl.
PR: 298
2002-10-04 12:32:38 +00:00
Richard Levitte
ebbad107bf Document should match reality :-).
PR: 255
2002-10-04 00:03:37 +00:00
Richard Levitte
fc0ab2eac2 The OpenBSD project has replaced the first implementation of the /dev/crypto
engine with something they claim is better.  I have nothing to compare to,
and I assume they know what they're talking about.  The interesting part with
this one is that it's loaded by default on OpenBSD systems.
This change was originally introduced in OpenBSD's tracking of OpenSSL.
2002-10-02 00:18:59 +00:00
Bodo Möller
64cb996206 fix more race conditions
Submitted by: "Patrick McCormick" <patrick@tellme.com>
PR: 262
2002-09-26 15:54:15 +00:00
Lutz Jänicke
413f2b2247 Add missing brackets.
Submitted by: "Chris Brook" <cbrook@v-one.com>
Reviewed by:
PR:
2002-09-25 20:17:58 +00:00
Bodo Möller
fbf4c7b4f1 really fix race conditions
Submitted by: "Patrick McCormick" <patrick@tellme.com>

PR: 262
PR: 291
2002-09-25 15:38:17 +00:00
Richard Levitte
99542d8763 Make sure that the signal storage is regarded as volatile.
This correction was originally introduced in OpenBSD's tracking of OpenSSL.
2002-09-25 14:14:16 +00:00
Richard Levitte
b3c1d18d03 It makes more sense to refer to specific function manuals than the concept
manual when the specific function is refered to in the current manual text.
This correction was originally introduced in OpenBSD's tracking of OpenSSL.
2002-09-25 13:34:37 +00:00
Richard Levitte
6c8aec60ca Remove *all* references to RSA_PKCS1_RSAref, since it doesn't exist any more.
This correction was originally introduced in OpenBSD's tracking of OpenSSL.
2002-09-25 13:26:40 +00:00
Richard Levitte
c0ca52952e Remove reference to RSA_PKCS1_RSAref, since it doesn't exist any more.
This correction was originally introduced in OpenBSD's tracking of OpenSSL.
2002-09-25 13:25:48 +00:00
Richard Levitte
39d727d0c3 It makes more sense to refer to specific function manuals than the concept
manual when the specific function is refered to in the current manual text.
This correction was originally introduced in OpenBSD's tracking of OpenSSL.
2002-09-25 13:11:16 +00:00
Richard Levitte
6319853811 Incorrect argument order to memset() 2002-09-25 12:52:23 +00:00
Richard Levitte
6b3a385f85 Missing ; 2002-09-25 12:49:45 +00:00
Richard Levitte
27a80b7906 -elapsed is also useful when using gettimeofday 2002-09-25 12:42:04 +00:00
Bodo Möller
4e33db9a3f really fix race condition
PR: 262
2002-09-23 14:28:12 +00:00
Ulf Möller
ca9a114f7a as in head 2002-09-22 08:51:33 +00:00
Ulf Möller
ce1dc2e9b2 as in main 2002-09-22 08:45:22 +00:00
cvs2svn
b4b62004a6 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-09-22 08:44:06 +00:00
Bodo Möller
f7eb95852c there is no minimum length for session IDs
PR: 274

fix race condition
PR: 262
2002-09-20 08:37:13 +00:00
Dr. Stephen Henson
12a296edfc Really fix PKCS7_set_detached this time... 2002-09-08 16:25:55 +00:00
Dr. Stephen Henson
e696a05791 Fix typos in PKCS#12 ASN1 code.
Make PKCS7_set_detached work again.
2002-09-07 22:59:34 +00:00
Lutz Jänicke
4a13e4b36c Consequently use term URI instead of URL
Submitted by: TJ Saunders <tj@castaglia.org>
Reviewed by:
PR: 268
2002-09-05 07:51:23 +00:00
Dr. Stephen Henson
b7fb041f31 make update 2002-09-03 00:09:45 +00:00
Dr. Stephen Henson
a98beb3a2d Apply -nameopt patches to 0.9.7 2002-08-30 18:26:26 +00:00
Dr. Stephen Henson
f627c159b1 Fix ASN1_STRING_to_UTF8: remove non sensical !*out test. 2002-08-30 17:17:45 +00:00
Bodo Möller
535cedf136 don't memset(data,0,...) if data is NULL
Submitted by: anonymous
PR: 254
2002-08-29 11:35:42 +00:00
Geoff Thorpe
3a00964dd3 Fix a bug to allow the 4758 ENGINE to build as a DSO. 2002-08-28 19:11:59 +00:00
Dr. Stephen Henson
a69d50b02d Reinstate the check for invalid length BIT STRINGS,
which was effectively bypassed in the ASN1 changed.
2002-08-23 00:00:54 +00:00
Dr. Stephen Henson
ed7443661c Fix C++ style comments. 2002-08-22 23:00:05 +00:00
Dr. Stephen Henson
3d2aa62cb6 Fix crahses and leaks in pkcs12 utility -chain option 2002-08-22 21:54:24 +00:00
Richard Levitte
9925249ba5 Typo, I assigned the variable ld instead of my_ld... 2002-08-18 21:33:02 +00:00
Richard Levitte
d7041ea5de So, I discovered that if you have your $PATH set so a ld different from
GNU ld comes first, checking the usage of collect2 gives that instead of
GNU ld, even if GNU ld would be the one that would get used if we link using
gcc.  It's much better, apparently, to ask gcc directly what the path to
GNU ld is (provided it's there at all and gcc knows about it), and ask
the result if it's a GNU or not.  The bonus is that our GNU ld detection
mechanism got shorter and easier to understand...
2002-08-17 13:46:52 +00:00
Lutz Jänicke
68a9ee13e8 Reorder cleanup sequence in SSL_CTX_free() to leave ex_data for remove_cb().
Submitted by:
Reviewed by:
PR: 212
2002-08-16 17:02:30 +00:00
Lutz Jänicke
a64f08f3dd Fix wrong URI.
Submitted by: Mike Castle <dalgoda@ix.netcom.com>
Reviewed by:
PR: 200
2002-08-16 16:44:54 +00:00
Richard Levitte
384897f46b isalist was less trustable than I thought (or rather, one can trust it to
come up with all kinds of names we don't have in our targets).
Besides, our sparcv9 targets currently generate sparcv8 code, I'm told.
2002-08-16 09:41:35 +00:00
Richard Levitte
08e60fc0ff Add -lz to the ld flags when the user has chosen to link in zlib *statically*.
Notified by Doug Kaufman <dkaufman@rahul.net>
2002-08-16 06:15:58 +00:00
Dr. Stephen Henson
ea050a6eb3 Fix block_size field for CFB and OFB modes: it should be 1. 2002-08-16 01:38:34 +00:00
Richard Levitte
bde63f803a q may be used uninitialised 2002-08-15 22:06:14 +00:00
Bodo Möller
e73308638a use correct function code in error message 2002-08-15 16:17:02 +00:00
Richard Levitte
1ac3419ef6 It seems like sun4u doesn't always have a sparcv9 inside. Trust isalist.
PR: 220
2002-08-15 15:21:00 +00:00
Bodo Möller
1e9858a28b fix warnings (CHARSET_EBCDIC)
Submitted by: Lorinczy Zsigmond <lzsiga@mail.ahiv.hu>
2002-08-15 14:52:22 +00:00
Bodo Möller
8f4a09e531 fix manpage 2002-08-15 14:22:49 +00:00
Richard Levitte
3b2f77d88e I think that's the last forgotten compilation module. 2002-08-15 11:48:58 +00:00
Richard Levitte
52ccf9e1c1 Missing =back.
Part of PR 196
2002-08-15 10:59:59 +00:00
Richard Levitte
5e947727a9 Add a FAQ entry for yet another bc failure.
PR: 199
2002-08-15 10:50:42 +00:00
Richard Levitte
d7bd58cf36 Yet a couple of modules forgotten. These weren't important for
OpenSSL itself, since they aren't used there (yet).  It became quite
visible qhen building a shared library, however...
2002-08-15 09:40:08 +00:00
Richard Levitte
b84e473d63 Sometimes, the value of the variable containing the compiler call can
become rather large.  This becomes a problem when the default 1024
character large buffer that WRITE uses isn't enough.  WRITE/SYMBOL
uses a 2048 byte large buffer instead.
2002-08-15 08:29:26 +00:00
Bodo Möller
4aecd67d04 change how pod2man is handled: explicitly invoke '$PERL' only when
needed, call 'pod2man' directly if this works

PR: 217
2002-08-14 14:06:11 +00:00
Richard Levitte
74a25e9cd9 Instead of returning errors when certain flags are unusable, just ignore them.
That will make the test go through even if DH (or in some cases ECDH) aren't
built into OpenSSL.
PR: 216, part 2
2002-08-14 12:18:36 +00:00
Richard Levitte
d020139db7 Make sure that the test input file comes in the same record format as the
typical output from a program in C.
PR: 222
2002-08-14 11:09:03 +00:00
Dr. Stephen Henson
f84acec8ea Fix typo in OBJ_txt2obj which incorrectly passed the content
length, instead of the encoding length to d2i_ASN1_OBJECT.

This wasn't visible before becuse ASN1_get_object() used
to read past the length of the supplied buffer.
2002-08-14 00:50:35 +00:00
Richard Levitte
d3b282e01f Some files deserve to be ignored 2002-08-13 22:41:39 +00:00
cvs2svn
85d9e2f2f0 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-08-13 22:41:21 +00:00
Richard Levitte
04ed3994e2 OK, I've amused myself with making sure the engines that have been
contributed TO WORK WITH 0.9.7 can be built as dynamically loadable
libraries.

For now, they're not included in crypto/engine/ since 0.9.7 is in
feature freeze.  Further discussion might change that, but don't hold
your breath.
2002-08-13 12:26:41 +00:00
Richard Levitte
6100502726 Export text symbols as well (AIX experts might need to correct me
here).
2002-08-13 12:19:55 +00:00
Richard Levitte
a1f09ea8f8 Do not include openssl/ripemd.h when the RIPEMD algorithm has been deselected.
PR: 216, point 1
2002-08-12 21:22:05 +00:00
Richard Levitte
bce625987d Do not use the word 'modulus', which is a class template name in VC++ 6.0/SP5.
PR: 216, point 3
2002-08-12 21:20:30 +00:00
Bodo Möller
3c1a6f441b add 0.9.6g information 2002-08-12 08:43:32 +00:00
Richard Levitte
97d640e1f0 Update with the status for 0.9.6g. 2002-08-12 06:55:02 +00:00
Richard Levitte
ddf7602425 Update with the status for 0.9.6g. 2002-08-12 06:06:27 +00:00
Richard Levitte
d3c32ffbcc When we want to give a -f argument to $(MAKE), we'd better make sure the
variable doesn't already contain a -f argument.
PR: 203, part 4
2002-08-09 08:49:46 +00:00
Richard Levitte
1d2a3fe246 Parse version numbers prefixed with text (egcs does that, even with
-dumpversion).
PR: 203, part 1
2002-08-09 07:32:31 +00:00
Richard Levitte
00c8546d21 0.9.6f is released 2002-08-08 22:56:05 +00:00
Geoff Thorpe
31e441a805 These are updates/fixes to DH/DSA/RAND docs based on the fixes to the RSA
docs. There were a couple of other places where the docs were not
synchronised with the API that are now fixed. One or two still remain to be
fixed though ...
2002-08-05 16:28:59 +00:00
Geoff Thorpe
c4a28caa32 typo fix 2002-08-05 02:55:27 +00:00
Geoff Thorpe
c3eb0c1e7f Various parts of the RSA documentation were inaccurate and out of date and
this fixes those that I'm currently aware of. In particular, the ENGINE
interference in the RSA API has hopefully been clarified. This still needs
to be done for other areas of the API ...
2002-08-04 21:10:05 +00:00
Geoff Thorpe
d18f681310 A single monolithic man page for the ENGINE stuff. This is a rough
first-cut but provides better documentation than having nothing on the
ENGINE API.
2002-08-04 21:03:04 +00:00
cvs2svn
ea5214328b This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-08-04 20:57:20 +00:00
Geoff Thorpe
0833a40d13 Fix "make install_docs" (and thus "make install"). 2002-08-04 20:38:54 +00:00
Bodo Möller
ab1a01e9b2 oops -- must use EVP_MD_size, not EVP_MD_block_size 2002-08-03 18:50:17 +00:00
Dr. Stephen Henson
f1e1d6d6af Fix typo 2002-08-02 19:03:41 +00:00
Dr. Stephen Henson
b012127a99 Fix the ASN1 sanity check: correct header length
calculation and check overflow against LONG_MAX.
2002-08-02 18:42:40 +00:00
Bodo Möller
265a9e2c5d get rid of OpenSSLDie 2002-08-02 11:47:24 +00:00
Richard Levitte
b0b3b11dbf make update 2002-08-02 11:23:27 +00:00
Richard Levitte
c578208d63 Certain flag macros were tested with #if instead if #ifdef... 2002-08-02 11:13:55 +00:00
Richard Levitte
038461a61b We don't need to find out which pod2man to use more than once 2002-08-01 21:53:08 +00:00
Richard Levitte
716c94492a Don't try testing with parallell make, that will just fail.
PR: 175
2002-08-01 21:34:39 +00:00
Richard Levitte
a4f335ba3e Add aix64-cc, and make sure that ar gets proper flags for 64-bit libraries 2002-08-01 20:28:50 +00:00
Richard Levitte
90832c891e make update 2002-08-01 19:44:43 +00:00
Richard Levitte
dc2ab9f4fa Add the CBC flag for cbc ciphers 2002-08-01 19:33:08 +00:00
Richard Levitte
162d858a90 Avoid yet another name clash with libdes, and make the declaration consistent
with the definition.
2002-08-01 19:31:15 +00:00
Richard Levitte
13ac37d01a Make it possible to load keys from stdin, and restore that
functionality in the programs that had that before.
Part fo PR 164
2002-08-01 16:27:47 +00:00
Richard Levitte
c2decc56b0 OCSP and KRB5 Makefil.ssl should be consistent with all the others 2002-08-01 14:19:08 +00:00
Richard Levitte
1649d5fee1 Linux on s390 really knows about loading dynamically.
PR: 183
2002-08-01 13:50:24 +00:00
Richard Levitte
f8279b8ea3 Cut'n'paste error with other reposnder certificates cleared.
PR: 190
2002-08-01 13:39:46 +00:00
Richard Levitte
76b8f839c2 If CRYPTO_realloc() is called with a NULL pointer, have it call
OPENSSL_malloc().
PR: 187
2002-08-01 10:08:45 +00:00
Richard Levitte
8d37f07e09 If the email address is moved from the subject to the subject alternate name,
the subject in the certificate would differ from the subject in the index file,
which has quite bad concequences.
PR: 180
2002-07-31 14:06:09 +00:00
Richard Levitte
450c73d98b Make sure to use $(MAKE) everywhere instead of make.
Part of PR 181
2002-07-31 13:49:58 +00:00
Richard Levitte
2ead4a5df6 ln -f -s doesn't always work, so do a rm -f followed by a ln -s.
Part of PR 181
2002-07-31 13:38:39 +00:00
Lutz Jänicke
addafc08a5 Typo.
Submitted by: Jeffrey Altman <jaltman@columbia.edu>
Reviewed by:
PR: 169
2002-07-30 13:34:44 +00:00
Lutz Jänicke
e970fa0022 Typo.
Submitted by:
Reviewed by:
PR:
2002-07-30 11:30:03 +00:00
Lutz Jänicke
458bb156bf Release 0.9.7-beta3
Submitted by:
Reviewed by:
PR:
2002-07-30 11:27:18 +00:00
Lutz Jänicke
bca9dc2a51 OpenSSL Security Advisory [30 July 2002]
Changes marked "(CHATS)" were sponsored by the Defense Advanced
Research Projects Agency (DARPA) and Air Force Research Laboratory,
Air Force Materiel Command, USAF, under agreement number
F30602-01-2-0537.
Submitted by:
Reviewed by:
PR:
2002-07-30 11:21:19 +00:00
Lutz Jänicke
3720ea24f0 "make update"
Submitted by:
Reviewed by:
PR:
2002-07-30 07:18:03 +00:00
Lutz Jänicke
72a37c03be Only use DSA-functions if available.
Submitted by: "Hellan,Kim KHE" <KHE@kmd.dk>
Reviewed by:
PR: 167
2002-07-29 13:28:57 +00:00
Bodo Möller
93d1969c78 mention SSL_do_handshake() 2002-07-29 12:34:14 +00:00
Bodo Möller
6178bb8fe9 Add bn_dup_expand() comment from the main branch explaining that
bn_dup_expand() is broken.

[No need to fix this in 0.9.7-stable, it is just an unused internal
function.]
2002-07-25 12:14:41 +00:00
Bodo Möller
5b195b5a0e more detailed instructions for export from US 2002-07-25 11:19:36 +00:00
Richard Levitte
4289131ae6 Don't clobber loop variable.
PR: 159
2002-07-24 14:42:38 +00:00
Richard Levitte
b721e1e239 Document the recent DJGPP-related changes 2002-07-23 13:46:05 +00:00
Richard Levitte
6cf2012a4d Make dummy tests to make it easier to physically remove unwanted algorithms.
This should complete PR 75
2002-07-23 13:32:10 +00:00
cvs2svn
e459ebaed1 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-07-23 13:31:07 +00:00
Richard Levitte
e9e3ce40c5 If DH is disabled, don't define the DH functions.
Notified by Kim Hellan <KHE@kmd.dk>
2002-07-22 14:18:00 +00:00
Bodo Möller
56d84db1d4 fix a typo and clarify 2002-07-22 09:05:41 +00:00
Bodo Möller
16758de0a2 add an explanation and fix a typo 2002-07-22 08:38:14 +00:00
Lutz Jänicke
f19b6474fe New cipher selection options COMPLEMENTOFALL and COMPLEMENTOFDEFAULT.
Submitted by:
Reviewed by:
PR: 127
2002-07-19 19:53:02 +00:00
Lutz Jänicke
2f6f2970c4 HP-UX shared libraries must be +x and should be -w. It doesn't hurt on
other platforms.
Submitted by:
Reviewed by:
PR: 134
2002-07-19 16:31:36 +00:00
Bodo Möller
f227a1af7d update 2002-07-19 12:32:52 +00:00
Lutz Jänicke
4408572079 The behaviour is undefined when calling SSL_write() with num=0.
Submitted by:
Reviewed by:
PR: 141
2002-07-19 11:53:11 +00:00
Lutz Jänicke
31b5b999c7 Manual page for SSL_do_handshake().
Submitted by: Martin Sjögren <martin@strakt.com>
PR: 137
2002-07-19 11:06:53 +00:00
cvs2svn
f8bcfb5d5a This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-07-19 11:05:53 +00:00
Geoff Thorpe
44e9c2617a This documentation change was being written at the same time as Richard's
changes. So I'm committing this version to overwrite his changes for now,
and he can always take his turn to overwrite my words if he wants :-)

PR: 86
2002-07-18 20:52:47 +00:00
Richard Levitte
b61739874e Explain why RSA_check_key() doesn't work with hard keys.
PR: 86
2002-07-18 19:11:06 +00:00
Richard Levitte
73957bd323 Add history for documented new functions.
PR: 59
2002-07-18 18:55:06 +00:00
Richard Levitte
81f1338613 Allow subjects with more than 255 characters to be properly printed.
PR: 147
2002-07-18 17:59:38 +00:00
Richard Levitte
90baf2a92d Further enhance assembler support on Cygwin and DJGPP.
Make pod2mantest useable on DOS-based systems.
Part of PR 75, the rest is still under investigation.
2002-07-18 12:38:07 +00:00
Bodo Möller
13793a0ddf Fix bug introduced with revision 1.95 when this filed was modified to
use the new X509_CRL_set_issuer_name() function:
The CRL issuer should be X509_get_subject_name(x509), not
X509_get_issuer_name(x509).

Submitted by: Juergen Lesny <lesnyj@informatik.tu-muenchen.de>

typo
2002-07-18 11:19:05 +00:00
Richard Levitte
b334853d72 Reverse the change with the following log, it needs further investigation:
Make S/MIME output conform with the mail and MIME standards.
PR: 151
2002-07-18 10:39:49 +00:00
Richard Levitte
4b5d50e26b Make S/MIME output conform with the mail and MIME standards.
PR: 151
2002-07-18 08:47:56 +00:00
Richard Levitte
6d454e6ab2 Unixware doesn't have strings.h, so we need to declare strcasecmp()
differently.
Unixware 2 needs to link with libresolv.
PR: 148
2002-07-18 07:47:49 +00:00
Richard Levitte
4f0e09aa67 OPENSSL_SYS_WIN32 is important so util/mkdef.pl can detect it 2002-07-18 06:34:39 +00:00
Richard Levitte
e921bbf9f6 Make mkdir failsafe in case the directories are already present 2002-07-17 13:33:12 +00:00
Richard Levitte
205a4a9571 Add support for shared libraries with OS/2.
PR: 124
2002-07-17 13:28:29 +00:00
Richard Levitte
44279d4638 Add a few FAQ entries for the various ways building OpenSSL on MacOS X
can fail, and point at the text in the PROBLEMS file
2002-07-17 11:29:34 +00:00
Richard Levitte
9f1c3d7392 If OpenSSL is built with shared library support on MacOS X,
everything works fine.  Note: this is only true for 0.9.7 and on
2002-07-17 11:16:26 +00:00
Richard Levitte
362be34a2f On MacOS X, the shared library editor uses DYLD_LIBRARY_PATH 2002-07-17 11:09:59 +00:00
Richard Levitte
ec7f13d375 On MacOS X, you're not allowed to have common objects in shared libraries 2002-07-17 08:20:56 +00:00
Richard Levitte
ec27c2ac97 Add the usually recommended solution to the linking problem entry for MacOS X 2002-07-17 07:48:50 +00:00
Richard Levitte
b97c854e15 We had some experimental options in the Darwin entries. They are no longer needed 2002-07-16 11:07:49 +00:00
Richard Levitte
bdbbf930aa The default C compiler on MacOS X doesn't like empty object files 2002-07-16 10:46:09 +00:00
Richard Levitte
5254b53e97 Add the new PROBLEMS section from HEAD 2002-07-16 10:38:53 +00:00
cvs2svn
8adc3e5db7 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-07-16 10:20:08 +00:00
Richard Levitte
4810644f65 For those wanting to build for several platforms with the same source
directory, making a separate directory tree with lots of symbolic links
seems to be the solution.  Unfortunately, Configure doesn't take appropriate
steps to support this solution (as in removing a file that's going to be
rewritten).  This change corrects that situation.  Now I just have to
find all other places where there's lack of support for this.
2002-07-16 09:18:25 +00:00
Richard Levitte
d24d873e17 For those wanting to build for several platforms with the same source
directory, making a separate directory tree with lots of symbolic links
seems to be the solution.  Unfortunatelt, Configure doesn't take appropriate
steps to support this solution (as in removing a file that's going to be
rewritten).  This change corrects that situation.  Now I just have to
find all other places where there's lack of support for this.
2002-07-16 08:53:14 +00:00
Richard Levitte
7728770623 Let's not forget the second -Wtraditional 2002-07-16 07:06:18 +00:00
Richard Levitte
279c36564f Using -Wtraditional took it a little far. After all, we expect ANSI C, so
we don't need to care about traditional compilers
2002-07-16 06:53:22 +00:00
Richard Levitte
50d1c3fd85 Set up the engine before doing anything random-related, since engine randomness
is only used for seeding and doing it in the wrong order will mean seeding
is done before the engine randomness is hooked in.
Notified by Frederic DONNAT <frederic.donnat@zencod.com>
2002-07-16 06:51:45 +00:00
Lutz Jänicke
ed712101ea Rewording: some algorithms are also patented in Europe, so choose more
defensive phrases...
Submitted by:
Reviewed by:
PR:
2002-07-12 15:27:01 +00:00
Richard Levitte
015eb65963 In UI_UTIL_read_pw(), we should look at the size parameter, not at BUFSIZ.
Submitted by Götz Babin-Ebell <babinebell@trustcenter.de>
2002-07-11 09:12:37 +00:00
Lutz Jänicke
afafa3e15c Discussion about Redhat's specialties for the FAQ.
Submitted by: John.Airey@rnib.org.uk
Reviewed by:
PR: 128
2002-07-10 19:47:55 +00:00
Lutz Jänicke
150f2d8d24 Typos in links between manual pages
Submitted by: Richard.Koenning@fujitsu-siemens.com
Reviewed by:
PR: 129
2002-07-10 19:34:47 +00:00
Lutz Jänicke
a6545f0566 Sun's official statement with respect to /dev/random support.
Submitted by: Garrett Anderson garrett@dirsec.com
Reviewed by:
PR: 120
2002-07-10 17:51:14 +00:00
Lutz Jänicke
5fc041cca0 Minor typos
Submitted by: jufi@nerdnet.de
Reviewed by:
PR: 138
2002-07-10 17:33:55 +00:00
Bodo Möller
089cd046af remove obsolete comment 2002-07-10 08:38:34 +00:00
Lutz Jänicke
7e8852c549 Reorder inclusion of header files:
des_old.h redefines crypt:
#define crypt(b,s)\
	DES_crypt((b),(s))

This scheme leads to failure, if header files with the OS's true definition
of crypt() are processed _after_ des_old.h was processed. This is e.g. the
case on HP-UX with unistd.h.
As evp.h now again includes des.h (which includes des_old.h), this problem
only came up after this modification.
Solution: move header files (indirectly) including e_os.h before the header
files (indirectly) including evp.h.
Submitted by:
Reviewed by:
PR:
2002-07-10 06:57:54 +00:00
Lutz Jänicke
4064a85205 Ciphers with NULL encryption were not properly handled because they were
not covered by the strength bit mask.
Submitted by:
Reviewed by:
PR: 130
2002-07-10 06:40:18 +00:00
Bodo Möller
3a9fef60a1 fix synopsis
Submitted by: Nils Larsch
2002-07-09 10:52:30 +00:00
Bodo Möller
be9419edf4 emtpy fragments are not necessary for SSL_eNULL
(but noone uses it anyway)

fix t1_enc.c: use OPENSSL_NO_RC4, not NO_RC4
2002-07-09 08:48:49 +00:00
Geoff Thorpe
a729d47d41 oops, there were other cases of "ENGINE_ID" to change too. 2002-07-08 15:06:39 +00:00
Geoff Thorpe
6abf827f25 Correct an error in the README.ENGINE file.
Submitted by: Jan Tschirschwitz <Jan.Tschirschwitz@cluster-labs.de>
2002-07-08 14:48:44 +00:00
Bodo Möller
5af9fcaf35 AES cipher suites are now official (RFC3268) 2002-07-04 08:50:33 +00:00
Lutz Jänicke
5736d40dad README and INSTALL should contain information about the request tracker
(noted by Jonathan Louie <jlouie@recourse.com>).
Submitted by:
Reviewed by:
PR:
2002-06-30 19:38:01 +00:00
Richard Levitte
0dfd83b9f4 Do not define crypt() on OpenBSD. Notified by Bob Beck of OpenBSD. 2002-06-29 22:04:16 +00:00
Richard Levitte
8e10dea8ec opensslconf.h doesn't define what we want, e_os2.h does.
PR 123
2002-06-27 17:20:16 +00:00
Richard Levitte
a69e8ea1a1 Try to avoid double declaration of ERR_load_PEM_strings().
PR 71
2002-06-27 17:06:41 +00:00
Richard Levitte
1f656724f6 A few changes to BC-32.pl didn't get properly applied.
This completes PR 123
2002-06-27 16:56:36 +00:00
Richard Levitte
ca55c617e5 Pass CFLAG to dependency makers, so non-standard system include paths are
handled properly.
Part of PR 75
2002-06-27 16:44:52 +00:00
Richard Levitte
9063e375e8 DJGPP has some needed header files that other MSDOS/Windows compilers don't have.
Part of PR 75
2002-06-27 16:32:15 +00:00
Richard Levitte
97c9760f61 Update the information on Cygwin.
Part of PR 75
2002-06-27 16:30:18 +00:00
Richard Levitte
df60710ea8 Forgot to change the second $ENV{DJDIR} to /dev/env/DJDIR.
Part of PR 75
2002-06-27 16:28:28 +00:00
Richard Levitte
5d2edd2659 The new stuff is for Borland Bulider 5, so document it appropriately 2002-06-27 15:11:08 +00:00
Richard Levitte
a558ae9496 Document the new way of building with Borland Builder.
This concludes the changes from PR 123
2002-06-27 15:07:43 +00:00
Richard Levitte
d58a949aae Use underscores instead of dashes in temporary file names.
This is due to weird Borland compilers.
Part of PR 123
2002-06-27 14:58:06 +00:00
Richard Levitte
00e608c89d When compiling for Windows, make sure we have the windows definitions declared.
Part of PR 123
2002-06-27 14:56:02 +00:00
Richard Levitte
b4dfd76a4c Use 32-bit sections instead of the default, 16-bit ones.
Part of PR 123
2002-06-27 14:54:39 +00:00
Richard Levitte
ea9a52d124 have 'openssl pkcs7' exit with code 1 on error instead of 0.
PR: 119
2002-06-27 10:26:52 +00:00
Richard Levitte
75cc5e05ad gcc requires -m64 to link 64-bit shared libraries on Solaris.
PR: 117
2002-06-27 10:19:54 +00:00
Richard Levitte
84ae14d754 Use bg instead of bag as argument to macros, to avoid clashes with
structure field names.
PR: 112
2002-06-27 09:54:14 +00:00
Richard Levitte
a9e897adc3 There is no RSAREF any more, so do not ty to install it.
PR: 106
2002-06-27 09:18:30 +00:00
Richard Levitte
fc0f3ad254 The general debug target must specify that it doesn't use assembler routines.
PR: 105
2002-06-27 09:13:11 +00:00
Richard Levitte
a1fbe27123 A number of includes were removed from evp.h some time ago. The reason
was that they weren't really needed any more for EVP itself.  However,
it seems like soma applications (I know about OpenSSH, but there may
be more) used evp.h as the 'load all' header file, which makes sense
since we try our best to promote the use of EVP instead of the lower
level crypto algorithms.  Therefore, I put the inclusions back so
the application authors don't get too shocked by all the errors they
would otherwise get.

Thanks to Theo de Raadt for making us aware of this.
2002-06-27 05:03:12 +00:00
Bodo Möller
1c45b1fef3 Make sure buffers are large enough even for weird parameters
Submitted by: Nils Larsch
2002-06-26 14:29:10 +00:00
Bodo Möller
e003386793 update an entry on EVP changes 2002-06-26 14:22:39 +00:00
Richard Levitte
a533b89c9f For some reason, we need to return the full path to perl 2002-06-25 11:41:25 +00:00
Geoff Thorpe
a2ffad81c8 Make sure any ENGINE control commands make local copies of string
pointers passed to them whenever necessary. Otherwise it is possible the
caller may have overwritten (or deallocated) the original string data
when a later ENGINE operation tries to use the stored values.

Submitted by: Götz Babin-Ebell <babinebell@trustcenter.de>
Reviewed by: Geoff Thorpe
PR: 98
2002-06-21 02:48:57 +00:00
Lutz Jänicke
081cdf3f63 <sys/select.h> is included for AIX, when USE_SOCKETS is defined.
Submitted by: Bernhard Simon <bs@bsws.zid.tuwien.ac.at>
Reviewed by:
PR:
2002-06-20 20:13:12 +00:00
Lutz Jänicke
dbf5b18a99 HP-UX: shared libraries MUST be +x and SHOULD be -w.
Submitted by:
Reviewed by:
PR:
2002-06-20 19:55:58 +00:00
Lutz Jänicke
0b3f7afaed Fix path to find util/pod2man.pl from the execution directory.
Make sure to use the predefined PERL.
Submitted by: Bernhard Simon <bs@bsws.zid.tuwien.ac.at>
Reviewed by:
PR:
2002-06-20 19:47:59 +00:00
Lutz Jänicke
d6e8f6ae2b AIX (V3) requires <sys/select.h> (included via e_os.h) for fd_set.
Submitted by: Bernhard Simon <bs@bsws.zid.tuwien.ac.at>
Reviewed by:
PR:
2002-06-20 17:31:12 +00:00
Geoff Thorpe
af629a19d7 This apparently fixes compilation on OSX that was failing in 0.9.7 betas.
Submitted by: Pieter Bowman <bowman@math.utah.edu>
2002-06-20 15:17:02 +00:00
Lutz Jänicke
9a3eaa1117 load_netscape_key is static.
Submitted by:
Reviewed by:
PR:
2002-06-18 17:44:01 +00:00
Bodo Möller
7a68e6aad1 always include <string.h> (we do this in various other header files,
so it can't be bad)

PR: 102
2002-06-18 09:35:29 +00:00
Bodo Möller
f27fa54388 typo 2002-06-17 13:59:36 +00:00
Lutz Jänicke
48acb9e08a Roll OpenSSL-0.9.7-beta2
Submitted by:
Reviewed by:
PR:
2002-06-16 11:27:44 +00:00
Lutz Jänicke
e5706ccbde Use -dumpversion to obtain gcc's version.
Submitted by: ross.alexander@uk.neceur.com, allenh@eecs.berkeley.edu
Reviewed by:
PR: 96
2002-06-16 10:29:55 +00:00
Lutz Jänicke
9a82ef5255 OpenSSL_add_all_algorithms has been replaced by configuration dependent
functions and is redirected by macros. Switch it off now, possible removal
later.
Submitted by:
Reviewed by:
PR:
2002-06-16 10:16:42 +00:00
Dr. Stephen Henson
4a1dcb2d03 Make update 2002-06-15 12:29:28 +00:00
Lutz Jänicke
ef92312b41 Initial support for hpux64-parisc-gcc
Submitted by: ross.alexander@uk.neceur.com
Reviewed by:
PR: 96
2002-06-14 20:10:24 +00:00
Lutz Jänicke
4673461789 Some more prototype fixes.
Use DECLARE macros in asn1* instead of direct declaration.
Submitted by: Goetz Babin-Ebell <babinebell@trustcenter.de>
Reviewed by:
PR: 89
2002-06-14 18:59:53 +00:00
Bodo Möller
2f8275c52d New option SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS for disabling CBC
vulnerability workaround (included in SSL_OP_ALL).

PR: #90
2002-06-14 12:20:27 +00:00
Richard Levitte
39ebb51bba make update 2002-06-13 23:38:11 +00:00
Richard Levitte
d7227da9a8 Merge from HEAD. 2002-06-13 23:37:26 +00:00
Richard Levitte
ab805194a6 Tentatively add support for UWIN, a Unix-like environment on top of Windows.
PR: 62
2002-06-13 21:44:01 +00:00
Richard Levitte
4fac53a757 Make sure that any dash in the prefix before the version number is removed.
PR: 96
2002-06-13 21:11:57 +00:00
Richard Levitte
11198b78a2 Add support for DJGPP. 2002-06-13 20:44:38 +00:00
Richard Levitte
573a568dd0 Add support for DJGPP.
PR: 75
2002-06-13 20:40:49 +00:00
Richard Levitte
ff3dd00370 Check for the executable $openssl, not just the file.
Part of PR: 75
2002-06-13 19:59:26 +00:00
Richard Levitte
2028c2800a Parse directory using both slashes and backslashes as separators.
Do file copying in term of perl statements instead of using cp.
Part of PR: 75
2002-06-13 19:50:26 +00:00
Richard Levitte
fd8766b67e Making a softlink from crypto/des/asm/perlasm to crypto/perlasm isn't
strictly necessary, so let's not do that.
2002-06-13 19:42:06 +00:00
Lutz Jänicke
7d210e5194 Add missing prototypes.
Submitted by: Goetz Babin-Ebell <babinebell@trustcenter.de>
Reviewed by:
PR: 89
2002-06-13 17:38:58 +00:00
Dr. Stephen Henson
2e674fc611 Fix ext_dat.h extension ordering.
Reinstate -reqout code.

Avoid coredump in ocsp if setup_verify
fails.

Fix typo in ocsp usage message.
2002-06-13 12:54:52 +00:00
Lutz Jänicke
5cfd3419c6 Add OIDs for Secure Electronic Transactions (SET)
Submitted by: Vadim Fedukovich <vf@unity.net>
Reviewed by: Lutz Jaenicke
PR: 80
2002-06-13 11:51:31 +00:00
Lutz Jänicke
9efd4fb891 Clarify formulation (proposed by Bodo Moeller).
Submitted by:
Reviewed by:
PR:
2002-06-13 08:52:25 +00:00
Dr. Stephen Henson
b2e85f9d93 The new ASN1 code automatically allocates
structures for fields that are not OPTIONAL.

However in the AUTHORITY_INFO_ACCESS case
the 'location' field was set to NULL in
the old code.

So in 0.9.7+ we should free up the field before
overwriting it in v2i_AUTHORITY_INFO_ACCESS.
2002-06-13 00:43:59 +00:00
Lutz Jänicke
f10581829d Make change uniqueIdentifier -> x500UniqueIdentifier clearly visible.
Submitted by:
Reviewed by:
PR: 82
2002-06-12 20:42:04 +00:00
Lutz Jänicke
78af3b274f Correct wrong usage information.
Submitted by:
Reviewed by:
PR: 95
2002-06-12 20:14:04 +00:00
Lutz Jänicke
facd9a2024 Support building the distribution .tar file on platforms with limited
argument list length. This requires Gnu-tar. As we use the non-standard
"tardy" software anyway, it doesn't hurt too much to require Gnu-tar.
"make dist" will probably only be used by team-members anyway.
Submitted by:
Reviewed by:
PR:
2002-06-12 12:25:42 +00:00
Ben Laurie
461f00dd53 Handle read failures better. 2002-06-11 11:41:26 +00:00
Bodo Möller
22f03eaedf fix for 'make update' 2002-06-10 11:45:21 +00:00
Lutz Jänicke
d467c74954 Make sure that flags are passed to "make" subprocesses.
Submitted by:
Reviewed by:
PR:
2002-06-10 08:11:20 +00:00
Lutz Jänicke
c4c745ccb8 For the main directory, Makefile.org is significant :-)
Submitted by:
Reviewed by:
PR:
2002-06-06 10:19:33 +00:00
Lutz Jänicke
3b66e34e74 Make sure that settings are passed back and forth when walking around
in the tree during build.
Reinstall default PERL settings in Makefiles, as the real reason for the
failure was that the settings were not passed.
Submitted by:
Reviewed by:
PR:
2002-06-06 10:14:16 +00:00
Lutz Jänicke
2250f475fc New OID for X509 usage: pseudonym
Submitted by: Michael Bell <michael.bell@rz.hu-berlin.de>
Reviewed by: Lutz Jaenicke
PR: 83
2002-06-06 07:30:45 +00:00
Richard Levitte
ed703912b2 Make perl replacement for dirname, for system that lack the latter.
PR: 81
2002-06-05 14:10:31 +00:00
Richard Levitte
2cddcd1dbb It's not good to have a pointer point at something in an inner block.
PR: 66
2002-06-05 13:47:15 +00:00
Richard Levitte
231360a3b7 Check errors when parsing a PKCS8INF PEM FILE, or there will be a core dump on error.
PR: 77
2002-06-05 11:58:23 +00:00
Richard Levitte
65ac3faff6 Documentation bug corrected.
PR: 70
2002-06-05 09:30:20 +00:00
Richard Levitte
778252741e Since there's no continuation, the ; can go as well :-) 2002-06-05 09:08:49 +00:00
Lutz Jänicke
96e40d97cc There is no continuation at this point.
Submitted by:
Reviewed by:
PR:
2002-06-05 07:56:14 +00:00
Lutz Jänicke
4b3743c85a On some systems the default "perl" may still be perl4, use the correct
version determined by "config" instead.
Submitted by:
Reviewed by:
PR:
2002-06-05 07:27:21 +00:00
Lutz Jänicke
5795665a7d The correct PERL interpreter is passed via commandline.
Submitted by:
Reviewed by:
PR:
2002-06-05 07:01:39 +00:00
Richard Levitte
88f1be140c Correct syntax in ssl-lib.com
maketests.com was missing the TCP/IP options TCPIP and NONE
2002-06-05 06:45:27 +00:00
Richard Levitte
fc16b228fd Update the recognision of GCC version numbers to handle the prefix text
that GCC 3.1 adds to the --version output
2002-06-05 05:00:41 +00:00
Richard Levitte
a5b2ccaaad make update (including adjusting libeay.num in HEAD to the changes in the
0.9.7-stable libeay.num
2002-06-04 22:32:17 +00:00
Lutz Jänicke
5dd352c916 Typo.
Submitted by:
Reviewed by:
PR: 72
2002-06-04 20:44:10 +00:00
Richard Levitte
3c204aaf50 use sstrsep() to get the proper type to aoti().
Remove unneeded cast in ustrsep().
PR: 69
2002-06-03 15:27:52 +00:00
Lutz Jänicke
3ae184d31f Ok, we are rolling 0.9.7-beta1 now.
Submitted by:
Reviewed by:
PR:
2002-06-01 15:21:55 +00:00
Ben Laurie
3e975124f3 Fix a warning. 2002-05-31 14:34:15 +00:00
Ben Laurie
74c467f9f2 Fix warnings. 2002-05-31 14:28:30 +00:00
Richard Levitte
1b97c938e9 Document the AES changes. 2002-05-31 13:16:37 +00:00
Richard Levitte
b3e2acac4e Add the AES test vectors from NIST document SP800-38A. 2002-05-31 13:13:51 +00:00
Richard Levitte
403fa0dc53 Make it possible to give vectors only for decryption or encryption. 2002-05-31 13:12:54 +00:00
Richard Levitte
f918c330a9 For CFB and OFB modes, always create the encryption key. 2002-05-31 13:11:48 +00:00
Richard Levitte
7f52f77efe Declare the CFB and OFB modes for AES, and prepare for a declaration
of CTR mode.
2002-05-31 13:10:24 +00:00
Richard Levitte
90b480f2af In CFB mode, the iv is always encrypted. 2002-05-31 13:07:45 +00:00
Richard Levitte
578c33c010 Reformat the CFLAG string so it can be made part of a C string.
Incidently, this works pretty well on the command line as well.
PR: 52
2002-05-30 18:06:52 +00:00
Richard Levitte
d6a821b9d7 Support the newly release gcc 3.1 on 64-bit Solaris. Not automatic.
PR: 57
2002-05-30 17:28:23 +00:00
Richard Levitte
7d8b5c530f Support shared libraries properly on linux-sparcv[89].
PR: 60
2002-05-30 17:07:55 +00:00
Richard Levitte
2033da0b23 a B< that wasn't properly ended. 2002-05-30 16:55:31 +00:00
Richard Levitte
c4ac954c59 Check the return values where memory allocation failures may happen.
PR: 49
2002-05-30 16:50:38 +00:00
Richard Levitte
2640aec227 CAformat should not be used for CA key format. 2002-05-30 16:24:26 +00:00
Richard Levitte
a1037ce3bc Make sure that MS_STATIC isn't defined to 'static' under Win32.
PR: 51
2002-05-30 15:45:02 +00:00
Richard Levitte
249737e53d pod2man.pl would only remove the first LF from the name. 2002-05-30 15:30:21 +00:00
Richard Levitte
c70573dee1 Apparently, there are still chances we have to deal with buggy pod2man versions.
Deal with that by testing any available pod2man and using it if appropriate,
and falling back to util/pod2man.pl if none was found.
2002-05-30 15:18:07 +00:00
Richard Levitte
6c98ed520d Correct AES counter mode, which incorrectly incremented the counter before
using it.
PR: 56
2002-05-30 14:06:17 +00:00
Richard Levitte
37ceea7333 Correct darwin shared library support.
PR: 39
2002-05-30 12:16:51 +00:00
Richard Levitte
374b227226 Some shlib extensions were in the wrong field 2002-05-30 10:47:52 +00:00
Richard Levitte
8c4a5016ce Our copy of pod2man.pl is old and comparatively broken, so lets remove it.
PR: 30
2002-05-30 10:18:23 +00:00
Richard Levitte
1056275825 Add more warnings for my debug targets. 2002-05-30 09:39:19 +00:00
Richard Levitte
9634acedaf Remove the duplicate description of -out.
PR: 28
2002-05-30 06:24:46 +00:00
Dr. Stephen Henson
3a4b0bed49 Make i2c_ASN1_BIT_STRING return the correct length. 2002-05-29 23:11:55 +00:00
Richard Levitte
84f4e33ea3 Set DLOPEN_FLAG the same way on NetBSD as on OpenBSD.
PR: 58, submitted by andrew@cis.uoguelph.ca
2002-05-29 21:00:33 +00:00
Richard Levitte
b093ef7445 There is a chance that the input string is larger than size, and on VMS,
this wasn't checked and could possibly be exploitable (slim chance, but still)
2002-05-29 08:31:45 +00:00
Lutz Jänicke
405ac901c9 Remove item listed twice <kromJx@crosswinds.net>.
Submitted by:
Reviewed by:
PR:
2002-05-28 17:48:12 +00:00
Ulf Möller
721ccb6cf5 as in main branch 2002-05-27 19:54:41 +00:00
Bodo Möller
ba05727773 Change as in main branch:
Use assembler implementations with Cygwin.
This also fixes the bn_sub_part_word problem.
2002-05-24 20:41:07 +00:00
Richard Levitte
f9332da521 Recover from errors 2002-05-23 23:32:30 +00:00
Richard Levitte
156516ce44 Avoid loops when linking doesn't work 2002-05-23 15:27:21 +00:00
Richard Levitte
157e44a799 Forgot this file. 2002-05-23 15:25:27 +00:00
Richard Levitte
7d2ff3f081 Allow the use of the TCP/IP stack keyword TCPIP and NONE 2002-05-22 11:37:02 +00:00
Richard Levitte
25a87e82d4 Use OPENSSL_SYS_VMS instead of just VMS 2002-05-22 11:35:41 +00:00
Richard Levitte
e400753ed8 Update copyright years.
This has already been applied in the main branch.
2002-05-22 07:58:02 +00:00
Richard Levitte
0984fcf118 Use 0 instead of NULL when casting to function pointers, to avoid
warnings from compilers when NULL is defined as '((void *)0)'.
This has already been applied in the main branch.
2002-05-22 07:56:38 +00:00
Richard Levitte
18cc99ac17 Remove warnings about uninitialised variables.
This has already been applied in the main branch.
2002-05-22 07:55:03 +00:00
Richard Levitte
1522c23470 Remove warnings about unused symbols when configured with no-rsa. 2002-05-22 07:53:53 +00:00
Richard Levitte
2341e303da This file was removed long ago. Why it's still in this branch is a
mystery to me.
2002-05-22 07:49:37 +00:00
Bodo Möller
dca142029c accept NULL in 'free' functions 2002-05-21 09:00:54 +00:00
Dr. Stephen Henson
7448f5e5ed Reorganise -subj option code, fix buffer overrun. 2002-05-19 16:32:21 +00:00
Dr. Stephen Henson
45caf9c50c Fix Mingw32 asm build: use the Unix
bignum assembly method of bn-586.pl
and co-586.pl which (for some reason)
VC++ doesn't use.
2002-05-19 12:00:46 +00:00
Dr. Stephen Henson
ace2ca484b Add missing EVP_CIPHER_CTX_init call. 2002-05-18 23:42:20 +00:00
Lutz Jänicke
7dc584ed91 Fix incorrect =over 4 location.
Submitted by: David Waitzman <djw@bbn.com>
Reviewed by: Lutz Jaenicke
PR: [openssl.org #38]
2002-05-16 17:44:50 +00:00
Bodo Möller
855f0b4f2f fix EVP_dsa_sha macro
Submitted by: Nils Larsch
2002-05-16 12:53:34 +00:00
Lutz Jänicke
2bf30d6b47 Use the indirect way to the actual request tracker, so that people
also are informed about the credentials required for guest access
and the operation instructions.
Submitted by:
Reviewed by:
PR:
2002-05-16 10:00:16 +00:00
Bodo Möller
685e7d7225 update 2002-05-16 09:31:27 +00:00
Dr. Stephen Henson
38dbcb2248 Oops, forgot CHANGES entry and description:
Allow reuse of cipher contexts by removing
automatic cleanup in EVP_*Final().
2002-05-15 18:23:07 +00:00
Dr. Stephen Henson
bb3a69f801 Zero cipher_data in EVP_CIPHER_CTX_cleanup
Add cleanup calls to evp_test.c
2002-05-15 17:52:19 +00:00
Bodo Möller
55db40d3e0 make b_print.c consistent with the rest of OpenSSL:
disable assert() except for debug builds
2002-05-14 19:03:12 +00:00
Bodo Möller
f1fbf15116 apply mingw32 patches from main branch 2002-05-14 17:19:26 +00:00
Lutz Jänicke
9bdbdda261 Add missing '"'
Submitted by: Boyd Gerber <gerberb@zenez.com>
Reviewed by:
PR:
2002-05-12 20:36:49 +00:00
Lutz Jänicke
ad2057500a Recognize PPC64 target.
Submitted by:
Reviewed by:
PR: 26
2002-05-12 19:44:19 +00:00
Dr. Stephen Henson
d0e3726ca4 EVP_SealFinal should return a value. 2002-05-11 17:33:01 +00:00
Dr. Stephen Henson
75a46764e5 closedir is not used on Win32. 2002-05-11 12:42:23 +00:00
Dr. Stephen Henson
4eceda658b Add config entry debug-steve-linux-pseudo64. This sets the
SIXTY_FOUR bignum library option to use 64 bit operations
on the 32 bit linux platform.

This is very inefficient but it can be used to test some
of the 64 bit logic on a 32 bit platform.
2002-05-10 22:57:29 +00:00
Dr. Stephen Henson
1c511bdb7c Fallback to normal multiply if n2 == 8 and dna or dnb is not zero
in bn_mul_recursive.

This is (hopefully) what was triggering bignum errors on 64 bit
platforms and causing the BN_mod_mul test to fail.
2002-05-10 22:22:55 +00:00
Dr. Stephen Henson
f9bd76e4f7 Avoid gcc warning: BN_DEC_CONV when SIXTY_FOUR_BIT is defined is unsigned. 2002-05-10 22:08:22 +00:00
Richard Levitte
e74e0dedcd Updating status for 0.9.6d 2002-05-09 23:53:35 +00:00
Richard Levitte
dcf6eb2a9e Synchronise the FAQ 2002-05-09 23:41:51 +00:00
Richard Levitte
7d2980f09e Make the huge buffer smaller, so the size becomes reasonable for small-stack environments.
Notified by Verdon Walker <VWalker@novell.com>
2002-05-09 20:14:50 +00:00
Richard Levitte
f1fe6fa6e4 One place where VMS wasn't changed to OPENSSL_SYS_VMS... 2002-05-09 18:27:56 +00:00
Richard Levitte
ecb7a9c73a Move an assert() to avoid core dumps when a static buffer hasn't been given.
Notified by Verdon Walker <VWalker@novell.com>
2002-05-09 18:19:45 +00:00
Richard Levitte
aebe0396e9 Small documentation fix for EVP_CipherFinal or EVP_CipherFinal_ex.
Notified by Stella Power <snpower@maths.tcd.ie>.
PR: 24
2002-05-08 15:20:33 +00:00
Ben Laurie
4e9a77cf26 Fix warning. 2002-05-08 15:13:24 +00:00
Richard Levitte
14ef32631c Generate an error if rewinding wasn't possible.
Notified by Ken Hirsch <kenhirsch@myself.com>.
PR: 23
2002-05-08 15:12:49 +00:00
Lutz Jänicke
500f07c8de Add missing ";" after fi
Submitted by: bryanh@giraffe-data.com
Reviewed by:
PR: [openssl.org #18]
2002-05-07 15:35:09 +00:00
Bodo Möller
ae936dae90 Fix ciphersuite list to enforce low priority for RC4. 2002-05-07 08:36:01 +00:00
Bodo Möller
67166dc05c ensure that, for each strength, RC4 ciphers have least preference
in the default ciphersuite list
2002-05-07 07:59:05 +00:00
Bodo Möller
aa9fed8cc2 refer to latest draft for AES ciphersuites 2002-05-07 07:56:09 +00:00
Bodo Möller
442eb8a4c3 fix warning 2002-05-06 10:44:08 +00:00
Bodo Möller
46805f696d update 2002-05-05 23:48:51 +00:00
Bodo Möller
29f6a99432 disable AES ciphersuites unless explicitly requested 2002-05-05 23:47:09 +00:00
Bodo Möller
1f13793b1a fix casts 2002-05-05 23:01:02 +00:00
Richard Levitte
08130eb158 Make sure that date is run under the C locale, so dates are given in the
default format.
PR: 16
2002-05-02 08:05:52 +00:00
Dr. Stephen Henson
b27dfeacc9 Add apps_startup and bio_err init code to smime.c 2002-05-01 20:06:24 +00:00
Lutz Jänicke
fb0f53b2e0 Fix escaping when using the -subj option of "openssl req", document
'hidden' -nameopt support. (Robert Joop <joop@fokus.gmd.de>)
Submitted by:
Reviewed by:
PR: #2
2002-04-30 12:10:10 +00:00
Lutz Jänicke
baa521bef5 Add information about -nameopt option for x509.
Submitted by:
Reviewed by:
PR:
2002-04-29 16:02:38 +00:00
Bodo Möller
7bcf65a125 undo nonsense patch (r *is* signed or we have signedness mismatches elsewhere) 2002-04-29 11:03:38 +00:00
Richard Levitte
306009bb6a Fix unsigned vs. signed clash 2002-04-29 10:30:34 +00:00
Bodo Möller
dfc5336975 Fix crypto/asn1/a_sign.c so that 'parameters' is omitted (not
encoded as NULL) with id-dsa-with-sha1.

Submitted by: Nils Larsch
2002-04-26 08:29:18 +00:00
Lutz Jänicke
4cea95a547 Added generationQualifier OID (proposed by Fiel Cabral).
Submitted by:
Reviewed by:
PR:
2002-04-25 18:00:13 +00:00
Richard Levitte
b23b3272dc Potential memory leak removed. Notified by <threaded@totalise.co.uk> 2002-04-25 10:11:08 +00:00
Bodo Möller
1696aa1891 new items for 0.9.7 2002-04-25 07:51:51 +00:00
Bodo Möller
52407725c9 oops 2002-04-25 07:46:55 +00:00
Bodo Möller
81da3c3319 AlgorithmIdentifier bugs 2002-04-25 06:29:31 +00:00
Bodo Möller
7729bc2634 fix usage (no 'key') 2002-04-23 13:55:56 +00:00
Richard Levitte
69a305d434 Uhmmm, if we use && after having tested for the presence of the certificate,
we just *might* stand a certain chance of actually getting it written
to file...
2002-04-23 13:15:27 +00:00
Lutz Jänicke
ab5b1cf86b ERR_file_name is no longer being used.
Submitted by:
Reviewed by:
PR:
2002-04-22 13:55:37 +00:00
Lutz Jänicke
c33387749b Add cygwin build script (Corinna Vinschen <vinschen@redhat.com>).
Submitted by:
Reviewed by:
PR:
2002-04-21 17:54:53 +00:00
cvs2svn
c9ca65b469 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-04-21 17:54:06 +00:00
Richard Levitte
8e078f45e0 Make sure ec is properly handled in Windows. 2002-04-20 10:25:19 +00:00
Richard Levitte
f84ffd0130 Make sure the opened directory is closed on exit.
Notified by Lorinczy Zsigmond <lzsiga@mail.ahiv.hu>
2002-04-18 16:20:21 +00:00
Lutz Jänicke
300e3d7c73 Missing "Configure" entry (Jean-Marc Desperrier <jean-marc.desperrier@certplus.com>).
Submitted by:
Reviewed by:
PR:
2002-04-18 12:46:41 +00:00
Lutz Jänicke
365c6e4661 Optimize: better shortcut evaluation ("Howard Chu" <hyc@highlandsun.com>).
Submitted by:
Reviewed by:
PR:
2002-04-18 11:53:35 +00:00
Lutz Jänicke
1dc03ef706 Handle headings uniformly to allow automatic processing.
Submitted by:
Reviewed by:
PR:
2002-04-18 08:09:59 +00:00
Bodo Möller
d4a67e3186 check return values
Submitted by: Nils Larsch
2002-04-17 09:31:02 +00:00
Lutz Jänicke
18e10315e5 Document OID changes.
Submitted by:
Reviewed by:
PR:
2002-04-15 14:17:20 +00:00
Lutz Jänicke
e9caaa4ad9 Use the "mail" short name according to RFC2798 (Michael Bell
<michael.bell@rz.hu-berlin.de>).
Submitted by:
Reviewed by:
PR:
2002-04-15 13:28:53 +00:00
Lutz Jänicke
a6198b9ed1 Some more OID enhancements.
Submitted by:
Reviewed by:
PR:
2002-04-15 10:38:37 +00:00
Lutz Jänicke
a7be294ed7 Fix CRLF problem in BASE64 decode.
Submitted by:
Reviewed by:
PR:
2002-04-15 09:53:47 +00:00
Bodo Möller
617f461c9d remove disabled code 2002-04-14 13:28:41 +00:00
Bodo Möller
1dcb6c994f fix length field we create when converting SSL 2.0 format into SSL 3.0/TLS 1.0 format
(the bug was introduced with message callback support)
2002-04-14 13:04:58 +00:00
Bodo Möller
a9ab63c01c Implement known-IV countermeasure.
Fix length checks in ssl3_get_client_hello().

Use s->s3->in_read_app_data differently to fix ssl3_read_internal().
2002-04-13 22:51:26 +00:00
Bodo Möller
f89db4020f error reported by Karsten Braaten 2002-04-13 22:06:25 +00:00
Richard Levitte
393c09659e Avoid emacs backup files when making a snapshot 2002-04-13 12:28:49 +00:00
Bodo Möller
2d96549cd0 looks like a typo 2002-04-12 13:51:42 +00:00
Bodo Möller
b48892d403 synchronize with main branch 2002-04-12 13:46:46 +00:00
Richard Levitte
7b907f0bb5 Check error code from a2d_ASN1_OBJECT(). 2002-04-11 22:14:10 +00:00
Richard Levitte
9dfcad117c Change the date to XX xxx XXXX in development versions. 2002-04-11 21:53:57 +00:00
Lutz Jänicke
7018feed88 Compile NEWS from CHANGES.
Submitted by:
Reviewed by:
PR:
2002-04-11 18:43:01 +00:00
Lutz Jänicke
9be529f12d In preparation of 0.9.7: re-order changelog, so that the changes
are listed as of ... -> 0.9.6c -> 0.9.6d -> 0.9.7
Submitted by:
Reviewed by:
PR:
2002-04-10 19:50:23 +00:00
Lutz Jänicke
f5e5277908 Keep my own specially optimized HP-UX shared library building up to date.
Submitted by:
Reviewed by:
PR:
2002-04-10 12:34:32 +00:00
Bodo Möller
c991c6e710 error reported by Karsten Braaten 2002-04-09 13:04:00 +00:00
Bodo Möller
e1f4319279 harmonize capitalization 2002-04-09 12:42:15 +00:00
Bodo Möller
2826fcc851 add usage examples 2002-04-09 11:53:51 +00:00
Richard Levitte
37562f753a Allow longer program names (VMS allows up to 39 characters).
Submitted by Compaq.
2002-04-06 20:22:40 +00:00
Richard Levitte
248252682c make update 2002-04-06 19:15:27 +00:00
Richard Levitte
cc3586028e Allow longer program names (VMS allows up to 39 characters).
Submitted by Compaq.
2002-04-06 18:59:57 +00:00
Richard Levitte
f60df86c89 Oops, the system macro for VMS is OPENSSL_SYS_VMS, not VMS 2002-04-06 11:57:58 +00:00
Richard Levitte
bc7a3a9e99 Recognise DEC C++ as equivalent to DEC C for the definitions of OPENSSL_EXTERN and OPENSSL_GLOBAL.
Submitted by Compaq.
2002-04-06 11:37:13 +00:00
Richard Levitte
d3cbf7d86a Use recv() and send() for socket communication on VMS instead of read()
and write().  The reason is that read() and write() make additional record
level locking which causes hangs of Compaq Secure Web Server (Apache) with
SSL.
Submitted by Compaq.
2002-04-06 11:35:45 +00:00
Richard Levitte
313bf45e42 Make shared libraries resolve global symbols within themselves first.
Currently only on GNUish linkers...
Submitted by Steven Bade <sbade@austin.ibm.com>
2002-04-06 09:42:25 +00:00
Lutz Jänicke
ce34d0ac09 Fix buggy object definitions (Svenning Sorensen <sss@sss.dnsalias.net>).
Submitted by:
Reviewed by:
PR:
2002-04-04 17:49:39 +00:00
Richard Levitte
4e9dd6b0f5 Forgot one of the casts 2002-04-03 15:02:00 +00:00
Richard Levitte
b6ccbffe2b Cast the pointers to the BIGNUM data to unsigned long *. This would be
harmful if we didn't also pass the exact number of bytes of that data
2002-04-03 14:47:50 +00:00
Richard Levitte
1aecc34e9e Fix of mixup bwtween SOMAXCONN and SO_MAXCONN.
Furthermore, make SO_MAXCONN the first choice, since that's the standard
(as far as I know).
2002-03-29 23:48:43 +00:00
Lutz Jänicke
75b9c0044c Make short names of objects RFC2256-compliant.
Submitted by:
Reviewed by:
PR:
2002-03-26 17:15:32 +00:00
Richard Levitte
600b77a93f Add the possibility to enable olde des support, not just disable it, for future support. Redocument 2002-03-26 14:26:08 +00:00
Richard Levitte
39335c356b Add the mapping of des_random_seed() for 0.9.6 compatibility.
Make sure DES_cblock is defined at all times (meaning one shouldn't include
openssl/des_old.h directly any more).
2002-03-26 13:58:30 +00:00
Richard Levitte
a3c62bb737 Correct the mapping for des_read_pw() 2002-03-26 13:54:04 +00:00
Bodo Möller
2f6263a696 fix memory leak
Submitted by: Nils Larsch
2002-03-25 23:17:35 +00:00
Bodo Möller
35748f40d6 add missing declaration
Submitted by: Nils Larsch
2002-03-25 23:14:50 +00:00
Lutz Jänicke
ed62478192 Fix typo (Craig Davison <cd@securityfocus.com>).
Submitted by:
Reviewed by:
PR:
2002-03-25 17:11:25 +00:00
Bodo Möller
9e7733a743 fix conditational compilation for OPENSSL_NO_... 2002-03-22 11:02:45 +00:00
Richard Levitte
fc0bdd1aa8 Key schedules are given as arguments a bit differently in 0.9.6 and
earlier.  Also, it was an error to define crypt() at all times.
2002-03-22 10:46:13 +00:00
Richard Levitte
e9dad4048f Key schedules are given as arguments a bit differently in 0.9.6 and
earlier.  Also, a few 0.9.6 functions were missing their mappings.
2002-03-22 10:29:56 +00:00
Richard Levitte
ddba94214f Use the more modern DES API in the openssl subcommands. 2002-03-22 02:36:58 +00:00
Richard Levitte
e9f970891d Change des_old.h so OpenSSL 0.9.6 compatibility is default. One must
define OPENSSL_DES_LIBDES_COMPATIBILITY to get libdes compatibility.
At the same time, correct a couple of argument errors for the cfb
encryption routines.

Make destest use as much of the old API as possible, to make sure it
works properly.  Other tests will use the new API...
2002-03-22 02:33:24 +00:00
Lutz Jänicke
a89cf50c59 Fix buggy if-condition (thomas poindessous <poinde_t@epita.fr>).
Submitted by:
Reviewed by:
PR:
2002-03-21 19:17:06 +00:00
Lutz Jänicke
f90c544039 Remove superflous statement <justin.fletcher@ntlworld.com>.
Submitted by:
Reviewed by:
PR:
2002-03-21 19:10:07 +00:00
Bodo Möller
afcf54a5c9 fix DH_generate_parameters for general 'generator' 2002-03-20 16:02:46 +00:00
Lutz Jänicke
3671e38af4 Map new X509 verification errors to alert codes (Tom Wu <tom@arcot.com>).
Submitted by:
Reviewed by:
PR:
2002-03-19 16:44:26 +00:00
Dr. Stephen Henson
4fc3946111 Initialize ciph_ctx in kssl.c 2002-03-19 01:27:10 +00:00
Dr. Stephen Henson
59a941e4a4 Ensure EVP_CipherInit() uses the correct encode/decode parameter if
enc == -1

[Reported by Markus Friedl <markus@openbsd.org>]

Fix typo in dh_lib.c (use of DSAerr instead of DHerr).
2002-03-16 23:19:25 +00:00
Bodo Möller
a7cd5f3f38 Rename 'cray-t90-cc' into 'cray-j90'.
Add to 'config'.
2002-03-15 16:47:51 +00:00
Bodo Möller
0bdbc5a86e fix ssl3_pending 2002-03-15 10:52:03 +00:00
Lutz Jänicke
abecef77cf Add missing strength classification.
Submitted by:
Reviewed by:
PR:
2002-03-14 18:47:51 +00:00
Dr. Stephen Henson
b74dfe6e8e Initialize cipher context in KRB5
("D. Russell" <russelld@aol.net>)

Allow HMAC functions to use an alternative ENGINE.
2002-03-14 18:16:49 +00:00
Bodo Möller
d80f6e0f8c Fixes for 'no-hw' combined with 'no-SOME_CIPHER'.
Fix dsaparam usage output.

Submitted by: Nils Larsch (for 0.9.8-dev; backported to 0.9.7-dev)
2002-03-14 09:53:30 +00:00
Bodo Möller
13962f0b15 use BIO_nwrite() more properly 2002-03-14 09:48:32 +00:00
Bodo Möller
2fc1f3dd48 disable '#ifdef DEBUG' code 2002-03-14 09:35:15 +00:00
Dr. Stephen Henson
f2cbb15468 Undo previous patch: avoid warnings by #undef'ing
duplicate definitions.

Suggested by "Kenneth R. Robinette" <support@securenetterm.com>
2002-03-13 13:58:33 +00:00
Dr. Stephen Henson
e38e8b29f8 Fix Kerberos warnings with VC++. 2002-03-12 19:38:16 +00:00
Dr. Stephen Henson
c03ceadfbd Fix ASN1 additions for KRB5 2002-03-12 13:33:20 +00:00
Dr. Stephen Henson
e50baf58ab Fix various warnings when compiling with KRB5 code. 2002-03-12 03:00:59 +00:00
Bodo Möller
1750ec5c52 asm/mips3.o problems 2002-03-11 09:35:33 +00:00
Dr. Stephen Henson
c77bd28775 Make ciphers and digests obtain an ENGINE functional reference
if impl is explicitly supplied.
2002-03-09 18:56:38 +00:00
Dr. Stephen Henson
1619add90c Make {RSA,DSA,DH}_new_method obtain and release an ENGINE
functional reference.
2002-03-09 18:24:14 +00:00
Dr. Stephen Henson
a1a4e8b6bb typo 2002-03-08 19:12:38 +00:00
Dr. Stephen Henson
25f350a058 Fix the Win32_rename() function so it correctly
returns an error code. Use the same code in Win9X
and NT.

Fix some ca.c options so they work under Win32:
unlink/rename wont work under Win32 unless the file
is closed.
2002-03-08 19:06:36 +00:00
Richard Levitte
121cb9ee38 Synchronise the AEP engine in all branches. For 0.9.6-stable [engine], implement software fallback 2002-03-07 19:39:19 +00:00
Richard Levitte
bc173b9fb0 When closing, do not use close(). Also, if the closing call fails, do
not return immediately since that leaves a locked lock.
2002-03-07 17:13:49 +00:00
Richard Levitte
4fd9c70f06 Change des_old.c to use types prefixed with _ossl_old_des_. 2002-03-07 15:38:40 +00:00
Ben Laurie
91aeab0de3 ADH-DES-CBC-SHA should be LOW. 2002-03-06 16:59:12 +00:00
Dr. Stephen Henson
c913cf446f ENGINE module additions.
Add "init" command to control ENGINE
initialization.

Call ENGINE_finish on initialized ENGINEs on exit.

Reorder shutdown in apps.c: modules should be shut
down first.

Add test private key loader to openssl ENGINE: this
just loads a private key in PEM format.

Fix print format for dh length parameter.
2002-03-06 14:09:46 +00:00
Richard Levitte
a88f39457b OpenSSL currently fails on certain pure 64-bit architectures. This is a showstopper 2002-03-06 06:25:21 +00:00
Bodo Möller
2bbaab4a24 Rephrase statement on the security of two-key 3DES.
[Chosen plaintext attack: R. Merkle, M. Hellman: "On the Security of
  Multiple Encryption", CACM 24 (1981) pp. 465-467, p. 776.

  Known plaintext angriff: P.C. van Oorschot, M. Wiener: "A
  known-plaintext attack on two-key triple encryption", EUROCRYPT '90.]
2002-03-05 15:30:13 +00:00
Bodo Möller
1a8f4b57a9 fix printf call 2002-03-05 15:05:17 +00:00
Bodo Möller
022b31a8c8 typo 2002-03-05 15:03:16 +00:00
Dr. Stephen Henson
dd6b494eb3 Make sure the type accessed by the LONG and ZLONG ASN1 type
is really a long, to avoid problems on platforms where
sizeof(int) != sizeof(long).
2002-03-05 13:49:27 +00:00
Richard Levitte
c9bea5bad3 Provide a pre 0.9.7 compatibility mapping if
OPENSSL_DES_PRE_0_9_7_COMPATIBILITY is defined.  NOT AT ALL TESTED YET!
Add a comment as to the libdes compatibility.
2002-03-05 11:25:46 +00:00
Richard Levitte
296324ea03 New configuration targets for OpenBSD, handed to me by Bob Beck <beck@openbsd.org> 2002-03-05 09:43:09 +00:00
Bodo Möller
fa41e86a28 '#if OPENSSL_VERSION_NUMBER >= ...' to document the recent change 2002-03-05 09:06:57 +00:00
Richard Levitte
9e77b7075a A dash was missing in this branch as well. 2002-03-04 18:09:10 +00:00
Richard Levitte
5c7f9a627f Rename des_SPtrans to DES_SPtrans to differentiate from libdes and avoid certain linkage clashes. 2002-03-04 16:08:53 +00:00
Richard Levitte
bc3e3472c1 Make it so one can select tests from within the test directory 2002-03-04 15:59:05 +00:00
Dr. Stephen Henson
66bd86e2c2 Fix warnings about signed/unsigned mismatch and global
shadowing (random, index) in hw_4758.c
2002-03-03 17:07:27 +00:00
Ben Laurie
487fe20490 OpenBSD variant. 2002-03-01 15:39:29 +00:00
Richard Levitte
80d9b1ccd7 Remove the perl/ subdirectory. It hasn't been worked on for ages, is
very broken, and there are working modules in CPAN, which makes our
module even more moot.
2002-02-28 22:06:26 +00:00
Richard Levitte
69c48301e0 make update 2002-02-28 20:28:23 +00:00
Bodo Möller
2be9b88135 use ERR_peek_last_error() instead of ERR_peek_error() 2002-02-28 14:10:13 +00:00
Bodo Möller
98fa4fce09 use ERR_peek_last_error() instead of ERR_peek_error() to ignore
any other errors that may be left in the error queue

Submitted by: Jeffrey Altman
2002-02-28 14:03:41 +00:00
Richard Levitte
1ec1d17e16 VMS addaptation, including a few more long names that needed hacking. 2002-02-28 13:18:47 +00:00
Richard Levitte
1e11df0dc3 Make sure aep_close_connection() is declared and has a prototype that's
consistent with the rest of the AEP functions
2002-02-28 12:59:03 +00:00
Richard Levitte
421d474332 Increase internal security when using strncpy, by making sure the resulting string is NUL-terminated 2002-02-28 12:44:05 +00:00
Richard Levitte
58060fa11b Updated AEP engine, submitted by Diarmuid O'Neill <Diarmuid.ONeill@aep.ie> 2002-02-28 11:37:35 +00:00
Richard Levitte
cea698f19c Document the added modes for AES 2002-02-28 11:30:42 +00:00
Bodo Möller
48781ef7f7 Add 'void *' argument to app_verify_callback.
Submitted by: D. K. Smetters <smetters@parc.xerox.com>
Reviewed by: Bodo Moeller
2002-02-28 10:55:52 +00:00
Geoff Thorpe
6d1a837df7 This adds a new ENGINE to support IBM 4758 cards, contributed by Maurice
Gittens.
2002-02-27 22:45:48 +00:00
Lutz Jänicke
21f422ca5e Fix the fix (Yoram Zahavi)...
Submitted by:
Reviewed by:
PR:
2002-02-27 11:24:39 +00:00
Lutz Jänicke
291ae60b52 SSL_clear != SSL_free/SSL_new
Submitted by:
Reviewed by:
PR:
2002-02-27 08:10:12 +00:00
Lutz Jänicke
3b79d2789d Make sure that bad sessions are removed in SSL_clear() (found by
Yoram Zahavi).
Submitted by:
Reviewed by:
PR:
2002-02-26 21:44:07 +00:00
Dr. Stephen Henson
bb9dcc99cf Always init ctx_tmp in PKCS7_dataFinal since it is always cleaned up. 2002-02-26 19:32:16 +00:00
Richard Levitte
3d59821134 make update 2002-02-26 14:37:25 +00:00
Dr. Stephen Henson
cae111287b Fix new -aes command argument handling 2002-02-26 13:45:19 +00:00
Dr. Stephen Henson
e36e473859 Make the engine config module always add dynamic ENGINEs
to the list using dynamic_path. This stops ENGINEs which
don't supply any default algorithms being automatically
freed (because they have no references) and allows them
to be accessed by id.

Alternative dynamic loading behaviour can be achieved by
issuing the dynamic ENGINE ctrls separately in the config file.
2002-02-24 16:22:20 +00:00
Dr. Stephen Henson
d7fb66aa82 Remove old comment 2002-02-23 13:43:07 +00:00
Dr. Stephen Henson
344b3b5ce1 OPENSSL_LOAD_CONF define as in main trunk 2002-02-23 02:09:29 +00:00
Dr. Stephen Henson
3f7cf29124 Update from main branch. 2002-02-23 01:47:59 +00:00
cvs2svn
63dc69fef6 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-02-23 01:00:45 +00:00
Dr. Stephen Henson
cfe1c195c4 non-Monolith fixes.
Submitted by Andrew W. Gray <agray@iconsinc.com>
2002-02-22 21:27:47 +00:00
Dr. Stephen Henson
0cd8572b2d Config code updates.
CONF_modules_unload() now calls CONF_modules_finish()
automatically.

Default use of section openssl_conf moved to
CONF_modules_load()

Load config file in several openssl utilities.

Most utilities now load modules from the config file,
though in a few (such as version) this isn't done
because it couldn't be used for anything.

In the case of ca and req the config file used is
the same as the utility itself: that is the -config
command line option can be used to specify an
alternative file.
2002-02-22 13:58:15 +00:00
Richard Levitte
7c2831ac90 We have AES support in openssl speed 2002-02-21 17:23:08 +00:00
Bodo Möller
de603b75fc disable '#ifdef DEBUG' sections 2002-02-21 14:08:47 +00:00
Bodo Möller
1244be2eda disable '#ifdef DEBUG' sections 2002-02-21 13:00:45 +00:00
Richard Levitte
9f0a373b51 Add AES support in the applications that support -des and -des3. 2002-02-20 18:04:17 +00:00
Richard Levitte
b0701709c1 Add comfy aliases for AES in CBC mode. 2002-02-20 18:00:23 +00:00
Richard Levitte
34aa216a65 Stop assuming the IV is 8 bytes long, use the real size instead.
This is especially important for AES that has a 16 bytes IV.
2002-02-20 17:56:01 +00:00
Richard Levitte
a76a29f233 Merge in recent changes from the main trunk. 2002-02-20 17:53:17 +00:00
Richard Levitte
4e06ab75e8 Including openssl/e_os.h in the OpenSSL 0.9.6 branch is legal, since
it's exported.  Changing that is a BIG step, which has been done in
0.9.7-dev.
2002-02-20 17:40:33 +00:00
Richard Levitte
26147fb954 Merge in recent changes from the main trunk. 2002-02-20 13:20:32 +00:00
Richard Levitte
bd53a054b1 Merg in recent changes from the main trunk. 2002-02-20 12:28:32 +00:00
Bodo Möller
211b8685d3 bugfix: allocate sufficiently large buffer
Submitted by: Nils Larsch
2002-02-20 11:58:17 +00:00
Dr. Stephen Henson
9c75b2d931 Use default openssl.cnf if config filename set to NULL and
openssl_conf if appname NULL.
2002-02-19 23:25:18 +00:00
Richard Levitte
54d11e6057 Merge in Cygwin-related changes from main trunk. 2002-02-16 22:44:30 +00:00
Richard Levitte
3d7ba69a05 The AES modes OFB and CFB are defined with 128 feedback bits. This
deviates from the "standard" 64 bits of feedback that all other
algorithms are using.  Therefore, let's redo certain EVP macros to
accept different amounts of feedback bits for these modes.

Also, change e_aes.c to provide all usually available modes for AES.
CTR isn't included yet.
2002-02-16 12:39:58 +00:00
Richard Levitte
58133d22a8 Add the modes OFB128, CFB128 and CTR128 to AES.
Submitted by Stephen Sprunk <stephen@sprunk.org>
2002-02-16 12:21:43 +00:00
cvs2svn
330e5c5460 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-02-16 12:20:35 +00:00
Richard Levitte
ab519c8262 Adjust the NID names for the AES modes OFB and CFB to contain the number
of feedback bits
2002-02-16 12:16:43 +00:00
Richard Levitte
65f29a78b2 Give the linux-sparv9 target shared capability.
Submitted by Ian Marsh <mushypea@dominion.net.uk>
2002-02-15 16:23:50 +00:00
Bodo Möller
c363b5a62f constify 2002-02-15 10:19:22 +00:00
Bodo Möller
60ed0f94ed mention EC library 2002-02-15 10:12:01 +00:00
Lutz Jänicke
f38f8d94a9 Even though it is not really practical people should know about it.
Submitted by:
Reviewed by:
PR:
2002-02-15 07:44:44 +00:00
cvs2svn
679eb352e0 This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-02-15 07:41:46 +00:00
Dr. Stephen Henson
80bbb6578e Add flag to disable config module DSO loading. 2002-02-15 02:43:50 +00:00
Dr. Stephen Henson
19cc0f0ab4 Only initialize cipher ctx if cipher is not NULL. 2002-02-15 01:01:36 +00:00
Dr. Stephen Henson
14e14ea68c Allow a NULL store parameter to X509_STORE_CTX_init(). 2002-02-15 00:58:14 +00:00
Dr. Stephen Henson
834d37ed86 Don't call finish function if it isn't set.
Fix OID module.
2002-02-15 00:33:35 +00:00
Dr. Stephen Henson
adcc235ef6 Update NEWS 2002-02-15 00:12:44 +00:00
Dr. Stephen Henson
86a0d0234d Add argument to OPENSSL_config() and add flag to
tolerate missing config file.
2002-02-14 23:39:36 +00:00
Dr. Stephen Henson
4598be561a typo (?) 2002-02-14 18:52:37 +00:00
Dr. Stephen Henson
af5db47e99 Fix warnings:
#if out some unused function.

"index" is a global function on some platforms.
2002-02-14 18:46:12 +00:00
Richard Levitte
fb67f40f04 Add the configuration target VxWorks. 2002-02-14 16:23:55 +00:00
Bodo Möller
48033c3242 fix: make it possible to disable memory debugging even if it is
enabled by default
2002-02-14 14:47:15 +00:00
Bodo Möller
aa1f5b3581 don't call OPENSSL_config(), this does not make any sense during "make test" 2002-02-14 13:52:11 +00:00
Richard Levitte
d9d3a69595 Make sure memset() is defined by including string.h
Notified by Oscar Jacobsson <oscar@jacobsson.org>
2002-02-14 13:51:13 +00:00
Richard Levitte
f9adfa6d4e For some reason, getting the topmost error was done the same way as
getting the bottommost one.  I hope I understood correctly how this
should be done.  It seems to work when running evp_test in an
environment where it can't find openssl.cnf.
2002-02-14 13:42:33 +00:00
Richard Levitte
85b1fce1ef make update 2002-02-14 13:37:14 +00:00
Richard Levitte
da566db150 The Cygwin shared extension was shifted. 2002-02-14 13:36:13 +00:00
Richard Levitte
be37dc73f6 At Corinna Vinschen's request, change CygWin32 to Cygwin 2002-02-14 12:29:32 +00:00
Richard Levitte
976b2c9c2f Because making the key strong by xoring the last byte with 0xF0
generates different keys than previous versions of OpenSSL and libdes,
let's make Assar's change experimental for now.
2002-02-14 02:43:57 +00:00
Richard Levitte
b74d2cda28 Correct sh, please 2002-02-14 02:20:48 +00:00
Bodo Möller
cc5dd9f14e it's year 2002 now 2002-02-13 18:22:49 +00:00
cvs2svn
fbfcdc4cef This commit was manufactured by cvs2svn to create branch
'OpenSSL_0_9_7-stable'.
2002-02-13 14:44:34 +00:00
2576 changed files with 470606 additions and 452586 deletions

17
.cvsignore Normal file
View File

@ -0,0 +1,17 @@
openssl.pc
Makefile
MINFO
makefile.one
tmp
out
outinc
rehash.time
testlog
make.log
maketest.log
cctest
cctest.c
cctest.a
libcrypto.so.*
libssl.so.*
libcrypto.sha1

114
.gitignore vendored
View File

@ -1,114 +0,0 @@
# Object files
*.o
*.obj
# editor artefacts
*.swp
.#*
#*#
*~
/.dir-locals.el
# 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
crypto/aes/asm/a_win32.asm
crypto/bf/asm/b_win32.asm
crypto/bn/asm/bn_win32.asm
crypto/bn/asm/co_win32.asm
crypto/bn/asm/mt_win32.asm
crypto/cast/asm/c_win32.asm
crypto/cpu_win32.asm
crypto/des/asm/d_win32.asm
crypto/des/asm/y_win32.asm
crypto/md5/asm/m5_win32.asm
crypto/rc4/asm/r4_win32.asm
crypto/rc5/asm/r5_win32.asm
crypto/ripemd/asm/rm_win32.asm
crypto/sha/asm/s1_win32.asm
crypto/sha/asm/sha512-sse2.asm
# 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
tags
TAGS
# Windows
/tmp32
/tmp32.dbg
/tmp32dll
/tmp32dll.dbg
/out32
/out32.dbg
/out32dll
/out32dll.dbg
/inc32
/MINFO
ms/bcb.mak
ms/libeay32.def
ms/nt.mak
ms/ntdll.mak
ms/ssleay32.def
ms/version32.rc

View File

@ -1,10 +0,0 @@
#! /bin/sh
# $1 is expected to be $TRAVIS_OS_NAME
if [ "$1" == osx ]; then
make -f Makefile.org \
DISTTARVARS="NAME=_srcdist TAR_COMMAND='\$\$(TAR) \$\$(TARFLAGS) -s \"|^|\$\$(NAME)/|\" -T \$\$(TARFILE).list -cvf -' TARFLAGS='-n' TARFILE=_srcdist.tar" SHELL='sh -vx' dist
else
make -f Makefile.org DISTTARVARS='TARFILE=_srcdist.tar NAME=_srcdist' SHELL='sh -v' dist
fi

View File

@ -1,60 +0,0 @@
language: c
addons:
apt_packages:
- binutils-mingw-w64
- gcc-mingw-w64
os:
- linux
- osx
compiler:
- clang
- gcc
- i686-w64-mingw32-gcc
- x86_64-w64-mingw32-gcc
env:
- CONFIG_OPTS=""
- CONFIG_OPTS="shared"
- CONFIG_OPTS="-d --strict-warnings"
matrix:
exclude:
- os: osx
compiler: i686-w64-mingw32-gcc
- os: osx
compiler: x86_64-w64-mingw32-gcc
- compiler: i686-w64-mingw32-gcc
env: CONFIG_OPTS="-d --strict-warnings"
- compiler: x86_64-w64-mingw32-gcc
env: CONFIG_OPTS="-d --strict-warnings"
before_script:
- sh .travis-create-release.sh $TRAVIS_OS_NAME
- tar -xvzf _srcdist.tar.gz
- cd _srcdist
- if [ "$CC" == i686-w64-mingw32-gcc ]; then
export CROSS_COMPILE=${CC%%gcc}; unset CC;
./Configure mingw $CONFIG_OPTS;
elif [ "$CC" == x86_64-w64-mingw32-gcc ]; then
export CROSS_COMPILE=${CC%%gcc}; unset CC;
./Configure mingw64 $CONFIG_OPTS;
else
./config $CONFIG_OPTS;
fi
- cd ..
script:
- cd _srcdist
- make
- if [ -z "$CROSS_COMPILE" ]; then make test; fi
- cd ..
notifications:
recipient:
- openssl-commits@openssl.org
email:
on_success: change
on_failure: always

View File

@ -1,2 +0,0 @@
Please https://www.openssl.org/community/thanks.html for the current
acknowledgements.

4237
CHANGES

File diff suppressed because it is too large Load Diff

View File

@ -148,7 +148,7 @@ eric (about to go bushwalking for the 4 day easter break :-)
This would tend to cause memory overwrites since SSLv3 has This would tend to cause memory overwrites since SSLv3 has
a maximum packet size of 16k. If your program uses a maximum packet size of 16k. If your program uses
buffers <= 16k, you would probably never see this problem. buffers <= 16k, you would probably never see this problem.
- Fixed a few errors that were cause by malloc() not returning - Fixed a new errors that were cause by malloc() not returning
0 initialised memory.. 0 initialised memory..
- SSL_OP_NETSCAPE_CA_DN_BUG was being switched on when using - SSL_OP_NETSCAPE_CA_DN_BUG was being switched on when using
SSL_CTX_set_options(ssl_ctx,SSL_OP_ALL); which was a bad thing SSL_CTX_set_options(ssl_ctx,SSL_OP_ALL); which was a bad thing

View File

@ -1,38 +0,0 @@
HOW TO CONTRIBUTE TO OpenSSL
----------------------------
Development is coordinated on the openssl-dev mailing list (see
http://www.openssl.org for information on subscribing). If you
would like to submit a patch, send it to rt@openssl.org with
the string "[PATCH]" in the subject. Please be sure to include a
textual explanation of what your patch does.
You can also make GitHub pull requests. If you do this, please also send
mail to rt@openssl.org with a brief description and a link to the PR so
that we can more easily keep track of it.
If you are unsure as to whether a feature will be useful for the general
OpenSSL community please discuss it on the openssl-dev mailing list first.
Someone may be already working on the same thing or there may be a good
reason as to why that feature isn't implemented.
Patches should be as up to date as possible, preferably relative to the
current Git or the last snapshot. They should follow our coding style
(see https://www.openssl.org/policies/codingstyle.html) and compile without
warnings using the --strict-warnings flag. OpenSSL compiles on many varied
platforms: try to ensure you only use portable features.
Our preferred format for patch files is "git format-patch" output. For example
to provide a patch file containing the last commit in your local git repository
use the following command:
# git format-patch --stdout HEAD^ >mydiffs.patch
Another method of creating an acceptable patch file without using git is as
follows:
# cd openssl-work
# [your changes]
# ./Configure dist; make clean
# cd ..
# diff -ur openssl-orig openssl-work > mydiffs.patch

1439
Configure

File diff suppressed because it is too large Load Diff

771
FAQ
View File

@ -1,2 +1,769 @@
The FAQ is now maintained on the web: OpenSSL - Frequently Asked Questions
https://www.openssl.org/docs/faq.html --------------------------------------
[MISC] Miscellaneous questions
* Which is the current version of OpenSSL?
* Where is the documentation?
* How can I contact the OpenSSL developers?
* Where can I get a compiled version of OpenSSL?
* Why aren't tools like 'autoconf' and 'libtool' used?
* What is an 'engine' version?
* How do I check the authenticity of the OpenSSL distribution?
[LEGAL] Legal questions
* Do I need patent licenses to use OpenSSL?
* Can I use OpenSSL with GPL software?
[USER] Questions on using the OpenSSL applications
* Why do I get a "PRNG not seeded" error message?
* Why do I get an "unable to write 'random state'" error message?
* How do I create certificates or certificate requests?
* Why can't I create certificate requests?
* Why does <SSL program> fail with a certificate verify error?
* Why can I only use weak ciphers when I connect to a server using OpenSSL?
* How can I create DSA certificates?
* Why can't I make an SSL connection using a DSA certificate?
* How can I remove the passphrase on a private key?
* Why can't I use OpenSSL certificates with SSL client authentication?
* Why does my browser give a warning about a mismatched hostname?
* How do I install a CA certificate into a browser?
* Why is OpenSSL x509 DN output not conformant to RFC2253?
[BUILD] Questions about building and testing OpenSSL
* Why does the linker complain about undefined symbols?
* Why does the OpenSSL test fail with "bc: command not found"?
* Why does the OpenSSL test fail with "bc: 1 no implemented"?
* Why does the OpenSSL test fail with "bc: stack empty"?
* Why does the OpenSSL compilation fail on Alpha Tru64 Unix?
* Why does the OpenSSL compilation fail with "ar: command not found"?
* Why does the OpenSSL compilation fail on Win32 with VC++?
* What is special about OpenSSL on Redhat?
* Why does the OpenSSL compilation fail on MacOS X?
* Why does the OpenSSL test suite fail on MacOS X?
* Why does the OpenSSL test suite fail in BN_sqr test [on a 64-bit platform]?
* Why does OpenBSD-i386 build fail on des-586.s with "Unimplemented segment type"?
[PROG] Questions about programming with OpenSSL
* Is OpenSSL thread-safe?
* I've compiled a program under Windows and it crashes: why?
* How do I read or write a DER encoded buffer using the ASN1 functions?
* I've tried using <M_some_evil_pkcs12_macro> and I get errors why?
* I've called <some function> and it fails, why?
* I just get a load of numbers for the error output, what do they mean?
* Why do I get errors about unknown algorithms?
* Why can't the OpenSSH configure script detect OpenSSL?
* Can I use OpenSSL's SSL library with non-blocking I/O?
* Why doesn't my server application receive a client certificate?
* Why does compilation fail due to an undefined symbol NID_uniqueIdentifier?
===============================================================================
[MISC] ========================================================================
* Which is the current version of OpenSSL?
The current version is available from <URL: http://www.openssl.org>.
OpenSSL 0.9.7d was released on March 17, 2004.
In addition to the current stable release, you can also access daily
snapshots of the OpenSSL development version at <URL:
ftp://ftp.openssl.org/snapshot/>, or get it by anonymous CVS access.
* Where is the documentation?
OpenSSL is a library that provides cryptographic functionality to
applications such as secure web servers. Be sure to read the
documentation of the application you want to use. The INSTALL file
explains how to install this library.
OpenSSL includes a command line utility that can be used to perform a
variety of cryptographic functions. It is described in the openssl(1)
manpage. Documentation for developers is currently being written. A
few manual pages already are available; overviews over libcrypto and
libssl are given in the crypto(3) and ssl(3) manpages.
The OpenSSL manpages are installed in /usr/local/ssl/man/ (or a
different directory if you specified one as described in INSTALL).
In addition, you can read the most current versions at
<URL: http://www.openssl.org/docs/>.
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
predecessor, at <URL: http://www.columbia.edu/~ariel/ssleay/>. Much
of this still applies to OpenSSL.
There is some documentation about certificate extensions and PKCS#12
in doc/openssl.txt
The original SSLeay documentation is included in OpenSSL as
doc/ssleay.txt. It may be useful when none of the other resources
help, but please note that it reflects the obsolete version SSLeay
0.6.6.
* How can I contact the OpenSSL developers?
The README file describes how to submit bug reports and patches to
OpenSSL. Information on the OpenSSL mailing lists is available from
<URL: http://www.openssl.org>.
* Where can I get a compiled version of OpenSSL?
You can finder pointers to binary distributions in
http://www.openssl.org/related/binaries.html .
Some applications that use OpenSSL are distributed in binary form.
When using such an application, you don't need to install OpenSSL
yourself; the application will include the required parts (e.g. DLLs).
If you want to build OpenSSL on a Windows system and you don't have
a C compiler, read the "Mingw32" section of INSTALL.W32 for information
on how to obtain and install the free GNU C compiler.
A number of Linux and *BSD distributions include OpenSSL.
* Why aren't tools like 'autoconf' and 'libtool' used?
autoconf will probably be used in future OpenSSL versions. If it was
less Unix-centric, it might have been used much earlier.
* What is an 'engine' version?
With version 0.9.6 OpenSSL was extended to interface to external crypto
hardware. This was realized in a special release '0.9.6-engine'. With
version 0.9.7 (not yet released) the changes were merged into the main
development line, so that the special release is no longer necessary.
* How do I check the authenticity of the OpenSSL distribution?
We provide MD5 digests and ASC signatures of each tarball.
Use MD5 to check that a tarball from a mirror site is identical:
md5sum TARBALL | awk '{print $1;}' | cmp - TARBALL.md5
You can check authenticity using pgp or gpg. You need the OpenSSL team
member public key used to sign it (download it from a key server). Then
just do:
pgp TARBALL.asc
[LEGAL] =======================================================================
* Do I need patent licenses to use OpenSSL?
The patents section of the README file lists patents that may apply to
you if you want to use OpenSSL. For information on intellectual
property rights, please consult a lawyer. The OpenSSL team does not
offer legal advice.
You can configure OpenSSL so as not to use RC5 and IDEA by using
./config no-rc5 no-idea
* Can I use OpenSSL with GPL software?
On many systems including the major Linux and BSD distributions, yes (the
GPL does not place restrictions on using libraries that are part of the
normal operating system distribution).
On other systems, the situation is less clear. Some GPL software copyright
holders claim that you infringe on their rights if you use OpenSSL with
their software on operating systems that don't normally include OpenSSL.
If you develop open source software that uses OpenSSL, you may find it
useful to choose an other license than the GPL, or state explicitly that
"This program is released under the GPL with the additional exemption that
compiling, linking, and/or using OpenSSL is allowed." If you are using
GPL software developed by others, you may want to ask the copyright holder
for permission to use their software with OpenSSL.
[USER] ========================================================================
* Why do I get a "PRNG not seeded" error message?
Cryptographic software needs a source of unpredictable data to work
correctly. Many open source operating systems provide a "randomness
device" (/dev/urandom or /dev/random) that serves this purpose.
All OpenSSL versions try to use /dev/urandom by default; starting with
version 0.9.7, OpenSSL also tries /dev/random if /dev/urandom is not
available.
On other systems, applications have to call the RAND_add() or
RAND_seed() function with appropriate data before generating keys or
performing public key encryption. (These functions initialize the
pseudo-random number generator, PRNG.) Some broken applications do
not do this. As of version 0.9.5, the OpenSSL functions that need
randomness report an error if the random number generator has not been
seeded with at least 128 bits of randomness. If this error occurs and
is not discussed in the documentation of the application you are
using, please contact the author of that application; it is likely
that it never worked correctly. OpenSSL 0.9.5 and later make the
error visible by refusing to perform potentially insecure encryption.
If you are using Solaris 8, you can add /dev/urandom and /dev/random
devices by installing patch 112438 (Sparc) or 112439 (x86), which are
available via the Patchfinder at <URL: http://sunsolve.sun.com>
(Solaris 9 includes these devices by default). For /dev/random support
for earlier Solaris versions, see Sun's statement at
<URL: http://sunsolve.sun.com/pub-cgi/retrieve.pl?doc=fsrdb/27606&zone_32=SUNWski>
(the SUNWski package is available in patch 105710).
On systems without /dev/urandom and /dev/random, it is a good idea to
use the Entropy Gathering Demon (EGD); see the RAND_egd() manpage for
details. Starting with version 0.9.7, OpenSSL will automatically look
for an EGD socket at /var/run/egd-pool, /dev/egd-pool, /etc/egd-pool and
/etc/entropy.
Most components of the openssl command line utility automatically try
to seed the random number generator from a file. The name of the
default seeding file is determined as follows: If environment variable
RANDFILE is set, then it names the seeding file. Otherwise if
environment variable HOME is set, then the seeding file is $HOME/.rnd.
If neither RANDFILE nor HOME is set, versions up to OpenSSL 0.9.6 will
use file .rnd in the current directory while OpenSSL 0.9.6a uses no
default seeding file at all. OpenSSL 0.9.6b and later will behave
similarly to 0.9.6a, but will use a default of "C:\" for HOME on
Windows systems if the environment variable has not been set.
If the default seeding file does not exist or is too short, the "PRNG
not seeded" error message may occur.
The openssl command line utility will write back a new state to the
default seeding file (and create this file if necessary) unless
there was no sufficient seeding.
Pointing $RANDFILE to an Entropy Gathering Daemon socket does not work.
Use the "-rand" option of the OpenSSL command line tools instead.
The $RANDFILE environment variable and $HOME/.rnd are only used by the
OpenSSL command line tools. Applications using the OpenSSL library
provide their own configuration options to specify the entropy source,
please check out the documentation coming the with application.
* Why do I get an "unable to write 'random state'" error message?
Sometimes the openssl command line utility does not abort with
a "PRNG not seeded" error message, but complains that it is
"unable to write 'random state'". This message refers to the
default seeding file (see previous answer). A possible reason
is that no default filename is known because neither RANDFILE
nor HOME is set. (Versions up to 0.9.6 used file ".rnd" in the
current directory in this case, but this has changed with 0.9.6a.)
* How do I create certificates or certificate requests?
Check out the CA.pl(1) manual page. This provides a simple wrapper round
the 'req', 'verify', 'ca' and 'pkcs12' utilities. For finer control check
out the manual pages for the individual utilities and the certificate
extensions documentation (currently in doc/openssl.txt).
* Why can't I create certificate requests?
You typically get the error:
unable to find 'distinguished_name' in config
problems making Certificate Request
This is because it can't find the configuration file. Check out the
DIAGNOSTICS section of req(1) for more information.
* Why does <SSL program> fail with a certificate verify error?
This problem is usually indicated by log messages saying something like
"unable to get local issuer certificate" or "self signed certificate".
When a certificate is verified its root CA must be "trusted" by OpenSSL
this typically means that the CA certificate must be placed in a directory
or file and the relevant program configured to read it. The OpenSSL program
'verify' behaves in a similar way and issues similar error messages: check
the verify(1) program manual page for more information.
* Why can I only use weak ciphers when I connect to a server using OpenSSL?
This is almost certainly because you are using an old "export grade" browser
which only supports weak encryption. Upgrade your browser to support 128 bit
ciphers.
* How can I create DSA certificates?
Check the CA.pl(1) manual page for a DSA certificate example.
* Why can't I make an SSL connection to a server using a DSA certificate?
Typically you'll see a message saying there are no shared ciphers when
the same setup works fine with an RSA certificate. There are two possible
causes. The client may not support connections to DSA servers most web
browsers (including Netscape and MSIE) only support connections to servers
supporting RSA cipher suites. The other cause is that a set of DH parameters
has not been supplied to the server. DH parameters can be created with the
dhparam(1) command and loaded using the SSL_CTX_set_tmp_dh() for example:
check the source to s_server in apps/s_server.c for an example.
* How can I remove the passphrase on a private key?
Firstly you should be really *really* sure you want to do this. Leaving
a private key unencrypted is a major security risk. If you decide that
you do have to do this check the EXAMPLES sections of the rsa(1) and
dsa(1) manual pages.
* Why can't I use OpenSSL certificates with SSL client authentication?
What will typically happen is that when a server requests authentication
it will either not include your certificate or tell you that you have
no client certificates (Netscape) or present you with an empty list box
(MSIE). The reason for this is that when a server requests a client
certificate it includes a list of CAs names which it will accept. Browsers
will only let you select certificates from the list on the grounds that
there is little point presenting a certificate which the server will
reject.
The solution is to add the relevant CA certificate to your servers "trusted
CA list". How you do this depends on the server software in uses. You can
print out the servers list of acceptable CAs using the OpenSSL s_client tool:
openssl s_client -connect www.some.host:443 -prexit
If your server only requests certificates on certain URLs then you may need
to manually issue an HTTP GET command to get the list when s_client connects:
GET /some/page/needing/a/certificate.html
If your CA does not appear in the list then this confirms the problem.
* Why does my browser give a warning about a mismatched hostname?
Browsers expect the server's hostname to match the value in the commonName
(CN) field of the certificate. If it does not then you get a warning.
* How do I install a CA certificate into a browser?
The usual way is to send the DER encoded certificate to the browser as
MIME type application/x-x509-ca-cert, for example by clicking on an appropriate
link. On MSIE certain extensions such as .der or .cacert may also work, or you
can import the certificate using the certificate import wizard.
You can convert a certificate to DER form using the command:
openssl x509 -in ca.pem -outform DER -out ca.der
Occasionally someone suggests using a command such as:
openssl pkcs12 -export -out cacert.p12 -in cacert.pem -inkey cakey.pem
DO NOT DO THIS! This command will give away your CAs private key and
reduces its security to zero: allowing anyone to forge certificates in
whatever name they choose.
* Why is OpenSSL x509 DN output not conformant to RFC2253?
The ways to print out the oneline format of the DN (Distinguished Name) have
been extended in version 0.9.7 of OpenSSL. Using the new X509_NAME_print_ex()
interface, the "-nameopt" option could be introduded. See the manual
page of the "openssl x509" commandline tool for details. The old behaviour
has however been left as default for the sake of compatibility.
[BUILD] =======================================================================
* Why does the linker complain about undefined symbols?
Maybe the compilation was interrupted, and make doesn't notice that
something is missing. Run "make clean; make".
If you used ./Configure instead of ./config, make sure that you
selected the right target. File formats may differ slightly between
OS versions (for example sparcv8/sparcv9, or a.out/elf).
In case you get errors about the following symbols, use the config
option "no-asm", as described in INSTALL:
BF_cbc_encrypt, BF_decrypt, BF_encrypt, CAST_cbc_encrypt,
CAST_decrypt, CAST_encrypt, RC4, RC5_32_cbc_encrypt, RC5_32_decrypt,
RC5_32_encrypt, bn_add_words, bn_div_words, bn_mul_add_words,
bn_mul_comba4, bn_mul_comba8, bn_mul_words, bn_sqr_comba4,
bn_sqr_comba8, bn_sqr_words, bn_sub_words, des_decrypt3,
des_ede3_cbc_encrypt, des_encrypt, des_encrypt2, des_encrypt3,
des_ncbc_encrypt, md5_block_asm_host_order, sha1_block_asm_data_order
If none of these helps, you may want to try using the current snapshot.
If the problem persists, please submit a bug report.
* Why does the OpenSSL test fail with "bc: command not found"?
You didn't install "bc", the Unix calculator. If you want to run the
tests, get GNU bc from ftp://ftp.gnu.org or from your OS distributor.
* Why does the OpenSSL test fail with "bc: 1 no implemented"?
On some SCO installations or versions, bc has a bug that gets triggered
when you run the test suite (using "make test"). The message returned is
"bc: 1 not implemented".
The best way to deal with this is to find another implementation of bc
and compile/install it. GNU bc (see http://www.gnu.org/software/software.html
for download instructions) can be safely used, for example.
* Why does the OpenSSL test fail with "bc: stack empty"?
On some DG/ux versions, bc seems to have a too small stack for calculations
that the OpenSSL bntest throws at it. This gets triggered when you run the
test suite (using "make test"). The message returned is "bc: stack empty".
The best way to deal with this is to find another implementation of bc
and compile/install it. GNU bc (see http://www.gnu.org/software/software.html
for download instructions) can be safely used, for example.
* Why does the OpenSSL compilation fail on Alpha Tru64 Unix?
On some Alpha installations running Tru64 Unix and Compaq C, the compilation
of crypto/sha/sha_dgst.c fails with the message 'Fatal: Insufficient virtual
memory to continue compilation.' As far as the tests have shown, this may be
a compiler bug. What happens is that it eats up a lot of resident memory
to build something, probably a table. The problem is clearly in the
optimization code, because if one eliminates optimization completely (-O0),
the compilation goes through (and the compiler consumes about 2MB of resident
memory instead of 240MB or whatever one's limit is currently).
There are three options to solve this problem:
1. set your current data segment size soft limit higher. Experience shows
that about 241000 kbytes seems to be enough on an AlphaServer DS10. You do
this with the command 'ulimit -Sd nnnnnn', where 'nnnnnn' is the number of
kbytes to set the limit to.
2. If you have a hard limit that is lower than what you need and you can't
get it changed, you can compile all of OpenSSL with -O0 as optimization
level. This is however not a very nice thing to do for those who expect to
get the best result from OpenSSL. A bit more complicated solution is the
following:
----- snip:start -----
make DIRS=crypto SDIRS=sha "`grep '^CFLAG=' Makefile | \
sed -e 's/ -O[0-9] / -O0 /'`"
rm `ls crypto/*.o crypto/sha/*.o | grep -v 'sha_dgst\.o'`
make
----- snip:end -----
This will only compile sha_dgst.c with -O0, the rest with the optimization
level chosen by the configuration process. When the above is done, do the
test and installation and you're set.
* Why does the OpenSSL compilation fail with "ar: command not found"?
Getting this message is quite usual on Solaris 2, because Sun has hidden
away 'ar' and other development commands in directories that aren't in
$PATH by default. One of those directories is '/usr/ccs/bin'. The
quickest way to fix this is to do the following (it assumes you use sh
or any sh-compatible shell):
----- snip:start -----
PATH=${PATH}:/usr/ccs/bin; export PATH
----- snip:end -----
and then redo the compilation. What you should really do is make sure
'/usr/ccs/bin' is permanently in your $PATH, for example through your
'.profile' (again, assuming you use a sh-compatible shell).
* Why does the OpenSSL compilation fail on Win32 with VC++?
Sometimes, you may get reports from VC++ command line (cl) that it
can't find standard include files like stdio.h and other weirdnesses.
One possible cause is that the environment isn't correctly set up.
To solve that problem for VC++ versions up to 6, one should run
VCVARS32.BAT which is found in the 'bin' subdirectory of the VC++
installation directory (somewhere under 'Program Files'). For VC++
version 7 (and up?), which is also called VS.NET, the file is called
VSVARS32.BAT instead.
This needs to be done prior to running NMAKE, and the changes are only
valid for the current DOS session.
* What is special about OpenSSL on Redhat?
Red Hat Linux (release 7.0 and later) include a preinstalled limited
version of OpenSSL. For patent reasons, support for IDEA, RC5 and MDC2
is disabled in this version. The same may apply to other Linux distributions.
Users may therefore wish to install more or all of the features left out.
To do this you MUST ensure that you do not overwrite the openssl that is in
/usr/bin on your Red Hat machine. Several packages depend on this file,
including sendmail and ssh. /usr/local/bin is a good alternative choice. The
libraries that come with Red Hat 7.0 onwards have different names and so are
not affected. (eg For Red Hat 7.2 they are /lib/libssl.so.0.9.6b and
/lib/libcrypto.so.0.9.6b with symlinks /lib/libssl.so.2 and
/lib/libcrypto.so.2 respectively).
Please note that we have been advised by Red Hat attempting to recompile the
openssl rpm with all the cryptography enabled will not work. All other
packages depend on the original Red Hat supplied openssl package. It is also
worth noting that due to the way Red Hat supplies its packages, updates to
openssl on each distribution never change the package version, only the
build number. For example, on Red Hat 7.1, the latest openssl package has
version number 0.9.6 and build number 9 even though it contains all the
relevant updates in packages up to and including 0.9.6b.
A possible way around this is to persuade Red Hat to produce a non-US
version of Red Hat Linux.
FYI: Patent numbers and expiry dates of US patents:
MDC-2: 4,908,861 13/03/2007
IDEA: 5,214,703 25/05/2010
RC5: 5,724,428 03/03/2015
* Why does the OpenSSL compilation fail on MacOS X?
If the failure happens when trying to build the "openssl" binary, with
a large number of undefined symbols, it's very probable that you have
OpenSSL 0.9.6b delivered with the operating system (you can find out by
running '/usr/bin/openssl version') and that you were trying to build
OpenSSL 0.9.7 or newer. The problem is that the loader ('ld') in
MacOS X has a misfeature that's quite difficult to go around.
Look in the file PROBLEMS for a more detailed explanation and for possible
solutions.
* Why does the OpenSSL test suite fail on MacOS X?
If the failure happens when running 'make test' and the RC4 test fails,
it's very probable that you have OpenSSL 0.9.6b delivered with the
operating system (you can find out by running '/usr/bin/openssl version')
and that you were trying to build OpenSSL 0.9.6d. The problem is that
the loader ('ld') in MacOS X has a misfeature that's quite difficult to
go around and has linked the programs "openssl" and the test programs
with /usr/lib/libcrypto.dylib and /usr/lib/libssl.dylib instead of the
libraries you just built.
Look in the file PROBLEMS for a more detailed explanation and for possible
solutions.
* Why does the OpenSSL test suite fail in BN_sqr test [on a 64-bit platform]?
Failure in BN_sqr test is most likely caused by a failure to configure the
toolkit for current platform or lack of support for the platform in question.
Run './config -t' and './apps/openssl version -p'. Do these platform
identifiers match? If they don't, then you most likely failed to run
./config and you're hereby advised to do so before filing a bug report.
If ./config itself fails to run, then it's most likely problem with your
local environment and you should turn to your system administrator (or
similar). If identifiers match (and/or no alternative identifier is
suggested by ./config script), then the platform is unsupported. There might
or might not be a workaround. Most notably on SPARC64 platforms with GNU
C compiler you should be able to produce a working build by running
'./config -m32'. I understand that -m32 might not be what you want/need,
but the build should be operational. For further details turn to
<openssl-dev@openssl.org>.
* Why does OpenBSD-i386 build fail on des-586.s with "Unimplemented segment type"?
As of 0.9.7 assembler routines were overhauled for position independence
of the machine code, which is essential for shared library support. For
some reason OpenBSD is equipped with an out-of-date GNU assembler which
finds the new code offensive. To work around the problem, configure with
no-asm (and sacrifice a great deal of performance) or patch your assembler
according to <URL: http://www.openssl.org/~appro/gas-1.92.3.OpenBSD.patch>.
For your convenience a pre-compiled replacement binary is provided at
<URL: http://www.openssl.org/~appro/gas-1.92.3.static.aout.bin>.
Reportedly elder *BSD a.out platforms also suffer from this problem and
remedy should be same. Provided binary is statically linked and should be
working across wider range of *BSD branches, not just OpenBSD.
[PROG] ========================================================================
* Is OpenSSL thread-safe?
Yes (with limitations: an SSL connection may not concurrently be used
by multiple threads). On Windows and many Unix systems, OpenSSL
automatically uses the multi-threaded versions of the standard
libraries. If your platform is not one of these, consult the INSTALL
file.
Multi-threaded applications must provide two callback functions to
OpenSSL. This is described in the threads(3) manpage.
* I've compiled a program under Windows and it crashes: why?
This is usually because you've missed the comment in INSTALL.W32.
Your application must link against the same version of the Win32
C-Runtime against which your openssl libraries were linked. The
default version for OpenSSL is /MD - "Multithreaded DLL".
If you are using Microsoft Visual C++'s IDE (Visual Studio), in
many cases, your new project most likely defaulted to "Debug
Singlethreaded" - /ML. This is NOT interchangeable with /MD and your
program will crash, typically on the first BIO related read or write
operation.
For each of the six possible link stage configurations within Win32,
your application must link against the same by which OpenSSL was
built. If you are using MS Visual C++ (Studio) this can be changed
by:
1. Select Settings... from the Project Menu.
2. Select the C/C++ Tab.
3. Select "Code Generation from the "Category" drop down list box
4. Select the Appropriate library (see table below) from the "Use
run-time library" drop down list box. Perform this step for both
your debug and release versions of your application (look at the
top left of the settings panel to change between the two)
Single Threaded /ML - MS VC++ often defaults to
this for the release
version of a new project.
Debug Single Threaded /MLd - MS VC++ often defaults to
this for the debug version
of a new project.
Multithreaded /MT
Debug Multithreaded /MTd
Multithreaded DLL /MD - OpenSSL defaults to this.
Debug Multithreaded DLL /MDd
Note that debug and release libraries are NOT interchangeable. If you
built OpenSSL with /MD your application must use /MD and cannot use /MDd.
* How do I read or write a DER encoded buffer using the ASN1 functions?
You have two options. You can either use a memory BIO in conjunction
with the i2d_XXX_bio() or d2i_XXX_bio() functions or you can use the
i2d_XXX(), d2i_XXX() functions directly. Since these are often the
cause of grief here are some code fragments using PKCS7 as an example:
unsigned char *buf, *p;
int len;
len = i2d_PKCS7(p7, NULL);
buf = OPENSSL_malloc(len); /* or Malloc, error checking omitted */
p = buf;
i2d_PKCS7(p7, &p);
At this point buf contains the len bytes of the DER encoding of
p7.
The opposite assumes we already have len bytes in buf:
unsigned char *p;
p = buf;
p7 = d2i_PKCS7(NULL, &p, len);
At this point p7 contains a valid PKCS7 structure of NULL if an error
occurred. If an error occurred ERR_print_errors(bio) should give more
information.
The reason for the temporary variable 'p' is that the ASN1 functions
increment the passed pointer so it is ready to read or write the next
structure. This is often a cause of problems: without the temporary
variable the buffer pointer is changed to point just after the data
that has been read or written. This may well be uninitialized data
and attempts to free the buffer will have unpredictable results
because it no longer points to the same address.
* I've tried using <M_some_evil_pkcs12_macro> and I get errors why?
This usually happens when you try compiling something using the PKCS#12
macros with a C++ compiler. There is hardly ever any need to use the
PKCS#12 macros in a program, it is much easier to parse and create
PKCS#12 files using the PKCS12_parse() and PKCS12_create() functions
documented in doc/openssl.txt and with examples in demos/pkcs12. The
'pkcs12' application has to use the macros because it prints out
debugging information.
* I've called <some function> and it fails, why?
Before submitting a report or asking in one of the mailing lists, you
should try to determine the cause. In particular, you should call
ERR_print_errors() or ERR_print_errors_fp() after the failed call
and see if the message helps. Note that the problem may occur earlier
than you think -- you should check for errors after every call where
it is possible, otherwise the actual problem may be hidden because
some OpenSSL functions clear the error state.
* I just get a load of numbers for the error output, what do they mean?
The actual format is described in the ERR_print_errors() manual page.
You should call the function ERR_load_crypto_strings() before hand and
the message will be output in text form. If you can't do this (for example
it is a pre-compiled binary) you can use the errstr utility on the error
code itself (the hex digits after the second colon).
* Why do I get errors about unknown algorithms?
This can happen under several circumstances such as reading in an
encrypted private key or attempting to decrypt a PKCS#12 file. The cause
is forgetting to load OpenSSL's table of algorithms with
OpenSSL_add_all_algorithms(). See the manual page for more information.
* Why can't the OpenSSH configure script detect OpenSSL?
Several reasons for problems with the automatic detection exist.
OpenSSH requires at least version 0.9.5a of the OpenSSL libraries.
Sometimes the distribution has installed an older version in the system
locations that is detected instead of a new one installed. The OpenSSL
library might have been compiled for another CPU or another mode (32/64 bits).
Permissions might be wrong.
The general answer is to check the config.log file generated when running
the OpenSSH configure script. It should contain the detailed information
on why the OpenSSL library was not detected or considered incompatible.
* Can I use OpenSSL's SSL library with non-blocking I/O?
Yes; make sure to read the SSL_get_error(3) manual page!
A pitfall to avoid: Don't assume that SSL_read() will just read from
the underlying transport or that SSL_write() will just write to it --
it is also possible that SSL_write() cannot do any useful work until
there is data to read, or that SSL_read() cannot do anything until it
is possible to send data. One reason for this is that the peer may
request a new TLS/SSL handshake at any time during the protocol,
requiring a bi-directional message exchange; both SSL_read() and
SSL_write() will try to continue any pending handshake.
* Why doesn't my server application receive a client certificate?
Due to the TLS protocol definition, a client will only send a certificate,
if explicitly asked by the server. Use the SSL_VERIFY_PEER flag of the
SSL_CTX_set_verify() function to enable the use of client certificates.
* Why does compilation fail due to an undefined symbol NID_uniqueIdentifier?
For OpenSSL 0.9.7 the OID table was extended and corrected. In earlier
versions, uniqueIdentifier was incorrectly used for X.509 certificates.
The correct name according to RFC2256 (LDAP) is x500UniqueIdentifier.
Change your code to use the new name when compiling against OpenSSL 0.9.7.
===============================================================================

60
INSTALL
View File

@ -2,10 +2,8 @@
INSTALLATION ON THE UNIX PLATFORM INSTALLATION ON THE UNIX PLATFORM
--------------------------------- ---------------------------------
[Installation on DOS (with djgpp), Windows, OpenVMS, MacOS (before MacOS X) [Installation on DOS (with djgpp), Windows, OpenVMS and MacOS (before MacOS X)
and NetWare is described in INSTALL.DJGPP, INSTALL.W32, INSTALL.VMS, is described in INSTALL.DJGPP, INSTALL.W32, INSTALL.VMS and INSTALL.MacOS.
INSTALL.MacOS and INSTALL.NW.
This document describes installation on operating systems in the Unix This document describes installation on operating systems in the Unix
family.] family.]
@ -75,40 +73,18 @@
no-asm Do not use assembler code. no-asm Do not use assembler code.
386 Use the 80386 instruction set only (the default x86 code is 386 Use the 80386 instruction set only (the default x86 code is
more efficient, but requires at least a 486). Note: Use more efficient, but requires at least a 486).
compiler flags for any other CPU specific configuration,
e.g. "-m32" to build x86 code on an x64 system.
no-sse2 Exclude SSE2 code pathes. Normally SSE2 extention is
detected at run-time, but the decision whether or not the
machine code will be executed is taken solely on CPU
capability vector. This means that if you happen to run OS
kernel which does not support SSE2 extension on Intel P4
processor, then your application might be exposed to
"illegal instruction" exception. There might be a way
to enable support in kernel, e.g. FreeBSD kernel can be
compiled with CPU_ENABLE_SSE, and there is a way to
disengage SSE2 code pathes upon application start-up,
but if you aim for wider "audience" running such kernel,
consider no-sse2. Both 386 and no-asm options above imply
no-sse2.
no-<cipher> Build without the specified cipher (bf, cast, des, dh, dsa, no-<cipher> Build without the specified cipher (bf, cast, des, dh, dsa,
hmac, md2, md5, mdc2, rc2, rc4, rc5, rsa, sha). hmac, md2, md5, mdc2, rc2, rc4, rc5, rsa, sha).
The crypto/<cipher> directory can be removed after running The crypto/<cipher> directory can be removed after running
"make depend". "make depend".
-Dxxx, -lxxx, -Lxxx, -fxxx, -mXXX, -Kxxx These system specific options will -Dxxx, -lxxx, -Lxxx, -fxxx, -Kxxx These system specific options will
be passed through to the compiler to allow you to be passed through to the compiler to allow you to
define preprocessor symbols, specify additional libraries, define preprocessor symbols, specify additional libraries,
library directories or other compiler options. library directories or other compiler options.
-DHAVE_CRYPTODEV Enable the BSD cryptodev engine even if we are not using
BSD. Useful if you are running ocf-linux or something
similar. Once enabled you can also enable the use of
cryptodev digests, which is usually slower unless you have
large amounts data. Use -DUSE_CRYPTODEV_DIGESTS to force
it.
Installation in Detail Installation in Detail
---------------------- ----------------------
@ -147,7 +123,7 @@
generic configurations "cc" or "gcc" should usually work on 32 bit generic configurations "cc" or "gcc" should usually work on 32 bit
systems. systems.
Configure creates the file Makefile.ssl from Makefile.org and Configure creates the file Makefile from Makefile.org and
defines various macros in crypto/opensslconf.h (generated from defines various macros in crypto/opensslconf.h (generated from
crypto/opensslconf.h.in). crypto/opensslconf.h.in).
@ -164,10 +140,10 @@
standard headers). If it is a problem with OpenSSL itself, please standard headers). If it is a problem with OpenSSL itself, please
report the problem to <openssl-bugs@openssl.org> (note that your report the problem to <openssl-bugs@openssl.org> (note that your
message will be recorded in the request tracker publicly readable message will be recorded in the request tracker publicly readable
at https://www.openssl.org/community/index.html#bugs and will be via http://www.openssl.org/support/rt2.html and will be forwarded to a
forwarded to a public mailing list). Include the output of "make public mailing list). Include the output of "make report" in your message.
report" in your message. Please check out the request tracker. Maybe Please check out the request tracker. Maybe the bug was already
the bug was already reported or has already been fixed. reported or has already been fixed.
[If you encounter assembler error messages, try the "no-asm" [If you encounter assembler error messages, try the "no-asm"
configuration option as an immediate fix.] configuration option as an immediate fix.]
@ -183,10 +159,10 @@
the failure that isn't a problem in OpenSSL itself (like a missing the failure that isn't a problem in OpenSSL itself (like a missing
or malfunctioning bc). If it is a problem with OpenSSL itself, or malfunctioning bc). If it is a problem with OpenSSL itself,
try removing any compiler optimization flags from the CFLAG line try removing any compiler optimization flags from the CFLAG line
in Makefile.ssl and run "make clean; make". Please send a bug in Makefile and run "make clean; make". Please send a bug
report to <openssl-bugs@openssl.org>, including the output of report to <openssl-bugs@openssl.org>, including the output of
"make report" in order to be added to the request tracker at "make report" in order to be added to the request tracker at
http://www.openssl.org/support/rt.html. http://www.openssl.org/support/rt2.html.
4. If everything tests ok, install OpenSSL with 4. If everything tests ok, install OpenSSL with
@ -212,10 +188,6 @@
compile programs with libcrypto or libssl. compile programs with libcrypto or libssl.
lib Contains the OpenSSL library files themselves. lib Contains the OpenSSL library files themselves.
Use "make install_sw" to install the software without documentation,
and "install_docs_html" to install HTML renditions of the manual
pages.
Package builders who want to configure the library for standard Package builders who want to configure the library for standard
locations, but have the package installed somewhere else so that locations, but have the package installed somewhere else so that
it can easily be packaged, can use it can easily be packaged, can use
@ -312,10 +284,10 @@
Note on shared libraries Note on shared libraries
------------------------ ------------------------
Shared libraries have certain caveats. Binary backward compatibility Shared library is currently an experimental feature. The only reason to
can't be guaranteed before OpenSSL version 1.0. The only reason to have them would be to conserve memory on systems where several program
use them would be to conserve memory on systems where several programs are using OpenSSL. Binary backward compatibility can't be guaranteed
are using OpenSSL. before OpenSSL version 1.0.
For some systems, the OpenSSL Configure script knows what is needed to For some systems, the OpenSSL Configure script knows what is needed to
build shared libraries for libcrypto and libssl. On these systems, build shared libraries for libcrypto and libssl. On these systems,
@ -340,7 +312,7 @@
Note on support for multiple builds Note on support for multiple builds
----------------------------------- -----------------------------------
OpenSSL is usually built in its source tree. Unfortunately, this doesn't OpenSSL is usually built in it's source tree. Unfortunately, this doesn't
support building for multiple platforms from the same source tree very well. support building for multiple platforms from the same source tree very well.
It is however possible to build in a separate tree through the use of lots It is however possible to build in a separate tree through the use of lots
of symbolic links, which should be prepared like this: of symbolic links, which should be prepared like this:

View File

@ -3,45 +3,32 @@
INSTALLATION ON THE DOS PLATFORM WITH DJGPP INSTALLATION ON THE DOS PLATFORM WITH DJGPP
------------------------------------------- -------------------------------------------
OpenSSL has been ported to DJGPP, a Unix look-alike 32-bit run-time Openssl has been ported to DOS, but only with long filename support. If
environment for 16-bit DOS, but only with long filename support. you wish to compile on native DOS with 8+3 filenames, you will have to
If you wish to compile on native DOS with 8+3 filenames, you will tweak the installation yourself, including renaming files with illegal
have to tweak the installation yourself, including renaming files or duplicate names.
with illegal or duplicate names.
You should have a full DJGPP environment installed, including the You should have a full DJGPP environment installed, including the
latest versions of DJGPP, GCC, BINUTILS, BASH, etc. This package latest versions of DJGPP, GCC, BINUTILS, BASH, etc. This package
requires that PERL and BC also be installed. requires that PERL and BC also be installed.
All of these can be obtained from the usual DJGPP mirror sites or All of these can be obtained from the usual DJGPP mirror sites, such
directly at "http://www.delorie.com/pub/djgpp". For help on which as "ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp". You also need to
files to download, see the DJGPP "ZIP PICKER" page at have the WATT-32 networking package installed before you try to compile
"http://www.delorie.com/djgpp/zip-picker.html". You also need to have openssl. This can be obtained from "http://www.bgnett.no/~giva/".
the WATT-32 networking package installed before you try to compile
OpenSSL. This can be obtained from "http://www.bgnett.no/~giva/".
The Makefile assumes that the WATT-32 code is in the directory The Makefile assumes that the WATT-32 code is in the directory
specified by the environment variable WATT_ROOT. If you have watt-32 specified by the environment variable WATT_ROOT. If you have watt-32
in directory "watt32" under your main DJGPP directory, specify in directory "watt32" under your main DJGPP directory, specify
WATT_ROOT="/dev/env/DJDIR/watt32". WATT_ROOT="/dev/env/DJDIR/watt32".
To compile OpenSSL, start your BASH shell, then configure for DJGPP by To compile openssl, start your BASH shell. Then configure for DOS by
running "./Configure" with appropriate arguments: running "./Configure" with appropriate arguments. The basic syntax for
DOS is:
./Configure no-threads --prefix=/dev/env/DJDIR DJGPP
./Configure no-threads --prefix=/dev/env/DJDIR DJGPP You may run out of DPMI selectors when running in a DOS box under
Windows. If so, just close the BASH shell, go back to Windows, and
restart BASH. Then run "make" again.
And finally fire up "make". You may run out of DPMI selectors when Building openssl under DJGPP has been tested with DJGPP 2.03,
running in a DOS box under Windows. If so, just close the BASH GCC 2.952, GCC 2.953, perl 5.005_02 and perl 5.006_01.
shell, go back to Windows, and restart BASH. Then run "make" again.
RUN-TIME CAVEAT LECTOR
--------------
Quoting FAQ:
"Cryptographic software needs a source of unpredictable data to work
correctly. Many open source operating systems provide a "randomness
device" (/dev/urandom or /dev/random) that serves this purpose."
As of version 0.9.7f DJGPP port checks upon /dev/urandom$ for a 3rd
party "randomness" DOS driver. One such driver, NOISE.SYS, can be
obtained from "http://www.rahul.net/dkaufman/index.html".

View File

@ -1,454 +0,0 @@
INSTALLATION ON THE NETWARE PLATFORM
------------------------------------
Notes about building OpenSSL for NetWare.
BUILD PLATFORM:
---------------
The build scripts (batch files, perl scripts, etc) have been developed and
tested on W2K. The scripts should run fine on other Windows platforms
(NT, Win9x, WinXP) but they have not been tested. They may require some
modifications.
Supported NetWare Platforms - NetWare 5.x, NetWare 6.x:
-------------------------------------------------------
OpenSSL can either use the WinSock interfaces introduced in NetWare 5,
or the BSD socket interface. Previous versions of NetWare, 4.x and 3.x,
are only supported if OpenSSL is build for CLIB and BSD sockets;
WinSock builds only support NetWare 5 and up.
On NetWare there are two c-runtime libraries. There is the legacy CLIB
interfaces and the newer LIBC interfaces. Being ANSI-C libraries, the
functionality in CLIB and LIBC is similar but the LIBC interfaces are built
using Novell Kernal Services (NKS) which is designed to leverage
multi-processor environments.
The NetWare port of OpenSSL can be configured to build using CLIB or LIBC.
The CLIB build was developed and tested using NetWare 5.0 sp6.0a. The LIBC
build was developed and tested using the NetWare 6.0 FCS.
The necessary LIBC functionality ships with NetWare 6. However, earlier
NetWare 5.x versions will require updates in order to run the OpenSSL LIBC
build (NetWare 5.1 SP8 is known to work).
As of June 2005, the LIBC build can be configured to use BSD sockets instead
of WinSock sockets. Call Configure (usually through netware\build.bat) using
a target of "netware-libc-bsdsock" instead of "netware-libc".
As of June 2007, support for CLIB and BSD sockets is also now available
using a target of "netware-clib-bsdsock" instead of "netware-clib";
also gcc builds are now supported on both Linux and Win32 (post 0.9.8e).
REQUIRED TOOLS:
---------------
Based upon the configuration and build options used, some or all of the
following tools may be required:
* Perl for Win32 - required (http://www.activestate.com/ActivePerl)
Used to run the various perl scripts on the build platform.
* Perl 5.8.0 for NetWare v3.20 (or later) - required
(http://developer.novell.com) Used to run the test script on NetWare
after building.
* Compiler / Linker - required:
Metrowerks CodeWarrior PDK 2.1 (or later) for NetWare (commercial):
Provides command line tools used for building.
Tools:
mwccnlm.exe - C/C++ Compiler for NetWare
mwldnlm.exe - Linker for NetWare
mwasmnlm.exe - x86 assembler for NetWare (if using assembly option)
gcc / nlmconv Cross-Compiler, available from Novell Forge (free):
http://forge.novell.com/modules/xfmod/project/?aunixnw
* Assemblers - optional:
If you intend to build using the assembly options you will need an
assembler. Work has been completed to support two assemblers, Metrowerks
and NASM. However, during development, a bug was found in the Metrowerks
assembler which generates incorrect code. Until this problem is fixed,
the Metrowerks assembler cannot be used.
mwasmnlm.exe - Metrowerks x86 assembler - part of CodeWarrior tools.
(version 2.2 Built Aug 23, 1999 - not useable due to code
generation bug)
nasmw.exe - Netwide Assembler NASM
version 0.98 was used in development and testing
* Make Tool - required:
In order to build you will need a make tool. Two make tools are
supported, GNU make (gmake.exe) or Microsoft nmake.exe.
make.exe - GNU make for Windows (version 3.75 used for development)
http://gnuwin32.sourceforge.net/packages/make.htm
nmake.exe - Microsoft make (Version 6.00.8168.0 used for development)
http://support.microsoft.com/kb/132084/EN-US/
* Novell Developer Kit (NDK) - required: (http://developer.novell.com)
CLIB - BUILDS:
WinSock2 Developer Components for NetWare:
For initial development, the October 27, 2000 version was used.
However, future versions should also work.
NOTE: The WinSock2 components include headers & import files for
NetWare, but you will also need the winsock2.h and supporting
headers (pshpack4.h, poppack.h, qos.h) delivered in the
Microsoft SDK. Note: The winsock2.h support headers may change
with various versions of winsock2.h. Check the dependencies
section on the NDK WinSock2 download page for the latest
information on dependencies. These components are unsupported by
Novell. They are provided as a courtesy, but it is strongly
suggested that all development be done using LIBC, not CLIB.
As of June 2005, the WinSock2 components are available at:
http://forgeftp.novell.com//ws2comp/
NLM and NetWare libraries for C (including CLIB and XPlat):
If you are going to build a CLIB version of OpenSSL, you will
need the CLIB headers and imports. The March, 2001 NDK release or
later is recommended.
Earlier versions should work but haven't been tested. In recent
versions the import files have been consolidated and function
names moved. This means you may run into link problems
(undefined symbols) when using earlier versions. The functions
are available in earlier versions, but you will have to modifiy
the make files to include additional import files (see
openssl\util\pl\netware.pl).
LIBC - BUILDS:
Libraries for C (LIBC) - LIBC headers and import files
If you are going to build a LIBC version of OpenSSL, you will
need the LIBC headers and imports. The March 14, 2002 NDK release or
later is required.
NOTE: The LIBC SDK includes the necessary WinSock2 support.
It is not necessary to download the WinSock2 NDK when building for
LIBC. The LIBC SDK also includes the appropriate BSD socket support
if configuring to use BSD sockets.
BUILDING:
---------
Before building, you will need to set a few environment variables. You can
set them manually or you can modify the "netware\set_env.bat" file.
The set_env.bat file is a template you can use to set up the path
and environment variables you will need to build. Modify the
various lines to point to YOUR tools and run set_env.bat.
netware\set_env.bat <target> [compiler]
target - "netware-clib" - CLIB NetWare build
- "netware-libc" - LIBC NetWare build
compiler - "gnuc" - GNU GCC Compiler
- "codewarrior" - MetroWerks CodeWarrior (default)
If you don't use set_env.bat, you will need to set up the following
environment variables:
PATH - Set PATH to point to the tools you will use.
INCLUDE - The location of the NDK include files.
CLIB ex: set INCLUDE=c:\ndk\nwsdk\include\nlm
LIBC ex: set INCLUDE=c:\ndk\libc\include
PRELUDE - The absolute path of the prelude object to link with. For
a CLIB build it is recommended you use the "clibpre.o" files shipped
with the Metrowerks PDK for NetWare. For a LIBC build you should
use the "libcpre.o" file delivered with the LIBC NDK components.
CLIB ex: set PRELUDE=c:\ndk\nwsdk\imports\clibpre.o
LIBC ex: set PRELUDE=c:\ndk\libc\imports\libcpre.o
IMPORTS - The locaton of the NDK import files.
CLIB ex: set IMPORTS=c:\ndk\nwsdk\imports
LIBC ex: set IMPORTS=c:\ndk\libc\imports
In order to build, you need to run the Perl scripts to configure the build
process and generate a make file. There is a batch file,
"netware\build.bat", to automate the process.
Build.bat runs the build configuration scripts and generates a make file.
If an assembly option is specified, it also runs the scripts to generate
the assembly code. Always run build.bat from the "openssl" directory.
netware\build [target] [debug opts] [assembly opts] [configure opts]
target - "netware-clib" - CLIB NetWare build (WinSock Sockets)
- "netware-clib-bsdsock" - CLIB NetWare build (BSD Sockets)
- "netware-libc" - LIBC NetWare build (WinSock Sockets)
- "netware-libc-bsdsock" - LIBC NetWare build (BSD Sockets)
debug opts - "debug" - build debug
assembly opts - "nw-mwasm" - use Metrowerks assembler
"nw-nasm" - use NASM assembler
"no-asm" - don't use assembly
configure opts- all unrecognized arguments are passed to the
perl 'configure' script. See that script for
internal documentation regarding options that
are available.
examples:
CLIB build, debug, without assembly:
netware\build.bat netware-clib debug no-asm
LIBC build, non-debug, using NASM assembly, add mdc2 support:
netware\build.bat netware-libc nw-nasm enable-mdc2
LIBC build, BSD sockets, non-debug, without assembly:
netware\build.bat netware-libc-bsdsock no-asm
Running build.bat generates a make file to be processed by your make
tool (gmake or nmake):
CLIB ex: gmake -f netware\nlm_clib_dbg.mak
LIBC ex: gmake -f netware\nlm_libc.mak
LIBC ex: gmake -f netware\nlm_libc_bsdsock.mak
You can also run the build scripts manually if you do not want to use the
build.bat file. Run the following scripts in the "\openssl"
subdirectory (in the order listed below):
perl configure no-asm [other config opts] [netware-clib|netware-libc|netware-libc-bsdsock]
configures no assembly build for specified netware environment
(CLIB or LIBC).
perl util\mkfiles.pl >MINFO
generates a listing of source files (used by mk1mf)
perl util\mk1mf.pl no-asm [other config opts] [netware-clib|netware-libc|netware-libc-bsdsock >netware\nlm.mak
generates the makefile for NetWare
gmake -f netware\nlm.mak
build with the make tool (nmake.exe also works)
NOTE: If you are building using the assembly option, you must also run the
various Perl scripts to generate the assembly files. See build.bat
for an example of running the various assembly scripts. You must use the
"no-asm" option to build without assembly. The configure and mk1mf scripts
also have various other options. See the scripts for more information.
The output from the build is placed in the following directories:
CLIB Debug build:
out_nw_clib.dbg - static libs & test nlm(s)
tmp_nw_clib.dbg - temporary build files
outinc_nw_clib - necessary include files
CLIB Non-debug build:
out_nw_clib - static libs & test nlm(s)
tmp_nw_clib - temporary build files
outinc_nw_clib - necesary include files
LIBC Debug build:
out_nw_libc.dbg - static libs & test nlm(s)
tmp_nw_libc.dbg - temporary build files
outinc_nw_libc - necessary include files
LIBC Non-debug build:
out_nw_libc - static libs & test nlm(s)
tmp_nw_libc - temporary build files
outinc_nw_libc - necesary include files
TESTING:
--------
The build process creates the OpenSSL static libs ( crypto.lib, ssl.lib,
rsaglue.lib ) and several test programs. You should copy the test programs
to your NetWare server and run the tests.
The batch file "netware\cpy_tests.bat" will copy all the necessary files
to your server for testing. In order to run the batch file, you need a
drive mapped to your target server. It will create an "OpenSSL" directory
on the drive and copy the test files to it. CAUTION: If a directory with the
name of "OpenSSL" already exists, it will be deleted.
To run cpy_tests.bat:
netware\cpy_tests [output directory] [NetWare drive]
output directory - "out_nw_clib.dbg", "out_nw_libc", etc.
NetWare drive - drive letter of mapped drive
CLIB ex: netware\cpy_tests out_nw_clib m:
LIBC ex: netware\cpy_tests out_nw_libc m:
The Perl script, "do_tests.pl", in the "OpenSSL" directory on the server
should be used to execute the tests. Before running the script, make sure
your SEARCH PATH includes the "OpenSSL" directory. For example, if you
copied the files to the "sys:" volume you use the command:
SEARCH ADD SYS:\OPENSSL
To run do_tests.pl type (at the console prompt):
perl \openssl\do_tests.pl [options]
options:
-p - pause after executing each test
The do_tests.pl script generates a log file "\openssl\test_out\tests.log"
which should be reviewed for errors. Any errors will be denoted by the word
"ERROR" in the log.
DEVELOPING WITH THE OPENSSL SDK:
--------------------------------
Now that everything is built and tested, you are ready to use the OpenSSL
libraries in your development.
There is no real installation procedure, just copy the static libs and
headers to your build location. The libs (crypto.lib & ssl.lib) are
located in the appropriate "out_nw_XXXX" directory
(out_nw_clib, out_nw_libc, etc).
The headers are located in the appropriate "outinc_nw_XXX" directory
(outinc_nw_clib, outinc_nw_libc).
One suggestion is to create the following directory
structure for the OpenSSL SDK:
\openssl
|- bin
| |- openssl.nlm
| |- (other tests you want)
|
|- lib
| | - crypto.lib
| | - ssl.lib
|
|- include
| | - openssl
| | | - (all the headers in "outinc_nw\openssl")
The program "openssl.nlm" can be very useful. It has dozens of
options and you may want to keep it handy for debugging, testing, etc.
When building your apps using OpenSSL, define "NETWARE". It is needed by
some of the OpenSSL headers. One way to do this is with a compile option,
for example "-DNETWARE".
NOTES:
------
Resource leaks in Tests
------------------------
Some OpenSSL tests do not clean up resources and NetWare reports
the resource leaks when the tests unload. If this really bugs you,
you can stop the messages by setting the developer option off at the console
prompt (set developer option = off). Or better yet, fix the tests to
clean up the resources!
Multi-threaded Development
---------------------------
The NetWare version of OpenSSL is thread-safe, however multi-threaded
applications must provide the necessary locking function callbacks. This
is described in doc\threads.doc. The file "openssl-x.x.x\crypto\threads\mttest.c"
is a multi-threaded test program and demonstrates the locking functions.
What is openssl2.nlm?
---------------------
The openssl program has numerous options and can be used for many different
things. Many of the options operate in an interactive mode requiring the
user to enter data. Because of this, a default screen is created for the
program. However, when running the test script it is not desirable to
have a seperate screen. Therefore, the build also creates openssl2.nlm.
Openssl2.nlm is functionally identical but uses the console screen.
Openssl2 can be used when a non-interactive mode is desired.
NOTE: There are may other possibilities (command line options, etc)
which could have been used to address the screen issue. The openssl2.nlm
option was chosen because it impacted only the build not the code.
Why only static libraries?
--------------------------
Globals, globals, and more globals. The OpenSSL code uses many global
variables that are allocated and initialized when used for the first time.
On NetWare, most applications (at least historically) run in the kernel.
When running in the kernel, there is one instance of global variables.
For regular application type NLM(s) this isn't a problem because they are
the only ones using the globals. However, for a library NLM (an NLM which
exposes functions and has no threads of execution), the globals cause
problems. Applications could inadvertently step on each other if they
change some globals. Even worse, the first application that triggers a
global to be allocated and initialized has the allocated memory charged to
itself. Now when that application unloads, NetWare will clean up all the
applicaton's memory. The global pointer variables inside OpenSSL now
point to freed memory. An abend waiting to happen!
To work correctly in the kernel, library NLM(s) that use globals need to
provide a set of globals (instance data) for each application. Another
option is to require the library only be loaded in a protected address
space along with the application using it.
Modifying the OpenSSL code to provide a set of globals (instance data) for
each application isn't technically difficult, but due to the large number
globals it would require substantial code changes and it wasn't done. Hence,
the build currently only builds static libraries which are then linked
into each application.
NOTE: If you are building a library NLM that uses the OpenSSL static
libraries, you will still have to deal with the global variable issue.
This is because when you link in the OpenSSL code you bring in all the
globals. One possible solution for the global pointer variables is to
register memory functions with OpenSSL which allocate memory and charge it
to your library NLM (see the function CRYPTO_set_mem_functions). However,
be aware that now all memory allocated by OpenSSL is charged to your NLM.
CodeWarrior Tools and W2K
---------------------------
There have been problems reported with the CodeWarrior Linker
(mwldnlm.exe) in the PDK 2.1 for NetWare when running on Windows 2000. The
problems cause the link step to fail. The only work around is to obtain an
updated linker from Metrowerks. It is expected Metrowerks will release
PDK 3.0 (in beta testing at this time - May, 2001) in the near future which
will fix these problems.
Makefile "vclean"
------------------
The generated makefile has a "vclean" target which cleans up the build
directories. If you have been building successfully and suddenly
experience problems, use "vclean" (gmake -f netware\nlm_xxxx.mak vclean) and retry.
"Undefined Symbol" Linker errors
--------------------------------
There have been linker errors reported when doing a CLIB build. The problems
occur because some versions of the CLIB SDK import files inadvertently
left out some symbols. One symbol in particular is "_lrotl". The missing
functions are actually delivered in the binaries, but they were left out of
the import files. The issues should be fixed in the September 2001 release
of the NDK. If you experience the problems you can temporarily
work around it by manually adding the missing symbols to your version of
"clib.imp".

View File

@ -71,7 +71,7 @@ the top to understand how to use them. However, if you want to
compile all you can get, the simplest is to use MAKEVMS.COM in the top compile all you can get, the simplest is to use MAKEVMS.COM in the top
directory. The syntax is the following: directory. The syntax is the following:
@MAKEVMS <option> <bits> <debug-p> [<compiler>] @MAKEVMS <option> <rsaref-p> <debug-p> [<compiler>]
<option> must be one of the following: <option> must be one of the following:
@ -87,11 +87,24 @@ directory. The syntax is the following:
TEST Just build the "[.xxx.EXE.TEST]" test programs for OpenSSL. TEST Just build the "[.xxx.EXE.TEST]" test programs for OpenSSL.
APPS Just build the "[.xxx.EXE.APPS]" application programs for OpenSSL. APPS Just build the "[.xxx.EXE.APPS]" application programs for OpenSSL.
<bits> must be one of the following: <rsaref-p> must be one of the following:
"" compile using default pointer size RSAREF compile using the RSAREF Library
32 compile using 32 bit pointer size NORSAREF compile without using RSAREF
64 compile using 64 bit pointer size
Note 0: The RSAREF library IS NO LONGER NEEDED. The RSA patent
expires September 20, 2000, and RSA Security chose to make
the algorithm public domain two weeks before that.
Note 1: If you still want to use RSAREF, the library is NOT INCLUDED
and you have to download it. RSA Security doesn't carry it
any more, but there are a number of places where you can find
it. You have to get the ".tar-Z" file as the ".zip" file
doesn't have the directory structure stored. You have to
extract the file into the [.RSAREF] directory as that is where
the scripts will look for the files.
Note 2: I have never done this, so I've no idea if it works or not.
<debug-p> must be one of the following: <debug-p> must be one of the following:
@ -104,13 +117,12 @@ directory. The syntax is the following:
GNUC For GNU C. GNUC For GNU C.
You will find the crypto library in [.xxx.EXE.CRYPTO] (where xxx is VAX, You will find the crypto library in [.xxx.EXE.CRYPTO], called LIBCRYPTO.OLB,
ALPHA or IA64), called SSL_LIBCRYPTO32.OLB or SSL_LIBCRYPTO.OLB depending where xxx is VAX or AXP. You will find the SSL library in [.xxx.EXE.SSL],
on how it was built. You will find the SSL library in [.xxx.EXE.SSL], named LIBSSL.OLB, and you will find a bunch of useful programs in
named SSL_LIBSSL32.OLB or SSL_LIBSSL.OLB, and you will find a bunch of [.xxx.EXE.APPS]. However, these shouldn't be used right off unless it's
useful programs in [.xxx.EXE.APPS]. However, these shouldn't be used just to test them. For production use, make sure you install first, see
right off unless it's just to test them. For production use, make sure Installation below.
you install first, see Installation below.
Note 1: Some programs in this package require a TCP/IP library. Note 1: Some programs in this package require a TCP/IP library.
@ -158,14 +170,12 @@ Installation:
Installation is easy, just do the following: Installation is easy, just do the following:
@INSTALL <root> <bits> @INSTALL <root>
<root> is the directory in which everything will be installed, <root> is the directory in which everything will be installed,
subdirectories, libraries, header files, programs and startup command subdirectories, libraries, header files, programs and startup command
procedures. procedures.
<bits> works the same way as for MAKEVMS.COM
N.B.: INSTALL.COM builds a new directory structure, different from N.B.: INSTALL.COM builds a new directory structure, different from
the directory tree where you have now build OpenSSL. the directory tree where you have now build OpenSSL.
@ -186,10 +196,6 @@ following command procedures:
sets up the symbols to the applications. Should be called sets up the symbols to the applications. Should be called
from for example SYS$MANAGER:SYLOGIN.COM from for example SYS$MANAGER:SYLOGIN.COM
OPENSSL_UNDO.COM
deassigns the logical names created with OPENSSL_STARTUP.COM.
The logical names that are set up are the following: The logical names that are set up are the following:
SSLROOT a dotted concealed logical name pointing at the SSLROOT a dotted concealed logical name pointing at the
@ -197,6 +203,7 @@ The logical names that are set up are the following:
SSLCERTS Initially an empty directory, this is the default SSLCERTS Initially an empty directory, this is the default
location for certificate files. location for certificate files.
SSLMISC Various scripts.
SSLPRIVATE Initially an empty directory, this is the default SSLPRIVATE Initially an empty directory, this is the default
location for private key files. location for private key files.
@ -204,9 +211,8 @@ The logical names that are set up are the following:
programs. programs.
SSLINCLUDE Contains the header files needed if you want to SSLINCLUDE Contains the header files needed if you want to
compile programs with libcrypto or libssl. compile programs with libcrypto or libssl.
SSLLIB Contains the OpenSSL library files themselves: SSLLIB Contains the OpenSSL library files (LIBCRYPTO.OLB
- SSL_LIBCRYPTO32.OLB and SSL_LIBSSL32.OLB or and LIBSSL.OLB) themselves.
- SSL_LIBCRYPTO.OLB and SSL_LIBSSL.OLB
OPENSSL Same as SSLINCLUDE. This is because the standard OPENSSL Same as SSLINCLUDE. This is because the standard
way to include OpenSSL header files from version way to include OpenSSL header files from version
@ -290,4 +296,4 @@ have any ideas.
-- --
Richard Levitte <richard@levitte.org> Richard Levitte <richard@levitte.org>
2000-02-27, 2011-03-18 2000-02-27

View File

@ -3,33 +3,21 @@
---------------------------------- ----------------------------------
[Instructions for building for Windows CE can be found in INSTALL.WCE] [Instructions for building for Windows CE can be found in INSTALL.WCE]
[Instructions for building for Win64 can be found in INSTALL.W64]
Here are a few comments about building OpenSSL for Win32 environments, Heres a few comments about building OpenSSL in Windows environments. Most
such as Windows NT and Windows 9x. It should be noted though that of this is tested on Win32 but it may also work in Win 3.1 with some
Windows 9x are not ordinarily tested. Its mention merely means that we modification.
attempt to maintain certain programming discipline and pay attention
to backward compatibility issues, in other words it's kind of expected
to work on Windows 9x, but no regression tests are actually performed.
On additional note newer OpenSSL versions are compiled and linked with You need Perl for Win32. Unless you will build on Cygwin, you will need
Winsock 2. This means that minimum OS requirement was elevated to NT 4 ActiveState Perl, available from http://www.activestate.com/ActivePerl.
and Windows 98 [there is Winsock 2 update for Windows 95 though].
- you need Perl for Win32. Unless you will build on Cygwin, you will need and one of the following C compilers:
ActiveState Perl, available from http://www.activestate.com/ActivePerl.
- one of the following C compilers:
* Visual C++ * Visual C++
* Borland C * Borland C
* GNU C (Cygwin or MinGW) * GNU C (Cygwin or MinGW)
- Netwide Assembler, a.k.a. NASM, available from http://nasm.sourceforge.net/ If you are compiling from a tarball or a CVS snapshot then the Win32 files
is required if you intend to utilize assembler modules. Note that NASM
is now the only supported assembler.
If you are compiling from a tarball or a Git snapshot then the Win32 files
may well be not up to date. This may mean that some "tweaking" is required to may well be not up to date. This may mean that some "tweaking" is required to
get it all to work. See the trouble shooting section later on for if (when?) get it all to work. See the trouble shooting section later on for if (when?)
it goes wrong. it goes wrong.
@ -37,18 +25,38 @@
Visual C++ Visual C++
---------- ----------
If you want to compile in the assembly language routines with Visual If you want to compile in the assembly language routines with Visual C++ then
C++, then you will need already mentioned Netwide Assembler binary, you will need an assembler. This is worth doing because it will result in
nasmw.exe or nasm.exe, to be available on your %PATH%. faster code: for example it will typically result in a 2 times speedup in the
RSA routines. Currently the following assemblers are supported:
Firstly you should run Configure with platform VC-WIN32: * Microsoft MASM (aka "ml")
* Free Netwide Assembler NASM.
> perl Configure VC-WIN32 --prefix=c:\some\openssl\dir MASM is distributed with most versions of VC++. For the versions where it is
not included in VC++, it is also distributed with some Microsoft DDKs, for
example the Windows NT 4.0 DDK and the Windows 98 DDK. If you do not have
either of these DDKs then you can just download the binaries for the Windows
98 DDK and extract and rename the two files XXXXXml.exe and XXXXXml.err, to
ml.exe and ml.err and install somewhere on your PATH. Both DDKs can be
downloaded from the Microsoft developers site www.msdn.com.
Where the prefix argument specifies where OpenSSL will be installed to. NASM is freely available. Version 0.98 was used during testing: other versions
may also work. It is available from many places, see for example:
http://www.kernel.org/pub/software/devel/nasm/binaries/win32/
The NASM binary nasmw.exe needs to be installed anywhere on your PATH.
Next you need to build the Makefiles and optionally the assembly Firstly you should run Configure (to build a FIPS-certified variant of
language files: OpenSSL, add the option "fips"):
> perl Configure VC-WIN32
Next you need to build the Makefiles and optionally the assembly language
files (to build a FIPS-certified variant of OpenSSL, add the argument "fips"):
- If you are using MASM then run:
> ms\do_masm
- If you are using NASM then run: - If you are using NASM then run:
@ -56,7 +64,6 @@
- If you don't want to use the assembly language files at all then run: - If you don't want to use the assembly language files at all then run:
> perl Configure VC-WIN32 no-asm --prefix=c:/some/openssl/dir
> ms\do_ms > ms\do_ms
If you get errors about things not having numbers assigned then check the If you get errors about things not having numbers assigned then check the
@ -67,46 +74,39 @@
> nmake -f ms\ntdll.mak > nmake -f ms\ntdll.mak
If all is well it should compile and you will have some DLLs and If all is well it should compile and you will have some DLLs and executables
executables in out32dll. If you want to try the tests then do: in out32dll. If you want to try the tests then do:
> nmake -f ms\ntdll.mak test > cd out32dll
> ..\ms\test
To install OpenSSL to the specified location do:
> nmake -f ms\ntdll.mak install
Tweaks: Tweaks:
There are various changes you can make to the Win32 compile There are various changes you can make to the Win32 compile environment. By
environment. By default the library is not compiled with debugging default the library is not compiled with debugging symbols. If you add 'debug'
symbols. If you use the platform debug-VC-WIN32 instead of VC-WIN32 to the mk1mf.pl lines in the do_* batch file then debugging symbols will be
then debugging symbols will be compiled in. compiled in. Note that mk1mf.pl expects the platform to be the last argument
on the command line, so 'debug' must appear before that, as all other options.
By default in 1.0.0 OpenSSL will compile builtin ENGINES into the
separate shared librariesy. If you specify the "enable-static-engine"
option on the command line to Configure the shared library build
(ms\ntdll.mak) will compile the engines into libeay32.dll instead.
The default Win32 environment is to leave out any Windows NT specific The default Win32 environment is to leave out any Windows NT specific
features. features.
If you want to enable the NT specific features of OpenSSL (currently If you want to enable the NT specific features of OpenSSL (currently only the
only the logging BIO) follow the instructions above but call the batch logging BIO) follow the instructions above but call the batch file do_nt.bat
file do_nt.bat instead of do_ms.bat. instead of do_ms.bat.
You can also build a static version of the library using the Makefile You can also build a static version of the library using the Makefile
ms\nt.mak ms\nt.mak
Borland C++ builder 5 Borland C++ builder 5
--------------------- ---------------------
* Configure for building with Borland Builder: * Configure for building with Borland Builder (to build a FIPS-certified
variant of OpenSSL, add the option "fips"):
> perl Configure BC-32 > perl Configure BC-32
* Create the appropriate makefile * Create the appropriate makefile (to build a FIPS-certified variant of
OpenSSL, add the argument "fips")
> ms\do_nasm > ms\do_nasm
* Build * Build
@ -125,13 +125,17 @@
GNU C (Cygwin) GNU C (Cygwin)
-------------- --------------
Cygwin implements a Posix/Unix runtime system (cygwin1.dll) on top of Cygwin provides a bash shell and GNU tools environment running
Win32 subsystem and provides a bash shell and GNU tools environment. on NT 4.0, Windows 9x, Windows ME, Windows 2000, and Windows XP.
Consequently, a make of OpenSSL with Cygwin is virtually identical to Consequently, a make of OpenSSL with Cygwin is closer to a GNU
Unix procedure. It is also possible to create Win32 binaries that only bash environment such as Linux than to other the other Win32
use the Microsoft C runtime system (msvcrt.dll or crtdll.dll) using makes.
MinGW. MinGW can be used in the Cygwin development environment or in a
standalone setup as described in the following section. Cygwin implements a Posix/Unix runtime system (cygwin1.dll).
It is also possible to create Win32 binaries that only use the
Microsoft C runtime system (msvcrt.dll or crtdll.dll) using
MinGW. MinGW can be used in the Cygwin development environment
or in a standalone setup as described in the following section.
To build OpenSSL using Cygwin: To build OpenSSL using Cygwin:
@ -176,44 +180,37 @@
non-fatal error in "make test" but is otherwise harmless. If non-fatal error in "make test" but is otherwise harmless. If
desired and needed, GNU bc can be built with Cygwin without change. desired and needed, GNU bc can be built with Cygwin without change.
GNU C (MinGW/MSYS) GNU C (MinGW)
------------- -------------
* Compiler and shell environment installation: * Compiler installation:
MinGW and MSYS are available from http://www.mingw.org/, both are MinGW is available from http://www.mingw.org. Run the installer and
required. Run the installers and do whatever magic they say it takes set the MinGW bin directory to the PATH in "System Properties" or
to start MSYS bash shell with GNU tools on its PATH. autoexec.bat.
N.B. Since source tar-ball can contain symbolic links, it's essential
that you use accompanying MSYS tar to unpack the source. It will
either handle them in one way or another or fail to extract them,
which does the trick too. Latter means that you may safely ignore all
"cannot create symlink" messages, as they will be "re-created" at
configure stage by copying corresponding files. Alternative programs
were observed to create empty files instead, which results in build
failure.
* Compile OpenSSL: * Compile OpenSSL:
$ ./config > ms\mingw32
[...]
$ make
[...]
$ make test
This will create the library and binaries in root source directory This will create the library and binaries in out. In case any problems
and openssl.exe application in apps directory. occur, try
> ms\mingw32 no-asm
It is also possible to cross-compile it on Linux by configuring instead.
with './Configure --cross-compile-prefix=i386-mingw32- mingw ...'. If you want to build a FIPS-certified variant of OpenSSL, add the argument
'make test' is naturally not applicable then. "fips"
libcrypto.a and libssl.a are the static libraries. To use the DLLs, libcrypto.a and libssl.a are the static libraries. To use the DLLs,
link with libeay32.a and libssl32.a instead. link with libeay32.a and libssl32.a instead.
See troubleshooting if you get error messages about functions not See troubleshooting if you get error messages about functions not having
having a number assigned. a number assigned.
* You can now try the tests:
> cd out
> ..\ms\test
Installation Installation
------------ ------------
@ -257,7 +254,7 @@
then ms\do_XXX should not give a warning any more. However the numbers that then ms\do_XXX should not give a warning any more. However the numbers that
get assigned by this technique may not match those that eventually get get assigned by this technique may not match those that eventually get
assigned in the Git tree: so anything linked against this version of the assigned in the CVS tree: so anything linked against this version of the
library may need to be recompiled. library may need to be recompiled.
If you get errors about unresolved symbols there are several possible If you get errors about unresolved symbols there are several possible
@ -294,32 +291,3 @@
(e.g. fopen()), and OpenSSL cannot change these; so in general you cannot (e.g. fopen()), and OpenSSL cannot change these; so in general you cannot
rely on CRYPTO_malloc_init() solving your problem, and you should rely on CRYPTO_malloc_init() solving your problem, and you should
consistently use the multithreaded library. consistently use the multithreaded library.
Linking your application
------------------------
If you link with static OpenSSL libraries [those built with ms/nt.mak],
then you're expected to additionally link your application with
WS2_32.LIB, ADVAPI32.LIB, GDI32.LIB and USER32.LIB. Those developing
non-interactive service applications might feel concerned about linking
with the latter two, as they are justly associated with interactive
desktop, which is not available to service processes. The toolkit is
designed to detect in which context it's currently executed, GUI,
console app or service, and act accordingly, namely whether or not to
actually make GUI calls. Additionally those who wish to
/DELAYLOAD:GDI32.DLL and /DELAYLOAD:USER32.DLL and actually keep them
off service process should consider implementing and exporting from
.exe image in question own _OPENSSL_isservice not relying on USER32.DLL.
E.g., on Windows Vista and later you could:
__declspec(dllexport) __cdecl BOOL _OPENSSL_isservice(void)
{ DWORD sess;
if (ProcessIdToSessionId(GetCurrentProcessId(),&sess))
return sess==0;
return FALSE;
}
If you link with OpenSSL .DLLs, then you're expected to include into
your application code small "shim" snippet, which provides glue between
OpenSSL BIO layer and your compiler run-time. Look up OPENSSL_Applink
reference page for further details.

View File

@ -1,66 +0,0 @@
INSTALLATION ON THE WIN64 PLATFORM
----------------------------------
Caveat lector
-------------
As of moment of this writing Win64 support is classified "initial"
for the following reasons.
- No assembler modules are engaged upon initial 0.9.8 release.
- API might change within 0.9.8 life-span, *but* in a manner which
doesn't break backward binary compatibility. Or in other words,
application programs compiled with initial 0.9.8 headers will
be expected to work with future minor release .DLL without need
to re-compile, even if future minor release features modified API.
- Above mentioned API modifications have everything to do with
elimination of a number of limitations, which are normally
considered inherent to 32-bit platforms. Which in turn is why they
are treated as limitations on 64-bit platform such as Win64:-)
The current list comprises [but not necessarily limited to]:
- null-terminated strings may not be longer than 2G-1 bytes,
longer strings are treated as zero-length;
- dynamically and *internally* allocated chunks can't be larger
than 2G-1 bytes;
- inability to encrypt/decrypt chunks of data larger than 4GB
[it's possibly to *hash* chunks of arbitrary size through];
Neither of these is actually big deal and hardly encountered
in real-life applications.
Compiling procedure
-------------------
You will need Perl. You can run under Cygwin or you can download
ActiveState Perl from http://www.activestate.com/ActivePerl.
You will need Microsoft Platform SDK, available for download at
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/. As per
April 2005 Platform SDK is equipped with Win64 compilers, as well
as assemblers, but it might change in the future.
To build for Win64/x64:
> perl Configure VC-WIN64A
> ms\do_win64a
> nmake -f ms\ntdll.mak
> cd out32dll
> ..\ms\test
To build for Win64/IA64:
> perl Configure VC-WIN64I
> ms\do_win64i
> nmake -f ms\ntdll.mak
> cd out32dll
> ..\ms\test
Naturally test-suite itself has to be executed on the target platform.
Installation
------------
TBD, for now see INSTALL.W32.

View File

@ -4,36 +4,24 @@
Building OpenSSL for Windows CE requires the following external tools: Building OpenSSL for Windows CE requires the following external tools:
* Microsoft eMbedded Visual C++ 3.0 or later * Microsoft eMbedded Visual C++ 3.0
* Appropriate SDK might be required * wcecompat compatibility library (www.essemer.com.au)
* Perl for Win32 [commonly recommended ActiveState Perl is available * Optionally ceutils for running automated tests (www.essemer.com.au)
from http://www.activestate.com/Products/ActivePerl/]
* wcecompat compatibility library available at You also need Perl for Win32. You will need ActiveState Perl, available
http://www.essemer.com.au/windowsce/ from http://www.activestate.com/ActivePerl.
* Optionally ceutils for running automated tests (same location)
_or_ Windows CE support in OpenSSL relies on wcecompat. All Windows CE specific
issues should be directed to www.essemer.com.au.
* PocketConsole driver and PortSDK available at The C Runtime Library implementation for Windows CE that is included with
http://www.symbolictools.de/public/pocketconsole/ Microsoft eMbedded Visual C++ 3.0 is incomplete and in some places
* CMD command interpreter (same location) incorrect. wcecompat plugs the holes and tries to bring the Windows CE
CRT to a level that is more compatible with ANSI C. wcecompat goes further
As Windows CE support in OpenSSL relies on 3rd party compatibility and provides low-level IO and stream IO support for stdin/stdout/stderr
library, it's appropriate to check corresponding URL for updates. For (which Windows CE does not provide). This IO functionality is not needed
example if you choose wcecompat, note that as for the moment of this by the OpenSSL library itself but is used for the tests and openssl.exe.
writing version 1.2 is available and actually required for WCE 4.2 More information is available at www.essemer.com.au.
and newer platforms. All wcecompat issues should be directed to
www.essemer.com.au.
Why compatibility library at all? The C Runtime Library implementation
for Windows CE that is included with Microsoft eMbedded Visual C++ is
incomplete and in some places incorrect. Compatibility library plugs
the holes and tries to bring the Windows CE CRT to [more] usable level.
Most gaping hole in CRT is support for stdin/stdout/stderr IO, which
proposed compatibility libraries solve in two different ways: wcecompat
redirects IO to active sync link, while PortSDK - to NT-like console
driver on the handheld itself.
Building Building
-------- --------
@ -43,21 +31,9 @@
> "C:\Program Files\Microsoft eMbedded Tools\EVC\WCE300\BIN\WCEARM.BAT" > "C:\Program Files\Microsoft eMbedded Tools\EVC\WCE300\BIN\WCEARM.BAT"
Next pick compatibility library according to your preferences. Next indicate where wcecompat is located:
1. To choose wcecompat set up WCECOMPAT environment variable pointing > set WCECOMPAT=C:\wcecompat
at the location of wcecompat tree "root":
> set WCECOMPAT=C:\wcecompat
> set PORTSDK_LIBPATH=
2. To choose PortSDK set up PORTSDK_LIBPATH to point at hardware-
specific location where your portlib.lib is installed:
> set PORTSDK_LIBPATH=C:\PortSDK\lib\ARM
> set WCECOMPAT=
Note that you may not set both variables.
Next you should run Configure: Next you should run Configure:
@ -73,16 +49,16 @@
Then from the VC++ environment at a prompt do: Then from the VC++ environment at a prompt do:
- to build static libraries:
> nmake -f ms\ce.mak
- or to build DLLs:
> nmake -f ms\cedll.mak > nmake -f ms\cedll.mak
[note that static builds are not supported under CE] If all is well it should compile and you will have some static libraries and
executables in out32, or some DLLs and executables in out32dll. If you want
If all is well it should compile and you will have some DLLs and executables
in out32dll*.
<<< everyting below needs revision in respect to wcecompat vs. PortSDK >>>
If you want
to try the tests then make sure the ceutils are in the path and do: to try the tests then make sure the ceutils are in the path and do:
> cd out32 > cd out32

View File

@ -12,7 +12,7 @@
--------------- ---------------
/* ==================================================================== /* ====================================================================
* Copyright (c) 1998-2016 The OpenSSL Project. All rights reserved. * Copyright (c) 1998-2004 The OpenSSL Project. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -29,7 +29,7 @@ OSErr AppendErrorMessageToHandle(Handle inoutHandle);
// A bunch of evil macros that would be unnecessary if I were always using C++ ! // A bunch of evil macros that would be uneccessary if I were always using C++ !
#define SetErrorMessageAndBailIfNil(theArg,theMessage) \ #define SetErrorMessageAndBailIfNil(theArg,theMessage) \
{ \ { \

View File

@ -5,98 +5,97 @@
extern "C" { extern "C" {
#endif #endif
enum {
kMacSocket_TimeoutErr = -2
enum
{
kMacSocket_TimeoutErr = -2
}; };
// Since MacSocket does busy waiting, I do a callback while waiting
typedef OSErr(*MacSocket_IdleWaitCallback) (void *); // Since MacSocket does busy waiting, I do a callback while waiting
// Call this before anything else! typedef OSErr (*MacSocket_IdleWaitCallback)(void *);
// Call this before anything else!
OSErr MacSocket_Startup(void); OSErr MacSocket_Startup(void);
// Call this to cleanup before quitting
// Call this to cleanup before quitting
OSErr MacSocket_Shutdown(void); OSErr MacSocket_Shutdown(void);
// Call this to allocate a "socket" (reference number is returned in
// outSocketNum)
// Note that inDoThreadSwitching is pretty much irrelevant right now, since I
// ignore it
// The inTimeoutTicks parameter is applied during reads/writes of data
// The inIdleWaitCallback parameter specifies a callback which is called
// during busy-waiting periods
// The inUserRefPtr parameter is passed back to the idle-wait callback
OSErr MacSocket_socket(int *outSocketNum, const Boolean inDoThreadSwitching, // Call this to allocate a "socket" (reference number is returned in outSocketNum)
const long inTimeoutTicks, // Note that inDoThreadSwitching is pretty much irrelevant right now, since I ignore it
MacSocket_IdleWaitCallback inIdleWaitCallback, // The inTimeoutTicks parameter is applied during reads/writes of data
void *inUserRefPtr); // The inIdleWaitCallback parameter specifies a callback which is called during busy-waiting periods
// The inUserRefPtr parameter is passed back to the idle-wait callback
// Call this to connect to an IP/DNS address OSErr MacSocket_socket(int *outSocketNum,const Boolean inDoThreadSwitching,const long inTimeoutTicks,MacSocket_IdleWaitCallback inIdleWaitCallback,void *inUserRefPtr);
// Note that inTargetAddressAndPort is in "IP:port" format-- e.g.
// 10.1.1.1:123
OSErr MacSocket_connect(const int inSocketNum, char *inTargetAddressAndPort);
// Call this to listen on a port // Call this to connect to an IP/DNS address
// Since this a low-performance implementation, I allow a maximum of 1 (one!) // Note that inTargetAddressAndPort is in "IP:port" format-- e.g. 10.1.1.1:123
// incoming request when I listen
OSErr MacSocket_listen(const int inSocketNum, const int inPortNum); OSErr MacSocket_connect(const int inSocketNum,char *inTargetAddressAndPort);
// Call this to close a socket
// Call this to listen on a port
// Since this a low-performance implementation, I allow a maximum of 1 (one!) incoming request when I listen
OSErr MacSocket_listen(const int inSocketNum,const int inPortNum);
// Call this to close a socket
OSErr MacSocket_close(const int inSocketNum); OSErr MacSocket_close(const int inSocketNum);
// Call this to receive data on a socket
// Most parameters' purpose are obvious-- except maybe "inBlock" which
// controls whether I wait for data or return immediately
int MacSocket_recv(const int inSocketNum, void *outBuff, int outBuffLength, // Call this to receive data on a socket
const Boolean inBlock); // Most parameters' purpose are obvious-- except maybe "inBlock" which controls whether I wait for data or return immediately
// Call this to send data on a socket int MacSocket_recv(const int inSocketNum,void *outBuff,int outBuffLength,const Boolean inBlock);
int MacSocket_send(const int inSocketNum, const void *inBuff,
int inBuffLength);
// If zero bytes were read in a call to MacSocket_recv(), it may be that the // Call this to send data on a socket
// remote end has done a half-close
// This function will let you check whether that's true or not int MacSocket_send(const int inSocketNum,const void *inBuff,int inBuffLength);
// If zero bytes were read in a call to MacSocket_recv(), it may be that the remote end has done a half-close
// This function will let you check whether that's true or not
Boolean MacSocket_RemoteEndIsClosing(const int inSocketNum); Boolean MacSocket_RemoteEndIsClosing(const int inSocketNum);
// Call this to see if the listen has completed after a call to
// MacSocket_listen() // Call this to see if the listen has completed after a call to MacSocket_listen()
Boolean MacSocket_ListenCompleted(const int inSocketNum); Boolean MacSocket_ListenCompleted(const int inSocketNum);
// These really aren't very useful anymore
// These really aren't very useful anymore
Boolean MacSocket_LocalEndIsOpen(const int inSocketNum); Boolean MacSocket_LocalEndIsOpen(const int inSocketNum);
Boolean MacSocket_RemoteEndIsOpen(const int inSocketNum); Boolean MacSocket_RemoteEndIsOpen(const int inSocketNum);
// You may wish to change the userRefPtr for a socket callback-- use this to
// do it
void MacSocket_SetUserRefPtr(const int inSocketNum, void *inNewRefPtr); // You may wish to change the userRefPtr for a socket callback-- use this to do it
// Call these to get the socket's IP:port descriptor void MacSocket_SetUserRefPtr(const int inSocketNum,void *inNewRefPtr);
void MacSocket_GetLocalIPAndPort(const int inSocketNum, char *outIPAndPort,
const int inIPAndPortLength);
void MacSocket_GetRemoteIPAndPort(const int inSocketNum, char *outIPAndPort,
const int inIPAndPortLength);
// Call this to get error info from a socket // Call these to get the socket's IP:port descriptor
void MacSocket_GetSocketErrorInfo(const int inSocketNum, void MacSocket_GetLocalIPAndPort(const int inSocketNum,char *outIPAndPort,const int inIPAndPortLength);
int *outSocketErrCode, void MacSocket_GetRemoteIPAndPort(const int inSocketNum,char *outIPAndPort,const int inIPAndPortLength);
char *outSocketErrString,
const int inSocketErrStringMaxLength);
// Call this to get error info from a socket
void MacSocket_GetSocketErrorInfo(const int inSocketNum,int *outSocketErrCode,char *outSocketErrString,const int inSocketErrStringMaxLength);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -1,42 +1,43 @@
// Gathers unpredictable system data to be used for generating // Gathers unpredictable system data to be used for generating
// random bits // random bits
#include <MacTypes.h> #include <MacTypes.h>
class CRandomizer { class CRandomizer
public: {
CRandomizer(void); public:
void PeriodicAction(void); CRandomizer (void);
void PeriodicAction (void);
private: private:
// Private calls // Private calls
void AddTimeSinceMachineStartup(void); void AddTimeSinceMachineStartup (void);
void AddAbsoluteSystemStartupTime(void); void AddAbsoluteSystemStartupTime (void);
void AddAppRunningTime(void); void AddAppRunningTime (void);
void AddStartupVolumeInfo(void); void AddStartupVolumeInfo (void);
void AddFiller(void); void AddFiller (void);
void AddCurrentMouse(void); void AddCurrentMouse (void);
void AddNow(double millisecondUncertainty); void AddNow (double millisecondUncertainty);
void AddBytes(void *data, long size, double entropy); void AddBytes (void *data, long size, double entropy);
void GetTimeBaseResolution(void); void GetTimeBaseResolution (void);
unsigned long SysTimer(void); unsigned long SysTimer (void);
// System Info // System Info
bool mSupportsLargeVolumes; bool mSupportsLargeVolumes;
bool mIsPowerPC; bool mIsPowerPC;
bool mIs601; bool mIs601;
// Time info // Time info
double mTimebaseTicksPerMillisec; double mTimebaseTicksPerMillisec;
unsigned long mLastPeriodicTicks; unsigned long mLastPeriodicTicks;
// Mouse info // Mouse info
long mSamplePeriod; long mSamplePeriod;
Point mLastMouse; Point mLastMouse;
long mMouseStill; long mMouseStill;
}; };

View File

@ -1,9 +1,9 @@
#include <MacHeaders.h> #include <MacHeaders.h>
#define B_ENDIAN #define B_ENDIAN
#ifdef __POWERPC__ #ifdef __POWERPC__
# pragma longlong on #pragma longlong on
#endif #endif
#if 1 #if 1
# define MAC_OS_GUSI_SOURCE #define MAC_OS_GUSI_SOURCE
#endif #endif
#define MONOLITH #define MONOLITH

View File

@ -1,9 +1,9 @@
#include <MacHeaders.h> #include <MacHeaders.h>
#define B_ENDIAN #define B_ENDIAN
#ifdef __POWERPC__ #ifdef __POWERPC__
# pragma longlong on #pragma longlong on
#endif #endif
#if 0 #if 0
# define MAC_OS_GUSI_SOURCE #define MAC_OS_GUSI_SOURCE
#endif #endif
#define MONOLITH #define MONOLITH

View File

@ -1,5 +1,5 @@
#ifndef MK1MF_BUILD #ifndef MK1MF_BUILD
# define CFLAGS "-DB_ENDIAN" # define CFLAGS "-DB_ENDIAN"
# define PLATFORM "macos" # define PLATFORM "macos"
# define DATE "Sun Feb 27 19:44:16 MET 2000" # define DATE "Sun Feb 27 19:44:16 MET 2000"
#endif #endif

View File

@ -1,126 +1,116 @@
/* MacOS/opensslconf.h */ /* MacOS/opensslconf.h */
#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ #if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
# if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) #if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
# define OPENSSLDIR "/usr/local/ssl" #define OPENSSLDIR "/usr/local/ssl"
# endif #endif
#endif #endif
#if defined(HEADER_IDEA_H) && !defined(IDEA_INT) #if defined(HEADER_IDEA_H) && !defined(IDEA_INT)
# define IDEA_INT unsigned int #define IDEA_INT unsigned int
#endif #endif
#if defined(HEADER_MD2_H) && !defined(MD2_INT) #if defined(HEADER_MD2_H) && !defined(MD2_INT)
# define MD2_INT unsigned int #define MD2_INT unsigned int
#endif #endif
#if defined(HEADER_RC2_H) && !defined(RC2_INT) #if defined(HEADER_RC2_H) && !defined(RC2_INT)
/* I need to put in a mod for the alpha - eay */ /* I need to put in a mod for the alpha - eay */
# define RC2_INT unsigned int #define RC2_INT unsigned int
#endif #endif
#if defined(HEADER_RC4_H) #if defined(HEADER_RC4_H)
# if !defined(RC4_INT) #if !defined(RC4_INT)
/* using int types make the structure larger but make the code faster
* on most boxes I have tested - up to %20 faster. */
/* /*
* using int types make the structure larger but make the code faster on most
* boxes I have tested - up to %20 faster.
*/
/*-
* I don't know what does "most" mean, but declaring "int" is a must on: * I don't know what does "most" mean, but declaring "int" is a must on:
* - Intel P6 because partial register stalls are very expensive; * - Intel P6 because partial register stalls are very expensive;
* - elder Alpha because it lacks byte load/store instructions; * - elder Alpha because it lacks byte load/store instructions;
*/ */
# define RC4_INT unsigned char #define RC4_INT unsigned char
# endif #endif
# if !defined(RC4_CHUNK) #if !defined(RC4_CHUNK)
/* /*
* This enables code handling data aligned at natural CPU word * This enables code handling data aligned at natural CPU word
* boundary. See crypto/rc4/rc4_enc.c for further details. * boundary. See crypto/rc4/rc4_enc.c for further details.
*/ */
# define RC4_CHUNK unsigned long #define RC4_CHUNK unsigned long
# endif #endif
#endif #endif
#if defined(HEADER_DES_H) && !defined(DES_LONG) #if defined(HEADER_DES_H) && !defined(DES_LONG)
/* /* If this is set to 'unsigned int' on a DEC Alpha, this gives about a
* If this is set to 'unsigned int' on a DEC Alpha, this gives about a %20 * %20 speed up (longs are 8 bytes, int's are 4). */
* speed up (longs are 8 bytes, int's are 4). #ifndef DES_LONG
*/ #define DES_LONG unsigned long
# ifndef DES_LONG #endif
# define DES_LONG unsigned long
# endif
#endif #endif
#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) #if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H)
# define CONFIG_HEADER_BN_H #define CONFIG_HEADER_BN_H
# if __option(longlong) #if __option(longlong)
# define BN_LLONG # define BN_LLONG
# else #else
# undef BN_LLONG # undef BN_LLONG
# endif #endif
/* Should we define BN_DIV2W here? */ /* Should we define BN_DIV2W here? */
/* Only one for the following should be defined */ /* Only one for the following should be defined */
/* /* The prime number generation stuff may not work when
* The prime number generation stuff may not work when EIGHT_BIT but I don't * EIGHT_BIT but I don't care since I've only used this mode
* care since I've only used this mode for debuging the bignum libraries * for debuging the bignum libraries */
*/ #undef SIXTY_FOUR_BIT_LONG
# undef SIXTY_FOUR_BIT_LONG #undef SIXTY_FOUR_BIT
# undef SIXTY_FOUR_BIT #define THIRTY_TWO_BIT
# define THIRTY_TWO_BIT #undef SIXTEEN_BIT
# undef SIXTEEN_BIT #undef EIGHT_BIT
# undef EIGHT_BIT
#endif #endif
#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H) #if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H)
# define CONFIG_HEADER_RC4_LOCL_H #define CONFIG_HEADER_RC4_LOCL_H
/* /* if this is defined data[i] is used instead of *data, this is a %20
* if this is defined data[i] is used instead of *data, this is a %20 speedup * speedup on x86 */
* on x86 #undef RC4_INDEX
*/
# undef RC4_INDEX
#endif #endif
#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) #if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H)
# define CONFIG_HEADER_BF_LOCL_H #define CONFIG_HEADER_BF_LOCL_H
# define BF_PTR #define BF_PTR
#endif /* HEADER_BF_LOCL_H */ #endif /* HEADER_BF_LOCL_H */
#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H) #if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H)
# define CONFIG_HEADER_DES_LOCL_H #define CONFIG_HEADER_DES_LOCL_H
/* /* the following is tweaked from a config script, that is why it is a
* the following is tweaked from a config script, that is why it is a * protected undef/define */
* protected undef/define #ifndef DES_PTR
*/ #define DES_PTR
# ifndef DES_PTR #endif
# define DES_PTR
# endif /* This helps C compiler generate the correct code for multiple functional
* units. It reduces register dependancies at the expense of 2 more
/* * registers */
* This helps C compiler generate the correct code for multiple functional #ifndef DES_RISC1
* units. It reduces register dependancies at the expense of 2 more #define DES_RISC1
* registers #endif
*/
# ifndef DES_RISC1 #ifndef DES_RISC2
# define DES_RISC1 #undef DES_RISC2
# endif #endif
# ifndef DES_RISC2 #if defined(DES_RISC1) && defined(DES_RISC2)
# undef DES_RISC2 YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
# endif #endif
# if defined(DES_RISC1) && defined(DES_RISC2) /* Unroll the inner loop, this sometimes helps, sometimes hinders.
YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED ! !!!! * Very mucy CPU dependant */
# endif #ifndef DES_UNROLL
/* #define DES_UNROLL
* Unroll the inner loop, this sometimes helps, sometimes hinders. Very mucy #endif
* CPU dependant
*/ #endif /* HEADER_DES_LOCL_H */
# ifndef DES_UNROLL
# define DES_UNROLL #ifndef __POWERPC__
# endif #define MD32_XARRAY
#endif /* HEADER_DES_LOCL_H */
#ifndef __POWERPC__
# define MD32_XARRAY
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -1,655 +0,0 @@
#
# Helper makefile to link shared libraries in a portable way.
# This is much simpler than libtool, and hopefully not too error-prone.
#
# The following variables need to be set on the command line to build
# properly
# CC contains the current compiler. This one MUST be defined
CC=cc
CFLAGS=$(CFLAG)
# LDFLAGS contains flags to be used when temporary object files (when building
# shared libraries) are created, or when an application is linked.
# SHARED_LDFLAGS contains flags to be used when the shared library is created.
LDFLAGS=
SHARED_LDFLAGS=
NM=nm
# LIBNAME contains just the name of the library, without prefix ("lib"
# on Unix, "cyg" for certain forms under Cygwin...) or suffix (.a, .so,
# .dll, ...). This one MUST have a value when using this makefile to
# build shared libraries.
# For example, to build libfoo.so, you need to do the following:
#LIBNAME=foo
LIBNAME=
# APPNAME contains just the name of the application, without suffix (""
# on Unix, ".exe" on Windows, ...). This one MUST have a value when using
# this makefile to build applications.
# For example, to build foo, you need to do the following:
#APPNAME=foo
APPNAME=
# OBJECTS contains all the object files to link together into the application.
# This must contain at least one object file.
#OBJECTS=foo.o
OBJECTS=
# LIBEXTRAS contains extra modules to link together with the library.
# For example, if a second library, say libbar.a needs to be linked into
# libfoo.so, you need to do the following:
#LIBEXTRAS=libbar.a
# Note that this MUST be used when using the link_o targets, to hold the
# names of all object files that go into the target library.
LIBEXTRAS=
# LIBVERSION contains the current version of the library.
# For example, to build libfoo.so.1.2, you need to do the following:
#LIBVERSION=1.2
LIBVERSION=
# LIBCOMPATVERSIONS contains the compatibility versions (a list) of
# the library. They MUST be in decreasing order.
# For example, if libfoo.so.1.2.1 is backward compatible with libfoo.so.1.2
# and libfoo.so.1, you need to do the following:
#LIBCOMPATVERSIONS=1.2 1
# Note that on systems that use sonames, the last number will appear as
# part of it.
# It's also possible, for systems that support it (Tru64, for example),
# to add extra compatibility info with more precision, by adding a second
# list of versions, separated from the first with a semicolon, like this:
#LIBCOMPATVERSIONS=1.2 1;1.2.0 1.1.2 1.1.1 1.1.0 1.0.0
LIBCOMPATVERSIONS=
# LIBDEPS contains all the flags necessary to cover all necessary
# dependencies to other libraries.
LIBDEPS=
#------------------------------------------------------------------------------
# The rest is private to this makefile.
SET_X=:
#SET_X=set -x
top:
echo "Trying to use this makefile interactively? Don't."
CALC_VERSIONS= \
SHLIB_COMPAT=; SHLIB_SOVER=; \
if [ -n "$(LIBVERSION)$(LIBCOMPATVERSIONS)" ]; then \
prev=""; \
for v in `echo "$(LIBVERSION) $(LIBCOMPATVERSIONS)" | cut -d';' -f1`; do \
SHLIB_SOVER_NODOT=$$v; \
SHLIB_SOVER=.$$v; \
if [ -n "$$prev" ]; then \
SHLIB_COMPAT="$$SHLIB_COMPAT .$$prev"; \
fi; \
prev=$$v; \
done; \
fi
LINK_APP= \
( $(SET_X); \
LIBDEPS="$${LIBDEPS:-$(LIBDEPS)}"; \
LDCMD="$${LDCMD:-$(CC)}"; LDFLAGS="$${LDFLAGS:-$(CFLAGS)}"; \
LIBPATH=`for x in $$LIBDEPS; do echo $$x; done | sed -e 's/^ *-L//;t' -e d | uniq`; \
LIBPATH=`echo $$LIBPATH | sed -e 's/ /:/g'`; \
LD_LIBRARY_PATH=$$LIBPATH:$$LD_LIBRARY_PATH \
$${LDCMD} $${LDFLAGS} -o $${APPNAME:=$(APPNAME)} $(OBJECTS) $${LIBDEPS} )
LINK_SO= \
( $(SET_X); \
LIBDEPS="$${LIBDEPS:-$(LIBDEPS)}"; \
SHAREDCMD="$${SHAREDCMD:-$(CC)}"; \
SHAREDFLAGS="$${SHAREDFLAGS:-$(CFLAGS) $(SHARED_LDFLAGS)}"; \
LIBPATH=`for x in $$LIBDEPS; do echo $$x; done | sed -e 's/^ *-L//;t' -e d | uniq`; \
LIBPATH=`echo $$LIBPATH | sed -e 's/ /:/g'`; \
LD_LIBRARY_PATH=$$LIBPATH:$$LD_LIBRARY_PATH \
$${SHAREDCMD} $${SHAREDFLAGS} \
-o $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX \
$$ALLSYMSFLAGS $$SHOBJECTS $$NOALLSYMSFLAGS $$LIBDEPS \
) && $(SYMLINK_SO)
SYMLINK_SO= \
if [ -n "$$INHIBIT_SYMLINKS" ]; then :; else \
prev=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; \
if [ -n "$$SHLIB_COMPAT" ]; then \
for x in $$SHLIB_COMPAT; do \
( $(SET_X); rm -f $$SHLIB$$x$$SHLIB_SUFFIX; \
ln -s $$prev $$SHLIB$$x$$SHLIB_SUFFIX ); \
prev=$$SHLIB$$x$$SHLIB_SUFFIX; \
done; \
fi; \
if [ -n "$$SHLIB_SOVER" ]; then \
( $(SET_X); rm -f $$SHLIB$$SHLIB_SUFFIX; \
ln -s $$prev $$SHLIB$$SHLIB_SUFFIX ); \
fi; \
fi
LINK_SO_A= SHOBJECTS="lib$(LIBNAME).a $(LIBEXTRAS)"; $(LINK_SO)
LINK_SO_O= SHOBJECTS="$(LIBEXTRAS)"; $(LINK_SO)
LINK_SO_A_VIA_O= \
SHOBJECTS=lib$(LIBNAME).o; \
ALL=$$ALLSYMSFLAGS; ALLSYMSFLAGS=; NOALLSYMSFLAGS=; \
( $(SET_X); \
ld $(LDFLAGS) -r -o lib$(LIBNAME).o $$ALL lib$(LIBNAME).a $(LIBEXTRAS) ); \
$(LINK_SO) && rm -f lib$(LIBNAME).o
LINK_SO_A_UNPACKED= \
UNPACKDIR=link_tmp.$$$$; rm -rf $$UNPACKDIR; mkdir $$UNPACKDIR; \
(cd $$UNPACKDIR; ar x ../lib$(LIBNAME).a) && \
([ -z "$(LIBEXTRAS)" ] || cp $(LIBEXTRAS) $$UNPACKDIR) && \
SHOBJECTS=$$UNPACKDIR/*.o; \
$(LINK_SO) && rm -rf $$UNPACKDIR
DETECT_GNU_LD=($(CC) -Wl,-V /dev/null 2>&1 | grep '^GNU ld' )>/dev/null
DO_GNU_SO=$(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS='-Wl,--whole-archive'; \
NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"
DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"
#This is rather special. It's a special target with which one can link
#applications without bothering with any features that have anything to
#do with shared libraries, for example when linking against static
#libraries. It's mostly here to avoid a lot of conditionals everywhere
#else...
link_app.:
$(LINK_APP)
link_o.gnu:
@ $(DO_GNU_SO); $(LINK_SO_O)
link_a.gnu:
@ $(DO_GNU_SO); $(LINK_SO_A)
link_app.gnu:
@ $(DO_GNU_APP); $(LINK_APP)
DO_BEOS_SO= SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS='-Wl,--whole-archive'; \
NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SUFFIX"
link_o.beos:
@ $(DO_BEOS_SO); $(LINK_SO_O)
link_a.beos:
@ $(DO_BEOS_SO); $(LINK_SO_A)
link_o.bsd:
@if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \
$(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
LIBDEPS=" "; \
ALLSYMSFLAGS="-Wl,-Bforcearchive"; \
NOALLSYMSFLAGS=; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -nostdlib"; \
fi; $(LINK_SO_O)
link_a.bsd:
@if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \
$(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
LIBDEPS=" "; \
ALLSYMSFLAGS="-Wl,-Bforcearchive"; \
NOALLSYMSFLAGS=; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -nostdlib"; \
fi; $(LINK_SO_A)
link_app.bsd:
@if $(DETECT_GNU_LD); then $(DO_GNU_APP); else \
LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBPATH)"; \
fi; $(LINK_APP)
# For Darwin AKA Mac OS/X (dyld)
# Originally link_o.darwin produced .so, because it was hard-coded
# in dso_dlfcn module. At later point dso_dlfcn switched to .dylib
# extension in order to allow for run-time linking with vendor-
# supplied shared libraries such as libz, so that link_o.darwin had
# to be harmonized with it. This caused minor controversy, because
# it was believed that dlopen can't be used to dynamically load
# .dylib-s, only so called bundle modules (ones linked with -bundle
# flag). The belief seems to be originating from pre-10.4 release,
# where dlfcn functionality was emulated by dlcompat add-on. In
# 10.4 dlopen was rewritten as native part of dyld and is documented
# to be capable of loading both dynamic libraries and bundles. In
# order to provide compatibility with pre-10.4 dlopen, modules are
# linked with -bundle flag, which makes .dylib extension misleading.
# It works, because dlopen is [and always was] extension-agnostic.
# Alternative to this heuristic approach is to develop specific
# MacOS X dso module relying on whichever "native" dyld interface.
link_o.darwin:
@ $(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME); \
SHLIB_SUFFIX=.dylib; \
ALLSYMSFLAGS='-all_load'; \
NOALLSYMSFLAGS=''; \
SHAREDFLAGS="$(CFLAGS) `echo $(SHARED_LDFLAGS) | sed s/dynamiclib/bundle/`"; \
if [ -n "$(LIBVERSION)" ]; then \
SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \
fi; \
if [ -n "$$SHLIB_SOVER_NODOT" ]; then \
SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \
fi; \
$(LINK_SO_O)
link_a.darwin:
@ $(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME); \
SHLIB_SUFFIX=.dylib; \
ALLSYMSFLAGS='-all_load'; \
NOALLSYMSFLAGS=''; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS)"; \
if [ -n "$(LIBVERSION)" ]; then \
SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \
fi; \
if [ -n "$$SHLIB_SOVER_NODOT" ]; then \
SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \
fi; \
SHAREDFLAGS="$$SHAREDFLAGS -install_name $(INSTALLTOP)/$(LIBDIR)/$$SHLIB$(SHLIB_EXT)"; \
$(LINK_SO_A)
link_app.darwin: # is there run-path on darwin?
$(LINK_APP)
link_o.cygwin:
@ $(CALC_VERSIONS); \
INHIBIT_SYMLINKS=yes; \
SHLIB=cyg$(LIBNAME); \
base=-Wl,--enable-auto-image-base; \
deffile=; \
if expr $(PLATFORM) : 'mingw' > /dev/null; then \
SHLIB=$(LIBNAME)eay32; base=; \
if test -f $(LIBNAME)eay32.def; then \
deffile=$(LIBNAME)eay32.def; \
fi; \
fi; \
SHLIB_SUFFIX=.dll; \
LIBVERSION="$(LIBVERSION)"; \
SHLIB_SOVER=${LIBVERSION:+"-$(LIBVERSION)"}; \
ALLSYMSFLAGS='-Wl,--whole-archive'; \
NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared $$base $$deffile -Wl,-s,-Bsymbolic"; \
$(LINK_SO_O)
#for mingw target if def-file is in use dll-name should match library-name
link_a.cygwin:
@ $(CALC_VERSIONS); \
INHIBIT_SYMLINKS=yes; \
SHLIB=cyg$(LIBNAME); SHLIB_SOVER=-$(LIBVERSION); SHLIB_SUFFIX=.dll; \
dll_name=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; extras=; \
base=-Wl,--enable-auto-image-base; \
if expr $(PLATFORM) : 'mingw' > /dev/null; then \
case $(LIBNAME) in \
crypto) SHLIB=libeay;; \
ssl) SHLIB=ssleay;; \
esac; \
SHLIB_SOVER=32; \
extras="$(LIBNAME).def"; \
$(PERL) util/mkdef.pl 32 $$SHLIB > $$extras; \
base=; [ $(LIBNAME) = "crypto" ] && base=-Wl,--image-base,0x63000000; \
fi; \
dll_name=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; \
$(PERL) util/mkrc.pl $$dll_name | \
$(CROSS_COMPILE)windres -o rc.o; \
extras="$$extras rc.o"; \
ALLSYMSFLAGS='-Wl,--whole-archive'; \
NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared $$base -Wl,-s,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a $$extras"; \
[ -f apps/$$dll_name ] && rm apps/$$dll_name; \
[ -f test/$$dll_name ] && rm test/$$dll_name; \
$(LINK_SO_A) || exit 1; \
rm $$extras; \
cp -p $$dll_name apps/; \
cp -p $$dll_name test/
link_app.cygwin:
@if expr "$(CFLAGS)" : '.*OPENSSL_USE_APPLINK' > /dev/null; then \
LIBDEPS="$(TOP)/crypto/applink.o $${LIBDEPS:-$(LIBDEPS)}"; \
export LIBDEPS; \
fi; \
$(LINK_APP)
link_o.alpha-osf1:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_SO); \
else \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
if [ -n "$$SHLIB_HIST" ]; then \
SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
else \
SHLIB_HIST="$(LIBVERSION)"; \
fi; \
SHLIB_SOVER=; \
ALLSYMSFLAGS='-all'; \
NOALLSYMSFLAGS='-none'; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-B,symbolic"; \
if [ -n "$$SHLIB_HIST" ]; then \
SHAREDFLAGS="$$SHAREDFLAGS -set_version $$SHLIB_HIST"; \
fi; \
fi; \
$(LINK_SO_O)
link_a.alpha-osf1:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_SO); \
else \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
if [ -n "$$SHLIB_HIST" ]; then \
SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
else \
SHLIB_HIST="$(LIBVERSION)"; \
fi; \
SHLIB_SOVER=; \
ALLSYMSFLAGS='-all'; \
NOALLSYMSFLAGS='-none'; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-B,symbolic"; \
if [ -n "$$SHLIB_HIST" ]; then \
SHAREDFLAGS="$$SHAREDFLAGS -set_version $$SHLIB_HIST"; \
fi; \
fi; \
$(LINK_SO_A)
link_app.alpha-osf1:
@if $(DETECT_GNU_LD); then \
$(DO_GNU_APP); \
else \
LDFLAGS="$(CFLAGS) -rpath $(LIBRPATH)"; \
fi; \
$(LINK_APP)
link_o.solaris:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_SO); \
else \
$(CALC_VERSIONS); \
MINUSZ='-z '; \
($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS="$${MINUSZ}allextract"; \
NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-Bsymbolic"; \
fi; \
$(LINK_SO_O)
link_a.solaris:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_SO); \
else \
$(CALC_VERSIONS); \
MINUSZ='-z '; \
($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=;\
ALLSYMSFLAGS="$${MINUSZ}allextract"; \
NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-Bsymbolic"; \
fi; \
$(LINK_SO_A)
link_app.solaris:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_APP); \
else \
LDFLAGS="$(CFLAGS) -R $(LIBRPATH)"; \
fi; \
$(LINK_APP)
# OpenServer 5 native compilers used
link_o.svr3:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_SO); \
else \
$(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS=''; \
NOALLSYMSFLAGS=''; \
SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
fi; \
$(LINK_SO_O)
link_a.svr3:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_SO); \
else \
$(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS=''; \
NOALLSYMSFLAGS=''; \
SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
fi; \
$(LINK_SO_A_UNPACKED)
link_app.svr3:
@$(DETECT_GNU_LD) && $(DO_GNU_APP); \
$(LINK_APP)
# UnixWare 7 and OpenUNIX 8 native compilers used
link_o.svr5:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_SO); \
else \
$(CALC_VERSIONS); \
SHARE_FLAG='-G'; \
($(CC) -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS=''; \
NOALLSYMSFLAGS=''; \
SHAREDFLAGS="$(CFLAGS) $${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
fi; \
$(LINK_SO_O)
link_a.svr5:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_SO); \
else \
$(CALC_VERSIONS); \
SHARE_FLAG='-G'; \
($(CC) -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS=''; \
NOALLSYMSFLAGS=''; \
SHAREDFLAGS="$(CFLAGS) $${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
fi; \
$(LINK_SO_A_UNPACKED)
link_app.svr5:
@$(DETECT_GNU_LD) && $(DO_GNU_APP); \
$(LINK_APP)
link_o.irix:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_SO); \
else \
$(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
MINUSWL=""; \
($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
ALLSYMSFLAGS="$${MINUSWL}-all"; \
NOALLSYMSFLAGS="$${MINUSWL}-none"; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,-B,symbolic"; \
fi; \
$(LINK_SO_O)
link_a.irix:
@ if $(DETECT_GNU_LD); then \
$(DO_GNU_SO); \
else \
$(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
MINUSWL=""; \
($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
ALLSYMSFLAGS="$${MINUSWL}-all"; \
NOALLSYMSFLAGS="$${MINUSWL}-none"; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,-B,symbolic"; \
fi; \
$(LINK_SO_A)
link_app.irix:
@LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"; \
$(LINK_APP)
# 32-bit PA-RISC HP-UX embeds the -L pathname of libs we link with, so
# we compensate for it with +cdp ../: and +cdp ./:. Yes, these rewrite
# rules imply that we can only link one level down in catalog structure,
# but that's what takes place for the moment of this writing. +cdp option
# was introduced in HP-UX 11.x and applies in 32-bit PA-RISC link
# editor context only [it's simply ignored in other cases, which are all
# ELFs by the way].
#
link_o.hpux:
@if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \
$(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).sl; \
expr "$(CFLAGS)" : '.*DSO_DLFCN' > /dev/null && SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS='-Wl,-Fl'; \
NOALLSYMSFLAGS=''; \
expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+cdp,../:,+cdp,./:"; \
fi; \
rm -f $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX || :; \
$(LINK_SO_O) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
link_a.hpux:
@if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \
$(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).sl; \
expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS='-Wl,-Fl'; \
NOALLSYMSFLAGS=''; \
expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+cdp,../:,+cdp,./:"; \
fi; \
rm -f $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX || :; \
$(LINK_SO_A) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
link_app.hpux:
@if $(DETECT_GNU_LD); then $(DO_GNU_APP); else \
LDFLAGS="$(CFLAGS) -Wl,+s,+cdp,../:,+cdp,./:,+b,$(LIBRPATH)"; \
fi; \
$(LINK_APP)
link_o.aix:
@ $(CALC_VERSIONS); \
OBJECT_MODE=`expr "x$(SHARED_LDFLAGS)" : 'x\-[a-z]*\(64\)'` || :; \
OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS=''; \
NOALLSYMSFLAGS=''; \
SHAREDFLAGS='$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-bexpall,-bnolibpath,-bM:SRE'; \
$(LINK_SO_O);
link_a.aix:
@ $(CALC_VERSIONS); \
OBJECT_MODE=`expr "x$(SHARED_LDFLAGS)" : 'x\-[a-z]*\(64\)'` || : ; \
OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS='-bnogc'; \
NOALLSYMSFLAGS=''; \
SHAREDFLAGS='$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-bexpall,-bnolibpath,-bM:SRE'; \
$(LINK_SO_A_VIA_O)
link_app.aix:
LDFLAGS="$(CFLAGS) -Wl,-brtl,-blibpath:$(LIBRPATH):$${LIBPATH:-/usr/lib:/lib}"; \
$(LINK_APP)
link_o.reliantunix:
@ $(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS=; \
NOALLSYMSFLAGS=''; \
SHAREDFLAGS='$(CFLAGS) -G'; \
$(LINK_SO_O)
link_a.reliantunix:
@ $(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).so; \
SHLIB_SUFFIX=; \
ALLSYMSFLAGS=; \
NOALLSYMSFLAGS=''; \
SHAREDFLAGS='$(CFLAGS) -G'; \
$(LINK_SO_A_UNPACKED)
link_app.reliantunix:
$(LINK_APP)
# Targets to build symbolic links when needed
symlink.gnu symlink.solaris symlink.svr3 symlink.svr5 symlink.irix \
symlink.aix symlink.reliantunix:
@ $(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).so; \
$(SYMLINK_SO)
symlink.darwin:
@ $(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME); \
SHLIB_SUFFIX=.dylib; \
$(SYMLINK_SO)
symlink.hpux:
@ $(CALC_VERSIONS); \
SHLIB=lib$(LIBNAME).sl; \
expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \
$(SYMLINK_SO)
# The following lines means those specific architectures do no symlinks
symlink.cygwin symlink.alpha-osf1 symlink.tru64 symlink.tru64-rpath symlink.beos:
# Compatibility targets
link_o.bsd-gcc-shared link_o.linux-shared link_o.gnu-shared: link_o.gnu
link_a.bsd-gcc-shared link_a.linux-shared link_a.gnu-shared: link_a.gnu
link_app.bsd-gcc-shared link_app.linux-shared link_app.gnu-shared: link_app.gnu
symlink.bsd-gcc-shared symlink.bsd-shared symlink.linux-shared symlink.gnu-shared: symlink.gnu
link_o.bsd-shared: link_o.bsd
link_a.bsd-shared: link_a.bsd
link_app.bsd-shared: link_app.bsd
link_o.darwin-shared: link_o.darwin
link_a.darwin-shared: link_a.darwin
link_app.darwin-shared: link_app.darwin
symlink.darwin-shared: symlink.darwin
link_o.cygwin-shared: link_o.cygwin
link_a.cygwin-shared: link_a.cygwin
link_app.cygwin-shared: link_app.cygwin
symlink.cygwin-shared: symlink.cygwin
link_o.alpha-osf1-shared: link_o.alpha-osf1
link_a.alpha-osf1-shared: link_a.alpha-osf1
link_app.alpha-osf1-shared: link_app.alpha-osf1
symlink.alpha-osf1-shared: symlink.alpha-osf1
link_o.tru64-shared: link_o.tru64
link_a.tru64-shared: link_a.tru64
link_app.tru64-shared: link_app.tru64
symlink.tru64-shared: symlink.tru64
link_o.tru64-shared-rpath: link_o.tru64-rpath
link_a.tru64-shared-rpath: link_a.tru64-rpath
link_app.tru64-shared-rpath: link_app.tru64-rpath
symlink.tru64-shared-rpath: symlink.tru64-rpath
link_o.solaris-shared: link_o.solaris
link_a.solaris-shared: link_a.solaris
link_app.solaris-shared: link_app.solaris
symlink.solaris-shared: symlink.solaris
link_o.svr3-shared: link_o.svr3
link_a.svr3-shared: link_a.svr3
link_app.svr3-shared: link_app.svr3
symlink.svr3-shared: symlink.svr3
link_o.svr5-shared: link_o.svr5
link_a.svr5-shared: link_a.svr5
link_app.svr5-shared: link_app.svr5
symlink.svr5-shared: symlink.svr5
link_o.irix-shared: link_o.irix
link_a.irix-shared: link_a.irix
link_app.irix-shared: link_app.irix
symlink.irix-shared: symlink.irix
link_o.hpux-shared: link_o.hpux
link_a.hpux-shared: link_a.hpux
link_app.hpux-shared: link_app.hpux
symlink.hpux-shared: symlink.hpux
link_o.aix-shared: link_o.aix
link_a.aix-shared: link_a.aix
link_app.aix-shared: link_app.aix
symlink.aix-shared: symlink.aix
link_o.reliantunix-shared: link_o.reliantunix
link_a.reliantunix-shared: link_a.reliantunix
link_app.reliantunix-shared: link_app.reliantunix
symlink.reliantunix-shared: symlink.reliantunix
link_o.beos-shared: link_o.beos
link_a.beos-shared: link_a.beos
link_app.beos-shared: link_app.gnu
symlink.beos-shared: symlink.beos

485
NEWS
View File

@ -5,459 +5,22 @@
This file gives a brief overview of the major changes between each OpenSSL This file gives a brief overview of the major changes between each OpenSSL
release. For more details please read the CHANGES file. release. For more details please read the CHANGES file.
Major changes between OpenSSL 1.0.1s and OpenSSL 1.0.1t [under development] Major changes between OpenSSL 0.9.7c and OpenSSL 0.9.7d:
o
Major changes between OpenSSL 1.0.1r and OpenSSL 1.0.1s [1 Mar 2016]
o Disable weak ciphers in SSLv3 and up in default builds of OpenSSL.
o Disable SSLv2 default build, default negotiation and weak ciphers
(CVE-2016-0800)
o Fix a double-free in DSA code (CVE-2016-0705)
o Disable SRP fake user seed to address a server memory leak
(CVE-2016-0798)
o Fix BN_hex2bn/BN_dec2bn NULL pointer deref/heap corruption
(CVE-2016-0797)
o Fix memory issues in BIO_*printf functions (CVE-2016-0799)
o Fix side channel attack on modular exponentiation (CVE-2016-0702)
Major changes between OpenSSL 1.0.1q and OpenSSL 1.0.1r [28 Jan 2016]
o Protection for DH small subgroup attacks
o SSLv2 doesn't block disabled ciphers (CVE-2015-3197)
Major changes between OpenSSL 1.0.1p and OpenSSL 1.0.1q [3 Dec 2015]
o Certificate verify crash with missing PSS parameter (CVE-2015-3194)
o X509_ATTRIBUTE memory leak (CVE-2015-3195)
o Rewrite EVP_DecodeUpdate (base64 decoding) to fix several bugs
o In DSA_generate_parameters_ex, if the provided seed is too short,
return an error
Major changes between OpenSSL 1.0.1o and OpenSSL 1.0.1p [9 Jul 2015]
o Alternate chains certificate forgery (CVE-2015-1793)
o Race condition handling PSK identify hint (CVE-2015-3196)
Major changes between OpenSSL 1.0.1n and OpenSSL 1.0.1o [12 Jun 2015]
o Fix HMAC ABI incompatibility
Major changes between OpenSSL 1.0.1m and OpenSSL 1.0.1n [11 Jun 2015]
o Malformed ECParameters causes infinite loop (CVE-2015-1788)
o Exploitable out-of-bounds read in X509_cmp_time (CVE-2015-1789)
o PKCS7 crash with missing EnvelopedContent (CVE-2015-1790)
o CMS verify infinite loop with unknown hash function (CVE-2015-1792)
o Race condition handling NewSessionTicket (CVE-2015-1791)
Major changes between OpenSSL 1.0.1l and OpenSSL 1.0.1m [19 Mar 2015]
o Segmentation fault in ASN1_TYPE_cmp fix (CVE-2015-0286)
o ASN.1 structure reuse memory corruption fix (CVE-2015-0287)
o PKCS7 NULL pointer dereferences fix (CVE-2015-0289)
o DoS via reachable assert in SSLv2 servers fix (CVE-2015-0293)
o Use After Free following d2i_ECPrivatekey error fix (CVE-2015-0209)
o X509_to_X509_REQ NULL pointer deref fix (CVE-2015-0288)
o Removed the export ciphers from the DEFAULT ciphers
Major changes between OpenSSL 1.0.1k and OpenSSL 1.0.1l [15 Jan 2015]
o Build fixes for the Windows and OpenVMS platforms
Major changes between OpenSSL 1.0.1j and OpenSSL 1.0.1k [8 Jan 2015]
o Fix for CVE-2014-3571
o Fix for CVE-2015-0206
o Fix for CVE-2014-3569
o Fix for CVE-2014-3572
o Fix for CVE-2015-0204
o Fix for CVE-2015-0205
o Fix for CVE-2014-8275
o Fix for CVE-2014-3570
Major changes between OpenSSL 1.0.1i and OpenSSL 1.0.1j [15 Oct 2014]
o Fix for CVE-2014-3513
o Fix for CVE-2014-3567
o Mitigation for CVE-2014-3566 (SSL protocol vulnerability)
o Fix for CVE-2014-3568
Major changes between OpenSSL 1.0.1h and OpenSSL 1.0.1i [6 Aug 2014]
o Fix for CVE-2014-3512
o Fix for CVE-2014-3511
o Fix for CVE-2014-3510
o Fix for CVE-2014-3507
o Fix for CVE-2014-3506
o Fix for CVE-2014-3505
o Fix for CVE-2014-3509
o Fix for CVE-2014-5139
o Fix for CVE-2014-3508
Major changes between OpenSSL 1.0.1g and OpenSSL 1.0.1h [5 Jun 2014]
o Fix for CVE-2014-0224
o Fix for CVE-2014-0221
o Fix for CVE-2014-0198
o Fix for CVE-2014-0195
o Fix for CVE-2014-3470
o Fix for CVE-2010-5298
Major changes between OpenSSL 1.0.1f and OpenSSL 1.0.1g [7 Apr 2014]
o Fix for CVE-2014-0160
o Add TLS padding extension workaround for broken servers.
o Fix for CVE-2014-0076
Major changes between OpenSSL 1.0.1e and OpenSSL 1.0.1f [6 Jan 2014]
o Don't include gmt_unix_time in TLS server and client random values
o Fix for TLS record tampering bug CVE-2013-4353
o Fix for TLS version checking bug CVE-2013-6449
o Fix for DTLS retransmission bug CVE-2013-6450
Major changes between OpenSSL 1.0.1d and OpenSSL 1.0.1e [11 Feb 2013]:
o Corrected fix for CVE-2013-0169
Major changes between OpenSSL 1.0.1c and OpenSSL 1.0.1d [4 Feb 2013]:
o Fix renegotiation in TLS 1.1, 1.2 by using the correct TLS version.
o Include the fips configuration module.
o Fix OCSP bad key DoS attack CVE-2013-0166
o Fix for SSL/TLS/DTLS CBC plaintext recovery attack CVE-2013-0169
o Fix for TLS AESNI record handling flaw CVE-2012-2686
Major changes between OpenSSL 1.0.1b and OpenSSL 1.0.1c [10 May 2012]:
o Fix TLS/DTLS record length checking bug CVE-2012-2333
o Don't attempt to use non-FIPS composite ciphers in FIPS mode.
Major changes between OpenSSL 1.0.1a and OpenSSL 1.0.1b [26 Apr 2012]:
o Fix compilation error on non-x86 platforms.
o Make FIPS capable OpenSSL ciphers work in non-FIPS mode.
o Fix SSL_OP_NO_TLSv1_1 clash with SSL_OP_ALL in OpenSSL 1.0.0
Major changes between OpenSSL 1.0.1 and OpenSSL 1.0.1a [19 Apr 2012]:
o Fix for ASN1 overflow bug CVE-2012-2110
o Workarounds for some servers that hang on long client hellos.
o Fix SEGV in AES code.
Major changes between OpenSSL 1.0.0h and OpenSSL 1.0.1 [14 Mar 2012]:
o TLS/DTLS heartbeat support.
o SCTP support.
o RFC 5705 TLS key material exporter.
o RFC 5764 DTLS-SRTP negotiation.
o Next Protocol Negotiation.
o PSS signatures in certificates, requests and CRLs.
o Support for password based recipient info for CMS.
o Support TLS v1.2 and TLS v1.1.
o Preliminary FIPS capability for unvalidated 2.0 FIPS module.
o SRP support.
Major changes between OpenSSL 1.0.0g and OpenSSL 1.0.0h [12 Mar 2012]:
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 [18 Jan 2012]:
o Fix for DTLS DoS issue CVE-2012-0050
Major changes between OpenSSL 1.0.0e and OpenSSL 1.0.0f [4 Jan 2012]:
o Fix for DTLS plaintext recovery attack CVE-2011-4108
o Clear block padding bytes of SSL 3.0 records CVE-2011-4576
o Only allow one SGC handshake restart for SSL/TLS CVE-2011-4619
o Check parameters are not NULL in GOST ENGINE CVE-2012-0027
o Check for malformed RFC3779 data CVE-2011-4577
Major changes between OpenSSL 1.0.0d and OpenSSL 1.0.0e [6 Sep 2011]:
o Fix for CRL vulnerability issue CVE-2011-3207
o Fix for ECDH crashes CVE-2011-3210
o Protection against EC timing attacks.
o Support ECDH ciphersuites for certificates using SHA2 algorithms.
o Various DTLS fixes.
Major changes between OpenSSL 1.0.0c and OpenSSL 1.0.0d [8 Feb 2011]:
o Fix for security issue CVE-2011-0014
Major changes between OpenSSL 1.0.0b and OpenSSL 1.0.0c [2 Dec 2010]:
o Fix for security issue CVE-2010-4180
o Fix for CVE-2010-4252
o Fix mishandling of absent EC point format extension.
o Fix various platform compilation issues.
o Corrected fix for security issue CVE-2010-3864.
Major changes between OpenSSL 1.0.0a and OpenSSL 1.0.0b [16 Nov 2010]:
o Fix for security issue CVE-2010-3864.
o Fix for CVE-2010-2939
o Fix WIN32 build system for GOST ENGINE.
Major changes between OpenSSL 1.0.0 and OpenSSL 1.0.0a [1 Jun 2010]:
o Fix for security issue CVE-2010-1633.
o GOST MAC and CFB fixes.
Major changes between OpenSSL 0.9.8n and OpenSSL 1.0.0 [29 Mar 2010]:
o RFC3280 path validation: sufficient to process PKITS tests.
o Integrated support for PVK files and keyblobs.
o Change default private key format to PKCS#8.
o CMS support: able to process all examples in RFC4134
o Streaming ASN1 encode support for PKCS#7 and CMS.
o Multiple signer and signer add support for PKCS#7 and CMS.
o ASN1 printing support.
o Whirlpool hash algorithm added.
o RFC3161 time stamp support.
o New generalised public key API supporting ENGINE based algorithms.
o New generalised public key API utilities.
o New ENGINE supporting GOST algorithms.
o SSL/TLS GOST ciphersuite support.
o PKCS#7 and CMS GOST support.
o RFC4279 PSK ciphersuite support.
o Supported points format extension for ECC ciphersuites.
o ecdsa-with-SHA224/256/384/512 signature types.
o dsa-with-SHA224 and dsa-with-SHA256 signature types.
o Opaque PRF Input TLS extension support.
o Updated time routines to avoid OS limitations.
Major changes between OpenSSL 0.9.8m and OpenSSL 0.9.8n [24 Mar 2010]:
o CFB cipher definition fixes.
o Fix security issues CVE-2010-0740 and CVE-2010-0433.
Major changes between OpenSSL 0.9.8l and OpenSSL 0.9.8m [25 Feb 2010]:
o Cipher definition fixes.
o Workaround for slow RAND_poll() on some WIN32 versions.
o Remove MD2 from algorithm tables.
o SPKAC handling fixes.
o Support for RFC5746 TLS renegotiation extension.
o Compression memory leak fixed.
o Compression session resumption fixed.
o Ticket and SNI coexistence fixes.
o Many fixes to DTLS handling.
Major changes between OpenSSL 0.9.8k and OpenSSL 0.9.8l [5 Nov 2009]:
o Temporary work around for CVE-2009-3555: disable renegotiation.
Major changes between OpenSSL 0.9.8j and OpenSSL 0.9.8k [25 Mar 2009]:
o Fix various build issues.
o Fix security issues (CVE-2009-0590, CVE-2009-0591, CVE-2009-0789)
Major changes between OpenSSL 0.9.8i and OpenSSL 0.9.8j [7 Jan 2009]:
o Fix security issue (CVE-2008-5077)
o Merge FIPS 140-2 branch code.
Major changes between OpenSSL 0.9.8g and OpenSSL 0.9.8h [28 May 2008]:
o CryptoAPI ENGINE support.
o Various precautionary measures.
o Fix for bugs affecting certificate request creation.
o Support for local machine keyset attribute in PKCS#12 files.
Major changes between OpenSSL 0.9.8f and OpenSSL 0.9.8g [19 Oct 2007]:
o Backport of CMS functionality to 0.9.8.
o Fixes for bugs introduced with 0.9.8f.
Major changes between OpenSSL 0.9.8e and OpenSSL 0.9.8f [11 Oct 2007]:
o Add gcc 4.2 support.
o Add support for AES and SSE2 assembly lanugauge optimization
for VC++ build.
o Support for RFC4507bis and server name extensions if explicitly
selected at compile time.
o DTLS improvements.
o RFC4507bis support.
o TLS Extensions support.
Major changes between OpenSSL 0.9.8d and OpenSSL 0.9.8e [23 Feb 2007]:
o Various ciphersuite selection fixes.
o RFC3779 support.
Major changes between OpenSSL 0.9.8c and OpenSSL 0.9.8d [28 Sep 2006]:
o Introduce limits to prevent malicious key DoS (CVE-2006-2940)
o Fix security issues (CVE-2006-2937, CVE-2006-3737, CVE-2006-4343)
o Changes to ciphersuite selection algorithm
Major changes between OpenSSL 0.9.8b and OpenSSL 0.9.8c [5 Sep 2006]:
o Fix Daniel Bleichenbacher forged signature attack, CVE-2006-4339
o New cipher Camellia
Major changes between OpenSSL 0.9.8a and OpenSSL 0.9.8b [4 May 2006]:
o Cipher string fixes.
o Fixes for VC++ 2005.
o Updated ECC cipher suite support.
o New functions EVP_CIPHER_CTX_new() and EVP_CIPHER_CTX_free().
o Zlib compression usage fixes.
o Built in dynamic engine compilation support on Win32.
o Fixes auto dynamic engine loading in Win32.
Major changes between OpenSSL 0.9.8 and OpenSSL 0.9.8a [11 Oct 2005]:
o Fix potential SSL 2.0 rollback, CVE-2005-2969
o Extended Windows CE support
Major changes between OpenSSL 0.9.7g and OpenSSL 0.9.8 [5 Jul 2005]:
o Major work on the BIGNUM library for higher efficiency and to
make operations more streamlined and less contradictory. This
is the result of a major audit of the BIGNUM library.
o Addition of BIGNUM functions for fields GF(2^m) and NIST
curves, to support the Elliptic Crypto functions.
o Major work on Elliptic Crypto; ECDH and ECDSA added, including
the use through EVP, X509 and ENGINE.
o New ASN.1 mini-compiler that's usable through the OpenSSL
configuration file.
o Added support for ASN.1 indefinite length constructed encoding.
o New PKCS#12 'medium level' API to manipulate PKCS#12 files.
o Complete rework of shared library construction and linking
programs with shared or static libraries, through a separate
Makefile.shared.
o Rework of the passing of parameters from one Makefile to another.
o Changed ENGINE framework to load dynamic engine modules
automatically from specifically given directories.
o New structure and ASN.1 functions for CertificatePair.
o Changed the ZLIB compression method to be stateful.
o Changed the key-generation and primality testing "progress"
mechanism to take a structure that contains the ticker
function and an argument.
o New engine module: GMP (performs private key exponentiation).
o New engine module: VIA PadLOck ACE extension in VIA C3
Nehemiah processors.
o Added support for IPv6 addresses in certificate extensions.
See RFC 1884, section 2.2.
o Added support for certificate policy mappings, policy
constraints and name constraints.
o Added support for multi-valued AVAs in the OpenSSL
configuration file.
o Added support for multiple certificates with the same subject
in the 'openssl ca' index file.
o Make it possible to create self-signed certificates using
'openssl ca -selfsign'.
o Make it possible to generate a serial number file with
'openssl ca -create_serial'.
o New binary search functions with extended functionality.
o New BUF functions.
o New STORE structure and library to provide an interface to all
sorts of data repositories. Supports storage of public and
private keys, certificates, CRLs, numbers and arbitrary blobs.
This library is unfortunately unfinished and unused withing
OpenSSL.
o New control functions for the error stack.
o Changed the PKCS#7 library to support one-pass S/MIME
processing.
o Added the possibility to compile without old deprecated
functionality with the OPENSSL_NO_DEPRECATED macro or the
'no-deprecated' argument to the config and Configure scripts.
o Constification of all ASN.1 conversion functions, and other
affected functions.
o Improved platform support for PowerPC.
o New FIPS 180-2 algorithms (SHA-224, -256, -384 and -512).
o New X509_VERIFY_PARAM structure to support parametrisation
of X.509 path validation.
o Major overhaul of RC4 performance on Intel P4, IA-64 and
AMD64.
o Changed the Configure script to have some algorithms disabled
by default. Those can be explicitely enabled with the new
argument form 'enable-xxx'.
o Change the default digest in 'openssl' commands from MD5 to
SHA-1.
o Added support for DTLS.
o New BIGNUM blinding.
o Added support for the RSA-PSS encryption scheme
o Added support for the RSA X.931 padding.
o Added support for BSD sockets on NetWare.
o Added support for files larger than 2GB.
o Added initial support for Win64.
o Added alternate pkg-config files.
Major changes between OpenSSL 0.9.7l and OpenSSL 0.9.7m [23 Feb 2007]:
o FIPS 1.1.1 module linking.
o Various ciphersuite selection fixes.
Major changes between OpenSSL 0.9.7k and OpenSSL 0.9.7l [28 Sep 2006]:
o Introduce limits to prevent malicious key DoS (CVE-2006-2940)
o Fix security issues (CVE-2006-2937, CVE-2006-3737, CVE-2006-4343)
Major changes between OpenSSL 0.9.7j and OpenSSL 0.9.7k [5 Sep 2006]:
o Fix Daniel Bleichenbacher forged signature attack, CVE-2006-4339
Major changes between OpenSSL 0.9.7i and OpenSSL 0.9.7j [4 May 2006]:
o Visual C++ 2005 fixes.
o Update Windows build system for FIPS.
Major changes between OpenSSL 0.9.7h and OpenSSL 0.9.7i [14 Oct 2005]:
o Give EVP_MAX_MD_SIZE it's old value, except for a FIPS build.
Major changes between OpenSSL 0.9.7g and OpenSSL 0.9.7h [11 Oct 2005]:
o Fix SSL 2.0 Rollback, CVE-2005-2969
o Allow use of fixed-length exponent on DSA signing
o Default fixed-window RSA, DSA, DH private-key operations
Major changes between OpenSSL 0.9.7f and OpenSSL 0.9.7g [11 Apr 2005]:
o More compilation issues fixed.
o Adaptation to more modern Kerberos API.
o Enhanced or corrected configuration for Solaris64, Mingw and Cygwin.
o Enhanced x86_64 assembler BIGNUM module.
o More constification.
o Added processing of proxy certificates (RFC 3820).
Major changes between OpenSSL 0.9.7e and OpenSSL 0.9.7f [22 Mar 2005]:
o Several compilation issues fixed.
o Many memory allocation failure checks added.
o Improved comparison of X509 Name type.
o Mandatory basic checks on certificates.
o Performance improvements.
Major changes between OpenSSL 0.9.7d and OpenSSL 0.9.7e [25 Oct 2004]:
o Fix race condition in CRL checking code.
o Fixes to PKCS#7 (S/MIME) code.
Major changes between OpenSSL 0.9.7c and OpenSSL 0.9.7d [17 Mar 2004]:
o Security: Fix Kerberos ciphersuite SSL/TLS handshaking bug o Security: Fix Kerberos ciphersuite SSL/TLS handshaking bug
o Security: Fix null-pointer assignment in do_change_cipher_spec() o Security: Fix null-pointer assignment in do_change_cipher_spec()
o Allow multiple active certificates with same subject in CA index o Allow multiple active certificates with same subject in CA index
o Multiple X509 verification fixes o Multiple X590 verification fixes
o Speed up HMAC and other operations o Speed up HMAC and other operations
Major changes between OpenSSL 0.9.7b and OpenSSL 0.9.7c [30 Sep 2003]: Major changes between OpenSSL 0.9.7b and OpenSSL 0.9.7c:
o Security: fix various ASN1 parsing bugs. o Security: fix various ASN1 parsing bugs.
o New -ignore_err option to OCSP utility. o New -ignore_err option to OCSP utility.
o Various interop and bug fixes in S/MIME code. o Various interop and bug fixes in S/MIME code.
o SSL/TLS protocol fix for unrequested client certificates. o SSL/TLS protocol fix for unrequested client certificates.
Major changes between OpenSSL 0.9.7a and OpenSSL 0.9.7b [10 Apr 2003]: Major changes between OpenSSL 0.9.7a and OpenSSL 0.9.7b:
o Security: counter the Klima-Pokorny-Rosa extension of o Security: counter the Klima-Pokorny-Rosa extension of
Bleichbacher's attack Bleichbacher's attack
@ -468,7 +31,7 @@
o ASN.1: treat domainComponent correctly. o ASN.1: treat domainComponent correctly.
o Documentation: fixes and additions. o Documentation: fixes and additions.
Major changes between OpenSSL 0.9.7 and OpenSSL 0.9.7a [19 Feb 2003]: Major changes between OpenSSL 0.9.7 and OpenSSL 0.9.7a:
o Security: Important security related bugfixes. o Security: Important security related bugfixes.
o Enhanced compatibility with MIT Kerberos. o Enhanced compatibility with MIT Kerberos.
@ -479,7 +42,7 @@
o SSL/TLS: now handles manual certificate chain building. o SSL/TLS: now handles manual certificate chain building.
o SSL/TLS: certain session ID malfunctions corrected. o SSL/TLS: certain session ID malfunctions corrected.
Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.7 [30 Dec 2002]: Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.7:
o New library section OCSP. o New library section OCSP.
o Complete rewrite of ASN1 code. o Complete rewrite of ASN1 code.
@ -525,23 +88,23 @@
o SSL/TLS: add callback to retrieve SSL/TLS messages. o SSL/TLS: add callback to retrieve SSL/TLS messages.
o SSL/TLS: support AES cipher suites (RFC3268). o SSL/TLS: support AES cipher suites (RFC3268).
Major changes between OpenSSL 0.9.6j and OpenSSL 0.9.6k [30 Sep 2003]: Major changes between OpenSSL 0.9.6j and OpenSSL 0.9.6k:
o Security: fix various ASN1 parsing bugs. o Security: fix various ASN1 parsing bugs.
o SSL/TLS protocol fix for unrequested client certificates. o SSL/TLS protocol fix for unrequested client certificates.
Major changes between OpenSSL 0.9.6i and OpenSSL 0.9.6j [10 Apr 2003]: Major changes between OpenSSL 0.9.6i and OpenSSL 0.9.6j:
o Security: counter the Klima-Pokorny-Rosa extension of o Security: counter the Klima-Pokorny-Rosa extension of
Bleichbacher's attack Bleichbacher's attack
o Security: make RSA blinding default. o Security: make RSA blinding default.
o Build: shared library support fixes. o Build: shared library support fixes.
Major changes between OpenSSL 0.9.6h and OpenSSL 0.9.6i [19 Feb 2003]: Major changes between OpenSSL 0.9.6h and OpenSSL 0.9.6i:
o Important security related bugfixes. o Important security related bugfixes.
Major changes between OpenSSL 0.9.6g and OpenSSL 0.9.6h [5 Dec 2002]: Major changes between OpenSSL 0.9.6g and OpenSSL 0.9.6h:
o New configuration targets for Tandem OSS and A/UX. o New configuration targets for Tandem OSS and A/UX.
o New OIDs for Microsoft attributes. o New OIDs for Microsoft attributes.
@ -555,25 +118,25 @@
o Fixes for smaller building problems. o Fixes for smaller building problems.
o Updates of manuals, FAQ and other instructive documents. o Updates of manuals, FAQ and other instructive documents.
Major changes between OpenSSL 0.9.6f and OpenSSL 0.9.6g [9 Aug 2002]: Major changes between OpenSSL 0.9.6f and OpenSSL 0.9.6g:
o Important building fixes on Unix. o Important building fixes on Unix.
Major changes between OpenSSL 0.9.6e and OpenSSL 0.9.6f [8 Aug 2002]: Major changes between OpenSSL 0.9.6e and OpenSSL 0.9.6f:
o Various important bugfixes. o Various important bugfixes.
Major changes between OpenSSL 0.9.6d and OpenSSL 0.9.6e [30 Jul 2002]: Major changes between OpenSSL 0.9.6d and OpenSSL 0.9.6e:
o Important security related bugfixes. o Important security related bugfixes.
o Various SSL/TLS library bugfixes. o Various SSL/TLS library bugfixes.
Major changes between OpenSSL 0.9.6c and OpenSSL 0.9.6d [9 May 2002]: Major changes between OpenSSL 0.9.6c and OpenSSL 0.9.6d:
o Various SSL/TLS library bugfixes. o Various SSL/TLS library bugfixes.
o Fix DH parameter generation for 'non-standard' generators. o Fix DH parameter generation for 'non-standard' generators.
Major changes between OpenSSL 0.9.6b and OpenSSL 0.9.6c [21 Dec 2001]: Major changes between OpenSSL 0.9.6b and OpenSSL 0.9.6c:
o Various SSL/TLS library bugfixes. o Various SSL/TLS library bugfixes.
o BIGNUM library fixes. o BIGNUM library fixes.
@ -586,7 +149,7 @@
Broadcom and Cryptographic Appliance's keyserver Broadcom and Cryptographic Appliance's keyserver
[in 0.9.6c-engine release]. [in 0.9.6c-engine release].
Major changes between OpenSSL 0.9.6a and OpenSSL 0.9.6b [9 Jul 2001]: Major changes between OpenSSL 0.9.6a and OpenSSL 0.9.6b:
o Security fix: PRNG improvements. o Security fix: PRNG improvements.
o Security fix: RSA OAEP check. o Security fix: RSA OAEP check.
@ -603,7 +166,7 @@
o Increase default size for BIO buffering filter. o Increase default size for BIO buffering filter.
o Compatibility fixes in some scripts. o Compatibility fixes in some scripts.
Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.6a [5 Apr 2001]: Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.6a:
o Security fix: change behavior of OpenSSL to avoid using o Security fix: change behavior of OpenSSL to avoid using
environment variables when running as root. environment variables when running as root.
@ -628,7 +191,7 @@
o New function BN_rand_range(). o New function BN_rand_range().
o Add "-rand" option to openssl s_client and s_server. o Add "-rand" option to openssl s_client and s_server.
Major changes between OpenSSL 0.9.5a and OpenSSL 0.9.6 [10 Oct 2000]: Major changes between OpenSSL 0.9.5a and OpenSSL 0.9.6:
o Some documentation for BIO and SSL libraries. o Some documentation for BIO and SSL libraries.
o Enhanced chain verification using key identifiers. o Enhanced chain verification using key identifiers.
@ -643,7 +206,7 @@
[1] The support for external crypto devices is currently a separate [1] The support for external crypto devices is currently a separate
distribution. See the file README.ENGINE. distribution. See the file README.ENGINE.
Major changes between OpenSSL 0.9.5 and OpenSSL 0.9.5a [1 Apr 2000]: Major changes between OpenSSL 0.9.5 and OpenSSL 0.9.5a:
o Bug fixes for Win32, SuSE Linux, NeXTSTEP and FreeBSD 2.2.8 o Bug fixes for Win32, SuSE Linux, NeXTSTEP and FreeBSD 2.2.8
o Shared library support for HPUX and Solaris-gcc o Shared library support for HPUX and Solaris-gcc
@ -652,7 +215,7 @@
o New 'rand' application o New 'rand' application
o New way to check for existence of algorithms from scripts o New way to check for existence of algorithms from scripts
Major changes between OpenSSL 0.9.4 and OpenSSL 0.9.5 [25 May 2000]: Major changes between OpenSSL 0.9.4 and OpenSSL 0.9.5:
o S/MIME support in new 'smime' command o S/MIME support in new 'smime' command
o Documentation for the OpenSSL command line application o Documentation for the OpenSSL command line application
@ -688,7 +251,7 @@
o Enhanced support for Alpha Linux o Enhanced support for Alpha Linux
o Experimental MacOS support o Experimental MacOS support
Major changes between OpenSSL 0.9.3 and OpenSSL 0.9.4 [9 Aug 1999]: Major changes between OpenSSL 0.9.3 and OpenSSL 0.9.4:
o Transparent support for PKCS#8 format private keys: these are used o Transparent support for PKCS#8 format private keys: these are used
by several software packages and are more secure than the standard by several software packages and are more secure than the standard
@ -699,7 +262,7 @@
o New pipe-like BIO that allows using the SSL library when actual I/O o New pipe-like BIO that allows using the SSL library when actual I/O
must be handled by the application (BIO pair) must be handled by the application (BIO pair)
Major changes between OpenSSL 0.9.2b and OpenSSL 0.9.3 [24 May 1999]: Major changes between OpenSSL 0.9.2b and OpenSSL 0.9.3:
o Lots of enhancements and cleanups to the Configuration mechanism o Lots of enhancements and cleanups to the Configuration mechanism
o RSA OEAP related fixes o RSA OEAP related fixes
o Added `openssl ca -revoke' option for revoking a certificate o Added `openssl ca -revoke' option for revoking a certificate
@ -713,7 +276,7 @@
o Sparc assembler bignum implementation, optimized hash functions o Sparc assembler bignum implementation, optimized hash functions
o Option to disable selected ciphers o Option to disable selected ciphers
Major changes between OpenSSL 0.9.1c and OpenSSL 0.9.2b [22 Mar 1999]: Major changes between OpenSSL 0.9.1c and OpenSSL 0.9.2b:
o Fixed a security hole related to session resumption o Fixed a security hole related to session resumption
o Fixed RSA encryption routines for the p < q case o Fixed RSA encryption routines for the p < q case
o "ALL" in cipher lists now means "everything except NULL ciphers" o "ALL" in cipher lists now means "everything except NULL ciphers"
@ -735,7 +298,7 @@
o Lots of memory leak fixes. o Lots of memory leak fixes.
o Lots of bug fixes. o Lots of bug fixes.
Major changes between SSLeay 0.9.0b and OpenSSL 0.9.1c [23 Dec 1998]: Major changes between SSLeay 0.9.0b and OpenSSL 0.9.1c:
o Integration of the popular NO_RSA/NO_DSA patches o Integration of the popular NO_RSA/NO_DSA patches
o Initial support for compression inside the SSL record layer o Initial support for compression inside the SSL record layer
o Added BIO proxy and filtering functionality o Added BIO proxy and filtering functionality

View File

@ -1,235 +0,0 @@
@echo off
rem ========================================================================
rem Batch file to automate building OpenSSL for NetWare.
rem
rem usage:
rem build [target] [debug opts] [assembly opts] [configure opts]
rem
rem target - "netware-clib" - CLib NetWare build (WinSock Sockets)
rem - "netware-clib-bsdsock" - CLib NetWare build (BSD Sockets)
rem - "netware-libc" - LibC NetWare build (WinSock Sockets)
rem - "netware-libc-bsdsock" - LibC NetWare build (BSD Sockets)
rem
rem debug opts - "debug" - build debug
rem
rem assembly opts - "nw-mwasm" - use Metrowerks assembler
rem - "nw-nasm" - use NASM assembler
rem - "no-asm" - don't use assembly
rem
rem configure opts- all unrecognized arguments are passed to the
rem perl configure script
rem
rem If no arguments are specified the default is to build non-debug with
rem no assembly. NOTE: there is no default BLD_TARGET.
rem
rem No assembly is the default - Uncomment section below to change
rem the assembler default
set ASM_MODE=
set ASSEMBLER=
set NO_ASM=no-asm
rem Uncomment to default to the Metrowerks assembler
rem set ASM_MODE=nw-mwasm
rem set ASSEMBLER=Metrowerks
rem set NO_ASM=
rem Uncomment to default to the NASM assembler
rem set ASM_MODE=nw-nasm
rem set ASSEMBLER=NASM
rem set NO_ASM=
rem No default Bld target
set BLD_TARGET=no_target
rem set BLD_TARGET=netware-clib
rem set BLD_TARGET=netware-libc
rem Default to build non-debug
set DEBUG=
rem Uncomment to default to debug build
rem set DEBUG=debug
set CONFIG_OPTS=
set ARG_PROCESSED=NO
rem Process command line args
:opts
if "a%1" == "a" goto endopt
if "%1" == "no-asm" set NO_ASM=no-asm
if "%1" == "no-asm" set ARG_PROCESSED=YES
if "%1" == "debug" set DEBUG=debug
if "%1" == "debug" set ARG_PROCESSED=YES
if "%1" == "nw-nasm" set ASM_MODE=nw-nasm
if "%1" == "nw-nasm" set ASSEMBLER=NASM
if "%1" == "nw-nasm" set NO_ASM=
if "%1" == "nw-nasm" set ARG_PROCESSED=YES
if "%1" == "nw-mwasm" set ASM_MODE=nw-mwasm
if "%1" == "nw-mwasm" set ASSEMBLER=Metrowerks
if "%1" == "nw-mwasm" set NO_ASM=
if "%1" == "nw-mwasm" set ARG_PROCESSED=YES
if "%1" == "netware-clib" set BLD_TARGET=netware-clib
if "%1" == "netware-clib" set ARG_PROCESSED=YES
if "%1" == "netware-clib-bsdsock" set BLD_TARGET=netware-clib-bsdsock
if "%1" == "netware-clib-bsdsock" set ARG_PROCESSED=YES
if "%1" == "netware-libc" set BLD_TARGET=netware-libc
if "%1" == "netware-libc" set ARG_PROCESSED=YES
if "%1" == "netware-libc-bsdsock" set BLD_TARGET=netware-libc-bsdsock
if "%1" == "netware-libc-bsdsock" set ARG_PROCESSED=YES
rem If we didn't recognize the argument, consider it an option for config
if "%ARG_PROCESSED%" == "NO" set CONFIG_OPTS=%CONFIG_OPTS% %1
if "%ARG_PROCESSED%" == "YES" set ARG_PROCESSED=NO
shift
goto opts
:endopt
rem make sure a valid BLD_TARGET was specified
if "%BLD_TARGET%" == "no_target" goto no_target
rem build the nlm make file name which includes target and debug info
set NLM_MAKE=
if "%BLD_TARGET%" == "netware-clib" set NLM_MAKE=netware\nlm_clib
if "%BLD_TARGET%" == "netware-clib-bsdsock" set NLM_MAKE=netware\nlm_clib_bsdsock
if "%BLD_TARGET%" == "netware-libc" set NLM_MAKE=netware\nlm_libc
if "%BLD_TARGET%" == "netware-libc-bsdsock" set NLM_MAKE=netware\nlm_libc_bsdsock
if "%DEBUG%" == "" set NLM_MAKE=%NLM_MAKE%.mak
if "%DEBUG%" == "debug" set NLM_MAKE=%NLM_MAKE%_dbg.mak
if "%NO_ASM%" == "no-asm" set ASM_MODE=
if "%NO_ASM%" == "no-asm" set ASSEMBLER=
if "%NO_ASM%" == "no-asm" set CONFIG_OPTS=%CONFIG_OPTS% no-asm
if "%NO_ASM%" == "no-asm" goto do_config
rem ==================================================
echo Generating x86 for %ASSEMBLER% assembler
echo Bignum
cd crypto\bn\asm
rem perl x86.pl %ASM_MODE% > bn-nw.asm
perl bn-586.pl %ASM_MODE% > bn-nw.asm
perl co-586.pl %ASM_MODE% > co-nw.asm
cd ..\..\..
echo AES
cd crypto\aes\asm
perl aes-586.pl %ASM_MODE% > a-nw.asm
cd ..\..\..
echo DES
cd crypto\des\asm
perl des-586.pl %ASM_MODE% > d-nw.asm
cd ..\..\..
echo "crypt(3)"
cd crypto\des\asm
perl crypt586.pl %ASM_MODE% > y-nw.asm
cd ..\..\..
echo Blowfish
cd crypto\bf\asm
perl bf-586.pl %ASM_MODE% > b-nw.asm
cd ..\..\..
echo CAST5
cd crypto\cast\asm
perl cast-586.pl %ASM_MODE% > c-nw.asm
cd ..\..\..
echo RC4
cd crypto\rc4\asm
perl rc4-586.pl %ASM_MODE% > r4-nw.asm
cd ..\..\..
echo MD5
cd crypto\md5\asm
perl md5-586.pl %ASM_MODE% > m5-nw.asm
cd ..\..\..
echo SHA1
cd crypto\sha\asm
perl sha1-586.pl %ASM_MODE% > s1-nw.asm
perl sha256-586.pl %ASM_MODE% > sha256-nw.asm
perl sha512-586.pl %ASM_MODE% > sha512-nw.asm
cd ..\..\..
echo RIPEMD160
cd crypto\ripemd\asm
perl rmd-586.pl %ASM_MODE% > rm-nw.asm
cd ..\..\..
echo RC5\32
cd crypto\rc5\asm
perl rc5-586.pl %ASM_MODE% > r5-nw.asm
cd ..\..\..
echo WHIRLPOOL
cd crypto\whrlpool\asm
perl wp-mmx.pl %ASM_MODE% > wp-nw.asm
cd ..\..\..
echo CPUID
cd crypto
perl x86cpuid.pl %ASM_MODE% > x86cpuid-nw.asm
cd ..\
rem ===============================================================
rem
:do_config
echo .
echo configure options: %CONFIG_OPTS% %BLD_TARGET%
echo .
perl configure %CONFIG_OPTS% %BLD_TARGET%
perl util\mkfiles.pl >MINFO
echo .
echo mk1mf.pl options: %DEBUG% %ASM_MODE% %CONFIG_OPTS% %BLD_TARGET%
echo .
perl util\mk1mf.pl %DEBUG% %ASM_MODE% %CONFIG_OPTS% %BLD_TARGET% >%NLM_MAKE%
make -f %NLM_MAKE% vclean
echo .
echo The makefile "%NLM_MAKE%" has been created use your maketool to
echo build (ex: make -f %NLM_MAKE%)
goto end
rem ===============================================================
rem
:no_target
echo .
echo . No build target specified!!!
echo .
echo . usage: build [target] [debug opts] [assembly opts] [configure opts]
echo .
echo . target - "netware-clib" - CLib NetWare build (WinSock Sockets)
echo . - "netware-clib-bsdsock" - CLib NetWare build (BSD Sockets)
echo . - "netware-libc" - LibC NetWare build (WinSock Sockets)
echo . - "netware-libc-bsdsock" - LibC NetWare build (BSD Sockets)
echo .
echo . debug opts - "debug" - build debug
echo .
echo . assembly opts - "nw-mwasm" - use Metrowerks assembler
echo . "nw-nasm" - use NASM assembler
echo . "no-asm" - don't use assembly
echo .
echo . configure opts- all unrecognized arguments are passed to the
echo . perl configure script
echo .
echo . If no debug or assembly opts are specified the default is to build
echo . non-debug without assembly
echo .
:end

View File

@ -1,113 +0,0 @@
@echo off
rem Batch file to copy OpenSSL stuff to a NetWare server for testing
rem This batch file will create an "opensssl" directory at the root of the
rem specified NetWare drive and copy the required files to run the tests.
rem It should be run from inside the "openssl\netware" subdirectory.
rem Usage:
rem cpy_tests.bat <test subdirectory> <NetWare drive>
rem <test subdirectory> - out_nw.dbg | out_nw
rem <NetWare drive> - any mapped drive letter
rem
rem example ( copy from debug build to m: dirve ):
rem cpy_tests.bat out_nw.dbg m:
rem
rem CAUTION: If a directory named OpenSSL exists on the target drive
rem it will be deleted first.
if "%1" == "" goto usage
if "%2" == "" goto usage
rem Assume running in \openssl directory unless cpy_tests.bat exists then
rem it must be the \openssl\netware directory
set loc=.
if exist cpy_tests.bat set loc=..
rem make sure the local build subdirectory specified is valid
if not exist %loc%\%1\NUL goto invalid_dir
rem make sure target drive is valid
if not exist %2\NUL goto invalid_drive
rem If an OpenSSL directory exists on the target drive, remove it
if exist %2\openssl\NUL goto remove_openssl
goto do_copy
:remove_openssl
echo .
echo OpenSSL directory exists on %2 - it will be removed!
pause
rmdir %2\openssl /s /q
:do_copy
rem make an "openssl" directory and others at the root of the NetWare drive
mkdir %2\openssl
mkdir %2\openssl\test_out
mkdir %2\openssl\apps
mkdir %2\openssl\certs
mkdir %2\openssl\test
rem copy the test nlms
copy %loc%\%1\*.nlm %2\openssl\
rem copy the test perl script
copy %loc%\netware\do_tests.pl %2\openssl\
rem copy the certs directory stuff
xcopy %loc%\certs\*.* %2\openssl\certs\ /s
rem copy the test directory stuff
copy %loc%\test\CAss.cnf %2\openssl\test\
copy %loc%\test\Uss.cnf %2\openssl\test\
copy %loc%\test\pkcs7.pem %2\openssl\test\
copy %loc%\test\pkcs7-1.pem %2\openssl\test\
copy %loc%\test\testcrl.pem %2\openssl\test\
copy %loc%\test\testp7.pem %2\openssl\test\
copy %loc%\test\testreq2.pem %2\openssl\test\
copy %loc%\test\testrsa.pem %2\openssl\test\
copy %loc%\test\testsid.pem %2\openssl\test\
copy %loc%\test\testx509.pem %2\openssl\test\
copy %loc%\test\v3-cert1.pem %2\openssl\test\
copy %loc%\test\v3-cert2.pem %2\openssl\test\
copy %loc%\crypto\evp\evptests.txt %2\openssl\test\
rem copy the apps directory stuff
copy %loc%\apps\client.pem %2\openssl\apps\
copy %loc%\apps\server.pem %2\openssl\apps\
copy %loc%\apps\openssl.cnf %2\openssl\apps\
echo .
echo Tests copied
echo Run the test script at the console by typing:
echo "Perl \openssl\do_tests.pl"
echo .
echo Make sure the Search path includes the OpenSSL subdirectory
goto end
:invalid_dir
echo.
echo Invalid build directory specified: %1
echo.
goto usage
:invalid_drive
echo.
echo Invalid drive: %2
echo.
goto usage
:usage
echo.
echo usage: cpy_tests.bat [test subdirectory] [NetWare drive]
echo [test subdirectory] - out_nw_clib.dbg, out_nw_libc.dbg, etc.
echo [NetWare drive] - any mapped drive letter
echo.
echo example: cpy_test out_nw_clib.dbg M:
echo (copy from clib debug build area to M: drive)
:end

View File

@ -1,624 +0,0 @@
# perl script to run OpenSSL tests
my $base_path = "\\openssl";
my $output_path = "$base_path\\test_out";
my $cert_path = "$base_path\\certs";
my $test_path = "$base_path\\test";
my $app_path = "$base_path\\apps";
my $tmp_cert = "$output_path\\cert.tmp";
my $OpenSSL_config = "$app_path\\openssl.cnf";
my $log_file = "$output_path\\tests.log";
my $pause = 0;
# process the command line args to see if they wanted us to pause
# between executing each command
foreach $i (@ARGV)
{
if ($i =~ /^-p$/)
{ $pause=1; }
}
main();
############################################################################
sub main()
{
# delete all the output files in the output directory
unlink <$output_path\\*.*>;
# open the main log file
open(OUT, ">$log_file") || die "unable to open $log_file\n";
print( OUT "========================================================\n");
my $outFile = "$output_path\\version.out";
system("openssl2 version (CLIB_OPT)/>$outFile");
log_output("CHECKING FOR OPENSSL VERSION:", $outFile);
algorithm_tests();
encryption_tests();
evp_tests();
pem_tests();
verify_tests();
ca_tests();
ssl_tests();
close(OUT);
print("\nCompleted running tests.\n\n");
print("Check log file for errors: $log_file\n");
}
############################################################################
sub algorithm_tests
{
my $i;
my $outFile;
my @tests = ( rsa_test, destest, ideatest, bftest, bntest, shatest, sha1test,
sha256t, sha512t, dsatest, md2test, md4test, md5test, mdc2test,
rc2test, rc4test, rc5test, randtest, rmdtest, dhtest, ecdhtest,
ecdsatest, ectest, exptest, casttest, hmactest );
print( "\nRUNNING CRYPTO ALGORITHM TESTS:\n\n");
print( OUT "\n========================================================\n");
print( OUT "CRYPTO ALGORITHM TESTS:\n\n");
foreach $i (@tests)
{
if (-e "$base_path\\$i.nlm")
{
$outFile = "$output_path\\$i.out";
system("$i (CLIB_OPT)/>$outFile");
log_desc("Test: $i\.nlm:");
log_output("", $outFile );
}
else
{
log_desc("Test: $i\.nlm: file not found");
}
}
}
############################################################################
sub encryption_tests
{
my $i;
my $outFile;
my @enc_tests = ( "enc", "rc4", "des-cfb", "des-ede-cfb", "des-ede3-cfb",
"des-ofb", "des-ede-ofb", "des-ede3-ofb",
"des-ecb", "des-ede", "des-ede3", "des-cbc",
"des-ede-cbc", "des-ede3-cbc", "idea-ecb", "idea-cfb",
"idea-ofb", "idea-cbc", "rc2-ecb", "rc2-cfb",
"rc2-ofb", "rc2-cbc", "bf-ecb", "bf-cfb",
"bf-ofb", "bf-cbc" );
my $input = "$base_path\\do_tests.pl";
my $cipher = "$output_path\\cipher.out";
my $clear = "$output_path\\clear.out";
print( "\nRUNNING ENCRYPTION & DECRYPTION TESTS:\n\n");
print( OUT "\n========================================================\n");
print( OUT "FILE ENCRYPTION & DECRYPTION TESTS:\n\n");
foreach $i (@enc_tests)
{
log_desc("Testing: $i");
# do encryption
$outFile = "$output_path\\enc.out";
system("openssl2 $i -e -bufsize 113 -k test -in $input -out $cipher (CLIB_OPT)/>$outFile" );
log_output("Encrypting: $input --> $cipher", $outFile);
# do decryption
$outFile = "$output_path\\dec.out";
system("openssl2 $i -d -bufsize 157 -k test -in $cipher -out $clear (CLIB_OPT)/>$outFile");
log_output("Decrypting: $cipher --> $clear", $outFile);
# compare files
$x = compare_files( $input, $clear, 1);
if ( $x == 0 )
{
print( "\rSUCCESS - files match: $input, $clear\n");
print( OUT "SUCCESS - files match: $input, $clear\n");
}
else
{
print( "\rERROR: files don't match\n");
print( OUT "ERROR: files don't match\n");
}
do_wait();
# Now do the same encryption but use Base64
# do encryption B64
$outFile = "$output_path\\B64enc.out";
system("openssl2 $i -a -e -bufsize 113 -k test -in $input -out $cipher (CLIB_OPT)/>$outFile");
log_output("Encrypting(B64): $cipher --> $clear", $outFile);
# do decryption B64
$outFile = "$output_path\\B64dec.out";
system("openssl2 $i -a -d -bufsize 157 -k test -in $cipher -out $clear (CLIB_OPT)/>$outFile");
log_output("Decrypting(B64): $cipher --> $clear", $outFile);
# compare files
$x = compare_files( $input, $clear, 1);
if ( $x == 0 )
{
print( "\rSUCCESS - files match: $input, $clear\n");
print( OUT "SUCCESS - files match: $input, $clear\n");
}
else
{
print( "\rERROR: files don't match\n");
print( OUT "ERROR: files don't match\n");
}
do_wait();
} # end foreach
# delete the temporary files
unlink($cipher);
unlink($clear);
}
############################################################################
sub pem_tests
{
my $i;
my $tmp_out;
my $outFile = "$output_path\\pem.out";
my %pem_tests = (
"crl" => "testcrl.pem",
"pkcs7" => "testp7.pem",
"req" => "testreq2.pem",
"rsa" => "testrsa.pem",
"x509" => "testx509.pem",
"x509" => "v3-cert1.pem",
"sess_id" => "testsid.pem" );
print( "\nRUNNING PEM TESTS:\n\n");
print( OUT "\n========================================================\n");
print( OUT "PEM TESTS:\n\n");
foreach $i (keys(%pem_tests))
{
log_desc( "Testing: $i");
my $input = "$test_path\\$pem_tests{$i}";
$tmp_out = "$output_path\\$pem_tests{$i}";
if ($i ne "req" )
{
system("openssl2 $i -in $input -out $tmp_out (CLIB_OPT)/>$outFile");
log_output( "openssl2 $i -in $input -out $tmp_out", $outFile);
}
else
{
system("openssl2 $i -in $input -out $tmp_out -config $OpenSSL_config (CLIB_OPT)/>$outFile");
log_output( "openssl2 $i -in $input -out $tmp_out -config $OpenSSL_config", $outFile );
}
$x = compare_files( $input, $tmp_out);
if ( $x == 0 )
{
print( "\rSUCCESS - files match: $input, $tmp_out\n");
print( OUT "SUCCESS - files match: $input, $tmp_out\n");
}
else
{
print( "\rERROR: files don't match\n");
print( OUT "ERROR: files don't match\n");
}
do_wait();
} # end foreach
}
############################################################################
sub verify_tests
{
my $i;
my $outFile = "$output_path\\verify.out";
$cert_path =~ s/\\/\//g;
my @cert_files = <$cert_path/*.pem>;
print( "\nRUNNING VERIFY TESTS:\n\n");
print( OUT "\n========================================================\n");
print( OUT "VERIFY TESTS:\n\n");
make_tmp_cert_file();
foreach $i (@cert_files)
{
system("openssl2 verify -CAfile $tmp_cert $i (CLIB_OPT)/>$outFile");
log_desc("Verifying cert: $i");
log_output("openssl2 verify -CAfile $tmp_cert $i", $outFile);
}
}
############################################################################
sub ssl_tests
{
my $outFile = "$output_path\\ssl_tst.out";
my($CAcert) = "$output_path\\certCA.ss";
my($Ukey) = "$output_path\\keyU.ss";
my($Ucert) = "$output_path\\certU.ss";
my($ssltest)= "ssltest -key $Ukey -cert $Ucert -c_key $Ukey -c_cert $Ucert -CAfile $CAcert";
print( "\nRUNNING SSL TESTS:\n\n");
print( OUT "\n========================================================\n");
print( OUT "SSL TESTS:\n\n");
system("ssltest -ssl2 (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2:");
log_output("ssltest -ssl2", $outFile);
system("$ssltest -ssl2 -server_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2 with server authentication:");
log_output("$ssltest -ssl2 -server_auth", $outFile);
system("$ssltest -ssl2 -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2 with client authentication:");
log_output("$ssltest -ssl2 -client_auth", $outFile);
system("$ssltest -ssl2 -server_auth -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2 with both client and server authentication:");
log_output("$ssltest -ssl2 -server_auth -client_auth", $outFile);
system("ssltest -ssl3 (CLIB_OPT)/>$outFile");
log_desc("Testing sslv3:");
log_output("ssltest -ssl3", $outFile);
system("$ssltest -ssl3 -server_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv3 with server authentication:");
log_output("$ssltest -ssl3 -server_auth", $outFile);
system("$ssltest -ssl3 -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv3 with client authentication:");
log_output("$ssltest -ssl3 -client_auth", $outFile);
system("$ssltest -ssl3 -server_auth -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv3 with both client and server authentication:");
log_output("$ssltest -ssl3 -server_auth -client_auth", $outFile);
system("ssltest (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2/sslv3:");
log_output("ssltest", $outFile);
system("$ssltest -server_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2/sslv3 with server authentication:");
log_output("$ssltest -server_auth", $outFile);
system("$ssltest -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2/sslv3 with client authentication:");
log_output("$ssltest -client_auth ", $outFile);
system("$ssltest -server_auth -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2/sslv3 with both client and server authentication:");
log_output("$ssltest -server_auth -client_auth", $outFile);
system("ssltest -bio_pair -ssl2 (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2 via BIO pair:");
log_output("ssltest -bio_pair -ssl2", $outFile);
system("ssltest -bio_pair -dhe1024dsa -v (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2/sslv3 with 1024 bit DHE via BIO pair:");
log_output("ssltest -bio_pair -dhe1024dsa -v", $outFile);
system("$ssltest -bio_pair -ssl2 -server_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2 with server authentication via BIO pair:");
log_output("$ssltest -bio_pair -ssl2 -server_auth", $outFile);
system("$ssltest -bio_pair -ssl2 -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2 with client authentication via BIO pair:");
log_output("$ssltest -bio_pair -ssl2 -client_auth", $outFile);
system("$ssltest -bio_pair -ssl2 -server_auth -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2 with both client and server authentication via BIO pair:");
log_output("$ssltest -bio_pair -ssl2 -server_auth -client_auth", $outFile);
system("ssltest -bio_pair -ssl3 (CLIB_OPT)/>$outFile");
log_desc("Testing sslv3 via BIO pair:");
log_output("ssltest -bio_pair -ssl3", $outFile);
system("$ssltest -bio_pair -ssl3 -server_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv3 with server authentication via BIO pair:");
log_output("$ssltest -bio_pair -ssl3 -server_auth", $outFile);
system("$ssltest -bio_pair -ssl3 -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv3 with client authentication via BIO pair:");
log_output("$ssltest -bio_pair -ssl3 -client_auth", $outFile);
system("$ssltest -bio_pair -ssl3 -server_auth -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv3 with both client and server authentication via BIO pair:");
log_output("$ssltest -bio_pair -ssl3 -server_auth -client_auth", $outFile);
system("ssltest -bio_pair (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2/sslv3 via BIO pair:");
log_output("ssltest -bio_pair", $outFile);
system("$ssltest -bio_pair -server_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2/sslv3 with server authentication via BIO pair:");
log_output("$ssltest -bio_pair -server_auth", $outFile);
system("$ssltest -bio_pair -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2/sslv3 with client authentication via BIO pair:");
log_output("$ssltest -bio_pair -client_auth", $outFile);
system("$ssltest -bio_pair -server_auth -client_auth (CLIB_OPT)/>$outFile");
log_desc("Testing sslv2/sslv3 with both client and server authentication via BIO pair:");
log_output("$ssltest -bio_pair -server_auth -client_auth", $outFile);
}
############################################################################
sub ca_tests
{
my $outFile = "$output_path\\ca_tst.out";
my($CAkey) = "$output_path\\keyCA.ss";
my($CAcert) = "$output_path\\certCA.ss";
my($CAserial) = "$output_path\\certCA.srl";
my($CAreq) = "$output_path\\reqCA.ss";
my($CAreq2) = "$output_path\\req2CA.ss";
my($CAconf) = "$test_path\\CAss.cnf";
my($Uconf) = "$test_path\\Uss.cnf";
my($Ukey) = "$output_path\\keyU.ss";
my($Ureq) = "$output_path\\reqU.ss";
my($Ucert) = "$output_path\\certU.ss";
print( "\nRUNNING CA TESTS:\n\n");
print( OUT "\n========================================================\n");
print( OUT "CA TESTS:\n");
system("openssl2 req -config $CAconf -out $CAreq -keyout $CAkey -new (CLIB_OPT)/>$outFile");
log_desc("Make a certificate request using req:");
log_output("openssl2 req -config $CAconf -out $CAreq -keyout $CAkey -new", $outFile);
system("openssl2 x509 -CAcreateserial -in $CAreq -days 30 -req -out $CAcert -signkey $CAkey (CLIB_OPT)/>$outFile");
log_desc("Convert the certificate request into a self signed certificate using x509:");
log_output("openssl2 x509 -CAcreateserial -in $CAreq -days 30 -req -out $CAcert -signkey $CAkey", $outFile);
system("openssl2 x509 -in $CAcert -x509toreq -signkey $CAkey -out $CAreq2 (CLIB_OPT)/>$outFile");
log_desc("Convert a certificate into a certificate request using 'x509':");
log_output("openssl2 x509 -in $CAcert -x509toreq -signkey $CAkey -out $CAreq2", $outFile);
system("openssl2 req -config $OpenSSL_config -verify -in $CAreq -noout (CLIB_OPT)/>$outFile");
log_output("openssl2 req -config $OpenSSL_config -verify -in $CAreq -noout", $outFile);
system("openssl2 req -config $OpenSSL_config -verify -in $CAreq2 -noout (CLIB_OPT)/>$outFile");
log_output( "openssl2 req -config $OpenSSL_config -verify -in $CAreq2 -noout", $outFile);
system("openssl2 verify -CAfile $CAcert $CAcert (CLIB_OPT)/>$outFile");
log_output("openssl2 verify -CAfile $CAcert $CAcert", $outFile);
system("openssl2 req -config $Uconf -out $Ureq -keyout $Ukey -new (CLIB_OPT)/>$outFile");
log_desc("Make another certificate request using req:");
log_output("openssl2 req -config $Uconf -out $Ureq -keyout $Ukey -new", $outFile);
system("openssl2 x509 -CAcreateserial -in $Ureq -days 30 -req -out $Ucert -CA $CAcert -CAkey $CAkey -CAserial $CAserial (CLIB_OPT)/>$outFile");
log_desc("Sign certificate request with the just created CA via x509:");
log_output("openssl2 x509 -CAcreateserial -in $Ureq -days 30 -req -out $Ucert -CA $CAcert -CAkey $CAkey -CAserial $CAserial", $outFile);
system("openssl2 verify -CAfile $CAcert $Ucert (CLIB_OPT)/>$outFile");
log_output("openssl2 verify -CAfile $CAcert $Ucert", $outFile);
system("openssl2 x509 -subject -issuer -startdate -enddate -noout -in $Ucert (CLIB_OPT)/>$outFile");
log_desc("Certificate details");
log_output("openssl2 x509 -subject -issuer -startdate -enddate -noout -in $Ucert", $outFile);
print(OUT "--\n");
print(OUT "The generated CA certificate is $CAcert\n");
print(OUT "The generated CA private key is $CAkey\n");
print(OUT "The current CA signing serial number is in $CAserial\n");
print(OUT "The generated user certificate is $Ucert\n");
print(OUT "The generated user private key is $Ukey\n");
print(OUT "--\n");
}
############################################################################
sub evp_tests
{
my $i = 'evp_test';
print( "\nRUNNING EVP TESTS:\n\n");
print( OUT "\n========================================================\n");
print( OUT "EVP TESTS:\n\n");
if (-e "$base_path\\$i.nlm")
{
my $outFile = "$output_path\\$i.out";
system("$i $test_path\\evptests.txt (CLIB_OPT)/>$outFile");
log_desc("Test: $i\.nlm:");
log_output("", $outFile );
}
else
{
log_desc("Test: $i\.nlm: file not found");
}
}
############################################################################
sub log_output( $ $ )
{
my( $desc, $file ) = @_;
my($error) = 0;
my($key);
my($msg);
if ($desc)
{
print("\r$desc\n");
print(OUT "$desc\n");
}
# loop waiting for test program to complete
while ( stat($file) == 0)
{ print(". "); sleep(1); }
# copy test output to log file
open(IN, "<$file");
while (<IN>)
{
print(OUT $_);
if ( $_ =~ /ERROR/ )
{
$error = 1;
}
}
# close and delete the temporary test output file
close(IN);
unlink($file);
if ( $error == 0 )
{
$msg = "Test Succeeded";
}
else
{
$msg = "Test Failed";
}
print(OUT "$msg\n");
if ($pause)
{
print("$msg - press ENTER to continue...");
$key = getc;
print("\n");
}
# Several of the testing scripts run a loop loading the
# same NLM with different options.
# On slow NetWare machines there appears to be some delay in the
# OS actually unloading the test nlms and the OS complains about.
# the NLM already being loaded. This additional pause is to
# to help provide a little more time for unloading before trying to
# load again.
sleep(1);
}
############################################################################
sub log_desc( $ )
{
my( $desc ) = @_;
print("\n");
print("$desc\n");
print(OUT "\n");
print(OUT "$desc\n");
print(OUT "======================================\n");
}
############################################################################
sub compare_files( $ $ $ )
{
my( $file1, $file2, $binary ) = @_;
my( $n1, $n2, $b1, $b2 );
my($ret) = 1;
open(IN0, $file1) || die "\nunable to open $file1\n";
open(IN1, $file2) || die "\nunable to open $file2\n";
if ($binary)
{
binmode IN0;
binmode IN1;
}
for (;;)
{
$n1 = read(IN0, $b1, 512);
$n2 = read(IN1, $b2, 512);
if ($n1 != $n2) {last;}
if ($b1 != $b2) {last;}
if ($n1 == 0)
{
$ret = 0;
last;
}
}
close(IN0);
close(IN1);
return($ret);
}
############################################################################
sub do_wait()
{
my($key);
if ($pause)
{
print("Press ENTER to continue...");
$key = getc;
print("\n");
}
}
############################################################################
sub make_tmp_cert_file()
{
my @cert_files = <$cert_path/*.pem>;
# delete the file if it already exists
unlink($tmp_cert);
open( TMP_CERT, ">$tmp_cert") || die "\nunable to open $tmp_cert\n";
print("building temporary cert file\n");
# create a temporary cert file that contains all the certs
foreach $i (@cert_files)
{
open( IN_CERT, $i ) || die "\nunable to open $i\n";
for(;;)
{
$n = sysread(IN_CERT, $data, 1024);
if ($n == 0)
{
close(IN_CERT);
last;
};
syswrite(TMP_CERT, $data, $n);
}
}
close( TMP_CERT );
}

View File

@ -1,254 +0,0 @@
An initial review of the OpenSSL code was done to determine how many
global variables where present. The idea was to determine the amount of
work required to pull the globals into an instance data structure in
order to build a Library NLM for NetWare. This file contains the results
of the review. Each file is listed along with the globals in the file.
The initial review was done very quickly so this list is probably
not a comprehensive list.
cryptlib.c
===========================================
static STACK *app_locks=NULL;
static STACK_OF(CRYPTO_dynlock) *dyn_locks=NULL;
static void (MS_FAR *locking_callback)(int mode,int type,
const char *file,int line)=NULL;
static int (MS_FAR *add_lock_callback)(int *pointer,int amount,
int type,const char *file,int line)=NULL;
static unsigned long (MS_FAR *id_callback)(void)=NULL;
static struct CRYPTO_dynlock_value *(MS_FAR *dynlock_create_callback)
(const char *file,int line)=NULL;
static void (MS_FAR *dynlock_lock_callback)(int mode,
struct CRYPTO_dynlock_value *l, const char *file,int line)=NULL;
static void (MS_FAR *dynlock_destroy_callback)(struct CRYPTO_dynlock_value *l,
const char *file,int line)=NULL;
mem.c
===========================================
static int allow_customize = 1; /* we provide flexible functions for */
static int allow_customize_debug = 1;/* exchanging memory-related functions at
/* may be changed as long as `allow_customize' is set */
static void *(*malloc_locked_func)(size_t) = malloc;
static void (*free_locked_func)(void *) = free;
static void *(*malloc_func)(size_t) = malloc;
static void *(*realloc_func)(void *, size_t)= realloc;
static void (*free_func)(void *) = free;
/* use default functions from mem_dbg.c */
static void (*malloc_debug_func)(void *,int,const char *,int,int)
= CRYPTO_dbg_malloc;
static void (*realloc_debug_func)(void *,void *,int,const char *,int,int)
= CRYPTO_dbg_realloc;
static void (*free_debug_func)(void *,int) = CRYPTO_dbg_free;
static void (*set_debug_options_func)(long) = CRYPTO_dbg_set_options;
static long (*get_debug_options_func)(void) = CRYPTO_dbg_get_options;
mem_dbg.c
===========================================
static int mh_mode=CRYPTO_MEM_CHECK_OFF;
static unsigned long order = 0; /* number of memory requests */
static LHASH *mh=NULL; /* hash-table of memory requests (address as key) */
static LHASH *amih=NULL; /* hash-table with those app_mem_info_st's */
static long options = /* extra information to be recorded */
static unsigned long disabling_thread = 0;
err.c
===========================================
static LHASH *error_hash=NULL;
static LHASH *thread_hash=NULL;
several files have routines with static "init" to track if error strings
have been loaded ( may not want seperate error strings for each process )
The "init" variable can't be left "global" because the error has is a ptr
that is malloc'ed. The malloc'ed error has is dependant on the "init"
vars.
files:
pem_err.c
cpt_err.c
pk12err.c
asn1_err.c
bio_err.c
bn_err.c
buf_err.c
comp_err.c
conf_err.c
cpt_err.c
dh_err.c
dsa_err.c
dso_err.c
evp_err.c
obj_err.c
pkcs7err.c
rand_err.c
rsa_err.c
rsar_err.c
ssl_err.c
x509_err.c
v3err.c
err.c
These file have similar "init" globals but they are for other stuff not
error strings:
bn_lib.c
ecc_enc.c
s23_clnt.c
s23_meth.c
s23_srvr.c
s2_clnt.c
s2_lib.c
s2_meth.c
s2_srvr.c
s3_clnt.c
s3_lib.c
s3_srvr.c
t1_clnt.c
t1_meth.c
t1_srvr.c
rand_lib.c
===========================================
static RAND_METHOD *rand_meth= &rand_ssleay_meth;
md_rand.c
===========================================
static int state_num=0,state_index=0;
static unsigned char state[STATE_SIZE+MD_DIGEST_LENGTH];
static unsigned char md[MD_DIGEST_LENGTH];
static long md_count[2]={0,0};
static double entropy=0;
static int initialized=0;
/* This should be set to 1 only when ssleay_rand_add() is called inside
an already locked state, so it doesn't try to lock and thereby cause
a hang. And it should always be reset back to 0 before unlocking. */
static int add_do_not_lock=0;
obj_dat.c
============================================
static int new_nid=NUM_NID;
static LHASH *added=NULL;
b_sock.c
===========================================
static unsigned long BIO_ghbn_hits=0L;
static unsigned long BIO_ghbn_miss=0L;
static struct ghbn_cache_st
{
char name[129];
struct hostent *ent;
unsigned long order;
} ghbn_cache[GHBN_NUM];
static int wsa_init_done=0;
bio_lib.c
===========================================
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *bio_meth=NULL;
static int bio_meth_num=0;
bn_lib.c
========================================
static int bn_limit_bits=0;
static int bn_limit_num=8; /* (1<<bn_limit_bits) */
static int bn_limit_bits_low=0;
static int bn_limit_num_low=8; /* (1<<bn_limit_bits_low) */
static int bn_limit_bits_high=0;
static int bn_limit_num_high=8; /* (1<<bn_limit_bits_high) */
static int bn_limit_bits_mont=0;
static int bn_limit_num_mont=8; /* (1<<bn_limit_bits_mont) */
conf_lib.c
========================================
static CONF_METHOD *default_CONF_method=NULL;
dh_lib.c
========================================
static DH_METHOD *default_DH_method;
static int dh_meth_num = 0;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *dh_meth = NULL;
dsa_lib.c
========================================
static DSA_METHOD *default_DSA_method;
static int dsa_meth_num = 0;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *dsa_meth = NULL;
dso_lib.c
========================================
static DSO_METHOD *default_DSO_meth = NULL;
rsa_lib.c
========================================
static RSA_METHOD *default_RSA_meth=NULL;
static int rsa_meth_num=0;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *rsa_meth=NULL;
x509_trs.c
=======================================
static int (*default_trust)(int id, X509 *x, int flags) = obj_trust;
static STACK_OF(X509_TRUST) *trtable = NULL;
x509_req.c
=======================================
static int *ext_nids = ext_nid_list;
o_names.c
======================================
static LHASH *names_lh=NULL;
static STACK_OF(NAME_FUNCS) *name_funcs_stack;
static int free_type;
static int names_type_num=OBJ_NAME_TYPE_NUM;
th-lock.c - NEED to add support for locking for NetWare
==============================================
static long *lock_count;
(other platform specific globals)
x_x509.c
==============================================
static int x509_meth_num = 0;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *x509_meth = NULL;
evp_pbe.c
============================================
static STACK *pbe_algs;
evp_key.c
============================================
static char prompt_string[80];
ssl_ciph.c
============================================
static STACK_OF(SSL_COMP) *ssl_comp_methods=NULL;
ssl_lib.c
=============================================
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_meth=NULL;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_ctx_meth=NULL;
static int ssl_meth_num=0;
static int ssl_ctx_meth_num=0;
ssl_sess.c
=============================================
static int ssl_session_num=0;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_session_meth=NULL;
x509_vfy.c
============================================
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *x509_store_ctx_method=NULL;
static int x509_store_ctx_num=0;

View File

@ -1,19 +0,0 @@
Contents of the openssl\netware directory
==========================================
Regular files:
readme.txt - this file
do_tests.pl - perl script used to run the OpenSSL tests on NetWare
cpy_tests.bat - batch to to copy test stuff to NetWare server
build.bat - batch file to help with builds
set_env.bat - batch file to help setup build environments
globals.txt - results of initial code review to identify OpenSSL global variables
The following files are generated by the various scripts. They are
recreated each time and it is okay to delete them.
*.def - command files used by Metrowerks linker
*.mak - make files generated by mk1mf.pl

View File

@ -1,112 +0,0 @@
@echo off
rem ========================================================================
rem Batch file to assist in setting up the necessary enviroment for
rem building OpenSSL for NetWare.
rem
rem usage:
rem set_env [target]
rem
rem target - "netware-clib" - Clib build
rem - "netware-libc" - LibC build
rem
rem
if "a%1" == "a" goto usage
set LIBC_BUILD=
set CLIB_BUILD=
set GNUC=
if "%1" == "netware-clib" set CLIB_BUILD=Y
if "%1" == "netware-clib" set LIBC_BUILD=
if "%1" == "netware-libc" set LIBC_BUILD=Y
if "%1" == "netware-libc" set CLIB_BUILD=
if "%2" == "gnuc" set GNUC=Y
if "%2" == "codewarrior" set GNUC=
rem Location of tools (compiler, linker, etc)
if "%NDKBASE%" == "" set NDKBASE=c:\Novell
rem If Perl for Win32 is not already in your path, add it here
set PERL_PATH=
rem Define path to the Metrowerks command line tools
rem or GNU Crosscompiler gcc / nlmconv
rem ( compiler, assembler, linker)
if "%GNUC%" == "Y" set COMPILER_PATH=c:\usr\i586-netware\bin;c:\usr\bin
if "%GNUC%" == "" set COMPILER_PATH=c:\prg\cwcmdl40
rem If using gnu make define path to utility
rem set GNU_MAKE_PATH=%NDKBASE%\gnu
set GNU_MAKE_PATH=c:\prg\tools
rem If using ms nmake define path to nmake
rem set MS_NMAKE_PATH=%NDKBASE%\msvc\600\bin
rem If using NASM assembler define path
rem set NASM_PATH=%NDKBASE%\nasm
set NASM_PATH=c:\prg\tools
rem Update path to include tool paths
set path=%path%;%COMPILER_PATH%
if not "%GNU_MAKE_PATH%" == "" set path=%path%;%GNU_MAKE_PATH%
if not "%MS_NMAKE_PATH%" == "" set path=%path%;%MS_NMAKE_PATH%
if not "%NASM_PATH%" == "" set path=%path%;%NASM_PATH%
if not "%PERL_PATH%" == "" set path=%path%;%PERL_PATH%
rem Set INCLUDES to location of Novell NDK includes
if "%LIBC_BUILD%" == "Y" set INCLUDE=%NDKBASE%\ndk\libc\include;%NDKBASE%\ndk\libc\include\winsock
if "%CLIB_BUILD%" == "Y" set INCLUDE=%NDKBASE%\ndk\nwsdk\include\nlm;%NDKBASE%\ws295sdk\include
rem Set Imports to location of Novell NDK import files
if "%LIBC_BUILD%" == "Y" set IMPORTS=%NDKBASE%\ndk\libc\imports
if "%CLIB_BUILD%" == "Y" set IMPORTS=%NDKBASE%\ndk\nwsdk\imports
rem Set PRELUDE to the absolute path of the prelude object to link with in
rem the Metrowerks NetWare PDK - NOTE: for Clib builds "clibpre.o" is
rem recommended, for LibC NKS builds libcpre.o must be used
if "%GNUC%" == "Y" goto gnuc
if "%LIBC_BUILD%" == "Y" set PRELUDE=%IMPORTS%\libcpre.o
rem if "%CLIB_BUILD%" == "Y" set PRELUDE=%IMPORTS%\clibpre.o
if "%CLIB_BUILD%" == "Y" set PRELUDE=%IMPORTS%\prelude.o
echo using MetroWerks CodeWarrior
goto info
:gnuc
if "%LIBC_BUILD%" == "Y" set PRELUDE=%IMPORTS%\libcpre.gcc.o
rem if "%CLIB_BUILD%" == "Y" set PRELUDE=%IMPORTS%\clibpre.gcc.o
if "%CLIB_BUILD%" == "Y" set PRELUDE=%IMPORTS%\prelude.gcc.o
echo using GNU GCC Compiler
:info
echo.
if "%LIBC_BUILD%" == "Y" echo Enviroment configured for LibC build
if "%LIBC_BUILD%" == "Y" echo use "netware\build.bat netware-libc ..."
if "%CLIB_BUILD%" == "Y" echo Enviroment configured for CLib build
if "%CLIB_BUILD%" == "Y" echo use "netware\build.bat netware-clib ..."
goto end
:usage
rem ===============================================================
echo.
echo No target build specified!
echo.
echo usage: set_env [target] [compiler]
echo.
echo target - "netware-clib" - Clib build
echo - "netware-libc" - LibC build
echo.
echo compiler - "gnuc" - GNU GCC Compiler
echo - "codewarrior" - MetroWerks CodeWarrior (default)
echo.
:end
echo.

116
PROBLEMS
View File

@ -36,9 +36,7 @@ may differ on your machine.
As long as Apple doesn't fix the problem with ld, this problem building As long as Apple doesn't fix the problem with ld, this problem building
OpenSSL will remain as is. Well, the problem was addressed in 0.9.8f by OpenSSL will remain as is.
passing -Wl,-search_paths_first, but it's unknown if the flag was
supported from the initial MacOS X release.
* Parallell make leads to errors * Parallell make leads to errors
@ -50,34 +48,20 @@ will interfere with each other and lead to test failure.
The solution is simple for now: don't run parallell make when testing. The solution is simple for now: don't run parallell make when testing.
* Bugs in gcc triggered * Bugs in gcc 3.0 triggered
- According to a problem report, there are bugs in gcc 3.0 that are According to a problem report, there are bugs in gcc 3.0 that are
triggered by some of the code in OpenSSL, more specifically in triggered by some of the code in OpenSSL, more specifically in
PEM_get_EVP_CIPHER_INFO(). The triggering code is the following: PEM_get_EVP_CIPHER_INFO(). The triggering code is the following:
header+=11; header+=11;
if (*header != '4') return(0); header++; if (*header != '4') return(0); header++;
if (*header != ',') return(0); header++; if (*header != ',') return(0); header++;
What happens is that gcc might optimize a little too agressively, and What happens is that gcc might optimize a little too agressively, and
you end up with an extra incrementation when *header != '4'. you end up with an extra incrementation when *header != '4'.
We recommend that you upgrade gcc to as high a 3.x version as you can. We recommend that you upgrade gcc to as high a 3.x version as you can.
- According to multiple problem reports, some of our message digest
implementations trigger bug[s] in code optimizer in gcc 3.3 for sparc64
and gcc 2.96 for ppc. Former fails to complete RIPEMD160 test, while
latter - SHA one.
The recomendation is to upgrade your compiler. This naturally applies to
other similar cases.
- There is a subtle Solaris x86-specific gcc run-time environment bug, which
"falls between" OpenSSL [0.9.8 and later], Solaris ld and GCC. The bug
manifests itself as Segmentation Fault upon early application start-up.
The problem can be worked around by patching the environment according to
http://www.openssl.org/~appro/values.c.
* solaris64-sparcv9-cc SHA-1 performance with WorkShop 6 compiler. * solaris64-sparcv9-cc SHA-1 performance with WorkShop 6 compiler.
@ -106,6 +90,15 @@ failures in other parts of the code.
Workaround: modify the target to +O2 when building with no-asm. Workaround: modify the target to +O2 when building with no-asm.
* Poor support for AIX shared builds.
do_aix-shared rule is not flexible enough to parameterize through a
config-line. './Configure aix43-cc shared' is working, but not
'./Configure aix64-gcc shared'. In latter case make fails to create shared
libraries. It's possible to build 64-bit shared libraries by running
'env OBJECT_MODE=64 make', but we need more elegant solution. Preferably one
supporting even gcc shared builds. See RT#463 for background information.
* Problems building shared libraries on SCO OpenServer Release 5.0.6 * Problems building shared libraries on SCO OpenServer Release 5.0.6
with gcc 2.95.3 with gcc 2.95.3
@ -136,78 +129,3 @@ Any information helping to solve this issue would be deeply
appreciated. appreciated.
NOTE: building non-shared doesn't come with this problem. NOTE: building non-shared doesn't come with this problem.
* ULTRIX build fails with shell errors, such as "bad substitution"
and "test: argument expected"
The problem is caused by ULTRIX /bin/sh supporting only original
Bourne shell syntax/semantics, and the trouble is that the vast
majority is so accustomed to more modern syntax, that very few
people [if any] would recognize the ancient syntax even as valid.
This inevitably results in non-trivial scripts breaking on ULTRIX,
and OpenSSL isn't an exclusion. Fortunately there is workaround,
hire /bin/ksh to do the job /bin/sh fails to do.
1. Trick make(1) to use /bin/ksh by setting up following environ-
ment variables *prior* you execute ./Configure and make:
PROG_ENV=POSIX
MAKESHELL=/bin/ksh
export PROG_ENV MAKESHELL
or if your shell is csh-compatible:
setenv PROG_ENV POSIX
setenv MAKESHELL /bin/ksh
2. Trick /bin/sh to use alternative expression evaluator. Create
following 'test' script for example in /tmp:
#!/bin/ksh
${0##*/} "$@"
Then 'chmod a+x /tmp/test; ln /tmp/test /tmp/[' and *prepend*
your $PATH with chosen location, e.g. PATH=/tmp:$PATH. Alter-
natively just replace system /bin/test and /bin/[ with the
above script.
* hpux64-ia64-cc fails blowfish test.
Compiler bug, presumably at particular patch level. It should be noted
that same compiler generates correct 32-bit code, a.k.a. hpux-ia64-cc
target. Drop optimization level to +O2 when compiling 64-bit bf_skey.o.
* no-engines generates errors.
Unfortunately, the 'no-engines' configuration option currently doesn't
work properly. Use 'no-hw' and you'll will at least get no hardware
support. We'll see how we fix that on OpenSSL versions past 0.9.8.
* 'make test' fails in BN_sqr [commonly with "error 139" denoting SIGSEGV]
if elder GNU binutils were deployed to link shared libcrypto.so.
As subject suggests the failure is caused by a bug in elder binutils,
either as or ld, and was observed on FreeBSD and Linux. There are two
options. First is naturally to upgrade binutils, the second one - to
reconfigure with additional no-sse2 [or 386] option passed to ./config.
* If configured with ./config no-dso, toolkit still gets linked with -ldl,
which most notably poses a problem when linking with dietlibc.
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

180
README
View File

@ -1,7 +1,7 @@
OpenSSL 1.0.1t-dev OpenSSL 0.9.7d 17 Mar 2004
Copyright (c) 1998-2015 The OpenSSL Project Copyright (c) 1998-2004 The OpenSSL Project
Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson
All rights reserved. All rights reserved.
@ -10,17 +10,17 @@
The OpenSSL Project is a collaborative effort to develop a robust, The OpenSSL Project is a collaborative effort to develop a robust,
commercial-grade, fully featured, and Open Source toolkit implementing the commercial-grade, fully featured, and Open Source toolkit implementing the
Secure Sockets Layer (SSLv3) and Transport Layer Security (TLS) protocols as Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1)
well as a full-strength general purpose cryptograpic library. The project is protocols as well as a full-strength general purpose cryptography library.
managed by a worldwide community of volunteers that use the Internet to The project is managed by a worldwide community of volunteers that use the
communicate, plan, and develop the OpenSSL toolkit and its related Internet to communicate, plan, and develop the OpenSSL toolkit and its
documentation. related documentation.
OpenSSL is descended from the SSLeay library developed by Eric A. Young OpenSSL is based on the excellent SSLeay library developed from Eric A. Young
and Tim J. Hudson. The OpenSSL toolkit is licensed under a dual-license (the and Tim J. Hudson. The OpenSSL toolkit is licensed under a dual-license (the
OpenSSL license plus the SSLeay license), which means that you are free to OpenSSL license plus the SSLeay license) situation, which basically means
get and use it for commercial and non-commercial purposes as long as you that you are free to get and use it for commercial and non-commercial
fulfill the conditions of both licenses. purposes as long as you fulfill the conditions of both licenses.
OVERVIEW OVERVIEW
-------- --------
@ -28,41 +28,110 @@
The OpenSSL toolkit includes: The OpenSSL toolkit includes:
libssl.a: libssl.a:
Provides the client and server-side implementations for SSLv3 and TLS. Implementation of SSLv2, SSLv3, TLSv1 and the required code to support
both SSLv2, SSLv3 and TLSv1 in the one server and client.
libcrypto.a: libcrypto.a:
Provides general cryptographic and X.509 support needed by SSL/TLS but General encryption and X.509 v1/v3 stuff needed by SSL/TLS but not
not logically part of it. actually logically part of it. It includes routines for the following:
Ciphers
libdes - EAY's libdes DES encryption package which has been floating
around the net for a few years. It includes 15
'modes/variations' of DES (1, 2 and 3 key versions of ecb,
cbc, cfb and ofb; pcbc and a more general form of cfb and
ofb) including desx in cbc mode, a fast crypt(3), and
routines to read passwords from the keyboard.
RC4 encryption,
RC2 encryption - 4 different modes, ecb, cbc, cfb and ofb.
Blowfish encryption - 4 different modes, ecb, cbc, cfb and ofb.
IDEA encryption - 4 different modes, ecb, cbc, cfb and ofb.
Digests
MD5 and MD2 message digest algorithms, fast implementations,
SHA (SHA-0) and SHA-1 message digest algorithms,
MDC2 message digest. A DES based hash that is popular on smart cards.
Public Key
RSA encryption/decryption/generation.
There is no limit on the number of bits.
DSA encryption/decryption/generation.
There is no limit on the number of bits.
Diffie-Hellman key-exchange/key generation.
There is no limit on the number of bits.
X.509v3 certificates
X509 encoding/decoding into/from binary ASN1 and a PEM
based ASCII-binary encoding which supports encryption with a
private key. Program to generate RSA and DSA certificate
requests and to generate RSA and DSA certificates.
Systems
The normal digital envelope routines and base64 encoding. Higher
level access to ciphers and digests by name. New ciphers can be
loaded at run time. The BIO io system which is a simple non-blocking
IO abstraction. Current methods supported are file descriptors,
sockets, socket accept, socket connect, memory buffer, buffering, SSL
client/server, file pointer, encryption, digest, non-blocking testing
and null.
Data structures
A dynamically growing hashing system
A simple stack.
A Configuration loader that uses a format similar to MS .ini files.
openssl: openssl:
A command line tool that can be used for: A command line tool that can be used for:
Creation of key parameters Creation of RSA, DH and DSA key parameters
Creation of X.509 certificates, CSRs and CRLs Creation of X.509 certificates, CSRs and CRLs
Calculation of message digests Calculation of Message Digests
Encryption and decryption Encryption and Decryption with Ciphers
SSL/TLS client and server tests SSL/TLS Client and Server Tests
Handling of S/MIME signed or encrypted mail Handling of S/MIME signed or encrypted mail
And more...
PATENTS
-------
Various companies hold various patents for various algorithms in various
locations around the world. _YOU_ are responsible for ensuring that your use
of any algorithms is legal by checking if there are any patents in your
country. The file contains some of the patents that we know about or are
rumored to exist. This is not a definitive list.
RSA Security holds software patents on the RC5 algorithm. If you
intend to use this cipher, you must contact RSA Security for
licensing conditions. Their web page is http://www.rsasecurity.com/.
RC4 is a trademark of RSA Security, so use of this label should perhaps
only be used with RSA Security's permission.
The IDEA algorithm is patented by Ascom in Austria, France, Germany, Italy,
Japan, the Netherlands, Spain, Sweden, Switzerland, UK and the USA. They
should be contacted if that algorithm is to be used; their web page is
http://www.ascom.ch/.
INSTALLATION INSTALLATION
------------ ------------
See the appropriate file: To install this package under a Unix derivative, read the INSTALL file. For
INSTALL Linux, Unix, etc. a Win32 platform, read the INSTALL.W32 file. For OpenVMS systems, read
INSTALL.DJGPP DOS platform with DJGPP INSTALL.VMS.
INSTALL.NW Netware
INSTALL.OS2 OS/2 Read the documentation in the doc/ directory. It is quite rough, but it
INSTALL.VMS VMS lists the functions; you will probably have to look at the code to work out
INSTALL.W32 Windows (32bit) how to use them. Look at the example programs.
INSTALL.W64 Windows (64bit)
INSTALL.WCE Windows CE PROBLEMS
--------
For some platforms, there are some known problems that may affect the user
or application author. We try to collect those in doc/PROBLEMS, with current
thoughts on how they should be solved in a future of OpenSSL.
SUPPORT SUPPORT
------- -------
See the OpenSSL website www.openssl.org for details on how to obtain
commercial technical support.
If you have any problems with OpenSSL then please take the following steps If you have any problems with OpenSSL then please take the following steps
first: first:
@ -84,36 +153,35 @@
- Problem Description (steps that will reproduce the problem, if known) - Problem Description (steps that will reproduce the problem, if known)
- Stack Traceback (if the application dumps core) - Stack Traceback (if the application dumps core)
Email the report to: Report the bug to the OpenSSL project via the Request Tracker
(http://www.openssl.org/support/rt2.html) by mail to:
rt@openssl.org openssl-bugs@openssl.org
In order to avoid spam, this is a moderated mailing list, and it might Note that mail to openssl-bugs@openssl.org is recorded in the publicly
take a day for the ticket to show up. (We also scan posts to make sure readable request tracker database and is forwarded to a public
that security disclosures aren't publically posted by mistake.) Mail mailing list. Confidential mail may be sent to openssl-security@openssl.org
to this address is recorded in the public RT (request tracker) database (PGP key available from the key servers).
(see https://www.openssl.org/community/index.html#bugs for details) and
also forwarded the public openssl-dev mailing list. Confidential mail
may be sent to openssl-security@openssl.org (PGP key available from the
key servers).
Please do NOT use this for general assistance or support queries.
Just because something doesn't work the way you expect does not mean it
is necessarily a bug in OpenSSL.
You can also make GitHub pull requests. If you do this, please also send
mail to rt@openssl.org with a link to the PR so that we can more easily
keep track of it.
HOW TO CONTRIBUTE TO OpenSSL HOW TO CONTRIBUTE TO OpenSSL
---------------------------- ----------------------------
See CONTRIBUTING Development is coordinated on the openssl-dev mailing list (see
http://www.openssl.org for information on subscribing). If you
would like to submit a patch, send it to openssl-dev@openssl.org with
the string "[PATCH]" in the subject. Please be sure to include a
textual explanation of what your patch does.
LEGALITIES Note: For legal reasons, contributions from the US can be accepted only
---------- if a TSA notification and a copy of the patch is sent to crypt@bis.doc.gov;
see http://www.bis.doc.gov/Encryption/PubAvailEncSourceCodeNofify.html [sic]
and http://w3.access.gpo.gov/bis/ear/pdf/740.pdf (EAR Section 740.13(e)).
A number of nations, in particular the U.S., restrict the use or export The preferred format for changes is "diff -u" output. You might
of cryptography. If you are potentially subject to such restrictions generate it like this:
you should seek competent professional legal advice before attempting to
develop or distribute cryptographic code. # cd openssl-work
# [your changes]
# ./Configure dist; make clean
# cd ..
# diff -ur openssl-orig openssl-work > mydiffs.patch

113
STATUS Normal file
View File

@ -0,0 +1,113 @@
OpenSSL STATUS Last modified at
______________ $Date: 2004/03/23 15:00:59 $
DEVELOPMENT STATE
o OpenSSL 0.9.8: Under development...
o OpenSSL 0.9.7d: Released on March 17th, 2004
o OpenSSL 0.9.7c: Released on September 30th, 2003
o OpenSSL 0.9.7b: Released on April 10th, 2003
o OpenSSL 0.9.7a: Released on February 19th, 2003
o OpenSSL 0.9.7: Released on December 31st, 2002
o OpenSSL 0.9.6m: Released on March 17th, 2004
o OpenSSL 0.9.6l: Released on November 4th, 2003
o OpenSSL 0.9.6k: Released on September 30th, 2003
o OpenSSL 0.9.6j: Released on April 10th, 2003
o OpenSSL 0.9.6i: Released on February 19th, 2003
o OpenSSL 0.9.6h: Released on December 5th, 2002
o OpenSSL 0.9.6g: Released on August 9th, 2002
o OpenSSL 0.9.6f: Released on August 8th, 2002
o OpenSSL 0.9.6e: Released on July 30th, 2002
o OpenSSL 0.9.6d: Released on May 9th, 2002
o OpenSSL 0.9.6c: Released on December 21st, 2001
o OpenSSL 0.9.6b: Released on July 9th, 2001
o OpenSSL 0.9.6a: Released on April 5th, 2001
o OpenSSL 0.9.6: Released on September 24th, 2000
o OpenSSL 0.9.5a: Released on April 1st, 2000
o OpenSSL 0.9.5: Released on February 28th, 2000
o OpenSSL 0.9.4: Released on August 09th, 1999
o OpenSSL 0.9.3a: Released on May 29th, 1999
o OpenSSL 0.9.3: Released on May 25th, 1999
o OpenSSL 0.9.2b: Released on March 22th, 1999
o OpenSSL 0.9.1c: Released on December 23th, 1998
[See also http://www.openssl.org/support/rt2.html]
RELEASE SHOWSTOPPERS
o
AVAILABLE PATCHES
o
IN PROGRESS
o Steve is currently working on (in no particular order):
ASN1 code redesign, butchery, replacement.
OCSP
EVP cipher enhancement.
Enhanced certificate chain verification.
Private key, certificate and CRL API and implementation.
Developing and bugfixing PKCS#7 (S/MIME code).
Various X509 issues: character sets, certificate request extensions.
o Geoff and Richard are currently working on:
ENGINE (the new code that gives hardware support among others).
o Richard is currently working on:
UI (User Interface)
UTIL (a new set of library functions to support some higher level
functionality that is currently missing).
Shared library support for VMS.
Kerberos 5 authentication (Heimdal)
Constification
NEEDS PATCH
o apps/ca.c: "Sign the certificate?" - "n" creates empty certificate file
o "OpenSSL STATUS" is never up-to-date.
OPEN ISSUES
o The Makefile hierarchy and build mechanism is still not a round thing:
1. The config vs. Configure scripts
It's the same nasty situation as for Apache with APACI vs.
src/Configure. It confuses.
Suggestion: Merge Configure and config into a single configure
script with a Autoconf style interface ;-) and remove
Configure and config. Or even let us use GNU Autoconf
itself. Then we can avoid a lot of those platform checks
which are currently in Configure.
o Support for Shared Libraries has to be added at least
for the major Unix platforms. The details we can rip from the stuff
Ralf has done for the Apache src/Configure script. Ben wants the
solution to be really simple.
Status: Ralf will look how we can easily incorporate the
compiler PIC and linker DSO flags from Apache
into the OpenSSL Configure script.
Ulf: +1 for using GNU autoconf and libtool (but not automake,
which apparently is not flexible enough to generate
libcrypto)
WISHES
o Add variants of DH_generate_parameters() and BN_generate_prime() [etc?]
where the callback function can request that the function be aborted.
[Gregory Stark <ghstark@pobox.com>, <rayyang2000@yahoo.com>]
o SRP in TLS.
[wished by:
Dj <derek@yo.net>, Tom Wu <tom@arcot.com>,
Tom Holroyd <tomh@po.crl.go.jp>]
See http://search.ietf.org/internet-drafts/draft-ietf-tls-srp-00.txt
as well as http://www-cs-students.stanford.edu/~tjw/srp/.
Tom Holroyd tells us there is a SRP patch for OpenSSH at
http://members.tripod.com/professor_tom/archives/, that could
be useful.

5891
TABLE

File diff suppressed because it is too large Load Diff

View File

@ -1,34 +0,0 @@
#! /usr/bin/perl
use strict;
use warnings;
my @directory_vars = ( "dir", "certs", "crl_dir", "new_certs_dir" );
my @file_vars = ( "database", "certificate", "serial", "crlnumber",
"crl", "private_key", "RANDFILE" );
while(<STDIN>) {
chomp;
foreach my $d (@directory_vars) {
if (/^(\s*\#?\s*${d}\s*=\s*)\.\/([^\s\#]*)([\s\#].*)$/) {
$_ = "$1sys\\\$disk:\[.$2$3";
} elsif (/^(\s*\#?\s*${d}\s*=\s*)(\w[^\s\#]*)([\s\#].*)$/) {
$_ = "$1sys\\\$disk:\[.$2$3";
}
s/^(\s*\#?\s*${d}\s*=\s*\$\w+)\/([^\s\#]*)([\s\#].*)$/$1.$2\]$3/;
while(/^(\s*\#?\s*${d}\s*=\s*(\$\w+\.|sys\\\$disk:\[\.)[\w\.]+)\/([^\]]*)\](.*)$/) {
$_ = "$1.$3]$4";
}
}
foreach my $f (@file_vars) {
s/^(\s*\#?\s*${f}\s*=\s*)\.\/(.*)$/$1sys\\\$disk:\[\/$2/;
while(/^(\s*\#?\s*${f}\s*=\s*(\$\w+|sys\\\$disk:\[)[^\/]*)\/(\w+\/[^\s\#]*)([\s\#].*)$/) {
$_ = "$1.$3$4";
}
if (/^(\s*\#?\s*${f}\s*=\s*(\$\w+|sys\\\$disk:\[)[^\/]*)\/(\w+)([\s\#].*)$/) {
$_ = "$1]$3.$4";
} elsif (/^(\s*\#?\s*${f}\s*=\s*(\$\w+|sys\\\$disk:\[)[^\/]*)\/([^\s\#]*)([\s\#].*)$/) {
$_ = "$1]$3$4";
}
}
print $_,"\n";
}

View File

@ -1,67 +0,0 @@
$! install-vms.com -- Installs the files in a given directory tree
$!
$! Author: Richard Levitte <richard@levitte.org>
$! Time of creation: 23-MAY-1998 19:22
$!
$! P1 root of the directory tree
$!
$!
$! Announce/identify.
$!
$ proc = f$environment( "procedure")
$ write sys$output "@@@ "+ -
f$parse( proc, , , "name")+ f$parse( proc, , , "type")
$!
$ on error then goto tidy
$ on control_c then goto tidy
$!
$ if p1 .eqs. ""
$ then
$ write sys$output "First argument missing."
$ write sys$output -
"Should be the directory where you want things installed."
$ exit
$ endif
$
$ if (f$getsyi( "cpu") .lt. 128)
$ then
$ arch = "VAX"
$ else
$ arch = f$edit( f$getsyi( "arch_name"), "upcase")
$ if (arch .eqs. "") then arch = "UNK"
$ endif
$
$ root = f$parse( P1, "[]A.;0", , , "SYNTAX_ONLY, NO_CONCEAL")- "A.;0"
$ root_dev = f$parse( root, , , "device", "syntax_only")
$ root_dir = f$parse( root, , , "directory", "syntax_only") - -
"[000000." - "][" - "[" - "]"
$ root = root_dev + "[" + root_dir
$
$ define /nolog wrk_sslroot 'root'.] /translation_attributes = concealed
$ define /nolog wrk_sslinclude wrk_sslroot:[include]
$
$ if f$parse( "wrk_sslroot:[000000]") .eqs. "" then -
create /directory /log wrk_sslroot:[000000]
$ if f$parse( "wrk_sslinclude:") .eqs. "" then -
create /directory /log wrk_sslinclude:
$ if f$parse( "wrk_sslroot:[vms]") .eqs. "" then -
create /directory /log wrk_sslroot:[vms]
$!
$ copy /log /protection = world:re openssl_startup.com wrk_sslroot:[vms]
$ copy /log /protection = world:re openssl_undo.com wrk_sslroot:[vms]
$ copy /log /protection = world:re openssl_utils.com wrk_sslroot:[vms]
$!
$ tidy:
$!
$ call deass wrk_sslroot
$ call deass wrk_sslinclude
$!
$ exit
$!
$ deass: subroutine
$ if (f$trnlnm( p1, "LNM$PROCESS") .nes. "")
$ then
$ deassign /process 'p1'
$ endif
$ endsubroutine
$!

72
VMS/install.com Normal file
View File

@ -0,0 +1,72 @@
$! INSTALL.COM -- Installs the files in a given directory tree
$!
$! Author: Richard Levitte <richard@levitte.org>
$! Time of creation: 23-MAY-1998 19:22
$!
$! P1 root of the directory tree
$!
$ IF P1 .EQS. ""
$ THEN
$ WRITE SYS$OUTPUT "First argument missing."
$ WRITE SYS$OUTPUT "Should be the directory where you want things installed."
$ EXIT
$ ENDIF
$
$ ROOT = F$PARSE(P1,"[]A.;0",,,"SYNTAX_ONLY,NO_CONCEAL") - "A.;0"
$ ROOT_DEV = F$PARSE(ROOT,,,"DEVICE","SYNTAX_ONLY")
$ ROOT_DIR = F$PARSE(ROOT,,,"DIRECTORY","SYNTAX_ONLY") -
- "[000000." - "][" - "[" - "]"
$ ROOT = ROOT_DEV + "[" + ROOT_DIR
$
$ DEFINE/NOLOG WRK_SSLROOT 'ROOT'.] /TRANS=CONC
$ DEFINE/NOLOG WRK_SSLVLIB WRK_SSLROOT:[VAX_LIB]
$ DEFINE/NOLOG WRK_SSLALIB WRK_SSLROOT:[ALPHA_LIB]
$ DEFINE/NOLOG WRK_SSLINCLUDE WRK_SSLROOT:[INCLUDE]
$ DEFINE/NOLOG WRK_SSLVEXE WRK_SSLROOT:[VAX_EXE]
$ DEFINE/NOLOG WRK_SSLAEXE WRK_SSLROOT:[ALPHA_EXE]
$ DEFINE/NOLOG WRK_SSLCERTS WRK_SSLROOT:[CERTS]
$ DEFINE/NOLOG WRK_SSLPRIVATE WRK_SSLROOT:[PRIVATE]
$
$ IF F$PARSE("WRK_SSLROOT:[000000]") .EQS. "" THEN -
CREATE/DIR/LOG WRK_SSLROOT:[000000]
$ IF F$PARSE("WRK_SSLINCLUDE:") .EQS. "" THEN -
CREATE/DIR/LOG WRK_SSLINCLUDE:
$ IF F$PARSE("WRK_SSLROOT:[VMS]") .EQS. "" THEN -
CREATE/DIR/LOG WRK_SSLROOT:[VMS]
$
$ IF F$SEARCH("WRK_SSLINCLUDE:vms_idhacks.h") .NES. "" THEN -
DELETE WRK_SSLINCLUDE:vms_idhacks.h;*
$
$ OPEN/WRITE SF WRK_SSLROOT:[VMS]OPENSSL_STARTUP.COM
$ WRITE SYS$OUTPUT "%OPEN-I-CREATED, ",F$SEARCH("WRK_SSLROOT:[VMS]OPENSSL_STARTUP.COM")," created."
$ WRITE SF "$! Startup file for Openssl 0.9.2-RL 15-Mar-1999"
$ WRITE SF "$!"
$ WRITE SF "$! Do not edit this file, as it will be regenerated during next installation."
$ WRITE SF "$! Instead, add or change SSLROOT:[VMS]OPENSSL_SYSTARTUP.COM"
$ WRITE SF "$!"
$ WRITE SF "$! P1 a qualifier to DEFINE. For example ""/SYSTEM"" to get the logical names"
$ WRITE SF "$! defined in the system logical name table."
$ WRITE SF "$!"
$ WRITE SF "$ ARCH = ""VAX"""
$ WRITE SF "$ IF F$GETSYI(""CPU"") .GE. 128 THEN ARCH = ""ALPHA"""
$ WRITE SF "$ DEFINE/NOLOG'P1 SSLROOT ",ROOT,".] /TRANS=CONC"
$ WRITE SF "$ DEFINE/NOLOG'P1 SSLLIB SSLROOT:['ARCH'_LIB]"
$ WRITE SF "$ DEFINE/NOLOG'P1 SSLINCLUDE SSLROOT:[INCLUDE]"
$ WRITE SF "$ DEFINE/NOLOG'P1 SSLEXE SSLROOT:['ARCH'_EXE]"
$ WRITE SF "$ DEFINE/NOLOG'P1 SSLCERTS SSLROOT:[CERTS]"
$ WRITE SF "$ DEFINE/NOLOG'P1 SSLPRIVATE SSLROOT:[PRIVATE]"
$ WRITE SF "$"
$ WRITE SF "$! This is program can include <openssl/{foo}.h>"
$ WRITE SF "$ DEFINE/NOLOG'P1 OPENSSL SSLINCLUDE:"
$ WRITE SF "$"
$ WRITE SF "$ IF F$SEARCH(""SSLROOT:[VMS]OPENSSL_SYSTARTUP.COM"") .NES."""" THEN -"
$ WRITE SF " @SSLROOT:[VMS]OPENSSL_SYSTARTUP.COM"
$ WRITE SF "$"
$ WRITE SF "$ EXIT"
$ CLOSE SF
$ SET FILE/PROT=WORLD:RE WRK_SSLROOT:[VMS]OPENSSL_STARTUP.COM
$
$ COPY OPENSSL_UTILS.COM WRK_SSLROOT:[VMS]/LOG
$ SET FILE/PROT=WORLD:RE WRK_SSLROOT:[VMS]OPENSSL_UTILS.COM
$
$ EXIT

View File

@ -1,168 +1,77 @@
$! MKSHARED.COM -- Create shareable images. $! MKSHARED.COM -- script to created shareable images on VMS
$! $!
$! P1: "64" for 64-bit pointers. $! No command line parameters. This should be run at the start of the source
$! tree (the same directory where one finds INSTALL.VMS).
$! $!
$! P2: Zlib object library path (optional). $! Input: [.UTIL]LIBEAY.NUM,[.AXP.EXE.CRYPTO]LIBCRYPTO.OLB
$! $! [.UTIL]SSLEAY.NUM,[.AXP.EXE.SSL]LIBSSL.OLB
$! Input: [.UTIL]LIBEAY.NUM,[.xxx.EXE.CRYPTO]SSL_LIBCRYPTO[32].OLB $! Output: [.AXP.EXE.CRYPTO]LIBCRYPTO.OPT,.MAP,.EXE
$! [.UTIL]SSLEAY.NUM,[.xxx.EXE.SSL]SSL_LIBSSL[32].OLB $! [.AXP.EXE.SSL]LIBSSL.OPT,.MAP,.EXE
$! [.CRYPTO.xxx]OPENSSLCONF.H
$! Output: [.xxx.EXE.CRYPTO]SSL_LIBCRYPTO_SHR[32].OPT,.MAP,.EXE
$! [.xxx.EXE.SSL]SSL_LIBSSL_SRH[32].OPT,.MAP,.EXE
$! $!
$! So far, tests have only been made on VMS for Alpha. VAX will come in time. $! So far, tests have only been made on VMS for Alpha. VAX will come in time.
$! =========================================================================== $! ===========================================================================
$! $
$! Announce/identify.
$!
$ proc = f$environment( "procedure")
$ write sys$output "@@@ "+ -
f$parse( proc, , , "name")+ f$parse( proc, , , "type")
$!
$! Save the original default device:[directory].
$!
$ def_orig = f$environment( "default")
$ on error then goto tidy
$ on control_c then goto tidy
$!
$! SET DEFAULT to the main kit directory.
$!
$ proc = f$environment("procedure")
$ proc = f$parse( "A.;", proc)- "A.;"
$ set default 'proc'
$ set default [-]
$!
$! ----- Prepare info for processing: version number and file info $! ----- Prepare info for processing: version number and file info
$ gosub read_version_info $ gosub read_version_info
$ if libver .eqs. "" $ if libver .eqs. ""
$ then $ then
$ write sys$error "ERROR: Couldn't find any library version info..." $ write sys$error "ERROR: Couldn't find any library version info..."
$ go to tidy: $ exit
$ endif $ endif
$ $
$ if (f$getsyi("cpu") .lt. 128) $ if f$getsyi("CPU") .ge. 128
$ then $ then
$ arch_vax = 1 $ libid = "Crypto"
$ arch = "VAX" $ libnum = "[.UTIL]LIBEAY.NUM"
$ libdir = "[.AXP.EXE.CRYPTO]"
$ libolb = "''libdir'LIBCRYPTO.OLB"
$ libopt = "''libdir'LIBCRYPTO.OPT"
$ libmap = "''libdir'LIBCRYPTO.MAP"
$ libgoal= "''libdir'LIBCRYPTO.EXE"
$ libref = ""
$ gosub create_axp_shr
$ libid = "SSL"
$ libnum = "[.UTIL]SSLEAY.NUM"
$ libdir = "[.AXP.EXE.SSL]"
$ libolb = "''libdir'LIBSSL.OLB"
$ libopt = "''libdir'LIBSSL.OPT"
$ libmap = "''libdir'LIBSSL.MAP"
$ libgoal= "''libdir'LIBSSL.EXE"
$ libref = "[.AXP.EXE.CRYPTO]LIBCRYPTO.EXE"
$ gosub create_axp_shr
$ else $ else
$ arch_vax = 0
$ arch = f$edit( f$getsyi( "ARCH_NAME"), "UPCASE")
$ if (arch .eqs. "") then arch = "UNK"
$ endif
$!
$ archd = arch
$ lib32 = "32"
$ shr = "SHR32"
$!
$ if (p1 .nes. "")
$ then
$ if (p1 .eqs. "64")
$ then
$ archd = arch+ "_64"
$ lib32 = ""
$ shr = "SHR"
$ else
$ if (p1 .nes. "32")
$ then
$ write sys$output "Second argument invalid."
$ write sys$output "It should be "32", "64", or nothing."
$ exit
$ endif
$ endif
$ endif
$!
$! ----- Prepare info for processing: disabled algorithms info
$ gosub read_disabled_algorithms_info
$!
$ ZLIB = p2
$ zlib_lib = ""
$ if (ZLIB .nes. "")
$ then
$ file2 = f$parse( ZLIB, "libz.olb", , , "syntax_only")
$ if (f$search( file2) .eqs. "")
$ then
$ write sys$output ""
$ write sys$output "The Option ", ZLIB, " Is Invalid."
$ write sys$output " Can't find library: ''file2'"
$ write sys$output ""
$ goto tidy
$ endif
$ zlib_lib = ", ''file2' /library"
$ endif
$!
$ if (arch_vax)
$ then
$ libtit = "CRYPTO_TRANSFER_VECTOR" $ libtit = "CRYPTO_TRANSFER_VECTOR"
$ libid = "Crypto" $ libid = "Crypto"
$ libnum = "[.UTIL]LIBEAY.NUM" $ libnum = "[.UTIL]LIBEAY.NUM"
$ libdir = "[.''ARCHD'.EXE.CRYPTO]" $ libdir = "[.VAX.EXE.CRYPTO]"
$ libmar = "''libdir'SSL_LIBCRYPTO_''shr'.MAR" $ libmar = "''libdir'LIBCRYPTO.MAR"
$ libolb = "''libdir'SSL_LIBCRYPTO''lib32'.OLB" $ libolb = "''libdir'LIBCRYPTO.OLB"
$ libopt = "''libdir'SSL_LIBCRYPTO_''shr'.OPT" $ libopt = "''libdir'LIBCRYPTO.OPT"
$ libobj = "''libdir'SSL_LIBCRYPTO_''shr'.OBJ" $ libobj = "''libdir'LIBCRYPTO.OBJ"
$ libmap = "''libdir'SSL_LIBCRYPTO_''shr'.MAP" $ libmap = "''libdir'LIBCRYPTO.MAP"
$ libgoal= "''libdir'SSL_LIBCRYPTO_''shr'.EXE" $ libgoal= "''libdir'LIBCRYPTO.EXE"
$ libref = "" $ libref = ""
$ libvec = "LIBCRYPTO" $ libvec = "LIBCRYPTO"
$ if f$search( libolb) .nes. "" then gosub create_vax_shr $ gosub create_vax_shr
$ libtit = "SSL_TRANSFER_VECTOR" $ libtit = "SSL_TRANSFER_VECTOR"
$ libid = "SSL" $ libid = "SSL"
$ libnum = "[.UTIL]SSLEAY.NUM" $ libnum = "[.UTIL]SSLEAY.NUM"
$ libdir = "[.''ARCHD'.EXE.SSL]" $ libdir = "[.VAX.EXE.SSL]"
$ libmar = "''libdir'SSL_LIBSSL_''shr'.MAR" $ libmar = "''libdir'LIBSSL.MAR"
$ libolb = "''libdir'SSL_LIBSSL''lib32'.OLB" $ libolb = "''libdir'LIBSSL.OLB"
$ libopt = "''libdir'SSL_LIBSSL_''shr'.OPT" $ libopt = "''libdir'LIBSSL.OPT"
$ libobj = "''libdir'SSL_LIBSSL_''shr'.OBJ" $ libobj = "''libdir'LIBSSL.OBJ"
$ libmap = "''libdir'SSL_LIBSSL_''shr'.MAP" $ libmap = "''libdir'LIBSSL.MAP"
$ libgoal= "''libdir'SSL_LIBSSL_''shr'.EXE" $ libgoal= "''libdir'LIBSSL.EXE"
$ libref = "[.''ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO_''shr'.EXE" $ libref = "[.VAX.EXE.CRYPTO]LIBCRYPTO.EXE"
$ libvec = "LIBSSL" $ libvec = "LIBSSL"
$ if f$search( libolb) .nes. "" then gosub create_vax_shr $ gosub create_vax_shr
$ else
$ libid = "Crypto"
$ libnum = "[.UTIL]LIBEAY.NUM"
$ libdir = "[.''ARCHD'.EXE.CRYPTO]"
$ libolb = "''libdir'SSL_LIBCRYPTO''lib32'.OLB"
$ libopt = "''libdir'SSL_LIBCRYPTO_''shr'.OPT"
$ libmap = "''libdir'SSL_LIBCRYPTO_''shr'.MAP"
$ libgoal= "''libdir'SSL_LIBCRYPTO_''shr'.EXE"
$ libref = ""
$ if f$search( libolb) .nes. "" then gosub create_nonvax_shr
$ libid = "SSL"
$ libnum = "[.UTIL]SSLEAY.NUM"
$ libdir = "[.''ARCHD'.EXE.SSL]"
$ libolb = "''libdir'SSL_LIBSSL''lib32'.OLB"
$ libopt = "''libdir'SSL_LIBSSL_''shr'.OPT"
$ libmap = "''libdir'SSL_LIBSSL_''shr'.MAP"
$ libgoal= "''libdir'SSL_LIBSSL_''shr'.EXE"
$ libref = "[.''ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO_''shr'.EXE"
$ if f$search( libolb) .nes. "" then gosub create_nonvax_shr
$ endif $ endif
$!
$ tidy:
$!
$! Close any open files.
$!
$ if (f$trnlnm( "libnum", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
close libnum
$!
$ if (f$trnlnm( "mar", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
close mar
$!
$ if (f$trnlnm( "opt", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
close opt
$!
$ if (f$trnlnm( "vf", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
close vf
$!
$! Restore the original default device:[directory].
$!
$ set default 'def_orig'
$ exit $ exit
$ $
$! ----- Subroutines to build the shareable libraries $! ----- Soubroutines to actually build the shareable libraries
$! For each supported architecture, there's a main shareable library $! The way things work, there's a main shareable library creator for each
$! creator, which is called from the main code above. $! supported architecture, which is called from the main code above.
$! The creator will define a number of variables to tell the next levels of $! The creator will define a number of variables to tell the next levels of
$! subroutines what routines to use to write to the option files, call the $! subroutines what routines to use to write to the option files, call the
$! main processor, read_func_num, and when that is done, it will write version $! main processor, read_func_num, and when that is done, it will write version
@ -188,29 +97,28 @@ $! read_func_num depends on the following variables from the creator:
$! libwriter The name of the writer routine to call for each .num file line $! libwriter The name of the writer routine to call for each .num file line
$! ----- $! -----
$ $
$! ----- Subroutines for non-VAX $! ----- Subroutines for AXP
$! ----- $! -----
$! The creator routine $! The creator routine
$ create_nonvax_shr: $ create_axp_shr:
$ open /write opt 'libopt' $ open/write opt 'libopt'
$ write opt "identification=""",libid," ",libverstr,"""" $ write opt "identification=""",libid," ",libverstr,""""
$ write opt libolb, " /library" $ write opt libolb,"/lib"
$ if libref .nes. "" then write opt libref,"/SHARE" $ if libref .nes. "" then write opt libref,"/SHARE"
$ write opt "SYMBOL_VECTOR=(-" $ write opt "SYMBOL_VECTOR=(-"
$ libfirstentry := true $ libfirstentry := true
$ libwrch := opt $ libwrch := opt
$ libwriter := write_nonvax_transfer_entry $ libwriter := write_axp_transfer_entry
$ textcount = 0 $ textcount = 0
$ gosub read_func_num $ gosub read_func_num
$ write opt ")" $ write opt ")"
$ write opt "GSMATCH=",libvmatch,",",libver $ write opt "GSMATCH=",libvmatch,",",libver
$ close opt $ close opt
$ link /map = 'libmap' /full /share = 'libgoal' 'libopt' /options - $ link/map='libmap'/full/share='libgoal' 'libopt'/option
'zlib_lib'
$ return $ return
$ $
$! The record writer routine $! The record writer routine
$ write_nonvax_transfer_entry: $ write_axp_transfer_entry:
$ if libentry .eqs. ".dummy" then return $ if libentry .eqs. ".dummy" then return
$ if info_kind .eqs. "VARIABLE" $ if info_kind .eqs. "VARIABLE"
$ then $ then
@ -236,11 +144,11 @@ $ libfirstentry := false
$ textcount = textcount + textcount_this $ textcount = textcount + textcount_this
$ return $ return
$ $
$! ----- Subroutines for VAX $! ----- Subroutines for AXP
$! ----- $! -----
$! The creator routine $! The creator routine
$ create_vax_shr: $ create_vax_shr:
$ open /write mar 'libmar' $ open/write mar 'libmar'
$ type sys$input:/out=mar: $ type sys$input:/out=mar:
; ;
; Transfer vector for VAX shareable image ; Transfer vector for VAX shareable image
@ -275,10 +183,10 @@ $! libwriter := write_vax_vtransfer_entry
$! gosub read_func_num $! gosub read_func_num
$ write mar " .END" $ write mar " .END"
$ close mar $ close mar
$ open /write opt 'libopt' $ open/write opt 'libopt'
$ write opt "identification=""",libid," ",libverstr,"""" $ write opt "identification=""",libid," ",libverstr,""""
$ write opt libobj $ write opt libobj
$ write opt libolb, " /library" $ write opt libolb,"/lib"
$ if libref .nes. "" then write opt libref,"/SHARE" $ if libref .nes. "" then write opt libref,"/SHARE"
$ type sys$input:/out=opt: $ type sys$input:/out=opt:
! !
@ -297,8 +205,7 @@ $ libwriter := write_vax_psect_attr
$ gosub read_func_num $ gosub read_func_num
$ close opt $ close opt
$ macro/obj='libobj' 'libmar' $ macro/obj='libobj' 'libmar'
$ link /map = 'libmap' /full /share = 'libgoal' 'libopt' /options - $ link/map='libmap'/full/share='libgoal' 'libopt'/option
'zlib_lib'
$ return $ return
$ $
$! The record writer routine for VAX functions $! The record writer routine for VAX functions
@ -320,9 +227,9 @@ $ return
$ $
$! ----- Common subroutines $! ----- Common subroutines
$! ----- $! -----
$! The .num file reader. This one has great responsibility. $! The .num file reader. This one has great responsability.
$ read_func_num: $ read_func_num:
$ open /read libnum 'libnum' $ open libnum 'libnum'
$ goto read_nums $ goto read_nums
$ $
$ read_nums: $ read_nums:
@ -330,46 +237,35 @@ $ libentrynum=0
$ liblastentry:=false $ liblastentry:=false
$ entrycount=0 $ entrycount=0
$ loop: $ loop:
$ read /end=loop_end /err=loop_end libnum line $ read/end=loop_end/err=loop_end libnum line
$ lin = f$edit( line, "COMPRESS,TRIM") $ entrynum=f$int(f$element(1," ",f$edit(line,"COMPRESS,TRIM")))
$! Skip a "#" comment line. $ entryinfo=f$element(2," ",f$edit(line,"COMPRESS,TRIM"))
$ if (f$extract( 0, 1, lin) .eqs. "#") then goto loop $ curentry=f$element(0," ",f$edit(line,"COMPRESS,TRIM"))
$ entrynum = f$int(f$element( 1, " ", lin)) $ info_exist=f$element(0,":",entryinfo)
$ entryinfo = f$element( 2, " ", lin) $ info_platforms=","+f$element(1,":",entryinfo)+","
$ curentry = f$element( 0, " ", lin) $ info_kind=f$element(2,":",entryinfo)
$ info_exist = f$element( 0, ":", entryinfo) $ info_algorithms=","+f$element(3,":",entryinfo)+","
$ info_platforms = ","+ f$element(1, ":", entryinfo)+ ","
$ info_kind = f$element( 2, ":", entryinfo)
$ info_algorithms = ","+ f$element( 3, ":", entryinfo)+ ","
$ if info_exist .eqs. "NOEXIST" then goto loop $ if info_exist .eqs. "NOEXIST" then goto loop
$ truesum = 0 $ truesum = 0
$ falsesum = 0 $ falsesum = 0
$ negatives = 1 $ negatives = 1
$ plat_i = 0 $ plat_i = 0
$ loop1: $ loop1:
$ plat_entry = f$element( plat_i, ",", info_platforms) $ plat_entry = f$element(plat_i,",",info_platforms)
$ plat_i = plat_i + 1 $ plat_i = plat_i + 1
$ if plat_entry .eqs. "" then goto loop1 $ if plat_entry .eqs. "" then goto loop1
$ if plat_entry .nes. "," $ if plat_entry .nes. ","
$ then $ then
$ if f$extract(0,1,plat_entry) .nes. "!" then negatives = 0 $ if f$extract(0,1,plat_entry) .nes. "!" then negatives = 0
$ if (arch_vax) $ if f$getsyi("CPU") .lt. 128
$ then $ then
$ if plat_entry .eqs. "EXPORT_VAR_AS_FUNCTION" then - $ if plat_entry .eqs. "EXPORT_VAR_AS_FUNCTION" then -
$ truesum = truesum + 1 $ truesum = truesum + 1
$ if plat_entry .eqs. "!EXPORT_VAR_AS_FUNCTION" then - $ if plat_entry .eqs. "!EXPORT_VAR_AS_FUNCTION" then -
$ falsesum = falsesum + 1 $ falsesum = falsesum + 1
$ endif $ endif
$! $ if plat_entry .eqs. "VMS" then truesum = truesum + 1
$ if ((plat_entry .eqs. "VMS") .or. - $ if plat_entry .eqs. "!VMS" then falsesum = falsesum + 1
((plat_entry .eqs. "ZLIB") .and. (ZLIB .nes. "")) .or. -
(arch_vax .and. (plat_entry .eqs. "VMSVAX"))) then -
truesum = truesum + 1
$!
$ if ((plat_entry .eqs. "!VMS") .or. -
(arch_vax .and. (plat_entry .eqs. "!VMSVAX"))) then -
falsesum = falsesum + 1
$!
$ goto loop1 $ goto loop1
$ endif $ endif
$ endloop1: $ endloop1:
@ -388,7 +284,7 @@ $ alg_i = alg_i + 1
$ if alg_entry .eqs. "" then goto loop2 $ if alg_entry .eqs. "" then goto loop2
$ if alg_entry .nes. "," $ if alg_entry .nes. ","
$ then $ then
$ if disabled_algorithms - ("," + alg_entry + ",") .nes disabled_algorithms then goto loop $ if alg_entry .eqs. "KRB5" then goto loop ! Special for now
$ if f$trnlnm("OPENSSL_NO_"+alg_entry) .nes. "" then goto loop $ if f$trnlnm("OPENSSL_NO_"+alg_entry) .nes. "" then goto loop
$ goto loop2 $ goto loop2
$ endif $ endif
@ -431,7 +327,7 @@ $
$! The version number reader $! The version number reader
$ read_version_info: $ read_version_info:
$ libver = "" $ libver = ""
$ open /read vf [.CRYPTO]OPENSSLV.H $ open/read vf [.CRYPTO]OPENSSLV.H
$ loop_rvi: $ loop_rvi:
$ read/err=endloop_rvi/end=endloop_rvi vf rvi_line $ read/err=endloop_rvi/end=endloop_rvi vf rvi_line
$ if rvi_line - "SHLIB_VERSION_NUMBER """ .eqs. rvi_line then - $ if rvi_line - "SHLIB_VERSION_NUMBER """ .eqs. rvi_line then -
@ -455,22 +351,3 @@ $ endif
$ endloop_rvi: $ endloop_rvi:
$ close vf $ close vf
$ return $ return
$
$! The disabled algorithms reader
$ read_disabled_algorithms_info:
$ disabled_algorithms = ","
$ open /read cf [.CRYPTO.'ARCH']OPENSSLCONF.H
$ loop_rci:
$ read/err=endloop_rci/end=endloop_rci cf rci_line
$ rci_line = f$edit(rci_line,"TRIM,COMPRESS")
$ rci_ei = 0
$ if f$extract(0,9,rci_line) .eqs. "# define " then rci_ei = 2
$ if f$extract(0,8,rci_line) .eqs. "#define " then rci_ei = 1
$ if rci_ei .eq. 0 then goto loop_rci
$ rci_e = f$element(rci_ei," ",rci_line)
$ if f$extract(0,11,rci_e) .nes. "OPENSSL_NO_" then goto loop_rci
$ disabled_algorithms = disabled_algorithms + f$extract(11,999,rci_e) + ","
$ goto loop_rci
$ endloop_rci:
$ close cf
$ return

View File

@ -1,108 +0,0 @@
$!
$! Startup file for OpenSSL 1.x.
$!
$! 2011-03-05 SMS.
$!
$! This procedure must reside in the OpenSSL installation directory.
$! It will fail if it is copied to a different location.
$!
$! P1 qualifier(s) for DEFINE. For example, "/SYSTEM" to get the
$! logical names defined in the system logical name table.
$!
$! P2 "64", to use executables which were built with 64-bit pointers.
$!
$! Good (default) and bad status values.
$!
$ status = %x00010001 ! RMS$_NORMAL, normal successful completion.
$ rms_e_fnf = %x00018292 ! RMS$_FNF, file not found.
$!
$! Prepare for problems.
$!
$ orig_dev_dir = f$environment( "DEFAULT")
$ on control_y then goto clean_up
$ on error then goto clean_up
$!
$! Determine hardware architecture.
$!
$ if (f$getsyi( "cpu") .lt. 128)
$ then
$ arch_name = "VAX"
$ else
$ arch_name = f$edit( f$getsyi( "arch_name"), "upcase")
$ if (arch_name .eqs. "") then arch_name = "UNK"
$ endif
$!
$ if (p2 .eqs. "64")
$ then
$ arch_name_exe = arch_name+ "_64"
$ else
$ arch_name_exe = arch_name
$ endif
$!
$! Derive the OpenSSL installation device:[directory] from the location
$! of this command procedure.
$!
$ proc = f$environment( "procedure")
$ proc_dev_dir = f$parse( "A.;", proc, , , "no_conceal") - "A.;"
$ proc_dev = f$parse( proc_dev_dir, , , "device", "syntax_only")
$ proc_dir = f$parse( proc_dev_dir, , , "directory", "syntax_only") - -
".][000000"- "[000000."- "]["- "["- "]"
$ proc_dev_dir = proc_dev+ "["+ proc_dir+ "]"
$ set default 'proc_dev_dir'
$ set default [-]
$ ossl_dev_dir = f$environment( "default")
$!
$! Check existence of expected directories (to see if this procedure has
$! been moved away from its proper place).
$!
$ if ((f$search( "certs.dir;1") .eqs. "") .or. -
(f$search( "include.dir;1") .eqs. "") .or. -
(f$search( "private.dir;1") .eqs. "") .or. -
(f$search( "vms.dir;1") .eqs. ""))
$ then
$ write sys$output -
" Can't find expected common OpenSSL directories in:"
$ write sys$output " ''ossl_dev_dir'"
$ status = rms_e_fnf
$ goto clean_up
$ endif
$!
$ if ((f$search( "''arch_name_exe'_exe.dir;1") .eqs. "") .or. -
(f$search( "''arch_name'_lib.dir;1") .eqs. ""))
$ then
$ write sys$output -
" Can't find expected architecture-specific OpenSSL directories in:"
$ write sys$output " ''ossl_dev_dir'"
$ status = rms_e_fnf
$ goto clean_up
$ endif
$!
$! All seems well (enough). Define the OpenSSL logical names.
$!
$ ossl_root = ossl_dev_dir- "]"+ ".]"
$ define /translation_attributes = concealed /nolog'p1 SSLROOT 'ossl_root'
$ define /nolog 'p1' SSLCERTS sslroot:[certs]
$ define /nolog 'p1' SSLINCLUDE sslroot:[include]
$ define /nolog 'p1' SSLPRIVATE sslroot:[private]
$ define /nolog 'p1' SSLEXE sslroot:['arch_name_exe'_exe]
$ define /nolog 'p1' SSLLIB sslroot:['arch_name'_lib]
$!
$! Defining OPENSSL lets a C program use "#include <openssl/{foo}.h>":
$ define /nolog 'p1' OPENSSL SSLINCLUDE:
$!
$! Run a site-specific procedure, if it exists.
$!
$ if f$search( "sslroot:[vms]openssl_systartup.com") .nes."" then -
@ sslroot:[vms]openssl_systartup.com
$!
$! Restore the original default dev:[dir] (if known).
$!
$ clean_up:
$!
$ if (f$type( orig_dev_dir) .nes. "")
$ then
$ set default 'orig_dev_dir'
$ endif
$!
$ EXIT 'status'
$!

View File

@ -1,20 +0,0 @@
$!
$! Deassign OpenSSL logical names.
$!
$ call deass "OPENSSL" "''p1'"
$ call deass "SSLCERTS" "''p1'"
$ call deass "SSLEXE" "''p1'"
$ call deass "SSLINCLUDE" "''p1'"
$ call deass "SSLLIB" "''p1'"
$ call deass "SSLPRIVATE" "''p1'"
$ call deass "SSLROOT" "''p1'"
$!
$ exit
$!
$deass: subroutine
$ if (f$trnlnm( p1) .nes. "")
$ then
$ deassign 'p2' 'p1'
$ endif
$ endsubroutine
$!

View File

@ -8,39 +8,31 @@ $!
$! $!
$! Slightly modified by Richard Levitte <richard@levitte.org> $! Slightly modified by Richard Levitte <richard@levitte.org>
$! $!
$!
$! Always define OPENSSL. Others are optional (non-null P1).
$!
$ OPENSSL :== $SSLEXE:OPENSSL $ OPENSSL :== $SSLEXE:OPENSSL
$ $ VERIFY :== $SSLEXE:OPENSSL VERIFY
$ IF (P1 .NES. "") $ ASN1PARSE:== $SSLEXE:OPENSSL ASN1PARS
$ THEN $ REQ :== $SSLEXE:OPENSSL REQ
$ VERIFY :== $SSLEXE:OPENSSL VERIFY $ DGST :== $SSLEXE:OPENSSL DGST
$ ASN1PARSE:== $SSLEXE:OPENSSL ASN1PARS $ DH :== $SSLEXE:OPENSSL DH
$! REQ could conflict with REQUEST. $ ENC :== $SSLEXE:OPENSSL ENC
$ OREQ :== $SSLEXE:OPENSSL REQ $ GENDH :== $SSLEXE:OPENSSL GENDH
$ DGST :== $SSLEXE:OPENSSL DGST $ ERRSTR :== $SSLEXE:OPENSSL ERRSTR
$ DH :== $SSLEXE:OPENSSL DH $ CA :== $SSLEXE:OPENSSL CA
$ ENC :== $SSLEXE:OPENSSL ENC $ CRL :== $SSLEXE:OPENSSL CRL
$ GENDH :== $SSLEXE:OPENSSL GENDH $ RSA :== $SSLEXE:OPENSSL RSA
$ ERRSTR :== $SSLEXE:OPENSSL ERRSTR $ DSA :== $SSLEXE:OPENSSL DSA
$ CA :== $SSLEXE:OPENSSL CA $ DSAPARAM :== $SSLEXE:OPENSSL DSAPARAM
$ CRL :== $SSLEXE:OPENSSL CRL $ X509 :== $SSLEXE:OPENSSL X509
$ RSA :== $SSLEXE:OPENSSL RSA $ GENRSA :== $SSLEXE:OPENSSL GENRSA
$ DSA :== $SSLEXE:OPENSSL DSA $ GENDSA :== $SSLEXE:OPENSSL GENDSA
$ DSAPARAM :== $SSLEXE:OPENSSL DSAPARAM $ S_SERVER :== $SSLEXE:OPENSSL S_SERVER
$ X509 :== $SSLEXE:OPENSSL X509 $ S_CLIENT :== $SSLEXE:OPENSSL S_CLIENT
$ GENRSA :== $SSLEXE:OPENSSL GENRSA $ SPEED :== $SSLEXE:OPENSSL SPEED
$ GENDSA :== $SSLEXE:OPENSSL GENDSA $ S_TIME :== $SSLEXE:OPENSSL S_TIME
$ S_SERVER :== $SSLEXE:OPENSSL S_SERVER $ VERSION :== $SSLEXE:OPENSSL VERSION
$ S_CLIENT :== $SSLEXE:OPENSSL S_CLIENT $ PKCS7 :== $SSLEXE:OPENSSL PKCS7
$ SPEED :== $SSLEXE:OPENSSL SPEED $ CRL2PKCS7:== $SSLEXE:OPENSSL CRL2P7
$ S_TIME :== $SSLEXE:OPENSSL S_TIME $ SESS_ID :== $SSLEXE:OPENSSL SESS_ID
$ VERSION :== $SSLEXE:OPENSSL VERSION $ CIPHERS :== $SSLEXE:OPENSSL CIPHERS
$ PKCS7 :== $SSLEXE:OPENSSL PKCS7 $ NSEQ :== $SSLEXE:OPENSSL NSEQ
$ CRL2PKCS7:== $SSLEXE:OPENSSL CRL2P7 $ PKCS12 :== $SSLEXE:OPENSSL PKCS12
$ SESS_ID :== $SSLEXE:OPENSSL SESS_ID
$ CIPHERS :== $SSLEXE:OPENSSL CIPHERS
$ NSEQ :== $SSLEXE:OPENSSL NSEQ
$ PKCS12 :== $SSLEXE:OPENSSL PKCS12
$ ENDIF

5
apps/.cvsignore Normal file
View File

@ -0,0 +1,5 @@
openssl
Makefile.save
der_chop
der_chop.bak
CA.pl

View File

@ -37,25 +37,14 @@ $ VERIFY = openssl + " verify"
$ X509 = openssl + " x509" $ X509 = openssl + " x509"
$ PKCS12 = openssl + " pkcs12" $ PKCS12 = openssl + " pkcs12"
$ echo = "write sys$Output" $ echo = "write sys$Output"
$ RET = 1
$! $!
$! 2010-12-20 SMS. $ s = F$PARSE(F$ENVIRONMENT("DEFAULT"),"[]") - "].;"
$! Use a concealed logical name to reduce command line lengths, to $ CATOP := 's'.demoCA
$! avoid DCL errors on VAX: $ CAKEY := ]cakey.pem
$! %DCL-W-TKNOVF, command element is too long - shorten $ CACERT := ]cacert.pem
$! (Path segments like "openssl-1_0_1-stable-SNAP-20101217" accumulate
$! quickly.)
$!
$ CATOP = F$PARSE( F$ENVIRONMENT( "DEFAULT"), "[]")- "].;"+ ".demoCA.]"
$ define /translation_attributes = concealed CATOP 'CATOP'
$!
$ on error then goto clean_up
$ on control_y then goto clean_up
$!
$ CAKEY = "CATOP:[private]cakey.pem"
$ CACERT = "CATOP:[000000]cacert.pem"
$ $
$ __INPUT := SYS$COMMAND $ __INPUT := SYS$COMMAND
$ RET = 1
$! $!
$ i = 1 $ i = 1
$opt_loop: $opt_loop:
@ -66,7 +55,7 @@ $
$ IF (prog_opt .EQS. "?" .OR. prog_opt .EQS. "-h" .OR. prog_opt .EQS. "-help") $ IF (prog_opt .EQS. "?" .OR. prog_opt .EQS. "-h" .OR. prog_opt .EQS. "-help")
$ THEN $ THEN
$ echo "usage: CA -newcert|-newreq|-newca|-sign|-verify" $ echo "usage: CA -newcert|-newreq|-newca|-sign|-verify"
$ goto clean_up $ exit
$ ENDIF $ ENDIF
$! $!
$ IF (prog_opt .EQS. "-input") $ IF (prog_opt .EQS. "-input")
@ -80,7 +69,7 @@ $!
$ IF (prog_opt .EQS. "-newcert") $ IF (prog_opt .EQS. "-newcert")
$ THEN $ THEN
$ ! Create a certificate. $ ! Create a certificate.
$ DEFINE /USER_MODE SYS$INPUT '__INPUT' $ DEFINE/USER SYS$INPUT '__INPUT'
$ REQ -new -x509 -keyout newreq.pem -out newreq.pem 'DAYS' $ REQ -new -x509 -keyout newreq.pem -out newreq.pem 'DAYS'
$ RET=$STATUS $ RET=$STATUS
$ echo "Certificate (and private key) is in newreq.pem" $ echo "Certificate (and private key) is in newreq.pem"
@ -90,7 +79,7 @@ $!
$ IF (prog_opt .EQS. "-newreq") $ IF (prog_opt .EQS. "-newreq")
$ THEN $ THEN
$ ! Create a certificate request $ ! Create a certificate request
$ DEFINE /USER_MODE SYS$INPUT '__INPUT' $ DEFINE/USER SYS$INPUT '__INPUT'
$ REQ -new -keyout newreq.pem -out newreq.pem 'DAYS' $ REQ -new -keyout newreq.pem -out newreq.pem 'DAYS'
$ RET=$STATUS $ RET=$STATUS
$ echo "Request (and private key) is in newreq.pem" $ echo "Request (and private key) is in newreq.pem"
@ -101,40 +90,41 @@ $ IF (prog_opt .EQS. "-newca")
$ THEN $ THEN
$ ! If explicitly asked for or it doesn't exist then setup the directory $ ! If explicitly asked for or it doesn't exist then setup the directory
$ ! structure that Eric likes to manage things. $ ! structure that Eric likes to manage things.
$ IF F$SEARCH( "CATOP:[000000]serial.") .EQS. "" $ IF F$SEARCH(CATOP+"]serial.") .EQS. ""
$ THEN $ THEN
$ CREATE /DIRECTORY /PROTECTION=OWNER:RWED CATOP:[000000] $ CREATE /DIR /PROTECTION=OWNER:RWED 'CATOP']
$ CREATE /DIRECTORY /PROTECTION=OWNER:RWED CATOP:[certs] $ CREATE /DIR /PROTECTION=OWNER:RWED 'CATOP'.certs]
$ CREATE /DIRECTORY /PROTECTION=OWNER:RWED CATOP:[crl] $ CREATE /DIR /PROTECTION=OWNER:RWED 'CATOP'.crl]
$ CREATE /DIRECTORY /PROTECTION=OWNER:RWED CATOP:[newcerts] $ CREATE /DIR /PROTECTION=OWNER:RWED 'CATOP'.newcerts]
$ CREATE /DIRECTORY /PROTECTION=OWNER:RWED CATOP:[private] $ CREATE /DIR /PROTECTION=OWNER:RWED 'CATOP'.private]
$ $
$ OPEN /WRITE ser_file CATOP:[000000]serial. $ OPEN /WRITE ser_file 'CATOP']serial.
$ WRITE ser_file "01" $ WRITE ser_file "01"
$ CLOSE ser_file $ CLOSE ser_file
$ APPEND /NEW_VERSION NL: CATOP:[000000]index.txt $ APPEND/NEW NL: 'CATOP']index.txt
$ $
$ ! The following is to make sure access() doesn't get confused. It $ ! The following is to make sure access() doesn't get confused. It
$ ! really needs one file in the directory to give correct answers... $ ! really needs one file in the directory to give correct answers...
$ COPY NLA0: CATOP:[certs].; $ COPY NLA0: 'CATOP'.certs].;
$ COPY NLA0: CATOP:[crl].; $ COPY NLA0: 'CATOP'.crl].;
$ COPY NLA0: CATOP:[newcerts].; $ COPY NLA0: 'CATOP'.newcerts].;
$ COPY NLA0: CATOP:[private].; $ COPY NLA0: 'CATOP'.private].;
$ ENDIF $ ENDIF
$! $!
$ IF F$SEARCH( CAKEY) .EQS. "" $ IF F$SEARCH(CATOP+".private"+CAKEY) .EQS. ""
$ THEN $ THEN
$ READ '__INPUT' FILE - $ READ '__INPUT' FILE -
/PROMPT="CA certificate filename (or enter to create): " /PROMT="CA certificate filename (or enter to create)"
$ IF (FILE .NES. "") .AND. (F$SEARCH(FILE) .NES. "") $ IF F$SEARCH(FILE) .NES. ""
$ THEN $ THEN
$ COPY 'FILE' 'CAKEY' $ COPY 'FILE' 'CATOP'.private'CAKEY'
$ RET=$STATUS $ RET=$STATUS
$ ELSE $ ELSE
$ echo "Making CA certificate ..." $ echo "Making CA certificate ..."
$ DEFINE /USER_MODE SYS$INPUT '__INPUT' $ DEFINE/USER SYS$INPUT '__INPUT'
$ REQ -new -x509 -keyout 'CAKEY' -out 'CACERT' 'DAYS' $ REQ -new -x509 -keyout 'CATOP'.private'CAKEY' -
$ RET=$STATUS -out 'CATOP''CACERT' 'DAYS'
$ RET=$STATUS
$ ENDIF $ ENDIF
$ ENDIF $ ENDIF
$ GOTO opt_loop_continue $ GOTO opt_loop_continue
@ -145,16 +135,16 @@ $ THEN
$ i = i + 1 $ i = i + 1
$ cname = P'i' $ cname = P'i'
$ IF cname .EQS. "" THEN cname = "My certificate" $ IF cname .EQS. "" THEN cname = "My certificate"
$ PKCS12 -in newcert.pem -inkey newreq.pem -certfile 'CACERT' - $ PKCS12 -in newcert.pem -inkey newreq.pem -certfile 'CATOP''CACERT -
-out newcert.p12 -export -name "''cname'" -out newcert.p12 -export -name "''cname'"
$ RET=$STATUS $ RET=$STATUS
$ goto clean_up $ exit RET
$ ENDIF $ ENDIF
$! $!
$ IF (prog_opt .EQS. "-xsign") $ IF (prog_opt .EQS. "-xsign")
$ THEN $ THEN
$! $!
$ DEFINE /USER_MODE SYS$INPUT '__INPUT' $ DEFINE/USER SYS$INPUT '__INPUT'
$ CA -policy policy_anything -infiles newreq.pem $ CA -policy policy_anything -infiles newreq.pem
$ RET=$STATUS $ RET=$STATUS
$ GOTO opt_loop_continue $ GOTO opt_loop_continue
@ -163,7 +153,7 @@ $!
$ IF ((prog_opt .EQS. "-sign") .OR. (prog_opt .EQS. "-signreq")) $ IF ((prog_opt .EQS. "-sign") .OR. (prog_opt .EQS. "-signreq"))
$ THEN $ THEN
$! $!
$ DEFINE /USER_MODE SYS$INPUT '__INPUT' $ DEFINE/USER SYS$INPUT '__INPUT'
$ CA -policy policy_anything -out newcert.pem -infiles newreq.pem $ CA -policy policy_anything -out newcert.pem -infiles newreq.pem
$ RET=$STATUS $ RET=$STATUS
$ type newcert.pem $ type newcert.pem
@ -175,9 +165,9 @@ $ IF (prog_opt .EQS. "-signcert")
$ THEN $ THEN
$! $!
$ echo "Cert passphrase will be requested twice - bug?" $ echo "Cert passphrase will be requested twice - bug?"
$ DEFINE /USER_MODE SYS$INPUT '__INPUT' $ DEFINE/USER SYS$INPUT '__INPUT'
$ X509 -x509toreq -in newreq.pem -signkey newreq.pem -out tmp.pem $ X509 -x509toreq -in newreq.pem -signkey newreq.pem -out tmp.pem
$ DEFINE /USER_MODE SYS$INPUT '__INPUT' $ DEFINE/USER SYS$INPUT '__INPUT'
$ CA -policy policy_anything -out newcert.pem -infiles tmp.pem $ CA -policy policy_anything -out newcert.pem -infiles tmp.pem
y y
y y
@ -192,17 +182,17 @@ $!
$ i = i + 1 $ i = i + 1
$ IF (p'i' .EQS. "") $ IF (p'i' .EQS. "")
$ THEN $ THEN
$ DEFINE /USER_MODE SYS$INPUT '__INPUT' $ DEFINE/USER SYS$INPUT '__INPUT'
$ VERIFY "-CAfile" 'CACERT' newcert.pem $ VERIFY "-CAfile" 'CATOP''CACERT' newcert.pem
$ ELSE $ ELSE
$ j = i $ j = i
$ verify_opt_loop: $ verify_opt_loop:
$ IF j .GT. 8 THEN GOTO verify_opt_loop_end $ IF j .GT. 8 THEN GOTO verify_opt_loop_end
$ IF p'j' .NES. "" $ IF p'j' .NES. ""
$ THEN $ THEN
$ DEFINE /USER_MODE SYS$INPUT '__INPUT' $ DEFINE/USER SYS$INPUT '__INPUT'
$ __tmp = p'j' $ __tmp = p'j'
$ VERIFY "-CAfile" 'CACERT' '__tmp' $ VERIFY "-CAfile" 'CATOP''CACERT' '__tmp'
$ tmp=$STATUS $ tmp=$STATUS
$ IF tmp .NE. 0 THEN RET=tmp $ IF tmp .NE. 0 THEN RET=tmp
$ ENDIF $ ENDIF
@ -218,8 +208,8 @@ $ IF (prog_opt .NES. "")
$ THEN $ THEN
$! $!
$ echo "Unknown argument ''prog_opt'" $ echo "Unknown argument ''prog_opt'"
$ RET = 3 $
$ goto clean_up $ EXIT 3
$ ENDIF $ ENDIF
$ $
$opt_loop_continue: $opt_loop_continue:
@ -227,10 +217,4 @@ $ i = i + 1
$ GOTO opt_loop $ GOTO opt_loop
$ $
$opt_loop_end: $opt_loop_end:
$!
$clean_up:
$!
$ if f$trnlnm( "CATOP", "LNM$PROCESS") .nes. "" then -
deassign /process CATOP
$!
$ EXIT 'RET' $ EXIT 'RET'

View File

@ -36,26 +36,16 @@
# default openssl.cnf file has setup as per the following # default openssl.cnf file has setup as per the following
# demoCA ... where everything is stored # demoCA ... where everything is stored
my $openssl;
if(defined $ENV{OPENSSL}) {
$openssl = $ENV{OPENSSL};
} else {
$openssl = "openssl";
$ENV{OPENSSL} = $openssl;
}
$SSLEAY_CONFIG=$ENV{"SSLEAY_CONFIG"}; $SSLEAY_CONFIG=$ENV{"SSLEAY_CONFIG"};
$DAYS="-days 365"; # 1 year $DAYS="-days 365";
$CADAYS="-days 1095"; # 3 years $REQ="openssl req $SSLEAY_CONFIG";
$REQ="$openssl req $SSLEAY_CONFIG"; $CA="openssl ca $SSLEAY_CONFIG";
$CA="$openssl ca $SSLEAY_CONFIG"; $VERIFY="openssl verify";
$VERIFY="$openssl verify"; $X509="openssl x509";
$X509="$openssl x509"; $PKCS12="openssl pkcs12";
$PKCS12="$openssl pkcs12";
$CATOP="./demoCA"; $CATOP="./demoCA";
$CAKEY="cakey.pem"; $CAKEY="cakey.pem";
$CAREQ="careq.pem";
$CACERT="cacert.pem"; $CACERT="cacert.pem";
$DIRMODE = 0777; $DIRMODE = 0777;
@ -68,19 +58,19 @@ foreach (@ARGV) {
exit 0; exit 0;
} elsif (/^-newcert$/) { } elsif (/^-newcert$/) {
# create a certificate # create a certificate
system ("$REQ -new -x509 -keyout newkey.pem -out newcert.pem $DAYS"); system ("$REQ -new -x509 -keyout newreq.pem -out newreq.pem $DAYS");
$RET=$?; $RET=$?;
print "Certificate is in newcert.pem, private key is in newkey.pem\n" print "Certificate (and private key) is in newreq.pem\n"
} elsif (/^-newreq$/) { } elsif (/^-newreq$/) {
# create a certificate request # create a certificate request
system ("$REQ -new -keyout newkey.pem -out newreq.pem $DAYS"); system ("$REQ -new -keyout newreq.pem -out newreq.pem $DAYS");
$RET=$?; $RET=$?;
print "Request is in newreq.pem, private key is in newkey.pem\n"; print "Request (and private key) is in newreq.pem\n";
} elsif (/^-newreq-nodes$/) { } elsif (/^-newreq-nodes$/) {
# create a certificate request # create a certificate request
system ("$REQ -new -nodes -keyout newkey.pem -out newreq.pem $DAYS"); system ("$REQ -new -nodes -keyout newreq.pem -out newreq.pem $DAYS");
$RET=$?; $RET=$?;
print "Request is in newreq.pem, private key is in newkey.pem\n"; print "Request (and private key) is in newreq.pem\n";
} elsif (/^-newca$/) { } elsif (/^-newca$/) {
# if explicitly asked for or it doesn't exist then setup the # if explicitly asked for or it doesn't exist then setup the
# directory structure that Eric likes to manage things # directory structure that Eric likes to manage things
@ -94,9 +84,6 @@ foreach (@ARGV) {
mkdir "${CATOP}/private", $DIRMODE; mkdir "${CATOP}/private", $DIRMODE;
open OUT, ">${CATOP}/index.txt"; open OUT, ">${CATOP}/index.txt";
close OUT; close OUT;
open OUT, ">${CATOP}/crlnumber";
print OUT "01\n";
close OUT;
} }
if ( ! -f "${CATOP}/private/$CAKEY" ) { if ( ! -f "${CATOP}/private/$CAKEY" ) {
print "CA certificate filename (or enter to create)\n"; print "CA certificate filename (or enter to create)\n";
@ -111,24 +98,22 @@ foreach (@ARGV) {
$RET=$?; $RET=$?;
} else { } else {
print "Making CA certificate ...\n"; print "Making CA certificate ...\n";
system ("$REQ -new -keyout " . system ("$REQ -new -x509 -keyout " .
"${CATOP}/private/$CAKEY -out ${CATOP}/$CAREQ"); "${CATOP}/private/$CAKEY -out ${CATOP}/$CACERT $DAYS");
system ("$CA -create_serial " .
"-out ${CATOP}/$CACERT $CADAYS -batch " .
"-keyfile ${CATOP}/private/$CAKEY -selfsign " .
"-extensions v3_ca " .
"-infiles ${CATOP}/$CAREQ ");
$RET=$?; $RET=$?;
} }
} }
if (! -f "${CATOP}/serial" ) {
system ("$X509 -in ${CATOP}/$CACERT -noout "
. "-next_serial -out ${CATOP}/serial");
}
} elsif (/^-pkcs12$/) { } elsif (/^-pkcs12$/) {
my $cname = $ARGV[1]; my $cname = $ARGV[1];
$cname = "My Certificate" unless defined $cname; $cname = "My Certificate" unless defined $cname;
system ("$PKCS12 -in newcert.pem -inkey newkey.pem " . system ("$PKCS12 -in newcert.pem -inkey newreq.pem " .
"-certfile ${CATOP}/$CACERT -out newcert.p12 " . "-certfile ${CATOP}/$CACERT -out newcert.p12 " .
"-export -name \"$cname\""); "-export -name \"$cname\"");
$RET=$?; $RET=$?;
print "PKCS #12 file is in newcert.p12\n";
exit $RET; exit $RET;
} elsif (/^-xsign$/) { } elsif (/^-xsign$/) {
system ("$CA -policy policy_anything -infiles newreq.pem"); system ("$CA -policy policy_anything -infiles newreq.pem");

View File

@ -16,8 +16,8 @@
# 12-Jan-96 tjh Added more things ... including CA -signcert which # 12-Jan-96 tjh Added more things ... including CA -signcert which
# converts a certificate to a request and then signs it. # converts a certificate to a request and then signs it.
# 10-Jan-96 eay Fixed a few more bugs and added the SSLEAY_CONFIG # 10-Jan-96 eay Fixed a few more bugs and added the SSLEAY_CONFIG
# environment variable so this can be driven from # environment variable so this can be driven from
# a script. # a script.
# 25-Jul-96 eay Cleaned up filenames some more. # 25-Jul-96 eay Cleaned up filenames some more.
# 11-Jun-96 eay Fixed a few filename missmatches. # 11-Jun-96 eay Fixed a few filename missmatches.
# 03-May-96 eay Modified to use 'ssleay cmd' instead of 'cmd'. # 03-May-96 eay Modified to use 'ssleay cmd' instead of 'cmd'.
@ -29,73 +29,33 @@
# default openssl.cnf file has setup as per the following # default openssl.cnf file has setup as per the following
# demoCA ... where everything is stored # demoCA ... where everything is stored
cp_pem() {
infile=$1
outfile=$2
bound=$3
flag=0
exec <$infile;
while read line; do
if [ $flag -eq 1 ]; then
echo $line|grep "^-----END.*$bound" 2>/dev/null 1>/dev/null
if [ $? -eq 0 ] ; then
echo $line >>$outfile
break
else
echo $line >>$outfile
fi
fi
echo $line|grep "^-----BEGIN.*$bound" 2>/dev/null 1>/dev/null DAYS="-days 365"
if [ $? -eq 0 ]; then REQ="openssl req $SSLEAY_CONFIG"
echo $line >$outfile CA="openssl ca $SSLEAY_CONFIG"
flag=1 VERIFY="openssl verify"
fi X509="openssl x509"
done
}
usage() { CATOP=./demoCA
echo "usage: $0 -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify" >&2
}
if [ -z "$OPENSSL" ]; then OPENSSL=openssl; fi
if [ -z "$DAYS" ] ; then DAYS="-days 365" ; fi # 1 year
CADAYS="-days 1095" # 3 years
REQ="$OPENSSL req $SSLEAY_CONFIG"
CA="$OPENSSL ca $SSLEAY_CONFIG"
VERIFY="$OPENSSL verify"
X509="$OPENSSL x509"
PKCS12="openssl pkcs12"
if [ -z "$CATOP" ] ; then CATOP=./demoCA ; fi
CAKEY=./cakey.pem CAKEY=./cakey.pem
CAREQ=./careq.pem
CACERT=./cacert.pem CACERT=./cacert.pem
RET=0 for i
do
while [ "$1" != "" ] ; do case $i in
case $1 in
-\?|-h|-help) -\?|-h|-help)
usage echo "usage: CA -newcert|-newreq|-newca|-sign|-verify" >&2
exit 0 exit 0
;; ;;
-newcert) -newcert)
# create a certificate # create a certificate
$REQ -new -x509 -keyout newkey.pem -out newcert.pem $DAYS $REQ -new -x509 -keyout newreq.pem -out newreq.pem $DAYS
RET=$? RET=$?
echo "Certificate is in newcert.pem, private key is in newkey.pem" echo "Certificate (and private key) is in newreq.pem"
;; ;;
-newreq) -newreq)
# create a certificate request # create a certificate request
$REQ -new -keyout newkey.pem -out newreq.pem $DAYS $REQ -new -keyout newreq.pem -out newreq.pem $DAYS
RET=$?
echo "Request is in newreq.pem, private key is in newkey.pem"
;;
-newreq-nodes)
# create a certificate request
$REQ -new -nodes -keyout newreq.pem -out newreq.pem $DAYS
RET=$? RET=$?
echo "Request (and private key) is in newreq.pem" echo "Request (and private key) is in newreq.pem"
;; ;;
@ -105,11 +65,12 @@ case $1 in
NEW="1" NEW="1"
if [ "$NEW" -o ! -f ${CATOP}/serial ]; then if [ "$NEW" -o ! -f ${CATOP}/serial ]; then
# create the directory hierarchy # create the directory hierarchy
mkdir -p ${CATOP} mkdir ${CATOP}
mkdir -p ${CATOP}/certs mkdir ${CATOP}/certs
mkdir -p ${CATOP}/crl mkdir ${CATOP}/crl
mkdir -p ${CATOP}/newcerts mkdir ${CATOP}/newcerts
mkdir -p ${CATOP}/private mkdir ${CATOP}/private
echo "01" > ${CATOP}/serial
touch ${CATOP}/index.txt touch ${CATOP}/index.txt
fi fi
if [ ! -f ${CATOP}/private/$CAKEY ]; then if [ ! -f ${CATOP}/private/$CAKEY ]; then
@ -118,21 +79,12 @@ case $1 in
# ask user for existing CA certificate # ask user for existing CA certificate
if [ "$FILE" ]; then if [ "$FILE" ]; then
cp_pem $FILE ${CATOP}/private/$CAKEY PRIVATE cp $FILE ${CATOP}/private/$CAKEY
cp_pem $FILE ${CATOP}/$CACERT CERTIFICATE
RET=$? RET=$?
if [ ! -f "${CATOP}/serial" ]; then
$X509 -in ${CATOP}/$CACERT -noout -next_serial \
-out ${CATOP}/serial
fi
else else
echo "Making CA certificate ..." echo "Making CA certificate ..."
$REQ -new -keyout ${CATOP}/private/$CAKEY \ $REQ -new -x509 -keyout ${CATOP}/private/$CAKEY \
-out ${CATOP}/$CAREQ -out ${CATOP}/$CACERT $DAYS
$CA -create_serial -out ${CATOP}/$CACERT $CADAYS -batch \
-keyfile ${CATOP}/private/$CAKEY -selfsign \
-extensions v3_ca \
-infiles ${CATOP}/$CAREQ
RET=$? RET=$?
fi fi
fi fi
@ -141,33 +93,16 @@ case $1 in
$CA -policy policy_anything -infiles newreq.pem $CA -policy policy_anything -infiles newreq.pem
RET=$? RET=$?
;; ;;
-pkcs12)
if [ -z "$2" ] ; then
CNAME="My Certificate"
else
CNAME="$2"
fi
$PKCS12 -in newcert.pem -inkey newreq.pem -certfile ${CATOP}/$CACERT \
-out newcert.p12 -export -name "$CNAME"
RET=$?
exit $RET
;;
-sign|-signreq) -sign|-signreq)
$CA -policy policy_anything -out newcert.pem -infiles newreq.pem $CA -policy policy_anything -out newcert.pem -infiles newreq.pem
RET=$? RET=$?
cat newcert.pem cat newcert.pem
echo "Signed certificate is in newcert.pem" echo "Signed certificate is in newcert.pem"
;; ;;
-signCA)
$CA -policy policy_anything -out newcert.pem -extensions v3_ca -infiles newreq.pem
RET=$?
echo "Signed CA certificate is in newcert.pem"
;;
-signcert) -signcert)
echo "Cert passphrase will be requested twice - bug?" echo "Cert passphrase will be requested twice - bug?"
$X509 -x509toreq -in newreq.pem -signkey newreq.pem -out tmp.pem $X509 -x509toreq -in newreq.pem -signkey newreq.pem -out tmp.pem
$CA -policy policy_anything -out newcert.pem -infiles tmp.pem $CA -policy policy_anything -out newcert.pem -infiles tmp.pem
RET=$?
cat newcert.pem cat newcert.pem
echo "Signed certificate is in newcert.pem" echo "Signed certificate is in newcert.pem"
;; ;;
@ -185,14 +120,13 @@ case $1 in
fi fi
done done
fi fi
exit $RET exit 0
;; ;;
*) *)
echo "Unknown arg $i" >&2 echo "Unknown arg $i";
usage
exit 1 exit 1
;; ;;
esac esac
shift
done done
exit $RET exit $RET

File diff suppressed because it is too large Load Diff

View File

@ -115,106 +115,104 @@
#include <openssl/bio.h> #include <openssl/bio.h>
#include <openssl/rand.h> #include <openssl/rand.h>
static int seeded = 0; static int seeded = 0;
static int egdsocket = 0; static int egdsocket = 0;
int app_RAND_load_file(const char *file, BIO *bio_e, int dont_warn) int app_RAND_load_file(const char *file, BIO *bio_e, int dont_warn)
{ {
int consider_randfile = (file == NULL); int consider_randfile = (file == NULL);
char buffer[200]; char buffer[200];
#ifdef OPENSSL_SYS_WINDOWS #ifdef OPENSSL_SYS_WINDOWS
BIO_printf(bio_e, "Loading 'screen' into random state -"); BIO_printf(bio_e,"Loading 'screen' into random state -");
BIO_flush(bio_e); BIO_flush(bio_e);
RAND_screen(); RAND_screen();
BIO_printf(bio_e, " done\n"); BIO_printf(bio_e," done\n");
#endif #endif
if (file == NULL) if (file == NULL)
file = RAND_file_name(buffer, sizeof buffer); file = RAND_file_name(buffer, sizeof buffer);
else if (RAND_egd(file) > 0) { else if (RAND_egd(file) > 0)
/* {
* we try if the given filename is an EGD socket. if it is, we don't /* we try if the given filename is an EGD socket.
* write anything back to the file. if it is, we don't write anything back to the file. */
*/ egdsocket = 1;
egdsocket = 1; return 1;
return 1; }
} if (file == NULL || !RAND_load_file(file, -1))
if (file == NULL || !RAND_load_file(file, -1)) { {
if (RAND_status() == 0) { if (RAND_status() == 0)
if (!dont_warn) { {
BIO_printf(bio_e, "unable to load 'random state'\n"); if (!dont_warn)
BIO_printf(bio_e, {
"This means that the random number generator has not been seeded\n"); BIO_printf(bio_e,"unable to load 'random state'\n");
BIO_printf(bio_e, "with much random data.\n"); BIO_printf(bio_e,"This means that the random number generator has not been seeded\n");
if (consider_randfile) { /* explanation does not apply when a BIO_printf(bio_e,"with much random data.\n");
* file is explicitly named */ if (consider_randfile) /* explanation does not apply when a file is explicitly named */
BIO_printf(bio_e, {
"Consider setting the RANDFILE environment variable to point at a file that\n"); BIO_printf(bio_e,"Consider setting the RANDFILE environment variable to point at a file that\n");
BIO_printf(bio_e, BIO_printf(bio_e,"'random' data can be kept in (the file will be overwritten).\n");
"'random' data can be kept in (the file will be overwritten).\n"); }
} }
} return 0;
return 0; }
} }
} seeded = 1;
seeded = 1; return 1;
return 1; }
}
long app_RAND_load_files(char *name) long app_RAND_load_files(char *name)
{ {
char *p, *n; char *p,*n;
int last; int last;
long tot = 0; long tot=0;
int egd; int egd;
for (;;) { for (;;)
last = 0; {
for (p = name; ((*p != '\0') && (*p != LIST_SEPARATOR_CHAR)); p++) ; last=0;
if (*p == '\0') for (p=name; ((*p != '\0') && (*p != LIST_SEPARATOR_CHAR)); p++);
last = 1; if (*p == '\0') last=1;
*p = '\0'; *p='\0';
n = name; n=name;
name = p + 1; name=p+1;
if (*n == '\0') if (*n == '\0') break;
break;
egd = RAND_egd(n); egd=RAND_egd(n);
if (egd > 0) if (egd > 0)
tot += egd; tot+=egd;
else else
tot += RAND_load_file(n, -1); tot+=RAND_load_file(n,-1);
if (last) if (last) break;
break; }
} if (tot > 512)
if (tot > 512) app_RAND_allow_write_file();
app_RAND_allow_write_file(); return(tot);
return (tot); }
}
int app_RAND_write_file(const char *file, BIO *bio_e) int app_RAND_write_file(const char *file, BIO *bio_e)
{ {
char buffer[200]; char buffer[200];
if (egdsocket || !seeded) if (egdsocket || !seeded)
/* /* If we did not manage to read the seed file,
* If we did not manage to read the seed file, we should not write a * we should not write a low-entropy seed file back --
* low-entropy seed file back -- it would suppress a crucial warning * it would suppress a crucial warning the next time
* the next time we want to use it. * we want to use it. */
*/ return 0;
return 0;
if (file == NULL) if (file == NULL)
file = RAND_file_name(buffer, sizeof buffer); file = RAND_file_name(buffer, sizeof buffer);
if (file == NULL || !RAND_write_file(file)) { if (file == NULL || !RAND_write_file(file))
BIO_printf(bio_e, "unable to write 'random state'\n"); {
return 0; BIO_printf(bio_e,"unable to write 'random state'\n");
} return 0;
return 1; }
} return 1;
}
void app_RAND_allow_write_file(void) void app_RAND_allow_write_file(void)
{ {
seeded = 1; seeded = 1;
} }

File diff suppressed because it is too large Load Diff

View File

@ -110,119 +110,139 @@
*/ */
#ifndef HEADER_APPS_H #ifndef HEADER_APPS_H
# define HEADER_APPS_H #define HEADER_APPS_H
# include "e_os.h" #include "e_os.h"
# include <openssl/bio.h> #include <openssl/buffer.h>
# include <openssl/x509.h> #include <openssl/bio.h>
# include <openssl/lhash.h> #include <openssl/crypto.h>
# include <openssl/conf.h> #include <openssl/x509.h>
# include <openssl/txt_db.h> #include <openssl/lhash.h>
# ifndef OPENSSL_NO_ENGINE #include <openssl/conf.h>
# include <openssl/engine.h> #include <openssl/txt_db.h>
# endif #ifndef OPENSSL_NO_ENGINE
# ifndef OPENSSL_NO_OCSP #include <openssl/engine.h>
# include <openssl/ocsp.h> #endif
# endif #include <openssl/ossl_typ.h>
# include <openssl/ossl_typ.h>
int app_RAND_load_file(const char *file, BIO *bio_e, int dont_warn); int app_RAND_load_file(const char *file, BIO *bio_e, int dont_warn);
int app_RAND_write_file(const char *file, BIO *bio_e); int app_RAND_write_file(const char *file, BIO *bio_e);
/* /* When `file' is NULL, use defaults.
* When `file' is NULL, use defaults. `bio_e' is for error messages. * `bio_e' is for error messages. */
*/
void app_RAND_allow_write_file(void); void app_RAND_allow_write_file(void);
long app_RAND_load_files(char *file); /* `file' is a list of files to read, long app_RAND_load_files(char *file); /* `file' is a list of files to read,
* separated by LIST_SEPARATOR_CHAR * separated by LIST_SEPARATOR_CHAR
* (see e_os.h). The string is * (see e_os.h). The string is
* destroyed! */ * destroyed! */
# ifndef MONOLITH #ifdef OPENSSL_SYS_WIN32
#define rename(from,to) WIN32_rename((from),(to))
int WIN32_rename(char *oldname,char *newname);
#endif
# define MAIN(a,v) main(a,v) #ifndef MONOLITH
# ifndef NON_MAIN #define MAIN(a,v) main(a,v)
CONF *config = NULL;
BIO *bio_err = NULL; #ifndef NON_MAIN
# else CONF *config=NULL;
BIO *bio_err=NULL;
#else
extern CONF *config; extern CONF *config;
extern BIO *bio_err; extern BIO *bio_err;
# endif #endif
# else #else
# define MAIN(a,v) PROG(a,v) #define MAIN(a,v) PROG(a,v)
extern CONF *config; extern CONF *config;
extern char *default_config_file; extern char *default_config_file;
extern BIO *bio_err; extern BIO *bio_err;
# endif #endif
# ifndef OPENSSL_SYS_NETWARE #include <signal.h>
# include <signal.h>
# endif
# ifdef SIGPIPE #ifdef SIGPIPE
# define do_pipe_sig() signal(SIGPIPE,SIG_IGN) #define do_pipe_sig() signal(SIGPIPE,SIG_IGN)
# else #else
# define do_pipe_sig() #define do_pipe_sig()
# endif #endif
# ifdef OPENSSL_NO_COMP #if defined(MONOLITH) && !defined(OPENSSL_C)
# define zlib_cleanup()
# else
# define zlib_cleanup() COMP_zlib_cleanup()
# endif
# if defined(MONOLITH) && !defined(OPENSSL_C)
# define apps_startup() \ # define apps_startup() \
do_pipe_sig() do_pipe_sig()
# define apps_shutdown() # define apps_shutdown()
# else #else
# ifndef OPENSSL_NO_ENGINE # ifndef OPENSSL_NO_ENGINE
# define apps_startup() \ # if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WIN16) || \
do { do_pipe_sig(); CRYPTO_malloc_init(); \ defined(OPENSSL_SYS_WIN32)
ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \ # ifdef _O_BINARY
ENGINE_load_builtin_engines(); setup_ui_method(); } while(0) # define apps_startup() \
# define apps_shutdown() \ do { _fmode=_O_BINARY; do_pipe_sig(); CRYPTO_malloc_init(); \
do { CONF_modules_unload(1); destroy_ui_method(); \ ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \
OBJ_cleanup(); EVP_cleanup(); ENGINE_cleanup(); \ ENGINE_load_builtin_engines(); setup_ui_method(); } while(0)
CRYPTO_cleanup_all_ex_data(); ERR_remove_thread_state(NULL); \ # else
RAND_cleanup(); \ # define apps_startup() \
ERR_free_strings(); zlib_cleanup();} while(0) do { _fmode=O_BINARY; do_pipe_sig(); CRYPTO_malloc_init(); \
ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \
ENGINE_load_builtin_engines(); setup_ui_method(); } while(0)
# endif
# else
# define apps_startup() \
do { do_pipe_sig(); OpenSSL_add_all_algorithms(); \
ERR_load_crypto_strings(); ENGINE_load_builtin_engines(); \
setup_ui_method(); } while(0)
# endif
# define apps_shutdown() \
do { CONF_modules_unload(1); destroy_ui_method(); \
EVP_cleanup(); ENGINE_cleanup(); \
CRYPTO_cleanup_all_ex_data(); ERR_remove_state(0); \
ERR_free_strings(); } while(0)
# else # else
# define apps_startup() \ # if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WIN16) || \
do { do_pipe_sig(); CRYPTO_malloc_init(); \ defined(OPENSSL_SYS_WIN32)
ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \ # ifdef _O_BINARY
setup_ui_method(); } while(0) # define apps_startup() \
# define apps_shutdown() \ do { _fmode=_O_BINARY; do_pipe_sig(); CRYPTO_malloc_init(); \
do { CONF_modules_unload(1); destroy_ui_method(); \ ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \
OBJ_cleanup(); EVP_cleanup(); \ setup_ui_method(); } while(0)
CRYPTO_cleanup_all_ex_data(); ERR_remove_thread_state(NULL); \ # else
RAND_cleanup(); \ # define apps_startup() \
ERR_free_strings(); zlib_cleanup(); } while(0) do { _fmode=O_BINARY; do_pipe_sig(); CRYPTO_malloc_init(); \
ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \
setup_ui_method(); } while(0)
# endif
# else
# define apps_startup() \
do { do_pipe_sig(); OpenSSL_add_all_algorithms(); \
ERR_load_crypto_strings(); \
setup_ui_method(); } while(0)
# endif
# define apps_shutdown() \
do { CONF_modules_unload(1); destroy_ui_method(); \
EVP_cleanup(); \
CRYPTO_cleanup_all_ex_data(); ERR_remove_state(0); \
ERR_free_strings(); } while(0)
# endif # endif
# endif #endif
# ifdef OPENSSL_SYSNAME_WIN32 typedef struct args_st
# define openssl_fdset(a,b) FD_SET((unsigned int)a, b) {
# else char **data;
# define openssl_fdset(a,b) FD_SET(a, b) int count;
# endif } ARGS;
typedef struct args_st { #define PW_MIN_LENGTH 4
char **data; typedef struct pw_cb_data
int count; {
} ARGS; const void *password;
const char *prompt_info;
} PW_CB_DATA;
# define PW_MIN_LENGTH 4 int password_callback(char *buf, int bufsiz, int verify,
typedef struct pw_cb_data { PW_CB_DATA *cb_data);
const void *password;
const char *prompt_info;
} PW_CB_DATA;
int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_data);
int setup_ui_method(void); int setup_ui_method(void);
void destroy_ui_method(void); void destroy_ui_method(void);
@ -230,13 +250,12 @@ void destroy_ui_method(void);
int should_retry(int i); int should_retry(int i);
int args_from_file(char *file, int *argc, char **argv[]); int args_from_file(char *file, int *argc, char **argv[]);
int str2fmt(char *s); int str2fmt(char *s);
void program_name(char *in, char *out, int size); void program_name(char *in,char *out,int size);
int chopup_args(ARGS *arg, char *buf, int *argc, char **argv[]); int chopup_args(ARGS *arg,char *buf, int *argc, char **argv[]);
# ifdef HEADER_X509_H #ifdef HEADER_X509_H
int dump_cert_text(BIO *out, X509 *x); int dump_cert_text(BIO *out, X509 *x);
void print_name(BIO *out, const char *title, X509_NAME *nm, void print_name(BIO *out, char *title, X509_NAME *nm, unsigned long lflags);
unsigned long lflags); #endif
# endif
int set_cert_ex(unsigned long *flags, const char *arg); int set_cert_ex(unsigned long *flags, const char *arg);
int set_name_ex(unsigned long *flags, const char *arg); int set_name_ex(unsigned long *flags, const char *arg);
int set_ext_copy(int *copy_type, const char *arg); int set_ext_copy(int *copy_type, const char *arg);
@ -244,134 +263,79 @@ int copy_extensions(X509 *x, X509_REQ *req, int copy_type);
int app_passwd(BIO *err, char *arg1, char *arg2, char **pass1, char **pass2); int app_passwd(BIO *err, char *arg1, char *arg2, char **pass1, char **pass2);
int add_oid_section(BIO *err, CONF *conf); int add_oid_section(BIO *err, CONF *conf);
X509 *load_cert(BIO *err, const char *file, int format, X509 *load_cert(BIO *err, const char *file, int format,
const char *pass, ENGINE *e, const char *cert_descrip); const char *pass, ENGINE *e, const char *cert_descrip);
EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin, EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin,
const char *pass, ENGINE *e, const char *key_descrip); const char *pass, ENGINE *e, const char *key_descrip);
EVP_PKEY *load_pubkey(BIO *err, const char *file, int format, int maybe_stdin, EVP_PKEY *load_pubkey(BIO *err, const char *file, int format, int maybe_stdin,
const char *pass, ENGINE *e, const char *key_descrip); const char *pass, ENGINE *e, const char *key_descrip);
STACK_OF(X509) *load_certs(BIO *err, const char *file, int format, STACK_OF(X509) *load_certs(BIO *err, const char *file, int format,
const char *pass, ENGINE *e, const char *pass, ENGINE *e, const char *cert_descrip);
const char *cert_descrip);
STACK_OF(X509_CRL) *load_crls(BIO *err, const char *file, int format,
const char *pass, ENGINE *e,
const char *cert_descrip);
X509_STORE *setup_verify(BIO *bp, char *CAfile, char *CApath); X509_STORE *setup_verify(BIO *bp, char *CAfile, char *CApath);
# ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
ENGINE *setup_engine(BIO *err, const char *engine, int debug); ENGINE *setup_engine(BIO *err, const char *engine, int debug);
# endif #endif
# ifndef OPENSSL_NO_OCSP
OCSP_RESPONSE *process_responder(BIO *err, OCSP_REQUEST *req,
char *host, char *path, char *port,
int use_ssl, STACK_OF(CONF_VALUE) *headers,
int req_timeout);
# endif
int load_config(BIO *err, CONF *cnf); int load_config(BIO *err, CONF *cnf);
char *make_config_name(void); char *make_config_name(void);
/* Functions defined in ca.c and also used in ocsp.c */ /* Functions defined in ca.c and also used in ocsp.c */
int unpack_revinfo(ASN1_TIME **prevtm, int *preason, ASN1_OBJECT **phold, int unpack_revinfo(ASN1_TIME **prevtm, int *preason, ASN1_OBJECT **phold,
ASN1_GENERALIZEDTIME **pinvtm, const char *str); ASN1_GENERALIZEDTIME **pinvtm, char *str);
# define DB_type 0 #define DB_type 0
# define DB_exp_date 1 #define DB_exp_date 1
# define DB_rev_date 2 #define DB_rev_date 2
# define DB_serial 3 /* index - unique */ #define DB_serial 3 /* index - unique */
# define DB_file 4 #define DB_file 4
# define DB_name 5 /* index - unique when active and not #define DB_name 5 /* index - unique when active and not disabled */
* disabled */ #define DB_NUMBER 6
# define DB_NUMBER 6
# define DB_TYPE_REV 'R' #define DB_TYPE_REV 'R'
# define DB_TYPE_EXP 'E' #define DB_TYPE_EXP 'E'
# define DB_TYPE_VAL 'V' #define DB_TYPE_VAL 'V'
typedef struct db_attr_st { typedef struct db_attr_st
int unique_subject; {
} DB_ATTR; int unique_subject;
typedef struct ca_db_st { } DB_ATTR;
DB_ATTR attributes; typedef struct ca_db_st
TXT_DB *db; {
} CA_DB; DB_ATTR attributes;
TXT_DB *db;
} CA_DB;
BIGNUM *load_serial(char *serialfile, int create, ASN1_INTEGER **retai); BIGNUM *load_serial(char *serialfile, int create, ASN1_INTEGER **retai);
int save_serial(char *serialfile, char *suffix, BIGNUM *serial, int save_serial(char *serialfile, char *suffix, BIGNUM *serial, ASN1_INTEGER **retai);
ASN1_INTEGER **retai);
int rotate_serial(char *serialfile, char *new_suffix, char *old_suffix); int rotate_serial(char *serialfile, char *new_suffix, char *old_suffix);
int rand_serial(BIGNUM *b, ASN1_INTEGER *ai); int rand_serial(BIGNUM *b, ASN1_INTEGER *ai);
CA_DB *load_index(char *dbfile, DB_ATTR *dbattr); CA_DB *load_index(char *dbfile, DB_ATTR *dbattr);
int index_index(CA_DB *db); int index_index(CA_DB *db);
int save_index(const char *dbfile, const char *suffix, CA_DB *db); int save_index(char *dbfile, char *suffix, CA_DB *db);
int rotate_index(const char *dbfile, const char *new_suffix, int rotate_index(char *dbfile, char *new_suffix, char *old_suffix);
const char *old_suffix);
void free_index(CA_DB *db); void free_index(CA_DB *db);
# define index_name_cmp_noconst(a, b) \ int index_name_cmp(const char **a, const char **b);
index_name_cmp((const OPENSSL_CSTRING *)CHECKED_PTR_OF(OPENSSL_STRING, a), \
(const OPENSSL_CSTRING *)CHECKED_PTR_OF(OPENSSL_STRING, b))
int index_name_cmp(const OPENSSL_CSTRING *a, const OPENSSL_CSTRING *b);
int parse_yesno(const char *str, int def);
X509_NAME *parse_name(char *str, long chtype, int multirdn); X509_NAME *do_subject(char *str, long chtype);
int args_verify(char ***pargs, int *pargc,
int *badarg, BIO *err, X509_VERIFY_PARAM **pm);
void policies_print(BIO *out, X509_STORE_CTX *ctx);
int bio_to_mem(unsigned char **out, int maxlen, BIO *in);
int pkey_ctrl_string(EVP_PKEY_CTX *ctx, char *value);
int init_gen_str(BIO *err, EVP_PKEY_CTX **pctx,
const char *algname, ENGINE *e, int do_param);
int do_X509_sign(BIO *err, X509 *x, EVP_PKEY *pkey, const EVP_MD *md,
STACK_OF(OPENSSL_STRING) *sigopts);
int do_X509_REQ_sign(BIO *err, X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md,
STACK_OF(OPENSSL_STRING) *sigopts);
int do_X509_CRL_sign(BIO *err, X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md,
STACK_OF(OPENSSL_STRING) *sigopts);
# ifndef OPENSSL_NO_PSK
extern char *psk_key;
# endif
# ifndef OPENSSL_NO_JPAKE
void jpake_client_auth(BIO *out, BIO *conn, const char *secret);
void jpake_server_auth(BIO *out, BIO *conn, const char *secret);
# endif
# if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) #define FORMAT_UNDEF 0
unsigned char *next_protos_parse(unsigned short *outlen, const char *in); #define FORMAT_ASN1 1
# endif /* !OPENSSL_NO_TLSEXT && #define FORMAT_TEXT 2
* !OPENSSL_NO_NEXTPROTONEG */ #define FORMAT_PEM 3
#define FORMAT_NETSCAPE 4
#define FORMAT_PKCS12 5
#define FORMAT_SMIME 6
#define FORMAT_ENGINE 7
#define FORMAT_IISSGC 8 /* XXX this stupid macro helps us to avoid
* adding yet another param to load_*key() */
# define FORMAT_UNDEF 0 #define EXT_COPY_NONE 0
# define FORMAT_ASN1 1 #define EXT_COPY_ADD 1
# define FORMAT_TEXT 2 #define EXT_COPY_ALL 2
# define FORMAT_PEM 3
# define FORMAT_NETSCAPE 4
# define FORMAT_PKCS12 5
# define FORMAT_SMIME 6
# define FORMAT_ENGINE 7
# define FORMAT_IISSGC 8 /* XXX this stupid macro helps us to avoid
* adding yet another param to load_*key() */
# define FORMAT_PEMRSA 9 /* PEM RSAPubicKey format */
# define FORMAT_ASN1RSA 10 /* DER RSAPubicKey format */
# define FORMAT_MSBLOB 11 /* MS Key blob format */
# define FORMAT_PVK 12 /* MS PVK file format */
# define EXT_COPY_NONE 0 #define NETSCAPE_CERT_HDR "certificate"
# define EXT_COPY_ADD 1
# define EXT_COPY_ALL 2
# define NETSCAPE_CERT_HDR "certificate" #define APP_PASS_LEN 1024
# define APP_PASS_LEN 1024 #define SERIAL_RAND_BITS 64
# define SERIAL_RAND_BITS 64
int app_isdir(const char *);
int raw_read_stdin(void *, int);
int raw_write_stdout(const void *, int);
# define TM_START 0
# define TM_STOP 1
double app_tminterval(int stop, int usertime);
# define OPENSSL_NO_SSL_INTERN
#endif #endif

View File

@ -56,9 +56,8 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
/* /* A nice addition from Dr Stephen Henson <shenson@bigfoot.com> to
* A nice addition from Dr Stephen Henson <steve@openssl.org> to add the * add the -strparse option which parses nested binary structures
* -strparse option which parses nested binary structures
*/ */
#include <stdio.h> #include <stdio.h>
@ -70,361 +69,277 @@
#include <openssl/x509.h> #include <openssl/x509.h>
#include <openssl/pem.h> #include <openssl/pem.h>
/*- /* -inform arg - input format - default PEM (DER or PEM)
* -inform arg - input format - default PEM (DER or PEM) * -in arg - input file - default stdin
* -in arg - input file - default stdin * -i - indent the details by depth
* -i - indent the details by depth * -offset - where in the file to start
* -offset - where in the file to start * -length - how many bytes to use
* -length - how many bytes to use * -oid file - extra oid description file
* -oid file - extra oid description file
*/ */
#undef PROG #undef PROG
#define PROG asn1parse_main #define PROG asn1parse_main
int MAIN(int, char **); int MAIN(int, char **);
static int do_generate(BIO *bio, char *genstr, char *genconf, BUF_MEM *buf);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
int i, badops = 0, offset = 0, ret = 1, j; int i,badops=0,offset=0,ret=1,j;
unsigned int length = 0; unsigned int length=0;
long num, tmplen; long num,tmplen;
BIO *in = NULL, *out = NULL, *b64 = NULL, *derout = NULL; BIO *in=NULL,*out=NULL,*b64=NULL, *derout = NULL;
int informat, indent = 0, noout = 0, dump = 0; int informat,indent=0, noout = 0, dump = 0;
char *infile = NULL, *str = NULL, *prog, *oidfile = NULL, *derfile = NULL; char *infile=NULL,*str=NULL,*prog,*oidfile=NULL, *derfile=NULL;
char *genstr = NULL, *genconf = NULL; unsigned char *tmpbuf;
unsigned char *tmpbuf; BUF_MEM *buf=NULL;
const unsigned char *ctmpbuf; STACK *osk=NULL;
BUF_MEM *buf = NULL; ASN1_TYPE *at=NULL;
STACK_OF(OPENSSL_STRING) *osk = NULL;
ASN1_TYPE *at = NULL;
informat = FORMAT_PEM; informat=FORMAT_PEM;
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
prog = argv[0]; prog=argv[0];
argc--; argc--;
argv++; argv++;
if ((osk = sk_OPENSSL_STRING_new_null()) == NULL) { if ((osk=sk_new_null()) == NULL)
BIO_printf(bio_err, "Memory allocation failure\n"); {
goto end; BIO_printf(bio_err,"Memory allocation failure\n");
} goto end;
while (argc >= 1) { }
if (strcmp(*argv, "-inform") == 0) { while (argc >= 1)
if (--argc < 1) {
goto bad; if (strcmp(*argv,"-inform") == 0)
informat = str2fmt(*(++argv)); {
} else if (strcmp(*argv, "-in") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) informat=str2fmt(*(++argv));
goto bad; }
infile = *(++argv); else if (strcmp(*argv,"-in") == 0)
} else if (strcmp(*argv, "-out") == 0) { {
if (--argc < 1) if (--argc < 1) goto bad;
goto bad; infile= *(++argv);
derfile = *(++argv); }
} else if (strcmp(*argv, "-i") == 0) { else if (strcmp(*argv,"-out") == 0)
indent = 1; {
} else if (strcmp(*argv, "-noout") == 0) if (--argc < 1) goto bad;
noout = 1; derfile= *(++argv);
else if (strcmp(*argv, "-oid") == 0) { }
if (--argc < 1) else if (strcmp(*argv,"-i") == 0)
goto bad; {
oidfile = *(++argv); indent=1;
} else if (strcmp(*argv, "-offset") == 0) { }
if (--argc < 1) else if (strcmp(*argv,"-noout") == 0) noout = 1;
goto bad; else if (strcmp(*argv,"-oid") == 0)
offset = atoi(*(++argv)); {
} else if (strcmp(*argv, "-length") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) oidfile= *(++argv);
goto bad; }
length = atoi(*(++argv)); else if (strcmp(*argv,"-offset") == 0)
if (length == 0) {
goto bad; if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-dump") == 0) { offset= atoi(*(++argv));
dump = -1; }
} else if (strcmp(*argv, "-dlimit") == 0) { else if (strcmp(*argv,"-length") == 0)
if (--argc < 1) {
goto bad; if (--argc < 1) goto bad;
dump = atoi(*(++argv)); length= atoi(*(++argv));
if (dump <= 0) if (length == 0) goto bad;
goto bad; }
} else if (strcmp(*argv, "-strparse") == 0) { else if (strcmp(*argv,"-dump") == 0)
if (--argc < 1) {
goto bad; dump= -1;
sk_OPENSSL_STRING_push(osk, *(++argv)); }
} else if (strcmp(*argv, "-genstr") == 0) { else if (strcmp(*argv,"-dlimit") == 0)
if (--argc < 1) {
goto bad; if (--argc < 1) goto bad;
genstr = *(++argv); dump= atoi(*(++argv));
} else if (strcmp(*argv, "-genconf") == 0) { if (dump <= 0) goto bad;
if (--argc < 1) }
goto bad; else if (strcmp(*argv,"-strparse") == 0)
genconf = *(++argv); {
} else { if (--argc < 1) goto bad;
BIO_printf(bio_err, "unknown option %s\n", *argv); sk_push(osk,*(++argv));
badops = 1; }
break; else
} {
argc--; BIO_printf(bio_err,"unknown option %s\n",*argv);
argv++; badops=1;
} break;
}
argc--;
argv++;
}
if (badops) { if (badops)
bad: {
BIO_printf(bio_err, "%s [options] <infile\n", prog); bad:
BIO_printf(bio_err, "where options are\n"); BIO_printf(bio_err,"%s [options] <infile\n",prog);
BIO_printf(bio_err, " -inform arg input format - one of DER PEM\n"); BIO_printf(bio_err,"where options are\n");
BIO_printf(bio_err, " -in arg input file\n"); BIO_printf(bio_err," -inform arg input format - one of DER TXT PEM\n");
BIO_printf(bio_err, BIO_printf(bio_err," -in arg input file\n");
" -out arg output file (output format is always DER\n"); BIO_printf(bio_err," -out arg output file (output format is always DER\n");
BIO_printf(bio_err, " -noout arg don't produce any output\n"); BIO_printf(bio_err," -noout arg don't produce any output\n");
BIO_printf(bio_err, " -offset arg offset into file\n"); BIO_printf(bio_err," -offset arg offset into file\n");
BIO_printf(bio_err, " -length arg length of section in file\n"); BIO_printf(bio_err," -length arg length of section in file\n");
BIO_printf(bio_err, " -i indent entries\n"); BIO_printf(bio_err," -i indent entries\n");
BIO_printf(bio_err, " -dump dump unknown data in hex form\n"); BIO_printf(bio_err," -dump dump unknown data in hex form\n");
BIO_printf(bio_err, BIO_printf(bio_err," -dlimit arg dump the first arg bytes of unknown data in hex form\n");
" -dlimit arg dump the first arg bytes of unknown data in hex form\n"); BIO_printf(bio_err," -oid file file of extra oid definitions\n");
BIO_printf(bio_err, " -oid file file of extra oid definitions\n"); BIO_printf(bio_err," -strparse offset\n");
BIO_printf(bio_err, " -strparse offset\n"); BIO_printf(bio_err," a series of these can be used to 'dig' into multiple\n");
BIO_printf(bio_err, BIO_printf(bio_err," ASN1 blob wrappings\n");
" a series of these can be used to 'dig' into multiple\n"); goto end;
BIO_printf(bio_err, " ASN1 blob wrappings\n"); }
BIO_printf(bio_err,
" -genstr str string to generate ASN1 structure from\n");
BIO_printf(bio_err,
" -genconf file file to generate ASN1 structure from\n");
goto end;
}
ERR_load_crypto_strings(); ERR_load_crypto_strings();
in = BIO_new(BIO_s_file()); in=BIO_new(BIO_s_file());
out = BIO_new(BIO_s_file()); out=BIO_new(BIO_s_file());
if ((in == NULL) || (out == NULL)) { if ((in == NULL) || (out == NULL))
ERR_print_errors(bio_err); {
goto end; ERR_print_errors(bio_err);
} goto end;
BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT); }
BIO_set_fp(out,stdout,BIO_NOCLOSE|BIO_FP_TEXT);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
#endif #endif
if (oidfile != NULL) { if (oidfile != NULL)
if (BIO_read_filename(in, oidfile) <= 0) { {
BIO_printf(bio_err, "problems opening %s\n", oidfile); if (BIO_read_filename(in,oidfile) <= 0)
ERR_print_errors(bio_err); {
goto end; BIO_printf(bio_err,"problems opening %s\n",oidfile);
} ERR_print_errors(bio_err);
OBJ_create_objects(in); goto end;
} }
OBJ_create_objects(in);
}
if (infile == NULL) if (infile == NULL)
BIO_set_fp(in, stdin, BIO_NOCLOSE); BIO_set_fp(in,stdin,BIO_NOCLOSE);
else { else
if (BIO_read_filename(in, infile) <= 0) { {
perror(infile); if (BIO_read_filename(in,infile) <= 0)
goto end; {
} perror(infile);
} goto end;
}
}
if (derfile) { if (derfile) {
if (!(derout = BIO_new_file(derfile, "wb"))) { if(!(derout = BIO_new_file(derfile, "wb"))) {
BIO_printf(bio_err, "problems opening %s\n", derfile); BIO_printf(bio_err,"problems opening %s\n",derfile);
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
} }
} }
if ((buf = BUF_MEM_new()) == NULL) if ((buf=BUF_MEM_new()) == NULL) goto end;
goto end; if (!BUF_MEM_grow(buf,BUFSIZ*8)) goto end; /* Pre-allocate :-) */
if (!BUF_MEM_grow(buf, BUFSIZ * 8))
goto end; /* Pre-allocate :-) */
if (genstr || genconf) { if (informat == FORMAT_PEM)
num = do_generate(bio_err, genstr, genconf, buf); {
if (num < 0) { BIO *tmp;
ERR_print_errors(bio_err);
goto end;
}
}
else { if ((b64=BIO_new(BIO_f_base64())) == NULL)
goto end;
BIO_push(b64,in);
tmp=in;
in=b64;
b64=tmp;
}
if (informat == FORMAT_PEM) { num=0;
BIO *tmp; for (;;)
{
if (!BUF_MEM_grow(buf,(int)num+BUFSIZ)) goto end;
i=BIO_read(in,&(buf->data[num]),BUFSIZ);
if (i <= 0) break;
num+=i;
}
str=buf->data;
if ((b64 = BIO_new(BIO_f_base64())) == NULL) /* If any structs to parse go through in sequence */
goto end;
BIO_push(b64, in);
tmp = in;
in = b64;
b64 = tmp;
}
num = 0; if (sk_num(osk))
for (;;) { {
if (!BUF_MEM_grow(buf, (int)num + BUFSIZ)) tmpbuf=(unsigned char *)str;
goto end; tmplen=num;
i = BIO_read(in, &(buf->data[num]), BUFSIZ); for (i=0; i<sk_num(osk); i++)
if (i <= 0) {
break; ASN1_TYPE *atmp;
num += i; j=atoi(sk_value(osk,i));
} if (j == 0)
} {
str = buf->data; BIO_printf(bio_err,"'%s' is an invalid number\n",sk_value(osk,i));
continue;
}
tmpbuf+=j;
tmplen-=j;
atmp = at;
at = d2i_ASN1_TYPE(NULL,&tmpbuf,tmplen);
ASN1_TYPE_free(atmp);
if(!at)
{
BIO_printf(bio_err,"Error parsing structure\n");
ERR_print_errors(bio_err);
goto end;
}
/* hmm... this is a little evil but it works */
tmpbuf=at->value.asn1_string->data;
tmplen=at->value.asn1_string->length;
}
str=(char *)tmpbuf;
num=tmplen;
}
/* If any structs to parse go through in sequence */ if (offset >= num)
{
BIO_printf(bio_err, "Error: offset too large\n");
goto end;
}
if (sk_OPENSSL_STRING_num(osk)) { num -= offset;
tmpbuf = (unsigned char *)str;
tmplen = num;
for (i = 0; i < sk_OPENSSL_STRING_num(osk); i++) {
ASN1_TYPE *atmp;
int typ;
j = atoi(sk_OPENSSL_STRING_value(osk, i));
if (j == 0) {
BIO_printf(bio_err, "'%s' is an invalid number\n",
sk_OPENSSL_STRING_value(osk, i));
continue;
}
tmpbuf += j;
tmplen -= j;
atmp = at;
ctmpbuf = tmpbuf;
at = d2i_ASN1_TYPE(NULL, &ctmpbuf, tmplen);
ASN1_TYPE_free(atmp);
if (!at) {
BIO_printf(bio_err, "Error parsing structure\n");
ERR_print_errors(bio_err);
goto end;
}
typ = ASN1_TYPE_get(at);
if ((typ == V_ASN1_OBJECT)
|| (typ == V_ASN1_BOOLEAN)
|| (typ == V_ASN1_NULL)) {
BIO_printf(bio_err, "Can't parse %s type\n", ASN1_tag2str(typ));
ERR_print_errors(bio_err);
goto end;
}
/* hmm... this is a little evil but it works */
tmpbuf = at->value.asn1_string->data;
tmplen = at->value.asn1_string->length;
}
str = (char *)tmpbuf;
num = tmplen;
}
if (offset >= num) { if ((length == 0) || ((long)length > num)) length=(unsigned int)num;
BIO_printf(bio_err, "Error: offset too large\n"); if(derout) {
goto end; if(BIO_write(derout, str + offset, length) != (int)length) {
} BIO_printf(bio_err, "Error writing output\n");
ERR_print_errors(bio_err);
goto end;
}
}
if (!noout &&
!ASN1_parse_dump(out,(unsigned char *)&(str[offset]),length,
indent,dump))
{
ERR_print_errors(bio_err);
goto end;
}
ret=0;
end:
BIO_free(derout);
if (in != NULL) BIO_free(in);
if (out != NULL) BIO_free_all(out);
if (b64 != NULL) BIO_free(b64);
if (ret != 0)
ERR_print_errors(bio_err);
if (buf != NULL) BUF_MEM_free(buf);
if (at != NULL) ASN1_TYPE_free(at);
if (osk != NULL) sk_free(osk);
OBJ_cleanup();
apps_shutdown();
OPENSSL_EXIT(ret);
}
num -= offset;
if ((length == 0) || ((long)length > num))
length = (unsigned int)num;
if (derout) {
if (BIO_write(derout, str + offset, length) != (int)length) {
BIO_printf(bio_err, "Error writing output\n");
ERR_print_errors(bio_err);
goto end;
}
}
if (!noout &&
!ASN1_parse_dump(out, (unsigned char *)&(str[offset]), length,
indent, dump)) {
ERR_print_errors(bio_err);
goto end;
}
ret = 0;
end:
BIO_free(derout);
if (in != NULL)
BIO_free(in);
if (out != NULL)
BIO_free_all(out);
if (b64 != NULL)
BIO_free(b64);
if (ret != 0)
ERR_print_errors(bio_err);
if (buf != NULL)
BUF_MEM_free(buf);
if (at != NULL)
ASN1_TYPE_free(at);
if (osk != NULL)
sk_OPENSSL_STRING_free(osk);
OBJ_cleanup();
apps_shutdown();
OPENSSL_EXIT(ret);
}
static int do_generate(BIO *bio, char *genstr, char *genconf, BUF_MEM *buf)
{
CONF *cnf = NULL;
int len;
long errline = 0;
unsigned char *p;
ASN1_TYPE *atyp = NULL;
if (genconf) {
cnf = NCONF_new(NULL);
if (!NCONF_load(cnf, genconf, &errline))
goto conferr;
if (!genstr)
genstr = NCONF_get_string(cnf, "default", "asn1");
if (!genstr) {
BIO_printf(bio, "Can't find 'asn1' in '%s'\n", genconf);
goto err;
}
}
atyp = ASN1_generate_nconf(genstr, cnf);
NCONF_free(cnf);
cnf = NULL;
if (!atyp)
return -1;
len = i2d_ASN1_TYPE(atyp, NULL);
if (len <= 0)
goto err;
if (!BUF_MEM_grow(buf, len))
goto err;
p = (unsigned char *)buf->data;
i2d_ASN1_TYPE(atyp, &p);
ASN1_TYPE_free(atyp);
return len;
conferr:
if (errline > 0)
BIO_printf(bio, "Error on line %ld of config file '%s'\n",
errline, genconf);
else
BIO_printf(bio, "Error loading config file '%s'\n", genconf);
err:
NCONF_free(cnf);
ASN1_TYPE_free(atyp);
return -1;
}

5103
apps/ca.c

File diff suppressed because it is too large Load Diff

View File

@ -60,166 +60,149 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#ifdef OPENSSL_NO_STDIO #ifdef OPENSSL_NO_STDIO
# define APPS_WIN16 #define APPS_WIN16
#endif #endif
#include "apps.h" #include "apps.h"
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/ssl.h> #include <openssl/ssl.h>
#undef PROG #undef PROG
#define PROG ciphers_main #define PROG ciphers_main
static const char *ciphers_usage[] = { static char *ciphers_usage[]={
"usage: ciphers args\n", "usage: ciphers args\n",
" -v - verbose mode, a textual listing of the SSL/TLS ciphers in OpenSSL\n", " -v - verbose mode, a textual listing of the ciphers in SSLeay\n",
" -V - even more verbose\n", " -ssl2 - SSL2 mode\n",
" -ssl2 - SSL2 mode\n", " -ssl3 - SSL3 mode\n",
" -ssl3 - SSL3 mode\n", " -tls1 - TLS1 mode\n",
" -tls1 - TLS1 mode\n", NULL
NULL
}; };
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
int ret = 1, i; int ret=1,i;
int verbose = 0, Verbose = 0; int verbose=0;
const char **pp; char **pp;
const char *p; const char *p;
int badops = 0; int badops=0;
SSL_CTX *ctx = NULL; SSL_CTX *ctx=NULL;
SSL *ssl = NULL; SSL *ssl=NULL;
char *ciphers = NULL; char *ciphers=NULL;
const SSL_METHOD *meth = NULL; SSL_METHOD *meth=NULL;
STACK_OF(SSL_CIPHER) *sk; STACK_OF(SSL_CIPHER) *sk;
char buf[512]; char buf[512];
BIO *STDout = NULL; BIO *STDout=NULL;
meth = SSLv23_server_method(); #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
meth=SSLv23_server_method();
apps_startup(); #elif !defined(OPENSSL_NO_SSL3)
meth=SSLv3_server_method();
if (bio_err == NULL) #elif !defined(OPENSSL_NO_SSL2)
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); meth=SSLv2_server_method();
STDout = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
STDout = BIO_push(tmpbio, STDout);
}
#endif #endif
if (!load_config(bio_err, NULL))
goto end;
argc--; apps_startup();
argv++;
while (argc >= 1) { if (bio_err == NULL)
if (strcmp(*argv, "-v") == 0) bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
verbose = 1; STDout=BIO_new_fp(stdout,BIO_NOCLOSE);
else if (strcmp(*argv, "-V") == 0) #ifdef OPENSSL_SYS_VMS
verbose = Verbose = 1; {
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
STDout = BIO_push(tmpbio, STDout);
}
#endif
argc--;
argv++;
while (argc >= 1)
{
if (strcmp(*argv,"-v") == 0)
verbose=1;
#ifndef OPENSSL_NO_SSL2 #ifndef OPENSSL_NO_SSL2
else if (strcmp(*argv, "-ssl2") == 0) else if (strcmp(*argv,"-ssl2") == 0)
meth = SSLv2_client_method(); meth=SSLv2_client_method();
#endif #endif
#ifndef OPENSSL_NO_SSL3 #ifndef OPENSSL_NO_SSL3
else if (strcmp(*argv, "-ssl3") == 0) else if (strcmp(*argv,"-ssl3") == 0)
meth = SSLv3_client_method(); meth=SSLv3_client_method();
#endif #endif
#ifndef OPENSSL_NO_TLS1 #ifndef OPENSSL_NO_TLS1
else if (strcmp(*argv, "-tls1") == 0) else if (strcmp(*argv,"-tls1") == 0)
meth = TLSv1_client_method(); meth=TLSv1_client_method();
#endif #endif
else if ((strncmp(*argv, "-h", 2) == 0) || (strcmp(*argv, "-?") == 0)) { else if ((strncmp(*argv,"-h",2) == 0) ||
badops = 1; (strcmp(*argv,"-?") == 0))
break; {
} else { badops=1;
ciphers = *argv; break;
} }
argc--; else
argv++; {
} ciphers= *argv;
}
argc--;
argv++;
}
if (badops) { if (badops)
for (pp = ciphers_usage; (*pp != NULL); pp++) {
BIO_printf(bio_err, "%s", *pp); for (pp=ciphers_usage; (*pp != NULL); pp++)
goto end; BIO_printf(bio_err,"%s",*pp);
} goto end;
}
OpenSSL_add_ssl_algorithms(); OpenSSL_add_ssl_algorithms();
ctx = SSL_CTX_new(meth); ctx=SSL_CTX_new(meth);
if (ctx == NULL) if (ctx == NULL) goto err;
goto err; if (ciphers != NULL) {
if (ciphers != NULL) { if(!SSL_CTX_set_cipher_list(ctx,ciphers)) {
if (!SSL_CTX_set_cipher_list(ctx, ciphers)) { BIO_printf(bio_err, "Error in cipher list\n");
BIO_printf(bio_err, "Error in cipher list\n"); goto err;
goto err; }
} }
} ssl=SSL_new(ctx);
ssl = SSL_new(ctx); if (ssl == NULL) goto err;
if (ssl == NULL)
goto err;
if (!verbose) {
for (i = 0;; i++) {
p = SSL_get_cipher_list(ssl, i);
if (p == NULL)
break;
if (i != 0)
BIO_printf(STDout, ":");
BIO_printf(STDout, "%s", p);
}
BIO_printf(STDout, "\n");
} else { /* verbose */
sk = SSL_get_ciphers(ssl); if (!verbose)
{
for (i=0; ; i++)
{
p=SSL_get_cipher_list(ssl,i);
if (p == NULL) break;
if (i != 0) BIO_printf(STDout,":");
BIO_printf(STDout,"%s",p);
}
BIO_printf(STDout,"\n");
}
else
{
sk=SSL_get_ciphers(ssl);
for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) { for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
SSL_CIPHER *c; {
BIO_puts(STDout,SSL_CIPHER_description(
sk_SSL_CIPHER_value(sk,i),
buf,sizeof buf));
}
}
c = sk_SSL_CIPHER_value(sk, i); ret=0;
if (0)
{
err:
SSL_load_error_strings();
ERR_print_errors(bio_err);
}
end:
if (ctx != NULL) SSL_CTX_free(ctx);
if (ssl != NULL) SSL_free(ssl);
if (STDout != NULL) BIO_free_all(STDout);
apps_shutdown();
OPENSSL_EXIT(ret);
}
if (Verbose) {
unsigned long id = SSL_CIPHER_get_id(c);
int id0 = (int)(id >> 24);
int id1 = (int)((id >> 16) & 0xffL);
int id2 = (int)((id >> 8) & 0xffL);
int id3 = (int)(id & 0xffL);
if ((id & 0xff000000L) == 0x02000000L) {
/* SSL2 cipher */
BIO_printf(STDout, " 0x%02X,0x%02X,0x%02X - ", id1,
id2, id3);
} else if ((id & 0xff000000L) == 0x03000000L) {
/* SSL3 cipher */
BIO_printf(STDout, " 0x%02X,0x%02X - ", id2,
id3);
} else {
/* whatever */
BIO_printf(STDout, "0x%02X,0x%02X,0x%02X,0x%02X - ", id0,
id1, id2, id3);
}
}
BIO_puts(STDout, SSL_CIPHER_description(c, buf, sizeof buf));
}
}
ret = 0;
if (0) {
err:
SSL_load_error_strings();
ERR_print_errors(bio_err);
}
end:
if (ctx != NULL)
SSL_CTX_free(ctx);
if (ssl != NULL)
SSL_free(ssl);
if (STDout != NULL)
BIO_free_all(STDout);
apps_shutdown();
OPENSSL_EXIT(ret);
}

View File

@ -1,52 +1,24 @@
subject= C = UK, O = OpenSSL Group, OU = FOR TESTING PURPOSES ONLY, CN = Test Client Cert issuer= /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test CA (1024 bit)
issuer= C = UK, O = OpenSSL Group, OU = FOR TESTING PURPOSES ONLY, CN = OpenSSL Test Intermediate CA subject=/C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Client test cert (512 bit)
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIID5zCCAs+gAwIBAgIJALnu1NlVpZ6yMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV MIIB6TCCAVICAQIwDQYJKoZIhvcNAQEEBQAwWzELMAkGA1UEBhMCQVUxEzARBgNV
BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMSIwIAYDVQQLDBlGT1IgVEVT BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRswGQYD
VElORyBQVVJQT1NFUyBPTkxZMSUwIwYDVQQDDBxPcGVuU1NMIFRlc3QgSW50ZXJt VQQDExJUZXN0IENBICgxMDI0IGJpdCkwHhcNOTcwNjA5MTM1NzU2WhcNOTgwNjA5
ZWRpYXRlIENBMB4XDTExMTIwODE0MDE0OFoXDTIxMTAxNjE0MDE0OFowZDELMAkG MTM1NzU2WjBjMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDEaMBgG
A1UEBhMCVUsxFjAUBgNVBAoMDU9wZW5TU0wgR3JvdXAxIjAgBgNVBAsMGUZPUiBU A1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxIzAhBgNVBAMTGkNsaWVudCB0ZXN0IGNl
RVNUSU5HIFBVUlBPU0VTIE9OTFkxGTAXBgNVBAMMEFRlc3QgQ2xpZW50IENlcnQw cnQgKDUxMiBiaXQpMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALtv55QyzG6i2Plw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0ranbHRLcLVqN+0BzcZpY Z1pah7++Gv8L5j6Hnyr/uTZE1NLG0ABDDexmq/R4KedLjFEIYjocDui+IXs62NNt
+yOLqxzDWT1LD9eW1stC4NzXX9/DCtSIVyN7YIHdGLrIPr64IDdXXaMRzgZ2rOKs XrT8odkCAwEAATANBgkqhkiG9w0BAQQFAAOBgQBwtMmI7oGUG8nKmftQssATViH5
lmHCAiFpO/ja99gGCJRxH0xwQatqAULfJVHeUhs7OEGOZc2nWifjqKvGfNTilP7D NRRtoEw07DxJp/LfatHdrhqQB73eGdL5WILZJXk46Xz2e9WMSUjVCSYhdKxtflU3
nwi69ipQFq9oS19FmhwVHk2wg7KZGHI1qDyG04UrfCZMRitvS9+UVhPpIPjuiBi2 UR2Ajv1Oo0sTNdfz0wDqJNirLNtzyhhsaq8qMTrLwXrCP31VxBiigFSQSUFnZyTE
x3/FZIpL5gXJvvFK6xHY63oq2asyzBATntBgnP4qJFWWcvRx24wF1PnZabxuVoL2 9TKwhS4GlwbtCfxSKQ==
bPnQ/KvONDrw3IdqkKhYNTul7jEcu3OlcZIMw+7DiaKJLAzKb/bBF5gm/pwW6As9
AgMBAAGjgY8wgYwwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBeAwLAYJYIZI
AYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQW
BBSZHKyLoTh7Mb409Zn/mK1ceSDAjDAfBgNVHSMEGDAWgBQ2w2yI55X+sL3szj49
hqshgYfa2jANBgkqhkiG9w0BAQUFAAOCAQEAD0mL7PtPYgCEuDyOQSbLpeND5hVS
curxQdGnrJ6Acrhodb7E9ccATokeb0PLx6HBLQUicxhTZIQ9FbO43YkQcOU6C3BB
IlwskqmtN6+VmrQzNolHCDzvxNZs9lYL2VbGPGqVRyjZeHpoAlf9cQr8PgDb4d4b
vUx2KAhHQvV2nkmYvKyXcgnRuHggumF87mkxidriGAEFwH4qfOqetUg64WyxP7P2
QLipm04SyQa7ONtIApfVXgHcE42Py4/f4arzCzMjKe3VyhGkS7nsT55X/fWgTaRm
CQPkO+H94P958WTvQDt77bQ+D3IvYaVvfil8n6HJMOJfFT0LJuSUbpSXJg==
-----END CERTIFICATE----- -----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAtK2p2x0S3C1ajftAc3GaWPsji6scw1k9Sw/XltbLQuDc11/f MIIBOwIBAAJBALtv55QyzG6i2PlwZ1pah7++Gv8L5j6Hnyr/uTZE1NLG0ABDDexm
wwrUiFcje2CB3Ri6yD6+uCA3V12jEc4GdqzirJZhwgIhaTv42vfYBgiUcR9McEGr q/R4KedLjFEIYjocDui+IXs62NNtXrT8odkCAwEAAQJAbwXq0vJ/+uyEvsNgxLko
agFC3yVR3lIbOzhBjmXNp1on46irxnzU4pT+w58IuvYqUBavaEtfRZocFR5NsIOy /V86mGXQ/KrSkeKlL0r4ENxjcyeMAGoKu6J9yMY7+X9+Zm4nxShNfTsf/+Freoe1
mRhyNag8htOFK3wmTEYrb0vflFYT6SD47ogYtsd/xWSKS+YFyb7xSusR2Ot6Ktmr HQIhAPOSm5Q1YI+KIsII2GeVJx1U69+wnd71OasIPakS1L1XAiEAxQAW+J3/JWE0
MswQE57QYJz+KiRVlnL0cduMBdT52Wm8blaC9mz50PyrzjQ68NyHapCoWDU7pe4x ftEYakbhUOKL8tD1OaFZS71/5GdG7E8CIQCefUMmySSvwd6kC0VlATSWbW+d+jp/
HLtzpXGSDMPuw4miiSwMym/2wReYJv6cFugLPQIDAQABAoIBAAZOyc9MhIwLSU4L nWmM1KvqnAo5uQIhALqEADu5U1Wvt8UN8UDGBRPQulHWNycuNV45d3nnskWPAiAw
p4RgQvM4UVVe8/Id+3XTZ8NsXExJbWxXfIhiqGjaIfL8u4vsgRjcl+v1s/jo2/iT ueTyr6WsZ5+SD8g/Hy3xuvF3nPmJRH+rwvVihlcFOg==
KMab4o4D8gXD7UavQVDjtjb/ta79WL3SjRl2Uc9YjjMkyq6WmDNQeo2NKDdafCTB
1uzSJtLNipB8Z53ELPuHJhxX9QMHrMnuha49riQgXZ7buP9iQrHJFhImBjSzbxJx
L+TI6rkyLSf9Wi0Pd3L27Ob3QWNfNRYNSeTE+08eSRChkur5W0RuXAcuAICdQlCl
LBvWO/LmmvbzCqiDcgy/TliSb6CGGwgiNG7LJZmlkYNj8laGwalNlYZs3UrVv6NO
Br2loAECgYEA2kvCvPGj0Dg/6g7WhXDvAkEbcaL1tSeCxBbNH+6HS2UWMWvyTtCn
/bbD519QIdkvayy1QjEf32GV/UjUVmlULMLBcDy0DGjtL3+XpIhLKWDNxN1v1/ai
1oz23ZJCOgnk6K4qtFtlRS1XtynjA+rBetvYvLP9SKeFrnpzCgaA2r0CgYEA0+KX
1ACXDTNH5ySX3kMjSS9xdINf+OOw4CvPHFwbtc9aqk2HePlEsBTz5I/W3rKwXva3
NqZ/bRqVVeZB/hHKFywgdUQk2Uc5z/S7Lw70/w1HubNTXGU06Ngb6zOFAo/o/TwZ
zTP1BMIKSOB6PAZPS3l+aLO4FRIRotfFhgRHOoECgYEAmiZbqt8cJaJDB/5YYDzC
mp3tSk6gIb936Q6M5VqkMYp9pIKsxhk0N8aDCnTU+kIK6SzWBpr3/d9Ecmqmfyq7
5SvWO3KyVf0WWK9KH0abhOm2BKm2HBQvI0DB5u8sUx2/hsvOnjPYDISbZ11t0MtK
u35Zy89yMYcSsIYJjG/ROCUCgYEAgI2P9G5PNxEP5OtMwOsW84Y3Xat/hPAQFlI+
HES+AzbFGWJkeT8zL2nm95tVkFP1sggZ7Kxjz3w7cpx7GX0NkbWSE9O+T51pNASV
tN1sQ3p5M+/a+cnlqgfEGJVvc7iAcXQPa3LEi5h2yPR49QYXAgG6cifn3dDSpmwn
SUI7PQECgYEApGCIIpSRPLAEHTGmP87RBL1smurhwmy2s/pghkvUkWehtxg0sGHh
kuaqDWcskogv+QC0sVdytiLSz8G0DwcEcsHK1Fkyb8A+ayiw6jWJDo2m9+IF4Fww
1Te6jFPYDESnbhq7+TLGgHGhtwcu5cnb4vSuYXGXKupZGzoLOBbv1Zw=
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----

1223
apps/cms.c

File diff suppressed because it is too large Load Diff

View File

@ -67,368 +67,359 @@
#include <openssl/pem.h> #include <openssl/pem.h>
#undef PROG #undef PROG
#define PROG crl_main #define PROG crl_main
#undef POSTFIX #undef POSTFIX
#define POSTFIX ".rvk" #define POSTFIX ".rvk"
static const char *crl_usage[] = { static char *crl_usage[]={
"usage: crl args\n", "usage: crl args\n",
"\n", "\n",
" -inform arg - input format - default PEM (DER or PEM)\n", " -inform arg - input format - default PEM (DER or PEM)\n",
" -outform arg - output format - default PEM\n", " -outform arg - output format - default PEM\n",
" -text - print out a text format version\n", " -text - print out a text format version\n",
" -in arg - input file - default stdin\n", " -in arg - input file - default stdin\n",
" -out arg - output file - default stdout\n", " -out arg - output file - default stdout\n",
" -hash - print hash value\n", " -hash - print hash value\n",
#ifndef OPENSSL_NO_MD5 " -fingerprint - print the crl fingerprint\n",
" -hash_old - print old-style (MD5) hash value\n", " -issuer - print issuer DN\n",
#endif " -lastupdate - lastUpdate field\n",
" -fingerprint - print the crl fingerprint\n", " -nextupdate - nextUpdate field\n",
" -issuer - print issuer DN\n", " -noout - no CRL output\n",
" -lastupdate - lastUpdate field\n", " -CAfile name - verify CRL using certificates in file \"name\"\n",
" -nextupdate - nextUpdate field\n", " -CApath dir - verify CRL using certificates in \"dir\"\n",
" -crlnumber - print CRL number\n", " -nameopt arg - various certificate name options\n",
" -noout - no CRL output\n", NULL
" -CAfile name - verify CRL using certificates in file \"name\"\n",
" -CApath dir - verify CRL using certificates in \"dir\"\n",
" -nameopt arg - various certificate name options\n",
NULL
}; };
static X509_CRL *load_crl(char *file, int format); static X509_CRL *load_crl(char *file, int format);
static BIO *bio_out = NULL; static BIO *bio_out=NULL;
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
unsigned long nmflag = 0; unsigned long nmflag = 0;
X509_CRL *x = NULL; X509_CRL *x=NULL;
char *CAfile = NULL, *CApath = NULL; char *CAfile = NULL, *CApath = NULL;
int ret = 1, i, num, badops = 0; int ret=1,i,num,badops=0;
BIO *out = NULL; BIO *out=NULL;
int informat, outformat; int informat,outformat;
char *infile = NULL, *outfile = NULL; char *infile=NULL,*outfile=NULL;
int hash = 0, issuer = 0, lastupdate = 0, nextupdate = 0, noout = int hash=0,issuer=0,lastupdate=0,nextupdate=0,noout=0,text=0;
0, text = 0; int fingerprint = 0;
#ifndef OPENSSL_NO_MD5 char **pp;
int hash_old = 0; X509_STORE *store = NULL;
#endif X509_STORE_CTX ctx;
int fingerprint = 0, crlnumber = 0; X509_LOOKUP *lookup = NULL;
const char **pp; X509_OBJECT xobj;
X509_STORE *store = NULL; EVP_PKEY *pkey;
X509_STORE_CTX ctx; int do_ver = 0;
X509_LOOKUP *lookup = NULL; const EVP_MD *md_alg,*digest=EVP_md5();
X509_OBJECT xobj;
EVP_PKEY *pkey;
int do_ver = 0;
const EVP_MD *md_alg, *digest = EVP_sha1();
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
if (bio_out == NULL) if (bio_out == NULL)
if ((bio_out = BIO_new(BIO_s_file())) != NULL) { if ((bio_out=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_out, stdout, BIO_NOCLOSE); {
BIO_set_fp(bio_out,stdout,BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
bio_out = BIO_push(tmpbio, bio_out); bio_out = BIO_push(tmpbio, bio_out);
} }
#endif #endif
} }
informat = FORMAT_PEM; informat=FORMAT_PEM;
outformat = FORMAT_PEM; outformat=FORMAT_PEM;
argc--; argc--;
argv++; argv++;
num = 0; num=0;
while (argc >= 1) { while (argc >= 1)
{
#ifdef undef #ifdef undef
if (strcmp(*argv, "-p") == 0) { if (strcmp(*argv,"-p") == 0)
if (--argc < 1) {
goto bad; if (--argc < 1) goto bad;
if (!args_from_file(++argv, Nargc, Nargv)) { if (!args_from_file(++argv,Nargc,Nargv)) { goto end; }*/
goto end; }
}
*/}
#endif #endif
if (strcmp(*argv, "-inform") == 0) { if (strcmp(*argv,"-inform") == 0)
if (--argc < 1) {
goto bad; if (--argc < 1) goto bad;
informat = str2fmt(*(++argv)); informat=str2fmt(*(++argv));
} else if (strcmp(*argv, "-outform") == 0) { }
if (--argc < 1) else if (strcmp(*argv,"-outform") == 0)
goto bad; {
outformat = str2fmt(*(++argv)); if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-in") == 0) { outformat=str2fmt(*(++argv));
if (--argc < 1) }
goto bad; else if (strcmp(*argv,"-in") == 0)
infile = *(++argv); {
} else if (strcmp(*argv, "-out") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) infile= *(++argv);
goto bad; }
outfile = *(++argv); else if (strcmp(*argv,"-out") == 0)
} else if (strcmp(*argv, "-CApath") == 0) { {
if (--argc < 1) if (--argc < 1) goto bad;
goto bad; outfile= *(++argv);
CApath = *(++argv); }
do_ver = 1; else if (strcmp(*argv,"-CApath") == 0)
} else if (strcmp(*argv, "-CAfile") == 0) { {
if (--argc < 1) if (--argc < 1) goto bad;
goto bad; CApath = *(++argv);
CAfile = *(++argv); do_ver = 1;
do_ver = 1; }
} else if (strcmp(*argv, "-verify") == 0) else if (strcmp(*argv,"-CAfile") == 0)
do_ver = 1; {
else if (strcmp(*argv, "-text") == 0) if (--argc < 1) goto bad;
text = 1; CAfile = *(++argv);
else if (strcmp(*argv, "-hash") == 0) do_ver = 1;
hash = ++num; }
#ifndef OPENSSL_NO_MD5 else if (strcmp(*argv,"-verify") == 0)
else if (strcmp(*argv, "-hash_old") == 0) do_ver = 1;
hash_old = ++num; else if (strcmp(*argv,"-text") == 0)
#endif text = 1;
else if (strcmp(*argv, "-nameopt") == 0) { else if (strcmp(*argv,"-hash") == 0)
if (--argc < 1) hash= ++num;
goto bad; else if (strcmp(*argv,"-nameopt") == 0)
if (!set_name_ex(&nmflag, *(++argv))) {
goto bad; if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-issuer") == 0) if (!set_name_ex(&nmflag, *(++argv))) goto bad;
issuer = ++num; }
else if (strcmp(*argv, "-lastupdate") == 0) else if (strcmp(*argv,"-issuer") == 0)
lastupdate = ++num; issuer= ++num;
else if (strcmp(*argv, "-nextupdate") == 0) else if (strcmp(*argv,"-lastupdate") == 0)
nextupdate = ++num; lastupdate= ++num;
else if (strcmp(*argv, "-noout") == 0) else if (strcmp(*argv,"-nextupdate") == 0)
noout = ++num; nextupdate= ++num;
else if (strcmp(*argv, "-fingerprint") == 0) else if (strcmp(*argv,"-noout") == 0)
fingerprint = ++num; noout= ++num;
else if (strcmp(*argv, "-crlnumber") == 0) else if (strcmp(*argv,"-fingerprint") == 0)
crlnumber = ++num; fingerprint= ++num;
else if ((md_alg = EVP_get_digestbyname(*argv + 1))) { else if ((md_alg=EVP_get_digestbyname(*argv + 1)))
/* ok */ {
digest = md_alg; /* ok */
} else { digest=md_alg;
BIO_printf(bio_err, "unknown option %s\n", *argv); }
badops = 1; else
break; {
} BIO_printf(bio_err,"unknown option %s\n",*argv);
argc--; badops=1;
argv++; break;
} }
argc--;
argv++;
}
if (badops) { if (badops)
bad: {
for (pp = crl_usage; (*pp != NULL); pp++) bad:
BIO_printf(bio_err, "%s", *pp); for (pp=crl_usage; (*pp != NULL); pp++)
goto end; BIO_printf(bio_err,"%s",*pp);
} goto end;
}
ERR_load_crypto_strings(); ERR_load_crypto_strings();
x = load_crl(infile, informat); x=load_crl(infile,informat);
if (x == NULL) { if (x == NULL) { goto end; }
goto end;
}
if (do_ver) { if(do_ver) {
store = X509_STORE_new(); store = X509_STORE_new();
lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); lookup=X509_STORE_add_lookup(store,X509_LOOKUP_file());
if (lookup == NULL) if (lookup == NULL) goto end;
goto end; if (!X509_LOOKUP_load_file(lookup,CAfile,X509_FILETYPE_PEM))
if (!X509_LOOKUP_load_file(lookup, CAfile, X509_FILETYPE_PEM)) X509_LOOKUP_load_file(lookup,NULL,X509_FILETYPE_DEFAULT);
X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT);
lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir()); lookup=X509_STORE_add_lookup(store,X509_LOOKUP_hash_dir());
if (lookup == NULL) if (lookup == NULL) goto end;
goto end; if (!X509_LOOKUP_add_dir(lookup,CApath,X509_FILETYPE_PEM))
if (!X509_LOOKUP_add_dir(lookup, CApath, X509_FILETYPE_PEM)) X509_LOOKUP_add_dir(lookup,NULL,X509_FILETYPE_DEFAULT);
X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT); ERR_clear_error();
ERR_clear_error();
if (!X509_STORE_CTX_init(&ctx, store, NULL, NULL)) { if(!X509_STORE_CTX_init(&ctx, store, NULL, NULL)) {
BIO_printf(bio_err, "Error initialising X509 store\n"); BIO_printf(bio_err,
goto end; "Error initialising X509 store\n");
} goto end;
}
i = X509_STORE_get_by_subject(&ctx, X509_LU_X509, i = X509_STORE_get_by_subject(&ctx, X509_LU_X509,
X509_CRL_get_issuer(x), &xobj); X509_CRL_get_issuer(x), &xobj);
if (i <= 0) { if(i <= 0) {
BIO_printf(bio_err, "Error getting CRL issuer certificate\n"); BIO_printf(bio_err,
goto end; "Error getting CRL issuer certificate\n");
} goto end;
pkey = X509_get_pubkey(xobj.data.x509); }
X509_OBJECT_free_contents(&xobj); pkey = X509_get_pubkey(xobj.data.x509);
if (!pkey) { X509_OBJECT_free_contents(&xobj);
BIO_printf(bio_err, "Error getting CRL issuer public key\n"); if(!pkey) {
goto end; BIO_printf(bio_err,
} "Error getting CRL issuer public key\n");
i = X509_CRL_verify(x, pkey); goto end;
EVP_PKEY_free(pkey); }
if (i < 0) i = X509_CRL_verify(x, pkey);
goto end; EVP_PKEY_free(pkey);
if (i == 0) if(i < 0) goto end;
BIO_printf(bio_err, "verify failure\n"); if(i == 0) BIO_printf(bio_err, "verify failure\n");
else else BIO_printf(bio_err, "verify OK\n");
BIO_printf(bio_err, "verify OK\n"); }
}
if (num) { if (num)
for (i = 1; i <= num; i++) { {
if (issuer == i) { for (i=1; i<=num; i++)
print_name(bio_out, "issuer=", X509_CRL_get_issuer(x), {
nmflag); if (issuer == i)
} {
if (crlnumber == i) { print_name(bio_out, "issuer=", X509_CRL_get_issuer(x), nmflag);
ASN1_INTEGER *crlnum; }
crlnum = X509_CRL_get_ext_d2i(x, NID_crl_number, NULL, NULL);
BIO_printf(bio_out, "crlNumber=");
if (crlnum) {
i2a_ASN1_INTEGER(bio_out, crlnum);
ASN1_INTEGER_free(crlnum);
} else
BIO_puts(bio_out, "<NONE>");
BIO_printf(bio_out, "\n");
}
if (hash == i) {
BIO_printf(bio_out, "%08lx\n",
X509_NAME_hash(X509_CRL_get_issuer(x)));
}
#ifndef OPENSSL_NO_MD5
if (hash_old == i) {
BIO_printf(bio_out, "%08lx\n",
X509_NAME_hash_old(X509_CRL_get_issuer(x)));
}
#endif
if (lastupdate == i) {
BIO_printf(bio_out, "lastUpdate=");
ASN1_TIME_print(bio_out, X509_CRL_get_lastUpdate(x));
BIO_printf(bio_out, "\n");
}
if (nextupdate == i) {
BIO_printf(bio_out, "nextUpdate=");
if (X509_CRL_get_nextUpdate(x))
ASN1_TIME_print(bio_out, X509_CRL_get_nextUpdate(x));
else
BIO_printf(bio_out, "NONE");
BIO_printf(bio_out, "\n");
}
if (fingerprint == i) {
int j;
unsigned int n;
unsigned char md[EVP_MAX_MD_SIZE];
if (!X509_CRL_digest(x, digest, md, &n)) { if (hash == i)
BIO_printf(bio_err, "out of memory\n"); {
goto end; BIO_printf(bio_out,"%08lx\n",
} X509_NAME_hash(X509_CRL_get_issuer(x)));
BIO_printf(bio_out, "%s Fingerprint=", }
OBJ_nid2sn(EVP_MD_type(digest))); if (lastupdate == i)
for (j = 0; j < (int)n; j++) { {
BIO_printf(bio_out, "%02X%c", md[j], (j + 1 == (int)n) BIO_printf(bio_out,"lastUpdate=");
? '\n' : ':'); ASN1_TIME_print(bio_out,
} X509_CRL_get_lastUpdate(x));
} BIO_printf(bio_out,"\n");
} }
} if (nextupdate == i)
{
BIO_printf(bio_out,"nextUpdate=");
if (X509_CRL_get_nextUpdate(x))
ASN1_TIME_print(bio_out,
X509_CRL_get_nextUpdate(x));
else
BIO_printf(bio_out,"NONE");
BIO_printf(bio_out,"\n");
}
if (fingerprint == i)
{
int j;
unsigned int n;
unsigned char md[EVP_MAX_MD_SIZE];
out = BIO_new(BIO_s_file()); if (!X509_CRL_digest(x,digest,md,&n))
if (out == NULL) { {
ERR_print_errors(bio_err); BIO_printf(bio_err,"out of memory\n");
goto end; goto end;
} }
BIO_printf(bio_out,"%s Fingerprint=",
OBJ_nid2sn(EVP_MD_type(digest)));
for (j=0; j<(int)n; j++)
{
BIO_printf(bio_out,"%02X%c",md[j],
(j+1 == (int)n)
?'\n':':');
}
}
}
}
if (outfile == NULL) { out=BIO_new(BIO_s_file());
BIO_set_fp(out, stdout, BIO_NOCLOSE); if (out == NULL)
{
ERR_print_errors(bio_err);
goto end;
}
if (outfile == NULL)
{
BIO_set_fp(out,stdout,BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
#endif #endif
} else { }
if (BIO_write_filename(out, outfile) <= 0) { else
perror(outfile); {
goto end; if (BIO_write_filename(out,outfile) <= 0)
} {
} perror(outfile);
goto end;
}
}
if (text) if (text) X509_CRL_print(out, x);
X509_CRL_print(out, x);
if (noout) { if (noout) goto end;
ret = 0;
goto end;
}
if (outformat == FORMAT_ASN1) if (outformat == FORMAT_ASN1)
i = (int)i2d_X509_CRL_bio(out, x); i=(int)i2d_X509_CRL_bio(out,x);
else if (outformat == FORMAT_PEM) else if (outformat == FORMAT_PEM)
i = PEM_write_bio_X509_CRL(out, x); i=PEM_write_bio_X509_CRL(out,x);
else { else
BIO_printf(bio_err, "bad output format specified for outfile\n"); {
goto end; BIO_printf(bio_err,"bad output format specified for outfile\n");
} goto end;
if (!i) { }
BIO_printf(bio_err, "unable to write CRL\n"); if (!i) { BIO_printf(bio_err,"unable to write CRL\n"); goto end; }
goto end; ret=0;
} end:
ret = 0; BIO_free_all(out);
end: BIO_free_all(bio_out);
BIO_free_all(out); bio_out=NULL;
BIO_free_all(bio_out); X509_CRL_free(x);
bio_out = NULL; if(store) {
X509_CRL_free(x); X509_STORE_CTX_cleanup(&ctx);
if (store) { X509_STORE_free(store);
X509_STORE_CTX_cleanup(&ctx); }
X509_STORE_free(store); apps_shutdown();
} OPENSSL_EXIT(ret);
apps_shutdown(); }
OPENSSL_EXIT(ret);
}
static X509_CRL *load_crl(char *infile, int format) static X509_CRL *load_crl(char *infile, int format)
{ {
X509_CRL *x = NULL; X509_CRL *x=NULL;
BIO *in = NULL; BIO *in=NULL;
in = BIO_new(BIO_s_file()); in=BIO_new(BIO_s_file());
if (in == NULL) { if (in == NULL)
ERR_print_errors(bio_err); {
goto end; ERR_print_errors(bio_err);
} goto end;
}
if (infile == NULL) if (infile == NULL)
BIO_set_fp(in, stdin, BIO_NOCLOSE); BIO_set_fp(in,stdin,BIO_NOCLOSE);
else { else
if (BIO_read_filename(in, infile) <= 0) { {
perror(infile); if (BIO_read_filename(in,infile) <= 0)
goto end; {
} perror(infile);
} goto end;
if (format == FORMAT_ASN1) }
x = d2i_X509_CRL_bio(in, NULL); }
else if (format == FORMAT_PEM) if (format == FORMAT_ASN1)
x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL); x=d2i_X509_CRL_bio(in,NULL);
else { else if (format == FORMAT_PEM)
BIO_printf(bio_err, "bad input format specified for input crl\n"); x=PEM_read_bio_X509_CRL(in,NULL,NULL,NULL);
goto end; else {
} BIO_printf(bio_err,"bad input format specified for input crl\n");
if (x == NULL) { goto end;
BIO_printf(bio_err, "unable to load CRL\n"); }
ERR_print_errors(bio_err); if (x == NULL)
goto end; {
} BIO_printf(bio_err,"unable to load CRL\n");
ERR_print_errors(bio_err);
goto end;
}
end:
BIO_free(in);
return(x);
}
end:
BIO_free(in);
return (x);
}

View File

@ -56,15 +56,14 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
/* /* This was written by Gordon Chaffee <chaffee@plateau.cs.berkeley.edu>
* This was written by Gordon Chaffee <chaffee@plateau.cs.berkeley.edu> and * and donated 'to the cause' along with lots and lots of other fixes to
* donated 'to the cause' along with lots and lots of other fixes to the * the library. */
* library.
*/
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h>
#include "apps.h" #include "apps.h"
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/evp.h> #include <openssl/evp.h>
@ -75,260 +74,272 @@
static int add_certs_from_file(STACK_OF(X509) *stack, char *certfile); static int add_certs_from_file(STACK_OF(X509) *stack, char *certfile);
#undef PROG #undef PROG
#define PROG crl2pkcs7_main #define PROG crl2pkcs7_main
/*- /* -inform arg - input format - default PEM (DER or PEM)
* -inform arg - input format - default PEM (DER or PEM)
* -outform arg - output format - default PEM * -outform arg - output format - default PEM
* -in arg - input file - default stdin * -in arg - input file - default stdin
* -out arg - output file - default stdout * -out arg - output file - default stdout
*/ */
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
int i, badops = 0; int i,badops=0;
BIO *in = NULL, *out = NULL; BIO *in=NULL,*out=NULL;
int informat, outformat; int informat,outformat;
char *infile, *outfile, *prog, *certfile; char *infile,*outfile,*prog,*certfile;
PKCS7 *p7 = NULL; PKCS7 *p7 = NULL;
PKCS7_SIGNED *p7s = NULL; PKCS7_SIGNED *p7s = NULL;
X509_CRL *crl = NULL; X509_CRL *crl=NULL;
STACK_OF(OPENSSL_STRING) *certflst = NULL; STACK *certflst=NULL;
STACK_OF(X509_CRL) *crl_stack = NULL; STACK_OF(X509_CRL) *crl_stack=NULL;
STACK_OF(X509) *cert_stack = NULL; STACK_OF(X509) *cert_stack=NULL;
int ret = 1, nocrl = 0; int ret=1,nocrl=0;
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
infile = NULL; infile=NULL;
outfile = NULL; outfile=NULL;
informat = FORMAT_PEM; informat=FORMAT_PEM;
outformat = FORMAT_PEM; outformat=FORMAT_PEM;
prog = argv[0]; prog=argv[0];
argc--; argc--;
argv++; argv++;
while (argc >= 1) { while (argc >= 1)
if (strcmp(*argv, "-inform") == 0) { {
if (--argc < 1) if (strcmp(*argv,"-inform") == 0)
goto bad; {
informat = str2fmt(*(++argv)); if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-outform") == 0) { informat=str2fmt(*(++argv));
if (--argc < 1) }
goto bad; else if (strcmp(*argv,"-outform") == 0)
outformat = str2fmt(*(++argv)); {
} else if (strcmp(*argv, "-in") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) outformat=str2fmt(*(++argv));
goto bad; }
infile = *(++argv); else if (strcmp(*argv,"-in") == 0)
} else if (strcmp(*argv, "-nocrl") == 0) { {
nocrl = 1; if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-out") == 0) { infile= *(++argv);
if (--argc < 1) }
goto bad; else if (strcmp(*argv,"-nocrl") == 0)
outfile = *(++argv); {
} else if (strcmp(*argv, "-certfile") == 0) { nocrl=1;
if (--argc < 1) }
goto bad; else if (strcmp(*argv,"-out") == 0)
if (!certflst) {
certflst = sk_OPENSSL_STRING_new_null(); if (--argc < 1) goto bad;
if (!certflst) outfile= *(++argv);
goto end; }
if (!sk_OPENSSL_STRING_push(certflst, *(++argv))) { else if (strcmp(*argv,"-certfile") == 0)
sk_OPENSSL_STRING_free(certflst); {
goto end; if (--argc < 1) goto bad;
} if(!certflst) certflst = sk_new_null();
} else { sk_push(certflst,*(++argv));
BIO_printf(bio_err, "unknown option %s\n", *argv); }
badops = 1; else
break; {
} BIO_printf(bio_err,"unknown option %s\n",*argv);
argc--; badops=1;
argv++; break;
} }
argc--;
argv++;
}
if (badops) { if (badops)
bad: {
BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog); bad:
BIO_printf(bio_err, "where options are\n"); BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
BIO_printf(bio_err, " -inform arg input format - DER or PEM\n"); BIO_printf(bio_err,"where options are\n");
BIO_printf(bio_err, " -outform arg output format - DER or PEM\n"); BIO_printf(bio_err," -inform arg input format - DER or PEM\n");
BIO_printf(bio_err, " -in arg input file\n"); BIO_printf(bio_err," -outform arg output format - DER or PEM\n");
BIO_printf(bio_err, " -out arg output file\n"); BIO_printf(bio_err," -in arg input file\n");
BIO_printf(bio_err, BIO_printf(bio_err," -out arg output file\n");
" -certfile arg certificates file of chain to a trusted CA\n"); BIO_printf(bio_err," -certfile arg certificates file of chain to a trusted CA\n");
BIO_printf(bio_err, " (can be used more than once)\n"); BIO_printf(bio_err," (can be used more than once)\n");
BIO_printf(bio_err, BIO_printf(bio_err," -nocrl no crl to load, just certs from '-certfile'\n");
" -nocrl no crl to load, just certs from '-certfile'\n"); ret = 1;
ret = 1; goto end;
goto end; }
}
ERR_load_crypto_strings(); ERR_load_crypto_strings();
in = BIO_new(BIO_s_file()); in=BIO_new(BIO_s_file());
out = BIO_new(BIO_s_file()); out=BIO_new(BIO_s_file());
if ((in == NULL) || (out == NULL)) { if ((in == NULL) || (out == NULL))
ERR_print_errors(bio_err); {
goto end; ERR_print_errors(bio_err);
} goto end;
}
if (!nocrl) { if (!nocrl)
if (infile == NULL) {
BIO_set_fp(in, stdin, BIO_NOCLOSE); if (infile == NULL)
else { BIO_set_fp(in,stdin,BIO_NOCLOSE);
if (BIO_read_filename(in, infile) <= 0) { else
perror(infile); {
goto end; if (BIO_read_filename(in,infile) <= 0)
} {
} perror(infile);
goto end;
}
}
if (informat == FORMAT_ASN1) if (informat == FORMAT_ASN1)
crl = d2i_X509_CRL_bio(in, NULL); crl=d2i_X509_CRL_bio(in,NULL);
else if (informat == FORMAT_PEM) else if (informat == FORMAT_PEM)
crl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL); crl=PEM_read_bio_X509_CRL(in,NULL,NULL,NULL);
else { else {
BIO_printf(bio_err, "bad input format specified for input crl\n"); BIO_printf(bio_err,"bad input format specified for input crl\n");
goto end; goto end;
} }
if (crl == NULL) { if (crl == NULL)
BIO_printf(bio_err, "unable to load CRL\n"); {
ERR_print_errors(bio_err); BIO_printf(bio_err,"unable to load CRL\n");
goto end; ERR_print_errors(bio_err);
} goto end;
} }
}
if ((p7 = PKCS7_new()) == NULL) if ((p7=PKCS7_new()) == NULL) goto end;
goto end; if ((p7s=PKCS7_SIGNED_new()) == NULL) goto end;
if ((p7s = PKCS7_SIGNED_new()) == NULL) p7->type=OBJ_nid2obj(NID_pkcs7_signed);
goto end; p7->d.sign=p7s;
p7->type = OBJ_nid2obj(NID_pkcs7_signed); p7s->contents->type=OBJ_nid2obj(NID_pkcs7_data);
p7->d.sign = p7s;
p7s->contents->type = OBJ_nid2obj(NID_pkcs7_data);
if (!ASN1_INTEGER_set(p7s->version, 1)) if (!ASN1_INTEGER_set(p7s->version,1)) goto end;
goto end; if ((crl_stack=sk_X509_CRL_new_null()) == NULL) goto end;
if ((crl_stack = sk_X509_CRL_new_null()) == NULL) p7s->crl=crl_stack;
goto end; if (crl != NULL)
p7s->crl = crl_stack; {
if (crl != NULL) { sk_X509_CRL_push(crl_stack,crl);
sk_X509_CRL_push(crl_stack, crl); crl=NULL; /* now part of p7 for OPENSSL_freeing */
crl = NULL; /* now part of p7 for OPENSSL_freeing */ }
}
if ((cert_stack = sk_X509_new_null()) == NULL) if ((cert_stack=sk_X509_new_null()) == NULL) goto end;
goto end; p7s->cert=cert_stack;
p7s->cert = cert_stack;
if (certflst) if(certflst) for(i = 0; i < sk_num(certflst); i++) {
for (i = 0; i < sk_OPENSSL_STRING_num(certflst); i++) { certfile = sk_value(certflst, i);
certfile = sk_OPENSSL_STRING_value(certflst, i); if (add_certs_from_file(cert_stack,certfile) < 0)
if (add_certs_from_file(cert_stack, certfile) < 0) { {
BIO_printf(bio_err, "error loading certificates\n"); BIO_printf(bio_err, "error loading certificates\n");
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
} }
} }
sk_OPENSSL_STRING_free(certflst); sk_free(certflst);
if (outfile == NULL) { if (outfile == NULL)
BIO_set_fp(out, stdout, BIO_NOCLOSE); {
BIO_set_fp(out,stdout,BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
#endif #endif
} else { }
if (BIO_write_filename(out, outfile) <= 0) { else
perror(outfile); {
goto end; if (BIO_write_filename(out,outfile) <= 0)
} {
} perror(outfile);
goto end;
}
}
if (outformat == FORMAT_ASN1) if (outformat == FORMAT_ASN1)
i = i2d_PKCS7_bio(out, p7); i=i2d_PKCS7_bio(out,p7);
else if (outformat == FORMAT_PEM) else if (outformat == FORMAT_PEM)
i = PEM_write_bio_PKCS7(out, p7); i=PEM_write_bio_PKCS7(out,p7);
else { else {
BIO_printf(bio_err, "bad output format specified for outfile\n"); BIO_printf(bio_err,"bad output format specified for outfile\n");
goto end; goto end;
} }
if (!i) { if (!i)
BIO_printf(bio_err, "unable to write pkcs7 object\n"); {
ERR_print_errors(bio_err); BIO_printf(bio_err,"unable to write pkcs7 object\n");
goto end; ERR_print_errors(bio_err);
} goto end;
ret = 0; }
end: ret=0;
if (in != NULL) end:
BIO_free(in); if (in != NULL) BIO_free(in);
if (out != NULL) if (out != NULL) BIO_free_all(out);
BIO_free_all(out); if (p7 != NULL) PKCS7_free(p7);
if (p7 != NULL) if (crl != NULL) X509_CRL_free(crl);
PKCS7_free(p7);
if (crl != NULL)
X509_CRL_free(crl);
apps_shutdown(); apps_shutdown();
OPENSSL_EXIT(ret); OPENSSL_EXIT(ret);
} }
/*- /*
*---------------------------------------------------------------------- *----------------------------------------------------------------------
* int add_certs_from_file * int add_certs_from_file
* *
* Read a list of certificates to be checked from a file. * Read a list of certificates to be checked from a file.
* *
* Results: * Results:
* number of certs added if successful, -1 if not. * number of certs added if successful, -1 if not.
*---------------------------------------------------------------------- *----------------------------------------------------------------------
*/ */
static int add_certs_from_file(STACK_OF(X509) *stack, char *certfile) static int add_certs_from_file(STACK_OF(X509) *stack, char *certfile)
{ {
BIO *in = NULL; struct stat st;
int count = 0; BIO *in=NULL;
int ret = -1; int count=0;
STACK_OF(X509_INFO) *sk = NULL; int ret= -1;
X509_INFO *xi; STACK_OF(X509_INFO) *sk=NULL;
X509_INFO *xi;
in = BIO_new(BIO_s_file()); if ((stat(certfile,&st) != 0))
if ((in == NULL) || (BIO_read_filename(in, certfile) <= 0)) { {
BIO_printf(bio_err, "error opening the file, %s\n", certfile); BIO_printf(bio_err,"unable to load the file, %s\n",certfile);
goto end; goto end;
} }
/* This loads from a file, a stack of x509/crl/pkey sets */ in=BIO_new(BIO_s_file());
sk = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL); if ((in == NULL) || (BIO_read_filename(in,certfile) <= 0))
if (sk == NULL) { {
BIO_printf(bio_err, "error reading the file, %s\n", certfile); BIO_printf(bio_err,"error opening the file, %s\n",certfile);
goto end; goto end;
} }
/* scan over it and pull out the CRL's */ /* This loads from a file, a stack of x509/crl/pkey sets */
while (sk_X509_INFO_num(sk)) { sk=PEM_X509_INFO_read_bio(in,NULL,NULL,NULL);
xi = sk_X509_INFO_shift(sk); if (sk == NULL) {
if (xi->x509 != NULL) { BIO_printf(bio_err,"error reading the file, %s\n",certfile);
sk_X509_push(stack, xi->x509); goto end;
xi->x509 = NULL; }
count++;
} /* scan over it and pull out the CRL's */
X509_INFO_free(xi); while (sk_X509_INFO_num(sk))
} {
xi=sk_X509_INFO_shift(sk);
if (xi->x509 != NULL)
{
sk_X509_push(stack,xi->x509);
xi->x509=NULL;
count++;
}
X509_INFO_free(xi);
}
ret=count;
end:
/* never need to OPENSSL_free x */
if (in != NULL) BIO_free(in);
if (sk != NULL) sk_X509_INFO_free(sk);
return(ret);
}
ret = count;
end:
/* never need to OPENSSL_free x */
if (in != NULL)
BIO_free(in);
if (sk != NULL)
sk_X509_INFO_free(sk);
return (ret);
}

View File

@ -1,6 +0,0 @@
# This is a file that will be filled by the openssl srp routine.
# You can initialize the file with additional groups, these are
# records starting with a I followed by the g and N values and the id.
# The exact values ... you have to dig this out from the source of srp.c
# or srp_vfy.c
# The last value of an I is used as the default group for new users.

View File

@ -1 +0,0 @@
unique_subject = yes

305
apps/der_chop.in Normal file
View File

@ -0,0 +1,305 @@
#!/usr/local/bin/perl
#
# der_chop ... this is one total hack that Eric is really not proud of
# so don't look at it and don't ask for support
#
# The "documentation" for this (i.e. all the comments) are my fault --tjh
#
# This program takes the "raw" output of derparse/asn1parse and
# converts it into tokens and then runs regular expression matches
# to try to figure out what to grab to get the things that are needed
# and it is possible that this will do the wrong thing as it is a *hack*
#
# SSLeay 0.5.2+ should have direct read support for x509 (via -inform NET)
# [I know ... promises promises :-)]
#
# To convert a Netscape Certificate:
# der_chop < ServerCert.der > cert.pem
# To convert a Netscape Key (and encrypt it again to protect it)
# rsa -inform NET -in ServerKey.der -des > key.pem
#
# 23-Apr-96 eay Added the extra ASN.1 string types, I still think this
# is an evil hack. If nothing else the parsing should
# be relative, not absolute.
# 19-Apr-96 tjh hacked (with eay) into 0.5.x format
#
# Tim Hudson
# tjh@cryptsoft.com
#
require 'getopts.pl';
$debug=0;
# this was the 0.4.x way of doing things ...
$cmd="derparse";
$x509_cmd="x509";
$crl_cmd="crl";
$rc4_cmd="rc4";
$md2_cmd="md2";
$md4_cmd="md4";
$rsa_cmd="rsa -des -inform der ";
# this was the 0.5.x way of doing things ...
$cmd="openssl asn1parse";
$x509_cmd="openssl x509";
$crl_cmd="openssl crl";
$rc4_cmd="openssl rc4";
$md2_cmd="openssl md2";
$md4_cmd="openssl md4";
$rsa_cmd="openssl rsa -des -inform der ";
&Getopts('vd:') || die "usage:$0 [-v] [-d num] file";
$depth=($opt_d =~ /^\d+$/)?$opt_d:0;
&init_der();
if ($#ARGV != -1)
{
foreach $file (@ARGV)
{
print STDERR "doing $file\n";
&dofile($file);
}
}
else
{
$file="/tmp/a$$.DER";
open(OUT,">$file") || die "unable to open $file:$!\n";
for (;;)
{
$i=sysread(STDIN,$b,1024*10);
last if ($i <= 0);
$i=syswrite(OUT,$b,$i);
}
&dofile($file);
unlink($file);
}
sub dofile
{
local($file)=@_;
local(@p);
$b=&load_file($file);
@p=&load_file_parse($file);
foreach $_ (@p)
{
($off,$d,$hl,$len)=&parse_line($_);
$d-=$depth;
next if ($d != 0);
next if ($len == 0);
$o=substr($b,$off,$len+$hl);
($str,@data)=&der_str($o);
print "$str\n" if ($opt_v);
if ($str =~ /^$crl/)
{
open(OUT,"|$crl_cmd -inform d -hash -issuer") ||
die "unable to run $crl_cmd:$!\n";
print OUT $o;
close(OUT);
}
elsif ($str =~ /^$x509/)
{
open(OUT,"|$x509_cmd -inform d -hash -subject -issuer")
|| die "unable to run $x509_cmd:$!\n";
print OUT $o;
close(OUT);
}
elsif ($str =~ /^$rsa/)
{
($type)=($data[3] =~ /OBJECT_IDENTIFIER :(.*)\s*$/);
next unless ($type eq "rsaEncryption");
($off,$d,$hl,$len)=&parse_line($data[5]);
$os=substr($o,$off+$hl,$len);
open(OUT,"|$rsa_cmd")
|| die "unable to run $rsa_cmd:$!\n";
print OUT $os;
close(OUT);
}
elsif ($str =~ /^0G-1D-1G/)
{
($off,$d,$hl,$len)=&parse_line($data[1]);
$os=substr($o,$off+$hl,$len);
print STDERR "<$os>\n" if $opt_v;
&do_certificate($o,@data)
if (($os eq "certificate") &&
($str =! /^0G-1D-1G-2G-3F-3E-2D/));
&do_private_key($o,@data)
if (($os eq "private-key") &&
($str =! /^0G-1D-1G-2G-3F-3E-2D/));
}
}
}
sub der_str
{
local($str)=@_;
local(*OUT,*IN,@a,$t,$d,$ret);
local($file)="/tmp/b$$.DER";
local(@ret);
open(OUT,">$file");
print OUT $str;
close(OUT);
open(IN,"$cmd -inform 'd' -in $file |") ||
die "unable to run $cmd:$!\n";
$ret="";
while (<IN>)
{
chop;
push(@ret,$_);
print STDERR "$_\n" if ($debug);
@a=split(/\s*:\s*/);
($d)=($a[1] =~ /d=\s*(\d+)/);
$a[2] =~ s/\s+$//;
$t=$DER_s2i{$a[2]};
$ret.="$d$t-";
}
close(IN);
unlink($file);
chop $ret;
$ret =~ s/(-3H(-4G-5F-5[IJKMQRS])+)+/-NAME/g;
$ret =~ s/(-3G-4B-4L)+/-RCERT/g;
return($ret,@ret);
}
sub init_der
{
$crl= "0G-1G-2G-3F-3E-2G-NAME-2L-2L-2G-RCERT-1G-2F-2E-1C";
$x509="0G-1G-2B-2G-3F-3E-2G-NAME-2G-3L-3L-2G-NAME-2G-3G-4F-4E-3C-1G-2F-2E-1C";
$rsa= "0G-1B-1G-2F-2E-1D";
%DER_i2s=(
# SSLeay 0.4.x has this list
"A","EOC",
"B","INTEGER",
"C","BIT STRING",
"D","OCTET STRING",
"E","NULL",
"F","OBJECT",
"G","SEQUENCE",
"H","SET",
"I","PRINTABLESTRING",
"J","T61STRING",
"K","IA5STRING",
"L","UTCTIME",
"M","NUMERICSTRING",
"N","VIDEOTEXSTRING",
"O","GENERALIZEDTIME",
"P","GRAPHICSTRING",
"Q","ISO64STRING",
"R","GENERALSTRING",
"S","UNIVERSALSTRING",
# SSLeay 0.5.x changed some things ... and I'm
# leaving in the old stuff but adding in these
# to handle the new as well --tjh
# - Well I've just taken them out and added the extra new
# ones :-) - eay
);
foreach (keys %DER_i2s)
{ $DER_s2i{$DER_i2s{$_}}=$_; }
}
sub parse_line
{
local($_)=@_;
return(/\s*(\d+):d=\s*(\d+)\s+hl=\s*(\d+)\s+l=\s*(\d+|inf)\s/);
}
# 0:d=0 hl=4 l=377 cons: univ: SEQUENCE
# 4:d=1 hl=2 l= 11 prim: univ: OCTET_STRING
# 17:d=1 hl=4 l=360 cons: univ: SEQUENCE
# 21:d=2 hl=2 l= 12 cons: univ: SEQUENCE
# 23:d=3 hl=2 l= 8 prim: univ: OBJECT_IDENTIFIER :rc4
# 33:d=3 hl=2 l= 0 prim: univ: NULL
# 35:d=2 hl=4 l=342 prim: univ: OCTET_STRING
sub do_private_key
{
local($data,@struct)=@_;
local($file)="/tmp/b$$.DER";
local($off,$d,$hl,$len,$_,$b,@p,$s);
($type)=($struct[4] =~ /OBJECT_IDENTIFIER :(.*)\s*$/);
if ($type eq "rc4")
{
($off,$d,$hl,$len)=&parse_line($struct[6]);
open(OUT,"|$rc4_cmd >$file") ||
die "unable to run $rc4_cmd:$!\n";
print OUT substr($data,$off+$hl,$len);
close(OUT);
$b=&load_file($file);
unlink($file);
($s,@p)=&der_str($b);
die "unknown rsa key type\n$s\n"
if ($s ne '0G-1B-1G-2F-2E-1D');
local($off,$d,$hl,$len)=&parse_line($p[5]);
$b=substr($b,$off+$hl,$len);
($s,@p)=&der_str($b);
open(OUT,"|$rsa_cmd") || die "unable to run $rsa_cmd:$!\n";
print OUT $b;
close(OUT);
}
else
{
print "'$type' is unknown\n";
exit(1);
}
}
sub do_certificate
{
local($data,@struct)=@_;
local($file)="/tmp/b$$.DER";
local($off,$d,$hl,$len,$_,$b,@p,$s);
($off,$d,$hl,$len)=&parse_line($struct[2]);
$b=substr($data,$off,$len+$hl);
open(OUT,"|$x509_cmd -inform d") || die "unable to run $x509_cmd:$!\n";
print OUT $b;
close(OUT);
}
sub load_file
{
local($file)=@_;
local(*IN,$r,$b,$i);
$r="";
open(IN,"<$file") || die "unable to open $file:$!\n";
for (;;)
{
$i=sysread(IN,$b,10240);
last if ($i <= 0);
$r.=$b;
}
close(IN);
return($r);
}
sub load_file_parse
{
local($file)=@_;
local(*IN,$r,@ret,$_,$i,$n,$b);
open(IN,"$cmd -inform d -in $file|")
|| die "unable to run der_parse\n";
while (<IN>)
{
chop;
push(@ret,$_);
}
return($r,@ret);
}

View File

@ -69,530 +69,406 @@
#include <openssl/hmac.h> #include <openssl/hmac.h>
#undef BUFSIZE #undef BUFSIZE
#define BUFSIZE 1024*8 #define BUFSIZE 1024*8
#undef PROG #undef PROG
#define PROG dgst_main #define PROG dgst_main
static HMAC_CTX hmac_ctx;
int do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, int binout, int do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, int binout,
EVP_PKEY *key, unsigned char *sigin, int siglen, EVP_PKEY *key, unsigned char *sigin, int siglen, const char *title,
const char *sig_name, const char *md_name, const char *file,BIO *bmd,const char *hmac_key);
const char *file, BIO *bmd);
static void list_md_fn(const EVP_MD *m,
const char *from, const char *to, void *arg)
{
const char *mname;
/* Skip aliases */
if (!m)
return;
mname = OBJ_nid2ln(EVP_MD_type(m));
/* Skip shortnames */
if (strcmp(from, mname))
return;
/* Skip clones */
if (EVP_MD_flags(m) & EVP_MD_FLAG_PKEY_DIGEST)
return;
if (strchr(mname, ' '))
mname = EVP_MD_name(m);
BIO_printf(arg, "-%-14s to use the %s message digest algorithm\n",
mname, mname);
}
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
ENGINE *e = NULL; ENGINE *e = NULL;
unsigned char *buf = NULL; unsigned char *buf=NULL;
int i, err = 1; int i,err=0;
const EVP_MD *md = NULL, *m; const EVP_MD *md=NULL,*m;
BIO *in = NULL, *inp; BIO *in=NULL,*inp;
BIO *bmd = NULL; BIO *bmd=NULL;
BIO *out = NULL; BIO *out = NULL;
const char *name;
#define PROG_NAME_SIZE 39 #define PROG_NAME_SIZE 39
char pname[PROG_NAME_SIZE + 1]; char pname[PROG_NAME_SIZE+1];
int separator = 0; int separator=0;
int debug = 0; int debug=0;
int keyform = FORMAT_PEM; int keyform=FORMAT_PEM;
const char *outfile = NULL, *keyfile = NULL; const char *outfile = NULL, *keyfile = NULL;
const char *sigfile = NULL, *randfile = NULL; const char *sigfile = NULL, *randfile = NULL;
int out_bin = -1, want_pub = 0, do_verify = 0; int out_bin = -1, want_pub = 0, do_verify = 0;
EVP_PKEY *sigkey = NULL; EVP_PKEY *sigkey = NULL;
unsigned char *sigbuf = NULL; unsigned char *sigbuf = NULL;
int siglen = 0; int siglen = 0;
char *passargin = NULL, *passin = NULL;
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
char *engine = NULL; char *engine=NULL;
#endif #endif
char *hmac_key = NULL; char *hmac_key=NULL;
char *mac_name = NULL;
int non_fips_allow = 0;
STACK_OF(OPENSSL_STRING) *sigopts = NULL, *macopts = NULL;
apps_startup(); apps_startup();
if ((buf = (unsigned char *)OPENSSL_malloc(BUFSIZE)) == NULL) { if ((buf=(unsigned char *)OPENSSL_malloc(BUFSIZE)) == NULL)
BIO_printf(bio_err, "out of memory\n"); {
goto end; BIO_printf(bio_err,"out of memory\n");
} goto end;
if (bio_err == NULL) }
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if (bio_err == NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
/* first check the program name */ /* first check the program name */
program_name(argv[0], pname, sizeof pname); program_name(argv[0],pname,sizeof pname);
md = EVP_get_digestbyname(pname); md=EVP_get_digestbyname(pname);
argc--; argc--;
argv++; argv++;
while (argc > 0) { while (argc > 0)
if ((*argv)[0] != '-') {
break; if ((*argv)[0] != '-') break;
if (strcmp(*argv, "-c") == 0) if (strcmp(*argv,"-c") == 0)
separator = 1; separator=1;
else if (strcmp(*argv, "-r") == 0) else if (strcmp(*argv,"-rand") == 0)
separator = 2; {
else if (strcmp(*argv, "-rand") == 0) { if (--argc < 1) break;
if (--argc < 1) randfile=*(++argv);
break; }
randfile = *(++argv); else if (strcmp(*argv,"-out") == 0)
} else if (strcmp(*argv, "-out") == 0) { {
if (--argc < 1) if (--argc < 1) break;
break; outfile=*(++argv);
outfile = *(++argv); }
} else if (strcmp(*argv, "-sign") == 0) { else if (strcmp(*argv,"-sign") == 0)
if (--argc < 1) {
break; if (--argc < 1) break;
keyfile = *(++argv); keyfile=*(++argv);
} else if (!strcmp(*argv, "-passin")) { }
if (--argc < 1) else if (strcmp(*argv,"-verify") == 0)
break; {
passargin = *++argv; if (--argc < 1) break;
} else if (strcmp(*argv, "-verify") == 0) { keyfile=*(++argv);
if (--argc < 1) want_pub = 1;
break; do_verify = 1;
keyfile = *(++argv); }
want_pub = 1; else if (strcmp(*argv,"-prverify") == 0)
do_verify = 1; {
} else if (strcmp(*argv, "-prverify") == 0) { if (--argc < 1) break;
if (--argc < 1) keyfile=*(++argv);
break; do_verify = 1;
keyfile = *(++argv); }
do_verify = 1; else if (strcmp(*argv,"-signature") == 0)
} else if (strcmp(*argv, "-signature") == 0) { {
if (--argc < 1) if (--argc < 1) break;
break; sigfile=*(++argv);
sigfile = *(++argv); }
} else if (strcmp(*argv, "-keyform") == 0) { else if (strcmp(*argv,"-keyform") == 0)
if (--argc < 1) {
break; if (--argc < 1) break;
keyform = str2fmt(*(++argv)); keyform=str2fmt(*(++argv));
} }
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
else if (strcmp(*argv, "-engine") == 0) { else if (strcmp(*argv,"-engine") == 0)
if (--argc < 1) {
break; if (--argc < 1) break;
engine = *(++argv); engine= *(++argv);
e = setup_engine(bio_err, engine, 0); }
}
#endif #endif
else if (strcmp(*argv, "-hex") == 0) else if (strcmp(*argv,"-hex") == 0)
out_bin = 0; out_bin = 0;
else if (strcmp(*argv, "-binary") == 0) else if (strcmp(*argv,"-binary") == 0)
out_bin = 1; out_bin = 1;
else if (strcmp(*argv, "-d") == 0) else if (strcmp(*argv,"-d") == 0)
debug = 1; debug=1;
else if (!strcmp(*argv, "-fips-fingerprint")) else if (!strcmp(*argv,"-hmac"))
hmac_key = "etaonrishdlcupfm"; {
else if (strcmp(*argv, "-non-fips-allow") == 0) if (--argc < 1)
non_fips_allow = 1; break;
else if (!strcmp(*argv, "-hmac")) { hmac_key=*++argv;
if (--argc < 1) }
break; else if ((m=EVP_get_digestbyname(&((*argv)[1]))) != NULL)
hmac_key = *++argv; md=m;
} else if (!strcmp(*argv, "-mac")) { else
if (--argc < 1) break;
break; argc--;
mac_name = *++argv; argv++;
} else if (strcmp(*argv, "-sigopt") == 0) { }
if (--argc < 1)
break;
if (!sigopts)
sigopts = sk_OPENSSL_STRING_new_null();
if (!sigopts || !sk_OPENSSL_STRING_push(sigopts, *(++argv)))
break;
} else if (strcmp(*argv, "-macopt") == 0) {
if (--argc < 1)
break;
if (!macopts)
macopts = sk_OPENSSL_STRING_new_null();
if (!macopts || !sk_OPENSSL_STRING_push(macopts, *(++argv)))
break;
} else if ((m = EVP_get_digestbyname(&((*argv)[1]))) != NULL)
md = m;
else
break;
argc--;
argv++;
}
if (do_verify && !sigfile) { if (md == NULL)
BIO_printf(bio_err, md=EVP_md5();
"No signature to verify: use the -signature option\n");
goto end;
}
if ((argc > 0) && (argv[0][0] == '-')) { /* bad option */ if(do_verify && !sigfile) {
BIO_printf(bio_err, "unknown option '%s'\n", *argv); BIO_printf(bio_err, "No signature to verify: use the -signature option\n");
BIO_printf(bio_err, "options are\n"); err = 1;
BIO_printf(bio_err, goto end;
"-c to output the digest with separating colons\n"); }
BIO_printf(bio_err,
"-r to output the digest in coreutils format\n"); if ((argc > 0) && (argv[0][0] == '-')) /* bad option */
BIO_printf(bio_err, "-d to output debug info\n"); {
BIO_printf(bio_err, "-hex output as hex dump\n"); BIO_printf(bio_err,"unknown option '%s'\n",*argv);
BIO_printf(bio_err, "-binary output in binary form\n"); BIO_printf(bio_err,"options are\n");
BIO_printf(bio_err, "-hmac arg set the HMAC key to arg\n"); BIO_printf(bio_err,"-c to output the digest with separating colons\n");
BIO_printf(bio_err, "-non-fips-allow allow use of non FIPS digest\n"); BIO_printf(bio_err,"-d to output debug info\n");
BIO_printf(bio_err, BIO_printf(bio_err,"-hex output as hex dump\n");
"-sign file sign digest using private key in file\n"); BIO_printf(bio_err,"-binary output in binary form\n");
BIO_printf(bio_err, BIO_printf(bio_err,"-sign file sign digest using private key in file\n");
"-verify file verify a signature using public key in file\n"); BIO_printf(bio_err,"-verify file verify a signature using public key in file\n");
BIO_printf(bio_err, BIO_printf(bio_err,"-prverify file verify a signature using private key in file\n");
"-prverify file verify a signature using private key in file\n"); BIO_printf(bio_err,"-keyform arg key file format (PEM or ENGINE)\n");
BIO_printf(bio_err, BIO_printf(bio_err,"-signature file signature to verify\n");
"-keyform arg key file format (PEM or ENGINE)\n"); BIO_printf(bio_err,"-binary output in binary form\n");
BIO_printf(bio_err,
"-out filename output to filename rather than stdout\n");
BIO_printf(bio_err, "-signature file signature to verify\n");
BIO_printf(bio_err, "-sigopt nm:v signature parameter\n");
BIO_printf(bio_err, "-hmac key create hashed MAC with key\n");
BIO_printf(bio_err,
"-mac algorithm create MAC (not neccessarily HMAC)\n");
BIO_printf(bio_err,
"-macopt nm:v MAC algorithm parameters or key\n");
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err, BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n");
"-engine e use engine e, possibly a hardware device.\n");
#endif #endif
EVP_MD_do_all_sorted(list_md_fn, bio_err); BIO_printf(bio_err,"-%3s to use the %s message digest algorithm (default)\n",
goto end; LN_md5,LN_md5);
} BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n",
LN_md4,LN_md4);
BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n",
LN_md2,LN_md2);
BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n",
LN_sha1,LN_sha1);
BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n",
LN_sha,LN_sha);
BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n",
LN_mdc2,LN_mdc2);
BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n",
LN_ripemd160,LN_ripemd160);
err=1;
goto end;
}
in = BIO_new(BIO_s_file()); #ifndef OPENSSL_NO_ENGINE
bmd = BIO_new(BIO_f_md()); e = setup_engine(bio_err, engine, 0);
if ((in == NULL) || (bmd == NULL)) { #endif
ERR_print_errors(bio_err);
goto end;
}
if (debug) { in=BIO_new(BIO_s_file());
BIO_set_callback(in, BIO_debug_callback); bmd=BIO_new(BIO_f_md());
/* needed for windows 3.1 */ if (debug)
BIO_set_callback_arg(in, (char *)bio_err); {
} BIO_set_callback(in,BIO_debug_callback);
/* needed for windows 3.1 */
BIO_set_callback_arg(in,bio_err);
}
if (!app_passwd(bio_err, passargin, NULL, &passin, NULL)) { if ((in == NULL) || (bmd == NULL))
BIO_printf(bio_err, "Error getting password\n"); {
goto end; ERR_print_errors(bio_err);
} goto end;
}
if (out_bin == -1) { if(out_bin == -1) {
if (keyfile) if(keyfile) out_bin = 1;
out_bin = 1; else out_bin = 0;
else }
out_bin = 0;
}
if (randfile) if(randfile)
app_RAND_load_file(randfile, bio_err, 0); app_RAND_load_file(randfile, bio_err, 0);
if (outfile) { if(outfile) {
if (out_bin) if(out_bin)
out = BIO_new_file(outfile, "wb"); out = BIO_new_file(outfile, "wb");
else else out = BIO_new_file(outfile, "w");
out = BIO_new_file(outfile, "w"); } else {
} else { out = BIO_new_fp(stdout, BIO_NOCLOSE);
out = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
#endif #endif
} }
if (!out) { if(!out) {
BIO_printf(bio_err, "Error opening output file %s\n", BIO_printf(bio_err, "Error opening output file %s\n",
outfile ? outfile : "(stdout)"); outfile ? outfile : "(stdout)");
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
} }
if ((! !mac_name + ! !keyfile + ! !hmac_key) > 1) {
BIO_printf(bio_err, "MAC and Signing key cannot both be specified\n");
goto end;
}
if (keyfile) { if(keyfile)
if (want_pub) {
sigkey = load_pubkey(bio_err, keyfile, keyform, 0, NULL, if (want_pub)
e, "key file"); sigkey = load_pubkey(bio_err, keyfile, keyform, 0, NULL,
else e, "key file");
sigkey = load_key(bio_err, keyfile, keyform, 0, passin, else
e, "key file"); sigkey = load_key(bio_err, keyfile, keyform, 0, NULL,
if (!sigkey) { e, "key file");
/* if (!sigkey)
* load_[pub]key() has already printed an appropriate message {
*/ /* load_[pub]key() has already printed an appropriate
goto end; message */
} goto end;
} }
}
if (mac_name) { if(sigfile && sigkey) {
EVP_PKEY_CTX *mac_ctx = NULL; BIO *sigbio;
int r = 0; sigbio = BIO_new_file(sigfile, "rb");
if (!init_gen_str(bio_err, &mac_ctx, mac_name, e, 0)) siglen = EVP_PKEY_size(sigkey);
goto mac_end; sigbuf = OPENSSL_malloc(siglen);
if (macopts) { if(!sigbio) {
char *macopt; BIO_printf(bio_err, "Error opening signature file %s\n",
for (i = 0; i < sk_OPENSSL_STRING_num(macopts); i++) { sigfile);
macopt = sk_OPENSSL_STRING_value(macopts, i); ERR_print_errors(bio_err);
if (pkey_ctrl_string(mac_ctx, macopt) <= 0) { goto end;
BIO_printf(bio_err, }
"MAC parameter error \"%s\"\n", macopt); siglen = BIO_read(sigbio, sigbuf, siglen);
ERR_print_errors(bio_err); BIO_free(sigbio);
goto mac_end; if(siglen <= 0) {
} BIO_printf(bio_err, "Error reading signature file %s\n",
} sigfile);
} ERR_print_errors(bio_err);
if (EVP_PKEY_keygen(mac_ctx, &sigkey) <= 0) { goto end;
BIO_puts(bio_err, "Error generating key\n"); }
ERR_print_errors(bio_err); }
goto mac_end;
}
r = 1;
mac_end:
if (mac_ctx)
EVP_PKEY_CTX_free(mac_ctx);
if (r == 0)
goto end;
}
if (non_fips_allow) { /* we use md as a filter, reading from 'in' */
EVP_MD_CTX *md_ctx; BIO_set_md(bmd,md);
BIO_get_md_ctx(bmd, &md_ctx); inp=BIO_push(bmd,in);
EVP_MD_CTX_set_flags(md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
}
if (hmac_key) { if (argc == 0)
sigkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, e, {
(unsigned char *)hmac_key, -1); BIO_set_fp(in,stdin,BIO_NOCLOSE);
if (!sigkey) err=do_fp(out, buf,inp,separator, out_bin, sigkey, sigbuf,
goto end; siglen,"","(stdin)",bmd,hmac_key);
} }
else
{
name=OBJ_nid2sn(md->type);
for (i=0; i<argc; i++)
{
char *tmp,*tofree=NULL;
int r;
if (sigkey) { if (BIO_read_filename(in,argv[i]) <= 0)
EVP_MD_CTX *mctx = NULL; {
EVP_PKEY_CTX *pctx = NULL; perror(argv[i]);
int r; err++;
if (!BIO_get_md_ctx(bmd, &mctx)) { continue;
BIO_printf(bio_err, "Error getting context\n"); }
ERR_print_errors(bio_err); if(!out_bin)
goto end; {
} size_t len = strlen(name)+strlen(argv[i])+(hmac_key ? 5 : 0)+5;
if (do_verify) tmp=tofree=OPENSSL_malloc(len);
r = EVP_DigestVerifyInit(mctx, &pctx, md, NULL, sigkey); BIO_snprintf(tmp,len,"%s%s(%s)= ",
else hmac_key ? "HMAC-" : "",name,argv[i]);
r = EVP_DigestSignInit(mctx, &pctx, md, NULL, sigkey); }
if (!r) { else
BIO_printf(bio_err, "Error setting context\n"); tmp="";
ERR_print_errors(bio_err); r=do_fp(out,buf,inp,separator,out_bin,sigkey,sigbuf,
goto end; siglen,tmp,argv[i],bmd,hmac_key);
} if(r)
if (sigopts) { err=r;
char *sigopt; if(tofree)
for (i = 0; i < sk_OPENSSL_STRING_num(sigopts); i++) { OPENSSL_free(tofree);
sigopt = sk_OPENSSL_STRING_value(sigopts, i); (void)BIO_reset(bmd);
if (pkey_ctrl_string(pctx, sigopt) <= 0) { }
BIO_printf(bio_err, "parameter error \"%s\"\n", sigopt); }
ERR_print_errors(bio_err); end:
goto end; if (buf != NULL)
} {
} OPENSSL_cleanse(buf,BUFSIZE);
} OPENSSL_free(buf);
} }
/* we use md as a filter, reading from 'in' */ if (in != NULL) BIO_free(in);
else { BIO_free_all(out);
if (md == NULL) EVP_PKEY_free(sigkey);
md = EVP_md5(); if(sigbuf) OPENSSL_free(sigbuf);
if (!BIO_set_md(bmd, md)) { if (bmd != NULL) BIO_free(bmd);
BIO_printf(bio_err, "Error setting digest %s\n", pname); apps_shutdown();
ERR_print_errors(bio_err); OPENSSL_EXIT(err);
goto end; }
}
}
if (sigfile && sigkey) {
BIO *sigbio;
sigbio = BIO_new_file(sigfile, "rb");
siglen = EVP_PKEY_size(sigkey);
sigbuf = OPENSSL_malloc(siglen);
if (!sigbio) {
BIO_printf(bio_err, "Error opening signature file %s\n", sigfile);
ERR_print_errors(bio_err);
goto end;
}
if (!sigbuf) {
BIO_printf(bio_err, "Out of memory\n");
ERR_print_errors(bio_err);
goto end;
}
siglen = BIO_read(sigbio, sigbuf, siglen);
BIO_free(sigbio);
if (siglen <= 0) {
BIO_printf(bio_err, "Error reading signature file %s\n", sigfile);
ERR_print_errors(bio_err);
goto end;
}
}
inp = BIO_push(bmd, in);
if (md == NULL) {
EVP_MD_CTX *tctx;
BIO_get_md_ctx(bmd, &tctx);
md = EVP_MD_CTX_md(tctx);
}
if (argc == 0) {
BIO_set_fp(in, stdin, BIO_NOCLOSE);
err = do_fp(out, buf, inp, separator, out_bin, sigkey, sigbuf,
siglen, NULL, NULL, "stdin", bmd);
} else {
const char *md_name = NULL, *sig_name = NULL;
if (!out_bin) {
if (sigkey) {
const EVP_PKEY_ASN1_METHOD *ameth;
ameth = EVP_PKEY_get0_asn1(sigkey);
if (ameth)
EVP_PKEY_asn1_get0_info(NULL, NULL,
NULL, NULL, &sig_name, ameth);
}
md_name = EVP_MD_name(md);
}
err = 0;
for (i = 0; i < argc; i++) {
int r;
if (BIO_read_filename(in, argv[i]) <= 0) {
perror(argv[i]);
err++;
continue;
} else
r = do_fp(out, buf, inp, separator, out_bin, sigkey, sigbuf,
siglen, sig_name, md_name, argv[i], bmd);
if (r)
err = r;
(void)BIO_reset(bmd);
}
}
end:
if (buf != NULL) {
OPENSSL_cleanse(buf, BUFSIZE);
OPENSSL_free(buf);
}
if (in != NULL)
BIO_free(in);
if (passin)
OPENSSL_free(passin);
BIO_free_all(out);
EVP_PKEY_free(sigkey);
if (sigopts)
sk_OPENSSL_STRING_free(sigopts);
if (macopts)
sk_OPENSSL_STRING_free(macopts);
if (sigbuf)
OPENSSL_free(sigbuf);
if (bmd != NULL)
BIO_free(bmd);
apps_shutdown();
OPENSSL_EXIT(err);
}
int do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, int binout, int do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, int binout,
EVP_PKEY *key, unsigned char *sigin, int siglen, EVP_PKEY *key, unsigned char *sigin, int siglen, const char *title,
const char *sig_name, const char *md_name, const char *file,BIO *bmd,const char *hmac_key)
const char *file, BIO *bmd) {
{ unsigned int len;
size_t len; int i;
int i; EVP_MD_CTX *md_ctx;
for (;;) { if (hmac_key)
i = BIO_read(bp, (char *)buf, BUFSIZE); {
if (i < 0) { EVP_MD *md;
BIO_printf(bio_err, "Read Error in %s\n", file);
ERR_print_errors(bio_err); BIO_get_md(bmd,&md);
return 1; HMAC_Init(&hmac_ctx,hmac_key,strlen(hmac_key),md);
} BIO_get_md_ctx(bmd,&md_ctx);
if (i == 0) BIO_set_md_ctx(bmd,&hmac_ctx.md_ctx);
break; }
} for (;;)
if (sigin) { {
EVP_MD_CTX *ctx; i=BIO_read(bp,(char *)buf,BUFSIZE);
BIO_get_md_ctx(bp, &ctx); if(i < 0)
i = EVP_DigestVerifyFinal(ctx, sigin, (unsigned int)siglen); {
if (i > 0) BIO_printf(bio_err, "Read Error in %s\n",file);
BIO_printf(out, "Verified OK\n"); ERR_print_errors(bio_err);
else if (i == 0) { return 1;
BIO_printf(out, "Verification Failure\n"); }
return 1; if (i == 0) break;
} else { }
BIO_printf(bio_err, "Error Verifying Data\n"); if(sigin)
ERR_print_errors(bio_err); {
return 1; EVP_MD_CTX *ctx;
} BIO_get_md_ctx(bp, &ctx);
return 0; i = EVP_VerifyFinal(ctx, sigin, (unsigned int)siglen, key);
} if(i > 0)
if (key) { BIO_printf(out, "Verified OK\n");
EVP_MD_CTX *ctx; else if(i == 0)
BIO_get_md_ctx(bp, &ctx); {
len = BUFSIZE; BIO_printf(out, "Verification Failure\n");
if (!EVP_DigestSignFinal(ctx, buf, &len)) { return 1;
BIO_printf(bio_err, "Error Signing Data\n"); }
ERR_print_errors(bio_err); else
return 1; {
} BIO_printf(bio_err, "Error Verifying Data\n");
} else { ERR_print_errors(bio_err);
len = BIO_gets(bp, (char *)buf, BUFSIZE); return 1;
if ((int)len < 0) { }
ERR_print_errors(bio_err); return 0;
return 1; }
} if(key)
} {
EVP_MD_CTX *ctx;
BIO_get_md_ctx(bp, &ctx);
if(!EVP_SignFinal(ctx, buf, (unsigned int *)&len, key))
{
BIO_printf(bio_err, "Error Signing Data\n");
ERR_print_errors(bio_err);
return 1;
}
}
else if(hmac_key)
{
HMAC_Final(&hmac_ctx,buf,&len);
HMAC_CTX_cleanup(&hmac_ctx);
}
else
len=BIO_gets(bp,(char *)buf,BUFSIZE);
if(binout) BIO_write(out, buf, len);
else
{
BIO_write(out,title,strlen(title));
for (i=0; (unsigned int)i<len; i++)
{
if (sep && (i != 0))
BIO_printf(out, ":");
BIO_printf(out, "%02x",buf[i]);
}
BIO_printf(out, "\n");
}
if (hmac_key)
{
BIO_set_md_ctx(bmd,md_ctx);
}
return 0;
}
if (binout)
BIO_write(out, buf, len);
else if (sep == 2) {
for (i = 0; i < (int)len; i++)
BIO_printf(out, "%02x", buf[i]);
BIO_printf(out, " *%s\n", file);
} else {
if (sig_name)
BIO_printf(out, "%s-%s(%s)= ", sig_name, md_name, file);
else if (md_name)
BIO_printf(out, "%s(%s)= ", md_name, file);
else
BIO_printf(out, "(%s)= ", file);
for (i = 0; i < (int)len; i++) {
if (sep && (i != 0))
BIO_printf(out, ":");
BIO_printf(out, "%02x", buf[i]);
}
BIO_printf(out, "\n");
}
return 0;
}

544
apps/dh.c
View File

@ -57,29 +57,27 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
#include <openssl/opensslconf.h> /* for OPENSSL_NO_DH */
#ifndef OPENSSL_NO_DH #ifndef OPENSSL_NO_DH
# include <stdio.h> #include <stdio.h>
# include <stdlib.h> #include <stdlib.h>
# include <time.h> #include <time.h>
# include <string.h> #include <string.h>
# include "apps.h" #include "apps.h"
# include <openssl/bio.h> #include <openssl/bio.h>
# include <openssl/err.h> #include <openssl/err.h>
# include <openssl/bn.h> #include <openssl/bn.h>
# include <openssl/dh.h> #include <openssl/dh.h>
# include <openssl/x509.h> #include <openssl/x509.h>
# include <openssl/pem.h> #include <openssl/pem.h>
# undef PROG #undef PROG
# define PROG dh_main #define PROG dh_main
/*- /* -inform arg - input format - default PEM (DER or PEM)
* -inform arg - input format - default PEM (DER or PEM)
* -outform arg - output format - default PEM * -outform arg - output format - default PEM
* -in arg - input file - default stdin * -in arg - input file - default stdin
* -out arg - output file - default stdout * -out arg - output file - default stdout
* -check - check the parameters are ok * -check - check the parameters are ok
* -noout * -noout
* -text * -text
* -C * -C
@ -88,250 +86,266 @@
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
DH *dh = NULL; #ifndef OPENSSL_NO_ENGINE
int i, badops = 0, text = 0; ENGINE *e = NULL;
BIO *in = NULL, *out = NULL; #endif
int informat, outformat, check = 0, noout = 0, C = 0, ret = 1; DH *dh=NULL;
char *infile, *outfile, *prog; int i,badops=0,text=0;
# ifndef OPENSSL_NO_ENGINE BIO *in=NULL,*out=NULL;
char *engine; int informat,outformat,check=0,noout=0,C=0,ret=1;
# endif char *infile,*outfile,*prog;
#ifndef OPENSSL_NO_ENGINE
apps_startup(); char *engine;
#endif
if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) apps_startup();
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT);
if (bio_err == NULL)
if (!load_config(bio_err, NULL)) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
goto end; BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
# ifndef OPENSSL_NO_ENGINE if (!load_config(bio_err, NULL))
engine = NULL; goto end;
# endif
infile = NULL; #ifndef OPENSSL_NO_ENGINE
outfile = NULL; engine=NULL;
informat = FORMAT_PEM; #endif
outformat = FORMAT_PEM; infile=NULL;
outfile=NULL;
prog = argv[0]; informat=FORMAT_PEM;
argc--; outformat=FORMAT_PEM;
argv++;
while (argc >= 1) { prog=argv[0];
if (strcmp(*argv, "-inform") == 0) { argc--;
if (--argc < 1) argv++;
goto bad; while (argc >= 1)
informat = str2fmt(*(++argv)); {
} else if (strcmp(*argv, "-outform") == 0) { if (strcmp(*argv,"-inform") == 0)
if (--argc < 1) {
goto bad; if (--argc < 1) goto bad;
outformat = str2fmt(*(++argv)); informat=str2fmt(*(++argv));
} else if (strcmp(*argv, "-in") == 0) { }
if (--argc < 1) else if (strcmp(*argv,"-outform") == 0)
goto bad; {
infile = *(++argv); if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-out") == 0) { outformat=str2fmt(*(++argv));
if (--argc < 1) }
goto bad; else if (strcmp(*argv,"-in") == 0)
outfile = *(++argv); {
} if (--argc < 1) goto bad;
# ifndef OPENSSL_NO_ENGINE infile= *(++argv);
else if (strcmp(*argv, "-engine") == 0) { }
if (--argc < 1) else if (strcmp(*argv,"-out") == 0)
goto bad; {
engine = *(++argv); if (--argc < 1) goto bad;
} outfile= *(++argv);
# endif }
else if (strcmp(*argv, "-check") == 0) #ifndef OPENSSL_NO_ENGINE
check = 1; else if (strcmp(*argv,"-engine") == 0)
else if (strcmp(*argv, "-text") == 0) {
text = 1; if (--argc < 1) goto bad;
else if (strcmp(*argv, "-C") == 0) engine= *(++argv);
C = 1; }
else if (strcmp(*argv, "-noout") == 0) #endif
noout = 1; else if (strcmp(*argv,"-check") == 0)
else { check=1;
BIO_printf(bio_err, "unknown option %s\n", *argv); else if (strcmp(*argv,"-text") == 0)
badops = 1; text=1;
break; else if (strcmp(*argv,"-C") == 0)
} C=1;
argc--; else if (strcmp(*argv,"-noout") == 0)
argv++; noout=1;
} else
{
if (badops) { BIO_printf(bio_err,"unknown option %s\n",*argv);
bad: badops=1;
BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog); break;
BIO_printf(bio_err, "where options are\n"); }
BIO_printf(bio_err, " -inform arg input format - one of DER PEM\n"); argc--;
BIO_printf(bio_err, argv++;
" -outform arg output format - one of DER PEM\n"); }
BIO_printf(bio_err, " -in arg input file\n");
BIO_printf(bio_err, " -out arg output file\n"); if (badops)
BIO_printf(bio_err, " -check check the DH parameters\n"); {
BIO_printf(bio_err, bad:
" -text print a text form of the DH parameters\n"); BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
BIO_printf(bio_err, " -C Output C code\n"); BIO_printf(bio_err,"where options are\n");
BIO_printf(bio_err, " -noout no output\n"); BIO_printf(bio_err," -inform arg input format - one of DER PEM\n");
# ifndef OPENSSL_NO_ENGINE BIO_printf(bio_err," -outform arg output format - one of DER PEM\n");
BIO_printf(bio_err, BIO_printf(bio_err," -in arg input file\n");
" -engine e use engine e, possibly a hardware device.\n"); BIO_printf(bio_err," -out arg output file\n");
# endif BIO_printf(bio_err," -check check the DH parameters\n");
goto end; BIO_printf(bio_err," -text print a text form of the DH parameters\n");
} BIO_printf(bio_err," -C Output C code\n");
BIO_printf(bio_err," -noout no output\n");
ERR_load_crypto_strings(); #ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n");
# ifndef OPENSSL_NO_ENGINE #endif
setup_engine(bio_err, engine, 0); goto end;
# endif }
in = BIO_new(BIO_s_file()); ERR_load_crypto_strings();
out = BIO_new(BIO_s_file());
if ((in == NULL) || (out == NULL)) { #ifndef OPENSSL_NO_ENGINE
ERR_print_errors(bio_err); e = setup_engine(bio_err, engine, 0);
goto end; #endif
}
in=BIO_new(BIO_s_file());
if (infile == NULL) out=BIO_new(BIO_s_file());
BIO_set_fp(in, stdin, BIO_NOCLOSE); if ((in == NULL) || (out == NULL))
else { {
if (BIO_read_filename(in, infile) <= 0) { ERR_print_errors(bio_err);
perror(infile); goto end;
goto end; }
}
} if (infile == NULL)
if (outfile == NULL) { BIO_set_fp(in,stdin,BIO_NOCLOSE);
BIO_set_fp(out, stdout, BIO_NOCLOSE); else
# ifdef OPENSSL_SYS_VMS {
{ if (BIO_read_filename(in,infile) <= 0)
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); {
out = BIO_push(tmpbio, out); perror(infile);
} goto end;
# endif }
} else { }
if (BIO_write_filename(out, outfile) <= 0) { if (outfile == NULL)
perror(outfile); {
goto end; BIO_set_fp(out,stdout,BIO_NOCLOSE);
} #ifdef OPENSSL_SYS_VMS
} {
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
if (informat == FORMAT_ASN1) out = BIO_push(tmpbio, out);
dh = d2i_DHparams_bio(in, NULL); }
else if (informat == FORMAT_PEM) #endif
dh = PEM_read_bio_DHparams(in, NULL, NULL, NULL); }
else { else
BIO_printf(bio_err, "bad input format specified\n"); {
goto end; if (BIO_write_filename(out,outfile) <= 0)
} {
if (dh == NULL) { perror(outfile);
BIO_printf(bio_err, "unable to load DH parameters\n"); goto end;
ERR_print_errors(bio_err); }
goto end; }
}
if (informat == FORMAT_ASN1)
if (text) { dh=d2i_DHparams_bio(in,NULL);
DHparams_print(out, dh); else if (informat == FORMAT_PEM)
# ifdef undef dh=PEM_read_bio_DHparams(in,NULL,NULL,NULL);
printf("p="); else
BN_print(stdout, dh->p); {
printf("\ng="); BIO_printf(bio_err,"bad input format specified\n");
BN_print(stdout, dh->g); goto end;
printf("\n"); }
if (dh->length != 0) if (dh == NULL)
printf("recommended private length=%ld\n", dh->length); {
# endif BIO_printf(bio_err,"unable to load DH parameters\n");
} ERR_print_errors(bio_err);
goto end;
if (check) { }
if (!DH_check(dh, &i)) {
ERR_print_errors(bio_err);
goto end;
} if (text)
if (i & DH_CHECK_P_NOT_PRIME) {
printf("p value is not prime\n"); DHparams_print(out,dh);
if (i & DH_CHECK_P_NOT_SAFE_PRIME) #ifdef undef
printf("p value is not a safe prime\n"); printf("p=");
if (i & DH_UNABLE_TO_CHECK_GENERATOR) BN_print(stdout,dh->p);
printf("unable to check the generator value\n"); printf("\ng=");
if (i & DH_NOT_SUITABLE_GENERATOR) BN_print(stdout,dh->g);
printf("the g value is not a generator\n"); printf("\n");
if (i == 0) if (dh->length != 0)
printf("DH parameters appear to be ok.\n"); printf("recommended private length=%ld\n",dh->length);
} #endif
if (C) { }
unsigned char *data;
int len, l, bits; if (check)
{
len = BN_num_bytes(dh->p); if (!DH_check(dh,&i))
bits = BN_num_bits(dh->p); {
data = (unsigned char *)OPENSSL_malloc(len); ERR_print_errors(bio_err);
if (data == NULL) { goto end;
perror("OPENSSL_malloc"); }
goto end; if (i & DH_CHECK_P_NOT_PRIME)
} printf("p value is not prime\n");
l = BN_bn2bin(dh->p, data); if (i & DH_CHECK_P_NOT_SAFE_PRIME)
printf("static unsigned char dh%d_p[]={", bits); printf("p value is not a safe prime\n");
for (i = 0; i < l; i++) { if (i & DH_UNABLE_TO_CHECK_GENERATOR)
if ((i % 12) == 0) printf("unable to check the generator value\n");
printf("\n\t"); if (i & DH_NOT_SUITABLE_GENERATOR)
printf("0x%02X,", data[i]); printf("the g value is not a generator\n");
} if (i == 0)
printf("\n\t};\n"); printf("DH parameters appear to be ok.\n");
}
l = BN_bn2bin(dh->g, data); if (C)
printf("static unsigned char dh%d_g[]={", bits); {
for (i = 0; i < l; i++) { unsigned char *data;
if ((i % 12) == 0) int len,l,bits;
printf("\n\t");
printf("0x%02X,", data[i]); len=BN_num_bytes(dh->p);
} bits=BN_num_bits(dh->p);
printf("\n\t};\n\n"); data=(unsigned char *)OPENSSL_malloc(len);
if (data == NULL)
printf("DH *get_dh%d()\n\t{\n", bits); {
printf("\tDH *dh;\n\n"); perror("OPENSSL_malloc");
printf("\tif ((dh=DH_new()) == NULL) return(NULL);\n"); goto end;
printf("\tdh->p=BN_bin2bn(dh%d_p,sizeof(dh%d_p),NULL);\n", }
bits, bits); l=BN_bn2bin(dh->p,data);
printf("\tdh->g=BN_bin2bn(dh%d_g,sizeof(dh%d_g),NULL);\n", printf("static unsigned char dh%d_p[]={",bits);
bits, bits); for (i=0; i<l; i++)
printf("\tif ((dh->p == NULL) || (dh->g == NULL))\n"); {
printf("\t\treturn(NULL);\n"); if ((i%12) == 0) printf("\n\t");
printf("\treturn(dh);\n\t}\n"); printf("0x%02X,",data[i]);
OPENSSL_free(data); }
} printf("\n\t};\n");
if (!noout) { l=BN_bn2bin(dh->g,data);
if (outformat == FORMAT_ASN1) printf("static unsigned char dh%d_g[]={",bits);
i = i2d_DHparams_bio(out, dh); for (i=0; i<l; i++)
else if (outformat == FORMAT_PEM) {
i = PEM_write_bio_DHparams(out, dh); if ((i%12) == 0) printf("\n\t");
else { printf("0x%02X,",data[i]);
BIO_printf(bio_err, "bad output format specified for outfile\n"); }
goto end; printf("\n\t};\n\n");
}
if (!i) { printf("DH *get_dh%d()\n\t{\n",bits);
BIO_printf(bio_err, "unable to write DH parameters\n"); printf("\tDH *dh;\n\n");
ERR_print_errors(bio_err); printf("\tif ((dh=DH_new()) == NULL) return(NULL);\n");
goto end; printf("\tdh->p=BN_bin2bn(dh%d_p,sizeof(dh%d_p),NULL);\n",
} bits,bits);
} printf("\tdh->g=BN_bin2bn(dh%d_g,sizeof(dh%d_g),NULL);\n",
ret = 0; bits,bits);
end: printf("\tif ((dh->p == NULL) || (dh->g == NULL))\n");
if (in != NULL) printf("\t\treturn(NULL);\n");
BIO_free(in); printf("\treturn(dh);\n\t}\n");
if (out != NULL) OPENSSL_free(data);
BIO_free_all(out); }
if (dh != NULL)
DH_free(dh);
apps_shutdown(); if (!noout)
OPENSSL_EXIT(ret); {
} if (outformat == FORMAT_ASN1)
#else /* !OPENSSL_NO_DH */ i=i2d_DHparams_bio(out,dh);
else if (outformat == FORMAT_PEM)
# if PEDANTIC i=PEM_write_bio_DHparams(out,dh);
static void *dummy = &dummy; else {
# endif BIO_printf(bio_err,"bad output format specified for outfile\n");
goto end;
}
if (!i)
{
BIO_printf(bio_err,"unable to write DH parameters\n");
ERR_print_errors(bio_err);
goto end;
}
}
ret=0;
end:
if (in != NULL) BIO_free(in);
if (out != NULL) BIO_free_all(out);
if (dh != NULL) DH_free(dh);
apps_shutdown();
OPENSSL_EXIT(ret);
}
#endif #endif

View File

@ -109,435 +109,444 @@
* *
*/ */
#include <openssl/opensslconf.h> /* for OPENSSL_NO_DH */
#ifndef OPENSSL_NO_DH #ifndef OPENSSL_NO_DH
# include <stdio.h> #include <stdio.h>
# include <stdlib.h> #include <stdlib.h>
# include <time.h> #include <time.h>
# include <string.h> #include <string.h>
# include "apps.h" #include "apps.h"
# include <openssl/bio.h> #include <openssl/bio.h>
# include <openssl/err.h> #include <openssl/err.h>
# include <openssl/bn.h> #include <openssl/bn.h>
# include <openssl/dh.h> #include <openssl/dh.h>
# include <openssl/x509.h> #include <openssl/x509.h>
# include <openssl/pem.h> #include <openssl/pem.h>
# ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
# include <openssl/dsa.h> #include <openssl/dsa.h>
# endif #endif
# undef PROG #undef PROG
# define PROG dhparam_main #define PROG dhparam_main
# define DEFBITS 2048 #define DEFBITS 512
/*- /* -inform arg - input format - default PEM (DER or PEM)
* -inform arg - input format - default PEM (DER or PEM)
* -outform arg - output format - default PEM * -outform arg - output format - default PEM
* -in arg - input file - default stdin * -in arg - input file - default stdin
* -out arg - output file - default stdout * -out arg - output file - default stdout
* -dsaparam - read or generate DSA parameters, convert to DH * -dsaparam - read or generate DSA parameters, convert to DH
* -check - check the parameters are ok * -check - check the parameters are ok
* -noout * -noout
* -text * -text
* -C * -C
*/ */
static int MS_CALLBACK dh_cb(int p, int n, BN_GENCB *cb); static void MS_CALLBACK dh_cb(int p, int n, void *arg);
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
DH *dh = NULL; #ifndef OPENSSL_NO_ENGINE
int i, badops = 0, text = 0; ENGINE *e = NULL;
# ifndef OPENSSL_NO_DSA #endif
int dsaparam = 0; DH *dh=NULL;
# endif int i,badops=0,text=0;
BIO *in = NULL, *out = NULL; #ifndef OPENSSL_NO_DSA
int informat, outformat, check = 0, noout = 0, C = 0, ret = 1; int dsaparam=0;
char *infile, *outfile, *prog; #endif
char *inrand = NULL; BIO *in=NULL,*out=NULL;
# ifndef OPENSSL_NO_ENGINE int informat,outformat,check=0,noout=0,C=0,ret=1;
char *engine = NULL; char *infile,*outfile,*prog;
# endif char *inrand=NULL;
int num = 0, g = 0; #ifndef OPENSSL_NO_ENGINE
char *engine=NULL;
#endif
int num = 0, g = 0;
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
infile = NULL; infile=NULL;
outfile = NULL; outfile=NULL;
informat = FORMAT_PEM; informat=FORMAT_PEM;
outformat = FORMAT_PEM; outformat=FORMAT_PEM;
prog = argv[0]; prog=argv[0];
argc--; argc--;
argv++; argv++;
while (argc >= 1) { while (argc >= 1)
if (strcmp(*argv, "-inform") == 0) { {
if (--argc < 1) if (strcmp(*argv,"-inform") == 0)
goto bad; {
informat = str2fmt(*(++argv)); if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-outform") == 0) { informat=str2fmt(*(++argv));
if (--argc < 1) }
goto bad; else if (strcmp(*argv,"-outform") == 0)
outformat = str2fmt(*(++argv)); {
} else if (strcmp(*argv, "-in") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) outformat=str2fmt(*(++argv));
goto bad; }
infile = *(++argv); else if (strcmp(*argv,"-in") == 0)
} else if (strcmp(*argv, "-out") == 0) { {
if (--argc < 1) if (--argc < 1) goto bad;
goto bad; infile= *(++argv);
outfile = *(++argv); }
} else if (strcmp(*argv,"-out") == 0)
# ifndef OPENSSL_NO_ENGINE {
else if (strcmp(*argv, "-engine") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) outfile= *(++argv);
goto bad; }
engine = *(++argv); #ifndef OPENSSL_NO_ENGINE
} else if (strcmp(*argv,"-engine") == 0)
# endif {
else if (strcmp(*argv, "-check") == 0) if (--argc < 1) goto bad;
check = 1; engine= *(++argv);
else if (strcmp(*argv, "-text") == 0) }
text = 1; #endif
# ifndef OPENSSL_NO_DSA else if (strcmp(*argv,"-check") == 0)
else if (strcmp(*argv, "-dsaparam") == 0) check=1;
dsaparam = 1; else if (strcmp(*argv,"-text") == 0)
# endif text=1;
else if (strcmp(*argv, "-C") == 0) #ifndef OPENSSL_NO_DSA
C = 1; else if (strcmp(*argv,"-dsaparam") == 0)
else if (strcmp(*argv, "-noout") == 0) dsaparam=1;
noout = 1; #endif
else if (strcmp(*argv, "-2") == 0) else if (strcmp(*argv,"-C") == 0)
g = 2; C=1;
else if (strcmp(*argv, "-5") == 0) else if (strcmp(*argv,"-noout") == 0)
g = 5; noout=1;
else if (strcmp(*argv, "-rand") == 0) { else if (strcmp(*argv,"-2") == 0)
if (--argc < 1) g=2;
goto bad; else if (strcmp(*argv,"-5") == 0)
inrand = *(++argv); g=5;
} else if (((sscanf(*argv, "%d", &num) == 0) || (num <= 0))) else if (strcmp(*argv,"-rand") == 0)
goto bad; {
argv++; if (--argc < 1) goto bad;
argc--; inrand= *(++argv);
} }
else if (((sscanf(*argv,"%d",&num) == 0) || (num <= 0)))
goto bad;
argv++;
argc--;
}
if (badops) { if (badops)
bad: {
BIO_printf(bio_err, "%s [options] [numbits]\n", prog); bad:
BIO_printf(bio_err, "where options are\n"); BIO_printf(bio_err,"%s [options] [numbits]\n",prog);
BIO_printf(bio_err, " -inform arg input format - one of DER PEM\n"); BIO_printf(bio_err,"where options are\n");
BIO_printf(bio_err, BIO_printf(bio_err," -inform arg input format - one of DER PEM\n");
" -outform arg output format - one of DER PEM\n"); BIO_printf(bio_err," -outform arg output format - one of DER PEM\n");
BIO_printf(bio_err, " -in arg input file\n"); BIO_printf(bio_err," -in arg input file\n");
BIO_printf(bio_err, " -out arg output file\n"); BIO_printf(bio_err," -out arg output file\n");
# ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
BIO_printf(bio_err, BIO_printf(bio_err," -dsaparam read or generate DSA parameters, convert to DH\n");
" -dsaparam read or generate DSA parameters, convert to DH\n"); #endif
# endif BIO_printf(bio_err," -check check the DH parameters\n");
BIO_printf(bio_err, " -check check the DH parameters\n"); BIO_printf(bio_err," -text print a text form of the DH parameters\n");
BIO_printf(bio_err, BIO_printf(bio_err," -C Output C code\n");
" -text print a text form of the DH parameters\n"); BIO_printf(bio_err," -2 generate parameters using 2 as the generator value\n");
BIO_printf(bio_err, " -C Output C code\n"); BIO_printf(bio_err," -5 generate parameters using 5 as the generator value\n");
BIO_printf(bio_err, BIO_printf(bio_err," numbits number of bits in to generate (default 512)\n");
" -2 generate parameters using 2 as the generator value\n"); #ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err, BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n");
" -5 generate parameters using 5 as the generator value\n"); #endif
BIO_printf(bio_err, BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
" numbits number of bits in to generate (default 2048)\n"); BIO_printf(bio_err," - load the file (or the files in the directory) into\n");
# ifndef OPENSSL_NO_ENGINE BIO_printf(bio_err," the random number generator\n");
BIO_printf(bio_err, BIO_printf(bio_err," -noout no output\n");
" -engine e use engine e, possibly a hardware device.\n"); goto end;
# endif }
BIO_printf(bio_err, " -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR,
LIST_SEPARATOR_CHAR);
BIO_printf(bio_err,
" - load the file (or the files in the directory) into\n");
BIO_printf(bio_err, " the random number generator\n");
BIO_printf(bio_err, " -noout no output\n");
goto end;
}
ERR_load_crypto_strings(); ERR_load_crypto_strings();
# ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
setup_engine(bio_err, engine, 0); e = setup_engine(bio_err, engine, 0);
# endif #endif
if (g && !num) if (g && !num)
num = DEFBITS; num = DEFBITS;
# ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
if (dsaparam) { if (dsaparam)
if (g) { {
BIO_printf(bio_err, if (g)
"generator may not be chosen for DSA parameters\n"); {
goto end; BIO_printf(bio_err, "generator may not be chosen for DSA parameters\n");
} goto end;
} else }
# endif }
{ else
/* DH parameters */ #endif
if (num && !g) {
g = 2; /* DH parameters */
} if (num && !g)
g = 2;
}
if (num) { if(num) {
BN_GENCB cb; if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL)
BN_GENCB_set(&cb, dh_cb, bio_err); {
if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL) { BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
BIO_printf(bio_err, }
"warning, not much extra random data, consider using the -rand option\n"); if (inrand != NULL)
} BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
if (inrand != NULL) app_RAND_load_files(inrand));
BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
app_RAND_load_files(inrand));
# ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
if (dsaparam) { if (dsaparam)
DSA *dsa = DSA_new(); {
DSA *dsa;
BIO_printf(bio_err, BIO_printf(bio_err,"Generating DSA parameters, %d bit long prime\n",num);
"Generating DSA parameters, %d bit long prime\n", num); dsa = DSA_generate_parameters(num, NULL, 0, NULL, NULL, dh_cb, bio_err);
if (!dsa if (dsa == NULL)
|| !DSA_generate_parameters_ex(dsa, num, NULL, 0, NULL, NULL, {
&cb)) { ERR_print_errors(bio_err);
if (dsa) goto end;
DSA_free(dsa); }
ERR_print_errors(bio_err);
goto end;
}
dh = DSA_dup_DH(dsa); dh = DSA_dup_DH(dsa);
DSA_free(dsa); DSA_free(dsa);
if (dh == NULL) { if (dh == NULL)
ERR_print_errors(bio_err); {
goto end; ERR_print_errors(bio_err);
} goto end;
} else }
# endif }
{ else
dh = DH_new(); #endif
BIO_printf(bio_err, {
"Generating DH parameters, %d bit long safe prime, generator %d\n", BIO_printf(bio_err,"Generating DH parameters, %d bit long safe prime, generator %d\n",num,g);
num, g); BIO_printf(bio_err,"This is going to take a long time\n");
BIO_printf(bio_err, "This is going to take a long time\n"); dh=DH_generate_parameters(num,g,dh_cb,bio_err);
if (!dh || !DH_generate_parameters_ex(dh, num, g, &cb)) {
ERR_print_errors(bio_err);
goto end;
}
}
app_RAND_write_file(NULL, bio_err); if (dh == NULL)
} else { {
ERR_print_errors(bio_err);
goto end;
}
}
in = BIO_new(BIO_s_file()); app_RAND_write_file(NULL, bio_err);
if (in == NULL) { } else {
ERR_print_errors(bio_err);
goto end;
}
if (infile == NULL)
BIO_set_fp(in, stdin, BIO_NOCLOSE);
else {
if (BIO_read_filename(in, infile) <= 0) {
perror(infile);
goto end;
}
}
if (informat != FORMAT_ASN1 && informat != FORMAT_PEM) { in=BIO_new(BIO_s_file());
BIO_printf(bio_err, "bad input format specified\n"); if (in == NULL)
goto end; {
} ERR_print_errors(bio_err);
# ifndef OPENSSL_NO_DSA goto end;
if (dsaparam) { }
DSA *dsa; if (infile == NULL)
BIO_set_fp(in,stdin,BIO_NOCLOSE);
else
{
if (BIO_read_filename(in,infile) <= 0)
{
perror(infile);
goto end;
}
}
if (informat == FORMAT_ASN1) if (informat != FORMAT_ASN1 && informat != FORMAT_PEM)
dsa = d2i_DSAparams_bio(in, NULL); {
else /* informat == FORMAT_PEM */ BIO_printf(bio_err,"bad input format specified\n");
dsa = PEM_read_bio_DSAparams(in, NULL, NULL, NULL); goto end;
}
if (dsa == NULL) { #ifndef OPENSSL_NO_DSA
BIO_printf(bio_err, "unable to load DSA parameters\n"); if (dsaparam)
ERR_print_errors(bio_err); {
goto end; DSA *dsa;
}
dh = DSA_dup_DH(dsa); if (informat == FORMAT_ASN1)
DSA_free(dsa); dsa=d2i_DSAparams_bio(in,NULL);
if (dh == NULL) { else /* informat == FORMAT_PEM */
ERR_print_errors(bio_err); dsa=PEM_read_bio_DSAparams(in,NULL,NULL,NULL);
goto end;
}
} else
# endif
{
if (informat == FORMAT_ASN1)
dh = d2i_DHparams_bio(in, NULL);
else /* informat == FORMAT_PEM */
dh = PEM_read_bio_DHparams(in, NULL, NULL, NULL);
if (dh == NULL) { if (dsa == NULL)
BIO_printf(bio_err, "unable to load DH parameters\n"); {
ERR_print_errors(bio_err); BIO_printf(bio_err,"unable to load DSA parameters\n");
goto end; ERR_print_errors(bio_err);
} goto end;
} }
/* dh != NULL */ dh = DSA_dup_DH(dsa);
} DSA_free(dsa);
if (dh == NULL)
{
ERR_print_errors(bio_err);
goto end;
}
}
else
#endif
{
if (informat == FORMAT_ASN1)
dh=d2i_DHparams_bio(in,NULL);
else /* informat == FORMAT_PEM */
dh=PEM_read_bio_DHparams(in,NULL,NULL,NULL);
out = BIO_new(BIO_s_file()); if (dh == NULL)
if (out == NULL) { {
ERR_print_errors(bio_err); BIO_printf(bio_err,"unable to load DH parameters\n");
goto end; ERR_print_errors(bio_err);
} goto end;
if (outfile == NULL) { }
BIO_set_fp(out, stdout, BIO_NOCLOSE); }
# ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out);
}
# endif
} else {
if (BIO_write_filename(out, outfile) <= 0) {
perror(outfile);
goto end;
}
}
if (text) { /* dh != NULL */
DHparams_print(out, dh); }
}
if (check) { out=BIO_new(BIO_s_file());
if (!DH_check(dh, &i)) { if (out == NULL)
ERR_print_errors(bio_err); {
goto end; ERR_print_errors(bio_err);
} goto end;
if (i & DH_CHECK_P_NOT_PRIME) }
printf("p value is not prime\n"); if (outfile == NULL)
if (i & DH_CHECK_P_NOT_SAFE_PRIME) {
printf("p value is not a safe prime\n"); BIO_set_fp(out,stdout,BIO_NOCLOSE);
if (i & DH_UNABLE_TO_CHECK_GENERATOR) #ifdef OPENSSL_SYS_VMS
printf("unable to check the generator value\n"); {
if (i & DH_NOT_SUITABLE_GENERATOR) BIO *tmpbio = BIO_new(BIO_f_linebuffer());
printf("the g value is not a generator\n"); out = BIO_push(tmpbio, out);
if (i == 0) }
printf("DH parameters appear to be ok.\n"); #endif
} }
if (C) { else
unsigned char *data; {
int len, l, bits; if (BIO_write_filename(out,outfile) <= 0)
{
perror(outfile);
goto end;
}
}
len = BN_num_bytes(dh->p);
bits = BN_num_bits(dh->p);
data = (unsigned char *)OPENSSL_malloc(len);
if (data == NULL) {
perror("OPENSSL_malloc");
goto end;
}
printf("#ifndef HEADER_DH_H\n"
"#include <openssl/dh.h>\n" "#endif\n");
printf("DH *get_dh%d()\n\t{\n", bits);
l = BN_bn2bin(dh->p, data); if (text)
printf("\tstatic unsigned char dh%d_p[]={", bits); {
for (i = 0; i < l; i++) { DHparams_print(out,dh);
if ((i % 12) == 0) }
printf("\n\t\t");
printf("0x%02X,", data[i]);
}
printf("\n\t\t};\n");
l = BN_bn2bin(dh->g, data); if (check)
printf("\tstatic unsigned char dh%d_g[]={", bits); {
for (i = 0; i < l; i++) { if (!DH_check(dh,&i))
if ((i % 12) == 0) {
printf("\n\t\t"); ERR_print_errors(bio_err);
printf("0x%02X,", data[i]); goto end;
} }
printf("\n\t\t};\n"); if (i & DH_CHECK_P_NOT_PRIME)
printf("p value is not prime\n");
if (i & DH_CHECK_P_NOT_SAFE_PRIME)
printf("p value is not a safe prime\n");
if (i & DH_UNABLE_TO_CHECK_GENERATOR)
printf("unable to check the generator value\n");
if (i & DH_NOT_SUITABLE_GENERATOR)
printf("the g value is not a generator\n");
if (i == 0)
printf("DH parameters appear to be ok.\n");
}
if (C)
{
unsigned char *data;
int len,l,bits;
printf("\tDH *dh;\n\n"); len=BN_num_bytes(dh->p);
printf("\tif ((dh=DH_new()) == NULL) return(NULL);\n"); bits=BN_num_bits(dh->p);
printf("\tdh->p=BN_bin2bn(dh%d_p,sizeof(dh%d_p),NULL);\n", data=(unsigned char *)OPENSSL_malloc(len);
bits, bits); if (data == NULL)
printf("\tdh->g=BN_bin2bn(dh%d_g,sizeof(dh%d_g),NULL);\n", {
bits, bits); perror("OPENSSL_malloc");
printf("\tif ((dh->p == NULL) || (dh->g == NULL))\n"); goto end;
printf("\t\t{ DH_free(dh); return(NULL); }\n"); }
if (dh->length) printf("#ifndef HEADER_DH_H\n"
printf("\tdh->length = %ld;\n", dh->length); "#include <openssl/dh.h>\n"
printf("\treturn(dh);\n\t}\n"); "#endif\n");
OPENSSL_free(data); printf("DH *get_dh%d()\n\t{\n",bits);
}
if (!noout) { l=BN_bn2bin(dh->p,data);
if (outformat == FORMAT_ASN1) printf("\tstatic unsigned char dh%d_p[]={",bits);
i = i2d_DHparams_bio(out, dh); for (i=0; i<l; i++)
else if (outformat == FORMAT_PEM) {
i = PEM_write_bio_DHparams(out, dh); if ((i%12) == 0) printf("\n\t\t");
else { printf("0x%02X,",data[i]);
BIO_printf(bio_err, "bad output format specified for outfile\n"); }
goto end; printf("\n\t\t};\n");
}
if (!i) { l=BN_bn2bin(dh->g,data);
BIO_printf(bio_err, "unable to write DH parameters\n"); printf("\tstatic unsigned char dh%d_g[]={",bits);
ERR_print_errors(bio_err); for (i=0; i<l; i++)
goto end; {
} if ((i%12) == 0) printf("\n\t\t");
} printf("0x%02X,",data[i]);
ret = 0; }
end: printf("\n\t\t};\n");
if (in != NULL)
BIO_free(in); printf("\tDH *dh;\n\n");
if (out != NULL) printf("\tif ((dh=DH_new()) == NULL) return(NULL);\n");
BIO_free_all(out); printf("\tdh->p=BN_bin2bn(dh%d_p,sizeof(dh%d_p),NULL);\n",
if (dh != NULL) bits,bits);
DH_free(dh); printf("\tdh->g=BN_bin2bn(dh%d_g,sizeof(dh%d_g),NULL);\n",
apps_shutdown(); bits,bits);
OPENSSL_EXIT(ret); printf("\tif ((dh->p == NULL) || (dh->g == NULL))\n");
} printf("\t\t{ DH_free(dh); return(NULL); }\n");
if (dh->length)
printf("\tdh->length = %ld;\n", dh->length);
printf("\treturn(dh);\n\t}\n");
OPENSSL_free(data);
}
if (!noout)
{
if (outformat == FORMAT_ASN1)
i=i2d_DHparams_bio(out,dh);
else if (outformat == FORMAT_PEM)
i=PEM_write_bio_DHparams(out,dh);
else {
BIO_printf(bio_err,"bad output format specified for outfile\n");
goto end;
}
if (!i)
{
BIO_printf(bio_err,"unable to write DH parameters\n");
ERR_print_errors(bio_err);
goto end;
}
}
ret=0;
end:
if (in != NULL) BIO_free(in);
if (out != NULL) BIO_free_all(out);
if (dh != NULL) DH_free(dh);
apps_shutdown();
OPENSSL_EXIT(ret);
}
/* dh_cb is identical to dsa_cb in apps/dsaparam.c */ /* dh_cb is identical to dsa_cb in apps/dsaparam.c */
static int MS_CALLBACK dh_cb(int p, int n, BN_GENCB *cb) static void MS_CALLBACK dh_cb(int p, int n, void *arg)
{ {
char c = '*'; char c='*';
if (p == 0) if (p == 0) c='.';
c = '.'; if (p == 1) c='+';
if (p == 1) if (p == 2) c='*';
c = '+'; if (p == 3) c='\n';
if (p == 2) BIO_write((BIO *)arg,&c,1);
c = '*'; (void)BIO_flush((BIO *)arg);
if (p == 3) #ifdef LINT
c = '\n'; p=n;
BIO_write(cb->arg, &c, 1); #endif
(void)BIO_flush(cb->arg); }
# ifdef LINT
p = n;
# endif
return 1;
}
#else /* !OPENSSL_NO_DH */
# if PEDANTIC
static void *dummy = &dummy;
# endif
#endif #endif

View File

@ -56,319 +56,277 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
#include <openssl/opensslconf.h> /* for OPENSSL_NO_DSA */
#ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
# include <stdio.h> #include <stdio.h>
# include <stdlib.h> #include <stdlib.h>
# include <string.h> #include <string.h>
# include <time.h> #include <time.h>
# include "apps.h" #include "apps.h"
# include <openssl/bio.h> #include <openssl/bio.h>
# include <openssl/err.h> #include <openssl/err.h>
# include <openssl/dsa.h> #include <openssl/dsa.h>
# include <openssl/evp.h> #include <openssl/evp.h>
# include <openssl/x509.h> #include <openssl/x509.h>
# include <openssl/pem.h> #include <openssl/pem.h>
# include <openssl/bn.h>
# undef PROG #undef PROG
# define PROG dsa_main #define PROG dsa_main
/*- /* -inform arg - input format - default PEM (one of DER, NET or PEM)
* -inform arg - input format - default PEM (one of DER, NET or PEM)
* -outform arg - output format - default PEM * -outform arg - output format - default PEM
* -in arg - input file - default stdin * -in arg - input file - default stdin
* -out arg - output file - default stdout * -out arg - output file - default stdout
* -des - encrypt output if PEM format with DES in cbc mode * -des - encrypt output if PEM format with DES in cbc mode
* -des3 - encrypt output if PEM format * -des3 - encrypt output if PEM format
* -idea - encrypt output if PEM format * -idea - encrypt output if PEM format
* -aes128 - encrypt output if PEM format * -aes128 - encrypt output if PEM format
* -aes192 - encrypt output if PEM format * -aes192 - encrypt output if PEM format
* -aes256 - encrypt output if PEM format * -aes256 - encrypt output if PEM format
* -camellia128 - encrypt output if PEM format * -text - print a text version
* -camellia192 - encrypt output if PEM format * -modulus - print the DSA public key
* -camellia256 - encrypt output if PEM format
* -seed - encrypt output if PEM format
* -text - print a text version
* -modulus - print the DSA public key
*/ */
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
ENGINE *e = NULL; #ifndef OPENSSL_NO_ENGINE
int ret = 1; ENGINE *e = NULL;
DSA *dsa = NULL; #endif
int i, badops = 0; int ret=1;
const EVP_CIPHER *enc = NULL; DSA *dsa=NULL;
BIO *in = NULL, *out = NULL; int i,badops=0;
int informat, outformat, text = 0, noout = 0; const EVP_CIPHER *enc=NULL;
int pubin = 0, pubout = 0; BIO *in=NULL,*out=NULL;
char *infile, *outfile, *prog; int informat,outformat,text=0,noout=0;
# ifndef OPENSSL_NO_ENGINE int pubin = 0, pubout = 0;
char *engine; char *infile,*outfile,*prog;
# endif #ifndef OPENSSL_NO_ENGINE
char *passargin = NULL, *passargout = NULL; char *engine;
char *passin = NULL, *passout = NULL; #endif
int modulus = 0; char *passargin = NULL, *passargout = NULL;
char *passin = NULL, *passout = NULL;
int pvk_encr = 2; int modulus=0;
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
# ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
engine = NULL; engine=NULL;
# endif #endif
infile = NULL; infile=NULL;
outfile = NULL; outfile=NULL;
informat = FORMAT_PEM; informat=FORMAT_PEM;
outformat = FORMAT_PEM; outformat=FORMAT_PEM;
prog = argv[0]; prog=argv[0];
argc--; argc--;
argv++; argv++;
while (argc >= 1) { while (argc >= 1)
if (strcmp(*argv, "-inform") == 0) { {
if (--argc < 1) if (strcmp(*argv,"-inform") == 0)
goto bad; {
informat = str2fmt(*(++argv)); if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-outform") == 0) { informat=str2fmt(*(++argv));
if (--argc < 1) }
goto bad; else if (strcmp(*argv,"-outform") == 0)
outformat = str2fmt(*(++argv)); {
} else if (strcmp(*argv, "-in") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) outformat=str2fmt(*(++argv));
goto bad; }
infile = *(++argv); else if (strcmp(*argv,"-in") == 0)
} else if (strcmp(*argv, "-out") == 0) { {
if (--argc < 1) if (--argc < 1) goto bad;
goto bad; infile= *(++argv);
outfile = *(++argv); }
} else if (strcmp(*argv, "-passin") == 0) { else if (strcmp(*argv,"-out") == 0)
if (--argc < 1) {
goto bad; if (--argc < 1) goto bad;
passargin = *(++argv); outfile= *(++argv);
} else if (strcmp(*argv, "-passout") == 0) { }
if (--argc < 1) else if (strcmp(*argv,"-passin") == 0)
goto bad; {
passargout = *(++argv); if (--argc < 1) goto bad;
} passargin= *(++argv);
# ifndef OPENSSL_NO_ENGINE }
else if (strcmp(*argv, "-engine") == 0) { else if (strcmp(*argv,"-passout") == 0)
if (--argc < 1) {
goto bad; if (--argc < 1) goto bad;
engine = *(++argv); passargout= *(++argv);
} }
# endif #ifndef OPENSSL_NO_ENGINE
else if (strcmp(*argv, "-pvk-strong") == 0) else if (strcmp(*argv,"-engine") == 0)
pvk_encr = 2; {
else if (strcmp(*argv, "-pvk-weak") == 0) if (--argc < 1) goto bad;
pvk_encr = 1; engine= *(++argv);
else if (strcmp(*argv, "-pvk-none") == 0) }
pvk_encr = 0; #endif
else if (strcmp(*argv, "-noout") == 0) else if (strcmp(*argv,"-noout") == 0)
noout = 1; noout=1;
else if (strcmp(*argv, "-text") == 0) else if (strcmp(*argv,"-text") == 0)
text = 1; text=1;
else if (strcmp(*argv, "-modulus") == 0) else if (strcmp(*argv,"-modulus") == 0)
modulus = 1; modulus=1;
else if (strcmp(*argv, "-pubin") == 0) else if (strcmp(*argv,"-pubin") == 0)
pubin = 1; pubin=1;
else if (strcmp(*argv, "-pubout") == 0) else if (strcmp(*argv,"-pubout") == 0)
pubout = 1; pubout=1;
else if ((enc = EVP_get_cipherbyname(&(argv[0][1]))) == NULL) { else if ((enc=EVP_get_cipherbyname(&(argv[0][1]))) == NULL)
BIO_printf(bio_err, "unknown option %s\n", *argv); {
badops = 1; BIO_printf(bio_err,"unknown option %s\n",*argv);
break; badops=1;
} break;
argc--; }
argv++; argc--;
} argv++;
}
if (badops) {
bad: if (badops)
BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog); {
BIO_printf(bio_err, "where options are\n"); bad:
BIO_printf(bio_err, " -inform arg input format - DER or PEM\n"); BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
BIO_printf(bio_err, " -outform arg output format - DER or PEM\n"); BIO_printf(bio_err,"where options are\n");
BIO_printf(bio_err, " -in arg input file\n"); BIO_printf(bio_err," -inform arg input format - DER or PEM\n");
BIO_printf(bio_err, BIO_printf(bio_err," -outform arg output format - DER or PEM\n");
" -passin arg input file pass phrase source\n"); BIO_printf(bio_err," -in arg input file\n");
BIO_printf(bio_err, " -out arg output file\n"); BIO_printf(bio_err," -passin arg input file pass phrase source\n");
BIO_printf(bio_err, BIO_printf(bio_err," -out arg output file\n");
" -passout arg output file pass phrase source\n"); BIO_printf(bio_err," -passout arg output file pass phrase source\n");
# ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err, BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n");
" -engine e use engine e, possibly a hardware device.\n"); #endif
# endif BIO_printf(bio_err," -des encrypt PEM output with cbc des\n");
BIO_printf(bio_err, BIO_printf(bio_err," -des3 encrypt PEM output with ede cbc des using 168 bit key\n");
" -des encrypt PEM output with cbc des\n"); #ifndef OPENSSL_NO_IDEA
BIO_printf(bio_err, BIO_printf(bio_err," -idea encrypt PEM output with cbc idea\n");
" -des3 encrypt PEM output with ede cbc des using 168 bit key\n"); #endif
# ifndef OPENSSL_NO_IDEA #ifndef OPENSSL_NO_AES
BIO_printf(bio_err, BIO_printf(bio_err," -aes128, -aes192, -aes256\n");
" -idea encrypt PEM output with cbc idea\n"); BIO_printf(bio_err," encrypt PEM output with cbc aes\n");
# endif #endif
# ifndef OPENSSL_NO_AES BIO_printf(bio_err," -text print the key in text\n");
BIO_printf(bio_err, " -aes128, -aes192, -aes256\n"); BIO_printf(bio_err," -noout don't print key out\n");
BIO_printf(bio_err, BIO_printf(bio_err," -modulus print the DSA public value\n");
" encrypt PEM output with cbc aes\n"); goto end;
# endif }
# ifndef OPENSSL_NO_CAMELLIA
BIO_printf(bio_err, " -camellia128, -camellia192, -camellia256\n"); ERR_load_crypto_strings();
BIO_printf(bio_err,
" encrypt PEM output with cbc camellia\n"); #ifndef OPENSSL_NO_ENGINE
# endif e = setup_engine(bio_err, engine, 0);
# ifndef OPENSSL_NO_SEED #endif
BIO_printf(bio_err,
" -seed encrypt PEM output with cbc seed\n"); if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
# endif BIO_printf(bio_err, "Error getting passwords\n");
BIO_printf(bio_err, " -text print the key in text\n"); goto end;
BIO_printf(bio_err, " -noout don't print key out\n"); }
BIO_printf(bio_err, " -modulus print the DSA public value\n");
goto end; in=BIO_new(BIO_s_file());
} out=BIO_new(BIO_s_file());
if ((in == NULL) || (out == NULL))
ERR_load_crypto_strings(); {
ERR_print_errors(bio_err);
# ifndef OPENSSL_NO_ENGINE goto end;
e = setup_engine(bio_err, engine, 0); }
# endif
if (infile == NULL)
if (!app_passwd(bio_err, passargin, passargout, &passin, &passout)) { BIO_set_fp(in,stdin,BIO_NOCLOSE);
BIO_printf(bio_err, "Error getting passwords\n"); else
goto end; {
} if (BIO_read_filename(in,infile) <= 0)
{
in = BIO_new(BIO_s_file()); perror(infile);
out = BIO_new(BIO_s_file()); goto end;
if ((in == NULL) || (out == NULL)) { }
ERR_print_errors(bio_err); }
goto end;
} BIO_printf(bio_err,"read DSA key\n");
if (informat == FORMAT_ASN1) {
if (infile == NULL) if(pubin) dsa=d2i_DSA_PUBKEY_bio(in,NULL);
BIO_set_fp(in, stdin, BIO_NOCLOSE); else dsa=d2i_DSAPrivateKey_bio(in,NULL);
else { } else if (informat == FORMAT_PEM) {
if (BIO_read_filename(in, infile) <= 0) { if(pubin) dsa=PEM_read_bio_DSA_PUBKEY(in,NULL, NULL, NULL);
perror(infile); else dsa=PEM_read_bio_DSAPrivateKey(in,NULL,NULL,passin);
goto end; } else
} {
} BIO_printf(bio_err,"bad input format specified for key\n");
goto end;
BIO_printf(bio_err, "read DSA key\n"); }
if (dsa == NULL)
{ {
EVP_PKEY *pkey; BIO_printf(bio_err,"unable to load Key\n");
ERR_print_errors(bio_err);
if (pubin) goto end;
pkey = load_pubkey(bio_err, infile, informat, 1, }
passin, e, "Public Key");
else if (outfile == NULL)
pkey = load_key(bio_err, infile, informat, 1, {
passin, e, "Private Key"); BIO_set_fp(out,stdout,BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS
if (pkey) { {
dsa = EVP_PKEY_get1_DSA(pkey); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
EVP_PKEY_free(pkey); out = BIO_push(tmpbio, out);
} }
} #endif
if (dsa == NULL) { }
BIO_printf(bio_err, "unable to load Key\n"); else
ERR_print_errors(bio_err); {
goto end; if (BIO_write_filename(out,outfile) <= 0)
} {
perror(outfile);
if (outfile == NULL) { goto end;
BIO_set_fp(out, stdout, BIO_NOCLOSE); }
# ifdef OPENSSL_SYS_VMS }
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); if (text)
out = BIO_push(tmpbio, out); if (!DSA_print(out,dsa,0))
} {
# endif perror(outfile);
} else { ERR_print_errors(bio_err);
if (BIO_write_filename(out, outfile) <= 0) { goto end;
perror(outfile); }
goto end;
} if (modulus)
} {
fprintf(stdout,"Public Key=");
if (text) BN_print(out,dsa->pub_key);
if (!DSA_print(out, dsa, 0)) { fprintf(stdout,"\n");
perror(outfile); }
ERR_print_errors(bio_err);
goto end; if (noout) goto end;
} BIO_printf(bio_err,"writing DSA key\n");
if (outformat == FORMAT_ASN1) {
if (modulus) { if(pubin || pubout) i=i2d_DSA_PUBKEY_bio(out,dsa);
fprintf(stdout, "Public Key="); else i=i2d_DSAPrivateKey_bio(out,dsa);
BN_print(out, dsa->pub_key); } else if (outformat == FORMAT_PEM) {
fprintf(stdout, "\n"); if(pubin || pubout)
} i=PEM_write_bio_DSA_PUBKEY(out,dsa);
else i=PEM_write_bio_DSAPrivateKey(out,dsa,enc,
if (noout) NULL,0,NULL, passout);
goto end; } else {
BIO_printf(bio_err, "writing DSA key\n"); BIO_printf(bio_err,"bad output format specified for outfile\n");
if (outformat == FORMAT_ASN1) { goto end;
if (pubin || pubout) }
i = i2d_DSA_PUBKEY_bio(out, dsa); if (!i)
else {
i = i2d_DSAPrivateKey_bio(out, dsa); BIO_printf(bio_err,"unable to write private key\n");
} else if (outformat == FORMAT_PEM) { ERR_print_errors(bio_err);
if (pubin || pubout) }
i = PEM_write_bio_DSA_PUBKEY(out, dsa); else
else ret=0;
i = PEM_write_bio_DSAPrivateKey(out, dsa, enc, end:
NULL, 0, NULL, passout); if(in != NULL) BIO_free(in);
# if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_RC4) if(out != NULL) BIO_free_all(out);
} else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) { if(dsa != NULL) DSA_free(dsa);
EVP_PKEY *pk; if(passin) OPENSSL_free(passin);
pk = EVP_PKEY_new(); if(passout) OPENSSL_free(passout);
EVP_PKEY_set1_DSA(pk, dsa); apps_shutdown();
if (outformat == FORMAT_PVK) OPENSSL_EXIT(ret);
i = i2b_PVK_bio(out, pk, pvk_encr, 0, passout); }
else if (pubin || pubout)
i = i2b_PublicKey_bio(out, pk);
else
i = i2b_PrivateKey_bio(out, pk);
EVP_PKEY_free(pk);
# endif
} else {
BIO_printf(bio_err, "bad output format specified for outfile\n");
goto end;
}
if (i <= 0) {
BIO_printf(bio_err, "unable to write private key\n");
ERR_print_errors(bio_err);
} else
ret = 0;
end:
if (in != NULL)
BIO_free(in);
if (out != NULL)
BIO_free_all(out);
if (dsa != NULL)
DSA_free(dsa);
if (passin)
OPENSSL_free(passin);
if (passout)
OPENSSL_free(passout);
apps_shutdown();
OPENSSL_EXIT(ret);
}
#else /* !OPENSSL_NO_DSA */
# if PEDANTIC
static void *dummy = &dummy;
# endif
#endif #endif

View File

@ -56,414 +56,347 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
#include <openssl/opensslconf.h> /* for OPENSSL_NO_DSA */
/*
* Until the key-gen callbacks are modified to use newer prototypes, we allow
* deprecated functions for openssl-internal code
*/
#ifdef OPENSSL_NO_DEPRECATED
# undef OPENSSL_NO_DEPRECATED
#endif
#ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
# include <assert.h> #include <assert.h>
# include <stdio.h> #include <stdio.h>
# include <stdlib.h> #include <stdlib.h>
# include <time.h> #include <time.h>
# include <string.h> #include <string.h>
# include "apps.h" #include "apps.h"
# include <openssl/bio.h> #include <openssl/bio.h>
# include <openssl/err.h> #include <openssl/err.h>
# include <openssl/bn.h> #include <openssl/bn.h>
# include <openssl/dsa.h> #include <openssl/dsa.h>
# include <openssl/x509.h> #include <openssl/x509.h>
# include <openssl/pem.h> #include <openssl/pem.h>
# undef PROG #undef PROG
# define PROG dsaparam_main #define PROG dsaparam_main
/*- /* -inform arg - input format - default PEM (DER or PEM)
* -inform arg - input format - default PEM (DER or PEM)
* -outform arg - output format - default PEM * -outform arg - output format - default PEM
* -in arg - input file - default stdin * -in arg - input file - default stdin
* -out arg - output file - default stdout * -out arg - output file - default stdout
* -noout * -noout
* -text * -text
* -C * -C
* -noout * -noout
* -genkey * -genkey
* #ifdef GENCB_TEST
* -timebomb n - interrupt keygen after <n> seconds
* #endif
*/ */
# ifdef GENCB_TEST static void MS_CALLBACK dsa_cb(int p, int n, void *arg);
static int stop_keygen_flag = 0;
static void timebomb_sigalarm(int foo)
{
stop_keygen_flag = 1;
}
# endif
static int MS_CALLBACK dsa_cb(int p, int n, BN_GENCB *cb);
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
DSA *dsa = NULL; #ifndef OPENSSL_NO_ENGINE
int i, badops = 0, text = 0; ENGINE *e = NULL;
BIO *in = NULL, *out = NULL; #endif
int informat, outformat, noout = 0, C = 0, ret = 1; DSA *dsa=NULL;
char *infile, *outfile, *prog, *inrand = NULL; int i,badops=0,text=0;
int numbits = -1, num, genkey = 0; BIO *in=NULL,*out=NULL;
int need_rand = 0; int informat,outformat,noout=0,C=0,ret=1;
# ifndef OPENSSL_NO_ENGINE char *infile,*outfile,*prog,*inrand=NULL;
char *engine = NULL; int numbits= -1,num,genkey=0;
# endif int need_rand=0;
# ifdef GENCB_TEST #ifndef OPENSSL_NO_ENGINE
int timebomb = 0; char *engine=NULL;
# endif #endif
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
infile = NULL; infile=NULL;
outfile = NULL; outfile=NULL;
informat = FORMAT_PEM; informat=FORMAT_PEM;
outformat = FORMAT_PEM; outformat=FORMAT_PEM;
prog = argv[0]; prog=argv[0];
argc--; argc--;
argv++; argv++;
while (argc >= 1) { while (argc >= 1)
if (strcmp(*argv, "-inform") == 0) { {
if (--argc < 1) if (strcmp(*argv,"-inform") == 0)
goto bad; {
informat = str2fmt(*(++argv)); if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-outform") == 0) { informat=str2fmt(*(++argv));
if (--argc < 1) }
goto bad; else if (strcmp(*argv,"-outform") == 0)
outformat = str2fmt(*(++argv)); {
} else if (strcmp(*argv, "-in") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) outformat=str2fmt(*(++argv));
goto bad; }
infile = *(++argv); else if (strcmp(*argv,"-in") == 0)
} else if (strcmp(*argv, "-out") == 0) { {
if (--argc < 1) if (--argc < 1) goto bad;
goto bad; infile= *(++argv);
outfile = *(++argv); }
} else if (strcmp(*argv,"-out") == 0)
# ifndef OPENSSL_NO_ENGINE {
else if (strcmp(*argv, "-engine") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) outfile= *(++argv);
goto bad; }
engine = *(++argv); #ifndef OPENSSL_NO_ENGINE
} else if(strcmp(*argv, "-engine") == 0)
# endif {
# ifdef GENCB_TEST if (--argc < 1) goto bad;
else if (strcmp(*argv, "-timebomb") == 0) { engine = *(++argv);
if (--argc < 1) }
goto bad; #endif
timebomb = atoi(*(++argv)); else if (strcmp(*argv,"-text") == 0)
} text=1;
# endif else if (strcmp(*argv,"-C") == 0)
else if (strcmp(*argv, "-text") == 0) C=1;
text = 1; else if (strcmp(*argv,"-genkey") == 0)
else if (strcmp(*argv, "-C") == 0) {
C = 1; genkey=1;
else if (strcmp(*argv, "-genkey") == 0) { need_rand=1;
genkey = 1; }
need_rand = 1; else if (strcmp(*argv,"-rand") == 0)
} else if (strcmp(*argv, "-rand") == 0) { {
if (--argc < 1) if (--argc < 1) goto bad;
goto bad; inrand= *(++argv);
inrand = *(++argv); need_rand=1;
need_rand = 1; }
} else if (strcmp(*argv, "-noout") == 0) else if (strcmp(*argv,"-noout") == 0)
noout = 1; noout=1;
else if (sscanf(*argv, "%d", &num) == 1) { else if (sscanf(*argv,"%d",&num) == 1)
/* generate a key */ {
numbits = num; /* generate a key */
need_rand = 1; numbits=num;
} else { need_rand=1;
BIO_printf(bio_err, "unknown option %s\n", *argv); }
badops = 1; else
break; {
} BIO_printf(bio_err,"unknown option %s\n",*argv);
argc--; badops=1;
argv++; break;
} }
argc--;
if (badops) { argv++;
bad: }
BIO_printf(bio_err, "%s [options] [bits] <infile >outfile\n", prog);
BIO_printf(bio_err, "where options are\n"); if (badops)
BIO_printf(bio_err, " -inform arg input format - DER or PEM\n"); {
BIO_printf(bio_err, " -outform arg output format - DER or PEM\n"); bad:
BIO_printf(bio_err, " -in arg input file\n"); BIO_printf(bio_err,"%s [options] [bits] <infile >outfile\n",prog);
BIO_printf(bio_err, " -out arg output file\n"); BIO_printf(bio_err,"where options are\n");
BIO_printf(bio_err, " -text print as text\n"); BIO_printf(bio_err," -inform arg input format - DER or PEM\n");
BIO_printf(bio_err, " -C Output C code\n"); BIO_printf(bio_err," -outform arg output format - DER or PEM\n");
BIO_printf(bio_err, " -noout no output\n"); BIO_printf(bio_err," -in arg input file\n");
BIO_printf(bio_err, " -genkey generate a DSA key\n"); BIO_printf(bio_err," -out arg output file\n");
BIO_printf(bio_err, BIO_printf(bio_err," -text print as text\n");
" -rand files to use for random number input\n"); BIO_printf(bio_err," -C Output C code\n");
# ifndef OPENSSL_NO_ENGINE BIO_printf(bio_err," -noout no output\n");
BIO_printf(bio_err, BIO_printf(bio_err," -genkey generate a DSA key\n");
" -engine e use engine e, possibly a hardware device.\n"); BIO_printf(bio_err," -rand files to use for random number input\n");
# endif #ifndef OPENSSL_NO_ENGINE
# ifdef GENCB_TEST BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n");
BIO_printf(bio_err, #endif
" -timebomb n interrupt keygen after <n> seconds\n"); BIO_printf(bio_err," number number of bits to use for generating private key\n");
# endif goto end;
BIO_printf(bio_err, }
" number number of bits to use for generating private key\n");
goto end; ERR_load_crypto_strings();
}
in=BIO_new(BIO_s_file());
ERR_load_crypto_strings(); out=BIO_new(BIO_s_file());
if ((in == NULL) || (out == NULL))
in = BIO_new(BIO_s_file()); {
out = BIO_new(BIO_s_file()); ERR_print_errors(bio_err);
if ((in == NULL) || (out == NULL)) { goto end;
ERR_print_errors(bio_err); }
goto end;
} if (infile == NULL)
BIO_set_fp(in,stdin,BIO_NOCLOSE);
if (infile == NULL) else
BIO_set_fp(in, stdin, BIO_NOCLOSE); {
else { if (BIO_read_filename(in,infile) <= 0)
if (BIO_read_filename(in, infile) <= 0) { {
perror(infile); perror(infile);
goto end; goto end;
} }
} }
if (outfile == NULL) { if (outfile == NULL)
BIO_set_fp(out, stdout, BIO_NOCLOSE); {
# ifdef OPENSSL_SYS_VMS BIO_set_fp(out,stdout,BIO_NOCLOSE);
{ #ifdef OPENSSL_SYS_VMS
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); {
out = BIO_push(tmpbio, out); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
} out = BIO_push(tmpbio, out);
# endif }
} else { #endif
if (BIO_write_filename(out, outfile) <= 0) { }
perror(outfile); else
goto end; {
} if (BIO_write_filename(out,outfile) <= 0)
} {
perror(outfile);
# ifndef OPENSSL_NO_ENGINE goto end;
setup_engine(bio_err, engine, 0); }
# endif }
if (need_rand) { #ifndef OPENSSL_NO_ENGINE
app_RAND_load_file(NULL, bio_err, (inrand != NULL)); e = setup_engine(bio_err, engine, 0);
if (inrand != NULL) #endif
BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
app_RAND_load_files(inrand)); if (need_rand)
} {
app_RAND_load_file(NULL, bio_err, (inrand != NULL));
if (numbits > 0) { if (inrand != NULL)
BN_GENCB cb; BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
BN_GENCB_set(&cb, dsa_cb, bio_err); app_RAND_load_files(inrand));
assert(need_rand); }
dsa = DSA_new();
if (!dsa) { if (numbits > 0)
BIO_printf(bio_err, "Error allocating DSA object\n"); {
goto end; assert(need_rand);
} BIO_printf(bio_err,"Generating DSA parameters, %d bit long prime\n",num);
BIO_printf(bio_err, "Generating DSA parameters, %d bit long prime\n", BIO_printf(bio_err,"This could take some time\n");
num); dsa=DSA_generate_parameters(num,NULL,0,NULL,NULL, dsa_cb,bio_err);
BIO_printf(bio_err, "This could take some time\n"); }
# ifdef GENCB_TEST else if (informat == FORMAT_ASN1)
if (timebomb > 0) { dsa=d2i_DSAparams_bio(in,NULL);
struct sigaction act; else if (informat == FORMAT_PEM)
act.sa_handler = timebomb_sigalarm; dsa=PEM_read_bio_DSAparams(in,NULL,NULL,NULL);
act.sa_flags = 0; else
BIO_printf(bio_err, {
"(though I'll stop it if not done within %d secs)\n", BIO_printf(bio_err,"bad input format specified\n");
timebomb); goto end;
if (sigaction(SIGALRM, &act, NULL) != 0) { }
BIO_printf(bio_err, "Error, couldn't set SIGALRM handler\n"); if (dsa == NULL)
goto end; {
} BIO_printf(bio_err,"unable to load DSA parameters\n");
alarm(timebomb); ERR_print_errors(bio_err);
} goto end;
# endif }
if (!DSA_generate_parameters_ex(dsa, num, NULL, 0, NULL, NULL, &cb)) {
# ifdef GENCB_TEST if (text)
if (stop_keygen_flag) { {
BIO_printf(bio_err, "DSA key generation time-stopped\n"); DSAparams_print(out,dsa);
/* This is an asked-for behaviour! */ }
ret = 0;
goto end; if (C)
} {
# endif unsigned char *data;
ERR_print_errors(bio_err); int l,len,bits_p,bits_q,bits_g;
BIO_printf(bio_err, "Error, DSA key generation failed\n");
goto end; len=BN_num_bytes(dsa->p);
} bits_p=BN_num_bits(dsa->p);
} else if (informat == FORMAT_ASN1) bits_q=BN_num_bits(dsa->q);
dsa = d2i_DSAparams_bio(in, NULL); bits_g=BN_num_bits(dsa->g);
else if (informat == FORMAT_PEM) data=(unsigned char *)OPENSSL_malloc(len+20);
dsa = PEM_read_bio_DSAparams(in, NULL, NULL, NULL); if (data == NULL)
else { {
BIO_printf(bio_err, "bad input format specified\n"); perror("OPENSSL_malloc");
goto end; goto end;
} }
if (dsa == NULL) { l=BN_bn2bin(dsa->p,data);
BIO_printf(bio_err, "unable to load DSA parameters\n"); printf("static unsigned char dsa%d_p[]={",bits_p);
ERR_print_errors(bio_err); for (i=0; i<l; i++)
goto end; {
} if ((i%12) == 0) printf("\n\t");
printf("0x%02X,",data[i]);
if (text) { }
DSAparams_print(out, dsa); printf("\n\t};\n");
}
l=BN_bn2bin(dsa->q,data);
if (C) { printf("static unsigned char dsa%d_q[]={",bits_p);
unsigned char *data; for (i=0; i<l; i++)
int l, len, bits_p; {
if ((i%12) == 0) printf("\n\t");
len = BN_num_bytes(dsa->p); printf("0x%02X,",data[i]);
bits_p = BN_num_bits(dsa->p); }
data = (unsigned char *)OPENSSL_malloc(len + 20); printf("\n\t};\n");
if (data == NULL) {
perror("OPENSSL_malloc"); l=BN_bn2bin(dsa->g,data);
goto end; printf("static unsigned char dsa%d_g[]={",bits_p);
} for (i=0; i<l; i++)
l = BN_bn2bin(dsa->p, data); {
printf("static unsigned char dsa%d_p[]={", bits_p); if ((i%12) == 0) printf("\n\t");
for (i = 0; i < l; i++) { printf("0x%02X,",data[i]);
if ((i % 12) == 0) }
printf("\n\t"); printf("\n\t};\n\n");
printf("0x%02X,", data[i]);
} printf("DSA *get_dsa%d()\n\t{\n",bits_p);
printf("\n\t};\n"); printf("\tDSA *dsa;\n\n");
printf("\tif ((dsa=DSA_new()) == NULL) return(NULL);\n");
l = BN_bn2bin(dsa->q, data); printf("\tdsa->p=BN_bin2bn(dsa%d_p,sizeof(dsa%d_p),NULL);\n",
printf("static unsigned char dsa%d_q[]={", bits_p); bits_p,bits_p);
for (i = 0; i < l; i++) { printf("\tdsa->q=BN_bin2bn(dsa%d_q,sizeof(dsa%d_q),NULL);\n",
if ((i % 12) == 0) bits_p,bits_p);
printf("\n\t"); printf("\tdsa->g=BN_bin2bn(dsa%d_g,sizeof(dsa%d_g),NULL);\n",
printf("0x%02X,", data[i]); bits_p,bits_p);
} printf("\tif ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL))\n");
printf("\n\t};\n"); printf("\t\t{ DSA_free(dsa); return(NULL); }\n");
printf("\treturn(dsa);\n\t}\n");
l = BN_bn2bin(dsa->g, data); }
printf("static unsigned char dsa%d_g[]={", bits_p);
for (i = 0; i < l; i++) {
if ((i % 12) == 0) if (!noout)
printf("\n\t"); {
printf("0x%02X,", data[i]); if (outformat == FORMAT_ASN1)
} i=i2d_DSAparams_bio(out,dsa);
printf("\n\t};\n\n"); else if (outformat == FORMAT_PEM)
i=PEM_write_bio_DSAparams(out,dsa);
printf("DSA *get_dsa%d()\n\t{\n", bits_p); else {
printf("\tDSA *dsa;\n\n"); BIO_printf(bio_err,"bad output format specified for outfile\n");
printf("\tif ((dsa=DSA_new()) == NULL) return(NULL);\n"); goto end;
printf("\tdsa->p=BN_bin2bn(dsa%d_p,sizeof(dsa%d_p),NULL);\n", }
bits_p, bits_p); if (!i)
printf("\tdsa->q=BN_bin2bn(dsa%d_q,sizeof(dsa%d_q),NULL);\n", {
bits_p, bits_p); BIO_printf(bio_err,"unable to write DSA parameters\n");
printf("\tdsa->g=BN_bin2bn(dsa%d_g,sizeof(dsa%d_g),NULL);\n", ERR_print_errors(bio_err);
bits_p, bits_p); goto end;
printf }
("\tif ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL))\n"); }
printf("\t\t{ DSA_free(dsa); return(NULL); }\n"); if (genkey)
printf("\treturn(dsa);\n\t}\n"); {
} DSA *dsakey;
if (!noout) { assert(need_rand);
if (outformat == FORMAT_ASN1) if ((dsakey=DSAparams_dup(dsa)) == NULL) goto end;
i = i2d_DSAparams_bio(out, dsa); if (!DSA_generate_key(dsakey)) goto end;
else if (outformat == FORMAT_PEM) if (outformat == FORMAT_ASN1)
i = PEM_write_bio_DSAparams(out, dsa); i=i2d_DSAPrivateKey_bio(out,dsakey);
else { else if (outformat == FORMAT_PEM)
BIO_printf(bio_err, "bad output format specified for outfile\n"); i=PEM_write_bio_DSAPrivateKey(out,dsakey,NULL,NULL,0,NULL,NULL);
goto end; else {
} BIO_printf(bio_err,"bad output format specified for outfile\n");
if (!i) { goto end;
BIO_printf(bio_err, "unable to write DSA parameters\n"); }
ERR_print_errors(bio_err); DSA_free(dsakey);
goto end; }
} if (need_rand)
} app_RAND_write_file(NULL, bio_err);
if (genkey) { ret=0;
DSA *dsakey; end:
if (in != NULL) BIO_free(in);
assert(need_rand); if (out != NULL) BIO_free_all(out);
if ((dsakey = DSAparams_dup(dsa)) == NULL) if (dsa != NULL) DSA_free(dsa);
goto end; apps_shutdown();
if (!DSA_generate_key(dsakey)) { OPENSSL_EXIT(ret);
ERR_print_errors(bio_err); }
DSA_free(dsakey);
goto end; static void MS_CALLBACK dsa_cb(int p, int n, void *arg)
} {
if (outformat == FORMAT_ASN1) char c='*';
i = i2d_DSAPrivateKey_bio(out, dsakey);
else if (outformat == FORMAT_PEM) if (p == 0) c='.';
i = PEM_write_bio_DSAPrivateKey(out, dsakey, NULL, NULL, 0, NULL, if (p == 1) c='+';
NULL); if (p == 2) c='*';
else { if (p == 3) c='\n';
BIO_printf(bio_err, "bad output format specified for outfile\n"); BIO_write(arg,&c,1);
DSA_free(dsakey); (void)BIO_flush(arg);
goto end; #ifdef LINT
} p=n;
DSA_free(dsakey); #endif
} }
if (need_rand)
app_RAND_write_file(NULL, bio_err);
ret = 0;
end:
if (in != NULL)
BIO_free(in);
if (out != NULL)
BIO_free_all(out);
if (dsa != NULL)
DSA_free(dsa);
apps_shutdown();
OPENSSL_EXIT(ret);
}
static int MS_CALLBACK dsa_cb(int p, int n, BN_GENCB *cb)
{
char c = '*';
if (p == 0)
c = '.';
if (p == 1)
c = '+';
if (p == 2)
c = '*';
if (p == 3)
c = '\n';
BIO_write(cb->arg, &c, 1);
(void)BIO_flush(cb->arg);
# ifdef LINT
p = n;
# endif
# ifdef GENCB_TEST
if (stop_keygen_flag)
return 0;
# endif
return 1;
}
#else /* !OPENSSL_NO_DSA */
# if PEDANTIC
static void *dummy = &dummy;
# endif
#endif #endif

365
apps/ec.c
View File

@ -1,365 +0,0 @@
/* apps/ec.c */
/*
* Written by Nils Larsch for the OpenSSL project.
*/
/* ====================================================================
* Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#include <openssl/opensslconf.h>
#ifndef OPENSSL_NO_EC
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include "apps.h"
# include <openssl/bio.h>
# include <openssl/err.h>
# include <openssl/evp.h>
# include <openssl/pem.h>
# undef PROG
# define PROG ec_main
/*-
* -inform arg - input format - default PEM (one of DER, NET or PEM)
* -outform arg - output format - default PEM
* -in arg - input file - default stdin
* -out arg - output file - default stdout
* -des - encrypt output if PEM format with DES in cbc mode
* -text - print a text version
* -param_out - print the elliptic curve parameters
* -conv_form arg - specifies the point encoding form
* -param_enc arg - specifies the parameter encoding
*/
int MAIN(int, char **);
int MAIN(int argc, char **argv)
{
int ret = 1;
EC_KEY *eckey = NULL;
const EC_GROUP *group;
int i, badops = 0;
const EVP_CIPHER *enc = NULL;
BIO *in = NULL, *out = NULL;
int informat, outformat, text = 0, noout = 0;
int pubin = 0, pubout = 0, param_out = 0;
char *infile, *outfile, *prog, *engine;
char *passargin = NULL, *passargout = NULL;
char *passin = NULL, *passout = NULL;
point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED;
int new_form = 0;
int asn1_flag = OPENSSL_EC_NAMED_CURVE;
int new_asn1_flag = 0;
apps_startup();
if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT);
if (!load_config(bio_err, NULL))
goto end;
engine = NULL;
infile = NULL;
outfile = NULL;
informat = FORMAT_PEM;
outformat = FORMAT_PEM;
prog = argv[0];
argc--;
argv++;
while (argc >= 1) {
if (strcmp(*argv, "-inform") == 0) {
if (--argc < 1)
goto bad;
informat = str2fmt(*(++argv));
} else if (strcmp(*argv, "-outform") == 0) {
if (--argc < 1)
goto bad;
outformat = str2fmt(*(++argv));
} else if (strcmp(*argv, "-in") == 0) {
if (--argc < 1)
goto bad;
infile = *(++argv);
} else if (strcmp(*argv, "-out") == 0) {
if (--argc < 1)
goto bad;
outfile = *(++argv);
} else if (strcmp(*argv, "-passin") == 0) {
if (--argc < 1)
goto bad;
passargin = *(++argv);
} else if (strcmp(*argv, "-passout") == 0) {
if (--argc < 1)
goto bad;
passargout = *(++argv);
} else if (strcmp(*argv, "-engine") == 0) {
if (--argc < 1)
goto bad;
engine = *(++argv);
} else if (strcmp(*argv, "-noout") == 0)
noout = 1;
else if (strcmp(*argv, "-text") == 0)
text = 1;
else if (strcmp(*argv, "-conv_form") == 0) {
if (--argc < 1)
goto bad;
++argv;
new_form = 1;
if (strcmp(*argv, "compressed") == 0)
form = POINT_CONVERSION_COMPRESSED;
else if (strcmp(*argv, "uncompressed") == 0)
form = POINT_CONVERSION_UNCOMPRESSED;
else if (strcmp(*argv, "hybrid") == 0)
form = POINT_CONVERSION_HYBRID;
else
goto bad;
} else if (strcmp(*argv, "-param_enc") == 0) {
if (--argc < 1)
goto bad;
++argv;
new_asn1_flag = 1;
if (strcmp(*argv, "named_curve") == 0)
asn1_flag = OPENSSL_EC_NAMED_CURVE;
else if (strcmp(*argv, "explicit") == 0)
asn1_flag = 0;
else
goto bad;
} else if (strcmp(*argv, "-param_out") == 0)
param_out = 1;
else if (strcmp(*argv, "-pubin") == 0)
pubin = 1;
else if (strcmp(*argv, "-pubout") == 0)
pubout = 1;
else if ((enc = EVP_get_cipherbyname(&(argv[0][1]))) == NULL) {
BIO_printf(bio_err, "unknown option %s\n", *argv);
badops = 1;
break;
}
argc--;
argv++;
}
if (badops) {
bad:
BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog);
BIO_printf(bio_err, "where options are\n");
BIO_printf(bio_err, " -inform arg input format - "
"DER or PEM\n");
BIO_printf(bio_err, " -outform arg output format - "
"DER or PEM\n");
BIO_printf(bio_err, " -in arg input file\n");
BIO_printf(bio_err, " -passin arg input file pass "
"phrase source\n");
BIO_printf(bio_err, " -out arg output file\n");
BIO_printf(bio_err, " -passout arg output file pass "
"phrase source\n");
BIO_printf(bio_err, " -engine e use engine e, "
"possibly a hardware device.\n");
BIO_printf(bio_err, " -des encrypt PEM output, "
"instead of 'des' every other \n"
" cipher "
"supported by OpenSSL can be used\n");
BIO_printf(bio_err, " -text print the key\n");
BIO_printf(bio_err, " -noout don't print key out\n");
BIO_printf(bio_err, " -param_out print the elliptic "
"curve parameters\n");
BIO_printf(bio_err, " -conv_form arg specifies the "
"point conversion form \n");
BIO_printf(bio_err, " possible values:"
" compressed\n");
BIO_printf(bio_err, " "
" uncompressed (default)\n");
BIO_printf(bio_err, " " " hybrid\n");
BIO_printf(bio_err, " -param_enc arg specifies the way"
" the ec parameters are encoded\n");
BIO_printf(bio_err, " in the asn1 der " "encoding\n");
BIO_printf(bio_err, " possible values:"
" named_curve (default)\n");
BIO_printf(bio_err, " "
"explicit\n");
goto end;
}
ERR_load_crypto_strings();
# ifndef OPENSSL_NO_ENGINE
setup_engine(bio_err, engine, 0);
# endif
if (!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
BIO_printf(bio_err, "Error getting passwords\n");
goto end;
}
in = BIO_new(BIO_s_file());
out = BIO_new(BIO_s_file());
if ((in == NULL) || (out == NULL)) {
ERR_print_errors(bio_err);
goto end;
}
if (infile == NULL)
BIO_set_fp(in, stdin, BIO_NOCLOSE);
else {
if (BIO_read_filename(in, infile) <= 0) {
perror(infile);
goto end;
}
}
BIO_printf(bio_err, "read EC key\n");
if (informat == FORMAT_ASN1) {
if (pubin)
eckey = d2i_EC_PUBKEY_bio(in, NULL);
else
eckey = d2i_ECPrivateKey_bio(in, NULL);
} else if (informat == FORMAT_PEM) {
if (pubin)
eckey = PEM_read_bio_EC_PUBKEY(in, NULL, NULL, NULL);
else
eckey = PEM_read_bio_ECPrivateKey(in, NULL, NULL, passin);
} else {
BIO_printf(bio_err, "bad input format specified for key\n");
goto end;
}
if (eckey == NULL) {
BIO_printf(bio_err, "unable to load Key\n");
ERR_print_errors(bio_err);
goto end;
}
if (outfile == NULL) {
BIO_set_fp(out, stdout, BIO_NOCLOSE);
# ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out);
}
# endif
} else {
if (BIO_write_filename(out, outfile) <= 0) {
perror(outfile);
goto end;
}
}
group = EC_KEY_get0_group(eckey);
if (new_form)
EC_KEY_set_conv_form(eckey, form);
if (new_asn1_flag)
EC_KEY_set_asn1_flag(eckey, asn1_flag);
if (text)
if (!EC_KEY_print(out, eckey, 0)) {
perror(outfile);
ERR_print_errors(bio_err);
goto end;
}
if (noout) {
ret = 0;
goto end;
}
BIO_printf(bio_err, "writing EC key\n");
if (outformat == FORMAT_ASN1) {
if (param_out)
i = i2d_ECPKParameters_bio(out, group);
else if (pubin || pubout)
i = i2d_EC_PUBKEY_bio(out, eckey);
else
i = i2d_ECPrivateKey_bio(out, eckey);
} else if (outformat == FORMAT_PEM) {
if (param_out)
i = PEM_write_bio_ECPKParameters(out, group);
else if (pubin || pubout)
i = PEM_write_bio_EC_PUBKEY(out, eckey);
else
i = PEM_write_bio_ECPrivateKey(out, eckey, enc,
NULL, 0, NULL, passout);
} else {
BIO_printf(bio_err, "bad output format specified for " "outfile\n");
goto end;
}
if (!i) {
BIO_printf(bio_err, "unable to write private key\n");
ERR_print_errors(bio_err);
} else
ret = 0;
end:
if (in)
BIO_free(in);
if (out)
BIO_free_all(out);
if (eckey)
EC_KEY_free(eckey);
if (passin)
OPENSSL_free(passin);
if (passout)
OPENSSL_free(passout);
apps_shutdown();
OPENSSL_EXIT(ret);
}
#else /* !OPENSSL_NO_EC */
# if PEDANTIC
static void *dummy = &dummy;
# endif
#endif

View File

@ -1,658 +0,0 @@
/* apps/ecparam.c */
/*
* Written by Nils Larsch for the OpenSSL project.
*/
/* ====================================================================
* Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
/* ====================================================================
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
*
* Portions of the attached software ("Contribution") are developed by
* SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
*
* The Contribution is licensed pursuant to the OpenSSL open source
* license provided above.
*
* The elliptic curve binary polynomial software is originally written by
* Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
*
*/
#include <openssl/opensslconf.h>
#ifndef OPENSSL_NO_EC
# include <assert.h>
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <string.h>
# include "apps.h"
# include <openssl/bio.h>
# include <openssl/err.h>
# include <openssl/bn.h>
# include <openssl/ec.h>
# include <openssl/x509.h>
# include <openssl/pem.h>
# undef PROG
# define PROG ecparam_main
/*-
* -inform arg - input format - default PEM (DER or PEM)
* -outform arg - output format - default PEM
* -in arg - input file - default stdin
* -out arg - output file - default stdout
* -noout - do not print the ec parameter
* -text - print the ec parameters in text form
* -check - validate the ec parameters
* -C - print a 'C' function creating the parameters
* -name arg - use the ec parameters with 'short name' name
* -list_curves - prints a list of all currently available curve 'short names'
* -conv_form arg - specifies the point conversion form
* - possible values: compressed
* uncompressed (default)
* hybrid
* -param_enc arg - specifies the way the ec parameters are encoded
* in the asn1 der encoding
* possible values: named_curve (default)
* explicit
* -no_seed - if 'explicit' parameters are chosen do not use the seed
* -genkey - generate ec key
* -rand file - files to use for random number input
* -engine e - use engine e, possibly a hardware device
*/
static int ecparam_print_var(BIO *, BIGNUM *, const char *, int,
unsigned char *);
int MAIN(int, char **);
int MAIN(int argc, char **argv)
{
EC_GROUP *group = NULL;
point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED;
int new_form = 0;
int asn1_flag = OPENSSL_EC_NAMED_CURVE;
int new_asn1_flag = 0;
char *curve_name = NULL, *inrand = NULL;
int list_curves = 0, no_seed = 0, check = 0,
badops = 0, text = 0, i, need_rand = 0, genkey = 0;
char *infile = NULL, *outfile = NULL, *prog;
BIO *in = NULL, *out = NULL;
int informat, outformat, noout = 0, C = 0, ret = 1;
char *engine = NULL;
BIGNUM *ec_p = NULL, *ec_a = NULL, *ec_b = NULL,
*ec_gen = NULL, *ec_order = NULL, *ec_cofactor = NULL;
unsigned char *buffer = NULL;
apps_startup();
if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT);
if (!load_config(bio_err, NULL))
goto end;
informat = FORMAT_PEM;
outformat = FORMAT_PEM;
prog = argv[0];
argc--;
argv++;
while (argc >= 1) {
if (strcmp(*argv, "-inform") == 0) {
if (--argc < 1)
goto bad;
informat = str2fmt(*(++argv));
} else if (strcmp(*argv, "-outform") == 0) {
if (--argc < 1)
goto bad;
outformat = str2fmt(*(++argv));
} else if (strcmp(*argv, "-in") == 0) {
if (--argc < 1)
goto bad;
infile = *(++argv);
} else if (strcmp(*argv, "-out") == 0) {
if (--argc < 1)
goto bad;
outfile = *(++argv);
} else if (strcmp(*argv, "-text") == 0)
text = 1;
else if (strcmp(*argv, "-C") == 0)
C = 1;
else if (strcmp(*argv, "-check") == 0)
check = 1;
else if (strcmp(*argv, "-name") == 0) {
if (--argc < 1)
goto bad;
curve_name = *(++argv);
} else if (strcmp(*argv, "-list_curves") == 0)
list_curves = 1;
else if (strcmp(*argv, "-conv_form") == 0) {
if (--argc < 1)
goto bad;
++argv;
new_form = 1;
if (strcmp(*argv, "compressed") == 0)
form = POINT_CONVERSION_COMPRESSED;
else if (strcmp(*argv, "uncompressed") == 0)
form = POINT_CONVERSION_UNCOMPRESSED;
else if (strcmp(*argv, "hybrid") == 0)
form = POINT_CONVERSION_HYBRID;
else
goto bad;
} else if (strcmp(*argv, "-param_enc") == 0) {
if (--argc < 1)
goto bad;
++argv;
new_asn1_flag = 1;
if (strcmp(*argv, "named_curve") == 0)
asn1_flag = OPENSSL_EC_NAMED_CURVE;
else if (strcmp(*argv, "explicit") == 0)
asn1_flag = 0;
else
goto bad;
} else if (strcmp(*argv, "-no_seed") == 0)
no_seed = 1;
else if (strcmp(*argv, "-noout") == 0)
noout = 1;
else if (strcmp(*argv, "-genkey") == 0) {
genkey = 1;
need_rand = 1;
} else if (strcmp(*argv, "-rand") == 0) {
if (--argc < 1)
goto bad;
inrand = *(++argv);
need_rand = 1;
} else if (strcmp(*argv, "-engine") == 0) {
if (--argc < 1)
goto bad;
engine = *(++argv);
} else {
BIO_printf(bio_err, "unknown option %s\n", *argv);
badops = 1;
break;
}
argc--;
argv++;
}
if (badops) {
bad:
BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog);
BIO_printf(bio_err, "where options are\n");
BIO_printf(bio_err, " -inform arg input format - "
"default PEM (DER or PEM)\n");
BIO_printf(bio_err, " -outform arg output format - "
"default PEM\n");
BIO_printf(bio_err, " -in arg input file - "
"default stdin\n");
BIO_printf(bio_err, " -out arg output file - "
"default stdout\n");
BIO_printf(bio_err, " -noout do not print the "
"ec parameter\n");
BIO_printf(bio_err, " -text print the ec "
"parameters in text form\n");
BIO_printf(bio_err, " -check validate the ec "
"parameters\n");
BIO_printf(bio_err, " -C print a 'C' "
"function creating the parameters\n");
BIO_printf(bio_err, " -name arg use the "
"ec parameters with 'short name' name\n");
BIO_printf(bio_err, " -list_curves prints a list of "
"all currently available curve 'short names'\n");
BIO_printf(bio_err, " -conv_form arg specifies the "
"point conversion form \n");
BIO_printf(bio_err, " possible values:"
" compressed\n");
BIO_printf(bio_err, " "
" uncompressed (default)\n");
BIO_printf(bio_err, " "
" hybrid\n");
BIO_printf(bio_err, " -param_enc arg specifies the way"
" the ec parameters are encoded\n");
BIO_printf(bio_err, " in the asn1 der "
"encoding\n");
BIO_printf(bio_err, " possible values:"
" named_curve (default)\n");
BIO_printf(bio_err, " "
" explicit\n");
BIO_printf(bio_err, " -no_seed if 'explicit'"
" parameters are chosen do not" " use the seed\n");
BIO_printf(bio_err, " -genkey generate ec" " key\n");
BIO_printf(bio_err, " -rand file files to use for"
" random number input\n");
BIO_printf(bio_err, " -engine e use engine e, "
"possibly a hardware device\n");
goto end;
}
ERR_load_crypto_strings();
in = BIO_new(BIO_s_file());
out = BIO_new(BIO_s_file());
if ((in == NULL) || (out == NULL)) {
ERR_print_errors(bio_err);
goto end;
}
if (infile == NULL)
BIO_set_fp(in, stdin, BIO_NOCLOSE);
else {
if (BIO_read_filename(in, infile) <= 0) {
perror(infile);
goto end;
}
}
if (outfile == NULL) {
BIO_set_fp(out, stdout, BIO_NOCLOSE);
# ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out);
}
# endif
} else {
if (BIO_write_filename(out, outfile) <= 0) {
perror(outfile);
goto end;
}
}
# ifndef OPENSSL_NO_ENGINE
setup_engine(bio_err, engine, 0);
# endif
if (list_curves) {
EC_builtin_curve *curves = NULL;
size_t crv_len = 0;
size_t n = 0;
crv_len = EC_get_builtin_curves(NULL, 0);
curves = OPENSSL_malloc((int)(sizeof(EC_builtin_curve) * crv_len));
if (curves == NULL)
goto end;
if (!EC_get_builtin_curves(curves, crv_len)) {
OPENSSL_free(curves);
goto end;
}
for (n = 0; n < crv_len; n++) {
const char *comment;
const char *sname;
comment = curves[n].comment;
sname = OBJ_nid2sn(curves[n].nid);
if (comment == NULL)
comment = "CURVE DESCRIPTION NOT AVAILABLE";
if (sname == NULL)
sname = "";
BIO_printf(out, " %-10s: ", sname);
BIO_printf(out, "%s\n", comment);
}
OPENSSL_free(curves);
ret = 0;
goto end;
}
if (curve_name != NULL) {
int nid;
/*
* workaround for the SECG curve names secp192r1 and secp256r1 (which
* are the same as the curves prime192v1 and prime256v1 defined in
* X9.62)
*/
if (!strcmp(curve_name, "secp192r1")) {
BIO_printf(bio_err, "using curve name prime192v1 "
"instead of secp192r1\n");
nid = NID_X9_62_prime192v1;
} else if (!strcmp(curve_name, "secp256r1")) {
BIO_printf(bio_err, "using curve name prime256v1 "
"instead of secp256r1\n");
nid = NID_X9_62_prime256v1;
} else
nid = OBJ_sn2nid(curve_name);
if (nid == 0) {
BIO_printf(bio_err, "unknown curve name (%s)\n", curve_name);
goto end;
}
group = EC_GROUP_new_by_curve_name(nid);
if (group == NULL) {
BIO_printf(bio_err, "unable to create curve (%s)\n", curve_name);
goto end;
}
EC_GROUP_set_asn1_flag(group, asn1_flag);
EC_GROUP_set_point_conversion_form(group, form);
} else if (informat == FORMAT_ASN1) {
group = d2i_ECPKParameters_bio(in, NULL);
} else if (informat == FORMAT_PEM) {
group = PEM_read_bio_ECPKParameters(in, NULL, NULL, NULL);
} else {
BIO_printf(bio_err, "bad input format specified\n");
goto end;
}
if (group == NULL) {
BIO_printf(bio_err, "unable to load elliptic curve parameters\n");
ERR_print_errors(bio_err);
goto end;
}
if (new_form)
EC_GROUP_set_point_conversion_form(group, form);
if (new_asn1_flag)
EC_GROUP_set_asn1_flag(group, asn1_flag);
if (no_seed) {
EC_GROUP_set_seed(group, NULL, 0);
}
if (text) {
if (!ECPKParameters_print(out, group, 0))
goto end;
}
if (check) {
BIO_printf(bio_err, "checking elliptic curve parameters: ");
if (!EC_GROUP_check(group, NULL)) {
BIO_printf(bio_err, "failed\n");
ERR_print_errors(bio_err);
goto end;
}
BIO_printf(bio_err, "ok\n");
}
if (C) {
size_t buf_len = 0, tmp_len = 0;
const EC_POINT *point;
int is_prime, len = 0;
const EC_METHOD *meth = EC_GROUP_method_of(group);
if ((ec_p = BN_new()) == NULL || (ec_a = BN_new()) == NULL ||
(ec_b = BN_new()) == NULL || (ec_gen = BN_new()) == NULL ||
(ec_order = BN_new()) == NULL ||
(ec_cofactor = BN_new()) == NULL) {
perror("OPENSSL_malloc");
goto end;
}
is_prime = (EC_METHOD_get_field_type(meth) == NID_X9_62_prime_field);
if (is_prime) {
if (!EC_GROUP_get_curve_GFp(group, ec_p, ec_a, ec_b, NULL))
goto end;
} else {
/* TODO */
goto end;
}
if ((point = EC_GROUP_get0_generator(group)) == NULL)
goto end;
if (!EC_POINT_point2bn(group, point,
EC_GROUP_get_point_conversion_form(group),
ec_gen, NULL))
goto end;
if (!EC_GROUP_get_order(group, ec_order, NULL))
goto end;
if (!EC_GROUP_get_cofactor(group, ec_cofactor, NULL))
goto end;
if (!ec_p || !ec_a || !ec_b || !ec_gen || !ec_order || !ec_cofactor)
goto end;
len = BN_num_bits(ec_order);
if ((tmp_len = (size_t)BN_num_bytes(ec_p)) > buf_len)
buf_len = tmp_len;
if ((tmp_len = (size_t)BN_num_bytes(ec_a)) > buf_len)
buf_len = tmp_len;
if ((tmp_len = (size_t)BN_num_bytes(ec_b)) > buf_len)
buf_len = tmp_len;
if ((tmp_len = (size_t)BN_num_bytes(ec_gen)) > buf_len)
buf_len = tmp_len;
if ((tmp_len = (size_t)BN_num_bytes(ec_order)) > buf_len)
buf_len = tmp_len;
if ((tmp_len = (size_t)BN_num_bytes(ec_cofactor)) > buf_len)
buf_len = tmp_len;
buffer = (unsigned char *)OPENSSL_malloc(buf_len);
if (buffer == NULL) {
perror("OPENSSL_malloc");
goto end;
}
ecparam_print_var(out, ec_p, "ec_p", len, buffer);
ecparam_print_var(out, ec_a, "ec_a", len, buffer);
ecparam_print_var(out, ec_b, "ec_b", len, buffer);
ecparam_print_var(out, ec_gen, "ec_gen", len, buffer);
ecparam_print_var(out, ec_order, "ec_order", len, buffer);
ecparam_print_var(out, ec_cofactor, "ec_cofactor", len, buffer);
BIO_printf(out, "\n\n");
BIO_printf(out, "EC_GROUP *get_ec_group_%d(void)\n\t{\n", len);
BIO_printf(out, "\tint ok=0;\n");
BIO_printf(out, "\tEC_GROUP *group = NULL;\n");
BIO_printf(out, "\tEC_POINT *point = NULL;\n");
BIO_printf(out, "\tBIGNUM *tmp_1 = NULL, *tmp_2 = NULL, "
"*tmp_3 = NULL;\n\n");
BIO_printf(out, "\tif ((tmp_1 = BN_bin2bn(ec_p_%d, "
"sizeof(ec_p_%d), NULL)) == NULL)\n\t\t"
"goto err;\n", len, len);
BIO_printf(out, "\tif ((tmp_2 = BN_bin2bn(ec_a_%d, "
"sizeof(ec_a_%d), NULL)) == NULL)\n\t\t"
"goto err;\n", len, len);
BIO_printf(out, "\tif ((tmp_3 = BN_bin2bn(ec_b_%d, "
"sizeof(ec_b_%d), NULL)) == NULL)\n\t\t"
"goto err;\n", len, len);
if (is_prime) {
BIO_printf(out, "\tif ((group = EC_GROUP_new_curve_"
"GFp(tmp_1, tmp_2, tmp_3, NULL)) == NULL)"
"\n\t\tgoto err;\n\n");
} else {
/* TODO */
goto end;
}
BIO_printf(out, "\t/* build generator */\n");
BIO_printf(out, "\tif ((tmp_1 = BN_bin2bn(ec_gen_%d, "
"sizeof(ec_gen_%d), tmp_1)) == NULL)"
"\n\t\tgoto err;\n", len, len);
BIO_printf(out, "\tpoint = EC_POINT_bn2point(group, tmp_1, "
"NULL, NULL);\n");
BIO_printf(out, "\tif (point == NULL)\n\t\tgoto err;\n");
BIO_printf(out, "\tif ((tmp_2 = BN_bin2bn(ec_order_%d, "
"sizeof(ec_order_%d), tmp_2)) == NULL)"
"\n\t\tgoto err;\n", len, len);
BIO_printf(out, "\tif ((tmp_3 = BN_bin2bn(ec_cofactor_%d, "
"sizeof(ec_cofactor_%d), tmp_3)) == NULL)"
"\n\t\tgoto err;\n", len, len);
BIO_printf(out, "\tif (!EC_GROUP_set_generator(group, point,"
" tmp_2, tmp_3))\n\t\tgoto err;\n");
BIO_printf(out, "\n\tok=1;\n");
BIO_printf(out, "err:\n");
BIO_printf(out, "\tif (tmp_1)\n\t\tBN_free(tmp_1);\n");
BIO_printf(out, "\tif (tmp_2)\n\t\tBN_free(tmp_2);\n");
BIO_printf(out, "\tif (tmp_3)\n\t\tBN_free(tmp_3);\n");
BIO_printf(out, "\tif (point)\n\t\tEC_POINT_free(point);\n");
BIO_printf(out, "\tif (!ok)\n");
BIO_printf(out, "\t\t{\n");
BIO_printf(out, "\t\tEC_GROUP_free(group);\n");
BIO_printf(out, "\t\tgroup = NULL;\n");
BIO_printf(out, "\t\t}\n");
BIO_printf(out, "\treturn(group);\n\t}\n");
}
if (!noout) {
if (outformat == FORMAT_ASN1)
i = i2d_ECPKParameters_bio(out, group);
else if (outformat == FORMAT_PEM)
i = PEM_write_bio_ECPKParameters(out, group);
else {
BIO_printf(bio_err, "bad output format specified for"
" outfile\n");
goto end;
}
if (!i) {
BIO_printf(bio_err, "unable to write elliptic "
"curve parameters\n");
ERR_print_errors(bio_err);
goto end;
}
}
if (need_rand) {
app_RAND_load_file(NULL, bio_err, (inrand != NULL));
if (inrand != NULL)
BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
app_RAND_load_files(inrand));
}
if (genkey) {
EC_KEY *eckey = EC_KEY_new();
if (eckey == NULL)
goto end;
assert(need_rand);
if (EC_KEY_set_group(eckey, group) == 0)
goto end;
if (!EC_KEY_generate_key(eckey)) {
EC_KEY_free(eckey);
goto end;
}
if (outformat == FORMAT_ASN1)
i = i2d_ECPrivateKey_bio(out, eckey);
else if (outformat == FORMAT_PEM)
i = PEM_write_bio_ECPrivateKey(out, eckey, NULL,
NULL, 0, NULL, NULL);
else {
BIO_printf(bio_err, "bad output format specified "
"for outfile\n");
EC_KEY_free(eckey);
goto end;
}
EC_KEY_free(eckey);
}
if (need_rand)
app_RAND_write_file(NULL, bio_err);
ret = 0;
end:
if (ec_p)
BN_free(ec_p);
if (ec_a)
BN_free(ec_a);
if (ec_b)
BN_free(ec_b);
if (ec_gen)
BN_free(ec_gen);
if (ec_order)
BN_free(ec_order);
if (ec_cofactor)
BN_free(ec_cofactor);
if (buffer)
OPENSSL_free(buffer);
if (in != NULL)
BIO_free(in);
if (out != NULL)
BIO_free_all(out);
if (group != NULL)
EC_GROUP_free(group);
apps_shutdown();
OPENSSL_EXIT(ret);
}
static int ecparam_print_var(BIO *out, BIGNUM *in, const char *var,
int len, unsigned char *buffer)
{
BIO_printf(out, "static unsigned char %s_%d[] = {", var, len);
if (BN_is_zero(in))
BIO_printf(out, "\n\t0x00");
else {
int i, l;
l = BN_bn2bin(in, buffer);
for (i = 0; i < l - 1; i++) {
if ((i % 12) == 0)
BIO_printf(out, "\n\t");
BIO_printf(out, "0x%02X,", buffer[i]);
}
if ((i % 12) == 0)
BIO_printf(out, "\n\t");
BIO_printf(out, "0x%02X", buffer[i]);
}
BIO_printf(out, "\n\t};\n\n");
return 1;
}
#else /* !OPENSSL_NO_EC */
# if PEDANTIC
static void *dummy = &dummy;
# endif
#endif

1101
apps/enc.c

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,6 @@
/* apps/engine.c */ /* apps/engine.c -*- mode: C; c-file-style: "eay" -*- */
/* /* Written by Richard Levitte <richard@levitte.org> for the OpenSSL
* Written by Richard Levitte <richard@levitte.org> for the OpenSSL project * project 2000.
* 2000.
*/ */
/* ==================================================================== /* ====================================================================
* Copyright (c) 2000 The OpenSSL Project. All rights reserved. * Copyright (c) 2000 The OpenSSL Project. All rights reserved.
@ -57,456 +56,474 @@
* *
*/ */
#ifndef OPENSSL_NO_ENGINE
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#ifdef OPENSSL_NO_STDIO #ifdef OPENSSL_NO_STDIO
# define APPS_WIN16 #define APPS_WIN16
#endif #endif
#include "apps.h" #include "apps.h"
#include <openssl/err.h> #include <openssl/err.h>
#ifndef OPENSSL_NO_ENGINE #include <openssl/engine.h>
# include <openssl/engine.h> #include <openssl/ssl.h>
# include <openssl/ssl.h>
# undef PROG #undef PROG
# define PROG engine_main #define PROG engine_main
static const char *engine_usage[] = { static char *engine_usage[]={
"usage: engine opts [engine ...]\n", "usage: engine opts [engine ...]\n",
" -v[v[v[v]]] - verbose mode, for each engine, list its 'control commands'\n", " -v[v[v[v]]] - verbose mode, for each engine, list its 'control commands'\n",
" -vv will additionally display each command's description\n", " -vv will additionally display each command's description\n",
" -vvv will also add the input flags for each command\n", " -vvv will also add the input flags for each command\n",
" -vvvv will also show internal input flags\n", " -vvvv will also show internal input flags\n",
" -c - for each engine, also list the capabilities\n", " -c - for each engine, also list the capabilities\n",
" -t[t] - for each engine, check that they are really available\n", " -t - for each engine, check that they are really available\n",
" -tt will display error trace for unavailable engines\n", " -pre <cmd> - runs command 'cmd' against the ENGINE before any attempts\n",
" -pre <cmd> - runs command 'cmd' against the ENGINE before any attempts\n", " to load it (if -t is used)\n",
" to load it (if -t is used)\n", " -post <cmd> - runs command 'cmd' against the ENGINE after loading it\n",
" -post <cmd> - runs command 'cmd' against the ENGINE after loading it\n", " (only used if -t is also provided)\n",
" (only used if -t is also provided)\n", " NB: -pre and -post will be applied to all ENGINEs supplied on the command\n",
" NB: -pre and -post will be applied to all ENGINEs supplied on the command\n", " line, or all supported ENGINEs if none are specified.\n",
" line, or all supported ENGINEs if none are specified.\n", " Eg. '-pre \"SO_PATH:/lib/libdriver.so\"' calls command \"SO_PATH\" with\n",
" Eg. '-pre \"SO_PATH:/lib/libdriver.so\"' calls command \"SO_PATH\" with\n", " argument \"/lib/libdriver.so\".\n",
" argument \"/lib/libdriver.so\".\n", NULL
NULL
}; };
static void identity(char *ptr) static void identity(void *ptr)
{ {
return; return;
} }
static int append_buf(char **buf, const char *s, int *size, int step) static int append_buf(char **buf, const char *s, int *size, int step)
{ {
if (*buf == NULL) { int l = strlen(s);
*size = step;
*buf = OPENSSL_malloc(*size);
if (*buf == NULL)
return 0;
**buf = '\0';
}
if (strlen(*buf) + strlen(s) >= (unsigned int)*size) { if (*buf == NULL)
*size += step; {
*buf = OPENSSL_realloc(*buf, *size); *size = step;
} *buf = OPENSSL_malloc(*size);
if (*buf == NULL)
return 0;
**buf = '\0';
}
if (*buf == NULL) if (**buf != '\0')
return 0; l += 2; /* ", " */
if (**buf != '\0') if (strlen(*buf) + strlen(s) >= (unsigned int)*size)
BUF_strlcat(*buf, ", ", *size); {
BUF_strlcat(*buf, s, *size); *size += step;
*buf = OPENSSL_realloc(*buf, *size);
}
return 1; if (*buf == NULL)
} return 0;
if (**buf != '\0')
BUF_strlcat(*buf, ", ", *size);
BUF_strlcat(*buf, s, *size);
return 1;
}
static int util_flags(BIO *bio_out, unsigned int flags, const char *indent) static int util_flags(BIO *bio_out, unsigned int flags, const char *indent)
{ {
int started = 0, err = 0; int started = 0, err = 0;
/* Indent before displaying input flags */ /* Indent before displaying input flags */
BIO_printf(bio_out, "%s%s(input flags): ", indent, indent); BIO_printf(bio_out, "%s%s(input flags): ", indent, indent);
if (flags == 0) { if(flags == 0)
BIO_printf(bio_out, "<no flags>\n"); {
return 1; BIO_printf(bio_out, "<no flags>\n");
} return 1;
/* }
* If the object is internal, mark it in a way that shows instead of /* If the object is internal, mark it in a way that shows instead of
* having it part of all the other flags, even if it really is. * having it part of all the other flags, even if it really is. */
*/ if(flags & ENGINE_CMD_FLAG_INTERNAL)
if (flags & ENGINE_CMD_FLAG_INTERNAL) { {
BIO_printf(bio_out, "[Internal] "); BIO_printf(bio_out, "[Internal] ");
} }
if (flags & ENGINE_CMD_FLAG_NUMERIC) { if(flags & ENGINE_CMD_FLAG_NUMERIC)
BIO_printf(bio_out, "NUMERIC"); {
started = 1; if(started)
} {
/* BIO_printf(bio_out, "|");
* Now we check that no combinations of the mutually exclusive NUMERIC, err = 1;
* STRING, and NO_INPUT flags have been used. Future flags that can be }
* OR'd together with these would need to added after these to preserve BIO_printf(bio_out, "NUMERIC");
* the testing logic. started = 1;
*/ }
if (flags & ENGINE_CMD_FLAG_STRING) { /* Now we check that no combinations of the mutually exclusive NUMERIC,
if (started) { * STRING, and NO_INPUT flags have been used. Future flags that can be
BIO_printf(bio_out, "|"); * OR'd together with these would need to added after these to preserve
err = 1; * the testing logic. */
} if(flags & ENGINE_CMD_FLAG_STRING)
BIO_printf(bio_out, "STRING"); {
started = 1; if(started)
} {
if (flags & ENGINE_CMD_FLAG_NO_INPUT) { BIO_printf(bio_out, "|");
if (started) { err = 1;
BIO_printf(bio_out, "|"); }
err = 1; BIO_printf(bio_out, "STRING");
} started = 1;
BIO_printf(bio_out, "NO_INPUT"); }
started = 1; if(flags & ENGINE_CMD_FLAG_NO_INPUT)
} {
/* Check for unknown flags */ if(started)
flags = flags & ~ENGINE_CMD_FLAG_NUMERIC & {
~ENGINE_CMD_FLAG_STRING & BIO_printf(bio_out, "|");
~ENGINE_CMD_FLAG_NO_INPUT & ~ENGINE_CMD_FLAG_INTERNAL; err = 1;
if (flags) { }
if (started) BIO_printf(bio_out, "NO_INPUT");
BIO_printf(bio_out, "|"); started = 1;
BIO_printf(bio_out, "<0x%04X>", flags); }
} /* Check for unknown flags */
if (err) flags = flags & ~ENGINE_CMD_FLAG_NUMERIC &
BIO_printf(bio_out, " <illegal flags!>"); ~ENGINE_CMD_FLAG_STRING &
BIO_printf(bio_out, "\n"); ~ENGINE_CMD_FLAG_NO_INPUT &
return 1; ~ENGINE_CMD_FLAG_INTERNAL;
} if(flags)
{
if(started) BIO_printf(bio_out, "|");
BIO_printf(bio_out, "<0x%04X>", flags);
}
if(err)
BIO_printf(bio_out, " <illegal flags!>");
BIO_printf(bio_out, "\n");
return 1;
}
static int util_verbose(ENGINE *e, int verbose, BIO *bio_out, static int util_verbose(ENGINE *e, int verbose, BIO *bio_out, const char *indent)
const char *indent) {
{ static const int line_wrap = 78;
static const int line_wrap = 78; int num;
int num; int ret = 0;
int ret = 0; char *name = NULL;
char *name = NULL; char *desc = NULL;
char *desc = NULL; int flags;
int flags; int xpos = 0;
int xpos = 0; STACK *cmds = NULL;
STACK_OF(OPENSSL_STRING) *cmds = NULL; if(!ENGINE_ctrl(e, ENGINE_CTRL_HAS_CTRL_FUNCTION, 0, NULL, NULL) ||
if (!ENGINE_ctrl(e, ENGINE_CTRL_HAS_CTRL_FUNCTION, 0, NULL, NULL) || ((num = ENGINE_ctrl(e, ENGINE_CTRL_GET_FIRST_CMD_TYPE,
((num = ENGINE_ctrl(e, ENGINE_CTRL_GET_FIRST_CMD_TYPE, 0, NULL, NULL)) <= 0))
0, NULL, NULL)) <= 0)) { {
# if 0 #if 0
BIO_printf(bio_out, "%s<no control commands>\n", indent); BIO_printf(bio_out, "%s<no control commands>\n", indent);
# endif #endif
return 1; return 1;
} }
cmds = sk_OPENSSL_STRING_new_null(); cmds = sk_new_null();
if (!cmds) if(!cmds)
goto err; goto err;
do { do {
int len; int len;
/* Get the command input flags */ /* Get the command input flags */
if ((flags = ENGINE_ctrl(e, ENGINE_CTRL_GET_CMD_FLAGS, num, if((flags = ENGINE_ctrl(e, ENGINE_CTRL_GET_CMD_FLAGS, num,
NULL, NULL)) < 0) NULL, NULL)) < 0)
goto err; goto err;
if (!(flags & ENGINE_CMD_FLAG_INTERNAL) || verbose >= 4) { if (!(flags & ENGINE_CMD_FLAG_INTERNAL) || verbose >= 4)
/* Get the command name */ {
if ((len = ENGINE_ctrl(e, ENGINE_CTRL_GET_NAME_LEN_FROM_CMD, num, /* Get the command name */
NULL, NULL)) <= 0) if((len = ENGINE_ctrl(e, ENGINE_CTRL_GET_NAME_LEN_FROM_CMD, num,
goto err; NULL, NULL)) <= 0)
if ((name = OPENSSL_malloc(len + 1)) == NULL) goto err;
goto err; if((name = OPENSSL_malloc(len + 1)) == NULL)
if (ENGINE_ctrl(e, ENGINE_CTRL_GET_NAME_FROM_CMD, num, name, goto err;
NULL) <= 0) if(ENGINE_ctrl(e, ENGINE_CTRL_GET_NAME_FROM_CMD, num, name,
goto err;
/* Get the command description */
if ((len = ENGINE_ctrl(e, ENGINE_CTRL_GET_DESC_LEN_FROM_CMD, num,
NULL, NULL)) < 0)
goto err;
if (len > 0) {
if ((desc = OPENSSL_malloc(len + 1)) == NULL)
goto err;
if (ENGINE_ctrl(e, ENGINE_CTRL_GET_DESC_FROM_CMD, num, desc,
NULL) <= 0) NULL) <= 0)
goto err; goto err;
} /* Get the command description */
/* Now decide on the output */ if((len = ENGINE_ctrl(e, ENGINE_CTRL_GET_DESC_LEN_FROM_CMD, num,
if (xpos == 0) NULL, NULL)) < 0)
/* Do an indent */ goto err;
xpos = BIO_puts(bio_out, indent); if(len > 0)
else {
/* Otherwise prepend a ", " */ if((desc = OPENSSL_malloc(len + 1)) == NULL)
xpos += BIO_printf(bio_out, ", "); goto err;
if (verbose == 1) { if(ENGINE_ctrl(e, ENGINE_CTRL_GET_DESC_FROM_CMD, num, desc,
/* NULL) <= 0)
* We're just listing names, comma-delimited goto err;
*/ }
if ((xpos > (int)strlen(indent)) && /* Now decide on the output */
(xpos + (int)strlen(name) > line_wrap)) { if(xpos == 0)
BIO_printf(bio_out, "\n"); /* Do an indent */
xpos = BIO_puts(bio_out, indent); xpos = BIO_printf(bio_out, indent);
} else
xpos += BIO_printf(bio_out, "%s", name); /* Otherwise prepend a ", " */
} else { xpos += BIO_printf(bio_out, ", ");
/* We're listing names plus descriptions */ if(verbose == 1)
BIO_printf(bio_out, "%s: %s\n", name, {
(desc == NULL) ? "<no description>" : desc); /* We're just listing names, comma-delimited */
/* ... and sometimes input flags */ if((xpos > (int)strlen(indent)) &&
if ((verbose >= 3) && !util_flags(bio_out, flags, indent)) (xpos + (int)strlen(name) > line_wrap))
goto err; {
xpos = 0; BIO_printf(bio_out, "\n");
} xpos = BIO_printf(bio_out, indent);
} }
OPENSSL_free(name); xpos += BIO_printf(bio_out, "%s", name);
name = NULL; }
if (desc) { else
OPENSSL_free(desc); {
desc = NULL; /* We're listing names plus descriptions */
} BIO_printf(bio_out, "%s: %s\n", name,
/* Move to the next command */ (desc == NULL) ? "<no description>" : desc);
num = ENGINE_ctrl(e, ENGINE_CTRL_GET_NEXT_CMD_TYPE, num, NULL, NULL); /* ... and sometimes input flags */
} while (num > 0); if((verbose >= 3) && !util_flags(bio_out, flags,
if (xpos > 0) indent))
BIO_printf(bio_out, "\n"); goto err;
ret = 1; xpos = 0;
err: }
if (cmds) }
sk_OPENSSL_STRING_pop_free(cmds, identity); OPENSSL_free(name); name = NULL;
if (name) if(desc) { OPENSSL_free(desc); desc = NULL; }
OPENSSL_free(name); /* Move to the next command */
if (desc) num = ENGINE_ctrl(e, ENGINE_CTRL_GET_NEXT_CMD_TYPE,
OPENSSL_free(desc); num, NULL, NULL);
return ret; } while(num > 0);
} if(xpos > 0)
BIO_printf(bio_out, "\n");
ret = 1;
err:
if(cmds) sk_pop_free(cmds, identity);
if(name) OPENSSL_free(name);
if(desc) OPENSSL_free(desc);
return ret;
}
static void util_do_cmds(ENGINE *e, STACK_OF(OPENSSL_STRING) *cmds, static void util_do_cmds(ENGINE *e, STACK *cmds, BIO *bio_out, const char *indent)
BIO *bio_out, const char *indent) {
{ int loop, res, num = sk_num(cmds);
int loop, res, num = sk_OPENSSL_STRING_num(cmds); if(num < 0)
{
if (num < 0) { BIO_printf(bio_out, "[Error]: internal stack error\n");
BIO_printf(bio_out, "[Error]: internal stack error\n"); return;
return; }
} for(loop = 0; loop < num; loop++)
for (loop = 0; loop < num; loop++) { {
char buf[256]; char buf[256];
const char *cmd, *arg; const char *cmd, *arg;
cmd = sk_OPENSSL_STRING_value(cmds, loop); cmd = sk_value(cmds, loop);
res = 1; /* assume success */ res = 1; /* assume success */
/* Check if this command has no ":arg" */ /* Check if this command has no ":arg" */
if ((arg = strstr(cmd, ":")) == NULL) { if((arg = strstr(cmd, ":")) == NULL)
if (!ENGINE_ctrl_cmd_string(e, cmd, NULL, 0)) {
res = 0; if(!ENGINE_ctrl_cmd_string(e, cmd, NULL, 0))
} else { res = 0;
if ((int)(arg - cmd) > 254) { }
BIO_printf(bio_out, "[Error]: command name too long\n"); else
return; {
} if((int)(arg - cmd) > 254)
memcpy(buf, cmd, (int)(arg - cmd)); {
buf[arg - cmd] = '\0'; BIO_printf(bio_out,"[Error]: command name too long\n");
arg++; /* Move past the ":" */ return;
/* Call the command with the argument */ }
if (!ENGINE_ctrl_cmd_string(e, buf, arg, 0)) memcpy(buf, cmd, (int)(arg - cmd));
res = 0; buf[arg-cmd] = '\0';
} arg++; /* Move past the ":" */
if (res) /* Call the command with the argument */
BIO_printf(bio_out, "[Success]: %s\n", cmd); if(!ENGINE_ctrl_cmd_string(e, buf, arg, 0))
else { res = 0;
BIO_printf(bio_out, "[Failure]: %s\n", cmd); }
ERR_print_errors(bio_out); if(res)
} BIO_printf(bio_out, "[Success]: %s\n", cmd);
} else
} {
BIO_printf(bio_out, "[Failure]: %s\n", cmd);
ERR_print_errors(bio_out);
}
}
}
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
int ret = 1, i; int ret=1,i;
const char **pp; char **pp;
int verbose = 0, list_cap = 0, test_avail = 0, test_avail_noise = 0; int verbose=0, list_cap=0, test_avail=0;
ENGINE *e; ENGINE *e;
STACK_OF(OPENSSL_STRING) *engines = sk_OPENSSL_STRING_new_null(); STACK *engines = sk_new_null();
STACK_OF(OPENSSL_STRING) *pre_cmds = sk_OPENSSL_STRING_new_null(); STACK *pre_cmds = sk_new_null();
STACK_OF(OPENSSL_STRING) *post_cmds = sk_OPENSSL_STRING_new_null(); STACK *post_cmds = sk_new_null();
int badops = 1; int badops=1;
BIO *bio_out = NULL; BIO *bio_out=NULL;
const char *indent = " "; const char *indent = " ";
apps_startup(); apps_startup();
SSL_load_error_strings(); SSL_load_error_strings();
if (bio_err == NULL) if (bio_err == NULL)
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
bio_out = BIO_new_fp(stdout, BIO_NOCLOSE); bio_out=BIO_new_fp(stdout,BIO_NOCLOSE);
# ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
bio_out = BIO_push(tmpbio, bio_out); bio_out = BIO_push(tmpbio, bio_out);
} }
# endif #endif
argc--; argc--;
argv++; argv++;
while (argc >= 1) { while (argc >= 1)
if (strncmp(*argv, "-v", 2) == 0) { {
if (strspn(*argv + 1, "v") < strlen(*argv + 1)) if (strncmp(*argv,"-v",2) == 0)
goto skip_arg_loop; {
if ((verbose = strlen(*argv + 1)) > 4) if(strspn(*argv + 1, "v") < strlen(*argv + 1))
goto skip_arg_loop; goto skip_arg_loop;
} else if (strcmp(*argv, "-c") == 0) if((verbose=strlen(*argv + 1)) > 4)
list_cap = 1; goto skip_arg_loop;
else if (strncmp(*argv, "-t", 2) == 0) { }
test_avail = 1; else if (strcmp(*argv,"-c") == 0)
if (strspn(*argv + 1, "t") < strlen(*argv + 1)) list_cap=1;
goto skip_arg_loop; else if (strcmp(*argv,"-t") == 0)
if ((test_avail_noise = strlen(*argv + 1) - 1) > 1) test_avail=1;
goto skip_arg_loop; else if (strcmp(*argv,"-pre") == 0)
} else if (strcmp(*argv, "-pre") == 0) { {
argc--; argc--; argv++;
argv++; sk_push(pre_cmds,*argv);
if (argc == 0) }
goto skip_arg_loop; else if (strcmp(*argv,"-post") == 0)
sk_OPENSSL_STRING_push(pre_cmds, *argv); {
} else if (strcmp(*argv, "-post") == 0) { argc--; argv++;
argc--; sk_push(post_cmds,*argv);
argv++; }
if (argc == 0) else if ((strncmp(*argv,"-h",2) == 0) ||
goto skip_arg_loop; (strcmp(*argv,"-?") == 0))
sk_OPENSSL_STRING_push(post_cmds, *argv); goto skip_arg_loop;
} else if ((strncmp(*argv, "-h", 2) == 0) || else
(strcmp(*argv, "-?") == 0)) sk_push(engines,*argv);
goto skip_arg_loop; argc--;
else argv++;
sk_OPENSSL_STRING_push(engines, *argv); }
argc--; /* Looks like everything went OK */
argv++; badops = 0;
} skip_arg_loop:
/* Looks like everything went OK */
badops = 0;
skip_arg_loop:
if (badops) { if (badops)
for (pp = engine_usage; (*pp != NULL); pp++) {
BIO_printf(bio_err, "%s", *pp); for (pp=engine_usage; (*pp != NULL); pp++)
goto end; BIO_printf(bio_err,"%s",*pp);
} goto end;
}
if (sk_OPENSSL_STRING_num(engines) == 0) { if (sk_num(engines) == 0)
for (e = ENGINE_get_first(); e != NULL; e = ENGINE_get_next(e)) { {
sk_OPENSSL_STRING_push(engines, (char *)ENGINE_get_id(e)); for(e = ENGINE_get_first(); e != NULL; e = ENGINE_get_next(e))
} {
} sk_push(engines,(char *)ENGINE_get_id(e));
}
}
for (i = 0; i < sk_OPENSSL_STRING_num(engines); i++) { for (i=0; i<sk_num(engines); i++)
const char *id = sk_OPENSSL_STRING_value(engines, i); {
if ((e = ENGINE_by_id(id)) != NULL) { const char *id = sk_value(engines,i);
const char *name = ENGINE_get_name(e); if ((e = ENGINE_by_id(id)) != NULL)
/* {
* Do "id" first, then "name". Easier to auto-parse. const char *name = ENGINE_get_name(e);
*/ /* Do "id" first, then "name". Easier to auto-parse. */
BIO_printf(bio_out, "(%s) %s\n", id, name); BIO_printf(bio_out, "(%s) %s\n", id, name);
util_do_cmds(e, pre_cmds, bio_out, indent); util_do_cmds(e, pre_cmds, bio_out, indent);
if (strcmp(ENGINE_get_id(e), id) != 0) { if (strcmp(ENGINE_get_id(e), id) != 0)
BIO_printf(bio_out, "Loaded: (%s) %s\n", {
ENGINE_get_id(e), ENGINE_get_name(e)); BIO_printf(bio_out, "Loaded: (%s) %s\n",
} ENGINE_get_id(e), ENGINE_get_name(e));
if (list_cap) { }
int cap_size = 256; if (list_cap)
char *cap_buf = NULL; {
int k, n; int cap_size = 256;
const int *nids; char *cap_buf = NULL;
ENGINE_CIPHERS_PTR fn_c; int k,n;
ENGINE_DIGESTS_PTR fn_d; const int *nids;
ENGINE_PKEY_METHS_PTR fn_pk; ENGINE_CIPHERS_PTR fn_c;
ENGINE_DIGESTS_PTR fn_d;
if (ENGINE_get_RSA(e) != NULL if (ENGINE_get_RSA(e) != NULL
&& !append_buf(&cap_buf, "RSA", &cap_size, 256)) && !append_buf(&cap_buf, "RSA",
goto end; &cap_size, 256))
if (ENGINE_get_DSA(e) != NULL goto end;
&& !append_buf(&cap_buf, "DSA", &cap_size, 256)) if (ENGINE_get_DSA(e) != NULL
goto end; && !append_buf(&cap_buf, "DSA",
if (ENGINE_get_DH(e) != NULL &cap_size, 256))
&& !append_buf(&cap_buf, "DH", &cap_size, 256)) goto end;
goto end; if (ENGINE_get_DH(e) != NULL
if (ENGINE_get_RAND(e) != NULL && !append_buf(&cap_buf, "DH",
&& !append_buf(&cap_buf, "RAND", &cap_size, 256)) &cap_size, 256))
goto end; goto end;
if (ENGINE_get_RAND(e) != NULL
&& !append_buf(&cap_buf, "RAND",
&cap_size, 256))
goto end;
fn_c = ENGINE_get_ciphers(e); fn_c = ENGINE_get_ciphers(e);
if (!fn_c) if(!fn_c) goto skip_ciphers;
goto skip_ciphers; n = fn_c(e, NULL, &nids, 0);
n = fn_c(e, NULL, &nids, 0); for(k=0 ; k < n ; ++k)
for (k = 0; k < n; ++k) if(!append_buf(&cap_buf,
if (!append_buf(&cap_buf, OBJ_nid2sn(nids[k]),
OBJ_nid2sn(nids[k]), &cap_size, 256)) &cap_size, 256))
goto end; goto end;
skip_ciphers: skip_ciphers:
fn_d = ENGINE_get_digests(e); fn_d = ENGINE_get_digests(e);
if (!fn_d) if(!fn_d) goto skip_digests;
goto skip_digests; n = fn_d(e, NULL, &nids, 0);
n = fn_d(e, NULL, &nids, 0); for(k=0 ; k < n ; ++k)
for (k = 0; k < n; ++k) if(!append_buf(&cap_buf,
if (!append_buf(&cap_buf, OBJ_nid2sn(nids[k]),
OBJ_nid2sn(nids[k]), &cap_size, 256)) &cap_size, 256))
goto end; goto end;
skip_digests: skip_digests:
fn_pk = ENGINE_get_pkey_meths(e); if (cap_buf && (*cap_buf != '\0'))
if (!fn_pk) BIO_printf(bio_out, " [%s]\n", cap_buf);
goto skip_pmeths;
n = fn_pk(e, NULL, &nids, 0);
for (k = 0; k < n; ++k)
if (!append_buf(&cap_buf,
OBJ_nid2sn(nids[k]), &cap_size, 256))
goto end;
skip_pmeths:
if (cap_buf && (*cap_buf != '\0'))
BIO_printf(bio_out, " [%s]\n", cap_buf);
OPENSSL_free(cap_buf); OPENSSL_free(cap_buf);
} }
if (test_avail) { if(test_avail)
BIO_printf(bio_out, "%s", indent); {
if (ENGINE_init(e)) { BIO_printf(bio_out, "%s", indent);
BIO_printf(bio_out, "[ available ]\n"); if (ENGINE_init(e))
util_do_cmds(e, post_cmds, bio_out, indent); {
ENGINE_finish(e); BIO_printf(bio_out, "[ available ]\n");
} else { util_do_cmds(e, post_cmds, bio_out, indent);
BIO_printf(bio_out, "[ unavailable ]\n"); ENGINE_finish(e);
if (test_avail_noise) }
ERR_print_errors_fp(stdout); else
ERR_clear_error(); {
} BIO_printf(bio_out, "[ unavailable ]\n");
} ERR_print_errors_fp(stdout);
if ((verbose > 0) && !util_verbose(e, verbose, bio_out, indent)) ERR_clear_error();
goto end; }
ENGINE_free(e); }
} else if((verbose > 0) && !util_verbose(e, verbose, bio_out, indent))
ERR_print_errors(bio_err); goto end;
} ENGINE_free(e);
}
else
ERR_print_errors(bio_err);
}
ret = 0; ret=0;
end: end:
ERR_print_errors(bio_err);
ERR_print_errors(bio_err); sk_pop_free(engines, identity);
sk_OPENSSL_STRING_pop_free(engines, identity); sk_pop_free(pre_cmds, identity);
sk_OPENSSL_STRING_pop_free(pre_cmds, identity); sk_pop_free(post_cmds, identity);
sk_OPENSSL_STRING_pop_free(post_cmds, identity); if (bio_out != NULL) BIO_free_all(bio_out);
if (bio_out != NULL) apps_shutdown();
BIO_free_all(bio_out); OPENSSL_EXIT(ret);
apps_shutdown(); }
OPENSSL_EXIT(ret);
}
#else #else
# if PEDANTIC # if PEDANTIC
static void *dummy = &dummy; static void *dummy=&dummy;
# endif # endif
#endif #endif

View File

@ -66,56 +66,61 @@
#include <openssl/ssl.h> #include <openssl/ssl.h>
#undef PROG #undef PROG
#define PROG errstr_main #define PROG errstr_main
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
int i, ret = 0; int i,ret=0;
char buf[256]; char buf[256];
unsigned long l; unsigned long l;
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
SSL_load_error_strings(); SSL_load_error_strings();
if ((argc > 1) && (strcmp(argv[1], "-stats") == 0)) { if ((argc > 1) && (strcmp(argv[1],"-stats") == 0))
BIO *out = NULL; {
BIO *out=NULL;
out = BIO_new(BIO_s_file()); out=BIO_new(BIO_s_file());
if ((out != NULL) && BIO_set_fp(out, stdout, BIO_NOCLOSE)) { if ((out != NULL) && BIO_set_fp(out,stdout,BIO_NOCLOSE))
{
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
#endif #endif
lh_ERR_STRING_DATA_node_stats_bio(ERR_get_string_table(), out); lh_node_stats_bio((LHASH *)ERR_get_string_table(),out);
lh_ERR_STRING_DATA_stats_bio(ERR_get_string_table(), out); lh_stats_bio((LHASH *)ERR_get_string_table(),out);
lh_ERR_STRING_DATA_node_usage_stats_bio(ERR_get_string_table(), lh_node_usage_stats_bio((LHASH *)
out); ERR_get_string_table(),out);
} }
if (out != NULL) if (out != NULL) BIO_free_all(out);
BIO_free_all(out); argc--;
argc--; argv++;
argv++; }
}
for (i = 1; i < argc; i++) { for (i=1; i<argc; i++)
if (sscanf(argv[i], "%lx", &l)) { {
ERR_error_string_n(l, buf, sizeof buf); if (sscanf(argv[i],"%lx",&l))
printf("%s\n", buf); {
} else { ERR_error_string_n(l, buf, sizeof buf);
printf("%s: bad error code\n", argv[i]); printf("%s\n",buf);
printf("usage: errstr [-stats] <errno> ...\n"); }
ret++; else
} {
} printf("%s: bad error code\n",argv[i]);
apps_shutdown(); printf("usage: errstr [-stats] <errno> ...\n");
OPENSSL_EXIT(ret); ret++;
} }
}
apps_shutdown();
OPENSSL_EXIT(ret);
}

View File

@ -57,192 +57,172 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
#include <openssl/opensslconf.h>
/*
* Until the key-gen callbacks are modified to use newer prototypes, we allow
* deprecated functions for openssl-internal code
*/
#ifdef OPENSSL_NO_DEPRECATED
# undef OPENSSL_NO_DEPRECATED
#endif
#ifndef OPENSSL_NO_DH #ifndef OPENSSL_NO_DH
# include <stdio.h> #include <stdio.h>
# include <string.h> #include <string.h>
# include <sys/types.h> #include <sys/types.h>
# include <sys/stat.h> #include <sys/stat.h>
# include "apps.h" #include "apps.h"
# include <openssl/bio.h> #include <openssl/bio.h>
# include <openssl/rand.h> #include <openssl/rand.h>
# include <openssl/err.h> #include <openssl/err.h>
# include <openssl/bn.h> #include <openssl/bn.h>
# include <openssl/dh.h> #include <openssl/dh.h>
# include <openssl/x509.h> #include <openssl/x509.h>
# include <openssl/pem.h> #include <openssl/pem.h>
# define DEFBITS 2048 #define DEFBITS 512
# undef PROG #undef PROG
# define PROG gendh_main #define PROG gendh_main
static int MS_CALLBACK dh_cb(int p, int n, BN_GENCB *cb); static void MS_CALLBACK dh_cb(int p, int n, void *arg);
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
BN_GENCB cb; #ifndef OPENSSL_NO_ENGINE
DH *dh = NULL; ENGINE *e = NULL;
int ret = 1, num = DEFBITS; #endif
int g = 2; DH *dh=NULL;
char *outfile = NULL; int ret=1,num=DEFBITS;
char *inrand = NULL; int g=2;
# ifndef OPENSSL_NO_ENGINE char *outfile=NULL;
char *engine = NULL; char *inrand=NULL;
# endif #ifndef OPENSSL_NO_ENGINE
BIO *out = NULL; char *engine=NULL;
#endif
apps_startup(); BIO *out=NULL;
BN_GENCB_set(&cb, dh_cb, bio_err); apps_startup();
if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if (bio_err == NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (!load_config(bio_err, NULL))
goto end; if (!load_config(bio_err, NULL))
goto end;
argv++;
argc--; argv++;
for (;;) { argc--;
if (argc <= 0) for (;;)
break; {
if (strcmp(*argv, "-out") == 0) { if (argc <= 0) break;
if (--argc < 1) if (strcmp(*argv,"-out") == 0)
goto bad; {
outfile = *(++argv); if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-2") == 0) outfile= *(++argv);
g = 2; }
/*- else if (strcmp(*argv,"-3") == 0) else if (strcmp(*argv,"-2") == 0)
g=3; */ g=2;
else if (strcmp(*argv, "-5") == 0) /* else if (strcmp(*argv,"-3") == 0)
g = 5; g=3; */
# ifndef OPENSSL_NO_ENGINE else if (strcmp(*argv,"-5") == 0)
else if (strcmp(*argv, "-engine") == 0) { g=5;
if (--argc < 1) #ifndef OPENSSL_NO_ENGINE
goto bad; else if (strcmp(*argv,"-engine") == 0)
engine = *(++argv); {
} if (--argc < 1) goto bad;
# endif engine= *(++argv);
else if (strcmp(*argv, "-rand") == 0) { }
if (--argc < 1) #endif
goto bad; else if (strcmp(*argv,"-rand") == 0)
inrand = *(++argv); {
} else if (--argc < 1) goto bad;
break; inrand= *(++argv);
argv++; }
argc--; else
} break;
if ((argc >= 1) && ((sscanf(*argv, "%d", &num) == 0) || (num < 0))) { argv++;
bad: argc--;
BIO_printf(bio_err, "usage: gendh [args] [numbits]\n"); }
BIO_printf(bio_err, " -out file - output the key to 'file\n"); if ((argc >= 1) && ((sscanf(*argv,"%d",&num) == 0) || (num < 0)))
BIO_printf(bio_err, " -2 - use 2 as the generator value\n"); {
/* bad:
* BIO_printf(bio_err," -3 - use 3 as the generator value\n"); BIO_printf(bio_err,"usage: gendh [args] [numbits]\n");
*/ BIO_printf(bio_err," -out file - output the key to 'file\n");
BIO_printf(bio_err, " -5 - use 5 as the generator value\n"); BIO_printf(bio_err," -2 - use 2 as the generator value\n");
# ifndef OPENSSL_NO_ENGINE /* BIO_printf(bio_err," -3 - use 3 as the generator value\n"); */
BIO_printf(bio_err, BIO_printf(bio_err," -5 - use 5 as the generator value\n");
" -engine e - use engine e, possibly a hardware device.\n"); #ifndef OPENSSL_NO_ENGINE
# endif BIO_printf(bio_err," -engine e - use engine e, possibly a hardware device.\n");
BIO_printf(bio_err, " -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, #endif
LIST_SEPARATOR_CHAR); BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
BIO_printf(bio_err, BIO_printf(bio_err," - load the file (or the files in the directory) into\n");
" - load the file (or the files in the directory) into\n"); BIO_printf(bio_err," the random number generator\n");
BIO_printf(bio_err, " the random number generator\n"); goto end;
goto end; }
}
# ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
setup_engine(bio_err, engine, 0); e = setup_engine(bio_err, engine, 0);
# endif #endif
out = BIO_new(BIO_s_file()); out=BIO_new(BIO_s_file());
if (out == NULL) { if (out == NULL)
ERR_print_errors(bio_err); {
goto end; ERR_print_errors(bio_err);
} goto end;
}
if (outfile == NULL) {
BIO_set_fp(out, stdout, BIO_NOCLOSE); if (outfile == NULL)
# ifdef OPENSSL_SYS_VMS {
{ BIO_set_fp(out,stdout,BIO_NOCLOSE);
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); #ifdef OPENSSL_SYS_VMS
out = BIO_push(tmpbio, out); {
} BIO *tmpbio = BIO_new(BIO_f_linebuffer());
# endif out = BIO_push(tmpbio, out);
} else { }
if (BIO_write_filename(out, outfile) <= 0) { #endif
perror(outfile); }
goto end; else
} {
} if (BIO_write_filename(out,outfile) <= 0)
{
if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL) { perror(outfile);
BIO_printf(bio_err, goto end;
"warning, not much extra random data, consider using the -rand option\n"); }
} }
if (inrand != NULL)
BIO_printf(bio_err, "%ld semi-random bytes loaded\n", if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL)
app_RAND_load_files(inrand)); {
BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
BIO_printf(bio_err, }
"Generating DH parameters, %d bit long safe prime, generator %d\n", if (inrand != NULL)
num, g); BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
BIO_printf(bio_err, "This is going to take a long time\n"); app_RAND_load_files(inrand));
if (((dh = DH_new()) == NULL) BIO_printf(bio_err,"Generating DH parameters, %d bit long safe prime, generator %d\n",num,g);
|| !DH_generate_parameters_ex(dh, num, g, &cb)) BIO_printf(bio_err,"This is going to take a long time\n");
goto end; dh=DH_generate_parameters(num,g,dh_cb,bio_err);
app_RAND_write_file(NULL, bio_err); if (dh == NULL) goto end;
if (!PEM_write_bio_DHparams(out, dh)) app_RAND_write_file(NULL, bio_err);
goto end;
ret = 0; if (!PEM_write_bio_DHparams(out,dh))
end: goto end;
if (ret != 0) ret=0;
ERR_print_errors(bio_err); end:
if (out != NULL) if (ret != 0)
BIO_free_all(out); ERR_print_errors(bio_err);
if (dh != NULL) if (out != NULL) BIO_free_all(out);
DH_free(dh); if (dh != NULL) DH_free(dh);
apps_shutdown(); apps_shutdown();
OPENSSL_EXIT(ret); OPENSSL_EXIT(ret);
} }
static int MS_CALLBACK dh_cb(int p, int n, BN_GENCB *cb) static void MS_CALLBACK dh_cb(int p, int n, void *arg)
{ {
char c = '*'; char c='*';
if (p == 0) if (p == 0) c='.';
c = '.'; if (p == 1) c='+';
if (p == 1) if (p == 2) c='*';
c = '+'; if (p == 3) c='\n';
if (p == 2) BIO_write((BIO *)arg,&c,1);
c = '*'; (void)BIO_flush((BIO *)arg);
if (p == 3) #ifdef LINT
c = '\n'; p=n;
BIO_write(cb->arg, &c, 1); #endif
(void)BIO_flush(cb->arg); }
# ifdef LINT
p = n;
# endif
return 1;
}
#else /* !OPENSSL_NO_DH */
# if PEDANTIC
static void *dummy = &dummy;
# endif
#endif #endif

View File

@ -56,232 +56,206 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
#include <openssl/opensslconf.h> /* for OPENSSL_NO_DSA */
#ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
# include <stdio.h> #include <stdio.h>
# include <string.h> #include <string.h>
# include <sys/types.h> #include <sys/types.h>
# include <sys/stat.h> #include <sys/stat.h>
# include "apps.h" #include "apps.h"
# include <openssl/bio.h> #include <openssl/bio.h>
# include <openssl/err.h> #include <openssl/err.h>
# include <openssl/bn.h> #include <openssl/bn.h>
# include <openssl/dsa.h> #include <openssl/dsa.h>
# include <openssl/x509.h> #include <openssl/x509.h>
# include <openssl/pem.h> #include <openssl/pem.h>
# define DEFBITS 512 #define DEFBITS 512
# undef PROG #undef PROG
# define PROG gendsa_main #define PROG gendsa_main
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
DSA *dsa = NULL; #ifndef OPENSSL_NO_ENGINE
int ret = 1; ENGINE *e = NULL;
char *outfile = NULL; #endif
char *inrand = NULL, *dsaparams = NULL; DSA *dsa=NULL;
char *passargout = NULL, *passout = NULL; int ret=1;
BIO *out = NULL, *in = NULL; char *outfile=NULL;
const EVP_CIPHER *enc = NULL; char *inrand=NULL,*dsaparams=NULL;
# ifndef OPENSSL_NO_ENGINE char *passargout = NULL, *passout = NULL;
char *engine = NULL; BIO *out=NULL,*in=NULL;
# endif const EVP_CIPHER *enc=NULL;
#ifndef OPENSSL_NO_ENGINE
apps_startup(); char *engine=NULL;
#endif
if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) apps_startup();
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT);
if (bio_err == NULL)
if (!load_config(bio_err, NULL)) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
goto end; BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
argv++; if (!load_config(bio_err, NULL))
argc--; goto end;
for (;;) {
if (argc <= 0) argv++;
break; argc--;
if (strcmp(*argv, "-out") == 0) { for (;;)
if (--argc < 1) {
goto bad; if (argc <= 0) break;
outfile = *(++argv); if (strcmp(*argv,"-out") == 0)
} else if (strcmp(*argv, "-passout") == 0) { {
if (--argc < 1) if (--argc < 1) goto bad;
goto bad; outfile= *(++argv);
passargout = *(++argv); }
} else if (strcmp(*argv,"-passout") == 0)
# ifndef OPENSSL_NO_ENGINE {
else if (strcmp(*argv, "-engine") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) passargout= *(++argv);
goto bad; }
engine = *(++argv); #ifndef OPENSSL_NO_ENGINE
} else if (strcmp(*argv,"-engine") == 0)
# endif {
else if (strcmp(*argv, "-rand") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) engine= *(++argv);
goto bad; }
inrand = *(++argv); #endif
} else if (strcmp(*argv, "-") == 0) else if (strcmp(*argv,"-rand") == 0)
goto bad; {
# ifndef OPENSSL_NO_DES if (--argc < 1) goto bad;
else if (strcmp(*argv, "-des") == 0) inrand= *(++argv);
enc = EVP_des_cbc(); }
else if (strcmp(*argv, "-des3") == 0) else if (strcmp(*argv,"-") == 0)
enc = EVP_des_ede3_cbc(); goto bad;
# endif #ifndef OPENSSL_NO_DES
# ifndef OPENSSL_NO_IDEA else if (strcmp(*argv,"-des") == 0)
else if (strcmp(*argv, "-idea") == 0) enc=EVP_des_cbc();
enc = EVP_idea_cbc(); else if (strcmp(*argv,"-des3") == 0)
# endif enc=EVP_des_ede3_cbc();
# ifndef OPENSSL_NO_SEED #endif
else if (strcmp(*argv, "-seed") == 0) #ifndef OPENSSL_NO_IDEA
enc = EVP_seed_cbc(); else if (strcmp(*argv,"-idea") == 0)
# endif enc=EVP_idea_cbc();
# ifndef OPENSSL_NO_AES #endif
else if (strcmp(*argv, "-aes128") == 0) #ifndef OPENSSL_NO_AES
enc = EVP_aes_128_cbc(); else if (strcmp(*argv,"-aes128") == 0)
else if (strcmp(*argv, "-aes192") == 0) enc=EVP_aes_128_cbc();
enc = EVP_aes_192_cbc(); else if (strcmp(*argv,"-aes192") == 0)
else if (strcmp(*argv, "-aes256") == 0) enc=EVP_aes_192_cbc();
enc = EVP_aes_256_cbc(); else if (strcmp(*argv,"-aes256") == 0)
# endif enc=EVP_aes_256_cbc();
# ifndef OPENSSL_NO_CAMELLIA #endif
else if (strcmp(*argv, "-camellia128") == 0) else if (**argv != '-' && dsaparams == NULL)
enc = EVP_camellia_128_cbc(); {
else if (strcmp(*argv, "-camellia192") == 0) dsaparams = *argv;
enc = EVP_camellia_192_cbc(); }
else if (strcmp(*argv, "-camellia256") == 0) else
enc = EVP_camellia_256_cbc(); goto bad;
# endif argv++;
else if (**argv != '-' && dsaparams == NULL) { argc--;
dsaparams = *argv; }
} else
goto bad; if (dsaparams == NULL)
argv++; {
argc--; bad:
} BIO_printf(bio_err,"usage: gendsa [args] dsaparam-file\n");
BIO_printf(bio_err," -out file - output the key to 'file'\n");
if (dsaparams == NULL) { #ifndef OPENSSL_NO_DES
bad: BIO_printf(bio_err," -des - encrypt the generated key with DES in cbc mode\n");
BIO_printf(bio_err, "usage: gendsa [args] dsaparam-file\n"); BIO_printf(bio_err," -des3 - encrypt the generated key with DES in ede cbc mode (168 bit key)\n");
BIO_printf(bio_err, " -out file - output the key to 'file'\n"); #endif
# ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_IDEA
BIO_printf(bio_err, BIO_printf(bio_err," -idea - encrypt the generated key with IDEA in cbc mode\n");
" -des - encrypt the generated key with DES in cbc mode\n"); #endif
BIO_printf(bio_err, #ifndef OPENSSL_NO_AES
" -des3 - encrypt the generated key with DES in ede cbc mode (168 bit key)\n"); BIO_printf(bio_err," -aes128, -aes192, -aes256\n");
# endif BIO_printf(bio_err," encrypt PEM output with cbc aes\n");
# ifndef OPENSSL_NO_IDEA #endif
BIO_printf(bio_err, #ifndef OPENSSL_NO_ENGINE
" -idea - encrypt the generated key with IDEA in cbc mode\n"); BIO_printf(bio_err," -engine e - use engine e, possibly a hardware device.\n");
# endif #endif
# ifndef OPENSSL_NO_SEED BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
BIO_printf(bio_err, " -seed\n"); BIO_printf(bio_err," - load the file (or the files in the directory) into\n");
BIO_printf(bio_err, BIO_printf(bio_err," the random number generator\n");
" encrypt PEM output with cbc seed\n"); BIO_printf(bio_err," dsaparam-file\n");
# endif BIO_printf(bio_err," - a DSA parameter file as generated by the dsaparam command\n");
# ifndef OPENSSL_NO_AES goto end;
BIO_printf(bio_err, " -aes128, -aes192, -aes256\n"); }
BIO_printf(bio_err,
" encrypt PEM output with cbc aes\n"); #ifndef OPENSSL_NO_ENGINE
# endif e = setup_engine(bio_err, engine, 0);
# ifndef OPENSSL_NO_CAMELLIA #endif
BIO_printf(bio_err, " -camellia128, -camellia192, -camellia256\n");
BIO_printf(bio_err, if(!app_passwd(bio_err, NULL, passargout, NULL, &passout)) {
" encrypt PEM output with cbc camellia\n"); BIO_printf(bio_err, "Error getting password\n");
# endif goto end;
# ifndef OPENSSL_NO_ENGINE }
BIO_printf(bio_err,
" -engine e - use engine e, possibly a hardware device.\n");
# endif in=BIO_new(BIO_s_file());
BIO_printf(bio_err, " -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, if (!(BIO_read_filename(in,dsaparams)))
LIST_SEPARATOR_CHAR); {
BIO_printf(bio_err, perror(dsaparams);
" - load the file (or the files in the directory) into\n"); goto end;
BIO_printf(bio_err, " the random number generator\n"); }
BIO_printf(bio_err, " dsaparam-file\n");
BIO_printf(bio_err, if ((dsa=PEM_read_bio_DSAparams(in,NULL,NULL,NULL)) == NULL)
" - a DSA parameter file as generated by the dsaparam command\n"); {
goto end; BIO_printf(bio_err,"unable to load DSA parameter file\n");
} goto end;
# ifndef OPENSSL_NO_ENGINE }
setup_engine(bio_err, engine, 0); BIO_free(in);
# endif in = NULL;
if (!app_passwd(bio_err, NULL, passargout, NULL, &passout)) { out=BIO_new(BIO_s_file());
BIO_printf(bio_err, "Error getting password\n"); if (out == NULL) goto end;
goto end;
} if (outfile == NULL)
{
in = BIO_new(BIO_s_file()); BIO_set_fp(out,stdout,BIO_NOCLOSE);
if (!(BIO_read_filename(in, dsaparams))) { #ifdef OPENSSL_SYS_VMS
perror(dsaparams); {
goto end; BIO *tmpbio = BIO_new(BIO_f_linebuffer());
} out = BIO_push(tmpbio, out);
}
if ((dsa = PEM_read_bio_DSAparams(in, NULL, NULL, NULL)) == NULL) { #endif
BIO_printf(bio_err, "unable to load DSA parameter file\n"); }
goto end; else
} {
BIO_free(in); if (BIO_write_filename(out,outfile) <= 0)
in = NULL; {
perror(outfile);
out = BIO_new(BIO_s_file()); goto end;
if (out == NULL) }
goto end; }
if (outfile == NULL) { if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL)
BIO_set_fp(out, stdout, BIO_NOCLOSE); {
# ifdef OPENSSL_SYS_VMS BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
{ }
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); if (inrand != NULL)
out = BIO_push(tmpbio, out); BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
} app_RAND_load_files(inrand));
# endif
} else { BIO_printf(bio_err,"Generating DSA key, %d bits\n",
if (BIO_write_filename(out, outfile) <= 0) { BN_num_bits(dsa->p));
perror(outfile); if (!DSA_generate_key(dsa)) goto end;
goto end;
} app_RAND_write_file(NULL, bio_err);
}
if (!PEM_write_bio_DSAPrivateKey(out,dsa,enc,NULL,0,NULL, passout))
if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL) { goto end;
BIO_printf(bio_err, ret=0;
"warning, not much extra random data, consider using the -rand option\n"); end:
} if (ret != 0)
if (inrand != NULL) ERR_print_errors(bio_err);
BIO_printf(bio_err, "%ld semi-random bytes loaded\n", if (in != NULL) BIO_free(in);
app_RAND_load_files(inrand)); if (out != NULL) BIO_free_all(out);
if (dsa != NULL) DSA_free(dsa);
BIO_printf(bio_err, "Generating DSA key, %d bits\n", BN_num_bits(dsa->p)); if(passout) OPENSSL_free(passout);
if (!DSA_generate_key(dsa)) apps_shutdown();
goto end; OPENSSL_EXIT(ret);
}
app_RAND_write_file(NULL, bio_err);
if (!PEM_write_bio_DSAPrivateKey(out, dsa, enc, NULL, 0, NULL, passout))
goto end;
ret = 0;
end:
if (ret != 0)
ERR_print_errors(bio_err);
if (in != NULL)
BIO_free(in);
if (out != NULL)
BIO_free_all(out);
if (dsa != NULL)
DSA_free(dsa);
if (passout)
OPENSSL_free(passout);
apps_shutdown();
OPENSSL_EXIT(ret);
}
#else /* !OPENSSL_NO_DSA */
# if PEDANTIC
static void *dummy = &dummy;
# endif
#endif #endif

View File

@ -1,405 +0,0 @@
/* apps/genpkey.c */
/*
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
* 2006
*/
/* ====================================================================
* Copyright (c) 2006 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#include <stdio.h>
#include <string.h>
#include "apps.h"
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#ifndef OPENSSL_NO_ENGINE
# include <openssl/engine.h>
#endif
static int init_keygen_file(BIO *err, EVP_PKEY_CTX **pctx,
const char *file, ENGINE *e);
static int genpkey_cb(EVP_PKEY_CTX *ctx);
#define PROG genpkey_main
int MAIN(int, char **);
int MAIN(int argc, char **argv)
{
ENGINE *e = NULL;
char **args, *outfile = NULL;
char *passarg = NULL;
BIO *in = NULL, *out = NULL;
const EVP_CIPHER *cipher = NULL;
int outformat;
int text = 0;
EVP_PKEY *pkey = NULL;
EVP_PKEY_CTX *ctx = NULL;
char *pass = NULL;
int badarg = 0;
int ret = 1, rv;
int do_param = 0;
if (bio_err == NULL)
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
if (!load_config(bio_err, NULL))
goto end;
outformat = FORMAT_PEM;
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
args = argv + 1;
while (!badarg && *args && *args[0] == '-') {
if (!strcmp(*args, "-outform")) {
if (args[1]) {
args++;
outformat = str2fmt(*args);
} else
badarg = 1;
} else if (!strcmp(*args, "-pass")) {
if (!args[1])
goto bad;
passarg = *(++args);
}
#ifndef OPENSSL_NO_ENGINE
else if (strcmp(*args, "-engine") == 0) {
if (!args[1])
goto bad;
e = setup_engine(bio_err, *(++args), 0);
}
#endif
else if (!strcmp(*args, "-paramfile")) {
if (!args[1])
goto bad;
args++;
if (do_param == 1)
goto bad;
if (!init_keygen_file(bio_err, &ctx, *args, e))
goto end;
} else if (!strcmp(*args, "-out")) {
if (args[1]) {
args++;
outfile = *args;
} else
badarg = 1;
} else if (strcmp(*args, "-algorithm") == 0) {
if (!args[1])
goto bad;
if (!init_gen_str(bio_err, &ctx, *(++args), e, do_param))
goto end;
} else if (strcmp(*args, "-pkeyopt") == 0) {
if (!args[1])
goto bad;
if (!ctx) {
BIO_puts(bio_err, "No keytype specified\n");
goto bad;
} else if (pkey_ctrl_string(ctx, *(++args)) <= 0) {
BIO_puts(bio_err, "parameter setting error\n");
ERR_print_errors(bio_err);
goto end;
}
} else if (strcmp(*args, "-genparam") == 0) {
if (ctx)
goto bad;
do_param = 1;
} else if (strcmp(*args, "-text") == 0)
text = 1;
else {
cipher = EVP_get_cipherbyname(*args + 1);
if (!cipher) {
BIO_printf(bio_err, "Unknown cipher %s\n", *args + 1);
badarg = 1;
}
if (do_param == 1)
badarg = 1;
}
args++;
}
if (!ctx)
badarg = 1;
if (badarg) {
bad:
BIO_printf(bio_err, "Usage: genpkey [options]\n");
BIO_printf(bio_err, "where options may be\n");
BIO_printf(bio_err, "-out file output file\n");
BIO_printf(bio_err,
"-outform X output format (DER or PEM)\n");
BIO_printf(bio_err,
"-pass arg output file pass phrase source\n");
BIO_printf(bio_err,
"-<cipher> use cipher <cipher> to encrypt the key\n");
#ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err,
"-engine e use engine e, possibly a hardware device.\n");
#endif
BIO_printf(bio_err, "-paramfile file parameters file\n");
BIO_printf(bio_err, "-algorithm alg the public key algorithm\n");
BIO_printf(bio_err,
"-pkeyopt opt:value set the public key algorithm option <opt>\n"
" to value <value>\n");
BIO_printf(bio_err,
"-genparam generate parameters, not key\n");
BIO_printf(bio_err, "-text print the in text\n");
BIO_printf(bio_err,
"NB: options order may be important! See the manual page.\n");
goto end;
}
if (!app_passwd(bio_err, passarg, NULL, &pass, NULL)) {
BIO_puts(bio_err, "Error getting password\n");
goto end;
}
if (outfile) {
if (!(out = BIO_new_file(outfile, "wb"))) {
BIO_printf(bio_err, "Can't open output file %s\n", outfile);
goto end;
}
} else {
out = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out);
}
#endif
}
EVP_PKEY_CTX_set_cb(ctx, genpkey_cb);
EVP_PKEY_CTX_set_app_data(ctx, bio_err);
if (do_param) {
if (EVP_PKEY_paramgen(ctx, &pkey) <= 0) {
BIO_puts(bio_err, "Error generating parameters\n");
ERR_print_errors(bio_err);
goto end;
}
} else {
if (EVP_PKEY_keygen(ctx, &pkey) <= 0) {
BIO_puts(bio_err, "Error generating key\n");
ERR_print_errors(bio_err);
goto end;
}
}
if (do_param)
rv = PEM_write_bio_Parameters(out, pkey);
else if (outformat == FORMAT_PEM)
rv = PEM_write_bio_PrivateKey(out, pkey, cipher, NULL, 0, NULL, pass);
else if (outformat == FORMAT_ASN1)
rv = i2d_PrivateKey_bio(out, pkey);
else {
BIO_printf(bio_err, "Bad format specified for key\n");
goto end;
}
if (rv <= 0) {
BIO_puts(bio_err, "Error writing key\n");
ERR_print_errors(bio_err);
}
if (text) {
if (do_param)
rv = EVP_PKEY_print_params(out, pkey, 0, NULL);
else
rv = EVP_PKEY_print_private(out, pkey, 0, NULL);
if (rv <= 0) {
BIO_puts(bio_err, "Error printing key\n");
ERR_print_errors(bio_err);
}
}
ret = 0;
end:
if (pkey)
EVP_PKEY_free(pkey);
if (ctx)
EVP_PKEY_CTX_free(ctx);
if (out)
BIO_free_all(out);
BIO_free(in);
if (pass)
OPENSSL_free(pass);
return ret;
}
static int init_keygen_file(BIO *err, EVP_PKEY_CTX **pctx,
const char *file, ENGINE *e)
{
BIO *pbio;
EVP_PKEY *pkey = NULL;
EVP_PKEY_CTX *ctx = NULL;
if (*pctx) {
BIO_puts(err, "Parameters already set!\n");
return 0;
}
pbio = BIO_new_file(file, "r");
if (!pbio) {
BIO_printf(err, "Can't open parameter file %s\n", file);
return 0;
}
pkey = PEM_read_bio_Parameters(pbio, NULL);
BIO_free(pbio);
if (!pkey) {
BIO_printf(bio_err, "Error reading parameter file %s\n", file);
return 0;
}
ctx = EVP_PKEY_CTX_new(pkey, e);
if (!ctx)
goto err;
if (EVP_PKEY_keygen_init(ctx) <= 0)
goto err;
EVP_PKEY_free(pkey);
*pctx = ctx;
return 1;
err:
BIO_puts(err, "Error initializing context\n");
ERR_print_errors(err);
if (ctx)
EVP_PKEY_CTX_free(ctx);
if (pkey)
EVP_PKEY_free(pkey);
return 0;
}
int init_gen_str(BIO *err, EVP_PKEY_CTX **pctx,
const char *algname, ENGINE *e, int do_param)
{
EVP_PKEY_CTX *ctx = NULL;
const EVP_PKEY_ASN1_METHOD *ameth;
ENGINE *tmpeng = NULL;
int pkey_id;
if (*pctx) {
BIO_puts(err, "Algorithm already set!\n");
return 0;
}
ameth = EVP_PKEY_asn1_find_str(&tmpeng, algname, -1);
#ifndef OPENSSL_NO_ENGINE
if (!ameth && e)
ameth = ENGINE_get_pkey_asn1_meth_str(e, algname, -1);
#endif
if (!ameth) {
BIO_printf(bio_err, "Algorithm %s not found\n", algname);
return 0;
}
ERR_clear_error();
EVP_PKEY_asn1_get0_info(&pkey_id, NULL, NULL, NULL, NULL, ameth);
#ifndef OPENSSL_NO_ENGINE
if (tmpeng)
ENGINE_finish(tmpeng);
#endif
ctx = EVP_PKEY_CTX_new_id(pkey_id, e);
if (!ctx)
goto err;
if (do_param) {
if (EVP_PKEY_paramgen_init(ctx) <= 0)
goto err;
} else {
if (EVP_PKEY_keygen_init(ctx) <= 0)
goto err;
}
*pctx = ctx;
return 1;
err:
BIO_printf(err, "Error initializing %s context\n", algname);
ERR_print_errors(err);
if (ctx)
EVP_PKEY_CTX_free(ctx);
return 0;
}
static int genpkey_cb(EVP_PKEY_CTX *ctx)
{
char c = '*';
BIO *b = EVP_PKEY_CTX_get_app_data(ctx);
int p;
p = EVP_PKEY_CTX_get_keygen_info(ctx, 0);
if (p == 0)
c = '.';
if (p == 1)
c = '+';
if (p == 2)
c = '*';
if (p == 3)
c = '\n';
BIO_write(b, &c, 1);
(void)BIO_flush(b);
#ifdef LINT
p = n;
#endif
return 1;
}

View File

@ -56,295 +56,239 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
#include <openssl/opensslconf.h>
/*
* Until the key-gen callbacks are modified to use newer prototypes, we allow
* deprecated functions for openssl-internal code
*/
#ifdef OPENSSL_NO_DEPRECATED
# undef OPENSSL_NO_DEPRECATED
#endif
#ifndef OPENSSL_NO_RSA #ifndef OPENSSL_NO_RSA
# include <stdio.h> #include <stdio.h>
# include <string.h> #include <string.h>
# include <sys/types.h> #include <sys/types.h>
# include <sys/stat.h> #include <sys/stat.h>
# include "apps.h" #include "apps.h"
# include <openssl/bio.h> #include <openssl/bio.h>
# include <openssl/err.h> #include <openssl/err.h>
# include <openssl/bn.h> #include <openssl/bn.h>
# include <openssl/rsa.h> #include <openssl/rsa.h>
# include <openssl/evp.h> #include <openssl/evp.h>
# include <openssl/x509.h> #include <openssl/x509.h>
# include <openssl/pem.h> #include <openssl/pem.h>
# include <openssl/rand.h> #include <openssl/rand.h>
# define DEFBITS 1024 #define DEFBITS 512
# undef PROG #undef PROG
# define PROG genrsa_main #define PROG genrsa_main
static int MS_CALLBACK genrsa_cb(int p, int n, BN_GENCB *cb); static void MS_CALLBACK genrsa_cb(int p, int n, void *arg);
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
BN_GENCB cb; #ifndef OPENSSL_NO_ENGINE
# ifndef OPENSSL_NO_ENGINE ENGINE *e = NULL;
ENGINE *e = NULL; #endif
# endif int ret=1;
int ret = 1; RSA *rsa=NULL;
int i, num = DEFBITS; int i,num=DEFBITS;
long l; long l;
const EVP_CIPHER *enc = NULL; const EVP_CIPHER *enc=NULL;
unsigned long f4 = RSA_F4; unsigned long f4=RSA_F4;
char *outfile = NULL; char *outfile=NULL;
char *passargout = NULL, *passout = NULL; char *passargout = NULL, *passout = NULL;
# ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
char *engine = NULL; char *engine=NULL;
# endif #endif
char *inrand = NULL; char *inrand=NULL;
BIO *out = NULL; BIO *out=NULL;
BIGNUM *bn = BN_new();
RSA *rsa = NULL;
if (!bn) apps_startup();
goto err;
apps_startup(); if (bio_err == NULL)
BN_GENCB_set(&cb, genrsa_cb, bio_err); if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (bio_err == NULL) if (!load_config(bio_err, NULL))
if ((bio_err = BIO_new(BIO_s_file())) != NULL) goto err;
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); if ((out=BIO_new(BIO_s_file())) == NULL)
{
BIO_printf(bio_err,"unable to create BIO for output\n");
goto err;
}
if (!load_config(bio_err, NULL)) argv++;
goto err; argc--;
if ((out = BIO_new(BIO_s_file())) == NULL) { for (;;)
BIO_printf(bio_err, "unable to create BIO for output\n"); {
goto err; if (argc <= 0) break;
} if (strcmp(*argv,"-out") == 0)
{
if (--argc < 1) goto bad;
outfile= *(++argv);
}
else if (strcmp(*argv,"-3") == 0)
f4=3;
else if (strcmp(*argv,"-F4") == 0 || strcmp(*argv,"-f4") == 0)
f4=RSA_F4;
#ifndef OPENSSL_NO_ENGINE
else if (strcmp(*argv,"-engine") == 0)
{
if (--argc < 1) goto bad;
engine= *(++argv);
}
#endif
else if (strcmp(*argv,"-rand") == 0)
{
if (--argc < 1) goto bad;
inrand= *(++argv);
}
#ifndef OPENSSL_NO_DES
else if (strcmp(*argv,"-des") == 0)
enc=EVP_des_cbc();
else if (strcmp(*argv,"-des3") == 0)
enc=EVP_des_ede3_cbc();
#endif
#ifndef OPENSSL_NO_IDEA
else if (strcmp(*argv,"-idea") == 0)
enc=EVP_idea_cbc();
#endif
#ifndef OPENSSL_NO_AES
else if (strcmp(*argv,"-aes128") == 0)
enc=EVP_aes_128_cbc();
else if (strcmp(*argv,"-aes192") == 0)
enc=EVP_aes_192_cbc();
else if (strcmp(*argv,"-aes256") == 0)
enc=EVP_aes_256_cbc();
#endif
else if (strcmp(*argv,"-passout") == 0)
{
if (--argc < 1) goto bad;
passargout= *(++argv);
}
else
break;
argv++;
argc--;
}
if ((argc >= 1) && ((sscanf(*argv,"%d",&num) == 0) || (num < 0)))
{
bad:
BIO_printf(bio_err,"usage: genrsa [args] [numbits]\n");
BIO_printf(bio_err," -des encrypt the generated key with DES in cbc mode\n");
BIO_printf(bio_err," -des3 encrypt the generated key with DES in ede cbc mode (168 bit key)\n");
#ifndef OPENSSL_NO_IDEA
BIO_printf(bio_err," -idea encrypt the generated key with IDEA in cbc mode\n");
#endif
#ifndef OPENSSL_NO_AES
BIO_printf(bio_err," -aes128, -aes192, -aes256\n");
BIO_printf(bio_err," encrypt PEM output with cbc aes\n");
#endif
BIO_printf(bio_err," -out file output the key to 'file\n");
BIO_printf(bio_err," -passout arg output file pass phrase source\n");
BIO_printf(bio_err," -f4 use F4 (0x10001) for the E value\n");
BIO_printf(bio_err," -3 use 3 for the E value\n");
#ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n");
#endif
BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
BIO_printf(bio_err," load the file (or the files in the directory) into\n");
BIO_printf(bio_err," the random number generator\n");
goto err;
}
argv++; ERR_load_crypto_strings();
argc--;
for (;;) {
if (argc <= 0)
break;
if (strcmp(*argv, "-out") == 0) {
if (--argc < 1)
goto bad;
outfile = *(++argv);
} else if (strcmp(*argv, "-3") == 0)
f4 = 3;
else if (strcmp(*argv, "-F4") == 0 || strcmp(*argv, "-f4") == 0)
f4 = RSA_F4;
# ifndef OPENSSL_NO_ENGINE
else if (strcmp(*argv, "-engine") == 0) {
if (--argc < 1)
goto bad;
engine = *(++argv);
}
# endif
else if (strcmp(*argv, "-rand") == 0) {
if (--argc < 1)
goto bad;
inrand = *(++argv);
}
# ifndef OPENSSL_NO_DES
else if (strcmp(*argv, "-des") == 0)
enc = EVP_des_cbc();
else if (strcmp(*argv, "-des3") == 0)
enc = EVP_des_ede3_cbc();
# endif
# ifndef OPENSSL_NO_IDEA
else if (strcmp(*argv, "-idea") == 0)
enc = EVP_idea_cbc();
# endif
# ifndef OPENSSL_NO_SEED
else if (strcmp(*argv, "-seed") == 0)
enc = EVP_seed_cbc();
# endif
# ifndef OPENSSL_NO_AES
else if (strcmp(*argv, "-aes128") == 0)
enc = EVP_aes_128_cbc();
else if (strcmp(*argv, "-aes192") == 0)
enc = EVP_aes_192_cbc();
else if (strcmp(*argv, "-aes256") == 0)
enc = EVP_aes_256_cbc();
# endif
# ifndef OPENSSL_NO_CAMELLIA
else if (strcmp(*argv, "-camellia128") == 0)
enc = EVP_camellia_128_cbc();
else if (strcmp(*argv, "-camellia192") == 0)
enc = EVP_camellia_192_cbc();
else if (strcmp(*argv, "-camellia256") == 0)
enc = EVP_camellia_256_cbc();
# endif
else if (strcmp(*argv, "-passout") == 0) {
if (--argc < 1)
goto bad;
passargout = *(++argv);
} else
break;
argv++;
argc--;
}
if ((argc >= 1) && ((sscanf(*argv, "%d", &num) == 0) || (num < 0))) {
bad:
BIO_printf(bio_err, "usage: genrsa [args] [numbits]\n");
BIO_printf(bio_err,
" -des encrypt the generated key with DES in cbc mode\n");
BIO_printf(bio_err,
" -des3 encrypt the generated key with DES in ede cbc mode (168 bit key)\n");
# ifndef OPENSSL_NO_IDEA
BIO_printf(bio_err,
" -idea encrypt the generated key with IDEA in cbc mode\n");
# endif
# ifndef OPENSSL_NO_SEED
BIO_printf(bio_err, " -seed\n");
BIO_printf(bio_err,
" encrypt PEM output with cbc seed\n");
# endif
# ifndef OPENSSL_NO_AES
BIO_printf(bio_err, " -aes128, -aes192, -aes256\n");
BIO_printf(bio_err,
" encrypt PEM output with cbc aes\n");
# endif
# ifndef OPENSSL_NO_CAMELLIA
BIO_printf(bio_err, " -camellia128, -camellia192, -camellia256\n");
BIO_printf(bio_err,
" encrypt PEM output with cbc camellia\n");
# endif
BIO_printf(bio_err, " -out file output the key to 'file\n");
BIO_printf(bio_err,
" -passout arg output file pass phrase source\n");
BIO_printf(bio_err,
" -f4 use F4 (0x10001) for the E value\n");
BIO_printf(bio_err, " -3 use 3 for the E value\n");
# ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err,
" -engine e use engine e, possibly a hardware device.\n");
# endif
BIO_printf(bio_err, " -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR,
LIST_SEPARATOR_CHAR);
BIO_printf(bio_err,
" load the file (or the files in the directory) into\n");
BIO_printf(bio_err, " the random number generator\n");
goto err;
}
ERR_load_crypto_strings(); if(!app_passwd(bio_err, NULL, passargout, NULL, &passout)) {
BIO_printf(bio_err, "Error getting password\n");
goto err;
}
if (!app_passwd(bio_err, NULL, passargout, NULL, &passout)) { #ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err, "Error getting password\n"); e = setup_engine(bio_err, engine, 0);
goto err; #endif
}
# ifndef OPENSSL_NO_ENGINE
e = setup_engine(bio_err, engine, 0);
# endif
if (outfile == NULL) { if (outfile == NULL)
BIO_set_fp(out, stdout, BIO_NOCLOSE); {
# ifdef OPENSSL_SYS_VMS BIO_set_fp(out,stdout,BIO_NOCLOSE);
{ #ifdef OPENSSL_SYS_VMS
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); {
out = BIO_push(tmpbio, out); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
} out = BIO_push(tmpbio, out);
# endif }
} else { #endif
if (BIO_write_filename(out, outfile) <= 0) { }
perror(outfile); else
goto err; {
} if (BIO_write_filename(out,outfile) <= 0)
} {
perror(outfile);
goto err;
}
}
if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
&& !RAND_status()) { && !RAND_status())
BIO_printf(bio_err, {
"warning, not much extra random data, consider using the -rand option\n"); BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
} }
if (inrand != NULL) if (inrand != NULL)
BIO_printf(bio_err, "%ld semi-random bytes loaded\n", BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
app_RAND_load_files(inrand)); app_RAND_load_files(inrand));
BIO_printf(bio_err, "Generating RSA private key, %d bit long modulus\n", BIO_printf(bio_err,"Generating RSA private key, %d bit long modulus\n",
num); num);
# ifdef OPENSSL_NO_ENGINE rsa=RSA_generate_key(num,f4,genrsa_cb,bio_err);
rsa = RSA_new();
# else
rsa = RSA_new_method(e);
# endif
if (!rsa)
goto err;
if (!BN_set_word(bn, f4) || !RSA_generate_key_ex(rsa, num, bn, &cb)) app_RAND_write_file(NULL, bio_err);
goto err;
app_RAND_write_file(NULL, bio_err); if (rsa == NULL) goto err;
/* /* We need to do the following for when the base number size is <
* We need to do the following for when the base number size is < long, * long, esp windows 3.1 :-(. */
* esp windows 3.1 :-(. l=0L;
*/ for (i=0; i<rsa->e->top; i++)
l = 0L; {
for (i = 0; i < rsa->e->top; i++) { #ifndef SIXTY_FOUR_BIT
# ifndef SIXTY_FOUR_BIT l<<=BN_BITS4;
l <<= BN_BITS4; l<<=BN_BITS4;
l <<= BN_BITS4; #endif
# endif l+=rsa->e->d[i];
l += rsa->e->d[i]; }
} BIO_printf(bio_err,"e is %ld (0x%lX)\n",l,l);
BIO_printf(bio_err, "e is %ld (0x%lX)\n", l, l); {
{ PW_CB_DATA cb_data;
PW_CB_DATA cb_data; cb_data.password = passout;
cb_data.password = passout; cb_data.prompt_info = outfile;
cb_data.prompt_info = outfile; if (!PEM_write_bio_RSAPrivateKey(out,rsa,enc,NULL,0,
if (!PEM_write_bio_RSAPrivateKey(out, rsa, enc, NULL, 0, (pem_password_cb *)password_callback,&cb_data))
(pem_password_cb *)password_callback, goto err;
&cb_data)) }
goto err;
}
ret = 0; ret=0;
err: err:
if (bn) if (rsa != NULL) RSA_free(rsa);
BN_free(bn); if (out != NULL) BIO_free_all(out);
if (rsa) if(passout) OPENSSL_free(passout);
RSA_free(rsa); if (ret != 0)
if (out) ERR_print_errors(bio_err);
BIO_free_all(out); apps_shutdown();
if (passout) OPENSSL_EXIT(ret);
OPENSSL_free(passout); }
if (ret != 0)
ERR_print_errors(bio_err);
apps_shutdown();
OPENSSL_EXIT(ret);
}
static int MS_CALLBACK genrsa_cb(int p, int n, BN_GENCB *cb) static void MS_CALLBACK genrsa_cb(int p, int n, void *arg)
{ {
char c = '*'; char c='*';
if (p == 0) if (p == 0) c='.';
c = '.'; if (p == 1) c='+';
if (p == 1) if (p == 2) c='*';
c = '+'; if (p == 3) c='\n';
if (p == 2) BIO_write((BIO *)arg,&c,1);
c = '*'; (void)BIO_flush((BIO *)arg);
if (p == 3) #ifdef LINT
c = '\n'; p=n;
BIO_write(cb->arg, &c, 1); #endif
(void)BIO_flush(cb->arg); }
# ifdef LINT #else /* !OPENSSL_NO_RSA */
p = n;
# endif
return 1;
}
#else /* !OPENSSL_NO_RSA */
# if PEDANTIC # if PEDANTIC
static void *dummy = &dummy; static void *dummy=&dummy;
# endif # endif
#endif #endif

View File

@ -1,107 +0,0 @@
$! INSTALL.COM -- Installs the files in a given directory tree
$!
$! Author: Richard Levitte <richard@levitte.org>
$! Time of creation: 22-MAY-1998 10:13
$!
$! P1 root of the directory tree
$! P2 "64" for 64-bit pointers.
$!
$!
$! Announce/identify.
$!
$ proc = f$environment( "procedure")
$ write sys$output "@@@ "+ -
f$parse( proc, , , "name")+ f$parse( proc, , , "type")
$!
$ on error then goto tidy
$ on control_c then goto tidy
$!
$ if (p1 .eqs. "")
$ then
$ write sys$output "First argument missing."
$ write sys$output -
"It should be the directory where you want things installed."
$ exit
$ endif
$!
$ if (f$getsyi("cpu") .lt. 128)
$ then
$ arch = "VAX"
$ else
$ arch = f$edit( f$getsyi( "arch_name"), "upcase")
$ if (arch .eqs. "") then arch = "UNK"
$ endif
$!
$ archd = arch
$!
$ if (p2 .nes. "")
$ then
$ if (p2 .eqs. "64")
$ then
$ archd = arch+ "_64"
$ else
$ if (p2 .nes. "32")
$ then
$ write sys$output "Second argument invalid."
$ write sys$output "It should be "32", "64", or nothing."
$ exit
$ endif
$ endif
$ endif
$!
$ root = f$parse( p1, "[]A.;0", , , "syntax_only, no_conceal") - "A.;0"
$ root_dev = f$parse(root,,,"device","syntax_only")
$ root_dir = f$parse(root,,,"directory","syntax_only") - -
"[000000." - "][" - "[" - "]"
$ root = root_dev + "[" + root_dir
$!
$ define /nolog wrk_sslroot 'root'.] /trans=conc
$ define /nolog wrk_sslxexe wrk_sslroot:['archd'_exe]
$!
$ if f$parse("wrk_sslroot:[000000]") .eqs. "" then -
create /directory /log wrk_sslroot:[000000]
$ if f$parse("wrk_sslxexe:") .eqs. "" then -
create /directory /log wrk_sslxexe:
$!
$ exe := openssl
$!
$ exe_dir := [-.'archd'.exe.apps]
$!
$! Executables.
$!
$ i = 0
$ loop_exe:
$ e = f$edit(f$element( i, ",", exe), "trim")
$ i = i + 1
$ if e .eqs. "," then goto loop_exe_end
$ set noon
$ file = exe_dir+ e+ ".exe"
$ if f$search( file) .nes. ""
$ then
$ copy /protection = w:re 'file' wrk_sslxexe: /log
$ endif
$ set on
$ goto loop_exe
$ loop_exe_end:
$!
$! Miscellaneous.
$!
$ set noon
$ copy /protection = w:re ca.com wrk_sslxexe:ca.com /log
$ copy /protection = w:re openssl-vms.cnf wrk_sslroot:[000000]openssl.cnf /log
$ set on
$!
$ tidy:
$!
$ call deass wrk_sslroot
$ call deass wrk_sslxexe
$!
$ exit
$!
$ deass: subroutine
$ if (f$trnlnm( p1, "LNM$PROCESS") .nes. "")
$ then
$ deassign /process 'p1'
$ endif
$ endsubroutine
$!

69
apps/install.com Normal file
View File

@ -0,0 +1,69 @@
$! INSTALL.COM -- Installs the files in a given directory tree
$!
$! Author: Richard Levitte <richard@levitte.org>
$! Time of creation: 22-MAY-1998 10:13
$!
$! P1 root of the directory tree
$!
$ IF P1 .EQS. ""
$ THEN
$ WRITE SYS$OUTPUT "First argument missing."
$ WRITE SYS$OUTPUT "Should be the directory where you want things installed."
$ EXIT
$ ENDIF
$
$ ROOT = F$PARSE(P1,"[]A.;0",,,"SYNTAX_ONLY,NO_CONCEAL") - "A.;0"
$ ROOT_DEV = F$PARSE(ROOT,,,"DEVICE","SYNTAX_ONLY")
$ ROOT_DIR = F$PARSE(ROOT,,,"DIRECTORY","SYNTAX_ONLY") -
- "[000000." - "][" - "[" - "]"
$ ROOT = ROOT_DEV + "[" + ROOT_DIR
$
$ DEFINE/NOLOG WRK_SSLROOT 'ROOT'.] /TRANS=CONC
$ DEFINE/NOLOG WRK_SSLVEXE WRK_SSLROOT:[VAX_EXE]
$ DEFINE/NOLOG WRK_SSLAEXE WRK_SSLROOT:[ALPHA_EXE]
$ DEFINE/NOLOG WRK_SSLLIB WRK_SSLROOT:[LIB]
$
$ IF F$PARSE("WRK_SSLROOT:[000000]") .EQS. "" THEN -
CREATE/DIR/LOG WRK_SSLROOT:[000000]
$ IF F$PARSE("WRK_SSLVEXE:") .EQS. "" THEN -
CREATE/DIR/LOG WRK_SSLVEXE:
$ IF F$PARSE("WRK_SSLAEXE:") .EQS. "" THEN -
CREATE/DIR/LOG WRK_SSLAEXE:
$ IF F$PARSE("WRK_SSLLIB:") .EQS. "" THEN -
CREATE/DIR/LOG WRK_SSLLIB:
$
$ EXE := openssl
$
$ VEXE_DIR := [-.VAX.EXE.APPS]
$ AEXE_DIR := [-.AXP.EXE.APPS]
$
$ I = 0
$ LOOP_EXE:
$ E = F$EDIT(F$ELEMENT(I, ",", EXE),"TRIM")
$ I = I + 1
$ IF E .EQS. "," THEN GOTO LOOP_EXE_END
$ SET NOON
$ IF F$SEARCH(VEXE_DIR+E+".EXE") .NES. ""
$ THEN
$ COPY 'VEXE_DIR''E'.EXE WRK_SSLVEXE:'E'.EXE/log
$ SET FILE/PROT=W:RE WRK_SSLVEXE:'E'.EXE
$ ENDIF
$ IF F$SEARCH(AEXE_DIR+E+".EXE") .NES. ""
$ THEN
$ COPY 'AEXE_DIR''E'.EXE WRK_SSLAEXE:'E'.EXE/log
$ SET FILE/PROT=W:RE WRK_SSLAEXE:'E'.EXE
$ ENDIF
$ SET ON
$ GOTO LOOP_EXE
$ LOOP_EXE_END:
$
$ SET NOON
$ COPY CA.COM WRK_SSLAEXE:CA.COM/LOG
$ SET FILE/PROT=W:RE WRK_SSLAEXE:CA.COM
$ COPY CA.COM WRK_SSLVEXE:CA.COM/LOG
$ SET FILE/PROT=W:RE WRK_SSLVEXE:CA.COM
$ COPY OPENSSL-VMS.CNF WRK_SSLROOT:[000000]OPENSSL.CNF/LOG
$ SET FILE/PROT=W:R WRK_SSLROOT:[000000]OPENSSL.CNF
$ SET ON
$
$ EXIT

View File

@ -6,12 +6,11 @@ $! A-Com Computing, Inc.
$! byer@mail.all-net.net $! byer@mail.all-net.net
$! $!
$! Changes by Richard Levitte <richard@levitte.org> $! Changes by Richard Levitte <richard@levitte.org>
$! Zoltan Arpadffy <zoli@polarhome.com>
$! $!
$! This command files compiles and creates all the various different $! This command files compiles and creates all the various different
$! "application" programs for the different types of encryption for OpenSSL. $! "application" programs for the different types of encryption for OpenSSL.
$! The EXE's are placed in the directory [.xxx.EXE.APPS] where "xxx" denotes $! The EXE's are placed in the directory [.xxx.EXE.APPS] where "xxx" denotes
$! ALPHA, IA64 or VAX, depending on your machine architecture. $! either AXP or VAX depending on your machine architecture.
$! $!
$! It was written so it would try to determine what "C" compiler to $! It was written so it would try to determine what "C" compiler to
$! use or you can specify which "C" compiler to use. $! use or you can specify which "C" compiler to use.
@ -25,7 +24,7 @@ $! VAXC For VAX C.
$! DECC For DEC C. $! DECC For DEC C.
$! GNUC For GNU C. $! GNUC For GNU C.
$! $!
$! If you don't specify a compiler, it will try to determine which $! If you don't speficy a compiler, it will try to determine which
$! "C" compiler to use. $! "C" compiler to use.
$! $!
$! P3, if defined, sets a TCP/IP library to use, through one of the following $! P3, if defined, sets a TCP/IP library to use, through one of the following
@ -39,105 +38,64 @@ $! P4, if defined, sets a compiler thread NOT needed on OpenVMS 7.1 (and up)
$! $!
$! P5, if defined, sets a choice of programs to compile. $! P5, if defined, sets a choice of programs to compile.
$! $!
$! P6, if defined, specifies the C pointer size. Ignored on VAX.
$! ("64=ARGV" gives more efficient code with HP C V7.3 or newer.)
$! Supported values are:
$!
$! "" Compile with default (/NOPOINTER_SIZE)
$! 32 Compile with /POINTER_SIZE=32 (SHORT)
$! 64 Compile with /POINTER_SIZE=64[=ARGV] (LONG[=ARGV])
$! (Automatically select ARGV if compiler supports it.)
$! 64= Compile with /POINTER_SIZE=64 (LONG).
$! 64=ARGV Compile with /POINTER_SIZE=64=ARGV (LONG=ARGV).
$!
$! P7, if defined, specifies a directory where ZLIB files (zlib.h,
$! libz.olb) may be found. Optionally, a non-default object library
$! name may be included ("dev:[dir]libz_64.olb", for example).
$!
$!
$! Announce/identify.
$!
$ proc = f$environment( "procedure")
$ write sys$output "@@@ "+ -
f$parse( proc, , , "name")+ f$parse( proc, , , "type")
$!
$ on control_c then goto exit
$! $!
$! Define A TCP/IP Library That We Will Need To Link To. $! Define A TCP/IP Library That We Will Need To Link To.
$! (That Is, If We Need To Link To One.) $! (That Is, If We Need To Link To One.)
$! $!
$ TCPIP_LIB = "" $ TCPIP_LIB = ""
$ ZLIB_LIB = ""
$! $!
$! Check What Architecture We Are Using. $! Check What Architecture We Are Using.
$! $!
$ IF (F$GETSYI("CPU").LT.128) $ IF (F$GETSYI("CPU").GE.128)
$ THEN $ THEN
$! $!
$! The Architecture Is VAX. $! The Architecture Is AXP.
$! $!
$ ARCH = "VAX" $ ARCH := AXP
$! $!
$! Else... $! Else...
$! $!
$ ELSE $ ELSE
$! $!
$! The Architecture Is Alpha, IA64 or whatever comes in the future. $! The Architecture Is VAX.
$! $!
$ ARCH = F$EDIT( F$GETSYI( "ARCH_NAME"), "UPCASE") $ ARCH := VAX
$ IF (ARCH .EQS. "") THEN ARCH = "UNK"
$! $!
$! End The Architecture Check. $! End The Architecture Check.
$! $!
$ ENDIF $ ENDIF
$! $!
$ ARCHD = ARCH
$ LIB32 = "32"
$ OPT_FILE = ""
$ POINTER_SIZE = ""
$!
$! Define what programs should be compiled $! Define what programs should be compiled
$! $!
$ PROGRAMS := OPENSSL $ PROGRAMS := OPENSSL
$!$ PROGRAMS := VERIFY,ASN1PARS,REQ,DGST,DH,ENC,PASSWD,GENDH,ERRSTR,CA,CRL,-
$! RSA,DSA,DSAPARAM,-
$! X509,GENRSA,GENDSA,S_SERVER,S_CLIENT,SPEED,-
$! S_TIME,VERSION,PKCS7,CRL2P7,SESS_ID,CIPHERS,NSEQ,
$! $!
$! Check To Make Sure We Have Valid Command Line Parameters. $! Check To Make Sure We Have Valid Command Line Parameters.
$! $!
$ GOSUB CHECK_OPTIONS $ GOSUB CHECK_OPTIONS
$! $!
$! Define The CRYPTO Library.
$!
$ CRYPTO_LIB := SYS$DISK:[-.'ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO'LIB32'.OLB
$!
$! Define The SSL Library.
$!
$ SSL_LIB := SYS$DISK:[-.'ARCHD'.EXE.SSL]SSL_LIBSSL'LIB32'.OLB
$!
$! Define The OBJ and EXE Directories.
$!
$ OBJ_DIR := SYS$DISK:[-.'ARCHD'.OBJ.APPS]
$ EXE_DIR := SYS$DISK:[-.'ARCHD'.EXE.APPS]
$!
$! Specify the destination directory in any /MAP option.
$!
$ if (LINKMAP .eqs. "MAP")
$ then
$ LINKMAP = LINKMAP+ "=''EXE_DIR'"
$ endif
$!
$! Add the location prefix to the linker options file name.
$!
$ if (OPT_FILE .nes. "")
$ then
$ OPT_FILE = EXE_DIR+ OPT_FILE
$ endif
$!
$! Initialise logical names and such $! Initialise logical names and such
$! $!
$ GOSUB INITIALISE $ GOSUB INITIALISE
$! $!
$! Tell The User What Kind of Machine We Run On. $! Tell The User What Kind of Machine We Run On.
$! $!
$ WRITE SYS$OUTPUT "Host system architecture: ''ARCHD'" $ WRITE SYS$OUTPUT "Compiling On A ",ARCH," Machine."
$!
$! Define The CRYPTO Library.
$!
$ CRYPTO_LIB := SYS$DISK:[-.'ARCH'.EXE.CRYPTO]LIBCRYPTO.OLB
$!
$! Define The SSL Library.
$!
$ SSL_LIB := SYS$DISK:[-.'ARCH'.EXE.SSL]LIBSSL.OLB
$!
$! Define The OBJ Directory.
$!
$ OBJ_DIR := SYS$DISK:[-.'ARCH'.OBJ.APPS]
$! $!
$! Check To See If The OBJ Directory Exists. $! Check To See If The OBJ Directory Exists.
$! $!
@ -152,6 +110,10 @@ $! End The OBJ Directory Check.
$! $!
$ ENDIF $ ENDIF
$! $!
$! Define The EXE Directory.
$!
$ EXE_DIR := SYS$DISK:[-.'ARCH'.EXE.APPS]
$!
$! Check To See If The EXE Directory Exists. $! Check To See If The EXE Directory Exists.
$! $!
$ IF (F$PARSE(EXE_DIR).EQS."") $ IF (F$PARSE(EXE_DIR).EQS."")
@ -174,184 +136,182 @@ $!
$ GOSUB CHECK_OPT_FILE $ GOSUB CHECK_OPT_FILE
$! $!
$! Define The Application Files. $! Define The Application Files.
$! NOTE: Some might think this list ugly. However, it's made this way to
$! reflect the E_OBJ variable in Makefile as closely as possible, thereby
$! making it fairly easy to verify that the lists are the same.
$!
$ LIB_OPENSSL = "VERIFY,ASN1PARS,REQ,DGST,DH,DHPARAM,ENC,PASSWD,GENDH,ERRSTR,"+-
"CA,PKCS7,CRL2P7,CRL,"+-
"RSA,RSAUTL,DSA,DSAPARAM,EC,ECPARAM,"+-
"X509,GENRSA,GENDSA,GENPKEY,S_SERVER,S_CLIENT,SPEED,"+-
"S_TIME,APPS,S_CB,S_SOCKET,APP_RAND,VERSION,SESS_ID,"+-
"CIPHERS,NSEQ,PKCS12,PKCS8,PKEY,PKEYPARAM,PKEYUTL,"+ -
"SPKAC,SMIME,CMS,RAND,ENGINE,OCSP,PRIME,TS,SRP"
$!
$ LIB_OPENSSL = LIB_OPENSSL+ ",VMS_DECC_INIT"
$! $!
$ LIB_FILES = "VERIFY;ASN1PARS;REQ;DGST;DH;DHPARAM;ENC;PASSWD;GENDH;ERRSTR;"+-
"CA;PKCS7;CRL2P7;CRL;"+-
"RSA;RSAUTL;DSA;DSAPARAM;"+-
"X509;GENRSA;GENDSA;S_SERVER;S_CLIENT;SPEED;"+-
"S_TIME;APPS;S_CB;S_SOCKET;APP_RAND;VERSION;SESS_ID;"+-
"CIPHERS;NSEQ;PKCS12;PKCS8;SPKAC;SMIME;RAND;ENGINE;OCSP"
$ APP_FILES := OPENSSL,'OBJ_DIR'VERIFY.OBJ,ASN1PARS.OBJ,REQ.OBJ,DGST.OBJ,DH.OBJ,DHPARAM.OBJ,ENC.OBJ,PASSWD.OBJ,GENDH.OBJ,ERRSTR.OBJ,-
CA.OBJ,PKCS7.OBJ,CRL2P7.OBJ,CRL.OBJ,-
RSA.OBJ,RSAUTL.OBJ,DSA.OBJ,DSAPARAM.OBJ,-
X509.OBJ,GENRSA.OBJ,GENDSA.OBJ,S_SERVER.OBJ,S_CLIENT.OBJ,SPEED.OBJ,-
S_TIME.OBJ,APPS.OBJ,S_CB.OBJ,S_SOCKET.OBJ,APP_RAND.OBJ,VERSION.OBJ,SESS_ID.OBJ,-
CIPHERS.OBJ,NSEQ.OBJ,PKCS12.OBJ,PKCS8.OBJ,SPKAC.OBJ,SMIME.OBJ,RAND.OBJ,ENGINE.OBJ,OCSP.OBJ
$ TCPIP_PROGRAMS = ",," $ TCPIP_PROGRAMS = ",,"
$ IF COMPILER .EQS. "VAXC" THEN - $ IF COMPILER .EQS. "VAXC" THEN -
TCPIP_PROGRAMS = ",OPENSSL," TCPIP_PROGRAMS = ",OPENSSL,"
$!$ APP_FILES := VERIFY;ASN1PARS;REQ;DGST;DH;ENC;GENDH;ERRSTR;CA;-
$! PKCS7;CRL2P7;CRL;-
$! RSA;DSA;DSAPARAM;-
$! X509;GENRSA;GENDSA;-
$! S_SERVER,'OBJ_DIR'S_SOCKET.OBJ,'OBJ_DIR'S_CB.OBJ;-
$! S_CLIENT,'OBJ_DIR'S_SOCKET.OBJ,'OBJ_DIR'S_CB.OBJ;-
$! SPEED;-
$! S_TIME,'OBJ_DIR'S_CB.OBJ;VERSION;SESS_ID;CIPHERS;NSEQ
$!$ TCPIP_PROGRAMS = ",,"
$!$ IF COMPILER .EQS. "VAXC" THEN -
$! TCPIP_PROGRAMS = ",S_SERVER,S_CLIENT,SESS_ID,CIPHERS,S_TIME,"
$! $!
$! Setup exceptional compilations $! Setup exceptional compilations
$! $!
$ COMPILEWITH_CC2 = ",S_SOCKET,S_SERVER,S_CLIENT," $ COMPILEWITH_CC2 = ",S_SERVER,S_CLIENT,"
$! $!
$ PHASE := LIB $ PHASE := LIB
$! $!
$ RESTART: $ RESTART:
$! $!
$! Define An App Counter And Set It To "0". $! Define A File Counter And Set It To "0".
$! $!
$ APP_COUNTER = 0 $ FILE_COUNTER = 0
$! $!
$! Top Of The App Loop. $! Top Of The File Loop.
$! $!
$ NEXT_APP: $ NEXT_FILE:
$! $!
$! Make The Application File Name $! O.K, Extract The File Name From The File List.
$! $!
$ CURRENT_APP = F$EDIT(F$ELEMENT(APP_COUNTER,",",PROGRAMS),"TRIM") $ FILE_NAME0 = F$EDIT(F$ELEMENT(FILE_COUNTER,";",'PHASE'_FILES),"TRIM")
$ FILE_NAME = F$EDIT(F$ELEMENT(0,",",FILE_NAME0),"TRIM")
$ EXTRA_OBJ = FILE_NAME0 - FILE_NAME
$! $!
$! Create The Executable File Name. $! Check To See If We Are At The End Of The File List.
$! $!
$ EXE_FILE = EXE_DIR + CURRENT_APP + ".EXE" $ IF (FILE_NAME0.EQS.";")
$!
$! Check To See If We Are At The End Of The File List.
$!
$ IF (CURRENT_APP.EQS.",")
$ THEN $ THEN
$ IF (PHASE.EQS."LIB") $ IF (PHASE.EQS."LIB")
$ THEN $ THEN
$ PHASE := APP $ PHASE := APP
$ GOTO RESTART $ GOTO RESTART
$ ELSE $ ELSE
$ GOTO APP_DONE $ GOTO FILE_DONE
$ ENDIF $ ENDIF
$ ENDIF $ ENDIF
$! $!
$! Increment The Counter. $! Increment The Counter.
$! $!
$ APP_COUNTER = APP_COUNTER + 1 $ FILE_COUNTER = FILE_COUNTER + 1
$! $!
$! Decide if we're building the object files or not. $! Check to see if this program should actually be compiled
$!
$ IF PHASE .EQS. "APP" .AND. -
","+PROGRAMS+"," - (","+F$EDIT(FILE_NAME,"UPCASE")+",") .EQS. ","+PROGRAMS+","
$ THEN
$ GOTO NEXT_FILE
$ ENDIF
$!
$! Create The Source File Name.
$!
$ SOURCE_FILE = "SYS$DISK:[]" + FILE_NAME + ".C"
$!
$! Create The Object File Name.
$!
$ OBJECT_FILE = OBJ_DIR + FILE_NAME + ".OBJ"
$!
$! Create The Executable File Name.
$!
$ EXE_FILE = EXE_DIR + FILE_NAME + ".EXE"
$ ON WARNING THEN GOTO NEXT_FILE
$!
$! Check To See If The File We Want To Compile Actually Exists.
$!
$ IF (F$SEARCH(SOURCE_FILE).EQS."")
$ THEN
$!
$! Tell The User That The File Dosen't Exist.
$!
$ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT "The File ",SOURCE_FILE," Dosen't Exist."
$ WRITE SYS$OUTPUT ""
$!
$! Exit The Build.
$!
$ GOTO EXIT
$!
$! End The File Exist Check.
$!
$ ENDIF
$!
$! Tell The User What We Are Building.
$! $!
$ IF (PHASE.EQS."LIB") $ IF (PHASE.EQS."LIB")
$ THEN $ THEN
$ WRITE SYS$OUTPUT "Compiling The ",FILE_NAME,".C File."
$ ELSE
$ WRITE SYS$OUTPUT "Building The ",FILE_NAME," Application Program."
$ ENDIF
$! $!
$! Define A Library File Counter And Set It To "-1". $! Compile The File.
$! -1 Means The Application File Name Is To Be Used.
$! $!
$ LIB_COUNTER = -1 $ ON ERROR THEN GOTO NEXT_FILE
$ IF COMPILEWITH_CC2 - FILE_NAME .NES. COMPILEWITH_CC2
$ THEN
$ CC2/OBJECT='OBJECT_FILE' 'SOURCE_FILE'
$ ELSE
$ CC/OBJECT='OBJECT_FILE' 'SOURCE_FILE'
$ ENDIF
$! $!
$! Create a .OPT file for the object files $ ON WARNING THEN GOTO NEXT_FILE
$! $!
$ OPEN /WRITE OBJECTS 'EXE_DIR''CURRENT_APP'.OPT $ IF (PHASE.EQS."LIB")
$! $ THEN
$! Top Of The File Loop. $ GOTO NEXT_FILE
$!
$ NEXT_LIB:
$!
$! O.K, Extract The File Name From The File List.
$!
$ IF LIB_COUNTER .GE. 0
$ THEN
$ FILE_NAME = F$EDIT(F$ELEMENT(LIB_COUNTER,",",LIB_'CURRENT_APP'),"TRIM")
$ ELSE
$ FILE_NAME = CURRENT_APP
$ ENDIF
$!
$! Check To See If We Are At The End Of The File List.
$!
$ IF (FILE_NAME.EQS.",")
$ THEN
$ CLOSE OBJECTS
$ GOTO NEXT_APP
$ ENDIF
$!
$! Increment The Counter.
$!
$ LIB_COUNTER = LIB_COUNTER + 1
$!
$! Create The Source File Name.
$!
$ SOURCE_FILE = "SYS$DISK:[]" + FILE_NAME + ".C"
$!
$! Create The Object File Name.
$!
$ OBJECT_FILE = OBJ_DIR + FILE_NAME + ".OBJ"
$ ON WARNING THEN GOTO NEXT_LIB
$!
$! Check To See If The File We Want To Compile Actually Exists.
$!
$ IF (F$SEARCH(SOURCE_FILE).EQS."")
$ THEN
$!
$! Tell The User That The File Dosen't Exist.
$!
$ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT "The File ",SOURCE_FILE," Dosen't Exist."
$ WRITE SYS$OUTPUT ""
$!
$! Exit The Build.
$!
$ GOTO EXIT
$!
$! End The File Exist Check.
$!
$ ENDIF
$!
$! Tell The User What We Are Building.
$!
$ IF (PHASE.EQS."LIB")
$ THEN
$ WRITE SYS$OUTPUT "Compiling The ",FILE_NAME,".C File."
$ ELSE
$ WRITE SYS$OUTPUT "Building The ",FILE_NAME," Application Program."
$ ENDIF
$!
$! Compile The File.
$!
$ ON ERROR THEN GOTO NEXT_LIB
$ IF COMPILEWITH_CC2 - FILE_NAME .NES. COMPILEWITH_CC2
$ THEN
$ CC2/OBJECT='OBJECT_FILE' 'SOURCE_FILE'
$ ELSE
$ CC/OBJECT='OBJECT_FILE' 'SOURCE_FILE'
$ ENDIF
$ WRITE OBJECTS OBJECT_FILE
$!
$ GOTO NEXT_LIB
$ ENDIF $ ENDIF
$! $!
$! Check if this program works well without a TCPIP library $! Check if this program works well without a TCPIP library
$! $!
$ IF TCPIP_LIB .EQS. "" .AND. TCPIP_PROGRAMS - CURRENT_APP .NES. TCPIP_PROGRAMS $ IF TCPIP_LIB .EQS. "" .AND. TCPIP_PROGRAMS - FILE_NAME .NES. TCPIP_PROGRAMS
$ THEN $ THEN
$ WRITE SYS$OUTPUT CURRENT_APP," needs a TCP/IP library. Can't link. Skipping..." $ WRITE SYS$OUTPUT FILE_NAME," needs a TCP/IP library. Can't link. Skipping..."
$ GOTO NEXT_APP $ GOTO NEXT_FILE
$ ENDIF $ ENDIF
$! $!
$! Link The Program. $! Link The Program.
$! Check To See If We Are To Link With A Specific TCP/IP Library.
$! $!
$ ON WARNING THEN GOTO NEXT_APP $ IF (TCPIP_LIB.NES."")
$ THEN
$! $!
$! Don't Link With The RSAREF Routines And TCP/IP Library. $! Don't Link With The RSAREF Routines And TCP/IP Library.
$! $!
$ LINK /'DEBUGGER' /'LINKMAP' /'TRACEBACK' /EXE='EXE_FILE' - $ LINK/'DEBUGGER'/'TRACEBACK' /EXE='EXE_FILE' -
'EXE_DIR''CURRENT_APP'.OPT /OPTIONS, - 'OBJECT_FILE''EXTRA_OBJ', -
'SSL_LIB' /LIBRARY, - 'SSL_LIB'/LIBRARY,'CRYPTO_LIB'/LIBRARY, -
'CRYPTO_LIB' /LIBRARY - 'TCPIP_LIB','OPT_FILE'/OPTION
'TCPIP_LIB' - $!
'ZLIB_LIB' - $! Else...
,'OPT_FILE' /OPTIONS $!
$ ELSE
$!
$! Don't Link With The RSAREF Routines And Link With A TCP/IP Library.
$!
$ LINK/'DEBUGGER'/'TRACEBACK' /EXE='EXE_FILE' -
'OBJECT_FILE''EXTRA_OBJ', -
'SSL_LIB'/LIBRARY,'CRYPTO_LIB'/LIBRARY, -
'OPT_FILE'/OPTION
$!
$! End The TCP/IP Library Check.
$!
$ ENDIF
$! $!
$! Go Back And Do It Again. $! Go Back And Do It Again.
$! $!
$ GOTO NEXT_APP $ GOTO NEXT_FILE
$! $!
$! All Done With This File. $! All Done With This File.
$! $!
$ APP_DONE: $ FILE_DONE:
$ EXIT: $ EXIT:
$! $!
$! All Done, Time To Clean Up And Exit. $! All Done, Time To Clean Up And Exit.
@ -378,7 +338,7 @@ $!
$ CREATE 'OPT_FILE' $ CREATE 'OPT_FILE'
$DECK $DECK
! !
! Default System Options File To Link Against ! Default System Options File To Link Agianst
! The Sharable VAX C Runtime Library. ! The Sharable VAX C Runtime Library.
! !
SYS$SHARE:VAXCRTL.EXE/SHARE SYS$SHARE:VAXCRTL.EXE/SHARE
@ -407,7 +367,7 @@ $!
$ CREATE 'OPT_FILE' $ CREATE 'OPT_FILE'
$DECK $DECK
! !
! Default System Options File To Link Against ! Default System Options File To Link Agianst
! The Sharable C Runtime Library. ! The Sharable C Runtime Library.
! !
GNU_CC:[000000]GCCLIB/LIBRARY GNU_CC:[000000]GCCLIB/LIBRARY
@ -442,7 +402,7 @@ $!
$ CREATE 'OPT_FILE' $ CREATE 'OPT_FILE'
$DECK $DECK
! !
! Default System Options File To Link Against ! Default System Options File To Link Agianst
! The Sharable DEC C Runtime Library. ! The Sharable DEC C Runtime Library.
! !
SYS$SHARE:DECC$SHR.EXE/SHARE SYS$SHARE:DECC$SHR.EXE/SHARE
@ -452,19 +412,19 @@ $! Else...
$! $!
$ ELSE $ ELSE
$! $!
$! Create The non-VAX Linker Option File. $! Create The AXP Linker Option File.
$! $!
$ CREATE 'OPT_FILE' $ CREATE 'OPT_FILE'
$DECK $DECK
! !
! Default System Options File For non-VAX To Link Against ! Default System Options File For AXP To Link Agianst
! The Sharable C Runtime Library. ! The Sharable C Runtime Library.
! !
SYS$SHARE:CMA$OPEN_LIB_SHR/SHARE SYS$SHARE:CMA$OPEN_LIB_SHR/SHARE
SYS$SHARE:CMA$OPEN_RTL/SHARE SYS$SHARE:CMA$OPEN_RTL/SHARE
$EOD $EOD
$! $!
$! End The DEC C Option File Check. $! End The VAX/AXP DEC C Option File Check.
$! $!
$ ENDIF $ ENDIF
$! $!
@ -541,15 +501,14 @@ $!
$ IF (P1.EQS."NODEBUG") $ IF (P1.EQS."NODEBUG")
$ THEN $ THEN
$! $!
$! P1 Is NODEBUG, So Compile Without Debugger Information. $! P1 Is NODEBUG, So Compile Without Debugger Information.
$! $!
$ DEBUGGER = "NODEBUG" $ DEBUGGER = "NODEBUG"
$ LINKMAP = "NOMAP" $ TRACEBACK = "NOTRACEBACK"
$ TRACEBACK = "NOTRACEBACK" $ GCC_OPTIMIZE = "OPTIMIZE"
$ GCC_OPTIMIZE = "OPTIMIZE" $ CC_OPTIMIZE = "OPTIMIZE"
$ CC_OPTIMIZE = "OPTIMIZE" $ WRITE SYS$OUTPUT "No Debugger Information Will Be Produced During Compile."
$ WRITE SYS$OUTPUT "No Debugger Information Will Be Produced During Compile." $ WRITE SYS$OUTPUT "Compiling With Compiler Optimization."
$ WRITE SYS$OUTPUT "Compiling With Compiler Optimization."
$! $!
$! Else... $! Else...
$! $!
@ -563,7 +522,6 @@ $!
$! Compile With Debugger Information. $! Compile With Debugger Information.
$! $!
$ DEBUGGER = "DEBUG" $ DEBUGGER = "DEBUG"
$ LINKMAP = "MAP"
$ TRACEBACK = "TRACEBACK" $ TRACEBACK = "TRACEBACK"
$ GCC_OPTIMIZE = "NOOPTIMIZE" $ GCC_OPTIMIZE = "NOOPTIMIZE"
$ CC_OPTIMIZE = "NOOPTIMIZE" $ CC_OPTIMIZE = "NOOPTIMIZE"
@ -571,7 +529,7 @@ $ WRITE SYS$OUTPUT "Debugger Information Will Be Produced During Compile."
$ WRITE SYS$OUTPUT "Compiling Without Compiler Optimization." $ WRITE SYS$OUTPUT "Compiling Without Compiler Optimization."
$ ELSE $ ELSE
$! $!
$! Tell The User Entered An Invalid Option. $! Tell The User Entered An Invalid Option..
$! $!
$ WRITE SYS$OUTPUT "" $ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT "The Option ",P1," Is Invalid. The Valid Options Are:" $ WRITE SYS$OUTPUT "The Option ",P1," Is Invalid. The Valid Options Are:"
@ -584,7 +542,7 @@ $! Time To EXIT.
$! $!
$ EXIT $ EXIT
$! $!
$! End The Valid Argument Check. $! End The Valid Arguement Check.
$! $!
$ ENDIF $ ENDIF
$! $!
@ -592,87 +550,6 @@ $! End The P1 Check.
$! $!
$ ENDIF $ ENDIF
$! $!
$! Check P6 (POINTER_SIZE).
$!
$ IF (P6 .NES. "") .AND. (ARCH .NES. "VAX")
$ THEN
$!
$ IF (P6 .EQS. "32")
$ THEN
$ POINTER_SIZE = " /POINTER_SIZE=32"
$ ELSE
$ POINTER_SIZE = F$EDIT( P6, "COLLAPSE, UPCASE")
$ IF ((POINTER_SIZE .EQS. "64") .OR. -
(POINTER_SIZE .EQS. "64=") .OR. -
(POINTER_SIZE .EQS. "64=ARGV"))
$ THEN
$ ARCHD = ARCH+ "_64"
$ LIB32 = ""
$ IF (F$EXTRACT( 2, 1, POINTER_SIZE) .EQS. "=")
$ THEN
$! Explicit user choice: "64" or "64=ARGV".
$ IF (POINTER_SIZE .EQS. "64=") THEN POINTER_SIZE = "64"
$ ELSE
$ SET NOON
$ DEFINE /USER_MODE SYS$OUTPUT NL:
$ DEFINE /USER_MODE SYS$ERROR NL:
$ CC /NOLIST /NOOBJECT /POINTER_SIZE=64=ARGV NL:
$ IF ($STATUS .AND. %X0FFF0000) .EQ. %X00030000
$ THEN
$ ! If we got here, it means DCL complained like this:
$ ! %DCL-W-NOVALU, value not allowed - remove value specification
$ ! \64=\
$ !
$ ! If the compiler was run, logicals defined in /USER would
$ ! have been deassigned automatically. However, when DCL
$ ! complains, they aren't, so we do it here (it might be
$ ! unnecessary, but just in case there will be another error
$ ! message further on that we don't want to miss)
$ DEASSIGN /USER_MODE SYS$ERROR
$ DEASSIGN /USER_MODE SYS$OUTPUT
$ ELSE
$ POINTER_SIZE = POINTER_SIZE + "=ARGV"
$ ENDIF
$ SET ON
$ ENDIF
$ POINTER_SIZE = " /POINTER_SIZE=''POINTER_SIZE'"
$!
$ ELSE
$!
$! Tell The User Entered An Invalid Option.
$!
$ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT "The Option ", P6, -
" Is Invalid. The Valid Options Are:"
$ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT -
" """" : Compile with default (short) pointers."
$ WRITE SYS$OUTPUT -
" 32 : Compile with 32-bit (short) pointers."
$ WRITE SYS$OUTPUT -
" 64 : Compile with 64-bit (long) pointers (auto ARGV)."
$ WRITE SYS$OUTPUT -
" 64= : Compile with 64-bit (long) pointers (no ARGV)."
$ WRITE SYS$OUTPUT -
" 64=ARGV : Compile with 64-bit (long) pointers (ARGV)."
$ WRITE SYS$OUTPUT ""
$!
$! Time To EXIT.
$!
$ EXIT
$!
$ ENDIF
$!
$ ENDIF
$!
$! End The P6 (POINTER_SIZE) Check.
$!
$ ENDIF
$!
$! Set basic C compiler /INCLUDE directories.
$!
$ CC_INCLUDES = "SYS$DISK:[-],SYS$DISK:[-.CRYPTO]"
$!
$! Check To See If P2 Is Blank. $! Check To See If P2 Is Blank.
$! $!
$ IF (P2.EQS."") $ IF (P2.EQS."")
@ -696,7 +573,7 @@ $ ELSE
$! $!
$! Check To See If We Have VAXC Or DECC. $! Check To See If We Have VAXC Or DECC.
$! $!
$ IF (ARCH.NES."VAX").OR.(F$TRNLNM("DECC$CC_DEFAULT").NES."") $ IF (ARCH.EQS."AXP").OR.(F$TRNLNM("DECC$CC_DEFAULT").NES."")
$ THEN $ THEN
$! $!
$! Looks Like DECC, Set To Use DECC. $! Looks Like DECC, Set To Use DECC.
@ -773,67 +650,11 @@ $ CCDEFS = "MONOLITH"
$ IF F$TYPE(USER_CCDEFS) .NES. "" THEN CCDEFS = CCDEFS + "," + USER_CCDEFS $ IF F$TYPE(USER_CCDEFS) .NES. "" THEN CCDEFS = CCDEFS + "," + USER_CCDEFS
$ CCEXTRAFLAGS = "" $ CCEXTRAFLAGS = ""
$ IF F$TYPE(USER_CCFLAGS) .NES. "" THEN CCEXTRAFLAGS = USER_CCFLAGS $ IF F$TYPE(USER_CCFLAGS) .NES. "" THEN CCEXTRAFLAGS = USER_CCFLAGS
$ CCDISABLEWARNINGS = "" !!! "MAYLOSEDATA3" !!! "LONGLONGTYPE,LONGLONGSUFX,FOUNDCR" $ CCDISABLEWARNINGS = "LONGLONGTYPE,LONGLONGSUFX"
$ IF F$TYPE(USER_CCDISABLEWARNINGS) .NES. "" $ IF F$TYPE(USER_CCDISABLEWARNINGS) .NES. "" THEN -
$ THEN CCDISABLEWARNINGS = CCDISABLEWARNINGS + "," + USER_CCDISABLEWARNINGS
$ IF CCDISABLEWARNINGS .NES. "" THEN CCDISABLEWARNINGS = CCDISABLEWARNINGS + ","
$ CCDISABLEWARNINGS = CCDISABLEWARNINGS + USER_CCDISABLEWARNINGS
$ ENDIF
$! $!
$! Check To See If We Have A ZLIB Option. $! Check To See If The User Entered A Valid Paramter.
$!
$ ZLIB = P7
$ IF (ZLIB .NES. "")
$ THEN
$!
$! Check for expected ZLIB files.
$!
$ err = 0
$ file1 = f$parse( "zlib.h", ZLIB, , , "SYNTAX_ONLY")
$ if (f$search( file1) .eqs. "")
$ then
$ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT "The Option ", ZLIB, " Is Invalid."
$ WRITE SYS$OUTPUT " Can't find header: ''file1'"
$ err = 1
$ endif
$ file1 = f$parse( "A.;", ZLIB)- "A.;"
$!
$ file2 = f$parse( ZLIB, "libz.olb", , , "SYNTAX_ONLY")
$ if (f$search( file2) .eqs. "")
$ then
$ if (err .eq. 0)
$ then
$ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT "The Option ", ZLIB, " Is Invalid."
$ endif
$ WRITE SYS$OUTPUT " Can't find library: ''file2'"
$ WRITE SYS$OUTPUT ""
$ err = err+ 2
$ endif
$ if (err .eq. 1)
$ then
$ WRITE SYS$OUTPUT ""
$ endif
$!
$ if (err .ne. 0)
$ then
$ EXIT
$ endif
$!
$ CCDEFS = """ZLIB=1"", "+ CCDEFS
$ CC_INCLUDES = CC_INCLUDES+ ", "+ file1
$ ZLIB_LIB = ", ''file2' /library"
$!
$! Print info
$!
$ WRITE SYS$OUTPUT "ZLIB library spec: ", file2
$!
$! End The ZLIB Check.
$!
$ ENDIF
$!
$! Check To See If The User Entered A Valid Parameter.
$! $!
$ IF (P2.EQS."VAXC").OR.(P2.EQS."DECC").OR.(P2.EQS."GNUC") $ IF (P2.EQS."VAXC").OR.(P2.EQS."DECC").OR.(P2.EQS."GNUC")
$ THEN $ THEN
@ -856,13 +677,13 @@ $!
$ CC = "CC" $ CC = "CC"
$ IF ARCH.EQS."VAX" .AND. F$TRNLNM("DECC$CC_DEFAULT").NES."/DECC" - $ IF ARCH.EQS."VAX" .AND. F$TRNLNM("DECC$CC_DEFAULT").NES."/DECC" -
THEN CC = "CC/DECC" THEN CC = "CC/DECC"
$ CC = CC + " /''CC_OPTIMIZE' /''DEBUGGER' /STANDARD=RELAXED"+ - $ CC = CC + "/''CC_OPTIMIZE'/''DEBUGGER'/STANDARD=ANSI89" + -
"''POINTER_SIZE' /NOLIST /PREFIX=ALL" + - "/NOLIST/PREFIX=ALL" + -
" /INCLUDE=(''CC_INCLUDES') " + CCEXTRAFLAGS "/INCLUDE=(SYS$DISK:[-])" + CCEXTRAFLAGS
$! $!
$! Define The Linker Options File Name. $! Define The Linker Options File Name.
$! $!
$ OPT_FILE = "VAX_DECC_OPTIONS.OPT" $ OPT_FILE = "SYS$DISK:[]VAX_DECC_OPTIONS.OPT"
$! $!
$! End DECC Check. $! End DECC Check.
$! $!
@ -883,14 +704,14 @@ $!
$! Compile Using VAXC. $! Compile Using VAXC.
$! $!
$ CC = "CC" $ CC = "CC"
$ IF ARCH.NES."VAX" $ IF ARCH.EQS."AXP"
$ THEN $ THEN
$ WRITE SYS$OUTPUT "There is no VAX C on ''ARCH'!" $ WRITE SYS$OUTPUT "There is no VAX C on Alpha!"
$ EXIT $ EXIT
$ ENDIF $ ENDIF
$ IF F$TRNLNM("DECC$CC_DEFAULT").EQS."/DECC" THEN CC = "CC/VAXC" $ IF F$TRNLNM("DECC$CC_DEFAULT").EQS."/DECC" THEN CC = "CC/VAXC"
$ CC = CC + "/''CC_OPTIMIZE'/''DEBUGGER'/NOLIST" + - $ CC = CC + "/''CC_OPTIMIZE'/''DEBUGGER'/NOLIST" + -
"/INCLUDE=(''CC_INCLUDES')" + CCEXTRAFLAGS "/INCLUDE=(SYS$DISK:[-])" + CCEXTRAFLAGS
$ CCDEFS = CCDEFS + ",""VAXC""" $ CCDEFS = CCDEFS + ",""VAXC"""
$! $!
$! Define <sys> As SYS$COMMON:[SYSLIB] $! Define <sys> As SYS$COMMON:[SYSLIB]
@ -899,7 +720,7 @@ $ DEFINE/NOLOG SYS SYS$COMMON:[SYSLIB]
$! $!
$! Define The Linker Options File Name. $! Define The Linker Options File Name.
$! $!
$ OPT_FILE = "VAX_VAXC_OPTIONS.OPT" $ OPT_FILE = "SYS$DISK:[]VAX_VAXC_OPTIONS.OPT"
$! $!
$! End VAXC Check $! End VAXC Check
$! $!
@ -922,11 +743,11 @@ $! Use GNU C...
$! $!
$ IF F$TYPE(GCC) .EQS. "" THEN GCC := GCC $ IF F$TYPE(GCC) .EQS. "" THEN GCC := GCC
$ CC = GCC+"/NOCASE_HACK/''GCC_OPTIMIZE'/''DEBUGGER'/NOLIST" + - $ CC = GCC+"/NOCASE_HACK/''GCC_OPTIMIZE'/''DEBUGGER'/NOLIST" + -
"/INCLUDE=(''CC_INCLUDES')" + CCEXTRAFLAGS "/INCLUDE=(SYS$DISK:[-])" + CCEXTRAFLAGS
$! $!
$! Define The Linker Options File Name. $! Define The Linker Options File Name.
$! $!
$ OPT_FILE = "VAX_GNUC_OPTIONS.OPT" $ OPT_FILE = "SYS$DISK:[]VAX_GNUC_OPTIONS.OPT"
$! $!
$! End The GNU C Check. $! End The GNU C Check.
$! $!
@ -936,7 +757,7 @@ $! Set up default defines
$! $!
$ CCDEFS = """FLAT_INC=1""," + CCDEFS $ CCDEFS = """FLAT_INC=1""," + CCDEFS
$! $!
$! Else The User Entered An Invalid Argument. $! Else The User Entered An Invalid Arguement.
$! $!
$ ELSE $ ELSE
$! $!
@ -968,7 +789,7 @@ $ THEN
$! $!
$! Set the library to use SOCKETSHR $! Set the library to use SOCKETSHR
$! $!
$ TCPIP_LIB = ",SYS$DISK:[-.VMS]SOCKETSHR_SHR.OPT /OPTIONS" $ TCPIP_LIB = "SYS$DISK:[-.VMS]SOCKETSHR_SHR.OPT/OPT"
$! $!
$! Done with SOCKETSHR $! Done with SOCKETSHR
$! $!
@ -994,13 +815,13 @@ $ THEN
$! $!
$! Set the library to use UCX. $! Set the library to use UCX.
$! $!
$ TCPIP_LIB = ",SYS$DISK:[-.VMS]UCX_SHR_DECC.OPT /OPTIONS" $ TCPIP_LIB = "SYS$DISK:[-.VMS]UCX_SHR_DECC.OPT/OPT"
$ IF F$TRNLNM("UCX$IPC_SHR") .NES. "" $ IF F$TRNLNM("UCX$IPC_SHR") .NES. ""
$ THEN $ THEN
$ TCPIP_LIB = ",SYS$DISK:[-.VMS]UCX_SHR_DECC_LOG.OPT /OPTIONS" $ TCPIP_LIB = "SYS$DISK:[-.VMS]UCX_SHR_DECC_LOG.OPT/OPT"
$ ELSE $ ELSE
$ IF COMPILER .NES. "DECC" .AND. ARCH .EQS. "VAX" THEN - $ IF COMPILER .NES. "DECC" .AND. ARCH .EQS. "VAX" THEN -
TCPIP_LIB = ",SYS$DISK:[-.VMS]UCX_SHR_VAXC.OPT /OPTIONS" TCPIP_LIB = "SYS$DISK:[-.VMS]UCX_SHR_VAXC.OPT/OPT"
$ ENDIF $ ENDIF
$! $!
$! Done with UCX $! Done with UCX
@ -1014,7 +835,7 @@ $ THEN
$! $!
$! Set the library to use TCPIP. $! Set the library to use TCPIP.
$! $!
$ TCPIP_LIB = ",SYS$DISK:[-.VMS]TCPIP_SHR_DECC.OPT /OPTIONS" $ TCPIP_LIB = "SYS$DISK:[-.VMS]TCPIP_SHR_DECC.OPT/OPT"
$! $!
$! Done with TCPIP $! Done with TCPIP
$! $!
@ -1039,9 +860,9 @@ $ CCDEFS = CCDEFS + ",TCPIP_TYPE_''P3'"
$! $!
$! Print info $! Print info
$! $!
$ WRITE SYS$OUTPUT "TCP/IP library spec: ", TCPIP_LIB- "," $ WRITE SYS$OUTPUT "TCP/IP library spec: ", TCPIP_LIB
$! $!
$! Else The User Entered An Invalid Argument. $! Else The User Entered An Invalid Arguement.
$! $!
$ ELSE $ ELSE
$! $!
@ -1067,27 +888,15 @@ $! Finish up the definition of CC.
$! $!
$ IF COMPILER .EQS. "DECC" $ IF COMPILER .EQS. "DECC"
$ THEN $ THEN
$! Not all compiler versions support MAYLOSEDATA3.
$ OPT_TEST = "MAYLOSEDATA3"
$ DEFINE /USER_MODE SYS$ERROR NL:
$ DEFINE /USER_MODE SYS$OUTPUT NL:
$ 'CC' /NOCROSS_REFERENCE /NOLIST /NOOBJECT -
/WARNINGS = DISABLE = ('OPT_TEST', EMPTYFILE) NL:
$ IF ($SEVERITY)
$ THEN
$ IF CCDISABLEWARNINGS .NES. "" THEN -
CCDISABLEWARNINGS = CCDISABLEWARNINGS+ ","
$ CCDISABLEWARNINGS = CCDISABLEWARNINGS+ OPT_TEST
$ ENDIF
$ IF CCDISABLEWARNINGS .NES. "" $ IF CCDISABLEWARNINGS .NES. ""
$ THEN $ THEN
$ CCDISABLEWARNINGS = " /WARNING=(DISABLE=(" + CCDISABLEWARNINGS + "))" $ CCDISABLEWARNINGS = "/WARNING=(DISABLE=(" + CCDISABLEWARNINGS + "))"
$ ENDIF $ ENDIF
$ ELSE $ ELSE
$ CCDISABLEWARNINGS = "" $ CCDISABLEWARNINGS = ""
$ ENDIF $ ENDIF
$ CC2 = CC + " /DEFINE=(" + CCDEFS + ",_POSIX_C_SOURCE)" + CCDISABLEWARNINGS $ CC2 = CC + "/DEFINE=(" + CCDEFS + ",_POSIX_C_SOURCE)" + CCDISABLEWARNINGS
$ CC = CC + " /DEFINE=(" + CCDEFS + ")" + CCDISABLEWARNINGS $ CC = CC + "/DEFINE=(" + CCDEFS + ")" + CCDISABLEWARNINGS
$! $!
$! Show user the result $! Show user the result
$! $!
@ -1153,7 +962,7 @@ $ __INCLUDE = __TOP + "INCLUDE.OPENSSL]"
$! $!
$! Set up the logical name OPENSSL to point at the include directory $! Set up the logical name OPENSSL to point at the include directory
$! $!
$ DEFINE OPENSSL /NOLOG '__INCLUDE' $ DEFINE OPENSSL/NOLOG '__INCLUDE'
$! $!
$! Done $! Done
$! $!
@ -1161,24 +970,15 @@ $ RETURN
$! $!
$ CLEANUP: $ CLEANUP:
$! $!
$! Restore the saved logical name OPENSSL, if it had a value. $! Restore the logical name OPENSSL if it had a value
$! $!
$ if (f$type( __SAVE_OPENSSL) .nes. "") $ IF __SAVE_OPENSSL .EQS. ""
$ then $ THEN
$ IF __SAVE_OPENSSL .EQS. "" $ DEASSIGN OPENSSL
$ THEN $ ELSE
$ DEASSIGN OPENSSL $ DEFINE/NOLOG OPENSSL '__SAVE_OPENSSL'
$ ELSE $ ENDIF
$ DEFINE /NOLOG OPENSSL '__SAVE_OPENSSL'
$ ENDIF
$ endif
$!
$! Close any open files.
$!
$ if (f$trnlnm( "objects", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
close objects
$! $!
$! Done $! Done
$! $!
$ RETURN $ RETURN
$!

View File

@ -1,7 +1,6 @@
/* nseq.c */ /* nseq.c */
/* /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * project 1999.
* 1999.
*/ */
/* ==================================================================== /* ====================================================================
* Copyright (c) 1999 The OpenSSL Project. All rights reserved. * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
@ -70,101 +69,99 @@ int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
char **args, *infile = NULL, *outfile = NULL; char **args, *infile = NULL, *outfile = NULL;
BIO *in = NULL, *out = NULL; BIO *in = NULL, *out = NULL;
int toseq = 0; int toseq = 0;
X509 *x509 = NULL; X509 *x509 = NULL;
NETSCAPE_CERT_SEQUENCE *seq = NULL; NETSCAPE_CERT_SEQUENCE *seq = NULL;
int i, ret = 1; int i, ret = 1;
int badarg = 0; int badarg = 0;
if (bio_err == NULL) if (bio_err == NULL) bio_err = BIO_new_fp (stderr, BIO_NOCLOSE);
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); ERR_load_crypto_strings();
ERR_load_crypto_strings(); args = argv + 1;
args = argv + 1; while (!badarg && *args && *args[0] == '-') {
while (!badarg && *args && *args[0] == '-') { if (!strcmp (*args, "-toseq")) toseq = 1;
if (!strcmp(*args, "-toseq")) else if (!strcmp (*args, "-in")) {
toseq = 1; if (args[1]) {
else if (!strcmp(*args, "-in")) { args++;
if (args[1]) { infile = *args;
args++; } else badarg = 1;
infile = *args; } else if (!strcmp (*args, "-out")) {
} else if (args[1]) {
badarg = 1; args++;
} else if (!strcmp(*args, "-out")) { outfile = *args;
if (args[1]) { } else badarg = 1;
args++; } else badarg = 1;
outfile = *args; args++;
} else }
badarg = 1;
} else
badarg = 1;
args++;
}
if (badarg) { if (badarg) {
BIO_printf(bio_err, "Netscape certificate sequence utility\n"); BIO_printf (bio_err, "Netscape certificate sequence utility\n");
BIO_printf(bio_err, "Usage nseq [options]\n"); BIO_printf (bio_err, "Usage nseq [options]\n");
BIO_printf(bio_err, "where options are\n"); BIO_printf (bio_err, "where options are\n");
BIO_printf(bio_err, "-in file input file\n"); BIO_printf (bio_err, "-in file input file\n");
BIO_printf(bio_err, "-out file output file\n"); BIO_printf (bio_err, "-out file output file\n");
BIO_printf(bio_err, "-toseq output NS Sequence file\n"); BIO_printf (bio_err, "-toseq output NS Sequence file\n");
OPENSSL_EXIT(1); OPENSSL_EXIT(1);
} }
if (infile) { if (infile) {
if (!(in = BIO_new_file(infile, "r"))) { if (!(in = BIO_new_file (infile, "r"))) {
BIO_printf(bio_err, "Can't open input file %s\n", infile); BIO_printf (bio_err,
goto end; "Can't open input file %s\n", infile);
} goto end;
} else }
in = BIO_new_fp(stdin, BIO_NOCLOSE); } else in = BIO_new_fp(stdin, BIO_NOCLOSE);
if (outfile) { if (outfile) {
if (!(out = BIO_new_file(outfile, "w"))) { if (!(out = BIO_new_file (outfile, "w"))) {
BIO_printf(bio_err, "Can't open output file %s\n", outfile); BIO_printf (bio_err,
goto end; "Can't open output file %s\n", outfile);
} goto end;
} else { }
out = BIO_new_fp(stdout, BIO_NOCLOSE); } else {
out = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
#endif #endif
} }
if (toseq) { if (toseq) {
seq = NETSCAPE_CERT_SEQUENCE_new(); seq = NETSCAPE_CERT_SEQUENCE_new();
seq->certs = sk_X509_new_null(); seq->certs = sk_X509_new_null();
while ((x509 = PEM_read_bio_X509(in, NULL, NULL, NULL))) while((x509 = PEM_read_bio_X509(in, NULL, NULL, NULL)))
sk_X509_push(seq->certs, x509); sk_X509_push(seq->certs,x509);
if (!sk_X509_num(seq->certs)) { if(!sk_X509_num(seq->certs))
BIO_printf(bio_err, "Error reading certs file %s\n", infile); {
ERR_print_errors(bio_err); BIO_printf (bio_err, "Error reading certs file %s\n", infile);
goto end; ERR_print_errors(bio_err);
} goto end;
PEM_write_bio_NETSCAPE_CERT_SEQUENCE(out, seq); }
ret = 0; PEM_write_bio_NETSCAPE_CERT_SEQUENCE(out, seq);
goto end; ret = 0;
} goto end;
}
if (!(seq = PEM_read_bio_NETSCAPE_CERT_SEQUENCE(in, NULL, NULL, NULL))) { if (!(seq = PEM_read_bio_NETSCAPE_CERT_SEQUENCE(in, NULL, NULL, NULL))) {
BIO_printf(bio_err, "Error reading sequence file %s\n", infile); BIO_printf (bio_err, "Error reading sequence file %s\n", infile);
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
} }
for (i = 0; i < sk_X509_num(seq->certs); i++) { for(i = 0; i < sk_X509_num(seq->certs); i++) {
x509 = sk_X509_value(seq->certs, i); x509 = sk_X509_value(seq->certs, i);
dump_cert_text(out, x509); dump_cert_text(out, x509);
PEM_write_bio_X509(out, x509); PEM_write_bio_X509(out, x509);
} }
ret = 0; ret = 0;
end: end:
BIO_free(in); BIO_free(in);
BIO_free_all(out); BIO_free_all(out);
NETSCAPE_CERT_SEQUENCE_free(seq); NETSCAPE_CERT_SEQUENCE_free(seq);
OPENSSL_EXIT(ret); OPENSSL_EXIT(ret);
} }

File diff suppressed because it is too large Load Diff

View File

@ -3,13 +3,8 @@
# This is mostly being used for generation of certificate requests. # This is mostly being used for generation of certificate requests.
# #
# This definition stops the following lines choking if HOME isn't
# defined.
HOME = .
RANDFILE = $ENV::HOME/.rnd RANDFILE = $ENV::HOME/.rnd
oid_file = $ENV::HOME/.oid
# Extra OBJECT IDENTIFIER info:
#oid_file = $ENV::HOME/.oid
oid_section = new_oids oid_section = new_oids
# To use this configuration file with the "-extfile" option of the # To use this configuration file with the "-extfile" option of the
@ -21,17 +16,12 @@ oid_section = new_oids
[ new_oids ] [ new_oids ]
# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. # We can add new OIDs in here for use by 'ca' and 'req'.
# Add a simple OID like this: # Add a simple OID like this:
# testoid1=1.2.3.4 # testoid1=1.2.3.4
# Or use config file substitution like this: # Or use config file substitution like this:
# testoid2=${testoid1}.5.6 # testoid2=${testoid1}.5.6
# Policies used by the TSA examples.
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7
#################################################################### ####################################################################
[ ca ] [ ca ]
default_ca = CA_default # The default ca section default_ca = CA_default # The default ca section
@ -39,40 +29,27 @@ default_ca = CA_default # The default ca section
#################################################################### ####################################################################
[ CA_default ] [ CA_default ]
dir = sys\$disk:[.demoCA # Where everything is kept dir = sys\$disk:[.demoCA # Where everything is kept
certs = $dir.certs] # Where the issued certs are kept certs = $dir.certs] # Where the issued certs are kept
crl_dir = $dir.crl] # Where the issued crl are kept crl_dir = $dir.crl] # Where the issued crl are kept
database = $dir]index.txt # database index file. database = $dir]index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of new_certs_dir = $dir.newcerts] # default place for new certs.
# several ctificates with same subject.
new_certs_dir = $dir.newcerts] # default place for new certs.
certificate = $dir]cacert.pem # The CA certificate certificate = $dir]cacert.pem # The CA certificate
serial = $dir]serial. # The current serial number serial = $dir]serial. # The current serial number
crlnumber = $dir]crlnumber. # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir]crl.pem # The current CRL crl = $dir]crl.pem # The current CRL
private_key = $dir.private]cakey.pem# The private key private_key = $dir.private]cakey.pem# The private key
RANDFILE = $dir.private].rand # private random number file RANDFILE = $dir.private].rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert x509_extensions = usr_cert # The extentions to add to the cert
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
# Extension copying option: use with caution.
# copy_extensions = copy
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL. # so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions = crl_ext # crl_extensions = crl_ext
default_days = 365 # how long to certify for default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL default_crl_days= 30 # how long before next CRL
default_md = default # use public key default MD default_md = md5 # which md to use.
preserve = no # keep passed DN ordering preserve = no # keep passed DN ordering
# A few difference way of specifying how similar the request should look # A few difference way of specifying how similar the request should look
@ -109,18 +86,16 @@ distinguished_name = req_distinguished_name
attributes = req_attributes attributes = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert x509_extensions = v3_ca # The extentions to add to the self signed cert
# Passwords for private keys if not present they will be prompted for # This sets the permitted types in a DirectoryString. There are several
# input_password = secret # options.
# output_password = secret
# This sets a mask for permitted string types. There are several options.
# default: PrintableString, T61String, BMPString. # default: PrintableString, T61String, BMPString.
# pkix : PrintableString, BMPString (PKIX recommendation before 2004) # pkix : PrintableString, BMPString.
# utf8only: only UTF8Strings (PKIX recommendation after 2004). # utf8only: only UTF8Strings.
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # nobmp : PrintableString, T61String (no BMPStrings).
# MASK:XXXX a literal mask value. # MASK:XXXX a literal mask value.
# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. # WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
string_mask = utf8only # so use this option with caution!
dirstring_type = nobmp
# req_extensions = v3_req # The extensions to add to a certificate request # req_extensions = v3_req # The extensions to add to a certificate request
@ -145,11 +120,11 @@ localityName = Locality Name (eg, city)
organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default = #organizationalUnitName_default =
commonName = Common Name (e.g. server FQDN or YOUR name) commonName = Common Name (eg, YOUR name)
commonName_max = 64 commonName_max = 64
emailAddress = Email Address emailAddress = Email Address
emailAddress_max = 64 emailAddress_max = 40
# SET-ex3 = SET extension number 3 # SET-ex3 = SET extension number 3
@ -192,14 +167,11 @@ nsComment = "OpenSSL Generated Certificate"
# PKIX recommendations harmless if included in all certificates. # PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer authorityKeyIdentifier=keyid,issuer:always
# This stuff is for subjectAltName and issuerAltname. # This stuff is for subjectAltName and issuerAltname.
# Import the email address. # Import the email address.
# subjectAltName=email:copy # subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move
# Copy subject details # Copy subject details
# issuerAltName=issuer:copy # issuerAltName=issuer:copy
@ -211,9 +183,6 @@ authorityKeyIdentifier=keyid,issuer
#nsCaPolicyUrl #nsCaPolicyUrl
#nsSslServerName #nsSslServerName
# This is required for TSA certificates.
# extendedKeyUsage = critical,timeStamping
[ v3_req ] [ v3_req ]
# Extensions to add to a certificate request # Extensions to add to a certificate request
@ -231,7 +200,7 @@ keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectKeyIdentifier=hash subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer authorityKeyIdentifier=keyid:always,issuer:always
# This is what PKIX recommends but some broken software chokes on critical # This is what PKIX recommends but some broken software chokes on critical
# extensions. # extensions.
@ -264,87 +233,4 @@ basicConstraints = CA:true
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
# issuerAltName=issuer:copy # issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always authorityKeyIdentifier=keyid:always,issuer:always
[ proxy_cert_ext ]
# These extensions should be added when creating a proxy certificate
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.
basicConstraints=CA:FALSE
# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.
# This is OK for an SSL server.
# nsCertType = server
# For an object signing certificate this would be used.
# nsCertType = objsign
# For normal client use this is typical
# nsCertType = client, email
# and for everything including object signing:
# nsCertType = client, email, objsign
# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
# This will be displayed in Netscape's comment listbox.
nsComment = "OpenSSL Generated Certificate"
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
# This stuff is for subjectAltName and issuerAltname.
# Import the email address.
# subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move
# Copy subject details
# issuerAltName=issuer:copy
#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
# This really needs to be in place for it to be a proxy certificate.
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
####################################################################
[ tsa ]
default_tsa = tsa_config1 # the default TSA section
[ tsa_config1 ]
# These are used by the TSA reply generation only.
dir = sys\$disk:[.demoCA # TSA root directory
serial = $dir]tsaserial. # The current serial number (mandatory)
crypto_device = builtin # OpenSSL engine to use for signing
signer_cert = $dir/tsacert.pem # The TSA signing certificate
# (optional)
certs = $dir.cacert.pem] # Certificate chain to include in reply
# (optional)
signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
default_policy = tsa_policy1 # Policy if request did not specify it
# (optional)
other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
digests = md5, sha1 # Acceptable message digests (mandatory)
accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
clock_precision_digits = 0 # number of digits after dot. (optional)
ordering = yes # Is ordering defined for timestamps?
# (optional, default: no)
tsa_name = yes # Must the TSA name be included in the reply?
# (optional, default: no)
ess_cert_id_chain = no # Must the ESS cert id chain be included?
# (optional, default: no)

View File

@ -56,7 +56,7 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
/* ==================================================================== /* ====================================================================
* Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -109,588 +109,428 @@
* *
*/ */
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#define OPENSSL_C /* tells apps.h to use complete #define OPENSSL_C /* tells apps.h to use complete apps_startup() */
* apps_startup() */
#include "apps.h" #include "apps.h"
#include <openssl/bio.h> #include <openssl/bio.h>
#include <openssl/crypto.h> #include <openssl/crypto.h>
#include <openssl/rand.h>
#include <openssl/lhash.h> #include <openssl/lhash.h>
#include <openssl/conf.h> #include <openssl/conf.h>
#include <openssl/x509.h> #include <openssl/x509.h>
#include <openssl/pem.h> #include <openssl/pem.h>
#include <openssl/ssl.h> #include <openssl/ssl.h>
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
# include <openssl/engine.h> #include <openssl/engine.h>
#endif #endif
#define USE_SOCKETS /* needed for the _O_BINARY defs in the MS #define USE_SOCKETS /* needed for the _O_BINARY defs in the MS world */
* world */
#include "progs.h" #include "progs.h"
#include "s_apps.h" #include "s_apps.h"
#include <openssl/err.h> #include <openssl/err.h>
#ifdef OPENSSL_FIPS #include <openssl/fips.h>
# include <openssl/fips.h>
#endif
/* /* The LHASH callbacks ("hash" & "cmp") have been replaced by functions with the
* The LHASH callbacks ("hash" & "cmp") have been replaced by functions with * base prototypes (we cast each variable inside the function to the required
* the base prototypes (we cast each variable inside the function to the * type of "FUNCTION*"). This removes the necessity for macro-generated wrapper
* required type of "FUNCTION*"). This removes the necessity for * functions. */
* macro-generated wrapper functions.
*/
static LHASH_OF(FUNCTION) *prog_init(void); /* static unsigned long MS_CALLBACK hash(FUNCTION *a); */
static int do_cmd(LHASH_OF(FUNCTION) *prog, int argc, char *argv[]); static unsigned long MS_CALLBACK hash(const void *a_void);
static void list_pkey(BIO *out); /* static int MS_CALLBACK cmp(FUNCTION *a,FUNCTION *b); */
static void list_cipher(BIO *out); static int MS_CALLBACK cmp(const void *a_void,const void *b_void);
static void list_md(BIO *out); static LHASH *prog_init(void );
char *default_config_file = NULL; static int do_cmd(LHASH *prog,int argc,char *argv[]);
char *default_config_file=NULL;
/* Make sure there is only one when MONOLITH is defined */ /* Make sure there is only one when MONOLITH is defined */
#ifdef MONOLITH #ifdef MONOLITH
CONF *config = NULL; CONF *config=NULL;
BIO *bio_err = NULL; BIO *bio_err=NULL;
#endif #endif
static void lock_dbg_cb(int mode, int type, const char *file, int line) static void lock_dbg_cb(int mode, int type, const char *file, int line)
{ {
static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */ static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */
const char *errstr = NULL; const char *errstr = NULL;
int rw; int rw;
rw = mode & (CRYPTO_READ | CRYPTO_WRITE); rw = mode & (CRYPTO_READ|CRYPTO_WRITE);
if (!((rw == CRYPTO_READ) || (rw == CRYPTO_WRITE))) { if (!((rw == CRYPTO_READ) || (rw == CRYPTO_WRITE)))
errstr = "invalid mode"; {
goto err; errstr = "invalid mode";
} goto err;
}
if (type < 0 || type >= CRYPTO_NUM_LOCKS) { if (type < 0 || type >= CRYPTO_NUM_LOCKS)
errstr = "type out of bounds"; {
goto err; errstr = "type out of bounds";
} goto err;
}
if (mode & CRYPTO_LOCK) { if (mode & CRYPTO_LOCK)
if (modes[type]) { {
errstr = "already locked"; if (modes[type])
/* {
* must not happen in a single-threaded program (would deadlock) errstr = "already locked";
*/ /* must not happen in a single-threaded program
goto err; * (would deadlock) */
} goto err;
}
modes[type] = rw; modes[type] = rw;
} else if (mode & CRYPTO_UNLOCK) { }
if (!modes[type]) { else if (mode & CRYPTO_UNLOCK)
errstr = "not locked"; {
goto err; if (!modes[type])
} {
errstr = "not locked";
goto err;
}
if (modes[type] != rw) { if (modes[type] != rw)
errstr = (rw == CRYPTO_READ) ? {
"CRYPTO_r_unlock on write lock" : errstr = (rw == CRYPTO_READ) ?
"CRYPTO_w_unlock on read lock"; "CRYPTO_r_unlock on write lock" :
} "CRYPTO_w_unlock on read lock";
}
modes[type] = 0; modes[type] = 0;
} else { }
errstr = "invalid mode"; else
goto err; {
} errstr = "invalid mode";
goto err;
}
err: err:
if (errstr) { if (errstr)
/* we cannot use bio_err here */ {
fprintf(stderr, /* we cannot use bio_err here */
"openssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d\n", fprintf(stderr, "openssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d\n",
errstr, mode, type, file, line); errstr, mode, type, file, line);
} }
} }
#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64)
# define ARGV _Argv int main(int Argc, char *Argv[])
{
ARGS arg;
#define PROG_NAME_SIZE 39
char pname[PROG_NAME_SIZE+1];
FUNCTION f,*fp;
MS_STATIC char *prompt,buf[1024];
char *to_free=NULL;
int n,i,ret=0;
int argc;
char **argv,*p;
LHASH *prog=NULL;
long errline;
arg.data=NULL;
arg.count=0;
#ifdef OPENSSL_FIPS
if(getenv("OPENSSL_FIPS")) {
#if defined(_WIN32)
char filename[MAX_PATH] = "";
GetModuleFileName( NULL, filename, MAX_PATH) ;
p = filename;
#else #else
# define ARGV Argv p = Argv[0];
#endif #endif
if (!FIPS_mode_set(1,p)) {
ERR_load_crypto_strings();
ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE));
exit(1);
}
if (getenv("OPENSSL_FIPS_MD5"))
FIPS_allow_md5(1);
}
#endif
if (bio_err == NULL)
if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
int main(int Argc, char *ARGV[]) if (getenv("OPENSSL_DEBUG_MEMORY") != NULL) /* if not defined, use compiled-in library defaults */
{ {
ARGS arg; if (!(0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off")))
#define PROG_NAME_SIZE 39 {
char pname[PROG_NAME_SIZE + 1]; CRYPTO_malloc_debug_init();
FUNCTION f, *fp; CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
MS_STATIC const char *prompt; }
MS_STATIC char buf[1024]; else
char *to_free = NULL; {
int n, i, ret = 0; /* OPENSSL_DEBUG_MEMORY=off */
int argc; CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);
char **argv, *p; }
LHASH_OF(FUNCTION) *prog = NULL; }
long errline; CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64)
/*-
* 2011-03-22 SMS.
* If we have 32-bit pointers everywhere, then we're safe, and
* we bypass this mess, as on non-VMS systems. (See ARGV,
* above.)
* Problem 1: Compaq/HP C before V7.3 always used 32-bit
* pointers for argv[].
* Fix 1: For a 32-bit argv[], when we're using 64-bit pointers
* everywhere else, we always allocate and use a 64-bit
* duplicate of argv[].
* Problem 2: Compaq/HP C V7.3 (Alpha, IA64) before ECO1 failed
* to NULL-terminate a 64-bit argv[]. (As this was written, the
* compiler ECO was available only on IA64.)
* Fix 2: Unless advised not to (VMS_TRUST_ARGV), we test a
* 64-bit argv[argc] for NULL, and, if necessary, use a
* (properly) NULL-terminated (64-bit) duplicate of argv[].
* The same code is used in either case to duplicate argv[].
* Some of these decisions could be handled in preprocessing,
* but the code tends to get even uglier, and the penalty for
* deciding at compile- or run-time is tiny.
*/
char **Argv = NULL;
int free_Argv = 0;
if ((sizeof(_Argv) < 8) /* 32-bit argv[]. */
# if !defined( VMS_TRUST_ARGV)
|| (_Argv[Argc] != NULL) /* Untrusted argv[argc] not NULL. */
# endif
) {
int i;
Argv = OPENSSL_malloc((Argc + 1) * sizeof(char *));
if (Argv == NULL) {
ret = -1;
goto end;
}
for (i = 0; i < Argc; i++)
Argv[i] = _Argv[i];
Argv[Argc] = NULL; /* Certain NULL termination. */
free_Argv = 1;
} else {
/*
* Use the known-good 32-bit argv[] (which needs the type cast to
* satisfy the compiler), or the trusted or tested-good 64-bit argv[]
* as-is.
*/
Argv = (char **)_Argv;
}
#endif /* defined( OPENSSL_SYS_VMS) &&
* (__INITIAL_POINTER_SIZE == 64) */
arg.data = NULL;
arg.count = 0;
if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT);
if (getenv("OPENSSL_DEBUG_MEMORY") != NULL) { /* if not defined, use
* compiled-in library
* defaults */
if (!(0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off"))) {
CRYPTO_malloc_debug_init();
CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
} else {
/* OPENSSL_DEBUG_MEMORY=off */
CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);
}
}
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
#if 0 #if 0
if (getenv("OPENSSL_DEBUG_LOCKING") != NULL) if (getenv("OPENSSL_DEBUG_LOCKING") != NULL)
#endif #endif
{ {
CRYPTO_set_locking_callback(lock_dbg_cb); CRYPTO_set_locking_callback(lock_dbg_cb);
} }
if (getenv("OPENSSL_FIPS")) { apps_startup();
#ifdef OPENSSL_FIPS
if (!FIPS_mode_set(1)) {
ERR_load_crypto_strings();
ERR_print_errors(BIO_new_fp(stderr, BIO_NOCLOSE));
EXIT(1);
}
#else
fprintf(stderr, "FIPS mode not supported.\n");
EXIT(1);
#endif
}
apps_startup(); /* Lets load up our environment a little */
p=getenv("OPENSSL_CONF");
if (p == NULL)
p=getenv("SSLEAY_CONF");
if (p == NULL)
p=to_free=make_config_name();
/* Lets load up our environment a little */ default_config_file=p;
p = getenv("OPENSSL_CONF");
if (p == NULL)
p = getenv("SSLEAY_CONF");
if (p == NULL)
p = to_free = make_config_name();
default_config_file = p; config=NCONF_new(NULL);
i=NCONF_load(config,p,&errline);
if (i == 0)
{
NCONF_free(config);
config = NULL;
ERR_clear_error();
}
config = NCONF_new(NULL); prog=prog_init();
i = NCONF_load(config, p, &errline);
if (i == 0) {
if (ERR_GET_REASON(ERR_peek_last_error())
== CONF_R_NO_SUCH_FILE) {
BIO_printf(bio_err, "WARNING: can't open config file: %s\n", p);
ERR_clear_error();
NCONF_free(config);
config = NULL;
} else {
ERR_print_errors(bio_err);
NCONF_free(config);
exit(1);
}
}
prog = prog_init(); /* first check the program name */
program_name(Argv[0],pname,sizeof pname);
/* first check the program name */ f.name=pname;
program_name(Argv[0], pname, sizeof pname); fp=(FUNCTION *)lh_retrieve(prog,&f);
if (fp != NULL)
{
Argv[0]=pname;
ret=fp->func(Argc,Argv);
goto end;
}
f.name = pname; /* ok, now check that there are not arguments, if there are,
fp = lh_FUNCTION_retrieve(prog, &f); * run with them, shifting the ssleay off the front */
if (fp != NULL) { if (Argc != 1)
Argv[0] = pname; {
ret = fp->func(Argc, Argv); Argc--;
goto end; Argv++;
} ret=do_cmd(prog,Argc,Argv);
if (ret < 0) ret=0;
goto end;
}
/* /* ok, lets enter the old 'OpenSSL>' mode */
* ok, now check that there are not arguments, if there are, run with
* them, shifting the ssleay off the front
*/
if (Argc != 1) {
Argc--;
Argv++;
ret = do_cmd(prog, Argc, Argv);
if (ret < 0)
ret = 0;
goto end;
}
/* ok, lets enter the old 'OpenSSL>' mode */ for (;;)
{
ret=0;
p=buf;
n=sizeof buf;
i=0;
for (;;)
{
p[0]='\0';
if (i++)
prompt=">";
else prompt="OpenSSL> ";
fputs(prompt,stdout);
fflush(stdout);
fgets(p,n,stdin);
if (p[0] == '\0') goto end;
i=strlen(p);
if (i <= 1) break;
if (p[i-2] != '\\') break;
i-=2;
p+=i;
n-=i;
}
if (!chopup_args(&arg,buf,&argc,&argv)) break;
for (;;) { ret=do_cmd(prog,argc,argv);
ret = 0; if (ret < 0)
p = buf; {
n = sizeof buf; ret=0;
i = 0; goto end;
for (;;) { }
p[0] = '\0'; if (ret != 0)
if (i++) BIO_printf(bio_err,"error in %s\n",argv[0]);
prompt = ">"; (void)BIO_flush(bio_err);
else }
prompt = "OpenSSL> "; BIO_printf(bio_err,"bad exit\n");
fputs(prompt, stdout); ret=1;
fflush(stdout); end:
if (!fgets(p, n, stdin)) if (to_free)
goto end; OPENSSL_free(to_free);
if (p[0] == '\0') if (config != NULL)
goto end; {
i = strlen(p); NCONF_free(config);
if (i <= 1) config=NULL;
break; }
if (p[i - 2] != '\\') if (prog != NULL) lh_free(prog);
break; if (arg.data != NULL) OPENSSL_free(arg.data);
i -= 2;
p += i;
n -= i;
}
if (!chopup_args(&arg, buf, &argc, &argv))
break;
ret = do_cmd(prog, argc, argv); apps_shutdown();
if (ret < 0) {
ret = 0;
goto end;
}
if (ret != 0)
BIO_printf(bio_err, "error in %s\n", argv[0]);
(void)BIO_flush(bio_err);
}
BIO_printf(bio_err, "bad exit\n");
ret = 1;
end:
if (to_free)
OPENSSL_free(to_free);
if (config != NULL) {
NCONF_free(config);
config = NULL;
}
if (prog != NULL)
lh_FUNCTION_free(prog);
if (arg.data != NULL)
OPENSSL_free(arg.data);
#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64) CRYPTO_mem_leaks(bio_err);
/* Free any duplicate Argv[] storage. */ if (bio_err != NULL)
if (free_Argv) { {
OPENSSL_free(Argv); BIO_free(bio_err);
} bio_err=NULL;
#endif }
apps_shutdown(); OPENSSL_EXIT(ret);
CRYPTO_mem_leaks(bio_err); }
if (bio_err != NULL) {
BIO_free(bio_err);
bio_err = NULL;
}
OPENSSL_EXIT(ret);
}
#define LIST_STANDARD_COMMANDS "list-standard-commands" #define LIST_STANDARD_COMMANDS "list-standard-commands"
#define LIST_MESSAGE_DIGEST_COMMANDS "list-message-digest-commands" #define LIST_MESSAGE_DIGEST_COMMANDS "list-message-digest-commands"
#define LIST_MESSAGE_DIGEST_ALGORITHMS "list-message-digest-algorithms"
#define LIST_CIPHER_COMMANDS "list-cipher-commands" #define LIST_CIPHER_COMMANDS "list-cipher-commands"
#define LIST_CIPHER_ALGORITHMS "list-cipher-algorithms"
#define LIST_PUBLIC_KEY_ALGORITHMS "list-public-key-algorithms"
static int do_cmd(LHASH_OF(FUNCTION) *prog, int argc, char *argv[]) static int do_cmd(LHASH *prog, int argc, char *argv[])
{ {
FUNCTION f, *fp; FUNCTION f,*fp;
int i, ret = 1, tp, nl; int i,ret=1,tp,nl;
if ((argc <= 0) || (argv[0] == NULL)) { if ((argc <= 0) || (argv[0] == NULL))
ret = 0; { ret=0; goto end; }
goto end; f.name=argv[0];
} fp=(FUNCTION *)lh_retrieve(prog,&f);
f.name = argv[0]; if (fp != NULL)
fp = lh_FUNCTION_retrieve(prog, &f); {
if (fp == NULL) { ret=fp->func(argc,argv);
if (EVP_get_digestbyname(argv[0])) { }
f.type = FUNC_TYPE_MD; else if ((strncmp(argv[0],"no-",3)) == 0)
f.func = dgst_main; {
fp = &f; BIO *bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE);
} else if (EVP_get_cipherbyname(argv[0])) {
f.type = FUNC_TYPE_CIPHER;
f.func = enc_main;
fp = &f;
}
}
if (fp != NULL) {
ret = fp->func(argc, argv);
} else if ((strncmp(argv[0], "no-", 3)) == 0) {
BIO *bio_stdout = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
bio_stdout = BIO_push(tmpbio, bio_stdout); bio_stdout = BIO_push(tmpbio, bio_stdout);
} }
#endif #endif
f.name = argv[0] + 3; f.name=argv[0]+3;
ret = (lh_FUNCTION_retrieve(prog, &f) != NULL); ret = (lh_retrieve(prog,&f) != NULL);
if (!ret) if (!ret)
BIO_printf(bio_stdout, "%s\n", argv[0]); BIO_printf(bio_stdout, "%s\n", argv[0]);
else else
BIO_printf(bio_stdout, "%s\n", argv[0] + 3); BIO_printf(bio_stdout, "%s\n", argv[0]+3);
BIO_free_all(bio_stdout); BIO_free_all(bio_stdout);
goto end; goto end;
} else if ((strcmp(argv[0], "quit") == 0) || }
(strcmp(argv[0], "q") == 0) || else if ((strcmp(argv[0],"quit") == 0) ||
(strcmp(argv[0], "exit") == 0) || (strcmp(argv[0],"q") == 0) ||
(strcmp(argv[0], "bye") == 0)) { (strcmp(argv[0],"exit") == 0) ||
ret = -1; (strcmp(argv[0],"bye") == 0))
goto end; {
} else if ((strcmp(argv[0], LIST_STANDARD_COMMANDS) == 0) || ret= -1;
(strcmp(argv[0], LIST_MESSAGE_DIGEST_COMMANDS) == 0) || goto end;
(strcmp(argv[0], LIST_MESSAGE_DIGEST_ALGORITHMS) == 0) || }
(strcmp(argv[0], LIST_CIPHER_COMMANDS) == 0) || else if ((strcmp(argv[0],LIST_STANDARD_COMMANDS) == 0) ||
(strcmp(argv[0], LIST_CIPHER_ALGORITHMS) == 0) || (strcmp(argv[0],LIST_MESSAGE_DIGEST_COMMANDS) == 0) ||
(strcmp(argv[0], LIST_PUBLIC_KEY_ALGORITHMS) == 0)) { (strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0))
int list_type; {
BIO *bio_stdout; int list_type;
BIO *bio_stdout;
if (strcmp(argv[0], LIST_STANDARD_COMMANDS) == 0) if (strcmp(argv[0],LIST_STANDARD_COMMANDS) == 0)
list_type = FUNC_TYPE_GENERAL; list_type = FUNC_TYPE_GENERAL;
else if (strcmp(argv[0], LIST_MESSAGE_DIGEST_COMMANDS) == 0) else if (strcmp(argv[0],LIST_MESSAGE_DIGEST_COMMANDS) == 0)
list_type = FUNC_TYPE_MD; list_type = FUNC_TYPE_MD;
else if (strcmp(argv[0], LIST_MESSAGE_DIGEST_ALGORITHMS) == 0) else /* strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0 */
list_type = FUNC_TYPE_MD_ALG; list_type = FUNC_TYPE_CIPHER;
else if (strcmp(argv[0], LIST_PUBLIC_KEY_ALGORITHMS) == 0) bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE);
list_type = FUNC_TYPE_PKEY;
else if (strcmp(argv[0], LIST_CIPHER_ALGORITHMS) == 0)
list_type = FUNC_TYPE_CIPHER_ALG;
else /* strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0 */
list_type = FUNC_TYPE_CIPHER;
bio_stdout = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
bio_stdout = BIO_push(tmpbio, bio_stdout); bio_stdout = BIO_push(tmpbio, bio_stdout);
} }
#endif #endif
if (!load_config(bio_err, NULL)) for (fp=functions; fp->name != NULL; fp++)
goto end; if (fp->type == list_type)
BIO_printf(bio_stdout, "%s\n", fp->name);
BIO_free_all(bio_stdout);
ret=0;
goto end;
}
else
{
BIO_printf(bio_err,"openssl:Error: '%s' is an invalid command.\n",
argv[0]);
BIO_printf(bio_err, "\nStandard commands");
i=0;
tp=0;
for (fp=functions; fp->name != NULL; fp++)
{
nl=0;
if (((i++) % 5) == 0)
{
BIO_printf(bio_err,"\n");
nl=1;
}
if (fp->type != tp)
{
tp=fp->type;
if (!nl) BIO_printf(bio_err,"\n");
if (tp == FUNC_TYPE_MD)
{
i=1;
BIO_printf(bio_err,
"\nMessage Digest commands (see the `dgst' command for more details)\n");
}
else if (tp == FUNC_TYPE_CIPHER)
{
i=1;
BIO_printf(bio_err,"\nCipher commands (see the `enc' command for more details)\n");
}
}
BIO_printf(bio_err,"%-15s",fp->name);
}
BIO_printf(bio_err,"\n\n");
ret=0;
}
end:
return(ret);
}
if (list_type == FUNC_TYPE_PKEY) static int SortFnByName(const void *_f1,const void *_f2)
list_pkey(bio_stdout); {
if (list_type == FUNC_TYPE_MD_ALG) const FUNCTION *f1=_f1;
list_md(bio_stdout); const FUNCTION *f2=_f2;
if (list_type == FUNC_TYPE_CIPHER_ALG)
list_cipher(bio_stdout); if(f1->type != f2->type)
else { return f1->type-f2->type;
for (fp = functions; fp->name != NULL; fp++) return strcmp(f1->name,f2->name);
if (fp->type == list_type)
BIO_printf(bio_stdout, "%s\n", fp->name);
}
BIO_free_all(bio_stdout);
ret = 0;
goto end;
} else {
BIO_printf(bio_err, "openssl:Error: '%s' is an invalid command.\n",
argv[0]);
BIO_printf(bio_err, "\nStandard commands");
i = 0;
tp = 0;
for (fp = functions; fp->name != NULL; fp++) {
nl = 0;
#ifdef OPENSSL_NO_CAMELLIA
if (((i++) % 5) == 0)
#else
if (((i++) % 4) == 0)
#endif
{
BIO_printf(bio_err, "\n");
nl = 1;
}
if (fp->type != tp) {
tp = fp->type;
if (!nl)
BIO_printf(bio_err, "\n");
if (tp == FUNC_TYPE_MD) {
i = 1;
BIO_printf(bio_err,
"\nMessage Digest commands (see the `dgst' command for more details)\n");
} else if (tp == FUNC_TYPE_CIPHER) {
i = 1;
BIO_printf(bio_err,
"\nCipher commands (see the `enc' command for more details)\n");
}
}
#ifdef OPENSSL_NO_CAMELLIA
BIO_printf(bio_err, "%-15s", fp->name);
#else
BIO_printf(bio_err, "%-18s", fp->name);
#endif
}
BIO_printf(bio_err, "\n\n");
ret = 0;
} }
end:
return (ret);
}
static int SortFnByName(const void *_f1, const void *_f2) static LHASH *prog_init(void)
{ {
const FUNCTION *f1 = _f1; LHASH *ret;
const FUNCTION *f2 = _f2; FUNCTION *f;
int i;
if (f1->type != f2->type) /* Purely so it looks nice when the user hits ? */
return f1->type - f2->type; for(i=0,f=functions ; f->name != NULL ; ++f,++i)
return strcmp(f1->name, f2->name); ;
} qsort(functions,i,sizeof *functions,SortFnByName);
static void list_pkey(BIO *out) if ((ret=lh_new(hash, cmp)) == NULL)
{ return(NULL);
int i;
for (i = 0; i < EVP_PKEY_asn1_get_count(); i++) {
const EVP_PKEY_ASN1_METHOD *ameth;
int pkey_id, pkey_base_id, pkey_flags;
const char *pinfo, *pem_str;
ameth = EVP_PKEY_asn1_get0(i);
EVP_PKEY_asn1_get0_info(&pkey_id, &pkey_base_id, &pkey_flags,
&pinfo, &pem_str, ameth);
if (pkey_flags & ASN1_PKEY_ALIAS) {
BIO_printf(out, "Name: %s\n", OBJ_nid2ln(pkey_id));
BIO_printf(out, "\tType: Alias to %s\n",
OBJ_nid2ln(pkey_base_id));
} else {
BIO_printf(out, "Name: %s\n", pinfo);
BIO_printf(out, "\tType: %s Algorithm\n",
pkey_flags & ASN1_PKEY_DYNAMIC ?
"External" : "Builtin");
BIO_printf(out, "\tOID: %s\n", OBJ_nid2ln(pkey_id));
if (pem_str == NULL)
pem_str = "(none)";
BIO_printf(out, "\tPEM string: %s\n", pem_str);
}
} for (f=functions; f->name != NULL; f++)
} lh_insert(ret,f);
return(ret);
}
static void list_cipher_fn(const EVP_CIPHER *c, /* static int MS_CALLBACK cmp(FUNCTION *a, FUNCTION *b) */
const char *from, const char *to, void *arg) static int MS_CALLBACK cmp(const void *a_void, const void *b_void)
{ {
if (c) return(strncmp(((FUNCTION *)a_void)->name,
BIO_printf(arg, "%s\n", EVP_CIPHER_name(c)); ((FUNCTION *)b_void)->name,8));
else { }
if (!from)
from = "<undefined>";
if (!to)
to = "<undefined>";
BIO_printf(arg, "%s => %s\n", from, to);
}
}
static void list_cipher(BIO *out) /* static unsigned long MS_CALLBACK hash(FUNCTION *a) */
{ static unsigned long MS_CALLBACK hash(const void *a_void)
EVP_CIPHER_do_all_sorted(list_cipher_fn, out); {
} return(lh_strhash(((FUNCTION *)a_void)->name));
}
static void list_md_fn(const EVP_MD *m,
const char *from, const char *to, void *arg)
{
if (m)
BIO_printf(arg, "%s\n", EVP_MD_name(m));
else {
if (!from)
from = "<undefined>";
if (!to)
to = "<undefined>";
BIO_printf(arg, "%s => %s\n", from, to);
}
}
static void list_md(BIO *out)
{
EVP_MD_do_all_sorted(list_md_fn, out);
}
static int MS_CALLBACK function_cmp(const FUNCTION * a, const FUNCTION * b)
{
return strncmp(a->name, b->name, 8);
}
static IMPLEMENT_LHASH_COMP_FN(function, FUNCTION)
static unsigned long MS_CALLBACK function_hash(const FUNCTION * a)
{
return lh_strhash(a->name);
}
static IMPLEMENT_LHASH_HASH_FN(function, FUNCTION)
static LHASH_OF(FUNCTION) *prog_init(void)
{
LHASH_OF(FUNCTION) *ret;
FUNCTION *f;
size_t i;
/* Purely so it looks nice when the user hits ? */
for (i = 0, f = functions; f->name != NULL; ++f, ++i) ;
qsort(functions, i, sizeof *functions, SortFnByName);
if ((ret = lh_FUNCTION_new()) == NULL)
return (NULL);
for (f = functions; f->name != NULL; f++)
(void)lh_FUNCTION_insert(ret, f);
return (ret);
}

View File

@ -21,17 +21,12 @@ oid_section = new_oids
[ new_oids ] [ new_oids ]
# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. # We can add new OIDs in here for use by 'ca' and 'req'.
# Add a simple OID like this: # Add a simple OID like this:
# testoid1=1.2.3.4 # testoid1=1.2.3.4
# Or use config file substitution like this: # Or use config file substitution like this:
# testoid2=${testoid1}.5.6 # testoid2=${testoid1}.5.6
# Policies used by the TSA examples.
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7
#################################################################### ####################################################################
[ ca ] [ ca ]
default_ca = CA_default # The default ca section default_ca = CA_default # The default ca section
@ -49,7 +44,7 @@ new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number #crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL # must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key private_key = $dir/private/cakey.pem# The private key
@ -72,7 +67,7 @@ cert_opt = ca_default # Certificate field options
default_days = 365 # how long to certify for default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL default_crl_days= 30 # how long before next CRL
default_md = default # use public key default MD default_md = md5 # which md to use.
preserve = no # keep passed DN ordering preserve = no # keep passed DN ordering
# A few difference way of specifying how similar the request should look # A few difference way of specifying how similar the request should look
@ -115,12 +110,13 @@ x509_extensions = v3_ca # The extentions to add to the self signed cert
# This sets a mask for permitted string types. There are several options. # This sets a mask for permitted string types. There are several options.
# default: PrintableString, T61String, BMPString. # default: PrintableString, T61String, BMPString.
# pkix : PrintableString, BMPString (PKIX recommendation before 2004) # pkix : PrintableString, BMPString.
# utf8only: only UTF8Strings (PKIX recommendation after 2004). # utf8only: only UTF8Strings.
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
# MASK:XXXX a literal mask value. # MASK:XXXX a literal mask value.
# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. # WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
string_mask = utf8only # so use this option with caution!
string_mask = nombstr
# req_extensions = v3_req # The extensions to add to a certificate request # req_extensions = v3_req # The extensions to add to a certificate request
@ -145,7 +141,7 @@ localityName = Locality Name (eg, city)
organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default = #organizationalUnitName_default =
commonName = Common Name (e.g. server FQDN or YOUR name) commonName = Common Name (eg, YOUR name)
commonName_max = 64 commonName_max = 64
emailAddress = Email Address emailAddress = Email Address
@ -192,7 +188,7 @@ nsComment = "OpenSSL Generated Certificate"
# PKIX recommendations harmless if included in all certificates. # PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer authorityKeyIdentifier=keyid,issuer:always
# This stuff is for subjectAltName and issuerAltname. # This stuff is for subjectAltName and issuerAltname.
# Import the email address. # Import the email address.
@ -211,9 +207,6 @@ authorityKeyIdentifier=keyid,issuer
#nsCaPolicyUrl #nsCaPolicyUrl
#nsSslServerName #nsSslServerName
# This is required for TSA certificates.
# extendedKeyUsage = critical,timeStamping
[ v3_req ] [ v3_req ]
# Extensions to add to a certificate request # Extensions to add to a certificate request
@ -231,7 +224,7 @@ keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectKeyIdentifier=hash subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer authorityKeyIdentifier=keyid:always,issuer:always
# This is what PKIX recommends but some broken software chokes on critical # This is what PKIX recommends but some broken software chokes on critical
# extensions. # extensions.
@ -264,87 +257,4 @@ basicConstraints = CA:true
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
# issuerAltName=issuer:copy # issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always authorityKeyIdentifier=keyid:always,issuer:always
[ proxy_cert_ext ]
# These extensions should be added when creating a proxy certificate
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.
basicConstraints=CA:FALSE
# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.
# This is OK for an SSL server.
# nsCertType = server
# For an object signing certificate this would be used.
# nsCertType = objsign
# For normal client use this is typical
# nsCertType = client, email
# and for everything including object signing:
# nsCertType = client, email, objsign
# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
# This will be displayed in Netscape's comment listbox.
nsComment = "OpenSSL Generated Certificate"
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
# This stuff is for subjectAltName and issuerAltname.
# Import the email address.
# subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move
# Copy subject details
# issuerAltName=issuer:copy
#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
# This really needs to be in place for it to be a proxy certificate.
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
####################################################################
[ tsa ]
default_tsa = tsa_config1 # the default TSA section
[ tsa_config1 ]
# These are used by the TSA reply generation only.
dir = ./demoCA # TSA root directory
serial = $dir/tsaserial # The current serial number (mandatory)
crypto_device = builtin # OpenSSL engine to use for signing
signer_cert = $dir/tsacert.pem # The TSA signing certificate
# (optional)
certs = $dir/cacert.pem # Certificate chain to include in reply
# (optional)
signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
default_policy = tsa_policy1 # Policy if request did not specify it
# (optional)
other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
digests = md5, sha1 # Acceptable message digests (mandatory)
accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
clock_precision_digits = 0 # number of digits after dot. (optional)
ordering = yes # Is ordering defined for timestamps?
# (optional, default: no)
tsa_name = yes # Must the TSA name be included in the reply?
# (optional, default: no)
ess_cert_id_chain = no # Must the ESS cert id chain be included?
# (optional, default: no)

View File

@ -6,44 +6,44 @@
#if !defined(OPENSSL_NO_DES) || !defined(NO_MD5CRYPT_1) #if !defined(OPENSSL_NO_DES) || !defined(NO_MD5CRYPT_1)
# include <assert.h> #include <assert.h>
# include <string.h> #include <string.h>
# include "apps.h" #include "apps.h"
# include <openssl/bio.h> #include <openssl/bio.h>
# include <openssl/err.h> #include <openssl/err.h>
# include <openssl/evp.h> #include <openssl/evp.h>
# include <openssl/rand.h> #include <openssl/rand.h>
# ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
# include <openssl/des.h> # include <openssl/des.h>
# endif #endif
# ifndef NO_MD5CRYPT_1 #ifndef NO_MD5CRYPT_1
# include <openssl/md5.h> # include <openssl/md5.h>
# endif #endif
# undef PROG
# define PROG passwd_main
static unsigned const char cov_2char[64] = { #undef PROG
/* from crypto/des/fcrypt.c */ #define PROG passwd_main
0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, static unsigned const char cov_2char[64]={
0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, /* from crypto/des/fcrypt.c */
0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,
0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,
0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,
0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A 0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,
0x55,0x56,0x57,0x58,0x59,0x5A,0x61,0x62,
0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,
0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,
0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A
}; };
static int do_passwd(int passed_salt, char **salt_p, char **salt_malloc_p, static int do_passwd(int passed_salt, char **salt_p, char **salt_malloc_p,
char *passwd, BIO *out, int quiet, int table, char *passwd, BIO *out, int quiet, int table, int reverse,
int reverse, size_t pw_maxlen, int usecrypt, int use1, size_t pw_maxlen, int usecrypt, int use1, int useapr1);
int useapr1);
/*- /* -crypt - standard Unix password algorithm (default)
* -crypt - standard Unix password algorithm (default)
* -1 - MD5-based password algorithm * -1 - MD5-based password algorithm
* -apr1 - MD5-based password algorithm, Apache variant * -apr1 - MD5-based password algorithm, Apache variant
* -salt string - salt * -salt string - salt
@ -58,437 +58,453 @@ static int do_passwd(int passed_salt, char **salt_p, char **salt_malloc_p,
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
int ret = 1; int ret = 1;
char *infile = NULL; char *infile = NULL;
int in_stdin = 0; int in_stdin = 0;
int in_noverify = 0; int in_noverify = 0;
char *salt = NULL, *passwd = NULL, **passwds = NULL; char *salt = NULL, *passwd = NULL, **passwds = NULL;
char *salt_malloc = NULL, *passwd_malloc = NULL; char *salt_malloc = NULL, *passwd_malloc = NULL;
size_t passwd_malloc_size = 0; size_t passwd_malloc_size = 0;
int pw_source_defined = 0; int pw_source_defined = 0;
BIO *in = NULL, *out = NULL; BIO *in = NULL, *out = NULL;
int i, badopt, opt_done; int i, badopt, opt_done;
int passed_salt = 0, quiet = 0, table = 0, reverse = 0; int passed_salt = 0, quiet = 0, table = 0, reverse = 0;
int usecrypt = 0, use1 = 0, useapr1 = 0; int usecrypt = 0, use1 = 0, useapr1 = 0;
size_t pw_maxlen = 0; size_t pw_maxlen = 0;
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto err; goto err;
out = BIO_new(BIO_s_file()); out = BIO_new(BIO_s_file());
if (out == NULL) if (out == NULL)
goto err; goto err;
BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT);
# ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
# endif #endif
badopt = 0, opt_done = 0; badopt = 0, opt_done = 0;
i = 0; i = 0;
while (!badopt && !opt_done && argv[++i] != NULL) { while (!badopt && !opt_done && argv[++i] != NULL)
if (strcmp(argv[i], "-crypt") == 0) {
usecrypt = 1; if (strcmp(argv[i], "-crypt") == 0)
else if (strcmp(argv[i], "-1") == 0) usecrypt = 1;
use1 = 1; else if (strcmp(argv[i], "-1") == 0)
else if (strcmp(argv[i], "-apr1") == 0) use1 = 1;
useapr1 = 1; else if (strcmp(argv[i], "-apr1") == 0)
else if (strcmp(argv[i], "-salt") == 0) { useapr1 = 1;
if ((argv[i + 1] != NULL) && (salt == NULL)) { else if (strcmp(argv[i], "-salt") == 0)
passed_salt = 1; {
salt = argv[++i]; if ((argv[i+1] != NULL) && (salt == NULL))
} else {
badopt = 1; passed_salt = 1;
} else if (strcmp(argv[i], "-in") == 0) { salt = argv[++i];
if ((argv[i + 1] != NULL) && !pw_source_defined) { }
pw_source_defined = 1; else
infile = argv[++i]; badopt = 1;
} else }
badopt = 1; else if (strcmp(argv[i], "-in") == 0)
} else if (strcmp(argv[i], "-stdin") == 0) { {
if (!pw_source_defined) { if ((argv[i+1] != NULL) && !pw_source_defined)
pw_source_defined = 1; {
in_stdin = 1; pw_source_defined = 1;
} else infile = argv[++i];
badopt = 1; }
} else if (strcmp(argv[i], "-noverify") == 0) else
in_noverify = 1; badopt = 1;
else if (strcmp(argv[i], "-quiet") == 0) }
quiet = 1; else if (strcmp(argv[i], "-stdin") == 0)
else if (strcmp(argv[i], "-table") == 0) {
table = 1; if (!pw_source_defined)
else if (strcmp(argv[i], "-reverse") == 0) {
reverse = 1; pw_source_defined = 1;
else if (argv[i][0] == '-') in_stdin = 1;
badopt = 1; }
else if (!pw_source_defined) else
/* non-option arguments, use as passwords */ badopt = 1;
{ }
pw_source_defined = 1; else if (strcmp(argv[i], "-noverify") == 0)
passwds = &argv[i]; in_noverify = 1;
opt_done = 1; else if (strcmp(argv[i], "-quiet") == 0)
} else quiet = 1;
badopt = 1; else if (strcmp(argv[i], "-table") == 0)
} table = 1;
else if (strcmp(argv[i], "-reverse") == 0)
reverse = 1;
else if (argv[i][0] == '-')
badopt = 1;
else if (!pw_source_defined)
/* non-option arguments, use as passwords */
{
pw_source_defined = 1;
passwds = &argv[i];
opt_done = 1;
}
else
badopt = 1;
}
if (!usecrypt && !use1 && !useapr1) /* use default */ if (!usecrypt && !use1 && !useapr1) /* use default */
usecrypt = 1; usecrypt = 1;
if (usecrypt + use1 + useapr1 > 1) /* conflict */ if (usecrypt + use1 + useapr1 > 1) /* conflict */
badopt = 1; badopt = 1;
/* reject unsupported algorithms */ /* reject unsupported algorithms */
# ifdef OPENSSL_NO_DES #ifdef OPENSSL_NO_DES
if (usecrypt) if (usecrypt) badopt = 1;
badopt = 1; #endif
# endif #ifdef NO_MD5CRYPT_1
# ifdef NO_MD5CRYPT_1 if (use1 || useapr1) badopt = 1;
if (use1 || useapr1) #endif
badopt = 1;
# endif
if (badopt) { if (badopt)
BIO_printf(bio_err, "Usage: passwd [options] [passwords]\n"); {
BIO_printf(bio_err, "where options are\n"); BIO_printf(bio_err, "Usage: passwd [options] [passwords]\n");
# ifndef OPENSSL_NO_DES BIO_printf(bio_err, "where options are\n");
BIO_printf(bio_err, #ifndef OPENSSL_NO_DES
"-crypt standard Unix password algorithm (default)\n"); BIO_printf(bio_err, "-crypt standard Unix password algorithm (default)\n");
# endif #endif
# ifndef NO_MD5CRYPT_1 #ifndef NO_MD5CRYPT_1
BIO_printf(bio_err, BIO_printf(bio_err, "-1 MD5-based password algorithm\n");
"-1 MD5-based password algorithm\n"); BIO_printf(bio_err, "-apr1 MD5-based password algorithm, Apache variant\n");
BIO_printf(bio_err, #endif
"-apr1 MD5-based password algorithm, Apache variant\n"); BIO_printf(bio_err, "-salt string use provided salt\n");
# endif BIO_printf(bio_err, "-in file read passwords from file\n");
BIO_printf(bio_err, "-salt string use provided salt\n"); BIO_printf(bio_err, "-stdin read passwords from stdin\n");
BIO_printf(bio_err, "-in file read passwords from file\n"); BIO_printf(bio_err, "-noverify never verify when reading password from terminal\n");
BIO_printf(bio_err, "-stdin read passwords from stdin\n"); BIO_printf(bio_err, "-quiet no warnings\n");
BIO_printf(bio_err, BIO_printf(bio_err, "-table format output as table\n");
"-noverify never verify when reading password from terminal\n"); BIO_printf(bio_err, "-reverse switch table columns\n");
BIO_printf(bio_err, "-quiet no warnings\n");
BIO_printf(bio_err, "-table format output as table\n");
BIO_printf(bio_err, "-reverse switch table columns\n");
goto err; goto err;
} }
if ((infile != NULL) || in_stdin) { if ((infile != NULL) || in_stdin)
in = BIO_new(BIO_s_file()); {
if (in == NULL) in = BIO_new(BIO_s_file());
goto err; if (in == NULL)
if (infile != NULL) { goto err;
assert(in_stdin == 0); if (infile != NULL)
if (BIO_read_filename(in, infile) <= 0) {
goto err; assert(in_stdin == 0);
} else { if (BIO_read_filename(in, infile) <= 0)
assert(in_stdin); goto err;
BIO_set_fp(in, stdin, BIO_NOCLOSE); }
} else
} {
assert(in_stdin);
BIO_set_fp(in, stdin, BIO_NOCLOSE);
}
}
if (usecrypt) if (usecrypt)
pw_maxlen = 8; pw_maxlen = 8;
else if (use1 || useapr1) else if (use1 || useapr1)
pw_maxlen = 256; /* arbitrary limit, should be enough for most pw_maxlen = 256; /* arbitrary limit, should be enough for most passwords */
* passwords */
if (passwds == NULL) { if (passwds == NULL)
/* no passwords on the command line */ {
/* no passwords on the command line */
passwd_malloc_size = pw_maxlen + 2; passwd_malloc_size = pw_maxlen + 2;
/* /* longer than necessary so that we can warn about truncation */
* longer than necessary so that we can warn about truncation passwd = passwd_malloc = OPENSSL_malloc(passwd_malloc_size);
*/ if (passwd_malloc == NULL)
passwd = passwd_malloc = OPENSSL_malloc(passwd_malloc_size); goto err;
if (passwd_malloc == NULL) }
goto err;
}
if ((in == NULL) && (passwds == NULL)) { if ((in == NULL) && (passwds == NULL))
/* build a null-terminated list */ {
static char *passwds_static[2] = { NULL, NULL }; /* build a null-terminated list */
static char *passwds_static[2] = {NULL, NULL};
passwds = passwds_static; passwds = passwds_static;
if (in == NULL) if (in == NULL)
if (EVP_read_pw_string if (EVP_read_pw_string(passwd_malloc, passwd_malloc_size, "Password: ", !(passed_salt || in_noverify)) != 0)
(passwd_malloc, passwd_malloc_size, "Password: ", goto err;
!(passed_salt || in_noverify)) != 0) passwds[0] = passwd_malloc;
goto err; }
passwds[0] = passwd_malloc;
}
if (in == NULL) { if (in == NULL)
assert(passwds != NULL); {
assert(*passwds != NULL); assert(passwds != NULL);
assert(*passwds != NULL);
do { /* loop over list of passwords */ do /* loop over list of passwords */
passwd = *passwds++; {
if (!do_passwd(passed_salt, &salt, &salt_malloc, passwd, out, passwd = *passwds++;
quiet, table, reverse, pw_maxlen, usecrypt, use1, if (!do_passwd(passed_salt, &salt, &salt_malloc, passwd, out,
useapr1)) quiet, table, reverse, pw_maxlen, usecrypt, use1, useapr1))
goto err; goto err;
} }
while (*passwds != NULL); while (*passwds != NULL);
} else }
/* in != NULL */ else
{ /* in != NULL */
int done; {
int done;
assert(passwd != NULL); assert (passwd != NULL);
do { do
int r = BIO_gets(in, passwd, pw_maxlen + 1); {
if (r > 0) { int r = BIO_gets(in, passwd, pw_maxlen + 1);
char *c = (strchr(passwd, '\n')); if (r > 0)
if (c != NULL) {
*c = 0; /* truncate at newline */ char *c = (strchr(passwd, '\n')) ;
else { if (c != NULL)
/* ignore rest of line */ *c = 0; /* truncate at newline */
char trash[BUFSIZ]; else
do {
r = BIO_gets(in, trash, sizeof trash); /* ignore rest of line */
while ((r > 0) && (!strchr(trash, '\n'))); char trash[BUFSIZ];
} do
r = BIO_gets(in, trash, sizeof trash);
while ((r > 0) && (!strchr(trash, '\n')));
}
if (!do_passwd(passed_salt, &salt, &salt_malloc, passwd, out, if (!do_passwd(passed_salt, &salt, &salt_malloc, passwd, out,
quiet, table, reverse, pw_maxlen, usecrypt, quiet, table, reverse, pw_maxlen, usecrypt, use1, useapr1))
use1, useapr1)) goto err;
goto err; }
} done = (r <= 0);
done = (r <= 0); }
} while (!done);
while (!done); }
} ret = 0;
ret = 0;
err: err:
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
if (salt_malloc) if (salt_malloc)
OPENSSL_free(salt_malloc); OPENSSL_free(salt_malloc);
if (passwd_malloc) if (passwd_malloc)
OPENSSL_free(passwd_malloc); OPENSSL_free(passwd_malloc);
if (in) if (in)
BIO_free(in); BIO_free(in);
if (out) if (out)
BIO_free_all(out); BIO_free_all(out);
apps_shutdown(); apps_shutdown();
OPENSSL_EXIT(ret); OPENSSL_EXIT(ret);
} }
# ifndef NO_MD5CRYPT_1
/* #ifndef NO_MD5CRYPT_1
* MD5-based password algorithm (should probably be available as a library /* MD5-based password algorithm (should probably be available as a library
* function; then the static buffer would not be acceptable). For magic * function; then the static buffer would not be acceptable).
* string "1", this should be compatible to the MD5-based BSD password * For magic string "1", this should be compatible to the MD5-based BSD
* algorithm. For 'magic' string "apr1", this is compatible to the MD5-based * password algorithm.
* Apache password algorithm. (Apparently, the Apache password algorithm is * For 'magic' string "apr1", this is compatible to the MD5-based Apache
* identical except that the 'magic' string was changed -- the laziest * password algorithm.
* application of the NIH principle I've ever encountered.) * (Apparently, the Apache password algorithm is identical except that the
* 'magic' string was changed -- the laziest application of the NIH principle
* I've ever encountered.)
*/ */
static char *md5crypt(const char *passwd, const char *magic, const char *salt) static char *md5crypt(const char *passwd, const char *magic, const char *salt)
{ {
/* "$apr1$..salt..$.......md5hash..........\0" */ static char out_buf[6 + 9 + 24 + 2]; /* "$apr1$..salt..$.......md5hash..........\0" */
static char out_buf[6 + 9 + 24 + 2]; unsigned char buf[MD5_DIGEST_LENGTH];
unsigned char buf[MD5_DIGEST_LENGTH]; char *salt_out;
char *salt_out; int n, i;
int n; EVP_MD_CTX md,md2;
unsigned int i; size_t passwd_len, salt_len;
EVP_MD_CTX md, md2;
size_t passwd_len, salt_len;
passwd_len = strlen(passwd); passwd_len = strlen(passwd);
out_buf[0] = '$'; out_buf[0] = '$';
out_buf[1] = 0; out_buf[1] = 0;
assert(strlen(magic) <= 4); /* "1" or "apr1" */ assert(strlen(magic) <= 4); /* "1" or "apr1" */
strncat(out_buf, magic, 4); strncat(out_buf, magic, 4);
strncat(out_buf, "$", 1); strncat(out_buf, "$", 1);
strncat(out_buf, salt, 8); strncat(out_buf, salt, 8);
assert(strlen(out_buf) <= 6 + 8); /* "$apr1$..salt.." */ assert(strlen(out_buf) <= 6 + 8); /* "$apr1$..salt.." */
salt_out = out_buf + 2 + strlen(magic); salt_out = out_buf + 2 + strlen(magic);
salt_len = strlen(salt_out); salt_len = strlen(salt_out);
assert(salt_len <= 8); assert(salt_len <= 8);
EVP_MD_CTX_init(&md); EVP_MD_CTX_init(&md);
EVP_DigestInit_ex(&md, EVP_md5(), NULL); EVP_DigestInit_ex(&md,EVP_md5(), NULL);
EVP_DigestUpdate(&md, passwd, passwd_len); EVP_DigestUpdate(&md, passwd, passwd_len);
EVP_DigestUpdate(&md, "$", 1); EVP_DigestUpdate(&md, "$", 1);
EVP_DigestUpdate(&md, magic, strlen(magic)); EVP_DigestUpdate(&md, magic, strlen(magic));
EVP_DigestUpdate(&md, "$", 1); EVP_DigestUpdate(&md, "$", 1);
EVP_DigestUpdate(&md, salt_out, salt_len); EVP_DigestUpdate(&md, salt_out, salt_len);
EVP_MD_CTX_init(&md2); EVP_MD_CTX_init(&md2);
EVP_DigestInit_ex(&md2, EVP_md5(), NULL); EVP_DigestInit_ex(&md2,EVP_md5(), NULL);
EVP_DigestUpdate(&md2, passwd, passwd_len); EVP_DigestUpdate(&md2, passwd, passwd_len);
EVP_DigestUpdate(&md2, salt_out, salt_len); EVP_DigestUpdate(&md2, salt_out, salt_len);
EVP_DigestUpdate(&md2, passwd, passwd_len); EVP_DigestUpdate(&md2, passwd, passwd_len);
EVP_DigestFinal_ex(&md2, buf, NULL); EVP_DigestFinal_ex(&md2, buf, NULL);
for (i = passwd_len; i > sizeof buf; i -= sizeof buf) for (i = passwd_len; i > sizeof buf; i -= sizeof buf)
EVP_DigestUpdate(&md, buf, sizeof buf); EVP_DigestUpdate(&md, buf, sizeof buf);
EVP_DigestUpdate(&md, buf, i); EVP_DigestUpdate(&md, buf, i);
n = passwd_len; n = passwd_len;
while (n) { while (n)
EVP_DigestUpdate(&md, (n & 1) ? "\0" : passwd, 1); {
n >>= 1; EVP_DigestUpdate(&md, (n & 1) ? "\0" : passwd, 1);
} n >>= 1;
EVP_DigestFinal_ex(&md, buf, NULL); }
EVP_DigestFinal_ex(&md, buf, NULL);
for (i = 0; i < 1000; i++) { for (i = 0; i < 1000; i++)
EVP_DigestInit_ex(&md2, EVP_md5(), NULL); {
EVP_DigestUpdate(&md2, (i & 1) ? (unsigned const char *)passwd : buf, EVP_DigestInit_ex(&md2,EVP_md5(), NULL);
(i & 1) ? passwd_len : sizeof buf); EVP_DigestUpdate(&md2, (i & 1) ? (unsigned char *) passwd : buf,
if (i % 3) (i & 1) ? passwd_len : sizeof buf);
EVP_DigestUpdate(&md2, salt_out, salt_len); if (i % 3)
if (i % 7) EVP_DigestUpdate(&md2, salt_out, salt_len);
EVP_DigestUpdate(&md2, passwd, passwd_len); if (i % 7)
EVP_DigestUpdate(&md2, (i & 1) ? buf : (unsigned const char *)passwd, EVP_DigestUpdate(&md2, passwd, passwd_len);
(i & 1) ? sizeof buf : passwd_len); EVP_DigestUpdate(&md2, (i & 1) ? buf : (unsigned char *) passwd,
EVP_DigestFinal_ex(&md2, buf, NULL); (i & 1) ? sizeof buf : passwd_len);
} EVP_DigestFinal_ex(&md2, buf, NULL);
EVP_MD_CTX_cleanup(&md2); }
EVP_MD_CTX_cleanup(&md2);
{ {
/* transform buf into output string */ /* transform buf into output string */
unsigned char buf_perm[sizeof buf]; unsigned char buf_perm[sizeof buf];
int dest, source; int dest, source;
char *output; char *output;
/* silly output permutation */ /* silly output permutation */
for (dest = 0, source = 0; dest < 14; for (dest = 0, source = 0; dest < 14; dest++, source = (source + 6) % 17)
dest++, source = (source + 6) % 17) buf_perm[dest] = buf[source];
buf_perm[dest] = buf[source]; buf_perm[14] = buf[5];
buf_perm[14] = buf[5]; buf_perm[15] = buf[11];
buf_perm[15] = buf[11]; #ifndef PEDANTIC /* Unfortunately, this generates a "no effect" warning */
# ifndef PEDANTIC /* Unfortunately, this generates a "no assert(16 == sizeof buf_perm);
* effect" warning */ #endif
assert(16 == sizeof buf_perm);
# endif
output = salt_out + salt_len; output = salt_out + salt_len;
assert(output == out_buf + strlen(out_buf)); assert(output == out_buf + strlen(out_buf));
*output++ = '$'; *output++ = '$';
for (i = 0; i < 15; i += 3) { for (i = 0; i < 15; i += 3)
*output++ = cov_2char[buf_perm[i + 2] & 0x3f]; {
*output++ = cov_2char[((buf_perm[i + 1] & 0xf) << 2) | *output++ = cov_2char[buf_perm[i+2] & 0x3f];
(buf_perm[i + 2] >> 6)]; *output++ = cov_2char[((buf_perm[i+1] & 0xf) << 2) |
*output++ = cov_2char[((buf_perm[i] & 3) << 4) | (buf_perm[i+2] >> 6)];
(buf_perm[i + 1] >> 4)]; *output++ = cov_2char[((buf_perm[i] & 3) << 4) |
*output++ = cov_2char[buf_perm[i] >> 2]; (buf_perm[i+1] >> 4)];
} *output++ = cov_2char[buf_perm[i] >> 2];
assert(i == 15); }
*output++ = cov_2char[buf_perm[i] & 0x3f]; assert(i == 15);
*output++ = cov_2char[buf_perm[i] >> 6]; *output++ = cov_2char[buf_perm[i] & 0x3f];
*output = 0; *output++ = cov_2char[buf_perm[i] >> 6];
assert(strlen(out_buf) < sizeof(out_buf)); *output = 0;
} assert(strlen(out_buf) < sizeof(out_buf));
EVP_MD_CTX_cleanup(&md); }
EVP_MD_CTX_cleanup(&md);
return out_buf;
}
#endif
return out_buf;
}
# endif
static int do_passwd(int passed_salt, char **salt_p, char **salt_malloc_p, static int do_passwd(int passed_salt, char **salt_p, char **salt_malloc_p,
char *passwd, BIO *out, int quiet, int table, char *passwd, BIO *out, int quiet, int table, int reverse,
int reverse, size_t pw_maxlen, int usecrypt, int use1, size_t pw_maxlen, int usecrypt, int use1, int useapr1)
int useapr1) {
{ char *hash = NULL;
char *hash = NULL;
assert(salt_p != NULL); assert(salt_p != NULL);
assert(salt_malloc_p != NULL); assert(salt_malloc_p != NULL);
/* first make sure we have a salt */ /* first make sure we have a salt */
if (!passed_salt) { if (!passed_salt)
# ifndef OPENSSL_NO_DES {
if (usecrypt) { #ifndef OPENSSL_NO_DES
if (*salt_malloc_p == NULL) { if (usecrypt)
*salt_p = *salt_malloc_p = OPENSSL_malloc(3); {
if (*salt_malloc_p == NULL) if (*salt_malloc_p == NULL)
goto err; {
} *salt_p = *salt_malloc_p = OPENSSL_malloc(3);
if (RAND_pseudo_bytes((unsigned char *)*salt_p, 2) < 0) if (*salt_malloc_p == NULL)
goto err; goto err;
(*salt_p)[0] = cov_2char[(*salt_p)[0] & 0x3f]; /* 6 bits */ }
(*salt_p)[1] = cov_2char[(*salt_p)[1] & 0x3f]; /* 6 bits */ if (RAND_pseudo_bytes((unsigned char *)*salt_p, 2) < 0)
(*salt_p)[2] = 0; goto err;
# ifdef CHARSET_EBCDIC (*salt_p)[0] = cov_2char[(*salt_p)[0] & 0x3f]; /* 6 bits */
ascii2ebcdic(*salt_p, *salt_p, 2); /* des_crypt will convert back (*salt_p)[1] = cov_2char[(*salt_p)[1] & 0x3f]; /* 6 bits */
* to ASCII */ (*salt_p)[2] = 0;
# endif #ifdef CHARSET_EBCDIC
} ascii2ebcdic(*salt_p, *salt_p, 2); /* des_crypt will convert
# endif /* !OPENSSL_NO_DES */ * back to ASCII */
#endif
}
#endif /* !OPENSSL_NO_DES */
# ifndef NO_MD5CRYPT_1 #ifndef NO_MD5CRYPT_1
if (use1 || useapr1) { if (use1 || useapr1)
int i; {
int i;
if (*salt_malloc_p == NULL) { if (*salt_malloc_p == NULL)
*salt_p = *salt_malloc_p = OPENSSL_malloc(9); {
if (*salt_malloc_p == NULL) *salt_p = *salt_malloc_p = OPENSSL_malloc(9);
goto err; if (*salt_malloc_p == NULL)
} goto err;
if (RAND_pseudo_bytes((unsigned char *)*salt_p, 8) < 0) }
goto err; if (RAND_pseudo_bytes((unsigned char *)*salt_p, 8) < 0)
goto err;
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
(*salt_p)[i] = cov_2char[(*salt_p)[i] & 0x3f]; /* 6 bits */ (*salt_p)[i] = cov_2char[(*salt_p)[i] & 0x3f]; /* 6 bits */
(*salt_p)[8] = 0; (*salt_p)[8] = 0;
} }
# endif /* !NO_MD5CRYPT_1 */ #endif /* !NO_MD5CRYPT_1 */
} }
assert(*salt_p != NULL); assert(*salt_p != NULL);
/* truncate password if necessary */ /* truncate password if necessary */
if ((strlen(passwd) > pw_maxlen)) { if ((strlen(passwd) > pw_maxlen))
if (!quiet) {
/* if (!quiet)
* XXX: really we should know how to print a size_t, not cast it BIO_printf(bio_err, "Warning: truncating password to %u characters\n", pw_maxlen);
*/ passwd[pw_maxlen] = 0;
BIO_printf(bio_err, }
"Warning: truncating password to %u characters\n", assert(strlen(passwd) <= pw_maxlen);
(unsigned)pw_maxlen);
passwd[pw_maxlen] = 0;
}
assert(strlen(passwd) <= pw_maxlen);
/* now compute password hash */ /* now compute password hash */
# ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
if (usecrypt) if (usecrypt)
hash = DES_crypt(passwd, *salt_p); hash = DES_crypt(passwd, *salt_p);
# endif #endif
# ifndef NO_MD5CRYPT_1 #ifndef NO_MD5CRYPT_1
if (use1 || useapr1) if (use1 || useapr1)
hash = md5crypt(passwd, (use1 ? "1" : "apr1"), *salt_p); hash = md5crypt(passwd, (use1 ? "1" : "apr1"), *salt_p);
# endif #endif
assert(hash != NULL); assert(hash != NULL);
if (table && !reverse) if (table && !reverse)
BIO_printf(out, "%s\t%s\n", passwd, hash); BIO_printf(out, "%s\t%s\n", passwd, hash);
else if (table && reverse) else if (table && reverse)
BIO_printf(out, "%s\t%s\n", hash, passwd); BIO_printf(out, "%s\t%s\n", hash, passwd);
else else
BIO_printf(out, "%s\n", hash); BIO_printf(out, "%s\n", hash);
return 1; return 1;
err: err:
return 0; return 0;
} }
#else #else
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
fputs("Program not available.\n", stderr) fputs("Program not available.\n", stderr)
OPENSSL_EXIT(1); OPENSSL_EXIT(1);
} }
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -69,244 +69,250 @@
#include <openssl/pem.h> #include <openssl/pem.h>
#undef PROG #undef PROG
#define PROG pkcs7_main #define PROG pkcs7_main
/*- /* -inform arg - input format - default PEM (DER or PEM)
* -inform arg - input format - default PEM (DER or PEM)
* -outform arg - output format - default PEM * -outform arg - output format - default PEM
* -in arg - input file - default stdin * -in arg - input file - default stdin
* -out arg - output file - default stdout * -out arg - output file - default stdout
* -print_certs * -print_certs
*/ */
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
PKCS7 *p7 = NULL;
int i, badops = 0;
BIO *in = NULL, *out = NULL;
int informat, outformat;
char *infile, *outfile, *prog;
int print_certs = 0, text = 0, noout = 0, p7_print = 0;
int ret = 1;
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
char *engine = NULL; ENGINE *e = NULL;
#endif
PKCS7 *p7=NULL;
int i,badops=0;
BIO *in=NULL,*out=NULL;
int informat,outformat;
char *infile,*outfile,*prog;
int print_certs=0,text=0,noout=0;
int ret=1;
#ifndef OPENSSL_NO_ENGINE
char *engine=NULL;
#endif #endif
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
infile = NULL; infile=NULL;
outfile = NULL; outfile=NULL;
informat = FORMAT_PEM; informat=FORMAT_PEM;
outformat = FORMAT_PEM; outformat=FORMAT_PEM;
prog = argv[0]; prog=argv[0];
argc--; argc--;
argv++; argv++;
while (argc >= 1) { while (argc >= 1)
if (strcmp(*argv, "-inform") == 0) { {
if (--argc < 1) if (strcmp(*argv,"-inform") == 0)
goto bad; {
informat = str2fmt(*(++argv)); if (--argc < 1) goto bad;
} else if (strcmp(*argv, "-outform") == 0) { informat=str2fmt(*(++argv));
if (--argc < 1) }
goto bad; else if (strcmp(*argv,"-outform") == 0)
outformat = str2fmt(*(++argv)); {
} else if (strcmp(*argv, "-in") == 0) { if (--argc < 1) goto bad;
if (--argc < 1) outformat=str2fmt(*(++argv));
goto bad; }
infile = *(++argv); else if (strcmp(*argv,"-in") == 0)
} else if (strcmp(*argv, "-out") == 0) { {
if (--argc < 1) if (--argc < 1) goto bad;
goto bad; infile= *(++argv);
outfile = *(++argv); }
} else if (strcmp(*argv, "-noout") == 0) else if (strcmp(*argv,"-out") == 0)
noout = 1; {
else if (strcmp(*argv, "-text") == 0) if (--argc < 1) goto bad;
text = 1; outfile= *(++argv);
else if (strcmp(*argv, "-print") == 0) }
p7_print = 1; else if (strcmp(*argv,"-noout") == 0)
else if (strcmp(*argv, "-print_certs") == 0) noout=1;
print_certs = 1; else if (strcmp(*argv,"-text") == 0)
text=1;
else if (strcmp(*argv,"-print_certs") == 0)
print_certs=1;
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
else if (strcmp(*argv, "-engine") == 0) { else if (strcmp(*argv,"-engine") == 0)
if (--argc < 1) {
goto bad; if (--argc < 1) goto bad;
engine = *(++argv); engine= *(++argv);
} }
#endif #endif
else { else
BIO_printf(bio_err, "unknown option %s\n", *argv); {
badops = 1; BIO_printf(bio_err,"unknown option %s\n",*argv);
break; badops=1;
} break;
argc--; }
argv++; argc--;
} argv++;
}
if (badops) { if (badops)
bad: {
BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog); bad:
BIO_printf(bio_err, "where options are\n"); BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
BIO_printf(bio_err, " -inform arg input format - DER or PEM\n"); BIO_printf(bio_err,"where options are\n");
BIO_printf(bio_err, " -outform arg output format - DER or PEM\n"); BIO_printf(bio_err," -inform arg input format - DER or PEM\n");
BIO_printf(bio_err, " -in arg input file\n"); BIO_printf(bio_err," -outform arg output format - DER or PEM\n");
BIO_printf(bio_err, " -out arg output file\n"); BIO_printf(bio_err," -in arg input file\n");
BIO_printf(bio_err, BIO_printf(bio_err," -out arg output file\n");
" -print_certs print any certs or crl in the input\n"); BIO_printf(bio_err," -print_certs print any certs or crl in the input\n");
BIO_printf(bio_err, BIO_printf(bio_err," -text print full details of certificates\n");
" -text print full details of certificates\n"); BIO_printf(bio_err," -noout don't output encoded data\n");
BIO_printf(bio_err, " -noout don't output encoded data\n");
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err, BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n");
" -engine e use engine e, possibly a hardware device.\n");
#endif #endif
ret = 1; ret = 1;
goto end; goto end;
} }
ERR_load_crypto_strings(); ERR_load_crypto_strings();
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
setup_engine(bio_err, engine, 0); e = setup_engine(bio_err, engine, 0);
#endif #endif
in = BIO_new(BIO_s_file()); in=BIO_new(BIO_s_file());
out = BIO_new(BIO_s_file()); out=BIO_new(BIO_s_file());
if ((in == NULL) || (out == NULL)) { if ((in == NULL) || (out == NULL))
ERR_print_errors(bio_err); {
goto end; ERR_print_errors(bio_err);
} goto end;
}
if (infile == NULL) if (infile == NULL)
BIO_set_fp(in, stdin, BIO_NOCLOSE); BIO_set_fp(in,stdin,BIO_NOCLOSE);
else { else
if (BIO_read_filename(in, infile) <= 0) { {
BIO_printf(bio_err, "unable to load input file\n"); if (BIO_read_filename(in,infile) <= 0)
ERR_print_errors(bio_err); if (in == NULL)
goto end; {
} perror(infile);
} goto end;
}
}
if (informat == FORMAT_ASN1) if (informat == FORMAT_ASN1)
p7 = d2i_PKCS7_bio(in, NULL); p7=d2i_PKCS7_bio(in,NULL);
else if (informat == FORMAT_PEM) else if (informat == FORMAT_PEM)
p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL); p7=PEM_read_bio_PKCS7(in,NULL,NULL,NULL);
else { else
BIO_printf(bio_err, "bad input format specified for pkcs7 object\n"); {
goto end; BIO_printf(bio_err,"bad input format specified for pkcs7 object\n");
} goto end;
if (p7 == NULL) { }
BIO_printf(bio_err, "unable to load PKCS7 object\n"); if (p7 == NULL)
ERR_print_errors(bio_err); {
goto end; BIO_printf(bio_err,"unable to load PKCS7 object\n");
} ERR_print_errors(bio_err);
goto end;
}
if (outfile == NULL) { if (outfile == NULL)
BIO_set_fp(out, stdout, BIO_NOCLOSE); {
BIO_set_fp(out,stdout,BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
#endif #endif
} else { }
if (BIO_write_filename(out, outfile) <= 0) { else
perror(outfile); {
goto end; if (BIO_write_filename(out,outfile) <= 0)
} {
} perror(outfile);
goto end;
}
}
if (p7_print) if (print_certs)
PKCS7_print_ctx(out, p7, 0, NULL); {
STACK_OF(X509) *certs=NULL;
STACK_OF(X509_CRL) *crls=NULL;
if (print_certs) { i=OBJ_obj2nid(p7->type);
STACK_OF(X509) *certs = NULL; switch (i)
STACK_OF(X509_CRL) *crls = NULL; {
case NID_pkcs7_signed:
certs=p7->d.sign->cert;
crls=p7->d.sign->crl;
break;
case NID_pkcs7_signedAndEnveloped:
certs=p7->d.signed_and_enveloped->cert;
crls=p7->d.signed_and_enveloped->crl;
break;
default:
break;
}
i = OBJ_obj2nid(p7->type); if (certs != NULL)
switch (i) { {
case NID_pkcs7_signed: X509 *x;
if (p7->d.sign != NULL) {
certs = p7->d.sign->cert;
crls = p7->d.sign->crl;
}
break;
case NID_pkcs7_signedAndEnveloped:
if (p7->d.signed_and_enveloped != NULL) {
certs = p7->d.signed_and_enveloped->cert;
crls = p7->d.signed_and_enveloped->crl;
}
break;
default:
break;
}
if (certs != NULL) { for (i=0; i<sk_X509_num(certs); i++)
X509 *x; {
x=sk_X509_value(certs,i);
if(text) X509_print(out, x);
else dump_cert_text(out, x);
for (i = 0; i < sk_X509_num(certs); i++) { if(!noout) PEM_write_bio_X509(out,x);
x = sk_X509_value(certs, i); BIO_puts(out,"\n");
if (text) }
X509_print(out, x); }
else if (crls != NULL)
dump_cert_text(out, x); {
X509_CRL *crl;
if (!noout) for (i=0; i<sk_X509_CRL_num(crls); i++)
PEM_write_bio_X509(out, x); {
BIO_puts(out, "\n"); crl=sk_X509_CRL_value(crls,i);
}
}
if (crls != NULL) {
X509_CRL *crl;
for (i = 0; i < sk_X509_CRL_num(crls); i++) { X509_CRL_print(out, crl);
crl = sk_X509_CRL_value(crls, i);
X509_CRL_print(out, crl); if(!noout)PEM_write_bio_X509_CRL(out,crl);
BIO_puts(out,"\n");
}
}
if (!noout) ret=0;
PEM_write_bio_X509_CRL(out, crl); goto end;
BIO_puts(out, "\n"); }
}
}
ret = 0; if(!noout) {
goto end; if (outformat == FORMAT_ASN1)
} i=i2d_PKCS7_bio(out,p7);
else if (outformat == FORMAT_PEM)
i=PEM_write_bio_PKCS7(out,p7);
else {
BIO_printf(bio_err,"bad output format specified for outfile\n");
goto end;
}
if (!noout) { if (!i)
if (outformat == FORMAT_ASN1) {
i = i2d_PKCS7_bio(out, p7); BIO_printf(bio_err,"unable to write pkcs7 object\n");
else if (outformat == FORMAT_PEM) ERR_print_errors(bio_err);
i = PEM_write_bio_PKCS7(out, p7); goto end;
else { }
BIO_printf(bio_err, "bad output format specified for outfile\n"); }
goto end; ret=0;
} end:
if (p7 != NULL) PKCS7_free(p7);
if (!i) { if (in != NULL) BIO_free(in);
BIO_printf(bio_err, "unable to write pkcs7 object\n"); if (out != NULL) BIO_free_all(out);
ERR_print_errors(bio_err); apps_shutdown();
goto end; OPENSSL_EXIT(ret);
} }
}
ret = 0;
end:
if (p7 != NULL)
PKCS7_free(p7);
if (in != NULL)
BIO_free(in);
if (out != NULL)
BIO_free_all(out);
apps_shutdown();
OPENSSL_EXIT(ret);
}

View File

@ -1,7 +1,6 @@
/* pkcs8.c */ /* pkcs8.c */
/* /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * project 1999.
* 1999-2004.
*/ */
/* ==================================================================== /* ====================================================================
* Copyright (c) 1999 The OpenSSL Project. All rights reserved. * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
@ -70,323 +69,301 @@ int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
ENGINE *e = NULL; ENGINE *e = NULL;
char **args, *infile = NULL, *outfile = NULL; char **args, *infile = NULL, *outfile = NULL;
char *passargin = NULL, *passargout = NULL; char *passargin = NULL, *passargout = NULL;
BIO *in = NULL, *out = NULL; BIO *in = NULL, *out = NULL;
int topk8 = 0; int topk8 = 0;
int pbe_nid = -1; int pbe_nid = -1;
const EVP_CIPHER *cipher = NULL; const EVP_CIPHER *cipher = NULL;
int iter = PKCS12_DEFAULT_ITER; int iter = PKCS12_DEFAULT_ITER;
int informat, outformat; int informat, outformat;
int p8_broken = PKCS8_OK; int p8_broken = PKCS8_OK;
int nocrypt = 0; int nocrypt = 0;
X509_SIG *p8 = NULL; X509_SIG *p8;
PKCS8_PRIV_KEY_INFO *p8inf = NULL; PKCS8_PRIV_KEY_INFO *p8inf;
EVP_PKEY *pkey = NULL; EVP_PKEY *pkey=NULL;
char pass[50], *passin = NULL, *passout = NULL, *p8pass = NULL; char pass[50], *passin = NULL, *passout = NULL, *p8pass = NULL;
int badarg = 0; int badarg = 0;
int ret = 1;
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
char *engine = NULL; char *engine=NULL;
#endif #endif
if (bio_err == NULL) if (bio_err == NULL) bio_err = BIO_new_fp (stderr, BIO_NOCLOSE);
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
informat = FORMAT_PEM; informat=FORMAT_PEM;
outformat = FORMAT_PEM; outformat=FORMAT_PEM;
ERR_load_crypto_strings(); ERR_load_crypto_strings();
OpenSSL_add_all_algorithms(); OpenSSL_add_all_algorithms();
args = argv + 1; args = argv + 1;
while (!badarg && *args && *args[0] == '-') { while (!badarg && *args && *args[0] == '-') {
if (!strcmp(*args, "-v2")) { if (!strcmp(*args,"-v2")) {
if (args[1]) { if (args[1]) {
args++; args++;
cipher = EVP_get_cipherbyname(*args); cipher=EVP_get_cipherbyname(*args);
if (!cipher) { if(!cipher) {
BIO_printf(bio_err, "Unknown cipher %s\n", *args); BIO_printf(bio_err,
badarg = 1; "Unknown cipher %s\n", *args);
} badarg = 1;
} else }
badarg = 1; } else badarg = 1;
} else if (!strcmp(*args, "-v1")) { } else if (!strcmp(*args,"-v1")) {
if (args[1]) { if (args[1]) {
args++; args++;
pbe_nid = OBJ_txt2nid(*args); pbe_nid=OBJ_txt2nid(*args);
if (pbe_nid == NID_undef) { if(pbe_nid == NID_undef) {
BIO_printf(bio_err, "Unknown PBE algorithm %s\n", *args); BIO_printf(bio_err,
badarg = 1; "Unknown PBE algorithm %s\n", *args);
} badarg = 1;
} else }
badarg = 1; } else badarg = 1;
} else if (!strcmp(*args, "-inform")) { } else if (!strcmp(*args,"-inform")) {
if (args[1]) { if (args[1]) {
args++; args++;
informat = str2fmt(*args); informat=str2fmt(*args);
} else } else badarg = 1;
badarg = 1; } else if (!strcmp(*args,"-outform")) {
} else if (!strcmp(*args, "-outform")) { if (args[1]) {
if (args[1]) { args++;
args++; outformat=str2fmt(*args);
outformat = str2fmt(*args); } else badarg = 1;
} else } else if (!strcmp (*args, "-topk8")) topk8 = 1;
badarg = 1; else if (!strcmp (*args, "-noiter")) iter = 1;
} else if (!strcmp(*args, "-topk8")) else if (!strcmp (*args, "-nocrypt")) nocrypt = 1;
topk8 = 1; else if (!strcmp (*args, "-nooct")) p8_broken = PKCS8_NO_OCTET;
else if (!strcmp(*args, "-noiter")) else if (!strcmp (*args, "-nsdb")) p8_broken = PKCS8_NS_DB;
iter = 1; else if (!strcmp (*args, "-embed")) p8_broken = PKCS8_EMBEDDED_PARAM;
else if (!strcmp(*args, "-nocrypt")) else if (!strcmp(*args,"-passin"))
nocrypt = 1; {
else if (!strcmp(*args, "-nooct")) if (!args[1]) goto bad;
p8_broken = PKCS8_NO_OCTET; passargin= *(++args);
else if (!strcmp(*args, "-nsdb")) }
p8_broken = PKCS8_NS_DB; else if (!strcmp(*args,"-passout"))
else if (!strcmp(*args, "-embed")) {
p8_broken = PKCS8_EMBEDDED_PARAM; if (!args[1]) goto bad;
else if (!strcmp(*args, "-passin")) { passargout= *(++args);
if (!args[1]) }
goto bad;
passargin = *(++args);
} else if (!strcmp(*args, "-passout")) {
if (!args[1])
goto bad;
passargout = *(++args);
}
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
else if (strcmp(*args, "-engine") == 0) { else if (strcmp(*args,"-engine") == 0)
if (!args[1]) {
goto bad; if (!args[1]) goto bad;
engine = *(++args); engine= *(++args);
} }
#endif #endif
else if (!strcmp(*args, "-in")) { else if (!strcmp (*args, "-in")) {
if (args[1]) { if (args[1]) {
args++; args++;
infile = *args; infile = *args;
} else } else badarg = 1;
badarg = 1; } else if (!strcmp (*args, "-out")) {
} else if (!strcmp(*args, "-out")) { if (args[1]) {
if (args[1]) { args++;
args++; outfile = *args;
outfile = *args; } else badarg = 1;
} else } else badarg = 1;
badarg = 1; args++;
} else }
badarg = 1;
args++;
}
if (badarg) { if (badarg) {
bad: bad:
BIO_printf(bio_err, "Usage pkcs8 [options]\n"); BIO_printf(bio_err, "Usage pkcs8 [options]\n");
BIO_printf(bio_err, "where options are\n"); BIO_printf(bio_err, "where options are\n");
BIO_printf(bio_err, "-in file input file\n"); BIO_printf(bio_err, "-in file input file\n");
BIO_printf(bio_err, "-inform X input format (DER or PEM)\n"); BIO_printf(bio_err, "-inform X input format (DER or PEM)\n");
BIO_printf(bio_err, BIO_printf(bio_err, "-passin arg input file pass phrase source\n");
"-passin arg input file pass phrase source\n"); BIO_printf(bio_err, "-outform X output format (DER or PEM)\n");
BIO_printf(bio_err, "-outform X output format (DER or PEM)\n"); BIO_printf(bio_err, "-out file output file\n");
BIO_printf(bio_err, "-out file output file\n"); BIO_printf(bio_err, "-passout arg output file pass phrase source\n");
BIO_printf(bio_err, BIO_printf(bio_err, "-topk8 output PKCS8 file\n");
"-passout arg output file pass phrase source\n"); BIO_printf(bio_err, "-nooct use (nonstandard) no octet format\n");
BIO_printf(bio_err, "-topk8 output PKCS8 file\n"); BIO_printf(bio_err, "-embed use (nonstandard) embedded DSA parameters format\n");
BIO_printf(bio_err, BIO_printf(bio_err, "-nsdb use (nonstandard) DSA Netscape DB format\n");
"-nooct use (nonstandard) no octet format\n"); BIO_printf(bio_err, "-noiter use 1 as iteration count\n");
BIO_printf(bio_err, BIO_printf(bio_err, "-nocrypt use or expect unencrypted private key\n");
"-embed use (nonstandard) embedded DSA parameters format\n"); BIO_printf(bio_err, "-v2 alg use PKCS#5 v2.0 and cipher \"alg\"\n");
BIO_printf(bio_err, BIO_printf(bio_err, "-v1 obj use PKCS#5 v1.5 and cipher \"alg\"\n");
"-nsdb use (nonstandard) DSA Netscape DB format\n");
BIO_printf(bio_err, "-noiter use 1 as iteration count\n");
BIO_printf(bio_err,
"-nocrypt use or expect unencrypted private key\n");
BIO_printf(bio_err,
"-v2 alg use PKCS#5 v2.0 and cipher \"alg\"\n");
BIO_printf(bio_err,
"-v1 obj use PKCS#5 v1.5 and cipher \"alg\"\n");
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err, BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n");
" -engine e use engine e, possibly a hardware device.\n");
#endif #endif
goto end; return (1);
} }
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
e = setup_engine(bio_err, engine, 0); e = setup_engine(bio_err, engine, 0);
#endif #endif
if (!app_passwd(bio_err, passargin, passargout, &passin, &passout)) { if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
BIO_printf(bio_err, "Error getting passwords\n"); BIO_printf(bio_err, "Error getting passwords\n");
goto end; return (1);
} }
if ((pbe_nid == -1) && !cipher) if ((pbe_nid == -1) && !cipher) pbe_nid = NID_pbeWithMD5AndDES_CBC;
pbe_nid = NID_pbeWithMD5AndDES_CBC;
if (infile) { if (infile) {
if (!(in = BIO_new_file(infile, "rb"))) { if (!(in = BIO_new_file(infile, "rb"))) {
BIO_printf(bio_err, "Can't open input file %s\n", infile); BIO_printf(bio_err,
goto end; "Can't open input file %s\n", infile);
} return (1);
} else }
in = BIO_new_fp(stdin, BIO_NOCLOSE); } else in = BIO_new_fp (stdin, BIO_NOCLOSE);
if (outfile) { if (outfile) {
if (!(out = BIO_new_file(outfile, "wb"))) { if (!(out = BIO_new_file (outfile, "wb"))) {
BIO_printf(bio_err, "Can't open output file %s\n", outfile); BIO_printf(bio_err,
goto end; "Can't open output file %s\n", outfile);
} return (1);
} else { }
out = BIO_new_fp(stdout, BIO_NOCLOSE); } else {
out = BIO_new_fp (stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
#endif #endif
} }
if (topk8) { if (topk8)
pkey = load_key(bio_err, infile, informat, 1, passin, e, "key"); {
if (!pkey) BIO_free(in); /* Not needed in this section */
goto end; pkey = load_key(bio_err, infile, informat, 1,
if (!(p8inf = EVP_PKEY2PKCS8_broken(pkey, p8_broken))) { passin, e, "key");
BIO_printf(bio_err, "Error converting key\n"); if (!pkey) {
ERR_print_errors(bio_err); return (1);
goto end; }
} if (!(p8inf = EVP_PKEY2PKCS8_broken(pkey, p8_broken))) {
if (nocrypt) { BIO_printf(bio_err, "Error converting key\n");
if (outformat == FORMAT_PEM) ERR_print_errors(bio_err);
PEM_write_bio_PKCS8_PRIV_KEY_INFO(out, p8inf); return (1);
else if (outformat == FORMAT_ASN1) }
i2d_PKCS8_PRIV_KEY_INFO_bio(out, p8inf); if(nocrypt) {
else { if(outformat == FORMAT_PEM)
BIO_printf(bio_err, "Bad format specified for key\n"); PEM_write_bio_PKCS8_PRIV_KEY_INFO(out, p8inf);
goto end; else if(outformat == FORMAT_ASN1)
} i2d_PKCS8_PRIV_KEY_INFO_bio(out, p8inf);
} else { else {
if (passout) BIO_printf(bio_err, "Bad format specified for key\n");
p8pass = passout; return (1);
else { }
p8pass = pass; } else {
if (EVP_read_pw_string if(passout) p8pass = passout;
(pass, sizeof pass, "Enter Encryption Password:", 1)) else {
goto end; p8pass = pass;
} if (EVP_read_pw_string(pass, sizeof pass, "Enter Encryption Password:", 1))
app_RAND_load_file(NULL, bio_err, 0); return (1);
if (!(p8 = PKCS8_encrypt(pbe_nid, cipher, }
p8pass, strlen(p8pass), app_RAND_load_file(NULL, bio_err, 0);
NULL, 0, iter, p8inf))) { if (!(p8 = PKCS8_encrypt(pbe_nid, cipher,
BIO_printf(bio_err, "Error encrypting key\n"); p8pass, strlen(p8pass),
ERR_print_errors(bio_err); NULL, 0, iter, p8inf))) {
goto end; BIO_printf(bio_err, "Error encrypting key\n");
} ERR_print_errors(bio_err);
app_RAND_write_file(NULL, bio_err); return (1);
if (outformat == FORMAT_PEM) }
PEM_write_bio_PKCS8(out, p8); app_RAND_write_file(NULL, bio_err);
else if (outformat == FORMAT_ASN1) if(outformat == FORMAT_PEM)
i2d_PKCS8_bio(out, p8); PEM_write_bio_PKCS8(out, p8);
else { else if(outformat == FORMAT_ASN1)
BIO_printf(bio_err, "Bad format specified for key\n"); i2d_PKCS8_bio(out, p8);
goto end; else {
} BIO_printf(bio_err, "Bad format specified for key\n");
} return (1);
}
X509_SIG_free(p8);
}
PKCS8_PRIV_KEY_INFO_free (p8inf);
EVP_PKEY_free(pkey);
BIO_free_all(out);
if(passin) OPENSSL_free(passin);
if(passout) OPENSSL_free(passout);
return (0);
}
ret = 0; if(nocrypt) {
goto end; if(informat == FORMAT_PEM)
} p8inf = PEM_read_bio_PKCS8_PRIV_KEY_INFO(in,NULL,NULL, NULL);
else if(informat == FORMAT_ASN1)
p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(in, NULL);
else {
BIO_printf(bio_err, "Bad format specified for key\n");
return (1);
}
} else {
if(informat == FORMAT_PEM)
p8 = PEM_read_bio_PKCS8(in, NULL, NULL, NULL);
else if(informat == FORMAT_ASN1)
p8 = d2i_PKCS8_bio(in, NULL);
else {
BIO_printf(bio_err, "Bad format specified for key\n");
return (1);
}
if (nocrypt) { if (!p8) {
if (informat == FORMAT_PEM) BIO_printf (bio_err, "Error reading key\n");
p8inf = PEM_read_bio_PKCS8_PRIV_KEY_INFO(in, NULL, NULL, NULL); ERR_print_errors(bio_err);
else if (informat == FORMAT_ASN1) return (1);
p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(in, NULL); }
else { if(passin) p8pass = passin;
BIO_printf(bio_err, "Bad format specified for key\n"); else {
goto end; p8pass = pass;
} EVP_read_pw_string(pass, sizeof pass, "Enter Password:", 0);
} else { }
if (informat == FORMAT_PEM) p8inf = PKCS8_decrypt(p8, p8pass, strlen(p8pass));
p8 = PEM_read_bio_PKCS8(in, NULL, NULL, NULL); X509_SIG_free(p8);
else if (informat == FORMAT_ASN1) }
p8 = d2i_PKCS8_bio(in, NULL);
else {
BIO_printf(bio_err, "Bad format specified for key\n");
goto end;
}
if (!p8) { if (!p8inf) {
BIO_printf(bio_err, "Error reading key\n"); BIO_printf(bio_err, "Error decrypting key\n");
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; return (1);
} }
if (passin)
p8pass = passin;
else {
p8pass = pass;
EVP_read_pw_string(pass, sizeof pass, "Enter Password:", 0);
}
p8inf = PKCS8_decrypt(p8, p8pass, strlen(p8pass));
}
if (!p8inf) { if (!(pkey = EVP_PKCS82PKEY(p8inf))) {
BIO_printf(bio_err, "Error decrypting key\n"); BIO_printf(bio_err, "Error converting key\n");
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; return (1);
} }
if (!(pkey = EVP_PKCS82PKEY(p8inf))) { if (p8inf->broken) {
BIO_printf(bio_err, "Error converting key\n"); BIO_printf(bio_err, "Warning: broken key encoding: ");
ERR_print_errors(bio_err); switch (p8inf->broken) {
goto end; case PKCS8_NO_OCTET:
} BIO_printf(bio_err, "No Octet String in PrivateKey\n");
break;
if (p8inf->broken) { case PKCS8_EMBEDDED_PARAM:
BIO_printf(bio_err, "Warning: broken key encoding: "); BIO_printf(bio_err, "DSA parameters included in PrivateKey\n");
switch (p8inf->broken) { break;
case PKCS8_NO_OCTET:
BIO_printf(bio_err, "No Octet String in PrivateKey\n");
break;
case PKCS8_EMBEDDED_PARAM: case PKCS8_NS_DB:
BIO_printf(bio_err, "DSA parameters included in PrivateKey\n"); BIO_printf(bio_err, "DSA public key include in PrivateKey\n");
break; break;
case PKCS8_NS_DB: default:
BIO_printf(bio_err, "DSA public key include in PrivateKey\n"); BIO_printf(bio_err, "Unknown broken type\n");
break; break;
}
}
case PKCS8_NEG_PRIVKEY: PKCS8_PRIV_KEY_INFO_free(p8inf);
BIO_printf(bio_err, "DSA private key value is negative\n"); if(outformat == FORMAT_PEM)
break; PEM_write_bio_PrivateKey(out, pkey, NULL, NULL, 0, NULL, passout);
else if(outformat == FORMAT_ASN1)
i2d_PrivateKey_bio(out, pkey);
else {
BIO_printf(bio_err, "Bad format specified for key\n");
return (1);
}
default: end:
BIO_printf(bio_err, "Unknown broken type\n"); EVP_PKEY_free(pkey);
break; BIO_free_all(out);
} BIO_free(in);
} if(passin) OPENSSL_free(passin);
if(passout) OPENSSL_free(passout);
if (outformat == FORMAT_PEM) return (0);
PEM_write_bio_PrivateKey(out, pkey, NULL, NULL, 0, NULL, passout);
else if (outformat == FORMAT_ASN1)
i2d_PrivateKey_bio(out, pkey);
else {
BIO_printf(bio_err, "Bad format specified for key\n");
goto end;
}
ret = 0;
end:
X509_SIG_free(p8);
PKCS8_PRIV_KEY_INFO_free(p8inf);
EVP_PKEY_free(pkey);
BIO_free_all(out);
BIO_free(in);
if (passin)
OPENSSL_free(passin);
if (passout)
OPENSSL_free(passout);
return ret;
} }

View File

@ -1,251 +0,0 @@
/* apps/pkey.c */
/*
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
* 2006
*/
/* ====================================================================
* Copyright (c) 2006 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#include <stdio.h>
#include <string.h>
#include "apps.h"
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#define PROG pkey_main
int MAIN(int, char **);
int MAIN(int argc, char **argv)
{
ENGINE *e = NULL;
char **args, *infile = NULL, *outfile = NULL;
char *passargin = NULL, *passargout = NULL;
BIO *in = NULL, *out = NULL;
const EVP_CIPHER *cipher = NULL;
int informat, outformat;
int pubin = 0, pubout = 0, pubtext = 0, text = 0, noout = 0;
EVP_PKEY *pkey = NULL;
char *passin = NULL, *passout = NULL;
int badarg = 0;
#ifndef OPENSSL_NO_ENGINE
char *engine = NULL;
#endif
int ret = 1;
if (bio_err == NULL)
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
if (!load_config(bio_err, NULL))
goto end;
informat = FORMAT_PEM;
outformat = FORMAT_PEM;
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
args = argv + 1;
while (!badarg && *args && *args[0] == '-') {
if (!strcmp(*args, "-inform")) {
if (args[1]) {
args++;
informat = str2fmt(*args);
} else
badarg = 1;
} else if (!strcmp(*args, "-outform")) {
if (args[1]) {
args++;
outformat = str2fmt(*args);
} else
badarg = 1;
} else if (!strcmp(*args, "-passin")) {
if (!args[1])
goto bad;
passargin = *(++args);
} else if (!strcmp(*args, "-passout")) {
if (!args[1])
goto bad;
passargout = *(++args);
}
#ifndef OPENSSL_NO_ENGINE
else if (strcmp(*args, "-engine") == 0) {
if (!args[1])
goto bad;
engine = *(++args);
}
#endif
else if (!strcmp(*args, "-in")) {
if (args[1]) {
args++;
infile = *args;
} else
badarg = 1;
} else if (!strcmp(*args, "-out")) {
if (args[1]) {
args++;
outfile = *args;
} else
badarg = 1;
} else if (strcmp(*args, "-pubin") == 0) {
pubin = 1;
pubout = 1;
pubtext = 1;
} else if (strcmp(*args, "-pubout") == 0)
pubout = 1;
else if (strcmp(*args, "-text_pub") == 0) {
pubtext = 1;
text = 1;
} else if (strcmp(*args, "-text") == 0)
text = 1;
else if (strcmp(*args, "-noout") == 0)
noout = 1;
else {
cipher = EVP_get_cipherbyname(*args + 1);
if (!cipher) {
BIO_printf(bio_err, "Unknown cipher %s\n", *args + 1);
badarg = 1;
}
}
args++;
}
if (badarg) {
bad:
BIO_printf(bio_err, "Usage pkey [options]\n");
BIO_printf(bio_err, "where options are\n");
BIO_printf(bio_err, "-in file input file\n");
BIO_printf(bio_err, "-inform X input format (DER or PEM)\n");
BIO_printf(bio_err,
"-passin arg input file pass phrase source\n");
BIO_printf(bio_err, "-outform X output format (DER or PEM)\n");
BIO_printf(bio_err, "-out file output file\n");
BIO_printf(bio_err,
"-passout arg output file pass phrase source\n");
#ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err,
"-engine e use engine e, possibly a hardware device.\n");
#endif
return 1;
}
#ifndef OPENSSL_NO_ENGINE
e = setup_engine(bio_err, engine, 0);
#endif
if (!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
BIO_printf(bio_err, "Error getting passwords\n");
goto end;
}
if (outfile) {
if (!(out = BIO_new_file(outfile, "wb"))) {
BIO_printf(bio_err, "Can't open output file %s\n", outfile);
goto end;
}
} else {
out = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out);
}
#endif
}
if (pubin)
pkey = load_pubkey(bio_err, infile, informat, 1,
passin, e, "Public Key");
else
pkey = load_key(bio_err, infile, informat, 1, passin, e, "key");
if (!pkey)
goto end;
if (!noout) {
if (outformat == FORMAT_PEM) {
if (pubout)
PEM_write_bio_PUBKEY(out, pkey);
else
PEM_write_bio_PrivateKey(out, pkey, cipher,
NULL, 0, NULL, passout);
} else if (outformat == FORMAT_ASN1) {
if (pubout)
i2d_PUBKEY_bio(out, pkey);
else
i2d_PrivateKey_bio(out, pkey);
} else {
BIO_printf(bio_err, "Bad format specified for key\n");
goto end;
}
}
if (text) {
if (pubtext)
EVP_PKEY_print_public(out, pkey, 0, NULL);
else
EVP_PKEY_print_private(out, pkey, 0, NULL);
}
ret = 0;
end:
EVP_PKEY_free(pkey);
BIO_free_all(out);
BIO_free(in);
if (passin)
OPENSSL_free(passin);
if (passout)
OPENSSL_free(passout);
return ret;
}

View File

@ -1,185 +0,0 @@
/* apps/pkeyparam.c */
/*
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
* 2006
*/
/* ====================================================================
* Copyright (c) 2006 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#include <stdio.h>
#include <string.h>
#include "apps.h"
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#define PROG pkeyparam_main
int MAIN(int, char **);
int MAIN(int argc, char **argv)
{
char **args, *infile = NULL, *outfile = NULL;
BIO *in = NULL, *out = NULL;
int text = 0, noout = 0;
EVP_PKEY *pkey = NULL;
int badarg = 0;
#ifndef OPENSSL_NO_ENGINE
char *engine = NULL;
#endif
int ret = 1;
if (bio_err == NULL)
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
if (!load_config(bio_err, NULL))
goto end;
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
args = argv + 1;
while (!badarg && *args && *args[0] == '-') {
if (!strcmp(*args, "-in")) {
if (args[1]) {
args++;
infile = *args;
} else
badarg = 1;
} else if (!strcmp(*args, "-out")) {
if (args[1]) {
args++;
outfile = *args;
} else
badarg = 1;
}
#ifndef OPENSSL_NO_ENGINE
else if (strcmp(*args, "-engine") == 0) {
if (!args[1])
goto bad;
engine = *(++args);
}
#endif
else if (strcmp(*args, "-text") == 0)
text = 1;
else if (strcmp(*args, "-noout") == 0)
noout = 1;
args++;
}
if (badarg) {
#ifndef OPENSSL_NO_ENGINE
bad:
#endif
BIO_printf(bio_err, "Usage pkeyparam [options]\n");
BIO_printf(bio_err, "where options are\n");
BIO_printf(bio_err, "-in file input file\n");
BIO_printf(bio_err, "-out file output file\n");
BIO_printf(bio_err, "-text print parameters as text\n");
BIO_printf(bio_err,
"-noout don't output encoded parameters\n");
#ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err,
"-engine e use engine e, possibly a hardware device.\n");
#endif
return 1;
}
#ifndef OPENSSL_NO_ENGINE
setup_engine(bio_err, engine, 0);
#endif
if (infile) {
if (!(in = BIO_new_file(infile, "r"))) {
BIO_printf(bio_err, "Can't open input file %s\n", infile);
goto end;
}
} else
in = BIO_new_fp(stdin, BIO_NOCLOSE);
if (outfile) {
if (!(out = BIO_new_file(outfile, "w"))) {
BIO_printf(bio_err, "Can't open output file %s\n", outfile);
goto end;
}
} else {
out = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out);
}
#endif
}
pkey = PEM_read_bio_Parameters(in, NULL);
if (!pkey) {
BIO_printf(bio_err, "Error reading parameters\n");
ERR_print_errors(bio_err);
goto end;
}
if (!noout)
PEM_write_bio_Parameters(out, pkey);
if (text)
EVP_PKEY_print_params(out, pkey, 0, NULL);
ret = 0;
end:
EVP_PKEY_free(pkey);
BIO_free_all(out);
BIO_free(in);
return ret;
}

View File

@ -1,523 +0,0 @@
/*
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
* 2006.
*/
/* ====================================================================
* Copyright (c) 2006 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#include "apps.h"
#include <string.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/evp.h>
#define KEY_PRIVKEY 1
#define KEY_PUBKEY 2
#define KEY_CERT 3
static void usage(void);
#undef PROG
#define PROG pkeyutl_main
static EVP_PKEY_CTX *init_ctx(int *pkeysize,
char *keyfile, int keyform, int key_type,
char *passargin, int pkey_op, ENGINE *e);
static int setup_peer(BIO *err, EVP_PKEY_CTX *ctx, int peerform,
const char *file);
static int do_keyop(EVP_PKEY_CTX *ctx, int pkey_op,
unsigned char *out, size_t *poutlen,
unsigned char *in, size_t inlen);
int MAIN(int argc, char **);
int MAIN(int argc, char **argv)
{
BIO *in = NULL, *out = NULL;
char *infile = NULL, *outfile = NULL, *sigfile = NULL;
ENGINE *e = NULL;
int pkey_op = EVP_PKEY_OP_SIGN, key_type = KEY_PRIVKEY;
int keyform = FORMAT_PEM, peerform = FORMAT_PEM;
char badarg = 0, rev = 0;
char hexdump = 0, asn1parse = 0;
EVP_PKEY_CTX *ctx = NULL;
char *passargin = NULL;
int keysize = -1;
unsigned char *buf_in = NULL, *buf_out = NULL, *sig = NULL;
size_t buf_outlen;
int buf_inlen = 0, siglen = -1;
int ret = 1, rv = -1;
argc--;
argv++;
if (!bio_err)
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
if (!load_config(bio_err, NULL))
goto end;
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
while (argc >= 1) {
if (!strcmp(*argv, "-in")) {
if (--argc < 1)
badarg = 1;
else
infile = *(++argv);
} else if (!strcmp(*argv, "-out")) {
if (--argc < 1)
badarg = 1;
else
outfile = *(++argv);
} else if (!strcmp(*argv, "-sigfile")) {
if (--argc < 1)
badarg = 1;
else
sigfile = *(++argv);
} else if (!strcmp(*argv, "-inkey")) {
if (--argc < 1)
badarg = 1;
else {
ctx = init_ctx(&keysize,
*(++argv), keyform, key_type,
passargin, pkey_op, e);
if (!ctx) {
BIO_puts(bio_err, "Error initializing context\n");
ERR_print_errors(bio_err);
badarg = 1;
}
}
} else if (!strcmp(*argv, "-peerkey")) {
if (--argc < 1)
badarg = 1;
else if (!setup_peer(bio_err, ctx, peerform, *(++argv)))
badarg = 1;
} else if (!strcmp(*argv, "-passin")) {
if (--argc < 1)
badarg = 1;
else
passargin = *(++argv);
} else if (strcmp(*argv, "-peerform") == 0) {
if (--argc < 1)
badarg = 1;
else
peerform = str2fmt(*(++argv));
} else if (strcmp(*argv, "-keyform") == 0) {
if (--argc < 1)
badarg = 1;
else
keyform = str2fmt(*(++argv));
}
#ifndef OPENSSL_NO_ENGINE
else if (!strcmp(*argv, "-engine")) {
if (--argc < 1)
badarg = 1;
else
e = setup_engine(bio_err, *(++argv), 0);
}
#endif
else if (!strcmp(*argv, "-pubin"))
key_type = KEY_PUBKEY;
else if (!strcmp(*argv, "-certin"))
key_type = KEY_CERT;
else if (!strcmp(*argv, "-asn1parse"))
asn1parse = 1;
else if (!strcmp(*argv, "-hexdump"))
hexdump = 1;
else if (!strcmp(*argv, "-sign"))
pkey_op = EVP_PKEY_OP_SIGN;
else if (!strcmp(*argv, "-verify"))
pkey_op = EVP_PKEY_OP_VERIFY;
else if (!strcmp(*argv, "-verifyrecover"))
pkey_op = EVP_PKEY_OP_VERIFYRECOVER;
else if (!strcmp(*argv, "-rev"))
rev = 1;
else if (!strcmp(*argv, "-encrypt"))
pkey_op = EVP_PKEY_OP_ENCRYPT;
else if (!strcmp(*argv, "-decrypt"))
pkey_op = EVP_PKEY_OP_DECRYPT;
else if (!strcmp(*argv, "-derive"))
pkey_op = EVP_PKEY_OP_DERIVE;
else if (strcmp(*argv, "-pkeyopt") == 0) {
if (--argc < 1)
badarg = 1;
else if (!ctx) {
BIO_puts(bio_err, "-pkeyopt command before -inkey\n");
badarg = 1;
} else if (pkey_ctrl_string(ctx, *(++argv)) <= 0) {
BIO_puts(bio_err, "parameter setting error\n");
ERR_print_errors(bio_err);
goto end;
}
} else
badarg = 1;
if (badarg) {
usage();
goto end;
}
argc--;
argv++;
}
if (!ctx) {
usage();
goto end;
}
if (sigfile && (pkey_op != EVP_PKEY_OP_VERIFY)) {
BIO_puts(bio_err, "Signature file specified for non verify\n");
goto end;
}
if (!sigfile && (pkey_op == EVP_PKEY_OP_VERIFY)) {
BIO_puts(bio_err, "No signature file specified for verify\n");
goto end;
}
/* FIXME: seed PRNG only if needed */
app_RAND_load_file(NULL, bio_err, 0);
if (pkey_op != EVP_PKEY_OP_DERIVE) {
if (infile) {
if (!(in = BIO_new_file(infile, "rb"))) {
BIO_puts(bio_err, "Error Opening Input File\n");
ERR_print_errors(bio_err);
goto end;
}
} else
in = BIO_new_fp(stdin, BIO_NOCLOSE);
}
if (outfile) {
if (!(out = BIO_new_file(outfile, "wb"))) {
BIO_printf(bio_err, "Error Creating Output File\n");
ERR_print_errors(bio_err);
goto end;
}
} else {
out = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out);
}
#endif
}
if (sigfile) {
BIO *sigbio = BIO_new_file(sigfile, "rb");
if (!sigbio) {
BIO_printf(bio_err, "Can't open signature file %s\n", sigfile);
goto end;
}
siglen = bio_to_mem(&sig, keysize * 10, sigbio);
BIO_free(sigbio);
if (siglen <= 0) {
BIO_printf(bio_err, "Error reading signature data\n");
goto end;
}
}
if (in) {
/* Read the input data */
buf_inlen = bio_to_mem(&buf_in, keysize * 10, in);
if (buf_inlen <= 0) {
BIO_printf(bio_err, "Error reading input Data\n");
exit(1);
}
if (rev) {
size_t i;
unsigned char ctmp;
size_t l = (size_t)buf_inlen;
for (i = 0; i < l / 2; i++) {
ctmp = buf_in[i];
buf_in[i] = buf_in[l - 1 - i];
buf_in[l - 1 - i] = ctmp;
}
}
}
if (pkey_op == EVP_PKEY_OP_VERIFY) {
rv = EVP_PKEY_verify(ctx, sig, (size_t)siglen,
buf_in, (size_t)buf_inlen);
if (rv == 0)
BIO_puts(out, "Signature Verification Failure\n");
else if (rv == 1)
BIO_puts(out, "Signature Verified Successfully\n");
if (rv >= 0)
goto end;
} else {
rv = do_keyop(ctx, pkey_op, NULL, (size_t *)&buf_outlen,
buf_in, (size_t)buf_inlen);
if (rv > 0) {
buf_out = OPENSSL_malloc(buf_outlen);
if (!buf_out)
rv = -1;
else
rv = do_keyop(ctx, pkey_op,
buf_out, (size_t *)&buf_outlen,
buf_in, (size_t)buf_inlen);
}
}
if (rv <= 0) {
BIO_printf(bio_err, "Public Key operation error\n");
ERR_print_errors(bio_err);
goto end;
}
ret = 0;
if (asn1parse) {
if (!ASN1_parse_dump(out, buf_out, buf_outlen, 1, -1))
ERR_print_errors(bio_err);
} else if (hexdump)
BIO_dump(out, (char *)buf_out, buf_outlen);
else
BIO_write(out, buf_out, buf_outlen);
end:
if (ctx)
EVP_PKEY_CTX_free(ctx);
BIO_free(in);
BIO_free_all(out);
if (buf_in)
OPENSSL_free(buf_in);
if (buf_out)
OPENSSL_free(buf_out);
if (sig)
OPENSSL_free(sig);
return ret;
}
static void usage()
{
BIO_printf(bio_err, "Usage: pkeyutl [options]\n");
BIO_printf(bio_err, "-in file input file\n");
BIO_printf(bio_err, "-out file output file\n");
BIO_printf(bio_err,
"-sigfile file signature file (verify operation only)\n");
BIO_printf(bio_err, "-inkey file input key\n");
BIO_printf(bio_err, "-keyform arg private key format - default PEM\n");
BIO_printf(bio_err, "-pubin input is a public key\n");
BIO_printf(bio_err,
"-certin input is a certificate carrying a public key\n");
BIO_printf(bio_err, "-pkeyopt X:Y public key options\n");
BIO_printf(bio_err, "-sign sign with private key\n");
BIO_printf(bio_err, "-verify verify with public key\n");
BIO_printf(bio_err,
"-verifyrecover verify with public key, recover original data\n");
BIO_printf(bio_err, "-encrypt encrypt with public key\n");
BIO_printf(bio_err, "-decrypt decrypt with private key\n");
BIO_printf(bio_err, "-derive derive shared secret\n");
BIO_printf(bio_err, "-hexdump hex dump output\n");
#ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err,
"-engine e use engine e, possibly a hardware device.\n");
#endif
BIO_printf(bio_err, "-passin arg pass phrase source\n");
}
static EVP_PKEY_CTX *init_ctx(int *pkeysize,
char *keyfile, int keyform, int key_type,
char *passargin, int pkey_op, ENGINE *e)
{
EVP_PKEY *pkey = NULL;
EVP_PKEY_CTX *ctx = NULL;
char *passin = NULL;
int rv = -1;
X509 *x;
if (((pkey_op == EVP_PKEY_OP_SIGN) || (pkey_op == EVP_PKEY_OP_DECRYPT)
|| (pkey_op == EVP_PKEY_OP_DERIVE))
&& (key_type != KEY_PRIVKEY)) {
BIO_printf(bio_err, "A private key is needed for this operation\n");
goto end;
}
if (!app_passwd(bio_err, passargin, NULL, &passin, NULL)) {
BIO_printf(bio_err, "Error getting password\n");
goto end;
}
switch (key_type) {
case KEY_PRIVKEY:
pkey = load_key(bio_err, keyfile, keyform, 0,
passin, e, "Private Key");
break;
case KEY_PUBKEY:
pkey = load_pubkey(bio_err, keyfile, keyform, 0,
NULL, e, "Public Key");
break;
case KEY_CERT:
x = load_cert(bio_err, keyfile, keyform, NULL, e, "Certificate");
if (x) {
pkey = X509_get_pubkey(x);
X509_free(x);
}
break;
}
*pkeysize = EVP_PKEY_size(pkey);
if (!pkey)
goto end;
ctx = EVP_PKEY_CTX_new(pkey, e);
EVP_PKEY_free(pkey);
if (!ctx)
goto end;
switch (pkey_op) {
case EVP_PKEY_OP_SIGN:
rv = EVP_PKEY_sign_init(ctx);
break;
case EVP_PKEY_OP_VERIFY:
rv = EVP_PKEY_verify_init(ctx);
break;
case EVP_PKEY_OP_VERIFYRECOVER:
rv = EVP_PKEY_verify_recover_init(ctx);
break;
case EVP_PKEY_OP_ENCRYPT:
rv = EVP_PKEY_encrypt_init(ctx);
break;
case EVP_PKEY_OP_DECRYPT:
rv = EVP_PKEY_decrypt_init(ctx);
break;
case EVP_PKEY_OP_DERIVE:
rv = EVP_PKEY_derive_init(ctx);
break;
}
if (rv <= 0) {
EVP_PKEY_CTX_free(ctx);
ctx = NULL;
}
end:
if (passin)
OPENSSL_free(passin);
return ctx;
}
static int setup_peer(BIO *err, EVP_PKEY_CTX *ctx, int peerform,
const char *file)
{
EVP_PKEY *peer = NULL;
int ret;
if (!ctx) {
BIO_puts(err, "-peerkey command before -inkey\n");
return 0;
}
peer = load_pubkey(bio_err, file, peerform, 0, NULL, NULL, "Peer Key");
if (!peer) {
BIO_printf(bio_err, "Error reading peer key %s\n", file);
ERR_print_errors(err);
return 0;
}
ret = EVP_PKEY_derive_set_peer(ctx, peer);
EVP_PKEY_free(peer);
if (ret <= 0)
ERR_print_errors(err);
return ret;
}
static int do_keyop(EVP_PKEY_CTX *ctx, int pkey_op,
unsigned char *out, size_t *poutlen,
unsigned char *in, size_t inlen)
{
int rv = 0;
switch (pkey_op) {
case EVP_PKEY_OP_VERIFYRECOVER:
rv = EVP_PKEY_verify_recover(ctx, out, poutlen, in, inlen);
break;
case EVP_PKEY_OP_SIGN:
rv = EVP_PKEY_sign(ctx, out, poutlen, in, inlen);
break;
case EVP_PKEY_OP_ENCRYPT:
rv = EVP_PKEY_encrypt(ctx, out, poutlen, in, inlen);
break;
case EVP_PKEY_OP_DECRYPT:
rv = EVP_PKEY_decrypt(ctx, out, poutlen, in, inlen);
break;
case EVP_PKEY_OP_DERIVE:
rv = EVP_PKEY_derive(ctx, out, poutlen);
break;
}
return rv;
}

View File

@ -1,151 +0,0 @@
/* ====================================================================
* Copyright (c) 2004 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <string.h>
#include "apps.h"
#include <openssl/bn.h>
#undef PROG
#define PROG prime_main
int MAIN(int, char **);
int MAIN(int argc, char **argv)
{
int hex = 0;
int checks = 20;
int generate = 0;
int bits = 0;
int safe = 0;
BIGNUM *bn = NULL;
BIO *bio_out;
apps_startup();
if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT);
--argc;
++argv;
while (argc >= 1 && **argv == '-') {
if (!strcmp(*argv, "-hex"))
hex = 1;
else if (!strcmp(*argv, "-generate"))
generate = 1;
else if (!strcmp(*argv, "-bits"))
if (--argc < 1)
goto bad;
else
bits = atoi(*++argv);
else if (!strcmp(*argv, "-safe"))
safe = 1;
else if (!strcmp(*argv, "-checks"))
if (--argc < 1)
goto bad;
else
checks = atoi(*++argv);
else {
BIO_printf(bio_err, "Unknown option '%s'\n", *argv);
goto bad;
}
--argc;
++argv;
}
if (argv[0] == NULL && !generate) {
BIO_printf(bio_err, "No prime specified\n");
goto bad;
}
if ((bio_out = BIO_new(BIO_s_file())) != NULL) {
BIO_set_fp(bio_out, stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
bio_out = BIO_push(tmpbio, bio_out);
}
#endif
}
if (generate) {
char *s;
if (!bits) {
BIO_printf(bio_err, "Specifiy the number of bits.\n");
return 1;
}
bn = BN_new();
BN_generate_prime_ex(bn, bits, safe, NULL, NULL, NULL);
s = hex ? BN_bn2hex(bn) : BN_bn2dec(bn);
BIO_printf(bio_out, "%s\n", s);
OPENSSL_free(s);
} else {
if (hex)
BN_hex2bn(&bn, argv[0]);
else
BN_dec2bn(&bn, argv[0]);
BN_print(bio_out, bn);
BIO_printf(bio_out, " is %sprime\n",
BN_is_prime_ex(bn, checks, NULL, NULL) ? "" : "not ");
}
BN_free(bn);
BIO_free_all(bio_out);
return 0;
bad:
BIO_printf(bio_err, "options are\n");
BIO_printf(bio_err, "%-14s hex\n", "-hex");
BIO_printf(bio_err, "%-14s number of checks\n", "-checks <n>");
return 1;
}

View File

@ -1,366 +1,298 @@
/* apps/progs.h */ /* apps/progs.h */
/* automatically generated by progs.pl for openssl.c */ /* automatically generated by progs.pl for openssl.c */
extern int verify_main(int argc, char *argv[]); extern int verify_main(int argc,char *argv[]);
extern int asn1parse_main(int argc, char *argv[]); extern int asn1parse_main(int argc,char *argv[]);
extern int req_main(int argc, char *argv[]); extern int req_main(int argc,char *argv[]);
extern int dgst_main(int argc, char *argv[]); extern int dgst_main(int argc,char *argv[]);
extern int dh_main(int argc, char *argv[]); extern int dh_main(int argc,char *argv[]);
extern int dhparam_main(int argc, char *argv[]); extern int dhparam_main(int argc,char *argv[]);
extern int enc_main(int argc, char *argv[]); extern int enc_main(int argc,char *argv[]);
extern int passwd_main(int argc, char *argv[]); extern int passwd_main(int argc,char *argv[]);
extern int gendh_main(int argc, char *argv[]); extern int gendh_main(int argc,char *argv[]);
extern int errstr_main(int argc, char *argv[]); extern int errstr_main(int argc,char *argv[]);
extern int ca_main(int argc, char *argv[]); extern int ca_main(int argc,char *argv[]);
extern int crl_main(int argc, char *argv[]); extern int crl_main(int argc,char *argv[]);
extern int rsa_main(int argc, char *argv[]); extern int rsa_main(int argc,char *argv[]);
extern int rsautl_main(int argc, char *argv[]); extern int rsautl_main(int argc,char *argv[]);
extern int dsa_main(int argc, char *argv[]); extern int dsa_main(int argc,char *argv[]);
extern int dsaparam_main(int argc, char *argv[]); extern int dsaparam_main(int argc,char *argv[]);
extern int ec_main(int argc, char *argv[]); extern int x509_main(int argc,char *argv[]);
extern int ecparam_main(int argc, char *argv[]); extern int genrsa_main(int argc,char *argv[]);
extern int x509_main(int argc, char *argv[]); extern int gendsa_main(int argc,char *argv[]);
extern int genrsa_main(int argc, char *argv[]); extern int s_server_main(int argc,char *argv[]);
extern int gendsa_main(int argc, char *argv[]); extern int s_client_main(int argc,char *argv[]);
extern int genpkey_main(int argc, char *argv[]); extern int speed_main(int argc,char *argv[]);
extern int s_server_main(int argc, char *argv[]); extern int s_time_main(int argc,char *argv[]);
extern int s_client_main(int argc, char *argv[]); extern int version_main(int argc,char *argv[]);
extern int speed_main(int argc, char *argv[]); extern int pkcs7_main(int argc,char *argv[]);
extern int s_time_main(int argc, char *argv[]); extern int crl2pkcs7_main(int argc,char *argv[]);
extern int version_main(int argc, char *argv[]); extern int sess_id_main(int argc,char *argv[]);
extern int pkcs7_main(int argc, char *argv[]); extern int ciphers_main(int argc,char *argv[]);
extern int cms_main(int argc, char *argv[]); extern int nseq_main(int argc,char *argv[]);
extern int crl2pkcs7_main(int argc, char *argv[]); extern int pkcs12_main(int argc,char *argv[]);
extern int sess_id_main(int argc, char *argv[]); extern int pkcs8_main(int argc,char *argv[]);
extern int ciphers_main(int argc, char *argv[]); extern int spkac_main(int argc,char *argv[]);
extern int nseq_main(int argc, char *argv[]); extern int smime_main(int argc,char *argv[]);
extern int pkcs12_main(int argc, char *argv[]); extern int rand_main(int argc,char *argv[]);
extern int pkcs8_main(int argc, char *argv[]); #ifndef OPENSSL_NO_ENGINE
extern int pkey_main(int argc, char *argv[]); extern int engine_main(int argc,char *argv[]);
extern int pkeyparam_main(int argc, char *argv[]); #endif
extern int pkeyutl_main(int argc, char *argv[]); extern int ocsp_main(int argc,char *argv[]);
extern int spkac_main(int argc, char *argv[]);
extern int smime_main(int argc, char *argv[]);
extern int rand_main(int argc, char *argv[]);
extern int engine_main(int argc, char *argv[]);
extern int ocsp_main(int argc, char *argv[]);
extern int prime_main(int argc, char *argv[]);
extern int ts_main(int argc, char *argv[]);
extern int srp_main(int argc, char *argv[]);
#define FUNC_TYPE_GENERAL 1 #define FUNC_TYPE_GENERAL 1
#define FUNC_TYPE_MD 2 #define FUNC_TYPE_MD 2
#define FUNC_TYPE_CIPHER 3 #define FUNC_TYPE_CIPHER 3
#define FUNC_TYPE_PKEY 4
#define FUNC_TYPE_MD_ALG 5
#define FUNC_TYPE_CIPHER_ALG 6
typedef struct { typedef struct {
int type; int type;
const char *name; char *name;
int (*func) (int argc, char *argv[]); int (*func)();
} FUNCTION; } FUNCTION;
DECLARE_LHASH_OF(FUNCTION);
FUNCTION functions[] = { FUNCTION functions[] = {
{FUNC_TYPE_GENERAL, "verify", verify_main}, {FUNC_TYPE_GENERAL,"verify",verify_main},
{FUNC_TYPE_GENERAL, "asn1parse", asn1parse_main}, {FUNC_TYPE_GENERAL,"asn1parse",asn1parse_main},
{FUNC_TYPE_GENERAL, "req", req_main}, {FUNC_TYPE_GENERAL,"req",req_main},
{FUNC_TYPE_GENERAL, "dgst", dgst_main}, {FUNC_TYPE_GENERAL,"dgst",dgst_main},
#ifndef OPENSSL_NO_DH #ifndef OPENSSL_NO_DH
{FUNC_TYPE_GENERAL, "dh", dh_main}, {FUNC_TYPE_GENERAL,"dh",dh_main},
#endif #endif
#ifndef OPENSSL_NO_DH #ifndef OPENSSL_NO_DH
{FUNC_TYPE_GENERAL, "dhparam", dhparam_main}, {FUNC_TYPE_GENERAL,"dhparam",dhparam_main},
#endif #endif
{FUNC_TYPE_GENERAL, "enc", enc_main}, {FUNC_TYPE_GENERAL,"enc",enc_main},
{FUNC_TYPE_GENERAL, "passwd", passwd_main}, {FUNC_TYPE_GENERAL,"passwd",passwd_main},
#ifndef OPENSSL_NO_DH #ifndef OPENSSL_NO_DH
{FUNC_TYPE_GENERAL, "gendh", gendh_main}, {FUNC_TYPE_GENERAL,"gendh",gendh_main},
#endif #endif
{FUNC_TYPE_GENERAL, "errstr", errstr_main}, {FUNC_TYPE_GENERAL,"errstr",errstr_main},
{FUNC_TYPE_GENERAL, "ca", ca_main}, {FUNC_TYPE_GENERAL,"ca",ca_main},
{FUNC_TYPE_GENERAL, "crl", crl_main}, {FUNC_TYPE_GENERAL,"crl",crl_main},
#ifndef OPENSSL_NO_RSA #ifndef OPENSSL_NO_RSA
{FUNC_TYPE_GENERAL, "rsa", rsa_main}, {FUNC_TYPE_GENERAL,"rsa",rsa_main},
#endif #endif
#ifndef OPENSSL_NO_RSA #ifndef OPENSSL_NO_RSA
{FUNC_TYPE_GENERAL, "rsautl", rsautl_main}, {FUNC_TYPE_GENERAL,"rsautl",rsautl_main},
#endif #endif
#ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
{FUNC_TYPE_GENERAL, "dsa", dsa_main}, {FUNC_TYPE_GENERAL,"dsa",dsa_main},
#endif #endif
#ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
{FUNC_TYPE_GENERAL, "dsaparam", dsaparam_main}, {FUNC_TYPE_GENERAL,"dsaparam",dsaparam_main},
#endif #endif
#ifndef OPENSSL_NO_EC {FUNC_TYPE_GENERAL,"x509",x509_main},
{FUNC_TYPE_GENERAL, "ec", ec_main},
#endif
#ifndef OPENSSL_NO_EC
{FUNC_TYPE_GENERAL, "ecparam", ecparam_main},
#endif
{FUNC_TYPE_GENERAL, "x509", x509_main},
#ifndef OPENSSL_NO_RSA #ifndef OPENSSL_NO_RSA
{FUNC_TYPE_GENERAL, "genrsa", genrsa_main}, {FUNC_TYPE_GENERAL,"genrsa",genrsa_main},
#endif #endif
#ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
{FUNC_TYPE_GENERAL, "gendsa", gendsa_main}, {FUNC_TYPE_GENERAL,"gendsa",gendsa_main},
#endif #endif
{FUNC_TYPE_GENERAL, "genpkey", genpkey_main}, #if !defined(OPENSSL_NO_SOCK) && !(defined(OPENSSL_NO_SSL2) && defined(OPENSSL_NO_SSL3))
#if !defined(OPENSSL_NO_SOCK) {FUNC_TYPE_GENERAL,"s_server",s_server_main},
{FUNC_TYPE_GENERAL, "s_server", s_server_main},
#endif #endif
#if !defined(OPENSSL_NO_SOCK) #if !defined(OPENSSL_NO_SOCK) && !(defined(OPENSSL_NO_SSL2) && defined(OPENSSL_NO_SSL3))
{FUNC_TYPE_GENERAL, "s_client", s_client_main}, {FUNC_TYPE_GENERAL,"s_client",s_client_main},
#endif #endif
#ifndef OPENSSL_NO_SPEED #ifndef OPENSSL_NO_SPEED
{FUNC_TYPE_GENERAL, "speed", speed_main}, {FUNC_TYPE_GENERAL,"speed",speed_main},
#endif #endif
#if !defined(OPENSSL_NO_SOCK) #if !defined(OPENSSL_NO_SOCK) && !(defined(OPENSSL_NO_SSL2) && defined(OPENSSL_NO_SSL3))
{FUNC_TYPE_GENERAL, "s_time", s_time_main}, {FUNC_TYPE_GENERAL,"s_time",s_time_main},
#endif #endif
{FUNC_TYPE_GENERAL, "version", version_main}, {FUNC_TYPE_GENERAL,"version",version_main},
{FUNC_TYPE_GENERAL, "pkcs7", pkcs7_main}, {FUNC_TYPE_GENERAL,"pkcs7",pkcs7_main},
#ifndef OPENSSL_NO_CMS {FUNC_TYPE_GENERAL,"crl2pkcs7",crl2pkcs7_main},
{FUNC_TYPE_GENERAL, "cms", cms_main}, {FUNC_TYPE_GENERAL,"sess_id",sess_id_main},
#if !defined(OPENSSL_NO_SOCK) && !(defined(OPENSSL_NO_SSL2) && defined(OPENSSL_NO_SSL3))
{FUNC_TYPE_GENERAL,"ciphers",ciphers_main},
#endif #endif
{FUNC_TYPE_GENERAL, "crl2pkcs7", crl2pkcs7_main}, {FUNC_TYPE_GENERAL,"nseq",nseq_main},
{FUNC_TYPE_GENERAL, "sess_id", sess_id_main},
#if !defined(OPENSSL_NO_SOCK)
{FUNC_TYPE_GENERAL, "ciphers", ciphers_main},
#endif
{FUNC_TYPE_GENERAL, "nseq", nseq_main},
#if !defined(OPENSSL_NO_DES) && !defined(OPENSSL_NO_SHA1) #if !defined(OPENSSL_NO_DES) && !defined(OPENSSL_NO_SHA1)
{FUNC_TYPE_GENERAL, "pkcs12", pkcs12_main}, {FUNC_TYPE_GENERAL,"pkcs12",pkcs12_main},
#endif #endif
{FUNC_TYPE_GENERAL, "pkcs8", pkcs8_main}, {FUNC_TYPE_GENERAL,"pkcs8",pkcs8_main},
{FUNC_TYPE_GENERAL, "pkey", pkey_main}, {FUNC_TYPE_GENERAL,"spkac",spkac_main},
{FUNC_TYPE_GENERAL, "pkeyparam", pkeyparam_main}, {FUNC_TYPE_GENERAL,"smime",smime_main},
{FUNC_TYPE_GENERAL, "pkeyutl", pkeyutl_main}, {FUNC_TYPE_GENERAL,"rand",rand_main},
{FUNC_TYPE_GENERAL, "spkac", spkac_main},
{FUNC_TYPE_GENERAL, "smime", smime_main},
{FUNC_TYPE_GENERAL, "rand", rand_main},
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
{FUNC_TYPE_GENERAL, "engine", engine_main}, {FUNC_TYPE_GENERAL,"engine",engine_main},
#endif
#ifndef OPENSSL_NO_OCSP
{FUNC_TYPE_GENERAL, "ocsp", ocsp_main},
#endif
{FUNC_TYPE_GENERAL, "prime", prime_main},
{FUNC_TYPE_GENERAL, "ts", ts_main},
#ifndef OPENSSL_NO_SRP
{FUNC_TYPE_GENERAL, "srp", srp_main},
#endif #endif
{FUNC_TYPE_GENERAL,"ocsp",ocsp_main},
#ifndef OPENSSL_NO_MD2 #ifndef OPENSSL_NO_MD2
{FUNC_TYPE_MD, "md2", dgst_main}, {FUNC_TYPE_MD,"md2",dgst_main},
#endif #endif
#ifndef OPENSSL_NO_MD4 #ifndef OPENSSL_NO_MD4
{FUNC_TYPE_MD, "md4", dgst_main}, {FUNC_TYPE_MD,"md4",dgst_main},
#endif #endif
#ifndef OPENSSL_NO_MD5 #ifndef OPENSSL_NO_MD5
{FUNC_TYPE_MD, "md5", dgst_main}, {FUNC_TYPE_MD,"md5",dgst_main},
#endif #endif
#ifndef OPENSSL_NO_SHA #ifndef OPENSSL_NO_SHA
{FUNC_TYPE_MD, "sha", dgst_main}, {FUNC_TYPE_MD,"sha",dgst_main},
#endif #endif
#ifndef OPENSSL_NO_SHA1 #ifndef OPENSSL_NO_SHA1
{FUNC_TYPE_MD, "sha1", dgst_main}, {FUNC_TYPE_MD,"sha1",dgst_main},
#endif #endif
#ifndef OPENSSL_NO_MDC2 #ifndef OPENSSL_NO_MDC2
{FUNC_TYPE_MD, "mdc2", dgst_main}, {FUNC_TYPE_MD,"mdc2",dgst_main},
#endif #endif
#ifndef OPENSSL_NO_RMD160 #ifndef OPENSSL_NO_RMD160
{FUNC_TYPE_MD, "rmd160", dgst_main}, {FUNC_TYPE_MD,"rmd160",dgst_main},
#endif #endif
#ifndef OPENSSL_NO_AES #ifndef OPENSSL_NO_AES
{FUNC_TYPE_CIPHER, "aes-128-cbc", enc_main}, {FUNC_TYPE_CIPHER,"aes-128-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_AES #ifndef OPENSSL_NO_AES
{FUNC_TYPE_CIPHER, "aes-128-ecb", enc_main}, {FUNC_TYPE_CIPHER,"aes-128-ecb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_AES #ifndef OPENSSL_NO_AES
{FUNC_TYPE_CIPHER, "aes-192-cbc", enc_main}, {FUNC_TYPE_CIPHER,"aes-192-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_AES #ifndef OPENSSL_NO_AES
{FUNC_TYPE_CIPHER, "aes-192-ecb", enc_main}, {FUNC_TYPE_CIPHER,"aes-192-ecb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_AES #ifndef OPENSSL_NO_AES
{FUNC_TYPE_CIPHER, "aes-256-cbc", enc_main}, {FUNC_TYPE_CIPHER,"aes-256-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_AES #ifndef OPENSSL_NO_AES
{FUNC_TYPE_CIPHER, "aes-256-ecb", enc_main}, {FUNC_TYPE_CIPHER,"aes-256-ecb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_CAMELLIA {FUNC_TYPE_CIPHER,"base64",enc_main},
{FUNC_TYPE_CIPHER, "camellia-128-cbc", enc_main}, #ifndef OPENSSL_NO_DES
#endif {FUNC_TYPE_CIPHER,"des",enc_main},
#ifndef OPENSSL_NO_CAMELLIA
{FUNC_TYPE_CIPHER, "camellia-128-ecb", enc_main},
#endif
#ifndef OPENSSL_NO_CAMELLIA
{FUNC_TYPE_CIPHER, "camellia-192-cbc", enc_main},
#endif
#ifndef OPENSSL_NO_CAMELLIA
{FUNC_TYPE_CIPHER, "camellia-192-ecb", enc_main},
#endif
#ifndef OPENSSL_NO_CAMELLIA
{FUNC_TYPE_CIPHER, "camellia-256-cbc", enc_main},
#endif
#ifndef OPENSSL_NO_CAMELLIA
{FUNC_TYPE_CIPHER, "camellia-256-ecb", enc_main},
#endif
{FUNC_TYPE_CIPHER, "base64", enc_main},
#ifdef ZLIB
{FUNC_TYPE_CIPHER, "zlib", enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des", enc_main}, {FUNC_TYPE_CIPHER,"des3",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des3", enc_main}, {FUNC_TYPE_CIPHER,"desx",enc_main},
#endif
#ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "desx", enc_main},
#endif #endif
#ifndef OPENSSL_NO_IDEA #ifndef OPENSSL_NO_IDEA
{FUNC_TYPE_CIPHER, "idea", enc_main}, {FUNC_TYPE_CIPHER,"idea",enc_main},
#endif
#ifndef OPENSSL_NO_SEED
{FUNC_TYPE_CIPHER, "seed", enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC4 #ifndef OPENSSL_NO_RC4
{FUNC_TYPE_CIPHER, "rc4", enc_main}, {FUNC_TYPE_CIPHER,"rc4",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC4 #ifndef OPENSSL_NO_RC4
{FUNC_TYPE_CIPHER, "rc4-40", enc_main}, {FUNC_TYPE_CIPHER,"rc4-40",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC2 #ifndef OPENSSL_NO_RC2
{FUNC_TYPE_CIPHER, "rc2", enc_main}, {FUNC_TYPE_CIPHER,"rc2",enc_main},
#endif #endif
#ifndef OPENSSL_NO_BF #ifndef OPENSSL_NO_BF
{FUNC_TYPE_CIPHER, "bf", enc_main}, {FUNC_TYPE_CIPHER,"bf",enc_main},
#endif #endif
#ifndef OPENSSL_NO_CAST #ifndef OPENSSL_NO_CAST
{FUNC_TYPE_CIPHER, "cast", enc_main}, {FUNC_TYPE_CIPHER,"cast",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC5 #ifndef OPENSSL_NO_RC5
{FUNC_TYPE_CIPHER, "rc5", enc_main}, {FUNC_TYPE_CIPHER,"rc5",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-ecb", enc_main}, {FUNC_TYPE_CIPHER,"des-ecb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-ede", enc_main}, {FUNC_TYPE_CIPHER,"des-ede",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-ede3", enc_main}, {FUNC_TYPE_CIPHER,"des-ede3",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-cbc", enc_main}, {FUNC_TYPE_CIPHER,"des-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-ede-cbc", enc_main}, {FUNC_TYPE_CIPHER,"des-ede-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-ede3-cbc", enc_main}, {FUNC_TYPE_CIPHER,"des-ede3-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-cfb", enc_main}, {FUNC_TYPE_CIPHER,"des-cfb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-ede-cfb", enc_main}, {FUNC_TYPE_CIPHER,"des-ede-cfb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-ede3-cfb", enc_main}, {FUNC_TYPE_CIPHER,"des-ede3-cfb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-ofb", enc_main}, {FUNC_TYPE_CIPHER,"des-ofb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-ede-ofb", enc_main}, {FUNC_TYPE_CIPHER,"des-ede-ofb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
{FUNC_TYPE_CIPHER, "des-ede3-ofb", enc_main}, {FUNC_TYPE_CIPHER,"des-ede3-ofb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_IDEA #ifndef OPENSSL_NO_IDEA
{FUNC_TYPE_CIPHER, "idea-cbc", enc_main}, {FUNC_TYPE_CIPHER,"idea-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_IDEA #ifndef OPENSSL_NO_IDEA
{FUNC_TYPE_CIPHER, "idea-ecb", enc_main}, {FUNC_TYPE_CIPHER,"idea-ecb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_IDEA #ifndef OPENSSL_NO_IDEA
{FUNC_TYPE_CIPHER, "idea-cfb", enc_main}, {FUNC_TYPE_CIPHER,"idea-cfb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_IDEA #ifndef OPENSSL_NO_IDEA
{FUNC_TYPE_CIPHER, "idea-ofb", enc_main}, {FUNC_TYPE_CIPHER,"idea-ofb",enc_main},
#endif
#ifndef OPENSSL_NO_SEED
{FUNC_TYPE_CIPHER, "seed-cbc", enc_main},
#endif
#ifndef OPENSSL_NO_SEED
{FUNC_TYPE_CIPHER, "seed-ecb", enc_main},
#endif
#ifndef OPENSSL_NO_SEED
{FUNC_TYPE_CIPHER, "seed-cfb", enc_main},
#endif
#ifndef OPENSSL_NO_SEED
{FUNC_TYPE_CIPHER, "seed-ofb", enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC2 #ifndef OPENSSL_NO_RC2
{FUNC_TYPE_CIPHER, "rc2-cbc", enc_main}, {FUNC_TYPE_CIPHER,"rc2-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC2 #ifndef OPENSSL_NO_RC2
{FUNC_TYPE_CIPHER, "rc2-ecb", enc_main}, {FUNC_TYPE_CIPHER,"rc2-ecb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC2 #ifndef OPENSSL_NO_RC2
{FUNC_TYPE_CIPHER, "rc2-cfb", enc_main}, {FUNC_TYPE_CIPHER,"rc2-cfb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC2 #ifndef OPENSSL_NO_RC2
{FUNC_TYPE_CIPHER, "rc2-ofb", enc_main}, {FUNC_TYPE_CIPHER,"rc2-ofb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC2 #ifndef OPENSSL_NO_RC2
{FUNC_TYPE_CIPHER, "rc2-64-cbc", enc_main}, {FUNC_TYPE_CIPHER,"rc2-64-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC2 #ifndef OPENSSL_NO_RC2
{FUNC_TYPE_CIPHER, "rc2-40-cbc", enc_main}, {FUNC_TYPE_CIPHER,"rc2-40-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_BF #ifndef OPENSSL_NO_BF
{FUNC_TYPE_CIPHER, "bf-cbc", enc_main}, {FUNC_TYPE_CIPHER,"bf-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_BF #ifndef OPENSSL_NO_BF
{FUNC_TYPE_CIPHER, "bf-ecb", enc_main}, {FUNC_TYPE_CIPHER,"bf-ecb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_BF #ifndef OPENSSL_NO_BF
{FUNC_TYPE_CIPHER, "bf-cfb", enc_main}, {FUNC_TYPE_CIPHER,"bf-cfb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_BF #ifndef OPENSSL_NO_BF
{FUNC_TYPE_CIPHER, "bf-ofb", enc_main}, {FUNC_TYPE_CIPHER,"bf-ofb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_CAST #ifndef OPENSSL_NO_CAST
{FUNC_TYPE_CIPHER, "cast5-cbc", enc_main}, {FUNC_TYPE_CIPHER,"cast5-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_CAST #ifndef OPENSSL_NO_CAST
{FUNC_TYPE_CIPHER, "cast5-ecb", enc_main}, {FUNC_TYPE_CIPHER,"cast5-ecb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_CAST #ifndef OPENSSL_NO_CAST
{FUNC_TYPE_CIPHER, "cast5-cfb", enc_main}, {FUNC_TYPE_CIPHER,"cast5-cfb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_CAST #ifndef OPENSSL_NO_CAST
{FUNC_TYPE_CIPHER, "cast5-ofb", enc_main}, {FUNC_TYPE_CIPHER,"cast5-ofb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_CAST #ifndef OPENSSL_NO_CAST
{FUNC_TYPE_CIPHER, "cast-cbc", enc_main}, {FUNC_TYPE_CIPHER,"cast-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC5 #ifndef OPENSSL_NO_RC5
{FUNC_TYPE_CIPHER, "rc5-cbc", enc_main}, {FUNC_TYPE_CIPHER,"rc5-cbc",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC5 #ifndef OPENSSL_NO_RC5
{FUNC_TYPE_CIPHER, "rc5-ecb", enc_main}, {FUNC_TYPE_CIPHER,"rc5-ecb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC5 #ifndef OPENSSL_NO_RC5
{FUNC_TYPE_CIPHER, "rc5-cfb", enc_main}, {FUNC_TYPE_CIPHER,"rc5-cfb",enc_main},
#endif #endif
#ifndef OPENSSL_NO_RC5 #ifndef OPENSSL_NO_RC5
{FUNC_TYPE_CIPHER, "rc5-ofb", enc_main}, {FUNC_TYPE_CIPHER,"rc5-ofb",enc_main},
#endif #endif
{0, NULL, NULL} {0,NULL,NULL}
}; };

View File

@ -13,16 +13,12 @@ print <<'EOF';
#define FUNC_TYPE_GENERAL 1 #define FUNC_TYPE_GENERAL 1
#define FUNC_TYPE_MD 2 #define FUNC_TYPE_MD 2
#define FUNC_TYPE_CIPHER 3 #define FUNC_TYPE_CIPHER 3
#define FUNC_TYPE_PKEY 4
#define FUNC_TYPE_MD_ALG 5
#define FUNC_TYPE_CIPHER_ALG 6
typedef struct { typedef struct {
int type; int type;
const char *name; char *name;
int (*func)(int argc,char *argv[]); int (*func)();
} FUNCTION; } FUNCTION;
DECLARE_LHASH_OF(FUNCTION);
FUNCTION functions[] = { FUNCTION functions[] = {
EOF EOF
@ -32,27 +28,15 @@ foreach (@ARGV)
push(@files,$_); push(@files,$_);
$str="\t{FUNC_TYPE_GENERAL,\"$_\",${_}_main},\n"; $str="\t{FUNC_TYPE_GENERAL,\"$_\",${_}_main},\n";
if (($_ =~ /^s_/) || ($_ =~ /^ciphers$/)) if (($_ =~ /^s_/) || ($_ =~ /^ciphers$/))
{ print "#if !defined(OPENSSL_NO_SOCK)\n${str}#endif\n"; } { print "#if !defined(OPENSSL_NO_SOCK) && !(defined(OPENSSL_NO_SSL2) && defined(OPENSSL_NO_SSL3))\n${str}#endif\n"; }
elsif ( ($_ =~ /^speed$/))
{ print "#ifndef OPENSSL_NO_SPEED\n${str}#endif\n"; }
elsif ( ($_ =~ /^engine$/))
{ print "#ifndef OPENSSL_NO_ENGINE\n${str}#endif\n"; }
elsif ( ($_ =~ /^rsa$/) || ($_ =~ /^genrsa$/) || ($_ =~ /^rsautl$/)) elsif ( ($_ =~ /^rsa$/) || ($_ =~ /^genrsa$/) || ($_ =~ /^rsautl$/))
{ print "#ifndef OPENSSL_NO_RSA\n${str}#endif\n"; } { print "#ifndef OPENSSL_NO_RSA\n${str}#endif\n"; }
elsif ( ($_ =~ /^dsa$/) || ($_ =~ /^gendsa$/) || ($_ =~ /^dsaparam$/)) elsif ( ($_ =~ /^dsa$/) || ($_ =~ /^gendsa$/) || ($_ =~ /^dsaparam$/))
{ print "#ifndef OPENSSL_NO_DSA\n${str}#endif\n"; } { print "#ifndef OPENSSL_NO_DSA\n${str}#endif\n"; }
elsif ( ($_ =~ /^ec$/) || ($_ =~ /^ecparam$/))
{ print "#ifndef OPENSSL_NO_EC\n${str}#endif\n";}
elsif ( ($_ =~ /^dh$/) || ($_ =~ /^gendh$/) || ($_ =~ /^dhparam$/)) elsif ( ($_ =~ /^dh$/) || ($_ =~ /^gendh$/) || ($_ =~ /^dhparam$/))
{ print "#ifndef OPENSSL_NO_DH\n${str}#endif\n"; } { print "#ifndef OPENSSL_NO_DH\n${str}#endif\n"; }
elsif ( ($_ =~ /^pkcs12$/)) elsif ( ($_ =~ /^pkcs12$/))
{ print "#if !defined(OPENSSL_NO_DES) && !defined(OPENSSL_NO_SHA1)\n${str}#endif\n"; } { print "#if !defined(OPENSSL_NO_DES) && !defined(OPENSSL_NO_SHA1)\n${str}#endif\n"; }
elsif ( ($_ =~ /^cms$/))
{ print "#ifndef OPENSSL_NO_CMS\n${str}#endif\n"; }
elsif ( ($_ =~ /^ocsp$/))
{ print "#ifndef OPENSSL_NO_OCSP\n${str}#endif\n"; }
elsif ( ($_ =~ /^srp$/))
{ print "#ifndef OPENSSL_NO_SRP\n${str}#endif\n"; }
else else
{ print $str; } { print $str; }
} }
@ -67,18 +51,14 @@ foreach (
"aes-128-cbc", "aes-128-ecb", "aes-128-cbc", "aes-128-ecb",
"aes-192-cbc", "aes-192-ecb", "aes-192-cbc", "aes-192-ecb",
"aes-256-cbc", "aes-256-ecb", "aes-256-cbc", "aes-256-ecb",
"camellia-128-cbc", "camellia-128-ecb", "base64",
"camellia-192-cbc", "camellia-192-ecb", "des", "des3", "desx", "idea", "rc4", "rc4-40",
"camellia-256-cbc", "camellia-256-ecb",
"base64", "zlib",
"des", "des3", "desx", "idea", "seed", "rc4", "rc4-40",
"rc2", "bf", "cast", "rc5", "rc2", "bf", "cast", "rc5",
"des-ecb", "des-ede", "des-ede3", "des-ecb", "des-ede", "des-ede3",
"des-cbc", "des-ede-cbc","des-ede3-cbc", "des-cbc", "des-ede-cbc","des-ede3-cbc",
"des-cfb", "des-ede-cfb","des-ede3-cfb", "des-cfb", "des-ede-cfb","des-ede3-cfb",
"des-ofb", "des-ede-ofb","des-ede3-ofb", "des-ofb", "des-ede-ofb","des-ede3-ofb",
"idea-cbc","idea-ecb", "idea-cfb", "idea-ofb", "idea-cbc","idea-ecb", "idea-cfb", "idea-ofb",
"seed-cbc","seed-ecb", "seed-cfb", "seed-ofb",
"rc2-cbc", "rc2-ecb", "rc2-cfb","rc2-ofb", "rc2-64-cbc", "rc2-40-cbc", "rc2-cbc", "rc2-ecb", "rc2-cfb","rc2-ofb", "rc2-64-cbc", "rc2-40-cbc",
"bf-cbc", "bf-ecb", "bf-cfb", "bf-ofb", "bf-cbc", "bf-ecb", "bf-cfb", "bf-ofb",
"cast5-cbc","cast5-ecb", "cast5-cfb","cast5-ofb", "cast5-cbc","cast5-ecb", "cast5-cfb","cast5-ofb",
@ -89,15 +69,12 @@ foreach (
$t=sprintf("\t{FUNC_TYPE_CIPHER,\"%s\",enc_main},\n",$_); $t=sprintf("\t{FUNC_TYPE_CIPHER,\"%s\",enc_main},\n",$_);
if ($_ =~ /des/) { $t="#ifndef OPENSSL_NO_DES\n${t}#endif\n"; } if ($_ =~ /des/) { $t="#ifndef OPENSSL_NO_DES\n${t}#endif\n"; }
elsif ($_ =~ /aes/) { $t="#ifndef OPENSSL_NO_AES\n${t}#endif\n"; } elsif ($_ =~ /aes/) { $t="#ifndef OPENSSL_NO_AES\n${t}#endif\n"; }
elsif ($_ =~ /camellia/) { $t="#ifndef OPENSSL_NO_CAMELLIA\n${t}#endif\n"; }
elsif ($_ =~ /idea/) { $t="#ifndef OPENSSL_NO_IDEA\n${t}#endif\n"; } elsif ($_ =~ /idea/) { $t="#ifndef OPENSSL_NO_IDEA\n${t}#endif\n"; }
elsif ($_ =~ /seed/) { $t="#ifndef OPENSSL_NO_SEED\n${t}#endif\n"; }
elsif ($_ =~ /rc4/) { $t="#ifndef OPENSSL_NO_RC4\n${t}#endif\n"; } elsif ($_ =~ /rc4/) { $t="#ifndef OPENSSL_NO_RC4\n${t}#endif\n"; }
elsif ($_ =~ /rc2/) { $t="#ifndef OPENSSL_NO_RC2\n${t}#endif\n"; } elsif ($_ =~ /rc2/) { $t="#ifndef OPENSSL_NO_RC2\n${t}#endif\n"; }
elsif ($_ =~ /bf/) { $t="#ifndef OPENSSL_NO_BF\n${t}#endif\n"; } elsif ($_ =~ /bf/) { $t="#ifndef OPENSSL_NO_BF\n${t}#endif\n"; }
elsif ($_ =~ /cast/) { $t="#ifndef OPENSSL_NO_CAST\n${t}#endif\n"; } elsif ($_ =~ /cast/) { $t="#ifndef OPENSSL_NO_CAST\n${t}#endif\n"; }
elsif ($_ =~ /rc5/) { $t="#ifndef OPENSSL_NO_RC5\n${t}#endif\n"; } elsif ($_ =~ /rc5/) { $t="#ifndef OPENSSL_NO_RC5\n${t}#endif\n"; }
elsif ($_ =~ /zlib/) { $t="#ifdef ZLIB\n${t}#endif\n"; }
print $t; print $t;
} }

View File

@ -66,164 +66,162 @@
#undef PROG #undef PROG
#define PROG rand_main #define PROG rand_main
/*- /* -out file - write to file
* -out file - write to file
* -rand file:file - PRNG seed files * -rand file:file - PRNG seed files
* -base64 - base64 encode output * -base64 - encode output
* -hex - hex encode output
* num - write 'num' bytes * num - write 'num' bytes
*/ */
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
int i, r, ret = 1;
int badopt;
char *outfile = NULL;
char *inrand = NULL;
int base64 = 0;
int hex = 0;
BIO *out = NULL;
int num = -1;
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
char *engine = NULL; ENGINE *e = NULL;
#endif
int i, r, ret = 1;
int badopt;
char *outfile = NULL;
char *inrand = NULL;
int base64 = 0;
BIO *out = NULL;
int num = -1;
#ifndef OPENSSL_NO_ENGINE
char *engine=NULL;
#endif #endif
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err = BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto err; goto err;
badopt = 0; badopt = 0;
i = 0; i = 0;
while (!badopt && argv[++i] != NULL) { while (!badopt && argv[++i] != NULL)
if (strcmp(argv[i], "-out") == 0) { {
if ((argv[i + 1] != NULL) && (outfile == NULL)) if (strcmp(argv[i], "-out") == 0)
outfile = argv[++i]; {
else if ((argv[i+1] != NULL) && (outfile == NULL))
badopt = 1; outfile = argv[++i];
} else
badopt = 1;
}
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
else if (strcmp(argv[i], "-engine") == 0) { else if (strcmp(argv[i], "-engine") == 0)
if ((argv[i + 1] != NULL) && (engine == NULL)) {
engine = argv[++i]; if ((argv[i+1] != NULL) && (engine == NULL))
else engine = argv[++i];
badopt = 1; else
} badopt = 1;
}
#endif #endif
else if (strcmp(argv[i], "-rand") == 0) { else if (strcmp(argv[i], "-rand") == 0)
if ((argv[i + 1] != NULL) && (inrand == NULL)) {
inrand = argv[++i]; if ((argv[i+1] != NULL) && (inrand == NULL))
else inrand = argv[++i];
badopt = 1; else
} else if (strcmp(argv[i], "-base64") == 0) { badopt = 1;
if (!base64) }
base64 = 1; else if (strcmp(argv[i], "-base64") == 0)
else {
badopt = 1; if (!base64)
} else if (strcmp(argv[i], "-hex") == 0) { base64 = 1;
if (!hex) else
hex = 1; badopt = 1;
else }
badopt = 1; else if (isdigit((unsigned char)argv[i][0]))
} else if (isdigit((unsigned char)argv[i][0])) { {
if (num < 0) { if (num < 0)
r = sscanf(argv[i], "%d", &num); {
if (r == 0 || num < 0) r = sscanf(argv[i], "%d", &num);
badopt = 1; if (r == 0 || num < 0)
} else badopt = 1;
badopt = 1; }
} else else
badopt = 1; badopt = 1;
} }
else
badopt = 1;
}
if (hex && base64) if (num < 0)
badopt = 1; badopt = 1;
if (num < 0) if (badopt)
badopt = 1; {
BIO_printf(bio_err, "Usage: rand [options] num\n");
if (badopt) { BIO_printf(bio_err, "where options are\n");
BIO_printf(bio_err, "Usage: rand [options] num\n"); BIO_printf(bio_err, "-out file - write to file\n");
BIO_printf(bio_err, "where options are\n");
BIO_printf(bio_err, "-out file - write to file\n");
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err, BIO_printf(bio_err, "-engine e - use engine e, possibly a hardware device.\n");
"-engine e - use engine e, possibly a hardware device.\n");
#endif #endif
BIO_printf(bio_err, "-rand file%cfile%c... - seed PRNG from files\n", BIO_printf(bio_err, "-rand file%cfile%c... - seed PRNG from files\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR); BIO_printf(bio_err, "-base64 - encode output\n");
BIO_printf(bio_err, "-base64 - base64 encode output\n"); goto err;
BIO_printf(bio_err, "-hex - hex encode output\n"); }
goto err;
}
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
setup_engine(bio_err, engine, 0); e = setup_engine(bio_err, engine, 0);
#endif #endif
app_RAND_load_file(NULL, bio_err, (inrand != NULL)); app_RAND_load_file(NULL, bio_err, (inrand != NULL));
if (inrand != NULL) if (inrand != NULL)
BIO_printf(bio_err, "%ld semi-random bytes loaded\n", BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
app_RAND_load_files(inrand)); app_RAND_load_files(inrand));
out = BIO_new(BIO_s_file()); out = BIO_new(BIO_s_file());
if (out == NULL) if (out == NULL)
goto err; goto err;
if (outfile != NULL) if (outfile != NULL)
r = BIO_write_filename(out, outfile); r = BIO_write_filename(out, outfile);
else { else
r = BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT); {
r = BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
#endif #endif
} }
if (r <= 0) if (r <= 0)
goto err; goto err;
if (base64) { if (base64)
BIO *b64 = BIO_new(BIO_f_base64()); {
if (b64 == NULL) BIO *b64 = BIO_new(BIO_f_base64());
goto err; if (b64 == NULL)
out = BIO_push(b64, out); goto err;
} out = BIO_push(b64, out);
}
while (num > 0) { while (num > 0)
unsigned char buf[4096]; {
int chunk; unsigned char buf[4096];
int chunk;
chunk = num; chunk = num;
if (chunk > (int)sizeof(buf)) if (chunk > sizeof buf)
chunk = sizeof buf; chunk = sizeof buf;
r = RAND_bytes(buf, chunk); r = RAND_bytes(buf, chunk);
if (r <= 0) if (r <= 0)
goto err; goto err;
if (!hex) BIO_write(out, buf, chunk);
BIO_write(out, buf, chunk); num -= chunk;
else { }
for (i = 0; i < chunk; i++) BIO_flush(out);
BIO_printf(out, "%02x", buf[i]);
}
num -= chunk;
}
if (hex)
BIO_puts(out, "\n");
(void)BIO_flush(out);
app_RAND_write_file(NULL, bio_err); app_RAND_write_file(NULL, bio_err);
ret = 0; ret = 0;
err: err:
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
if (out) if (out)
BIO_free_all(out); BIO_free_all(out);
apps_shutdown(); apps_shutdown();
OPENSSL_EXIT(ret); OPENSSL_EXIT(ret);
} }

2884
apps/req.c

File diff suppressed because it is too large Load Diff

View File

@ -56,384 +56,333 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
#include <openssl/opensslconf.h>
#ifndef OPENSSL_NO_RSA #ifndef OPENSSL_NO_RSA
# include <stdio.h> #include <stdio.h>
# include <stdlib.h> #include <stdlib.h>
# include <string.h> #include <string.h>
# include <time.h> #include <time.h>
# include "apps.h" #include "apps.h"
# include <openssl/bio.h> #include <openssl/bio.h>
# include <openssl/err.h> #include <openssl/err.h>
# include <openssl/rsa.h> #include <openssl/rsa.h>
# include <openssl/evp.h> #include <openssl/evp.h>
# include <openssl/x509.h> #include <openssl/x509.h>
# include <openssl/pem.h> #include <openssl/pem.h>
# include <openssl/bn.h>
# undef PROG #undef PROG
# define PROG rsa_main #define PROG rsa_main
/*- /* -inform arg - input format - default PEM (one of DER, NET or PEM)
* -inform arg - input format - default PEM (one of DER, NET or PEM)
* -outform arg - output format - default PEM * -outform arg - output format - default PEM
* -in arg - input file - default stdin * -in arg - input file - default stdin
* -out arg - output file - default stdout * -out arg - output file - default stdout
* -des - encrypt output if PEM format with DES in cbc mode * -des - encrypt output if PEM format with DES in cbc mode
* -des3 - encrypt output if PEM format * -des3 - encrypt output if PEM format
* -idea - encrypt output if PEM format * -idea - encrypt output if PEM format
* -seed - encrypt output if PEM format * -aes128 - encrypt output if PEM format
* -aes128 - encrypt output if PEM format * -aes192 - encrypt output if PEM format
* -aes192 - encrypt output if PEM format * -aes256 - encrypt output if PEM format
* -aes256 - encrypt output if PEM format * -text - print a text version
* -camellia128 - encrypt output if PEM format * -modulus - print the RSA key modulus
* -camellia192 - encrypt output if PEM format * -check - verify key consistency
* -camellia256 - encrypt output if PEM format * -pubin - Expect a public key in input file.
* -text - print a text version * -pubout - Output a public key.
* -modulus - print the RSA key modulus
* -check - verify key consistency
* -pubin - Expect a public key in input file.
* -pubout - Output a public key.
*/ */
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
ENGINE *e = NULL; ENGINE *e = NULL;
int ret = 1; int ret=1;
RSA *rsa = NULL; RSA *rsa=NULL;
int i, badops = 0, sgckey = 0; int i,badops=0, sgckey=0;
const EVP_CIPHER *enc = NULL; const EVP_CIPHER *enc=NULL;
BIO *out = NULL; BIO *out=NULL;
int informat, outformat, text = 0, check = 0, noout = 0; int informat,outformat,text=0,check=0,noout=0;
int pubin = 0, pubout = 0; int pubin = 0, pubout = 0;
char *infile, *outfile, *prog; char *infile,*outfile,*prog;
char *passargin = NULL, *passargout = NULL; char *passargin = NULL, *passargout = NULL;
char *passin = NULL, *passout = NULL; char *passin = NULL, *passout = NULL;
# ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
char *engine = NULL; char *engine=NULL;
# endif #endif
int modulus = 0; int modulus=0;
int pvk_encr = 2; apps_startup();
apps_startup(); if (bio_err == NULL)
if ((bio_err=BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
if (bio_err == NULL) if (!load_config(bio_err, NULL))
if ((bio_err = BIO_new(BIO_s_file())) != NULL) goto end;
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT);
if (!load_config(bio_err, NULL)) infile=NULL;
goto end; outfile=NULL;
informat=FORMAT_PEM;
outformat=FORMAT_PEM;
infile = NULL; prog=argv[0];
outfile = NULL; argc--;
informat = FORMAT_PEM; argv++;
outformat = FORMAT_PEM; while (argc >= 1)
{
if (strcmp(*argv,"-inform") == 0)
{
if (--argc < 1) goto bad;
informat=str2fmt(*(++argv));
}
else if (strcmp(*argv,"-outform") == 0)
{
if (--argc < 1) goto bad;
outformat=str2fmt(*(++argv));
}
else if (strcmp(*argv,"-in") == 0)
{
if (--argc < 1) goto bad;
infile= *(++argv);
}
else if (strcmp(*argv,"-out") == 0)
{
if (--argc < 1) goto bad;
outfile= *(++argv);
}
else if (strcmp(*argv,"-passin") == 0)
{
if (--argc < 1) goto bad;
passargin= *(++argv);
}
else if (strcmp(*argv,"-passout") == 0)
{
if (--argc < 1) goto bad;
passargout= *(++argv);
}
#ifndef OPENSSL_NO_ENGINE
else if (strcmp(*argv,"-engine") == 0)
{
if (--argc < 1) goto bad;
engine= *(++argv);
}
#endif
else if (strcmp(*argv,"-sgckey") == 0)
sgckey=1;
else if (strcmp(*argv,"-pubin") == 0)
pubin=1;
else if (strcmp(*argv,"-pubout") == 0)
pubout=1;
else if (strcmp(*argv,"-noout") == 0)
noout=1;
else if (strcmp(*argv,"-text") == 0)
text=1;
else if (strcmp(*argv,"-modulus") == 0)
modulus=1;
else if (strcmp(*argv,"-check") == 0)
check=1;
else if ((enc=EVP_get_cipherbyname(&(argv[0][1]))) == NULL)
{
BIO_printf(bio_err,"unknown option %s\n",*argv);
badops=1;
break;
}
argc--;
argv++;
}
prog = argv[0]; if (badops)
argc--; {
argv++; bad:
while (argc >= 1) { BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
if (strcmp(*argv, "-inform") == 0) { BIO_printf(bio_err,"where options are\n");
if (--argc < 1) BIO_printf(bio_err," -inform arg input format - one of DER NET PEM\n");
goto bad; BIO_printf(bio_err," -outform arg output format - one of DER NET PEM\n");
informat = str2fmt(*(++argv)); BIO_printf(bio_err," -in arg input file\n");
} else if (strcmp(*argv, "-outform") == 0) { BIO_printf(bio_err," -sgckey Use IIS SGC key format\n");
if (--argc < 1) BIO_printf(bio_err," -passin arg input file pass phrase source\n");
goto bad; BIO_printf(bio_err," -out arg output file\n");
outformat = str2fmt(*(++argv)); BIO_printf(bio_err," -passout arg output file pass phrase source\n");
} else if (strcmp(*argv, "-in") == 0) { BIO_printf(bio_err," -des encrypt PEM output with cbc des\n");
if (--argc < 1) BIO_printf(bio_err," -des3 encrypt PEM output with ede cbc des using 168 bit key\n");
goto bad; #ifndef OPENSSL_NO_IDEA
infile = *(++argv); BIO_printf(bio_err," -idea encrypt PEM output with cbc idea\n");
} else if (strcmp(*argv, "-out") == 0) { #endif
if (--argc < 1) #ifndef OPENSSL_NO_AES
goto bad; BIO_printf(bio_err," -aes128, -aes192, -aes256\n");
outfile = *(++argv); BIO_printf(bio_err," encrypt PEM output with cbc aes\n");
} else if (strcmp(*argv, "-passin") == 0) { #endif
if (--argc < 1) BIO_printf(bio_err," -text print the key in text\n");
goto bad; BIO_printf(bio_err," -noout don't print key out\n");
passargin = *(++argv); BIO_printf(bio_err," -modulus print the RSA key modulus\n");
} else if (strcmp(*argv, "-passout") == 0) { BIO_printf(bio_err," -check verify key consistency\n");
if (--argc < 1) BIO_printf(bio_err," -pubin expect a public key in input file\n");
goto bad; BIO_printf(bio_err," -pubout output a public key\n");
passargout = *(++argv); #ifndef OPENSSL_NO_ENGINE
} BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n");
# ifndef OPENSSL_NO_ENGINE #endif
else if (strcmp(*argv, "-engine") == 0) { goto end;
if (--argc < 1) }
goto bad;
engine = *(++argv);
}
# endif
else if (strcmp(*argv, "-sgckey") == 0)
sgckey = 1;
else if (strcmp(*argv, "-pubin") == 0)
pubin = 1;
else if (strcmp(*argv, "-pubout") == 0)
pubout = 1;
else if (strcmp(*argv, "-RSAPublicKey_in") == 0)
pubin = 2;
else if (strcmp(*argv, "-RSAPublicKey_out") == 0)
pubout = 2;
else if (strcmp(*argv, "-pvk-strong") == 0)
pvk_encr = 2;
else if (strcmp(*argv, "-pvk-weak") == 0)
pvk_encr = 1;
else if (strcmp(*argv, "-pvk-none") == 0)
pvk_encr = 0;
else if (strcmp(*argv, "-noout") == 0)
noout = 1;
else if (strcmp(*argv, "-text") == 0)
text = 1;
else if (strcmp(*argv, "-modulus") == 0)
modulus = 1;
else if (strcmp(*argv, "-check") == 0)
check = 1;
else if ((enc = EVP_get_cipherbyname(&(argv[0][1]))) == NULL) {
BIO_printf(bio_err, "unknown option %s\n", *argv);
badops = 1;
break;
}
argc--;
argv++;
}
if (badops) { ERR_load_crypto_strings();
bad:
BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog);
BIO_printf(bio_err, "where options are\n");
BIO_printf(bio_err,
" -inform arg input format - one of DER NET PEM\n");
BIO_printf(bio_err,
" -outform arg output format - one of DER NET PEM\n");
BIO_printf(bio_err, " -in arg input file\n");
BIO_printf(bio_err, " -sgckey Use IIS SGC key format\n");
BIO_printf(bio_err,
" -passin arg input file pass phrase source\n");
BIO_printf(bio_err, " -out arg output file\n");
BIO_printf(bio_err,
" -passout arg output file pass phrase source\n");
BIO_printf(bio_err,
" -des encrypt PEM output with cbc des\n");
BIO_printf(bio_err,
" -des3 encrypt PEM output with ede cbc des using 168 bit key\n");
# ifndef OPENSSL_NO_IDEA
BIO_printf(bio_err,
" -idea encrypt PEM output with cbc idea\n");
# endif
# ifndef OPENSSL_NO_SEED
BIO_printf(bio_err,
" -seed encrypt PEM output with cbc seed\n");
# endif
# ifndef OPENSSL_NO_AES
BIO_printf(bio_err, " -aes128, -aes192, -aes256\n");
BIO_printf(bio_err,
" encrypt PEM output with cbc aes\n");
# endif
# ifndef OPENSSL_NO_CAMELLIA
BIO_printf(bio_err, " -camellia128, -camellia192, -camellia256\n");
BIO_printf(bio_err,
" encrypt PEM output with cbc camellia\n");
# endif
BIO_printf(bio_err, " -text print the key in text\n");
BIO_printf(bio_err, " -noout don't print key out\n");
BIO_printf(bio_err, " -modulus print the RSA key modulus\n");
BIO_printf(bio_err, " -check verify key consistency\n");
BIO_printf(bio_err,
" -pubin expect a public key in input file\n");
BIO_printf(bio_err, " -pubout output a public key\n");
# ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err,
" -engine e use engine e, possibly a hardware device.\n");
# endif
goto end;
}
ERR_load_crypto_strings(); #ifndef OPENSSL_NO_ENGINE
e = setup_engine(bio_err, engine, 0);
#endif
# ifndef OPENSSL_NO_ENGINE if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
e = setup_engine(bio_err, engine, 0); BIO_printf(bio_err, "Error getting passwords\n");
# endif goto end;
}
if (!app_passwd(bio_err, passargin, passargout, &passin, &passout)) { if(check && pubin) {
BIO_printf(bio_err, "Error getting passwords\n"); BIO_printf(bio_err, "Only private keys can be checked\n");
goto end; goto end;
} }
if (check && pubin) { out=BIO_new(BIO_s_file());
BIO_printf(bio_err, "Only private keys can be checked\n");
goto end;
}
out = BIO_new(BIO_s_file()); {
EVP_PKEY *pkey;
{ if (pubin)
EVP_PKEY *pkey; pkey = load_pubkey(bio_err, infile,
(informat == FORMAT_NETSCAPE && sgckey ?
FORMAT_IISSGC : informat), 1,
passin, e, "Public Key");
else
pkey = load_key(bio_err, infile,
(informat == FORMAT_NETSCAPE && sgckey ?
FORMAT_IISSGC : informat), 1,
passin, e, "Private Key");
if (pubin) { if (pkey != NULL)
int tmpformat = -1; rsa = pkey == NULL ? NULL : EVP_PKEY_get1_RSA(pkey);
if (pubin == 2) { EVP_PKEY_free(pkey);
if (informat == FORMAT_PEM) }
tmpformat = FORMAT_PEMRSA;
else if (informat == FORMAT_ASN1)
tmpformat = FORMAT_ASN1RSA;
} else if (informat == FORMAT_NETSCAPE && sgckey)
tmpformat = FORMAT_IISSGC;
else
tmpformat = informat;
pkey = load_pubkey(bio_err, infile, tmpformat, 1, if (rsa == NULL)
passin, e, "Public Key"); {
} else ERR_print_errors(bio_err);
pkey = load_key(bio_err, infile, goto end;
(informat == FORMAT_NETSCAPE && sgckey ? }
FORMAT_IISSGC : informat), 1,
passin, e, "Private Key");
if (pkey != NULL) if (outfile == NULL)
rsa = EVP_PKEY_get1_RSA(pkey); {
EVP_PKEY_free(pkey); BIO_set_fp(out,stdout,BIO_NOCLOSE);
} #ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out);
}
#endif
}
else
{
if (BIO_write_filename(out,outfile) <= 0)
{
perror(outfile);
goto end;
}
}
if (rsa == NULL) { if (text)
ERR_print_errors(bio_err); if (!RSA_print(out,rsa,0))
goto end; {
} perror(outfile);
ERR_print_errors(bio_err);
goto end;
}
if (outfile == NULL) { if (modulus)
BIO_set_fp(out, stdout, BIO_NOCLOSE); {
# ifdef OPENSSL_SYS_VMS BIO_printf(out,"Modulus=");
{ BN_print(out,rsa->n);
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); BIO_printf(out,"\n");
out = BIO_push(tmpbio, out); }
}
# endif
} else {
if (BIO_write_filename(out, outfile) <= 0) {
perror(outfile);
goto end;
}
}
if (text) if (check)
if (!RSA_print(out, rsa, 0)) { {
perror(outfile); int r = RSA_check_key(rsa);
ERR_print_errors(bio_err);
goto end;
}
if (modulus) { if (r == 1)
BIO_printf(out, "Modulus="); BIO_printf(out,"RSA key ok\n");
BN_print(out, rsa->n); else if (r == 0)
BIO_printf(out, "\n"); {
} long err;
if (check) { while ((err = ERR_peek_error()) != 0 &&
int r = RSA_check_key(rsa); ERR_GET_LIB(err) == ERR_LIB_RSA &&
ERR_GET_FUNC(err) == RSA_F_RSA_CHECK_KEY &&
ERR_GET_REASON(err) != ERR_R_MALLOC_FAILURE)
{
BIO_printf(out, "RSA key error: %s\n", ERR_reason_error_string(err));
ERR_get_error(); /* remove e from error stack */
}
}
if (r == 1) if (r == -1 || ERR_peek_error() != 0) /* should happen only if r == -1 */
BIO_printf(out, "RSA key ok\n"); {
else if (r == 0) { ERR_print_errors(bio_err);
unsigned long err; goto end;
}
}
while ((err = ERR_peek_error()) != 0 && if (noout)
ERR_GET_LIB(err) == ERR_LIB_RSA && {
ERR_GET_FUNC(err) == RSA_F_RSA_CHECK_KEY && ret = 0;
ERR_GET_REASON(err) != ERR_R_MALLOC_FAILURE) { goto end;
BIO_printf(out, "RSA key error: %s\n", }
ERR_reason_error_string(err)); BIO_printf(bio_err,"writing RSA key\n");
ERR_get_error(); /* remove e from error stack */ if (outformat == FORMAT_ASN1) {
} if(pubout || pubin) i=i2d_RSA_PUBKEY_bio(out,rsa);
} else i=i2d_RSAPrivateKey_bio(out,rsa);
}
#ifndef OPENSSL_NO_RC4
else if (outformat == FORMAT_NETSCAPE)
{
unsigned char *p,*pp;
int size;
if (r == -1 || ERR_peek_error() != 0) { /* should happen only if r == i=1;
* -1 */ size=i2d_RSA_NET(rsa,NULL,NULL, sgckey);
ERR_print_errors(bio_err); if ((p=(unsigned char *)OPENSSL_malloc(size)) == NULL)
goto end; {
} BIO_printf(bio_err,"Memory allocation failure\n");
} goto end;
}
if (noout) { pp=p;
ret = 0; i2d_RSA_NET(rsa,&p,NULL, sgckey);
goto end; BIO_write(out,(char *)pp,size);
} OPENSSL_free(pp);
BIO_printf(bio_err, "writing RSA key\n"); }
if (outformat == FORMAT_ASN1) { #endif
if (pubout || pubin) { else if (outformat == FORMAT_PEM) {
if (pubout == 2) if(pubout || pubin)
i = i2d_RSAPublicKey_bio(out, rsa); i=PEM_write_bio_RSA_PUBKEY(out,rsa);
else else i=PEM_write_bio_RSAPrivateKey(out,rsa,
i = i2d_RSA_PUBKEY_bio(out, rsa); enc,NULL,0,NULL,passout);
} else } else {
i = i2d_RSAPrivateKey_bio(out, rsa); BIO_printf(bio_err,"bad output format specified for outfile\n");
} goto end;
# ifndef OPENSSL_NO_RC4 }
else if (outformat == FORMAT_NETSCAPE) { if (!i)
unsigned char *p, *pp; {
int size; BIO_printf(bio_err,"unable to write key\n");
ERR_print_errors(bio_err);
i = 1; }
size = i2d_RSA_NET(rsa, NULL, NULL, sgckey); else
if ((p = (unsigned char *)OPENSSL_malloc(size)) == NULL) { ret=0;
BIO_printf(bio_err, "Memory allocation failure\n"); end:
goto end; if(out != NULL) BIO_free_all(out);
} if(rsa != NULL) RSA_free(rsa);
pp = p; if(passin) OPENSSL_free(passin);
i2d_RSA_NET(rsa, &p, NULL, sgckey); if(passout) OPENSSL_free(passout);
BIO_write(out, (char *)pp, size); apps_shutdown();
OPENSSL_free(pp); OPENSSL_EXIT(ret);
} }
# endif #else /* !OPENSSL_NO_RSA */
else if (outformat == FORMAT_PEM) {
if (pubout || pubin) {
if (pubout == 2)
i = PEM_write_bio_RSAPublicKey(out, rsa);
else
i = PEM_write_bio_RSA_PUBKEY(out, rsa);
} else
i = PEM_write_bio_RSAPrivateKey(out, rsa,
enc, NULL, 0, NULL, passout);
# if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_RC4)
} else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) {
EVP_PKEY *pk;
pk = EVP_PKEY_new();
EVP_PKEY_set1_RSA(pk, rsa);
if (outformat == FORMAT_PVK)
i = i2b_PVK_bio(out, pk, pvk_encr, 0, passout);
else if (pubin || pubout)
i = i2b_PublicKey_bio(out, pk);
else
i = i2b_PrivateKey_bio(out, pk);
EVP_PKEY_free(pk);
# endif
} else {
BIO_printf(bio_err, "bad output format specified for outfile\n");
goto end;
}
if (i <= 0) {
BIO_printf(bio_err, "unable to write key\n");
ERR_print_errors(bio_err);
} else
ret = 0;
end:
if (out != NULL)
BIO_free_all(out);
if (rsa != NULL)
RSA_free(rsa);
if (passin)
OPENSSL_free(passin);
if (passout)
OPENSSL_free(passout);
apps_shutdown();
OPENSSL_EXIT(ret);
}
#else /* !OPENSSL_NO_RSA */
# if PEDANTIC # if PEDANTIC
static void *dummy = &dummy; static void *dummy=&dummy;
# endif # endif
#endif #endif

View File

@ -1,7 +1,6 @@
/* rsautl.c */ /* rsautl.c */
/* /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * project 2000.
* 2000.
*/ */
/* ==================================================================== /* ====================================================================
* Copyright (c) 2000 The OpenSSL Project. All rights reserved. * Copyright (c) 2000 The OpenSSL Project. All rights reserved.
@ -57,319 +56,275 @@
* *
*/ */
#include <openssl/opensslconf.h>
#ifndef OPENSSL_NO_RSA #ifndef OPENSSL_NO_RSA
# include "apps.h" #include "apps.h"
# include <string.h> #include <string.h>
# include <openssl/err.h> #include <openssl/err.h>
# include <openssl/pem.h> #include <openssl/pem.h>
# include <openssl/rsa.h>
# define RSA_SIGN 1 #define RSA_SIGN 1
# define RSA_VERIFY 2 #define RSA_VERIFY 2
# define RSA_ENCRYPT 3 #define RSA_ENCRYPT 3
# define RSA_DECRYPT 4 #define RSA_DECRYPT 4
# define KEY_PRIVKEY 1 #define KEY_PRIVKEY 1
# define KEY_PUBKEY 2 #define KEY_PUBKEY 2
# define KEY_CERT 3 #define KEY_CERT 3
static void usage(void); static void usage(void);
# undef PROG #undef PROG
# define PROG rsautl_main #define PROG rsautl_main
int MAIN(int argc, char **); int MAIN(int argc, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
ENGINE *e = NULL; ENGINE *e = NULL;
BIO *in = NULL, *out = NULL; BIO *in = NULL, *out = NULL;
char *infile = NULL, *outfile = NULL; char *infile = NULL, *outfile = NULL;
# ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
char *engine = NULL; char *engine = NULL;
# endif #endif
char *keyfile = NULL; char *keyfile = NULL;
char rsa_mode = RSA_VERIFY, key_type = KEY_PRIVKEY; char rsa_mode = RSA_VERIFY, key_type = KEY_PRIVKEY;
int keyform = FORMAT_PEM; int keyform = FORMAT_PEM;
char need_priv = 0, badarg = 0, rev = 0; char need_priv = 0, badarg = 0, rev = 0;
char hexdump = 0, asn1parse = 0; char hexdump = 0, asn1parse = 0;
X509 *x; X509 *x;
EVP_PKEY *pkey = NULL; EVP_PKEY *pkey = NULL;
RSA *rsa = NULL; RSA *rsa = NULL;
unsigned char *rsa_in = NULL, *rsa_out = NULL, pad; unsigned char *rsa_in = NULL, *rsa_out = NULL, pad;
char *passargin = NULL, *passin = NULL; char *passargin = NULL, *passin = NULL;
int rsa_inlen, rsa_outlen = 0; int rsa_inlen, rsa_outlen = 0;
int keysize; int keysize;
int ret = 1; int ret = 1;
argc--; argc--;
argv++; argv++;
if (!bio_err) if(!bio_err) bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
ERR_load_crypto_strings(); ERR_load_crypto_strings();
OpenSSL_add_all_algorithms(); OpenSSL_add_all_algorithms();
pad = RSA_PKCS1_PADDING; pad = RSA_PKCS1_PADDING;
while (argc >= 1) { while(argc >= 1)
if (!strcmp(*argv, "-in")) { {
if (--argc < 1) if (!strcmp(*argv,"-in")) {
badarg = 1; if (--argc < 1) badarg = 1;
else infile= *(++argv);
infile = *(++argv); } else if (!strcmp(*argv,"-out")) {
} else if (!strcmp(*argv, "-out")) { if (--argc < 1) badarg = 1;
if (--argc < 1) outfile= *(++argv);
badarg = 1; } else if(!strcmp(*argv, "-inkey")) {
else if (--argc < 1) badarg = 1;
outfile = *(++argv); keyfile = *(++argv);
} else if (!strcmp(*argv, "-inkey")) { } else if (!strcmp(*argv,"-passin")) {
if (--argc < 1) if (--argc < 1) badarg = 1;
badarg = 1; passargin= *(++argv);
else } else if (strcmp(*argv,"-keyform") == 0) {
keyfile = *(++argv); if (--argc < 1) badarg = 1;
} else if (!strcmp(*argv, "-passin")) { keyform=str2fmt(*(++argv));
if (--argc < 1) #ifndef OPENSSL_NO_ENGINE
badarg = 1; } else if(!strcmp(*argv, "-engine")) {
else if (--argc < 1) badarg = 1;
passargin = *(++argv); engine = *(++argv);
} else if (strcmp(*argv, "-keyform") == 0) { #endif
if (--argc < 1) } else if(!strcmp(*argv, "-pubin")) {
badarg = 1; key_type = KEY_PUBKEY;
else } else if(!strcmp(*argv, "-certin")) {
keyform = str2fmt(*(++argv)); key_type = KEY_CERT;
# ifndef OPENSSL_NO_ENGINE }
} else if (!strcmp(*argv, "-engine")) { else if(!strcmp(*argv, "-asn1parse")) asn1parse = 1;
if (--argc < 1) else if(!strcmp(*argv, "-hexdump")) hexdump = 1;
badarg = 1; else if(!strcmp(*argv, "-raw")) pad = RSA_NO_PADDING;
else else if(!strcmp(*argv, "-oaep")) pad = RSA_PKCS1_OAEP_PADDING;
engine = *(++argv); else if(!strcmp(*argv, "-ssl")) pad = RSA_SSLV23_PADDING;
# endif else if(!strcmp(*argv, "-pkcs")) pad = RSA_PKCS1_PADDING;
} else if (!strcmp(*argv, "-pubin")) { else if(!strcmp(*argv, "-sign")) {
key_type = KEY_PUBKEY; rsa_mode = RSA_SIGN;
} else if (!strcmp(*argv, "-certin")) { need_priv = 1;
key_type = KEY_CERT; } else if(!strcmp(*argv, "-verify")) rsa_mode = RSA_VERIFY;
} else if (!strcmp(*argv, "-asn1parse")) else if(!strcmp(*argv, "-rev")) rev = 1;
asn1parse = 1; else if(!strcmp(*argv, "-encrypt")) rsa_mode = RSA_ENCRYPT;
else if (!strcmp(*argv, "-hexdump")) else if(!strcmp(*argv, "-decrypt")) {
hexdump = 1; rsa_mode = RSA_DECRYPT;
else if (!strcmp(*argv, "-raw")) need_priv = 1;
pad = RSA_NO_PADDING; } else badarg = 1;
else if (!strcmp(*argv, "-oaep")) if(badarg) {
pad = RSA_PKCS1_OAEP_PADDING; usage();
else if (!strcmp(*argv, "-ssl")) goto end;
pad = RSA_SSLV23_PADDING; }
else if (!strcmp(*argv, "-pkcs")) argc--;
pad = RSA_PKCS1_PADDING; argv++;
else if (!strcmp(*argv, "-x931")) }
pad = RSA_X931_PADDING;
else if (!strcmp(*argv, "-sign")) {
rsa_mode = RSA_SIGN;
need_priv = 1;
} else if (!strcmp(*argv, "-verify"))
rsa_mode = RSA_VERIFY;
else if (!strcmp(*argv, "-rev"))
rev = 1;
else if (!strcmp(*argv, "-encrypt"))
rsa_mode = RSA_ENCRYPT;
else if (!strcmp(*argv, "-decrypt")) {
rsa_mode = RSA_DECRYPT;
need_priv = 1;
} else
badarg = 1;
if (badarg) {
usage();
goto end;
}
argc--;
argv++;
}
if (need_priv && (key_type != KEY_PRIVKEY)) { if(need_priv && (key_type != KEY_PRIVKEY)) {
BIO_printf(bio_err, "A private key is needed for this operation\n"); BIO_printf(bio_err, "A private key is needed for this operation\n");
goto end; goto end;
} }
# ifndef OPENSSL_NO_ENGINE
e = setup_engine(bio_err, engine, 0); #ifndef OPENSSL_NO_ENGINE
# endif e = setup_engine(bio_err, engine, 0);
if (!app_passwd(bio_err, passargin, NULL, &passin, NULL)) { #endif
BIO_printf(bio_err, "Error getting password\n"); if(!app_passwd(bio_err, passargin, NULL, &passin, NULL)) {
goto end; BIO_printf(bio_err, "Error getting password\n");
} goto end;
}
/* FIXME: seed PRNG only if needed */ /* FIXME: seed PRNG only if needed */
app_RAND_load_file(NULL, bio_err, 0); app_RAND_load_file(NULL, bio_err, 0);
switch (key_type) { switch(key_type) {
case KEY_PRIVKEY: case KEY_PRIVKEY:
pkey = load_key(bio_err, keyfile, keyform, 0, pkey = load_key(bio_err, keyfile, keyform, 0,
passin, e, "Private Key"); passin, e, "Private Key");
break; break;
case KEY_PUBKEY: case KEY_PUBKEY:
pkey = load_pubkey(bio_err, keyfile, keyform, 0, pkey = load_pubkey(bio_err, keyfile, keyform, 0,
NULL, e, "Public Key"); NULL, e, "Public Key");
break; break;
case KEY_CERT: case KEY_CERT:
x = load_cert(bio_err, keyfile, keyform, NULL, e, "Certificate"); x = load_cert(bio_err, keyfile, keyform,
if (x) { NULL, e, "Certificate");
pkey = X509_get_pubkey(x); if(x) {
X509_free(x); pkey = X509_get_pubkey(x);
} X509_free(x);
break; }
} break;
}
if (!pkey) { if(!pkey) {
return 1; return 1;
} }
rsa = EVP_PKEY_get1_RSA(pkey); rsa = EVP_PKEY_get1_RSA(pkey);
EVP_PKEY_free(pkey); EVP_PKEY_free(pkey);
if (!rsa) { if(!rsa) {
BIO_printf(bio_err, "Error getting RSA key\n"); BIO_printf(bio_err, "Error getting RSA key\n");
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
} }
if (infile) {
if (!(in = BIO_new_file(infile, "rb"))) {
BIO_printf(bio_err, "Error Reading Input File\n");
ERR_print_errors(bio_err);
goto end;
}
} else
in = BIO_new_fp(stdin, BIO_NOCLOSE);
if (outfile) { if(infile) {
if (!(out = BIO_new_file(outfile, "wb"))) { if(!(in = BIO_new_file(infile, "rb"))) {
BIO_printf(bio_err, "Error Reading Output File\n"); BIO_printf(bio_err, "Error Reading Input File\n");
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
} }
} else { } else in = BIO_new_fp(stdin, BIO_NOCLOSE);
out = BIO_new_fp(stdout, BIO_NOCLOSE);
# ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out);
}
# endif
}
keysize = RSA_size(rsa); if(outfile) {
if(!(out = BIO_new_file(outfile, "wb"))) {
BIO_printf(bio_err, "Error Reading Output File\n");
ERR_print_errors(bio_err);
goto end;
}
} else {
out = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS
{
BIO *tmpbio = BIO_new(BIO_f_linebuffer());
out = BIO_push(tmpbio, out);
}
#endif
}
rsa_in = OPENSSL_malloc(keysize * 2); keysize = RSA_size(rsa);
rsa_out = OPENSSL_malloc(keysize);
if (!rsa_in || !rsa_out) {
BIO_printf(bio_err, "Out of memory\n");
ERR_print_errors(bio_err);
goto end;
}
/* Read the input data */ rsa_in = OPENSSL_malloc(keysize * 2);
rsa_inlen = BIO_read(in, rsa_in, keysize * 2); rsa_out = OPENSSL_malloc(keysize);
if (rsa_inlen <= 0) {
BIO_printf(bio_err, "Error reading input Data\n");
exit(1);
}
if (rev) {
int i;
unsigned char ctmp;
for (i = 0; i < rsa_inlen / 2; i++) {
ctmp = rsa_in[i];
rsa_in[i] = rsa_in[rsa_inlen - 1 - i];
rsa_in[rsa_inlen - 1 - i] = ctmp;
}
}
switch (rsa_mode) {
case RSA_VERIFY: /* Read the input data */
rsa_outlen = RSA_public_decrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad); rsa_inlen = BIO_read(in, rsa_in, keysize * 2);
break; if(rsa_inlen <= 0) {
BIO_printf(bio_err, "Error reading input Data\n");
exit(1);
}
if(rev) {
int i;
unsigned char ctmp;
for(i = 0; i < rsa_inlen/2; i++) {
ctmp = rsa_in[i];
rsa_in[i] = rsa_in[rsa_inlen - 1 - i];
rsa_in[rsa_inlen - 1 - i] = ctmp;
}
}
switch(rsa_mode) {
case RSA_SIGN: case RSA_VERIFY:
rsa_outlen = rsa_outlen = RSA_public_decrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad);
RSA_private_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad); break;
break;
case RSA_ENCRYPT: case RSA_SIGN:
rsa_outlen = RSA_public_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad); rsa_outlen = RSA_private_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad);
break; break;
case RSA_DECRYPT: case RSA_ENCRYPT:
rsa_outlen = rsa_outlen = RSA_public_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad);
RSA_private_decrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad); break;
break;
} case RSA_DECRYPT:
rsa_outlen = RSA_private_decrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad);
break;
if (rsa_outlen <= 0) { }
BIO_printf(bio_err, "RSA operation error\n");
ERR_print_errors(bio_err); if(rsa_outlen <= 0) {
goto end; BIO_printf(bio_err, "RSA operation error\n");
} ERR_print_errors(bio_err);
ret = 0; goto end;
if (asn1parse) { }
if (!ASN1_parse_dump(out, rsa_out, rsa_outlen, 1, -1)) { ret = 0;
ERR_print_errors(bio_err); if(asn1parse) {
} if(!ASN1_parse_dump(out, rsa_out, rsa_outlen, 1, -1)) {
} else if (hexdump) ERR_print_errors(bio_err);
BIO_dump(out, (char *)rsa_out, rsa_outlen); }
else } else if(hexdump) BIO_dump(out, (char *)rsa_out, rsa_outlen);
BIO_write(out, rsa_out, rsa_outlen); else BIO_write(out, rsa_out, rsa_outlen);
end: end:
RSA_free(rsa); RSA_free(rsa);
BIO_free(in); BIO_free(in);
BIO_free_all(out); BIO_free_all(out);
if (rsa_in) if(rsa_in) OPENSSL_free(rsa_in);
OPENSSL_free(rsa_in); if(rsa_out) OPENSSL_free(rsa_out);
if (rsa_out) if(passin) OPENSSL_free(passin);
OPENSSL_free(rsa_out); return ret;
if (passin)
OPENSSL_free(passin);
return ret;
} }
static void usage() static void usage()
{ {
BIO_printf(bio_err, "Usage: rsautl [options]\n"); BIO_printf(bio_err, "Usage: rsautl [options]\n");
BIO_printf(bio_err, "-in file input file\n"); BIO_printf(bio_err, "-in file input file\n");
BIO_printf(bio_err, "-out file output file\n"); BIO_printf(bio_err, "-out file output file\n");
BIO_printf(bio_err, "-inkey file input key\n"); BIO_printf(bio_err, "-inkey file input key\n");
BIO_printf(bio_err, "-keyform arg private key format - default PEM\n"); BIO_printf(bio_err, "-keyform arg private key format - default PEM\n");
BIO_printf(bio_err, "-pubin input is an RSA public\n"); BIO_printf(bio_err, "-pubin input is an RSA public\n");
BIO_printf(bio_err, BIO_printf(bio_err, "-certin input is a certificate carrying an RSA public key\n");
"-certin input is a certificate carrying an RSA public key\n"); BIO_printf(bio_err, "-ssl use SSL v2 padding\n");
BIO_printf(bio_err, "-ssl use SSL v2 padding\n"); BIO_printf(bio_err, "-raw use no padding\n");
BIO_printf(bio_err, "-raw use no padding\n"); BIO_printf(bio_err, "-pkcs use PKCS#1 v1.5 padding (default)\n");
BIO_printf(bio_err, BIO_printf(bio_err, "-oaep use PKCS#1 OAEP\n");
"-pkcs use PKCS#1 v1.5 padding (default)\n"); BIO_printf(bio_err, "-sign sign with private key\n");
BIO_printf(bio_err, "-oaep use PKCS#1 OAEP\n"); BIO_printf(bio_err, "-verify verify with public key\n");
BIO_printf(bio_err, "-sign sign with private key\n"); BIO_printf(bio_err, "-encrypt encrypt with public key\n");
BIO_printf(bio_err, "-verify verify with public key\n"); BIO_printf(bio_err, "-decrypt decrypt with private key\n");
BIO_printf(bio_err, "-encrypt encrypt with public key\n"); BIO_printf(bio_err, "-hexdump hex dump output\n");
BIO_printf(bio_err, "-decrypt decrypt with private key\n"); #ifndef OPENSSL_NO_ENGINE
BIO_printf(bio_err, "-hexdump hex dump output\n"); BIO_printf(bio_err, "-engine e use engine e, possibly a hardware device.\n");
# ifndef OPENSSL_NO_ENGINE BIO_printf (bio_err, "-passin arg pass phrase source\n");
BIO_printf(bio_err, #endif
"-engine e use engine e, possibly a hardware device.\n");
BIO_printf(bio_err, "-passin arg pass phrase source\n");
# endif
} }
#else /* !OPENSSL_NO_RSA */
# if PEDANTIC
static void *dummy = &dummy;
# endif
#endif #endif

View File

@ -108,77 +108,61 @@
* Hudson (tjh@cryptsoft.com). * Hudson (tjh@cryptsoft.com).
* *
*/ */
/* conflicts with winsock2 stuff on netware */
#if !defined(OPENSSL_SYS_NETWARE) #include <sys/types.h>
# include <sys/types.h>
#endif
#include <openssl/opensslconf.h> #include <openssl/opensslconf.h>
#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
# include <conio.h> #include <conio.h>
#endif #endif
#if defined(OPENSSL_SYS_MSDOS) && !defined(_WIN32) #ifdef OPENSSL_SYS_MSDOS
# define _kbhit kbhit #define _kbhit kbhit
#endif #endif
#if defined(OPENSSL_SYS_VMS) && !defined(FD_SET) #if defined(OPENSSL_SYS_VMS) && !defined(FD_SET)
/* /* VAX C does not defined fd_set and friends, but it's actually quite simple */
* VAX C does not defined fd_set and friends, but it's actually quite simple /* These definitions are borrowed from SOCKETSHR. /Richard Levitte */
*/ #define MAX_NOFILE 32
/* These definitions are borrowed from SOCKETSHR. /Richard Levitte */ #define NBBY 8 /* number of bits in a byte */
# define MAX_NOFILE 32
# define NBBY 8 /* number of bits in a byte */
# ifndef FD_SETSIZE #ifndef FD_SETSIZE
# define FD_SETSIZE MAX_NOFILE #define FD_SETSIZE MAX_NOFILE
# endif /* FD_SETSIZE */ #endif /* FD_SETSIZE */
/* How many things we'll allow select to use. 0 if unlimited */ /* How many things we'll allow select to use. 0 if unlimited */
# define MAXSELFD MAX_NOFILE #define MAXSELFD MAX_NOFILE
typedef int fd_mask; /* int here! VMS prototypes int, not long */ typedef int fd_mask; /* int here! VMS prototypes int, not long */
# define NFDBITS (sizeof(fd_mask) * NBBY)/* bits per mask (power of 2!) */ #define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask (power of 2!)*/
# define NFDSHIFT 5 /* Shift based on above */ #define NFDSHIFT 5 /* Shift based on above */
typedef fd_mask fd_set; typedef fd_mask fd_set;
# define FD_SET(n, p) (*(p) |= (1 << ((n) % NFDBITS))) #define FD_SET(n, p) (*(p) |= (1 << ((n) % NFDBITS)))
# define FD_CLR(n, p) (*(p) &= ~(1 << ((n) % NFDBITS))) #define FD_CLR(n, p) (*(p) &= ~(1 << ((n) % NFDBITS)))
# define FD_ISSET(n, p) (*(p) & (1 << ((n) % NFDBITS))) #define FD_ISSET(n, p) (*(p) & (1 << ((n) % NFDBITS)))
# define FD_ZERO(p) memset((char *)(p), 0, sizeof(*(p))) #define FD_ZERO(p) memset((char *)(p), 0, sizeof(*(p)))
#endif #endif
#define PORT 4433 #define PORT 4433
#define PORT_STR "4433" #define PORT_STR "4433"
#define PROTOCOL "tcp" #define PROTOCOL "tcp"
int do_server(int port, int type, int *ret, int do_server(int port, int *ret, int (*cb) (), char *context);
int (*cb) (char *hostname, int s, unsigned char *context),
unsigned char *context);
#ifdef HEADER_X509_H #ifdef HEADER_X509_H
int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx); int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx);
#endif #endif
#ifdef HEADER_SSL_H #ifdef HEADER_SSL_H
int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file); int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file);
int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key);
#endif #endif
int init_client(int *sock, char *server, int port, int type); int init_client(int *sock, char *server, int port);
int should_retry(int i); int should_retry(int i);
int extract_port(char *str, short *port_ptr); int extract_port(char *str, short *port_ptr);
int extract_host_port(char *str, char **host_ptr, unsigned char *ip, int extract_host_port(char *str,char **host_ptr,unsigned char *ip,short *p);
short *p);
long MS_CALLBACK bio_dump_callback(BIO *bio, int cmd, const char *argp, long MS_CALLBACK bio_dump_cb(BIO *bio, int cmd, const char *argp,
int argi, long argl, long ret); int argi, long argl, long ret);
#ifdef HEADER_SSL_H #ifdef HEADER_SSL_H
void MS_CALLBACK apps_ssl_info_callback(const SSL *s, int where, int ret); void MS_CALLBACK apps_ssl_info_callback(const SSL *s, int where, int ret);
void MS_CALLBACK msg_cb(int write_p, int version, int content_type, void MS_CALLBACK msg_cb(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg);
const void *buf, size_t len, SSL *ssl, void *arg);
void MS_CALLBACK tlsext_cb(SSL *s, int client_server, int type,
unsigned char *data, int len, void *arg);
#endif #endif
int MS_CALLBACK generate_cookie_callback(SSL *ssl, unsigned char *cookie,
unsigned int *cookie_len);
int MS_CALLBACK verify_cookie_callback(SSL *ssl, unsigned char *cookie,
unsigned int cookie_len);

Some files were not shown because too many files have changed in this diff Show More