浏览代码

Replace deprecated ASN1_digest by EVP_Digest

bel2125 8 年之前
父节点
当前提交
fb9ef36bb2
共有 1 个文件被更改,包括 27 次插入19 次删除
  1. 27 19
      src/civetweb.c

+ 27 - 19
src/civetweb.c

@@ -1394,12 +1394,10 @@ struct ssl_func {
 #define X509_get_serialNumber (*(ASN1_INTEGER * (*)(X509 *))crypto_sw[8].ptr)
 #define EVP_get_digestbyname                                                   \
 	(*(const EVP_MD *(*)(const char *))crypto_sw[9].ptr)
-#define ASN1_digest                                                            \
-	(*(int (*)(int (*)(void *, unsigned char **),                              \
-	           const EVP_MD *,                                                 \
-	           char *,                                                         \
-	           unsigned char *,                                                \
-	           unsigned int *))crypto_sw[10].ptr)
+#define EVP_Digest                                                             \
+	(*(int (*)(                                                                \
+	    const void *, size_t, void *, unsigned int *, const EVP_MD *, void *)) \
+	      crypto_sw[10].ptr)
 #define i2d_X509 (*(int (*)(X509 *, unsigned char **))crypto_sw[11].ptr)
 #define BN_bn2hex (*(char *(*)(const BIGNUM *a))crypto_sw[12].ptr)
 #define ASN1_INTEGER_to_BN                                                     \
@@ -1461,7 +1459,7 @@ static struct ssl_func crypto_sw[] = {{"ERR_get_error", NULL},
                                       {"X509_NAME_oneline", NULL},
                                       {"X509_get_serialNumber", NULL},
                                       {"EVP_get_digestbyname", NULL},
-                                      {"ASN1_digest", NULL},
+                                      {"EVP_Digest", NULL},
                                       {"i2d_X509", NULL},
                                       {"BN_bn2hex", NULL},
                                       {"ASN1_INTEGER_to_BN", NULL},
@@ -1549,12 +1547,10 @@ static struct ssl_func crypto_sw[] = {{"ERR_get_error", NULL},
 	(*(int (*)(ASN1_INTEGER *, unsigned char **))crypto_sw[16].ptr)
 #define EVP_get_digestbyname                                                   \
 	(*(const EVP_MD *(*)(const char *))crypto_sw[17].ptr)
-#define ASN1_digest                                                            \
-	(*(int (*)(int (*)(),                                                      \
-	           const EVP_MD *,                                                 \
-	           char *,                                                         \
-	           unsigned char *,                                                \
-	           unsigned int *))crypto_sw[18].ptr)
+#define EVP_Digest                                                             \
+	(*(int (*)(                                                                \
+	    const void *, size_t, void *, unsigned int *, const EVP_MD *, void *)) \
+	      crypto_sw[18].ptr)
 #define i2d_X509 (*(int (*)(X509 *, unsigned char **))crypto_sw[19].ptr)
 #define BN_bn2hex (*(char *(*)(const BIGNUM *a))crypto_sw[20].ptr)
 #define ASN1_INTEGER_to_BN                                                     \
@@ -1623,7 +1619,7 @@ static struct ssl_func crypto_sw[] = {{"CRYPTO_num_locks", NULL},
                                       {"X509_get_serialNumber", NULL},
                                       {"i2c_ASN1_INTEGER", NULL},
                                       {"EVP_get_digestbyname", NULL},
-                                      {"ASN1_digest", NULL},
+                                      {"EVP_Digest", NULL},
                                       {"i2d_X509", NULL},
                                       {"BN_bn2hex", NULL},
                                       {"ASN1_INTEGER_to_BN", NULL},
@@ -12444,6 +12440,9 @@ ssl_get_client_cert_info(struct mg_connection *conn)
 		unsigned char buf[256];
 		char *str_serial = NULL;
 		unsigned int ulen;
+		int ilen;
+		unsigned char *tmp_buf;
+		unsigned char *tmp_p;
 
 		/* Handle to algorithm used for fingerprint */
 		const EVP_MD *digest = EVP_get_digestbyname("sha1");
@@ -12466,11 +12465,20 @@ ssl_get_client_cert_info(struct mg_connection *conn)
 
 		/* Calculate SHA1 fingerprint and store as a hex string */
 		ulen = 0;
-		ASN1_digest((int (*)(void *, unsigned char **))i2d_X509,
-		            digest,
-		            (char *)cert,
-		            buf,
-		            &ulen);
+
+		/* ASN1_digest is deprecated. Do the calculation manually,
+		 * using EVP_Digest. */
+		ilen = i2d_X509((void *)cert, NULL);
+		tmp_buf = (unsigned char *)mg_malloc(ilen + 1);
+		if (tmp_buf) {
+			tmp_p = tmp_buf;
+			(void)i2d_X509((void *)cert, &tmp_p);
+			if (!EVP_Digest(tmp_buf, ilen, buf, &ulen, digest, NULL)) {
+				ulen = 0;
+			}
+			mg_free(tmp_buf);
+		}
+
 		if (!hexdump2string(
 		        buf, (int)ulen, str_finger, (int)sizeof(str_finger))) {
 			*str_finger = 0;