diff --git a/Sources/Cbsspeke/bsspeke.c b/Sources/Cbsspeke/bsspeke.c
index b7fab2c6add2821069362f2e4e80d0ecbfc80f8a..7081124849474f514e7e531ac542bb876a470866 100644
--- a/Sources/Cbsspeke/bsspeke.c
+++ b/Sources/Cbsspeke/bsspeke.c
@@ -421,6 +421,19 @@ void bsspeke_client_generate_hashed_key(
     crypto_blake2b_keyed(k, 32, client->K_password, 32, msg, msg_len);
 }
 
+void bsspeke_client_generate_internal_key(
+    uint8_t k[32],
+    const uint8_t *msg, size_t msg_len,
+    bsspeke_client_ctx *client)
+{
+    crypto_blake2b_ctx hash_ctx;
+    crypto_blake2b_init(&hash_ctx, 32);
+    crypto_blake2b_update(&hash_ctx, client->K_password, 32);
+    crypto_blake2b_update(&hash_ctx, msg, msg_len);
+    crypto_blake2b_update(&hash_ctx, &null_byte, 1);
+    crypto_blake2b_final(&hash_ctx, k);
+}
+
 #ifdef EMSCRIPTEN
 EMSCRIPTEN_KEEPALIVE
 #endif
@@ -456,8 +469,8 @@ int bsspeke_client_generate_keys_from_password(
     const char *p_modifier = "curve_point_p";
     const char *v_modifier = "private_key_v";
 
-    bsspeke_client_generate_hashed_key(client->p, (const uint8_t *)p_modifier, strlen(p_modifier), client);
-    bsspeke_client_generate_hashed_key(client->v, (const uint8_t *)v_modifier, strlen(v_modifier), client);
+    bsspeke_client_generate_internal_key(client->p, (const uint8_t *)p_modifier, strlen(p_modifier), client);
+    bsspeke_client_generate_internal_key(client->v, (const uint8_t *)v_modifier, strlen(v_modifier), client);
     clamp(client->v);
 
     print_point("p", client->p);