mirror of
https://github.com/cryb-to/cryb-to.git
synced 2025-01-05 11:22:24 +00:00
Fix sign bug in special cases in mpi_{add,sub}_abs().
We failed to clear the negative flag when handling trivial cases, so if one of the terms was 0 and the other was negative, the result would be an exact copy of the non-zero term instead of its absolute value.
This commit is contained in:
parent
fc99e7973b
commit
9ee45d4e34
3 changed files with 77 additions and 22 deletions
|
@ -52,12 +52,23 @@ mpi_add_abs(cryb_mpi *X, cryb_mpi *A, cryb_mpi *B)
|
||||||
if (A == B || mpi_eq_abs(A, B)) {
|
if (A == B || mpi_eq_abs(A, B)) {
|
||||||
if (X != A && X != B && mpi_copy(X, A) != 0)
|
if (X != A && X != B && mpi_copy(X, A) != 0)
|
||||||
return (-1);
|
return (-1);
|
||||||
return (mpi_lshift(X, 1));
|
if (mpi_lshift(X, 1) != 0)
|
||||||
|
return (-1);
|
||||||
|
X->neg = 0;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (A->msb == 0) {
|
||||||
|
if (X != B && mpi_copy(X, B) != 0)
|
||||||
|
return (-1);
|
||||||
|
X->neg = 0;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (B->msb == 0) {
|
||||||
|
if (X != A && mpi_copy(X, A) != 0)
|
||||||
|
return (-1);
|
||||||
|
X->neg = 0;
|
||||||
|
return (0);
|
||||||
}
|
}
|
||||||
if (A->msb == 0)
|
|
||||||
return (X == B ? 0 : mpi_copy(X, B));
|
|
||||||
if (B->msb == 0)
|
|
||||||
return (X == A ? 0 : mpi_copy(X, A));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Normalize our operands: if X is identical to either A or B, we
|
* Normalize our operands: if X is identical to either A or B, we
|
||||||
|
|
|
@ -54,10 +54,18 @@ mpi_sub_abs(cryb_mpi *X, cryb_mpi *A, cryb_mpi *B)
|
||||||
mpi_zero(X);
|
mpi_zero(X);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (A->msb == 0)
|
if (A->msb == 0) {
|
||||||
return (X == B ? 0 : mpi_copy(X, B));
|
if (X != B && mpi_copy(X, B) != 0)
|
||||||
if (B->msb == 0)
|
return (-1);
|
||||||
return (X == A ? 0 : mpi_copy(X, A));
|
X->neg = 0;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (B->msb == 0) {
|
||||||
|
if (X != A && mpi_copy(X, A) != 0)
|
||||||
|
return (-1);
|
||||||
|
X->neg = 0;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/* we want to subtract the smaller number from the larger */
|
/* we want to subtract the smaller number from the larger */
|
||||||
if (mpi_cmp_abs(A, B) < 0)
|
if (mpi_cmp_abs(A, B) < 0)
|
||||||
|
|
|
@ -60,28 +60,46 @@ static struct t_add_case {
|
||||||
int eneg:1;
|
int eneg:1;
|
||||||
} t_add_cases[] = {
|
} t_add_cases[] = {
|
||||||
{
|
{
|
||||||
"0 + 0 == 0",
|
"|0| + |0| == 0",
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"0 + 1 == 1",
|
"|0| + |1| == 1",
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"1 + 0 == 1",
|
"|1| + |0| == 1",
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"2 + 2 == 4",
|
"|1| + |1| == 2",
|
||||||
|
{ 0x01, }, 1, 0,
|
||||||
|
{ 0x01 }, 1, 0,
|
||||||
{ 0x02, }, 2, 0,
|
{ 0x02, }, 2, 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"|0| + |-1| == 1",
|
||||||
|
{ }, 0, 0,
|
||||||
|
{ 0x01, }, 1, 1,
|
||||||
|
{ 0x01, }, 1, 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"|-1| + |0| == 1",
|
||||||
|
{ 0x01, }, 1, 1,
|
||||||
|
{ }, 0, 0,
|
||||||
|
{ 0x01, }, 1, 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"|-1| + |-1| == 2",
|
||||||
|
{ 0x01, }, 1, 1,
|
||||||
|
{ 0x01 }, 1, 1,
|
||||||
{ 0x02, }, 2, 0,
|
{ 0x02, }, 2, 0,
|
||||||
{ 0x04, }, 3, 0,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"|0x20140901| + |0x19700101| == 0x39840a02",
|
"|0x20140901| + |0x19700101| == 0x39840a02",
|
||||||
|
@ -109,14 +127,14 @@ static struct t_add_case {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"simple carry, "
|
"simple carry, "
|
||||||
"0xffffffff + 0x01 == 0x0100000000",
|
"|0xffffffff| + |0x01| == 0x0100000000",
|
||||||
{ 0xff, 0xff, 0xff, 0xff, }, 32, 0,
|
{ 0xff, 0xff, 0xff, 0xff, }, 32, 0,
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
{ 0x01, 0x00, 0x00, 0x00, 0x00, }, 33, 0,
|
{ 0x01, 0x00, 0x00, 0x00, 0x00, }, 33, 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"complex carry, "
|
"complex carry, "
|
||||||
"0x0100000000ffffffff + 0x01 == 0x010000000100000000",
|
"|0x0100000000ffffffff| + |0x01| == 0x010000000100000000",
|
||||||
{ 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, }, 64, 0,
|
{ 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, }, 64, 0,
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
{ 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }, 64, 0,
|
{ 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }, 64, 0,
|
||||||
|
@ -478,37 +496,55 @@ static struct t_sub_case {
|
||||||
int eneg:1;
|
int eneg:1;
|
||||||
} t_sub_cases[] = {
|
} t_sub_cases[] = {
|
||||||
{
|
{
|
||||||
"0 - 0 == 0",
|
"| |0| - |0| | == 0",
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"0 - 1 == 1",
|
"| |0| - |1| | == 1",
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"1 - 0 == 1",
|
"| |1| - |0| | == 1",
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"1 - 1 == 0",
|
"| |1| - |1| | == 0",
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
|
{ 0x01 }, 1, 0,
|
||||||
|
{ 0x02, }, 0, 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"| |0| - |-1| | == 1",
|
||||||
|
{ }, 0, 0,
|
||||||
|
{ 0x01, }, 1, 1,
|
||||||
{ 0x01, }, 1, 0,
|
{ 0x01, }, 1, 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"| |-1| - |0| | == 1",
|
||||||
|
{ 0x01, }, 1, 1,
|
||||||
|
{ }, 0, 0,
|
||||||
|
{ 0x01, }, 1, 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"| |-1| - |-1| | == 0",
|
||||||
|
{ 0x01, }, 1, 1,
|
||||||
|
{ 0x01 }, 1, 1,
|
||||||
{ }, 0, 0,
|
{ }, 0, 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"4 - 2 == 2",
|
"| |4| - |2| | == 2",
|
||||||
{ 0x04, }, 3, 0,
|
{ 0x04, }, 3, 0,
|
||||||
{ 0x02, }, 2, 0,
|
{ 0x02, }, 2, 0,
|
||||||
{ 0x02, }, 2, 0,
|
{ 0x02, }, 2, 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"2 - 4 == 2",
|
"| |2| - |4| | == 2",
|
||||||
{ 0x02, }, 2, 0,
|
{ 0x02, }, 2, 0,
|
||||||
{ 0x04, }, 3, 0,
|
{ 0x04, }, 3, 0,
|
||||||
{ 0x02, }, 2, 0,
|
{ 0x02, }, 2, 0,
|
||||||
|
|
Loading…
Reference in a new issue