@@ -523,6 +523,14 @@ func (x *Int) TrailingZeroBits() uint {
523
523
// Modular exponentiation of inputs of a particular size is not a
524
524
// cryptographically constant-time operation.
525
525
func (z * Int ) Exp (x , y , m * Int ) * Int {
526
+ return z .exp (x , y , m , false )
527
+ }
528
+
529
+ func (z * Int ) expSlow (x , y , m * Int ) * Int {
530
+ return z .exp (x , y , m , true )
531
+ }
532
+
533
+ func (z * Int ) exp (x , y , m * Int , slow bool ) * Int {
526
534
// See Knuth, volume 2, section 4.6.3.
527
535
xWords := x .abs
528
536
if y .neg {
@@ -546,7 +554,7 @@ func (z *Int) Exp(x, y, m *Int) *Int {
546
554
mWords = m .abs // m.abs may be nil for m == 0
547
555
}
548
556
549
- z .abs = z .abs .expNN (xWords , yWords , mWords )
557
+ z .abs = z .abs .expNN (xWords , yWords , mWords , slow )
550
558
z .neg = len (z .abs ) > 0 && x .neg && len (yWords ) > 0 && yWords [0 ]& 1 == 1 // 0 has no sign
551
559
if z .neg && len (mWords ) > 0 {
552
560
// make modulus result positive
@@ -879,6 +887,11 @@ func (z *Int) ModInverse(g, n *Int) *Int {
879
887
return z
880
888
}
881
889
890
+ func (z nat ) modInverse (g , n nat ) nat {
891
+ // TODO(rsc): ModInverse should be implemented in terms of this function.
892
+ return (& Int {abs : z }).ModInverse (& Int {abs : g }, & Int {abs : n }).abs
893
+ }
894
+
882
895
// Jacobi returns the Jacobi symbol (x/y), either +1, -1, or 0.
883
896
// The y argument must be an odd integer.
884
897
func Jacobi (x , y * Int ) int {
0 commit comments