poulpy_core/layouts/
gglwe_atk.rs1use poulpy_hal::{
2 layouts::{Data, DataMut, DataRef, FillUniform, MatZnx, ReaderFrom, Reset, WriterTo},
3 source::Source,
4};
5
6use crate::layouts::{GGLWESwitchingKey, GLWECiphertext, Infos};
7use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
8
9use std::fmt;
10
11#[derive(PartialEq, Eq, Clone)]
12pub struct GGLWEAutomorphismKey<D: Data> {
13 pub(crate) key: GGLWESwitchingKey<D>,
14 pub(crate) p: i64,
15}
16
17impl<D: DataRef> fmt::Debug for GGLWEAutomorphismKey<D> {
18 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19 write!(f, "{}", self)
20 }
21}
22
23impl<D: DataMut> FillUniform for GGLWEAutomorphismKey<D> {
24 fn fill_uniform(&mut self, log_bound: usize, source: &mut Source) {
25 self.key.fill_uniform(log_bound, source);
26 }
27}
28
29impl<D: DataMut> Reset for GGLWEAutomorphismKey<D>
30where
31 MatZnx<D>: Reset,
32{
33 fn reset(&mut self) {
34 self.key.reset();
35 self.p = 0;
36 }
37}
38
39impl<D: DataRef> fmt::Display for GGLWEAutomorphismKey<D> {
40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41 write!(f, "(AutomorphismKey: p={}) {}", self.p, self.key)
42 }
43}
44
45impl GGLWEAutomorphismKey<Vec<u8>> {
46 pub fn alloc(n: usize, basek: usize, k: usize, rows: usize, digits: usize, rank: usize) -> Self {
47 GGLWEAutomorphismKey {
48 key: GGLWESwitchingKey::alloc(n, basek, k, rows, digits, rank, rank),
49 p: 0,
50 }
51 }
52
53 pub fn bytes_of(n: usize, basek: usize, k: usize, rows: usize, digits: usize, rank: usize) -> usize {
54 GGLWESwitchingKey::bytes_of(n, basek, k, rows, digits, rank, rank)
55 }
56}
57
58impl<D: Data> Infos for GGLWEAutomorphismKey<D> {
59 type Inner = MatZnx<D>;
60
61 fn inner(&self) -> &Self::Inner {
62 self.key.inner()
63 }
64
65 fn basek(&self) -> usize {
66 self.key.basek()
67 }
68
69 fn k(&self) -> usize {
70 self.key.k()
71 }
72}
73
74impl<D: Data> GGLWEAutomorphismKey<D> {
75 pub fn p(&self) -> i64 {
76 self.p
77 }
78
79 pub fn digits(&self) -> usize {
80 self.key.digits()
81 }
82
83 pub fn rank(&self) -> usize {
84 self.key.rank()
85 }
86
87 pub fn rank_in(&self) -> usize {
88 self.key.rank_in()
89 }
90
91 pub fn rank_out(&self) -> usize {
92 self.key.rank_out()
93 }
94}
95
96impl<D: DataRef> GGLWEAutomorphismKey<D> {
97 pub fn at(&self, row: usize, col: usize) -> GLWECiphertext<&[u8]> {
98 self.key.at(row, col)
99 }
100}
101
102impl<D: DataMut> GGLWEAutomorphismKey<D> {
103 pub fn at_mut(&mut self, row: usize, col: usize) -> GLWECiphertext<&mut [u8]> {
104 self.key.at_mut(row, col)
105 }
106}
107
108impl<D: DataMut> ReaderFrom for GGLWEAutomorphismKey<D> {
109 fn read_from<R: std::io::Read>(&mut self, reader: &mut R) -> std::io::Result<()> {
110 self.p = reader.read_u64::<LittleEndian>()? as i64;
111 self.key.read_from(reader)
112 }
113}
114
115impl<D: DataRef> WriterTo for GGLWEAutomorphismKey<D> {
116 fn write_to<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
117 writer.write_u64::<LittleEndian>(self.p as u64)?;
118 self.key.write_to(writer)
119 }
120}