current
This commit is contained in:
parent
d139927d00
commit
62112a88a9
10
src/math.rs
10
src/math.rs
|
@ -1,4 +1,4 @@
|
||||||
use crate::params::{o_bytes, Level};
|
use crate::params::{k, m, n, o, Level};
|
||||||
use std::ops::{Add, Neg};
|
use std::ops::{Add, Neg};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
@ -217,6 +217,14 @@ pub fn encode_vec<const R: usize>(vec: Mat<R, 1>) -> [u8; (R + 1) / 2] {
|
||||||
out
|
out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn sample_solution<const L: Level>(
|
||||||
|
mat: Mat<{ m(L) }, { k(L) * o(L) }>,
|
||||||
|
y: Mat<{ m(L) }, 1>,
|
||||||
|
r: Mat<{ k(L) * o(L) }, 1>,
|
||||||
|
) -> Mat<{ n(L) }, 1> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
// pub struct FullMat<const R: usize, const C: usize>([[u8; C]; R]);
|
// pub struct FullMat<const R: usize, const C: usize>([[u8; C]; R]);
|
||||||
//
|
//
|
||||||
// pub const fn tpn(n: usize) -> usize {
|
// pub const fn tpn(n: usize) -> usize {
|
||||||
|
|
28
src/mayo.rs
28
src/mayo.rs
|
@ -1,17 +1,17 @@
|
||||||
use crate::math::{
|
use crate::math::{
|
||||||
decode_matrices, decode_matrix, decode_vec, encode_matrices, encode_vec, upper, Mat,
|
decode_matrices, decode_matrix, decode_vec, encode_matrices, encode_vec, sample_solution,
|
||||||
|
upper, Mat,
|
||||||
};
|
};
|
||||||
use crate::params::Level;
|
use crate::params::Level;
|
||||||
use crate::params::{
|
use crate::params::{
|
||||||
digest_bytes, k, l_bytes, m, n, o, o_bytes, p1_bytes, p2_bytes, p3_bytes, pk_seed_bytes, poly,
|
digest_bytes, k, l_bytes, m, n, o, o_bytes, p1_bytes, p2_bytes, p3_bytes, pk_seed_bytes,
|
||||||
q, salt_bytes, v_bytes,
|
polymat, salt_bytes, v_bytes,
|
||||||
};
|
};
|
||||||
use crate::sig::{KeyGen, Signer, Verifier};
|
use crate::sig::{KeyGen, Signer, Verifier};
|
||||||
use crate::sym::{aes_128_ctr, shake_256};
|
use crate::sym::{aes_128_ctr, shake_256};
|
||||||
use rand::rngs::OsRng;
|
use rand::rngs::OsRng;
|
||||||
use rand::RngCore;
|
use rand::RngCore;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use tiny_keccak::{Hasher, Shake};
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct SigningKey<const L: Level>([u8; salt_bytes(L)], VerifyKey<L>)
|
pub struct SigningKey<const L: Level>([u8; salt_bytes(L)], VerifyKey<L>)
|
||||||
|
@ -226,22 +226,26 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
l += 1;
|
l += 1;
|
||||||
el = el.mul_right(E_mat(L));
|
el = el.mul_right(Mat(polymat()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let x = sample_solution(A, t, r);
|
let x = sample_solution(A.tp(), t, r).tp();
|
||||||
|
|
||||||
let s = Mat([[0; k(L) * n(L)]; 1]);
|
let mut s = Mat([[0; k(L) * n(L)]; 1]);
|
||||||
for i in 0..(k(L)) {
|
for i in 0..(k(L)) {
|
||||||
s.0[0][(i * n(L))..((i + 1) * n(L) - o(L))].copy_from_slice(
|
let x_inner = &x.0[0][(i * o(L))..((i + 1) * o(L))];
|
||||||
&(vv[i] + (om.mul_right(Mat([x.0[(i * o(L))..((i + 1) * o(L))]; 1]).tp()))).0[0],
|
let mut xi = [0; o(L)];
|
||||||
);
|
for i in 0..o(L) {
|
||||||
|
xi[i] = x_inner[i];
|
||||||
|
}
|
||||||
|
s.0[0][(i * n(L))..((i + 1) * n(L) - o(L))]
|
||||||
|
.copy_from_slice(&(vv[i] + (om.mul_right(Mat([xi; 1]).tp()))).0[0]);
|
||||||
s.0[0][((i + 1) * n(L) - o(L))..((i + 1) * n(L))]
|
s.0[0][((i + 1) * n(L) - o(L))..((i + 1) * n(L))]
|
||||||
.copy_from_slice(&x.0[(i * o(L))..((i + 1) * o(L))]);
|
.copy_from_slice(&x.0[0][(i * o(L))..((i + 1) * o(L))]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let sig = encode_vec::<{ k(L) * n(L) }>(s.tp()).to_vec();
|
let mut sig = encode_vec::<{ k(L) * n(L) }>(s.tp()).to_vec();
|
||||||
|
|
||||||
for i in salt {
|
for i in salt {
|
||||||
sig.push(i);
|
sig.push(i);
|
||||||
|
|
|
@ -74,11 +74,26 @@ pub const fn poly(level: Level) -> usize {
|
||||||
match level {
|
match level {
|
||||||
Level::MAYO1 => 64,
|
Level::MAYO1 => 64,
|
||||||
Level::MAYO2 => 64,
|
Level::MAYO2 => 64,
|
||||||
Level::MAYO3 => 64,
|
Level::MAYO3 => 96,
|
||||||
Level::MAYO5 => 128,
|
Level::MAYO5 => 128,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub const fn polymat<const L: Level>() -> [[u8; m(L)]; m(L)] {
|
||||||
|
match poly(L) {
|
||||||
|
64 => {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
96 => {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
128 => {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
_ => unimplemented!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub const fn v_bytes(level: Level) -> usize {
|
pub const fn v_bytes(level: Level) -> usize {
|
||||||
(n(level) - o(level) + 1) / 2
|
(n(level) - o(level) + 1) / 2
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,8 @@ use crypto::aes::{self, KeySize};
|
||||||
use tiny_keccak::{Hasher, Shake};
|
use tiny_keccak::{Hasher, Shake};
|
||||||
|
|
||||||
pub fn aes_128_ctr(seed: &[u8], l: usize) -> Vec<u8> {
|
pub fn aes_128_ctr(seed: &[u8], l: usize) -> Vec<u8> {
|
||||||
let mut nonce = [0u8; 16];
|
let nonce = [0u8; 16];
|
||||||
let mut cipher = aes::ctr(KeySize::KeySize128, &seed, &nonce);
|
let mut cipher = aes::ctr(KeySize::KeySize128, seed, &nonce);
|
||||||
let enc = vec![0u8; l];
|
let enc = vec![0u8; l];
|
||||||
let mut out = vec![0u8; l];
|
let mut out = vec![0u8; l];
|
||||||
cipher.process(&enc, &mut out[..]);
|
cipher.process(&enc, &mut out[..]);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user