Warning: Undefined variable $n in /usr/local/www/websvn.planix.org/include/diff_util.php on line 243

Warning: Undefined variable $n in /usr/local/www/websvn.planix.org/include/diff_util.php on line 247

Warning: Undefined variable $m in /usr/local/www/websvn.planix.org/include/diff_util.php on line 251
WebSVN – planix.SVN – Diff – /os/trunk/sys/src/libsec/port/tlshand.c – Rev 2 and 33

Subversion Repositories planix.SVN

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 33
Line 1... Line 1...
1
#include <u.h>
1
#include <u.h>
2
#include <libc.h>
2
#include <libc.h>
3
#include <bio.h>
-
 
4
#include <auth.h>
3
#include <auth.h>
5
#include <mp.h>
4
#include <mp.h>
6
#include <libsec.h>
5
#include <libsec.h>
7
 
6
 
8
// The main groups of functions are:
7
// The main groups of functions are:
Line 15... Line 14...
15
// which is implemented in kernel device #a.  See also /lib/rfc/rfc2246.
14
// which is implemented in kernel device #a.  See also /lib/rfc/rfc2246.
16
 
15
 
17
enum {
16
enum {
18
	TLSFinishedLen = 12,
17
	TLSFinishedLen = 12,
19
	SSL3FinishedLen = MD5dlen+SHA1dlen,
18
	SSL3FinishedLen = MD5dlen+SHA1dlen,
20
	MaxKeyData = 136,	// amount of secret we may need
19
	MaxKeyData = 160,	// amount of secret we may need
21
	MaxChunk = 1<<14,
20
	MAXdlen = SHA2_512dlen,
22
	RandomSize = 32,
21
	RandomSize = 32,
23
	SidSize = 32,
-
 
24
	MasterSecretSize = 48,
22
	MasterSecretSize = 48,
25
	AQueue = 0,
23
	AQueue = 0,
26
	AFlush = 1,
24
	AFlush = 1,
27
};
25
};
28
 
-
 
29
typedef struct TlsSec TlsSec;
-
 
30
 
26
 
31
typedef struct Bytes{
27
typedef struct Bytes{
32
	int len;
28
	int len;
33
	uchar data[1];  // [len]
29
	uchar data[];
34
} Bytes;
30
} Bytes;
35
 
31
 
36
typedef struct Ints{
32
typedef struct Ints{
37
	int len;
33
	int len;
38
	int data[1];  // [len]
34
	int data[];
39
} Ints;
35
} Ints;
40
 
36
 
41
typedef struct Algs{
37
typedef struct Algs{
42
	char *enc;
38
	char *enc;
43
	char *digest;
39
	char *digest;
44
	int nsecret;
40
	int nsecret;
45
	int tlsid;
41
	int tlsid;
46
	int ok;
42
	int ok;
47
} Algs;
43
} Algs;
-
 
44
 
-
 
45
typedef struct Namedcurve{
-
 
46
	int tlsid;
-
 
47
	void (*init)(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h);
-
 
48
} Namedcurve;
48
 
49
 
49
typedef struct Finished{
50
typedef struct Finished{
50
	uchar verify[SSL3FinishedLen];
51
	uchar verify[SSL3FinishedLen];
51
	int n;
52
	int n;
52
} Finished;
53
} Finished;
-
 
54
 
-
 
55
typedef struct HandshakeHash {
-
 
56
	MD5state	md5;
-
 
57
	SHAstate	sha1;
-
 
58
	SHA2_256state	sha2_256;
-
 
59
} HandshakeHash;
-
 
60
 
-
 
61
typedef struct TlsSec TlsSec;
-
 
62
struct TlsSec {
-
 
63
	RSApub *rsapub;
-
 
64
	AuthRpc *rpc;	// factotum for rsa private key
-
 
65
	uchar *psk;	// pre-shared key
-
 
66
	int psklen;
-
 
67
	int clientVers;			// version in ClientHello
-
 
68
	uchar sec[MasterSecretSize];	// master secret
-
 
69
	uchar crandom[RandomSize];	// client random
-
 
70
	uchar srandom[RandomSize];	// server random
-
 
71
 
-
 
72
	// diffie hellman state
-
 
73
	DHstate dh;
-
 
74
	struct {
-
 
75
		ECdomain dom;
-
 
76
		ECpriv Q;
-
 
77
	} ec;
-
 
78
 
-
 
79
	// byte generation and handshake checksum
-
 
80
	void (*prf)(uchar*, int, uchar*, int, char*, uchar*, int, uchar*, int);
-
 
81
	void (*setFinished)(TlsSec*, HandshakeHash, uchar*, int);
-
 
82
	int nfin;
-
 
83
};
53
 
84
 
54
typedef struct TlsConnection{
85
typedef struct TlsConnection{
55
	TlsSec *sec;	// security management goo
86
	TlsSec sec[1];	// security management goo
56
	int hand, ctl;	// record layer file descriptors
87
	int hand, ctl;	// record layer file descriptors
57
	int erred;		// set when tlsError called
88
	int erred;		// set when tlsError called
58
	int (*trace)(char*fmt, ...); // for debugging
89
	int (*trace)(char*fmt, ...); // for debugging
59
	int version;	// protocol we are speaking
90
	int version;	// protocol we are speaking
60
	int verset;		// version has been set
-
 
61
	int ver2hi;		// server got a version 2 hello
-
 
62
	int isClient;	// is this the client or server?
-
 
63
	Bytes *sid;		// SessionID
-
 
64
	Bytes *cert;	// only last - no chain
91
	Bytes *cert;	// server certificate; only last - no chain
65
 
92
 
66
	Lock statelk;
93
	int cipher;
67
	int state;		// must be set using setstate
94
	int nsecret;	// amount of secret data to init keys
68
 
-
 
69
	// input buffer for handshake messages
-
 
70
	uchar buf[MaxChunk+2048];
-
 
71
	uchar *rp, *ep;
-
 
72
 
-
 
73
	uchar crandom[RandomSize];	// client random
-
 
74
	uchar srandom[RandomSize];	// server random
-
 
75
	int clientVersion;	// version in ClientHello
-
 
76
	char *digest;	// name of digest algorithm to use
95
	char *digest;	// name of digest algorithm to use
77
	char *enc;		// name of encryption algorithm to use
96
	char *enc;	// name of encryption algorithm to use
78
	int nsecret;	// amount of secret data to init keys
-
 
79
 
97
 
80
	// for finished messages
98
	// for finished messages
81
	MD5state	hsmd5;	// handshake hash
-
 
82
	SHAstate	hssha1;	// handshake hash
99
	HandshakeHash	handhash;
83
	Finished	finished;
100
	Finished	finished;
-
 
101
 
-
 
102
	uchar *sendp;
-
 
103
	uchar buf[1<<16];
84
} TlsConnection;
104
} TlsConnection;
85
 
105
 
86
typedef struct Msg{
106
typedef struct Msg{
87
	int tag;
107
	int tag;
88
	union {
108
	union {
Line 90... Line 110...
90
			int version;
110
			int version;
91
			uchar 	random[RandomSize];
111
			uchar 	random[RandomSize];
92
			Bytes*	sid;
112
			Bytes*	sid;
93
			Ints*	ciphers;
113
			Ints*	ciphers;
94
			Bytes*	compressors;
114
			Bytes*	compressors;
-
 
115
			Bytes*	extensions;
95
		} clientHello;
116
		} clientHello;
96
		struct {
117
		struct {
97
			int version;
118
			int version;
98
			uchar 	random[RandomSize];
119
			uchar	random[RandomSize];
99
			Bytes*	sid;
120
			Bytes*	sid;
100
			int cipher;
121
			int	cipher;
101
			int compressor;
122
			int	compressor;
-
 
123
			Bytes*	extensions;
102
		} serverHello;
124
		} serverHello;
103
		struct {
125
		struct {
104
			int ncert;
126
			int ncert;
105
			Bytes **certs;
127
			Bytes **certs;
106
		} certificate;
128
		} certificate;
107
		struct {
129
		struct {
108
			Bytes *types;
130
			Bytes *types;
-
 
131
			Ints *sigalgs;
109
			int nca;
132
			int nca;
110
			Bytes **cas;
133
			Bytes **cas;
111
		} certificateRequest;
134
		} certificateRequest;
112
		struct {
135
		struct {
-
 
136
			Bytes *pskid;
113
			Bytes *key;
137
			Bytes *key;
114
		} clientKeyExchange;
138
		} clientKeyExchange;
-
 
139
		struct {
-
 
140
			Bytes *pskid;
-
 
141
			Bytes *dh_p;
-
 
142
			Bytes *dh_g;
-
 
143
			Bytes *dh_Ys;
-
 
144
			Bytes *dh_parameters;
-
 
145
			Bytes *dh_signature;
-
 
146
			int sigalg;
-
 
147
			int curve;
-
 
148
		} serverKeyExchange;
-
 
149
		struct {
-
 
150
			int sigalg;
-
 
151
			Bytes *signature;
-
 
152
		} certificateVerify;		
115
		Finished finished;
153
		Finished finished;
116
	} u;
154
	} u;
117
} Msg;
155
} Msg;
118
 
-
 
119
typedef struct TlsSec{
-
 
120
	char *server;	// name of remote; nil for server
-
 
121
	int ok;	// <0 killed; == 0 in progress; >0 reusable
-
 
122
	RSApub *rsapub;
-
 
123
	AuthRpc *rpc;	// factotum for rsa private key
-
 
124
	uchar sec[MasterSecretSize];	// master secret
-
 
125
	uchar crandom[RandomSize];	// client random
-
 
126
	uchar srandom[RandomSize];	// server random
-
 
127
	int clientVers;		// version in ClientHello
-
 
128
	int vers;			// final version
-
 
129
	// byte generation and handshake checksum
-
 
130
	void (*prf)(uchar*, int, uchar*, int, char*, uchar*, int, uchar*, int);
-
 
131
	void (*setFinished)(TlsSec*, MD5state, SHAstate, uchar*, int);
-
 
132
	int nfin;
-
 
133
} TlsSec;
-
 
134
 
156
 
135
 
157
 
136
enum {
158
enum {
-
 
159
	SSL3Version	= 0x0300,
137
	TLSVersion = 0x0301,
160
	TLS10Version	= 0x0301,
-
 
161
	TLS11Version	= 0x0302,
138
	SSL3Version = 0x0300,
162
	TLS12Version	= 0x0303,
139
	ProtocolVersion = 0x0301,	// maximum version we speak
163
	ProtocolVersion	= TLS12Version,	// maximum version we speak
140
	MinProtoVersion = 0x0300,	// limits on version we accept
164
	MinProtoVersion	= 0x0300,	// limits on version we accept
141
	MaxProtoVersion	= 0x03ff,
165
	MaxProtoVersion	= 0x03ff,
142
};
166
};
143
 
167
 
144
// handshake type
168
// handshake type
145
enum {
169
enum {
Line 179... Line 203...
179
	EDecryptError = 51,
203
	EDecryptError = 51,
180
	EExportRestriction = 60,
204
	EExportRestriction = 60,
181
	EProtocolVersion = 70,
205
	EProtocolVersion = 70,
182
	EInsufficientSecurity = 71,
206
	EInsufficientSecurity = 71,
183
	EInternalError = 80,
207
	EInternalError = 80,
-
 
208
	EInappropriateFallback = 86,
184
	EUserCanceled = 90,
209
	EUserCanceled = 90,
185
	ENoRenegotiation = 100,
210
	ENoRenegotiation = 100,
-
 
211
	EUnknownPSKidentity = 115,
186
	EMax = 256
212
	EMax = 256
187
};
213
};
188
 
214
 
189
// cipher suites
215
// cipher suites
190
enum {
216
enum {
191
	TLS_NULL_WITH_NULL_NULL	 		= 0x0000,
217
	TLS_NULL_WITH_NULL_NULL			= 0x0000,
192
	TLS_RSA_WITH_NULL_MD5 			= 0x0001,
218
	TLS_RSA_WITH_NULL_MD5			= 0x0001,
193
	TLS_RSA_WITH_NULL_SHA 			= 0x0002,
219
	TLS_RSA_WITH_NULL_SHA			= 0x0002,
194
	TLS_RSA_EXPORT_WITH_RC4_40_MD5 		= 0x0003,
220
	TLS_RSA_EXPORT_WITH_RC4_40_MD5		= 0x0003,
195
	TLS_RSA_WITH_RC4_128_MD5 		= 0x0004,
221
	TLS_RSA_WITH_RC4_128_MD5		= 0x0004,
196
	TLS_RSA_WITH_RC4_128_SHA 		= 0x0005,
222
	TLS_RSA_WITH_RC4_128_SHA		= 0x0005,
197
	TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5	= 0X0006,
223
	TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5	= 0X0006,
198
	TLS_RSA_WITH_IDEA_CBC_SHA 		= 0X0007,
224
	TLS_RSA_WITH_IDEA_CBC_SHA		= 0X0007,
199
	TLS_RSA_EXPORT_WITH_DES40_CBC_SHA	= 0X0008,
225
	TLS_RSA_EXPORT_WITH_DES40_CBC_SHA	= 0X0008,
200
	TLS_RSA_WITH_DES_CBC_SHA		= 0X0009,
226
	TLS_RSA_WITH_DES_CBC_SHA		= 0X0009,
201
	TLS_RSA_WITH_3DES_EDE_CBC_SHA		= 0X000A,
227
	TLS_RSA_WITH_3DES_EDE_CBC_SHA		= 0X000A,
202
	TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA	= 0X000B,
228
	TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA	= 0X000B,
203
	TLS_DH_DSS_WITH_DES_CBC_SHA		= 0X000C,
229
	TLS_DH_DSS_WITH_DES_CBC_SHA		= 0X000C,
Line 210... Line 236...
210
	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA	= 0X0013,	// ZZZ must be implemented for tls1.0 compliance
236
	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA	= 0X0013,	// ZZZ must be implemented for tls1.0 compliance
211
	TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA	= 0X0014,
237
	TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA	= 0X0014,
212
	TLS_DHE_RSA_WITH_DES_CBC_SHA		= 0X0015,
238
	TLS_DHE_RSA_WITH_DES_CBC_SHA		= 0X0015,
213
	TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA	= 0X0016,
239
	TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA	= 0X0016,
214
	TLS_DH_anon_EXPORT_WITH_RC4_40_MD5	= 0x0017,
240
	TLS_DH_anon_EXPORT_WITH_RC4_40_MD5	= 0x0017,
215
	TLS_DH_anon_WITH_RC4_128_MD5 		= 0x0018,
241
	TLS_DH_anon_WITH_RC4_128_MD5		= 0x0018,
216
	TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA	= 0X0019,
242
	TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA	= 0X0019,
217
	TLS_DH_anon_WITH_DES_CBC_SHA		= 0X001A,
243
	TLS_DH_anon_WITH_DES_CBC_SHA		= 0X001A,
218
	TLS_DH_anon_WITH_3DES_EDE_CBC_SHA	= 0X001B,
244
	TLS_DH_anon_WITH_3DES_EDE_CBC_SHA	= 0X001B,
219
 
-
 
220
	TLS_RSA_WITH_AES_128_CBC_SHA		= 0X002f,	// aes, aka rijndael with 128 bit blocks
245
	TLS_RSA_WITH_AES_128_CBC_SHA		= 0X002F,	// aes, aka rijndael with 128 bit blocks
221
	TLS_DH_DSS_WITH_AES_128_CBC_SHA		= 0X0030,
246
	TLS_DH_DSS_WITH_AES_128_CBC_SHA		= 0X0030,
222
	TLS_DH_RSA_WITH_AES_128_CBC_SHA		= 0X0031,
247
	TLS_DH_RSA_WITH_AES_128_CBC_SHA		= 0X0031,
223
	TLS_DHE_DSS_WITH_AES_128_CBC_SHA	= 0X0032,
248
	TLS_DHE_DSS_WITH_AES_128_CBC_SHA	= 0X0032,
224
	TLS_DHE_RSA_WITH_AES_128_CBC_SHA	= 0X0033,
249
	TLS_DHE_RSA_WITH_AES_128_CBC_SHA	= 0X0033,
225
	TLS_DH_anon_WITH_AES_128_CBC_SHA	= 0X0034,
250
	TLS_DH_anon_WITH_AES_128_CBC_SHA	= 0X0034,
Line 227... Line 252...
227
	TLS_DH_DSS_WITH_AES_256_CBC_SHA		= 0X0036,
252
	TLS_DH_DSS_WITH_AES_256_CBC_SHA		= 0X0036,
228
	TLS_DH_RSA_WITH_AES_256_CBC_SHA		= 0X0037,
253
	TLS_DH_RSA_WITH_AES_256_CBC_SHA		= 0X0037,
229
	TLS_DHE_DSS_WITH_AES_256_CBC_SHA	= 0X0038,
254
	TLS_DHE_DSS_WITH_AES_256_CBC_SHA	= 0X0038,
230
	TLS_DHE_RSA_WITH_AES_256_CBC_SHA	= 0X0039,
255
	TLS_DHE_RSA_WITH_AES_256_CBC_SHA	= 0X0039,
231
	TLS_DH_anon_WITH_AES_256_CBC_SHA	= 0X003A,
256
	TLS_DH_anon_WITH_AES_256_CBC_SHA	= 0X003A,
-
 
257
	TLS_RSA_WITH_AES_128_CBC_SHA256		= 0X003C,
-
 
258
	TLS_RSA_WITH_AES_256_CBC_SHA256		= 0X003D,
-
 
259
	TLS_DHE_RSA_WITH_AES_128_CBC_SHA256	= 0X0067,
-
 
260
 
-
 
261
	TLS_RSA_WITH_AES_128_GCM_SHA256		= 0x009C,
-
 
262
	TLS_RSA_WITH_AES_256_GCM_SHA384		= 0x009D,
-
 
263
	TLS_DHE_RSA_WITH_AES_128_GCM_SHA256	= 0x009E,
-
 
264
	TLS_DHE_RSA_WITH_AES_256_GCM_SHA384	= 0x009F,
-
 
265
	TLS_DH_RSA_WITH_AES_128_GCM_SHA256	= 0x00A0,
-
 
266
	TLS_DH_RSA_WITH_AES_256_GCM_SHA384	= 0x00A1,
-
 
267
	TLS_DHE_DSS_WITH_AES_128_GCM_SHA256	= 0x00A2,
-
 
268
	TLS_DHE_DSS_WITH_AES_256_GCM_SHA384	= 0x00A3,
-
 
269
	TLS_DH_DSS_WITH_AES_128_GCM_SHA256	= 0x00A4,
-
 
270
	TLS_DH_DSS_WITH_AES_256_GCM_SHA384	= 0x00A5,
-
 
271
	TLS_DH_anon_WITH_AES_128_GCM_SHA256	= 0x00A6,
-
 
272
	TLS_DH_anon_WITH_AES_256_GCM_SHA384	= 0x00A7,
-
 
273
 
-
 
274
	TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B,
-
 
275
	TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256	= 0xC02F,
-
 
276
 
-
 
277
	TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA	= 0xC013,
-
 
278
	TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA	= 0xC014,
-
 
279
	TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256	= 0xC027,
-
 
280
	TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256	= 0xC023,
-
 
281
 
-
 
282
	TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305	= 0xCCA8,
-
 
283
	TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305	= 0xCCA9,
-
 
284
	TLS_DHE_RSA_WITH_CHACHA20_POLY1305	= 0xCCAA,
-
 
285
 
-
 
286
	GOOGLE_ECDHE_RSA_WITH_CHACHA20_POLY1305		= 0xCC13,
-
 
287
	GOOGLE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305	= 0xCC14,
-
 
288
	GOOGLE_DHE_RSA_WITH_CHACHA20_POLY1305		= 0xCC15,
-
 
289
 
-
 
290
	TLS_PSK_WITH_CHACHA20_POLY1305		= 0xCCAB,
-
 
291
	TLS_PSK_WITH_AES_128_CBC_SHA256		= 0x00AE,
-
 
292
	TLS_PSK_WITH_AES_128_CBC_SHA		= 0x008C,
-
 
293
 
232
	CipherMax
294
	TLS_FALLBACK_SCSV = 0x5600,
233
};
295
};
234
 
296
 
235
// compression methods
297
// compression methods
236
enum {
298
enum {
237
	CompressionNull = 0,
299
	CompressionNull = 0,
238
	CompressionMax
300
	CompressionMax
239
};
301
};
240
 
302
 
