10Sigor@sysoev.ru
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru * Copyright (C) NGINX, Inc.
40Sigor@sysoev.ru * Copyright (C) Igor Sysoev
50Sigor@sysoev.ru */
60Sigor@sysoev.ru
70Sigor@sysoev.ru #include <nxt_main.h>
80Sigor@sysoev.ru #include <polarssl/config.h>
90Sigor@sysoev.ru #include <polarssl/ssl.h>
100Sigor@sysoev.ru #include <polarssl/x509.h>
110Sigor@sysoev.ru #include <polarssl/error.h>
120Sigor@sysoev.ru
130Sigor@sysoev.ru
140Sigor@sysoev.ru typedef struct {
150Sigor@sysoev.ru ssl_context ssl;
160Sigor@sysoev.ru x509_cert certificate;
170Sigor@sysoev.ru rsa_context key;
180Sigor@sysoev.ru } nxt_polarssl_ctx_t;
190Sigor@sysoev.ru
200Sigor@sysoev.ru
210Sigor@sysoev.ru static nxt_int_t nxt_polarssl_server_init(nxt_ssltls_conf_t *conf);
220Sigor@sysoev.ru static void nxt_polarssl_conn_init(nxt_thread_t *thr, nxt_ssltls_conf_t *conf,
230Sigor@sysoev.ru nxt_event_conn_t *c);
240Sigor@sysoev.ru static void nxt_polarssl_log_error(nxt_uint_t level, nxt_log_t *log, int err,
250Sigor@sysoev.ru const char *fmt, ...);
260Sigor@sysoev.ru
270Sigor@sysoev.ru
280Sigor@sysoev.ru nxt_ssltls_lib_t nxt_polarssl_lib = {
290Sigor@sysoev.ru nxt_polarssl_server_init,
300Sigor@sysoev.ru NULL,
310Sigor@sysoev.ru };
320Sigor@sysoev.ru
330Sigor@sysoev.ru
340Sigor@sysoev.ru static nxt_int_t
nxt_polarssl_server_init(nxt_ssltls_conf_t * conf)350Sigor@sysoev.ru nxt_polarssl_server_init(nxt_ssltls_conf_t *conf)
360Sigor@sysoev.ru {
370Sigor@sysoev.ru int n;
380Sigor@sysoev.ru nxt_thread_t *thr;
390Sigor@sysoev.ru nxt_polarssl_ctx_t *ctx;
400Sigor@sysoev.ru
410Sigor@sysoev.ru thr = nxt_thread();
420Sigor@sysoev.ru
430Sigor@sysoev.ru /* TODO: mem_pool */
440Sigor@sysoev.ru
450Sigor@sysoev.ru ctx = nxt_zalloc(sizeof(nxt_polarssl_ctx_t));
460Sigor@sysoev.ru if (ctx == NULL) {
470Sigor@sysoev.ru return NXT_ERROR;
480Sigor@sysoev.ru }
490Sigor@sysoev.ru
500Sigor@sysoev.ru n = ssl_init(&ctx->ssl);
510Sigor@sysoev.ru if (n != 0) {
52*564Svbart@nginx.com nxt_polarssl_log_error(NXT_LOG_ALERT, thr->log, n, "ssl_init() failed");
530Sigor@sysoev.ru return NXT_ERROR;
540Sigor@sysoev.ru }
550Sigor@sysoev.ru
560Sigor@sysoev.ru ssl_set_endpoint(&ctx->ssl, SSL_IS_SERVER );
570Sigor@sysoev.ru
580Sigor@sysoev.ru conf->ctx = ctx;
590Sigor@sysoev.ru conf->conn_init = nxt_polarssl_conn_init;
600Sigor@sysoev.ru
610Sigor@sysoev.ru n = x509parse_crtfile(&ctx->certificate, conf->certificate);
620Sigor@sysoev.ru if (n != 0) {
63*564Svbart@nginx.com nxt_polarssl_log_error(NXT_LOG_ALERT, thr->log, n,
640Sigor@sysoev.ru "x509parse_crt(\"%V\") failed",
650Sigor@sysoev.ru &conf->certificate);
660Sigor@sysoev.ru goto fail;
670Sigor@sysoev.ru }
680Sigor@sysoev.ru
690Sigor@sysoev.ru rsa_init(&ctx->key, RSA_PKCS_V15, 0);
700Sigor@sysoev.ru
710Sigor@sysoev.ru n = x509parse_keyfile(&ctx->key, conf->certificate_key, NULL);
720Sigor@sysoev.ru if (n != 0) {
73*564Svbart@nginx.com nxt_polarssl_log_error(NXT_LOG_ALERT, thr->log, n,
740Sigor@sysoev.ru "x509parse_key(\"%V\") failed",
750Sigor@sysoev.ru &conf->certificate_key);
760Sigor@sysoev.ru goto fail;
770Sigor@sysoev.ru }
780Sigor@sysoev.ru
790Sigor@sysoev.ru ssl_set_own_cert(&ctx->ssl, &ctx->certificate, &ctx->key);
800Sigor@sysoev.ru
810Sigor@sysoev.ru /* TODO: ciphers */
820Sigor@sysoev.ru
830Sigor@sysoev.ru /* TODO: ca_certificate */
840Sigor@sysoev.ru
850Sigor@sysoev.ru return NXT_OK;
860Sigor@sysoev.ru
870Sigor@sysoev.ru fail:
880Sigor@sysoev.ru
890Sigor@sysoev.ru return NXT_ERROR;
900Sigor@sysoev.ru }
910Sigor@sysoev.ru
920Sigor@sysoev.ru
930Sigor@sysoev.ru static void
nxt_polarssl_conn_init(nxt_thread_t * thr,nxt_ssltls_conf_t * conf,nxt_event_conn_t * c)940Sigor@sysoev.ru nxt_polarssl_conn_init(nxt_thread_t *thr, nxt_ssltls_conf_t *conf,
950Sigor@sysoev.ru nxt_event_conn_t *c)
960Sigor@sysoev.ru {
970Sigor@sysoev.ru }
980Sigor@sysoev.ru
990Sigor@sysoev.ru
1000Sigor@sysoev.ru static void
nxt_polarssl_log_error(nxt_uint_t level,nxt_log_t * log,int err,const char * fmt,...)1010Sigor@sysoev.ru nxt_polarssl_log_error(nxt_uint_t level, nxt_log_t *log, int err,
1020Sigor@sysoev.ru const char *fmt, ...)
1030Sigor@sysoev.ru {
1040Sigor@sysoev.ru va_list args;
1050Sigor@sysoev.ru u_char *p, *end, msg[NXT_MAX_ERROR_STR];
1060Sigor@sysoev.ru
1070Sigor@sysoev.ru end = msg + NXT_MAX_ERROR_STR;
1080Sigor@sysoev.ru
1090Sigor@sysoev.ru va_start(args, fmt);
1100Sigor@sysoev.ru p = nxt_vsprintf(msg, end, fmt, args);
1110Sigor@sysoev.ru va_end(args);
1120Sigor@sysoev.ru
1130Sigor@sysoev.ru p = nxt_sprintf(p, end, " (%d: ", err);
1140Sigor@sysoev.ru
1150Sigor@sysoev.ru error_strerror(err, (char *) msg, p - msg);
1160Sigor@sysoev.ru
1170Sigor@sysoev.ru nxt_log_error(level, log, "%*s)", p - msg, msg);
1180Sigor@sysoev.ru }
119