Avoid overflow in newhope.go. Depending on bittedness of the runner, uint16 * uint16 can overflow an int. There's other computations that can overflow a uint32 as well, so I just made everything uint64 to avoid thinking about it too much. Change-Id: Ia3c976987f39f78285c865a2d7688600d73c2514 Reviewed-on: https://boringssl-review.googlesource.com/8193 Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/test/runner/newhope/newhope.go b/ssl/test/runner/newhope/newhope.go index 36c2c85..8f7a530 100644 --- a/ssl/test/runner/newhope/newhope.go +++ b/ssl/test/runner/newhope/newhope.go
@@ -153,24 +153,24 @@ // details of how this works. func ntt(in *Poly, omega, preScaleBase, postScaleBase, postScale uint16) *Poly { out := new(Poly) - omega_to_the_i := 1 + omega_to_the_i := uint64(1) for i := range out { - omegaToTheIJ := 1 - preScale := int(1) - sum := 0 + omegaToTheIJ := uint64(1) + preScale := uint64(1) + sum := uint64(0) for j := range in { - t := (int(in[j]) * preScale) % q + t := (uint64(in[j]) * preScale) % q sum += (t * omegaToTheIJ) % q omegaToTheIJ = (omegaToTheIJ * omega_to_the_i) % q - preScale = (int(preScaleBase) * preScale) % q + preScale = (uint64(preScaleBase) * preScale) % q } - out[i] = uint16((sum * int(postScale)) % q) + out[i] = uint16((sum * uint64(postScale)) % q) - omega_to_the_i = (omega_to_the_i * int(omega)) % q - postScale = uint16((int(postScale) * int(postScaleBase)) % q) + omega_to_the_i = (omega_to_the_i * uint64(omega)) % q + postScale = uint16((uint64(postScale) * uint64(postScaleBase)) % q) } return out @@ -255,7 +255,7 @@ bFreq := new(Poly) for i := range bFreq { - bFreq[i] = uint16((int(sFreq[i])*int(aFreq[i]) + int(eFreq[i])) % q) + bFreq[i] = uint16((uint64(sFreq[i])*uint64(aFreq[i]) + uint64(eFreq[i])) % q) } offerMsg = encodePoly(bFreq) @@ -279,18 +279,18 @@ uFreq := new(Poly) for i := range uFreq { - uFreq[i] = uint16((int(sPrimeFreq[i])*int(aFreq[i]) + int(ePrimeFreq[i])) % q) + uFreq[i] = uint16((uint64(sPrimeFreq[i])*uint64(aFreq[i]) + uint64(ePrimeFreq[i])) % q) } vFreq := new(Poly) for i := range vFreq { - vFreq[i] = uint16((int(sPrimeFreq[i]) * int(bFreq[i])) % q) + vFreq[i] = uint16((uint64(sPrimeFreq[i]) * uint64(bFreq[i])) % q) } v := inverseNTT(vFreq) ePrimePrime := sampleNoise(rand) for i := range v { - v[i] = uint16((int(v[i]) + int(ePrimePrime[i])) % q) + v[i] = uint16((uint64(v[i]) + uint64(ePrimePrime[i])) % q) } rec := helprec(rand, v) @@ -311,7 +311,7 @@ rec := decodeRec(acceptMsg[encodedPolyLen:]) for i, u := range uFreq { - uFreq[i] = uint16((int(u) * int(sk[i])) % q) + uFreq[i] = uint16((uint64(u) * uint64(sk[i])) % q) } u := inverseNTT(uFreq)