241
static Algs cipherAlgs[] = {
303
static Algs cipherAlgs[] = {
-
 
304
	// ECDHE-ECDSA
-
 
305
	{"ccpoly96_aead", "clear", 2*(32+12), TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305},
-
 
306
	{"ccpoly64_aead", "clear", 2*32, GOOGLE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305},
-
 
307
	{"aes_128_gcm_aead", "clear", 2*(16+4), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
-
 
308
	{"aes_128_cbc", "sha256", 2*(16+16+SHA2_256dlen), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256},
-
 
309
 
-
 
310
	// ECDHE-RSA
-
 
311
	{"ccpoly96_aead", "clear", 2*(32+12), TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305},
-
 
312
	{"ccpoly64_aead", "clear", 2*32, GOOGLE_ECDHE_RSA_WITH_CHACHA20_POLY1305},
-
 
313
	{"aes_128_gcm_aead", "clear", 2*(16+4), TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
-
 
314
	{"aes_128_cbc", "sha256", 2*(16+16+SHA2_256dlen), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256},
242
	{"rc4_128", "md5", 2*(16+MD5dlen), TLS_RSA_WITH_RC4_128_MD5},
315
	{"aes_128_cbc", "sha1", 2*(16+16+SHA1dlen), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
-
 
316
	{"aes_256_cbc", "sha1", 2*(32+16+SHA1dlen), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA},
-
 
317
 
-
 
318
	// DHE-RSA
-
 
319
	{"ccpoly96_aead", "clear", 2*(32+12), TLS_DHE_RSA_WITH_CHACHA20_POLY1305},
-
 
320
	{"ccpoly64_aead", "clear", 2*32, GOOGLE_DHE_RSA_WITH_CHACHA20_POLY1305},
-
 
321
	{"aes_128_gcm_aead", "clear", 2*(16+4), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
-
 
322
	{"aes_128_cbc", "sha256", 2*(16+16+SHA2_256dlen), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256},
243
	{"rc4_128", "sha1", 2*(16+SHA1dlen), TLS_RSA_WITH_RC4_128_SHA},
323
	{"aes_128_cbc", "sha1", 2*(16+16+SHA1dlen), TLS_DHE_RSA_WITH_AES_128_CBC_SHA},
-
 
324
	{"aes_256_cbc", "sha1", 2*(32+16+SHA1dlen), TLS_DHE_RSA_WITH_AES_256_CBC_SHA},
244
	{"3des_ede_cbc", "sha1", 2*(4*8+SHA1dlen), TLS_RSA_WITH_3DES_EDE_CBC_SHA},
325
	{"3des_ede_cbc","sha1",	2*(4*8+SHA1dlen), TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA},
-
 
326
 
-
 
327
	// RSA
-
 
328
	{"aes_128_gcm_aead", "clear", 2*(16+4), TLS_RSA_WITH_AES_128_GCM_SHA256},
-
 
329
	{"aes_128_cbc", "sha256", 2*(16+16+SHA2_256dlen), TLS_RSA_WITH_AES_128_CBC_SHA256},
-
 
330
	{"aes_256_cbc", "sha256", 2*(32+16+SHA2_256dlen), TLS_RSA_WITH_AES_256_CBC_SHA256},
245
	{"aes_128_cbc", "sha1", 2*(16+16+SHA1dlen), TLS_RSA_WITH_AES_128_CBC_SHA},
331
	{"aes_128_cbc", "sha1", 2*(16+16+SHA1dlen), TLS_RSA_WITH_AES_128_CBC_SHA},
246
	{"aes_256_cbc", "sha1", 2*(32+16+SHA1dlen), TLS_RSA_WITH_AES_256_CBC_SHA}
332
	{"aes_256_cbc", "sha1", 2*(32+16+SHA1dlen), TLS_RSA_WITH_AES_256_CBC_SHA},
-
 
333
	{"3des_ede_cbc","sha1",	2*(4*8+SHA1dlen), TLS_RSA_WITH_3DES_EDE_CBC_SHA},
-
 
334
 
-
 
335
	// PSK
-
 
336
	{"ccpoly96_aead", "clear", 2*(32+12), TLS_PSK_WITH_CHACHA20_POLY1305},
-
 
337
	{"aes_128_cbc", "sha256", 2*(16+16+SHA2_256dlen), TLS_PSK_WITH_AES_128_CBC_SHA256},
-
 
338
	{"aes_128_cbc", "sha1", 2*(16+16+SHA1dlen), TLS_PSK_WITH_AES_128_CBC_SHA},
247
};
339
};
248
 
340
 
249
static uchar compressors[] = {
341
static uchar compressors[] = {
250
	CompressionNull,
342
	CompressionNull,
251
};
343
};
252
 
344
 
-
 
345
static Namedcurve namedcurves[] = {
-
 
346
	0x0017, secp256r1,
-
 
347
	0x0018, secp384r1,
-
 
348
};
-
 
349
 
-
 
350
static uchar pointformats[] = {
253
static TlsConnection *tlsServer2(int ctl, int hand, uchar *cert, int ncert, int (*trace)(char*fmt, ...), PEMChain *chain);
351
	CompressionNull /* support of uncompressed point format is mandatory */
-
 
352
};
-
 
353
 
-
 
354
static struct {
254
static TlsConnection *tlsClient2(int ctl, int hand, uchar *csid, int ncsid, int (*trace)(char*fmt, ...));
355
	DigestState* (*fun)(uchar*, ulong, uchar*, DigestState*);
-
 
356
	int len;
-
 
357
} hashfun[] = {
-
 
358
/*	[0x00]  is reserved for MD5+SHA1 for < TLS1.2 */
-
 
359
	[0x01]	{md5,		MD5dlen},
-
 
360
	[0x02]	{sha1,		SHA1dlen},
-
 
361
	[0x03]	{sha2_224,	SHA2_224dlen},
-
 
362
	[0x04]	{sha2_256,	SHA2_256dlen},
-
 
363
	[0x05]	{sha2_384,	SHA2_384dlen},
-
 
364
	[0x06]	{sha2_512,	SHA2_512dlen},
-
 
365
};
-
 
366
 
-
 
367
// signature algorithms (only RSA and ECDSA at the moment)
-
 
368
static int sigalgs[] = {
-
 
369
	0x0603,		/* SHA512 ECDSA */
-
 
370
	0x0503,		/* SHA384 ECDSA */
-
 
371
	0x0403,		/* SHA256 ECDSA */
-
 
372
	0x0203,		/* SHA1 ECDSA */
-
 
373
 
-
 
374
	0x0601,		/* SHA512 RSA */
-
 
375
	0x0501,		/* SHA384 RSA */
-
 
376
	0x0401,		/* SHA256 RSA */
-
 
377
	0x0201,		/* SHA1 RSA */
-
 
378
};
255
 
379
 
-
 
380
static TlsConnection *tlsServer2(int ctl, int hand,
-
 
381
	uchar *cert, int certlen,
-
 
382
	char *pskid, uchar *psk, int psklen,
-
 
383
	int (*trace)(char*fmt, ...), PEMChain *chain);
-
 
384
static TlsConnection *tlsClient2(int ctl, int hand,
-
 
385
	uchar *cert, int certlen,
-
 
386
	char *pskid, uchar *psk, int psklen,
-
 
387
	uchar *ext, int extlen, int (*trace)(char*fmt, ...));
256
static void	msgClear(Msg *m);
388
static void	msgClear(Msg *m);
257
static char* msgPrint(char *buf, int n, Msg *m);
389
static char* msgPrint(char *buf, int n, Msg *m);
258
static int	msgRecv(TlsConnection *c, Msg *m);
390
static int	msgRecv(TlsConnection *c, Msg *m);
259
static int	msgSend(TlsConnection *c, Msg *m, int act);
391
static int	msgSend(TlsConnection *c, Msg *m, int act);
260
static void	tlsError(TlsConnection *c, int err, char *msg, ...);
392
static void	tlsError(TlsConnection *c, int err, char *msg, ...);
261
#pragma	varargck argpos	tlsError 3
393
#pragma	varargck argpos	tlsError 3
262
static int setVersion(TlsConnection *c, int version);
394
static int setVersion(TlsConnection *c, int version);
-
 
395
static int setSecrets(TlsConnection *c, int isclient);
263
static int finishedMatch(TlsConnection *c, Finished *f);
396
static int finishedMatch(TlsConnection *c, Finished *f);
264
static void tlsConnectionFree(TlsConnection *c);
397
static void tlsConnectionFree(TlsConnection *c);
-
 
398
 
-
 
399
static int isDHE(int tlsid);
-
 
400
static int isECDHE(int tlsid);
-
 
401
static int isPSK(int tlsid);
-
 
402
static int isECDSA(int tlsid);
265
 
403
 
266
static int setAlgs(TlsConnection *c, int a);
404
static int setAlgs(TlsConnection *c, int a);
267
static int okCipher(Ints *cv);
405
static int okCipher(Ints *cv, int ispsk);
268
static int okCompression(Bytes *cv);
406
static int okCompression(Bytes *cv);
269
static int initCiphers(void);
407
static int initCiphers(void);
270
static Ints* makeciphers(void);
408
static Ints* makeciphers(int ispsk);
271
 
409
 
272
static TlsSec* tlsSecInits(int cvers, uchar *csid, int ncsid, uchar *crandom, uchar *ssid, int *nssid, uchar *srandom);
410
static AuthRpc* factotum_rsa_open(RSApub *rsapub);
273
static int	tlsSecSecrets(TlsSec *sec, int vers, uchar *epm, int nepm, uchar *kd, int nkd);
411
static mpint* factotum_rsa_decrypt(AuthRpc *rpc, mpint *cipher);
-
 
412
static void factotum_rsa_close(AuthRpc *rpc);
-
 
413
 
274
static TlsSec*	tlsSecInitc(int cvers, uchar *crandom);
414
static void	tlsSecInits(TlsSec *sec, int cvers, uchar *crandom);
275
static int	tlsSecSecretc(TlsSec *sec, uchar *sid, int nsid, uchar *srandom, uchar *cert, int ncert, int vers, uchar **epm, int *nepm, uchar *kd, int nkd);
415
static int	tlsSecRSAs(TlsSec *sec, Bytes *epm);
276
static int	tlsSecFinished(TlsSec *sec, MD5state md5, SHAstate sha1, uchar *fin, int nfin, int isclient);
416
static Bytes*	tlsSecECDHEs1(TlsSec *sec, Namedcurve *nc);
277
static void	tlsSecOk(TlsSec *sec);
417
static int	tlsSecECDHEs2(TlsSec *sec, Bytes *Yc);
278
static void	tlsSecKill(TlsSec *sec);
418
static void	tlsSecInitc(TlsSec *sec, int cvers);
-
 
419
static Bytes*	tlsSecRSAc(TlsSec *sec, uchar *cert, int ncert);
-
 
420
static Bytes*	tlsSecDHEc(TlsSec *sec, Bytes *p, Bytes *g, Bytes *Ys);
-
 
421
static Bytes*	tlsSecECDHEc(TlsSec *sec, int curve, Bytes *Ys);
279
static void	tlsSecClose(TlsSec *sec);
422
static void	tlsSecVers(TlsSec *sec, int v);
-
 
423
static int	tlsSecFinished(TlsSec *sec, HandshakeHash hsh, uchar *fin, int nfin, int isclient);
280
static void	setMasterSecret(TlsSec *sec, Bytes *pm);
424
static void	setMasterSecret(TlsSec *sec, Bytes *pm);
281
static void	serverMasterSecret(TlsSec *sec, uchar *epm, int nepm);
-
 
282
static void	setSecrets(TlsSec *sec, uchar *kd, int nkd);
-
 
283
static int	clientMasterSecret(TlsSec *sec, RSApub *pub, uchar **epm, int *nepm);
425
static int	digestDHparams(TlsSec *sec, Bytes *par, uchar digest[MAXdlen], int sigalg);
284
static Bytes *pkcs1_encrypt(Bytes* data, RSApub* key, int blocktype);
-
 
285
static Bytes *pkcs1_decrypt(TlsSec *sec, uchar *epm, int nepm);
-
 
286
static void	tlsSetFinished(TlsSec *sec, MD5state hsmd5, SHAstate hssha1, uchar *finished, int isClient);
-
 
287
static void	sslSetFinished(TlsSec *sec, MD5state hsmd5, SHAstate hssha1, uchar *finished, int isClient);
426
static char*	verifyDHparams(TlsSec *sec, Bytes *par, Bytes *cert, Bytes *sig, int sigalg);
288
static void	sslPRF(uchar *buf, int nbuf, uchar *key, int nkey, char *label,
-
 
289
			uchar *seed0, int nseed0, uchar *seed1, int nseed1);
-
 
290
static int setVers(TlsSec *sec, int version);
-
 
291
 
427
 
292
static AuthRpc* factotum_rsa_open(uchar *cert, int certlen);
428
static Bytes*	pkcs1_encrypt(Bytes* data, RSApub* key);
293
static mpint* factotum_rsa_decrypt(AuthRpc *rpc, mpint *cipher);
429
static Bytes*	pkcs1_decrypt(TlsSec *sec, Bytes *data);
294
static void factotum_rsa_close(AuthRpc*rpc);
430
static Bytes*	pkcs1_sign(TlsSec *sec, uchar *digest, int digestlen, int sigalg);
295
 
431
 
296
static void* emalloc(int);
432
static void* emalloc(int);
297
static void* erealloc(void*, int);
433
static void* erealloc(void*, int);
298
static void put32(uchar *p, u32int);
434
static void put32(uchar *p, u32int);
299
static void put24(uchar *p, int);
435
static void put24(uchar *p, int);
300
static void put16(uchar *p, int);
436
static void put16(uchar *p, int);
301
static u32int get32(uchar *p);
-
 
302
static int get24(uchar *p);
437
static int get24(uchar *p);
303
static int get16(uchar *p);
438
static int get16(uchar *p);
304
static Bytes* newbytes(int len);
439
static Bytes* newbytes(int len);
305
static Bytes* makebytes(uchar* buf, int len);
440
static Bytes* makebytes(uchar* buf, int len);
-
 
441
static Bytes* mptobytes(mpint* big, int len);
-
 
442
static mpint* bytestomp(Bytes* bytes);
306
static void freebytes(Bytes* b);
443
static void freebytes(Bytes* b);
307
static Ints* newints(int len);
444
static Ints* newints(int len);
308
static Ints* makeints(int* buf, int len);
-
 
309
static void freeints(Ints* b);
445
static void freeints(Ints* b);
-
 
446
static int lookupid(Ints* b, int id);
310
 
447
 
311
//================= client/server ========================
448
//================= client/server ========================
312
 
449
 
313
//	push TLS onto fd, returning new (application) file descriptor
450
//	push TLS onto fd, returning new (application) file descriptor
314
//		or -1 if error.
451
//		or -1 if error.
Line 329... Line 466...
329
	if(n < 0){
466
	if(n < 0){
330
		close(ctl);
467
		close(ctl);
331
		return -1;
468
		return -1;
332
	}
469
	}
333
	buf[n] = 0;
470
	buf[n] = 0;
334
	sprint(conn->dir, "#a/tls/%s", buf);
471
	snprint(conn->dir, sizeof(conn->dir), "#a/tls/%s", buf);
335
	sprint(dname, "#a/tls/%s/hand", buf);
472
	snprint(dname, sizeof(dname), "#a/tls/%s/hand", buf);
336
	hand = open(dname, ORDWR);
473
	hand = open(dname, ORDWR);
337
	if(hand < 0){
474
	if(hand < 0){
338
		close(ctl);
475
		close(ctl);
339
		return -1;
476
		return -1;
340
	}
477
	}
-
 
478
	data = -1;
341
	fprint(ctl, "fd %d 0x%x", fd, ProtocolVersion);
479
	fprint(ctl, "fd %d 0x%x", fd, ProtocolVersion);
-
 
480
	tls = tlsServer2(ctl, hand,
-
 
481
		conn->cert, conn->certlen,
342
	tls = tlsServer2(ctl, hand, conn->cert, conn->certlen, conn->trace, conn->chain);
482
		conn->pskID, conn->psk, conn->psklen,
-
 
483
		conn->trace, conn->chain);
-
 
484
	if(tls != nil){
343
	sprint(dname, "#a/tls/%s/data", buf);
485
		snprint(dname, sizeof(dname), "#a/tls/%s/data", buf);
344
	data = open(dname, ORDWR);
486
		data = open(dname, ORDWR);
345
	close(fd);
487
	}
346
	close(hand);
488
	close(hand);
347
	close(ctl);
489
	close(ctl);
348
	if(data < 0){
490
	if(data < 0){
-
 
491
		tlsConnectionFree(tls);
349
		return -1;
492
		return -1;
350
	}
493
	}
351
	if(tls == nil){
-
 
352
		close(data);
-
 
353
		return -1;
-
 
354
	}
-
 
355
	if(conn->cert)
-
 
356
		free(conn->cert);
494
	free(conn->cert);
357
	conn->cert = 0;  // client certificates are not yet implemented
495
	conn->cert = nil;  // client certificates are not yet implemented
358
	conn->certlen = 0;
496
	conn->certlen = 0;
359
	conn->sessionIDlen = tls->sid->len;
497
	conn->sessionIDlen = 0;
360
	conn->sessionID = emalloc(conn->sessionIDlen);
498
	conn->sessionID = nil;
361
	memcpy(conn->sessionID, tls->sid->data, conn->sessionIDlen);
499
	if(conn->sessionKey != nil
-
 
500
	&& conn->sessionType != nil
362
	if(conn->sessionKey != nil && conn->sessionType != nil && strcmp(conn->sessionType, "ttls") == 0)
501
	&& strcmp(conn->sessionType, "ttls") == 0)
-
 
502
		tls->sec->prf(
363
		tls->sec->prf(conn->sessionKey, conn->sessionKeylen, tls->sec->sec, MasterSecretSize, conn->sessionConst,  tls->sec->crandom, RandomSize, tls->sec->srandom, RandomSize);
503
			conn->sessionKey, conn->sessionKeylen,
-
 
504
			tls->sec->sec, MasterSecretSize,
-
 
505
			conn->sessionConst, 
-
 
506
			tls->sec->crandom, RandomSize,
-
 
507
			tls->sec->srandom, RandomSize);
364
	tlsConnectionFree(tls);
508
	tlsConnectionFree(tls);
-
 
509
	close(fd);
365
	return data;
510
	return data;
-
 
511
}
-
 
512
 
-
 
513
static uchar*
-
 
514
tlsClientExtensions(TLSconn *conn, int *plen)
-
 
515
{
-
 
516
	uchar *b, *p;
-
 
517
	int i, n, m;
-
 
518
 
-
 
519
	p = b = nil;
-
 
520
 
-
 
521
	// RFC6066 - Server Name Identification
-
 
522
	if(conn->serverName != nil){
-
 
523
		n = strlen(conn->serverName);
-
 
524
 
-
 
525
		m = p - b;
-
 
526
		b = erealloc(b, m + 2+2+2+1+2+n);
-
 
527
		p = b + m;
-
 
528
 
-
 
529
		put16(p, 0), p += 2;		/* Type: server_name */
-
 
530
		put16(p, 2+1+2+n), p += 2;	/* Length */
-
 
531
		put16(p, 1+2+n), p += 2;	/* Server Name list length */
-
 
532
		*p++ = 0;			/* Server Name Type: host_name */
-
 
533
		put16(p, n), p += 2;		/* Server Name length */
-
 
534
		memmove(p, conn->serverName, n);
-
 
535
		p += n;
-
 
536
	}
-
 
537
 
-
 
538
	// ECDHE
-
 
539
	if(ProtocolVersion >= TLS10Version){
-
 
540
		m = p - b;
-
 
541
		b = erealloc(b, m + 2+2+2+nelem(namedcurves)*2 + 2+2+1+nelem(pointformats));
-
 
542
		p = b + m;
-
 
543
 
-
 
544
		n = nelem(namedcurves);
-
 
545
		put16(p, 0x000a), p += 2;	/* Type: elliptic_curves */
-
 
546
		put16(p, (n+1)*2), p += 2;	/* Length */
-
 
547
		put16(p, n*2), p += 2;		/* Elliptic Curves Length */
-
 
548
		for(i=0; i < n; i++){		/* Elliptic curves */
-
 
549
			put16(p, namedcurves[i].tlsid);
-
 
550
			p += 2;
-
 
551
		}
-
 
552
 
-
 
553
		n = nelem(pointformats);
-
 
554
		put16(p, 0x000b), p += 2;	/* Type: ec_point_formats */
-
 
555
		put16(p, n+1), p += 2;		/* Length */
-
 
556
		*p++ = n;			/* EC point formats Length */
-
 
557
		for(i=0; i < n; i++)		/* Elliptic curves point formats */
-
 
558
			*p++ = pointformats[i];
-
 
559
	}
-
 
560
 
-
 
561
	// signature algorithms
-
 
562
	if(ProtocolVersion >= TLS12Version){
-
 
563
		n = nelem(sigalgs);
-
 
564
 
-
 
565
		m = p - b;
-
 
566
		b = erealloc(b, m + 2+2+2+n*2);
-
 
567
		p = b + m;
-
 
568
 
-
 
569
		put16(p, 0x000d), p += 2;
-
 
570
		put16(p, n*2 + 2), p += 2;
-
 
571
		put16(p, n*2), p += 2;
-
 
572
		for(i=0; i < n; i++){
-
 
573
			put16(p, sigalgs[i]);
-
 
574
			p += 2;
-
 
575
		}
-
 
576
	}
-
 
577
	
-
 
578
	*plen = p - b;
-
 
579
	return b;
366
}
580
}
367
 
581
 
368
//	push TLS onto fd, returning new (application) file descriptor
582
//	push TLS onto fd, returning new (application) file descriptor
369
//		or -1 if error.
583
//		or -1 if error.
370
int
584
int
Line 372... Line 586...
372
{
586
{
373
	char buf[8];
587
	char buf[8];
374
	char dname[64];
588
	char dname[64];
375
	int n, data, ctl, hand;
589
	int n, data, ctl, hand;
376
	TlsConnection *tls;
590
	TlsConnection *tls;
-
 
591
	uchar *ext;
377
 
592
 
378
	if(!conn)
593
	if(conn == nil)
379
		return -1;
594
		return -1;
380
	ctl = open("#a/tls/clone", ORDWR);
595
	ctl = open("#a/tls/clone", ORDWR);
381
	if(ctl < 0)
596
	if(ctl < 0)
382
		return -1;
597
		return -1;
383
	n = read(ctl, buf, sizeof(buf)-1);
598
	n = read(ctl, buf, sizeof(buf)-1);
384
	if(n < 0){
599
	if(n < 0){
385
		close(ctl);
600
		close(ctl);
386
		return -1;
601
		return -1;
387
	}
602
	}
388
	buf[n] = 0;
603
	buf[n] = 0;
389
	sprint(conn->dir, "#a/tls/%s", buf);
604
	snprint(conn->dir, sizeof(conn->dir), "#a/tls/%s", buf);
390
	sprint(dname, "#a/tls/%s/hand", buf);
605
	snprint(dname, sizeof(dname), "#a/tls/%s/hand", buf);
391
	hand = open(dname, ORDWR);
606
	hand = open(dname, ORDWR);
392
	if(hand < 0){
607
	if(hand < 0){
393
		close(ctl);
608
		close(ctl);
394
		return -1;
609
		return -1;
395
	}
610
	}
396
	sprint(dname, "#a/tls/%s/data", buf);
611
	snprint(dname, sizeof(dname), "#a/tls/%s/data", buf);
397
	data = open(dname, ORDWR);
612
	data = open(dname, ORDWR);
398
	if(data < 0)
613
	if(data < 0){
-
 
614
		close(hand);
-
 
615
		close(ctl);
399
		return -1;
616
		return -1;
-
 
617
	}
400
	fprint(ctl, "fd %d 0x%x", fd, ProtocolVersion);
618
	fprint(ctl, "fd %d 0x%x", fd, ProtocolVersion);
-
 
619
	ext = tlsClientExtensions(conn, &n);
-
 
620
	tls = tlsClient2(ctl, hand,
-
 
621
		conn->cert, conn->certlen, 
401
	tls = tlsClient2(ctl, hand, conn->sessionID, conn->sessionIDlen, conn->trace);
622
		conn->pskID, conn->psk, conn->psklen,
-
 
623
		ext, n, conn->trace);
402
	close(fd);
624
	free(ext);
403
	close(hand);
625
	close(hand);
404
	close(ctl);
626
	close(ctl);
405
	if(tls == nil){
627
	if(tls == nil){
406
		close(data);
628
		close(data);
407
		return -1;
629
		return -1;
408
	}
630
	}
-
 
631
	free(conn->cert);
-
 
632
	if(tls->cert != nil){
409
	conn->certlen = tls->cert->len;
633
		conn->certlen = tls->cert->len;
410
	conn->cert = emalloc(conn->certlen);
634
		conn->cert = emalloc(conn->certlen);
411
	memcpy(conn->cert, tls->cert->data, conn->certlen);
635
		memcpy(conn->cert, tls->cert->data, conn->certlen);
-
 
636
	} else {
-
 
637
		conn->certlen = 0;
-
 
638
		conn->cert = nil;
-
 
639
	}
412
	conn->sessionIDlen = tls->sid->len;
640
	conn->sessionIDlen = 0;
413
	conn->sessionID = emalloc(conn->sessionIDlen);
641
	conn->sessionID = nil;
414
	memcpy(conn->sessionID, tls->sid->data, conn->sessionIDlen);
642
	if(conn->sessionKey != nil
-
 
643
	&& conn->sessionType != nil
415
	if(conn->sessionKey != nil && conn->sessionType != nil && strcmp(conn->sessionType, "ttls") == 0)
644
	&& strcmp(conn->sessionType, "ttls") == 0)
-
 
645
		tls->sec->prf(
416
		tls->sec->prf(conn->sessionKey, conn->sessionKeylen, tls->sec->sec, MasterSecretSize, conn->sessionConst,  tls->sec->crandom, RandomSize, tls->sec->srandom, RandomSize);
646
			conn->sessionKey, conn->sessionKeylen,
-
 
647
			tls->sec->sec, MasterSecretSize,
-
 
648
			conn->sessionConst, 
-
 
649
			tls->sec->crandom, RandomSize,
-
 
650
			tls->sec->srandom, RandomSize);
417
	tlsConnectionFree(tls);
651
	tlsConnectionFree(tls);
-
 
652
	close(fd);
418
	return data;
653
	return data;
419
}
654
}
420
 
655
 
421
static int
656
static int
422
countchain(PEMChain *p)
657
countchain(PEMChain *p)
423
{
658
{
424
	int i = 0;
659
	int i = 0;
425
 
660
 
Line 427... Line 662...
427
		i++;
662
		i++;
428
		p = p->next;
663
		p = p->next;
429
	}
664
	}
430
	return i;
665
	return i;
431
}
666
}
432
 
667
 
433
static TlsConnection *
668
static TlsConnection *
-
 
669
tlsServer2(int ctl, int hand,
-
 
670
	uchar *cert, int certlen,
-
 
671
	char *pskid, uchar *psk, int psklen,
434
tlsServer2(int ctl, int hand, uchar *cert, int ncert, int (*trace)(char*fmt, ...), PEMChain *chp)
672
	int (*trace)(char*fmt, ...), PEMChain *chp)
