#define APPS_WIN16
#endif
#include "apps.h"
-#include "x509.h"
-#include "ssl.h"
-#include "err.h"
-#include "pem.h"
+#include <openssl/x509.h>
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#include <openssl/pem.h>
#include "s_apps.h"
+#if defined(NO_RSA) && !defined(NO_SSL2)
+#define NO_SSL2
+#endif
+
#undef PROG
#define PROG s_client_main
static int c_debug=0;
static int c_showcerts=0;
-#ifndef NOPROTO
static void sc_usage(void);
static void print_stuff(BIO *berr,SSL *con,int full);
-#else
-static void sc_usage();
-static void print_stuff();
-#endif
-
static BIO *bio_c_out=NULL;
static int c_quiet=0;
-static void sc_usage()
+static void sc_usage(void)
{
BIO_printf(bio_err,"usage: s_client args\n");
BIO_printf(bio_err,"\n");
}
-int MAIN(argc, argv)
-int argc;
-char **argv;
+int MAIN(int argc, char **argv)
{
int off=0;
SSL *con=NULL,*con2=NULL;
ssl_pending = read_ssl && SSL_pending(con);
if (!ssl_pending)
-#ifndef WINDOWS
{
+#ifndef WINDOWS
if (tty_on)
{
if (read_tty) FD_SET(fileno(stdin),&readfds);
if ((!c_quiet) && (cbuf[0] == 'R'))
{
+ BIO_printf(bio_err,"RENEGOTIATING\n");
SSL_renegotiate(con);
- read_tty=0;
- write_ssl=1;
+ cbuf_len=0;
}
else
{
cbuf_off=0;
}
- read_tty=0;
write_ssl=1;
+ read_tty=0;
}
#endif
}
}
-static void print_stuff(bio,s,full)
-BIO *bio;
-SSL *s;
-int full;
+static void print_stuff(BIO *bio, SSL *s, int full)
{
X509 *peer=NULL;
char *p;
static char *space=" ";
char buf[BUFSIZ];
- STACK *sk;
+ STACK_OF(X509) *sk;
+ STACK_OF(X509_NAME) *sk2;
SSL_CIPHER *c;
X509_NAME *xn;
int j,i;
if (sk != NULL)
{
BIO_printf(bio,"---\nCertificate chain\n");
- for (i=0; i<sk_num(sk); i++)
+ for (i=0; i<sk_X509_num(sk); i++)
{
- X509_NAME_oneline(X509_get_subject_name((X509 *)
- sk_value(sk,i)),buf,BUFSIZ);
+ X509_NAME_oneline(X509_get_subject_name(
+ sk_X509_value(sk,i)),buf,BUFSIZ);
BIO_printf(bio,"%2d s:%s\n",i,buf);
- X509_NAME_oneline(X509_get_issuer_name((X509 *)
- sk_value(sk,i)),buf,BUFSIZ);
+ X509_NAME_oneline(X509_get_issuer_name(
+ sk_X509_value(sk,i)),buf,BUFSIZ);
BIO_printf(bio," i:%s\n",buf);
if (c_showcerts)
- PEM_write_bio_X509(bio,(X509 *) sk_value(sk,i));
+ PEM_write_bio_X509(bio,sk_X509_value(sk,i));
}
}
else
BIO_printf(bio,"no peer certificate available\n");
- sk=SSL_get_client_CA_list(s);
- if ((sk != NULL) && (sk_num(sk) > 0))
+ sk2=SSL_get_client_CA_list(s);
+ if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
{
BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
- for (i=0; i<sk_num(sk); i++)
+ for (i=0; i<sk_X509_NAME_num(sk2); i++)
{
- xn=(X509_NAME *)sk_value(sk,i);
+ xn=sk_X509_NAME_value(sk2,i);
X509_NAME_oneline(xn,buf,sizeof(buf));
BIO_write(bio,buf,strlen(buf));
BIO_write(bio,"\n",1);
p=SSL_get_shared_ciphers(s,buf,BUFSIZ);
if (p != NULL)
{
+ /* This works only for SSL 2. In later protocol
+ * versions, the client does not know what other
+ * ciphers (in addition to the one to be used
+ * in the current connection) the server supports. */
+
BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
j=i=0;
while (*p)