-
Notifications
You must be signed in to change notification settings - Fork 896
Description
Version
latest master
Description
While working on an example Espressif app to address #6205, I noticed that the RSA call to mp_mul
would modify the operand in the expression tmp = tmpb + q * tmp
, specifically in the conditional check:
if (ret == 0 && mp_mul(tmp, &key->q, tmp) != MP_OKAY)
This is not immediately obvious until one views the definition and notes that all of the parameters are pointers:
int mp_mul (mp_int * a, mp_int * b, mp_int * c)
In my specific case, in attempting to see where things go sideways with the HW acceleration result not being the same as the software calcs, I have the A2
, B2
, and C2
values calculated in parallel and compared at runtime. A sample warning can be seen in the output log.
As seen here in the rsa.c, the use of the identical pointer tmp
for both the operand a
and results c
ends up modifying the pointer to a
to actually end up pointing to c
after the call:
More explicitly, I don't think this should ever occur:
Although technically it would seem to usually work, one would think that a call to a multiplication operation should not actually ever change the operands a
or b
in addition to the output result, c
eh?
There's (what seems to be) an attempt to save the tmp operand in tmpa
, but as it is just a pointer, both tmpa
and tmp
of course point to the same memory location.
I have a possible update that actually does save the operands, using a new tmpc declaration. Just before returning, I copy the value of tmpc
to the tmp
return parameter.
This solution may not be the best, but it is a successful, operating example. Before pursuing and further polish, I'm interested in feedback if this seems reasonable.
Thank you,
- edit: there's another instance in ecc.c to calculate
Y = Y * X
where the pointer adjusts the underlying address of an operandA
to match the address of the resultC
: