emp-toolkit/emp-sh2pc

shift operation will change a secure negative integer from signed to unsigned

Opened this issue · 0 comments

Hello, sorry for disturbing you.
I have observed that shift operations can be conducted on secure integers successfully on bit-representation. However, it will turn a negative signed integer into an unsigned one.
Here is an example.

Integer a(32, -44, ALICE);
cout<< "a:	"<< a.reveal<int32_t>()<<endl;
a = (a >> 2);
cout<< "a:	"<< a.reveal<int32_t>()<<endl;

The output is:

a:        -44
a:        1073741813

From the view of bit representation, the 11111111 11111111 11111111 11010100 is shifted by 2 bits to 11111111 11111111 11111111 11110101 successfully. However, it is now converted to an unsigned form.
In comparison, if the operation is conducted on a public variable

int a = -44;
cout<< "a:	"<< a<<endl;
a = a >> 2;
cout<< "a:	"<< a<<endl;

The output is:

a:        -44
a:        -11

I am curious whether this is caused by my misuse of shift or if I did not define the type of variable correctly. Or maybe, this behavior is special in the MPC scenario so I should avoid using it. May you help me by explaining this?