Make ECP error codes more specific
diff --git a/library/ecp.c b/library/ecp.c
index fef9ab6..d8469c0 100644
--- a/library/ecp.c
+++ b/library/ecp.c
@@ -417,7 +417,7 @@
         return( mpi_mod_mpi( N, N, &grp->P ) );
 
     if( mpi_cmp_int( N, 0 ) < 0 || mpi_msb( N ) > 2 * grp->pbits )
-        return( POLARSSL_ERR_ECP_GENERIC );
+        return( POLARSSL_ERR_ECP_BAD_INPUT_DATA );
 
     MPI_CHK( grp->modp( N ) );
 
@@ -869,7 +869,7 @@
         return( ecp_normalize( grp, T ) );
 
     if( ( c = (mpi *) polarssl_malloc( t_len * sizeof( mpi ) ) ) == NULL )
-        return( POLARSSL_ERR_ECP_GENERIC );
+        return( POLARSSL_ERR_ECP_MALLOC_FAILED );
 
     mpi_init( &u ); mpi_init( &Zi ); mpi_init( &ZZi );
     for( i = 0; i < t_len; i++ )
@@ -1033,7 +1033,7 @@
      * Make sure Q coordinates are normalized
      */
     if( mpi_cmp_int( &Q->Z, 1 ) != 0 )
-        return( POLARSSL_ERR_ECP_GENERIC );
+        return( POLARSSL_ERR_ECP_BAD_INPUT_DATA );
 
     mpi_init( &T1 ); mpi_init( &T2 ); mpi_init( &T3 ); mpi_init( &T4 );
     mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
@@ -1176,10 +1176,10 @@
     }
 
     /*
-     * We should have consumed all the bits now
+     * We should have consumed all bits, unless the input value was too big
      */
     if( mpi_cmp_int( &M, 0 ) != 0 )
-        ret = POLARSSL_ERR_ECP_GENERIC;
+        ret = POLARSSL_ERR_ECP_BAD_INPUT_DATA;
 
 cleanup:
 
@@ -1245,7 +1245,7 @@
             mpi_shift_r( &l, 1 );
 
         if( count++ > 10 )
-            return( POLARSSL_ERR_ECP_GENERIC );
+            return( POLARSSL_ERR_ECP_RANDOM_FAILED );
     }
     while( mpi_cmp_int( &l, 1 ) <= 0 );
 
@@ -1406,19 +1406,19 @@
     mpi YY, RHS;
 
     if( mpi_cmp_int( &pt->Z, 0 ) == 0 )
-        return( POLARSSL_ERR_ECP_GENERIC );
+        return( POLARSSL_ERR_ECP_INVALID_KEY );
 
     /*
      * pt coordinates must be normalized for our checks
      */
     if( mpi_cmp_int( &pt->Z, 1 ) != 0 )
-        return( POLARSSL_ERR_ECP_GENERIC );
+        return( POLARSSL_ERR_ECP_INVALID_KEY );
 
     if( mpi_cmp_int( &pt->X, 0 ) < 0 ||
         mpi_cmp_int( &pt->Y, 0 ) < 0 ||
         mpi_cmp_mpi( &pt->X, &grp->P ) >= 0 ||
         mpi_cmp_mpi( &pt->Y, &grp->P ) >= 0 )
-        return( POLARSSL_ERR_ECP_GENERIC );
+        return( POLARSSL_ERR_ECP_INVALID_KEY );
 
     mpi_init( &YY ); mpi_init( &RHS );
 
@@ -1433,7 +1433,7 @@
     MPI_CHK( mpi_add_mpi( &RHS, &RHS,    &grp->B  ) );  MOD_ADD( RHS );
 
     if( mpi_cmp_mpi( &YY, &RHS ) != 0 )
-        ret = POLARSSL_ERR_ECP_GENERIC;
+        ret = POLARSSL_ERR_ECP_INVALID_KEY;
 
 cleanup:
 
@@ -1449,7 +1449,7 @@
 {
     /* We want 1 <= d <= N-1 */
     if ( mpi_cmp_int( d, 1 ) < 0 || mpi_cmp_mpi( d, &grp->N ) >= 0 )
-        return( POLARSSL_ERR_ECP_GENERIC );
+        return( POLARSSL_ERR_ECP_INVALID_KEY );
 
     return( 0 );
 }
@@ -1475,7 +1475,7 @@
             mpi_shift_r( d, 1 );
 
         if( count++ > 10 )
-            return( POLARSSL_ERR_ECP_GENERIC );
+            return( POLARSSL_ERR_ECP_RANDOM_FAILED );
     }
     while( mpi_cmp_int( d, 1 ) < 0 );