X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=sidebyside;f=src%2Fopenssl%2Fprf.c;h=648a157b4eba96d1aa2796fbf9de0212c181fadd;hb=1f00111e94b2f9a4beb9608b1e03a5e73c9c5d21;hp=59e8a3aa845caf136b43cae43ac011dce649f4f6;hpb=82f00ea07bffc10985ccb1a15723e6daa0ab4969;p=meshlink diff --git a/src/openssl/prf.c b/src/openssl/prf.c index 59e8a3aa..648a157b 100644 --- a/src/openssl/prf.c +++ b/src/openssl/prf.c @@ -26,7 +26,7 @@ We use SHA512 and Whirlpool instead of MD5 and SHA1. */ -static bool prf_xor(int nid, char *secret, size_t secretlen, char *seed, size_t seedlen, char *out, ssize_t outlen) { +static bool prf_xor(int nid, const char *secret, size_t secretlen, char *seed, size_t seedlen, char *out, ssize_t outlen) { digest_t digest; if(!digest_open_by_nid(&digest, nid, -1)) @@ -65,12 +65,12 @@ static bool prf_xor(int nid, char *secret, size_t secretlen, char *seed, size_t return true; } -bool prf(char *secret, size_t secretlen, char *seed, size_t seedlen, char *out, size_t outlen) { +bool prf(const char *secret, size_t secretlen, char *seed, size_t seedlen, char *out, size_t outlen) { /* Split secret in half, generate outlen bits with two different hash algorithms, and XOR the results. */ memset(out, 0, outlen); - return prf_xor(NID_sha512, secret, secretlen / 2, seed, seedlen, out, outlen) - && prf_xor(NID_whirlpool, secret, secretlen / 2, seed, seedlen, out, outlen); + return prf_xor(NID_sha512, secret, (secretlen + 1) / 2, seed, seedlen, out, outlen) + && prf_xor(NID_whirlpool, secret + secretlen / 2, (secretlen + 1) / 2, seed, seedlen, out, outlen); }