2 This file is part of GNUnet.
3 Copyright (C) 2012, 2013 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
17 * @file util/crypto_mpi.c
18 * @brief Helper functions for libgcrypt MPIs
19 * @author Christian Grothoff
20 * @author Florian Dold
24 #include "gnunet_crypto_lib.h"
27 #define LOG(kind,...) GNUNET_log_from (kind, "util-crypto-mpi", __VA_ARGS__)
30 * Log an error message at log-level 'level' that indicates
31 * a failure of the command 'cmd' with the message given
32 * by gcry_strerror(rc).
34 #define LOG_GCRY(level, cmd, rc) do { LOG(level, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, gcry_strerror(rc)); } while(0)
38 * If target != size, move @a target bytes to the end of the size-sized
39 * buffer and zero out the first @a target - @a size bytes.
41 * @param buf original buffer
42 * @param size number of bytes in @a buf
43 * @param target target size of the buffer
54 memmove (&p[target - size], buf, size);
55 memset (buf, 0, target - size);
61 * Output the given MPI value to the given buffer in
63 * The MPI @a val may not be negative.
65 * @param buf where to output to
66 * @param size number of bytes in @a buf
67 * @param val value to write to @a buf
70 GNUNET_CRYPTO_mpi_print_unsigned (void *buf,
77 if (gcry_mpi_get_flag (val, GCRYMPI_FLAG_OPAQUE))
79 /* Store opaque MPIs left aligned into the buffer. */
83 p = gcry_mpi_get_opaque (val, &nbits);
88 GNUNET_memcpy (buf, p, rsize);
90 memset (buf+rsize, 0, size - rsize);
94 /* Store regular MPIs as unsigned integers right aligned into
98 (rc = gcry_mpi_print (GCRYMPI_FMT_USG,
103 LOG_GCRY (GNUNET_ERROR_TYPE_ERROR,
108 adjust (buf, rsize, size);
114 * Convert data buffer into MPI value.
115 * The buffer is interpreted as network
116 * byte order, unsigned integer.
118 * @param result where to store MPI value (allocated)
119 * @param data raw data (GCRYMPI_FMT_USG)
120 * @param size number of bytes in @a data
123 GNUNET_CRYPTO_mpi_scan_unsigned (gcry_mpi_t *result,
129 if (0 != (rc = gcry_mpi_scan (result,
133 LOG_GCRY (GNUNET_ERROR_TYPE_ERROR,
140 /* end of crypto_mpi.c */