435
{
673
{
-
 
674
	int cipher, compressor, numcerts, i;
436
	TlsConnection *c;
675
	TlsConnection *c;
437
	Msg m;
676
	Msg m;
438
	Bytes *csid;
-
 
439
	uchar sid[SidSize], kd[MaxKeyData];
-
 
440
	char *secrets;
-
 
441
	int cipher, compressor, nsid, rv, numcerts, i;
-
 
442
 
677
 
443
	if(trace)
678
	if(trace)
444
		trace("tlsServer2\n");
679
		trace("tlsServer2\n");
445
	if(!initCiphers())
680
	if(!initCiphers())
446
		return nil;
681
		return nil;
-
 
682
 
447
	c = emalloc(sizeof(TlsConnection));
683
	c = emalloc(sizeof(TlsConnection));
448
	c->ctl = ctl;
684
	c->ctl = ctl;
449
	c->hand = hand;
685
	c->hand = hand;
450
	c->trace = trace;
686
	c->trace = trace;
451
	c->version = ProtocolVersion;
687
	c->version = ProtocolVersion;
-
 
688
	c->sendp = c->buf;
452
 
689
 
453
	memset(&m, 0, sizeof(m));
690
	memset(&m, 0, sizeof(m));
454
	if(!msgRecv(c, &m)){
691
	if(!msgRecv(c, &m)){
455
		if(trace)
692
		if(trace)
456
			trace("initial msgRecv failed\n");
693
			trace("initial msgRecv failed\n");
457
		goto Err;
694
		goto Err;
458
	}
695
	}
459
	if(m.tag != HClientHello) {
696
	if(m.tag != HClientHello) {
460
		tlsError(c, EUnexpectedMessage, "expected a client hello");
697
		tlsError(c, EUnexpectedMessage, "expected a client hello");
461
		goto Err;
698
		goto Err;
462
	}
699
	}
463
	c->clientVersion = m.u.clientHello.version;
-
 
464
	if(trace)
700
	if(trace)
465
		trace("ClientHello version %x\n", c->clientVersion);
701
		trace("ClientHello version %x\n", m.u.clientHello.version);
466
	if(setVersion(c, m.u.clientHello.version) < 0) {
702
	if(setVersion(c, m.u.clientHello.version) < 0) {
467
		tlsError(c, EIllegalParameter, "incompatible version");
703
		tlsError(c, EIllegalParameter, "incompatible version");
468
		goto Err;
704
		goto Err;
469
	}
705
	}
470
 
-
 
471
	memmove(c->crandom, m.u.clientHello.random, RandomSize);
706
	if(c->version < ProtocolVersion
472
	cipher = okCipher(m.u.clientHello.ciphers);
707
	&& lookupid(m.u.clientHello.ciphers, TLS_FALLBACK_SCSV) >= 0){
473
	if(cipher < 0) {
-
 
474
		// reply with EInsufficientSecurity if we know that's the case
-
 
475
		if(cipher == -2)
-
 
476
			tlsError(c, EInsufficientSecurity, "cipher suites too weak");
708
		tlsError(c, EInappropriateFallback, "inappropriate fallback");
477
		else
-
 
478
			tlsError(c, EHandshakeFailure, "no matching cipher suite");
-
 
479
		goto Err;
709
		goto Err;
480
	}
710
	}
-
 
711
	cipher = okCipher(m.u.clientHello.ciphers, psklen > 0);
481
	if(!setAlgs(c, cipher)){
712
	if(cipher < 0 || !setAlgs(c, cipher)) {
482
		tlsError(c, EHandshakeFailure, "no matching cipher suite");
713
		tlsError(c, EHandshakeFailure, "no matching cipher suite");
483
		goto Err;
714
		goto Err;
484
	}
715
	}
485
	compressor = okCompression(m.u.clientHello.compressors);
716
	compressor = okCompression(m.u.clientHello.compressors);
486
	if(compressor < 0) {
717
	if(compressor < 0) {
487
		tlsError(c, EHandshakeFailure, "no matching compressor");
718
		tlsError(c, EHandshakeFailure, "no matching compressor");
488
		goto Err;
719
		goto Err;
489
	}
720
	}
-
 
721
	if(trace)
-
 
722
		trace("  cipher %x, compressor %x\n", cipher, compressor);
490
 
723
 
-
 
724
	tlsSecInits(c->sec, m.u.clientHello.version, m.u.clientHello.random);
491
	csid = m.u.clientHello.sid;
725
	tlsSecVers(c->sec, c->version);
492
	if(trace)
726
	if(psklen > 0){
-
 
727
		c->sec->psk = psk;
493
		trace("  cipher %d, compressor %d, csidlen %d\n", cipher, compressor, csid->len);
728
		c->sec->psklen = psklen;
-
 
729
	}
-
 
730
	if(certlen > 0){
-
 
731
		/* server certificate */
494
	c->sec = tlsSecInits(c->clientVersion, csid->data, csid->len, c->crandom, sid, &nsid, c->srandom);
732
		c->sec->rsapub = X509toRSApub(cert, certlen, nil, 0);
495
	if(c->sec == nil){
733
		if(c->sec->rsapub == nil){
496
		tlsError(c, EHandshakeFailure, "can't initialize security: %r");
734
			tlsError(c, EHandshakeFailure, "invalid X509/rsa certificate");
497
		goto Err;
735
			goto Err;
498
	}
736
		}
499
	c->sec->rpc = factotum_rsa_open(cert, ncert);
737
		c->sec->rpc = factotum_rsa_open(c->sec->rsapub);
500
	if(c->sec->rpc == nil){
738
		if(c->sec->rpc == nil){
501
		tlsError(c, EHandshakeFailure, "factotum_rsa_open: %r");
739
			tlsError(c, EHandshakeFailure, "factotum_rsa_open: %r");
502
		goto Err;
740
			goto Err;
-
 
741
		}
503
	}
742
	}
504
	c->sec->rsapub = X509toRSApub(cert, ncert, nil, 0);
-
 
505
	msgClear(&m);
743
	msgClear(&m);
506
 
744
 
507
	m.tag = HServerHello;
745
	m.tag = HServerHello;
508
	m.u.serverHello.version = c->version;
746
	m.u.serverHello.version = c->version;
509
	memmove(m.u.serverHello.random, c->srandom, RandomSize);
747
	memmove(m.u.serverHello.random, c->sec->srandom, RandomSize);
510
	m.u.serverHello.cipher = cipher;
748
	m.u.serverHello.cipher = cipher;
511
	m.u.serverHello.compressor = compressor;
749
	m.u.serverHello.compressor = compressor;
512
	c->sid = makebytes(sid, nsid);
-
 
513
	m.u.serverHello.sid = makebytes(c->sid->data, c->sid->len);
750
	m.u.serverHello.sid = makebytes(nil, 0);
514
	if(!msgSend(c, &m, AQueue))
751
	if(!msgSend(c, &m, AQueue))
515
		goto Err;
752
		goto Err;
516
	msgClear(&m);
-
 
517
 
753
 
-
 
754
	if(certlen > 0){
518
	m.tag = HCertificate;
755
		m.tag = HCertificate;
519
	numcerts = countchain(chp);
756
		numcerts = countchain(chp);
520
	m.u.certificate.ncert = 1 + numcerts;
757
		m.u.certificate.ncert = 1 + numcerts;
521
	m.u.certificate.certs = emalloc(m.u.certificate.ncert * sizeof(Bytes));
758
		m.u.certificate.certs = emalloc(m.u.certificate.ncert * sizeof(Bytes*));
522
	m.u.certificate.certs[0] = makebytes(cert, ncert);
759
		m.u.certificate.certs[0] = makebytes(cert, certlen);
523
	for (i = 0; i < numcerts && chp; i++, chp = chp->next)
760
		for (i = 0; i < numcerts && chp; i++, chp = chp->next)
524
		m.u.certificate.certs[i+1] = makebytes(chp->pem, chp->pemlen);
761
			m.u.certificate.certs[i+1] = makebytes(chp->pem, chp->pemlen);
525
	if(!msgSend(c, &m, AQueue))
762
		if(!msgSend(c, &m, AQueue))
-
 
763
			goto Err;
-
 
764
	}
-
 
765
 
-
 
766
	if(isECDHE(cipher)){
-
 
767
		Namedcurve *nc = &namedcurves[0];	/* secp256r1 */
-
 
768
 
-
 
769
		m.tag = HServerKeyExchange;
-
 
770
		m.u.serverKeyExchange.curve = nc->tlsid;
-
 
771
		m.u.serverKeyExchange.dh_parameters = tlsSecECDHEs1(c->sec, nc);
-
 
772
		if(m.u.serverKeyExchange.dh_parameters == nil){
-
 
773
			tlsError(c, EInternalError, "can't set DH parameters");
526
		goto Err;
774
			goto Err;
-
 
775
		}
-
 
776
 
-
 
777
		/* sign the DH parameters */
-
 
778
		if(certlen > 0){
-
 
779
			uchar digest[MAXdlen];
-
 
780
			int digestlen;
-
 
781
 
-
 
782
			if(c->version >= TLS12Version)
-
 
783
				m.u.serverKeyExchange.sigalg = 0x0401;	/* RSA SHA256 */
-
 
784
			digestlen = digestDHparams(c->sec, m.u.serverKeyExchange.dh_parameters,
-
 
785
				digest, m.u.serverKeyExchange.sigalg);
-
 
786
			if((m.u.serverKeyExchange.dh_signature = pkcs1_sign(c->sec, digest, digestlen,
-
 
787
				m.u.serverKeyExchange.sigalg)) == nil){
-
 
788
				tlsError(c, EHandshakeFailure, "pkcs1_sign: %r");
-
 
789
				goto Err;
-
 
790
			}
-
 
791
		}
-
 
792
		if(!msgSend(c, &m, AQueue))
527
	msgClear(&m);
793
			goto Err;
-
 
794
	}
528
 
795
 
529
	m.tag = HServerHelloDone;
796
	m.tag = HServerHelloDone;
530
	if(!msgSend(c, &m, AFlush))
797
	if(!msgSend(c, &m, AFlush))
531
		goto Err;
798
		goto Err;
532
	msgClear(&m);
-
 
533
 
799
 
534
	if(!msgRecv(c, &m))
800
	if(!msgRecv(c, &m))
535
		goto Err;
801
		goto Err;
536
	if(m.tag != HClientKeyExchange) {
802
	if(m.tag != HClientKeyExchange) {
537
		tlsError(c, EUnexpectedMessage, "expected a client key exchange");
803
		tlsError(c, EUnexpectedMessage, "expected a client key exchange");
538
		goto Err;
804
		goto Err;
539
	}
805
	}
-
 
806
	if(pskid != nil){
-
 
807
		if(m.u.clientKeyExchange.pskid == nil
-
 
808
		|| m.u.clientKeyExchange.pskid->len != strlen(pskid)
540
	if(tlsSecSecrets(c->sec, c->version, m.u.clientKeyExchange.key->data, m.u.clientKeyExchange.key->len, kd, c->nsecret) < 0){
809
		|| memcmp(pskid, m.u.clientKeyExchange.pskid->data, m.u.clientKeyExchange.pskid->len) != 0){
-
 
810
			tlsError(c, EUnknownPSKidentity, "unknown or missing pskid");
-
 
811
			goto Err;
-
 
812
		}
-
 
813
	}
-
 
814
	if(isECDHE(cipher)){
-
 
815
		if(tlsSecECDHEs2(c->sec, m.u.clientKeyExchange.key) < 0){
-
 
816
			tlsError(c, EHandshakeFailure, "couldn't set keys: %r");
-
 
817
			goto Err;
-
 
818
		}
-
 
819
	} else if(certlen > 0){
-
 
820
		if(tlsSecRSAs(c->sec, m.u.clientKeyExchange.key) < 0){
541
		tlsError(c, EHandshakeFailure, "couldn't set secrets: %r");
821
			tlsError(c, EHandshakeFailure, "couldn't set keys: %r");
-
 
822
			goto Err;
-
 
823
		}
-
 
824
	} else if(psklen > 0){
-
 
825
		setMasterSecret(c->sec, newbytes(psklen));
-
 
826
	} else {
-
 
827
		tlsError(c, EInternalError, "no psk or certificate");
542
		goto Err;
828
		goto Err;
543
	}
829
	}
-
 
830
 
544
	if(trace)
831
	if(trace)
545
		trace("tls secrets\n");
832
		trace("tls secrets\n");
546
	secrets = (char*)emalloc(2*c->nsecret);
-
 
547
	enc64(secrets, 2*c->nsecret, kd, c->nsecret);
-
 
548
	rv = fprint(c->ctl, "secret %s %s 0 %s", c->digest, c->enc, secrets);
-
 
549
	memset(secrets, 0, 2*c->nsecret);
833
	if(setSecrets(c, 0) < 0){
550
	free(secrets);
-
 
551
	memset(kd, 0, c->nsecret);
-
 
552
	if(rv < 0){
-
 
553
		tlsError(c, EHandshakeFailure, "can't set keys: %r");
834
		tlsError(c, EHandshakeFailure, "can't set secrets: %r");
554
		goto Err;
835
		goto Err;
555
	}
836
	}
556
	msgClear(&m);
-
 
557
 
837
 
558
	/* no CertificateVerify; skip to Finished */
838
	/* no CertificateVerify; skip to Finished */
559
	if(tlsSecFinished(c->sec, c->hsmd5, c->hssha1, c->finished.verify, c->finished.n, 1) < 0){
839
	if(tlsSecFinished(c->sec, c->handhash, c->finished.verify, c->finished.n, 1) < 0){
560
		tlsError(c, EInternalError, "can't set finished: %r");
840
		tlsError(c, EInternalError, "can't set finished: %r");
561
		goto Err;
841
		goto Err;
562
	}
842
	}
563
	if(!msgRecv(c, &m))
843
	if(!msgRecv(c, &m))
564
		goto Err;
844
		goto Err;
565
	if(m.tag != HFinished) {
845
	if(m.tag != HFinished) {
566
		tlsError(c, EUnexpectedMessage, "expected a finished");
846
		tlsError(c, EUnexpectedMessage, "expected a finished");
567
		goto Err;
847
		goto Err;
568
	}
848
	}
569
	if(!finishedMatch(c, &m.u.finished)) {
849
	if(!finishedMatch(c, &m.u.finished)) {
570
		tlsError(c, EHandshakeFailure, "finished verification failed");
850
		tlsError(c, EHandshakeFailure, "finished verification failed");
571
		goto Err;
851
		goto Err;
572
	}
852
	}
573
	msgClear(&m);
853
	msgClear(&m);
574
 
854
 
575
	/* change cipher spec */
855
	/* change cipher spec */
576
	if(fprint(c->ctl, "changecipher") < 0){
856
	if(fprint(c->ctl, "changecipher") < 0){
577
		tlsError(c, EInternalError, "can't enable cipher: %r");
857
		tlsError(c, EInternalError, "can't enable cipher: %r");
578
		goto Err;
858
		goto Err;
579
	}
859
	}
580
 
860
 
581
	if(tlsSecFinished(c->sec, c->hsmd5, c->hssha1, c->finished.verify, c->finished.n, 0) < 0){
861
	if(tlsSecFinished(c->sec, c->handhash, c->finished.verify, c->finished.n, 0) < 0){
582
		tlsError(c, EInternalError, "can't set finished: %r");
862
		tlsError(c, EInternalError, "can't set finished: %r");
583
		goto Err;
863
		goto Err;
584
	}
864
	}
585
	m.tag = HFinished;
865
	m.tag = HFinished;
586
	m.u.finished = c->finished;
866
	m.u.finished = c->finished;
587
	if(!msgSend(c, &m, AFlush))
867
	if(!msgSend(c, &m, AFlush))
588
		goto Err;
868
		goto Err;
589
	msgClear(&m);
-
 
590
	if(trace)
869
	if(trace)
591
		trace("tls finished\n");
870
		trace("tls finished\n");
592
 
871
 
593
	if(fprint(c->ctl, "opened") < 0)
872
	if(fprint(c->ctl, "opened") < 0)
594
		goto Err;
873
		goto Err;
595
	tlsSecOk(c->sec);
-
 
596
	return c;
874
	return c;
597
 
875
 
598
Err:
876
Err:
599
	msgClear(&m);
877
	msgClear(&m);
600
	tlsConnectionFree(c);
878
	tlsConnectionFree(c);
-
 
879
	return nil;
-
 
880
}
-
 
881
 
-
 
882
static Bytes*
-
 
883
tlsSecDHEc(TlsSec *sec, Bytes *p, Bytes *g, Bytes *Ys)
-
 
884
{
-
 
885
	DHstate *dh = &sec->dh;
-
 
886
	mpint *G, *P, *Y, *K;
-
 
887
	Bytes *Yc;
-
 
888
	int n;
-
 
889
 
-
 
890
	if(p == nil || g == nil || Ys == nil)
-
 
891
		return nil;
-
 
892
 
-
 
893
	Yc = nil;
-
 
894
	P = bytestomp(p);
-
 
895
	G = bytestomp(g);
-
 
896
	Y = bytestomp(Ys);
-
 
897
	K = nil;
-
 
898
 
-
 
899
	if(dh_new(dh, P, nil, G) == nil)
-
 
900
		goto Out;
-
 
901
	n = (mpsignif(P)+7)/8;
-
 
902
	Yc = mptobytes(dh->y, n);
-
 
903
	K = dh_finish(dh, Y);	/* zeros dh */
-
 
904
	if(K == nil){
-
 
905
		freebytes(Yc);
-
 
906
		Yc = nil;
-
 
907
		goto Out;
-
 
908
	}
-
 
909
	setMasterSecret(sec, mptobytes(K, n));
-
 
910
 
-
 
911
Out:
-
 
912
	mpfree(K);
-
 
913
	mpfree(Y);
-
 
914
	mpfree(G);
-
 
915
	mpfree(P);
-
 
916
 
-
 
917
	return Yc;
-
 
918
}
-
 
919
 
-
 
920
static Bytes*
-
 
921
tlsSecECDHEc(TlsSec *sec, int curve, Bytes *Ys)
-
 
922
{
-
 
923
	ECdomain *dom = &sec->ec.dom;
-
 
924
	ECpriv *Q = &sec->ec.Q;
-
 
925
	Namedcurve *nc;
-
 
926
	ECpub *pub;
-
 
927
	ECpoint K;
-
 
928
	Bytes *Yc;
-
 
929
	int n;
-
 
930
 
-
 
931
	if(Ys == nil)
-
 
932
		return nil;
-
 
933
	for(nc = namedcurves; nc != &namedcurves[nelem(namedcurves)]; nc++)
-
 
934
		if(nc->tlsid == curve)
-
 
935
			goto Found;
-
 
936
	return nil;
-
 
937
 
-
 
938
Found:
-
 
939
	ecdominit(dom, nc->init);
-
 
940
	pub = ecdecodepub(dom, Ys->data, Ys->len);
-
 
941
	if(pub == nil)
-
 
942
		return nil;
-
 
943
 
-
 
944
	memset(Q, 0, sizeof(*Q));
-
 
945
	Q->x = mpnew(0);
-
 
946
	Q->y = mpnew(0);
-
 
947
	Q->d = mpnew(0);
-
 
948
 
-
 
949
	memset(&K, 0, sizeof(K));
-
 
950
	K.x = mpnew(0);
-
 
951
	K.y = mpnew(0);
-
 
952
 
-
 
953
	ecgen(dom, Q);
-
 
954
	ecmul(dom, pub, Q->d, &K);
-
 
955
 
-
 
956
	n = (mpsignif(dom->p)+7)/8;
-
 
957
	setMasterSecret(sec, mptobytes(K.x, n));
-
 
958
	Yc = newbytes(1 + 2*n);
-
 
959
	Yc->len = ecencodepub(dom, Q, Yc->data, Yc->len);
-
 
960
 
-
 
961
	mpfree(K.x);
-
 
962
	mpfree(K.y);
-
 
963
 
-
 
964
	ecpubfree(pub);
-
 
965
 
601
	return 0;
966
	return Yc;
602
}
967
}
603
 
968
 
604
static TlsConnection *
969
static TlsConnection *
605
tlsClient2(int ctl, int hand, uchar *csid, int ncsid, int (*trace)(char*fmt, ...))
970
tlsClient2(int ctl, int hand,
-
 
971
	uchar *cert, int certlen,
-
 
972
	char *pskid, uchar *psk, int psklen,
-
 
973
	uchar *ext, int extlen,
-
 
974
	int (*trace)(char*fmt, ...))
