Преглед изворни кода

[tls] Add support for Server Name Indication (SNI)

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown пре 12 година
родитељ
комит
b7f8d1bbfd
4 измењених фајлова са 39 додато и 5 уклоњено
  1. 1
    0
      src/include/ipxe/http.h
  2. 7
    1
      src/include/ipxe/tls.h
  3. 2
    1
      src/net/tcp/httpcore.c
  4. 29
    3
      src/net/tls.c

+ 1
- 0
src/include/ipxe/http.h Прегледај датотеку

18
 extern int http_open_filter ( struct interface *xfer, struct uri *uri,
18
 extern int http_open_filter ( struct interface *xfer, struct uri *uri,
19
 			      unsigned int default_port,
19
 			      unsigned int default_port,
20
 			      int ( * filter ) ( struct interface *,
20
 			      int ( * filter ) ( struct interface *,
21
+						 const char *,
21
 						 struct interface ** ) );
22
 						 struct interface ** ) );
22
 
23
 
23
 #endif /* _IPXE_HTTP_H */
24
 #endif /* _IPXE_HTTP_H */

+ 7
- 1
src/include/ipxe/tls.h Прегледај датотеку

74
 #define TLS_RSA_WITH_AES_128_CBC_SHA 0x002f
74
 #define TLS_RSA_WITH_AES_128_CBC_SHA 0x002f
75
 #define TLS_RSA_WITH_AES_256_CBC_SHA 0x0035
75
 #define TLS_RSA_WITH_AES_256_CBC_SHA 0x0035
76
 
76
 
77
+/* TLS extension types */
78
+#define TLS_SERVER_NAME 0
79
+#define TLS_SERVER_NAME_HOST_NAME 0
80
+
77
 /** TLS RX state machine state */
81
 /** TLS RX state machine state */
78
 enum tls_rx_state {
82
 enum tls_rx_state {
79
 	TLS_RX_HEADER = 0,
83
 	TLS_RX_HEADER = 0,
133
 	/** Reference counter */
137
 	/** Reference counter */
134
 	struct refcnt refcnt;
138
 	struct refcnt refcnt;
135
 
139
 
140
+	/** Server name */
141
+	const char *name;
136
 	/** Plaintext stream */
142
 	/** Plaintext stream */
137
 	struct interface plainstream;
143
 	struct interface plainstream;
138
 	/** Ciphertext stream */
144
 	/** Ciphertext stream */
183
 	void *rx_data;
189
 	void *rx_data;
184
 };
190
 };
185
 
191
 
186
-extern int add_tls ( struct interface *xfer,
192
+extern int add_tls ( struct interface *xfer, const char *name,
187
 		     struct interface **next );
193
 		     struct interface **next );
188
 
194
 
189
 #endif /* _IPXE_TLS_H */
195
 #endif /* _IPXE_TLS_H */

+ 2
- 1
src/net/tcp/httpcore.c Прегледај датотеку

