]> git.meshlink.io Git - meshlink/blobdiff - src/openssl/prf.c
Start of "Simple Peer-To-Peer Security" protocol.
[meshlink] / src / openssl / prf.c
index 59e8a3aa845caf136b43cae43ac011dce649f4f6..648a157b4eba96d1aa2796fbf9de0212c181fadd 100644 (file)
@@ -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);
 }