use crate::utils::{adler64, powmod}; use crate::window_state::WindowState; use eframe::egui; pub struct Window { message: String, signature: String, key: String, correct: Option, error: Option, } impl Default for Window { fn default() -> Self { Self { message: String::new(), signature: String::new(), key: String::new(), correct: None, error: None, } } } impl Window { fn check(&mut self) { let split = self.key.split(",").collect::>(); if split.len() != 2 { self.correct = None; self.error = Some("Неверный формат ключа".to_string()); return; } let y = match split[0].parse::() { Ok(num) => num, Err(_) => { self.correct = None; self.error = Some("Не удалось прочитать открытый ключ".to_string()); return; } }; let p = match split[1].parse::() { Ok(num) => num, Err(_) => { self.correct = None; self.error = Some("Не удалось прочитать модуль".to_string()); return; } }; let signature = match self.signature.parse::() { Ok(num) => num, Err(_) => { self.correct = None; self.error = Some("Не удалось прочитать подпись".to_string()); return; } }; let h = adler64(self.message.as_bytes()) % p; self.correct = Some(powmod(signature, h, p) == y); } } 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.signature)); ui.label("Открытый ключ:"); let resp3 = ui.add(egui::TextEdit::singleline(&mut self.key)); if resp1.changed() || resp2.changed() || resp3.changed() { self.correct = None; } if ui.button("Проверить подпись").clicked() { self.check(); } if let Some(true) = &self.correct { ui.label("Подпись верна"); } else if let Some(false) = &self.correct { ui.label("Подпись не соответствует сообщению"); } } }