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.
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
22 * @file util/crypto_mpi.c
23 * @brief Helper functions for libgcrypt MPIs
24 * @author Christian Grothoff
25 * @author Florian Dold
29 #include "gnunet_crypto_lib.h"
32 #define LOG(kind,...) GNUNET_log_from (kind, "util-crypto-mpi", __VA_ARGS__)
35 * Log an error message at log-level 'level' that indicates
36 * a failure of the command 'cmd' with the message given
37 * by gcry_strerror(rc).
39 #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)
43 * If target != size, move @a target bytes to the end of the size-sized
44 * buffer and zero out the first @a target - @a size bytes.
46 * @param buf original buffer
47 * @param size number of bytes in @a buf
48 * @param target target size of the buffer
59 memmove (&p[target - size], buf, size);
60 memset (buf, 0, target - size);
66 * Output the given MPI value to the given buffer in
68 * The MPI @a val may not be negative.
70 * @param buf where to output to
71 * @param size number of bytes in @a buf
72 * @param val value to write to @a buf
75 GNUNET_CRYPTO_mpi_print_unsigned (void *buf,
82 if (gcry_mpi_get_flag (val, GCRYMPI_FLAG_OPAQUE))
84 /* Store opaque MPIs left aligned into the buffer. */
88 p = gcry_mpi_get_opaque (val, &nbits);
93 GNUNET_memcpy (buf, p, rsize);
95 memset (buf+rsize, 0, size - rsize);
99 /* Store regular MPIs as unsigned integers right aligned into
103 (rc = gcry_mpi_print (GCRYMPI_FMT_USG,
108 LOG_GCRY (GNUNET_ERROR_TYPE_ERROR,
113 adjust (buf, rsize, size);
119 * Convert data buffer into MPI value.
120 * The buffer is interpreted as network
121 * byte order, unsigned integer.
123 * @param result where to store MPI value (allocated)
124 * @param data raw data (GCRYMPI_FMT_USG)
125 * @param size number of bytes in @a data
128 GNUNET_CRYPTO_mpi_scan_unsigned (gcry_mpi_t *result,
134 if (0 != (rc = gcry_mpi_scan (result,
138 LOG_GCRY (GNUNET_ERROR_TYPE_ERROR,
145 /* end of crypto_mpi.c */