qfall_math/integer_mod_q/modulus_polynomial_ring_zq/
serialize.rs

1// Copyright © 2023 Marvin Beckmann
2//
3// This file is part of qFALL-math.
4//
5// qFALL-math is free software: you can redistribute it and/or modify it under
6// the terms of the Mozilla Public License Version 2.0 as published by the
7// Mozilla Foundation. See <https://mozilla.org/en-US/MPL/2.0/>.
8
9//! This module contains implementations of functions
10//! important for serialization such as the [`Serialize`] and [`Deserialize`] trait.
11//!
12//! The explicit functions contain the documentation.
13
14use super::ModulusPolynomialRingZq;
15use crate::macros::serialize::{deserialize, serialize};
16use core::fmt;
17use serde::{
18    Deserialize, Serialize,
19    de::{Error, MapAccess, Unexpected, Visitor},
20    ser::SerializeStruct,
21};
22use std::str::FromStr;
23
24serialize!("poly", ModulusPolynomialRingZq);
25deserialize!("poly", Poly, ModulusPolynomialRingZq);
26
27#[cfg(test)]
28mod test_serialize {
29    use crate::integer_mod_q::ModulusPolynomialRingZq;
30    use std::str::FromStr;
31
32    /// Tests whether the serialization of a positive [`ModulusPolynomialRingZq`] works.
33    #[test]
34    fn serialize_output_positive() {
35        let poly_str = "2  17 42 mod 331";
36        let poly_z = ModulusPolynomialRingZq::from_str(poly_str).unwrap();
37        let cmp_str = format!("{{\"poly\":\"{poly_str}\"}}");
38
39        assert_eq!(cmp_str, serde_json::to_string(&poly_z).unwrap());
40    }
41
42    /// Tests whether the serialization of a negative [`ModulusPolynomialRingZq`] works.
43    #[test]
44    fn serialize_output_negative() {
45        let poly_str = "3  -17 -42 1 mod 331";
46        let poly_z = ModulusPolynomialRingZq::from_str(poly_str).unwrap();
47        let cmp_str = "{\"poly\":\"3  314 289 1 mod 331\"}";
48
49        assert_eq!(cmp_str, serde_json::to_string(&poly_z).unwrap());
50    }
51
52    /// Tests whether the serialization of a positive large [`ModulusPolynomialRingZq`] works.
53    #[test]
54    fn serialize_output_positive_large() {
55        let poly_str = format!("3  1 {} 1 mod {}", u64::MAX, u64::MAX - 58);
56        let poly_z = ModulusPolynomialRingZq::from_str(&poly_str).unwrap();
57        let cmp_str = format!("{{\"poly\":\"3  1 58 1 mod {}\"}}", u64::MAX - 58);
58
59        assert_eq!(cmp_str, serde_json::to_string(&poly_z).unwrap());
60    }
61
62    /// Tests whether the serialization of a negative large [`ModulusPolynomialRingZq`] works.
63    #[test]
64    fn serialize_output_negative_large() {
65        let poly_str = format!("3  1 -{} 1 mod {}", u64::MAX, u64::MAX - 58);
66        let poly_z = ModulusPolynomialRingZq::from_str(&poly_str).unwrap();
67        let cmp_str = format!(
68            "{{\"poly\":\"3  1 {} 1 mod {}\"}}",
69            u64::MAX - 2 * 58,
70            u64::MAX - 58
71        );
72
73        assert_eq!(cmp_str, serde_json::to_string(&poly_z).unwrap());
74    }
75}
76
77#[cfg(test)]
78mod test_deserialize {
79    use crate::integer_mod_q::ModulusPolynomialRingZq;
80    use std::str::FromStr;
81
82    /// Tests whether the deserialization of a positive [`ModulusPolynomialRingZq`] works.
83    #[test]
84    fn deserialize_positive() {
85        let poly_str = "2  17 42 mod 331";
86        let cmp_str = format!("{{\"poly\":\"{poly_str}\"}}");
87
88        let poly_mod = ModulusPolynomialRingZq::from_str(poly_str).unwrap();
89        assert_eq!(
90            poly_mod,
91            serde_json::from_str::<ModulusPolynomialRingZq>(&cmp_str).unwrap()
92        );
93    }
94
95    /// Tests whether the deserialization of a negative [`ModulusPolynomialRingZq`] works.
96    #[test]
97    fn deserialize_negative() {
98        let poly_str = "3  -17 -42 1 mod 331";
99        let cmp_str = format!("{{\"poly\":\"{poly_str}\"}}");
100
101        let poly_mod = ModulusPolynomialRingZq::from_str(poly_str).unwrap();
102        assert_eq!(
103            poly_mod,
104            serde_json::from_str::<ModulusPolynomialRingZq>(&cmp_str).unwrap()
105        );
106    }
107
108    /// Tests whether the deserialization of a positive large [`ModulusPolynomialRingZq`] works.
109    #[test]
110    fn deserialize_positive_large() {
111        let poly_str = format!("3  -17 {} 1 mod {}", u64::MAX, u64::MAX - 58);
112        let cmp_str = format!("{{\"poly\":\"{poly_str}\"}}");
113
114        let poly_mod = ModulusPolynomialRingZq::from_str(&poly_str).unwrap();
115        assert_eq!(
116            poly_mod,
117            serde_json::from_str::<ModulusPolynomialRingZq>(&cmp_str).unwrap()
118        );
119    }
120
121    /// Tests whether the deserialization of a negative large [`ModulusPolynomialRingZq`] works.
122    #[test]
123    fn deserialize_negative_large() {
124        let poly_str = format!("3  -17 -{} 1 mod {}", u64::MAX, u64::MAX - 58);
125        let cmp_str = format!("{{\"poly\":\"{poly_str}\"}}");
126
127        let poly_mod = ModulusPolynomialRingZq::from_str(&poly_str).unwrap();
128        assert_eq!(
129            poly_mod,
130            serde_json::from_str::<ModulusPolynomialRingZq>(&cmp_str).unwrap()
131        );
132    }
133
134    /// Tests whether deserialization of a non-prime large `q` [`ModulusPolynomialRingZq`] fails.
135    #[test]
136    fn non_prime_q() {
137        let a: Result<ModulusPolynomialRingZq, serde_json::Error> =
138            serde_json::from_str(&format!("{{\"poly\":\"2  17 42 mod {}\"}}", u64::MAX));
139        assert!(a.is_ok());
140    }
141
142    /// Tests whether deserialization of a negative `q` [`ModulusPolynomialRingZq`] fails.
143    #[test]
144    fn negative_q() {
145        let a: Result<ModulusPolynomialRingZq, serde_json::Error> =
146            serde_json::from_str(&format!("{{\"poly\":\"2  17 42 mod -{}\"}}", u64::MAX));
147        assert!(a.is_err());
148
149        let b: Result<ModulusPolynomialRingZq, serde_json::Error> =
150            serde_json::from_str("{{\"poly\":\"2  17 42 mod -17\"}}");
151        assert!(b.is_err());
152    }
153
154    /// Tests whether no fields 'poly' provided yield an error [`ModulusPolynomialRingZq`] works.
155    #[test]
156    fn no_field_value() {
157        let a: Result<ModulusPolynomialRingZq, serde_json::Error> =
158            serde_json::from_str("{{\"tree\":\"{2  17 42 mod 331}\"}}");
159        assert!(a.is_err());
160
161        let b: Result<ModulusPolynomialRingZq, serde_json::Error> = serde_json::from_str("{{}}");
162        assert!(b.is_err());
163    }
164
165    /// Tests whether too many fields yield an error
166    #[test]
167    fn too_many_fields() {
168        let a: Result<ModulusPolynomialRingZq, serde_json::Error> = serde_json::from_str(
169            "{{\"tree\":\"{2  17 42 mod 331}\", \"poly\":\"{2  17 42 mod 331}\"}}",
170        );
171        assert!(a.is_err());
172
173        let b: Result<ModulusPolynomialRingZq, serde_json::Error> =
174            serde_json::from_str("{{\"poly\":\"{}\", \"poly\":\"{2  17 42 mod 331}\"}}");
175        assert!(b.is_err());
176    }
177}