606
{
975
{
-
 
976
	int creq, dhx, cipher;
607
	TlsConnection *c;
977
	TlsConnection *c;
-
 
978
	Bytes *epm;
608
	Msg m;
979
	Msg m;
609
	uchar kd[MaxKeyData], *epm;
-
 
610
	char *secrets;
-
 
611
	int creq, nepm, rv;
-
 
612
 
980
 
613
	if(!initCiphers())
981
	if(!initCiphers())
614
		return nil;
982
		return nil;
-
 
983
 
615
	epm = nil;
984
	epm = nil;
-
 
985
	memset(&m, 0, sizeof(m));
616
	c = emalloc(sizeof(TlsConnection));
986
	c = emalloc(sizeof(TlsConnection));
617
	c->version = ProtocolVersion;
-
 
-
 
987
 
618
	c->ctl = ctl;
988
	c->ctl = ctl;
619
	c->hand = hand;
989
	c->hand = hand;
620
	c->trace = trace;
990
	c->trace = trace;
621
	c->isClient = 1;
991
	c->cert = nil;
622
	c->clientVersion = c->version;
992
	c->sendp = c->buf;
623
 
993
 
-
 
994
	c->version = ProtocolVersion;
624
	c->sec = tlsSecInitc(c->clientVersion, c->crandom);
995
	tlsSecInitc(c->sec, c->version);
-
 
996
	if(psklen > 0){
-
 
997
		c->sec->psk = psk;
-
 
998
		c->sec->psklen = psklen;
-
 
999
	}
-
 
1000
	if(certlen > 0){
-
 
1001
		/* client certificate */
-
 
1002
		c->sec->rsapub = X509toRSApub(cert, certlen, nil, 0);
-
 
1003
		if(c->sec->rsapub == nil){
-
 
1004
			tlsError(c, EInternalError, "invalid X509/rsa certificate");
-
 
1005
			goto Err;
-
 
1006
		}
-
 
1007
		c->sec->rpc = factotum_rsa_open(c->sec->rsapub);
625
	if(c->sec == nil)
1008
		if(c->sec->rpc == nil){
-
 
1009
			tlsError(c, EInternalError, "factotum_rsa_open: %r");
626
		goto Err;
1010
			goto Err;
-
 
1011
		}
-
 
1012
	}
627
 
1013
 
628
	/* client hello */
1014
	/* client hello */
629
	memset(&m, 0, sizeof(m));
-
 
630
	m.tag = HClientHello;
1015
	m.tag = HClientHello;
631
	m.u.clientHello.version = c->clientVersion;
1016
	m.u.clientHello.version = c->version;
632
	memmove(m.u.clientHello.random, c->crandom, RandomSize);
1017
	memmove(m.u.clientHello.random, c->sec->crandom, RandomSize);
633
	m.u.clientHello.sid = makebytes(csid, ncsid);
1018
	m.u.clientHello.sid = makebytes(nil, 0);
634
	m.u.clientHello.ciphers = makeciphers();
1019
	m.u.clientHello.ciphers = makeciphers(psklen > 0);
635
	m.u.clientHello.compressors = makebytes(compressors,sizeof(compressors));
1020
	m.u.clientHello.compressors = makebytes(compressors,sizeof(compressors));
-
 
1021
	m.u.clientHello.extensions = makebytes(ext, extlen);
636
	if(!msgSend(c, &m, AFlush))
1022
	if(!msgSend(c, &m, AFlush))
637
		goto Err;
1023
		goto Err;
638
	msgClear(&m);
-
 
639
 
1024
 
640
	/* server hello */
1025
	/* server hello */
641
	if(!msgRecv(c, &m))
1026
	if(!msgRecv(c, &m))
642
		goto Err;
1027
		goto Err;
643
	if(m.tag != HServerHello) {
1028
	if(m.tag != HServerHello) {
644
		tlsError(c, EUnexpectedMessage, "expected a server hello");
1029
		tlsError(c, EUnexpectedMessage, "expected a server hello");
645
		goto Err;
1030
		goto Err;
646
	}
1031
	}
647
	if(setVersion(c, m.u.serverHello.version) < 0) {
1032
	if(setVersion(c, m.u.serverHello.version) < 0) {
648
		tlsError(c, EIllegalParameter, "incompatible version %r");
1033
		tlsError(c, EIllegalParameter, "incompatible version: %r");
649
		goto Err;
1034
		goto Err;
650
	}
1035
	}
651
	memmove(c->srandom, m.u.serverHello.random, RandomSize);
1036
	tlsSecVers(c->sec, c->version);
652
	c->sid = makebytes(m.u.serverHello.sid->data, m.u.serverHello.sid->len);
1037
	memmove(c->sec->srandom, m.u.serverHello.random, RandomSize);
653
	if(c->sid->len != 0 && c->sid->len != SidSize) {
-
 
654
		tlsError(c, EIllegalParameter, "invalid server session identifier");
-
 
655
		goto Err;
-
 
656
	}
1038
 
657
	if(!setAlgs(c, m.u.serverHello.cipher)) {
1039
	cipher = m.u.serverHello.cipher;
-
 
1040
	if((psklen > 0) != isPSK(cipher) || !setAlgs(c, cipher)) {
658
		tlsError(c, EIllegalParameter, "invalid cipher suite");
1041
		tlsError(c, EIllegalParameter, "invalid cipher suite");
659
		goto Err;
1042
		goto Err;
660
	}
1043
	}
661
	if(m.u.serverHello.compressor != CompressionNull) {
1044
	if(m.u.serverHello.compressor != CompressionNull) {
662
		tlsError(c, EIllegalParameter, "invalid compression");
1045
		tlsError(c, EIllegalParameter, "invalid compression");
663
		goto Err;
1046
		goto Err;
664
	}
1047
	}
665
	msgClear(&m);
-
 
666
 
-
 
667
	/* certificate */
-
 
668
	if(!msgRecv(c, &m) || m.tag != HCertificate) {
-
 
669
		tlsError(c, EUnexpectedMessage, "expected a certificate");
-
 
670
		goto Err;
-
 
671
	}
-
 
672
	if(m.u.certificate.ncert < 1) {
-
 
673
		tlsError(c, EIllegalParameter, "runt certificate");
-
 
674
		goto Err;
-
 
675
	}
-
 
676
	c->cert = makebytes(m.u.certificate.certs[0]->data, m.u.certificate.certs[0]->len);
-
 
677
	msgClear(&m);
-
 
678
 
1048
 
679
	/* server key exchange (optional) */
1049
	dhx = isDHE(cipher) || isECDHE(cipher);
680
	if(!msgRecv(c, &m))
1050
	if(!msgRecv(c, &m))
681
		goto Err;
1051
		goto Err;
-
 
1052
	if(m.tag == HCertificate){
-
 
1053
		if(m.u.certificate.ncert < 1) {
-
 
1054
			tlsError(c, EIllegalParameter, "runt certificate");
-
 
1055
			goto Err;
-
 
1056
		}
-
 
1057
		c->cert = makebytes(m.u.certificate.certs[0]->data, m.u.certificate.certs[0]->len);
-
 
1058
		if(!msgRecv(c, &m))
-
 
1059
			goto Err;
-
 
1060
	} else if(psklen == 0) {
-
 
1061
		tlsError(c, EUnexpectedMessage, "expected a certificate");
-
 
1062
		goto Err;
-
 
1063
	}
682
	if(m.tag == HServerKeyExchange) {
1064
	if(m.tag == HServerKeyExchange) {
-
 
1065
		if(dhx){
-
 
1066
			char *err = verifyDHparams(c->sec,
-
 
1067
				m.u.serverKeyExchange.dh_parameters,
-
 
1068
				c->cert,
-
 
1069
				m.u.serverKeyExchange.dh_signature,
-
 
1070
				c->version<TLS12Version ? 0x01 : m.u.serverKeyExchange.sigalg);
-
 
1071
			if(err != nil){
-
 
1072
				tlsError(c, EBadCertificate, "can't verify DH parameters: %s", err);
-
 
1073
				goto Err;
-
 
1074
			}
-
 
1075
			if(isECDHE(cipher)){
-
 
1076
				epm = tlsSecECDHEc(c->sec,
-
 
1077
					m.u.serverKeyExchange.curve,
-
 
1078
					m.u.serverKeyExchange.dh_Ys);
-
 
1079
			}
-
 
1080
			else{
-
 
1081
				epm = tlsSecDHEc(c->sec,
-
 
1082
					m.u.serverKeyExchange.dh_p, 
-
 
1083
					m.u.serverKeyExchange.dh_g,
-
 
1084
					m.u.serverKeyExchange.dh_Ys);
-
 
1085
			}
-
 
1086
			if(epm == nil){
-
 
1087
				tlsError(c, EHandshakeFailure, "bad DH parameters");
-
 
1088
				goto Err;
-
 
1089
			}
-
 
1090
		} else if(psklen == 0){
683
		tlsError(c, EUnexpectedMessage, "got an server key exchange");
1091
			tlsError(c, EUnexpectedMessage, "got an server key exchange");
-
 
1092
			goto Err;
-
 
1093
		}
-
 
1094
		if(!msgRecv(c, &m))
-
 
1095
			goto Err;
-
 
1096
	} else if(dhx){
-
 
1097
		tlsError(c, EUnexpectedMessage, "expected server key exchange");
684
		goto Err;
1098
		goto Err;
685
		// If implementing this later, watch out for rollback attack
-
 
686
		// described in Wagner Schneier 1996, section 4.4.
-
 
687
	}
1099
	}
688
 
1100
 
689
	/* certificate request (optional) */
1101
	/* certificate request (optional) */
690
	creq = 0;
1102
	creq = 0;
691
	if(m.tag == HCertificateRequest) {
1103
	if(m.tag == HCertificateRequest) {
692
		creq = 1;
1104
		creq = 1;
693
		msgClear(&m);
-
 
694
		if(!msgRecv(c, &m))
1105
		if(!msgRecv(c, &m))
695
			goto Err;
1106
			goto Err;
696
	}
1107
	}
697
 
1108
 
698
	if(m.tag != HServerHelloDone) {
1109
	if(m.tag != HServerHelloDone) {
699
		tlsError(c, EUnexpectedMessage, "expected a server hello done");
1110
		tlsError(c, EUnexpectedMessage, "expected a server hello done");
700
		goto Err;
1111
		goto Err;
701
	}
1112
	}
702
	msgClear(&m);
1113
	msgClear(&m);
703
 
1114
 
-
 
1115
	if(!dhx){
704
	if(tlsSecSecretc(c->sec, c->sid->data, c->sid->len, c->srandom,
1116
		if(c->cert != nil){
705
			c->cert->data, c->cert->len, c->version, &epm, &nepm,
1117
			epm = tlsSecRSAc(c->sec, c->cert->data, c->cert->len);
706
			kd, c->nsecret) < 0){
1118
			if(epm == nil){
707
		tlsError(c, EBadCertificate, "invalid x509/rsa certificate");
1119
				tlsError(c, EBadCertificate, "bad certificate: %r");
708
		goto Err;
1120
				goto Err;
709
	}
1121
			}
710
	secrets = (char*)emalloc(2*c->nsecret);
1122
		} else if(psklen > 0){
711
	enc64(secrets, 2*c->nsecret, kd, c->nsecret);
1123
			setMasterSecret(c->sec, newbytes(psklen));
-
 
1124
		} else {
712
	rv = fprint(c->ctl, "secret %s %s 1 %s", c->digest, c->enc, secrets);
1125
			tlsError(c, EInternalError, "no psk or certificate");
713
	memset(secrets, 0, 2*c->nsecret);
1126
			goto Err;
-
 
1127
		}
-
 
1128
	}
-
 
1129
 
714
	free(secrets);
1130
	if(trace)
715
	memset(kd, 0, c->nsecret);
1131
		trace("tls secrets\n");
716
	if(rv < 0){
1132
	if(setSecrets(c, 1) < 0){
717
		tlsError(c, EHandshakeFailure, "can't set keys: %r");
1133
		tlsError(c, EHandshakeFailure, "can't set secrets: %r");
718
		goto Err;
1134
		goto Err;
719
	}
1135
	}
720
 
1136
 
721
	if(creq) {
1137
	if(creq) {
722
		/* send a zero length certificate */
-
 
723
		m.tag = HCertificate;
1138
		m.tag = HCertificate;
-
 
1139
		if(certlen > 0){
-
 
1140
			m.u.certificate.ncert = 1;
-
 
1141
			m.u.certificate.certs = emalloc(m.u.certificate.ncert * sizeof(Bytes*));
-
 
1142
			m.u.certificate.certs[0] = makebytes(cert, certlen);
-
 
1143
		}		
724
		if(!msgSend(c, &m, AFlush))
1144
		if(!msgSend(c, &m, AFlush))
725
			goto Err;
1145
			goto Err;
726
		msgClear(&m);
-
 
727
	}
1146
	}
728
 
1147
 
729
	/* client key exchange */
1148
	/* client key exchange */
730
	m.tag = HClientKeyExchange;
1149
	m.tag = HClientKeyExchange;
-
 
1150
	if(psklen > 0){
-
 
1151
		if(pskid == nil)
-
 
1152
			pskid = "";
731
	m.u.clientKeyExchange.key = makebytes(epm, nepm);
1153
		m.u.clientKeyExchange.pskid = makebytes((uchar*)pskid, strlen(pskid));
-
 
1154
	}
732
	free(epm);
1155
	m.u.clientKeyExchange.key = epm;
733
	epm = nil;
1156
	epm = nil;
734
	if(m.u.clientKeyExchange.key == nil) {
-
 
735
		tlsError(c, EHandshakeFailure, "can't set secret: %r");
-
 
736
		goto Err;
-
 
737
	}
1157
	 
738
	if(!msgSend(c, &m, AFlush))
1158
	if(!msgSend(c, &m, AFlush))
739
		goto Err;
1159
		goto Err;
-
 
1160
 
-
 
1161
	/* certificate verify */
-
 
1162
	if(creq && certlen > 0) {
-
 
1163
		HandshakeHash hsave;
-
 
1164
		uchar digest[MAXdlen];
-
 
1165
		int digestlen;
-
 
1166
 
-
 
1167
		/* save the state for the Finish message */
-
 
1168
		hsave = c->handhash;
-
 
1169
		if(c->version < TLS12Version){
-
 
1170
			md5(nil, 0, digest, &c->handhash.md5);
-
 
1171
			sha1(nil, 0, digest+MD5dlen, &c->handhash.sha1);
-
 
1172
			digestlen = MD5dlen+SHA1dlen;
-
 
1173
		} else {
-
 
1174
			m.u.certificateVerify.sigalg = 0x0401;	/* RSA SHA256 */
-
 
1175
			sha2_256(nil, 0, digest, &c->handhash.sha2_256);
-
 
1176
			digestlen = SHA2_256dlen;
-
 
1177
		}
-
 
1178
		c->handhash = hsave;
-
 
1179
 
-
 
1180
		if((m.u.certificateVerify.signature = pkcs1_sign(c->sec, digest, digestlen,
-
 
1181
			m.u.certificateVerify.sigalg)) == nil){
-
 
1182
			tlsError(c, EHandshakeFailure, "pkcs1_sign: %r");
-
 
1183
			goto Err;
-
 
1184
		}
-
 
1185
 
-
 
1186
		m.tag = HCertificateVerify;
-
 
1187
		if(!msgSend(c, &m, AFlush))
740
	msgClear(&m);
1188
			goto Err;
-
 
1189
	} 
741
 
1190
 
742
	/* change cipher spec */
1191
	/* change cipher spec */
743
	if(fprint(c->ctl, "changecipher") < 0){
1192
	if(fprint(c->ctl, "changecipher") < 0){
744
		tlsError(c, EInternalError, "can't enable cipher: %r");
1193
		tlsError(c, EInternalError, "can't enable cipher: %r");
745
		goto Err;
1194
		goto Err;
746
	}
1195
	}
747
 
1196
 
748
	// Cipherchange must occur immediately before Finished to avoid
1197
	// Cipherchange must occur immediately before Finished to avoid
749
	// potential hole;  see section 4.3 of Wagner Schneier 1996.
1198
	// potential hole;  see section 4.3 of Wagner Schneier 1996.
750
	if(tlsSecFinished(c->sec, c->hsmd5, c->hssha1, c->finished.verify, c->finished.n, 1) < 0){
1199
	if(tlsSecFinished(c->sec, c->handhash, c->finished.verify, c->finished.n, 1) < 0){
751
		tlsError(c, EInternalError, "can't set finished 1: %r");
1200
		tlsError(c, EInternalError, "can't set finished 1: %r");
752
		goto Err;
1201
		goto Err;
753
	}
1202
	}
754
	m.tag = HFinished;
1203
	m.tag = HFinished;
755
	m.u.finished = c->finished;
1204
	m.u.finished = c->finished;
756
 
-
 
757
	if(!msgSend(c, &m, AFlush)) {
1205
	if(!msgSend(c, &m, AFlush)) {
758
		fprint(2, "tlsClient nepm=%d\n", nepm);
-
 
759
		tlsError(c, EInternalError, "can't flush after client Finished: %r");
1206
		tlsError(c, EInternalError, "can't flush after client Finished: %r");
760
		goto Err;
1207
		goto Err;
761
	}
1208
	}
762
	msgClear(&m);
-
 
763
 
1209
 
764
	if(tlsSecFinished(c->sec, c->hsmd5, c->hssha1, c->finished.verify, c->finished.n, 0) < 0){
1210
	if(tlsSecFinished(c->sec, c->handhash, c->finished.verify, c->finished.n, 0) < 0){
765
		fprint(2, "tlsClient nepm=%d\n", nepm);
-
 
766
		tlsError(c, EInternalError, "can't set finished 0: %r");
1211
		tlsError(c, EInternalError, "can't set finished 0: %r");
767
		goto Err;
1212
		goto Err;
768
	}
1213
	}
769
	if(!msgRecv(c, &m)) {
1214
	if(!msgRecv(c, &m)) {
770
		fprint(2, "tlsClient nepm=%d\n", nepm);
-
 
771
		tlsError(c, EInternalError, "can't read server Finished: %r");
1215
		tlsError(c, EInternalError, "can't read server Finished: %r");
772
		goto Err;
1216
		goto Err;
773
	}
1217
	}
774
	if(m.tag != HFinished) {
1218
	if(m.tag != HFinished) {
775
		fprint(2, "tlsClient nepm=%d\n", nepm);
-
 
776
		tlsError(c, EUnexpectedMessage, "expected a Finished msg from server");
1219
		tlsError(c, EUnexpectedMessage, "expected a Finished msg from server");
777
		goto Err;
1220
		goto Err;
778
	}
1221
	}
779
 
1222
 
780
	if(!finishedMatch(c, &m.u.finished)) {
1223
	if(!finishedMatch(c, &m.u.finished)) {
Line 786... Line 1229...
786
	if(fprint(c->ctl, "opened") < 0){
1229
	if(fprint(c->ctl, "opened") < 0){
787
		if(trace)
1230
		if(trace)
788
			trace("unable to do final open: %r\n");
1231
			trace("unable to do final open: %r\n");
789
		goto Err;
1232
		goto Err;
790
	}
1233
	}
791
	tlsSecOk(c->sec);
-
 
792
	return c;
1234
	return c;
793
 
1235
 
794
Err:
1236
Err:
795
	free(epm);
1237
	free(epm);
796
	msgClear(&m);
1238
	msgClear(&m);
797
	tlsConnectionFree(c);
1239
	tlsConnectionFree(c);
798
	return 0;
1240
	return nil;
799
}
1241
}
800
 
1242
 
801
 
1243
 
802
//================= message functions ========================
1244
//================= message functions ========================
803
 
1245
 
-
 
1246
static void
-
 
1247
msgHash(TlsConnection *c, uchar *p, int n)
-
 
1248
{
-
 
1249
	md5(p, n, 0, &c->handhash.md5);
804
static uchar sendbuf[9000], *sendp;
1250
	sha1(p, n, 0, &c->handhash.sha1);
-
 
1251
	if(c->version >= TLS12Version)
-
 
1252
		sha2_256(p, n, 0, &c->handhash.sha2_256);
-
 
1253
}
805
 
1254
 
806
static int
1255
static int
807
msgSend(TlsConnection *c, Msg *m, int act)
1256
msgSend(TlsConnection *c, Msg *m, int act)
808
{
1257
{
809
	uchar *p; // sendp = start of new message;  p = write pointer
1258
	uchar *p, *e; // sendp = start of new message;  p = write pointer; e = end pointer
810
	int nn, n, i;
1259
	int n, i;
811
 
1260
 
812
	if(sendp == nil)
-
 
813
		sendp = sendbuf;
1261
	p = c->sendp;
814
	p = sendp;
1262
	e = &c->buf[sizeof(c->buf)];
815
	if(c->trace)
1263
	if(c->trace)
816
		c->trace("send %s", msgPrint((char*)p, (sizeof sendbuf) - (p-sendbuf), m));
1264
		c->trace("send %s", msgPrint((char*)p, e - p, m));
817
 
1265
 
818
	p[0] = m->tag;	// header - fill in size later
1266
	p[0] = m->tag;	// header - fill in size later
819
	p += 4;
1267
	p += 4;
820
 
1268
 
821
	switch(m->tag) {
1269
	switch(m->tag) {
822
	default:
1270
	default:
823
		tlsError(c, EInternalError, "can't encode a %d", m->tag);
1271
		tlsError(c, EInternalError, "can't encode a %d", m->tag);
824
		goto Err;
1272
		goto Err;
825
	case HClientHello:
1273
	case HClientHello:
-
 
1274
		if(p+2+RandomSize > e)
826
		// version
1275
			goto Overflow;
827
		put16(p, m->u.clientHello.version);
1276
		put16(p, m->u.clientHello.version), p += 2;
828
		p += 2;
-
 
829
 
-
 
830
		// random
-
 
831
		memmove(p, m->u.clientHello.random, RandomSize);
1277
		memmove(p, m->u.clientHello.random, RandomSize);
832
		p += RandomSize;
1278
		p += RandomSize;
833
 
1279
 
834
		// sid
-
 
835
		n = m->u.clientHello.sid->len;
1280
		if(p+1+(n = m->u.clientHello.sid->len) > e)
836
		assert(n < 256);
1281
			goto Overflow;
837
		p[0] = n;
1282
		*p++ = n;
838
		memmove(p+1, m->u.clientHello.sid->data, n);
1283
		memmove(p, m->u.clientHello.sid->data, n);
839
		p += n+1;
1284
		p += n;
840
 
1285
 
841
		n = m->u.clientHello.ciphers->len;
1286
		if(p+2+(n = m->u.clientHello.ciphers->len) > e)
842
		assert(n > 0 && n < 200);
1287
			goto Overflow;
843
		put16(p, n*2);
1288
		put16(p, n*2), p += 2;
844
		p += 2;
-
 
845
		for(i=0; i<n; i++) {
1289
		for(i=0; i<n; i++)
846
			put16(p, m->u.clientHello.ciphers->data[i]);
1290
			put16(p, m->u.clientHello.ciphers->data[i]), p += 2;
-
 
1291
 
-
 
1292
		if(p+1+(n = m->u.clientHello.compressors->len) > e)
-
 
1293
			goto Overflow;
847
			p += 2;
1294
		*p++ = n;
-
 
1295
		memmove(p, m->u.clientHello.compressors->data, n);
848
		}
1296
		p += n;
849
 
1297
 
-
 
1298
		if(m->u.clientHello.extensions == nil
850
		n = m->u.clientHello.compressors->len;
1299
		|| (n = m->u.clientHello.extensions->len) == 0)
-
 
1300
			break;
851
		assert(n > 0);
1301
		if(p+2+n > e)
-
 
1302
			goto Overflow;
852
		p[0] = n;
1303
		put16(p, n), p += 2;
853
		memmove(p+1, m->u.clientHello.compressors->data, n);
1304
		memmove(p, m->u.clientHello.extensions->data, n);
854
		p += n+1;
1305
		p += n;
855
		break;
1306
		break;
856
	case HServerHello:
1307
	case HServerHello:
857
		put16(p, m->u.serverHello.version);
1308
		if(p+2+RandomSize > e)
858
		p += 2;
1309
			goto Overflow;
859
 
-
 
860
		// random
1310
		put16(p, m->u.serverHello.version), p += 2;
861
		memmove(p, m->u.serverHello.random, RandomSize);
1311
		memmove(p, m->u.serverHello.random, RandomSize);
862
		p += RandomSize;
1312
		p += RandomSize;
863
 
1313
 
864
		// sid
-
 
865
		n = m->u.serverHello.sid->len;
1314
		if(p+1+(n = m->u.serverHello.sid->len) > e)
866
		assert(n < 256);
1315
			goto Overflow;
867
		p[0] = n;
1316
		*p++ = n;
868
		memmove(p+1, m->u.serverHello.sid->data, n);
1317
		memmove(p, m->u.serverHello.sid->data, n);
869
		p += n+1;
1318
		p += n;
870
 
1319
 
-
 
1320
		if(p+2+1 > e)
-
 
1321
			goto Overflow;
871
		put16(p, m->u.serverHello.cipher);
1322
		put16(p, m->u.serverHello.cipher), p += 2;
-
 
1323
		*p++ = m->u.serverHello.compressor;
-
 
1324
 
-
 
1325
		if(m->u.serverHello.extensions == nil
-
 
1326
		|| (n = m->u.serverHello.extensions->len) == 0)
872
		p += 2;
1327
			break;
-
 
1328
		if(p+2+n > e)
-
 
1329
			goto Overflow;
-
 
1330
		put16(p, n), p += 2;
873
		p[0] = m->u.serverHello.compressor;
1331
		memmove(p, m->u.serverHello.extensions->data, n);
874
		p += 1;
1332
		p += n;
875
		break;
1333
		break;
876
	case HServerHelloDone:
1334
	case HServerHelloDone:
877
		break;
1335
		break;
878
	case HCertificate:
1336
	case HCertificate:
879
		nn = 0;
1337
		n = 0;
880
		for(i = 0; i < m->u.certificate.ncert; i++)
1338
		for(i = 0; i < m->u.certificate.ncert; i++)
881
			nn += 3 + m->u.certificate.certs[i]->len;
1339
			n += 3 + m->u.certificate.certs[i]->len;
882
		if(p + 3 + nn - sendbuf > sizeof(sendbuf)) {
1340
		if(p+3+n > e)
883
			tlsError(c, EInternalError, "output buffer too small for certificate");
-
 
884
			goto Err;
1341
			goto Overflow;
885
		}
-
 
886
		put24(p, nn);
1342
		put24(p, n), p += 3;
887
		p += 3;
-
 
888
		for(i = 0; i < m->u.certificate.ncert; i++){
1343
		for(i = 0; i < m->u.certificate.ncert; i++){
889
			put24(p, m->u.certificate.certs[i]->len);
1344
			n = m->u.certificate.certs[i]->len;
-
 
1345
			put24(p, n), p += 3;
-
 
1346
			memmove(p, m->u.certificate.certs[i]->data, n);
890
			p += 3;
1347
			p += n;
-
 
1348
		}
-
 
1349
		break;
-
 
1350
	case HCertificateVerify:
-
 
1351
		if(p+2+2+(n = m->u.certificateVerify.signature->len) > e)
-
 
1352
			goto Overflow;
-
 
1353
		if(m->u.certificateVerify.sigalg != 0)
-
 
1354
			put16(p, m->u.certificateVerify.sigalg), p += 2;
-
 
1355
		put16(p, n), p += 2;
891
			memmove(p, m->u.certificate.certs[i]->data, m->u.certificate.certs[i]->len);
1356
		memmove(p, m->u.certificateVerify.signature->data, n);
-
 
1357
		p += n;
-
 
1358
		break;
-
 
1359
	case HServerKeyExchange:
-
 
1360
		if(m->u.serverKeyExchange.pskid != nil){
892
			p += m->u.certificate.certs[i]->len;
1361
			if(p+2+(n = m->u.serverKeyExchange.pskid->len) > e)
-
 
1362
				goto Overflow;
-
 
1363
			put16(p, n), p += 2;
-
 
1364
			memmove(p, m->u.serverKeyExchange.pskid->data, n);
-
 
1365
			p += n;
893
		}
1366
		}
-
 
1367
		if(m->u.serverKeyExchange.dh_parameters == nil)
-
 
1368
			break;
-
 
1369
		if(p+(n = m->u.serverKeyExchange.dh_parameters->len) > e)
-
 
1370
			goto Overflow;
-
 
1371
		memmove(p, m->u.serverKeyExchange.dh_parameters->data, n);
-
 
1372
		p += n;
-
 
1373
		if(m->u.serverKeyExchange.dh_signature == nil)
-
 
1374
			break;
-
 
1375
		if(p+2+2+(n = m->u.serverKeyExchange.dh_signature->len) > e)
-
 
1376
			goto Overflow;
-
 
1377
		if(c->version >= TLS12Version)
-
 
1378
			put16(p, m->u.serverKeyExchange.sigalg), p += 2;
-
 
1379
		put16(p, n), p += 2;
-
 
1380
		memmove(p, m->u.serverKeyExchange.dh_signature->data, n);
-
 
1381
		p += n;
894
		break;
1382
		break;
895
	case HClientKeyExchange:
1383
	case HClientKeyExchange:
896
		n = m->u.clientKeyExchange.key->len;
1384
		if(m->u.clientKeyExchange.pskid != nil){
897
		if(c->version != SSL3Version){
1385
			if(p+2+(n = m->u.clientKeyExchange.pskid->len) > e)
-
 
1386
				goto Overflow;
898
			put16(p, n);
1387
			put16(p, n), p += 2;
-
 
1388
			memmove(p, m->u.clientKeyExchange.pskid->data, n);
899
			p += 2;
1389
			p += n;
900
		}
1390
		}
-
 
1391
		if(m->u.clientKeyExchange.key == nil)
-
 
1392
			break;
-
 
1393
		if(p+2+(n = m->u.clientKeyExchange.key->len) > e)
-
 
1394
			goto Overflow;
-
 
1395
		if(isECDHE(c->cipher))
-
 
1396
			*p++ = n;
-
 
1397
		else if(isDHE(c->cipher) || c->version != SSL3Version)
-
 
1398
			put16(p, n), p += 2;
901
		memmove(p, m->u.clientKeyExchange.key->data, n);
1399
		memmove(p, m->u.clientKeyExchange.key->data, n);
902
		p += n;
1400
		p += n;
903
		break;
1401
		break;
904
	case HFinished:
1402
	case HFinished:
-
 
1403
		if(p+m->u.finished.n > e)
-
 
1404
			goto Overflow;
905
		memmove(p, m->u.finished.verify, m->u.finished.n);
1405
		memmove(p, m->u.finished.verify, m->u.finished.n);
906
		p += m->u.finished.n;
1406
		p += m->u.finished.n;
907
		break;
1407
		break;
908
	}
1408
	}
909
 
1409
 
910
	// go back and fill in size
1410
	// go back and fill in size
911
	n = p-sendp;
1411
	n = p - c->sendp;
912
	assert(p <= sendbuf+sizeof(sendbuf));
-
 
913
	put24(sendp+1, n-4);
1412
	put24(c->sendp+1, n-4);
914
 
1413
 
915
	// remember hash of Handshake messages
1414
	// remember hash of Handshake messages
916
	if(m->tag != HHelloRequest) {
1415
	if(m->tag != HHelloRequest)
917
		md5(sendp, n, 0, &c->hsmd5);
1416
		msgHash(c, c->sendp, n);
918
		sha1(sendp, n, 0, &c->hssha1);
-
 
919
	}
-
 
920
 
1417
 
921
	sendp = p;
1418
	c->sendp = p;
922
	if(act == AFlush){
1419
	if(act == AFlush){
923
		sendp = sendbuf;
1420
		c->sendp = c->buf;
924
		if(write(c->hand, sendbuf, p-sendbuf) < 0){
1421
		if(write(c->hand, c->buf, p - c->buf) < 0){
925
			fprint(2, "write error: %r\n");
1422
			fprint(2, "write error: %r\n");
926
			goto Err;
1423
			goto Err;
927
		}
1424
		}
928
	}
1425
	}
929
	msgClear(m);
1426
	msgClear(m);
930
	return 1;
1427
	return 1;
-
 
1428
Overflow:
-
 
1429
	tlsError(c, EInternalError, "not enougth send buffer for message (%d)", m->tag);
931
Err:
1430
Err:
932
	msgClear(m);
1431
	msgClear(m);
933
	return 0;
1432
	return 0;
934
}
1433
}
935
 
1434
 
936
static uchar*
1435
static uchar*
937
tlsReadN(TlsConnection *c, int n)
1436
tlsReadN(TlsConnection *c, int n)
938
{
1437
{
939
	uchar *p;
1438
	uchar *p, *w, *e;
940
	int nn, nr;
-
 
941
 
1439
 
942
	nn = c->ep - c->rp;
1440
	e = &c->buf[sizeof(c->buf)];
943
	if(nn < n){
1441
	p = e - n;
944
		if(c->rp != c->buf){
-
 
945
			memmove(c->buf, c->rp, nn);
1442
	if(n > sizeof(c->buf) || p < c->sendp){
946
			c->rp = c->buf;
-
 
947
			c->ep = &c->buf[nn];
-
 
948
		}
-
 
949
		for(; nn < n; nn += nr) {
-
 
950
			nr = read(c->hand, &c->rp[nn], n - nn);
1443
		tlsError(c, EDecodeError, "handshake message too long %d", n);
951
			if(nr <= 0)
-
 
952
				return nil;
1444
		return nil;
953
			c->ep += nr;
-
 
954
		}
-
 
955
	}
1445
	}
956
	p = c->rp;
1446
	for(w = p; w < e; w += n)
-
 
1447
		if((n = read(c->hand, w, e - w)) <= 0)
957
	c->rp += n;
1448
			return nil;
958
	return p;
1449
	return p;
959
}
1450
}
960
 
1451
 
961
static int
1452
static int
962
msgRecv(TlsConnection *c, Msg *m)
1453
msgRecv(TlsConnection *c, Msg *m)
963
{
1454
{
964
	uchar *p;
1455
	uchar *p, *s;
965
	int type, n, nn, i, nsid, nrandom, nciph;
1456
	int type, n, nn, i;
966
 
1457
 
-
 
1458
	msgClear(m);
967
	for(;;) {
1459
	for(;;) {
968
		p = tlsReadN(c, 4);
1460
		p = tlsReadN(c, 4);
969
		if(p == nil)
1461
		if(p == nil)
970
			return 0;
1462
			return 0;
971
		type = p[0];
1463
		type = p[0];
972
		n = get24(p+1);
1464
		n = get24(p+1);
973
 
1465
 
974
		if(type != HHelloRequest)
1466
		if(type != HHelloRequest)
975
			break;
1467
			break;
976
		if(n != 0) {
1468
		if(n != 0) {
977
			tlsError(c, EDecodeError, "invalid hello request during handshake");
1469
			tlsError(c, EDecodeError, "invalid hello request during handshake");
978
			return 0;
1470
			return 0;
979
		}
1471
		}
980
	}
-
 
981
 
-
 
982
	if(n > sizeof(c->buf)) {
-
 
983
		tlsError(c, EDecodeError, "handshake message too long %d %d", n, sizeof(c->buf));
-
 
984
		return 0;
-
 
985
	}
1472
	}
986
 
1473
 
987
	if(type == HSSL2ClientHello){
1474
	if(type == HSSL2ClientHello){
988
		/* Cope with an SSL3 ClientHello expressed in SSL2 record format.
1475
		/* Cope with an SSL3 ClientHello expressed in SSL2 record format.
989
			This is sent by some clients that we must interoperate
1476
			This is sent by some clients that we must interoperate
990
			with, such as Java's JSSE and Microsoft's Internet Explorer. */
1477
			with, such as Java's JSSE and Microsoft's Internet Explorer. */
-
 
1478
		int nsid, nrandom, nciph;
-
 
1479
 
991
		p = tlsReadN(c, n);
1480
		p = tlsReadN(c, n);
992
		if(p == nil)
1481
		if(p == nil)
993
			return 0;
1482
			return 0;
994
		md5(p, n, 0, &c->hsmd5);
1483
		msgHash(c, p, n);
995
		sha1(p, n, 0, &c->hssha1);
-
 
996
		m->tag = HClientHello;
1484
		m->tag = HClientHello;
997
		if(n < 22)
1485
		if(n < 22)
998
			goto Short;
1486
			goto Short;
999
		m->u.clientHello.version = get16(p+1);
1487
		m->u.clientHello.version = get16(p+1);
1000
		p += 3;
1488
		p += 3;
1001
		n -= 3;
1489
		n -= 3;
1002
		nn = get16(p); /* cipher_spec_len */
1490
		nn = get16(p); /* cipher_spec_len */
1003
		nsid = get16(p + 2);
1491
		nsid = get16(p + 2);
1004
		nrandom = get16(p + 4);
1492
		nrandom = get16(p + 4);
1005
		p += 6;
1493
		p += 6;
1006
		n -= 6;
1494
		n -= 6;
1007
		if(nsid != 0 	/* no sid's, since shouldn't restart using ssl2 header */
1495
		if(nsid != 0 	/* no sid's, since shouldn't restart using ssl2 header */
1008
				|| nrandom < 16 || nn % 3)
1496
		|| nrandom < 16 || nn % 3 || n - nrandom < nn)
1009
			goto Err;
1497
			goto Err;
1010
		if(c->trace && (n - nrandom != nn))
-
 
1011
			c->trace("n-nrandom!=nn: n=%d nrandom=%d nn=%d\n", n, nrandom, nn);
-
 
1012
		/* ignore ssl2 ciphers and look for {0x00, ssl3 cipher} */
1498
		/* ignore ssl2 ciphers and look for {0x00, ssl3 cipher} */
1013
		nciph = 0;
1499
		nciph = 0;
1014
		for(i = 0; i < nn; i += 3)
1500
		for(i = 0; i < nn; i += 3)
1015
			if(p[i] == 0)
1501
			if(p[i] == 0)
1016
				nciph++;
1502
				nciph++;
Line 1027... Line 1513...
1027
		memmove(&m->u.clientHello.random[RandomSize - nrandom], p, nrandom);
1513
		memmove(&m->u.clientHello.random[RandomSize - nrandom], p, nrandom);
1028
		m->u.clientHello.compressors = newbytes(1);
1514
		m->u.clientHello.compressors = newbytes(1);
1029
		m->u.clientHello.compressors->data[0] = CompressionNull;
1515
		m->u.clientHello.compressors->data[0] = CompressionNull;
1030
		goto Ok;
1516
		goto Ok;
1031
	}
1517
	}
1032
 
-
 
1033
	md5(p, 4, 0, &c->hsmd5);
1518
	msgHash(c, p, 4);
1034
	sha1(p, 4, 0, &c->hssha1);
-
 
1035
 
1519
 
1036
	p = tlsReadN(c, n);
1520
	p = tlsReadN(c, n);
1037
	if(p == nil)
1521
	if(p == nil)
1038
		return 0;
1522
		return 0;
1039
 
1523
 
1040
	md5(p, n, 0, &c->hsmd5);
1524
	msgHash(c, p, n);
1041
	sha1(p, n, 0, &c->hssha1);
-
 
1042
 
1525
 
1043
	m->tag = type;
1526
	m->tag = type;
1044
 
1527
 
1045
	switch(type) {
1528
	switch(type) {
1046
	default:
1529
	default:
1047
		tlsError(c, EUnexpectedMessage, "can't decode a %d", type);
1530
		tlsError(c, EUnexpectedMessage, "can't decode a %d", type);
1048
		goto Err;
1531
		goto Err;
1049
	case HClientHello:
1532
	case HClientHello:
1050
		if(n < 2)
1533
		if(n < 2)
1051
			goto Short;
1534
			goto Short;
1052
		m->u.clientHello.version = get16(p);
1535
		m->u.clientHello.version = get16(p);
1053
		p += 2;
-
 
1054
		n -= 2;
1536
		p += 2, n -= 2;
1055
 
1537
 
1056
		if(n < RandomSize)
1538
		if(n < RandomSize)
1057
			goto Short;
1539
			goto Short;
1058
		memmove(m->u.clientHello.random, p, RandomSize);
1540
		memmove(m->u.clientHello.random, p, RandomSize);
1059
		p += RandomSize;
-
 
1060
		n -= RandomSize;
1541
		p += RandomSize, n -= RandomSize;
1061
		if(n < 1 || n < p[0]+1)
1542
		if(n < 1 || n < p[0]+1)
1062
			goto Short;
1543
			goto Short;
1063
		m->u.clientHello.sid = makebytes(p+1, p[0]);
1544
		m->u.clientHello.sid = makebytes(p+1, p[0]);
1064
		p += m->u.clientHello.sid->len+1;
1545
		p += m->u.clientHello.sid->len+1;
1065
		n -= m->u.clientHello.sid->len+1;
1546
		n -= m->u.clientHello.sid->len+1;
1066
 
1547
 
1067
		if(n < 2)
1548
		if(n < 2)
1068
			goto Short;
1549
			goto Short;
1069
		nn = get16(p);
1550
		nn = get16(p);
1070
		p += 2;
-
 
1071
		n -= 2;
1551
		p += 2, n -= 2;
1072
 
1552
 
1073
		if((nn & 1) || n < nn || nn < 2)
1553
		if((nn & 1) || n < nn || nn < 2)
1074
			goto Short;
1554
			goto Short;
1075
		m->u.clientHello.ciphers = newints(nn >> 1);
1555
		m->u.clientHello.ciphers = newints(nn >> 1);
1076
		for(i = 0; i < nn; i += 2)
1556
		for(i = 0; i < nn; i += 2)
1077
			m->u.clientHello.ciphers->data[i >> 1] = get16(&p[i]);
1557
			m->u.clientHello.ciphers->data[i >> 1] = get16(&p[i]);
1078
		p += nn;
-
 
1079
		n -= nn;
1558
		p += nn, n -= nn;
1080
 
1559
 
1081
		if(n < 1 || n < p[0]+1 || p[0] == 0)
1560
		if(n < 1 || n < p[0]+1 || p[0] == 0)
1082
			goto Short;
1561
			goto Short;
1083
		nn = p[0];
1562
		nn = p[0];
1084
		m->u.clientHello.compressors = newbytes(nn);
1563
		m->u.clientHello.compressors = makebytes(p+1, nn);
-
 
1564
		p += nn + 1, n -= nn + 1;
-
 
1565
 
-
 
1566
		if(n < 2)
-
 
1567
			break;
-
 
1568
		nn = get16(p);
-
 
1569
		if(nn > n-2)
-
 
1570
			goto Short;
1085
		memmove(m->u.clientHello.compressors->data, p+1, nn);
1571
		m->u.clientHello.extensions = makebytes(p+2, nn);
1086
		n -= nn + 1;
1572
		n -= nn + 2;
1087
		break;
1573
		break;
1088
	case HServerHello:
1574
	case HServerHello:
1089
		if(n < 2)
1575
		if(n < 2)
1090
			goto Short;
1576
			goto Short;
1091
		m->u.serverHello.version = get16(p);
1577
		m->u.serverHello.version = get16(p);
1092
		p += 2;
-
 
1093
		n -= 2;
1578
		p += 2, n -= 2;
1094
 
1579
 
1095
		if(n < RandomSize)
1580
		if(n < RandomSize)
1096
			goto Short;
1581
			goto Short;
1097
		memmove(m->u.serverHello.random, p, RandomSize);
1582
		memmove(m->u.serverHello.random, p, RandomSize);
1098
		p += RandomSize;
-
 
1099
		n -= RandomSize;
1583
		p += RandomSize, n -= RandomSize;
1100
 
1584
 
1101
		if(n < 1 || n < p[0]+1)
1585
		if(n < 1 || n < p[0]+1)
1102
			goto Short;
1586
			goto Short;
1103
		m->u.serverHello.sid = makebytes(p+1, p[0]);
1587
		m->u.serverHello.sid = makebytes(p+1, p[0]);
1104
		p += m->u.serverHello.sid->len+1;
1588
		p += m->u.serverHello.sid->len+1;
1105
		n -= m->u.serverHello.sid->len+1;
1589
		n -= m->u.serverHello.sid->len+1;
1106
 
1590
 
1107
		if(n < 3)
1591
		if(n < 3)
1108
			goto Short;
1592
			goto Short;
1109
		m->u.serverHello.cipher = get16(p);
1593
		m->u.serverHello.cipher = get16(p);
1110
		m->u.serverHello.compressor = p[2];
1594
		m->u.serverHello.compressor = p[2];
-
 
1595
		p += 3, n -= 3;
-
 
1596
 
-
 
1597
		if(n < 2)
-
 
1598
			break;
-
 
1599
		nn = get16(p);
-
 
1600
		if(nn > n-2)
-
 
1601
			goto Short;
-
 
1602
		m->u.serverHello.extensions = makebytes(p+2, nn);
1111
		n -= 3;
1603
		n -= nn + 2;
1112
		break;
1604
		break;
1113
	case HCertificate:
1605
	case HCertificate:
1114
		if(n < 3)
1606
		if(n < 3)
1115
			goto Short;
1607
			goto Short;
1116
		nn = get24(p);
1608
		nn = get24(p);
1117
		p += 3;
-
 
1118
		n -= 3;
1609
		p += 3, n -= 3;
1119
		if(n != nn)
1610
		if(nn == 0 && n > 0)
1120
			goto Short;
1611
			goto Short;
1121
		/* certs */
1612
		/* certs */
1122
		i = 0;
1613
		i = 0;
1123
		while(n > 0) {
1614
		while(n > 0) {
1124
			if(n < 3)
1615
			if(n < 3)
1125
				goto Short;
1616
				goto Short;
1126
			nn = get24(p);
1617
			nn = get24(p);
1127
			p += 3;
-
 
1128
			n -= 3;
1618
			p += 3, n -= 3;
1129
			if(nn > n)
1619
			if(nn > n)
1130
				goto Short;
1620
				goto Short;
1131
			m->u.certificate.ncert = i+1;
1621
			m->u.certificate.ncert = i+1;
1132
			m->u.certificate.certs = erealloc(m->u.certificate.certs, (i+1)*sizeof(Bytes));
1622
			m->u.certificate.certs = erealloc(m->u.certificate.certs, (i+1)*sizeof(Bytes*));
1133
			m->u.certificate.certs[i] = makebytes(p, nn);
1623
			m->u.certificate.certs[i] = makebytes(p, nn);
1134
			p += nn;
-
 
1135
			n -= nn;
1624
			p += nn, n -= nn;
1136
			i++;
1625
			i++;
1137
		}
1626
		}
1138
		break;
1627
		break;
1139
	case HCertificateRequest:
1628
	case HCertificateRequest:
1140
		if(n < 1)
1629
		if(n < 1)
1141
			goto Short;
1630
			goto Short;
1142
		nn = p[0];
1631
		nn = p[0];
1143
		p += 1;
1632
		p++, n--;
1144
		n -= 1;
-
 
1145
		if(nn < 1 || nn > n)
1633
		if(nn > n)
1146
			goto Short;
1634
			goto Short;
1147
		m->u.certificateRequest.types = makebytes(p, nn);
1635
		m->u.certificateRequest.types = makebytes(p, nn);
1148
		p += nn;
1636
		p += nn, n -= nn;
-
 
1637
		if(c->version >= TLS12Version){
-
 
1638
			if(n < 2)
-
 
1639
				goto Short;
-
 
1640
			nn = get16(p);
-
 
1641
			p += 2, n -= 2;
-
 
1642
			if(nn & 1)
-
 
1643
				goto Short;
-
 
1644
			m->u.certificateRequest.sigalgs = newints(nn>>1);
-
 
1645
			for(i = 0; i < nn; i += 2)
-
 
1646
				m->u.certificateRequest.sigalgs->data[i >> 1] = get16(&p[i]);
1149
		n -= nn;
1647
			p += nn, n -= nn;
-
 
1648
 
-
 
1649
		}
1150
		if(n < 2)
1650
		if(n < 2)
1151
			goto Short;
1651
			goto Short;
1152
		nn = get16(p);
1652
		nn = get16(p);
1153
		p += 2;
-
 
1154
		n -= 2;
1653
		p += 2, n -= 2;
1155
		/* nn == 0 can happen; yahoo's servers do it */
1654
		/* nn == 0 can happen; yahoo's servers do it */
1156
		if(nn != n)
1655
		if(nn != n)
1157
			goto Short;
1656
			goto Short;
1158
		/* cas */
1657
		/* cas */
1159
		i = 0;
1658
		i = 0;
1160
		while(n > 0) {
1659
		while(n > 0) {
1161
			if(n < 2)
1660
			if(n < 2)
1162
				goto Short;
1661
				goto Short;
1163
			nn = get16(p);
1662
			nn = get16(p);
1164
			p += 2;
-
 
1165
			n -= 2;
1663
			p += 2, n -= 2;
1166
			if(nn < 1 || nn > n)
1664
			if(nn < 1 || nn > n)
1167
				goto Short;
1665
				goto Short;
1168
			m->u.certificateRequest.nca = i+1;
1666
			m->u.certificateRequest.nca = i+1;
1169
			m->u.certificateRequest.cas = erealloc(
1667
			m->u.certificateRequest.cas = erealloc(
1170
				m->u.certificateRequest.cas, (i+1)*sizeof(Bytes));
1668
				m->u.certificateRequest.cas, (i+1)*sizeof(Bytes*));
1171
			m->u.certificateRequest.cas[i] = makebytes(p, nn);
1669
			m->u.certificateRequest.cas[i] = makebytes(p, nn);
1172
			p += nn;
-
 
1173
			n -= nn;
1670
			p += nn, n -= nn;
1174
			i++;
1671
			i++;
1175
		}
1672
		}
1176
		break;
1673
		break;
1177
	case HServerHelloDone:
1674
	case HServerHelloDone:
1178
		break;
1675
		break;
-
 
1676
	case HServerKeyExchange:
-
 
1677
		if(isPSK(c->cipher)){
-
 
1678
			if(n < 2)
-
 
1679
				goto Short;
-
 
1680
			nn = get16(p);
-
 
1681
			p += 2, n -= 2;
-
 
1682
			if(nn > n)
-
 
1683
				goto Short;
-
 
1684
			m->u.serverKeyExchange.pskid = makebytes(p, nn);
-
 
1685
			p += nn, n -= nn;
-
 
1686
			if(n == 0)
-
 
1687
				break;
-
 
1688
		}
-
 
1689
		if(n < 2)
-
 
1690
			goto Short;
-
 
1691
		s = p;
-
 
1692
		if(isECDHE(c->cipher)){
-
 
1693
			nn = *p;
-
 
1694
			p++, n--;
-
 
1695
			if(nn != 3 || nn > n) /* not a named curve */
-
 
1696
				goto Short;
-
 
1697
			nn = get16(p);
-
 
1698
			p += 2, n -= 2;
-
 
1699
			m->u.serverKeyExchange.curve = nn;
-
 
1700
 
-
 
1701
			nn = *p++, n--;
-
 
1702
			if(nn < 1 || nn > n)
-
 
1703
				goto Short;
-
 
1704
			m->u.serverKeyExchange.dh_Ys = makebytes(p, nn);
-
 
1705
			p += nn, n -= nn;
-
 
1706
		}else if(isDHE(c->cipher)){
-
 
1707
			nn = get16(p);
-
 
1708
			p += 2, n -= 2;
-
 
1709
			if(nn < 1 || nn > n)
-
 
1710
				goto Short;
-
 
1711
			m->u.serverKeyExchange.dh_p = makebytes(p, nn);
-
 
1712
			p += nn, n -= nn;
-
 
1713
	
-
 
1714
			if(n < 2)
-
 
1715
				goto Short;
-
 
1716
			nn = get16(p);
-
 
1717
			p += 2, n -= 2;
-
 
1718
			if(nn < 1 || nn > n)
-
 
1719
				goto Short;
-
 
1720
			m->u.serverKeyExchange.dh_g = makebytes(p, nn);
-
 
1721
			p += nn, n -= nn;
-
 
1722
	
-
 
1723
			if(n < 2)
-
 
1724
				goto Short;
-
 
1725
			nn = get16(p);
-
 
1726
			p += 2, n -= 2;
-
 
1727
			if(nn < 1 || nn > n)
-
 
1728
				goto Short;
-
 
1729
			m->u.serverKeyExchange.dh_Ys = makebytes(p, nn);
-
 
1730
			p += nn, n -= nn;
-
 
1731
		} else {
-
 
1732
			/* should not happen */
-
 
1733
			goto Short;
-
 
1734
		}
-
 
1735
		m->u.serverKeyExchange.dh_parameters = makebytes(s, p - s);
-
 
1736
		if(n >= 2){
-
 
1737
			m->u.serverKeyExchange.sigalg = 0;
-
 
1738
			if(c->version >= TLS12Version){
-
 
1739
				m->u.serverKeyExchange.sigalg = get16(p);
-
 
1740
				p += 2, n -= 2;
-
 
1741
				if(n < 2)
-
 
1742
					goto Short;
-
 
1743
			}
-
 
1744
			nn = get16(p);
-
 
1745
			p += 2, n -= 2;
-
 
1746
			if(nn > 0 && nn <= n){
-
 
1747
				m->u.serverKeyExchange.dh_signature = makebytes(p, nn);
-
 
1748
				n -= nn;
-
 
1749
			}
-
 
1750
		}
-
 
1751
		break;		
1179
	case HClientKeyExchange:
1752
	case HClientKeyExchange:
1180
		/*
-
 
1181
		 * this message depends upon the encryption selected
-
 
1182
		 * assume rsa.
-
 
1183
		 */
-
 
1184
		if(c->version == SSL3Version)
1753
		if(isPSK(c->cipher)){
1185
			nn = n;
-
 
1186
		else{
-
 
1187
			if(n < 2)
1754
			if(n < 2)
1188
				goto Short;
1755
				goto Short;
1189
			nn = get16(p);
1756
			nn = get16(p);
1190
			p += 2;
1757
			p += 2, n -= 2;
-
 
1758
			if(nn > n)
-
 
1759
				goto Short;
-
 
1760
			m->u.clientKeyExchange.pskid = makebytes(p, nn);
-
 
1761
			p += nn, n -= nn;
1191
			n -= 2;
1762
			if(n == 0)
-
 
1763
				break;
1192
		}
1764
		}
-
 
1765
		if(n < 2)
-
 
1766
			goto Short;
-
 
1767
		if(isECDHE(c->cipher))
-
 
1768
			nn = *p++, n--;
-
 
1769
		else if(isDHE(c->cipher) || c->version != SSL3Version)
-
 
1770
			nn = get16(p), p += 2, n -= 2;
-
 
1771
		else
-
 
1772
			nn = n;
1193
		if(n < nn)
1773
		if(n < nn)
1194
			goto Short;
1774
			goto Short;
1195
		m->u.clientKeyExchange.key = makebytes(p, nn);
1775
		m->u.clientKeyExchange.key = makebytes(p, nn);
1196
		n -= nn;
1776
		n -= nn;
1197
		break;
1777
		break;
Line 1202... Line 1782...
1202
		memmove(m->u.finished.verify, p, m->u.finished.n);
1782
		memmove(m->u.finished.verify, p, m->u.finished.n);
1203
		n -= m->u.finished.n;
1783
		n -= m->u.finished.n;
1204
		break;
1784
		break;
1205
	}
1785
	}
1206
 
1786
 
1207
	if(type != HClientHello && n != 0)
1787
	if(n != 0 && type != HClientHello && type != HServerHello)
1208
		goto Short;
1788
		goto Short;
1209
Ok:
1789
Ok:
1210
	if(c->trace){
1790
	if(c->trace)
1211
		char *buf;
-
 
1212
		buf = emalloc(8000);
-
 
1213
		c->trace("recv %s", msgPrint(buf, 8000, m));
1791
		c->trace("recv %s", msgPrint((char*)c->sendp, &c->buf[sizeof(c->buf)] - c->sendp, m));
1214
		free(buf);
-
 
1215
	}
-
 
1216
	return 1;
1792
	return 1;
1217
Short:
1793
Short:
1218
	tlsError(c, EDecodeError, "handshake message has invalid length");
1794
	tlsError(c, EDecodeError, "handshake message (%d) has invalid length", type);
1219
Err:
1795
Err:
1220
	msgClear(m);
1796
	msgClear(m);
1221
	return 0;
1797
	return 0;
1222
}
1798
}
1223
 
1799
 
1224
static void
1800
static void
1225
msgClear(Msg *m)
1801
msgClear(Msg *m)
1226
{
1802
{
1227
	int i;
1803
	int i;
1228
 
1804
 
1229
	switch(m->tag) {
1805
	switch(m->tag) {
1230
	default:
-
 
1231
		sysfatal("msgClear: unknown message type: %d", m->tag);
-
 
1232
	case HHelloRequest:
1806
	case HHelloRequest:
1233
		break;
1807
		break;
1234
	case HClientHello:
1808
	case HClientHello:
1235
		freebytes(m->u.clientHello.sid);
1809
		freebytes(m->u.clientHello.sid);
1236
		freeints(m->u.clientHello.ciphers);
1810
		freeints(m->u.clientHello.ciphers);
1237
		freebytes(m->u.clientHello.compressors);
1811
		freebytes(m->u.clientHello.compressors);
-
 
1812
		freebytes(m->u.clientHello.extensions);
1238
		break;
1813
		break;
1239
	case HServerHello:
1814
	case HServerHello:
1240
		freebytes(m->u.clientHello.sid);
1815
		freebytes(m->u.serverHello.sid);
-
 
1816
		freebytes(m->u.serverHello.extensions);
1241
		break;
1817
		break;
1242
	case HCertificate:
1818
	case HCertificate:
1243
		for(i=0; i<m->u.certificate.ncert; i++)
1819
		for(i=0; i<m->u.certificate.ncert; i++)
1244
			freebytes(m->u.certificate.certs[i]);
1820
			freebytes(m->u.certificate.certs[i]);
1245
		free(m->u.certificate.certs);
1821
		free(m->u.certificate.certs);
1246
		break;
1822
		break;
1247
	case HCertificateRequest:
1823
	case HCertificateRequest:
1248
		freebytes(m->u.certificateRequest.types);
1824
		freebytes(m->u.certificateRequest.types);
-
 
1825
		freeints(m->u.certificateRequest.sigalgs);
1249
		for(i=0; i<m->u.certificateRequest.nca; i++)
1826
		for(i=0; i<m->u.certificateRequest.nca; i++)
1250
			freebytes(m->u.certificateRequest.cas[i]);
1827
			freebytes(m->u.certificateRequest.cas[i]);
1251
		free(m->u.certificateRequest.cas);
1828
		free(m->u.certificateRequest.cas);
-
 
1829
		break;
-
 
1830
	case HCertificateVerify:
-
 
1831
		freebytes(m->u.certificateVerify.signature);
1252
		break;
1832
		break;
1253
	case HServerHelloDone:
1833
	case HServerHelloDone:
-
 
1834
		break;
-
 
1835
	case HServerKeyExchange:
-
 
1836
		freebytes(m->u.serverKeyExchange.pskid);
-
 
1837
		freebytes(m->u.serverKeyExchange.dh_p);
-
 
1838
		freebytes(m->u.serverKeyExchange.dh_g);
-
 
1839
		freebytes(m->u.serverKeyExchange.dh_Ys);
-
 
1840
		freebytes(m->u.serverKeyExchange.dh_parameters);
-
 
1841
		freebytes(m->u.serverKeyExchange.dh_signature);
1254
		break;
1842
		break;
1255
	case HClientKeyExchange:
1843
	case HClientKeyExchange:
-
 
1844
		freebytes(m->u.clientKeyExchange.pskid);
1256
		freebytes(m->u.clientKeyExchange.key);
1845
		freebytes(m->u.clientKeyExchange.key);
1257
		break;
1846
		break;
1258
	case HFinished:
1847
	case HFinished:
1259
		break;
1848
		break;
1260
	}
1849
	}
1261
	memset(m, 0, sizeof(Msg));
1850
	memset(m, 0, sizeof(Msg));
1262
}
1851
}
1263
 
1852
 
1264
static char *
1853
static char *
1265
bytesPrint(char *bs, char *be, char *s0, Bytes *b, char *s1)
1854
bytesPrint(char *bs, char *be, char *s0, Bytes *b, char *s1)
1266
{
1855
{
1267
	int i;
1856
	int i;
1268
 
1857
 
1269
	if(s0)
1858
	if(s0)
1270
		bs = seprint(bs, be, "%s", s0);
1859
		bs = seprint(bs, be, "%s", s0);
1271
	bs = seprint(bs, be, "[");
-
 
1272
	if(b == nil)
1860
	if(b == nil)
1273
		bs = seprint(bs, be, "nil");
1861
		bs = seprint(bs, be, "nil");
1274
	else
1862
	else {
-
 
1863
		bs = seprint(bs, be, "<%d> [ ", b->len);
1275
		for(i=0; i<b->len; i++)
1864
		for(i=0; i<b->len; i++)
1276
			bs = seprint(bs, be, "%.2x ", b->data[i]);
1865
			bs = seprint(bs, be, "%.2x ", b->data[i]);
1277
	bs = seprint(bs, be, "]");
1866
		bs = seprint(bs, be, "]");
-
 
1867
	}
1278
	if(s1)
1868
	if(s1)
1279
		bs = seprint(bs, be, "%s", s1);
1869
		bs = seprint(bs, be, "%s", s1);
1280
	return bs;
1870
	return bs;
1281
}
1871
}
1282
 
1872
 
1283
static char *
1873
static char *
1284
intsPrint(char *bs, char *be, char *s0, Ints *b, char *s1)
1874
intsPrint(char *bs, char *be, char *s0, Ints *b, char *s1)
1285
{
1875
{
1286
	int i;
1876
	int i;
1287
 
1877
 
1288
	if(s0)
1878
	if(s0)
1289
		bs = seprint(bs, be, "%s", s0);
1879
		bs = seprint(bs, be, "%s", s0);
1290
	bs = seprint(bs, be, "[");
-
 
1291
	if(b == nil)
1880
	if(b == nil)
1292
		bs = seprint(bs, be, "nil");
1881
		bs = seprint(bs, be, "nil");
1293
	else
1882
	else {
-
 
1883
		bs = seprint(bs, be, "[ ");
1294
		for(i=0; i<b->len; i++)
1884
		for(i=0; i<b->len; i++)
1295
			bs = seprint(bs, be, "%x ", b->data[i]);
1885
			bs = seprint(bs, be, "%x ", b->data[i]);
1296
	bs = seprint(bs, be, "]");
1886
		bs = seprint(bs, be, "]");
-
 
1887
	}
1297
	if(s1)
1888
	if(s1)
1298
		bs = seprint(bs, be, "%s", s1);
1889
		bs = seprint(bs, be, "%s", s1);
1299
	return bs;
1890
	return bs;
1300
}
1891
}
1301
 
1892
 
Line 1310... Line 1901...
1310
		bs = seprint(bs, be, "unknown %d\n", m->tag);
1901
		bs = seprint(bs, be, "unknown %d\n", m->tag);
1311
		break;
1902
		break;
1312
	case HClientHello:
1903
	case HClientHello:
1313
		bs = seprint(bs, be, "ClientHello\n");
1904
		bs = seprint(bs, be, "ClientHello\n");
1314
		bs = seprint(bs, be, "\tversion: %.4x\n", m->u.clientHello.version);
1905
		bs = seprint(bs, be, "\tversion: %.4x\n", m->u.clientHello.version);
1315
		bs = seprint(bs, be, "\trandom: ");
1906
		bs = seprint(bs, be, "\trandom: ");
1316
		for(i=0; i<RandomSize; i++)
1907
		for(i=0; i<RandomSize; i++)
1317
			bs = seprint(bs, be, "%.2x", m->u.clientHello.random[i]);
1908
			bs = seprint(bs, be, "%.2x", m->u.clientHello.random[i]);
1318
		bs = seprint(bs, be, "\n");
1909
		bs = seprint(bs, be, "\n");
1319
		bs = bytesPrint(bs, be, "\tsid: ", m->u.clientHello.sid, "\n");
1910
		bs = bytesPrint(bs, be, "\tsid: ", m->u.clientHello.sid, "\n");
1320
		bs = intsPrint(bs, be, "\tciphers: ", m->u.clientHello.ciphers, "\n");
1911
		bs = intsPrint(bs, be, "\tciphers: ", m->u.clientHello.ciphers, "\n");
1321
		bs = bytesPrint(bs, be, "\tcompressors: ", m->u.clientHello.compressors, "\n");
1912
		bs = bytesPrint(bs, be, "\tcompressors: ", m->u.clientHello.compressors, "\n");
-
 
1913
		if(m->u.clientHello.extensions != nil)
-
 
1914
			bs = bytesPrint(bs, be, "\textensions: ", m->u.clientHello.extensions, "\n");
1322
		break;
1915
		break;
1323
	case HServerHello:
1916
	case HServerHello:
1324
		bs = seprint(bs, be, "ServerHello\n");
1917
		bs = seprint(bs, be, "ServerHello\n");
1325
		bs = seprint(bs, be, "\tversion: %.4x\n", m->u.serverHello.version);
1918
		bs = seprint(bs, be, "\tversion: %.4x\n", m->u.serverHello.version);
1326
		bs = seprint(bs, be, "\trandom: ");
1919
		bs = seprint(bs, be, "\trandom: ");
Line 1328... Line 1921...
1328
			bs = seprint(bs, be, "%.2x", m->u.serverHello.random[i]);
1921
			bs = seprint(bs, be, "%.2x", m->u.serverHello.random[i]);
1329
		bs = seprint(bs, be, "\n");
1922
		bs = seprint(bs, be, "\n");
1330
		bs = bytesPrint(bs, be, "\tsid: ", m->u.serverHello.sid, "\n");
1923
		bs = bytesPrint(bs, be, "\tsid: ", m->u.serverHello.sid, "\n");
1331
		bs = seprint(bs, be, "\tcipher: %.4x\n", m->u.serverHello.cipher);
1924
		bs = seprint(bs, be, "\tcipher: %.4x\n", m->u.serverHello.cipher);
1332
		bs = seprint(bs, be, "\tcompressor: %.2x\n", m->u.serverHello.compressor);
1925
		bs = seprint(bs, be, "\tcompressor: %.2x\n", m->u.serverHello.compressor);
-
 
1926
		if(m->u.serverHello.extensions != nil)
-
 
1927
			bs = bytesPrint(bs, be, "\textensions: ", m->u.serverHello.extensions, "\n");
1333
		break;
1928
		break;
1334
	case HCertificate:
1929
	case HCertificate:
1335
		bs = seprint(bs, be, "Certificate\n");
1930
		bs = seprint(bs, be, "Certificate\n");
1336
		for(i=0; i<m->u.certificate.ncert; i++)
1931
		for(i=0; i<m->u.certificate.ncert; i++)
1337
			bs = bytesPrint(bs, be, "\t", m->u.certificate.certs[i], "\n");
1932
			bs = bytesPrint(bs, be, "\t", m->u.certificate.certs[i], "\n");
1338
		break;
1933
		break;
1339
	case HCertificateRequest:
1934
	case HCertificateRequest:
1340
		bs = seprint(bs, be, "CertificateRequest\n");
1935
		bs = seprint(bs, be, "CertificateRequest\n");
1341
		bs = bytesPrint(bs, be, "\ttypes: ", m->u.certificateRequest.types, "\n");
1936
		bs = bytesPrint(bs, be, "\ttypes: ", m->u.certificateRequest.types, "\n");
-
 
1937
		if(m->u.certificateRequest.sigalgs != nil)
-
 
1938
			bs = intsPrint(bs, be, "\tsigalgs: ", m->u.certificateRequest.sigalgs, "\n");
1342
		bs = seprint(bs, be, "\tcertificateauthorities\n");
1939
		bs = seprint(bs, be, "\tcertificateauthorities\n");
1343
		for(i=0; i<m->u.certificateRequest.nca; i++)
1940
		for(i=0; i<m->u.certificateRequest.nca; i++)
1344
			bs = bytesPrint(bs, be, "\t\t", m->u.certificateRequest.cas[i], "\n");
1941
			bs = bytesPrint(bs, be, "\t\t", m->u.certificateRequest.cas[i], "\n");
1345
		break;
1942
		break;
-
 
1943
	case HCertificateVerify:
-
 
1944
		bs = seprint(bs, be, "HCertificateVerify\n");
-
 
1945
		if(m->u.certificateVerify.sigalg != 0)
-
 
1946
			bs = seprint(bs, be, "\tsigalg: %.4x\n", m->u.certificateVerify.sigalg);
-
 
1947
		bs = bytesPrint(bs, be, "\tsignature: ", m->u.certificateVerify.signature,"\n");
-
 
1948
		break;	
1346
	case HServerHelloDone:
1949
	case HServerHelloDone:
1347
		bs = seprint(bs, be, "ServerHelloDone\n");
1950
		bs = seprint(bs, be, "ServerHelloDone\n");
-
 
1951
		break;
-
 
1952
	case HServerKeyExchange:
-
 
1953
		bs = seprint(bs, be, "HServerKeyExchange\n");
-
 
1954
		if(m->u.serverKeyExchange.pskid != nil)
-
 
1955
			bs = bytesPrint(bs, be, "\tpskid: ", m->u.serverKeyExchange.pskid, "\n");
-
 
1956
		if(m->u.serverKeyExchange.dh_parameters == nil)
-
 
1957
			break;
-
 
1958
		if(m->u.serverKeyExchange.curve != 0){
-
 
1959
			bs = seprint(bs, be, "\tcurve: %.4x\n", m->u.serverKeyExchange.curve);
-
 
1960
		} else {
-
 
1961
			bs = bytesPrint(bs, be, "\tdh_p: ", m->u.serverKeyExchange.dh_p, "\n");
-
 
1962
			bs = bytesPrint(bs, be, "\tdh_g: ", m->u.serverKeyExchange.dh_g, "\n");
-
 
1963
		}
-
 
1964
		bs = bytesPrint(bs, be, "\tdh_Ys: ", m->u.serverKeyExchange.dh_Ys, "\n");
-
 
1965
		if(m->u.serverKeyExchange.sigalg != 0)
-
 
1966
			bs = seprint(bs, be, "\tsigalg: %.4x\n", m->u.serverKeyExchange.sigalg);
-
 
1967
		bs = bytesPrint(bs, be, "\tdh_parameters: ", m->u.serverKeyExchange.dh_parameters, "\n");
-
 
1968
		bs = bytesPrint(bs, be, "\tdh_signature: ", m->u.serverKeyExchange.dh_signature, "\n");
1348
		break;
1969
		break;
1349
	case HClientKeyExchange:
1970
	case HClientKeyExchange:
1350
		bs = seprint(bs, be, "HClientKeyExchange\n");
1971
		bs = seprint(bs, be, "HClientKeyExchange\n");
-
 
1972
		if(m->u.clientKeyExchange.pskid != nil)
-
 
1973
			bs = bytesPrint(bs, be, "\tpskid: ", m->u.clientKeyExchange.pskid, "\n");
-
 
1974
		if(m->u.clientKeyExchange.key != nil)
1351
		bs = bytesPrint(bs, be, "\tkey: ", m->u.clientKeyExchange.key, "\n");
1975
			bs = bytesPrint(bs, be, "\tkey: ", m->u.clientKeyExchange.key, "\n");
1352
		break;
1976
		break;
1353
	case HFinished:
1977
	case HFinished:
1354
		bs = seprint(bs, be, "HFinished\n");
1978
		bs = seprint(bs, be, "HFinished\n");
1355
		for(i=0; i<m->u.finished.n; i++)
1979
		for(i=0; i<m->u.finished.n; i++)
1356
			bs = seprint(bs, be, "%.2x", m->u.finished.verify[i]);
1980
			bs = seprint(bs, be, "%.2x", m->u.finished.verify[i]);
Line 1370... Line 1994...
1370
	va_start(arg, fmt);
1994
	va_start(arg, fmt);
1371
	vseprint(msg, msg+sizeof(msg), fmt, arg);
1995
	vseprint(msg, msg+sizeof(msg), fmt, arg);
1372
	va_end(arg);
1996
	va_end(arg);
1373
	if(c->trace)
1997
	if(c->trace)
1374
		c->trace("tlsError: %s\n", msg);
1998
		c->trace("tlsError: %s\n", msg);
1375
	else if(c->erred)
1999
	if(c->erred)
1376
		fprint(2, "double error: %r, %s", msg);
2000
		fprint(2, "double error: %r, %s", msg);
1377
	else
2001
	else
1378
		werrstr("tls: local %s", msg);
2002
		errstr(msg, sizeof(msg));
1379
	c->erred = 1;
2003
	c->erred = 1;
1380
	fprint(c->ctl, "alert %d", err);
2004
	fprint(c->ctl, "alert %d", err);
1381
}
2005
}
1382
 
