use crate::{pedersen::PedersenSuite, utils::te_sw_map::*, *};
use ark_ff::MontFp;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct BandersnatchSha512Tai;
type ThisSuite = BandersnatchSha512Tai;
impl Suite for ThisSuite {
const SUITE_ID: &'static [u8] = b"Bandersnatch-SW-SHA512-TAI-v1";
type Affine = ark_ed_on_bls12_381_bandersnatch::SWAffine;
type Transcript = utils::HashTranscript<sha2::Sha512>;
}
impl PedersenSuite for ThisSuite {
const BLINDING_BASE: AffinePoint = {
const X: BaseField = MontFp!(
"28115362618644671219696075022370511395136332234538034358311199318506963235315"
);
const Y: BaseField =
MontFp!("3900851469868158154936962463930962496000252801946757953905982128670530185313");
AffinePoint::new_unchecked(X, Y)
};
}
suite_types!(ThisSuite);
#[cfg(feature = "ring")]
impl crate::ring::RingSuite for ThisSuite {
type Pairing = ark_bls12_381::Bls12_381;
const ACCUMULATOR_BASE: AffinePoint = {
const X: BaseField = MontFp!(
"13189182432637108534251278524663360416811744717379968387043749958796254980045"
);
const Y: BaseField = MontFp!(
"14483286006782706188671626508232161325054303360192563232232823772738911894793"
);
AffinePoint::new_unchecked(X, Y)
};
const PADDING: AffinePoint = {
const X: BaseField = MontFp!(
"20496180070424734470560955314776462366297546779079302509428101119888111900885"
);
const Y: BaseField =
MontFp!("8839106592405352067483360946162273985142890146060814748321063063028225641813");
AffinePoint::new_unchecked(X, Y)
};
}
#[cfg(feature = "ring")]
ring_suite_types!(ThisSuite);
impl MapConfig for ark_ed_on_bls12_381_bandersnatch::BandersnatchConfig {
const MONT_A_OVER_THREE: ark_ed_on_bls12_381_bandersnatch::Fq =
MontFp!("9992940898322946442093665462003920523391277922024982836398934612730118446984");
const MONT_B_INV: ark_ed_on_bls12_381_bandersnatch::Fq =
MontFp!("41180284393978236561320365279764246793818536543197771097409483252169927600582");
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{testing, tiny_suite_tests};
use ark_ed_on_bls12_381_bandersnatch::{BandersnatchConfig, SWAffine};
impl crate::testing::SuiteExt for ThisSuite {
const SUITE_NAME: &str = "bandersnatch_sw_sha-512_tai";
}
tiny_suite_tests!(ThisSuite);
pedersen_suite_tests!(ThisSuite);
thin_suite_tests!(ThisSuite);
#[cfg(feature = "ring")]
ring_suite_tests!(ThisSuite);
#[cfg(feature = "ring")]
impl crate::ring::testing::RingSuiteExt for ThisSuite {
const SRS_FILE: &str = crate::testing::BLS12_381_PCS_SRS_FILE;
fn ring_setup() -> &'static RingSetup {
use std::sync::OnceLock;
static RING_SETUP: OnceLock<RingSetup> = OnceLock::new();
RING_SETUP.get_or_init(Self::load_ring_setup)
}
}
#[test]
fn sw_to_te_roundtrip() {
let roundtrip = |org_point| {
let te_point = sw_to_te::<BandersnatchConfig>(&org_point).unwrap();
assert!(te_point.is_on_curve());
let sw_point = te_to_sw::<BandersnatchConfig>(&te_point).unwrap();
assert!(sw_point.is_on_curve());
assert_eq!(org_point, sw_point);
};
roundtrip(testing::random_val::<SWAffine>(None));
roundtrip(AffinePoint::generator());
}
#[test]
fn identity_point_rejected() {
use ark_ed_on_bls12_381_bandersnatch::EdwardsAffine;
let sw_identity = SWAffine::zero();
assert!(sw_to_te::<BandersnatchConfig>(&sw_identity).is_none());
assert!(<SWAffine as TEMapping<BandersnatchConfig>>::into_te(sw_identity).is_none());
let te_identity = EdwardsAffine::zero();
assert!(te_to_sw::<BandersnatchConfig>(&te_identity).is_none());
assert!(<EdwardsAffine as SWMapping<BandersnatchConfig>>::into_sw(te_identity).is_none());
}
#[cfg(feature = "ring")]
#[test]
fn identity_in_ring_rejected() {
use crate::ring::{RingSetup, testing::TEST_RING_SIZE};
let rng = &mut ark_std::test_rng();
let ring_setup = RingSetup::<ThisSuite>::from_rand(TEST_RING_SIZE, rng);
let mut pks = testing::random_vec::<AffinePoint>(TEST_RING_SIZE, Some(rng));
pks[0] = AffinePoint::zero();
assert!(ring_setup.prover_key(&pks).is_err());
assert!(ring_setup.verifier_key(&pks).is_err());
}
}