From 5ac03256db0fe4ca7e3ad1117d096c3a76368b76 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Fri, 9 Jan 2015 09:46:07 +0100 Subject: backported CyaSSL/OpenSSL support for internal webserver instead of MatrixSSL --- release/src/router/cyassl/swig/cyassl_adds.c | 208 +++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 release/src/router/cyassl/swig/cyassl_adds.c (limited to 'release/src/router/cyassl/swig/cyassl_adds.c') diff --git a/release/src/router/cyassl/swig/cyassl_adds.c b/release/src/router/cyassl/swig/cyassl_adds.c new file mode 100644 index 00000000..9dfae43b --- /dev/null +++ b/release/src/router/cyassl/swig/cyassl_adds.c @@ -0,0 +1,208 @@ +/* cyassl_adds.c */ +#ifndef _WIN32 + #define HAVE_CONFIG_H +#endif + +#include "openssl/ssl.h" +#include "rsa.h" +#include "asn.h" + +#include +#include +#include +#include + +#ifdef _WIN32 + #include + #include + #ifdef TEST_IPV6 /* don't require newer SDK for IPV4 */ + #include + #include + #endif + #define SOCKET_T int +#else + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #ifdef NON_BLOCKING + #include + #endif + #ifdef TEST_IPV6 + #include + #endif + #define SOCKET_T unsigned int +#endif /* _WIN32 */ + +#ifdef _MSC_VER + /* disable conversion warning */ + /* 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy */ + #pragma warning(disable:4244 4996) +#endif + +#if defined(__MACH__) || defined(_WIN32) + #ifndef _SOCKLEN_T + typedef int socklen_t; + #endif +#endif + + +/* HPUX doesn't use socklent_t for third parameter to accept */ +#if !defined(__hpux__) + typedef socklen_t* ACCEPT_THIRD_T; +#else + typedef int* ACCEPT_THIRD_T; +#endif + + +#ifdef _WIN32 + #define CloseSocket(s) closesocket(s) + #define StartTCP() { WSADATA wsd; WSAStartup(0x0002, &wsd); } +#else + #define CloseSocket(s) close(s) + #define StartTCP() +#endif + + +#ifdef TEST_IPV6 + typedef struct sockaddr_in6 SOCKADDR_IN_T; + #define AF_INET_V AF_INET6 +#else + typedef struct sockaddr_in SOCKADDR_IN_T; + #define AF_INET_V AF_INET +#endif + + +enum { + SSL_BLOCKING = 2, + SSL_NONBLOCKING = 4 +}; + + +static int tcp_socket(SOCKET_T* sockfd, SOCKADDR_IN_T* addr, const char* peer, + short port) +{ + const char* host = peer; + + /* peer could be in human readable form */ + if (isalpha(peer[0])) { + struct hostent* entry = gethostbyname(peer); + + if (entry) { + struct sockaddr_in tmp; + memset(&tmp, 0, sizeof(struct sockaddr_in)); + memcpy(&tmp.sin_addr.s_addr, entry->h_addr_list[0],entry->h_length); + host = inet_ntoa(tmp.sin_addr); + } + else + return -1; /* no entry for host */ + } + + *sockfd = socket(AF_INET, SOCK_STREAM, 0); + memset(addr, 0, sizeof(SOCKADDR_IN_T)); + + addr->sin_family = AF_INET; + addr->sin_port = htons(port); + addr->sin_addr.s_addr = inet_addr(host); + +#ifdef SO_NOSIGPIPE + { + int on = 1; + socklen_t len = sizeof(on); + setsockopt(*sockfd, SOL_SOCKET, SO_NOSIGPIPE, &on, len); + } +#endif + + return 0; +} + + +static int tcp_connect(SOCKET_T* sockfd, const char* ip, short port) +{ + SOCKADDR_IN_T addr; + int ret = tcp_socket(sockfd, &addr, ip, port); + if (ret != 0) return ret; + + if (connect(*sockfd, (const struct sockaddr*)&addr, sizeof(addr)) != 0) + return -2; /* can't connect */ + + return 0; +} + + +int CyaSSL_connect(SSL* ssl, const char* server, int port) +{ + SOCKET_T sockfd; + int ret = tcp_connect(&sockfd, server, port); + if (ret != 0) return ret; + + SSL_set_fd(ssl, sockfd); + + return SSL_connect(ssl); +} + + +char* CyaSSL_error_string(int err) +{ + static char buffer[80]; + + return ERR_error_string(err, buffer); +} + + +RNG* GetRng(void) +{ + RNG* rng = (RNG*)malloc(sizeof(RNG)); + + if (rng) + if (InitRng(rng) != 0) { + free(rng); + rng = 0; + } + + return rng; +} + + +RsaKey* GetRsaPrivateKey(const char* keyFile) +{ + RsaKey* key = (RsaKey*)malloc(sizeof(RsaKey)); + + if (key) { + byte tmp[1024]; + size_t bytes; + int ret; + word32 idx = 0; + FILE* file = fopen(keyFile, "rb"); + + if (!file) { + free(key); + return 0; + } + + bytes = fread(tmp, 1, sizeof(tmp), file); + fclose(file); + InitRsaKey(key, 0); + + ret = RsaPrivateKeyDecode(tmp, &idx, key, (word32)bytes); + if (ret != 0) { + FreeRsaKey(key); + free(key); + return 0; + } + } + return key; +} + + +void FillSignStr(unsigned char* dst, const char* src, int size) +{ + memcpy(dst, src, size); +} + -- cgit v1.2.3-54-g00ecf