aboutsummaryrefslogtreecommitdiff
path: root/src/util/crypto_pow.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/crypto_pow.c')
-rw-r--r--src/util/crypto_pow.c86
1 files changed, 11 insertions, 75 deletions
diff --git a/src/util/crypto_pow.c b/src/util/crypto_pow.c
index 9b20ab345..35511a130 100644
--- a/src/util/crypto_pow.c
+++ b/src/util/crypto_pow.c
@@ -25,7 +25,7 @@
25 */ 25 */
26#include "platform.h" 26#include "platform.h"
27#include "gnunet_crypto_lib.h" 27#include "gnunet_crypto_lib.h"
28#include <gcrypt.h> 28#include <argon2.h>
29 29
30/** 30/**
31 * Calculate the 'proof-of-work' hash (an expensive hash). 31 * Calculate the 'proof-of-work' hash (an expensive hash).
@@ -43,81 +43,17 @@ GNUNET_CRYPTO_pow_hash (const char *salt,
43 size_t buf_len, 43 size_t buf_len,
44 struct GNUNET_HashCode *result) 44 struct GNUNET_HashCode *result)
45{ 45{
46#ifdef LSD001 46 GNUNET_break (ARGON2_OK == argon2d_hash_raw (3, /* iterations */
47 char twofish_iv[128 / 8]; //128 bit IV 47 1024, /* memory (1 MiB) */
48 char twofish_key[256 / 8]; //256 bit Key 48 1, /* threads */
49 char rbuf[buf_len]; 49 buf,
50 int rc; 50 buf_len,
51 gcry_cipher_hd_t handle; 51 salt,
52 strlen (salt),
53 result,
54 sizeof (struct
55 GNUNET_HashCode)));
52 56
53 GNUNET_break (0 == gcry_kdf_derive (buf,
54 buf_len,
55 GCRY_KDF_SCRYPT,
56 1 /* subalgo */,
57 salt,
58 strlen (salt),
59 2 /* iterations; keep cost of individual op small */,
60 sizeof(twofish_key),
61 &twofish_key));
62
63 GNUNET_CRYPTO_kdf (twofish_iv,
64 sizeof (twofish_iv),
65 "gnunet-proof-of-work-iv",
66 strlen ("gnunet-proof-of-work-iv"),
67 twofish_key,
68 sizeof(twofish_key),
69 salt,
70 strlen (salt),
71 NULL, 0);
72 GNUNET_assert (0 ==
73 gcry_cipher_open (&handle, GCRY_CIPHER_TWOFISH,
74 GCRY_CIPHER_MODE_CFB, 0));
75 rc = gcry_cipher_setkey (handle,
76 twofish_key,
77 sizeof(twofish_key));
78 GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
79 rc = gcry_cipher_setiv (handle,
80 twofish_iv,
81 sizeof(twofish_iv));
82 GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
83 GNUNET_assert (0 == gcry_cipher_encrypt (handle, &rbuf, buf_len, buf, buf_len));
84 gcry_cipher_close (handle);
85#else
86 struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
87 struct GNUNET_CRYPTO_SymmetricSessionKey skey;
88 char rbuf[buf_len];
89
90 GNUNET_break (0 == gcry_kdf_derive (buf,
91 buf_len,
92 GCRY_KDF_SCRYPT,
93 1 /* subalgo */,
94 salt,
95 strlen (salt),
96 2 /* iterations; keep cost of individual op small */,
97 sizeof(skey),
98 &skey));
99 GNUNET_CRYPTO_symmetric_derive_iv (&iv,
100 &skey,
101 "gnunet-proof-of-work-iv",
102 strlen ("gnunet-proof-of-work-iv"),
103 salt,
104 strlen (salt),
105 NULL, 0);
106 GNUNET_CRYPTO_symmetric_encrypt (buf,
107 buf_len,
108 &skey,
109 &iv,
110 &rbuf);
111#endif
112 GNUNET_break (0 == gcry_kdf_derive (rbuf,
113 buf_len,
114 GCRY_KDF_SCRYPT,
115 1 /* subalgo */,
116 salt,
117 strlen (salt),
118 2 /* iterations; keep cost of individual op small */,
119 sizeof(struct GNUNET_HashCode),
120 result));
121} 57}
122 58
123 59