1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #ifndef SSLSAMPLE_H
6 #define SSLSAMPLE_H
7 
8 /* Generic header files */
9 
10 #include <stdio.h>
11 #include <string.h>
12 
13 /* NSPR header files */
14 
15 #include <nspr.h>
16 #include "prerror.h"
17 #include "prnetdb.h"
18 
19 /* NSS header files */
20 
21 #include "pk11func.h"
22 #include "secitem.h"
23 #include "ssl.h"
24 #include "certt.h"
25 #include "nss.h"
26 #include "secder.h"
27 #include "keyhi.h"
28 #include "sslproto.h"
29 
30 /* Custom header files */
31 
32 /*
33 #include "sslerror.h"
34 */
35 
36 #define BUFFER_SIZE 10240
37 
38 /* Declare SSL cipher suites. */
39 
40 extern int cipherSuites[];
41 extern int ssl3CipherSuites[];
42 
43 /* Data buffer read from a socket. */
44 typedef struct DataBufferStr {
45     char data[BUFFER_SIZE];
46     int index;
47     int remaining;
48     int dataStart;
49     int dataEnd;
50 } DataBuffer;
51 
52 /* SSL callback routines. */
53 
54 char *myPasswd(PK11SlotInfo *info, PRBool retry, void *arg);
55 
56 SECStatus myAuthCertificate(void *arg, PRFileDesc *socket,
57                             PRBool checksig, PRBool isServer);
58 
59 SECStatus myBadCertHandler(void *arg, PRFileDesc *socket);
60 
61 void myHandshakeCallback(PRFileDesc *socket, void *arg);
62 
63 SECStatus myGetClientAuthData(void *arg, PRFileDesc *socket,
64                               struct CERTDistNamesStr *caNames,
65                               struct CERTCertificateStr **pRetCert,
66                               struct SECKEYPrivateKeyStr **pRetKey);
67 
68 /* Disable all v2/v3 SSL ciphers. */
69 
70 void disableAllSSLCiphers(void);
71 
72 /* Error and information utilities. */
73 
74 void errWarn(char *function);
75 
76 void exitErr(char *function);
77 
78 void printSecurityInfo(FILE *outfile, PRFileDesc *fd);
79 
80 /* Some simple thread management routines. */
81 
82 #define MAX_THREADS 32
83 
84 typedef SECStatus startFn(void *a, int b);
85 
86 typedef enum { rs_idle = 0,
87                rs_running = 1,
88                rs_zombie = 2 } runState;
89 
90 typedef struct perThreadStr {
91     PRFileDesc *a;
92     int b;
93     int rv;
94     startFn *startFunc;
95     PRThread *prThread;
96     PRBool inUse;
97     runState running;
98 } perThread;
99 
100 typedef struct GlobalThreadMgrStr {
101     PRLock *threadLock;
102     PRCondVar *threadStartQ;
103     PRCondVar *threadEndQ;
104     perThread threads[MAX_THREADS];
105     int index;
106     int numUsed;
107     int numRunning;
108 } GlobalThreadMgr;
109 
110 void thread_wrapper(void *arg);
111 
112 SECStatus launch_thread(GlobalThreadMgr *threadMGR,
113                         startFn *startFunc, void *a, int b);
114 
115 SECStatus reap_threads(GlobalThreadMgr *threadMGR);
116 
117 void destroy_thread_data(GlobalThreadMgr *threadMGR);
118 
119 /* Management of locked variables. */
120 
121 struct lockedVarsStr {
122     PRLock *lock;
123     int count;
124     int waiters;
125     PRCondVar *condVar;
126 };
127 
128 typedef struct lockedVarsStr lockedVars;
129 
130 void lockedVars_Init(lockedVars *lv);
131 
132 void lockedVars_Destroy(lockedVars *lv);
133 
134 void lockedVars_WaitForDone(lockedVars *lv);
135 
136 int lockedVars_AddToCount(lockedVars *lv, int addend);
137 
138 #endif
139