]>
Commit | Line | Data |
---|---|---|
79a37326 MS |
1 | /* |
2 | * "$Id$" | |
3 | * | |
4 | * TLS check program for CUPS. | |
5 | * | |
6 | * Copyright 2007-2015 by Apple Inc. | |
7 | * Copyright 1997-2006 by Easy Software Products. | |
8 | * | |
9 | * These coded instructions, statements, and computer programs are the | |
10 | * property of Apple Inc. and are protected by Federal copyright | |
11 | * law. Distribution and use rights are outlined in the file "LICENSE.txt" | |
12 | * which should have been included with this file. If this file is | |
13 | * file is missing or damaged, see the license at "http://www.cups.org/". | |
14 | * | |
15 | * This file is subject to the Apple OS-Developed Software exception. | |
16 | */ | |
17 | ||
18 | /* | |
19 | * Include necessary headers... | |
20 | */ | |
21 | ||
22 | #include "cups-private.h" | |
23 | ||
24 | ||
25 | /* | |
26 | * 'main()' - Main entry. | |
27 | */ | |
28 | ||
29 | int /* O - Exit status */ | |
30 | main(int argc, /* I - Number of command-line arguments */ | |
31 | char *argv[]) /* I - Command-line arguments */ | |
32 | { | |
33 | http_t *http; /* HTTP connection */ | |
34 | const char *server = argv[1]; /* Hostname from command-line */ | |
35 | int port = 631; /* Port number */ | |
36 | const char *cipherName = "UNKNOWN";/* Cipher suite name */ | |
72b9a313 | 37 | int tlsVersion = 0; /* TLS version number */ |
79a37326 MS |
38 | |
39 | ||
40 | if (argc < 2 || argc > 3) | |
41 | { | |
42 | puts("Usage: ./tlscheck server [port]"); | |
43 | puts(""); | |
44 | puts("The default port is 631."); | |
45 | return (1); | |
46 | } | |
47 | ||
48 | if (argc == 3) | |
49 | port = atoi(argv[2]); | |
50 | ||
51 | http = httpConnect2(server, port, NULL, AF_UNSPEC, HTTP_ENCRYPTION_ALWAYS, 1, 30000, NULL); | |
52 | if (!http) | |
53 | { | |
54 | printf("%s: ERROR (%s)\n", server, cupsLastErrorString()); | |
55 | return (1); | |
56 | } | |
57 | ||
58 | #ifdef __APPLE__ | |
72b9a313 | 59 | SSLProtocol protocol; |
79a37326 MS |
60 | SSLCipherSuite cipher; |
61 | char unknownCipherName[256]; | |
62 | int paramsNeeded = 0; | |
63 | const void *params; | |
64 | size_t paramsLen; | |
65 | OSStatus err; | |
66 | ||
72b9a313 MS |
67 | if ((err = SSLGetNegotiatedProtocolVersion(http->tls, &protocol)) != noErr) |
68 | { | |
69 | printf("%s: ERROR (No protocol version - %d)\n", server, (int)err); | |
70 | httpClose(http); | |
71 | return (1); | |
72 | } | |
73 | ||
74 | switch (protocol) | |
75 | { | |
76 | default : | |
77 | tlsVersion = 0; | |
78 | break; | |
79 | case kSSLProtocol3 : | |
80 | tlsVersion = 30; | |
81 | break; | |
82 | case kTLSProtocol1 : | |
83 | tlsVersion = 10; | |
84 | break; | |
85 | case kTLSProtocol11 : | |
86 | tlsVersion = 11; | |
87 | break; | |
88 | case kTLSProtocol12 : | |
89 | tlsVersion = 12; | |
90 | break; | |
91 | } | |
92 | ||
79a37326 MS |
93 | if ((err = SSLGetNegotiatedCipher(http->tls, &cipher)) != noErr) |
94 | { | |
95 | printf("%s: ERROR (No cipher suite - %d)\n", server, (int)err); | |
96 | httpClose(http); | |
97 | return (1); | |
98 | } | |
99 | ||
100 | switch (cipher) | |
101 | { | |
102 | case TLS_NULL_WITH_NULL_NULL: | |
103 | cipherName = "TLS_NULL_WITH_NULL_NULL"; | |
104 | break; | |
105 | case TLS_RSA_WITH_NULL_MD5: | |
106 | cipherName = "TLS_RSA_WITH_NULL_MD5"; | |
107 | break; | |
108 | case TLS_RSA_WITH_NULL_SHA: | |
109 | cipherName = "TLS_RSA_WITH_NULL_SHA"; | |
110 | break; | |
111 | case TLS_RSA_WITH_RC4_128_MD5: | |
112 | cipherName = "TLS_RSA_WITH_RC4_128_MD5"; | |
113 | break; | |
114 | case TLS_RSA_WITH_RC4_128_SHA: | |
115 | cipherName = "TLS_RSA_WITH_RC4_128_SHA"; | |
116 | break; | |
117 | case TLS_RSA_WITH_3DES_EDE_CBC_SHA: | |
118 | cipherName = "TLS_RSA_WITH_3DES_EDE_CBC_SHA"; | |
119 | break; | |
120 | case TLS_RSA_WITH_NULL_SHA256: | |
121 | cipherName = "TLS_RSA_WITH_NULL_SHA256"; | |
122 | break; | |
123 | case TLS_RSA_WITH_AES_128_CBC_SHA256: | |
124 | cipherName = "TLS_RSA_WITH_AES_128_CBC_SHA256"; | |
125 | break; | |
126 | case TLS_RSA_WITH_AES_256_CBC_SHA256: | |
127 | cipherName = "TLS_RSA_WITH_AES_256_CBC_SHA256"; | |
128 | break; | |
129 | case TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA: | |
130 | cipherName = "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA"; | |
131 | paramsNeeded = 1; | |
132 | break; | |
133 | case TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA: | |
134 | cipherName = "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA"; | |
135 | paramsNeeded = 1; | |
136 | break; | |
137 | case TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA: | |
138 | cipherName = "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA"; | |
139 | paramsNeeded = 1; | |
140 | break; | |
141 | case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA: | |
142 | cipherName = "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"; | |
143 | paramsNeeded = 1; | |
144 | break; | |
145 | case TLS_DH_DSS_WITH_AES_128_CBC_SHA256: | |
146 | cipherName = "TLS_DH_DSS_WITH_AES_128_CBC_SHA256"; | |
147 | paramsNeeded = 1; | |
148 | break; | |
149 | case TLS_DH_RSA_WITH_AES_128_CBC_SHA256: | |
150 | cipherName = "TLS_DH_RSA_WITH_AES_128_CBC_SHA256"; | |
151 | paramsNeeded = 1; | |
152 | break; | |
153 | case TLS_DHE_DSS_WITH_AES_128_CBC_SHA256: | |
154 | cipherName = "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256"; | |
155 | paramsNeeded = 1; | |
156 | break; | |
157 | case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256: | |
158 | cipherName = "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"; | |
159 | paramsNeeded = 1; | |
160 | break; | |
161 | case TLS_DH_DSS_WITH_AES_256_CBC_SHA256: | |
162 | cipherName = "TLS_DH_DSS_WITH_AES_256_CBC_SHA256"; | |
163 | paramsNeeded = 1; | |
164 | break; | |
165 | case TLS_DH_RSA_WITH_AES_256_CBC_SHA256: | |
166 | cipherName = "TLS_DH_RSA_WITH_AES_256_CBC_SHA256"; | |
167 | paramsNeeded = 1; | |
168 | break; | |
169 | case TLS_DHE_DSS_WITH_AES_256_CBC_SHA256: | |
170 | cipherName = "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"; | |
171 | paramsNeeded = 1; | |
172 | break; | |
173 | case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256: | |
174 | cipherName = "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"; | |
175 | paramsNeeded = 1; | |
176 | break; | |
177 | case TLS_DH_anon_WITH_RC4_128_MD5: | |
178 | cipherName = "TLS_DH_anon_WITH_RC4_128_MD5"; | |
179 | paramsNeeded = 1; | |
180 | break; | |
181 | case TLS_DH_anon_WITH_3DES_EDE_CBC_SHA: | |
182 | cipherName = "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA"; | |
183 | paramsNeeded = 1; | |
184 | break; | |
185 | case TLS_DH_anon_WITH_AES_128_CBC_SHA256: | |
186 | cipherName = "TLS_DH_anon_WITH_AES_128_CBC_SHA256"; | |
187 | paramsNeeded = 1; | |
188 | break; | |
189 | case TLS_DH_anon_WITH_AES_256_CBC_SHA256: | |
190 | cipherName = "TLS_DH_anon_WITH_AES_256_CBC_SHA256"; | |
191 | paramsNeeded = 1; | |
192 | break; | |
193 | case TLS_PSK_WITH_RC4_128_SHA: | |
194 | cipherName = "TLS_PSK_WITH_RC4_128_SHA"; | |
195 | break; | |
196 | case TLS_PSK_WITH_3DES_EDE_CBC_SHA: | |
197 | cipherName = "TLS_PSK_WITH_3DES_EDE_CBC_SHA"; | |
198 | break; | |
199 | case TLS_PSK_WITH_AES_128_CBC_SHA: | |
200 | cipherName = "TLS_PSK_WITH_AES_128_CBC_SHA"; | |
201 | break; | |
202 | case TLS_PSK_WITH_AES_256_CBC_SHA: | |
203 | cipherName = "TLS_PSK_WITH_AES_256_CBC_SHA"; | |
204 | break; | |
205 | case TLS_DHE_PSK_WITH_RC4_128_SHA: | |
206 | cipherName = "TLS_DHE_PSK_WITH_RC4_128_SHA"; | |
207 | paramsNeeded = 1; | |
208 | break; | |
209 | case TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA: | |
210 | cipherName = "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA"; | |
211 | paramsNeeded = 1; | |
212 | break; | |
213 | case TLS_DHE_PSK_WITH_AES_128_CBC_SHA: | |
214 | cipherName = "TLS_DHE_PSK_WITH_AES_128_CBC_SHA"; | |
215 | paramsNeeded = 1; | |
216 | break; | |
217 | case TLS_DHE_PSK_WITH_AES_256_CBC_SHA: | |
218 | cipherName = "TLS_DHE_PSK_WITH_AES_256_CBC_SHA"; | |
219 | paramsNeeded = 1; | |
220 | break; | |
221 | case TLS_RSA_PSK_WITH_RC4_128_SHA: | |
222 | cipherName = "TLS_RSA_PSK_WITH_RC4_128_SHA"; | |
223 | break; | |
224 | case TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA: | |
225 | cipherName = "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA"; | |
226 | break; | |
227 | case TLS_RSA_PSK_WITH_AES_128_CBC_SHA: | |
228 | cipherName = "TLS_RSA_PSK_WITH_AES_128_CBC_SHA"; | |
229 | break; | |
230 | case TLS_RSA_PSK_WITH_AES_256_CBC_SHA: | |
231 | cipherName = "TLS_RSA_PSK_WITH_AES_256_CBC_SHA"; | |
232 | break; | |
233 | case TLS_PSK_WITH_NULL_SHA: | |
234 | cipherName = "TLS_PSK_WITH_NULL_SHA"; | |
235 | break; | |
236 | case TLS_DHE_PSK_WITH_NULL_SHA: | |
237 | cipherName = "TLS_DHE_PSK_WITH_NULL_SHA"; | |
238 | paramsNeeded = 1; | |
239 | break; | |
240 | case TLS_RSA_PSK_WITH_NULL_SHA: | |
241 | cipherName = "TLS_RSA_PSK_WITH_NULL_SHA"; | |
242 | break; | |
243 | case TLS_RSA_WITH_AES_128_GCM_SHA256: | |
244 | cipherName = "TLS_RSA_WITH_AES_128_GCM_SHA256"; | |
245 | break; | |
246 | case TLS_RSA_WITH_AES_256_GCM_SHA384: | |
247 | cipherName = "TLS_RSA_WITH_AES_256_GCM_SHA384"; | |
248 | break; | |
249 | case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256: | |
250 | cipherName = "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"; | |
251 | paramsNeeded = 1; | |
252 | break; | |
253 | case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384: | |
254 | cipherName = "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384"; | |
255 | paramsNeeded = 1; | |
256 | break; | |
257 | case TLS_DH_RSA_WITH_AES_128_GCM_SHA256: | |
258 | cipherName = "TLS_DH_RSA_WITH_AES_128_GCM_SHA256"; | |
259 | paramsNeeded = 1; | |
260 | break; | |
261 | case TLS_DH_RSA_WITH_AES_256_GCM_SHA384: | |
262 | cipherName = "TLS_DH_RSA_WITH_AES_256_GCM_SHA384"; | |
263 | paramsNeeded = 1; | |
264 | break; | |
265 | case TLS_DHE_DSS_WITH_AES_128_GCM_SHA256: | |
266 | cipherName = "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256"; | |
267 | paramsNeeded = 1; | |
268 | break; | |
269 | case TLS_DHE_DSS_WITH_AES_256_GCM_SHA384: | |
270 | cipherName = "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384"; | |
271 | paramsNeeded = 1; | |
272 | break; | |
273 | case TLS_DH_DSS_WITH_AES_128_GCM_SHA256: | |
274 | cipherName = "TLS_DH_DSS_WITH_AES_128_GCM_SHA256"; | |
275 | paramsNeeded = 1; | |
276 | break; | |
277 | case TLS_DH_DSS_WITH_AES_256_GCM_SHA384: | |
278 | cipherName = "TLS_DH_DSS_WITH_AES_256_GCM_SHA384"; | |
279 | paramsNeeded = 1; | |
280 | break; | |
281 | case TLS_DH_anon_WITH_AES_128_GCM_SHA256: | |
282 | cipherName = "TLS_DH_anon_WITH_AES_128_GCM_SHA256"; | |
283 | paramsNeeded = 1; | |
284 | break; | |
285 | case TLS_DH_anon_WITH_AES_256_GCM_SHA384: | |
286 | cipherName = "TLS_DH_anon_WITH_AES_256_GCM_SHA384"; | |
287 | paramsNeeded = 1; | |
288 | break; | |
289 | case TLS_PSK_WITH_AES_128_GCM_SHA256: | |
290 | cipherName = "TLS_PSK_WITH_AES_128_GCM_SHA256"; | |
291 | break; | |
292 | case TLS_PSK_WITH_AES_256_GCM_SHA384: | |
293 | cipherName = "TLS_PSK_WITH_AES_256_GCM_SHA384"; | |
294 | break; | |
295 | case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256: | |
296 | cipherName = "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256"; | |
297 | paramsNeeded = 1; | |
298 | break; | |
299 | case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384: | |
300 | cipherName = "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384"; | |
301 | paramsNeeded = 1; | |
302 | break; | |
303 | case TLS_RSA_PSK_WITH_AES_128_GCM_SHA256: | |
304 | cipherName = "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256"; | |
305 | break; | |
306 | case TLS_RSA_PSK_WITH_AES_256_GCM_SHA384: | |
307 | cipherName = "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384"; | |
308 | break; | |
309 | case TLS_PSK_WITH_AES_128_CBC_SHA256: | |
310 | cipherName = "TLS_PSK_WITH_AES_128_CBC_SHA256"; | |
311 | break; | |
312 | case TLS_PSK_WITH_AES_256_CBC_SHA384: | |
313 | cipherName = "TLS_PSK_WITH_AES_256_CBC_SHA384"; | |
314 | break; | |
315 | case TLS_PSK_WITH_NULL_SHA256: | |
316 | cipherName = "TLS_PSK_WITH_NULL_SHA256"; | |
317 | break; | |
318 | case TLS_PSK_WITH_NULL_SHA384: | |
319 | cipherName = "TLS_PSK_WITH_NULL_SHA384"; | |
320 | break; | |
321 | case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256: | |
322 | cipherName = "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256"; | |
323 | paramsNeeded = 1; | |
324 | break; | |
325 | case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384: | |
326 | cipherName = "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384"; | |
327 | paramsNeeded = 1; | |
328 | break; | |
329 | case TLS_DHE_PSK_WITH_NULL_SHA256: | |
330 | cipherName = "TLS_DHE_PSK_WITH_NULL_SHA256"; | |
331 | paramsNeeded = 1; | |
332 | break; | |
333 | case TLS_DHE_PSK_WITH_NULL_SHA384: | |
334 | cipherName = "TLS_DHE_PSK_WITH_NULL_SHA384"; | |
335 | paramsNeeded = 1; | |
336 | break; | |
337 | case TLS_RSA_PSK_WITH_AES_128_CBC_SHA256: | |
338 | cipherName = "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256"; | |
339 | break; | |
340 | case TLS_RSA_PSK_WITH_AES_256_CBC_SHA384: | |
341 | cipherName = "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384"; | |
342 | break; | |
343 | case TLS_RSA_PSK_WITH_NULL_SHA256: | |
344 | cipherName = "TLS_RSA_PSK_WITH_NULL_SHA256"; | |
345 | break; | |
346 | case TLS_RSA_PSK_WITH_NULL_SHA384: | |
347 | cipherName = "TLS_RSA_PSK_WITH_NULL_SHA384"; | |
348 | break; | |
349 | case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256: | |
350 | cipherName = "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"; | |
351 | paramsNeeded = 1; | |
352 | break; | |
353 | case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384: | |
354 | cipherName = "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"; | |
355 | paramsNeeded = 1; | |
356 | break; | |
357 | case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256: | |
358 | cipherName = "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256"; | |
359 | paramsNeeded = 1; | |
360 | break; | |
361 | case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384: | |
362 | cipherName = "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384"; | |
363 | paramsNeeded = 1; | |
364 | break; | |
365 | case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256: | |
366 | cipherName = "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"; | |
367 | paramsNeeded = 1; | |
368 | break; | |
369 | case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384: | |
370 | cipherName = "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"; | |
371 | paramsNeeded = 1; | |
372 | break; | |
373 | case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256: | |
374 | cipherName = "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256"; | |
375 | paramsNeeded = 1; | |
376 | break; | |
377 | case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384: | |
378 | cipherName = "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384"; | |
379 | paramsNeeded = 1; | |
380 | break; | |
381 | case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: | |
382 | cipherName = "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"; | |
383 | paramsNeeded = 1; | |
384 | break; | |
385 | case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384: | |
386 | cipherName = "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"; | |
387 | paramsNeeded = 1; | |
388 | break; | |
389 | case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256: | |
390 | cipherName = "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256"; | |
391 | paramsNeeded = 1; | |
392 | break; | |
393 | case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384: | |
394 | cipherName = "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384"; | |
395 | paramsNeeded = 1; | |
396 | break; | |
397 | case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: | |
398 | cipherName = "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"; | |
399 | paramsNeeded = 1; | |
400 | break; | |
401 | case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384: | |
402 | cipherName = "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"; | |
403 | paramsNeeded = 1; | |
404 | break; | |
405 | case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256: | |
406 | cipherName = "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256"; | |
407 | paramsNeeded = 1; | |
408 | break; | |
409 | case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384: | |
410 | cipherName = "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"; | |
411 | paramsNeeded = 1; | |
412 | break; | |
413 | default : | |
414 | snprintf(unknownCipherName, sizeof(unknownCipherName), "UNKNOWN_%04X", cipher); | |
415 | cipherName = unknownCipherName; | |
416 | break; | |
417 | } | |
418 | ||
419 | if (cipher == TLS_RSA_WITH_RC4_128_MD5 || | |
420 | cipher == TLS_RSA_WITH_RC4_128_SHA) | |
421 | { | |
422 | printf("%s: ERROR (Insecure RC4 negotiated)\n", server); | |
423 | httpClose(http); | |
424 | return (1); | |
425 | } | |
426 | ||
427 | if ((err = SSLGetDiffieHellmanParams(http->tls, ¶ms, ¶msLen)) != noErr && paramsNeeded) | |
428 | { | |
429 | printf("%s: ERROR (Unable to get Diffie Hellman parameters - %d)\n", server, (int)err); | |
430 | httpClose(http); | |
431 | return (1); | |
432 | } | |
433 | ||
434 | if (paramsLen < 128 && paramsLen != 0) | |
435 | { | |
436 | printf("%s: ERROR (Diffie Hellman parameters only %d bytes/%d bits)\n", server, (int)paramsLen, (int)paramsLen * 8); | |
437 | httpClose(http); | |
438 | return (1); | |
439 | } | |
440 | #endif /* __APPLE__ */ | |
441 | ||
72b9a313 | 442 | printf("%s: OK (%d.%d, %s)\n", server, tlsVersion / 10, tlsVersion % 10, cipherName); |
79a37326 MS |
443 | |
444 | httpClose(http); | |
445 | ||
446 | return (0); | |
447 | } | |
448 | ||
449 | ||
450 | /* | |
451 | * End of "$Id$". | |
452 | */ |