1 #ifndef _GPXE_TLS_H
2 #define _GPXE_TLS_H
3 
4 /**
5  * @file
6  *
7  * Transport Layer Security Protocol
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER );
11 
12 #include <stdint.h>
13 #include <gpxe/refcnt.h>
14 #include <gpxe/filter.h>
15 #include <gpxe/process.h>
16 #include <gpxe/crypto.h>
17 #include <gpxe/md5.h>
18 #include <gpxe/sha1.h>
19 #include <gpxe/x509.h>
20 
21 /** A TLS header */
22 struct tls_header {
23 	/** Content type
24 	 *
25 	 * This is a TLS_TYPE_XXX constant
26 	 */
27 	uint8_t type;
28 	/** Protocol version
29 	 *
30 	 * This is a TLS_VERSION_XXX constant
31 	 */
32 	uint16_t version;
33 	/** Length of payload */
34 	uint16_t length;
35 } __attribute__ (( packed ));
36 
37 /** TLS version 1.0 */
38 #define TLS_VERSION_TLS_1_0 0x0301
39 
40 /** TLS version 1.1 */
41 #define TLS_VERSION_TLS_1_1 0x0302
42 
43 /** Change cipher content type */
44 #define TLS_TYPE_CHANGE_CIPHER 20
45 
46 /** Alert content type */
47 #define TLS_TYPE_ALERT 21
48 
49 /** Handshake content type */
50 #define TLS_TYPE_HANDSHAKE 22
51 
52 /** Application data content type */
53 #define TLS_TYPE_DATA 23
54 
55 /* Handshake message types */
56 #define TLS_HELLO_REQUEST 0
57 #define TLS_CLIENT_HELLO 1
58 #define TLS_SERVER_HELLO 2
59 #define TLS_CERTIFICATE 11
60 #define TLS_SERVER_KEY_EXCHANGE 12
61 #define TLS_CERTIFICATE_REQUEST 13
62 #define TLS_SERVER_HELLO_DONE 14
63 #define TLS_CERTIFICATE_VERIFY 15
64 #define TLS_CLIENT_KEY_EXCHANGE 16
65 #define TLS_FINISHED 20
66 
67 /* TLS alert levels */
68 #define TLS_ALERT_WARNING 1
69 #define TLS_ALERT_FATAL 2
70 
71 /* TLS cipher specifications */
72 #define TLS_RSA_WITH_NULL_MD5 0x0001
73 #define TLS_RSA_WITH_NULL_SHA 0x0002
74 #define TLS_RSA_WITH_AES_128_CBC_SHA 0x002f
75 #define TLS_RSA_WITH_AES_256_CBC_SHA 0x0035
76 
77 /** TLS RX state machine state */
78 enum tls_rx_state {
79 	TLS_RX_HEADER = 0,
80 	TLS_RX_DATA,
81 };
82 
83 /** TLS TX state machine state */
84 enum tls_tx_state {
85 	TLS_TX_NONE = 0,
86 	TLS_TX_CLIENT_HELLO,
87 	TLS_TX_CLIENT_KEY_EXCHANGE,
88 	TLS_TX_CHANGE_CIPHER,
89 	TLS_TX_FINISHED,
90 	TLS_TX_DATA
91 };
92 
93 /** A TLS cipher specification */
94 struct tls_cipherspec {
95 	/** Public-key encryption algorithm */
96 	struct pubkey_algorithm *pubkey;
97 	/** Bulk encryption cipher algorithm */
98 	struct cipher_algorithm *cipher;
99 	/** MAC digest algorithm */
100 	struct digest_algorithm *digest;
101 	/** Key length */
102 	size_t key_len;
103 	/** Dynamically-allocated storage */
104 	void *dynamic;
105 	/** Public key encryption context */
106 	void *pubkey_ctx;
107 	/** Bulk encryption cipher context */
108 	void *cipher_ctx;
109 	/** Next bulk encryption cipher context (TX only) */
110 	void *cipher_next_ctx;
111 	/** MAC secret */
112 	void *mac_secret;
113 };
114 
115 /** TLS pre-master secret */
116 struct tls_pre_master_secret {
117 	/** TLS version */
118 	uint16_t version;
119 	/** Random data */
120 	uint8_t random[46];
121 } __attribute__ (( packed ));
122 
123 /** TLS client random data */
124 struct tls_client_random {
125 	/** GMT Unix time */
126 	uint32_t gmt_unix_time;
127 	/** Random data */
128 	uint8_t random[28];
129 } __attribute__ (( packed ));
130 
131 /** A TLS session */
132 struct tls_session {
133 	/** Reference counter */
134 	struct refcnt refcnt;
135 
136 	/** Plaintext stream */
137 	struct xfer_filter_half plainstream;
138 	/** Ciphertext stream */
139 	struct xfer_filter_half cipherstream;
140 
141 	/** Current TX cipher specification */
142 	struct tls_cipherspec tx_cipherspec;
143 	/** Next TX cipher specification */
144 	struct tls_cipherspec tx_cipherspec_pending;
145 	/** Current RX cipher specification */
146 	struct tls_cipherspec rx_cipherspec;
147 	/** Next RX cipher specification */
148 	struct tls_cipherspec rx_cipherspec_pending;
149 	/** Premaster secret */
150 	struct tls_pre_master_secret pre_master_secret;
151 	/** Master secret */
152 	uint8_t master_secret[48];
153 	/** Server random bytes */
154 	uint8_t server_random[32];
155 	/** Client random bytes */
156 	struct tls_client_random client_random;
157 	/** MD5 context for handshake verification */
158 	uint8_t handshake_md5_ctx[MD5_CTX_SIZE];
159 	/** SHA1 context for handshake verification */
160 	uint8_t handshake_sha1_ctx[SHA1_CTX_SIZE];
161 
162 	/** Hack: server RSA public key */
163 	struct x509_rsa_public_key rsa;
164 
165 	/** TX sequence number */
166 	uint64_t tx_seq;
167 	/** TX state */
168 	enum tls_tx_state tx_state;
169 	/** TX process */
170 	struct process process;
171 
172 	/** RX sequence number */
173 	uint64_t rx_seq;
174 	/** RX state */
175 	enum tls_rx_state rx_state;
176 	/** Offset within current RX state */
177 	size_t rx_rcvd;
178 	/** Current received record header */
179 	struct tls_header rx_header;
180 	/** Current received raw data buffer */
181 	void *rx_data;
182 };
183 
184 extern int add_tls ( struct xfer_interface *xfer,
185 		     struct xfer_interface **next );
186 
187 #endif /* _GPXE_TLS_H */
188