GNUnet  0.11.x
crypto_pow.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2012, 2013, 2019 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  */
26 #include "platform.h"
27 #include "gnunet_crypto_lib.h"
28 #include <gcrypt.h>
29 
30 
41 void
42 GNUNET_CRYPTO_pow_hash (const char *salt,
43  const void *buf,
44  size_t buf_len,
45  struct GNUNET_HashCode *result)
46 {
49  char rbuf[buf_len];
50 
51  GNUNET_break (0 == gcry_kdf_derive (buf,
52  buf_len,
53  GCRY_KDF_SCRYPT,
54  1 /* subalgo */,
55  salt,
56  strlen (salt),
57  2 /* iterations; keep cost of individual op small */,
58  sizeof(skey),
59  &skey));
61  &skey,
62  "gnunet-proof-of-work-iv",
63  strlen ("gnunet-proof-of-work-iv"),
64  salt,
65  strlen (salt),
66  NULL, 0);
68  buf_len,
69  &skey,
70  &iv,
71  &rbuf);
72  GNUNET_break (0 == gcry_kdf_derive (rbuf,
73  buf_len,
74  GCRY_KDF_SCRYPT,
75  1 /* subalgo */,
76  salt,
77  strlen (salt),
78  2 /* iterations; keep cost of individual op small */,
79  sizeof(struct GNUNET_HashCode),
80  result));
81 }
82 
83 
84 /* end of crypto_pow.c */
void GNUNET_CRYPTO_pow_hash(const char *salt, const void *buf, size_t buf_len, struct GNUNET_HashCode *result)
Calculate the &#39;proof-of-work&#39; hash (an expensive hash).
Definition: crypto_pow.c:42
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
cryptographic primitives for GNUnet
ssize_t GNUNET_CRYPTO_symmetric_encrypt(const void *block, size_t size, const struct GNUNET_CRYPTO_SymmetricSessionKey *sessionkey, const struct GNUNET_CRYPTO_SymmetricInitializationVector *iv, void *result)
Encrypt a block using a symmetric sessionkey.
void GNUNET_CRYPTO_symmetric_derive_iv(struct GNUNET_CRYPTO_SymmetricInitializationVector *iv, const struct GNUNET_CRYPTO_SymmetricSessionKey *skey, const void *salt, size_t salt_len,...)
Derive an IV.
static char buf[2048]
static int result
Global testing status.
A 512-bit hashcode.