more work on tng
[oweals/gnunet.git] / src / include / gnunet_abe_lib.h
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2001-2018 GNUnet e.V.
4
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.
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      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/>.
17
18      SPDX-License-Identifier: AGPL3.0-or-later
19 */
20
21 /**
22  * @file include/gnunet_abe_lib.h
23  * @brief Attribute-Based Encryption primitives for GNUnet
24  *
25  * @author Martin Schanzenbach
26  *
27  * @defgroup abe  ABE Crypto library: Attribute-Based Encryption operations
28  *
29  */
30 #ifndef GNUNET_ABE_LIB_H
31 #define GNUNET_ABE_LIB_H
32
33 #ifdef __cplusplus
34 extern "C"
35 {
36 #if 0                           /* keep Emacsens' auto-indent happy */
37 }
38 #endif
39 #endif
40
41 #include "gnunet_common.h"
42 #include <gcrypt.h>
43
44 /**
45  * @brief type for ABE master keys
46  */
47 struct GNUNET_CRYPTO_AbeMasterKey;
48
49 /**
50  * @brief type for ABE keys
51  */
52 struct GNUNET_CRYPTO_AbeKey;
53
54
55
56 /**
57  * @ingroup abe
58  * Create a new CP-ABE master key. Caller must free return value.
59  *
60  * @return fresh private key; free using #GNUNET_ABE_cpabe_delete_master_key
61  */
62 struct GNUNET_ABE_AbeMasterKey *
63 GNUNET_ABE_cpabe_create_master_key (void);
64
65 /**
66  * @ingroup abe
67  * Delete a CP-ABE master key.
68  *
69  * @param key the master key
70  * @return fresh private key; free using #GNUNET_free
71  */
72 void
73 GNUNET_ABE_cpabe_delete_master_key (struct GNUNET_ABE_AbeMasterKey *key);
74
75 /**
76  * @ingroup abe
77  * Create a new CP-ABE key. Caller must free return value.
78  *
79  * @param key the master key
80  * @param attrs the attributes to append to the key
81  * @return fresh private key; free using #GNUNET_ABE_cpabe_delete_key
82  */
83 struct GNUNET_ABE_AbeKey *
84 GNUNET_ABE_cpabe_create_key (struct GNUNET_ABE_AbeMasterKey *key,
85                                 char **attrs);
86
87 /**
88  * @ingroup abe
89  * Delete a CP-ABE key.
90  *
91  * @param key the key to delete
92  * @param delete_pub GNUNET_YES if the public key should also be freed (bug in gabe)
93  * @return fresh private key; free using #GNUNET_free
94  */
95 void
96 GNUNET_ABE_cpabe_delete_key (struct GNUNET_ABE_AbeKey *key,
97                                 int delete_pub);
98
99
100 /**
101  * @ingroup abe
102  * Encrypt a block using  sessionkey.
103  *
104  * @param block the block to encrypt
105  * @param size the size of the @a block
106  * @param policy the ABE policy
107  * @param key the key used to encrypt
108  * @param result the result buffer. Will be allocated. Free using #GNUNET_free
109  * @return the size of the encrypted block, -1 for errors
110  */
111 ssize_t
112 GNUNET_ABE_cpabe_encrypt (const void *block,
113                              size_t size,
114                              const char *policy,
115                              const struct GNUNET_ABE_AbeMasterKey *key,
116                              void **result);
117
118 /**
119  * @ingroup abe
120  * Decrypt a block using the ABE key.
121  *
122  * @param block the block to encrypt
123  * @param size the size of the @a block
124  * @param key the key used to decrypt
125  * @param result the result buffer. Will be allocated. Free using #GNUNET_free
126  * @return the size of the encrypted block, -1 for errors
127  */
128 ssize_t
129 GNUNET_ABE_cpabe_decrypt (const void *block,
130                              size_t size,
131                              const struct GNUNET_ABE_AbeKey *key,
132                              void **result);
133
134 /**
135  * @ingroup abe
136  * Serialize an ABE key.
137  *
138  * @param key the key to serialize
139  * @param result the result buffer. Will be allocated. Free using #GNUNET_free
140  * @return the size of the encrypted block, -1 for errors
141  */
142 ssize_t
143 GNUNET_ABE_cpabe_serialize_key (const struct GNUNET_ABE_AbeKey *key,
144                                    void **result);
145
146 /**
147  * @ingroup abe
148  * Deserialize a serialized ABE key.
149  *
150  * @param data the data to deserialize
151  * @param len the length of the data.
152  * @return the ABE key. NULL of unsuccessful
153  */
154 struct GNUNET_ABE_AbeKey*
155 GNUNET_ABE_cpabe_deserialize_key (const void *data,
156                                      size_t len);
157
158 /**
159  * @ingroup abe
160  * Serialize an ABE master key.
161  *
162  * @param key the key to serialize
163  * @param result the result buffer. Will be allocated. Free using #GNUNET_free
164  * @return the size of the encrypted block, -1 for errors
165  */
166 ssize_t
167 GNUNET_ABE_cpabe_serialize_master_key (const struct GNUNET_ABE_AbeMasterKey *key,
168                                           void **result);
169
170 /**
171  * @ingroup abe
172  * Deserialize an ABE master key.
173  *
174  * @param data the data to deserialize
175  * @param len the length of the data.
176  * @return the ABE key. NULL of unsuccessful
177  */
178 struct GNUNET_ABE_AbeMasterKey*
179 GNUNET_ABE_cpabe_deserialize_master_key (const void *data,
180                                             size_t len);
181
182
183 #if 0                           /* keep Emacsens' auto-indent happy */
184 {
185 #endif
186 #ifdef __cplusplus
187 }
188 #endif
189
190
191 /* ifndef GNUNET_ABE_LIB_H */
192 #endif
193 /* end of gnunet_abe_lib.h */