mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-19 23:22:16 +03:00
Merge branch 'master' into wifi_mesh_update_2.2
This commit is contained in:
commit
595fb23128
@ -23,10 +23,9 @@
|
|||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <bearssl/bearssl.h>
|
|
||||||
#include "Crypto.h"
|
#include "Crypto.h"
|
||||||
#include <TypeConversion.h>
|
#include <TypeConversion.h>
|
||||||
|
#include <bearssl/bearssl.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
namespace TypeCast = experimental::TypeConversion;
|
namespace TypeCast = experimental::TypeConversion;
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#define __ESP8266_ARDUINO_CRYPTO_H__
|
#define __ESP8266_ARDUINO_CRYPTO_H__
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
#include <bearssl/bearssl_kdf.h>
|
||||||
|
|
||||||
namespace experimental
|
namespace experimental
|
||||||
{
|
{
|
||||||
@ -745,8 +746,7 @@ struct HKDF
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// Use an opaque type to avoid #include <bearssl/bearssl.h> which drags the lib declarations into userland. The global scope prefix is required for compilation to succeed, it seems.
|
br_hkdf_context hkdfContext;
|
||||||
::br_hkdf_context hkdfContext;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,82 @@
|
|||||||
|
/**
|
||||||
|
reuseConnectionV2.ino
|
||||||
|
|
||||||
|
Created on: 22.11.2015
|
||||||
|
|
||||||
|
This example reuses the http connection and also restores the connection if the connection is lost
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#include <ESP8266WiFiMulti.h>
|
||||||
|
#include <ESP8266HTTPClient.h>
|
||||||
|
|
||||||
|
#ifndef STASSID
|
||||||
|
#define STASSID "your-ssid"
|
||||||
|
#define STAPSK "your-password"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ESP8266WiFiMulti WiFiMulti;
|
||||||
|
|
||||||
|
HTTPClient http;
|
||||||
|
WiFiClient client;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
Serial.begin(115200);
|
||||||
|
// Serial.setDebugOutput(true);
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
Serial.println();
|
||||||
|
Serial.println("Connecting to WiFi...");
|
||||||
|
|
||||||
|
WiFi.mode(WIFI_STA);
|
||||||
|
WiFiMulti.addAP(STASSID, STAPSK);
|
||||||
|
|
||||||
|
// wait for WiFi connection
|
||||||
|
while ((WiFiMulti.run() != WL_CONNECTED)) {
|
||||||
|
Serial.write('.');
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
Serial.println(" connected to WiFi");
|
||||||
|
|
||||||
|
// allow reuse (if server supports it)
|
||||||
|
http.setReuse(true);
|
||||||
|
|
||||||
|
|
||||||
|
http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html");
|
||||||
|
//http.begin(client, "jigsaw.w3.org", 80, "/HTTP/connection.html");
|
||||||
|
}
|
||||||
|
|
||||||
|
int pass = 0;
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// First 10 loop()s, retrieve the URL
|
||||||
|
if (pass < 10) {
|
||||||
|
pass++;
|
||||||
|
Serial.printf("Reuse connection example, GET url for the %d time\n", pass);
|
||||||
|
int httpCode = http.GET();
|
||||||
|
if (httpCode > 0) {
|
||||||
|
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
|
||||||
|
|
||||||
|
// file found at server
|
||||||
|
if (httpCode == HTTP_CODE_OK) {
|
||||||
|
http.writeToStream(&Serial);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
|
||||||
|
// Something went wrong with the connection, try to reconnect
|
||||||
|
http.end();
|
||||||
|
http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html");
|
||||||
|
//http.begin(client, "jigsaw.w3.org", 80, "/HTTP/connection.html");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pass == 10) {
|
||||||
|
http.end();
|
||||||
|
Serial.println("Done testing");
|
||||||
|
} else {
|
||||||
|
Serial.println("\n\n\nWait 5 second...\n");
|
||||||
|
delay(5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -457,6 +457,10 @@ void HTTPClient::disconnect(bool preserveClient)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (!preserveClient && _client) { // Also destroy _client if not connected()
|
||||||
|
_client = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
DEBUG_HTTPCLIENT("[HTTP-Client][end] tcp is closed\n");
|
DEBUG_HTTPCLIENT("[HTTP-Client][end] tcp is closed\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -970,7 +974,9 @@ int HTTPClient::writeToStream(Stream * stream)
|
|||||||
return returnError(HTTPC_ERROR_NO_STREAM);
|
return returnError(HTTPC_ERROR_NO_STREAM);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!connected()) {
|
// Only return error if not connected and no data available, because otherwise ::getString() will return an error instead of an empty
|
||||||
|
// string when the server returned a http code 204 (no content)
|
||||||
|
if(!connected() && _transferEncoding != HTTPC_TE_IDENTITY && _size > 0) {
|
||||||
return returnError(HTTPC_ERROR_NOT_CONNECTED);
|
return returnError(HTTPC_ERROR_NOT_CONNECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -979,11 +985,13 @@ int HTTPClient::writeToStream(Stream * stream)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if(_transferEncoding == HTTPC_TE_IDENTITY) {
|
if(_transferEncoding == HTTPC_TE_IDENTITY) {
|
||||||
ret = writeToStreamDataBlock(stream, len);
|
if(len > 0) {
|
||||||
|
ret = writeToStreamDataBlock(stream, len);
|
||||||
|
|
||||||
// have we an error?
|
// have we an error?
|
||||||
if(ret < 0) {
|
if(ret < 0) {
|
||||||
return returnError(ret);
|
return returnError(ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if(_transferEncoding == HTTPC_TE_CHUNKED) {
|
} else if(_transferEncoding == HTTPC_TE_CHUNKED) {
|
||||||
int size = 0;
|
int size = 0;
|
||||||
@ -1198,12 +1206,8 @@ bool HTTPClient::hasHeader(const char* name)
|
|||||||
*/
|
*/
|
||||||
bool HTTPClient::connect(void)
|
bool HTTPClient::connect(void)
|
||||||
{
|
{
|
||||||
if(connected()) {
|
if(_reuse && _canReuse && connected()) {
|
||||||
if(_reuse) {
|
DEBUG_HTTPCLIENT("[HTTP-Client] connect: already connected, reusing connection\n");
|
||||||
DEBUG_HTTPCLIENT("[HTTP-Client] connect: already connected, reusing connection\n");
|
|
||||||
} else {
|
|
||||||
DEBUG_HTTPCLIENT("[HTTP-Client] connect: already connected, try reuse!\n");
|
|
||||||
}
|
|
||||||
while(_client->available() > 0) {
|
while(_client->available() > 0) {
|
||||||
_client->read();
|
_client->read();
|
||||||
}
|
}
|
||||||
@ -1334,6 +1338,7 @@ int HTTPClient::handleHeaderResponse()
|
|||||||
while(connected()) {
|
while(connected()) {
|
||||||
size_t len = _client->available();
|
size_t len = _client->available();
|
||||||
if(len > 0) {
|
if(len > 0) {
|
||||||
|
int headerSeparator = -1;
|
||||||
String headerLine = _client->readStringUntil('\n');
|
String headerLine = _client->readStringUntil('\n');
|
||||||
|
|
||||||
lastDataTime = millis();
|
lastDataTime = millis();
|
||||||
@ -1341,15 +1346,13 @@ int HTTPClient::handleHeaderResponse()
|
|||||||
DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] RX: '%s'\n", headerLine.c_str());
|
DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] RX: '%s'\n", headerLine.c_str());
|
||||||
|
|
||||||
if (headerLine.startsWith(F("HTTP/1."))) {
|
if (headerLine.startsWith(F("HTTP/1."))) {
|
||||||
if (_canReuse) {
|
|
||||||
_canReuse = (headerLine[sizeof "HTTP/1." - 1] != '0');
|
|
||||||
}
|
|
||||||
_returnCode = headerLine.substring(9, headerLine.indexOf(' ', 9)).toInt();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int headerSeparator = headerLine.indexOf(':');
|
constexpr auto httpVersionIdx = sizeof "HTTP/1." - 1;
|
||||||
if (headerSeparator > 0) {
|
_canReuse = _canReuse && (headerLine[httpVersionIdx] != '0');
|
||||||
|
_returnCode = headerLine.substring(httpVersionIdx + 2, headerLine.indexOf(' ', httpVersionIdx + 2)).toInt();
|
||||||
|
_canReuse = _canReuse && (_returnCode > 0) && (_returnCode < 500);
|
||||||
|
|
||||||
|
} else if ((headerSeparator = headerLine.indexOf(':')) > 0) {
|
||||||
String headerName = headerLine.substring(0, headerSeparator);
|
String headerName = headerLine.substring(0, headerSeparator);
|
||||||
String headerValue = headerLine.substring(headerSeparator + 1);
|
String headerValue = headerLine.substring(headerSeparator + 1);
|
||||||
headerValue.trim();
|
headerValue.trim();
|
||||||
|
@ -0,0 +1,223 @@
|
|||||||
|
/* Multi-client Server Sent Event (aka EventSource) demo
|
||||||
|
Run demo as follows:
|
||||||
|
1. set SSID, password and ports, compile and run program
|
||||||
|
you should see (random) updates of sensors A and B
|
||||||
|
|
||||||
|
2. on the client(s), register it for the event bus using a REST API call: curl -sS "http://<your ESP IP>:<your port>/rest/events/subscribe"
|
||||||
|
on both server and client, you should now see that your client is registered
|
||||||
|
the server sends back the location of the event bus (channel) to the client:
|
||||||
|
subscription for client IP <your client's IP address>: event bus location: http://<your ESP IP>:<your port>/rest/events/<channel>
|
||||||
|
|
||||||
|
you will also see that the sensors are ready to broadcast state changes, but the client is not yet listening:
|
||||||
|
SSEBroadcastState - client <your client IP>> registered but not listening
|
||||||
|
|
||||||
|
3. on the client(s), start listening for events with: curl -sS "http://<your ESP IP>:<your port>/rest/events/<channel>"
|
||||||
|
if all is well, the following is being displayed on the ESP console
|
||||||
|
SSEHandler - registered client with IP <your client IP address> is listening...
|
||||||
|
broadcast status change to client IP <your client IP>> for sensor[A|B] with new state <some number>>
|
||||||
|
every minute you will see on the ESP: SSEKeepAlive - client is still connected
|
||||||
|
|
||||||
|
on the client, you should see the SSE messages coming in:
|
||||||
|
event: event
|
||||||
|
data: { "TYPE":"KEEP-ALIVE" }
|
||||||
|
event: event
|
||||||
|
data: { "TYPE":"STATE", "sensorB": {"state" : 12408, "prevState": 13502} }
|
||||||
|
event: event
|
||||||
|
data: { "TYPE":"STATE", "sensorA": {"state" : 17664, "prevState": 49362} }
|
||||||
|
|
||||||
|
4. on the client, stop listening by hitting control-C
|
||||||
|
on the ESP, after maximum one minute, the following message is displayed: SSEKeepAlive - client no longer connected, remove subscription
|
||||||
|
if you start listening again after the time expired, the "/rest/events" handle becomes stale and "Handle not found" is returned
|
||||||
|
you can also try to start listening again before the KeepAliver timer expires or simply register your client again
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "c_types.h"
|
||||||
|
}
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#include <WiFiClient.h>
|
||||||
|
#include <ESP8266WebServer.h>
|
||||||
|
#include <ESP8266mDNS.h>
|
||||||
|
#include <Ticker.h>
|
||||||
|
|
||||||
|
#ifndef STASSID
|
||||||
|
#define STASSID "your-ssid"
|
||||||
|
#define STAPSK "your-password"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const char* ssid = STASSID;
|
||||||
|
const char* password = STAPSK;
|
||||||
|
const unsigned int port = 80;
|
||||||
|
|
||||||
|
ESP8266WebServer server(port);
|
||||||
|
|
||||||
|
#define SSE_MAX_CHANNELS 8 // in this simplified example, only eight SSE clients subscription allowed
|
||||||
|
struct SSESubscription {
|
||||||
|
IPAddress clientIP;
|
||||||
|
WiFiClient client;
|
||||||
|
Ticker keepAliveTimer;
|
||||||
|
} subscription[SSE_MAX_CHANNELS];
|
||||||
|
uint8_t subscriptionCount = 0;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char *name;
|
||||||
|
unsigned short value;
|
||||||
|
Ticker update;
|
||||||
|
} sensorType;
|
||||||
|
sensorType sensor[2];
|
||||||
|
|
||||||
|
void handleNotFound() {
|
||||||
|
Serial.println(F("Handle not found"));
|
||||||
|
String message = "Handle Not Found\n\n";
|
||||||
|
message += "URI: ";
|
||||||
|
message += server.uri();
|
||||||
|
message += "\nMethod: ";
|
||||||
|
message += (server.method() == HTTP_GET) ? "GET" : "POST";
|
||||||
|
message += "\nArguments: ";
|
||||||
|
message += server.args();
|
||||||
|
message += "\n";
|
||||||
|
for (uint8_t i = 0; i < server.args(); i++) {
|
||||||
|
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
|
||||||
|
}
|
||||||
|
server.send(404, "text/plain", message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSEKeepAlive() {
|
||||||
|
for (uint8_t i = 0; i < SSE_MAX_CHANNELS; i++) {
|
||||||
|
if (!(subscription[i].clientIP)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (subscription[i].client.connected()) {
|
||||||
|
Serial.printf_P(PSTR("SSEKeepAlive - client is still listening on channel %d\n"), i);
|
||||||
|
subscription[i].client.println(F("event: event\ndata: { \"TYPE\":\"KEEP-ALIVE\" }\n")); // Extra newline required by SSE standard
|
||||||
|
} else {
|
||||||
|
Serial.printf_P(PSTR("SSEKeepAlive - client not listening on channel %d, remove subscription\n"), i);
|
||||||
|
subscription[i].keepAliveTimer.detach();
|
||||||
|
subscription[i].client.flush();
|
||||||
|
subscription[i].client.stop();
|
||||||
|
subscription[i].clientIP = INADDR_NONE;
|
||||||
|
subscriptionCount--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SSEHandler handles the client connection to the event bus (client event listener)
|
||||||
|
// every 60 seconds it sends a keep alive event via Ticker
|
||||||
|
void SSEHandler(uint8_t channel) {
|
||||||
|
WiFiClient client = server.client();
|
||||||
|
SSESubscription &s = subscription[channel];
|
||||||
|
if (s.clientIP != client.remoteIP()) { // IP addresses don't match, reject this client
|
||||||
|
Serial.printf_P(PSTR("SSEHandler - unregistered client with IP %s tries to listen\n"), server.client().remoteIP().toString().c_str());
|
||||||
|
return handleNotFound();
|
||||||
|
}
|
||||||
|
client.setNoDelay(true);
|
||||||
|
client.setSync(true);
|
||||||
|
Serial.printf_P(PSTR("SSEHandler - registered client with IP %s is listening\n"), IPAddress(s.clientIP).toString().c_str());
|
||||||
|
s.client = client; // capture SSE server client connection
|
||||||
|
server.setContentLength(CONTENT_LENGTH_UNKNOWN); // the payload can go on forever
|
||||||
|
server.sendContent_P(PSTR("HTTP/1.1 200 OK\nContent-Type: text/event-stream;\nConnection: keep-alive\nCache-Control: no-cache\nAccess-Control-Allow-Origin: *\n\n"));
|
||||||
|
s.keepAliveTimer.attach_scheduled(30.0, SSEKeepAlive); // Refresh time every 30s for demo
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleAll() {
|
||||||
|
const char *uri = server.uri().c_str();
|
||||||
|
const char *restEvents = PSTR("/rest/events/");
|
||||||
|
if (strncmp_P(uri, restEvents, strlen_P(restEvents))) {
|
||||||
|
return handleNotFound();
|
||||||
|
}
|
||||||
|
uri += strlen_P(restEvents); // Skip the "/rest/events/" and get to the channel number
|
||||||
|
unsigned int channel = atoi(uri);
|
||||||
|
if (channel < SSE_MAX_CHANNELS) {
|
||||||
|
return SSEHandler(channel);
|
||||||
|
}
|
||||||
|
handleNotFound();
|
||||||
|
};
|
||||||
|
|
||||||
|
void SSEBroadcastState(const char *sensorName, unsigned short prevSensorValue, unsigned short sensorValue) {
|
||||||
|
for (uint8_t i = 0; i < SSE_MAX_CHANNELS; i++) {
|
||||||
|
if (!(subscription[i].clientIP)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String IPaddrstr = IPAddress(subscription[i].clientIP).toString();
|
||||||
|
if (subscription[i].client.connected()) {
|
||||||
|
Serial.printf_P(PSTR("broadcast status change to client IP %s on channel %d for %s with new state %d\n"),
|
||||||
|
IPaddrstr.c_str(), i, sensorName, sensorValue);
|
||||||
|
subscription[i].client.printf_P(PSTR("event: event\ndata: {\"TYPE\":\"STATE\", \"%s\":{\"state\":%d, \"prevState\":%d}}\n\n"),
|
||||||
|
sensorName, sensorValue, prevSensorValue);
|
||||||
|
} else {
|
||||||
|
Serial.printf_P(PSTR("SSEBroadcastState - client %s registered on channel %d but not listening\n"), IPaddrstr.c_str(), i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simulate sensors
|
||||||
|
void updateSensor(sensorType &sensor) {
|
||||||
|
unsigned short newVal = (unsigned short)RANDOM_REG32; // (not so good) random value for the sensor
|
||||||
|
Serial.printf_P(PSTR("update sensor %s - previous state: %d, new state: %d\n"), sensor.name, sensor.value, newVal);
|
||||||
|
if (sensor.value != newVal) {
|
||||||
|
SSEBroadcastState(sensor.name, sensor.value, newVal); // only broadcast if state is different
|
||||||
|
}
|
||||||
|
sensor.value = newVal;
|
||||||
|
sensor.update.once(rand() % 20 + 10, std::bind(updateSensor, sensor)); // randomly update sensor
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleSubscribe() {
|
||||||
|
if (subscriptionCount == SSE_MAX_CHANNELS - 1) {
|
||||||
|
return handleNotFound(); // We ran out of channels
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t channel;
|
||||||
|
IPAddress clientIP = server.client().remoteIP(); // get IP address of client
|
||||||
|
String SSEurl = F("http://");
|
||||||
|
SSEurl += WiFi.localIP().toString();
|
||||||
|
SSEurl += F(":");
|
||||||
|
SSEurl += port;
|
||||||
|
size_t offset = SSEurl.length();
|
||||||
|
SSEurl += F("/rest/events/");
|
||||||
|
|
||||||
|
++subscriptionCount;
|
||||||
|
for (channel = 0; channel < SSE_MAX_CHANNELS; channel++) // Find first free slot
|
||||||
|
if (!subscription[channel].clientIP) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
subscription[channel] = {clientIP, server.client(), Ticker()};
|
||||||
|
SSEurl += channel;
|
||||||
|
Serial.printf_P(PSTR("Allocated channel %d, on uri %s\n"), channel, SSEurl.substring(offset).c_str());
|
||||||
|
//server.on(SSEurl.substring(offset), std::bind(SSEHandler, &(subscription[channel])));
|
||||||
|
Serial.printf_P(PSTR("subscription for client IP %s: event bus location: %s\n"), clientIP.toString().c_str(), SSEurl.c_str());
|
||||||
|
server.send_P(200, "text/plain", SSEurl.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void startServers() {
|
||||||
|
server.on(F("/rest/events/subscribe"), handleSubscribe);
|
||||||
|
server.onNotFound(handleAll);
|
||||||
|
server.begin();
|
||||||
|
Serial.println("HTTP server and SSE EventSource started");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
Serial.begin(115200);
|
||||||
|
WiFi.mode(WIFI_STA);
|
||||||
|
WiFi.begin(ssid, password);
|
||||||
|
Serial.println("");
|
||||||
|
while (WiFi.status() != WL_CONNECTED) { // Wait for connection
|
||||||
|
delay(500);
|
||||||
|
Serial.print(".");
|
||||||
|
}
|
||||||
|
Serial.printf_P(PSTR("\nConnected to %s with IP address: %s\n"), ssid, WiFi.localIP().toString().c_str());
|
||||||
|
if (MDNS.begin("esp8266")) {
|
||||||
|
Serial.println("MDNS responder started");
|
||||||
|
}
|
||||||
|
|
||||||
|
startServers(); // start web and SSE servers
|
||||||
|
sensor[0].name = "sensorA";
|
||||||
|
sensor[1].name = "sensorB";
|
||||||
|
updateSensor(sensor[0]);
|
||||||
|
updateSensor(sensor[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
server.handleClient();
|
||||||
|
MDNS.update();
|
||||||
|
yield();
|
||||||
|
}
|
@ -24,6 +24,7 @@
|
|||||||
#define _BEARSSLHELPERS_H
|
#define _BEARSSLHELPERS_H
|
||||||
|
|
||||||
#include <bearssl/bearssl.h>
|
#include <bearssl/bearssl.h>
|
||||||
|
#include <StackThunk.h>
|
||||||
#include <Updater.h>
|
#include <Updater.h>
|
||||||
|
|
||||||
// Internal opaque structures, not needed by user applications
|
// Internal opaque structures, not needed by user applications
|
||||||
@ -157,7 +158,8 @@ class SigningVerifier : public UpdaterVerifyClass {
|
|||||||
virtual bool verify(UpdaterHashClass *hash, const void *signature, uint32_t signatureLen) override;
|
virtual bool verify(UpdaterHashClass *hash, const void *signature, uint32_t signatureLen) override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SigningVerifier(PublicKey *pubKey) { _pubKey = pubKey; }
|
SigningVerifier(PublicKey *pubKey) { _pubKey = pubKey; stack_thunk_add_ref(); }
|
||||||
|
~SigningVerifier() { stack_thunk_del_ref(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PublicKey *_pubKey;
|
PublicKey *_pubKey;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user