use crate::{secret::SecretKey, signature::Signature};
use sha256_rs::*;
#[derive(Eq, PartialEq)]
pub struct PublicKey([[u8; 32]; 32]);
impl PublicKey {
pub fn verify(&self, message: &[u8], signature: Signature) -> bool {
let signature = signature.to_bytes();
let mut public_key = [[0u8; 32]; 32];
let hash = sha256(message);
for (i, key) in public_key.iter_mut().enumerate() {
let mut s = signature[i];
let n = hash[i];
for _ in 0..n as usize {
s = sha256(&s);
}
*key = s;
}
self.0 == public_key
}
pub fn to_bytes(&self) -> [[u8; 32]; 32] {
self.0
}
}
impl From<[[u8; 32]; 32]> for PublicKey {
fn from(value: [[u8; 32]; 32]) -> Self {
Self(value)
}
}
impl<'a> From<&'a SecretKey> for PublicKey {
fn from(value: &SecretKey) -> Self {
let bytes = value.to_bytes();
let mut public_key = [[0u8; 32]; 32];
for (i, key) in public_key.iter_mut().enumerate() {
let mut skey = bytes[i];
for _ in 0..256 {
skey = sha256(&skey);
}
*key = skey;
}
PublicKey(public_key)
}
}