Fix check_bn_tests.go. Go and OpenSSL disagree on 0^-1 (mod 1). Also if the input is ill-formed and there is no inverse, report an error rather than crashing. Change-Id: Id5b0b70cd7498e0c7526ec6a7bc5480cd9718f41 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/39044 Reviewed-by: Adam Langley <agl@google.com> Commit-Queue: Adam Langley <agl@google.com>
diff --git a/crypto/fipsmodule/bn/check_bn_tests.go b/crypto/fipsmodule/bn/check_bn_tests.go index bf05e75..26443b9 100644 --- a/crypto/fipsmodule/bn/check_bn_tests.go +++ b/crypto/fipsmodule/bn/check_bn_tests.go
@@ -228,8 +228,8 @@ checkResult(test, "A ^ E", "Exp", r) } case "ModSqrt": - bigOne := new(big.Int).SetInt64(1) - bigTwo := new(big.Int).SetInt64(2) + bigOne := big.NewInt(1) + bigTwo := big.NewInt(2) if checkKeys(test, "A", "P", "ModSqrt") { test.Values["A"].Mod(test.Values["A"], test.Values["P"]) @@ -249,8 +249,21 @@ } case "ModInv": if checkKeys(test, "A", "M", "ModInv") { - r := new(big.Int).ModInverse(test.Values["A"], test.Values["M"]) - checkResult(test, "A ^ -1 (mod M)", "ModInv", r) + a := test.Values["A"] + m := test.Values["M"] + var r *big.Int + if a.Sign() == 0 && m.IsInt64() && m.Int64() == 1 { + // OpenSSL says 0^(-1) mod (1) is 0, while Go says the + // inverse does not exist. + r = big.NewInt(0) + } else { + r = new(big.Int).ModInverse(a, m) + } + if r == nil { + fmt.Fprintf(os.Stderr, "Line %d: A has no inverse mod M.\n", test.LineNumber) + } else { + checkResult(test, "A ^ -1 (mod M)", "ModInv", r) + } } case "ModSquare": if checkKeys(test, "A", "M", "ModSquare") {