v2.0.2-rc (#27)
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				BlockStorage/repertory/pipeline/head Something is wrong with the build of this commit
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	BlockStorage/repertory/pipeline/head Something is wrong with the build of this commit
				
			## v2.0.2-rc ### BREAKING CHANGES * Refactored `config.json` - will need to verify configuration settings prior to mounting ### Issues * \#12 \[Unit Test\] Complete all providers unit tests * \#14 \[Unit Test\] SQLite mini-ORM unit tests and cleanup * \#16 Add support for bucket name in Sia provider * \#17 Update to common c++ build system * A single 64-bit Linux Jenkins server is used to build all Linux and Windows versions * All dependency sources are now included * MSVC is no longer supported * MSYS2 is required for building Windows binaries on Windows * OS X support is temporarily disabled * \#19 \[bug\] Rename file is broken for files that are existing * \#23 \[bug\] Incorrect file size displayed while upload is pending * \#24 RocksDB implementations should be transactional * \#25 Writes should block when maximum cache size is reached * \#26 Complete ring buffer and direct download support ### Changes from v2.0.1-rc * Ability to choose between RocksDB and SQLite databases * Added direct reads and implemented download fallback * Corrected file times on S3 and Sia providers * Corrected handling of `chown()` and `chmod()` * Fixed erroneous download of chunks after resize Reviewed-on: #27
This commit is contained in:
		
							
								
								
									
										117
									
								
								support/src/utils/encryption.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								support/src/utils/encryption.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,117 @@
 | 
			
		||||
/*
 | 
			
		||||
  Copyright <2018-2024> <scott.e.graves@protonmail.com>
 | 
			
		||||
 | 
			
		||||
  Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
  of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
  in the Software without restriction, including without limitation the rights
 | 
			
		||||
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
  copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
  furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
  The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
  copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
  SOFTWARE.
 | 
			
		||||
*/
 | 
			
		||||
#if defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST)
 | 
			
		||||
 | 
			
		||||
#include "utils/encryption.hpp"
 | 
			
		||||
 | 
			
		||||
#include "utils/collection.hpp"
 | 
			
		||||
#include "utils/encrypting_reader.hpp"
 | 
			
		||||
 | 
			
		||||
namespace repertory::utils::encryption {
 | 
			
		||||
auto decrypt_file_path(std::string_view encryption_token,
 | 
			
		||||
                       std::string &file_path) -> bool {
 | 
			
		||||
  std::string decrypted_file_path{};
 | 
			
		||||
  for (const auto &part : std::filesystem::path(file_path)) {
 | 
			
		||||
    auto file_name = part.string();
 | 
			
		||||
    if (file_name == "/") {
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto res = decrypt_file_name(encryption_token, file_name);
 | 
			
		||||
    if (not res) {
 | 
			
		||||
      return res;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    decrypted_file_path += '/' + file_name;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  file_path = decrypted_file_path;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
auto decrypt_file_name(std::string_view encryption_token,
 | 
			
		||||
                       std::string &file_name) -> bool {
 | 
			
		||||
  data_buffer buffer;
 | 
			
		||||
  if (not utils::collection::from_hex_string(file_name, buffer)) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  file_name.clear();
 | 
			
		||||
  if (not utils::encryption::decrypt_data(encryption_token, buffer,
 | 
			
		||||
                                          file_name)) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(PROJECT_ENABLE_CURL)
 | 
			
		||||
auto read_encrypted_range(const http_range &range,
 | 
			
		||||
                          const utils::encryption::hash_256_t &key,
 | 
			
		||||
                          reader_func_t reader_func, std::uint64_t total_size,
 | 
			
		||||
                          data_buffer &data) -> bool {
 | 
			
		||||
  const auto encrypted_chunk_size =
 | 
			
		||||
      utils::encryption::encrypting_reader::get_encrypted_chunk_size();
 | 
			
		||||
  const auto data_chunk_size =
 | 
			
		||||
      utils::encryption::encrypting_reader::get_data_chunk_size();
 | 
			
		||||
 | 
			
		||||
  const auto start_chunk =
 | 
			
		||||
      static_cast<std::size_t>(range.begin / data_chunk_size);
 | 
			
		||||
  const auto end_chunk = static_cast<std::size_t>(range.end / data_chunk_size);
 | 
			
		||||
  auto remain = range.end - range.begin + 1U;
 | 
			
		||||
  auto source_offset = static_cast<std::size_t>(range.begin % data_chunk_size);
 | 
			
		||||
 | 
			
		||||
  for (std::size_t chunk = start_chunk; chunk <= end_chunk; chunk++) {
 | 
			
		||||
    data_buffer cypher;
 | 
			
		||||
    const auto start_offset = chunk * encrypted_chunk_size;
 | 
			
		||||
    const auto end_offset = std::min(
 | 
			
		||||
        start_offset + (total_size - (chunk * data_chunk_size)) +
 | 
			
		||||
            encryption_header_size - 1U,
 | 
			
		||||
        static_cast<std::uint64_t>(start_offset + encrypted_chunk_size - 1U));
 | 
			
		||||
 | 
			
		||||
    if (not reader_func(cypher, start_offset, end_offset)) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data_buffer source_buffer;
 | 
			
		||||
    if (not utils::encryption::decrypt_data(key, cypher, source_buffer)) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    cypher.clear();
 | 
			
		||||
 | 
			
		||||
    const auto data_size = static_cast<std::size_t>(std::min(
 | 
			
		||||
        remain, static_cast<std::uint64_t>(data_chunk_size - source_offset)));
 | 
			
		||||
    std::copy(std::next(source_buffer.begin(),
 | 
			
		||||
                        static_cast<std::int64_t>(source_offset)),
 | 
			
		||||
              std::next(source_buffer.begin(),
 | 
			
		||||
                        static_cast<std::int64_t>(source_offset + data_size)),
 | 
			
		||||
              std::back_inserter(data));
 | 
			
		||||
    remain -= data_size;
 | 
			
		||||
    source_offset = 0U;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
#endif // defined(PROJECT_ENABLE_CURL)
 | 
			
		||||
} // namespace repertory::utils::encryption
 | 
			
		||||
 | 
			
		||||
#endif // defined(PROJECT_ENABLE_LIBSODIUM) && defined (PROJECT_ENABLE_BOOST)
 | 
			
		||||
		Reference in New Issue
	
	Block a user