Mercurial > dropbear
diff ecc.c @ 1511:5916af64acd4 fuzz
merge from main
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 17 Feb 2018 19:29:51 +0800 |
parents | b0c3b46372dc |
children | d68d61e7056a |
line wrap: on
line diff
--- a/ecc.c Tue Jan 23 23:27:40 2018 +0800 +++ b/ecc.c Sat Feb 17 19:29:51 2018 +0800 @@ -82,7 +82,7 @@ /* Copied from libtomcrypt ecc_import.c (version there is static), modified for different mp_int pointer without LTC_SOURCE */ -static int ecc_is_point(ecc_key *key) +static int ecc_is_point(const ecc_key *key) { mp_int *prime, *b, *t1, *t2; int err; @@ -213,7 +213,7 @@ /* a modified version of libtomcrypt's "ecc_shared_secret" to output a mp_int instead. */ -mp_int * dropbear_ecc_shared_secret(ecc_key *public_key, ecc_key *private_key) +mp_int * dropbear_ecc_shared_secret(ecc_key *public_key, const ecc_key *private_key) { ecc_point *result = NULL; mp_int *prime = NULL, *shared_secret = NULL; @@ -221,46 +221,41 @@ /* type valid? */ if (private_key->type != PK_PRIVATE) { - goto done; + goto out; } if (private_key->dp != public_key->dp) { - goto done; + goto out; } /* make new point */ result = ltc_ecc_new_point(); if (result == NULL) { - goto done; + goto out; } prime = m_malloc(sizeof(*prime)); m_mp_init(prime); if (mp_read_radix(prime, (char *)private_key->dp->prime, 16) != CRYPT_OK) { - goto done; + goto out; } if (ltc_mp.ecc_ptmul(private_key->k, &public_key->pubkey, result, prime, 1) != CRYPT_OK) { - goto done; + goto out; } + shared_secret = m_malloc(sizeof(*shared_secret)); + m_mp_init(shared_secret); + if (mp_copy(result->x, shared_secret) != CRYPT_OK) { + goto out; + } + + mp_clear(prime); + m_free(prime); + ltc_ecc_del_point(result); + err = DROPBEAR_SUCCESS; - done: - if (err == DROPBEAR_SUCCESS) { - shared_secret = m_malloc(sizeof(*shared_secret)); - m_mp_init(shared_secret); - mp_copy(result->x, shared_secret); - } - - if (prime) { - mp_clear(prime); - m_free(prime); - } - if (result) - { - ltc_ecc_del_point(result); - } - + out: if (err == DROPBEAR_FAILURE) { dropbear_exit("ECC error"); }