pub mod alphabets;
pub mod argon2;
pub mod basic_crypto_functions;
mod byte_array;
pub mod direct_trust;
mod domain;
pub mod elgamal;
mod hashing;
mod integer;
pub mod mix_net;
mod number_theory;
pub mod random;
mod shared_error;
pub mod signature;
pub mod string;
pub mod symmetric_authenticated_encryption;
pub mod zero_knowledge_proofs;
pub use byte_array::{ByteArray, ByteArrayError, DecodeTrait, EncodeTrait};
pub use domain::*;
pub use hashing::{HashError, HashableMessage, RecursiveHashTrait};
pub use integer::{
ConstantsTrait, Hexa, IntegerOperationError, ModExponentiateError, OperationsTrait,
ToByteArryTrait, prepare_fixed_based_optimization,
};
pub use number_theory::{
IsPrimeTrait, JacobiError, JacobiTrait, NotPrimeError, QuadraticResidueTrait, SmallPrimeError,
SmallPrimeTrait,
};
pub use rug::Integer;
pub use shared_error::{NotOddError, NotPositiveError};
pub const GROUP_PARAMETER_P_LENGTH: usize = 3072;
pub const GROUP_PARAMETER_Q_LENGTH: usize = 3071;
pub const SECURITY_STRENGTH: usize = 128;
#[cfg(test)]
mod test_json_data {
use crate::{
ByteArray, DecodeTrait, Integer,
elgamal::{Ciphertext, EncryptionParameters},
};
use serde_json::Value;
use std::path::Path;
const TEST_DATA_DIR: &str = "test_data";
pub fn get_test_cases_from_json_file(subdir_name: &str, filename: &str) -> Vec<Value> {
let test_file = Path::new("./")
.join(TEST_DATA_DIR)
.join(subdir_name)
.join(filename);
let json = std::fs::read_to_string(test_file).unwrap();
serde_json::from_str(&json).unwrap()
}
pub fn json_array_value_to_array_string(array: &Value) -> Vec<String> {
array
.as_array()
.unwrap()
.iter()
.map(|v| v.as_str().unwrap().to_string())
.collect()
}
pub fn json_array_64_value_to_array_integer(array: &Value) -> Vec<Integer> {
Integer::base_64_decode_vector(
&json_array_value_to_array_string(array)
.iter()
.map(|s| s.as_str())
.collect::<Vec<_>>(),
)
.unwrap()
}
pub fn json_64_value_to_integer(value: &Value) -> Integer {
Integer::base64_decode(value.as_str().unwrap()).unwrap()
}
pub fn json_64_value_to_byte_array(value: &Value) -> ByteArray {
ByteArray::base64_decode(value.as_str().unwrap()).unwrap()
}
pub struct EncryptionParametersValues(pub Integer, pub Integer, pub Integer);
impl From<&EncryptionParametersValues> for EncryptionParameters {
fn from(value: &EncryptionParametersValues) -> Self {
EncryptionParameters::from((&value.0, &value.1, &value.2))
}
}
pub fn json_value_to_encryption_parameters(values: &Value) -> EncryptionParameters {
EncryptionParameters::from(&json_value_to_encryption_parameters_values(values))
}
pub fn json_value_to_encryption_parameters_values(
values: &Value,
) -> EncryptionParametersValues {
EncryptionParametersValues(
json_64_value_to_integer(&values["p"]),
json_64_value_to_integer(&values["q"]),
json_64_value_to_integer(&values["g"]),
)
}
pub struct CiphertextValues {
pub gamma: Integer,
pub phis: Vec<Integer>,
}
impl From<&CiphertextValues> for Ciphertext {
fn from(value: &CiphertextValues) -> Self {
Ciphertext {
gamma: value.gamma.clone(),
phis: value.phis.clone(),
}
}
}
pub fn json_values_to_ciphertext_values(values: &Value) -> CiphertextValues {
CiphertextValues {
gamma: json_64_value_to_integer(&values["gamma"]),
phis: json_array_64_value_to_array_integer(&values["phis"]),
}
}
pub fn json_values_to_ciphertext(values: &Value) -> Ciphertext {
Ciphertext::from(&json_values_to_ciphertext_values(values))
}
}