diff --git a/library/bignum.c b/library/bignum.c
index 110c3f4..e7b8d6d 100644
--- a/library/bignum.c
+++ b/library/bignum.c
@@ -229,13 +229,13 @@
 
     MPI_CHK( mpi_grow( X, Y->n ) );
 
-    X->s = X->s * (1 - assign) + Y->s * assign;
+    X->s = X->s * ( 1 - assign ) + Y->s * assign;
 
     for( i = 0; i < Y->n; i++ )
-        X->p[i] = X->p[i] * (1 - assign) + Y->p[i] * assign;
+        X->p[i] = X->p[i] * ( 1 - assign ) + Y->p[i] * assign;
 
     for( ; i < X->n; i++ )
-        X->p[i] *= (1 - assign);
+        X->p[i] *= ( 1 - assign );
 
 cleanup:
     return( ret );
@@ -263,15 +263,15 @@
     MPI_CHK( mpi_grow( Y, X->n ) );
 
     s = X->s;
-    X->s = X->s * (1 - swap) + Y->s * swap;
-    Y->s = Y->s * (1 - swap) +    s * swap;
+    X->s = X->s * ( 1 - swap ) + Y->s * swap;
+    Y->s = Y->s * ( 1 - swap ) +    s * swap;
 
 
     for( i = 0; i < X->n; i++ )
     {
         tmp = X->p[i];
-        X->p[i] = X->p[i] * (1 - swap) + Y->p[i] * swap;
-        Y->p[i] = Y->p[i] * (1 - swap) +     tmp * swap;
+        X->p[i] = X->p[i] * ( 1 - swap ) + Y->p[i] * swap;
+        Y->p[i] = Y->p[i] * ( 1 - swap ) +     tmp * swap;
     }
 
 cleanup:
@@ -426,7 +426,7 @@
             }
 
             MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) );
-            X->p[j / (2 * ciL)] |= d << ( (j % (2 * ciL)) << 2 );
+            X->p[j / ( 2 * ciL )] |= d << ( ( j % ( 2 * ciL ) ) << 2 );
         }
     }
     else
@@ -1226,14 +1226,14 @@
 
     n = X.n - 1;
     t = Y.n - 1;
-    MPI_CHK( mpi_shift_l( &Y, biL * (n - t) ) );
+    MPI_CHK( mpi_shift_l( &Y, biL * ( n - t ) ) );
 
     while( mpi_cmp_mpi( &X, &Y ) >= 0 )
     {
         Z.p[n - t]++;
         MPI_CHK( mpi_sub_mpi( &X, &X, &Y ) );
     }
-    MPI_CHK( mpi_shift_r( &Y, biL * (n - t) ) );
+    MPI_CHK( mpi_shift_r( &Y, biL * ( n - t ) ) );
 
     for( i = n; i > t ; i-- )
     {
@@ -1257,8 +1257,8 @@
             r  = (t_udbl) X.p[i] << biL;
             r |= (t_udbl) X.p[i - 1];
             r /= Y.p[t];
-            if( r > ((t_udbl) 1 << biL) - 1)
-                r = ((t_udbl) 1 << biL) - 1;
+            if( r > ( (t_udbl) 1 << biL ) - 1 )
+                r = ( (t_udbl) 1 << biL ) - 1;
 
             Z.p[i - t - 1] = (t_uint) r;
 #else
@@ -1310,25 +1310,25 @@
             Z.p[i - t - 1]--;
 
             MPI_CHK( mpi_lset( &T1, 0 ) );
-            T1.p[0] = (t < 1) ? 0 : Y.p[t - 1];
+            T1.p[0] = ( t < 1 ) ? 0 : Y.p[t - 1];
             T1.p[1] = Y.p[t];
             MPI_CHK( mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) );
 
             MPI_CHK( mpi_lset( &T2, 0 ) );
