Skip to content

Commit 6847a9c

Browse files
authored
Merge pull request #238 from iabdalkader/fix_sockets
libraries/SocketWrapper: Fix agrs and improve error handling.
2 parents f024429 + 7708097 commit 6847a9c

File tree

5 files changed

+145
-20
lines changed

5 files changed

+145
-20
lines changed

libraries/SocketWrapper/SocketWrapper.h

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ class ZephyrSocketWrapper {
3030
bool connect(const char *host, uint16_t port) {
3131

3232
// Resolve address
33-
struct addrinfo hints;
34-
struct addrinfo *res;
33+
struct addrinfo hints = {0};
34+
struct addrinfo *res = nullptr;
3535
bool rv = true;
3636

3737
hints.ai_family = AF_INET;
@@ -102,24 +102,27 @@ class ZephyrSocketWrapper {
102102
}
103103

104104
#if defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS)
105-
bool connectSSL(const char *host, uint16_t port, char *ca_certificate_pem = nullptr) {
105+
bool connectSSL(const char *host, uint16_t port, const char *ca_certificate_pem = nullptr) {
106106

107107
// Resolve address
108-
struct addrinfo hints;
109-
struct addrinfo *res;
108+
struct addrinfo hints = {0};
109+
struct addrinfo *res = nullptr;
110110

111111
hints.ai_family = AF_INET;
112112
hints.ai_socktype = SOCK_STREAM;
113113

114114
int resolve_attempts = 100;
115115
int ret;
116-
bool rv = true;
116+
bool rv = false;
117117

118118
sec_tag_t sec_tag_opt[] = {
119119
CA_CERTIFICATE_TAG,
120120
};
121121

122-
uint32_t timeo_optval = 100;
122+
struct timeval timeout_opt = {
123+
.tv_sec = 0,
124+
.tv_usec = 100000,
125+
};
123126

124127
while (resolve_attempts--) {
125128
ret = getaddrinfo(host, String(port).c_str(), &hints, &res);
@@ -132,33 +135,33 @@ class ZephyrSocketWrapper {
132135
}
133136

134137
if (ret != 0) {
135-
rv = false;
136138
goto exit;
137139
}
138140

139141
if (ca_certificate_pem != nullptr) {
140142
ret = tls_credential_add(CA_CERTIFICATE_TAG, TLS_CREDENTIAL_CA_CERTIFICATE,
141143
ca_certificate_pem, strlen(ca_certificate_pem) + 1);
144+
if (ret != 0) {
145+
goto exit;
146+
}
142147
}
143148

144149
sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TLS_1_2);
145150
if (sock_fd < 0) {
146-
rv = false;
147151
goto exit;
148152
}
149153

150-
setsockopt(sock_fd, SOL_TLS, TLS_SEC_TAG_LIST, sec_tag_opt, sizeof(sec_tag_opt));
151-
152-
setsockopt(sock_fd, SOL_TLS, TLS_HOSTNAME, host, strlen(host));
153-
154-
setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeo_optval, sizeof(timeo_optval));
154+
if (setsockopt(sock_fd, SOL_TLS, TLS_HOSTNAME, host, strlen(host)) ||
155+
setsockopt(sock_fd, SOL_TLS, TLS_SEC_TAG_LIST, sec_tag_opt, sizeof(sec_tag_opt)) ||
156+
setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeout_opt, sizeof(timeout_opt))) {
157+
goto exit;
158+
}
155159

156160
if (::connect(sock_fd, res->ai_addr, res->ai_addrlen) < 0) {
157-
::close(sock_fd);
158-
sock_fd = -1;
159-
rv = false;
160161
goto exit;
161162
}
163+
164+
rv = true;
162165
is_ssl = true;
163166

164167
exit:
@@ -167,6 +170,10 @@ class ZephyrSocketWrapper {
167170
res = nullptr;
168171
}
169172

173+
if (!rv && sock_fd >= 0) {
174+
::close(sock_fd);
175+
sock_fd = -1;
176+
}
170177
return rv;
171178
}
172179
#endif

libraries/SocketWrapper/ZephyrClient.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ class ZephyrClient : public arduino::Client, ZephyrSocketWrapper {
3232
return ret;
3333
}
3434
#if defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS)
35-
int connectSSL(const char *host, uint16_t port, char *cert) {
36-
auto ret = ZephyrSocketWrapper::connectSSL((char *)host, port, cert);
35+
int connectSSL(const char *host, uint16_t port, const char *cert) {
36+
auto ret = ZephyrSocketWrapper::connectSSL(host, port, cert);
3737
if (ret) {
3838
_connected = true;
3939
}

libraries/SocketWrapper/ZephyrSSLClient.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class ZephyrSSLClient : public ZephyrClient {
1414
return connectSSL(host, port, nullptr);
1515
}
1616

17-
int connect(const char *host, uint16_t port, char *cert) {
17+
int connect(const char *host, uint16_t port, const char *cert) {
1818
return connectSSL(host, port, cert);
1919
}
2020
};
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*
2+
Web client with single CA certificate test
3+
4+
This sketch demonstrates how to load your own TLS CA certificates
5+
and use them to establish a secure connection to a remote server,
6+
such as www.howsmyssl.com.
7+
*/
8+
9+
#include <WiFi.h>
10+
#include <ZephyrSSLClient.h>
11+
#include "arduino_secrets.h"
12+
13+
char ssid[] = SECRET_SSID;
14+
char pass[] = SECRET_PASS;
15+
16+
char server[] = "www.howsmyssl.com";
17+
int port = 443;
18+
19+
ZephyrSSLClient client;
20+
int status = WL_IDLE_STATUS;
21+
22+
// ISRG Root X1 (Let's Encrypt root CA certificate)
23+
const char isrg_root_x1[] =
24+
"-----BEGIN CERTIFICATE-----\n"
25+
"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n"
26+
"TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n"
27+
"cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n"
28+
"WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n"
29+
"ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n"
30+
"MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n"
31+
"h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n"
32+
"0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n"
33+
"A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n"
34+
"T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n"
35+
"B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n"
36+
"B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n"
37+
"KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n"
38+
"OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n"
39+
"jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n"
40+
"qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n"
41+
"rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n"
42+
"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n"
43+
"hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n"
44+
"ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n"
45+
"3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n"
46+
"NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n"
47+
"ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n"
48+
"TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n"
49+
"jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n"
50+
"oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n"
51+
"4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n"
52+
"mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n"
53+
"emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n"
54+
"-----END CERTIFICATE-----\n";
55+
56+
void setup() {
57+
Serial.begin(115200);
58+
while (!Serial) {
59+
;
60+
}
61+
62+
// Check for WiFi module
63+
if (WiFi.status() == WL_NO_SHIELD) {
64+
Serial.println("Communication with WiFi module failed!");
65+
return;
66+
}
67+
68+
// Connect to WiFi
69+
while (status != WL_CONNECTED) {
70+
Serial.print("Attempting to connect to SSID: ");
71+
Serial.println(ssid);
72+
status = WiFi.begin(ssid, pass);
73+
delay(3000);
74+
}
75+
76+
Serial.println("Connected to wifi");
77+
Serial.print("IP Address: ");
78+
Serial.println(WiFi.localIP());
79+
Serial.print("RSSI: ");
80+
Serial.println(WiFi.RSSI());
81+
82+
Serial.println("\nStarting connection to server...");
83+
84+
if (client.connect(server, port, isrg_root_x1)) {
85+
Serial.println("Connected to server!");
86+
87+
// Make HTTP request
88+
client.println("GET /a/check HTTP/1.1");
89+
client.print("Host: ");
90+
client.println(server);
91+
client.println("Connection: close");
92+
client.println();
93+
} else {
94+
Serial.println("Connection failed!");
95+
}
96+
}
97+
98+
void loop() {
99+
// if there are incoming bytes available
100+
// from the server, read them and print them:
101+
while (client.available()) {
102+
char c = client.read();
103+
Serial.write(c);
104+
}
105+
106+
// if the server's disconnected, stop the client:
107+
if (!client.connected()) {
108+
Serial.println();
109+
Serial.println("disconnecting from server.");
110+
client.stop();
111+
112+
// do nothing forevermore:
113+
while (true)
114+
;
115+
}
116+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#define SECRET_SSID ""
2+
#define SECRET_PASS ""

0 commit comments

Comments
 (0)