There are no available options for this view.

Parent Directory Parent Directory | Revision <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Log">Log</a> Revision <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Log">Log</a>

Revision 1.11 - (show annotations) (download) (as text)
Tue Mar 28 17:56:30 2006 UTC (6 years, 1 month ago) by apiskors
Branch: MAIN
CVS Tags: HEAD
Changes since 1.10: +5 -5 lines
File MIME type: text/x-chdr
Replace Unix-only gettimeofday() with Tcl_GetTime(), fixes SF bug
#1040291, nsopenssl now works on MS Windows.
1 /*
2 * The contents of this file are subject to the AOLserver Public License
3 * Version 1.1 (the "License"); you may not use this file except in
4 * compliance with the License. You may obtain a copy of the License at
5 * http://aolserver.com.
6 *
7 * Software distributed under the License is distributed on an "AS IS"
8 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
9 * the License for the specific language governing rights and limitations
10 * under the License.
11 *
12 * Alternatively, the contents of this file may be used under the terms
13 * of the GNU General Public License (the "GPL"), in which case the
14 * provisions of GPL are applicable instead of those above. If you wish
15 * to allow use of your version of this file only under the terms of the
16 * GPL and not to allow others to use your version of this file under the
17 * License, indicate your decision by deleting the provisions above and
18 * replace them with the notice and other provisions required by the GPL.
19 * If you do not delete the provisions above, a recipient may use your
20 * version of this file under either the License or the GPL.
21 *
22 * Copyright (C) 2000-2003 Scott S. Goodwin
23 *
24 * Module originally written by Stefan Arentz. Early contributions made by
25 * Freddie Mendoze and Rob Mayoff.
26 *
27 * Portions created by AOL are Copyright (C) 1999 America Online, Inc.
28 * All Rights Reserved.
29 */
30
31 /*
32 * sslcontext.c --
33 *
34 * Manages SSL context state structures.
35 */
36
37 static const char *RCSID = "@(#) $Header: /cvsroot-fuse/aolserver/nsopenssl/sslcontext.c,v 1.11 2006/03/28 17:56:30 apiskors Exp $, compiled: " __DATE__ " " __TIME__;
38
39 #include "nsopenssl.h"
40
41 Tcl_HashTable NsOpenSSLServers;
42 RSA *rsa_512, *rsa_1024;
43
44 static RSA *<a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_IssueTmpRSAKey">IssueTmpRSAKey</a>(SSL *ssl, int export, int keylen);
45 static char *<a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextSessionCacheIdNew">SSLContextSessionCacheIdNew</a>(char *server);
46 static void <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_OpenSSLTrace">OpenSSLTrace</a>(SSL *ssl, int where, int rc);
47 static void <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCAFileInit">SSLContextCAFileInit</a>(NsOpenSSLContext *sslcontext);
48 static void <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCADirInit">SSLContextCADirInit</a>(NsOpenSSLContext *sslcontext);
49 static int <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCiphersInit">SSLContextCiphersInit</a>(NsOpenSSLContext *sslcontext);
50 static int <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextProtocolsInit">SSLContextProtocolsInit</a>(NsOpenSSLContext *sslcontext);
51 static int <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCertFileInit">SSLContextCertFileInit</a>(NsOpenSSLContext *sslcontext);
52 static void <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextPeerVerifyInit">SSLContextPeerVerifyInit</a>(NsOpenSSLContext *sslcontext);
53 static void <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextPeerVerifyDepthInit">SSLContextPeerVerifyDepthInit</a>(NsOpenSSLContext *sslcontext);
54 static void <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextSessionCacheInit">SSLContextSessionCacheInit</a>(NsOpenSSLContext *sslcontext);
55 static void <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextTraceInit">SSLContextTraceInit</a>(NsOpenSSLContext *sslcontext);
56 static int <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_PeerVerifyCallback">PeerVerifyCallback</a>(int preverify_ok, X509_STORE_CTX *x509_ctx);
57
58
59 /*
60 *----------------------------------------------------------------------
61 *
62 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCreate">NsOpenSSLContextCreate</a> --
63 *
64 * Create a new NsOpenSSLContext structure
65 *
66 * Results:
67 * Pointer to resulting struct or NULL on error
68 *
69 * Side effects:
70 * Memory is allocated. All structure values are set to defaults.
71 * These defaults can be overridden by calls to the
72 * NsOpenSSLContext* functions.
73 *
74 *----------------------------------------------------------------------
75 */
76
77 NsOpenSSLContext *
78 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCreate">NsOpenSSLContextCreate</a>(char *server, char *name)
79 {
80 NsOpenSSLContext *sslcontext = NULL;
81 Ns_DString ds;
82 char *lockName = NULL;
83
84 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringInit">Ns_DStringInit</a>(&ds);
85
86 /*
87 * Check to see if the context name is already in use. The name of an SSL
88 * context must be unique within a virtual server.
89 */
90
91 if (<a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_Ns_OpenSSLServerSSLContextGet">Ns_OpenSSLServerSSLContextGet</a>(server, name) != NULL) {
92 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): SSL context with name %s already defined",
93 MODULE, server, name);
94 return NULL;
95 }
96
97 /*
98 * Create the SSL context.
99 */
100
101 sslcontext = ns_calloc(1, sizeof(*sslcontext));
102 Ns_MutexInit(&sslcontext->lock);
103 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringPrintf">Ns_DStringPrintf</a>(&ds, "ctx:%s", name);
104 lockName = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
105 Ns_MutexSetName2(&sslcontext->lock, MODULE_SHORT, lockName);
106 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringTrunc">Ns_DStringTrunc</a>(&ds, 0);
107 ns_free(lockName);
108 lockName = NULL;
109
110 /*
111 * Set SSL context initial values.
112 */
113
114 sslcontext->server = server;
115 sslcontext->name = name;
116 sslcontext->initialized = NS_FALSE;
117 sslcontext->refcnt = 0;
118 sslcontext->peerVerify = DEFAULT_PEER_VERIFY;
119 sslcontext->peerVerifyDepth = DEFAULT_PEER_VERIFY_DEPTH;
120 sslcontext->protocols = DEFAULT_PROTOCOLS;
121 sslcontext->cipherSuite = DEFAULT_CIPHER_LIST;
122 sslcontext->sessionCache = DEFAULT_SESSION_CACHE;
123 sslcontext->sessionCacheSize = DEFAULT_SESSION_CACHE_SIZE;
124 sslcontext->sessionCacheTimeout = DEFAULT_SESSION_CACHE_TIMEOUT;
125 sslcontext->trace = DEFAULT_TRACE;
126 sslcontext->bufsize = DEFAULT_BUFFER_SIZE;
127 sslcontext->timeout = DEFAULT_TIMEOUT;
128 sslcontext->sessionCacheId = <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextSessionCacheIdNew">SSLContextSessionCacheIdNew</a>(server);
129 <a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_HomePath">Ns_HomePath</a>(&ds, "servers", server, "modules", MODULE, NULL);
130 sslcontext->moduleDir = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
131 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringTrunc">Ns_DStringTrunc</a>(&ds, 0);
132 //<a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_HomePath">Ns_HomePath</a>(&ds, "servers", server, "modules", MODULE, DEFAULT_CERT_FILE, NULL);
133 //sslcontext->certFile = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
134 sslcontext->certFile = NULL;
135 //<a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringTrunc">Ns_DStringTrunc</a>(&ds, 0);
136
137 //<a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_HomePath">Ns_HomePath</a>(&ds, "servers", server, "modules", MODULE, DEFAULT_KEY_FILE, NULL);
138 //sslcontext->keyFile = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
139 sslcontext->keyFile = NULL;
140 //<a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringTrunc">Ns_DStringTrunc</a>(&ds, 0);
141
142 <a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_HomePath">Ns_HomePath</a>(&ds, "servers", server, "modules", MODULE, DEFAULT_CA_FILE, NULL);
143 sslcontext->caFile = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
144 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringTrunc">Ns_DStringTrunc</a>(&ds, 0);
145 <a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_HomePath">Ns_HomePath</a>(&ds, "servers", server, "modules", MODULE, DEFAULT_CA_DIR, NULL);
146 sslcontext->caDir = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
147 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringTrunc">Ns_DStringTrunc</a>(&ds, 0);
148 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringFree">Ns_DStringFree</a>(&ds);
149
150 return sslcontext;
151 }
152
153
154 /*
155 *----------------------------------------------------------------------
156 *
157 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextDestroy">NsOpenSSLContextDestroy</a> --
158 *
159 * Destroy an NsOpenSSLContext structure
160 *
161 * Results:
162 * NS_OK or NS_ERROR
163 *
164 * Side effects:
165 * Memory is deallocated.
166 *
167 *----------------------------------------------------------------------
168 */
169
170 int
171 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextDestroy">NsOpenSSLContextDestroy</a>(char *server, NsOpenSSLContext *sslcontext)
172 {
173 ns_free(sslcontext->certFile);
174 ns_free(sslcontext->keyFile);
175 ns_free(sslcontext->caFile);
176 ns_free(sslcontext->caDir);
177 ns_free(sslcontext);
178
179 #if 0
180 /* XXX REMOVE THE CONTEXT FROM THE SERVER STATE */
181 Ns_OpenSSLServerContextRemove();
182 #endif
183
184 return NS_OK;
185 }
186
187
188 /*
189 *----------------------------------------------------------------------
190 *
191 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextInit">NsOpenSSLContextInit</a> --
192 *
193 * Initialize an SSL Context. This runs all of the SSL_CTX calls to
194 * create the SSL instance template. This template is used to create the
195 * SSL objects for each connection.
196 *
197 * Results:
198 * NS_OK or NS_ERROR
199 *
200 * Side effects:
201 * Marks the SSL Context as 'read-only'; no changes can be made to the
202 * SSL Context after this point unless you explicitly call
203 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextRelease">NsOpenSSLContextRelease</a>.
204 *
205 *----------------------------------------------------------------------
206 */
207
208 /* XXX move most critical stuff to top of this func (i.e. cert doesn't load,
209 * XXX doesn't matter what else is done */
210 int
211 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextInit">NsOpenSSLContextInit</a>(char *server, NsOpenSSLContext *sslcontext)
212 {
213 if (sslcontext == NULL) {
214 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): SSL context is NULL", MODULE, server);
215 return NS_ERROR;
216 }
217 if (!STREQ(server, sslcontext->server)) {
218 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): SSL context server field (%s) does not match the virtual server name",
219 MODULE, server, sslcontext->server);
220 return NS_ERROR;
221 }
222
223 /*
224 * Initialize the SSL_CTX based on the role this context will play.
225 */
226
227 if (sslcontext->role) {
228 sslcontext->sslctx = SSL_CTX_new(SSLv23_server_method());
229 } else {
230 sslcontext->sslctx = SSL_CTX_new(SSLv23_client_method());
231 }
232
233 if (sslcontext->sslctx == NULL) {
234 /* XXX FAILURE: clean up and then free the struct */
235 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): OpenSSL failed to create new SSL_CTX structure",
236 MODULE, server);
237 return NS_ERROR;
238 }
239
240 /* XXX this is always over-ridden by SSL_set_app_data */
241 #if 0
242 /* Allows us to get context struct from within OpenSSL callbacks */
243 SSL_CTX_set_app_data(sslcontext->sslctx, sslcontext);
244 #endif
245
246 /* Enable SSL bug compatibility */
247 SSL_CTX_set_options(sslcontext->sslctx, SSL_OP_ALL);
248
249 /* This apparently prevents some sort of DH attack */
250 SSL_CTX_set_options(sslcontext->sslctx, SSL_OP_SINGLE_DH_USE);
251
252 /* Temporary key callback required for 40-bit export browsers */
253 SSL_CTX_set_tmp_rsa_callback(sslcontext->sslctx, <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_IssueTmpRSAKey">IssueTmpRSAKey</a>);
254
255 /*
256 * Failure in one of these will cause SSL context to be left uninitialized.
257 */
258
259 /*
260 * WARNING!: InitKeyFile *must* be called before InitCertFile; not doing so
261 * will cause subsequent calls to InitCertFile to fail with File Not Found
262 * error if you're using the same certificate and key for multiple driver
263 * instances. I believe this is a bug in OpenSSL, as the error returned
264 * comes from that library after the SSL_CTX_use_certificate_chain_file
265 * call.
266 */
267
268 if ( <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCiphersInit">SSLContextCiphersInit</a>(sslcontext) == NS_ERROR
269 || <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextProtocolsInit">SSLContextProtocolsInit</a>(sslcontext) == NS_ERROR
270 || <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCertFileInit">SSLContextCertFileInit</a>(sslcontext) == NS_ERROR
271 ) {
272 return NS_ERROR;
273 }
274
275 /*
276 * Peer verify initialization must come before CA file and directory
277 * initialization.
278 */
279
280 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextPeerVerifyDepthInit">SSLContextPeerVerifyDepthInit</a>(sslcontext);
281 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextPeerVerifyInit">SSLContextPeerVerifyInit</a>(sslcontext);
282 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCAFileInit">SSLContextCAFileInit</a>(sslcontext);
283 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCADirInit">SSLContextCADirInit</a>(sslcontext);
284 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextSessionCacheInit">SSLContextSessionCacheInit</a>(sslcontext);
285 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextTraceInit">SSLContextTraceInit</a>(sslcontext);
286
287 /*
288 * We succeeded in initializing the context. We now have an OpenSSL SSL_CTX
289 * structure we can use to create SSL connections.
290 */
291
292 sslcontext->initialized = 1;
293
294 return NS_OK;
295 }
296
297
298 /*
299 *----------------------------------------------------------------------
300 *
301 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextRelease">NsOpenSSLContextRelease</a> --
302 *
303 * Release an SSL Context so you can modify it.
304 *
305 * Results:
306 * NS_OK or NS_ERROR
307 *
308 * Side effects:
309 * An SSL Context that has a refcnt > 0 won't be released because refcnt
310 * conns are currently using the structure. Once released, the SSL
311 * Context can't be used for connections again until
312 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextInit">NsOpenSSLContextInit</a>() is called to (re-)initialize the SSL_CTX
313 * structure inside of it: this would be bad if you release the context
314 * used for incoming conns to your site.
315 *
316 *----------------------------------------------------------------------
317 */
318
319 #if 0
320 int
321 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextRelease">NsOpenSSLContextRelease</a>(char *server, NsOpenSSLContext *sslcontext)
322 {
323 if (sslcontext->readonly) {
324 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): attempting to modify a read-only SSL context",
325 MODULE, server);
326 return NS_ERROR;
327 }
328
329 /* XXX lock */
330 if (sslcontext->refcnt > 0) {
331 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): attempted to release SSL context '%s' while still in use by active connections",
332 MODULE, server, sslcontext->name);
333 return NS_ERROR;
334 }
335
336 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Warning, "%s (%s): releasing SSL context '%s' to be writeable",
337 MODULE, server, sslcontext->name);
338 sslcontext->readonly = NS_FALSE;
339 /* XXX unlock */
340
341 return NS_OK;
342 }
343 #endif
344
345
346 /*
347 *----------------------------------------------------------------------
348 *
349 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextRoleSet">NsOpenSSLContextRoleSet</a> --
350 *
351 * Set the role (either client or server)
352 *
353 * Results:
354 * NS_OK or NS_ERROR
355 *
356 * Side effects:
357 * None
358 *
359 *----------------------------------------------------------------------
360 */
361
362 int
363 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextRoleSet">NsOpenSSLContextRoleSet</a>(char *server, NsOpenSSLContext *sslcontext,
364 char *role)
365 {
366 Ns_MutexLock(&sslcontext->lock);
367 if (STREQ(role, "client")) {
368 sslcontext->role = 0;
369 } else if (STREQ(role, "server")) {
370 sslcontext->role = 1;
371 } else {
372 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): illegal SSL context role: '%s'", MODULE,
373 server, role);
374 return NS_ERROR;
375 }
376 Ns_MutexUnlock(&sslcontext->lock);
377
378 return NS_OK;
379 }
380
381
382 /*
383 *----------------------------------------------------------------------
384 *
385 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextRoleGet">NsOpenSSLContextRoleGet</a> --
386 *
387 * Get the role (either client or server)
388 *
389 * Results:
390 * NS_OK or NS_ERROR
391 *
392 * Side effects:
393 * None
394 *
395 *----------------------------------------------------------------------
396 */
397
398 char *
399 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextRoleGet">NsOpenSSLContextRoleGet</a>(char *server, NsOpenSSLContext *sslcontext)
400 {
401 Ns_MutexLock(&sslcontext->lock);
402 if (sslcontext->role == 0) {
403 return "client";
404 } else if (sslcontext->role == 1) {
405 return "server";
406 } else {
407 return "undefined";
408 }
409 Ns_MutexUnlock(&sslcontext->lock);
410
411 return NS_OK;
412 }
413
414
415 /*
416 *----------------------------------------------------------------------
417 *
418 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextModuleDirSet">NsOpenSSLContextModuleDirSet</a> --
419 *
420 * Set the module directory for a particular SSL context
421 *
422 * Results:
423 * NS_OK or NS_ERROR
424 *
425 * Side effects:
426 * None
427 *
428 *----------------------------------------------------------------------
429 */
430
431 int
432 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextModuleDirSet">NsOpenSSLContextModuleDirSet</a>(char *server, NsOpenSSLContext *sslcontext,
433 char *moduleDir)
434 {
435 Ns_MutexLock(&sslcontext->lock);
436 sslcontext->moduleDir = moduleDir;
437 Ns_MutexUnlock(&sslcontext->lock);
438
439 return NS_OK;
440 }
441
442
443 /*
444 *----------------------------------------------------------------------
445 *
446 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextModuleDirGet">NsOpenSSLContextModuleDirGet</a> --
447 *
448 * Get the module directory for a particular SSL context
449 *
450 * Results:
451 * String pointer; might be NULL
452 *
453 * Side effects:
454 * None
455 *
456 *----------------------------------------------------------------------
457 */
458
459 char *
460 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextModuleDirGet">NsOpenSSLContextModuleDirGet</a>(char *server, NsOpenSSLContext *sslcontext) {
461 return sslcontext->moduleDir;
462 }
463
464
465 /*
466 *----------------------------------------------------------------------
467 *
468 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCertFileSet">NsOpenSSLContextCertFileSet</a> --
469 *
470 * Sets and loads the specified certificate for the given SSL context.
471 * You MUST load the certificate before you attempt to load the private
472 * key. The certificate must be in PEM format. You can put the
473 * certificate chain in the same file: simply append the CA certs to the
474 * end of your certificate file and they'll be passed to the client at
475 * connection time. If no certs are appended, no cert chain will be
476 * passed to the client.
477 *
478 * Warning: you should have already set the context's moduleDir if you
479 * don't want the default. Alternatively, the certFile can be an absolute
480 * path. If it is a relative path, that path will be prepended by the
481 * whatever the moduleDir parameter is set to in your nsd.tcl file, or by
482 * the default moduleDir path.
483 *
484 * Results:
485 * NS_OK or NS_ERROR
486 *
487 * Side effects:
488 * Note that moduleDir must already be set before this call. It is
489 * guaranteed to be set to the default location already.
490 *
491 *----------------------------------------------------------------------
492 */
493
494 int
495 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCertFileSet">NsOpenSSLContextCertFileSet</a>(char *server, NsOpenSSLContext *sslcontext,
496 char *certFile)
497 {
498 Ns_DString ds;
499
500 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringInit">Ns_DStringInit</a>(&ds);
501 Ns_MutexLock(&sslcontext->lock);
502 sslcontext->certFile = ns_strdup(certFile);
503 if (!<a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_PathIsAbsolute">Ns_PathIsAbsolute</a>(sslcontext->certFile)) {
504 <a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_MakePath">Ns_MakePath</a>(&ds, sslcontext->moduleDir, sslcontext->certFile, NULL);
505 sslcontext->certFile = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
506 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringFree">Ns_DStringFree</a>(&ds);
507 }
508 Ns_MutexUnlock(&sslcontext->lock);
509
510 return NS_OK;
511 }
512
513
514 /*
515 *----------------------------------------------------------------------
516 *
517 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCertFileGet">NsOpenSSLContextCertFileGet</a> --
518 *
519 * Get the certificate pathname for a particular SSL context
520 *
521 * Results:
522 * String pointer; might be NULL
523 *
524 * Side effects:
525 * None
526 *
527 *----------------------------------------------------------------------
528 */
529
530 char *
531 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCertFileGet">NsOpenSSLContextCertFileGet</a>(char *server, NsOpenSSLContext *sslcontext)
532 {
533 return sslcontext->certFile;
534 }
535
536
537 /*
538 *----------------------------------------------------------------------
539 *
540 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextKeyFileSet">NsOpenSSLContextKeyFileSet</a> --
541 *
542 * Set the private key pathname for a particular SSL context,
543 * load the key and validate that it works with the certificate.
544 * The key MUST NOT be passphrase-protected.
545 *
546 * Results:
547 * NS_OK or NS_ERROR
548 *
549 * Side effects:
550 * None
551 *
552 *----------------------------------------------------------------------
553 */
554
555 int
556 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextKeyFileSet">NsOpenSSLContextKeyFileSet</a>(char *server, NsOpenSSLContext *sslcontext,
557 char *keyFile)
558 {
559 Ns_DString ds;
560
561 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringInit">Ns_DStringInit</a>(&ds);
562 Ns_MutexLock(&sslcontext->lock);
563 sslcontext->keyFile = ns_strdup(keyFile);
564 if (!<a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_PathIsAbsolute">Ns_PathIsAbsolute</a>(sslcontext->keyFile)) {
565 <a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_MakePath">Ns_MakePath</a>(&ds, sslcontext->moduleDir, sslcontext->keyFile, NULL);
566 sslcontext->keyFile = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
567 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringFree">Ns_DStringFree</a>(&ds);
568 }
569 Ns_MutexUnlock(&sslcontext->lock);
570
571 return NS_OK;
572 }
573
574
575 /*
576 *----------------------------------------------------------------------
577 *
578 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextKeyFileGet">NsOpenSSLContextKeyFileGet</a> --
579 *
580 * Get the key pathname for a particular SSL context
581 *
582 * Results:
583 * NS_OK or NS_ERROR
584 *
585 * Side effects:
586 * None
587 *
588 *----------------------------------------------------------------------
589 */
590
591 char *
592 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextKeyFileGet">NsOpenSSLContextKeyFileGet</a>(char *server, NsOpenSSLContext *sslcontext)
593 {
594 return sslcontext->keyFile;
595 }
596
597
598 /*
599 *----------------------------------------------------------------------
600 *
601 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCipherSuiteSet">NsOpenSSLContextCipherSuiteSet</a> --
602 *
603 * Set the cipher suite for a particular SSL context
604 *
605 * Results:
606 * NS_OK or NS_ERROR
607 *
608 * Side effects:
609 * None
610 *
611 *----------------------------------------------------------------------
612 */
613
614 int
615 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCipherSuiteSet">NsOpenSSLContextCipherSuiteSet</a>(char *server, NsOpenSSLContext *sslcontext,
616 char *cipherSuite)
617 {
618 Ns_MutexLock(&sslcontext->lock);
619 sslcontext->cipherSuite = cipherSuite;
620 Ns_MutexUnlock(&sslcontext->lock);
621
622 return NS_OK;
623 }
624
625
626 /*
627 *----------------------------------------------------------------------
628 *
629 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCipherSuiteGet">NsOpenSSLContextCipherSuiteGet</a> --
630 *
631 * Get the cipher suite string for a particular SSL context
632 *
633 * Results:
634 * NS_OK or NS_ERROR
635 *
636 * Side effects:
637 * None
638 *
639 *----------------------------------------------------------------------
640 */
641
642 char *
643 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCipherSuiteGet">NsOpenSSLContextCipherSuiteGet</a>(char *server, NsOpenSSLContext *sslcontext)
644 {
645 return sslcontext->cipherSuite;
646 }
647
648
649 /*
650 *----------------------------------------------------------------------
651 *
652 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextProtocolsSet">NsOpenSSLContextProtocolsSet</a> --
653 *
654 * Set the protocols for a particular SSL context
655 *
656 * Results:
657 * NS_OK or NS_ERROR
658 *
659 * Side effects:
660 * None
661 *
662 *----------------------------------------------------------------------
663 */
664
665 int
666 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextProtocolsSet">NsOpenSSLContextProtocolsSet</a>(char *server, NsOpenSSLContext *sslcontext,
667 char *protocols)
668 {
669 Ns_MutexLock(&sslcontext->lock);
670 sslcontext->protocols = protocols;
671 Ns_MutexUnlock(&sslcontext->lock);
672
673 return NS_OK;
674 }
675
676
677 /*
678 *----------------------------------------------------------------------
679 *
680 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextProtocolsGet">NsOpenSSLContextProtocolsGet</a> --
681 *
682 * Get the protocols for a particular SSL context
683 *
684 * Results:
685 * ????
686 *
687 * Side effects:
688 * None
689 *
690 *----------------------------------------------------------------------
691 */
692
693 char *
694 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextProtocolsGet">NsOpenSSLContextProtocolsGet</a>(char *server, NsOpenSSLContext *sslcontext)
695 {
696 return sslcontext->protocols;
697 }
698
699
700 /*
701 *----------------------------------------------------------------------
702 *
703 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCAFileSet">NsOpenSSLContextCAFileSet</a> --
704 *
705 * Set the CA file for a particular SSL context and load it.
706 *
707 * Results:
708 * NS_OK or NS_ERROR
709 *
710 * Side effects:
711 * None
712 *
713 *----------------------------------------------------------------------
714 */
715
716 /* XXX change all these to return voids */
717 int
718 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCAFileSet">NsOpenSSLContextCAFileSet</a>(char *server, NsOpenSSLContext *sslcontext,
719 char *caFile)
720 {
721 Ns_DString ds;
722
723 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringInit">Ns_DStringInit</a>(&ds);
724 Ns_MutexLock(&sslcontext->lock);
725 sslcontext->caFile = ns_strdup(caFile);
726 if (!<a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_PathIsAbsolute">Ns_PathIsAbsolute</a>(sslcontext->caFile)) {
727 <a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_MakePath">Ns_MakePath</a>(&ds, sslcontext->moduleDir, sslcontext->caFile, NULL);
728 sslcontext->caFile = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
729 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringFree">Ns_DStringFree</a>(&ds);
730 }
731 Ns_MutexUnlock(&sslcontext->lock);
732
733 return NS_OK;
734 }
735
736
737 /*
738 *----------------------------------------------------------------------
739 *
740 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCAFileGet">NsOpenSSLContextCAFileGet</a> --
741 *
742 * Get the CA file for a particular SSL context
743 *
744 * Results:
745 * String pointer; might be NULL
746 *
747 * Side effects:
748 * None
749 *
750 *----------------------------------------------------------------------
751 */
752
753 char *
754 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCAFileGet">NsOpenSSLContextCAFileGet</a>(char *server, NsOpenSSLContext *sslcontext)
755 {
756 return sslcontext->caFile;
757 }
758
759
760 /*
761 *----------------------------------------------------------------------
762 *
763 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCADirSet">NsOpenSSLContextCADirSet</a> --
764 *
765 * Set the CA directory for a particular SSL context
766 *
767 * Results:
768 * NS_OK or NS_ERROR
769 *
770 * Side effects:
771 * None
772 *
773 *----------------------------------------------------------------------
774 */
775
776 int
777 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCADirSet">NsOpenSSLContextCADirSet</a>(char *server, NsOpenSSLContext *sslcontext,
778 char *caDir)
779 {
780 Ns_DString ds;
781
782 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringInit">Ns_DStringInit</a>(&ds);
783 Ns_MutexLock(&sslcontext->lock);
784 sslcontext->caDir = ns_strdup(caDir);
785 if (!<a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_PathIsAbsolute">Ns_PathIsAbsolute</a>(sslcontext->caDir)) {
786 <a href="/cvs/aolserver/aolserver/nsd/pathname.c#A_Ns_MakePath">Ns_MakePath</a>(&ds, sslcontext->moduleDir, sslcontext->caDir, NULL);
787 sslcontext->caDir = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
788 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringFree">Ns_DStringFree</a>(&ds);
789 }
790 Ns_MutexUnlock(&sslcontext->lock);
791
792 return NS_OK;
793 }
794
795
796 /*
797 *----------------------------------------------------------------------
798 *
799 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCADirGet">NsOpenSSLContextCADirGet</a> --
800 *
801 * Get the CA directory for a particular SSL context
802 *
803 * Results:
804 * String pointer, might be NULL
805 *
806 * Side effects:
807 * None
808 *
809 *----------------------------------------------------------------------
810 */
811
812 char *
813 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextCADirGet">NsOpenSSLContextCADirGet</a>(char *server, NsOpenSSLContext *sslcontext)
814 {
815 return sslcontext->caDir;
816 }
817
818
819 /*
820 *----------------------------------------------------------------------
821 *
822 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextPeerVerifySet">NsOpenSSLContextPeerVerifySet</a> --
823 *
824 * Set whether peer verify is on or off for a particular SSL
825 * context
826 *
827 * Results:
828 * NS_OK or NS_ERROR
829 *
830 * Side effects:
831 * None
832 *
833 *----------------------------------------------------------------------
834 */
835
836 int
837 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextPeerVerifySet">NsOpenSSLContextPeerVerifySet</a>(char *server, NsOpenSSLContext *sslcontext,
838 int peerVerify)
839 {
840 /* XXX handle default case where peerVerify is NULL */
841 Ns_MutexLock(&sslcontext->lock);
842 sslcontext->peerVerify = peerVerify;
843 Ns_MutexUnlock(&sslcontext->lock);
844
845 return NS_OK;
846 }
847
848
849 /*
850 *----------------------------------------------------------------------
851 *
852 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextPeerVerifyGet">NsOpenSSLContextPeerVerifyGet</a> --
853 *
854 * Get whether peer verify is on or off for a particular SSL
855 * context
856 *
857 * Results:
858 * NS_TRUE or NS_FALSE
859 *
860 * Side effects:
861 * None
862 *
863 *----------------------------------------------------------------------
864 */
865
866 int
867 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextPeerVerifyGet">NsOpenSSLContextPeerVerifyGet</a>(char *server, NsOpenSSLContext *sslcontext)
868 {
869 return sslcontext->peerVerify;
870 }
871
872
873 /*
874 *----------------------------------------------------------------------
875 *
876 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextPeerVerifyDepthSet">NsOpenSSLContextPeerVerifyDepthSet</a> --
877 *
878 * Set the depth that a peer certificate can be chained for
879 * validation purposes for a particular SSL context
880 *
881 * Results:
882 * NS_OK or NS_ERROR
883 *
884 * Side effects:
885 * None
886 *
887 *----------------------------------------------------------------------
888 */
889
890 int
891 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextPeerVerifyDepthSet">NsOpenSSLContextPeerVerifyDepthSet</a>(char *server, NsOpenSSLContext *sslcontext,
892 int peerVerifyDepth)
893 {
894 Ns_MutexLock(&sslcontext->lock);
895 sslcontext->peerVerifyDepth = peerVerifyDepth;
896 Ns_MutexUnlock(&sslcontext->lock);
897
898 return NS_OK;
899 }
900
901
902 /*
903 *----------------------------------------------------------------------
904 *
905 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextPeerVerifyDepthGet">NsOpenSSLContextPeerVerifyDepthGet</a> --
906 *
907 * Get the depth that a peer certificate can be chained for
908 * validation purposes for a particular SSL context
909 *
910 * Results:
911 * Integer
912 *
913 * Side effects:
914 * None
915 *
916 *----------------------------------------------------------------------
917 */
918
919 int
920 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextPeerVerifyDepthGet">NsOpenSSLContextPeerVerifyDepthGet</a>(char *server, NsOpenSSLContext *sslcontext)
921 {
922 return sslcontext->peerVerifyDepth;
923 }
924
925
926 /*
927 *----------------------------------------------------------------------
928 *
929 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheSet">NsOpenSSLContextSessionCacheSet</a> --
930 *
931 * Set whether session caching is on or off for a particular SSL
932 * context
933 *
934 * Results:
935 * NS_OK or NS_ERROR
936 *
937 * Side effects:
938 * None
939 *
940 *----------------------------------------------------------------------
941 */
942
943 int
944 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheSet">NsOpenSSLContextSessionCacheSet</a>(char *server, NsOpenSSLContext *sslcontext,
945 int sessionCache)
946 {
947 Ns_MutexLock(&sslcontext->lock);
948 sslcontext->sessionCache = sessionCache;
949 Ns_MutexUnlock(&sslcontext->lock);
950
951 return NS_OK;
952 }
953
954
955 /*
956 *----------------------------------------------------------------------
957 *
958 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheGet">NsOpenSSLContextSessionCacheGet</a> --
959 *
960 * Get whether session caching is on or off for a particular SSL
961 * context
962 *
963 * Results:
964 * NS_TRUE or NS_FALSE
965 *
966 * Side effects:
967 * None
968 *
969 *----------------------------------------------------------------------
970 */
971
972 /* XXX should I be managing these function calls by passing the name */
973 /* XXX of the context rather than a pointer to the context itself? */
974 int
975 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheGet">NsOpenSSLContextSessionCacheGet</a>(char *server, NsOpenSSLContext *sslcontext)
976 {
977 return sslcontext->sessionCache;
978 }
979
980
981 /*
982 *----------------------------------------------------------------------
983 *
984 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheSizeSet">NsOpenSSLContextSessionCacheSizeSet</a> --
985 *
986 * Set the size of a session cache for a particular SSL context
987 *
988 * Results:
989 * NS_OK or NS_ERROR
990 *
991 * Side effects:
992 * None
993 *
994 *----------------------------------------------------------------------
995 */
996
997 int
998 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheSizeSet">NsOpenSSLContextSessionCacheSizeSet</a>(char *server, NsOpenSSLContext *sslcontext,
999 int sessionCacheSize)
1000 {
1001 Ns_MutexLock(&sslcontext->lock);
1002 sslcontext->sessionCacheSize = sessionCacheSize;
1003 Ns_MutexUnlock(&sslcontext->lock);
1004
1005 return NS_OK;
1006 }
1007
1008
1009 /*
1010 *----------------------------------------------------------------------
1011 *
1012 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheSizeGet">NsOpenSSLContextSessionCacheSizeGet</a> --
1013 *
1014 * Get the size of a session cache for a particular SSL context
1015 *
1016 * Results:
1017 * Integer
1018 *
1019 * Side effects:
1020 * None
1021 *
1022 *----------------------------------------------------------------------
1023 */
1024
1025 /* XXX should session cache size be limited to size int? */
1026 int
1027 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheSizeGet">NsOpenSSLContextSessionCacheSizeGet</a>(char *server, NsOpenSSLContext *sslcontext)
1028 {
1029 return sslcontext->sessionCacheSize;
1030 }
1031
1032
1033 /*
1034 *----------------------------------------------------------------------
1035 *
1036 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheTimeoutSet">NsOpenSSLContextSessionCacheTimeoutSet</a> --
1037 *
1038 * Set the timeout for cache entries for a particular SSL context
1039 *
1040 * Results:
1041 * NS_OK or NS_ERROR
1042 *
1043 * Side effects:
1044 * None
1045 *
1046 *----------------------------------------------------------------------
1047 */
1048
1049 int
1050 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheTimeoutSet">NsOpenSSLContextSessionCacheTimeoutSet</a>(char *server, NsOpenSSLContext *sslcontext,
1051 int sessionCacheTimeout)
1052 {
1053 Ns_MutexLock(&sslcontext->lock);
1054 sslcontext->sessionCacheTimeout = sessionCacheTimeout;
1055 Ns_MutexUnlock(&sslcontext->lock);
1056
1057 return NS_OK;
1058 }
1059
1060
1061 /*
1062 *----------------------------------------------------------------------
1063 *
1064 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheTimeoutGet">NsOpenSSLContextSessionCacheTimeoutGet</a> --
1065 *
1066 * Get the timeout for cache entries for a particular SSL context
1067 *
1068 * Results:
1069 * Integer
1070 *
1071 * Side effects:
1072 * None
1073 *
1074 *----------------------------------------------------------------------
1075 */
1076
1077 int
1078 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextSessionCacheTimeoutGet">NsOpenSSLContextSessionCacheTimeoutGet</a>(char *server, NsOpenSSLContext *sslcontext)
1079 {
1080 return sslcontext->sessionCacheTimeout;
1081 }
1082
1083
1084 /*
1085 *----------------------------------------------------------------------
1086 *
1087 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextTraceSet">NsOpenSSLContextTraceSet</a> --
1088 *
1089 * Set SSL handshake tracing for a particular SSL context
1090 *
1091 * Results:
1092 * NS_OK or NS_ERROR
1093 *
1094 * Side effects:
1095 * None
1096 *
1097 *----------------------------------------------------------------------
1098 */
1099
1100 int
1101 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextTraceSet">NsOpenSSLContextTraceSet</a>(char *server, NsOpenSSLContext *sslcontext,
1102 int trace)
1103 {
1104 Ns_MutexLock(&sslcontext->lock);
1105 sslcontext->trace = trace;
1106 Ns_MutexUnlock(&sslcontext->lock);
1107
1108 return NS_OK;
1109 }
1110
1111
1112 /*
1113 *----------------------------------------------------------------------
1114 *
1115 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextTraceGet">NsOpenSSLContextTraceGet</a> --
1116 *
1117 * Get SSL handshake tracing for a particular SSL context
1118 *
1119 * Results:
1120 * NS_TRUE or NS_FALSE
1121 *
1122 * Side effects:
1123 * None
1124 *
1125 *----------------------------------------------------------------------
1126 */
1127
1128 int
1129 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextTraceGet">NsOpenSSLContextTraceGet</a>(char *server, NsOpenSSLContext *sslcontext)
1130 {
1131 return sslcontext->trace;
1132 }
1133
1134
1135 /*
1136 *----------------------------------------------------------------------
1137 *
1138 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLServerGet">NsOpenSSLServerGet</a> --
1139 *
1140 * Return the named virtual server's state structure.
1141 *
1142 * Results:
1143 * A pointer to Server struct.
1144 *
1145 * Side effects:
1146 *
1147 *----------------------------------------------------------------------
1148 */
1149
1150 Server *
1151 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLServerGet">NsOpenSSLServerGet</a>(char *server)
1152 {
1153 Server *thisServer = NULL;
1154 Tcl_HashEntry *hPtr = NULL;
1155
1156 /* XXX lock */
1157 hPtr = Tcl_FindHashEntry(&NsOpenSSLServers, server);
1158 if (hPtr != NULL) {
1159 thisServer = Tcl_GetHashValue(hPtr);
1160 }
1161 /* XXX unlock */
1162
1163 return thisServer;
1164 }
1165
1166
1167 /*
1168 *----------------------------------------------------------------------
1169 *
1170 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextAdd">NsOpenSSLContextAdd</a> --
1171 *
1172 * Add an SSL context to a server state info
1173 *
1174 * Results:
1175 * NS_OK or NS_ERROR
1176 *
1177 * Side effects:
1178 *
1179 *----------------------------------------------------------------------
1180 */
1181
1182 void
1183 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextAdd">NsOpenSSLContextAdd</a>(char *server, NsOpenSSLContext *sslcontext)
1184 {
1185 Server *thisServer = NULL;
1186 Tcl_HashEntry *hPtr = NULL;
1187 int new = 0;
1188
1189 if (sslcontext == NULL) {
1190 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Warning, "%s (%s): attempt to add SSL context to server failed",
1191 MODULE, server);
1192 } else {
1193 thisServer = <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLServerGet">NsOpenSSLServerGet</a>(server);
1194 Ns_MutexLock(&thisServer->lock);
1195 hPtr = Tcl_CreateHashEntry(&thisServer->sslcontexts, sslcontext->name, &new);
1196 if (new) {
1197 Tcl_SetHashValue(hPtr, sslcontext);
1198 } else {
1199 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): duplicate SSL context name: %s",
1200 MODULE, server, sslcontext->name);
1201 }
1202 Ns_MutexUnlock(&thisServer->lock);
1203 }
1204
1205 return;
1206 }
1207
1208
1209 /*
1210 *----------------------------------------------------------------------
1211 *
1212 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextRemove">NsOpenSSLContextRemove</a> --
1213 *
1214 * Remove an SSL context from server state info
1215 *
1216 * Results:
1217 * NS_OK or NS_ERROR
1218 *
1219 * Side effects:
1220 *
1221 *----------------------------------------------------------------------
1222 */
1223
1224 void
1225 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextRemove">NsOpenSSLContextRemove</a>(char *server, NsOpenSSLContext *sslcontext)
1226 {
1227 Server *thisServer = NULL;
1228 Tcl_HashEntry *hPtr = NULL;
1229
1230 if (sslcontext == NULL) {
1231 return;
1232 }
1233 thisServer = <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLServerGet">NsOpenSSLServerGet</a>(server);
1234 Ns_MutexLock(&thisServer->lock);
1235 hPtr = Tcl_FindHashEntry(&thisServer->sslcontexts, sslcontext->name);
1236 if (hPtr != NULL) {
1237 Tcl_DeleteHashEntry(hPtr);
1238 }
1239 Ns_MutexUnlock(&thisServer->lock);
1240
1241 return;
1242 }
1243
1244
1245 /*
1246 *----------------------------------------------------------------------
1247 *
1248 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_Ns_OpenSSLServerSSLContextGet">Ns_OpenSSLServerSSLContextGet</a> --
1249 *
1250 * Get an SSL context from server state info
1251 *
1252 * Results:
1253 * NS_OK or NS_ERROR
1254 *
1255 * Side effects:
1256 *
1257 *----------------------------------------------------------------------
1258 */
1259
1260 NsOpenSSLContext *
1261 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_Ns_OpenSSLServerSSLContextGet">Ns_OpenSSLServerSSLContextGet</a>(char *server, char *name)
1262 {
1263 NsOpenSSLContext *sslcontext = NULL;
1264 Server *thisServer = NULL;
1265 Tcl_HashEntry *hPtr = NULL;
1266
1267 if (name == NULL) {
1268 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): attempt to get SSL context with NULL name",
1269 MODULE, server);
1270 return NULL;
1271 }
1272 thisServer = <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLServerGet">NsOpenSSLServerGet</a>(server);
1273 Ns_MutexLock(&thisServer->lock);
1274 hPtr = Tcl_FindHashEntry(&thisServer->sslcontexts, name);
1275 if (hPtr != NULL) {
1276 sslcontext = Tcl_GetHashValue(hPtr);
1277 }
1278 Ns_MutexUnlock(&thisServer->lock);
1279
1280 return sslcontext;
1281 }
1282
1283
1284 /*
1285 *----------------------------------------------------------------------
1286 *
1287 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextServerDefaultGet">NsOpenSSLContextServerDefaultGet</a> --
1288 *
1289 * Return the virtual server's default server SSL context.
1290 *
1291 * Results:
1292 *
1293 * Side effects:
1294 *
1295 *----------------------------------------------------------------------
1296 */
1297
1298 NsOpenSSLContext *
1299 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextServerDefaultGet">NsOpenSSLContextServerDefaultGet</a>(char *server)
1300 {
1301 Server *thisServer = <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLServerGet">NsOpenSSLServerGet</a>(server);
1302
1303 return <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_Ns_OpenSSLServerSSLContextGet">Ns_OpenSSLServerSSLContextGet</a>(server, thisServer->defaultservercontext);
1304 }
1305
1306
1307 /*
1308 *----------------------------------------------------------------------
1309 *
1310 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextClientDefaultGet">NsOpenSSLContextClientDefaultGet</a> --
1311 *
1312 * Return the virtual server's default client SSL context.
1313 *
1314 * Results:
1315 *
1316 * Side effects:
1317 *
1318 *----------------------------------------------------------------------
1319 */
1320
1321 NsOpenSSLContext *
1322 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLContextClientDefaultGet">NsOpenSSLContextClientDefaultGet</a>(char *server)
1323 {
1324 Server *thisServer = <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLServerGet">NsOpenSSLServerGet</a>(server);
1325
1326 return <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_Ns_OpenSSLServerSSLContextGet">Ns_OpenSSLServerSSLContextGet</a>(server, thisServer->defaultclientcontext);
1327 }
1328
1329
1330 /*
1331 *----------------------------------------------------------------------
1332 *
1333 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_IssueTmpRSAKey">IssueTmpRSAKey</a> --
1334 *
1335 * Give out the temporary key when needed. This is a callback
1336 * function used by OpenSSL and is required for 40-bit browsers.
1337 *
1338 * Results:
1339 * Returns a pointer to the server's temporary RSA key.
1340 *
1341 * Side effects:
1342 * None
1343 *
1344 *----------------------------------------------------------------------
1345 */
1346
1347 static RSA *
1348 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_IssueTmpRSAKey">IssueTmpRSAKey</a>(SSL *ssl, int export, int keylen)
1349 {
1350 NsOpenSSLConn *sslconn;
1351 char *server = "none";
1352 RSA *rsaPtr = NULL;
1353
1354 sslconn = (NsOpenSSLConn *) SSL_get_app_data(ssl);
1355 if (sslconn != NULL && sslconn->ssldriver != NULL) {
1356 server = sslconn->ssldriver->server;
1357 }
1358
1359 switch (keylen) {
1360 case 512:
1361 rsaPtr = rsa_512;
1362 break;
1363
1364 case 1024:
1365 rsaPtr = rsa_1024;
1366 break;
1367
1368 default:
1369 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "nsopenssl (%s): unexpected request for a %d-bit temporary RSA key", server, keylen);
1370 break;
1371 }
1372
1373 return rsaPtr;
1374 }
1375
1376 int
1377 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsMakeTmpRSAKey">NsMakeTmpRSAKey</a>(int keylen)
1378 {
1379 RSA **rsaPtrPtr;
1380
1381 switch (keylen) {
1382 case 512:
1383 rsaPtrPtr = &rsa_512;
1384 break;
1385
1386 case 1024:
1387 rsaPtrPtr = &rsa_1024;
1388 break;
1389
1390 default:
1391 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "nsopenssl: unexpected request to generate a %d-bit temporary RSA key", keylen);
1392 return NS_ERROR;
1393 }
1394
1395 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "nsopenssl: generating %d-bit temporary RSA key ...",
1396 keylen);
1397 *rsaPtrPtr = RSA_generate_key(keylen, RSA_F4, NULL, NULL);
1398
1399 return NS_OK;
1400 }
1401
1402
1403 /*
1404 *----------------------------------------------------------------------
1405 *
1406 * Ns_OpenSSLSessionCacheIdNew --
1407 *
1408 * Generate and return a new session cache id. Because we need each session
1409 * cache to have a unique id across the entire application, we prefix the
1410 * number with the module name and the name of the virtual server. We check
1411 * to ensure that the generated cache id is not greater than
1412 * SSL_MAX_SSL_SESSION_ID_LENGTH, which at the time of this writing is 32
1413 * bytes.
1414 *
1415 * Results:
1416 *
1417 * Side effects:
1418 *
1419 *----------------------------------------------------------------------
1420 */
1421
1422 static char *
1423 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextSessionCacheIdNew">SSLContextSessionCacheIdNew</a>(char *server)
1424 {
1425 Server *thisServer = <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_NsOpenSSLServerGet">NsOpenSSLServerGet</a>(server);
1426 Ns_DString ds;
1427 char *sessionCacheId = NULL;
1428 int id = 0;
1429
1430 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringInit">Ns_DStringInit</a>(&ds);
1431 Ns_MutexLock(&thisServer->lock);
1432 id = thisServer->nextSessionCacheId;
1433 thisServer->nextSessionCacheId++;
1434 Ns_MutexUnlock(&thisServer->lock);
1435 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringPrintf">Ns_DStringPrintf</a>(&ds, "%s:%s:%d", MODULE, server, id);
1436 if (<a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringLength">Ns_DStringLength</a>(&ds) > SSL_MAX_SSL_SESSION_ID_LENGTH) {
1437 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): session cache id generated is too big; truncating",
1438 MODULE, server);
1439 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringTrunc">Ns_DStringTrunc</a>(&ds, 0);
1440 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringPrintf">Ns_DStringPrintf</a>(&ds, "%s:%d", server, id);
1441 }
1442 sessionCacheId = <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringExport">Ns_DStringExport</a>(&ds);
1443 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringFree">Ns_DStringFree</a>(&ds);
1444
1445 return sessionCacheId;
1446 }
1447
1448
1449 /*
1450 *----------------------------------------------------------------------
1451 *
1452 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCertFileInit">SSLContextCertFileInit</a> --
1453 *
1454 * Load SSL context's key and certificate files.
1455 *
1456 * Results:
1457 * NS_OK or NS_ERROR
1458 *
1459 * Side effects:
1460 *
1461 *----------------------------------------------------------------------
1462 */
1463
1464 static int
1465 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCertFileInit">SSLContextCertFileInit</a>(NsOpenSSLContext *sslcontext)
1466 {
1467 /*
1468 * Certificate is optional for clients as long as the server's they connect
1469 * to don't request and require them to provide one. Certificates are
1470 * required for SSL servers.
1471 */
1472
1473 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Debug, "KeyFile = %s; CertFile = %s", sslcontext->keyFile, sslcontext->certFile);
1474
1475 if (sslcontext->keyFile == NULL || sslcontext->certFile == NULL) {
1476 if (sslcontext->role == SERVER_ROLE) {
1477 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): certificate and key files must both be defined for server SSL context %s",
1478 MODULE, sslcontext->server, sslcontext->name);
1479 return NS_ERROR;
1480 }
1481 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): no cert or key defined for client SSL context '%s' (this may be ok)"
1482 MODULE, sslcontext->server, sslcontext->name);
1483 return NS_OK;
1484 }
1485
1486 /*
1487 * Make sure we can get to the certificate and key files.
1488 */
1489
1490 if ((access(sslcontext->certFile, F_OK) != 0) || (access(sslcontext->certFile, R_OK) != 0)) {
1491 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): '%s' certificate file is not readable or does not exist",
1492 MODULE, sslcontext->server, sslcontext->name);
1493 return NS_ERROR;
1494 }
1495
1496 if ((access(sslcontext->keyFile, F_OK) != 0) || (access(sslcontext->keyFile, R_OK) != 0)) {
1497 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): '%s' key file is not readable or does not exist",
1498 MODULE, sslcontext->server, sslcontext->name);
1499 return NS_ERROR;
1500 }
1501
1502 /*
1503 * Load the certificate into the SSL context
1504 */
1505
1506 if (SSL_CTX_use_PrivateKey_file(sslcontext->sslctx, sslcontext->keyFile, SSL_FILETYPE_PEM) == 0) {
1507 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): error loading key file '%s'",
1508 MODULE, sslcontext->server, sslcontext->keyFile);
1509 return NS_ERROR;
1510 }
1511
1512 if (SSL_CTX_use_certificate_chain_file(sslcontext->sslctx, sslcontext->certFile) == 0) {
1513 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): error loading certificate file '%s'",
1514 MODULE, sslcontext->server, sslcontext->certFile);
1515 return NS_ERROR;
1516 }
1517
1518 if (SSL_CTX_check_private_key(sslcontext->sslctx) == 0) {
1519 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): '%s' private key does not match certificate",
1520 MODULE, sslcontext->server, sslcontext->name);
1521 return NS_ERROR;
1522 }
1523
1524 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): '%s' certificate and key loaded successfully",
1525 MODULE, sslcontext->server, sslcontext->name);
1526
1527 return NS_OK;
1528 }
1529
1530
1531 /*
1532 *----------------------------------------------------------------------
1533 *
1534 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCAFileInit">SSLContextCAFileInit</a> --
1535 *
1536 * Loads SSL context's CA file
1537 *
1538 * Results:
1539 * NS_OK or NS_ERROR
1540 *
1541 * Side effects:
1542 *
1543 *----------------------------------------------------------------------
1544 */
1545
1546 static void
1547 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCAFileInit">SSLContextCAFileInit</a>(NsOpenSSLContext *sslcontext)
1548 {
1549 if (sslcontext->caFile == NULL ||
1550 SSL_CTX_load_verify_locations(sslcontext->sslctx, sslcontext->caFile, NULL) == 0) {
1551 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): '%s' failed to load CA certificate file '%s'",
1552 MODULE, sslcontext->server, sslcontext->name, sslcontext->caFile);
1553 if (sslcontext->peerVerify)
1554 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): '%s' is set to verify peers; CA \
1555 certificates are required to perform peer verification",
1556 MODULE, sslcontext->server, sslcontext->name);
1557 if ((access(sslcontext->caFile, F_OK) != 0) || (access(sslcontext->caFile, R_OK) != 0))
1558 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): '%s' CA certificate file is not readable or does not exist",
1559 MODULE, sslcontext->server, sslcontext->name);
1560 } else {
1561 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): '%s' CA file loaded successfully",
1562 MODULE, sslcontext->server, sslcontext->name);
1563 }
1564 }
1565
1566
1567 /*
1568 *----------------------------------------------------------------------
1569 *
1570 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCADirInit">SSLContextCADirInit</a> --
1571 *
1572 * Initializes SSL context's CA directory
1573 *
1574 * Results:
1575 * NS_OK or NS_ERROR
1576 *
1577 * Side effects:
1578 *
1579 *----------------------------------------------------------------------
1580 */
1581
1582 static void
1583 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCADirInit">SSLContextCADirInit</a>(NsOpenSSLContext *sslcontext)
1584 {
1585 DIR *dirfp = NULL;
1586
1587 if (sslcontext->caDir == NULL ||
1588 SSL_CTX_load_verify_locations(sslcontext->sslctx, NULL, sslcontext->caDir) == 0) {
1589 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Warning, "%s (%s): '%s' error using CA directory '%s'",
1590 MODULE, sslcontext->server, sslcontext->name, sslcontext->caDir);
1591 dirfp = opendir(sslcontext->caDir);
1592 if (dirfp == NULL) {
1593 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Warning, "%s (%s): '%s' cannot open CA certificate directory",
1594 MODULE, sslcontext->server, sslcontext->name);
1595 }
1596 closedir(dirfp);
1597 }
1598 }
1599
1600
1601 /*
1602 *----------------------------------------------------------------------
1603 *
1604 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCiphersInit">SSLContextCiphersInit</a> --
1605 *
1606 * Initialize cipher suite for an SSL context.
1607 *
1608 * Results:
1609 * NS_OK or NS_ERROR
1610 *
1611 * Side effects:
1612 *
1613 *----------------------------------------------------------------------
1614 */
1615
1616 static int
1617 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextCiphersInit">SSLContextCiphersInit</a>(NsOpenSSLContext *sslcontext)
1618 {
1619 if (SSL_CTX_set_cipher_list(sslcontext->sslctx, sslcontext->cipherSuite) == 0) {
1620 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): '%s' error setting cipher suite to '%s'",
1621 MODULE, sslcontext->server, sslcontext->name, sslcontext->cipherSuite);
1622 return NS_ERROR;
1623 }
1624 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): '%s' ciphers loaded successfully",
1625 MODULE, sslcontext->server, sslcontext->name);
1626
1627 return NS_OK;
1628 }
1629
1630
1631 /*
1632 *----------------------------------------------------------------------
1633 *
1634 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextPeerVerifyInit">SSLContextPeerVerifyInit</a> --
1635 *
1636 * Initialize peer veification.
1637 *
1638 * Results:
1639 * NS_OK or NS_ERROR
1640 *
1641 * Side effects:
1642 *
1643 *----------------------------------------------------------------------
1644 */
1645
1646 static void
1647 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextPeerVerifyInit">SSLContextPeerVerifyInit</a>(NsOpenSSLContext *sslcontext)
1648 {
1649 if (sslcontext->peerVerify) {
1650 SSL_CTX_set_verify(sslcontext->sslctx, (SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE),
1651 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_PeerVerifyCallback">PeerVerifyCallback</a>);
1652 } else {
1653 SSL_CTX_set_verify(sslcontext->sslctx, SSL_VERIFY_NONE, NULL);
1654 }
1655 }
1656
1657
1658 /*
1659 *----------------------------------------------------------------------
1660 *
1661 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextPeerVerifyDepthInit">SSLContextPeerVerifyDepthInit</a> --
1662 *
1663 * Initialize peer verification depth. A '0' value indicates infitite
1664 * depth.
1665 *
1666 * Results:
1667 * NS_OK or NS_ERROR
1668 *
1669 * Side effects:
1670 *
1671 *----------------------------------------------------------------------
1672 */
1673
1674 static void
1675 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextPeerVerifyDepthInit">SSLContextPeerVerifyDepthInit</a>(NsOpenSSLContext *sslcontext)
1676 {
1677 if (sslcontext->peerVerifyDepth == 0) {
1678 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Warning, "%s (%s): '%s' peer verify depth set to infinite",
1679 MODULE, sslcontext->server, sslcontext->name);
1680 }
1681 if (sslcontext->peerVerifyDepth >= 0) {
1682 SSL_CTX_set_verify_depth(sslcontext->sslctx, sslcontext->peerVerifyDepth);
1683 } else {
1684 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Warning, "%s (%s): '%s' peer verify parameter invalid; defaulting to %d",
1685 MODULE, sslcontext->server, sslcontext->name, DEFAULT_PEER_VERIFY_DEPTH);
1686 SSL_CTX_set_verify_depth(sslcontext->sslctx, DEFAULT_PEER_VERIFY_DEPTH);
1687 }
1688 }
1689
1690
1691 /*
1692 *----------------------------------------------------------------------
1693 *
1694 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextSessionCacheInit">SSLContextSessionCacheInit</a> --
1695 *
1696 * Initialize the per-SSL context session cache. We use OpenSSL's
1697 * internal cache for storage and let it do the work.
1698 *
1699 * Results:
1700 *
1701 * Side effects:
1702 *
1703 *----------------------------------------------------------------------
1704 */
1705
1706 static void
1707 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextSessionCacheInit">SSLContextSessionCacheInit</a>(NsOpenSSLContext *sslcontext)
1708 {
1709 if (sslcontext->sessionCache) {
1710
1711 /*
1712 * Turn on session caching for this SSL context.
1713 */
1714
1715 if (sslcontext->role == SERVER_ROLE) {
1716 SSL_CTX_set_session_cache_mode(sslcontext->sslctx, SSL_SESS_CACHE_SERVER);
1717 } else {
1718 SSL_CTX_set_session_cache_mode(sslcontext->sslctx, SSL_SESS_CACHE_CLIENT);
1719 }
1720
1721 /*
1722 * Create the session cache context id which must be unique to each SSL
1723 * context across the entire OpenSSL library. This means we need to
1724 * make it unique enough that another AOLserver module won't
1725 * inadvertently use the same session cache context id.
1726 */
1727
1728 SSL_CTX_set_session_id_context(
1729 sslcontext->sslctx,
1730 (void *) &sslcontext->sessionCacheId,
1731 sizeof(sslcontext->sessionCacheId)
1732 );
1733
1734 /*
1735 * Set the time to live for a session in this session cache. After this
1736 * time, a session will have expired. It will be flushed automatically
1737 * by OpenSSL sometime after expiration. If a session has expired and a
1738 * new connection comes in using that session before the session cache
1739 * has been flushed, this session in the cache is flushed immediately
1740 * and a new session cache is created. (XXX need to confirm this)
1741 */
1742
1743 SSL_CTX_set_timeout(sslcontext->sslctx, sslcontext->sessionCacheTimeout);
1744
1745 /*
1746 * Set how many sessions can be cached in this session cache.
1747 */
1748
1749 SSL_CTX_sess_set_cache_size(sslcontext->sslctx, sslcontext->sessionCacheSize);
1750 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): session cache is turned on for sslcontext '%s'",
1751 sslcontext->name, MODULE, sslcontext->server);
1752 } else {
1753 SSL_CTX_set_session_cache_mode(sslcontext->sslctx, SSL_SESS_CACHE_OFF);
1754 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): session cache is turned off for sslcontext '%s'",
1755 sslcontext->name, MODULE, sslcontext->server);
1756 }
1757 }
1758
1759
1760 /*
1761 *----------------------------------------------------------------------
1762 *
1763 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextTraceInit">SSLContextTraceInit</a> --
1764 *
1765 * Initialize handshake tracing.
1766 *
1767 * Results:
1768 *
1769 * Side effects:
1770 * SSL handshake information may show up in the server log. You don't
1771 * want this to happen in normal production service.
1772 *
1773 *----------------------------------------------------------------------
1774 */
1775
1776 static void
1777 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextTraceInit">SSLContextTraceInit</a>(NsOpenSSLContext *sslcontext)
1778 {
1779 /* XXX lock */
1780 if (sslcontext->trace) {
1781 SSL_CTX_set_info_callback(sslcontext->sslctx, (void *) <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_OpenSSLTrace">OpenSSLTrace</a>);
1782 } else {
1783 SSL_CTX_set_info_callback(sslcontext->sslctx, NULL);
1784 }
1785 /* XXX unlock */
1786 }
1787
1788
1789 /*
1790 *----------------------------------------------------------------------
1791 *
1792 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextProtocolsInit">SSLContextProtocolsInit</a> --
1793 *
1794 * Initialize protocols for an SSL context.
1795 *
1796 * Results:
1797 * NS_OK or NS_ERROR
1798 *
1799 * Side effects:
1800 *
1801 *----------------------------------------------------------------------
1802 */
1803
1804 static int
1805 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_SSLContextProtocolsInit">SSLContextProtocolsInit</a>(NsOpenSSLContext *sslcontext)
1806 {
1807 int bits = 0;
1808 char *lprotocols = NULL;
1809
1810 bits = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1;
1811 if (sslcontext->protocols == NULL) {
1812 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): '%s' protocol parameter not set; using all protocols: SSLv2, SSLv3 and TLSv1",
1813 MODULE, sslcontext->server, sslcontext->name);
1814 bits &= ~bits;
1815 } else {
1816 lprotocols = ns_strdup(sslcontext->protocols);
1817 lprotocols = <a href="/cvs/aolserver/aolserver/nsd/str.c#A_Ns_StrToLower">Ns_StrToLower</a>(lprotocols);
1818 if (strstr(lprotocols, "all") != NULL) {
1819 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): '%s' using all protocols: SSLv2, SSLv3 and TLSv1",
1820 MODULE, sslcontext->server, sslcontext->name);
1821 bits &= ~bits;
1822 } else {
1823 if (strstr(lprotocols, "sslv2") != NULL) {
1824 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): '%s' using SSLv2 protocol", MODULE, sslcontext->server, sslcontext->name);
1825 bits &= ~SSL_OP_NO_SSLv2;
1826 }
1827 if (strstr(lprotocols, "sslv3") != NULL) {
1828 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): '%s' using SSLv3 protocol", MODULE, sslcontext->server, sslcontext->name);
1829 bits &= ~SSL_OP_NO_SSLv3;
1830 }
1831 if (strstr(lprotocols, "tlsv1") != NULL) {
1832 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): '%s' using TLSv1 protocol",
1833 MODULE, sslcontext->server, sslcontext->name);
1834 bits &= ~SSL_OP_NO_TLSv1;
1835 }
1836 }
1837 ns_free(lprotocols);
1838 }
1839 if (SSL_CTX_set_options(sslcontext->sslctx, bits) == 0) {
1840 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Error, "%s (%s): protocol initialization failed",
1841 MODULE, sslcontext->server);
1842 return NS_ERROR;
1843 }
1844
1845 return NS_OK;
1846 }
1847
1848
1849 /*
1850 *----------------------------------------------------------------------
1851 *
1852 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_OpenSSLTrace">OpenSSLTrace</a> --
1853 *
1854 * <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Log">Log</a> the progress of an SSL connection.
1855 *
1856 * Results:
1857 * None.
1858 *
1859 * Side effects:
1860 * Server log output.
1861 *
1862 *----------------------------------------------------------------------
1863 */
1864
1865 static void
1866 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_OpenSSLTrace">OpenSSLTrace</a>(SSL *ssl, int where, int rc)
1867 {
1868 NsOpenSSLConn *sslconn = (NsOpenSSLConn *) SSL_get_app_data(ssl);
1869 char *alertTypePrefix = NULL;
1870 char *alertType = NULL;
1871 char *alertDescPrefix = NULL;
1872 char *alertDesc = NULL;
1873 struct Tcl_Time previoustime;
1874 unsigned long seconds;
1875 unsigned long microseconds;
1876
1877 if (where & SSL_CB_ALERT) {
1878 alertTypePrefix = "; alert type = ";
1879 alertType = (char *) SSL_alert_type_string_long(rc);
1880 alertDescPrefix = "; alert desc = ";
1881 alertDesc = (char *) SSL_alert_desc_string_long(rc);
1882 } else {
1883 alertTypePrefix = alertType = "";
1884 alertDescPrefix = alertDesc = "";
1885 }
1886
1887 /* Get time since last timer update */
1888 previoustime = sslconn->timer;
1889
1890 /* Update the timer */
1891 Tcl_GetTime(&sslconn->timer);
1892
1893 /* Find the difference in seconds */
1894 seconds = sslconn->timer.sec - previoustime.sec;
1895
1896 /* Find the difference in microseconds */
1897 microseconds = sslconn->timer.usec - previoustime.usec;
1898
1899 /* Convert the difference in seconds to microseconds and add */
1900 microseconds = microseconds + (seconds * 1000000);
1901
1902 <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Ns_Log">Ns_Log</a>(Notice, "%s (%s): trace (%p): %8ld secs: %s%s%s%s%s",
1903 MODULE, sslconn->server,
1904 sslconn,
1905 microseconds,
1906 SSL_state_string_long(ssl),
1907 alertTypePrefix, alertType, alertDescPrefix, alertDesc
1908 );
1909 }
1910
1911
1912 /*
1913 *----------------------------------------------------------------------
1914 *
1915 * <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_PeerVerifyCallback">PeerVerifyCallback</a> --
1916 *
1917 * Called by the SSL library at each stage of client certificate
1918 * verification.
1919 *
1920 * Results:
1921 *
1922 * Always returns 1 to prevent verification errors from halting
1923 * the SSL handshake. We'd rather finish the handshake so we
1924 * can either authenticate by other means or return an HTTP error.
1925 *
1926 * Side effects:
1927 * None.
1928 *
1929 *----------------------------------------------------------------------
1930 */
1931
1932 static int
1933 <a href="/cvs/aolserver/nsopenssl/sslcontext.c#A_PeerVerifyCallback">PeerVerifyCallback</a>(int preverify_ok, X509_STORE_CTX *x509_ctx)
1934 {
1935 return 1;
1936 }
1937