• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1diff --git a/crypto/bn/asm/mips.pl b/crypto/bn/asm/mips.pl
2index 95cb227dc5..91b7aac6e7 100644
3--- a/crypto/bn/asm/mips.pl
4+++ b/crypto/bn/asm/mips.pl
5@@ -1986,6 +1986,8 @@ $code.=<<___;
6 	sltu	$at,$c_2,$t_1
7 	$ADDU	$c_3,$t_2,$at
8 	$ST	$c_2,$BNSZ($a0)
9+	sltu	$at,$c_3,$t_2
10+	$ADDU	$c_1,$at
11 	mflo	($t_1,$a_2,$a_0)
12 	mfhi	($t_2,$a_2,$a_0)
13 ___
14@@ -2196,6 +2198,8 @@ $code.=<<___;
15 	sltu	$at,$c_2,$t_1
16 	$ADDU	$c_3,$t_2,$at
17 	$ST	$c_2,$BNSZ($a0)
18+	sltu	$at,$c_3,$t_2
19+	$ADDU	$c_1,$at
20 	mflo	($t_1,$a_2,$a_0)
21 	mfhi	($t_2,$a_2,$a_0)
22 ___
23diff --git a/test/bntest.c b/test/bntest.c
24index 87e5c4065b..fa9fc07cef 100644
25--- a/test/bntest.c
26+++ b/test/bntest.c
27@@ -630,6 +630,51 @@ static int test_modexp_mont5(void)
28     if (!TEST_BN_eq(c, d))
29         goto err;
30
31+    /*
32+     * Regression test for overflow bug in bn_sqr_comba4/8 for
33+     * mips-linux-gnu and mipsel-linux-gnu 32bit targets.
34+     */
35+    {
36+        static const char *ehex[] = {
37+            "95564994a96c45954227b845a1e99cb939d5a1da99ee91acc962396ae999a9ee",
38+            "38603790448f2f7694c242a875f0cad0aae658eba085f312d2febbbd128dd2b5",
39+            "8f7d1149f03724215d704344d0d62c587ae3c5939cba4b9b5f3dc5e8e911ef9a",
40+            "5ce1a5a749a4989d0d8368f6e1f8cdf3a362a6c97fb02047ff152b480a4ad985",
41+            "2d45efdf0770542992afca6a0590d52930434bba96017afbc9f99e112950a8b1",
42+            "a359473ec376f329bdae6a19f503be6d4be7393c4e43468831234e27e3838680",
43+            "b949390d2e416a3f9759e5349ab4c253f6f29f819a6fe4cbfd27ada34903300e",
44+            "da021f62839f5878a36f1bc3085375b00fd5fa3e68d316c0fdace87a97558465",
45+            NULL};
46+        static const char *phex[] = {
47+            "f95dc0f980fbd22e90caa5a387cc4a369f3f830d50dd321c40db8c09a7e1a241",
48+            "a536e096622d3280c0c1ba849c1f4a79bf490f60006d081e8cf69960189f0d31",
49+            "2cd9e17073a3fba7881b21474a13b334116cb2f5dbf3189a6de3515d0840f053",
50+            "c776d3982d391b6d04d642dda5cc6d1640174c09875addb70595658f89efb439",
51+            "dc6fbd55f903aadd307982d3f659207f265e1ec6271b274521b7a5e28e8fd7a5",
52+            "5df089292820477802a43cf5b6b94e999e8c9944ddebb0d0e95a60f88cb7e813",
53+            "ba110d20e1024774107dd02949031864923b3cb8c3f7250d6d1287b0a40db6a4",
54+            "7bd5a469518eb65aa207ddc47d8c6e5fc8e0c105be8fc1d4b57b2e27540471d5",
55+            NULL};
56+        static const char *mhex[] = {
57+            "fef15d5ce4625f1bccfbba49fc8439c72bf8202af039a2259678941b60bb4a8f",
58+            "2987e965d58fd8cf86a856674d519763d0e1211cc9f8596971050d56d9b35db3",
59+            "785866cfbca17cfdbed6060be3629d894f924a89fdc1efc624f80d41a22f1900",
60+            "9503fcc3824ef62ccb9208430c26f2d8ceb2c63488ec4c07437aa4c96c43dd8b",
61+            "9289ed00a712ff66ee195dc71f5e4ead02172b63c543d69baf495f5fd63ba7bc",
62+            "c633bd309c016e37736da92129d0b053d4ab28d21ad7d8b6fab2a8bbdc8ee647",
63+            "d2fbcf2cf426cf892e6f5639e0252993965dfb73ccd277407014ea784aaa280c",
64+            "b7b03972bc8b0baa72360bdb44b82415b86b2f260f877791cd33ba8f2d65229b",
65+            NULL};
66+
67+        if (!TEST_true(parse_bigBN(&e, ehex))
68+                || !TEST_true(parse_bigBN(&p, phex))
69+                || !TEST_true(parse_bigBN(&m, mhex))
70+                || !TEST_true(BN_mod_exp_mont_consttime(d, e, p, m, ctx, NULL))
71+                || !TEST_true(BN_mod_exp_simple(a, e, p, m, ctx))
72+                || !TEST_BN_eq(a, d))
73+            goto err;
74+    }
75+
76     /* Zero input */
77     if (!TEST_true(BN_bntest_rand(p, 1024, 0, 0)))
78         goto err;