Add 'void *' argument to app_verify_callback.
authorBodo Möller <bodo@openssl.org>
Thu, 28 Feb 2002 10:52:56 +0000 (10:52 +0000)
committerBodo Möller <bodo@openssl.org>
Thu, 28 Feb 2002 10:52:56 +0000 (10:52 +0000)
Submitted by: D. K. Smetters <smetters@parc.xerox.com>
Reviewed by: Bodo Moeller

CHANGES
demos/easy_tls/easy-tls.c
doc/ssl/SSL_CTX_set_cert_verify_callback.pod
ssl/ssl.h
ssl/ssl_cert.c
ssl/ssl_lib.c
ssl/ssltest.c
test/testssl

diff --git a/CHANGES b/CHANGES
index 223d889cc49e33690b45c3469fd86c9ff1826307..77185b700aabd8a8729bc10b53dbcfb533f62b67 100644 (file)
--- a/CHANGES
+++ b/CHANGES
          *) applies to 0.9.6a ... 0.9.6d and 0.9.7
          +) applies to 0.9.7 only
 
+  +) Fix the 'app_verify_callback' interface so that the user-defined
+     argument is actually passed to the callback: In the
+     SSL_CTX_set_cert_verify_callback() prototype, the callback
+     declaration has been changed from
+          int (*cb)()
+     into
+          int (*cb)(X509_STORE_CTX *,void *);
+     in ssl_verify_cert_chain (ssl/ssl_cert.c), the call
+          i=s->ctx->app_verify_callback(&ctx)
+     has been changed into
+          i=s->ctx->app_verify_callback(&ctx, s->ctx->app_verify_arg).
+
+     To update applications using SSL_CTX_set_cert_verify_callback(),
+     a dummy argument can be added to their callback functions.
+     [D. K. Smetters <smetters@parc.xerox.com>]
+
   +) Added the '4758cca' ENGINE to support IBM 4758 cards.
      [Maurice Gittens <maurice@gittens.nl>, touchups by Geoff Thorpe]
 
index f79076a42b06840069fce935ddea05e7933e145c..25aedb94d94766c62cccd49fca559ddbbd345885 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; c-file-style: "bsd" -*- */
 /*
  * easy-tls.c -- generic TLS proxy.
- * $Id: easy-tls.c,v 1.2 2001/09/24 07:54:09 bodo Exp $
+ * $Id: easy-tls.c,v 1.3 2002/02/28 10:52:01 bodo Exp $
  */
 /*
  (c) Copyright 1999 Bodo Moeller.  All rights reserved.
@@ -73,7 +73,7 @@
  */
 
 static char const rcsid[] =
-"$Id: easy-tls.c,v 1.2 2001/09/24 07:54:09 bodo Exp $";
+"$Id: easy-tls.c,v 1.3 2002/02/28 10:52:01 bodo Exp $";
 
 #include <assert.h>
 #include <errno.h>
@@ -568,7 +568,7 @@ no_passphrase_callback(char *buf, int num, int w, void *arg)
 }
 
 static int
-verify_dont_fail_cb(X509_STORE_CTX *c)
+verify_dont_fail_cb(X509_STORE_CTX *c, void *unused_arg)
 {
     int i;
     
index 723fc140d42fe30e566bd2c2fe1398013bc5e9ee..c0f4f8570851a6408a376c6d3b0c6052f48c256e 100644 (file)
@@ -8,38 +8,36 @@ SSL_CTX_set_cert_verify_callback - set peer certificate verification procedure
 
  #include <openssl/ssl.h>
 
- void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*callback)(),
-                                       char *arg);
- int (*callback)();
+ void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*callback)(X509_STORE_CTX *,void *), void *arg);
 
 =head1 DESCRIPTION
 
 SSL_CTX_set_cert_verify_callback() sets the verification callback function for
-B<ctx>. SSL objects, that are created from B<ctx> inherit the setting valid at
-the time, L<SSL_new(3)|SSL_new(3)> is called. B<arg> is currently ignored.
+I<ctx>. SSL objects that are created from I<ctx> inherit the setting valid at
+the time when L<SSL_new(3)|SSL_new(3)> is called.
 
 =head1 NOTES
 
 Whenever a certificate is verified during a SSL/TLS handshake, a verification
 function is called. If the application does not explicitly specify a
 verification callback function, the built-in verification function is used.
