hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/lib/mpi/mpi-cmp.c
....@@ -25,8 +25,12 @@
2525 mpi_limb_t limb = v;
2626
2727 mpi_normalize(u);
28
- if (!u->nlimbs && !limb)
29
- return 0;
28
+ if (u->nlimbs == 0) {
29
+ if (v == 0)
30
+ return 0;
31
+ else
32
+ return -1;
33
+ }
3034 if (u->sign)
3135 return -1;
3236 if (u->nlimbs > 1)
....@@ -41,28 +45,54 @@
4145 }
4246 EXPORT_SYMBOL_GPL(mpi_cmp_ui);
4347
44
-int mpi_cmp(MPI u, MPI v)
48
+static int do_mpi_cmp(MPI u, MPI v, int absmode)
4549 {
46
- mpi_size_t usize, vsize;
50
+ mpi_size_t usize;
51
+ mpi_size_t vsize;
52
+ int usign;
53
+ int vsign;
4754 int cmp;
4855
4956 mpi_normalize(u);
5057 mpi_normalize(v);
58
+
5159 usize = u->nlimbs;
5260 vsize = v->nlimbs;
53
- if (!u->sign && v->sign)
61
+ usign = absmode ? 0 : u->sign;
62
+ vsign = absmode ? 0 : v->sign;
63
+
64
+ /* Compare sign bits. */
65
+
66
+ if (!usign && vsign)
5467 return 1;
55
- if (u->sign && !v->sign)
68
+ if (usign && !vsign)
5669 return -1;
57
- if (usize != vsize && !u->sign && !v->sign)
70
+
71
+ /* U and V are either both positive or both negative. */
72
+
73
+ if (usize != vsize && !usign && !vsign)
5874 return usize - vsize;
59
- if (usize != vsize && u->sign && v->sign)
60
- return vsize - usize;
75
+ if (usize != vsize && usign && vsign)
76
+ return vsize + usize;
6177 if (!usize)
6278 return 0;
6379 cmp = mpihelp_cmp(u->d, v->d, usize);
64
- if (u->sign)
65
- return -cmp;
66
- return cmp;
80
+ if (!cmp)
81
+ return 0;
82
+ if ((cmp < 0?1:0) == (usign?1:0))
83
+ return 1;
84
+
85
+ return -1;
86
+}
87
+
88
+int mpi_cmp(MPI u, MPI v)
89
+{
90
+ return do_mpi_cmp(u, v, 0);
6791 }
6892 EXPORT_SYMBOL_GPL(mpi_cmp);
93
+
94
+int mpi_cmpabs(MPI u, MPI v)
95
+{
96
+ return do_mpi_cmp(u, v, 1);
97
+}
98
+EXPORT_SYMBOL_GPL(mpi_cmpabs);