diff --git a/native/cpp/CommonCpp/grpc/grpc_client/src/lib.rs b/native/cpp/CommonCpp/grpc/grpc_client/src/lib.rs
--- a/native/cpp/CommonCpp/grpc/grpc_client/src/lib.rs
+++ b/native/cpp/CommonCpp/grpc/grpc_client/src/lib.rs
@@ -87,6 +87,7 @@
       user_id: String,
       device_id: String,
       password: String,
+      user_public_key: String,
     ) -> Result<String>;
     fn login_user_wallet_blocking(
       client: Box<Client>,
@@ -255,6 +256,7 @@
   user_id: String,
   device_id: String,
   password: String,
+  user_public_key: String,
 ) -> Result<String, Status> {
   // Create a LoginRequest channel and use ReceiverStream to turn the
   // MPSC receiver into a Stream for outbound messages
@@ -286,6 +288,7 @@
               error!("Could not serialize credential request: {}", e);
               Status::failed_precondition("PAKE failure")
             })?,
+          user_public_key,
         },
       )),
     })),
@@ -318,8 +321,15 @@
   user_id: String,
   device_id: String,
   password: String,
+  user_public_key: String,
 ) -> Result<String, Status> {
-  RUNTIME.block_on(login_user_pake(client, user_id, device_id, password))
+  RUNTIME.block_on(login_user_pake(
+    client,
+    user_id,
+    device_id,
+    password,
+    user_public_key,
+  ))
 }
 
 async fn login_user_wallet(
diff --git a/shared/protos/identity.proto b/shared/protos/identity.proto
--- a/shared/protos/identity.proto
+++ b/shared/protos/identity.proto
@@ -32,6 +32,7 @@
   string deviceID = 2;
   // Message sent to initiate PAKE login (step 1)
   bytes pakeCredentialRequest = 3;
+  string userPublicKey = 4;
 }
 
 message PakeLoginRequest {