Data type conversions

Werner Koch wk at
Fri Jan 8 14:12:59 CET 2010

On Fri, 8 Jan 2010 11:52:46 +0100, Sergi Blanch i Torné wrote:
> means, from the point of view of the data, that I have to transform
> 'gcry_mpi_t' data form/to 'byte*'. In the libgcrypt documentation I
> didn't find a method for this conversion.

That is easy: Use gcry_mpi_print with a suitable format specifier.
Have a look at this code in gnupg/g10/build-packet.c:

 * Write the mpi A to OUT.
static int
mpi_write (iobuf_t out, gcry_mpi_t a)
  char buffer[(MAX_EXTERN_MPI_BITS+7)/8+2]; /* 2 is for the mpi length. */
  size_t nbytes;
  int rc;

  nbytes = DIM(buffer);
  rc = gcry_mpi_print (GCRYMPI_FMT_PGP, buffer, nbytes, &nbytes, a );
  if( !rc )
    rc = iobuf_write( out, buffer, nbytes );
  else if (gpg_err_code(rc) == GPG_ERR_TOO_SHORT )
      log_info ("mpi too large (%u bits)\n", gcry_mpi_get_nbits (a));
      /* The buffer was too small. We better tell the user about the MPI. */
      rc = gpg_error (GPG_ERR_TOO_LARGE);

  return rc;

If you don't want to put an upper limit on the size of the MPI or you
want to store int in secure memory you need to allocate the buffer.
gcry_mpi_aprint does this for you and automagically decides whether to
allocate from the standard or the secure memory pool.  See the gcrypt



Die Gedanken sind frei.  Ausnahmen regelt ein Bundesgesetz.

More information about the Gcrypt-devel mailing list