aboutsummaryrefslogtreecommitdiff
path: root/src
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
parent2298d22222e000529c668e16d239ea24076b251a (diff)
downloadgnunet-bb6aca2967f876d0a0459fdce1eed26a3926f397.tar.gz
gnunet-bb6aca2967f876d0a0459fdce1eed26a3926f397.zip
fixes
Diffstat (limited to 'src')
-rw-r--r--src/util/crypto_hkdf.c68
-rw-r--r--src/util/test_crypto_hkdf.c4
2 files changed, 53 insertions, 19 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 */
diff --git a/src/util/test_crypto_hkdf.c b/src/util/test_crypto_hkdf.c
index 1b4d368aa..1cbe41b4a 100644
--- a/src/util/test_crypto_hkdf.c
+++ b/src/util/test_crypto_hkdf.c
@@ -214,11 +214,11 @@ tc7 ()
214 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 214 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
215 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 215 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
216 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf }; 216 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf };
217 unsigned char info1[80] = { 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 217 unsigned char info1[34] = { 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
218 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 218 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3,
219 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 219 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
220 0xd0, 0xd1 }; 220 0xd0, 0xd1 };
221 unsigned char info2[80] = { 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 221 unsigned char info2[46] = { 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
222 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 222 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
223 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 223 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1,
224 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 224 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd,