Commit 3f9eb1e5 by Carlos Martín Nieto

ssl: add support for certificates issues to an IP address

parent d3e1367f
......@@ -24,6 +24,7 @@
#endif
#include <ctype.h>
#include <arpa/inet.h>
#include "git2/errors.h"
#include "common.h"
......@@ -219,8 +220,23 @@ static int verify_server_cert(git_transport *t, const char *host)
X509 *cert;
X509_NAME *peer_name;
char buf[1024];
int matched = -1;
int matched = -1, type = GEN_DNS;
GENERAL_NAMES *alts;
struct in6_addr addr6;
struct in_addr addr4;
void *addr;
/* Try to parse the host as an IP address to see if it is */
if (inet_pton(AF_INET, host, &addr4)) {
type = GEN_IPADD;
addr = &addr4;
} else {
if(inet_pton(AF_INET6, host, &addr6)) {
type = GEN_IPADD;
addr = &addr6;
}
}
cert = SSL_get_peer_certificate(t->ssl.ssl);
......@@ -235,6 +251,11 @@ static int verify_server_cert(git_transport *t, const char *host)
const char *name = (char *) ASN1_STRING_data(gn->d.ia5);
size_t namelen = (size_t) ASN1_STRING_length(gn->d.ia5);
/* Skip any names of a type we're not looking for */
if (gn->type != type)
continue;
if (type == GEN_DNS) {
/* If it contains embedded NULs, don't even try */
if (namelen != strnlen(name, namelen))
continue;
......@@ -243,6 +264,10 @@ static int verify_server_cert(git_transport *t, const char *host)
matched = 0;
else
matched = 1;
} else if (type == GEN_IPADD) {
/* Here name isn't so much a name but a binary representation of the IP */
matched = !!memcmp(name, addr, namelen);
}
}
}
GENERAL_NAMES_free(alts);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment