From e64e32b329a0c83b0437d7c4d70ff688df1e7b1f Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Wed, 15 Jun 2016 11:49:51 +0800 Subject: [PATCH] Fix regression in WiFiClientSecure, update HTTPS test case (#2150) --- .../ESP8266WiFi/src/WiFiClientSecure.cpp | 26 ++++++++++----- tests/device/test_http_client/server.crt | 32 +++++++++---------- .../test_http_client/test_http_client.ino | 2 +- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp index 7befc19cf..30eab400a 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp @@ -57,7 +57,6 @@ static int s_pk_refcnt = 0; uint8_t* default_certificate = 0; uint32_t default_certificate_len = 0; static bool default_certificate_dynamic = false; -static ClientContext* s_io_ctx = nullptr; static void clear_private_key(); static void clear_certificate(); @@ -82,6 +81,8 @@ public: if (_ssl_ctx_refcnt == 0) { ssl_ctx_free(_ssl_ctx); } + + s_io_ctx = nullptr; } void ref() { @@ -95,6 +96,7 @@ public: } void connect(ClientContext* ctx, const char* hostName, uint32_t timeout_ms) { + s_io_ctx = ctx; _ssl = ssl_client_new(_ssl_ctx, 0, nullptr, 0, hostName); uint32_t t = millis(); @@ -107,6 +109,10 @@ public: } } + void stop() { + s_io_ctx = nullptr; + } + bool connected() { return _ssl != nullptr && ssl_handshake_status(_ssl) == SSL_OK; } @@ -173,6 +179,10 @@ public: return _ssl; } + static ClientContext* getIOContext(int fd) { + return s_io_ctx; + } + protected: int _readAll() { if (!_ssl) @@ -201,18 +211,18 @@ protected: int _refcnt = 0; const uint8_t* _read_ptr = nullptr; size_t _available = 0; + static ClientContext* s_io_ctx; }; SSL_CTX* SSLContext::_ssl_ctx = nullptr; int SSLContext::_ssl_ctx_refcnt = 0; - +ClientContext* SSLContext::s_io_ctx = nullptr; WiFiClientSecure::WiFiClientSecure() { ++s_pk_refcnt; } WiFiClientSecure::~WiFiClientSecure() { - s_io_ctx = nullptr; if (_ssl) { _ssl->unref(); } @@ -264,8 +274,6 @@ int WiFiClientSecure::_connectSSL(const char* hostName) { _ssl = nullptr; } - s_io_ctx = _client; - _ssl = new SSLContext; _ssl->ref(); _ssl->connect(_client, hostName, 5000); @@ -371,7 +379,9 @@ uint8_t WiFiClientSecure::connected() { } void WiFiClientSecure::stop() { - s_io_ctx = nullptr; + if (_ssl) { + _ssl->stop(); + } WiFiClient::stop(); } @@ -525,7 +535,7 @@ static void clear_certificate() { } extern "C" int ax_port_read(int fd, uint8_t* buffer, size_t count) { - ClientContext* _client = s_io_ctx; + ClientContext* _client = SSLContext::getIOContext(fd); if (!_client || _client->state() != ESTABLISHED && !_client->getSize()) { errno = EIO; return -1; @@ -542,7 +552,7 @@ extern "C" int ax_port_read(int fd, uint8_t* buffer, size_t count) { } extern "C" int ax_port_write(int fd, uint8_t* buffer, size_t count) { - ClientContext* _client = s_io_ctx; + ClientContext* _client = SSLContext::getIOContext(fd); if (!_client || _client->state() != ESTABLISHED) { errno = EIO; return -1; diff --git a/tests/device/test_http_client/server.crt b/tests/device/test_http_client/server.crt index eecff0136..2e796823b 100644 --- a/tests/device/test_http_client/server.crt +++ b/tests/device/test_http_client/server.crt @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIICzzCCAbcCCQCUajf39FoF8jANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtj -YS50bHMudGVzdDAeFw0xNjA0MjIxMTU1MTlaFw0xNzA0MjIxMTU1MTlaMD0xITAf -BgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEYMBYGA1UEAwwPc2VydmVy -LnRscy50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwhyGSO13 -/ozG0rL6FxDaaxYgMyPVK3hIhTHfKOK/eRZFRDFAhYudz9NbkvUMIF1SToED9FBh -MbJrkPzCU3cLC1zgnTLseoOS3FKC8xVfJVwsWD8YjMvyQUV/Uo9TAHQSA4SfOB4W -JjRBMX2GCoWLK5wVzxX+XGd5DnqME4n/CG+Il1t8mB+ACeA1FKwVPTi1wGvDzuCo -swSEX3J08JB9rP5dix7t+Fezgr6PkvUcnAcu4utAw6f6c0LoHk0SnyXJg1jTdKrl -J8dIyWQR0cvaxbF+04hvpDepx/62CP+aRs1zcC37eEQ3BVf4phJXbwuXbT7a1CUf -XQ0cWnJg8mdfcQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBV7ZiwVM8alxPN9vd/ -Ze8EiidSuztkbtZX3mhHfkcJ2Q5c+tZ0Oxy4/g6oISe1+NOQJDMrsARrdWVPmmsb -ihSHNdS6t0DTcWR5h+i/rnGh+cGiWOJKfhNWvpCVuU6YRZWhYOztL8p6iHoG3ZBi -+zo9GD71FNSRQxMois9sR9q/IgOmkm8CjQgYsv9bQ+Le4mRqfaOCOSoQvsRyLoam -lNl85gzvVygHYPP9ypiia8btyOHwDSHiV8UhKaERSGKFqznPmTTwTQNXEtQylCXG -C+13mMGVr49yP4cuYaM8mfL8Rg7Im8Mfa0GXq5PBwEFFYpR9xnbBouQv5erYTQdl -Oxqk +MIIC3zCCAccCCQCUajf39FoF9jANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtj +YS50bHMudGVzdDAeFw0xNjA2MTUwMjQ2MzFaFw0xNzA2MTUwMjQ2MzFaME0xCzAJ +BgNVBAYTAkNOMREwDwYDVQQIDAhTaGFuZ2hhaTESMBAGA1UECgwJRXNwcmVzc2lm +MRcwFQYDVQQDDA4xOTIuMTY4Ljc3LjIwODCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMIchkjtd/6MxtKy+hcQ2msWIDMj1St4SIUx3yjiv3kWRUQxQIWL +nc/TW5L1DCBdUk6BA/RQYTGya5D8wlN3Cwtc4J0y7HqDktxSgvMVXyVcLFg/GIzL +8kFFf1KPUwB0EgOEnzgeFiY0QTF9hgqFiyucFc8V/lxneQ56jBOJ/whviJdbfJgf +gAngNRSsFT04tcBrw87gqLMEhF9ydPCQfaz+XYse7fhXs4K+j5L1HJwHLuLrQMOn ++nNC6B5NEp8lyYNY03Sq5SfHSMlkEdHL2sWxftOIb6Q3qcf+tgj/mkbNc3At+3hE +NwVX+KYSV28Ll20+2tQlH10NHFpyYPJnX3ECAwEAATANBgkqhkiG9w0BAQsFAAOC +AQEAMzNNwXnhp1OyNinGk700jRfe6zwdkpo1ZkclUD7fVEfnWxBj6j2lXReC6WT1 +isWXe/M9k+HS0fK7rTqDumeZYgp/Ui5LKgD2JTvLX91toG7apATWqLM1XPtLEGub +webPO2CW/7aRfkPlXvP4Ss/QbqawxkmUKW3kJ4Lw1mmklu9ULGfiHPPUKvY5Qbe9 +9aDC/aTrjiaDmNoToZfAWuFBnxz95bKqFdbij35ZYzyVSNpezePtdOaDBR2mOMYd +P54ENzFbOjVRm3K+7I9S+xa/lUPWnfjVJ026JDw/3/HVWvnwkZI8xNWVOk5CbdPH +7d5Md13cmF1VQ0VNDqvqI3TZ5g== -----END CERTIFICATE----- diff --git a/tests/device/test_http_client/test_http_client.ino b/tests/device/test_http_client/test_http_client.ino index 32e561371..120550575 100644 --- a/tests/device/test_http_client/test_http_client.ino +++ b/tests/device/test_http_client/test_http_client.ino @@ -19,7 +19,7 @@ void setup() BS_RUN(Serial); } -const char* fp = "40 A3 6C E3 8A DF A2 D4 13 B0 32 5C 87 44 54 28 0B CE C5 A4"; +const char* fp = "44 40 9E 34 92 2D E4 61 A4 89 A8 D5 7F 71 B7 62 B3 FD DD E1"; TEST_CASE("HTTP GET & POST requests", "[HTTPClient]") {