Auto merge of #79 - ebfull:nomorenightly, r=ebfull
Remove feature(i128_type) The `i128_type` feature was recently stabilized in Rust, so this is unnecessary now for nightly users. In fact, in a few days there should be a new Rust beta (`1.26`) containing stable support for `i128_type`, meaning that (for Zcash) we can switch to the beta compiler for all future Rust development, and even switch to the stable compiler in six weeks when that's released.
This commit is contained in:
commit
dbe897d365
@ -2,7 +2,7 @@
|
|||||||
name = "pairing"
|
name = "pairing"
|
||||||
|
|
||||||
# Remember to change version string in README.md.
|
# Remember to change version string in README.md.
|
||||||
version = "0.14.0"
|
version = "0.14.1"
|
||||||
authors = ["Sean Bowe <ewillbefull@gmail.com>"]
|
authors = ["Sean Bowe <ewillbefull@gmail.com>"]
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
|
|
||||||
@ -14,7 +14,7 @@ repository = "https://github.com/ebfull/pairing"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
rand = "0.4"
|
rand = "0.4"
|
||||||
byteorder = "1"
|
byteorder = "1"
|
||||||
clippy = { version = "0.0.186", optional = true }
|
clippy = { version = "0.0.190", optional = true }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
unstable-features = ["expose-arith"]
|
unstable-features = ["expose-arith"]
|
||||||
|
@ -2135,15 +2135,14 @@ fn test_fq_repr_sub_noborrow() {
|
|||||||
0x7c0577a26f59d5,
|
0x7c0577a26f59d5,
|
||||||
]));
|
]));
|
||||||
assert!(
|
assert!(
|
||||||
t
|
t == FqRepr([
|
||||||
== FqRepr([
|
0x40a12b8967c54bae,
|
||||||
0x40a12b8967c54bae,
|
0xdeae37a0837d0d7b,
|
||||||
0xdeae37a0837d0d7b,
|
0xe592c487bae374e,
|
||||||
0xe592c487bae374e,
|
0xaf26bbc934462a61,
|
||||||
0xaf26bbc934462a61,
|
0x32d6cc6e2b7a4a03,
|
||||||
0x32d6cc6e2b7a4a03,
|
0xcdaf23e091c0313
|
||||||
0xcdaf23e091c0313
|
])
|
||||||
])
|
|
||||||
);
|
);
|
||||||
|
|
||||||
for _ in 0..1000 {
|
for _ in 0..1000 {
|
||||||
@ -2223,15 +2222,14 @@ fn test_fq_repr_add_nocarry() {
|
|||||||
0x7c0577a26f59d5,
|
0x7c0577a26f59d5,
|
||||||
]));
|
]));
|
||||||
assert!(
|
assert!(
|
||||||
t
|
t == FqRepr([
|
||||||
== FqRepr([
|
0xcfae1db798be8c04,
|
||||||
0xcfae1db798be8c04,
|
0x999906db15a10d5a,
|
||||||
0x999906db15a10d5a,
|
0x270fa8d9defc6f79,
|
||||||
0x270fa8d9defc6f79,
|
0x83abb199c240f7b6,
|
||||||
0x83abb199c240f7b6,
|
0x27469abae93e1ff6,
|
||||||
0x27469abae93e1ff6,
|
0xdd2fd2d4dfab6be
|
||||||
0xdd2fd2d4dfab6be
|
])
|
||||||
])
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Test for the associativity of addition.
|
// Test for the associativity of addition.
|
||||||
@ -2575,15 +2573,14 @@ fn test_fq_mul_assign() {
|
|||||||
0x1162b680fb8e9566,
|
0x1162b680fb8e9566,
|
||||||
])));
|
])));
|
||||||
assert!(
|
assert!(
|
||||||
tmp
|
tmp == Fq(FqRepr([
|
||||||
== Fq(FqRepr([
|
0x9dc4000001ebfe14,
|
||||||
0x9dc4000001ebfe14,
|
0x2850078997b00193,
|
||||||
0x2850078997b00193,
|
0xa8197f1abb4d7bf,
|
||||||
0xa8197f1abb4d7bf,
|
0xc0309573f4bfe871,
|
||||||
0xc0309573f4bfe871,
|
0xf48d0923ffaf7620,
|
||||||
0xf48d0923ffaf7620,
|
0x11d4b58c7a926e66
|
||||||
0x11d4b58c7a926e66
|
]))
|
||||||
]))
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut rng = XorShiftRng::from_seed([0x5dbe6259, 0x8d313d76, 0x3237db17, 0xe5bc0654]);
|
let mut rng = XorShiftRng::from_seed([0x5dbe6259, 0x8d313d76, 0x3237db17, 0xe5bc0654]);
|
||||||
|
@ -849,13 +849,12 @@ fn test_fr_repr_sub_noborrow() {
|
|||||||
0x298a30c744b31acf,
|
0x298a30c744b31acf,
|
||||||
]));
|
]));
|
||||||
assert!(
|
assert!(
|
||||||
t
|
t == FrRepr([
|
||||||
== FrRepr([
|
0xb813415048991c1f,
|
||||||
0xb813415048991c1f,
|
0x10ad07ae88725d92,
|
||||||
0x10ad07ae88725d92,
|
0x5a7b851271759961,
|
||||||
0x5a7b851271759961,
|
0x36850eedd30c39c5
|
||||||
0x36850eedd30c39c5
|
])
|
||||||
])
|
|
||||||
);
|
);
|
||||||
|
|
||||||
for _ in 0..1000 {
|
for _ in 0..1000 {
|
||||||
@ -1252,13 +1251,12 @@ fn test_fr_mul_assign() {
|
|||||||
0x5ae3f03b561a841d,
|
0x5ae3f03b561a841d,
|
||||||
])));
|
])));
|
||||||
assert!(
|
assert!(
|
||||||
tmp
|
tmp == Fr(FrRepr([
|
||||||
== Fr(FrRepr([
|
0x23717213ce710f71,
|
||||||
0x23717213ce710f71,
|
0xdbee1fe53a16e1af,
|
||||||
0xdbee1fe53a16e1af,
|
0xf565d3e1c2a48000,
|
||||||
0xf565d3e1c2a48000,
|
0x4426507ee75df9d7
|
||||||
0x4426507ee75df9d7
|
]))
|
||||||
]))
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut rng = XorShiftRng::from_seed([0x5dbe6259, 0x8d313d76, 0x3237db17, 0xe5bc0654]);
|
let mut rng = XorShiftRng::from_seed([0x5dbe6259, 0x8d313d76, 0x3237db17, 0xe5bc0654]);
|
||||||
|
@ -350,7 +350,7 @@ impl G2Prepared {
|
|||||||
coeffs.push(doubling_step(&mut r));
|
coeffs.push(doubling_step(&mut r));
|
||||||
|
|
||||||
G2Prepared {
|
G2Prepared {
|
||||||
coeffs: coeffs,
|
coeffs,
|
||||||
infinity: false,
|
infinity: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
84
src/lib.rs
84
src/lib.rs
@ -1,6 +1,3 @@
|
|||||||
// If the "u128-support" feature is enabled, this library can use
|
|
||||||
// more efficient arithmetic. Only available in the nightly compiler.
|
|
||||||
#![cfg_attr(feature = "u128-support", feature(i128_type))]
|
|
||||||
// `clippy` is a code linting tool for improving code quality by catching
|
// `clippy` is a code linting tool for improving code quality by catching
|
||||||
// common mistakes or strange code patterns. If the `clippy` feature is
|
// common mistakes or strange code patterns. If the `clippy` feature is
|
||||||
// provided, it is enabled and all compiler warnings are prohibited.
|
// provided, it is enabled and all compiler warnings are prohibited.
|
||||||
@ -39,42 +36,42 @@ pub trait Engine: Sized + 'static + Clone {
|
|||||||
|
|
||||||
/// The projective representation of an element in G1.
|
/// The projective representation of an element in G1.
|
||||||
type G1: CurveProjective<
|
type G1: CurveProjective<
|
||||||
Engine = Self,
|
Engine = Self,
|
||||||
Base = Self::Fq,
|
Base = Self::Fq,
|
||||||
Scalar = Self::Fr,
|
Scalar = Self::Fr,
|
||||||
Affine = Self::G1Affine,
|
Affine = Self::G1Affine,
|
||||||
>
|
>
|
||||||
+ From<Self::G1Affine>;
|
+ From<Self::G1Affine>;
|
||||||
|
|
||||||
/// The affine representation of an element in G1.
|
/// The affine representation of an element in G1.
|
||||||
type G1Affine: CurveAffine<
|
type G1Affine: CurveAffine<
|
||||||
Engine = Self,
|
Engine = Self,
|
||||||
Base = Self::Fq,
|
Base = Self::Fq,
|
||||||
Scalar = Self::Fr,
|
Scalar = Self::Fr,
|
||||||
Projective = Self::G1,
|
Projective = Self::G1,
|
||||||
Pair = Self::G2Affine,
|
Pair = Self::G2Affine,
|
||||||
PairingResult = Self::Fqk,
|
PairingResult = Self::Fqk,
|
||||||
>
|
>
|
||||||
+ From<Self::G1>;
|
+ From<Self::G1>;
|
||||||
|
|
||||||
/// The projective representation of an element in G2.
|
/// The projective representation of an element in G2.
|
||||||
type G2: CurveProjective<
|
type G2: CurveProjective<
|
||||||
Engine = Self,
|
Engine = Self,
|
||||||
Base = Self::Fqe,
|
Base = Self::Fqe,
|
||||||
Scalar = Self::Fr,
|
Scalar = Self::Fr,
|
||||||
Affine = Self::G2Affine,
|
Affine = Self::G2Affine,
|
||||||
>
|
>
|
||||||
+ From<Self::G2Affine>;
|
+ From<Self::G2Affine>;
|
||||||
|
|
||||||
/// The affine representation of an element in G2.
|
/// The affine representation of an element in G2.
|
||||||
type G2Affine: CurveAffine<
|
type G2Affine: CurveAffine<
|
||||||
Engine = Self,
|
Engine = Self,
|
||||||
Base = Self::Fqe,
|
Base = Self::Fqe,
|
||||||
Scalar = Self::Fr,
|
Scalar = Self::Fr,
|
||||||
Projective = Self::G2,
|
Projective = Self::G2,
|
||||||
Pair = Self::G1Affine,
|
Pair = Self::G1Affine,
|
||||||
PairingResult = Self::Fqk,
|
PairingResult = Self::Fqk,
|
||||||
>
|
>
|
||||||
+ From<Self::G2>;
|
+ From<Self::G2>;
|
||||||
|
|
||||||
/// The base field that hosts G1.
|
/// The base field that hosts G1.
|
||||||
@ -113,8 +110,8 @@ pub trait Engine: Sized + 'static + Clone {
|
|||||||
|
|
||||||
/// Projective representation of an elliptic curve point guaranteed to be
|
/// Projective representation of an elliptic curve point guaranteed to be
|
||||||
/// in the correct prime order subgroup.
|
/// in the correct prime order subgroup.
|
||||||
pub trait CurveProjective
|
pub trait CurveProjective:
|
||||||
: PartialEq
|
PartialEq
|
||||||
+ Eq
|
+ Eq
|
||||||
+ Sized
|
+ Sized
|
||||||
+ Copy
|
+ Copy
|
||||||
@ -124,7 +121,8 @@ pub trait CurveProjective
|
|||||||
+ fmt::Debug
|
+ fmt::Debug
|
||||||
+ fmt::Display
|
+ fmt::Display
|
||||||
+ rand::Rand
|
+ rand::Rand
|
||||||
+ 'static {
|
+ 'static
|
||||||
|
{
|
||||||
type Engine: Engine<Fr = Self::Scalar>;
|
type Engine: Engine<Fr = Self::Scalar>;
|
||||||
type Scalar: PrimeField + SqrtField;
|
type Scalar: PrimeField + SqrtField;
|
||||||
type Base: SqrtField;
|
type Base: SqrtField;
|
||||||
@ -183,9 +181,9 @@ pub trait CurveProjective
|
|||||||
|
|
||||||
/// Affine representation of an elliptic curve point guaranteed to be
|
/// Affine representation of an elliptic curve point guaranteed to be
|
||||||
/// in the correct prime order subgroup.
|
/// in the correct prime order subgroup.
|
||||||
pub trait CurveAffine
|
pub trait CurveAffine:
|
||||||
: Copy + Clone + Sized + Send + Sync + fmt::Debug + fmt::Display + PartialEq + Eq + 'static
|
Copy + Clone + Sized + Send + Sync + fmt::Debug + fmt::Display + PartialEq + Eq + 'static
|
||||||
{
|
{
|
||||||
type Engine: Engine<Fr = Self::Scalar>;
|
type Engine: Engine<Fr = Self::Scalar>;
|
||||||
type Scalar: PrimeField + SqrtField;
|
type Scalar: PrimeField + SqrtField;
|
||||||
type Base: SqrtField;
|
type Base: SqrtField;
|
||||||
@ -235,8 +233,9 @@ pub trait CurveAffine
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// An encoded elliptic curve point, which should essentially wrap a `[u8; N]`.
|
/// An encoded elliptic curve point, which should essentially wrap a `[u8; N]`.
|
||||||
pub trait EncodedPoint
|
pub trait EncodedPoint:
|
||||||
: Sized + Send + Sync + AsRef<[u8]> + AsMut<[u8]> + Clone + Copy + 'static {
|
Sized + Send + Sync + AsRef<[u8]> + AsMut<[u8]> + Clone + Copy + 'static
|
||||||
|
{
|
||||||
type Affine: CurveAffine;
|
type Affine: CurveAffine;
|
||||||
|
|
||||||
/// Creates an empty representation.
|
/// Creates an empty representation.
|
||||||
@ -264,9 +263,9 @@ pub trait EncodedPoint
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// This trait represents an element of a field.
|
/// This trait represents an element of a field.
|
||||||
pub trait Field
|
pub trait Field:
|
||||||
: Sized + Eq + Copy + Clone + Send + Sync + fmt::Debug + fmt::Display + 'static + rand::Rand
|
Sized + Eq + Copy + Clone + Send + Sync + fmt::Debug + fmt::Display + 'static + rand::Rand
|
||||||
{
|
{
|
||||||
/// Returns the zero element of the field, the additive identity.
|
/// Returns the zero element of the field, the additive identity.
|
||||||
fn zero() -> Self;
|
fn zero() -> Self;
|
||||||
|
|
||||||
@ -337,8 +336,8 @@ pub trait SqrtField: Field {
|
|||||||
/// This trait represents a wrapper around a biginteger which can encode any element of a particular
|
/// This trait represents a wrapper around a biginteger which can encode any element of a particular
|
||||||
/// prime field. It is a smart wrapper around a sequence of `u64` limbs, least-significant digit
|
/// prime field. It is a smart wrapper around a sequence of `u64` limbs, least-significant digit
|
||||||
/// first.
|
/// first.
|
||||||
pub trait PrimeFieldRepr
|
pub trait PrimeFieldRepr:
|
||||||
: Sized
|
Sized
|
||||||
+ Copy
|
+ Copy
|
||||||
+ Clone
|
+ Clone
|
||||||
+ Eq
|
+ Eq
|
||||||
@ -352,7 +351,8 @@ pub trait PrimeFieldRepr
|
|||||||
+ rand::Rand
|
+ rand::Rand
|
||||||
+ AsRef<[u64]>
|
+ AsRef<[u64]>
|
||||||
+ AsMut<[u64]>
|
+ AsMut<[u64]>
|
||||||
+ From<u64> {
|
+ From<u64>
|
||||||
|
{
|
||||||
/// Subtract another represetation from this one.
|
/// Subtract another represetation from this one.
|
||||||
fn sub_noborrow(&mut self, other: &Self);
|
fn sub_noborrow(&mut self, other: &Self);
|
||||||
|
|
||||||
@ -566,7 +566,7 @@ impl<E: AsRef<[u64]>> BitIterator<E> {
|
|||||||
pub fn new(t: E) -> Self {
|
pub fn new(t: E) -> Self {
|
||||||
let n = t.as_ref().len() * 64;
|
let n = t.as_ref().len() * 64;
|
||||||
|
|
||||||
BitIterator { t: t, n: n }
|
BitIterator { t, n }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ impl<G: CurveProjective> Wnaf<(), Vec<G>, Vec<i64>> {
|
|||||||
Wnaf {
|
Wnaf {
|
||||||
base: &self.base[..],
|
base: &self.base[..],
|
||||||
scalar: &mut self.scalar,
|
scalar: &mut self.scalar,
|
||||||
window_size: window_size,
|
window_size,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ impl<G: CurveProjective> Wnaf<(), Vec<G>, Vec<i64>> {
|
|||||||
Wnaf {
|
Wnaf {
|
||||||
base: &mut self.base,
|
base: &mut self.base,
|
||||||
scalar: &self.scalar[..],
|
scalar: &self.scalar[..],
|
||||||
window_size: window_size,
|
window_size,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user