zkplmt/
lib.rs

1#![crate_type = "lib"]
2#![cfg_attr(not(feature = "std"), no_std)]
3
4#[macro_use]
5extern crate alloc;
6
7pub mod bulletproofs;
8/// Core primitives
9pub mod core;
10pub mod models;
11pub mod verifiable_encryption;
12
13#[cfg(test)]
14mod tests {
15    use super::core::*;
16    use crate::models::{CurveVector, Proof, VectorTuple};
17    use curve25519_dalek::scalar::Scalar;
18    use rand::rngs::OsRng;
19    use rand::{CryptoRng, RngCore};
20
21    /// The first tuple must be the linear tuple. Shuffles the tuples vector.
22    pub(crate) fn create_zkplmt_shuffle<R>(
23        tuples: &mut [VectorTuple],
24        secret: Scalar,
25        csprng: &mut R,
26    ) -> Result<Proof, ZkPlmtError>
27    where
28        R: RngCore + CryptoRng,
29    {
30        let hidden_index = shuffle(tuples, csprng);
31        create_zkplmt(&[], tuples, hidden_index, secret, csprng)
32    }
33    #[test]
34    fn test_zkplmt() {
35        let mut csprng: OsRng = OsRng::default();
36        let secret = Scalar::random(&mut csprng);
37        let base_1 = get_random_curve_point(&mut csprng);
38        let base_2 = get_random_curve_point(&mut csprng);
39        let base_3 = get_random_curve_point(&mut csprng);
40
41        let per_1 = secret * base_1;
42        let per_2 = secret * base_2;
43        let per_3 = secret * base_3;
44
45        let curve_points_1 = vec![
46            CurveVector {
47                x: base_1,
48                y: per_1,
49            },
50            CurveVector {
51                x: base_2,
52                y: per_2,
53            },
54            CurveVector {
55                x: base_3,
56                y: per_3,
57            },
58        ];
59
60        let tuple_1 = VectorTuple {
61            values: curve_points_1,
62        };
63
64        let mut tuples = vec![tuple_1];
65
66        for _ in 1..15 {
67            let base_1 = get_random_curve_point(&mut csprng);
68            let base_2 = get_random_curve_point(&mut csprng);
69            let base_3 = get_random_curve_point(&mut csprng);
70
71            let per_1 = get_random_curve_point(&mut csprng);
72            let per_2 = get_random_curve_point(&mut csprng);
73            let per_3 = get_random_curve_point(&mut csprng);
74
75            let curve_points_1 = vec![
76                CurveVector {
77                    x: base_1,
78                    y: per_1,
79                },
80                CurveVector {
81                    x: base_2,
82                    y: per_2,
83                },
84                CurveVector {
85                    x: base_3,
86                    y: per_3,
87                },
88            ];
89
90            let tuple_2 = VectorTuple {
91                values: curve_points_1,
92            };
93
94            tuples.push(tuple_2);
95        }
96
97        let signature = create_zkplmt_shuffle(&mut tuples, secret, &mut csprng)
98            .expect("It will never reach here");
99        let result = verify_zkplmt(&[], &tuples, &signature);
100        assert_eq!(result, Ok(()));
101    }
102
103    #[test]
104    fn test_zkplmt_single() {
105        let mut csprng: OsRng = OsRng::default();
106        let secret = Scalar::random(&mut csprng);
107        let base_1 = get_random_curve_point(&mut csprng);
108        let base_2 = get_random_curve_point(&mut csprng);
109        let base_3 = get_random_curve_point(&mut csprng);
110        let base_4 = get_random_curve_point(&mut csprng);
111        let base_5 = get_random_curve_point(&mut csprng);
112
113        let per_1 = secret * base_1;
114        let per_2 = secret * base_2;
115        let per_3 = secret * base_3;
116        let per_4 = secret * base_4;
117        let per_5 = secret * base_5;
118
119        let curve_points_1 = vec![
120            CurveVector {
121                x: base_1,
122                y: per_1,
123            },
124            CurveVector {
125                x: base_2,
126                y: per_2,
127            },
128            CurveVector {
129                x: base_3,
130                y: per_3,
131            },
132            CurveVector {
133                x: base_4,
134                y: per_4,
135            },
136            CurveVector {
137                x: base_5,
138                y: per_5,
139            },
140        ];
141
142        let tuple_1 = VectorTuple {
143            values: curve_points_1,
144        };
145
146        let tuples = vec![tuple_1];
147
148        let signature =
149            create_zkplmt(&[], &tuples, 0, secret, &mut csprng).expect("It will never reach  here");
150        let result = verify_zkplmt(&[], &tuples, &signature);
151        assert_eq!(result, Ok(()));
152    }
153
154    #[test]
155    fn test_zkplmt_fail() {
156        let mut csprng: OsRng = OsRng::default();
157        let secret = Scalar::random(&mut csprng);
158        let base_1 = get_random_curve_point(&mut csprng);
159        let base_2 = get_random_curve_point(&mut csprng);
160        let base_3 = get_random_curve_point(&mut csprng);
161
162        let per_1 = secret * base_1;
163        let per_2 = secret * base_2;
164        let per_3 = secret * base_3;
165
166        let curve_points_1 = vec![
167            CurveVector {
168                x: base_1,
169                y: per_1,
170            },
171            CurveVector {
172                x: base_2,
173                y: per_2,
174            },
175            CurveVector {
176                x: base_3,
177                y: per_3,
178            },
179        ];
180
181        let tuple_1 = VectorTuple {
182            values: curve_points_1,
183        };
184
185        let base_1 = get_random_curve_point(&mut csprng);
186        let base_2 = get_random_curve_point(&mut csprng);
187        let base_3 = get_random_curve_point(&mut csprng);
188
189        let per_1 = get_random_curve_point(&mut csprng);
190        let per_2 = get_random_curve_point(&mut csprng);
191        let per_3 = get_random_curve_point(&mut csprng);
192
193        let curve_points_1 = vec![
194            CurveVector {
195                x: base_1,
196                y: per_1,
197            },
198            CurveVector {
199                x: base_2,
200                y: per_2,
201            },
202            CurveVector {
203                x: base_3,
204                y: per_3,
205            },
206        ];
207
208        let tuple_2 = VectorTuple {
209            values: curve_points_1,
210        };
211
212        let base_1 = get_random_curve_point(&mut csprng);
213        let base_2 = get_random_curve_point(&mut csprng);
214        let base_3 = get_random_curve_point(&mut csprng);
215
216        let per_1 = get_random_curve_point(&mut csprng);
217        let per_2 = get_random_curve_point(&mut csprng);
218        let per_3 = get_random_curve_point(&mut csprng);
219
220        let curve_points_1 = vec![
221            CurveVector {
222                x: base_1,
223                y: per_1,
224            },
225            CurveVector {
226                x: base_2,
227                y: per_2,
228            },
229            CurveVector {
230                x: base_3,
231                y: per_3,
232            },
233        ];
234
235        let tuple_3 = VectorTuple {
236            values: curve_points_1,
237        };
238
239        let tuples = vec![tuple_2, tuple_1, tuple_3];
240
241        let signature = create_zkplmt(&[], &tuples, 2usize, secret, &mut csprng)
242            .expect("It will never reach here");
243        let result = verify_zkplmt(&[], &tuples, &signature);
244        assert_eq!(result, Err(ZkPlmtError::InvalidProof));
245    }
246
247    #[test]
248    fn test_joint_quicksort() {
249        let mut array = [1, 5, 2, 3, 1, 5];
250        let mut conj = [0, 1, 2, 3, 4, 5];
251        joint_quicksort(&mut array, &mut conj);
252        assert_eq!(array, [1, 1, 2, 3, 5, 5]);
253    }
254
255    #[test]
256    fn test_joint_quicksort_2() {
257        let mut array = [5, 1, 4, 3, 2];
258        let mut conj = [0, 1, 2, 3, 4];
259        let index_of_first = joint_quicksort(&mut array, &mut conj);
260        assert_eq!(array, [1, 2, 3, 4, 5]);
261        assert_eq!(conj, [1, 4, 3, 2, 0]);
262        assert_eq!(index_of_first, 4);
263    }
264}