ssl_stat.c revision 296465
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
62const 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
435const 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
456const 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
801const 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
812const 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
823const 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
925const 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
1027const 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}
1047