--- /dev/null
+// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+#include "openssl_server.h"\r
+\r
+#include <string.h>\r
+\r
+#include "openssl/ssl.h"\r
+\r
+#include "freertos/FreeRTOS.h"\r
+#include "freertos/task.h"\r
+#include "freertos/event_groups.h"\r
+\r
+#include "esp_types.h"\r
+#include "esp_log.h"\r
+#include "esp_system.h"\r
+#include "esp_wifi.h"\r
+#include "esp_event_loop.h"\r
+#include "esp_log.h"\r
+\r
+#include "nvs_flash.h"\r
+#include "tcpip_adapter.h"\r
+\r
+#include "lwip/sockets.h"\r
+#include "lwip/netdb.h"\r
+\r
+static EventGroupHandle_t wifi_event_group;\r
+\r
+/* The event group allows multiple bits for each event,\r
+ but we only care about one event - are we connected\r
+ to the AP with an IP? */\r
+const static int CONNECTED_BIT = BIT0;\r
+\r
+const static char *TAG = "Openssl_demo";\r
+\r
+#define OPENSSL_DEMO_SERVER_ACK "HTTP/1.1 200 OK\r\n" \\r
+ "Content-Type: text/html\r\n" \\r
+ "Content-Length: 98\r\n" \\r
+ "<html>\r\n" \\r
+ "<head>\r\n" \\r
+ "<title>OpenSSL demo</title></head><body>\r\n" \\r
+ "OpenSSL server demo!\r\n" \\r
+ "</body>\r\n" \\r
+ "</html>\r\n"\r
+\r
+static void openssl_demo_thread(void *p)\r
+{\r
+ int ret;\r
+\r
+ SSL_CTX *ctx;\r
+ SSL *ssl;\r
+\r
+ int socket, new_socket;\r
+ socklen_t addr_len;\r
+ struct sockaddr_in sock_addr;\r
+\r
+ char send_data[] = OPENSSL_DEMO_SERVER_ACK;\r
+ int send_bytes = sizeof(send_data);\r
+ char recv_buf[OPENSSL_DEMO_RECV_BUF_LEN];\r
+\r
+ extern const unsigned char cacert_pem_start[] asm("_binary_cacert_pem_start");\r
+ extern const unsigned char cacert_pem_end[] asm("_binary_cacert_pem_end");\r
+ const unsigned int cacert_pem_bytes = cacert_pem_end - cacert_pem_start;\r
+\r
+ extern const unsigned char prvtkey_pem_start[] asm("_binary_prvtkey_pem_start");\r
+ extern const unsigned char prvtkey_pem_end[] asm("_binary_prvtkey_pem_end");\r
+ const unsigned int prvtkey_pem_bytes = prvtkey_pem_end - prvtkey_pem_start; \r
+\r
+ ESP_LOGI(TAG, "SSL server context create ......");\r
+ ctx = SSL_CTX_new(SSLv3_server_method());\r
+ if (!ctx) {\r
+ ESP_LOGI(TAG, "failed");\r
+ goto failed1;\r
+ }\r
+ ESP_LOGI(TAG, "OK");\r
+\r
+ ESP_LOGI(TAG, "SSL server context set own certification......");\r
+ ret = SSL_CTX_use_certificate_ASN1(ctx, cacert_pem_bytes, cacert_pem_start);\r
+ if (!ret) {\r
+ ESP_LOGI(TAG, "failed");\r
+ goto failed2;\r
+ }\r
+ ESP_LOGI(TAG, "OK");\r
+\r
+ ESP_LOGI(TAG, "SSL server context set private key......");\r
+ ret = SSL_CTX_use_PrivateKey_ASN1(0, ctx, prvtkey_pem_start, prvtkey_pem_bytes);\r
+ if (!ret) {\r
+ ESP_LOGI(TAG, "failed");\r
+ goto failed2;\r
+ }\r
+ ESP_LOGI(TAG, "OK");\r
+\r
+ ESP_LOGI(TAG, "SSL server create socket ......");\r
+ socket = socket(AF_INET, SOCK_STREAM, 0);\r
+ if (socket < 0) {\r
+ ESP_LOGI(TAG, "failed");\r
+ goto failed2;\r
+ }\r
+ ESP_LOGI(TAG, "OK");\r
+\r
+ ESP_LOGI(TAG, "SSL server socket bind ......");\r
+ memset(&sock_addr, 0, sizeof(sock_addr));\r
+ sock_addr.sin_family = AF_INET;\r
+ sock_addr.sin_addr.s_addr = 0;\r
+ sock_addr.sin_port = htons(OPENSSL_DEMO_LOCAL_TCP_PORT);\r
+ ret = bind(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr));\r
+ if (ret) {\r
+ ESP_LOGI(TAG, "failed");\r
+ goto failed3;\r
+ }\r
+ ESP_LOGI(TAG, "OK");\r
+\r
+ ESP_LOGI(TAG, "SSL server socket listen ......");\r
+ ret = listen(socket, 32);\r
+ if (ret) {\r
+ ESP_LOGI(TAG, "failed");\r
+ goto failed3;\r
+ }\r
+ ESP_LOGI(TAG, "OK");\r
+\r
+reconnect:\r
+ ESP_LOGI(TAG, "SSL server create ......");\r
+ ssl = SSL_new(ctx);\r
+ if (!ssl) {\r
+ ESP_LOGI(TAG, "failed");\r
+ goto failed3;\r
+ }\r
+ ESP_LOGI(TAG, "OK");\r
+\r
+ ESP_LOGI(TAG, "SSL server socket accept client ......");\r
+ new_socket = accept(socket, (struct sockaddr *)&sock_addr, &addr_len);\r
+ if (new_socket < 0) {\r
+ ESP_LOGI(TAG, "failed" );\r
+ goto failed4;\r
+ }\r
+ ESP_LOGI(TAG, "OK");\r
+\r
+ SSL_set_fd(ssl, new_socket);\r
+\r
+ ESP_LOGI(TAG, "SSL server accept client ......");\r
+ ret = SSL_accept(ssl);\r
+ if (!ret) {\r
+ ESP_LOGI(TAG, "failed");\r
+ goto failed5;\r
+ }\r
+ ESP_LOGI(TAG, "OK");\r
+\r
+ ESP_LOGI(TAG, "SSL server read message ......");\r
+ do {\r
+ memset(recv_buf, 0, OPENSSL_DEMO_RECV_BUF_LEN);\r
+ ret = SSL_read(ssl, recv_buf, OPENSSL_DEMO_RECV_BUF_LEN - 1);\r
+ if (ret <= 0) {\r
+ break;\r
+ }\r
+ if (strstr(recv_buf, "GET / HTTP/1.1")) {\r
+ SSL_write(ssl, send_data, send_bytes);\r
+ break;\r
+ }\r
+ } while (1);\r
+ \r
+ ESP_LOGI(TAG, "result %d", ret);\r
+\r
+ SSL_shutdown(ssl);\r
+failed5:\r
+ close(new_socket);\r
+ new_socket = -1;\r
+failed4:\r
+ SSL_free(ssl);\r
+ ssl = NULL;\r
+ goto reconnect;\r
+failed3:\r
+ close(socket);\r
+ socket = -1;\r
+failed2:\r
+ SSL_CTX_free(ctx);\r
+ ctx = NULL;\r
+failed1:\r
+ vTaskDelete(NULL);\r
+ return ;\r
+} \r
+\r
+static void openssl_client_init(void)\r
+{\r
+ int ret;\r
+ xTaskHandle openssl_handle;\r
+ extern void openssl_demo_thread(void *p);\r
+\r
+ ret = xTaskCreate(openssl_demo_thread,\r
+ OPENSSL_DEMO_THREAD_NAME,\r
+ OPENSSL_DEMO_THREAD_STACK_WORDS,\r
+ NULL,\r
+ OPENSSL_DEMO_THREAD_PRORIOTY,\r
+ &openssl_handle); \r
+\r
+ if (ret != pdPASS) {\r
+ ESP_LOGI(TAG, "create thread %s failed", OPENSSL_DEMO_THREAD_NAME);\r
+ return ;\r
+ }\r
+}\r
+\r
+static esp_err_t wifi_event_handler(void *ctx, system_event_t *event)\r
+{\r
+ switch(event->event_id) {\r
+ case SYSTEM_EVENT_STA_START:\r
+ esp_wifi_connect();\r
+ break;\r
+ case SYSTEM_EVENT_STA_GOT_IP:\r
+ xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);\r
+ openssl_client_init();\r
+ break;\r
+ case SYSTEM_EVENT_STA_DISCONNECTED:\r
+ /* This is a workaround as ESP32 WiFi libs don't currently\r
+ auto-reassociate. */\r
+ esp_wifi_connect(); \r
+ xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return ESP_OK;\r
+}\r
+\r
+static void wifi_conn_init(void)\r
+{\r
+ tcpip_adapter_init();\r
+ wifi_event_group = xEventGroupCreate();\r
+ ESP_ERROR_CHECK( esp_event_loop_init(wifi_event_handler, NULL) );\r
+ wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();\r
+ ESP_ERROR_CHECK( esp_wifi_init(&cfg) );\r
+ ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );\r
+ wifi_config_t wifi_config = {\r
+ .sta = {\r
+ .ssid = EXAMPLE_WIFI_SSID,\r
+ .password = EXAMPLE_WIFI_PASS,\r
+ },\r
+ };\r
+ ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );\r
+ ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );\r
+ ESP_LOGI(TAG, "start the WIFI SSID:[%s] password:[%s]\n", EXAMPLE_WIFI_SSID, EXAMPLE_WIFI_PASS);\r
+ ESP_ERROR_CHECK( esp_wifi_start() );\r
+}\r
+\r
+void app_main(void)\r
+{\r
+ nvs_flash_init();\r
+ wifi_conn_init();\r
+}\r
--- /dev/null
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAsONI8OWiZ6kcLNvDgxSuq5ABTTFNXj82lvbuT0jlNFVOMig6
+z/mE0jYs8VZ7gJETHT1mtPwrc0U4GhLLtuE8CyMZoXEJhhZz22JfWbmCrdOhVFKZ
+tnrl8TeS+cjwT93lXLMDQ4yZZt9qiUFJMyhaCpHKcRpP7PUSHbINPNUXL16i/UN1
+AVSoYOpsfltBi9NjkXJ6btRwpYB7bJLSPcfh1W1UEo1jupXc/HTzIYCzl9AWBTCH
+IHn6rCG+R4sl2BqkZpJPAuChApYdt7+UDc2IEgH2HOcVQYqjeGaeIC9hlutByfe1
+zSX8ngjf2/Y+bb0UDKNa9DIGQaS3Parh6U5liQIDAQABAoIBAB9K9jp3xXVlO3DM
+KBhmbkg3n6NSV4eW00d9w8cO9E1/0eeZql3knJS7tNO1IwApqiIAHM1j1yP7WONz
+88oUqpSlzwD6iF7KVhC3pHqxEOdDi0Tpn/viXg+Ab2X1IF5guRTfLnKiyviiCazi
+edqtBtDb3d6Icx9Oc7gBKcpbQFDGt++wSOb5L+xhRm9B5B4l/6byikiPeKqIK5tC
+SoP9Zr1mvpNoGm1P4LvEunFJcRBqVI010VNwfO9P98oVyzJu9/FZZrQxXoY9JdXF
+OM6nbl+hMDM3TkEOda9NvBhImozEAvuc97CaaXyR3XivxMqNqNIb4+syUPa2PCS3
+ZztI5qECgYEA1gbVG6ifpvpbBkDPi3Im8fM3F7FLLrQc48FdFjdMvDhHD9lVKucD
+Uaa8PF9dbbvlu2cwMyfBOKSuWaXxRxRsiqiPmTunS1MvPzQcSrGwUrL2AogGucn6
++NrLQf5P4H5IpkDQ9ih3zwjO6xKFK1WeYnYpHM8qUBtl6q0YFyVBPu0CgYEA05Pn
+StWA4D7VSbNnVi6lvFyEOUsTrK3v419598TFiq4eXLq6aV8/CQYzKsSzoG+aOZhX
+Li+0uyT5cNzUcXYhTsW1hA/pNhMfxMrYiB1x14zlLp2WRGg4vd/+SxX6d9Yd3acX
+7QzPKgdDicXs9QN8ozJOICKvNbUI53AJdATVEY0CgYEAwvpGeoQLrdq1weSZLrg3
+soOX1QW3MDz1dKdbXjnStkWut0mOxR7fbysuoPFf8/ARQcCnsHKvHCMqkpESVWbN
+2yPkbfxiU8Tcbf/TJljqAOz4ISY6ula/RKZONTixHBrvpEW4GAiV3Q5xMsYUe33s
+ZFaw7YXtTj0ng7tdDvjpj6ECgYEApHdUU9ejVq2BHslWiqe4LbO9FMxHfvO2hgix
+xugupp6y+2Irhb2EQn+PRq+g8hXOzPaezkhHNTKItDL08T3iplkJwJ6dqmszRsZn
+i2dYFzZu8M2PAZ4CfZahFbz/9id7D9HTx3EtmH4NAgvZJpyPRkzUbiaIDDettDpj
+Hsyi1AECgYAPLvjBzQj4kPF8Zo9pQEUcz4pmupRVfv3aRfjnahDK4qZHEePDRj+J
+W7pzayrs1dyN9QLB8pTc424z7f8MB3llCICN+ohs8CR/eW0NEobE9ldDOeoCr1Vh
+NhNSbrN1iZ8U4oLkRTMaDKkVngGffvjGi/q0tOU7hJdZOqNlk2Iahg==
+-----END RSA PRIVATE KEY-----