2006
 
1383
// commit to specific version number
2007
// commit to specific version number
1384
static int
2008
static int
1385
setVersion(TlsConnection *c, int version)
2009
setVersion(TlsConnection *c, int version)
1386
{
2010
{
1387
	if(c->verset || version > MaxProtoVersion || version < MinProtoVersion)
2011
	if(version > MaxProtoVersion || version < MinProtoVersion)
1388
		return -1;
2012
		return -1;
1389
	if(version > c->version)
2013
	if(version > c->version)
1390
		version = c->version;
2014
		version = c->version;
1391
	if(version == SSL3Version) {
2015
	if(version == SSL3Version) {
1392
		c->version = version;
2016
		c->version = version;
1393
		c->finished.n = SSL3FinishedLen;
2017
		c->finished.n = SSL3FinishedLen;
1394
	}else if(version == TLSVersion){
2018
	}else {
1395
		c->version = version;
2019
		c->version = version;
1396
		c->finished.n = TLSFinishedLen;
2020
		c->finished.n = TLSFinishedLen;
1397
	}else
2021
	}
1398
		return -1;
-
 
1399
	c->verset = 1;
-
 
1400
	return fprint(c->ctl, "version 0x%x", version);
2022
	return fprint(c->ctl, "version 0x%x", version);
1401
}
2023
}
1402
 
