Update rand_range functions

`rand_range` will stop and return 0 if the `range` is too small. Caller can call it again or stop. `rand_range` return -1 only if RNG failure.
This commit is contained in:
Zhi Guan
2024-04-16 22:49:59 +08:00
parent e061dda71f
commit 4e66f911d0
2 changed files with 17 additions and 15 deletions

View File

@@ -80,12 +80,21 @@ void sm2_z256_set_zero(uint64_t a[4])
int sm2_z256_rand_range(uint64_t r[4], const uint64_t range[4]) int sm2_z256_rand_range(uint64_t r[4], const uint64_t range[4])
{ {
unsigned int max_tries = 100;
do { do {
if (!max_tries) {
// caller call this function again if return zero
return 0;
}
if (rand_bytes((uint8_t *)r, 32) != 1) { if (rand_bytes((uint8_t *)r, 32) != 1) {
error_print(); error_print();
return -1; return -1;
} }
max_tries--;
} while (sm2_z256_cmp(r, range) >= 0); } while (sm2_z256_cmp(r, range) >= 0);
return 1; return 1;
} }

View File

@@ -150,18 +150,16 @@ void sm9_z256_to_bits(const sm9_z256_t a, char bits[256])
int sm9_z256_rand_range(sm9_z256_t r, const sm9_z256_t range) int sm9_z256_rand_range(sm9_z256_t r, const sm9_z256_t range)
{ {
unsigned int max_tries = 100; unsigned int max_tries = 100;
uint8_t buf[256];
do { do {
if (!max_tries) { if (!max_tries) {
// caller call this function again if return zero
return 0;
}
if (rand_bytes((uint8_t *)r, 32) != 1) {
error_print(); error_print();
return -1; return -1;
} }
if (rand_bytes(buf, sizeof(buf)) != 1) {
error_print();
return -1;
}
sm9_z256_from_bytes(r, buf);
max_tries--; max_tries--;
} while (sm9_z256_cmp(r, range) >= 0); } while (sm9_z256_cmp(r, range) >= 0);
@@ -2007,26 +2005,21 @@ void sm9_z256_point_mul(SM9_Z256_POINT *R, const sm9_z256_t k, const SM9_Z256_PO
} }
} }
typedef struct { void sm9_z256_point_copy_affine(SM9_Z256_POINT *R, const SM9_Z256_AFFINE_POINT *P)
uint64_t X[4];
uint64_t Y[4];
} SM9_Z256_POINT_AFFINE;
void sm9_z256_point_copy_affine(SM9_Z256_POINT *R, const SM9_Z256_POINT_AFFINE *P)
{ {
sm9_z256_copy(R->X, P->X); sm9_z256_copy(R->X, P->X);
sm9_z256_copy(R->Y, P->Y); sm9_z256_copy(R->Y, P->Y);
sm9_z256_copy(R->Z, SM9_Z256_MODP_MONT_ONE); sm9_z256_copy(R->Z, SM9_Z256_MODP_MONT_ONE);
} }
void sm9_z256_point_add_affine(SM9_Z256_POINT *R, const SM9_Z256_POINT *P, const SM9_Z256_POINT_AFFINE *Q) void sm9_z256_point_add_affine(SM9_Z256_POINT *R, const SM9_Z256_POINT *P, const SM9_Z256_AFFINE_POINT *Q)
{ {
SM9_Z256_POINT _S, *S = &_S; SM9_Z256_POINT _S, *S = &_S;
sm9_z256_point_copy_affine(S, Q); sm9_z256_point_copy_affine(S, Q);
sm9_z256_point_add(R, P, S); sm9_z256_point_add(R, P, S);
} }
void sm9_z256_point_sub_affine(SM9_Z256_POINT *R, const SM9_Z256_POINT *P, const SM9_Z256_POINT_AFFINE *Q) void sm9_z256_point_sub_affine(SM9_Z256_POINT *R, const SM9_Z256_POINT *P, const SM9_Z256_AFFINE_POINT *Q)
{ {
SM9_Z256_POINT _S, *S = &_S; SM9_Z256_POINT _S, *S = &_S;
sm9_z256_point_copy_affine(S, Q); sm9_z256_point_copy_affine(S, Q);
@@ -2034,7 +2027,7 @@ void sm9_z256_point_sub_affine(SM9_Z256_POINT *R, const SM9_Z256_POINT *P, const
} }
extern const uint64_t sm9_z256_pre_comp[37][64 * 4 * 2]; extern const uint64_t sm9_z256_pre_comp[37][64 * 4 * 2];
static SM9_Z256_POINT_AFFINE (*g_pre_comp)[64] = (SM9_Z256_POINT_AFFINE (*)[64])sm9_z256_pre_comp; static SM9_Z256_AFFINE_POINT (*g_pre_comp)[64] = (SM9_Z256_AFFINE_POINT (*)[64])sm9_z256_pre_comp;
void sm9_z256_point_mul_generator(SM9_Z256_POINT *R, const sm9_z256_t k) void sm9_z256_point_mul_generator(SM9_Z256_POINT *R, const sm9_z256_t k)
{ {