-            T2.p[0] = (i < 2) ? 0 : X.p[i - 2];
-            T2.p[1] = (i < 1) ? 0 : X.p[i - 1];
+            T2.p[0] = ( i < 2 ) ? 0 : X.p[i - 2];
+            T2.p[1] = ( i < 1 ) ? 0 : X.p[i - 1];
             T2.p[2] = X.p[i];
         }
         while( mpi_cmp_mpi( &T1, &T2 ) > 0 );
 
         MPI_CHK( mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) );
-        MPI_CHK( mpi_shift_l( &T1,  biL * (i - t - 1) ) );
+        MPI_CHK( mpi_shift_l( &T1,  biL * ( i - t - 1 ) ) );
         MPI_CHK( mpi_sub_mpi( &X, &X, &T1 ) );
 
         if( mpi_cmp_int( &X, 0 ) < 0 )
         {
             MPI_CHK( mpi_copy( &T1, &Y ) );
-            MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) );
+            MPI_CHK( mpi_shift_l( &T1, biL * ( i - t - 1 ) ) );
             MPI_CHK( mpi_add_mpi( &X, &X, &T1 ) );
             Z.p[i - t - 1]--;
         }
@@ -1500,7 +1500,7 @@
         *d++ = u0; d[n + 1] = 0;
     }
 
-    memcpy( A->p, d, (n + 1) * ciL );
+    memcpy( A->p, d, ( n + 1 ) * ciL );
 
     if( mpi_cmp_abs( A, N ) >= 0 )
         mpi_sub_hlp( n, N->p, A->p );
@@ -1610,7 +1610,7 @@
         /*
          * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1)
          */
-        j =  one << (wsize - 1);
+        j =  one << ( wsize - 1 );
 
         MPI_CHK( mpi_grow( &W[j], N->n + 1 ) );
         MPI_CHK( mpi_copy( &W[j], &W[1]    ) );
@@ -1621,7 +1621,7 @@
         /*
          * W[i] = W[i - 1] * W[1]
          */
-        for( i = j + 1; i < (one << wsize); i++ )
+        for( i = j + 1; i < ( one << wsize ); i++ )
         {
             MPI_CHK( mpi_grow( &W[i], N->n + 1 ) );
             MPI_CHK( mpi_copy( &W[i], &W[i - 1] ) );
@@ -1673,7 +1673,7 @@
         state = 2;
 
         nbits++;
-        wbits |= (ei << (wsize - nbits));
+        wbits |= ( ei << ( wsize - nbits ) );
 
         if( nbits == wsize )
         {
@@ -1703,7 +1703,7 @@
 
         wbits <<= 1;
 
-        if( (wbits & (one << wsize)) != 0 )
+        if( ( wbits & ( one << wsize ) ) != 0 )
             mpi_montmul( X, &W[1], N, mm, &T );
     }
 
@@ -1720,7 +1720,7 @@
 
 cleanup:
 
-    for( i = (one << (wsize - 1)); i < (one << wsize); i++ )
+    for( i = ( one << ( wsize - 1 ) ); i < ( one << wsize ); i++ )
         mpi_free( &W[i] );
 
     mpi_free( &W[1] ); mpi_free( &T ); mpi_free( &Apos );
@@ -1748,7 +1748,7 @@
     lz = mpi_lsb( &TA );
     lzt = mpi_lsb( &TB );
 
-    if ( lzt < lz )
+    if( lzt < lz )
         lz = lzt;
 
     MPI_CHK( mpi_shift_r( &TA, lz ) );
@@ -2305,7 +2305,7 @@
     if( verbose != 0 )
         polarssl_printf( "  MPI test #5 (simple gcd): " );
 
-    for ( i = 0; i < GCD_PAIR_COUNT; i++)
+    for( i = 0; i < GCD_PAIR_COUNT; i++ )
     {
         MPI_CHK( mpi_lset( &X, gcd_pairs[i][0] ) );
         MPI_CHK( mpi_lset( &Y, gcd_pairs[i][1] ) );