838
 int http_open_filter ( struct interface *xfer, struct uri *uri,
838
 int http_open_filter ( struct interface *xfer, struct uri *uri,
839
 		       unsigned int default_port,
839
 		       unsigned int default_port,
840
 		       int ( * filter ) ( struct interface *xfer,
840
 		       int ( * filter ) ( struct interface *xfer,
841
+					  const char *name,
841
 					  struct interface **next ) ) {
842
 					  struct interface **next ) ) {
842
 	struct http_request *http;
843
 	struct http_request *http;
843
 	struct sockaddr_tcpip server;
844
 	struct sockaddr_tcpip server;
865
 	server.st_port = htons ( uri_port ( http->uri, default_port ) );
866
 	server.st_port = htons ( uri_port ( http->uri, default_port ) );
866
 	socket = &http->socket;
867
 	socket = &http->socket;
867
 	if ( filter ) {
868
 	if ( filter ) {
868
-		if ( ( rc = filter ( socket, &socket ) ) != 0 )
869
+		if ( ( rc = filter ( socket, uri->host, &socket ) ) != 0 )
869
 			goto err;
870
 			goto err;
870
 	}
871
 	}
871
 	if ( ( rc = xfer_open_named_socket ( socket, SOCK_STREAM,
872
 	if ( ( rc = xfer_open_named_socket ( socket, SOCK_STREAM,

+ 29
- 3
src/net/tls.c Прегледај датотеку

691
 		uint16_t cipher_suites[2];
691
 		uint16_t cipher_suites[2];
692
 		uint8_t compression_methods_len;
692
 		uint8_t compression_methods_len;
693
 		uint8_t compression_methods[1];
693
 		uint8_t compression_methods[1];
694
+		uint16_t extensions_len;
695
+		struct {
696
+			uint16_t server_name_type;
697
+			uint16_t server_name_len;
698
+			struct {
699
+				uint16_t len;
700
+				struct {
701
+					uint8_t type;
702
+					uint16_t len;
703
+					uint8_t name[ strlen ( tls->name ) ];
704
+				} __attribute__ (( packed )) list[1];
705
+			} __attribute__ (( packed )) server_name;
706
+		} __attribute__ (( packed )) extensions;
694
 	} __attribute__ (( packed )) hello;
707
 	} __attribute__ (( packed )) hello;
695
 
708
 
696
 	memset ( &hello, 0, sizeof ( hello ) );
709
 	memset ( &hello, 0, sizeof ( hello ) );
703
 	hello.cipher_suites[0] = htons ( TLS_RSA_WITH_AES_128_CBC_SHA );
716
 	hello.cipher_suites[0] = htons ( TLS_RSA_WITH_AES_128_CBC_SHA );
704
 	hello.cipher_suites[1] = htons ( TLS_RSA_WITH_AES_256_CBC_SHA );
717
 	hello.cipher_suites[1] = htons ( TLS_RSA_WITH_AES_256_CBC_SHA );
705
 	hello.compression_methods_len = sizeof ( hello.compression_methods );
718
 	hello.compression_methods_len = sizeof ( hello.compression_methods );
719
+	hello.extensions_len = htons ( sizeof ( hello.extensions ) );
720
+	hello.extensions.server_name_type = htons ( TLS_SERVER_NAME );
721
+	hello.extensions.server_name_len
722
+		= htons ( sizeof ( hello.extensions.server_name ) );
723
+	hello.extensions.server_name.len
724
+		= htons ( sizeof ( hello.extensions.server_name.list ) );
725
+	hello.extensions.server_name.list[0].type = TLS_SERVER_NAME_HOST_NAME;
726
+	hello.extensions.server_name.list[0].len
727
+		= htons ( sizeof ( hello.extensions.server_name.list[0].name ));
728
+	memcpy ( hello.extensions.server_name.list[0].name, tls->name,
729
+		 sizeof ( hello.extensions.server_name.list[0].name ) );
706
 
730
 
707
 	return tls_send_handshake ( tls, &hello, sizeof ( hello ) );
731
 	return tls_send_handshake ( tls, &hello, sizeof ( hello ) );
708
 }
732
 }
881
 	int rc;
905
 	int rc;
882
 
906
 
883
 	/* Sanity check */
907
 	/* Sanity check */
884
-	if ( end != ( data + len ) ) {
885
-		DBGC ( tls, "TLS %p received overlength Server Hello\n", tls );
908
+	if ( end > ( data + len ) ) {
909
+		DBGC ( tls, "TLS %p received underlength Server Hello\n", tls );
886
 		DBGC_HD ( tls, data, len );
910
 		DBGC_HD ( tls, data, len );
887
 		return -EINVAL;
911
 		return -EINVAL;
888
 	}
912
 	}
1805
  ******************************************************************************
1829
  ******************************************************************************
1806
  */
1830
  */
1807
 
1831
 
1808
-int add_tls ( struct interface *xfer, struct interface **next ) {
1832
+int add_tls ( struct interface *xfer, const char *name,
1833
+	      struct interface **next ) {
1809
 	struct tls_session *tls;
1834
 	struct tls_session *tls;
1810
 	int rc;
1835
 	int rc;
1811
 
1836
 
1817
 	}
1842
 	}
1818
 	memset ( tls, 0, sizeof ( *tls ) );
1843
 	memset ( tls, 0, sizeof ( *tls ) );
1819
 	ref_init ( &tls->refcnt, free_tls );
1844
 	ref_init ( &tls->refcnt, free_tls );
1845
+	tls->name = name;
1820
 	intf_init ( &tls->plainstream, &tls_plainstream_desc, &tls->refcnt );
1846
 	intf_init ( &tls->plainstream, &tls_plainstream_desc, &tls->refcnt );
1821
 	intf_init ( &tls->cipherstream, &tls_cipherstream_desc, &tls->refcnt );
1847
 	intf_init ( &tls->cipherstream, &tls_cipherstream_desc, &tls->refcnt );
1822
 	tls->version = TLS_VERSION_TLS_1_1;
1848
 	tls->version = TLS_VERSION_TLS_1_1;

Loading…
Откажи
Сачувај