xref: /freebsd/crypto/openssl/apps/ciphers.c (revision f579bf8ec7713035a231884db9958cdc4ff5d7cf)
174664626SKris Kennaway /* apps/ciphers.c */
274664626SKris Kennaway /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
374664626SKris Kennaway  * All rights reserved.
474664626SKris Kennaway  *
574664626SKris Kennaway  * This package is an SSL implementation written
674664626SKris Kennaway  * by Eric Young (eay@cryptsoft.com).
774664626SKris Kennaway  * The implementation was written so as to conform with Netscapes SSL.
874664626SKris Kennaway  *
974664626SKris Kennaway  * This library is free for commercial and non-commercial use as long as
1074664626SKris Kennaway  * the following conditions are aheared to.  The following conditions
1174664626SKris Kennaway  * apply to all code found in this distribution, be it the RC4, RSA,
1274664626SKris Kennaway  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1374664626SKris Kennaway  * included with this distribution is covered by the same copyright terms
1474664626SKris Kennaway  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
1574664626SKris Kennaway  *
1674664626SKris Kennaway  * Copyright remains Eric Young's, and as such any Copyright notices in
1774664626SKris Kennaway  * the code are not to be removed.
1874664626SKris Kennaway  * If this package is used in a product, Eric Young should be given attribution
1974664626SKris Kennaway  * as the author of the parts of the library used.
2074664626SKris Kennaway  * This can be in the form of a textual message at program startup or
2174664626SKris Kennaway  * in documentation (online or textual) provided with the package.
2274664626SKris Kennaway  *
2374664626SKris Kennaway  * Redistribution and use in source and binary forms, with or without
2474664626SKris Kennaway  * modification, are permitted provided that the following conditions
2574664626SKris Kennaway  * are met:
2674664626SKris Kennaway  * 1. Redistributions of source code must retain the copyright
2774664626SKris Kennaway  *    notice, this list of conditions and the following disclaimer.
2874664626SKris Kennaway  * 2. Redistributions in binary form must reproduce the above copyright
2974664626SKris Kennaway  *    notice, this list of conditions and the following disclaimer in the
3074664626SKris Kennaway  *    documentation and/or other materials provided with the distribution.
3174664626SKris Kennaway  * 3. All advertising materials mentioning features or use of this software
3274664626SKris Kennaway  *    must display the following acknowledgement:
3374664626SKris Kennaway  *    "This product includes cryptographic software written by
3474664626SKris Kennaway  *     Eric Young (eay@cryptsoft.com)"
3574664626SKris Kennaway  *    The word 'cryptographic' can be left out if the rouines from the library
3674664626SKris Kennaway  *    being used are not cryptographic related :-).
3774664626SKris Kennaway  * 4. If you include any Windows specific code (or a derivative thereof) from
3874664626SKris Kennaway  *    the apps directory (application code) you must include an acknowledgement:
3974664626SKris Kennaway  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
4074664626SKris Kennaway  *
4174664626SKris Kennaway  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4274664626SKris Kennaway  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4374664626SKris Kennaway  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4474664626SKris Kennaway  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4574664626SKris Kennaway  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4674664626SKris Kennaway  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4774664626SKris Kennaway  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4874664626SKris Kennaway  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4974664626SKris Kennaway  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5074664626SKris Kennaway  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5174664626SKris Kennaway  * SUCH DAMAGE.
5274664626SKris Kennaway  *
5374664626SKris Kennaway  * The licence and distribution terms for any publically available version or
5474664626SKris Kennaway  * derivative of this code cannot be changed.  i.e. this code cannot simply be
5574664626SKris Kennaway  * copied and put under another distribution licence
5674664626SKris Kennaway  * [including the GNU Public Licence.]
5774664626SKris Kennaway  */
5874664626SKris Kennaway 
5974664626SKris Kennaway #include <stdio.h>
6074664626SKris Kennaway #include <stdlib.h>
6174664626SKris Kennaway #include <string.h>
6274664626SKris Kennaway #ifdef NO_STDIO
6374664626SKris Kennaway #define APPS_WIN16
6474664626SKris Kennaway #endif
6574664626SKris Kennaway #include "apps.h"
6674664626SKris Kennaway #include <openssl/err.h>
6774664626SKris Kennaway #include <openssl/ssl.h>
6874664626SKris Kennaway 
6974664626SKris Kennaway #undef PROG
7074664626SKris Kennaway #define PROG	ciphers_main
7174664626SKris Kennaway 
7274664626SKris Kennaway static char *ciphers_usage[]={
7374664626SKris Kennaway "usage: ciphers args\n",
7474664626SKris Kennaway " -v          - verbose mode, a textual listing of the ciphers in SSLeay\n",
7574664626SKris Kennaway " -ssl2       - SSL2 mode\n",
7674664626SKris Kennaway " -ssl3       - SSL3 mode\n",
7774664626SKris Kennaway NULL
7874664626SKris Kennaway };
7974664626SKris Kennaway 
80f579bf8eSKris Kennaway int MAIN(int, char **);
81f579bf8eSKris Kennaway 
8274664626SKris Kennaway int MAIN(int argc, char **argv)
8374664626SKris Kennaway 	{
8474664626SKris Kennaway 	int ret=1,i;
8574664626SKris Kennaway 	int verbose=0;
8674664626SKris Kennaway 	char **pp;
8774664626SKris Kennaway 	const char *p;
8874664626SKris Kennaway 	int badops=0;
8974664626SKris Kennaway 	SSL_CTX *ctx=NULL;
9074664626SKris Kennaway 	SSL *ssl=NULL;
9174664626SKris Kennaway 	char *ciphers=NULL;
9274664626SKris Kennaway 	SSL_METHOD *meth=NULL;
9374664626SKris Kennaway 	STACK_OF(SSL_CIPHER) *sk;
9474664626SKris Kennaway 	char buf[512];
9574664626SKris Kennaway 	BIO *STDout=NULL;
9674664626SKris Kennaway 
9774664626SKris Kennaway #if !defined(NO_SSL2) && !defined(NO_SSL3)
9874664626SKris Kennaway 	meth=SSLv23_server_method();
9974664626SKris Kennaway #elif !defined(NO_SSL3)
10074664626SKris Kennaway 	meth=SSLv3_server_method();
10174664626SKris Kennaway #elif !defined(NO_SSL2)
10274664626SKris Kennaway 	meth=SSLv2_server_method();
10374664626SKris Kennaway #endif
10474664626SKris Kennaway 
10574664626SKris Kennaway 	apps_startup();
10674664626SKris Kennaway 
10774664626SKris Kennaway 	if (bio_err == NULL)
10874664626SKris Kennaway 		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
10974664626SKris Kennaway 	STDout=BIO_new_fp(stdout,BIO_NOCLOSE);
11074664626SKris Kennaway 
11174664626SKris Kennaway 	argc--;
11274664626SKris Kennaway 	argv++;
11374664626SKris Kennaway 	while (argc >= 1)
11474664626SKris Kennaway 		{
11574664626SKris Kennaway 		if (strcmp(*argv,"-v") == 0)
11674664626SKris Kennaway 			verbose=1;
11774664626SKris Kennaway #ifndef NO_SSL2
11874664626SKris Kennaway 		else if (strcmp(*argv,"-ssl2") == 0)
11974664626SKris Kennaway 			meth=SSLv2_client_method();
12074664626SKris Kennaway #endif
12174664626SKris Kennaway #ifndef NO_SSL3
12274664626SKris Kennaway 		else if (strcmp(*argv,"-ssl3") == 0)
12374664626SKris Kennaway 			meth=SSLv3_client_method();
12474664626SKris Kennaway #endif
12574664626SKris Kennaway 		else if ((strncmp(*argv,"-h",2) == 0) ||
12674664626SKris Kennaway 			 (strcmp(*argv,"-?") == 0))
12774664626SKris Kennaway 			{
12874664626SKris Kennaway 			badops=1;
12974664626SKris Kennaway 			break;
13074664626SKris Kennaway 			}
13174664626SKris Kennaway 		else
13274664626SKris Kennaway 			{
13374664626SKris Kennaway 			ciphers= *argv;
13474664626SKris Kennaway 			}
13574664626SKris Kennaway 		argc--;
13674664626SKris Kennaway 		argv++;
13774664626SKris Kennaway 		}
13874664626SKris Kennaway 
13974664626SKris Kennaway 	if (badops)
14074664626SKris Kennaway 		{
14174664626SKris Kennaway 		for (pp=ciphers_usage; (*pp != NULL); pp++)
14274664626SKris Kennaway 			BIO_printf(bio_err,*pp);
14374664626SKris Kennaway 		goto end;
14474664626SKris Kennaway 		}
14574664626SKris Kennaway 
146f579bf8eSKris Kennaway 	OpenSSL_add_ssl_algorithms();
14774664626SKris Kennaway 
14874664626SKris Kennaway 	ctx=SSL_CTX_new(meth);
14974664626SKris Kennaway 	if (ctx == NULL) goto err;
150f579bf8eSKris Kennaway 	if (ciphers != NULL) {
151f579bf8eSKris Kennaway 		if(!SSL_CTX_set_cipher_list(ctx,ciphers)) {
152f579bf8eSKris Kennaway 			BIO_printf(bio_err, "Error in cipher list\n");
153f579bf8eSKris Kennaway 			goto err;
154f579bf8eSKris Kennaway 		}
155f579bf8eSKris Kennaway 	}
15674664626SKris Kennaway 	ssl=SSL_new(ctx);
15774664626SKris Kennaway 	if (ssl == NULL) goto err;
15874664626SKris Kennaway 
15974664626SKris Kennaway 
16074664626SKris Kennaway 	if (!verbose)
16174664626SKris Kennaway 		{
16274664626SKris Kennaway 		for (i=0; ; i++)
16374664626SKris Kennaway 			{
16474664626SKris Kennaway 			p=SSL_get_cipher_list(ssl,i);
16574664626SKris Kennaway 			if (p == NULL) break;
16674664626SKris Kennaway 			if (i != 0) BIO_printf(STDout,":");
16774664626SKris Kennaway 			BIO_printf(STDout,"%s",p);
16874664626SKris Kennaway 			}
16974664626SKris Kennaway 		BIO_printf(STDout,"\n");
17074664626SKris Kennaway 		}
17174664626SKris Kennaway 	else
17274664626SKris Kennaway 		{
17374664626SKris Kennaway 		sk=SSL_get_ciphers(ssl);
17474664626SKris Kennaway 
17574664626SKris Kennaway 		for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
17674664626SKris Kennaway 			{
17774664626SKris Kennaway 			BIO_puts(STDout,SSL_CIPHER_description(
17874664626SKris Kennaway 				sk_SSL_CIPHER_value(sk,i),
17974664626SKris Kennaway 				buf,512));
18074664626SKris Kennaway 			}
18174664626SKris Kennaway 		}
18274664626SKris Kennaway 
18374664626SKris Kennaway 	ret=0;
18474664626SKris Kennaway 	if (0)
18574664626SKris Kennaway 		{
18674664626SKris Kennaway err:
18774664626SKris Kennaway 		SSL_load_error_strings();
18874664626SKris Kennaway 		ERR_print_errors(bio_err);
18974664626SKris Kennaway 		}
19074664626SKris Kennaway end:
19174664626SKris Kennaway 	if (ctx != NULL) SSL_CTX_free(ctx);
19274664626SKris Kennaway 	if (ssl != NULL) SSL_free(ssl);
19374664626SKris Kennaway 	if (STDout != NULL) BIO_free(STDout);
19474664626SKris Kennaway 	EXIT(ret);
19574664626SKris Kennaway 	}
19674664626SKris Kennaway 
197