]> git.meshlink.io Git - meshlink/blobdiff - src/prf.c
Avoid allocating packet buffers unnecessarily.
[meshlink] / src / prf.c
index 526c8706e9fe8ee403fd8c6bbd32e8e78fa2b539..3e1b0b54e3162bf27df3eec9d965b1e515d89b79 100644 (file)
--- a/src/prf.c
+++ b/src/prf.c
 #include "ed25519/sha512.h"
 
 static void memxor(char *buf, char c, size_t len) {
-       for(size_t i = 0; i < len; i++)
+       assert(buf);
+       assert(len);
+
+       for(size_t i = 0; i < len; i++) {
                buf[i] ^= c;
+       }
 }
 
-static const size_t mdlen = 64;
+#define mdlen 64
 
 // TODO: separate key setup from hmac_sha512
 
 static bool hmac_sha512(const char *key, size_t keylen, const char *msg, size_t msglen, char *out) {
+       assert(msg);
+       assert(msglen);
+
        char tmp[2 * mdlen];
        sha512_context md;
 
@@ -39,29 +46,37 @@ static bool hmac_sha512(const char *key, size_t keylen, const char *msg, size_t
                memcpy(tmp, key, keylen);
                memset(tmp + keylen, 0, mdlen - keylen);
        } else {
-               if(sha512(key, keylen, tmp) != 0)
+               if(sha512(key, keylen, tmp) != 0) {
                        return false;
+               }
        }
 
-       if(sha512_init(&md) != 0)
+       if(sha512_init(&md) != 0) {
                return false;
+       }
 
        // ipad
        memxor(tmp, 0x36, mdlen);
-       if(sha512_update(&md, tmp, mdlen) != 0)
+
+       if(sha512_update(&md, tmp, mdlen) != 0) {
                return false;
+       }
 
        // message
-       if(sha512_update(&md, msg, msglen) != 0)
+       if(sha512_update(&md, msg, msglen) != 0) {
                return false;
+       }
 
-       if(sha512_final(&md, tmp + mdlen) != 0)
+       if(sha512_final(&md, tmp + mdlen) != 0) {
                return false;
+       }
 
        // opad
        memxor(tmp, 0x36 ^ 0x5c, mdlen);
-       if(sha512(tmp, sizeof(tmp), out) != 0)
+
+       if(sha512(tmp, sizeof(tmp), out) != 0) {
                return false;
+       }
 
        return true;
 }
@@ -71,6 +86,13 @@ static bool hmac_sha512(const char *key, size_t keylen, const char *msg, size_t
  */
 
 bool prf(const char *secret, size_t secretlen, char *seed, size_t seedlen, char *out, size_t outlen) {
+       assert(secret);
+       assert(secretlen);
+       assert(seed);
+       assert(seedlen);
+       assert(out);
+       assert(outlen);
+
        /* Data is what the "inner" HMAC function processes.
           It consists of the previous HMAC result plus the seed.
         */
@@ -83,18 +105,23 @@ bool prf(const char *secret, size_t secretlen, char *seed, size_t seedlen, char
 
        while(outlen > 0) {
                /* Inner HMAC */
-               if(!hmac_sha512(data, sizeof(data), secret, secretlen, data))
+               if(!hmac_sha512(data, sizeof(data), secret, secretlen, data)) {
                        return false;
+               }
 
                /* Outer HMAC */
                if(outlen >= mdlen) {
-                       if(!hmac_sha512(data, sizeof(data), secret, secretlen, out))
+                       if(!hmac_sha512(data, sizeof(data), secret, secretlen, out)) {
                                return false;
+                       }
+
                        out += mdlen;
                        outlen -= mdlen;
                } else {
-                       if(!hmac_sha512(data, sizeof(data), secret, secretlen, hash))
+                       if(!hmac_sha512(data, sizeof(data), secret, secretlen, hash)) {
                                return false;
+                       }
+
                        memcpy(out, hash, outlen);
                        out += outlen;
                        outlen = 0;