00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "xyssl/config.h"
00022
00023 #if defined(XYSSL_DEBUG_C)
00024
00025 #include "xyssl/debug.h"
00026
00027 #include <stdarg.h>
00028 #include <stdlib.h>
00029
00030 #if defined _MSC_VER && !defined snprintf
00031 #define snprintf _snprintf
00032 #endif
00033
00034 #if defined _MSC_VER && !defined vsnprintf
00035 #define vsnprintf _vsnprintf
00036 #endif
00037
00038 char *debug_fmt( const char *format, ... )
00039 {
00040 va_list argp;
00041 static char str[512];
00042 int maxlen = sizeof( str ) - 1;
00043
00044 va_start( argp, format );
00045 vsnprintf( str, maxlen, format, argp );
00046 va_end( argp );
00047
00048 str[maxlen] = '\0';
00049 return( str );
00050 }
00051
00052 void debug_print_msg( ssl_context *ssl, int level,
00053 char *file, int line, char *text )
00054 {
00055 char str[512];
00056 int maxlen = sizeof( str ) - 1;
00057
00058 if( ssl->f_dbg == NULL )
00059 return;
00060
00061 snprintf( str, maxlen, "%s(%04d): %s\n", file, line, text );
00062 str[maxlen] = '\0';
00063 ssl->f_dbg( ssl->p_dbg, level, str );
00064 }
00065
00066 void debug_print_ret( ssl_context *ssl, int level,
00067 char *file, int line, char *text, int ret )
00068 {
00069 char str[512];
00070 int maxlen = sizeof( str ) - 1;
00071
00072 if( ssl->f_dbg == NULL )
00073 return;
00074
00075 snprintf( str, maxlen, "%s(%04d): %s() returned %d (0x%x)\n",
00076 file, line, text, ret, ret );
00077
00078 str[maxlen] = '\0';
00079 ssl->f_dbg( ssl->p_dbg, level, str );
00080 }
00081
00082 void debug_print_buf( ssl_context *ssl, int level,
00083 char *file, int line, char *text,
00084 unsigned char *buf, int len )
00085 {
00086 char str[512];
00087 int i, maxlen = sizeof( str ) - 1;
00088
00089 if( ssl->f_dbg == NULL || len < 0 )
00090 return;
00091
00092 snprintf( str, maxlen, "%s(%04d): dumping '%s' (%d bytes)\n",
00093 file, line, text, len );
00094
00095 str[maxlen] = '\0';
00096 ssl->f_dbg( ssl->p_dbg, level, str );
00097
00098 for( i = 0; i < len; i++ )
00099 {
00100 if( i >= 4096 )
00101 break;
00102
00103 if( i % 16 == 0 )
00104 {
00105 if( i > 0 )
00106 ssl->f_dbg( ssl->p_dbg, level, "\n" );
00107
00108 snprintf( str, maxlen, "%s(%04d): %04x: ", file, line, i );
00109
00110 str[maxlen] = '\0';
00111 ssl->f_dbg( ssl->p_dbg, level, str );
00112 }
00113
00114 snprintf( str, maxlen, " %02x", (unsigned int) buf[i] );
00115
00116 str[maxlen] = '\0';
00117 ssl->f_dbg( ssl->p_dbg, level, str );
00118 }
00119
00120 if( len > 0 )
00121 ssl->f_dbg( ssl->p_dbg, level, "\n" );
00122 }
00123
00124 void debug_print_mpi( ssl_context *ssl, int level,
00125 char *file, int line, char *text, mpi *X )
00126 {
00127 char str[512];
00128 int i, j, k, n, maxlen = sizeof( str ) - 1;
00129
00130 if( ssl->f_dbg == NULL || X == NULL )
00131 return;
00132
00133 for( n = X->n - 1; n >= 0; n-- )
00134 if( X->p[n] != 0 )
00135 break;
00136
00137 snprintf( str, maxlen, "%s(%04d): value of '%s' (%d bits) is:\n",
00138 file, line, text, ((n + 1) * sizeof( t_int )) << 3 );
00139
00140 str[maxlen] = '\0';
00141 ssl->f_dbg( ssl->p_dbg, level, str );
00142
00143 for( i = n, j = 0; i >= 0; i--, j++ )
00144 {
00145 if( j % ( 16 / sizeof( t_int ) ) == 0 )
00146 {
00147 if( j > 0 )
00148 ssl->f_dbg( ssl->p_dbg, level, "\n" );
00149
00150 snprintf( str, maxlen, "%s(%04d): ", file, line );
00151
00152 str[maxlen] = '\0';
00153 ssl->f_dbg( ssl->p_dbg, level, str );
00154 }
00155
00156 for( k = sizeof( t_int ) - 1; k >= 0; k-- )
00157 {
00158 snprintf( str, maxlen, " %02x", (unsigned int)
00159 ( X->p[i] >> (k << 3) ) & 0xFF );
00160
00161 str[maxlen] = '\0';
00162 ssl->f_dbg( ssl->p_dbg, level, str );
00163 }
00164 }
00165
00166 ssl->f_dbg( ssl->p_dbg, level, "\n" );
00167 }
00168
00169 void debug_print_crt( ssl_context *ssl, int level,
00170 char *file, int line, char *text, x509_cert *crt )
00171 {
00172 char str[512], prefix[64], *p;
00173 int i = 0, maxlen = sizeof( prefix ) - 1;
00174
00175 if( ssl->f_dbg == NULL || crt == NULL )
00176 return;
00177
00178 snprintf( prefix, maxlen, "%s(%04d): ", file, line );
00179 prefix[maxlen] = '\0';
00180 maxlen = sizeof( str ) - 1;
00181
00182 while( crt != NULL && crt->next != NULL )
00183 {
00184 p = x509parse_cert_info( prefix, crt );
00185
00186 snprintf( str, maxlen, "%s(%04d): %s #%d:\n%s",
00187 file, line, text, ++i, p );
00188
00189 str[maxlen] = '\0';
00190 ssl->f_dbg( ssl->p_dbg, level, str );
00191
00192 debug_print_mpi( ssl, level, file, line,
00193 "crt->rsa.N", &crt->rsa.N );
00194
00195 debug_print_mpi( ssl, level, file, line,
00196 "crt->rsa.E", &crt->rsa.E );
00197
00198 crt = crt->next;
00199 }
00200 }
00201
00202 #endif