[w3m-dev 03005] fix Bad cert ident
* istream.c (ssl_match_cert_ident): added * istream.c (ssl_check_cert_ident): use ssl_match_cert_ident() From: Fumitoshi UKAI <ukai@debian.or.jp>
This commit is contained in:
		| @@ -1,3 +1,9 @@ | ||||
| 2002-02-07  Fumitoshi UKAI  <ukai@debian.or.jp> | ||||
|  | ||||
| 	* [w3m-dev 03005] fix Bad cert ident | ||||
| 	* istream.c (ssl_match_cert_ident): added | ||||
| 	* istream.c (ssl_check_cert_ident): use ssl_match_cert_ident() | ||||
|  | ||||
| 2002-02-07  Hironori Sakamoto <hsaka@mth.biglobe.ne.jp> | ||||
|  | ||||
| 	* [w3m-dev 02999] don't ask accept bad cert when background downloading | ||||
| @@ -2848,4 +2854,4 @@ | ||||
| 	* release-0-2-1 | ||||
| 	* import w3m-0.2.1 | ||||
|  | ||||
| $Id: ChangeLog,v 1.303 2002/02/06 16:20:25 ukai Exp $ | ||||
| $Id: ChangeLog,v 1.304 2002/02/06 17:24:14 ukai Exp $ | ||||
|   | ||||
							
								
								
									
										49
									
								
								istream.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								istream.c
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| /* $Id: istream.c,v 1.12 2002/01/30 15:08:48 ukai Exp $ */ | ||||
| /* $Id: istream.c,v 1.13 2002/02/06 17:24:14 ukai Exp $ */ | ||||
| #include "fm.h" | ||||
| #include "istream.h" | ||||
| #include <signal.h> | ||||
| @@ -368,6 +368,36 @@ ssl_accept_this_site(char *hostname) | ||||
| 	accept_this_site = NULL; | ||||
| } | ||||
|  | ||||
| static int | ||||
| ssl_match_cert_ident(char *ident, int ilen, char *hostname) | ||||
| { | ||||
|     /* RFC2818 3.1.  Server Identity | ||||
|      * Names may contain the wildcard | ||||
|      * character * which is considered to match any single domain name | ||||
|      * component or component fragment. E.g., *.a.com matches foo.a.com but | ||||
|      * not bar.foo.a.com. f*.com matches foo.com but not bar.com. | ||||
|      */ | ||||
|     int hlen = strlen(hostname); | ||||
|     int i, c; | ||||
|  | ||||
|     /* Is this an exact match? */ | ||||
|     if ((ilen == hlen) && strncasecmp(ident, hostname, hlen) == 0) | ||||
| 	return TRUE; | ||||
|  | ||||
|     for (i = 0; i < ilen; i++) { | ||||
| 	if (ident[i] == '*' && ident[i + 1] == '.') { | ||||
| 	    while ((c = *hostname++) != '\0') | ||||
| 		if (c == '.') | ||||
| 		    break; | ||||
| 	    i++; | ||||
| 	} | ||||
| 	else { | ||||
| 	    if (ident[i] != *hostname++) | ||||
| 		return FALSE; | ||||
| 	} | ||||
|     } | ||||
|     return *hostname == '\0'; | ||||
| } | ||||
|  | ||||
| static Str | ||||
| ssl_check_cert_ident(X509 * x, char *hostname) | ||||
| @@ -393,17 +423,12 @@ ssl_check_cert_ident(X509 * x, char *hostname) | ||||
| 	ex = X509_get_ext(x, i); | ||||
| 	alt = X509V3_EXT_d2i(ex); | ||||
| 	if (alt) { | ||||
| 	    int n, len1, len2 = 0; | ||||
| 	    char *domain; | ||||
| 	    int n; | ||||
| 	    GENERAL_NAME *gn; | ||||
| 	    X509V3_EXT_METHOD *method; | ||||
| 	    Str seen_dnsname = NULL; | ||||
|  | ||||
| 	    len1 = strlen(hostname); | ||||
| 	    n = sk_GENERAL_NAME_num(alt); | ||||
| 	    domain = strchr(hostname, '.'); | ||||
| 	    if (domain) | ||||
| 		len2 = len1 - (domain - hostname); | ||||
| 	    for (i = 0; i < n; i++) { | ||||
| 		gn = sk_GENERAL_NAME_value(alt, i); | ||||
| 		if (gn->type == GEN_DNS) { | ||||
| @@ -413,13 +438,7 @@ ssl_check_cert_ident(X509 * x, char *hostname) | ||||
| 		    if (!seen_dnsname) | ||||
| 			seen_dnsname = Strnew(); | ||||
| 		    Strcat_m_charp(seen_dnsname, sn, " ", NULL); | ||||
| 		    /* Is this an exact match? */ | ||||
| 		    if ((len1 == sl) && !strncasecmp(hostname, sn, len1)) | ||||
| 			break; | ||||
|  | ||||
| 		    /* Is this a wildcard match? */ | ||||
| 		    if ((*sn == '*') && domain && (len2 == sl - 1) && | ||||
| 			!strncasecmp(domain, sn + 1, len2)) | ||||
| 		    if (ssl_match_cert_ident(sn, sl, hostname)) | ||||
| 			break; | ||||
| 		} | ||||
| 	    } | ||||
| @@ -442,7 +461,7 @@ ssl_check_cert_ident(X509 * x, char *hostname) | ||||
| 	if (X509_NAME_get_text_by_NID(xn, NID_commonName, | ||||
| 				      buf, sizeof(buf)) == -1) | ||||
| 	    ret = Strnew_charp("Unable to get common name from peer cert"); | ||||
| 	else if (strcasecmp(hostname, buf)) | ||||
| 	else if (! ssl_match_cert_ident(buf, strlen(buf), hostname)) | ||||
| 	    ret = Sprintf("Bad cert ident %s from %s", buf, hostname); | ||||
| 	else | ||||
| 	    match_ident = TRUE; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user