hssl.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "hssl.h"
  2. static hssl_ctx_t s_ssl_ctx = 0;
  3. hssl_ctx_t hssl_ctx_instance() {
  4. return s_ssl_ctx;
  5. }
  6. #ifdef WITH_OPENSSL
  7. #include "openssl/ssl.h"
  8. hssl_ctx_t hssl_ctx_init(hssl_ctx_init_param_t* param) {
  9. SSL_CTX* ctx = SSL_CTX_new(TLS_method());
  10. if (ctx == NULL) return NULL;
  11. int mode = SSL_VERIFY_NONE;
  12. if (param) {
  13. if (param->ca_file && *param->ca_file) {
  14. if (!SSL_CTX_load_verify_locations(ctx, param->ca_file, NULL)) {
  15. fprintf(stderr, "ssl ca_file verify failed!\n");
  16. goto error;
  17. }
  18. }
  19. if (param->crt_file && *param->crt_file) {
  20. if (!SSL_CTX_use_certificate_file(ctx, param->crt_file, SSL_FILETYPE_PEM)) {
  21. fprintf(stderr, "ssl crt_file error!\n");
  22. goto error;
  23. }
  24. }
  25. if (param->key_file && *param->key_file) {
  26. if (!SSL_CTX_use_PrivateKey_file(ctx, param->key_file, SSL_FILETYPE_PEM)) {
  27. fprintf(stderr, "ssl key_file error!\n");
  28. goto error;
  29. }
  30. if (!SSL_CTX_check_private_key(ctx)) {
  31. fprintf(stderr, "ssl key_file check failed!\n");
  32. goto error;
  33. }
  34. }
  35. if (param->verify_peer) {
  36. mode = SSL_VERIFY_PEER;
  37. }
  38. }
  39. SSL_CTX_set_verify(ctx, mode, NULL);
  40. s_ssl_ctx = ctx;
  41. return ctx;
  42. error:
  43. SSL_CTX_free(ctx);
  44. return NULL;
  45. }
  46. void hssl_ctx_destory(hssl_ctx_t ssl_ctx) {
  47. if (ssl_ctx) {
  48. if (ssl_ctx == s_ssl_ctx) {
  49. s_ssl_ctx = NULL;
  50. }
  51. SSL_CTX_free((SSL_CTX*)ssl_ctx);
  52. ssl_ctx = NULL;
  53. }
  54. }
  55. hssl_t hssl_new(hssl_ctx_t ssl_ctx, int fd) {
  56. SSL* ssl = SSL_new((SSL_CTX*)ssl_ctx);
  57. if (ssl == NULL) return NULL;
  58. SSL_set_fd(ssl, fd);
  59. return ssl;
  60. }
  61. void hssl_free(hssl_t ssl) {
  62. if (ssl) {
  63. SSL_free((SSL*)ssl);
  64. ssl = NULL;
  65. }
  66. }
  67. int hssl_connect(hssl_t ssl) {
  68. int ret = SSL_connect((SSL*)ssl);
  69. if (ret == 1) return 0;
  70. int err = SSL_get_error((SSL*)ssl, ret);
  71. return err;
  72. }
  73. int hssl_accept(hssl_t ssl) {
  74. int ret = SSL_accept((SSL*)ssl);
  75. if (ret == 1) return 0;
  76. int err = SSL_get_error((SSL*)ssl, ret);
  77. return err;
  78. }
  79. int hssl_read(hssl_t ssl, void* buf, int len) {
  80. return SSL_read((SSL*)ssl, buf, len);
  81. }
  82. int hssl_write(hssl_t ssl, const void* buf, int len) {
  83. return SSL_write((SSL*)ssl, buf, len);
  84. }
  85. int hssl_close(hssl_t ssl) {
  86. SSL_shutdown((SSL*)ssl);
  87. return 0;
  88. }
  89. int hssl_set_accept_state(hssl_t ssl) {
  90. SSL_set_accept_state((SSL*)ssl);
  91. return 0;
  92. }
  93. int hssl_set_connect_state(hssl_t ssl) {
  94. SSL_set_connect_state((SSL*)ssl);
  95. return 0;
  96. }
  97. int hssl_do_handshark(hssl_t ssl) {
  98. int ret = SSL_do_handshake((SSL*)ssl);
  99. if (ret == 1) return 0;
  100. int err = SSL_get_error((SSL*)ssl, ret);
  101. if (err == SSL_ERROR_WANT_READ) {
  102. return HSSL_WANT_READ;
  103. }
  104. else if (err == SSL_ERROR_WANT_WRITE) {
  105. return HSSL_WANT_WRITE;
  106. }
  107. return err;
  108. }
  109. #else
  110. #include "hplatform.h"
  111. hssl_ctx_t hssl_ctx_init(hssl_ctx_init_param_t* param) {
  112. fprintf(stderr, "Please recompile WITH_SSL.\n");
  113. return NULL;
  114. }
  115. void hssl_ctx_destory(hssl_ctx_t ssl_ctx) {
  116. }
  117. hssl_t hssl_new(hssl_ctx_t ssl_ctx, int fd) {
  118. return (void*)(intptr_t)fd;
  119. }
  120. void hssl_free(hssl_t ssl) {
  121. }
  122. int hssl_connect(hssl_t ssl) {
  123. return 0;
  124. }
  125. int hssl_accept(hssl_t ssl) {
  126. return 0;
  127. }
  128. int hssl_read(hssl_t ssl, void* buf, int len) {
  129. int fd = (intptr_t)ssl;
  130. return read(fd, buf, len);
  131. }
  132. int hssl_write(hssl_t ssl, const void* buf, int len) {
  133. int fd = (intptr_t)ssl;
  134. return write(fd, buf, len);
  135. }
  136. int hssl_close(hssl_t ssl) {
  137. return 0;
  138. }
  139. int hssl_set_accept_state(hssl_t ssl) {
  140. return 0;
  141. }
  142. int hssl_set_connect_state(hssl_t ssl) {
  143. return 0;
  144. }
  145. int hssl_do_handshark(hssl_t ssl) {
  146. return 0;
  147. }
  148. #endif