xref: /unit/src/nxt_polarssl.c (revision 564:762f8c976ead)
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