first batch of license fixes (boring)
[oweals/gnunet.git] / src / secretsharing / secretsharing_common.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2014 GNUnet e.V.
4
5      GNUnet is free software: you can redistribute it and/or modify it
6      under the terms of the GNU 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.
9
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.
14 */
15
16 #include "secretsharing.h"
17
18 /**
19  * Read a share from its binary representation.
20  *
21  * @param data Binary representation of the share.
22  * @param len Length of @a data.
23  * @param[out] readlen Number of bytes read,
24  *             ignored if NULL.
25  * @return The share, or NULL on error.
26  */
27 struct GNUNET_SECRETSHARING_Share *
28 GNUNET_SECRETSHARING_share_read (const void *data,
29                                  size_t len,
30                                  size_t *readlen)
31 {
32   struct GNUNET_SECRETSHARING_Share *share;
33   const struct GNUNET_SECRETSHARING_ShareHeaderNBO *sh = data;
34   const char *p;
35   size_t n;
36   uint16_t payload_size;
37
38   payload_size = ntohs (sh->num_peers) *
39       (sizeof (uint16_t) + sizeof (struct GNUNET_SECRETSHARING_FieldElement) +
40        sizeof (struct GNUNET_PeerIdentity));
41
42   if (NULL != readlen)
43     *readlen = payload_size + sizeof *sh;
44
45   share = GNUNET_new (struct GNUNET_SECRETSHARING_Share);
46
47   share->threshold = ntohs (sh->threshold);
48   share->num_peers = ntohs (sh->num_peers);
49   share->my_peer = ntohs (sh->my_peer);
50
51   share->my_share = sh->my_share;
52   share->public_key = sh->public_key;
53
54   p = (const char *) &sh[1];
55
56   n = share->num_peers * sizeof (struct GNUNET_PeerIdentity);
57   share->peers = GNUNET_new_array (share->num_peers,
58                                    struct GNUNET_PeerIdentity);
59   GNUNET_memcpy (share->peers, p, n);
60   p += n;
61
62   n = share->num_peers * sizeof (struct GNUNET_SECRETSHARING_FieldElement);
63   share->sigmas = GNUNET_new_array (share->num_peers,
64                                     struct GNUNET_SECRETSHARING_FieldElement);
65   GNUNET_memcpy (share->sigmas, p, n);
66   p += n;
67
68   n = share->num_peers * sizeof (uint16_t);
69   share->original_indices = GNUNET_new_array (share->num_peers,
70                                               uint16_t);
71   GNUNET_memcpy (share->original_indices, p, n);
72
73   return share;
74 }
75
76
77 /**
78  * Convert a share to its binary representation.
79  * Can be called with a NULL @a buf to get the size of the share.
80  *
81  * @param share Share to write.
82  * @param buf Buffer to write to.
83  * @param buflen Number of writable bytes in @a buf.
84  * @param[out] writelen Pointer to store number of bytes written,
85  *             ignored if NULL.
86  * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure.
87  */
88 int
89 GNUNET_SECRETSHARING_share_write (const struct GNUNET_SECRETSHARING_Share *share,
90                                   void *buf, size_t buflen, size_t *writelen)
91 {
92   uint16_t payload_size;
93   struct GNUNET_SECRETSHARING_ShareHeaderNBO *sh;
94   char *p;
95   int n;
96
97   payload_size = share->num_peers *
98       (sizeof (uint16_t) + sizeof (struct GNUNET_SECRETSHARING_FieldElement) +
99        sizeof (struct GNUNET_PeerIdentity));
100
101   if (NULL != writelen)
102     *writelen = payload_size + sizeof (struct GNUNET_SECRETSHARING_ShareHeaderNBO);
103
104   /* just a query for the writelen */
105   if (buf == NULL)
106     return GNUNET_OK;
107
108   /* wrong buffer size */
109   if (buflen < payload_size + sizeof (struct GNUNET_SECRETSHARING_ShareHeaderNBO))
110     return GNUNET_SYSERR;
111
112   sh = buf;
113
114   sh->threshold = htons (share->threshold);
115   sh->num_peers = htons (share->num_peers);
116   sh->my_peer = htons (share->my_peer);
117
118   sh->my_share = share->my_share;
119   sh->public_key = share->public_key;
120
121   p = (void *) &sh[1];
122
123   n = share->num_peers * sizeof (struct GNUNET_PeerIdentity);
124   GNUNET_memcpy (p, share->peers, n);
125   p += n;
126
127   n = share->num_peers * sizeof (struct GNUNET_SECRETSHARING_FieldElement);
128   GNUNET_memcpy (p, share->sigmas, n);
129   p += n;
130
131   n = share->num_peers * sizeof (uint16_t);
132   GNUNET_memcpy (p, share->original_indices, n);
133
134   return GNUNET_OK;
135 }
136
137
138 void
139 GNUNET_SECRETSHARING_share_destroy (struct GNUNET_SECRETSHARING_Share *share)
140 {
141   GNUNET_free (share->original_indices);
142   share->original_indices = NULL;
143   GNUNET_free (share->sigmas);
144   share->sigmas = NULL;
145   GNUNET_free (share->peers);
146   share->peers = NULL;
147   GNUNET_free (share);
148 }