Integrating http://code.google.com/p/gnupg-ecc/source/detail?r=15 .
[gnupg.git] / common / convert.c
index aa3a3a8..0a0c46f 100644 (file)
@@ -23,6 +23,7 @@
 #include <ctype.h>
 
 #include "util.h"
+#include "gcrypt.h"
 
 
 #define tohex(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'A'))
@@ -245,5 +246,31 @@ hex2str_alloc (const char *hexstring, size_t *r_count)
   return result;
 }
 
+/* returns hex representation of the MPI; 
+ * caller must free with xfree 
+ * Returns NULL on error, never throws
+ */
+char *mpi2hex( gcry_mpi_t m )  {
+  size_t nbytes;
+  size_t nbytes2;
+  int rc;
+  byte *p;
+
+  nbytes = (mpi_get_nbits ( m )+7)/8;
+  if( nbytes == 0 )
+    return NULL;
+  p = xtrymalloc( nbytes*3+1 );
+  if( p==NULL )
+    return NULL;
+  rc = gcry_mpi_print (GCRYMPI_FMT_USG, p+2*nbytes+1, nbytes, &nbytes2, m);
+  if( rc )  {
+      xfree( p );
+      return NULL;
+  }
 
+  bin2hex( p+2*nbytes+1, nbytes2, p );
+  p[nbytes2*2] = '\0';
+//printf("%s:%d>>>> Created the string %s from %d bytes %02x %02x ..., MPI was %d bytes\n", __FILE__, __LINE__, p, nbytes2, p[2*nbytes+1], p[2*nbytes+2], nbytes);
+  return p;
+}