Added support for writing points compressed
diff --git a/library/ecp.c b/library/ecp.c
index 854da58..6501fbe 100644
--- a/library/ecp.c
+++ b/library/ecp.c
@@ -174,16 +174,20 @@
}
/*
- * Export a point into unsigned binary data, uncompressed format (SEC1 2.3.3)
+ * Export a point into unsigned binary data (SEC1 2.3.3)
*/
-int ecp_write_binary( const ecp_group *grp, const ecp_point *P,
+int ecp_write_binary( const ecp_group *grp, const ecp_point *P, int format,
size_t *olen, unsigned char *buf, size_t buflen )
{
int ret;
size_t plen;
+ if( format != POLARSSL_ECP_PF_UNCOMPRESSED &&
+ format != POLARSSL_ECP_PF_COMPRESSED )
+ return( POLARSSL_ERR_ECP_GENERIC );
+
/*
- * Case P == 0
+ * Common case: P == 0
*/
if( mpi_cmp_int( &P->Z, 0 ) == 0 )
{
@@ -197,14 +201,28 @@
}
plen = mpi_size( &grp->P );
- *olen = 2 * plen + 1;
- if( buflen < *olen )
- return( POLARSSL_ERR_ECP_GENERIC );
+ if( format == POLARSSL_ECP_PF_UNCOMPRESSED )
+ {
+ *olen = 2 * plen + 1;
- buf[0] = 0x04;
- MPI_CHK( mpi_write_binary( &P->X, buf + 1, plen ) );
- MPI_CHK( mpi_write_binary( &P->Y, buf + 1 + plen, plen ) );
+ if( buflen < *olen )
+ return( POLARSSL_ERR_ECP_GENERIC );
+
+ buf[0] = 0x04;
+ MPI_CHK( mpi_write_binary( &P->X, buf + 1, plen ) );
+ MPI_CHK( mpi_write_binary( &P->Y, buf + 1 + plen, plen ) );
+ }
+ else if( format == POLARSSL_ECP_PF_COMPRESSED )
+ {
+ *olen = plen + 1;
+
+ if( buflen < *olen )
+ return( POLARSSL_ERR_ECP_GENERIC );
+
+ buf[0] = 0x02 + mpi_get_bit( &P->Y, 0 );
+ MPI_CHK( mpi_write_binary( &P->X, buf + 1, plen ) );
+ }
cleanup:
return( ret );