Skip to content

Commit 2afc27e

Browse files
authored
p521: regen fiat-crypto FieldElement backend (RustCrypto#761)
Regenerates fiat-crypto field arithmetic with: $ ./unsaturated_solinas --lang Rust --inline p521 64 9 '2^521 - 1' This generates all available operations, including "carry" ops for addition, subtraction, and negation. These should provide better performance when `LooseFieldElement` isn't being used (which it won't be when leveraging the generic implementation of the prime order addition formulas in the `primeorder` crate).
1 parent e7a1de3 commit 2afc27e

File tree

3 files changed

+202
-67
lines changed

3 files changed

+202
-67
lines changed

p521/src/arithmetic/field.rs

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -167,49 +167,59 @@ impl FieldElement {
167167
}
168168

169169
/// Add elements.
170-
pub(crate) const fn add(&self, rhs: &Self) -> LooseFieldElement {
170+
#[allow(dead_code)] // TODO(tarcieri): use this
171+
pub(crate) const fn add_loose(&self, rhs: &Self) -> LooseFieldElement {
171172
LooseFieldElement(fiat_p521_add(&self.0, &rhs.0))
172173
}
173174

174-
/// Subtract elements.
175-
pub(crate) const fn sub(&self, rhs: &Self) -> LooseFieldElement {
175+
/// Double element (add it to itself).
176+
#[allow(dead_code)] // TODO(tarcieri): use this
177+
#[must_use]
178+
pub(crate) const fn double_loose(&self) -> LooseFieldElement {
179+
Self::add_loose(self, self)
180+
}
181+
182+
/// Subtract elements, returning a loose field element.
183+
#[allow(dead_code)] // TODO(tarcieri): use this
184+
pub(crate) const fn sub_loose(&self, rhs: &Self) -> LooseFieldElement {
176185
LooseFieldElement(fiat_p521_sub(&self.0, &rhs.0))
177186
}
178187

179-
/// Negate element.
180-
pub(crate) const fn neg(&self) -> LooseFieldElement {
188+
/// Negate element, returning a loose field element.
189+
#[allow(dead_code)] // TODO(tarcieri): use this
190+
pub(crate) const fn neg_loose(&self) -> LooseFieldElement {
181191
LooseFieldElement(fiat_p521_opp(&self.0))
182192
}
183193

184-
/// Add elements and carry.
185-
pub const fn add_carry(&self, rhs: &Self) -> Self {
186-
self.add(rhs).carry()
194+
/// Add two field elements.
195+
pub const fn add(&self, rhs: &Self) -> Self {
196+
Self(fiat_p521_carry_add(&self.0, &rhs.0))
187197
}
188198

189-
/// Subtract elements and carry.
190-
pub const fn sub_carry(&self, rhs: &Self) -> Self {
191-
self.sub(rhs).carry()
199+
/// Subtract field elements.
200+
pub const fn sub(&self, rhs: &Self) -> Self {
201+
Self(fiat_p521_carry_sub(&self.0, &rhs.0))
192202
}
193203

194-
/// Negate element and carry.
195-
pub const fn neg_carry(&self) -> Self {
196-
self.neg().carry()
204+
/// Negate element.
205+
pub const fn neg(&self) -> Self {
206+
Self(fiat_p521_carry_opp(&self.0))
197207
}
198208

199209
/// Double element (add it to itself).
200210
#[must_use]
201211
pub const fn double(&self) -> Self {
202-
self.add_carry(self)
212+
self.add(self)
203213
}
204214

205215
/// Multiply elements.
206-
pub const fn multiply(&self, rhs: &Self) -> Self {
207-
self.relax().carry_mul(&rhs.relax())
216+
pub const fn mul(&self, rhs: &Self) -> Self {
217+
LooseFieldElement::mul(&self.relax(), &rhs.relax())
208218
}
209219

210220
/// Square element.
211221
pub const fn square(&self) -> Self {
212-
self.relax().carry_square()
222+
self.relax().square()
213223
}
214224

215225
/// Returns `self^exp`, where `exp` is a little-endian integer exponent.
@@ -230,7 +240,7 @@ impl FieldElement {
230240
res = res.square();
231241

232242
if ((exp[i] >> j) & 1) == 1 {
233-
res = res.multiply(self);
243+
res = Self::mul(&res, self);
234244
}
235245
}
236246
}
@@ -393,7 +403,7 @@ impl Add for FieldElement {
393403

394404
#[inline]
395405
fn add(self, rhs: FieldElement) -> FieldElement {
396-
self.add_carry(&rhs)
406+
Self::add(&self, &rhs)
397407
}
398408
}
399409

@@ -402,7 +412,7 @@ impl Add<&FieldElement> for FieldElement {
402412

403413
#[inline]
404414
fn add(self, rhs: &FieldElement) -> FieldElement {
405-
self.add_carry(rhs)
415+
Self::add(&self, rhs)
406416
}
407417
}
408418

@@ -411,7 +421,7 @@ impl Add<&FieldElement> for &FieldElement {
411421

412422
#[inline]
413423
fn add(self, rhs: &FieldElement) -> FieldElement {
414-
self.add_carry(rhs)
424+
FieldElement::add(self, rhs)
415425
}
416426
}
417427

@@ -434,7 +444,7 @@ impl Sub for FieldElement {
434444

435445
#[inline]
436446
fn sub(self, rhs: FieldElement) -> FieldElement {
437-
self.sub_carry(&rhs)
447+
Self::sub(&self, &rhs)
438448
}
439449
}
440450

@@ -443,7 +453,7 @@ impl Sub<&FieldElement> for FieldElement {
443453

444454
#[inline]
445455
fn sub(self, rhs: &FieldElement) -> FieldElement {
446-
self.sub_carry(rhs)
456+
Self::sub(&self, rhs)
447457
}
448458
}
449459

@@ -452,7 +462,7 @@ impl Sub<&FieldElement> for &FieldElement {
452462

453463
#[inline]
454464
fn sub(self, rhs: &FieldElement) -> FieldElement {
455-
self.sub_carry(rhs)
465+
FieldElement::sub(self, rhs)
456466
}
457467
}
458468

@@ -475,7 +485,7 @@ impl Mul for FieldElement {
475485

476486
#[inline]
477487
fn mul(self, rhs: FieldElement) -> FieldElement {
478-
self.relax().carry_mul(&rhs.relax())
488+
self.relax().mul(&rhs.relax())
479489
}
480490
}
481491

@@ -484,7 +494,7 @@ impl Mul<&FieldElement> for FieldElement {
484494

485495
#[inline]
486496
fn mul(self, rhs: &FieldElement) -> FieldElement {
487-
self.relax().carry_mul(&rhs.relax())
497+
self.relax().mul(&rhs.relax())
488498
}
489499
}
490500

@@ -493,7 +503,7 @@ impl Mul<&FieldElement> for &FieldElement {
493503

494504
#[inline]
495505
fn mul(self, rhs: &FieldElement) -> FieldElement {
496-
self.relax().carry_mul(&rhs.relax())
506+
self.relax().mul(&rhs.relax())
497507
}
498508
}
499509

@@ -516,7 +526,7 @@ impl Neg for FieldElement {
516526

517527
#[inline]
518528
fn neg(self) -> FieldElement {
519-
self.neg_carry()
529+
Self::neg(&self)
520530
}
521531
}
522532

p521/src/arithmetic/field/loose.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ impl LooseFieldElement {
1111
}
1212

1313
/// Multiplies two field elements and reduces the result.
14-
pub(crate) const fn carry_mul(&self, rhs: &Self) -> FieldElement {
14+
pub(crate) const fn mul(&self, rhs: &Self) -> FieldElement {
1515
FieldElement(fiat_p521_carry_mul(&self.0, &rhs.0))
1616
}
1717

1818
/// Squares a field element and reduces the result.
19-
pub(crate) const fn carry_square(&self) -> FieldElement {
19+
pub(crate) const fn square(&self) -> FieldElement {
2020
FieldElement(fiat_p521_carry_square(&self.0))
2121
}
2222
}
@@ -54,7 +54,7 @@ impl Mul for LooseFieldElement {
5454

5555
#[inline]
5656
fn mul(self, rhs: LooseFieldElement) -> FieldElement {
57-
self.carry_mul(&rhs)
57+
Self::mul(&self, &rhs)
5858
}
5959
}
6060

@@ -63,7 +63,7 @@ impl Mul<&LooseFieldElement> for LooseFieldElement {
6363

6464
#[inline]
6565
fn mul(self, rhs: &LooseFieldElement) -> FieldElement {
66-
self.carry_mul(rhs)
66+
Self::mul(&self, rhs)
6767
}
6868
}
6969

@@ -72,6 +72,6 @@ impl Mul<&LooseFieldElement> for &LooseFieldElement {
7272

7373
#[inline]
7474
fn mul(self, rhs: &LooseFieldElement) -> FieldElement {
75-
self.carry_mul(rhs)
75+
LooseFieldElement::mul(self, rhs)
7676
}
7777
}

0 commit comments

Comments
 (0)