ark_vrf/suites/
bandersnatch_sw.rs1use crate::{pedersen::PedersenSuite, utils::te_sw_map::*, *};
49use ark_ff::MontFp;
50
51#[derive(Debug, Copy, Clone, PartialEq, Eq)]
52pub struct BandersnatchSha512Tai;
53
54type ThisSuite = BandersnatchSha512Tai;
55
56impl Suite for ThisSuite {
57 const SUITE_ID: &'static [u8] = b"Bandersnatch-SW-SHA512-TAI-v1";
58 type Affine = ark_ed_on_bls12_381_bandersnatch::SWAffine;
59 type Transcript = utils::HashTranscript<sha2::Sha512>;
60}
61
62impl PedersenSuite for ThisSuite {
63 const BLINDING_BASE: AffinePoint = {
64 const X: BaseField = MontFp!(
65 "28115362618644671219696075022370511395136332234538034358311199318506963235315"
66 );
67 const Y: BaseField =
68 MontFp!("3900851469868158154936962463930962496000252801946757953905982128670530185313");
69 AffinePoint::new_unchecked(X, Y)
70 };
71}
72
73suite_types!(ThisSuite);
74
75#[cfg(feature = "ring")]
76impl crate::ring::RingSuite for ThisSuite {
77 type Pairing = ark_bls12_381::Bls12_381;
78
79 const ACCUMULATOR_BASE: AffinePoint = {
80 const X: BaseField = MontFp!(
81 "13189182432637108534251278524663360416811744717379968387043749958796254980045"
82 );
83 const Y: BaseField = MontFp!(
84 "14483286006782706188671626508232161325054303360192563232232823772738911894793"
85 );
86 AffinePoint::new_unchecked(X, Y)
87 };
88
89 const PADDING: AffinePoint = {
90 const X: BaseField = MontFp!(
91 "20496180070424734470560955314776462366297546779079302509428101119888111900885"
92 );
93 const Y: BaseField =
94 MontFp!("8839106592405352067483360946162273985142890146060814748321063063028225641813");
95 AffinePoint::new_unchecked(X, Y)
96 };
97}
98
99#[cfg(feature = "ring")]
100ring_suite_types!(ThisSuite);
101
102impl MapConfig for ark_ed_on_bls12_381_bandersnatch::BandersnatchConfig {
109 const MONT_A_OVER_THREE: ark_ed_on_bls12_381_bandersnatch::Fq =
110 MontFp!("9992940898322946442093665462003920523391277922024982836398934612730118446984");
111 const MONT_B_INV: ark_ed_on_bls12_381_bandersnatch::Fq =
112 MontFp!("41180284393978236561320365279764246793818536543197771097409483252169927600582");
113}
114
115#[cfg(test)]
116mod tests {
117 use super::*;
118 use crate::{testing, tiny_suite_tests};
119 use ark_ed_on_bls12_381_bandersnatch::{BandersnatchConfig, SWAffine};
120
121 impl crate::testing::SuiteExt for ThisSuite {
122 const SUITE_NAME: &str = "bandersnatch_sw_sha-512_tai";
123 }
124
125 tiny_suite_tests!(ThisSuite);
126 pedersen_suite_tests!(ThisSuite);
127 thin_suite_tests!(ThisSuite);
128
129 #[cfg(feature = "ring")]
130 ring_suite_tests!(ThisSuite);
131
132 #[cfg(feature = "ring")]
133 impl crate::ring::testing::RingSuiteExt for ThisSuite {
134 const SRS_FILE: &str = crate::testing::BLS12_381_PCS_SRS_FILE;
135
136 fn ring_setup() -> &'static RingSetup {
137 use std::sync::OnceLock;
138 static RING_SETUP: OnceLock<RingSetup> = OnceLock::new();
139 RING_SETUP.get_or_init(Self::load_ring_setup)
140 }
141 }
142
143 #[test]
144 fn sw_to_te_roundtrip() {
145 let roundtrip = |org_point| {
146 let te_point = sw_to_te::<BandersnatchConfig>(&org_point).unwrap();
147 assert!(te_point.is_on_curve());
148 let sw_point = te_to_sw::<BandersnatchConfig>(&te_point).unwrap();
149 assert!(sw_point.is_on_curve());
150 assert_eq!(org_point, sw_point);
151 };
152 roundtrip(testing::random_val::<SWAffine>(None));
153 roundtrip(AffinePoint::generator());
154 }
155
156 #[test]
157 fn identity_point_rejected() {
158 use ark_ed_on_bls12_381_bandersnatch::EdwardsAffine;
159
160 let sw_identity = SWAffine::zero();
162 assert!(sw_to_te::<BandersnatchConfig>(&sw_identity).is_none());
163 assert!(<SWAffine as TEMapping<BandersnatchConfig>>::into_te(sw_identity).is_none());
164
165 let te_identity = EdwardsAffine::zero();
167 assert!(te_to_sw::<BandersnatchConfig>(&te_identity).is_none());
168 assert!(<EdwardsAffine as SWMapping<BandersnatchConfig>>::into_sw(te_identity).is_none());
169 }
170
171 #[cfg(feature = "ring")]
172 #[test]
173 fn identity_in_ring_rejected() {
174 use crate::ring::{RingSetup, testing::TEST_RING_SIZE};
175
176 let rng = &mut ark_std::test_rng();
177 let ring_setup = RingSetup::<ThisSuite>::from_rand(TEST_RING_SIZE, rng);
178
179 let mut pks = testing::random_vec::<AffinePoint>(TEST_RING_SIZE, Some(rng));
180 pks[0] = AffinePoint::zero();
181
182 assert!(ring_setup.prover_key(&pks).is_err());
183 assert!(ring_setup.verifier_key(&pks).is_err());
184 }
185}