2 This file is part of GNUnet.
3 Copyright (C) 2014 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 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 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
21 #include "secretsharing.h"
24 * Read a share from its binary representation.
26 * @param data Binary representation of the share.
27 * @param len Length of @a data.
28 * @param[out] readlen Number of bytes read,
30 * @return The share, or NULL on error.
32 struct GNUNET_SECRETSHARING_Share *
33 GNUNET_SECRETSHARING_share_read (const void *data,
37 struct GNUNET_SECRETSHARING_Share *share;
38 const struct GNUNET_SECRETSHARING_ShareHeaderNBO *sh = data;
41 uint16_t payload_size;
43 payload_size = ntohs (sh->num_peers) *
44 (sizeof (uint16_t) + sizeof (struct GNUNET_SECRETSHARING_FieldElement) +
45 sizeof (struct GNUNET_PeerIdentity));
48 *readlen = payload_size + sizeof *sh;
50 share = GNUNET_malloc (sizeof *share);
52 share->threshold = ntohs (sh->threshold);
53 share->num_peers = ntohs (sh->num_peers);
54 share->my_peer = ntohs (sh->my_peer);
56 share->my_share = sh->my_share;
57 share->public_key = sh->public_key;
61 n = share->num_peers * sizeof (struct GNUNET_PeerIdentity);
62 share->peers = GNUNET_malloc (n);
63 memcpy (share->peers, p, n);
66 n = share->num_peers * sizeof (struct GNUNET_SECRETSHARING_FieldElement);
67 share->sigmas = GNUNET_malloc (n);
68 memcpy (share->sigmas, p, n);
71 n = share->num_peers * sizeof (uint16_t);
72 share->original_indices = GNUNET_malloc (n);
73 memcpy (share->original_indices, p, n);
80 * Convert a share to its binary representation.
81 * Can be called with a NULL @a buf to get the size of the share.
83 * @param share Share to write.
84 * @param buf Buffer to write to.
85 * @param buflen Number of writable bytes in @a buf.
86 * @param[out] writelen Pointer to store number of bytes written,
88 * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure.
91 GNUNET_SECRETSHARING_share_write (const struct GNUNET_SECRETSHARING_Share *share,
92 void *buf, size_t buflen, size_t *writelen)
94 uint16_t payload_size;
95 struct GNUNET_SECRETSHARING_ShareHeaderNBO *sh;
99 payload_size = share->num_peers *
100 (sizeof (uint16_t) + sizeof (struct GNUNET_SECRETSHARING_FieldElement) +
101 sizeof (struct GNUNET_PeerIdentity));
103 if (NULL != writelen)
104 *writelen = payload_size + sizeof (struct GNUNET_SECRETSHARING_ShareHeaderNBO);
106 /* just a query for the writelen */
110 /* wrong buffer size */
111 if (buflen < payload_size + sizeof (struct GNUNET_SECRETSHARING_ShareHeaderNBO))
112 return GNUNET_SYSERR;
116 sh->threshold = htons (share->threshold);
117 sh->num_peers = htons (share->num_peers);
118 sh->my_peer = htons (share->my_peer);
120 sh->my_share = share->my_share;
121 sh->public_key = share->public_key;
125 n = share->num_peers * sizeof (struct GNUNET_PeerIdentity);
126 memcpy (p, share->peers, n);
129 n = share->num_peers * sizeof (struct GNUNET_SECRETSHARING_FieldElement);
130 memcpy (p, share->sigmas, n);
133 n = share->num_peers * sizeof (uint16_t);
134 memcpy (p, share->original_indices, n);
141 GNUNET_SECRETSHARING_share_destroy (struct GNUNET_SECRETSHARING_Share *share)
143 GNUNET_free (share->original_indices);
144 share->original_indices = NULL;
145 GNUNET_free (share->sigmas);
146 share->sigmas = NULL;
147 GNUNET_free (share->peers);