]>
git.ipfire.org Git - thirdparty/hostap.git/blob - tests/test-https.c
2 * Testing tool for TLSv1 client routines using HTTPS
3 * Copyright (c) 2011, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
13 #include "crypto/tls.h"
15 extern int wpa_debug_level
;
16 extern int wpa_debug_show_keys
;
19 static void https_tls_event_cb(void *ctx
, enum tls_event ev
,
20 union tls_event_data
*data
)
22 wpa_printf(MSG_DEBUG
, "HTTPS: TLS event %d", ev
);
26 static struct wpabuf
* https_recv(int s
)
33 in
= wpabuf_alloc(20000);
42 wpa_printf(MSG_DEBUG
, "Waiting for more data");
43 ret
= select(s
+ 1, &rfds
, NULL
, NULL
, &tv
);
45 wpa_printf(MSG_ERROR
, "select: %s", strerror(errno
));
51 wpa_printf(MSG_INFO
, "Timeout on waiting for data");
56 len
= recv(s
, wpabuf_put(in
, 0), wpabuf_tailroom(in
), 0);
58 wpa_printf(MSG_ERROR
, "recv: %s", strerror(errno
));
63 wpa_printf(MSG_DEBUG
, "No more data available");
67 wpa_printf(MSG_DEBUG
, "Received %d bytes", len
);
74 static int https_client(int s
, const char *path
)
76 struct tls_config conf
;
78 struct tls_connection
*conn
;
79 struct wpabuf
*in
, *out
, *appl
;
83 os_memset(&conf
, 0, sizeof(conf
));
84 conf
.event_cb
= https_tls_event_cb
;
85 tls
= tls_init(&conf
);
89 conn
= tls_connection_init(tls
);
99 out
= tls_connection_handshake2(tls
, conn
, in
, &appl
,
108 if (tls_connection_get_failed(tls
, conn
)) {
109 wpa_printf(MSG_ERROR
, "TLS handshake failed");
112 if (tls_connection_established(tls
, conn
))
114 wpa_printf(MSG_DEBUG
, "Sending %d bytes",
115 (int) wpabuf_len(out
));
116 if (send(s
, wpabuf_head(out
), wpabuf_len(out
), 0) < 0) {
117 wpa_printf(MSG_ERROR
, "send: %s", strerror(errno
));
131 wpa_printf(MSG_INFO
, "TLS connection established");
133 wpa_hexdump_buf(MSG_DEBUG
, "Received application data", appl
);
135 in
= wpabuf_alloc(100 + os_strlen(path
));
138 wpabuf_put_str(in
, "GET ");
139 wpabuf_put_str(in
, path
);
140 wpabuf_put_str(in
, " HTTP/1.0\r\n\r\n");
141 out
= tls_connection_encrypt(tls
, conn
, in
);
147 wpa_printf(MSG_INFO
, "Sending HTTP request: %d bytes",
148 (int) wpabuf_len(out
));
149 if (send(s
, wpabuf_head(out
), wpabuf_len(out
), 0) < 0) {
150 wpa_printf(MSG_ERROR
, "send: %s", strerror(errno
));
156 wpa_printf(MSG_INFO
, "Reading HTTP response");
162 out
= tls_connection_decrypt2(tls
, conn
, in
, &need_more_data
);
164 wpa_printf(MSG_DEBUG
, "HTTP: Need more data");
169 wpa_hexdump_ascii(MSG_INFO
, "Response", wpabuf_head(out
),
180 tls_connection_deinit(tls
, conn
);
187 int main(int argc
, char *argv
[])
189 struct addrinfo hints
, *result
, *rp
;
193 wpa_debug_show_keys
= 1;
196 wpa_printf(MSG_INFO
, "usage: test-https server port path");
200 os_memset(&hints
, 0, sizeof(hints
));
201 hints
.ai_family
= AF_UNSPEC
;
202 hints
.ai_socktype
= SOCK_STREAM
;
203 res
= getaddrinfo(argv
[1], argv
[2], &hints
, &result
);
205 wpa_printf(MSG_ERROR
, "getaddrinfo: %s", gai_strerror(res
));
209 for (rp
= result
; rp
; rp
= rp
->ai_next
) {
210 s
= socket(rp
->ai_family
, rp
->ai_socktype
, rp
->ai_protocol
);
213 if (connect(s
, rp
->ai_addr
, rp
->ai_addrlen
) == 0)
217 freeaddrinfo(result
);
220 wpa_printf(MSG_ERROR
, "Could not connect");
224 https_client(s
, argv
[3]);