connect_test.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #define ESP_OPENSSL_SUPPRESS_LEGACY_WARNING
  2. #include <sys/socket.h>
  3. #include <unistd.h>
  4. #include <netdb.h>
  5. #include <openssl/ssl.h>
  6. #include "esp_log.h"
  7. static const char *TAG = "OPENSSL_TEST";
  8. static int open_connection(const char *host, const int port)
  9. {
  10. struct sockaddr_in addr;
  11. struct hostent *h;
  12. int sd;
  13. if ((h = gethostbyname(host)) == NULL) {
  14. ESP_LOGI(TAG, "Failed to get host name %s", host);
  15. return -1;
  16. }
  17. sd = socket(AF_INET, SOCK_STREAM, 0);
  18. bzero(&addr, sizeof(addr));
  19. addr.sin_family = AF_INET;
  20. addr.sin_port = htons(port);
  21. addr.sin_addr.s_addr = *(long*)(h->h_addr);
  22. if (connect(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
  23. return -1;
  24. }
  25. return sd;
  26. }
  27. static SSL_CTX* init_ctx(const char *test_case)
  28. {
  29. extern const unsigned char cacert_pem_start[] asm("_binary_ca_crt_start");
  30. extern const unsigned char cacert_pem_end[] asm("_binary_ca_crt_end");
  31. const unsigned int cacert_pem_bytes = cacert_pem_end - cacert_pem_start;
  32. const SSL_METHOD *method = NULL;
  33. SSL_CTX *ctx = NULL;
  34. if (strcmp(test_case, "CONFIG_TLSV1_1_CONNECT_WRONG_CERT_VERIFY_NONE") == 0) {
  35. method = TLSv1_1_client_method();
  36. ctx = SSL_CTX_new(method); /* Create new context */
  37. SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
  38. } else if (strcmp(test_case, "CONFIG_TLSV1_1_CONNECT_WRONG_CERT_VERIFY_PEER") == 0) {
  39. method = TLSv1_1_client_method();
  40. ctx = SSL_CTX_new(method); /* Create new context */
  41. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
  42. } else if (strcmp(test_case, "CONFIG_TLSV1_2_CONNECT_WRONG_CERT_VERIFY_NONE") == 0) {
  43. method = TLSv1_2_client_method();
  44. ctx = SSL_CTX_new(method); /* Create new context */
  45. SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
  46. } else if (strcmp(test_case, "CONFIG_TLSV1_2_CONNECT_WRONG_CERT_VERIFY_PEER") == 0) {
  47. method = TLSv1_2_client_method();
  48. ctx = SSL_CTX_new(method); /* Create new context */
  49. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
  50. }
  51. X509 *x = d2i_X509(NULL, cacert_pem_start, cacert_pem_bytes);
  52. if(!x) {
  53. ESP_LOGI(TAG, "Loading certs failed");
  54. goto failed;
  55. }
  56. SSL_CTX_add_client_CA(ctx, x);
  57. return ctx;
  58. failed:
  59. return NULL;
  60. }
  61. static void start_test(const char *host, const int port, const char *test_case)
  62. {
  63. SSL_CTX *ctx = NULL;
  64. SSL *ssl = NULL;
  65. int sockfd;
  66. int ret;
  67. ESP_LOGI(TAG, "Test %s started", test_case);
  68. ctx = init_ctx(test_case);
  69. if (!ctx) {
  70. ESP_LOGI(TAG, "Failed");
  71. goto failed1;
  72. }
  73. ESP_LOGI(TAG, "Trying connect to %s port %d test case %s ...", host, port, test_case);
  74. sockfd = open_connection(host, port);
  75. if(sockfd < 0) {
  76. ESP_LOGI(TAG,"Failed");
  77. goto failed1;
  78. }
  79. ESP_LOGI(TAG, "OK");
  80. ESP_LOGI(TAG, "Create SSL obj");
  81. ssl = SSL_new(ctx);
  82. if (!ssl) {
  83. ESP_LOGI(TAG,"Failed");
  84. goto failed2;
  85. }
  86. ESP_LOGI(TAG, "OK");
  87. SSL_set_fd(ssl, sockfd);
  88. ESP_LOGI(TAG, "SSL verify mode = %d connected to %s port %d ...", SSL_CTX_get_verify_mode(ctx),
  89. host, port);
  90. ret = SSL_connect(ssl);
  91. ESP_LOGI(TAG, "OK");
  92. if (ret <= 0) {
  93. ESP_LOGI(TAG,"SSL Connection Failed");
  94. goto failed3;
  95. }
  96. ESP_LOGI(TAG,"SSL Connection Succeed");
  97. failed3:
  98. SSL_free(ssl);
  99. ssl = NULL;
  100. failed2:
  101. close(sockfd);
  102. sockfd = -1;
  103. failed1:
  104. SSL_CTX_free(ctx);
  105. ctx = NULL;
  106. }
  107. static void scan(char *s, char **test_type, char **host, int *p, char **test_case)
  108. {
  109. const char *delim = " ";
  110. *test_type = strtok(s, delim);
  111. *host = strtok(NULL, delim);
  112. *p = atoi(strtok(NULL, delim));
  113. *test_case = strtok(NULL, delim);
  114. }
  115. void connection_test(char *line)
  116. {
  117. char *test_case;
  118. char *test_type;
  119. char *host;
  120. int port;
  121. scan(line, &test_type, &host, &port, &test_case);
  122. start_test(host, port, test_case);
  123. }