diff --git a/native/native_rust_library/src/lib.rs b/native/native_rust_library/src/lib.rs
--- a/native/native_rust_library/src/lib.rs
+++ b/native/native_rust_library/src/lib.rs
@@ -10,6 +10,10 @@
   tonic::include_proto!("identity");
 }
 
+use blob_client::{
+  complete_upload, initialize_download_state, initialize_upload_state,
+  pull_chunk, start_upload, upload_chunk, DownloadState, UploadState,
+};
 use identity::identity_service_client::IdentityServiceClient;
 use identity_client::{
   get_user_id, login_user_pake, login_user_wallet, register_user,
@@ -41,6 +45,7 @@
   // data structures declared here will be accessible in C++
   // but their fields will not be visible
   extern "Rust" {
+    // Identity Service Client
     type Client;
     fn initialize_client() -> Box<Client>;
     fn get_user_id_blocking(
@@ -77,6 +82,28 @@
       siwe_signature: Vec<u8>,
       user_public_key: String,
     ) -> Result<String>;
+
+    // Blob Service Client
+    type UploadState;
+    type DownloadState;
+
+    fn initialize_upload_state_blocking() -> Result<Box<UploadState>>;
+    fn start_upload_blocking(
+      state: &mut Box<UploadState>,
+      holder: String,
+      hash: String,
+    ) -> Result<()>;
+    fn upload_chunk_blocking(
+      state: &mut Box<UploadState>,
+      chunk: &[u8],
+    ) -> Result<()>;
+    fn complete_upload_blocking(client: Box<UploadState>) -> Result<bool>;
+    fn initialize_download_state_blocking(
+      holder: String,
+    ) -> Result<Box<DownloadState>>;
+    fn pull_chunk_blocking(
+      client: &mut Box<DownloadState>,
+    ) -> Result<BlobChunkResponse>;
   }
 }
 
@@ -166,3 +193,40 @@
     user_public_key,
   ))
 }
+
+pub fn initialize_upload_state_blocking() -> Result<Box<UploadState>, String> {
+  RUNTIME.block_on(initialize_upload_state())
+}
+
+pub fn start_upload_blocking(
+  state: &mut Box<UploadState>,
+  holder: String,
+  hash: String,
+) -> Result<(), String> {
+  RUNTIME.block_on(start_upload(state, holder, hash))
+}
+
+pub fn upload_chunk_blocking(
+  state: &mut Box<UploadState>,
+  chunk: &[u8],
+) -> Result<(), String> {
+  RUNTIME.block_on(upload_chunk(state, chunk))
+}
+
+pub fn complete_upload_blocking(
+  client: Box<UploadState>,
+) -> Result<bool, String> {
+  RUNTIME.block_on(complete_upload(client))
+}
+
+pub fn initialize_download_state_blocking(
+  holder: String,
+) -> Result<Box<DownloadState>, String> {
+  RUNTIME.block_on(initialize_download_state(holder))
+}
+
+pub fn pull_chunk_blocking(
+  client: &mut Box<DownloadState>,
+) -> Result<ffi::BlobChunkResponse, String> {
+  RUNTIME.block_on(pull_chunk(client))
+}