- Debug print of MPI now removes leading zero octets and displays actual bit size of the value
diff --git a/library/debug.c b/library/debug.c
index 8ef4c16..6d4fd31 100644
--- a/library/debug.c
+++ b/library/debug.c
@@ -132,43 +132,67 @@
const char *text, const mpi *X )
{
char str[512];
- int i, j, k, n, maxlen = sizeof( str ) - 1;
+ int i, j, k, n, maxlen = sizeof( str ) - 1, zeros = 1;
if( ssl->f_dbg == NULL || X == NULL )
return;
- for( n = X->n - 1; n >= 0; n-- )
+ for( n = X->n - 1; n > 0; n-- )
if( X->p[n] != 0 )
break;
+ for( j = ( sizeof(t_int) << 3 ) - 1; j >= 0; j-- )
+ if( ( ( X->p[n] >> j ) & 1 ) != 0 )
+ break;
+
snprintf( str, maxlen, "%s(%04d): value of '%s' (%lu bits) is:\n",
file, line, text,
- (unsigned long) ((n + 1) * sizeof( t_int )) << 3 );
+ (unsigned long) ( ( n * ( sizeof(t_int) << 3 ) ) + j + 1 ) );
str[maxlen] = '\0';
ssl->f_dbg( ssl->p_dbg, level, str );
- for( i = n, j = 0; i >= 0; i--, j++ )
+ for( i = n, j = 0; i >= 0; i-- )
{
- if( j % ( 16 / sizeof( t_int ) ) == 0 )
- {
- if( j > 0 )
- ssl->f_dbg( ssl->p_dbg, level, "\n" );
-
- snprintf( str, maxlen, "%s(%04d): ", file, line );
-
- str[maxlen] = '\0';
- ssl->f_dbg( ssl->p_dbg, level, str );
- }
+ if( zeros && X->p[i] == 0 )
+ continue;
for( k = sizeof( t_int ) - 1; k >= 0; k-- )
{
+ if( zeros && ( ( X->p[i] >> (k << 3) ) & 0xFF ) == 0 )
+ continue;
+ else
+ zeros = 0;
+
+ if( j % 16 == 0 )
+ {
+ if( j > 0 )
+ ssl->f_dbg( ssl->p_dbg, level, "\n" );
+
+ snprintf( str, maxlen, "%s(%04d): ", file, line );
+
+ str[maxlen] = '\0';
+ ssl->f_dbg( ssl->p_dbg, level, str );
+ }
+
snprintf( str, maxlen, " %02x", (unsigned int)
( X->p[i] >> (k << 3) ) & 0xFF );
str[maxlen] = '\0';
ssl->f_dbg( ssl->p_dbg, level, str );
+
+ j++;
}
+
+ }
+
+ if( zeros == 1 )
+ {
+ snprintf( str, maxlen, "%s(%04d): ", file, line );
+
+ str[maxlen] = '\0';
+ ssl->f_dbg( ssl->p_dbg, level, str );
+ ssl->f_dbg( ssl->p_dbg, level, " 00" );
}
ssl->f_dbg( ssl->p_dbg, level, "\n" );