mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-08 12:19:24 +00:00
48 lines
1.4 KiB
Rust
48 lines
1.4 KiB
Rust
|
|
use rand_core::OsRng;
|
||
|
|
|
||
|
|
use ff::{Field, PrimeField};
|
||
|
|
|
||
|
|
use k256::Scalar as K256Scalar;
|
||
|
|
use dalek_ff_group::Scalar as DalekScalar;
|
||
|
|
|
||
|
|
use crate::cross_group::scalar::{scalar_normalize, scalar_convert};
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_scalar() {
|
||
|
|
assert_eq!(
|
||
|
|
scalar_normalize::<_, DalekScalar>(K256Scalar::zero()),
|
||
|
|
(K256Scalar::zero(), DalekScalar::zero())
|
||
|
|
);
|
||
|
|
|
||
|
|
assert_eq!(
|
||
|
|
scalar_normalize::<_, DalekScalar>(K256Scalar::one()),
|
||
|
|
(K256Scalar::one(), DalekScalar::one())
|
||
|
|
);
|
||
|
|
|
||
|
|
let mut initial;
|
||
|
|
while {
|
||
|
|
initial = K256Scalar::random(&mut OsRng);
|
||
|
|
let (k, ed) = scalar_normalize::<_, DalekScalar>(initial);
|
||
|
|
|
||
|
|
// The initial scalar should equal the new scalar with Ed25519's capacity
|
||
|
|
let mut initial_bytes = (&initial.to_repr()).to_vec();
|
||
|
|
// Drop the first 4 bits to hit 252
|
||
|
|
initial_bytes[0] = initial_bytes[0] & 0b00001111;
|
||
|
|
let k_bytes = (&k.to_repr()).to_vec();
|
||
|
|
assert_eq!(initial_bytes, k_bytes);
|
||
|
|
|
||
|
|
let mut ed_bytes = ed.to_repr().as_ref().to_vec();
|
||
|
|
// Reverse to big endian
|
||
|
|
ed_bytes.reverse();
|
||
|
|
assert_eq!(k_bytes, ed_bytes);
|
||
|
|
|
||
|
|
// Verify conversion works as expected
|
||
|
|
assert_eq!(scalar_convert::<_, DalekScalar>(k), Some(ed));
|
||
|
|
|
||
|
|
// Run this test again if this secp256k1 scalar didn't have any bits cleared
|
||
|
|
initial == k
|
||
|
|
} {}
|
||
|
|
// Verify conversion returns None when the scalar isn't mutually valid
|
||
|
|
assert!(scalar_convert::<_, DalekScalar>(initial).is_none());
|
||
|
|
}
|