SSL_CTX * KSSLSocket::init_server(const char *cert_file, const char *key_file, const char *verified_file) { SSL_CTX * ctx = init_ctx(true); if (ctx == NULL) { fprintf(stderr, "cann't init_ctx\n"); return NULL; } if (cert_file == NULL) { cert_file = key_file; } if (SSL_CTX_use_certificate_chain_file(ctx, cert_file) <= 0) { fprintf(stderr, "SSL use certificate file : Error allocating handle: %s\n", ERR_error_string(ERR_get_error(), NULL)); clean_ctx(ctx); return NULL; } if (SSL_CTX_use_PrivateKey_file(ctx, key_file, SSL_FILETYPE_PEM) <= 0) { fprintf(stderr, "SSL use privatekey file: Error allocating handle: %s\n", ERR_error_string(ERR_get_error(), NULL)); clean_ctx(ctx); return NULL; } if (!SSL_CTX_check_private_key(ctx)) { fprintf(stderr, "SSL: Error allocating handle: %s\n", ERR_error_string( ERR_get_error(), NULL)); clean_ctx(ctx); return NULL; } if (verified_file) { SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); SSL_CTX_set_verify_depth(ctx, 1); if (SSL_CTX_load_verify_locations(ctx, verified_file, NULL) <= 0) { fprintf(stderr, "SSL error %s:%d: Error allocating handle: %s\n", __FILE__, __LINE__, ERR_error_string(ERR_get_error(), NULL)); clean_ctx(ctx); return NULL; } } int session_context_len = strlen(cert_file); const char *session_context = cert_file; int pos = session_context_len - SSL_MAX_SSL_SESSION_ID_LENGTH; if (pos>0) { session_context_len -= pos; session_context += pos; } SSL_CTX_set_session_id_context(ctx,(const unsigned char *)session_context,session_context_len); SSL_CTX_set_session_cache_mode(ctx,SSL_SESS_CACHE_SERVER); //SSL_CTX_sess_set_cache_size(ctx,1000); return ctx; }
SSL_CTX * KSSLSocket::init_client(const char *path, const char *file) { SSL_CTX *ctx = init_ctx(false); if (ctx) { if (file != NULL) { SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); SSL_CTX_set_verify_depth(ctx, 1); if (SSL_CTX_load_verify_locations(ctx, file, path) <= 0) { fprintf(stderr, "SSL error %s:%d: Error allocating handle: %s\n", __FILE__, __LINE__, ERR_error_string(ERR_get_error(), NULL)); clean_ctx(ctx); return NULL; } } SSL_CTX_set_session_id_context(ctx,(const unsigned char *)PROGRAM_NAME,sizeof(PROGRAM_NAME)-1); SSL_CTX_set_session_cache_mode(ctx,SSL_SESS_CACHE_BOTH); } return ctx; }
void yield() { ctx_t *current; if (ctx == NULL) return; irq_disable(); //CORE LOCK current = find_next_iddle(); if (current == NULL) { //CORE UNLOCK irq_enable(); return; } switch_to_ctx(current, _in(CORE_ID)); clean_ctx(current); //CORE UNLOCK irq_enable(); }