X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fopenssl%2Fprf.c;h=ddad522f71814db7045efddf32808fc6f749cb0b;hb=cfc9fee931c70554353ce6c4acc3407baac08745;hp=62770859593559859ae934b61679b47c89e61e38;hpb=2c6b2d70e6640f39563ad7bb0aa0ba87f883848c;p=tinc diff --git a/src/openssl/prf.c b/src/openssl/prf.c index 62770859..ddad522f 100644 --- a/src/openssl/prf.c +++ b/src/openssl/prf.c @@ -30,39 +30,40 @@ */ static bool prf_xor(int nid, const uint8_t *secret, size_t secretlen, uint8_t *seed, size_t seedlen, uint8_t *out, size_t outlen) { - digest_t *digest = digest_open_by_nid(nid, DIGEST_ALGO_SIZE); + digest_t digest = {0}; - if(!digest) { + if(!digest_open_by_nid(&digest, nid, DIGEST_ALGO_SIZE)) { + digest_close(&digest); return false; } - if(!digest_set_key(digest, secret, secretlen)) { - digest_close(digest); + if(!digest_set_key(&digest, secret, secretlen)) { + digest_close(&digest); return false; } - size_t len = digest_length(digest); + size_t len = digest_length(&digest); /* Data is what the "inner" HMAC function processes. It consists of the previous HMAC result plus the seed. */ - char data[len + seedlen]; + char *data = alloca(len + seedlen); memset(data, 0, len); memcpy(data + len, seed, seedlen); - uint8_t hash[len]; + uint8_t *hash = alloca(len); while(outlen > 0) { /* Inner HMAC */ - if(!digest_create(digest, data, len + seedlen, data)) { - digest_close(digest); + if(!digest_create(&digest, data, len + seedlen, data)) { + digest_close(&digest); return false; } /* Outer HMAC */ - if(!digest_create(digest, data, len + seedlen, hash)) { - digest_close(digest); + if(!digest_create(&digest, data, len + seedlen, hash)) { + digest_close(&digest); return false; } @@ -76,7 +77,7 @@ static bool prf_xor(int nid, const uint8_t *secret, size_t secretlen, uint8_t *s outlen -= i; } - digest_close(digest); + digest_close(&digest); return true; }