Index: openssl/apps/s_cb.c |
=================================================================== |
--- openssl/apps/s_cb.c (revision 105093) |
+++ openssl/apps/s_cb.c (working copy) |
@@ -56,7 +56,7 @@ |
* [including the GNU Public Licence.] |
*/ |
/* ==================================================================== |
- * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. |
+ * Copyright (c) 1998-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 |
@@ -126,12 +126,12 @@ |
int verify_depth=0; |
int verify_error=X509_V_OK; |
+int verify_return_error=0; |
unsigned char cookie_secret[COOKIE_SECRET_LENGTH]; |
int cookie_initialized=0; |
int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx) |
{ |
- char buf[256]; |
X509 *err_cert; |
int err,depth; |
@@ -139,15 +139,23 @@ |
err= X509_STORE_CTX_get_error(ctx); |
depth= X509_STORE_CTX_get_error_depth(ctx); |
- X509_NAME_oneline(X509_get_subject_name(err_cert),buf,sizeof buf); |
- BIO_printf(bio_err,"depth=%d %s\n",depth,buf); |
+ BIO_printf(bio_err,"depth=%d ",depth); |
+ if (err_cert) |
+ { |
+ X509_NAME_print_ex(bio_err, X509_get_subject_name(err_cert), |
+ 0, XN_FLAG_ONELINE); |
+ BIO_puts(bio_err, "\n"); |
+ } |
+ else |
+ BIO_puts(bio_err, "<no cert>\n"); |
if (!ok) |
{ |
BIO_printf(bio_err,"verify error:num=%d:%s\n",err, |
X509_verify_cert_error_string(err)); |
if (verify_depth >= depth) |
{ |
- ok=1; |
+ if (!verify_return_error) |
+ ok=1; |
verify_error=X509_V_OK; |
} |
else |
@@ -156,25 +164,33 @@ |
verify_error=X509_V_ERR_CERT_CHAIN_TOO_LONG; |
} |
} |
- switch (ctx->error) |
+ switch (err) |
{ |
case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: |
- X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert),buf,sizeof buf); |
- BIO_printf(bio_err,"issuer= %s\n",buf); |
+ BIO_puts(bio_err,"issuer= "); |
+ X509_NAME_print_ex(bio_err, X509_get_issuer_name(err_cert), |
+ 0, XN_FLAG_ONELINE); |
+ BIO_puts(bio_err, "\n"); |
break; |
case X509_V_ERR_CERT_NOT_YET_VALID: |
case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: |
BIO_printf(bio_err,"notBefore="); |
- ASN1_TIME_print(bio_err,X509_get_notBefore(ctx->current_cert)); |
+ ASN1_TIME_print(bio_err,X509_get_notBefore(err_cert)); |
BIO_printf(bio_err,"\n"); |
break; |
case X509_V_ERR_CERT_HAS_EXPIRED: |
case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: |
BIO_printf(bio_err,"notAfter="); |
- ASN1_TIME_print(bio_err,X509_get_notAfter(ctx->current_cert)); |
+ ASN1_TIME_print(bio_err,X509_get_notAfter(err_cert)); |
BIO_printf(bio_err,"\n"); |
break; |
+ case X509_V_ERR_NO_EXPLICIT_POLICY: |
+ policies_print(bio_err, ctx); |
+ break; |
} |
+ if (err == X509_V_OK && ok == 2) |
+ policies_print(bio_err, ctx); |
+ |
BIO_printf(bio_err,"verify return:%d\n",ok); |
return(ok); |
} |
@@ -263,7 +279,7 @@ |
} |
long MS_CALLBACK bio_dump_callback(BIO *bio, int cmd, const char *argp, |
- int argi, long argl, long ret) |
+ int argi, long argl, long ret) |
{ |
BIO *out; |
@@ -272,15 +288,15 @@ |
if (cmd == (BIO_CB_READ|BIO_CB_RETURN)) |
{ |
- BIO_printf(out,"read from %p [%p] (%d bytes => %ld (0x%lX))\n", |
- (void *)bio,argp,argi,ret,ret); |
+ BIO_printf(out,"read from %p [%p] (%lu bytes => %ld (0x%lX))\n", |
+ (void *)bio,argp,(unsigned long)argi,ret,ret); |
BIO_dump(out,argp,(int)ret); |
return(ret); |
} |
else if (cmd == (BIO_CB_WRITE|BIO_CB_RETURN)) |
{ |
- BIO_printf(out,"write to %p [%p] (%d bytes => %ld (0x%lX))\n", |
- (void *)bio,argp,argi,ret,ret); |
+ BIO_printf(out,"write to %p [%p] (%lu bytes => %ld (0x%lX))\n", |
+ (void *)bio,argp,(unsigned long)argi,ret,ret); |
BIO_dump(out,argp,(int)ret); |
} |
return(ret); |
@@ -341,14 +357,14 @@ |
case TLS1_VERSION: |
str_version = "TLS 1.0 "; |
break; |
- default: |
- str_version = "???"; |
case DTLS1_VERSION: |
str_version = "DTLS 1.0 "; |
break; |
case DTLS1_BAD_VER: |
str_version = "DTLS 1.0 (bad) "; |
break; |
+ default: |
+ str_version = "???"; |
} |
if (version == SSL2_VERSION) |
@@ -518,6 +534,21 @@ |
case 100: |
str_details2 = " no_renegotiation"; |
break; |
+ case 110: |
+ str_details2 = " unsupported_extension"; |
+ break; |
+ case 111: |
+ str_details2 = " certificate_unobtainable"; |
+ break; |
+ case 112: |
+ str_details2 = " unrecognized_name"; |
+ break; |
+ case 113: |
+ str_details2 = " bad_certificate_status_response"; |
+ break; |
+ case 114: |
+ str_details2 = " bad_certificate_hash_value"; |
+ break; |
} |
} |
} |
@@ -539,6 +570,9 @@ |
case 2: |
str_details1 = ", ServerHello"; |
break; |
+ case 3: |
+ str_details1 = ", HelloVerifyRequest"; |
+ break; |
case 11: |
str_details1 = ", Certificate"; |
break; |
@@ -554,9 +588,6 @@ |
case 15: |
str_details1 = ", CertificateVerify"; |
break; |
- case 3: |
- str_details1 = ", HelloVerifyRequest"; |
- break; |
case 16: |
str_details1 = ", ClientKeyExchange"; |
break; |
@@ -642,6 +673,12 @@ |
extname = "renegotiate"; |
break; |
+#ifdef TLSEXT_TYPE_opaque_prf_input |
+ case TLSEXT_TYPE_opaque_prf_input: |
+ extname = "opaque PRF input"; |
+ break; |
+#endif |
+ |
default: |
extname = "unknown"; |
break; |
@@ -659,8 +696,14 @@ |
{ |
unsigned char *buffer, result[EVP_MAX_MD_SIZE]; |
unsigned int length, resultlength; |
- struct sockaddr_in peer; |
- |
+ union { |
+ struct sockaddr sa; |
+ struct sockaddr_in s4; |
+#if OPENSSL_USE_IPV6 |
+ struct sockaddr_in6 s6; |
+#endif |
+ } peer; |
+ |
/* Initialize a random secret */ |
if (!cookie_initialized) |
{ |
@@ -676,8 +719,23 @@ |
(void)BIO_dgram_get_peer(SSL_get_rbio(ssl), &peer); |
/* Create buffer with peer's address and port */ |
- length = sizeof(peer.sin_addr); |
- length += sizeof(peer.sin_port); |
+ length = 0; |
+ switch (peer.sa.sa_family) |
+ { |
+ case AF_INET: |
+ length += sizeof(struct in_addr); |
+ length += sizeof(peer.s4.sin_port); |
+ break; |
+#if OPENSSL_USE_IPV6 |
+ case AF_INET6: |
+ length += sizeof(struct in6_addr); |
+ length += sizeof(peer.s6.sin6_port); |
+ break; |
+#endif |
+ default: |
+ OPENSSL_assert(0); |
+ break; |
+ } |
buffer = OPENSSL_malloc(length); |
if (buffer == NULL) |
@@ -685,10 +743,32 @@ |
BIO_printf(bio_err,"out of memory\n"); |
return 0; |
} |
- |
- memcpy(buffer, &peer.sin_addr, sizeof(peer.sin_addr)); |
- memcpy(buffer + sizeof(peer.sin_addr), &peer.sin_port, sizeof(peer.sin_port)); |
+ switch (peer.sa.sa_family) |
+ { |
+ case AF_INET: |
+ memcpy(buffer, |
+ &peer.s4.sin_port, |
+ sizeof(peer.s4.sin_port)); |
+ memcpy(buffer + sizeof(peer.s4.sin_port), |
+ &peer.s4.sin_addr, |
+ sizeof(struct in_addr)); |
+ break; |
+#if OPENSSL_USE_IPV6 |
+ case AF_INET6: |
+ memcpy(buffer, |
+ &peer.s6.sin6_port, |
+ sizeof(peer.s6.sin6_port)); |
+ memcpy(buffer + sizeof(peer.s6.sin6_port), |
+ &peer.s6.sin6_addr, |
+ sizeof(struct in6_addr)); |
+ break; |
+#endif |
+ default: |
+ OPENSSL_assert(0); |
+ break; |
+ } |
+ |
/* Calculate HMAC of buffer using the secret */ |
HMAC(EVP_sha1(), cookie_secret, COOKIE_SECRET_LENGTH, |
buffer, length, result, &resultlength); |
@@ -704,8 +784,14 @@ |
{ |
unsigned char *buffer, result[EVP_MAX_MD_SIZE]; |
unsigned int length, resultlength; |
- struct sockaddr_in peer; |
- |
+ union { |
+ struct sockaddr sa; |
+ struct sockaddr_in s4; |
+#if OPENSSL_USE_IPV6 |
+ struct sockaddr_in6 s6; |
+#endif |
+ } peer; |
+ |
/* If secret isn't initialized yet, the cookie can't be valid */ |
if (!cookie_initialized) |
return 0; |
@@ -714,24 +800,61 @@ |
(void)BIO_dgram_get_peer(SSL_get_rbio(ssl), &peer); |
/* Create buffer with peer's address and port */ |
- length = sizeof(peer.sin_addr); |
- length += sizeof(peer.sin_port); |
- buffer = (unsigned char*) OPENSSL_malloc(length); |
+ length = 0; |
+ switch (peer.sa.sa_family) |
+ { |
+ case AF_INET: |
+ length += sizeof(struct in_addr); |
+ length += sizeof(peer.s4.sin_port); |
+ break; |
+#if OPENSSL_USE_IPV6 |
+ case AF_INET6: |
+ length += sizeof(struct in6_addr); |
+ length += sizeof(peer.s6.sin6_port); |
+ break; |
+#endif |
+ default: |
+ OPENSSL_assert(0); |
+ break; |
+ } |
+ buffer = OPENSSL_malloc(length); |
if (buffer == NULL) |
{ |
BIO_printf(bio_err,"out of memory\n"); |
return 0; |
} |
- |
- memcpy(buffer, &peer.sin_addr, sizeof(peer.sin_addr)); |
- memcpy(buffer + sizeof(peer.sin_addr), &peer.sin_port, sizeof(peer.sin_port)); |
+ switch (peer.sa.sa_family) |
+ { |
+ case AF_INET: |
+ memcpy(buffer, |
+ &peer.s4.sin_port, |
+ sizeof(peer.s4.sin_port)); |
+ memcpy(buffer + sizeof(peer.s4.sin_port), |
+ &peer.s4.sin_addr, |
+ sizeof(struct in_addr)); |
+ break; |
+#if OPENSSL_USE_IPV6 |
+ case AF_INET6: |
+ memcpy(buffer, |
+ &peer.s6.sin6_port, |
+ sizeof(peer.s6.sin6_port)); |
+ memcpy(buffer + sizeof(peer.s6.sin6_port), |
+ &peer.s6.sin6_addr, |
+ sizeof(struct in6_addr)); |
+ break; |
+#endif |
+ default: |
+ OPENSSL_assert(0); |
+ break; |
+ } |
+ |
/* Calculate HMAC of buffer using the secret */ |
HMAC(EVP_sha1(), cookie_secret, COOKIE_SECRET_LENGTH, |
buffer, length, result, &resultlength); |
OPENSSL_free(buffer); |
- |
+ |
if (cookie_len == resultlength && memcmp(result, cookie, resultlength) == 0) |
return 1; |