ECC key pair generation according to FIPS-186-4 (2)
Karel Miko
10 years ago
50 | 50 | ecc_point *base; |
51 | 51 | void *prime, *order, *a; |
52 | 52 | unsigned char *buf; |
53 | int keysize; | |
53 | int keysize, orderbits; | |
54 | 54 | |
55 | 55 | LTC_ARGCHK(key != NULL); |
56 | 56 | LTC_ARGCHK(ltc_mp.name != NULL); |
103 | 103 | * c/ if k not in [1, order-1] go to b/ |
104 | 104 | * e/ Q = k*G |
105 | 105 | */ |
106 | orderbits = mp_count_bits(order); | |
106 | 107 | do { |
107 | /* generate random k: 0 <= k < order */ | |
108 | if ((err = rand_bn_range(key->k, order, prng, wprng)) != CRYPT_OK) { goto errkey; } | |
109 | } while (mp_iszero(key->k)); | |
108 | if ((err = rand_bn_bits(key->k, orderbits, prng, wprng)) != CRYPT_OK) { goto errkey; } | |
109 | } while (mp_iszero(key->k) || mp_cmp(key->k, order) != LTC_MP_LT); | |
110 | 110 | |
111 | 111 | /* make the public key */ |
112 | 112 | if ((err = mp_read_radix(a, (char *)key->dp->A, 16)) != CRYPT_OK) { goto errkey; } |