Initial partial encryption attempt
diff --git a/bintool/bintool.cpp b/bintool/bintool.cpp
index bba2dfc..48f7fe1 100644
--- a/bintool/bintool.cpp
+++ b/bintool/bintool.cpp
@@ -1009,6 +1009,19 @@
 }
 
 
+void encrypt_vector(std::vector<uint8_t> &enc_data, const aes_key_t aes_key, std::vector<uint8_t> &iv_data) {
+    iv_t iv;
+    for(auto &e : iv.bytes) {
+        e = rand();
+    }
+
+    iv_data.resize(sizeof(iv.bytes));
+    memcpy(iv_data.data(), iv.bytes, sizeof(iv.bytes));
+
+    aes256_buffer(enc_data.data(), enc_data.size(), enc_data.data(), &aes_key, &iv);
+}
+
+
 void encrypt_guts(elf_file *elf, block *new_block, const aes_key_t aes_key, model_t model, std::vector<uint8_t> &iv_data, std::vector<uint8_t> &enc_data) {
     std::vector<uint8_t> to_enc = get_lm_hash_data(elf, new_block, model);
 
diff --git a/bintool/bintool.h b/bintool/bintool.h
index f8c60ff..79aef87 100644
--- a/bintool/bintool.h
+++ b/bintool/bintool.h
@@ -30,6 +30,7 @@
     int hash_andor_sign(elf_file *elf, block *new_block, const public_t public_key, const private_t private_key, model_t model, bool hash_value, bool sign, bool clear_sram = false, bool pin_xip_sram = false);
     void encrypt_guts(elf_file *elf, block *new_block, const aes_key_t aes_key, model_t model, std::vector<uint8_t> &iv_data, std::vector<uint8_t> &enc_data);
     int encrypt(elf_file *elf, block *new_block, const aes_key_t aes_key, const public_t public_key, const private_t private_key, model_t model, std::vector<uint8_t> iv_salt, bool hash_value, bool sign);
+    void encrypt_vector(std::vector<uint8_t> &enc_data, const aes_key_t aes_key, std::vector<uint8_t> &iv_data);
 #endif
 
 // Bins
diff --git a/main.cpp b/main.cpp
index b11973a..043d1ef 100644
--- a/main.cpp
+++ b/main.cpp
@@ -606,6 +606,8 @@
 
     struct {
         bool embed = false;
+        bool partial = false;
+        string partial_name = ".enc_data";
         bool otp_key_page_set = false;
         bool fast_rosc = false;
         bool use_mbedtls = false;
@@ -973,6 +975,11 @@
             option("--quiet").set(settings.quiet) % "Don't print any output" +
             option("--verbose").set(settings.verbose) % "Print verbose output" +
             option("--embed").set(settings.encrypt.embed) % "Embed bootloader in output file" +
+            option("--partial").set(settings.encrypt.partial) % "Only encrypt the .encrypted ELF segment" +
+            (
+                option("--partial-name") &
+                    value("section").set(settings.encrypt.partial_name)
+            ).min(0) % "Set section name to encrypt when using --partial (default .enc_data)" +
             option("--fast-rosc").set(settings.encrypt.fast_rosc) % "Use ~180MHz ROSC configuration for embedded bootloader" +
             option("--use-mbedtls").set(settings.encrypt.use_mbedtls) % "Use MbedTLS implementation of embedded bootloader (faster but less secure)" +
             (
@@ -5372,12 +5379,19 @@
     std::vector<uint8_t> iv_salt;
     iv_salt.resize(16);
 
+    if (settings.encrypt.embed && settings.encrypt.partial) {
+        fail(ERROR_ARGS, "Only one of --embed or --partial is supported");
+    }
+
     if (get_file_type() == filetype::elf) {
         isElf = true;
     } else if (get_file_type() == filetype::bin) {
         if (settings.encrypt.embed) {
             fail(ERROR_ARGS, "Can only embed decrypting bootloader into ELFs");
         }
+        if (settings.encrypt.partial) {
+            fail(ERROR_ARGS, "Can only partially encrypt ELFs");
+        }
         isBin = true;
     } else {
         fail(ERROR_ARGS, "Can only sign ELFs or BINs");
@@ -5547,10 +5561,36 @@
         block new_block = place_new_block(elf, first_block, model);
         elf->editable = true;
 
-        // Delete any non-generic load_map entries, as they will be invalid after encryption
-        remove_non_generic_load_map_entries(&new_block, model);
+        if (!settings.encrypt.partial) {
+            // Delete any non-generic load_map entries, as they will be invalid after encryption
+            remove_non_generic_load_map_entries(&new_block, model);
+        }
 
-        if (settings.encrypt.embed) {
+        if (settings.encrypt.partial) {
+            auto enc_section = elf->get_section(settings.encrypt.partial_name);
+            assert(enc_section);
+
+            std::vector<uint8_t> iv_data;
+            std::vector<uint8_t> enc_data = elf->content(*enc_section);
+
+            if (enc_data.size() % 16 != 0) {
+                fail(ERROR_INCOMPATIBLE,
+                    "The section for partial encryption must have a size that is a multiple of 16, but %s has size %d",
+                    settings.encrypt.partial_name.c_str(), enc_data.size()
+                );
+            }
+
+            encrypt_vector(enc_data, aes_key, iv_data);
+
+            elf->content(*enc_section, enc_data);
+
+            // Sign the final thing
+            sign_guts_elf(elf, private_key, public_key, model);
+
+            auto out = get_file_idx(ios::out|ios::binary, 1);
+            elf->write(out);
+            out->close();
+        } else if (settings.encrypt.embed) {
             // Detect generic load maps from the encrypted binary, and populate options to propogate them
             std::shared_ptr<load_map_item> load_map = new_block.get_item<load_map_item>();
             if (load_map != nullptr) {