1#![crate_type = "lib"]
2#![cfg_attr(not(feature = "std"), no_std)]
3
4#[macro_use]
5extern crate alloc;
6
7pub mod bulletproofs;
8pub 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 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}