diff --git a/ChangeLog b/ChangeLog
index 776597a639ef93319509a1c0040b73dae7e707fe..145376c051508bc96d8037a1200b5076c86879f1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-09-06  Niels Möller  <nisse@lysator.liu.se>
+
+	* hkdf.c (hkdf_expand): Eliminate a (signed) ssize_t variable, use
+	break rather than return at loop termination.
+
 2017-09-06  Niels Möller  <nisse@lysator.liu.se>
 
 	HKDF implementation, contributed by Nikos Mavrogiannopoulos.
diff --git a/hkdf.c b/hkdf.c
index 73b106655de7374dec4f9ad5265785802b9c0d60..c55c42fd4a29d2c3b6525af30972d767611ca2e7 100644
--- a/hkdf.c
+++ b/hkdf.c
@@ -63,23 +63,20 @@ hkdf_expand(void *mac_ctx,
 	    size_t length, uint8_t *dst)
 {
   uint8_t i = 1;
-  ssize_t left = length;
 
-  if (!left)
+  if (!length)
     return;
 
-  for (;; dst += digest_size, left -= digest_size, i++) {
-    update(mac_ctx, info_size, info);
-    update(mac_ctx, 1, &i);
-    if (left <= digest_size) {
-      if (left > 0)
-	digest(mac_ctx, left, dst);
-      return;
-    }
+  for (;; dst += digest_size, length -= digest_size, i++)
+    {
+      update(mac_ctx, info_size, info);
+      update(mac_ctx, 1, &i);
+      if (length <= digest_size)
+	break;
 
-    digest(mac_ctx, digest_size, dst);
-    update(mac_ctx, digest_size, dst);
-  }
+      digest(mac_ctx, digest_size, dst);
+      update(mac_ctx, digest_size, dst);
+    }
 
-  return;
+  digest(mac_ctx, length, dst);
 }