2024
 
1403
// confirm that received Finished message matches the expected value
2025
// confirm that received Finished message matches the expected value
1404
static int
2026
static int
1405
finishedMatch(TlsConnection *c, Finished *f)
2027
finishedMatch(TlsConnection *c, Finished *f)
1406
{
2028
{
1407
	return memcmp(f->verify, c->finished.verify, f->n) == 0;
2029
	return tsmemcmp(f->verify, c->finished.verify, f->n) == 0;
1408
}
2030
}
1409
 
2031
 
1410
// free memory associated with TlsConnection struct
2032
// free memory associated with TlsConnection struct
1411
//		(but don't close the TLS channel itself)
2033
//		(but don't close the TLS channel itself)
1412
static void
2034
static void
1413
tlsConnectionFree(TlsConnection *c)
2035
tlsConnectionFree(TlsConnection *c)
1414
{
2036
{
-
 
2037
	if(c == nil)
-
 
2038
		return;
-
 
2039
 
-
 
2040
	dh_finish(&c->sec->dh, nil);
-
 
2041
 
-
 
2042
	mpfree(c->sec->ec.Q.x);
1415
	tlsSecClose(c->sec);
2043
	mpfree(c->sec->ec.Q.y);
1416
	freebytes(c->sid);
2044
	mpfree(c->sec->ec.Q.d);
-
 
2045
	ecdomfree(&c->sec->ec.dom);
-
 
2046
 
-
 
2047
	factotum_rsa_close(c->sec->rpc);
-
 
2048
	rsapubfree(c->sec->rsapub);
1417
	freebytes(c->cert);
2049
	freebytes(c->cert);
-
 
2050
 
1418
	memset(c, 0, sizeof(c));
2051
	memset(c, 0, sizeof(*c));
1419
	free(c);
2052
	free(c);
1420
}
2053
}
1421
 
2054
 
1422
 
2055
 
1423
//================= cipher choices ========================
2056
//================= cipher choices ========================
1424
 
2057
 
-
 
2058
static int
-
 
2059
isDHE(int tlsid)
-
 
2060
{
-
 
2061
	switch(tlsid){
-
 
2062
	case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
-
 
2063
	case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
-
 
2064
 	case TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
-
 
2065
 	case TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
-
 
2066
 	case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
-
 
2067
	case TLS_DHE_RSA_WITH_CHACHA20_POLY1305:
-
 
2068
	case GOOGLE_DHE_RSA_WITH_CHACHA20_POLY1305:
-
 
2069
		return 1;
-
 
2070
	}
-
 
2071
	return 0;
-
 
2072
}
-
 
2073
 
-
 
2074
static int
-
 
2075
isECDHE(int tlsid)
-
 
2076
{
-
 
2077
	switch(tlsid){
-
 
2078
	case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
-
 
2079
	case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305:
-
 
2080
 
-
 
2081
	case GOOGLE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
-
 
2082
	case GOOGLE_ECDHE_RSA_WITH_CHACHA20_POLY1305:
-
 
2083
 
-
 
2084
	case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
-
 
2085
	case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
-
 
2086
 
-
 
2087
	case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
-
 
2088
	case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
-
 
2089
	case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
-
 
2090
	case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
-
 
2091
		return 1;
-
 
2092
	}
-
 
2093
	return 0;
-
 
2094
}
-
 
2095
 
-
 
2096
static int
-
 
2097
isPSK(int tlsid)
-
 
2098
{
-
 
2099
	switch(tlsid){
-
 
2100
	case TLS_PSK_WITH_CHACHA20_POLY1305:
-
 
2101
	case TLS_PSK_WITH_AES_128_CBC_SHA256:
1425
static int weakCipher[CipherMax] =
2102
	case TLS_PSK_WITH_AES_128_CBC_SHA:
-
 
2103
		return 1;
-
 
2104
	}
-
 
2105
	return 0;
-
 
2106
}
-
 
2107
 
-
 
2108
static int
-
 
2109
isECDSA(int tlsid)
1426
{
2110
{
1427
	1,	/* TLS_NULL_WITH_NULL_NULL */
-
 
1428
	1,	/* TLS_RSA_WITH_NULL_MD5 */
-
 
1429
	1,	/* TLS_RSA_WITH_NULL_SHA */
2111
	switch(tlsid){
1430
	1,	/* TLS_RSA_EXPORT_WITH_RC4_40_MD5 */
-
 
1431
	0,	/* TLS_RSA_WITH_RC4_128_MD5 */
-
 
1432
	0,	/* TLS_RSA_WITH_RC4_128_SHA */
-
 
1433
	1,	/* TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 */
-
 
1434
	0,	/* TLS_RSA_WITH_IDEA_CBC_SHA */
-
 
1435
	1,	/* TLS_RSA_EXPORT_WITH_DES40_CBC_SHA */
-
 
1436
	0,	/* TLS_RSA_WITH_DES_CBC_SHA */
-
 
1437
	0,	/* TLS_RSA_WITH_3DES_EDE_CBC_SHA */
-
 
1438
	1,	/* TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA */
-
 
1439
	0,	/* TLS_DH_DSS_WITH_DES_CBC_SHA */
-
 
1440
	0,	/* TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA */
-
 
1441
	1,	/* TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA */
-
 
1442
	0,	/* TLS_DH_RSA_WITH_DES_CBC_SHA */
-
 
1443
	0,	/* TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA */
-
 
1444
	1,	/* TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA */
-
 
1445
	0,	/* TLS_DHE_DSS_WITH_DES_CBC_SHA */
2112
	case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
1446
	0,	/* TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA */
2113
	case GOOGLE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
1447
	1,	/* TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA */
-
 
1448
	0,	/* TLS_DHE_RSA_WITH_DES_CBC_SHA */
2114
	case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
1449
	0,	/* TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA */
2115
	case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
1450
	1,	/* TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 */
-
 
1451
	1,	/* TLS_DH_anon_WITH_RC4_128_MD5 */
2116
		return 1;
1452
	1,	/* TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA */
-
 
-
 
2117
	}
1453
	1,	/* TLS_DH_anon_WITH_DES_CBC_SHA */
2118
	return 0;
1454
	1,	/* TLS_DH_anon_WITH_3DES_EDE_CBC_SHA */
-
 
1455
};
2119
}
1456
 
2120
 
