Skip to content

Commit bcbe9eb

Browse files
WIP
1 parent 9426d52 commit bcbe9eb

File tree

6 files changed

+51
-9
lines changed

6 files changed

+51
-9
lines changed

eggdrop.conf

+2
Original file line numberDiff line numberDiff line change
@@ -1081,6 +1081,8 @@ server add you.need.to.change.this 6667
10811081
server add another.example.com 6669 password
10821082
server add 2001:db8:618:5c0:263:: 6669 password
10831083
server add ssl.example.net +7000
1084+
# For tls ports the servers public key sha256 fingerprint can be pinned:
1085+
server add example.org +6697,55:88:55:88:55:88:55:88:55:88:55:88:55:88:55:88:55:88:55:88:55:88:55:88:55:88:55:88:55:88:55:88
10841086

10851087
#### CAP Features ####
10861088
# This section controls IRCv3 capabilities supported natively by Eggdrop. You

src/eggdrop.h

+3
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,9 @@ struct dcc_t {
352352
struct dupwait_info *dupwait;
353353
int ident_sock;
354354
void *other;
355+
#ifdef TLS
356+
char *fingerprint;
357+
#endif
355358
} u; /* Special use depending on type */
356359
};
357360

src/mod/server.mod/server.c

+6
Original file line numberDiff line numberDiff line change
@@ -1040,6 +1040,12 @@ static int add_server(const char *name, const char *port, const char *pass)
10401040
x->port = atoi(port);
10411041
#ifdef TLS
10421042
x->ssl = (port[0] == '+') ? 1 : 0;
1043+
char *fingerprint;
1044+
if (x->ssl && (fingerprint = strchr(port + 1, ',')) && fingerprint[1]) {
1045+
x->fingerprint = nmalloc(strlen(fingerprint) + 1);
1046+
strcpy(x->fingerprint, fingerprint + 1);
1047+
} else
1048+
x->fingerprint = NULL;
10431049
#endif
10441050
return 0;
10451051
}

src/mod/server.mod/server.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,11 @@
109109