-If a verification callback B<callback> is specified via
+If a verification callback I<callback> is specified via
 SSL_CTX_set_cert_verify_callback(), the supplied callback function is called
-instead. By setting B<callback> to NULL, the default behaviour is restored.
+instead. By setting I<callback> to NULL, the default behaviour is restored.
 
-When the verification must be performed, B<callback> will be called with
-the argument callback(X509_STORE_CTX *x509_store_ctx). The arguments B<arg>
-that can be specified when setting B<callback> are currently ignored.
+When the verification must be performed, I<callback> will be called with
+the arguments callback(X509_STORE_CTX *x509_store_ctx, void *arg). The 
+argument I<arg> is specified by the application when setting I<callback>.
 
-B<callback> should return 1 to indicate verification success and 0 to
-indicate verification failure. If SSL_VERIFY_PEER is set and B<callback>
+I<callback> should return 1 to indicate verification success and 0 to
+indicate verification failure. If SSL_VERIFY_PEER is set and I<callback>
 returns 0, the handshake will fail. As the verification procedure may
 allow to continue the connection in case of failure (by always returning 1)
 the verification result must be set in any case using the B<error>
-member of B<x509_store_ctx>, so that the calling application will be informed
+member of I<x509_store_ctx> so that the calling application will be informed
 about the detailed result of the verification procedure! 
 
-Within B<x509_store_ctx>, B<callback> has access to the B<verify_callback>
+Within I<x509_store_ctx>, I<callback> has access to the I<verify_callback>
 function set using L<SSL_CTX_set_verify(3)|SSL_CTX_set_verify(3)>.
 
 =head1 WARNINGS
@@ -56,12 +54,6 @@ the B<verify_callback> function.
 
 =head1 BUGS
 
-It is possible to specify arguments to be passed to the verification callback.
-Currently they are however not passed but ignored.
-
-The B<callback> function is not specified via a prototype, so that no
-type checking takes place.
-
 =head1 RETURN VALUES
 
 SSL_CTX_set_cert_verify_callback() does not provide diagnostic information.
@@ -72,4 +64,12 @@ L<ssl(3)|ssl(3)>, L<SSL_CTX_set_verify(3)|SSL_CTX_set_verify(3)>,
 L<SSL_get_verify_result(3)|SSL_get_verify_result(3)>,
 L<SSL_CTX_load_verify_locations(3)|SSL_CTX_load_verify_locations(3)>
 
+=head1 HISTORY
+
+Previous to OpenSSL 0.9.7, the I<arg> argument to B<SSL_CTX_set_cert_verify_callback>
+was ignored, and I<callback> was called simply as
+ int (*callback)(X509_STORE_CTX *)
+To compile software written for previous versions of OpenSSL, a dummy
+argument will have to be added to I<callback>.
+
 =cut
index 05fa9eef3498b65497a73870839e2e467e92eb40..af4a7e829e475ed4e0f694cfecaef6d1c9328ec7 100644 (file)
--- a/ssl/ssl.h
+++ b/ssl/ssl.h
@@ -607,8 +607,10 @@ struct ssl_ctx_st
        int references;
 
        /* if defined, these override the X509_verify_cert() calls */
-       int (*app_verify_callback)();
-       char *app_verify_arg; /* never used; should be void * */
+       int (*app_verify_callback)(X509_STORE_CTX *, void *);
+       void *app_verify_arg;
+       /* before OpenSSL 0.9.7, 'app_verify_arg' was ignored
+        * ('app_verify_callback' was called with just one argument) */
 
        /* Default password callback. */
        pem_password_cb *default_passwd_callback;
@@ -1232,7 +1234,7 @@ int (*SSL_CTX_get_verify_callback(SSL_CTX *ctx))(int,X509_STORE_CTX *);
 void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,
                        int (*callback)(int, X509_STORE_CTX *));
 void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth);
-void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(),char *arg);
+void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg);
 #ifndef OPENSSL_NO_RSA
 int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa);
 #endif
index d78584715a7589a175a708b5c2a8a225c25ab04f..1a873d2cb73b131fd24877a90da027716a060726 100644 (file)
@@ -483,7 +483,11 @@ int ssl_verify_cert_chain(SSL *s,STACK_OF(X509) *sk)
                X509_STORE_CTX_set_verify_cb(&ctx, s->verify_callback);
 
        if (s->ctx->app_verify_callback != NULL)
