summaryrefslogtreecommitdiff
blob: 2b07c85c04aab3ce37dd48b22ac11bd2b14fcb94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
From 98de912932732f1441300eb64ca3070ff1469fcf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <petr.pisar@atlas.cz>
Date: Sun, 30 Dec 2012 21:11:06 +0100
Subject: [PATCH] GnuTLS 3.0 removed gnutls_certificate_get_x509_cas()

---
 libraries/libldap/tls_g.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/libraries/libldap/tls_g.c b/libraries/libldap/tls_g.c
index 40616f5..374514d 100644
--- a/libraries/libldap/tls_g.c
+++ b/libraries/libldap/tls_g.c
@@ -60,6 +60,12 @@
 #undef HAVE_GCRYPT_RAND
 #endif
 
+#if LIBGNUTLS_VERSION_NUMBER >= 0x030000
+#define HAVE_GNUTLS_CERTIFICATE_GET_ISSUER 1
+#else
+#undef HAVE_GNUTLS_CERTIFICATE_GET_ISSUER
+#endif
+
 #ifndef HAVE_CIPHERSUITES
 /* Versions prior to 2.2.0 didn't handle cipher suites, so we had to
  * kludge them ourselves.
@@ -368,6 +374,22 @@ tlsg_ctx_init( struct ldapoptions *lo, struct ldaptls *lt, int is_server )
 		 * then we have to build the cert chain.
 		 */
 		if ( max == 1 && !gnutls_x509_crt_check_issuer( certs[0], certs[0] )) {
+#ifdef HAVE_GNUTLS_CERTIFICATE_GET_ISSUER
+			gnutls_x509_crt_t issuer;
+			unsigned int i;
+
+			for ( i = 1; i<VERIFY_DEPTH; i++ ) {
+				/* If no CA is known, we're done */
+				if ( gnutls_certificate_get_issuer( ctx->cred, certs[i-1],
+							&issuer, 0 ) )
+					break;
+				certs[i] = issuer;
+				max++;
+				/* If this CA is self-signed, we're done */
+				if ( gnutls_x509_crt_check_issuer( certs[i], certs[i] ))
+					break;
+			}
+#else
 			gnutls_x509_crt_t *cas;
 			unsigned int i, j, ncas;
 
@@ -387,6 +409,7 @@ tlsg_ctx_init( struct ldapoptions *lo, struct ldaptls *lt, int is_server )
 				if ( j == ncas )
 					break;
 			}
+#endif /* !defined HAVE_GNUTLS_CERTIFICATE_GET_ISSUER */
 		}
 		rc = gnutls_certificate_set_x509_key( ctx->cred, certs, max, key );
 		if ( rc ) return -1;
-- 
1.8.0.2