110110
struct server_list {
111111
struct server_list *next;
112-
113112
char *name;
114113
int port;
115114
#ifdef TLS
116115
int ssl;
116+
char *fingerprint;
117117
#endif
118118
char *pass;
119119
char *realname;

src/mod/server.mod/servmsg.c

+9-4
Original file line numberDiff line numberDiff line change
@@ -1966,20 +1966,20 @@ static void connect_server(void)
19661966

19671967
#ifdef IPV6
19681968
if (inet_pton(AF_INET6, botserver, buf)) {
1969-
len += egg_snprintf(s, sizeof s, "%s [%s]", IRC_SERVERTRY, botserver);
1969+
len += snprintf(s, sizeof s, "%s [%s]", IRC_SERVERTRY, botserver);
19701970
} else {
19711971
#endif
1972-
len += egg_snprintf(s, sizeof s, "%s %s", IRC_SERVERTRY, botserver);
1972+
len += snprintf(s, sizeof s, "%s %s", IRC_SERVERTRY, botserver);
19731973
#ifdef IPV6
19741974
}
19751975
#endif
19761976

19771977
#ifdef TLS
1978-
len += egg_snprintf(s + len, sizeof s - len, ":%s%d",
1978+
len += snprintf(s + len, sizeof s - len, ":%s%d",
19791979
use_ssl ? "+" : "", botserverport);
19801980
dcc[servidx].ssl = use_ssl;
19811981
#else
1982-
len += egg_snprintf(s + len, sizeof s - len, ":%d", botserverport);
1982+
len += snprintf(s + len, sizeof s - len, ":%d", botserverport);
19831983
#endif
19841984
putlog(LOG_SERV, "*", "%s", s);
19851985
dcc[servidx].port = botserverport;
@@ -2003,6 +2003,11 @@ static void connect_server(void)
20032003
dcc[servidx].u.dns->dns_type = RES_IPBYHOST;
20042004
dcc[servidx].u.dns->type = &SERVER_SOCKET;
20052005
dcc[servidx].status |= STAT_SERV;
2006+
#ifdef TLS
2007+
printf("DEBUG: here fingerprint needs to be set to dcc_t entry, so, that tls.c:ssl_info()->sock->dcc->fingerprint can be used, not implemented yet\n");
2008+
// if (fingerprint)
2009+
// dcc[servidx].u.fingerprint = fingerprint;
2010+
#endif
20062011

20072012
if (server_cycle_wait)
20082013
/* Back to 1st server & set wait time.

src/tls.c

+30-4
Original file line numberDiff line numberDiff line change
@@ -648,25 +648,31 @@ static void ssl_showcert(X509 *cert, const int loglev)
648648
} else
649649
putlog(loglev, "*", "TLS: cannot get issuer name from certificate!");
650650

651-
/* Fingerprints */
651+
/* Certificate fingerprints */
652652
if (X509_digest(cert, EVP_sha1(), md, &len)) {
653653
buf = OPENSSL_buf2hexstr(md, len);
654654
putlog(loglev, "*", "TLS: certificate SHA1 Fingerprint: %s", buf);
655655
OPENSSL_free(buf);
656656
}
657657
if (X509_digest(cert, EVP_sha256(), md, &len)) {
658658
buf = OPENSSL_buf2hexstr(md, len);
659-
putlog(loglev, "*", "TLS: certificate SHA-256 Fingerprint: %s", buf);
659+
putlog(loglev, "*", "TLS: certificate SHA256 Fingerprint: %s", buf);
660660
OPENSSL_free(buf);
661661
}
662662

663-
664663
/* Validity time */
665664
from = ssl_printtime(X509_get_notBefore(cert));
666665
to = ssl_printtime(X509_get_notAfter(cert));
667666
putlog(loglev, "*", "TLS: certificate valid from %s to %s", from, to);
668667
nfree(from);
669668
nfree(to);
669+
670+
/* Public key fingerprint */
671+
if (X509_pubkey_digest(cert, EVP_sha256(), md, &len)) {
672+
buf = OPENSSL_buf2hexstr(md, len);
673+
putlog(loglev, "*", "TLS: public key SHA256 Fingerprint: %s", buf);
674+
OPENSSL_free(buf);
675+
}
670676
}
671677

672678
/* Certificate validation callback
@@ -768,6 +774,24 @@ static void ssl_info(const SSL *ssl, int where, int ret)
768774
/* Callback for completed handshake. Cheaper and more convenient than
769775
using H_tls */
770776
sock = SSL_get_fd(ssl);
777+
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
778+
cert = SSL_get0_peer_certificate(ssl);
779+
#else
780+
cert = SSL_get_peer_certificate(ssl);
781+
#endif
782+
783+
/* Verify public key fingerprint */
784+
int idx = findanyidx(sock);
785+
if (dcc[idx].u.fingerprint) {
786+
unsigned char md[EVP_MAX_MD_SIZE];
787+
unsigned int len;
788+
if (X509_pubkey_digest(cert, EVP_sha256(), md, &len)) {
789+
char *fingerprint2 = OPENSSL_buf2hexstr(md, len);
790+
OPENSSL_free(fingerprint2);
791+
}
792+
printf("DEBUG: Verifying public key fingerprint not implemented yet: %s\n", dcc[idx].u.fingerprint);
793+
}
794+
771795
if (data->cb)
772796
data->cb(sock);
773797
/* Call TLS binds. We allow scripts to take over or disable displaying of
@@ -778,9 +802,11 @@ static void ssl_info(const SSL *ssl, int where, int ret)
778802
putlog(data->loglevel, "*", "TLS: handshake successful. Secure connection "
779803
"established.");
780804

781-
if ((cert = SSL_get_peer_certificate(ssl))) {
805+
if (cert) {
782806
ssl_showcert(cert, LOG_DEBUG);
807+
#if OPENSSL_VERSION_NUMBER < 0x30000000L
783808
X509_free(cert);
809+
#endif
784810
}
785811
else
786812
putlog(data->loglevel, "*", "TLS: peer did not present a certificate");

0 commit comments

Comments
 (0)