Blame


1 058b0118 2005-01-03 devnull .TH PUSHTLS 3
2 058b0118 2005-01-03 devnull .SH NAME
3 058b0118 2005-01-03 devnull pushtls, tlsClient, tlsServer, initThumbprints, freeThumbprints, okThumbprint, readcert, readcertchain \- attach TLS1 or SSL3 encryption to a communication channel
4 058b0118 2005-01-03 devnull .SH SYNOPSIS
5 058b0118 2005-01-03 devnull .B #include <u.h>
6 058b0118 2005-01-03 devnull .br
7 058b0118 2005-01-03 devnull .B #include <libc.h>
8 058b0118 2005-01-03 devnull .PP
9 058b0118 2005-01-03 devnull .B
10 058b0118 2005-01-03 devnull int pushtls(int fd, char *hashalg, char *encalg,
11 058b0118 2005-01-03 devnull .br
12 058b0118 2005-01-03 devnull .B
13 058b0118 2005-01-03 devnull int isclient, char *secret, char *dir)
14 058b0118 2005-01-03 devnull .PP
15 058b0118 2005-01-03 devnull .B #include <mp.h>
16 058b0118 2005-01-03 devnull .br
17 058b0118 2005-01-03 devnull .B #include <libsec.h>
18 058b0118 2005-01-03 devnull .PP
19 058b0118 2005-01-03 devnull .B
20 058b0118 2005-01-03 devnull int tlsClient(int fd, TLSconn *conn)
21 058b0118 2005-01-03 devnull .PP
22 058b0118 2005-01-03 devnull .B
23 058b0118 2005-01-03 devnull int tlsServer(int fd, TLSconn *conn)
24 058b0118 2005-01-03 devnull .PP
25 058b0118 2005-01-03 devnull .B
26 058b0118 2005-01-03 devnull uchar *readcert(char *filename, int *pcertlen)
27 058b0118 2005-01-03 devnull .PP
28 058b0118 2005-01-03 devnull .B
29 c8b6342d 2005-01-13 devnull PEMchain *readcertchain(char *filename)
30 058b0118 2005-01-03 devnull .PP
31 058b0118 2005-01-03 devnull .B
32 058b0118 2005-01-03 devnull Thumbprint* initThumbprints(char *ok, char *crl)
33 058b0118 2005-01-03 devnull .PP
34 058b0118 2005-01-03 devnull .B
35 058b0118 2005-01-03 devnull void freeThumbprints(Thumbprint *table)
36 058b0118 2005-01-03 devnull .PP
37 058b0118 2005-01-03 devnull .B
38 058b0118 2005-01-03 devnull int okThumbprint(uchar *hash, Thumbprint *table)
39 058b0118 2005-01-03 devnull .SH DESCRIPTION
40 058b0118 2005-01-03 devnull Transport Layer Security (TLS) comprises a record layer protocol,
41 058b0118 2005-01-03 devnull doing message digesting and encrypting in the kernel,
42 058b0118 2005-01-03 devnull and a handshake protocol,
43 058b0118 2005-01-03 devnull doing initial authentication and secret creation at
44 058b0118 2005-01-03 devnull user level and then starting a data channel in the record protocol.
45 058b0118 2005-01-03 devnull TLS is nearly the same as SSL 3.0, and the software should interoperate
46 058b0118 2005-01-03 devnull with implementations of either standard.
47 058b0118 2005-01-03 devnull .PP
48 058b0118 2005-01-03 devnull To use just the record layer, as described in Plan 9's
49 977b25a7 2020-08-14 rsc .IR tls (3),
50 058b0118 2005-01-03 devnull call
51 058b0118 2005-01-03 devnull .I pushtls
52 058b0118 2005-01-03 devnull to open the record layer device, connect to the communications channel
53 058b0118 2005-01-03 devnull .IR fd ,
54 058b0118 2005-01-03 devnull and start up encryption and message authentication as specified
55 058b0118 2005-01-03 devnull in
56 058b0118 2005-01-03 devnull .IR hashalg ,
57 058b0118 2005-01-03 devnull .IR encalg ,
58 058b0118 2005-01-03 devnull and
59 058b0118 2005-01-03 devnull .IR secret .
60 058b0118 2005-01-03 devnull These parameters must have been arranged at the two ends of the
61 058b0118 2005-01-03 devnull conversation by other means.
62 058b0118 2005-01-03 devnull For example,
63 058b0118 2005-01-03 devnull .I hashalg
64 058b0118 2005-01-03 devnull could be
65 058b0118 2005-01-03 devnull .BR sha1 ,
66 058b0118 2005-01-03 devnull .I encalg
67 058b0118 2005-01-03 devnull could be
68 058b0118 2005-01-03 devnull .BR rc4_128 ,
69 058b0118 2005-01-03 devnull and
70 058b0118 2005-01-03 devnull .I secret
71 058b0118 2005-01-03 devnull could be the base-64 encoding of two (client-to-server and server-to-client)
72 058b0118 2005-01-03 devnull 20-byte digest keys and two corresponding 16-byte encryption keys.
73 058b0118 2005-01-03 devnull .I Pushtls
74 058b0118 2005-01-03 devnull returns a file descriptor for the TLS data channel. Anything written to this
75 058b0118 2005-01-03 devnull descriptor will get encrypted and authenticated and then written to the
76 058b0118 2005-01-03 devnull file descriptor,
77 058b0118 2005-01-03 devnull .IR fd .
78 058b0118 2005-01-03 devnull If
79 058b0118 2005-01-03 devnull .I dir
80 058b0118 2005-01-03 devnull is non-zero, the path name of the connection directory is copied into
81 058b0118 2005-01-03 devnull .IR dir .
82 058b0118 2005-01-03 devnull This path name is guaranteed to be less than 40 bytes long.
83 058b0118 2005-01-03 devnull .PP
84 058b0118 2005-01-03 devnull Alternatively, call
85 058b0118 2005-01-03 devnull .I tlsClient
86 058b0118 2005-01-03 devnull to speak the full handshake protocol,
87 058b0118 2005-01-03 devnull negotiate the algorithms and secrets,
88 058b0118 2005-01-03 devnull and return a new data file descriptor for the data channel.
89 058b0118 2005-01-03 devnull .I Conn
90 058b0118 2005-01-03 devnull points to a (caller-allocated) struct
91 058b0118 2005-01-03 devnull .EX
92 058b0118 2005-01-03 devnull typedef struct TLSconn{
93 058b0118 2005-01-03 devnull char dir[40]; // OUT connection directory
94 058b0118 2005-01-03 devnull uchar *cert; // IN/OUT certificate
95 058b0118 2005-01-03 devnull uchar *sessionID; // IN/OUT sessionID
96 058b0118 2005-01-03 devnull int certlen, sessionIDlen;
97 058b0118 2005-01-03 devnull void (*trace)(char*fmt, ...);
98 058b0118 2005-01-03 devnull PEMChain *chain;
99 058b0118 2005-01-03 devnull } TLSconn;
100 058b0118 2005-01-03 devnull .EE
101 058b0118 2005-01-03 devnull defined in
102 058b0118 2005-01-03 devnull .IR tls.h .
103 058b0118 2005-01-03 devnull On input, the caller can provide options such as
104 058b0118 2005-01-03 devnull .IR cert ,
105 058b0118 2005-01-03 devnull the local certificate, and
106 058b0118 2005-01-03 devnull .IR sessionID ,
107 058b0118 2005-01-03 devnull used by a client to resume a previously negotiated security association.
108 058b0118 2005-01-03 devnull On output, the connection directory is set, as with
109 058b0118 2005-01-03 devnull .B listen
110 058b0118 2005-01-03 devnull (see
111 d32deab1 2020-08-16 rsc .MR dial (3) ).
112 058b0118 2005-01-03 devnull The input
113 058b0118 2005-01-03 devnull .I cert
114 058b0118 2005-01-03 devnull is freed and a freshly allocated copy of the remote's certificate
115 058b0118 2005-01-03 devnull is returned in
116 058b0118 2005-01-03 devnull .IR conn ,
117 058b0118 2005-01-03 devnull to be checked by the caller
118 058b0118 2005-01-03 devnull according to its needs. One mechanism is supplied by
119 058b0118 2005-01-03 devnull .I initThumbprints
120 058b0118 2005-01-03 devnull and
121 058b0118 2005-01-03 devnull .I freeThumbprints
122 058b0118 2005-01-03 devnull which allocate and free, respectively, a table of hashes
123 058b0118 2005-01-03 devnull from files of known trusted and revoked certificates.
124 058b0118 2005-01-03 devnull .I okThumbprint
125 058b0118 2005-01-03 devnull confirms that a particular hash is in the table, as computed by
126 058b0118 2005-01-03 devnull .PP
127 058b0118 2005-01-03 devnull .EX
128 058b0118 2005-01-03 devnull uchar hash[SHA1dlen];
129 058b0118 2005-01-03 devnull conn = (TLSconn*)mallocz(sizeof *conn, 1);
130 058b0118 2005-01-03 devnull fd = tlsClient(fd, conn);
131 058b0118 2005-01-03 devnull sha1(conn->cert, conn->certlen, hash, nil);
132 058b0118 2005-01-03 devnull if(!okThumbprint(hash,table))
133 058b0118 2005-01-03 devnull exits("suspect server");
134 058b0118 2005-01-03 devnull ...application begins...
135 058b0118 2005-01-03 devnull .EE
136 058b0118 2005-01-03 devnull .PP
137 058b0118 2005-01-03 devnull Call
138 058b0118 2005-01-03 devnull .I tlsServer
139 058b0118 2005-01-03 devnull to perform the corresponding function on the server side:
140 058b0118 2005-01-03 devnull .PP
141 058b0118 2005-01-03 devnull .EX
142 058b0118 2005-01-03 devnull fd = accept(lcfd, ldir);
143 058b0118 2005-01-03 devnull conn = (TLSconn*)mallocz(sizeof *conn, 1);
144 058b0118 2005-01-03 devnull conn->cert = readcert("cert.pem", &conn->certlen);
145 058b0118 2005-01-03 devnull fd = tlsServer(fd, conn);
146 058b0118 2005-01-03 devnull ...application begins...
147 058b0118 2005-01-03 devnull .EE
148 058b0118 2005-01-03 devnull The private key corresponding to
149 058b0118 2005-01-03 devnull .I cert.pem
150 058b0118 2005-01-03 devnull should have been previously loaded into factotum.
151 058b0118 2005-01-03 devnull (See
152 d32deab1 2020-08-16 rsc .MR rsa (3)
153 058b0118 2005-01-03 devnull .\" XXX should be rsa(8)
154 058b0118 2005-01-03 devnull for more about key generation.)
155 058b0118 2005-01-03 devnull By setting
156 058b0118 2005-01-03 devnull .EX
157 058b0118 2005-01-03 devnull conn->chain = readcertchain("intermediate-certs.pem");
158 058b0118 2005-01-03 devnull .EE
159 058b0118 2005-01-03 devnull the server can present extra certificate evidence
160 058b0118 2005-01-03 devnull to establish the chain of trust to a root authority
161 058b0118 2005-01-03 devnull known to the client.
162 058b0118 2005-01-03 devnull .PP
163 058b0118 2005-01-03 devnull .I Conn
164 058b0118 2005-01-03 devnull is not required for the ongoing conversation and may
165 058b0118 2005-01-03 devnull be freed by the application whenever convenient.
166 058b0118 2005-01-03 devnull .SH FILES
167 977b25a7 2020-08-14 rsc .TP
168 058b0118 2005-01-03 devnull .B /sys/lib/tls
169 058b0118 2005-01-03 devnull thumbprints of trusted services
170 977b25a7 2020-08-14 rsc .TP
171 058b0118 2005-01-03 devnull .B /sys/lib/ssl
172 058b0118 2005-01-03 devnull PEM certificate files
173 058b0118 2005-01-03 devnull .SH SOURCE
174 058b0118 2005-01-03 devnull .\" .B /sys/src/libc/9sys/pushtls.c
175 058b0118 2005-01-03 devnull .\" .br
176 c3674de4 2005-01-11 devnull .B \*9/src/libsec/port
177 058b0118 2005-01-03 devnull .SH "SEE ALSO"
178 d32deab1 2020-08-16 rsc .MR dial (3) ,
179 d32deab1 2020-08-16 rsc .MR thumbprint (7) ;
180 058b0118 2005-01-03 devnull Plan 9's
181 977b25a7 2020-08-14 rsc .IR factotum (4)
182 058b0118 2005-01-03 devnull and
183 977b25a7 2020-08-14 rsc .IR tls (3)
184 058b0118 2005-01-03 devnull .SH DIAGNOSTICS
185 058b0118 2005-01-03 devnull return \-1 on failure.
186 058b0118 2005-01-03 devnull .SH BUGS
187 058b0118 2005-01-03 devnull .I Pushtls
188 058b0118 2005-01-03 devnull is not implemented.
189 058b0118 2005-01-03 devnull .PP
190 058b0118 2005-01-03 devnull Client certificates and client sessionIDs are not yet
191 058b0118 2005-01-03 devnull implemented.
192 058b0118 2005-01-03 devnull .PP
193 058b0118 2005-01-03 devnull Note that in the TLS protocol
194 058b0118 2005-01-03 devnull .I sessionID
195 058b0118 2005-01-03 devnull itself is public; it is used as a pointer to
196 058b0118 2005-01-03 devnull secrets stored in factotum.