Bugfix: clear the exceeding destination digits.
Currently, the fp_sqr_comba_* functions do not fully clear the destination number, but only overwrites the digits they care about. Eg: if you call a comba4, it will overwrite the first 8 digits and leave the others unchanged. On the other hand, fp_mul_comba_* functions do *not* check incoming unused digits (relying on the guarantee that they must be zero), so they will happily compute the wrong result if those digits are not empty. Testcase for a 32-bit system: char buf[64]; fp_int num, num2, d; memset(buf, 0xFF, sizeof(buf); fp_read_unsigned_bin(&num, buf); fp_set(&d, 1); fp_sqr_comba_3(&d, &num); // now num is { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, // 0xFFFFFFFF, 0xFFFFFFFF ... } // only first 6 digits have been written, but even // if num.used is correctly set to 6, this can trigger // bugs. // Create a number larger than 6 digits fp_2expt(&num2, 8*32+4); fp_mul_comba_8(&num, &num2, &num2); // wrong result has been computed, because the first 8 // digits of num have been read and multiplied // even if num->used == 6, relying on the fact that // they should be zero.
This commit is contained in:
parent
da5fa59f2c
commit
50f587c36f
@ -90,8 +90,9 @@ printf(
|
|||||||
" B->used = %d;\n"
|
" B->used = %d;\n"
|
||||||
" B->sign = FP_ZPOS;\n"
|
" B->sign = FP_ZPOS;\n"
|
||||||
" memcpy(B->dp, b, %d * sizeof(fp_digit));\n"
|
" memcpy(B->dp, b, %d * sizeof(fp_digit));\n"
|
||||||
|
" memset(B->dp + %d, 0, (FP_SIZE - %d) * sizeof(fp_digit));\n"
|
||||||
" fp_clamp(B);\n"
|
" fp_clamp(B);\n"
|
||||||
"}\n#endif\n\n\n", N+N, N+N);
|
"}\n#endif\n\n\n", N+N, N+N, N+N, N+N);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -95,8 +95,9 @@ printf(
|
|||||||
" B->used = %d;\n"
|
" B->used = %d;\n"
|
||||||
" B->sign = FP_ZPOS;\n"
|
" B->sign = FP_ZPOS;\n"
|
||||||
" memcpy(B->dp, b, %d * sizeof(fp_digit));\n"
|
" memcpy(B->dp, b, %d * sizeof(fp_digit));\n"
|
||||||
|
" memset(B->dp + %d, 0, (FP_SIZE - %d) * sizeof(fp_digit));\n"
|
||||||
" fp_clamp(B);\n"
|
" fp_clamp(B);\n"
|
||||||
" break;\n\n", N+N, N+N);
|
" break;\n\n", N+N, N+N, N+N, N+N);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("}\n\n}\n");
|
printf("}\n\n}\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user