aboutsummaryrefslogtreecommitdiff
path: root/src/util/crypto_hkdf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/crypto_hkdf.c')
-rw-r--r--src/util/crypto_hkdf.c184
1 files changed, 92 insertions, 92 deletions
diff --git a/src/util/crypto_hkdf.c b/src/util/crypto_hkdf.c
index 5ed22269f..58ae6c8ad 100644
--- a/src/util/crypto_hkdf.c
+++ b/src/util/crypto_hkdf.c
@@ -18,7 +18,7 @@
18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 THE SOFTWARE. 20 THE SOFTWARE.
21*/ 21 */
22 22
23/** 23/**
24 * @file src/util/crypto_hkdf.c 24 * @file src/util/crypto_hkdf.c
@@ -36,7 +36,7 @@
36 * - Matthias Wachs (08.10.2010) 36 * - Matthias Wachs (08.10.2010)
37 */ 37 */
38 38
39#define LOG(kind,...) GNUNET_log_from (kind, "util-crypto-hkdf", __VA_ARGS__) 39#define LOG(kind, ...) GNUNET_log_from(kind, "util-crypto-hkdf", __VA_ARGS__)
40 40
41/** 41/**
42 * Set this to 0 if you compile this code outside of GNUnet. 42 * Set this to 0 if you compile this code outside of GNUnet.
@@ -75,13 +75,13 @@
75 * @return HMAC, freed by caller via gcry_md_close/_reset 75 * @return HMAC, freed by caller via gcry_md_close/_reset
76 */ 76 */
77static const void * 77static const void *
78doHMAC (gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf, 78doHMAC(gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf,
79 size_t buf_len) 79 size_t buf_len)
80{ 80{
81 gcry_md_setkey (mac, key, key_len); 81 gcry_md_setkey(mac, key, key_len);
82 gcry_md_write (mac, buf, buf_len); 82 gcry_md_write(mac, buf, buf_len);
83 83
84 return (const void *) gcry_md_read (mac, 0); 84 return (const void *)gcry_md_read(mac, 0);
85} 85}
86 86
87/** 87/**
@@ -95,15 +95,15 @@ doHMAC (gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf,
95 * @return #GNUNET_YES on success 95 * @return #GNUNET_YES on success
96 */ 96 */
97static int 97static int
98getPRK (gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm, 98getPRK(gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm,
99 size_t skm_len, void *prk) 99 size_t skm_len, void *prk)
100{ 100{
101 const void *ret; 101 const void *ret;
102 102
103 ret = doHMAC (mac, xts, xts_len, skm, skm_len); 103 ret = doHMAC(mac, xts, xts_len, skm, skm_len);
104 if (ret == NULL) 104 if (ret == NULL)
105 return GNUNET_SYSERR; 105 return GNUNET_SYSERR;
106 GNUNET_memcpy (prk, ret, gcry_md_get_algo_dlen (gcry_md_get_algo (mac))); 106 GNUNET_memcpy(prk, ret, gcry_md_get_algo_dlen(gcry_md_get_algo(mac)));
107 107
108 return GNUNET_YES; 108 return GNUNET_YES;
109} 109}
@@ -111,16 +111,16 @@ getPRK (gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm,
111 111
112#if DEBUG_HKDF 112#if DEBUG_HKDF
113static void 113static void
114dump (const char *src, const void *p, unsigned int l) 114dump(const char *src, const void *p, unsigned int l)
115{ 115{
116 unsigned int i; 116 unsigned int i;
117 117
118 printf ("\n%s: ", src); 118 printf("\n%s: ", src);
119 for (i = 0; i < l; i++) 119 for (i = 0; i < l; i++)
120 { 120 {
121 printf ("%2x", (int) ((const unsigned char *) p)[i]); 121 printf("%2x", (int)((const unsigned char *)p)[i]);
122 } 122 }
123 printf ("\n"); 123 printf("\n");
124} 124}
125#endif 125#endif
126 126
@@ -139,9 +139,9 @@ dump (const char *src, const void *p, unsigned int l)
139 * @return #GNUNET_YES on success 139 * @return #GNUNET_YES on success
140 */ 140 */
141int 141int
142GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, int xtr_algo, int prf_algo, 142GNUNET_CRYPTO_hkdf_v(void *result, size_t out_len, int xtr_algo, int prf_algo,
143 const void *xts, size_t xts_len, const void *skm, 143 const void *xts, size_t xts_len, const void *skm,
144 size_t skm_len, va_list argp) 144 size_t skm_len, va_list argp)
145{ 145{
146 gcry_md_hd_t xtr; 146 gcry_md_hd_t xtr;
147 gcry_md_hd_t prf; 147 gcry_md_hd_t prf;
@@ -149,39 +149,39 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, int xtr_algo, int prf_algo,
149 unsigned long i; 149 unsigned long i;
150 unsigned long t; 150 unsigned long t;
151 unsigned long d; 151 unsigned long d;
152 unsigned int k = gcry_md_get_algo_dlen (prf_algo); 152 unsigned int k = gcry_md_get_algo_dlen(prf_algo);
153 unsigned int xtr_len = gcry_md_get_algo_dlen (xtr_algo); 153 unsigned int xtr_len = gcry_md_get_algo_dlen(xtr_algo);
154 char prk[xtr_len]; 154 char prk[xtr_len];
155 int ret; 155 int ret;
156 size_t ctx_len; 156 size_t ctx_len;
157 va_list args; 157 va_list args;
158 158
159 BENCHMARK_START (hkdf); 159 BENCHMARK_START(hkdf);
160 160
161 if (0 == k) 161 if (0 == k)
162 return GNUNET_SYSERR; 162 return GNUNET_SYSERR;
163 if (GPG_ERR_NO_ERROR != 163 if (GPG_ERR_NO_ERROR !=
164 gcry_md_open (&xtr, xtr_algo, GCRY_MD_FLAG_HMAC)) 164 gcry_md_open(&xtr, xtr_algo, GCRY_MD_FLAG_HMAC))
165 return GNUNET_SYSERR; 165 return GNUNET_SYSERR;
166 if (GPG_ERR_NO_ERROR != 166 if (GPG_ERR_NO_ERROR !=
167 gcry_md_open (&prf, prf_algo, GCRY_MD_FLAG_HMAC)) 167 gcry_md_open(&prf, prf_algo, GCRY_MD_FLAG_HMAC))
168 { 168 {
169 gcry_md_close (xtr); 169 gcry_md_close(xtr);
170 return GNUNET_SYSERR; 170 return GNUNET_SYSERR;
171 } 171 }
172 va_copy (args, argp); 172 va_copy(args, argp);
173 173
174 ctx_len = 0; 174 ctx_len = 0;
175 while (NULL != va_arg (args, void *)) 175 while (NULL != va_arg(args, void *))
176 ctx_len += va_arg (args, size_t); 176 ctx_len += va_arg(args, size_t);
177 177
178 va_end (args); 178 va_end(args);
179 179
180 memset (result, 0, out_len); 180 memset(result, 0, out_len);
181 if (getPRK (xtr, xts, xts_len, skm, skm_len, prk) != GNUNET_YES) 181 if (getPRK(xtr, xts, xts_len, skm, skm_len, prk) != GNUNET_YES)
182 goto hkdf_error; 182 goto hkdf_error;
183#if DEBUG_HKDF 183#if DEBUG_HKDF
184 dump ("PRK", prk, xtr_len); 184 dump("PRK", prk, xtr_len);
185#endif 185#endif
186 186
187 t = out_len / k; 187 t = out_len / k;
@@ -195,69 +195,69 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, int xtr_algo, int prf_algo,
195 char *dst; 195 char *dst;
196 196
197 dst = plain + k; 197 dst = plain + k;
198 va_copy (args, argp); 198 va_copy(args, argp);
199 while ((ctx = va_arg (args, void *))) 199 while ((ctx = va_arg(args, void *)))
200 { 200 {
201 size_t len; 201 size_t len;
202 202
203 len = va_arg (args, size_t); 203 len = va_arg(args, size_t);
204 GNUNET_memcpy (dst, ctx, len); 204 GNUNET_memcpy(dst, ctx, len);
205 dst += len; 205 dst += len;
206 } 206 }
207 va_end (args); 207 va_end(args);
208 208
209 if (t > 0) 209 if (t > 0)
210 { 210 {
211 memset (plain + k + ctx_len, 1, 1); 211 memset(plain + k + ctx_len, 1, 1);
212#if DEBUG_HKDF 212#if DEBUG_HKDF
213 dump ("K(1)", plain, plain_len); 213 dump("K(1)", plain, plain_len);
214#endif 214#endif
215 hc = doHMAC (prf, prk, xtr_len, &plain[k], ctx_len + 1); 215 hc = doHMAC(prf, prk, xtr_len, &plain[k], ctx_len + 1);
216 if (hc == NULL) 216 if (hc == NULL)
217 goto hkdf_error; 217 goto hkdf_error;
218 GNUNET_memcpy (result, hc, k); 218 GNUNET_memcpy(result, hc, k);
219 result += k; 219 result += k;
220 } 220 }
221 221
222 /* K(i+1) */ 222 /* K(i+1) */
223 for (i = 1; i < t; i++) 223 for (i = 1; i < t; i++)
224 { 224 {
225 GNUNET_memcpy (plain, result - k, k); 225 GNUNET_memcpy(plain, result - k, k);
226 memset (plain + k + ctx_len, i + 1, 1); 226 memset(plain + k + ctx_len, i + 1, 1);
227 gcry_md_reset (prf); 227 gcry_md_reset(prf);
228#if DEBUG_HKDF 228#if DEBUG_HKDF
229 dump ("K(i+1)", plain, plain_len); 229 dump("K(i+1)", plain, plain_len);
230#endif 230#endif
231 hc = doHMAC (prf, prk, xtr_len, plain, plain_len); 231 hc = doHMAC(prf, prk, xtr_len, plain, plain_len);
232 if (hc == NULL) 232 if (hc == NULL)
233 goto hkdf_error; 233 goto hkdf_error;
234 GNUNET_memcpy (result, hc, k); 234 GNUNET_memcpy(result, hc, k);
235 result += k; 235 result += k;
236 } 236 }
237 237
238 /* K(t):d */ 238 /* K(t):d */
239 if (d > 0) 239 if (d > 0)
240 {
241 if (t > 0)
242 { 240 {
243 GNUNET_memcpy (plain, result - k, k); 241 if (t > 0)
244 i++; 242 {
245 } 243 GNUNET_memcpy(plain, result - k, k);
246 memset (plain + k + ctx_len, i, 1); 244 i++;
247 gcry_md_reset (prf); 245 }
246 memset(plain + k + ctx_len, i, 1);
247 gcry_md_reset(prf);
248#if DEBUG_HKDF 248#if DEBUG_HKDF
249 dump ("K(t):d", plain, plain_len); 249 dump("K(t):d", plain, plain_len);
250#endif 250#endif
251 if (t > 0) 251 if (t > 0)
252 hc = doHMAC (prf, prk, xtr_len, plain, plain_len); 252 hc = doHMAC(prf, prk, xtr_len, plain, plain_len);
253 else 253 else
254 hc = doHMAC (prf, prk, xtr_len, plain + k, plain_len - k); 254 hc = doHMAC(prf, prk, xtr_len, plain + k, plain_len - k);
255 if (hc == NULL) 255 if (hc == NULL)
256 goto hkdf_error; 256 goto hkdf_error;
257 GNUNET_memcpy (result, hc, d); 257 GNUNET_memcpy(result, hc, d);
258 } 258 }
259#if DEBUG_HKDF 259#if DEBUG_HKDF
260 dump ("result", result - k, out_len); 260 dump("result", result - k, out_len);
261#endif 261#endif
262 262
263 ret = GNUNET_YES; 263 ret = GNUNET_YES;
@@ -266,9 +266,9 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, int xtr_algo, int prf_algo,
266hkdf_error: 266hkdf_error:
267 ret = GNUNET_SYSERR; 267 ret = GNUNET_SYSERR;
268hkdf_ok: 268hkdf_ok:
269 gcry_md_close (xtr); 269 gcry_md_close(xtr);
270 gcry_md_close (prf); 270 gcry_md_close(prf);
271 BENCHMARK_END (hkdf); 271 BENCHMARK_END(hkdf);
272 return ret; 272 return ret;
273} 273}
274 274
@@ -286,18 +286,18 @@ hkdf_ok:
286 * @return #GNUNET_YES on success 286 * @return #GNUNET_YES on success
287 */ 287 */
288int 288int
289GNUNET_CRYPTO_hkdf (void *result, size_t out_len, int xtr_algo, int prf_algo, 289GNUNET_CRYPTO_hkdf(void *result, size_t out_len, int xtr_algo, int prf_algo,
290 const void *xts, size_t xts_len, const void *skm, 290 const void *xts, size_t xts_len, const void *skm,
291 size_t skm_len, ...) 291 size_t skm_len, ...)
292{ 292{
293 va_list argp; 293 va_list argp;
294 int ret; 294 int ret;
295 295
296 va_start (argp, skm_len); 296 va_start(argp, skm_len);
297 ret = 297 ret =
298 GNUNET_CRYPTO_hkdf_v (result, out_len, xtr_algo, prf_algo, xts, xts_len, 298 GNUNET_CRYPTO_hkdf_v(result, out_len, xtr_algo, prf_algo, xts, xts_len,
299 skm, skm_len, argp); 299 skm, skm_len, argp);
300 va_end (argp); 300 va_end(argp);
301 301
302 return ret; 302 return ret;
303} 303}