Changes concering RFC 3820 (proxy certificates) integration:
- Enforce that there should be no policy settings when the language is one of id-ppl-independent or id-ppl-inheritAll. - Add functionality to ssltest.c so that it can process proxy rights and check that they are set correctly. Rights consist of ASCII letters, and the condition is a boolean expression that includes letters, parenthesis, &, | and ^. - Change the proxy certificate configurations so they get proxy rights that are understood by ssltest.c. - Add a script that tests proxy certificates with SSL operations. Other changes: - Change the copyright end year in mkerr.pl. - make update.
This commit is contained in:
parent
fcd5cca418
commit
a7201e9a1b
@ -227,8 +227,8 @@ mem_dbg.o: ../include/openssl/stack.h ../include/openssl/symhacks.h cryptlib.h
|
||||
mem_dbg.o: mem_dbg.c
|
||||
o_dir.o: ../e_os.h ../include/openssl/e_os2.h ../include/openssl/opensslconf.h
|
||||
o_dir.o: LPdir_unix.c o_dir.c o_dir.h
|
||||
o_str.o: ../include/openssl/e_os2.h ../include/openssl/opensslconf.h o_str.c
|
||||
o_str.o: o_str.h
|
||||
o_str.o: ../e_os.h ../include/openssl/e_os2.h ../include/openssl/opensslconf.h
|
||||
o_str.o: o_str.c o_str.h
|
||||
o_time.o: ../include/openssl/e_os2.h ../include/openssl/opensslconf.h o_time.c
|
||||
o_time.o: o_time.h
|
||||
tmdiff.o: ../e_os.h ../include/openssl/bio.h ../include/openssl/buffer.h
|
||||
|
@ -91,7 +91,8 @@ c_rle.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
|
||||
c_rle.o: ../../include/openssl/symhacks.h c_rle.c
|
||||
c_zlib.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h
|
||||
c_zlib.o: ../../include/openssl/comp.h ../../include/openssl/crypto.h
|
||||
c_zlib.o: ../../include/openssl/e_os2.h ../../include/openssl/obj_mac.h
|
||||
c_zlib.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
|
||||
c_zlib.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
c_zlib.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
c_zlib.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
c_zlib.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
|
||||
|
@ -994,6 +994,7 @@ static int internal_verify(X509_STORE_CTX *ctx)
|
||||
goto end;
|
||||
|
||||
/* The last error (if any) is still in the error value */
|
||||
ctx->current_issuer=xi;
|
||||
ctx->current_cert=xs;
|
||||
ok=(*cb)(1,ctx);
|
||||
if (!ok) goto end;
|
||||
|
@ -273,6 +273,12 @@ static PROXY_CERT_INFO_EXTENSION *r2i_pci(X509V3_EXT_METHOD *method,
|
||||
X509V3err(X509V3_F_R2I_PCI,X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED);
|
||||
goto err;
|
||||
}
|
||||
i = OBJ_obj2nid(language);
|
||||
if ((i == NID_Independent || i == NID_id_ppl_inheritAll) && policy)
|
||||
{
|
||||
X509V3err(X509V3_F_R2I_PCI,X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY);
|
||||
goto err;
|
||||
}
|
||||
|
||||
pci = PROXY_CERT_INFO_EXTENSION_new();
|
||||
if (!pci)
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* crypto/x509v3/v3err.c */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999-2003 The OpenSSL Project. All rights reserved.
|
||||
* Copyright (c) 1999-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
|
||||
@ -172,6 +172,7 @@ static ERR_STRING_DATA X509V3_str_reasons[]=
|
||||
{X509V3_R_POLICY_PATH_LENGTH ,"policy path length"},
|
||||
{X509V3_R_POLICY_PATH_LENGTH_ALREADTY_DEFINED,"policy path length alreadty defined"},
|
||||
{X509V3_R_POLICY_SYNTAX_NOT_CURRENTLY_SUPPORTED,"policy syntax not currently supported"},
|
||||
{X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY,"policy when proxy language requires no policy"},
|
||||
{X509V3_R_SECTION_NOT_FOUND ,"section not found"},
|
||||
{X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS ,"unable to get issuer details"},
|
||||
{X509V3_R_UNABLE_TO_GET_ISSUER_KEYID ,"unable to get issuer keyid"},
|
||||
|
@ -737,6 +737,7 @@ void ERR_load_X509V3_strings(void);
|
||||
#define X509V3_R_POLICY_PATH_LENGTH 156
|
||||
#define X509V3_R_POLICY_PATH_LENGTH_ALREADTY_DEFINED 157
|
||||
#define X509V3_R_POLICY_SYNTAX_NOT_CURRENTLY_SUPPORTED 158
|
||||
#define X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY 159
|
||||
#define X509V3_R_SECTION_NOT_FOUND 150
|
||||
#define X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS 122
|
||||
#define X509V3_R_UNABLE_TO_GET_ISSUER_KEYID 123
|
||||
|
489
ssl/ssltest.c
489
ssl/ssltest.c
@ -124,6 +124,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#define USE_SOCKETS
|
||||
#include "e_os.h"
|
||||
@ -132,6 +133,7 @@
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include <openssl/ssl.h>
|
||||
#ifndef OPENSSL_NO_ENGINE
|
||||
#include <openssl/engine.h>
|
||||
@ -180,8 +182,14 @@ 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;
|
||||
#define APP_CALLBACK_STRING "Test Callback Argument"
|
||||
struct app_verify_arg
|
||||
{
|
||||
char *string;
|
||||
int app_verify;
|
||||
char *proxy_auth;
|
||||
char *proxy_cond;
|
||||
};
|
||||
|
||||
#ifndef OPENSSL_NO_DH
|
||||
static DH *get_dh512(void);
|
||||
@ -212,6 +220,8 @@ static void sv_usage(void)
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr," -server_auth - check server certificate\n");
|
||||
fprintf(stderr," -client_auth - do client authentication\n");
|
||||
fprintf(stderr," -proxy_auth <val> - set proxy policy rights\n");
|
||||
fprintf(stderr," -proxy_cond <val> - experssion to test proxy policy rights\n");
|
||||
fprintf(stderr," -v - more output\n");
|
||||
fprintf(stderr," -d - debug output\n");
|
||||
fprintf(stderr," -reuse - use session-id reuse\n");
|
||||
@ -369,7 +379,8 @@ 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;
|
||||
struct app_verify_arg app_verify_arg =
|
||||
{ APP_CALLBACK_STRING, 0, NULL, NULL };
|
||||
char *server_cert=TEST_SERVER_CERT;
|
||||
char *server_key=NULL;
|
||||
char *client_cert=TEST_CLIENT_CERT;
|
||||
@ -430,6 +441,16 @@ int main(int argc, char *argv[])
|
||||
server_auth=1;
|
||||
else if (strcmp(*argv,"-client_auth") == 0)
|
||||
client_auth=1;
|
||||
else if (strcmp(*argv,"-proxy_auth") == 0)
|
||||
{
|
||||
if (--argc < 1) goto bad;
|
||||
app_verify_arg.proxy_auth= *(++argv);
|
||||
}
|
||||
else if (strcmp(*argv,"-proxy_cond") == 0)
|
||||
{
|
||||
if (--argc < 1) goto bad;
|
||||
app_verify_arg.proxy_cond= *(++argv);
|
||||
}
|
||||
else if (strcmp(*argv,"-v") == 0)
|
||||
verbose=1;
|
||||
else if (strcmp(*argv,"-d") == 0)
|
||||
@ -554,7 +575,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
else if (strcmp(*argv,"-app_verify") == 0)
|
||||
{
|
||||
app_verify = 1;
|
||||
app_verify_arg.app_verify = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -765,20 +786,14 @@ 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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback, &app_verify_arg);
|
||||
}
|
||||
|
||||
{
|
||||
@ -1560,6 +1575,22 @@ err:
|
||||
return(ret);
|
||||
}
|
||||
|
||||
static int get_proxy_auth_ex_data_idx(void)
|
||||
{
|
||||
static volatile int idx = -1;
|
||||
if (idx < 0)
|
||||
{
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
|
||||
if (idx < 0)
|
||||
{
|
||||
idx = X509_STORE_CTX_get_ex_new_index(0,
|
||||
"SSLtest for verify callback", NULL,NULL,NULL);
|
||||
}
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
|
||||
static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
|
||||
{
|
||||
char *s,buf[256];
|
||||
@ -1569,7 +1600,8 @@ static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
|
||||
if (s != NULL)
|
||||
{
|
||||
if (ok)
|
||||
fprintf(stderr,"depth=%d %s\n",ctx->error_depth,buf);
|
||||
fprintf(stderr,"depth=%d %s\n",
|
||||
ctx->error_depth,buf);
|
||||
else
|
||||
fprintf(stderr,"depth=%d error=%d %s\n",
|
||||
ctx->error_depth,ctx->error,buf);
|
||||
@ -1586,25 +1618,440 @@ static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
|
||||
}
|
||||
}
|
||||
|
||||
if (ok == 1)
|
||||
{
|
||||
X509 *xs = ctx->current_cert;
|
||||
#if 0
|
||||
X509 *xi = ctx->current_issuer;
|
||||
#endif
|
||||
|
||||
if (xs->ex_flags & EXFLAG_PROXY)
|
||||
{
|
||||
unsigned int *letters =
|
||||
X509_STORE_CTX_get_ex_data(ctx,
|
||||
get_proxy_auth_ex_data_idx());
|
||||
|
||||
if (letters)
|
||||
{
|
||||
int found_any = 0;
|
||||
int i;
|
||||
PROXY_CERT_INFO_EXTENSION *pci =
|
||||
X509_get_ext_d2i(xs, NID_proxyCertInfo,
|
||||
NULL, NULL);
|
||||
|
||||
switch (OBJ_obj2nid(pci->proxyPolicy->policyLanguage))
|
||||
{
|
||||
case NID_Independent:
|
||||
/* Completely meaningless in this
|
||||
program, as there's no way to
|
||||
grant explicit rights to a
|
||||
specific PrC. Basically, using
|
||||
id-ppl-Independent is the perfect
|
||||
way to grant no rights at all. */
|
||||
fprintf(stderr, " Independent proxy certificate");
|
||||
for (i = 0; i < 26; i++)
|
||||
letters[i] = 0;
|
||||
break;
|
||||
case NID_id_ppl_inheritAll:
|
||||
/* This is basically a NOP, we
|
||||
simply let the current rights
|
||||
stand as they are. */
|
||||
fprintf(stderr, " Proxy certificate inherits all");
|
||||
break;
|
||||
default:
|
||||
s = (char *)
|
||||
pci->proxyPolicy->policy->data;
|
||||
i = pci->proxyPolicy->policy->length;
|
||||
|
||||
/* The algorithm works as follows:
|
||||
it is assumed that previous
|
||||
iterations or the initial granted
|
||||
rights has already set some elements
|
||||
of `letters'. What we need to do is
|
||||
to clear those that weren't granted
|
||||
by the current PrC as well. The
|
||||
easiest way to do this is to add 1
|
||||
to all the elements whose letters
|
||||
are given with the current policy.
|
||||
That way, all elements that are set
|
||||
by the current policy and were
|
||||
already set by earlier policies and
|
||||
through the original grant of rights
|
||||
will get the value 2 or higher.
|
||||
The last thing to do is to sweep
|
||||
through `letters' and keep the
|
||||
elements having the value 2 as set,
|
||||
and clear all the others. */
|
||||
|
||||
fprintf(stderr, " Certificate proxy rights = %*.*s", i, i, s);
|
||||
while(i-- > 0)
|
||||
{
|
||||
char c = *s++;
|
||||
if (isascii(c) && isalpha(c))
|
||||
{
|
||||
if (islower(c))
|
||||
c = toupper(c);
|
||||
letters[c - 'A']++;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < 26; i++)
|
||||
if (letters[i] < 2)
|
||||
letters[i] = 0;
|
||||
else
|
||||
letters[i] = 1;
|
||||
}
|
||||
|
||||
found_any = 0;
|
||||
fprintf(stderr,
|
||||
", resulting proxy rights = ");
|
||||
for(i = 0; i < 26; i++)
|
||||
if (letters[i])
|
||||
{
|
||||
fprintf(stderr, "%c", i + 'A');
|
||||
found_any = 1;
|
||||
}
|
||||
if (!found_any)
|
||||
fprintf(stderr, "none");
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
PROXY_CERT_INFO_EXTENSION_free(pci);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(ok);
|
||||
}
|
||||
|
||||
static void process_proxy_debug(int indent, const char *format, ...)
|
||||
{
|
||||
static const char indentation[] =
|
||||
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
||||
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"; /* That's 80 > */
|
||||
char my_format[256];
|
||||
va_list args;
|
||||
|
||||
BIO_snprintf(my_format, sizeof(my_format), "%*.*s %s",
|
||||
indent, indent, indentation, format);
|
||||
|
||||
va_start(args, format);
|
||||
vfprintf(stderr, my_format, args);
|
||||
va_end(args);
|
||||
}
|
||||
/* Priority levels:
|
||||
0 [!]var, ()
|
||||
1 & ^
|
||||
2 |
|
||||
*/
|
||||
static int process_proxy_cond_adders(unsigned int letters[26],
|
||||
const char *cond, const char **cond_end, int *pos, int indent);
|
||||
static int process_proxy_cond_val(unsigned int letters[26],
|
||||
const char *cond, const char **cond_end, int *pos, int indent)
|
||||
{
|
||||
char c;
|
||||
int ok = 1;
|
||||
int negate = 0;
|
||||
|
||||
while(isspace(*cond))
|
||||
{
|
||||
cond++; (*pos)++;
|
||||
}
|
||||
c = *cond;
|
||||
|
||||
if (debug)
|
||||
process_proxy_debug(indent,
|
||||
"Start process_proxy_cond_val at position %d: %s\n",
|
||||
*pos, cond);
|
||||
|
||||
while(c == '!')
|
||||
{
|
||||
negate = !negate;
|
||||
cond++; (*pos)++;
|
||||
while(isspace(*cond))
|
||||
{
|
||||
cond++; (*pos)++;
|
||||
}
|
||||
c = *cond;
|
||||
}
|
||||
|
||||
if (c == '(')
|
||||
{
|
||||
cond++; (*pos)++;
|
||||
ok = process_proxy_cond_adders(letters, cond, cond_end, pos,
|
||||
indent + 1);
|
||||
cond = *cond_end;
|
||||
if (ok < 0)
|
||||
goto end;
|
||||
while(isspace(*cond))
|
||||
{
|
||||
cond++; (*pos)++;
|
||||
}
|
||||
c = *cond;
|
||||
if (c != ')')
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Weird condition character in position %d: "
|
||||
"%c\n", *pos, c);
|
||||
ok = -1;
|
||||
goto end;
|
||||
}
|
||||
cond++; (*pos)++;
|
||||
}
|
||||
else if (isascii(c) && isalpha(c))
|
||||
{
|
||||
if (islower(c))
|
||||
c = toupper(c);
|
||||
ok = letters[c - 'A'];
|
||||
cond++; (*pos)++;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Weird condition character in position %d: "
|
||||
"%c\n", *pos, c);
|
||||
ok = -1;
|
||||
goto end;
|
||||
}
|
||||
end:
|
||||
*cond_end = cond;
|
||||
if (ok >= 0 && negate)
|
||||
ok = !ok;
|
||||
|
||||
if (debug)
|
||||
process_proxy_debug(indent,
|
||||
"End process_proxy_cond_val at position %d: %s, returning %d\n",
|
||||
*pos, cond, ok);
|
||||
|
||||
return ok;
|
||||
}
|
||||
static int process_proxy_cond_multipliers(unsigned int letters[26],
|
||||
const char *cond, const char **cond_end, int *pos, int indent)
|
||||
{
|
||||
int ok;
|
||||
char c;
|
||||
|
||||
if (debug)
|
||||
process_proxy_debug(indent,
|
||||
"Start process_proxy_cond_multipliers at position %d: %s\n",
|
||||
*pos, cond);
|
||||
|
||||
ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1);
|
||||
cond = *cond_end;
|
||||
if (ok < 0)
|
||||
goto end;
|
||||
|
||||
while(ok >= 0)
|
||||
{
|
||||
while(isspace(*cond))
|
||||
{
|
||||
cond++; (*pos)++;
|
||||
}
|
||||
c = *cond;
|
||||
|
||||
switch(c)
|
||||
{
|
||||
case '&':
|
||||
case '^':
|
||||
{
|
||||
int save_ok = ok;
|
||||
|
||||
cond++; (*pos)++;
|
||||
ok = process_proxy_cond_val(letters,
|
||||
cond, cond_end, pos, indent + 1);
|
||||
cond = *cond_end;
|
||||
if (ok < 0)
|
||||
break;
|
||||
|
||||
switch(c)
|
||||
{
|
||||
case '&':
|
||||
ok &= save_ok;
|
||||
break;
|
||||
case '^':
|
||||
ok ^= save_ok;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
|
||||
" STOPPING\n");
|
||||
EXIT(1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
end:
|
||||
if (debug)
|
||||
process_proxy_debug(indent,
|
||||
"End process_proxy_cond_multipliers at position %d: %s, returning %d\n",
|
||||
*pos, cond, ok);
|
||||
|
||||
*cond_end = cond;
|
||||
return ok;
|
||||
}
|
||||
static int process_proxy_cond_adders(unsigned int letters[26],
|
||||
const char *cond, const char **cond_end, int *pos, int indent)
|
||||
{
|
||||
int ok;
|
||||
char c;
|
||||
|
||||
if (debug)
|
||||
process_proxy_debug(indent,
|
||||
"Start process_proxy_cond_adders at position %d: %s\n",
|
||||
*pos, cond);
|
||||
|
||||
ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos,
|
||||
indent + 1);
|
||||
cond = *cond_end;
|
||||
if (ok < 0)
|
||||
goto end;
|
||||
|
||||
while(ok >= 0)
|
||||
{
|
||||
while(isspace(*cond))
|
||||
{
|
||||
cond++; (*pos)++;
|
||||
}
|
||||
c = *cond;
|
||||
|
||||
switch(c)
|
||||
{
|
||||
case '|':
|
||||
{
|
||||
int save_ok = ok;
|
||||
|
||||
cond++; (*pos)++;
|
||||
ok = process_proxy_cond_multipliers(letters,
|
||||
cond, cond_end, pos, indent + 1);
|
||||
cond = *cond_end;
|
||||
if (ok < 0)
|
||||
break;
|
||||
|
||||
switch(c)
|
||||
{
|
||||
case '|':
|
||||
ok |= save_ok;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
|
||||
" STOPPING\n");
|
||||
EXIT(1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
end:
|
||||
if (debug)
|
||||
process_proxy_debug(indent,
|
||||
"End process_proxy_cond_adders at position %d: %s, returning %d\n",
|
||||
*pos, cond, ok);
|
||||
|
||||
*cond_end = cond;
|
||||
return ok;
|
||||
}
|
||||
|
||||
static int process_proxy_cond(unsigned int letters[26],
|
||||
const char *cond, const char **cond_end)
|
||||
{
|
||||
int pos = 1;
|
||||
return process_proxy_cond_adders(letters, cond, cond_end, &pos, 1);
|
||||
}
|
||||
|
||||
static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg)
|
||||
{
|
||||
char *s = NULL,buf[256];
|
||||
int ok=1;
|
||||
struct app_verify_arg *cb_arg = arg;
|
||||
unsigned int letters[26]; /* only used with proxy_auth */
|
||||
|
||||
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)
|
||||
if (cb_arg->app_verify)
|
||||
{
|
||||
char *s = NULL,buf[256];
|
||||
|
||||
fprintf(stderr, "In app_verify_callback, allowing cert. ");
|
||||
fprintf(stderr, "Arg is: %s\n", cb_arg->string);
|
||||
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(1);
|
||||
}
|
||||
if (cb_arg->proxy_auth)
|
||||
{
|
||||
int found_any = 0, i;
|
||||
char *sp;
|
||||
|
||||
for(i = 0; i < 26; i++)
|
||||
letters[i] = 0;
|
||||
for(sp = cb_arg->proxy_auth; *sp; sp++)
|
||||
{
|
||||
char c = *sp;
|
||||
if (isascii(c) && isalpha(c))
|
||||
{
|
||||
if (islower(c))
|
||||
c = toupper(c);
|
||||
letters[c - 'A'] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr,
|
||||
" Initial proxy rights = ");
|
||||
for(i = 0; i < 26; i++)
|
||||
if (letters[i])
|
||||
{
|
||||
fprintf(stderr, "%c", i + 'A');
|
||||
found_any = 1;
|
||||
}
|
||||
if (!found_any)
|
||||
fprintf(stderr, "none");
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
X509_STORE_CTX_set_ex_data(ctx,
|
||||
get_proxy_auth_ex_data_idx(),letters);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_X509_VERIFY
|
||||
# ifdef OPENSSL_FIPS
|
||||
if(s->version == TLS1_VERSION)
|
||||
FIPS_allow_md5(1);
|
||||
# endif
|
||||
ok = X509_verify_cert(ctx);
|
||||
# ifdef OPENSSL_FIPS
|
||||
if(s->version == TLS1_VERSION)
|
||||
FIPS_allow_md5(0);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
if (cb_arg->proxy_auth)
|
||||
{
|
||||
if (ok)
|
||||
{
|
||||
const char *cond_end = NULL;
|
||||
|
||||
ok = process_proxy_cond(letters,
|
||||
cb_arg->proxy_cond, &cond_end);
|
||||
|
||||
if (ok < 0)
|
||||
EXIT(3);
|
||||
if (*cond_end)
|
||||
{
|
||||
fprintf(stderr, "Stopped processing condition before it's end.\n");
|
||||
ok = 0;
|
||||
}
|
||||
if (!ok)
|
||||
fprintf(stderr, "Proxy rights check with condition '%s' proved invalid\n",
|
||||
cb_arg->proxy_cond);
|
||||
else
|
||||
fprintf(stderr, "Proxy rights check with condition '%s' proved valid\n",
|
||||
cb_arg->proxy_cond);
|
||||
}
|
||||
}
|
||||
return(ok);
|
||||
}
|
||||
|
||||
|
@ -289,8 +289,8 @@ test_ssl: keyU.ss certU.ss certCA.ss certP1.ss keyP1.ss certP2.ss keyP2.ss \
|
||||
intP1.ss intP2.ss
|
||||
@echo "test SSL protocol"
|
||||
@$(SET_SO_PATHS); sh ./testssl keyU.ss certU.ss certCA.ss
|
||||
@$(SET_SO_PATHS); sh ./testssl keyP1.ss certP1.ss intP1.ss
|
||||
@$(SET_SO_PATHS); sh ./testssl keyP2.ss certP2.ss intP2.ss
|
||||
@$(SET_SO_PATHS); sh ./testsslproxy keyP1.ss certP1.ss intP1.ss
|
||||
@$(SET_SO_PATHS); sh ./testsslproxy keyP2.ss certP2.ss intP2.ss
|
||||
|
||||
test_ca:
|
||||
@$(SET_SO_PATHS); if ../apps/openssl no-rsa; then \
|
||||
@ -1039,20 +1039,21 @@ shatest.o: ../include/openssl/safestack.h ../include/openssl/sha.h
|
||||
shatest.o: ../include/openssl/stack.h ../include/openssl/symhacks.h shatest.c
|
||||
ssltest.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
|
||||
ssltest.o: ../include/openssl/bn.h ../include/openssl/buffer.h
|
||||
ssltest.o: ../include/openssl/comp.h ../include/openssl/crypto.h
|
||||
ssltest.o: ../include/openssl/dh.h ../include/openssl/dsa.h
|
||||
ssltest.o: ../include/openssl/e_os2.h ../include/openssl/ec.h
|
||||
ssltest.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h
|
||||
ssltest.o: ../include/openssl/engine.h ../include/openssl/err.h
|
||||
ssltest.o: ../include/openssl/evp.h ../include/openssl/kssl.h
|
||||
ssltest.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h
|
||||
ssltest.o: ../include/openssl/objects.h ../include/openssl/opensslconf.h
|
||||
ssltest.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h
|
||||
ssltest.o: ../include/openssl/pem.h ../include/openssl/pem2.h
|
||||
ssltest.o: ../include/openssl/pkcs7.h ../include/openssl/rand.h
|
||||
ssltest.o: ../include/openssl/rsa.h ../include/openssl/safestack.h
|
||||
ssltest.o: ../include/openssl/sha.h ../include/openssl/ssl.h
|
||||
ssltest.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
|
||||
ssltest.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
|
||||
ssltest.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
|
||||
ssltest.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h ssltest.c
|
||||
ssltest.o: ../include/openssl/comp.h ../include/openssl/conf.h
|
||||
ssltest.o: ../include/openssl/crypto.h ../include/openssl/dh.h
|
||||
ssltest.o: ../include/openssl/dsa.h ../include/openssl/e_os2.h
|
||||
ssltest.o: ../include/openssl/ec.h ../include/openssl/ecdh.h
|
||||
ssltest.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h
|
||||
ssltest.o: ../include/openssl/err.h ../include/openssl/evp.h
|
||||
ssltest.o: ../include/openssl/kssl.h ../include/openssl/lhash.h
|
||||
ssltest.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h
|
||||
ssltest.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
|
||||
ssltest.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h
|
||||
ssltest.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h
|
||||
ssltest.o: ../include/openssl/rand.h ../include/openssl/rsa.h
|
||||
ssltest.o: ../include/openssl/safestack.h ../include/openssl/sha.h
|
||||
ssltest.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
|
||||
ssltest.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
|
||||
ssltest.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
|
||||
ssltest.o: ../include/openssl/tls1.h ../include/openssl/x509.h
|
||||
ssltest.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h ssltest.c
|
||||
|
@ -34,4 +34,4 @@ organizationName_value = Dodgy Brothers
|
||||
basicConstraints=CA:FALSE
|
||||
subjectKeyIdentifier=hash
|
||||
authorityKeyIdentifier=keyid,issuer:always
|
||||
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:1,policy:text:foo
|
||||
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:1,policy:text:AB
|
||||
|
@ -42,4 +42,4 @@ proxyCertInfo=critical,@proxy_ext
|
||||
[ proxy_ext ]
|
||||
language=id-ppl-anyLanguage
|
||||
pathlen=0
|
||||
policy=text:bar
|
||||
policy=text:BC
|
||||
|
10
test/testsslproxy
Normal file
10
test/testsslproxy
Normal file
@ -0,0 +1,10 @@
|
||||
#! /bin/sh
|
||||
|
||||
echo 'Testing a lot of proxy conditions.'
|
||||
echo 'Some of them may turn out being invalid, which is fine.'
|
||||
for auth in A B C BC; do
|
||||
for cond in A B C 'A|B&!C'; do
|
||||
sh ./testssl $1 $2 $3 "-proxy_auth $auth -proxy_cond $cond"
|
||||
if [ $? == 3 ]; then exit 1; fi
|
||||
done
|
||||
done
|
@ -262,7 +262,7 @@ foreach $lib (keys %csrc)
|
||||
} else {
|
||||
push @out,
|
||||
"/* ====================================================================\n",
|
||||
" * Copyright (c) 2001-2004 The OpenSSL Project. All rights reserved.\n",
|
||||
" * Copyright (c) 2001-2005 The OpenSSL Project. All rights reserved.\n",
|
||||
" *\n",
|
||||
" * Redistribution and use in source and binary forms, with or without\n",
|
||||
" * modification, are permitted provided that the following conditions\n",
|
||||
@ -404,7 +404,7 @@ EOF
|
||||
print OUT <<"EOF";
|
||||
/* $cfile */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999-2003 The OpenSSL Project. All rights reserved.
|
||||
* Copyright (c) 1999-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
|
||||
|
Loading…
Reference in New Issue
Block a user