]> CyberLeo.Net >> Repos - FreeBSD/releng/9.3.git/blob - crypto/openssl/ssl/ssl_stat.c
Fix multiple OpenSSL vulnerabilities.
[FreeBSD/releng/9.3.git] / crypto / openssl / ssl / ssl_stat.c
1 /* ssl/ssl_stat.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58
59 #include <stdio.h>
60 #include "ssl_locl.h"
61
62 const char *SSL_state_string_long(const SSL *s)
63 {
64     const char *str;
65
66     switch (s->state) {
67     case SSL_ST_BEFORE:
68         str = "before SSL initialization";
69         break;
70     case SSL_ST_ACCEPT:
71         str = "before accept initialization";
72         break;
73     case SSL_ST_CONNECT:
74         str = "before connect initialization";
75         break;
76     case SSL_ST_OK:
77         str = "SSL negotiation finished successfully";
78         break;
79     case SSL_ST_RENEGOTIATE:
80         str = "SSL renegotiate ciphers";
81         break;
82     case SSL_ST_BEFORE | SSL_ST_CONNECT:
83         str = "before/connect initialization";
84         break;
85     case SSL_ST_OK | SSL_ST_CONNECT:
86         str = "ok/connect SSL initialization";
87         break;
88     case SSL_ST_BEFORE | SSL_ST_ACCEPT:
89         str = "before/accept initialization";
90         break;
91     case SSL_ST_OK | SSL_ST_ACCEPT:
92         str = "ok/accept SSL initialization";
93         break;
94 #ifndef OPENSSL_NO_SSL2
95     case SSL2_ST_CLIENT_START_ENCRYPTION:
96         str = "SSLv2 client start encryption";
97         break;
98     case SSL2_ST_SERVER_START_ENCRYPTION:
99         str = "SSLv2 server start encryption";
100         break;
101     case SSL2_ST_SEND_CLIENT_HELLO_A:
102         str = "SSLv2 write client hello A";
103         break;
104     case SSL2_ST_SEND_CLIENT_HELLO_B:
105         str = "SSLv2 write client hello B";
106         break;
107     case SSL2_ST_GET_SERVER_HELLO_A:
108         str = "SSLv2 read server hello A";
109         break;
110     case SSL2_ST_GET_SERVER_HELLO_B:
111         str = "SSLv2 read server hello B";
112         break;
113     case SSL2_ST_SEND_CLIENT_MASTER_KEY_A:
114         str = "SSLv2 write client master key A";
115         break;
116     case SSL2_ST_SEND_CLIENT_MASTER_KEY_B:
117         str = "SSLv2 write client master key B";
118         break;
119     case SSL2_ST_SEND_CLIENT_FINISHED_A:
120         str = "SSLv2 write client finished A";
121         break;
122     case SSL2_ST_SEND_CLIENT_FINISHED_B:
123         str = "SSLv2 write client finished B";
124         break;
125     case SSL2_ST_SEND_CLIENT_CERTIFICATE_A:
126         str = "SSLv2 write client certificate A";
127         break;
128     case SSL2_ST_SEND_CLIENT_CERTIFICATE_B:
129         str = "SSLv2 write client certificate B";
130         break;
131     case SSL2_ST_SEND_CLIENT_CERTIFICATE_C:
132         str = "SSLv2 write client certificate C";
133         break;
134     case SSL2_ST_SEND_CLIENT_CERTIFICATE_D:
135         str = "SSLv2 write client certificate D";
136         break;
137     case SSL2_ST_GET_SERVER_VERIFY_A:
138         str = "SSLv2 read server verify A";
139         break;
140     case SSL2_ST_GET_SERVER_VERIFY_B:
141         str = "SSLv2 read server verify B";
142         break;
143     case SSL2_ST_GET_SERVER_FINISHED_A:
144         str = "SSLv2 read server finished A";
145         break;
146     case SSL2_ST_GET_SERVER_FINISHED_B:
147         str = "SSLv2 read server finished B";
148         break;
149     case SSL2_ST_GET_CLIENT_HELLO_A:
150         str = "SSLv2 read client hello A";
151         break;
152     case SSL2_ST_GET_CLIENT_HELLO_B:
153         str = "SSLv2 read client hello B";
154         break;
155     case SSL2_ST_GET_CLIENT_HELLO_C:
156         str = "SSLv2 read client hello C";
157         break;
158     case SSL2_ST_SEND_SERVER_HELLO_A:
159         str = "SSLv2 write server hello A";
160         break;
161     case SSL2_ST_SEND_SERVER_HELLO_B:
162         str = "SSLv2 write server hello B";
163         break;
164     case SSL2_ST_GET_CLIENT_MASTER_KEY_A:
165         str = "SSLv2 read client master key A";
166         break;
167     case SSL2_ST_GET_CLIENT_MASTER_KEY_B:
168         str = "SSLv2 read client master key B";
169         break;
170     case SSL2_ST_SEND_SERVER_VERIFY_A:
171         str = "SSLv2 write server verify A";
172         break;
173     case SSL2_ST_SEND_SERVER_VERIFY_B:
174         str = "SSLv2 write server verify B";
175         break;
176     case SSL2_ST_SEND_SERVER_VERIFY_C:
177         str = "SSLv2 write server verify C";
178         break;
179     case SSL2_ST_GET_CLIENT_FINISHED_A:
180         str = "SSLv2 read client finished A";
181         break;
182     case SSL2_ST_GET_CLIENT_FINISHED_B:
183         str = "SSLv2 read client finished B";
184         break;
185     case SSL2_ST_SEND_SERVER_FINISHED_A:
186         str = "SSLv2 write server finished A";
187         break;
188     case SSL2_ST_SEND_SERVER_FINISHED_B:
189         str = "SSLv2 write server finished B";
190         break;
191     case SSL2_ST_SEND_REQUEST_CERTIFICATE_A:
192         str = "SSLv2 write request certificate A";
193         break;
194     case SSL2_ST_SEND_REQUEST_CERTIFICATE_B:
195         str = "SSLv2 write request certificate B";
196         break;
197     case SSL2_ST_SEND_REQUEST_CERTIFICATE_C:
198         str = "SSLv2 write request certificate C";
199         break;
200     case SSL2_ST_SEND_REQUEST_CERTIFICATE_D:
201         str = "SSLv2 write request certificate D";
202         break;
203     case SSL2_ST_X509_GET_SERVER_CERTIFICATE:
204         str = "SSLv2 X509 read server certificate";
205         break;
206     case SSL2_ST_X509_GET_CLIENT_CERTIFICATE:
207         str = "SSLv2 X509 read client certificate";
208         break;
209 #endif
210
211 #ifndef OPENSSL_NO_SSL3
212 /* SSLv3 additions */
213     case SSL3_ST_CW_CLNT_HELLO_A:
214         str = "SSLv3 write client hello A";
215         break;
216     case SSL3_ST_CW_CLNT_HELLO_B:
217         str = "SSLv3 write client hello B";
218         break;
219     case SSL3_ST_CR_SRVR_HELLO_A:
220         str = "SSLv3 read server hello A";
221         break;
222     case SSL3_ST_CR_SRVR_HELLO_B:
223         str = "SSLv3 read server hello B";
224         break;
225     case SSL3_ST_CR_CERT_A:
226         str = "SSLv3 read server certificate A";
227         break;
228     case SSL3_ST_CR_CERT_B:
229         str = "SSLv3 read server certificate B";
230         break;
231     case SSL3_ST_CR_KEY_EXCH_A:
232         str = "SSLv3 read server key exchange A";
233         break;
234     case SSL3_ST_CR_KEY_EXCH_B:
235         str = "SSLv3 read server key exchange B";
236         break;
237     case SSL3_ST_CR_CERT_REQ_A:
238         str = "SSLv3 read server certificate request A";
239         break;
240     case SSL3_ST_CR_CERT_REQ_B:
241         str = "SSLv3 read server certificate request B";
242         break;
243     case SSL3_ST_CR_SESSION_TICKET_A:
244         str = "SSLv3 read server session ticket A";
245         break;
246     case SSL3_ST_CR_SESSION_TICKET_B:
247         str = "SSLv3 read server session ticket B";
248         break;
249     case SSL3_ST_CR_SRVR_DONE_A:
250         str = "SSLv3 read server done A";
251         break;
252     case SSL3_ST_CR_SRVR_DONE_B:
253         str = "SSLv3 read server done B";
254         break;
255     case SSL3_ST_CW_CERT_A:
256         str = "SSLv3 write client certificate A";
257         break;
258     case SSL3_ST_CW_CERT_B:
259         str = "SSLv3 write client certificate B";
260         break;
261     case SSL3_ST_CW_CERT_C:
262         str = "SSLv3 write client certificate C";
263         break;
264     case SSL3_ST_CW_CERT_D:
265         str = "SSLv3 write client certificate D";
266         break;
267     case SSL3_ST_CW_KEY_EXCH_A:
268         str = "SSLv3 write client key exchange A";
269         break;
270     case SSL3_ST_CW_KEY_EXCH_B:
271         str = "SSLv3 write client key exchange B";
272         break;
273     case SSL3_ST_CW_CERT_VRFY_A:
274         str = "SSLv3 write certificate verify A";
275         break;
276     case SSL3_ST_CW_CERT_VRFY_B:
277         str = "SSLv3 write certificate verify B";
278         break;
279
280     case SSL3_ST_CW_CHANGE_A:
281     case SSL3_ST_SW_CHANGE_A:
282         str = "SSLv3 write change cipher spec A";
283         break;
284     case SSL3_ST_CW_CHANGE_B:
285     case SSL3_ST_SW_CHANGE_B:
286         str = "SSLv3 write change cipher spec B";
287         break;
288     case SSL3_ST_CW_FINISHED_A:
289     case SSL3_ST_SW_FINISHED_A:
290         str = "SSLv3 write finished A";
291         break;
292     case SSL3_ST_CW_FINISHED_B:
293     case SSL3_ST_SW_FINISHED_B:
294         str = "SSLv3 write finished B";
295         break;
296     case SSL3_ST_CR_CHANGE_A:
297     case SSL3_ST_SR_CHANGE_A:
298         str = "SSLv3 read change cipher spec A";
299         break;
300     case SSL3_ST_CR_CHANGE_B:
301     case SSL3_ST_SR_CHANGE_B:
302         str = "SSLv3 read change cipher spec B";
303         break;
304     case SSL3_ST_CR_FINISHED_A:
305     case SSL3_ST_SR_FINISHED_A:
306         str = "SSLv3 read finished A";
307         break;
308     case SSL3_ST_CR_FINISHED_B:
309     case SSL3_ST_SR_FINISHED_B:
310         str = "SSLv3 read finished B";
311         break;
312
313     case SSL3_ST_CW_FLUSH:
314     case SSL3_ST_SW_FLUSH:
315         str = "SSLv3 flush data";
316         break;
317
318     case SSL3_ST_SR_CLNT_HELLO_A:
319         str = "SSLv3 read client hello A";
320         break;
321     case SSL3_ST_SR_CLNT_HELLO_B:
322         str = "SSLv3 read client hello B";
323         break;
324     case SSL3_ST_SR_CLNT_HELLO_C:
325         str = "SSLv3 read client hello C";
326         break;
327     case SSL3_ST_SW_HELLO_REQ_A:
328         str = "SSLv3 write hello request A";
329         break;
330     case SSL3_ST_SW_HELLO_REQ_B:
331         str = "SSLv3 write hello request B";
332         break;
333     case SSL3_ST_SW_HELLO_REQ_C:
334         str = "SSLv3 write hello request C";
335         break;
336     case SSL3_ST_SW_SRVR_HELLO_A:
337         str = "SSLv3 write server hello A";
338         break;
339     case SSL3_ST_SW_SRVR_HELLO_B:
340         str = "SSLv3 write server hello B";
341         break;
342     case SSL3_ST_SW_CERT_A:
343         str = "SSLv3 write certificate A";
344         break;
345     case SSL3_ST_SW_CERT_B:
346         str = "SSLv3 write certificate B";
347         break;
348     case SSL3_ST_SW_KEY_EXCH_A:
349         str = "SSLv3 write key exchange A";
350         break;
351     case SSL3_ST_SW_KEY_EXCH_B:
352         str = "SSLv3 write key exchange B";
353         break;
354     case SSL3_ST_SW_CERT_REQ_A:
355         str = "SSLv3 write certificate request A";
356         break;
357     case SSL3_ST_SW_CERT_REQ_B:
358         str = "SSLv3 write certificate request B";
359         break;
360     case SSL3_ST_SW_SESSION_TICKET_A:
361         str = "SSLv3 write session ticket A";
362         break;
363     case SSL3_ST_SW_SESSION_TICKET_B:
364         str = "SSLv3 write session ticket B";
365         break;
366     case SSL3_ST_SW_SRVR_DONE_A:
367         str = "SSLv3 write server done A";
368         break;
369     case SSL3_ST_SW_SRVR_DONE_B:
370         str = "SSLv3 write server done B";
371         break;
372     case SSL3_ST_SR_CERT_A:
373         str = "SSLv3 read client certificate A";
374         break;
375     case SSL3_ST_SR_CERT_B:
376         str = "SSLv3 read client certificate B";
377         break;
378     case SSL3_ST_SR_KEY_EXCH_A:
379         str = "SSLv3 read client key exchange A";
380         break;
381     case SSL3_ST_SR_KEY_EXCH_B:
382         str = "SSLv3 read client key exchange B";
383         break;
384     case SSL3_ST_SR_CERT_VRFY_A:
385         str = "SSLv3 read certificate verify A";
386         break;
387     case SSL3_ST_SR_CERT_VRFY_B:
388         str = "SSLv3 read certificate verify B";
389         break;
390 #endif
391
392 /* SSLv2/v3 compatibility states */
393 /* client */
394     case SSL23_ST_CW_CLNT_HELLO_A:
395         str = "SSLv2/v3 write client hello A";
396         break;
397     case SSL23_ST_CW_CLNT_HELLO_B:
398         str = "SSLv2/v3 write client hello B";
399         break;
400     case SSL23_ST_CR_SRVR_HELLO_A:
401         str = "SSLv2/v3 read server hello A";
402         break;
403     case SSL23_ST_CR_SRVR_HELLO_B:
404         str = "SSLv2/v3 read server hello B";
405         break;
406 /* server */
407     case SSL23_ST_SR_CLNT_HELLO_A:
408         str = "SSLv2/v3 read client hello A";
409         break;
410     case SSL23_ST_SR_CLNT_HELLO_B:
411         str = "SSLv2/v3 read client hello B";
412         break;
413
414 /* DTLS */
415     case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A:
416         str = "DTLS1 read hello verify request A";
417         break;
418     case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B:
419         str = "DTLS1 read hello verify request B";
420         break;
421     case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A:
422         str = "DTLS1 write hello verify request A";
423         break;
424     case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B:
425         str = "DTLS1 write hello verify request B";
426         break;
427
428     default:
429         str = "unknown state";
430         break;
431     }
432     return (str);
433 }
434
435 const char *SSL_rstate_string_long(const SSL *s)
436 {
437     const char *str;
438
439     switch (s->rstate) {
440     case SSL_ST_READ_HEADER:
441         str = "read header";
442         break;
443     case SSL_ST_READ_BODY:
444         str = "read body";
445         break;
446     case SSL_ST_READ_DONE:
447         str = "read done";
448         break;
449     default:
450         str = "unknown";
451         break;
452     }
453     return (str);
454 }
455
456 const char *SSL_state_string(const SSL *s)
457 {
458     const char *str;
459
460     switch (s->state) {
461     case SSL_ST_BEFORE:
462         str = "PINIT ";
463         break;
464     case SSL_ST_ACCEPT:
465         str = "AINIT ";
466         break;
467     case SSL_ST_CONNECT:
468         str = "CINIT ";
469         break;
470     case SSL_ST_OK:
471         str = "SSLOK ";
472         break;
473 #ifndef OPENSSL_NO_SSL2
474     case SSL2_ST_CLIENT_START_ENCRYPTION:
475         str = "2CSENC";
476         break;
477     case SSL2_ST_SERVER_START_ENCRYPTION:
478         str = "2SSENC";
479         break;
480     case SSL2_ST_SEND_CLIENT_HELLO_A:
481         str = "2SCH_A";
482         break;
483     case SSL2_ST_SEND_CLIENT_HELLO_B:
484         str = "2SCH_B";
485         break;
486     case SSL2_ST_GET_SERVER_HELLO_A:
487         str = "2GSH_A";
488         break;
489     case SSL2_ST_GET_SERVER_HELLO_B:
490         str = "2GSH_B";
491         break;
492     case SSL2_ST_SEND_CLIENT_MASTER_KEY_A:
493         str = "2SCMKA";
494         break;
495     case SSL2_ST_SEND_CLIENT_MASTER_KEY_B:
496         str = "2SCMKB";
497         break;
498     case SSL2_ST_SEND_CLIENT_FINISHED_A:
499         str = "2SCF_A";
500         break;
501     case SSL2_ST_SEND_CLIENT_FINISHED_B:
502         str = "2SCF_B";
503         break;
504     case SSL2_ST_SEND_CLIENT_CERTIFICATE_A:
505         str = "2SCC_A";
506         break;
507     case SSL2_ST_SEND_CLIENT_CERTIFICATE_B:
508         str = "2SCC_B";
509         break;
510     case SSL2_ST_SEND_CLIENT_CERTIFICATE_C:
511         str = "2SCC_C";
512         break;
513     case SSL2_ST_SEND_CLIENT_CERTIFICATE_D:
514         str = "2SCC_D";
515         break;
516     case SSL2_ST_GET_SERVER_VERIFY_A:
517         str = "2GSV_A";
518         break;
519     case SSL2_ST_GET_SERVER_VERIFY_B:
520         str = "2GSV_B";
521         break;
522     case SSL2_ST_GET_SERVER_FINISHED_A:
523         str = "2GSF_A";
524         break;
525     case SSL2_ST_GET_SERVER_FINISHED_B:
526         str = "2GSF_B";
527         break;
528     case SSL2_ST_GET_CLIENT_HELLO_A:
529         str = "2GCH_A";
530         break;
531     case SSL2_ST_GET_CLIENT_HELLO_B:
532         str = "2GCH_B";
533         break;
534     case SSL2_ST_GET_CLIENT_HELLO_C:
535         str = "2GCH_C";
536         break;
537     case SSL2_ST_SEND_SERVER_HELLO_A:
538         str = "2SSH_A";
539         break;
540     case SSL2_ST_SEND_SERVER_HELLO_B:
541         str = "2SSH_B";
542         break;
543     case SSL2_ST_GET_CLIENT_MASTER_KEY_A:
544         str = "2GCMKA";
545         break;
546     case SSL2_ST_GET_CLIENT_MASTER_KEY_B:
547         str = "2GCMKA";
548         break;
549     case SSL2_ST_SEND_SERVER_VERIFY_A:
550         str = "2SSV_A";
551         break;
552     case SSL2_ST_SEND_SERVER_VERIFY_B:
553         str = "2SSV_B";
554         break;
555     case SSL2_ST_SEND_SERVER_VERIFY_C:
556         str = "2SSV_C";
557         break;
558     case SSL2_ST_GET_CLIENT_FINISHED_A:
559         str = "2GCF_A";
560         break;
561     case SSL2_ST_GET_CLIENT_FINISHED_B:
562         str = "2GCF_B";
563         break;
564     case SSL2_ST_SEND_SERVER_FINISHED_A:
565         str = "2SSF_A";
566         break;
567     case SSL2_ST_SEND_SERVER_FINISHED_B:
568         str = "2SSF_B";
569         break;
570     case SSL2_ST_SEND_REQUEST_CERTIFICATE_A:
571         str = "2SRC_A";
572         break;
573     case SSL2_ST_SEND_REQUEST_CERTIFICATE_B:
574         str = "2SRC_B";
575         break;
576     case SSL2_ST_SEND_REQUEST_CERTIFICATE_C:
577         str = "2SRC_C";
578         break;
579     case SSL2_ST_SEND_REQUEST_CERTIFICATE_D:
580         str = "2SRC_D";
581         break;
582     case SSL2_ST_X509_GET_SERVER_CERTIFICATE:
583         str = "2X9GSC";
584         break;
585     case SSL2_ST_X509_GET_CLIENT_CERTIFICATE:
586         str = "2X9GCC";
587         break;
588 #endif
589
590 #ifndef OPENSSL_NO_SSL3
591 /* SSLv3 additions */
592     case SSL3_ST_SW_FLUSH:
593     case SSL3_ST_CW_FLUSH:
594         str = "3FLUSH";
595         break;
596     case SSL3_ST_CW_CLNT_HELLO_A:
597         str = "3WCH_A";
598         break;
599     case SSL3_ST_CW_CLNT_HELLO_B:
600         str = "3WCH_B";
601         break;
602     case SSL3_ST_CR_SRVR_HELLO_A:
603         str = "3RSH_A";
604         break;
605     case SSL3_ST_CR_SRVR_HELLO_B:
606         str = "3RSH_B";
607         break;
608     case SSL3_ST_CR_CERT_A:
609         str = "3RSC_A";
610         break;
611     case SSL3_ST_CR_CERT_B:
612         str = "3RSC_B";
613         break;
614     case SSL3_ST_CR_KEY_EXCH_A:
615         str = "3RSKEA";
616         break;
617     case SSL3_ST_CR_KEY_EXCH_B:
618         str = "3RSKEB";
619         break;
620     case SSL3_ST_CR_CERT_REQ_A:
621         str = "3RCR_A";
622         break;
623     case SSL3_ST_CR_CERT_REQ_B:
624         str = "3RCR_B";
625         break;
626     case SSL3_ST_CR_SRVR_DONE_A:
627         str = "3RSD_A";
628         break;
629     case SSL3_ST_CR_SRVR_DONE_B:
630         str = "3RSD_B";
631         break;
632     case SSL3_ST_CW_CERT_A:
633         str = "3WCC_A";
634         break;
635     case SSL3_ST_CW_CERT_B:
636         str = "3WCC_B";
637         break;
638     case SSL3_ST_CW_CERT_C:
639         str = "3WCC_C";
640         break;
641     case SSL3_ST_CW_CERT_D:
642         str = "3WCC_D";
643         break;
644     case SSL3_ST_CW_KEY_EXCH_A:
645         str = "3WCKEA";
646         break;
647     case SSL3_ST_CW_KEY_EXCH_B:
648         str = "3WCKEB";
649         break;
650     case SSL3_ST_CW_CERT_VRFY_A:
651         str = "3WCV_A";
652         break;
653     case SSL3_ST_CW_CERT_VRFY_B:
654         str = "3WCV_B";
655         break;
656
657     case SSL3_ST_SW_CHANGE_A:
658     case SSL3_ST_CW_CHANGE_A:
659         str = "3WCCSA";
660         break;
661     case SSL3_ST_SW_CHANGE_B:
662     case SSL3_ST_CW_CHANGE_B:
663         str = "3WCCSB";
664         break;
665     case SSL3_ST_SW_FINISHED_A:
666     case SSL3_ST_CW_FINISHED_A:
667         str = "3WFINA";
668         break;
669     case SSL3_ST_SW_FINISHED_B:
670     case SSL3_ST_CW_FINISHED_B:
671         str = "3WFINB";
672         break;
673     case SSL3_ST_SR_CHANGE_A:
674     case SSL3_ST_CR_CHANGE_A:
675         str = "3RCCSA";
676         break;
677     case SSL3_ST_SR_CHANGE_B:
678     case SSL3_ST_CR_CHANGE_B:
679         str = "3RCCSB";
680         break;
681     case SSL3_ST_SR_FINISHED_A:
682     case SSL3_ST_CR_FINISHED_A:
683         str = "3RFINA";
684         break;
685     case SSL3_ST_SR_FINISHED_B:
686     case SSL3_ST_CR_FINISHED_B:
687         str = "3RFINB";
688         break;
689
690     case SSL3_ST_SW_HELLO_REQ_A:
691         str = "3WHR_A";
692         break;
693     case SSL3_ST_SW_HELLO_REQ_B:
694         str = "3WHR_B";
695         break;
696     case SSL3_ST_SW_HELLO_REQ_C:
697         str = "3WHR_C";
698         break;
699     case SSL3_ST_SR_CLNT_HELLO_A:
700         str = "3RCH_A";
701         break;
702     case SSL3_ST_SR_CLNT_HELLO_B:
703         str = "3RCH_B";
704         break;
705     case SSL3_ST_SR_CLNT_HELLO_C:
706         str = "3RCH_C";
707         break;
708     case SSL3_ST_SW_SRVR_HELLO_A:
709         str = "3WSH_A";
710         break;
711     case SSL3_ST_SW_SRVR_HELLO_B:
712         str = "3WSH_B";
713         break;
714     case SSL3_ST_SW_CERT_A:
715         str = "3WSC_A";
716         break;
717     case SSL3_ST_SW_CERT_B:
718         str = "3WSC_B";
719         break;
720     case SSL3_ST_SW_KEY_EXCH_A:
721         str = "3WSKEA";
722         break;
723     case SSL3_ST_SW_KEY_EXCH_B:
724         str = "3WSKEB";
725         break;
726     case SSL3_ST_SW_CERT_REQ_A:
727         str = "3WCR_A";
728         break;
729     case SSL3_ST_SW_CERT_REQ_B:
730         str = "3WCR_B";
731         break;
732     case SSL3_ST_SW_SRVR_DONE_A:
733         str = "3WSD_A";
734         break;
735     case SSL3_ST_SW_SRVR_DONE_B:
736         str = "3WSD_B";
737         break;
738     case SSL3_ST_SR_CERT_A:
739         str = "3RCC_A";
740         break;
741     case SSL3_ST_SR_CERT_B:
742         str = "3RCC_B";
743         break;
744     case SSL3_ST_SR_KEY_EXCH_A:
745         str = "3RCKEA";
746         break;
747     case SSL3_ST_SR_KEY_EXCH_B:
748         str = "3RCKEB";
749         break;
750     case SSL3_ST_SR_CERT_VRFY_A:
751         str = "3RCV_A";
752         break;
753     case SSL3_ST_SR_CERT_VRFY_B:
754         str = "3RCV_B";
755         break;
756 #endif
757
758 /* SSLv2/v3 compatibility states */
759 /* client */
760     case SSL23_ST_CW_CLNT_HELLO_A:
761         str = "23WCHA";
762         break;
763     case SSL23_ST_CW_CLNT_HELLO_B:
764         str = "23WCHB";
765         break;
766     case SSL23_ST_CR_SRVR_HELLO_A:
767         str = "23RSHA";
768         break;
769     case SSL23_ST_CR_SRVR_HELLO_B:
770         str = "23RSHA";
771         break;
772 /* server */
773     case SSL23_ST_SR_CLNT_HELLO_A:
774         str = "23RCHA";
775         break;
776     case SSL23_ST_SR_CLNT_HELLO_B:
777         str = "23RCHB";
778         break;
779
780 /* DTLS */
781     case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A:
782         str = "DRCHVA";
783         break;
784     case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B:
785         str = "DRCHVB";
786         break;
787     case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A:
788         str = "DWCHVA";
789         break;
790     case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B:
791         str = "DWCHVB";
792         break;
793
794     default:
795         str = "UNKWN ";
796         break;
797     }
798     return (str);
799 }
800
801 const char *SSL_alert_type_string_long(int value)
802 {
803     value >>= 8;
804     if (value == SSL3_AL_WARNING)
805         return ("warning");
806     else if (value == SSL3_AL_FATAL)
807         return ("fatal");
808     else
809         return ("unknown");
810 }
811
812 const char *SSL_alert_type_string(int value)
813 {
814     value >>= 8;
815     if (value == SSL3_AL_WARNING)
816         return ("W");
817     else if (value == SSL3_AL_FATAL)
818         return ("F");
819     else
820         return ("U");
821 }
822
823 const char *SSL_alert_desc_string(int value)
824 {
825     const char *str;
826
827     switch (value & 0xff) {
828     case SSL3_AD_CLOSE_NOTIFY:
829         str = "CN";
830         break;
831     case SSL3_AD_UNEXPECTED_MESSAGE:
832         str = "UM";
833         break;
834     case SSL3_AD_BAD_RECORD_MAC:
835         str = "BM";
836         break;
837     case SSL3_AD_DECOMPRESSION_FAILURE:
838         str = "DF";
839         break;
840     case SSL3_AD_HANDSHAKE_FAILURE:
841         str = "HF";
842         break;
843     case SSL3_AD_NO_CERTIFICATE:
844         str = "NC";
845         break;
846     case SSL3_AD_BAD_CERTIFICATE:
847         str = "BC";
848         break;
849     case SSL3_AD_UNSUPPORTED_CERTIFICATE:
850         str = "UC";
851         break;
852     case SSL3_AD_CERTIFICATE_REVOKED:
853         str = "CR";
854         break;
855     case SSL3_AD_CERTIFICATE_EXPIRED:
856         str = "CE";
857         break;
858     case SSL3_AD_CERTIFICATE_UNKNOWN:
859         str = "CU";
860         break;
861     case SSL3_AD_ILLEGAL_PARAMETER:
862         str = "IP";
863         break;
864     case TLS1_AD_DECRYPTION_FAILED:
865         str = "DC";
866         break;
867     case TLS1_AD_RECORD_OVERFLOW:
868         str = "RO";
869         break;
870     case TLS1_AD_UNKNOWN_CA:
871         str = "CA";
872         break;
873     case TLS1_AD_ACCESS_DENIED:
874         str = "AD";
875         break;
876     case TLS1_AD_DECODE_ERROR:
877         str = "DE";
878         break;
879     case TLS1_AD_DECRYPT_ERROR:
880         str = "CY";
881         break;
882     case TLS1_AD_EXPORT_RESTRICTION:
883         str = "ER";
884         break;
885     case TLS1_AD_PROTOCOL_VERSION:
886         str = "PV";
887         break;
888     case TLS1_AD_INSUFFICIENT_SECURITY:
889         str = "IS";
890         break;
891     case TLS1_AD_INTERNAL_ERROR:
892         str = "IE";
893         break;
894     case TLS1_AD_USER_CANCELLED:
895         str = "US";
896         break;
897     case TLS1_AD_NO_RENEGOTIATION:
898         str = "NR";
899         break;
900     case TLS1_AD_UNSUPPORTED_EXTENSION:
901         str = "UE";
902         break;
903     case TLS1_AD_CERTIFICATE_UNOBTAINABLE:
904         str = "CO";
905         break;
906     case TLS1_AD_UNRECOGNIZED_NAME:
907         str = "UN";
908         break;
909     case TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
910         str = "BR";
911         break;
912     case TLS1_AD_BAD_CERTIFICATE_HASH_VALUE:
913         str = "BH";
914         break;
915     case TLS1_AD_UNKNOWN_PSK_IDENTITY:
916         str = "UP";
917         break;
918     default:
919         str = "UK";
920         break;
921     }
922     return (str);
923 }
924
925 const char *SSL_alert_desc_string_long(int value)
926 {
927     const char *str;
928
929     switch (value & 0xff) {
930     case SSL3_AD_CLOSE_NOTIFY:
931         str = "close notify";
932         break;
933     case SSL3_AD_UNEXPECTED_MESSAGE:
934         str = "unexpected_message";
935         break;
936     case SSL3_AD_BAD_RECORD_MAC:
937         str = "bad record mac";
938         break;
939     case SSL3_AD_DECOMPRESSION_FAILURE:
940         str = "decompression failure";
941         break;
942     case SSL3_AD_HANDSHAKE_FAILURE:
943         str = "handshake failure";
944         break;
945     case SSL3_AD_NO_CERTIFICATE:
946         str = "no certificate";
947         break;
948     case SSL3_AD_BAD_CERTIFICATE:
949         str = "bad certificate";
950         break;
951     case SSL3_AD_UNSUPPORTED_CERTIFICATE:
952         str = "unsupported certificate";
953         break;
954     case SSL3_AD_CERTIFICATE_REVOKED:
955         str = "certificate revoked";
956         break;
957     case SSL3_AD_CERTIFICATE_EXPIRED:
958         str = "certificate expired";
959         break;
960     case SSL3_AD_CERTIFICATE_UNKNOWN:
961         str = "certificate unknown";
962         break;
963     case SSL3_AD_ILLEGAL_PARAMETER:
964         str = "illegal parameter";
965         break;
966     case TLS1_AD_DECRYPTION_FAILED:
967         str = "decryption failed";
968         break;
969     case TLS1_AD_RECORD_OVERFLOW:
970         str = "record overflow";
971         break;
972     case TLS1_AD_UNKNOWN_CA:
973         str = "unknown CA";
974         break;
975     case TLS1_AD_ACCESS_DENIED:
976         str = "access denied";
977         break;
978     case TLS1_AD_DECODE_ERROR:
979         str = "decode error";
980         break;
981     case TLS1_AD_DECRYPT_ERROR:
982         str = "decrypt error";
983         break;
984     case TLS1_AD_EXPORT_RESTRICTION:
985         str = "export restriction";
986         break;
987     case TLS1_AD_PROTOCOL_VERSION:
988         str = "protocol version";
989         break;
990     case TLS1_AD_INSUFFICIENT_SECURITY:
991         str = "insufficient security";
992         break;
993     case TLS1_AD_INTERNAL_ERROR:
994         str = "internal error";
995         break;
996     case TLS1_AD_USER_CANCELLED:
997         str = "user canceled";
998         break;
999     case TLS1_AD_NO_RENEGOTIATION:
1000         str = "no renegotiation";
1001         break;
1002     case TLS1_AD_UNSUPPORTED_EXTENSION:
1003         str = "unsupported extension";
1004         break;
1005     case TLS1_AD_CERTIFICATE_UNOBTAINABLE:
1006         str = "certificate unobtainable";
1007         break;
1008     case TLS1_AD_UNRECOGNIZED_NAME:
1009         str = "unrecognized name";
1010         break;
1011     case TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
1012         str = "bad certificate status response";
1013         break;
1014     case TLS1_AD_BAD_CERTIFICATE_HASH_VALUE:
1015         str = "bad certificate hash value";
1016         break;
1017     case TLS1_AD_UNKNOWN_PSK_IDENTITY:
1018         str = "unknown PSK identity";
1019         break;
1020     default:
1021         str = "unknown";
1022         break;
1023     }
1024     return (str);
1025 }
1026
1027 const char *SSL_rstate_string(const SSL *s)
1028 {
1029     const char *str;
1030
1031     switch (s->rstate) {
1032     case SSL_ST_READ_HEADER:
1033         str = "RH";
1034         break;
1035     case SSL_ST_READ_BODY:
1036         str = "RB";
1037         break;
1038     case SSL_ST_READ_DONE:
1039         str = "RD";
1040         break;
1041     default:
1042         str = "unknown";
1043         break;
1044     }
1045     return (str);
1046 }