+#if 1 /* new with OpenSSL 0.9.7 */
+               i=s->ctx->app_verify_callback(&ctx, s->ctx->app_verify_arg); 
+#else
                i=s->ctx->app_verify_callback(&ctx); /* should pass app_verify_arg */
+#endif
        else
                {
 #ifndef OPENSSL_NO_X509_VERIFY
index eaf1abdd1b3fb967e99ba1b9eb89305753c9654f..df307a80c586a816d5d333e29aab952067e1657f 100644 (file)
@@ -1443,15 +1443,10 @@ void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u)
        ctx->default_passwd_callback_userdata=u;
        }
 
-void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,int (*cb)(),char *arg)
+void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg)
        {
-       /* now
-        *     int (*cb)(X509_STORE_CTX *),
-        * but should be
-        *     int (*cb)(X509_STORE_CTX *, void *arg)
-        */
        ctx->app_verify_callback=cb;
-       ctx->app_verify_arg=arg; /* never used */
+       ctx->app_verify_arg=arg;
        }
 
 void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*cb)(int, X509_STORE_CTX *))
index 7d6b53eed143662cae68def08bde71912ff07ec4..2ef9ae760159198be4b5b993039dc027a98a797e 100644 (file)
@@ -158,6 +158,10 @@ static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx);
 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export,int keylength);
 static void free_tmp_rsa(void);
 #endif
+static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg);
+#define APP_CALLBACK "Test Callback Argument"
+static char *app_verify_arg = APP_CALLBACK;
+
 #ifndef OPENSSL_NO_DH
 static DH *get_dh512(void);
 static DH *get_dh1024(void);
@@ -336,6 +340,7 @@ int main(int argc, char *argv[])
        int tls1=0,ssl2=0,ssl3=0,ret=1;
        int client_auth=0;
        int server_auth=0,i;
+       int app_verify=0;
        char *server_cert=TEST_SERVER_CERT;
        char *server_key=NULL;
        char *client_cert=TEST_CLIENT_CERT;
@@ -489,6 +494,10 @@ int main(int argc, char *argv[])
                        {
                        comp = COMP_RLE;
                        }
+               else if (strcmp(*argv,"-app_verify") == 0)
+                       {
+                       app_verify = 1;
+                       }
                else
                        {
                        fprintf(stderr,"unknown option %s\n",*argv);
@@ -640,12 +649,20 @@ bad:
                SSL_CTX_set_verify(s_ctx,
                        SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
                        verify_callback);
+               if (app_verify) 
+                       {
+                       SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, app_verify_arg);
+                       }
                }
        if (server_auth)
                {
                BIO_printf(bio_err,"server authentication\n");
                SSL_CTX_set_verify(c_ctx,SSL_VERIFY_PEER,
                        verify_callback);
+               if (app_verify) 
+                       {
+                       SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, app_verify_arg);
+                       }
                }
        
        {
@@ -1433,6 +1450,25 @@ static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
        return(ok);
        }
 
+static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg)
+       {
+       char *s = NULL,buf[256];
+       int ok=1;
+
+       fprintf(stderr, "In app_verify_callback, allowing cert. ");
+       fprintf(stderr, "Arg is: %s\n", (char *)arg);
+       fprintf(stderr, "Finished printing do we have a context? 0x%x a cert? 0x%x\n",
+                       (unsigned int)ctx, (unsigned int)ctx->cert);
+       if (ctx->cert)
+               s=X509_NAME_oneline(X509_get_subject_name(ctx->cert),buf,256);
+       if (s != NULL)
+               {
+                       fprintf(stderr,"cert depth=%d %s\n",ctx->error_depth,buf);
+               }
+
+       return(ok);
+       }
+
 #ifndef OPENSSL_NO_RSA
 static RSA *rsa_tmp=NULL;
 
index 3ca5c8010b7c8b5e77c04f96a08287ca66b6ff53..ba5e41c8613872e59ad529246585df2880cdab95 100644 (file)
@@ -116,6 +116,9 @@ $ssltest -bio_pair -client_auth $CA $extra || exit 1
 echo test sslv2/sslv3 with both client and server authentication via BIO pair
 $ssltest -bio_pair -server_auth -client_auth $CA $extra || exit 1
 
+echo test sslv2/sslv3 with both client and server authentication via BIO pair and app verify
+$ssltest -bio_pair -server_auth -client_auth -app_verify $CA $extra || exit 1
+
 #############################################################################
 
 echo test tls1 with 1024bit anonymous DH, multiple handshakes