/* * Copyright (C) NGINX, Inc. * Copyright (C) Igor Sysoev */ #include #include #include #include #include typedef struct { ssl_context ssl; x509_cert certificate; rsa_context key; } nxt_polarssl_ctx_t; static nxt_int_t nxt_polarssl_server_init(nxt_ssltls_conf_t *conf); static void nxt_polarssl_conn_init(nxt_thread_t *thr, nxt_ssltls_conf_t *conf, nxt_event_conn_t *c); static void nxt_polarssl_log_error(nxt_uint_t level, nxt_log_t *log, int err, const char *fmt, ...); nxt_ssltls_lib_t nxt_polarssl_lib = { nxt_polarssl_server_init, NULL, }; static nxt_int_t nxt_polarssl_server_init(nxt_ssltls_conf_t *conf) { int n; nxt_thread_t *thr; nxt_polarssl_ctx_t *ctx; thr = nxt_thread(); /* TODO: mem_pool */ ctx = nxt_zalloc(sizeof(nxt_polarssl_ctx_t)); if (ctx == NULL) { return NXT_ERROR; } n = ssl_init(&ctx->ssl); if (n != 0) { nxt_polarssl_log_error(NXT_LOG_ALERT, thr->log, n, "ssl_init() failed"); return NXT_ERROR; } ssl_set_endpoint(&ctx->ssl, SSL_IS_SERVER ); conf->ctx = ctx; conf->conn_init = nxt_polarssl_conn_init; n = x509parse_crtfile(&ctx->certificate, conf->certificate); if (n != 0) { nxt_polarssl_log_error(NXT_LOG_ALERT, thr->log, n, "x509parse_crt(\"%V\") failed", &conf->certificate); goto fail; } rsa_init(&ctx->key, RSA_PKCS_V15, 0); n = x509parse_keyfile(&ctx->key, conf->certificate_key, NULL); if (n != 0) { nxt_polarssl_log_error(NXT_LOG_ALERT, thr->log, n, "x509parse_key(\"%V\") failed", &conf->certificate_key); goto fail; } ssl_set_own_cert(&ctx->ssl, &ctx->certificate, &ctx->key); /* TODO: ciphers */ /* TODO: ca_certificate */ return NXT_OK; fail: return NXT_ERROR; } static void nxt_polarssl_conn_init(nxt_thread_t *thr, nxt_ssltls_conf_t *conf, nxt_event_conn_t *c) { } static void nxt_polarssl_log_error(nxt_uint_t level, nxt_log_t *log, int err, const char *fmt, ...) { va_list args; u_char *p, *end, msg[NXT_MAX_ERROR_STR]; end = msg + NXT_MAX_ERROR_STR; va_start(args, fmt); p = nxt_vsprintf(msg, end, fmt, args); va_end(args); p = nxt_sprintf(p, end, " (%d: ", err); error_strerror(err, (char *) msg, p - msg); nxt_log_error(level, log, "%*s)", p - msg, msg); }