use crate::utils::{adler64, inverse_mod, powmod}; use crate::window_state::WindowState; use eframe::egui; pub struct Window { message: String, key: String, signed: Option, error: Option, } impl Default for Window { fn default() -> Self { Self { message: String::new(), key: String::new(), signed: None, error: None, } } } impl Window { fn sign(&mut self) { let split = self.key.split(",").collect::>(); if split.len() != 2 { self.signed = None; self.error = Some("Неверный формат ключа".to_string()); return; } let y = match split[0].parse::() { Ok(num) => num, Err(_) => { self.signed = None; self.error = Some("Не удалось прочитать открытый ключ".to_string()); return; } }; let p = match split[1].parse::() { Ok(num) => num, Err(_) => { self.signed = None; self.error = Some("Не удалось прочитать модуль".to_string()); return; } }; let h = adler64(self.message.as_bytes()) % p; let h1 = inverse_mod(h as i64, p as i64) as u64; self.signed = Some(powmod(y, h1, p)); } } impl WindowState for Window { fn get_name(&self) -> &str { "Подделать подпись" } fn update(&mut self, ui: &mut egui::Ui) { ui.label("Сообщение для подписи:"); let resp1 = ui.add(egui::TextEdit::multiline(&mut self.message)); ui.label("Открытый ключ:"); let resp2 = ui.add(egui::TextEdit::singleline(&mut self.key)); if resp1.changed() || resp2.changed() { self.signed = None; self.error = None; } if ui.button("Подписать").clicked() { self.sign(); } if let Some(signature) = &self.signed { let mut tmp = signature.to_string(); ui.horizontal(|ui| { ui.label("Подпись:"); ui.add_enabled(false, egui::TextEdit::singleline(&mut tmp)); }); if ui.button("Скопировать подпись").clicked() { ui.output().copied_text = tmp.clone(); } if ui.button("Скопировать сообщение").clicked() { ui.output().copied_text = self.message.clone(); } } if let Some(error) = &self.error { ui.label(error); } } }