]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/tlsclient.c
disk/format: implement long name support
[plan9front.git] / sys / src / cmd / tlsclient.c
index a90eabf96bc6c1baf1d757987b7e9bdedbc7853f..06d34a32020ed50bccc7b64605e2f692c895c5b5 100644 (file)
@@ -6,12 +6,12 @@
 
 int debug, auth, dialfile;
 char *keyspec = "";
-char *servername, *file, *filex, *ccert;
+char *servername, *file, *filex, *ccert, *dumpcert;
 
 void
 usage(void)
 {
-       fprint(2, "usage: tlsclient [-D] [-a [-k keyspec] ] [-c lib/tls/clientcert] [-t /sys/lib/tls/xxx] [-x /sys/lib/tls/xxx.exclude] [-n servername] [-o] dialstring [cmd [args...]]\n");
+       fprint(2, "usage: tlsclient [-D] [-a [-k keyspec] ] [-c clientcert.pem] [-d servercert] [-t /sys/lib/tls/xxx] [-x /sys/lib/tls/xxx.exclude] [-n servername] [-o] dialstring [cmd [args...]]\n");
        exits("usage");
 }
 
@@ -43,12 +43,13 @@ reporter(char *fmt, ...)
 void
 main(int argc, char **argv)
 {
-       int fd;
+       int fd, dfd;
        char *addr;
        TLSconn *conn;
        Thumbprint *thumb;
        AuthInfo *ai = nil;
 
+       fmtinstall('[', encodefmt);
        fmtinstall('H', encodefmt);
 
        ARGBEGIN{
@@ -70,6 +71,9 @@ main(int argc, char **argv)
        case 'c':
                ccert = EARGF(usage());
                break;
+       case 'd':
+               dumpcert = EARGF(usage());
+               break;
        case 'n':
                servername = EARGF(usage());
                break;
@@ -87,7 +91,7 @@ main(int argc, char **argv)
                sysfatal("specifying -x without -t is useless");
 
        if(file){
-               thumb = initThumbprints(file, filex);
+               thumb = initThumbprints(file, filex, "x509");
                if(thumb == nil)
                        sysfatal("initThumbprints: %r");
        } else
@@ -122,14 +126,18 @@ main(int argc, char **argv)
        if(fd < 0)
                sysfatal("tlsclient: %r");
 
-       if(thumb){
-               uchar digest[20];
+       if(dumpcert){
+               if((dfd = create(dumpcert, OWRITE, 0666)) < 0)
+                       sysfatal("create: %r");
+               if(conn->cert != nil)
+                       write(dfd, conn->cert, conn->certlen);
+               write(dfd, "", 0);
+               close(dfd);
+       }
 
-               if(conn->cert==nil || conn->certlen<=0)
-                       sysfatal("server did not provide TLS certificate");
-               sha1(conn->cert, conn->certlen, digest, nil);
-               if(!okThumbprint(digest, thumb))
-                       sysfatal("server certificate %.*H not recognized", SHA1dlen, digest);
+       if(thumb){
+               if(!okCertificate(conn->cert, conn->certlen, thumb))
+                       sysfatal("cert for %s not recognized: %r", servername ? servername : addr);
                freeThumbprints(thumb);
        }