1457
static int
2121
static int
1458
setAlgs(TlsConnection *c, int a)
2122
setAlgs(TlsConnection *c, int a)
1459
{
2123
{
1460
	int i;
2124
	int i;
1461
 
2125
 
1462
	for(i = 0; i < nelem(cipherAlgs); i++){
2126
	for(i = 0; i < nelem(cipherAlgs); i++){
1463
		if(cipherAlgs[i].tlsid == a){
2127
		if(cipherAlgs[i].tlsid == a){
-
 
2128
			c->cipher = a;
1464
			c->enc = cipherAlgs[i].enc;
2129
			c->enc = cipherAlgs[i].enc;
1465
			c->digest = cipherAlgs[i].digest;
2130
			c->digest = cipherAlgs[i].digest;
1466
			c->nsecret = cipherAlgs[i].nsecret;
2131
			c->nsecret = cipherAlgs[i].nsecret;
1467
			if(c->nsecret > MaxKeyData)
2132
			if(c->nsecret > MaxKeyData)
1468
				return 0;
2133
				return 0;
1469
			return 1;
2134
			return 1;
1470
		}
2135
		}
1471
	}
2136
	}
1472
	return 0;
2137
	return 0;
1473
}
2138
}
1474
 
2139
 
1475
static int
2140
static int
1476
okCipher(Ints *cv)
2141
okCipher(Ints *cv, int ispsk)
1477
{
2142
{
1478
	int weak, i, j, c;
2143
	int i, c;
1479
 
2144
 
1480
	weak = 1;
-
 
1481
	for(i = 0; i < cv->len; i++) {
2145
	for(i = 0; i < nelem(cipherAlgs); i++) {
1482
		c = cv->data[i];
2146
		c = cipherAlgs[i].tlsid;
1483
		if(c >= CipherMax)
2147
		if(!cipherAlgs[i].ok || isECDSA(c) || isDHE(c) || isPSK(c) != ispsk)
1484
			weak = 0;
2148
			continue;
1485
		else
-
 
1486
			weak &= weakCipher[c];
2149
		if(lookupid(cv, c) >= 0)
1487
		for(j = 0; j < nelem(cipherAlgs); j++)
-
 
1488
			if(cipherAlgs[j].ok && cipherAlgs[j].tlsid == c)
-
 
1489
				return c;
2150
			return c;
1490
	}
2151
	}
1491
	if(weak)
-
 
1492
		return -2;
-
 
1493
	return -1;
2152
	return -1;
1494
}
2153
}
1495
 
2154
 
1496
static int
2155
static int
1497
okCompression(Bytes *cv)
2156
okCompression(Bytes *cv)
1498
{
2157
{
1499
	int i, j, c;
2158
	int i, c;
1500
 
2159
 
1501
	for(i = 0; i < cv->len; i++) {
2160
	for(i = 0; i < nelem(compressors); i++) {
1502
		c = cv->data[i];
2161
		c = compressors[i];
1503
		for(j = 0; j < nelem(compressors); j++) {
2162
		if(memchr(cv->data, c, cv->len) != nil)
1504
			if(compressors[j] == c)
-
 
1505
				return c;
2163
			return c;
1506
		}
-
 
1507
	}
2164
	}
1508
	return -1;
2165
	return -1;
1509
}
2166
}
1510
 
2167
 
1511
static Lock	ciphLock;
2168
static Lock	ciphLock;
1512
static int	nciphers;
2169
static int	nciphers;
1513
 
2170
 
1514
static int
2171
static int
1515
initCiphers(void)
2172
initCiphers(void)
1516
{
2173
{
1517
	enum {MaxAlgF = 1024, MaxAlgs = 10};
2174
	enum {MaxAlgF = 1024, MaxAlgs = 10};
1518
	char s[MaxAlgF], *flds[MaxAlgs];
2175
	char s[MaxAlgF], *flds[MaxAlgs];
Line 1520... Line 2177...
1520
 
2177
 
1521
	lock(&ciphLock);
2178
	lock(&ciphLock);
1522
	if(nciphers){
2179
	if(nciphers){
1523
		unlock(&ciphLock);
2180
		unlock(&ciphLock);
1524
		return nciphers;
2181
		return nciphers;
1525
	}
2182
	}
1526
	j = open("#a/tls/encalgs", OREAD);
2183
	j = open("#a/tls/encalgs", OREAD);
1527
	if(j < 0){
2184
	if(j < 0){
1528
		werrstr("can't open #a/tls/encalgs: %r");
2185
		werrstr("can't open #a/tls/encalgs: %r");
1529
		return 0;
2186
		goto out;
1530
	}
2187
	}
1531
	n = read(j, s, MaxAlgF-1);
2188
	n = read(j, s, MaxAlgF-1);
1532
	close(j);
2189
	close(j);
1533
	if(n <= 0){
2190
	if(n <= 0){
1534
		werrstr("nothing in #a/tls/encalgs: %r");
2191
		werrstr("nothing in #a/tls/encalgs: %r");
1535
		return 0;
2192
		goto out;
1536
	}
2193
	}
1537
	s[n] = 0;
2194
	s[n] = 0;
1538
	n = getfields(s, flds, MaxAlgs, 1, " \t\r\n");
2195
	n = getfields(s, flds, MaxAlgs, 1, " \t\r\n");
1539
	for(i = 0; i < nelem(cipherAlgs); i++){
2196
	for(i = 0; i < nelem(cipherAlgs); i++){
1540
		ok = 0;
2197
		ok = 0;
1541
		for(j = 0; j < n; j++){
2198
		for(j = 0; j < n; j++){
Line 1548... Line 2205...
1548
	}
2205
	}
1549
 
2206
 
1550
	j = open("#a/tls/hashalgs", OREAD);
2207
	j = open("#a/tls/hashalgs", OREAD);
1551
	if(j < 0){
2208
	if(j < 0){
1552
		werrstr("can't open #a/tls/hashalgs: %r");
2209
		werrstr("can't open #a/tls/hashalgs: %r");
1553
		return 0;
2210
		goto out;
1554
	}
2211
	}
1555
	n = read(j, s, MaxAlgF-1);
2212
	n = read(j, s, MaxAlgF-1);
1556
	close(j);
2213
	close(j);
1557
	if(n <= 0){
2214
	if(n <= 0){
1558
		werrstr("nothing in #a/tls/hashalgs: %r");
2215
		werrstr("nothing in #a/tls/hashalgs: %r");
1559
		return 0;
2216
		goto out;
1560
	}
2217
	}
1561
	s[n] = 0;
2218
	s[n] = 0;
1562
	n = getfields(s, flds, MaxAlgs, 1, " \t\r\n");
2219
	n = getfields(s, flds, MaxAlgs, 1, " \t\r\n");
1563
	for(i = 0; i < nelem(cipherAlgs); i++){
2220
	for(i = 0; i < nelem(cipherAlgs); i++){
1564
		ok = 0;
2221
		ok = 0;
Line 1570... Line 2227...
1570
		}
2227
		}
1571
		cipherAlgs[i].ok &= ok;
2228
		cipherAlgs[i].ok &= ok;
1572
		if(cipherAlgs[i].ok)
2229
		if(cipherAlgs[i].ok)
1573
			nciphers++;
2230
			nciphers++;
1574
	}
2231
	}
-
 
2232
out:
1575
	unlock(&ciphLock);
2233
	unlock(&ciphLock);
1576
	return nciphers;
2234
	return nciphers;
1577
}
2235
}
1578
 
2236
 
1579
static Ints*
2237
static Ints*
1580
makeciphers(void)
2238
makeciphers(int ispsk)
1581
{
2239
{
1582
	Ints *is;
2240
	Ints *is;
1583
	int i, j;
2241
	int i, j;
1584
 
2242
 
1585
	is = newints(nciphers);
2243
	is = newints(nciphers);
1586
	j = 0;
2244
	j = 0;
1587
	for(i = 0; i < nelem(cipherAlgs); i++){
2245
	for(i = 0; i < nelem(cipherAlgs); i++)
1588
		if(cipherAlgs[i].ok)
2246
		if(cipherAlgs[i].ok && isPSK(cipherAlgs[i].tlsid) == ispsk)
1589
			is->data[j++] = cipherAlgs[i].tlsid;
2247
			is->data[j++] = cipherAlgs[i].tlsid;
1590
	}
2248
	is->len = j;
1591
	return is;
2249
	return is;
1592
}
2250
}
1593
 
-
 
1594
 
2251
 
1595
 
2252
 
1596
//================= security functions ========================
2253
//================= security functions ========================
1597
 
2254
 
1598
// given X.509 certificate, set up connection to factotum
2255
// given a public key, set up connection to factotum
1599
//	for using corresponding private key
2256
// for using corresponding private key
1600
static AuthRpc*
2257
static AuthRpc*
1601
factotum_rsa_open(uchar *cert, int certlen)
2258
factotum_rsa_open(RSApub *rsapub)
1602
{
2259
{
1603
	int afd;
2260
	int afd;
1604
	char *s;
2261
	char *s;
1605
	mpint *pub = nil;
2262
	mpint *n;
1606
	RSApub *rsapub;
-
 
1607
	AuthRpc *rpc;
2263
	AuthRpc *rpc;
1608
 
2264
 
1609
	// start talking to factotum
2265
	// start talking to factotum
1610
	if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0)
2266
	if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0)
1611
		return nil;
2267
		return nil;
1612
	if((rpc = auth_allocrpc(afd)) == nil){
2268
	if((rpc = auth_allocrpc(afd)) == nil){
1613
		close(afd);
2269
		close(afd);
1614
		return nil;
2270
		return nil;
1615
	}
2271
	}
1616
	s = "proto=rsa service=tls role=client";
2272
	s = "proto=rsa service=tls role=client";
1617
	if(auth_rpc(rpc, "start", s, strlen(s)) != ARok){
2273
	if(auth_rpc(rpc, "start", s, strlen(s)) == ARok){
1618
		factotum_rsa_close(rpc);
-
 
1619
		return nil;
-
 
1620
	}
-
 
1621
 
-
 
1622
	// roll factotum keyring around to match certificate
2274
		// roll factotum keyring around to match public key
1623
	rsapub = X509toRSApub(cert, certlen, nil, 0);
-
 
1624
	while(1){
2275
		n = mpnew(0);
1625
		if(auth_rpc(rpc, "read", nil, 0) != ARok){
2276
		while(auth_rpc(rpc, "read", nil, 0) == ARok){
-
 
2277
			if(strtomp(rpc->arg, nil, 16, n) != nil
1626
			factotum_rsa_close(rpc);
2278
			&& mpcmp(n, rsapub->n) == 0){
1627
			rpc = nil;
2279
				mpfree(n);
1628
			goto done;
2280
				return rpc;
-
 
2281
			}
1629
		}
2282
		}
1630
		pub = strtomp(rpc->arg, nil, 16, nil);
-
 
1631
		assert(pub != nil);
-
 
1632
		if(mpcmp(pub,rsapub->n) == 0)
-
 
1633
			break;
2283
		mpfree(n);
1634
	}
2284
	}
1635
done:
-
 
1636
	mpfree(pub);
-
 
1637
	rsapubfree(rsapub);
2285
	factotum_rsa_close(rpc);
1638
	return rpc;
2286
	return nil;
1639
}
2287
}
1640
 
2288
 
1641
static mpint*
2289
static mpint*
1642
factotum_rsa_decrypt(AuthRpc *rpc, mpint *cipher)
2290
factotum_rsa_decrypt(AuthRpc *rpc, mpint *cipher)
1643
{
2291
{
1644
	char *p;
2292
	char *p;
1645
	int rv;
2293
	int rv;
1646
 
2294
 
-
 
2295
	if(cipher == nil)
-
 
2296
		return nil;
1647
	if((p = mptoa(cipher, 16, nil, 0)) == nil)
2297
	p = mptoa(cipher, 16, nil, 0);
-
 
2298
	mpfree(cipher);
-
 
2299
	if(p == nil)
1648
		return nil;
2300
		return nil;
1649
	rv = auth_rpc(rpc, "write", p, strlen(p));
2301
	rv = auth_rpc(rpc, "write", p, strlen(p));
1650
	free(p);
2302
	free(p);
1651
	if(rv != ARok || auth_rpc(rpc, "read", nil, 0) != ARok)
2303
	if(rv != ARok || auth_rpc(rpc, "read", nil, 0) != ARok)
1652
		return nil;
2304
		return nil;
1653
	mpfree(cipher);
-
 
1654
	return strtomp(rpc->arg, nil, 16, nil);
2305
	return strtomp(rpc->arg, nil, 16, nil);
1655
}
2306
}
1656
 
2307
 
1657
static void
2308
static void
1658
factotum_rsa_close(AuthRpc*rpc)
2309
factotum_rsa_close(AuthRpc *rpc)
1659
{
2310
{
1660
	if(!rpc)
2311
	if(rpc == nil)
1661
		return;
2312
		return;
1662
	close(rpc->afd);
2313
	close(rpc->afd);
1663
	auth_freerpc(rpc);
2314
	auth_freerpc(rpc);
1664
}
2315
}
1665
 
2316
 
