134 | 134 |
}
|
135 | 135 |
if ((err = mp_read_radix(key->base, sets[key->idx].base, 64)) != CRYPT_OK) { goto error; }
|
136 | 136 |
if ((err = mp_read_radix(key->prime, sets[key->idx].prime, 64)) != CRYPT_OK) { goto error; }
|
137 | |
return dh_make_key_ex_main(prng, wprng, key);
|
|
137 |
return dh_make_key_internal(prng, wprng, key);
|
138 | 138 |
error:
|
139 | 139 |
mp_clear_multi(key->base, key->prime, NULL);
|
140 | 140 |
return err;
|
|
150 | 150 |
@param key [out] Where the newly created DH key will be stored
|
151 | 151 |
@return CRYPT_OK if successful, note: on error all allocated memory will be freed automatically.
|
152 | 152 |
*/
|
153 | |
int dh_make_key_ex(prng_state *prng, int wprng, const char *base, const char *prime, dh_key *key)
|
|
153 |
int dh_make_key_ex(prng_state *prng, int wprng, const char *base_hex, const char *prime_hex, dh_key *key)
|
154 | 154 |
{
|
155 | 155 |
int err;
|
156 | 156 |
|
157 | |
LTC_ARGCHK(base != NULL);
|
158 | |
LTC_ARGCHK(prime != NULL);
|
|
157 |
LTC_ARGCHK(base_hex != NULL);
|
|
158 |
LTC_ARGCHK(prime_hex != NULL);
|
159 | 159 |
LTC_ARGCHK(key != NULL);
|
160 | 160 |
|
161 | 161 |
/* good prng? */
|
|
166 | 166 |
if ((err = mp_init_multi(&key->base, &key->prime, NULL)) != CRYPT_OK) {
|
167 | 167 |
goto error;
|
168 | 168 |
}
|
169 | |
if ((err = mp_read_radix(key->base, base, 16)) != CRYPT_OK) { goto error; }
|
170 | |
if ((err = mp_read_radix(key->prime, prime, 16)) != CRYPT_OK) { goto error; }
|
|
169 |
if ((err = mp_read_radix(key->base, base_hex, 16)) != CRYPT_OK) { goto error; }
|
|
170 |
if ((err = mp_read_radix(key->prime, prime_hex, 16)) != CRYPT_OK) { goto error; }
|
171 | 171 |
key->idx = SUPPLIED_PRIME;
|
172 | |
return dh_make_key_ex_main(prng, wprng, key);
|
|
172 |
return dh_make_key_internal(prng, wprng, key);
|
173 | 173 |
error:
|
174 | 174 |
mp_clear_multi(key->base, key->prime, NULL);
|
175 | 175 |
return err;
|
176 | 176 |
}
|
177 | 177 |
|
178 | 178 |
|
179 | |
int dh_make_key_ex_main(prng_state *prng, int wprng, dh_key *key)
|
|
179 |
int dh_make_key_internal(prng_state *prng, int wprng, dh_key *key)
|
180 | 180 |
{
|
181 | 181 |
unsigned char *buf = NULL;
|
182 | 182 |
int err, keysize;
|
|
323 | 323 |
@return CRYPT_OK if successful, on error all allocated memory is freed automatically
|
324 | 324 |
*/
|
325 | 325 |
int dh_import_raw(unsigned char *in, unsigned long inlen, int type,
|
326 | |
const char *base, const char *prime, dh_key *key)
|
|
326 |
const char *base_hex, const char *prime_hex, dh_key *key)
|
327 | 327 |
{
|
328 | 328 |
int err;
|
329 | 329 |
|
330 | |
LTC_ARGCHK(in != NULL);
|
331 | |
LTC_ARGCHK(base != NULL);
|
332 | |
LTC_ARGCHK(prime != NULL);
|
333 | |
LTC_ARGCHK(key != NULL);
|
|
330 |
LTC_ARGCHK(in != NULL);
|
|
331 |
LTC_ARGCHK(base_hex != NULL);
|
|
332 |
LTC_ARGCHK(prime_hex != NULL);
|
|
333 |
LTC_ARGCHK(key != NULL);
|
334 | 334 |
|
335 | 335 |
if ((err = mp_init_multi(&key->x, &key->y, &key->base, &key->prime, NULL)) != CRYPT_OK) {
|
336 | 336 |
goto error;
|
337 | 337 |
}
|
338 | |
if ((err = mp_read_radix(key->base, base, 16)) != CRYPT_OK) { goto error; }
|
339 | |
if ((err = mp_read_radix(key->prime, prime, 16)) != CRYPT_OK) { goto error; }
|
|
338 |
if ((err = mp_read_radix(key->base, base_hex, 16)) != CRYPT_OK) { goto error; }
|
|
339 |
if ((err = mp_read_radix(key->prime, prime_hex, 16)) != CRYPT_OK) { goto error; }
|
340 | 340 |
key->idx = SUPPLIED_PRIME;
|
341 | 341 |
|
342 | 342 |
if (type == PK_PRIVATE) {
|