sentc-crypto 0.8.0

The main implementation of the sentc sdk.
Documentation
use alloc::string::String;
use alloc::vec::Vec;

use sentc_crypto_common::file::BelongsToType;

use crate::crypto::{prepare_sign_key, prepare_verify_key};
use crate::file::{
	decrypt_file_part_internally,
	decrypt_file_part_start_internally,
	done_register_file_internally,
	encrypt_file_part_internally,
	encrypt_file_part_start_internally,
	prepare_file_name_update_internally,
	prepare_register_file_internally,
};
use crate::util::{export_core_sym_key_to_string, import_core_sym_key};
use crate::SdkError;

pub fn prepare_register_file(
	master_key_id: String,
	key: &str,
	encrypted_content_key: String,
	belongs_to_id: Option<String>,
	belongs_to_type: &str,
	file_name: Option<String>,
) -> Result<(String, Option<String>), String>
{
	let belongs_to_type: BelongsToType = serde_json::from_str(belongs_to_type).map_err(SdkError::JsonParseFailed)?;

	let (server_input, encrypted_file_name) = prepare_register_file_internally(
		master_key_id,
		&key.parse()?,
		encrypted_content_key,
		belongs_to_id,
		belongs_to_type,
		file_name,
	)?;

	Ok((server_input, encrypted_file_name))
}

pub fn done_register_file(server_output: &str) -> Result<(String, String), String>
{
	Ok(done_register_file_internally(server_output)?)
}

pub fn prepare_file_name_update(key: &str, file_name: Option<String>) -> Result<String, String>
{
	Ok(prepare_file_name_update_internally(&key.parse()?, file_name)?)
}

pub fn encrypt_file_part_start(key: &str, part: &[u8], sign_key: Option<&str>) -> Result<(Vec<u8>, String), String>
{
	let sign_key = prepare_sign_key(sign_key)?;

	let key = key.parse()?;

	let (encrypted_part, file_key) = match sign_key {
		None => encrypt_file_part_start_internally(&key, part, None)?,
		Some(k) => encrypt_file_part_start_internally(&key, part, Some(&k))?,
	};

	let exported_file_key = export_core_sym_key_to_string(file_key)?;

	Ok((encrypted_part, exported_file_key))
}

pub fn encrypt_file_part(pre_content_key: &str, part: &[u8], sign_key: Option<&str>) -> Result<(Vec<u8>, String), String>
{
	let sign_key = prepare_sign_key(sign_key)?;

	let key = import_core_sym_key(pre_content_key)?;

	let (encrypted_part, file_key) = match sign_key {
		None => encrypt_file_part_internally(&key, part, None)?,
		Some(k) => encrypt_file_part_internally(&key, part, Some(&k))?,
	};

	let exported_file_key = export_core_sym_key_to_string(file_key)?;

	Ok((encrypted_part, exported_file_key))
}

pub fn decrypt_file_part_start(key: &str, part: &[u8], verify_key: Option<&str>) -> Result<(Vec<u8>, String), String>
{
	let verify_key = prepare_verify_key(verify_key)?;
	let key = key.parse()?;

	let (decrypted, next_key) = match verify_key {
		None => decrypt_file_part_start_internally(&key, part, None)?,
		Some(k) => decrypt_file_part_start_internally(&key, part, Some(&k))?,
	};

	let exported_file_key = export_core_sym_key_to_string(next_key)?;

	Ok((decrypted, exported_file_key))
}

pub fn decrypt_file_part(pre_content_key: &str, part: &[u8], verify_key: Option<&str>) -> Result<(Vec<u8>, String), String>
{
	let verify_key = prepare_verify_key(verify_key)?;

	let key = import_core_sym_key(pre_content_key)?;

	let (decrypted, next_key) = match verify_key {
		None => decrypt_file_part_internally(&key, part, None)?,
		Some(k) => decrypt_file_part_internally(&key, part, Some(&k))?,
	};

	let exported_file_key = export_core_sym_key_to_string(next_key)?;

	Ok((decrypted, exported_file_key))
}