1666
static void
2317
static void
1667
tlsPmd5(uchar *buf, int nbuf, uchar *key, int nkey, uchar *label, int nlabel, uchar *seed0, int nseed0, uchar *seed1, int nseed1)
2318
tlsPmd5(uchar *buf, int nbuf, uchar *key, int nkey, uchar *label, int nlabel, uchar *seed0, int nseed0, uchar *seed1, int nseed1)
1668
{
2319
{
1669
	uchar ai[MD5dlen], tmp[MD5dlen];
2320
	uchar ai[MD5dlen], tmp[MD5dlen];
1670
	int i, n;
2321
	int i, n;
Line 1678... Line 2329...
1678
	while(nbuf > 0) {
2329
	while(nbuf > 0) {
1679
		s = hmac_md5(ai, MD5dlen, key, nkey, nil, nil);
2330
		s = hmac_md5(ai, MD5dlen, key, nkey, nil, nil);
1680
		s = hmac_md5(label, nlabel, key, nkey, nil, s);
2331
		s = hmac_md5(label, nlabel, key, nkey, nil, s);
1681
		s = hmac_md5(seed0, nseed0, key, nkey, nil, s);
2332
		s = hmac_md5(seed0, nseed0, key, nkey, nil, s);
1682
		hmac_md5(seed1, nseed1, key, nkey, tmp, s);
2333
		hmac_md5(seed1, nseed1, key, nkey, tmp, s);
1683
		n = MD5dlen;
2334
		n = MD5dlen;
1684
		if(n > nbuf)
2335
		if(n > nbuf)
1685
			n = nbuf;
2336
			n = nbuf;
1686
		for(i = 0; i < n; i++)
2337
		for(i = 0; i < n; i++)
1687
			buf[i] ^= tmp[i];
2338
			buf[i] ^= tmp[i];
1688
		buf += n;
2339
		buf += n;
1689
		nbuf -= n;
2340
		nbuf -= n;
Line 1701... Line 2352...
1701
 
2352
 
1702
	// generate a1
2353
	// generate a1
1703
	s = hmac_sha1(label, nlabel, key, nkey, nil, nil);
2354
	s = hmac_sha1(label, nlabel, key, nkey, nil, nil);
1704
	s = hmac_sha1(seed0, nseed0, key, nkey, nil, s);
2355
	s = hmac_sha1(seed0, nseed0, key, nkey, nil, s);
1705
	hmac_sha1(seed1, nseed1, key, nkey, ai, s);
2356
	hmac_sha1(seed1, nseed1, key, nkey, ai, s);
1706
 
2357
 
1707
	while(nbuf > 0) {
2358
	while(nbuf > 0) {
1708
		s = hmac_sha1(ai, SHA1dlen, key, nkey, nil, nil);
2359
		s = hmac_sha1(ai, SHA1dlen, key, nkey, nil, nil);
1709
		s = hmac_sha1(label, nlabel, key, nkey, nil, s);
2360
		s = hmac_sha1(label, nlabel, key, nkey, nil, s);
1710
		s = hmac_sha1(seed0, nseed0, key, nkey, nil, s);
2361
		s = hmac_sha1(seed0, nseed0, key, nkey, nil, s);
1711
		hmac_sha1(seed1, nseed1, key, nkey, tmp, s);
2362
		hmac_sha1(seed1, nseed1, key, nkey, tmp, s);
Line 1717... Line 2368...
1717
		buf += n;
2368
		buf += n;
1718
		nbuf -= n;
2369
		nbuf -= n;
1719
		hmac_sha1(ai, SHA1dlen, key, nkey, tmp, nil);
2370
		hmac_sha1(ai, SHA1dlen, key, nkey, tmp, nil);
1720
		memmove(ai, tmp, SHA1dlen);
2371
		memmove(ai, tmp, SHA1dlen);
1721
	}
2372
	}
1722
}
-
 
1723
 
-
 
1724
// fill buf with md5(args)^sha1(args)
-
 
1725
static void
-
 
1726
tlsPRF(uchar *buf, int nbuf, uchar *key, int nkey, char *label, uchar *seed0, int nseed0, uchar *seed1, int nseed1)
-
 
1727
{
-
 
1728
	int i;
-
 
1729
	int nlabel = strlen(label);
-
 
1730
	int n = (nkey + 1) >> 1;
-
 
1731
 
-
 
1732
	for(i = 0; i < nbuf; i++)
-
 
1733
		buf[i] = 0;
-
 
1734
	tlsPmd5(buf, nbuf, key, n, (uchar*)label, nlabel, seed0, nseed0, seed1, nseed1);
-
 
1735
	tlsPsha1(buf, nbuf, key+nkey-n, n, (uchar*)label, nlabel, seed0, nseed0, seed1, nseed1);
-
 
1736
}
-
 
1737
 
-
 
1738
/*
-
 
1739
 * for setting server session id's
-
 
1740
 */
-
 
1741
static Lock	sidLock;
-
 
1742
static long	maxSid = 1;
-
 
1743
 
-
 
1744
/* the keys are verified to have the same public components
-
 
1745
 * and to function correctly with pkcs 1 encryption and decryption. */
-
 
1746
static TlsSec*
-
 
1747
tlsSecInits(int cvers, uchar *csid, int ncsid, uchar *crandom, uchar *ssid, int *nssid, uchar *srandom)
-
 
1748
{
-
 
1749
	TlsSec *sec = emalloc(sizeof(*sec));
-
 
1750
 
-
 
1751
	USED(csid); USED(ncsid);  // ignore csid for now
-
 
1752
 
-
 
1753
	memmove(sec->crandom, crandom, RandomSize);
-
 
1754
	sec->clientVers = cvers;
-
 
1755
 
-
 
1756
	put32(sec->srandom, time(0));
-
 
1757
	genrandom(sec->srandom+4, RandomSize-4);
-
 
1758
	memmove(srandom, sec->srandom, RandomSize);
-
 
1759
 
-
 
1760
	/*
-
 
1761
	 * make up a unique sid: use our pid, and and incrementing id
-
 
1762
	 * can signal no sid by setting nssid to 0.
-
 
1763
	 */
-
 
1764
	memset(ssid, 0, SidSize);
-
 
1765
	put32(ssid, getpid());
-
 
1766
	lock(&sidLock);
-
 
1767
	put32(ssid+4, maxSid++);
-
 
1768
	unlock(&sidLock);
-
 
1769
	*nssid = SidSize;
-
 
1770
	return sec;
-
 
1771
}
-
 
1772
 
-
 
1773
static int
-
 
1774
tlsSecSecrets(TlsSec *sec, int vers, uchar *epm, int nepm, uchar *kd, int nkd)
-
 
1775
{
-
 
1776
	if(epm != nil){
-
 
1777
		if(setVers(sec, vers) < 0)
-
 
1778
			goto Err;
-
 
1779
		serverMasterSecret(sec, epm, nepm);
-
 
1780
	}else if(sec->vers != vers){
-
 
1781
		werrstr("mismatched session versions");
-
 
1782
		goto Err;
-
 
1783
	}
-
 
1784
	setSecrets(sec, kd, nkd);
-
 
1785
	return 0;
-
 
1786
Err:
-
 
1787
	sec->ok = -1;
-
 
1788
	return -1;
-
 
1789
}
-
 
1790
 
-
 
1791
static TlsSec*
-
 
1792
tlsSecInitc(int cvers, uchar *crandom)
-
 
1793
{
-
 
1794
	TlsSec *sec = emalloc(sizeof(*sec));
-
 
1795
	sec->clientVers = cvers;
-
 
1796
	put32(sec->crandom, time(0));
-
 
1797
	genrandom(sec->crandom+4, RandomSize-4);
-
 
1798
	memmove(crandom, sec->crandom, RandomSize);
-
 
1799
	return sec;
-
 
1800
}
-
 
1801
 
-
 
1802
static int
-
 
1803
tlsSecSecretc(TlsSec *sec, uchar *sid, int nsid, uchar *srandom, uchar *cert, int ncert, int vers, uchar **epm, int *nepm, uchar *kd, int nkd)
-
 
1804
{
-
 
1805
	RSApub *pub;
-
 
1806
 
-
 
1807
	pub = nil;
-
 
1808
 
-
 
1809
	USED(sid);
-
 
1810
	USED(nsid);
-
 
1811
	
-
 
1812
	memmove(sec->srandom, srandom, RandomSize);
-
 
1813
 
-
 
1814
	if(setVers(sec, vers) < 0)
-
 
1815
		goto Err;
-
 
1816
 
-
 
1817
	pub = X509toRSApub(cert, ncert, nil, 0);
-
 
1818
	if(pub == nil){
-
 
1819
		werrstr("invalid x509/rsa certificate");
-
 
1820
		goto Err;
-
 
1821
	}
-
 
1822
	if(clientMasterSecret(sec, pub, epm, nepm) < 0)
-
 
1823
		goto Err;
-
 
1824
	rsapubfree(pub);
-
 
1825
	setSecrets(sec, kd, nkd);
-
 
1826
	return 0;
-
 
1827
 
-
 
1828
Err:
-
 
1829
	if(pub != nil)
-
 
1830
		rsapubfree(pub);
-
 
1831
	sec->ok = -1;
-
 
1832
	return -1;
-
 
1833
}
-
 
1834
 
-
 
1835
static int
-
 
1836
tlsSecFinished(TlsSec *sec, MD5state md5, SHAstate sha1, uchar *fin, int nfin, int isclient)
-
 
1837
{
-
 
1838
	if(sec->nfin != nfin){
-
 
1839
		sec->ok = -1;
-
 
1840
		werrstr("invalid finished exchange");
-
 
1841
		return -1;
-
 
1842
	}
-
 
1843
	md5.malloced = 0;
-
 
1844
	sha1.malloced = 0;
-
 
1845
	(*sec->setFinished)(sec, md5, sha1, fin, isclient);
-
 
1846
	return 1;
-
 
1847
}
-
 
1848
 
-
 
1849
static void
-
 
1850
tlsSecOk(TlsSec *sec)
-
 
1851
{
-
 
1852
	if(sec->ok == 0)
-
 
1853
		sec->ok = 1;
-
 
1854
}
-
 
1855
 
-
 
1856
static void
-
 
1857
tlsSecKill(TlsSec *sec)
-
 
1858
{
-
 
1859
	if(!sec)
-
 
1860
		return;
-
 
1861
	factotum_rsa_close(sec->rpc);
-
 
1862
	sec->ok = -1;
-
 
1863
}
-
 
1864
 
-
 
1865
static void
-
 
1866
tlsSecClose(TlsSec *sec)
-
 
1867
{
-
 
1868
	if(!sec)
-
 
1869
		return;
-
 
1870
	factotum_rsa_close(sec->rpc);
-
 
1871
	free(sec->server);
-
 
1872
	free(sec);
-
 
1873
}
-
 
1874
 
-
 
1875
static int
-
 
1876
setVers(TlsSec *sec, int v)
-
 
1877
{
-
 
1878
	if(v == SSL3Version){
-
 
1879
		sec->setFinished = sslSetFinished;
-
 
1880
		sec->nfin = SSL3FinishedLen;
-
 
1881
		sec->prf = sslPRF;
-
 
1882
	}else if(v == TLSVersion){
-
 
1883
		sec->setFinished = tlsSetFinished;
-
 
1884
		sec->nfin = TLSFinishedLen;
-
 
1885
		sec->prf = tlsPRF;
-
 
1886
	}else{
-
 
1887
		werrstr("invalid version");
-
 
1888
		return -1;
-
 
1889
	}
-
 
1890
	sec->vers = v;
-
 
1891
	return 0;
-
 
1892
}
-
 
1893
 
-
 
1894
/*
-
 
1895
 * generate secret keys from the master secret.
-
 
1896
 *
-
 
1897
 * different crypto selections will require different amounts
-
 
1898
 * of key expansion and use of key expansion data,
-
 
1899
 * but it's all generated using the same function.
-
 
1900
 */
-
 
1901
static void
-
 
1902
setSecrets(TlsSec *sec, uchar *kd, int nkd)
-
 
1903
{
-
 
1904
	(*sec->prf)(kd, nkd, sec->sec, MasterSecretSize, "key expansion",
-
 
1905
			sec->srandom, RandomSize, sec->crandom, RandomSize);
-
 
1906
}
-
 
1907
 
-
 
1908
/*
-
 
1909
 * set the master secret from the pre-master secret.
-
 
1910
 */
-
 
1911
static void
-
 
1912
setMasterSecret(TlsSec *sec, Bytes *pm)
-
 
1913
{
-
 
1914
	(*sec->prf)(sec->sec, MasterSecretSize, pm->data, MasterSecretSize, "master secret",
-
 
1915
			sec->crandom, RandomSize, sec->srandom, RandomSize);
-
 
1916
}
-
 
1917
 
-
 
1918
static void
-
 
1919
serverMasterSecret(TlsSec *sec, uchar *epm, int nepm)
-
 
1920
{
-
 
1921
	Bytes *pm;
-
 
1922
 
-
 
1923
	pm = pkcs1_decrypt(sec, epm, nepm);
-
 
1924
 
-
 
1925
	// if the client messed up, just continue as if everything is ok,
-
 
1926
	// to prevent attacks to check for correctly formatted messages.
-
 
1927
	// Hence the fprint(2,) can't be replaced by tlsError(), which sends an Alert msg to the client.
-
 
1928
	if(sec->ok < 0 || pm == nil || get16(pm->data) != sec->clientVers){
-
 
1929
		fprint(2, "serverMasterSecret failed ok=%d pm=%p pmvers=%x cvers=%x nepm=%d\n",
-
 
1930
			sec->ok, pm, pm ? get16(pm->data) : -1, sec->clientVers, nepm);
-
 
1931
		sec->ok = -1;
-
 
1932
		if(pm != nil)
-
 
1933
			freebytes(pm);
-
 
1934
		pm = newbytes(MasterSecretSize);
-
 
1935
		genrandom(pm->data, MasterSecretSize);
-
 
1936
	}
-
 
1937
	setMasterSecret(sec, pm);
-
 
1938
	memset(pm->data, 0, pm->len);	
-
 
1939
	freebytes(pm);
-
 
1940
}
-
 
1941
 
-
 
1942
static int
-
 
1943
clientMasterSecret(TlsSec *sec, RSApub *pub, uchar **epm, int *nepm)
-
 
1944
{
-
 
1945
	Bytes *pm, *key;
-
 
1946
 
-
 
1947
	pm = newbytes(MasterSecretSize);
-
 
1948
	put16(pm->data, sec->clientVers);
-
 
1949
	genrandom(pm->data+2, MasterSecretSize - 2);
-
 
1950
 
-
 
1951
	setMasterSecret(sec, pm);
-
 
1952
 
-
 
1953
	key = pkcs1_encrypt(pm, pub, 2);
-
 
1954
	memset(pm->data, 0, pm->len);
-
 
1955
	freebytes(pm);
-
 
1956
	if(key == nil){
-
 
1957
		werrstr("tls pkcs1_encrypt failed");
-
 
1958
		return -1;
-
 
1959
	}
-
 
1960
 
-
 
1961
	*nepm = key->len;
-
 
1962
	*epm = malloc(*nepm);
-
 
1963
	if(*epm == nil){
-
 
1964
		freebytes(key);
-
 
1965
		werrstr("out of memory");
-
 
1966
		return -1;
-
 
1967
	}
-
 
1968
	memmove(*epm, key->data, *nepm);
-
 
1969
 
-
 
1970
	freebytes(key);
-
 
1971
 
-
 
1972
	return 1;
-
 
1973
}
2373
}
1974
 
2374
 
1975
static void
2375
static void
1976
sslSetFinished(TlsSec *sec, MD5state hsmd5, SHAstate hssha1, uchar *finished, int isClient)
2376
p_sha256(uchar *buf, int nbuf, uchar *key, int nkey, uchar *label, int nlabel, uchar *seed, int nseed)
1977
{
2377
{
1978
	DigestState *s;
-
 
1979
	uchar h0[MD5dlen], h1[SHA1dlen], pad[48];
2378
	uchar ai[SHA2_256dlen], tmp[SHA2_256dlen];
1980
	char *label;
2379
	SHAstate *s;
1981
 
-
 
1982
	if(isClient)
-
 
1983
		label = "CLNT";
-
 
1984
	else
2380
	int n;
1985
		label = "SRVR";
-
 
1986
 
2381
 
1987
	md5((uchar*)label, 4, nil, &hsmd5);
-
 
1988
	md5(sec->sec, MasterSecretSize, nil, &hsmd5);
-
 
1989
	memset(pad, 0x36, 48);
-
 
1990
	md5(pad, 48, nil, &hsmd5);
-
 
1991
	md5(nil, 0, h0, &hsmd5);
-
 
1992
	memset(pad, 0x5C, 48);
2382
	// generate a1
1993
	s = md5(sec->sec, MasterSecretSize, nil, nil);
2383
	s = hmac_sha2_256(label, nlabel, key, nkey, nil, nil);
1994
	s = md5(pad, 48, nil, s);
-
 
1995
	md5(h0, MD5dlen, finished, s);
2384
	hmac_sha2_256(seed, nseed, key, nkey, ai, s);
1996
 
2385
 
-
 
2386
	while(nbuf > 0) {
-
 
2387
		s = hmac_sha2_256(ai, SHA2_256dlen, key, nkey, nil, nil);
1997
	sha1((uchar*)label, 4, nil, &hssha1);
2388
		s = hmac_sha2_256(label, nlabel, key, nkey, nil, s);
1998
	sha1(sec->sec, MasterSecretSize, nil, &hssha1);
2389
		hmac_sha2_256(seed, nseed, key, nkey, tmp, s);
1999
	memset(pad, 0x36, 40);
2390
		n = SHA2_256dlen;
2000
	sha1(pad, 40, nil, &hssha1);
2391
		if(n > nbuf)
2001
	sha1(nil, 0, h1, &hssha1);
2392
			n = nbuf;
2002
	memset(pad, 0x5C, 40);
2393
		memmove(buf, tmp, n);
-
 
2394
		buf += n;
-
 
2395
		nbuf -= n;
2003
	s = sha1(sec->sec, MasterSecretSize, nil, nil);
2396
		hmac_sha2_256(ai, SHA2_256dlen, key, nkey, tmp, nil);
2004
	s = sha1(pad, 40, nil, s);
2397
		memmove(ai, tmp, SHA2_256dlen);
2005
	sha1(h1, SHA1dlen, finished + MD5dlen, s);
-
 
-
 
2398
	}
2006
}
2399
}
2007
 
2400
 
2008
// fill "finished" arg with md5(args)^sha1(args)
2401
// fill buf with md5(args)^sha1(args)
2009
static void
2402
static void
-
 
2403
tls10PRF(uchar *buf, int nbuf, uchar *key, int nkey, char *label, uchar *seed0, int nseed0, uchar *seed1, int nseed1)
-
 
2404
{
-
 
2405
	int nlabel = strlen(label);
-
 
2406
	int n = (nkey + 1) >> 1;
-
 
2407
 
-
 
2408
	memset(buf, 0, nbuf);
-
 
2409
	tlsPmd5(buf, nbuf, key, n, (uchar*)label, nlabel, seed0, nseed0, seed1, nseed1);
-
 
2410
	tlsPsha1(buf, nbuf, key+nkey-n, n, (uchar*)label, nlabel, seed0, nseed0, seed1, nseed1);
-
 
2411
}
-
 
2412
 
-
 
2413
static void
2010
tlsSetFinished(TlsSec *sec, MD5state hsmd5, SHAstate hssha1, uchar *finished, int isClient)
2414
tls12PRF(uchar *buf, int nbuf, uchar *key, int nkey, char *label, uchar *seed0, int nseed0, uchar *seed1, int nseed1)
2011
{
2415
{
2012
	uchar h0[MD5dlen], h1[SHA1dlen];
2416
	uchar seed[2*RandomSize];
2013
	char *label;
-
 
2014
 
-
 
2015
	// get current hash value, but allow further messages to be hashed in
-
 
2016
	md5(nil, 0, h0, &hsmd5);
-
 
2017
	sha1(nil, 0, h1, &hssha1);
-
 
2018
 
2417
 
2019
	if(isClient)
2418
	assert(nseed0+nseed1 <= sizeof(seed));
2020
		label = "client finished";
2419
	memmove(seed, seed0, nseed0);
2021
	else
-
 
2022
		label = "server finished";
2420
	memmove(seed+nseed0, seed1, nseed1);
2023
	tlsPRF(finished, TLSFinishedLen, sec->sec, MasterSecretSize, label, h0, MD5dlen, h1, SHA1dlen);
2421
	p_sha256(buf, nbuf, key, nkey, (uchar*)label, strlen(label), seed, nseed0+nseed1);
2024
}
2422
}
2025
 
2423
 
2026
static void
2424
static void
2027
sslPRF(uchar *buf, int nbuf, uchar *key, int nkey, char *label, uchar *seed0, int nseed0, uchar *seed1, int nseed1)
2425
sslPRF(uchar *buf, int nbuf, uchar *key, int nkey, char *label, uchar *seed0, int nseed0, uchar *seed1, int nseed1)
2028
{
2426
{
-
 
2427
	uchar sha1dig[SHA1dlen], md5dig[MD5dlen], tmp[26];
2029
	DigestState *s;
2428
	DigestState *s;
2030
	uchar sha1dig[SHA1dlen], md5dig[MD5dlen], tmp[26];
-
 
2031
	int i, n, len;
2429
	int i, n, len;
2032
 
2430
 
2033
	USED(label);
2431
	USED(label);
2034
	len = 1;
2432
	len = 1;
2035
	while(nbuf > 0){
2433
	while(nbuf > 0){
Line 2048... Line 2446...
2048
			n = nbuf;
2446
			n = nbuf;
2049
		memmove(buf, md5dig, n);
2447
		memmove(buf, md5dig, n);
2050
		buf += n;
2448
		buf += n;
2051
		nbuf -= n;
2449
		nbuf -= n;
2052
		len++;
2450
		len++;
2098
 
2771
 
2099
	if(ylen < modlen) {
2772
	if(sig == nil || sig->len <= 0){
2100
		a = newbytes(modlen);
2773
		if(sec->psklen > 0)
2101
		memset(a->data, 0, modlen-ylen);
-
 
2102
		memmove(a->data+modlen-ylen, ybytes->data, ylen);
-
 
2103
		freebytes(ybytes);
2774
			return nil;
2104
		ybytes = a;
2775
		return "no signature";
2105
	}
2776
	}
-
 
2777
 
-
 
2778
	if(cert == nil)
-
 
2779
		return "no certificate";
-
 
2780
 
-
 
2781
	digestlen = digestDHparams(sec, par, digest, sigalg);
-
 
2782
	if(digestlen <= 0)
-
 
2783
		return "unknown signature digest algorithm";
-
 
2784
	
2106
	else if(ylen > modlen) {
2785
	switch(sigalg & 0xFF){
-
 
2786
	case 0x01:
2107
		// assume it has leading zeros (mod should make it so)
2787
		rsapk = X509toRSApub(cert->data, cert->len, nil, 0);
-
 
2788
		if(rsapk == nil)
-
 
2789
			return "bad certificate";
-
 
2790
		err = X509rsaverifydigest(sig->data, sig->len, digest, digestlen, rsapk);
2108
		a = newbytes(modlen);
2791
		rsapubfree(rsapk);
-
 
2792
		break;
-
 
2793
	case 0x03:
2109
		memmove(a->data, ybytes->data, modlen);
2794
		ecpk = X509toECpub(cert->data, cert->len, nil, 0, &dom);
-
 
2795
		if(ecpk == nil)
-
 
2796
			return "bad certificate";
-
 
2797
		err = X509ecdsaverifydigest(sig->data, sig->len, digest, digestlen, &dom, ecpk);
-
 
2798
		ecdomfree(&dom);
2110
		freebytes(ybytes);
2799
		ecpubfree(ecpk);
2111
		ybytes = a;
2800
		break;
-
 
2801
	default:
-
 
2802
		err = "signaure algorithm not RSA or ECDSA";
2112
	}
2803
	}
2113
	mpfree(y);
2804
 
2114
	return ybytes;
2805
	return err;
2115
}
2806
}
2116
 
2807
 
2117
// encrypt data according to PKCS#1, /lib/rfc/rfc2437 9.1.2.1
2808
// encrypt data according to PKCS#1, /lib/rfc/rfc2437 9.1.2.1
2118
static Bytes*
2809
static Bytes*
2119
pkcs1_encrypt(Bytes* data, RSApub* key, int blocktype)
2810
pkcs1_encrypt(Bytes* data, RSApub* key)
2120
{
2811
{
2121
	Bytes *pad, *eb, *ans;
2812
	mpint *x, *y;
2122
	int i, dlen, padlen, modlen;
-
 
2123
 
2813
 
2124
	modlen = (mpsignif(key->n)+7)/8;
2814
	x = pkcs1padbuf(data->data, data->len, key->n, 2);
2125
	dlen = data->len;
2815
	if(x == nil)
2126
	if(modlen < 12 || dlen > modlen - 11)
-
 
2127
		return nil;
2816
		return nil;
2128
	padlen = modlen - 3 - dlen;
-
 
2129
	pad = newbytes(padlen);
-
 
2130
	genrandom(pad->data, padlen);
2817
	y = rsaencrypt(key, x, nil);
2131
	for(i = 0; i < padlen; i++) {
-
 
2132
		if(blocktype == 0)
-
 
2133
			pad->data[i] = 0;
-
 
2134
		else if(blocktype == 1)
-
 
2135
			pad->data[i] = 255;
-
 
2136
		else if(pad->data[i] == 0)
-
 
2137
			pad->data[i] = 1;
2818
	mpfree(x);
2138
	}
-
 
2139
	eb = newbytes(modlen);
2819
	data = newbytes((mpsignif(key->n)+7)/8);
2140
	eb->data[0] = 0;
-
 
2141
	eb->data[1] = blocktype;
-
 
2142
	memmove(eb->data+2, pad->data, padlen);
2820
	mptober(y, data->data, data->len);
2143
	eb->data[padlen+2] = 0;
-
 
2144
	memmove(eb->data+padlen+3, data->data, dlen);
-
 
2145
	ans = rsacomp(eb, key, modlen);
-
 
2146
	freebytes(eb);
2821
	mpfree(y);
2147
	freebytes(pad);
-
 
2148
	return ans;
2822
	return data;
2149
}
2823
}
2150
 
2824
 
2151
// decrypt data according to PKCS#1, with given key.
2825
// decrypt data according to PKCS#1, with given key.
2152
// expect a block type of 2.
-
 
2153
static Bytes*
2826
static Bytes*
2154
pkcs1_decrypt(TlsSec *sec, uchar *epm, int nepm)
2827
pkcs1_decrypt(TlsSec *sec, Bytes *data)
-
 
2828
{
-
 
2829
	mpint *y;
-
 
2830
 
-
 
2831
	if(data->len != (mpsignif(sec->rsapub->n)+7)/8)
-
 
2832
		return nil;
-
 
2833
	y = factotum_rsa_decrypt(sec->rpc, bytestomp(data));
-
 
2834
	if(y == nil)
-
 
2835
		return nil;
-
 
2836
	data = mptobytes(y, (mpsignif(y)+7)/8);
-
 
2837
	mpfree(y);
-
 
2838
	if((data->len = pkcs1unpadbuf(data->data, data->len, sec->rsapub->n, 2)) < 0){
-
 
2839
		freebytes(data);
-
 
2840
		return nil;
-
 
2841
	}
-
 
2842
	return data;
-
 
2843
}
-
 
2844
 
-
 
2845
static Bytes*
-
 
2846
pkcs1_sign(TlsSec *sec, uchar *digest, int digestlen, int sigalg)
2155
{
2847
{
2156
	Bytes *eb, *ans = nil;
2848
	int hashalg = (sigalg>>8)&0xFF;
2157
	int i, modlen;
2849
	mpint *signedMP;
-
 
2850
	Bytes *signature;
2158
	mpint *x, *y;
2851
	uchar buf[128];
2159
 
2852
 
-
 
2853
	if(hashalg > 0 && hashalg < nelem(hashfun) && hashfun[hashalg].len == digestlen)
-
 
2854
		digestlen = asn1encodedigest(hashfun[hashalg].fun, digest, buf, sizeof(buf));
2160
	modlen = (mpsignif(sec->rsapub->n)+7)/8;
2855
	else if(digestlen == MD5dlen+SHA1dlen)
2161
	if(nepm != modlen)
2856
		memmove(buf, digest, digestlen);
-
 
2857
	else
2162
		return nil;
2858
		digestlen = -1;
2163
	x = betomp(epm, nepm, nil);
2859
	if(digestlen <= 0){
2164
	y = factotum_rsa_decrypt(sec->rpc, x);
2860
		werrstr("bad digest algorithm");
2165
	if(y == nil)
-
 
2166
		return nil;
2861
		return nil;
2167
	eb = mptobytes(y);
-
 
2168
	if(eb->len < modlen){ // pad on left with zeros
-
 
2169
		ans = newbytes(modlen);
-
 
2170
		memset(ans->data, 0, modlen-eb->len);
-
 
2171
		memmove(ans->data+modlen-eb->len, eb->data, eb->len);
-
 
2172
		freebytes(eb);
-
 
2173
		eb = ans;
-
 
2174
	}
2862
	}
-
 
2863
 
2175
	if(eb->data[0] == 0 && eb->data[1] == 2) {
2864
	signedMP = factotum_rsa_decrypt(sec->rpc, pkcs1padbuf(buf, digestlen, sec->rsapub->n, 1));
2176
		for(i = 2; i < modlen; i++)
-
 
2177
			if(eb->data[i] == 0)
2865
	if(signedMP == nil)
2178
				break;
2866
		return nil;
2179
		if(i < modlen - 1)
-
 
2180
			ans = makebytes(eb->data+i+1, modlen-(i+1));
2867
	signature = mptobytes(signedMP, (mpsignif(sec->rsapub->n)+7)/8);
2181
	}
-
 
2182
	freebytes(eb);
2868
	mpfree(signedMP);
2183
	return ans;
2869
	return signature;
2184
}
2870
}
2185
 
2871
 
2186
 
2872
 
2187
//================= general utility functions ========================
2873
//================= general utility functions ========================
2188
 
2874
 
Line 2191... Line 2877...
2191
{
2877
{
2192
	void *p;
2878
	void *p;
2193
	if(n==0)
2879
	if(n==0)
2194
		n=1;
2880
		n=1;
2195
	p = malloc(n);
2881
	p = malloc(n);
2196
	if(p == nil){
2882
	if(p == nil)
2197
		exits("out of memory");
2883
		sysfatal("out of memory");
2198
	}
-
 
2199
	memset(p, 0, n);
2884
	memset(p, 0, n);
-
 
2885
	setmalloctag(p, getcallerpc(&n));
2200
	return p;
2886
	return p;
2201
}
2887
}
2202
 
2888
 
2203
static void *
2889
static void *
2204
erealloc(void *ReallocP, int ReallocN)
2890
erealloc(void *ReallocP, int ReallocN)
2205
{
2891
{
2206
	if(ReallocN == 0)
2892
	if(ReallocN == 0)
2207
		ReallocN = 1;
2893
		ReallocN = 1;
2208
	if(!ReallocP)
2894
	if(ReallocP == nil)
2209
		ReallocP = emalloc(ReallocN);
2895
		ReallocP = emalloc(ReallocN);
2210
	else if(!(ReallocP = realloc(ReallocP, ReallocN))){
2896
	else if((ReallocP = realloc(ReallocP, ReallocN)) == nil)
2211
		exits("out of memory");
2897
		sysfatal("out of memory");
2212
	}
-
 
-
 
2898
	setrealloctag(ReallocP, getcallerpc(&ReallocP));
2213
	return(ReallocP);
2899
	return(ReallocP);
2214
}
2900
}
2215
 
2901
 
2216
static void
2902
static void
2217
put32(uchar *p, u32int x)
2903
put32(uchar *p, u32int x)
Line 2233... Line 2919...
2233
static void
2919
static void
2234
put16(uchar *p, int x)
2920
put16(uchar *p, int x)
2235
{
2921
{
2236
	p[0] = x>>8;
2922
	p[0] = x>>8;
2237
	p[1] = x;
2923
	p[1] = x;
2238
}
-
 
2239
 
-
 
2240
static u32int
-
 
2241
get32(uchar *p)
-
 
2242
{
-
 
2243
	return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
-
 
2244
}
2924
}
2245
 
2925
 
2246
static int
2926
static int
2247
get24(uchar *p)
2927
get24(uchar *p)
2248
{
2928
{
Line 2253... Line 2933...
2253
get16(uchar *p)
2933
get16(uchar *p)
2254
{
2934
{
2255
	return (p[0]<<8)|p[1];
2935
	return (p[0]<<8)|p[1];
2256
}
2936
}
2257
 
2937
 
2258
#define OFFSET(x, s) offsetof(s, x)
-
 
2259
 
-
 
2260
/*
-
 
2261
 * malloc and return a new Bytes structure capable of
-
 
2262
 * holding len bytes. (len >= 0)
-
 
2263
 * Used to use crypt_malloc, which aborts if malloc fails.
-
 
2264
 */
-
 
2265
static Bytes*
2938
static Bytes*
2266
newbytes(int len)
2939
newbytes(int len)
2267
{
2940
{
2268
	Bytes* ans;
2941
	Bytes* ans;
2269
 
2942
 
-
 
2943
	if(len < 0)
-
 
2944
		abort();
2270
	ans = (Bytes*)malloc(OFFSET(data[0], Bytes) + len);
2945
	ans = emalloc(sizeof(Bytes) + len);
2271
	ans->len = len;
2946
	ans->len = len;
2272
	return ans;
2947
	return ans;
2273
}
2948
}
2274
 
2949
 
2275
/*
2950
/*
2276
 * newbytes(len), with data initialized from buf
2951
 * newbytes(len), with data initialized from buf
-
 
2952
 */
-
 
2953
static Bytes*
-
 
2954
makebytes(uchar* buf, int len)
-
 
2955
{
-
 
2956
	Bytes* ans;
-
 
2957
 
-
 
2958
	ans = newbytes(len);
-
 
2959
	memmove(ans->data, buf, len);
-
 
2960
	return ans;
-
 
2961
}
-
 
2962
 
-
 
2963
static void
-
 
2964
freebytes(Bytes* b)
-
 
2965
{
-
 
2966
	free(b);
-
 
2967
}
-
 
2968
 
-
 
2969
static mpint*
-
 
2970
bytestomp(Bytes* bytes)
-
 
2971
{
-
 
2972
	return betomp(bytes->data, bytes->len, nil);
-
 
2973
}
-
 
2974
 
-
 
2975
/*
-
 
2976
 * Convert mpint* to Bytes, putting high order byte first.
2277
 */
2977
 */
2278
static Bytes*
2978
static Bytes*
2279
makebytes(uchar* buf, int len)
2979
mptobytes(mpint *big, int len)
2280
{
2980
{
2281
	Bytes* ans;
2981
	Bytes* ans;
2282
 
2982
 
-
 
2983
	if(len == 0) len++;
2283
	ans = newbytes(len);
2984
	ans = newbytes(len);
2284
	memmove(ans->data, buf, len);
2985
	mptober(big, ans->data, ans->len);
2285
	return ans;
2986
	return ans;
2286
}
-
 
2287
 
-
 
2288
static void
-
 
2289
freebytes(Bytes* b)
-
 
2290
{
-
 
2291
	if(b != nil)
-
 
2292
		free(b);
-
 
2293
}
2987
}
2294
 
2988
 
2295
/* len is number of ints */
2989
/* len is number of ints */
2296
static Ints*
2990
static Ints*
2297
newints(int len)
2991
newints(int len)
2298
{
2992
{
2299
	Ints* ans;
2993
	Ints* ans;
2300
 
2994
 
-
 
2995
	if(len < 0 || len > ((uint)-1>>1)/sizeof(int))
-
 
2996
		abort();
2301
	ans = (Ints*)malloc(OFFSET(data[0], Ints) + len*sizeof(int));
2997
	ans = emalloc(sizeof(Ints) + len*sizeof(int));
2302
	ans->len = len;
2998
	ans->len = len;
2303
	return ans;
-
 
2304
}
-
 
2305
 
-
 
2306
static Ints*
-
 
2307
makeints(int* buf, int len)
-
 
2308
{
-
 
2309
	Ints* ans;
-
 
2310
 
-
 
2311
	ans = newints(len);
-
 
2312
	if(len > 0)
-
 
2313
		memmove(ans->data, buf, len*sizeof(int));
-
 
2314
	return ans;
2999
	return ans;
2315
}
3000
}
2316
 
3001
 
2317
static void
3002
static void
2318
freeints(Ints* b)
3003
freeints(Ints* b)
2319
{
3004
{
-
 
3005
	free(b);
-
 
3006
}
-
 
3007
 
-
 
3008
static int
-
 
3009
lookupid(Ints* b, int id)
-
 
3010
{
-
 
3011
	int i;
-
 
3012
 
-
 
3013
	for(i=0; i<b->len; i++)
2320
	if(b != nil)
3014
		if(b->data[i] == id)
2321
		free(b);
3015
			return i;
-
 
3016
	return -1;
2322
}
3017
}