1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
/*
* $Id: sslTunnel.c,v 1.2 2002-10-23 10:33:25 cvs Exp $
*/
#include <unistd.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <get_user.h>
#include <string.h>
typedef struct {
int sock;
SSL *ssl_con;
} sslPair;
static sslPair *sslPairArray;
static int qLen = 0; /* number of elements in the memory*/
static int set_SSL_map(int, SSL *);
static SSL* get_SSL_map(int);
static int initialized;
ssize_t eRead(int fd, void *buff, size_t len)
{
SSL *ssl_con;
ssl_con = get_SSL_map(fd);
return ssl_con == NULL ? -1 : SSL_read(ssl_con, buff, len);
}
ssize_t eWrite(int fd,const void *buff, size_t len)
{
SSL *ssl_con;
ssl_con = get_SSL_map(fd);
return ssl_con == NULL ? -1 : SSL_write(ssl_con, buff, len);
}
int eInit(int fd)
{
SSL *ssl_con;
int ret;
SSL_CTX *ssl_ctx;
user_entry *en;
if(!initialized) {
SSL_library_init();
SSLeay_add_ssl_algorithms();
SSL_load_error_strings();
++initialized;
}
ssl_ctx = SSL_CTX_new(TLSv1_client_method());
ssl_con = (SSL *) SSL_new(ssl_ctx);
ret = SSL_set_fd(ssl_con, fd);
SSL_set_connect_state(ssl_con);
ret = SSL_connect(ssl_con);
ret = SSL_get_error(ssl_con, ret);
if(ret != SSL_ERROR_NONE) {
switch (ret) {
case SSL_ERROR_NONE :
printf("SSL_ERROR_NONE.\n");
break;
case SSL_ERROR_SSL :
printf("SSL_ERROR_SSL.\n");
break;
case SSL_ERROR_WANT_READ:
printf("SSL_ERROR_WANT_READ.\n");
break;
case SSL_ERROR_WANT_WRITE:
printf("SSL_ERROR_WANT_WRITE.\n");
break;
case SSL_ERROR_WANT_X509_LOOKUP :
printf("SSL_ERROR_WANT_X509_LOOKUP.\n");
break;
case SSL_ERROR_SYSCALL:
printf("SSL_ERROR_SYSCALL.\n");
break;
case SSL_ERROR_ZERO_RETURN :
printf("SSL_ERROR_ZERO_RETURN.\n");
break;
case SSL_ERROR_WANT_CONNECT :
printf("SSL_ERROR_WANT_CONNECT.\n");
break;
default:
printf("Unknow error.\n");
}
ERR_print_errors_fp(stderr);
return -1;
}
set_SSL_map(fd, ssl_con);
en = getUserEntry();
SSL_write(ssl_con, "Auth Protocol V#1.0 auth=" , 25);
SSL_write(ssl_con, en->login , strlen(en->login));
SSL_write(ssl_con, ":" , 1);
SSL_write(ssl_con, en->passwd , strlen(en->passwd));
SSL_write(ssl_con, "\n" , 1);
clear_entry(en);
return 0;
}
int eDestroy(int fd)
{
return 0;
}
static
int set_SSL_map(int sock, SSL *ssl_con)
{
sslPair * tmp;
tmp = realloc(sslPairArray, sizeof(sslPair)*(qLen +1));
if(tmp == NULL) {
return -1;
}
sslPairArray = tmp;
sslPairArray[qLen].sock = sock;
sslPairArray[qLen].ssl_con = ssl_con;
++qLen;
return 0;
}
static
SSL * get_SSL_map(int sock)
{
register unsigned int i;
sslPair * tmp;
SSL *ssl_con;
for(i = 0; i < qLen; i++) {
if(sslPairArray[i].sock == sock) {
return sslPairArray[i].ssl_con;
/*
ssl_con = sslPairArray[i].ssl_con;
tmp = malloc(sizeof(sslPair)*(qLen - 1));
if(tmp == NULL) {
debug(ERROR, "Failed to allocate memory.");
return ssl_con;
}
memcpy(tmp, sslPairArray, sizeof(sslPair)*i);
memcpy(&tmp[i], &sslPairArray[i+1], sizeof(sslPair)*(qLen -i -1));
free(sslPairArray);
sslPairArray = tmp;
--qLen;
return ssl_con;
*/
}
}
return NULL;
}
|