ref: af93e0054ff142c7867c7a7c73982d13735758f4
parent: 2959acc59ca6324966d55953f7893276415dd49b
author: Yaroslav K <yarikos@gmail.com>
date: Sat Aug 23 16:24:41 EDT 2025
build time pick of tls file
--- a/mkfile
+++ b/mkfile
@@ -1,4 +1,6 @@
</$objtype/mkfile
+<|opt.rc
+
#<$PLAN9/src/mkhdr
TARG=rd
@@ -24,11 +26,11 @@
msg.$O\
rd.$O\
rpc.$O\
- tls.$O\
utf16.$O\
vchan.$O\
wsys.$O\
x224.$O\
+ $TLSFILE.$O\
THREADOFILES=${OFILES:rd.$O=rd-thread.$O}CLEANFILES=$O.thread $O.test
--- /dev/null
+++ b/opt.rc
@@ -1,0 +1,7 @@
+#!/bin/rc
+
+# 9front differs in initThumbprints signature/usage
+if(~ `{grep initThumbprints /sys/include/libsec.h | wc -w} 7)+ echo 'TLSFILE=tls9f'
+if not
+ echo 'TLSFILE=tls'
--- a/tls.c
+++ b/tls.c
@@ -17,12 +17,12 @@
return 0;
}
sha1(cert, certlen, digest, nil);
- table = initThumbprints("/sys/lib/tls/rdp", "/sys/lib/tls/rdp.exclude", "x224");- if(!table || !okThumbprint(digest, SHA1dlen, table)){+ table = initThumbprints("/sys/lib/tls/rdp", "/sys/lib/tls/rdp.exclude");+ if(!table || !okThumbprint(digest, table)){ werrstr("server certificate not recognized");fprint(2, "verify server certificate %.*H \n", SHA1dlen, digest);
fprint(2, "add thumbprint after verification\n");
- fprint(2, "\techo 'x224 sha1=%.*H' >> %q\n", SHA1dlen, digest, "/sys/lib/tls/rdp");
+ fprint(2, "\techo 'x509 sha1=%.*H' >> %q\n", SHA1dlen, digest, "/sys/lib/tls/rdp");
return 0;
}
freeThumbprints(table);
--- /dev/null
+++ b/tls9f.c
@@ -1,0 +1,56 @@
+#include <u.h>
+#include <libc.h>
+#include <mp.h>
+#include <libsec.h>
+#include "dat.h"
+#include "fns.h"
+
+int
+istrusted(uchar* cert, int certlen)
+{+ uchar digest[SHA1dlen];
+ Thumbprint *table;
+
+ fmtinstall('H', encodefmt);+ if(cert==nil || certlen <= 0) {+ werrstr("server did not provide TLS certificate");+ return 0;
+ }
+ sha1(cert, certlen, digest, nil);
+ table = initThumbprints("/sys/lib/tls/rdp", "/sys/lib/tls/rdp.exclude", "x224");+ if(!table || !okThumbprint(digest, SHA1dlen, table)){+ werrstr("server certificate not recognized");+ fprint(2, "verify server certificate %.*H \n", SHA1dlen, digest);
+ fprint(2, "add thumbprint after verification\n");
+ fprint(2, "\techo 'x224 sha1=%.*H' >> %q\n", SHA1dlen, digest, "/sys/lib/tls/rdp");
+ return 0;
+ }
+ freeThumbprints(table);
+ return 1;
+}
+
+/* lifted from /sys/src/cmd/upas/fs/imap4.c:/^starttls */
+int
+starttls(Rdp* r)
+{+ TLSconn c;
+ int fd, sfd;
+
+ fd = r->fd;
+
+ memset(&c, 0, sizeof c);
+ sfd = tlsClient(fd, &c);
+ if(sfd < 0){+ werrstr("tlsClient: %r");+ return -1;
+ }
+ if(!istrusted(c.cert, c.certlen)){+ close(sfd);
+ return -1;
+ }
+ /* BUG: free c.cert? */
+
+ close(r->fd);
+ r->fd = sfd;
+ return sfd;
+}
--
⑨