static int set_key_file(glb_ctx *cc, char *key)
{
- unsigned long err = 0;
+ unsigned long ssl_err = 0;
+ int err = 0;
FILE * key_file = NULL;
if (!cc->cert_key){
/*TODO NULL NULL, callback and user data*/
cc->cert_key->key = PEM_read_PrivateKey(key_file, NULL, NULL, NULL);
if (!cc->cert_key->key) {
- err = ERR_get_error();
- set_error(cc, err, ssl_error, "error while writing key to context"
+ ssl_err = ERR_get_error();
+ set_error(cc, ssl_err, ssl_error, "error while writing key to context"
" (set_key_file)");
goto end;
}
update_error(cc, "cannot close file with key"
" (set_key_file)");
}
- return err;
+ return 1;
}
static int set_cert_file(glb_ctx *cc, char *cert)
{
- unsigned long err = 0;
+ unsigned long ssl_err = 0;
+ int err = 0;
FILE * cert_file = NULL;
if (!cc->cert_key){
/*TODO NULL NULL, callback and user data*/
cc->cert_key->cert = PEM_read_X509(cert_file, NULL, NULL, NULL);
if (!cc->cert_key->cert) {
- err = ERR_get_error();
- set_error(cc, err, ssl_error, "error while writing certificate"
+ ssl_err = ERR_get_error();
+ set_error(cc, ssl_err, ssl_error, "error while writing certificate"
" to context (set_cert_file)");
goto end;
}
update_error(cc, "cannot close file with certificate"
" (set_cert_file)");
}
- return err;
+ return 1;
}
static unsigned long resolve_error(glb_ctx *cc, unsigned long err_code,
CANL_ERROR_ORIGIN err_orig);
-static void get_error_string(glb_ctx *cc, char *code_str, int *code_len);
+static void get_error_string(glb_ctx *cc, char *code_str);
/* Save error message into err_msg
* use NULL for empty err_format */
unsigned int err_msg_len = 0;
unsigned int err_msg_sum = 0; // sum of msg and format lengths
int err_format_len = 0;
+ int separator_len = 0;
+ const char *separator = "\n";
va_list ap;
char *new_msg;
if (err_format == NULL) {
return;
}
+ separator_len = strlen(separator);
va_start(ap, err_format);
err_msg_len = strlen(cc->err_msg);
/* Add new error message to older one */
- err_msg_sum = err_format_len + err_msg_len;
- /* separator ; and ending '\0' -> 2 bytes */
- cc->err_msg = (char *) realloc (cc->err_msg, (err_msg_sum + 2)*sizeof(char));
+ err_msg_sum = err_format_len + err_msg_len + separator_len + 1;
+ cc->err_msg = (char *) realloc (cc->err_msg, (err_msg_sum)*sizeof(char));
if (cc->err_msg == NULL)
return;
- strcat (cc->err_msg, ";");
+ strcat (cc->err_msg, separator);
strcat (cc->err_msg, new_msg);
free(new_msg);
char *new_error = NULL;
char code_str[ERR_CODE_LEN];
int code_len = 0;
+ char *separ = "\n";
+ int separ_len = 0;
+ const char *msg_pref = "[CANL:MSG] ";
+ int msg_pref_len = 0;
code_str[0] = '\0';
goto end;
/* get human readable error code*/
- get_error_string(cc, code_str, &code_len);
-
- /* 1 for new line*/
- error_length = strlen(ctx->err_msg) + code_len + 1;
- new_error = (char *) malloc ((error_length + 1) * sizeof (char));
+ get_error_string(cc, code_str);
+ code_len = strlen(code_str);
+
+ separ_len = strlen(separ);
+ msg_pref_len = strlen(msg_pref);
+ error_length = msg_pref_len + strlen(ctx->err_msg) + code_len +
+ separ_len + 1;
+ new_error = (char *) malloc ((error_length) * sizeof (char));
if (!new_error) {
err = ENOMEM;
e_orig = posix_error;
goto end;
}
- strncpy(new_error, code_str, code_len);
- new_error[code_len] = '\n';
- new_error[code_len + 1] = '\0';
+ strncpy(new_error, code_str, code_len + 1);
+ strncat(new_error, separ, separ_len + 1);
+ strncat(new_error, msg_pref, msg_pref_len + 1);
strncat(new_error, ctx->err_msg, error_length + 1);
end:
}
/*TODO ! map error codes to their human readable strings */
-static void get_error_string(glb_ctx *cc, char *code_str, int *code_len)
+static void get_error_string(glb_ctx *cc, char *code_str)
{
- *code_len = 0;
- if (cc->err_orig == ssl_error)
- ERR_error_string_n(cc->err_code, code_str, ERR_CODE_LEN);
- *code_len = strlen(code_str);
+ int prefix_len = 0;
+ char *ssl_prefix = "[CANL:ERR:OPEN_SSL] ";
+ char *posix_prefix = "[CANL:ERR:POSIX] ";
+ char *posix_str = NULL;
+
+ switch (cc->err_orig) {
+ case ssl_error:
+ prefix_len = strlen(ssl_prefix);
+ strncpy(code_str, ssl_prefix, prefix_len + 1);
+ ERR_error_string_n(cc->err_code, code_str + prefix_len,
+ ERR_CODE_LEN - prefix_len);
+ break;
+ case posix_error:
+ prefix_len = strlen(posix_prefix);
+ strncpy(code_str, posix_prefix, prefix_len + 1);
+ posix_str = strerror(cc->err_code);
+ if (posix_str) {
+ strncpy(code_str + prefix_len, posix_str,
+ ERR_CODE_LEN - prefix_len);
+ code_str[ERR_CODE_LEN - 1] = '\0';
+ }
+ break;
+ default:
+ break;
+ }
}
/*if the error code is known to colin, assign appropriate colin code
int ssl_server_init(glb_ctx *cc, io_handler *io)
{
- unsigned long err = 0;
+ int err = 0;
+ unsigned long ssl_err = 0;
CANL_ERROR_ORIGIN e_orig = unknown_error;
if (!cc) {
//err = SSL_CTX_set_cipher_list(cc->ssl_ctx, "ALL:!LOW:!EXP:!MD5:!MD2");
err = SSL_CTX_set_cipher_list(cc->ssl_ctx, "ALL");
if (!err) {
- err = ERR_get_error();
- set_error(cc, err, e_orig, "no cipher to use"
+ ssl_err = ERR_get_error();
+ set_error(cc, ssl_err, e_orig, "no cipher to use"
" (ssl_server_init)");
return err;
}
if (cc->cert_key->cert) {
err = SSL_CTX_use_certificate(cc->ssl_ctx, cc->cert_key->cert);
if (err != 1) {
- err = ERR_get_error();
+ ssl_err = ERR_get_error();
e_orig = ssl_error;
goto end;
}
if (cc->cert_key->key) {
err = SSL_CTX_use_PrivateKey(cc->ssl_ctx, cc->cert_key->key);
if (err != 1) {
- err = ERR_get_error();
+ ssl_err = ERR_get_error();
e_orig = ssl_error;
goto end;
}
else {
set_error(cc, err, unknown_error, "server key or certificate missing"
" (ssl_server_init)");
- return -1;
+ return 1;
}
/*Make sure the key and certificate file match*/
if ( (err = SSL_CTX_check_private_key(cc->ssl_ctx)) != 1) {
- err = ERR_get_error();
+ ssl_err = ERR_get_error();
e_orig = ssl_error;
- set_error(cc, err, e_orig, "Private key does not match"
+ set_error(cc, ssl_err, e_orig, "Private key does not match"
" the certificate public key (ssl_server_init)");
- return -1;
+ return 1;
}
else
err = 0;
end:
- if (err) {
- set_error(cc, err, e_orig, "cannot initialize SSL context"
+ if (ssl_err) {
+ set_error(cc, ssl_err, e_orig, "cannot initialize SSL context"
" (ssl_server_init)");
- return -1;
+ return 1;
+ }
+ else if (err) {
+ set_error(cc, ssl_err, e_orig, "cannot initialize SSL context"
+ " (ssl_server_init)");
+ return 1;
}
return 0;
}
int ssl_client_init(glb_ctx *cc, io_handler *io)
{
- unsigned long err = 0;
+ unsigned long ssl_err = 0;
+ int err = 0;
CANL_ERROR_ORIGIN e_orig = unknown_error;
if (!cc) {
cc->ssl_ctx = SSL_CTX_new(SSL_CLIENT_METH);
if (!cc->ssl_ctx){
- err = ERR_get_error();
+ ssl_err = ERR_get_error();
e_orig = ssl_error;
goto end;
}
//err = SSL_CTX_set_cipher_list(cc->ssl_ctx, "ALL:!LOW:!EXP:!MD5:!MD2");
err = SSL_CTX_set_cipher_list(cc->ssl_ctx, "ALL");
if (!err) {
- err = ERR_get_error();
- set_error(cc, err, e_orig, "no cipher to use"
+ ssl_err = ERR_get_error();
+ set_error(cc, ssl_err, e_orig, "no cipher to use"
" (ssl_server_init)");
return err;
}
if (cc->cert_key->key) {
err = SSL_CTX_use_PrivateKey(cc->ssl_ctx, cc->cert_key->key);
if (err != 1) {
- err = ERR_get_error();
+ ssl_err = ERR_get_error();
e_orig = ssl_error;
goto end;
}
else if (cc->cert_key->cert) {
err = SSL_CTX_use_certificate(cc->ssl_ctx, cc->cert_key->cert);
if (err != 1) {
- err = ERR_get_error();
+ ssl_err = ERR_get_error();
e_orig = ssl_error;
goto end;
}
}
end:
- if (err) {
+ if (ssl_err) {
+ set_error(cc, ssl_err, e_orig, "cannot initialize SSL context"
+ " (ssl_client_init)");
+ return 1;
+ }
+ else if (err) {
set_error(cc, err, e_orig, "cannot initialize SSL context"
" (ssl_client_init)");
- return -1;
+ return 1;
}
return 0;
}
{
time_t starttime, curtime;
int ret = -1, ret2 = -1;
- unsigned long err = 0;
+ unsigned long ssl_err = 0;
+ int err = 0;
CANL_ERROR_ORIGIN e_orig = unknown_error;
long errorcode = 0;
int expected = 0;
if (ret > 0) {
ret2 = SSL_connect(io->s_ctx->ssl_io);
if (ret2 < 0) {
- err = ERR_get_error();
+ ssl_err = ERR_get_error();
e_orig = ssl_error;
}
expected = errorcode = SSL_get_error(io->s_ctx->ssl_io, ret2);
set_error (cc, err, posix_error, "Connection stuck during handshake: timeout reached (do_ssl_connect)");
}
else if (ret2 < 0)
- set_error (cc, err, e_orig, "Error during SSL handshake"
+ set_error (cc, ssl_err, e_orig, "Error during SSL handshake"
" (do_ssl_connect)");
else if (ret2 == 0)
- set_error (cc, err, unknown_error, "Connection closed"
+ set_error (cc, 0, unknown_error, "Connection closed"
" by the other side (do_ssl_connect)");
else
set_error (cc, err, unknown_error, "Error during SSL handshake"
" (do_ssl_connect)");
- return -1;
+ return 1;
}
return 0;
}
{
time_t starttime, curtime;
int ret = -1, ret2 = -1;
- unsigned long err = 0;
+ unsigned long ssl_err = 0;
+ int err = 0;
CANL_ERROR_ORIGIN e_orig = unknown_error;
long errorcode = 0;
int expected = 0;
if (ret > 0) {
ret2 = SSL_accept(io->s_ctx->ssl_io);
if (ret2 < 0) {
- err = ERR_peek_error();
+ ssl_err = ERR_peek_error();
e_orig = ssl_error;
}
expected = errorcode = SSL_get_error(io->s_ctx->ssl_io, ret2);
" during handshake: timeout reached (do_ssl_accept)");
}
else if (ret2 < 0)
- set_error (cc, err, e_orig, "Error during SSL handshake"
+ set_error (cc, ssl_err, e_orig, "Error during SSL handshake"
" (do_ssl_accept)");
else if (ret2 == 0)
- set_error (cc, err, unknown_error, "connection closed by"
+ set_error (cc, 0, unknown_error, "connection closed by"
" the other side (do_ssl_accept)");
else
- set_error (cc, err, unknown_error, "Error during SSL handshake"
+ set_error (cc, 0, unknown_error, "Error during SSL handshake"
" (do_ssl_accept)");
- return -1;
+ return 1;
}
return 0;
}