aboutsummaryrefslogtreecommitdiff
path: root/src/util/crypto_hkdf.c
diff options
context:
space:
mode:
authorNils Durner <durner@gnunet.org>2010-09-28 19:12:19 +0000
committerNils Durner <durner@gnunet.org>2010-09-28 19:12:19 +0000
commitbb6aca2967f876d0a0459fdce1eed26a3926f397 (patch)
treef4f1e0d8e9d3c09c6b3da3afe1399bbff1175958 /src/util/crypto_hkdf.c
parent2298d22222e000529c668e16d239ea24076b251a (diff)
downloadgnunet-bb6aca2967f876d0a0459fdce1eed26a3926f397.tar.gz
gnunet-bb6aca2967f876d0a0459fdce1eed26a3926f397.zip
fixes
Diffstat (limited to 'src/util/crypto_hkdf.c')
-rw-r--r--src/util/crypto_hkdf.c68
1 files changed, 51 insertions, 17 deletions
diff --git a/src/util/crypto_hkdf.c b/src/util/crypto_hkdf.c
index 4415b7551..00750554f 100644
--- a/src/util/crypto_hkdf.c
+++ b/src/util/crypto_hkdf.c
@@ -101,14 +101,13 @@ static void dump(char *src, void *p, unsigned int l)
101 * @param xts_len length of xts 101 * @param xts_len length of xts
102 * @param skm source key material 102 * @param skm source key material
103 * @param skm_len length of skm 103 * @param skm_len length of skm
104 * @param ctx context info 104 * @param argp va_list of void * & size_t pairs for context chunks
105 * @param ctx_len length of ctx
106 * @return GNUNET_YES on success 105 * @return GNUNET_YES on success
107 */ 106 */
108int 107int
109GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len, 108GNUNET_CRYPTO_hkdf_v (void *result, const unsigned long long out_len,
110 int xtr_algo, int prf_algo, const void *xts, const size_t xts_len, 109 int xtr_algo, int prf_algo, const void *xts, const size_t xts_len,
111 const void *skm, const size_t skm_len, ...) 110 const void *skm, const size_t skm_len, va_list argp)
112{ 111{
113 void *prk, *hc, *plain; 112 void *prk, *hc, *plain;
114 unsigned long long plain_len; 113 unsigned long long plain_len;
@@ -117,7 +116,7 @@ GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len,
117 int ret; 116 int ret;
118 gcry_md_hd_t xtr, prf; 117 gcry_md_hd_t xtr, prf;
119 size_t ctx_len; 118 size_t ctx_len;
120 va_list argp; 119 va_list args;
121 120
122 prk = plain = NULL; 121 prk = plain = NULL;
123 xtr_len = gcry_md_get_algo_dlen (xtr_algo); 122 xtr_len = gcry_md_get_algo_dlen (xtr_algo);
@@ -128,10 +127,10 @@ GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len,
128 if (out_len > (2 ^ 32 * k) || !xtr_algo || !prf_algo) 127 if (out_len > (2 ^ 32 * k) || !xtr_algo || !prf_algo)
129 return GNUNET_SYSERR; 128 return GNUNET_SYSERR;
130 129
131 va_start(argp, skm_len); 130 va_copy (args, argp);
132 for (ctx_len = 0; va_arg (argp, void *);) 131 for (ctx_len = 0; va_arg (args, void *);)
133 ctx_len += va_arg (argp, size_t); 132 ctx_len += va_arg (args, size_t);
134 va_end(argp); 133 va_end(args);
135 134
136 prk = GNUNET_malloc (xtr_len); 135 prk = GNUNET_malloc (xtr_len);
137 136
@@ -155,16 +154,16 @@ GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len,
155 void *ctx, *dst; 154 void *ctx, *dst;
156 155
157 dst = plain; 156 dst = plain;
158 va_start (argp, skm_len); 157 va_copy (args, argp);
159 while ((ctx = va_arg (argp, void *))) 158 while ((ctx = va_arg (args, void *)))
160 { 159 {
161 size_t len; 160 size_t len;
162 161
163 len = va_arg (argp, size_t); 162 len = va_arg (args, size_t);
164 memcpy (dst, ctx, len); 163 memcpy (dst, ctx, len);
165 dst += len; 164 dst += len;
166 } 165 }
167 va_end (argp); 166 va_end (args);
168 167
169 memset (dst, 1, 1); 168 memset (dst, 1, 1);
170 gcry_md_reset (prf); 169 gcry_md_reset (prf);
@@ -183,10 +182,16 @@ GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len,
183 void *ctx, *dst; 182 void *ctx, *dst;
184 183
185 dst = plain + k; 184 dst = plain + k;
186 va_start(argp, skm_len); 185 va_copy (args, argp);
187 while ((ctx = va_arg (argp, void *))) 186 while ((ctx = va_arg (args, void *)))
188 memcpy (dst, ctx, va_arg (argp, size_t)); 187 {
189 va_end (argp); 188 size_t len;
189
190 len = va_arg (args, size_t);
191 memcpy (dst, ctx, len);
192 dst += len;
193 }
194 va_end (args);
190 } 195 }
191 196
192 /* K(i+1) */ 197 /* K(i+1) */
@@ -238,5 +243,34 @@ hkdf_ok:
238 return ret; 243 return ret;
239} 244}
240 245
246/**
247 * @brief Derive key
248 * @param result buffer for the derived key, allocated by caller
249 * @param out_len desired length of the derived key
250 * @param xtr_algo hash algorithm for the extraction phase, GCRY_MD_...
251 * @param prf_algo hash algorithm for the expansion phase, GCRY_MD_...
252 * @param xts salt
253 * @param xts_len length of xts
254 * @param skm source key material
255 * @param skm_len length of skm
256 * @param ctx context info
257 * @param ctx_len length of ctx
258 * @return GNUNET_YES on success
259 */
260int
261GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len,
262 int xtr_algo, int prf_algo, const void *xts, const size_t xts_len,
263 const void *skm, const size_t skm_len, ...)
264{
265 va_list argp;
266 int ret;
267
268 va_start(argp, skm_len);
269 ret = GNUNET_CRYPTO_hkdf_v (result, out_len, xtr_algo, prf_algo, xts,
270 xts_len, skm, skm_len, argp);
271 va_end(argp);
272
273 return ret;
274}
241 275
242/* end of crypto_hkdf.c */ 276/* end of crypto_hkdf.c */