cplex module integration

This commit is contained in:
Christoph J. Scherr 2023-05-17 11:13:11 +02:00
parent 3f50c42a6e
commit 8b6874e166
Signed by: PlexSheep
GPG Key ID: 25B4ACF7D88186CC
5 changed files with 44 additions and 167 deletions

View File

@ -1,18 +1,29 @@
/// command line options
///
/// this module contains structs and enums that are used to parse command line arguments.
///
/// Author: Christoph J. Scherr <software@cscherr.de>
/// License: MIT
/// Source: <https://git.cscherr.de/PlexSheep/plexcryptool/>
///
use clap::{Args, Parser, Subcommand};
use clap_num::maybe_hex;
/// This is just structures for parsing Cli args /// This is just structures for parsing Cli args
#[derive(Parser, Debug, Clone)] #[derive(Parser, Debug, Clone)]
#[clap(name="plexcryptool", author="Christoph J. Scherr", version, about="Various tools for use with math and cryptology, includes executable and a library.")] #[clap(name="plexcryptool", author="Christoph J. Scherr", version, about="Various tools for use with math and cryptology, includes executable and a library.")]
pub struct Cli { pub struct Cli {
/// Which submodule to use /// Which submodule to use
#[command(subcommand)] #[command(subcommand)]
command: Commands, pub command: Commands,
/// Machine output /// Machine output
#[arg(short, long, default_value_t = false, global = true)] #[arg(short, long, default_value_t = false, global = true)]
machine: bool, pub machine: bool,
/// Verbose output /// Verbose output
#[arg(short, long, default_value_t = false, global = true)] #[arg(short, long, default_value_t = false, global = true)]
verbose: bool, pub verbose: bool,
} }
#[derive(Subcommand, Debug, Clone)] #[derive(Subcommand, Debug, Clone)]
@ -28,19 +39,19 @@ pub enum Commands {
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct MathCommand { pub struct MathCommand {
#[command(subcommand)] #[command(subcommand)]
action: MathActions pub action: MathActions
} }
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct BinaryCommand { pub struct BinaryCommand {
#[command(subcommand)] #[command(subcommand)]
action: BinaryActions pub action: BinaryActions
} }
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct AlgoCommand { pub struct AlgoCommand {
#[command(subcommand)] #[command(subcommand)]
action: AlgoActions pub action: AlgoActions
} }
#[derive(Subcommand, Clone, Debug, PartialEq, Eq)] #[derive(Subcommand, Clone, Debug, PartialEq, Eq)]
@ -53,25 +64,25 @@ pub enum MathActions {
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct ModexpArgs { pub struct ModexpArgs {
base: String, pub base: String,
exp: String, pub exp: String,
field: String pub field: String
} }
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct ModredArgs { pub struct ModredArgs {
#[clap(value_parser=maybe_hex::<u64>)] #[clap(value_parser=maybe_hex::<u64>)]
polynomial: u64, pub polynomial: u64,
#[clap(value_parser=maybe_hex::<u64>)] #[clap(value_parser=maybe_hex::<u64>)]
relation: u64, pub relation: u64,
} }
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct PM1Args { pub struct PM1Args {
#[clap(value_parser=maybe_hex::<u128>)] #[clap(value_parser=maybe_hex::<u128>)]
n: u128, pub n: u128,
#[clap(value_parser=maybe_hex::<u128>)] #[clap(value_parser=maybe_hex::<u128>)]
max_prime: u128, pub max_prime: u128,
} }
#[derive(Subcommand, Clone, Debug, PartialEq, Eq)] #[derive(Subcommand, Clone, Debug, PartialEq, Eq)]
@ -85,19 +96,19 @@ pub enum BinaryActions {
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct RotateArgs { pub struct RotateArgs {
#[arg(short, long, default_value_t = false)] #[arg(short, long, default_value_t = false)]
left: bool, pub left: bool,
#[clap(value_parser=maybe_hex::<u32>)] #[clap(value_parser=maybe_hex::<u32>)]
base: u32, pub base: u32,
#[clap(value_parser=maybe_hex::<u32>)] #[clap(value_parser=maybe_hex::<u32>)]
shift_width: u32, pub shift_width: u32,
} }
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct XorArgs { pub struct XorArgs {
#[clap(value_parser=maybe_hex::<u128>)] #[clap(value_parser=maybe_hex::<u128>)]
a: u128, pub a: u128,
#[clap(value_parser=maybe_hex::<u128>)] #[clap(value_parser=maybe_hex::<u128>)]
b: u128, pub b: u128,
} }
#[derive(Subcommand, Clone, Debug, PartialEq, Eq)] #[derive(Subcommand, Clone, Debug, PartialEq, Eq)]
@ -113,23 +124,23 @@ pub enum AlgoActions {
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct Feistel0InnerArgs { pub struct Feistel0InnerArgs {
#[clap(value_parser=maybe_hex::<u16>)] #[clap(value_parser=maybe_hex::<u16>)]
input: u16, pub input: u16,
#[clap(value_parser=maybe_hex::<u16>)] #[clap(value_parser=maybe_hex::<u16>)]
key: u16, pub key: u16,
} }
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct Feistel0SBOXArgs { pub struct Feistel0SBOXArgs {
#[clap(value_parser=maybe_hex::<u8>)] #[clap(value_parser=maybe_hex::<u8>)]
index: u8, pub index: u8,
} }
#[derive(Args, Clone, Debug, PartialEq, Eq)] #[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct Feistel0Args{ pub struct Feistel0Args{
#[clap(value_parser=maybe_hex::<u32>)] #[clap(value_parser=maybe_hex::<u32>)]
input: u32, pub input: u32,
#[clap(value_parser=maybe_hex::<u32>)] #[clap(value_parser=maybe_hex::<u32>)]
key: u32, pub key: u32,
#[arg(short, long, default_value_t = false)] #[arg(short, long, default_value_t = false)]
decrypt: bool, pub decrypt: bool,
} }

View File

@ -7,3 +7,4 @@
/// License: MIT /// License: MIT
/// Source: <https://git.cscherr.de/PlexSheep/plexcryptool/> /// Source: <https://git.cscherr.de/PlexSheep/plexcryptool/>
pub mod printing; pub mod printing;
pub mod cli;

View File

@ -8,6 +8,8 @@
/// License: MIT /// License: MIT
/// Source: <https://git.cscherr.de/PlexSheep/plexcryptool/> /// Source: <https://git.cscherr.de/PlexSheep/plexcryptool/>
use crate::cplex::cli::Cli;
use std::fmt::{Debug, LowerHex}; use std::fmt::{Debug, LowerHex};
use num::Integer; use num::Integer;

View File

@ -14,156 +14,19 @@
//! Note that this library offers Python bindings using [PyO3](pyo3.rs) //! Note that this library offers Python bindings using [PyO3](pyo3.rs)
//! ___ //! ___
//! Author: Christoph J. Scherr <software@cscherr.de> //! Author: Christoph J. Scherr <software@cscherr.de>
//!
//! License: MIT //! License: MIT
//!
//! Source: <https://git.cscherr.de/PlexSheep/plexcryptool/> //! Source: <https://git.cscherr.de/PlexSheep/plexcryptool/>
mod binary; mod binary;
mod math; mod math;
mod algo; mod algo;
mod cplex; mod cplex;
use std::{str::FromStr, fmt::Debug}; use cplex::cli::*;
use clap::{Args, Parser, Subcommand}; use std::str::FromStr;
use clap_num::maybe_hex;
use clap::Parser;
use num_bigint; use num_bigint;
/*************************************************************************************************/
/// This is just structures for parsing Cli args
#[derive(Parser, Debug, Clone)]
#[clap(name="plexcryptool", author="Christoph J. Scherr", version, about="Various tools for use with math and cryptology, includes executable and a library.")]
pub struct Cli {
/// Which submodule to use
#[command(subcommand)]
command: Commands,
/// Machine output
#[arg(short, long, default_value_t = false, global = true)]
machine: bool,
/// Verbose output
#[arg(short, long, default_value_t = false, global = true)]
verbose: bool,
}
#[derive(Subcommand, Debug, Clone)]
pub enum Commands {
/// Use math functions
Math(MathCommand),
/// Use binary functions
Binary(BinaryCommand),
/// Use custom algorithms
Algo(AlgoCommand),
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct MathCommand {
#[command(subcommand)]
action: MathActions
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct BinaryCommand {
#[command(subcommand)]
action: BinaryActions
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct AlgoCommand {
#[command(subcommand)]
action: AlgoActions
}
#[derive(Subcommand, Clone, Debug, PartialEq, Eq)]
pub enum MathActions {
#[command(name="modexp")]
Modexp(ModexpArgs),
Modred(ModredArgs),
Pm1(PM1Args),
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct ModexpArgs {
base: String,
exp: String,
field: String
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct ModredArgs {
#[clap(value_parser=maybe_hex::<u64>)]
polynomial: u64,
#[clap(value_parser=maybe_hex::<u64>)]
relation: u64,
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct PM1Args {
#[clap(value_parser=maybe_hex::<u128>)]
n: u128,
#[clap(value_parser=maybe_hex::<u128>)]
max_prime: u128,
}
#[derive(Subcommand, Clone, Debug, PartialEq, Eq)]
pub enum BinaryActions {
/// bit rotation/circular shifting (only 32bit)
#[command(name="rotate")]
Rotate(RotateArgs),
Xor(XorArgs)
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct RotateArgs {
#[arg(short, long, default_value_t = false)]
left: bool,
#[clap(value_parser=maybe_hex::<u32>)]
base: u32,
#[clap(value_parser=maybe_hex::<u32>)]
shift_width: u32,
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct XorArgs {
#[clap(value_parser=maybe_hex::<u128>)]
a: u128,
#[clap(value_parser=maybe_hex::<u128>)]
b: u128,
}
#[derive(Subcommand, Clone, Debug, PartialEq, Eq)]
pub enum AlgoActions {
#[command(name="feistel0-i")]
Feistel0Inner(Feistel0InnerArgs),
#[command(name="feistel0-sbox")]
Feistel0SBOX(Feistel0SBOXArgs),
#[command(name="feistel0")]
Feistel0(Feistel0Args)
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct Feistel0InnerArgs {
#[clap(value_parser=maybe_hex::<u16>)]
input: u16,
#[clap(value_parser=maybe_hex::<u16>)]
key: u16,
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct Feistel0SBOXArgs {
#[clap(value_parser=maybe_hex::<u8>)]
index: u8,
}
#[derive(Args, Clone, Debug, PartialEq, Eq)]
pub struct Feistel0Args{
#[clap(value_parser=maybe_hex::<u32>)]
input: u32,
#[clap(value_parser=maybe_hex::<u32>)]
key: u32,
#[arg(short, long, default_value_t = false)]
decrypt: bool,
}
/*************************************************************************************************/ /*************************************************************************************************/
/// main function of plexcryptool. /// main function of plexcryptool.

View File

@ -10,7 +10,7 @@
/// License: MIT /// License: MIT
/// Source: <https://git.cscherr.de/PlexSheep/plexcryptool/> /// Source: <https://git.cscherr.de/PlexSheep/plexcryptool/>
use crate::cplex; use crate::cplex::printing::seperator;
#[test] #[test]
fn test_modred() { fn test_modred() {
@ -26,7 +26,7 @@ pub fn modred(mut poly: u64, relation: u64, verbose: bool) -> Result<u64, String
if verbose { if verbose {
println!("relation:\t{:#x}\t", relation); println!("relation:\t{:#x}\t", relation);
println!("polynomial:\t{:#x}\t", poly); println!("polynomial:\t{:#x}\t", poly);
println!("{:=<120}", '='); seperator();
} }
if relation > poly { if relation > poly {
if verbose { if verbose {