Mercurial > dropbear
diff ecc.c @ 756:bf9dc2d9c2b1 ecc
more bits on ecc branch
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Wed, 27 Mar 2013 00:38:03 +0800 |
parents | b07eb3dc23ec |
children | 230666086711 |
line wrap: on
line diff
--- a/ecc.c Tue Mar 26 01:35:22 2013 +0800 +++ b/ecc.c Wed Mar 27 00:38:03 2013 +0800 @@ -1,6 +1,37 @@ +#include "includes.h" +#include "options.h" +#include "ecc.h" + #ifdef DROPBEAR_ECC +#ifdef DROPBEAR_ECC_256 +const struct ecc_curve_secp256r1 { + .ltc_set = <c_ecc_sets[0], + .hash_desc = sha256_desc, + .name = "secp256r1" +}; +#endif + + +#ifdef DROPBEAR_ECC_384 +const struct ecc_curve_secp384r1 { + .ltc_set = <c_ecc_sets[1], + .hash_desc = sha384_desc, + .name = "secp384r1" +}; +#endif + +#ifdef DROPBEAR_ECC_256 +const struct ecc_curve_secp256r1 { + .ltc_set = <c_ecc_sets[0], + .hash_desc = sha256_desc, + .name = "secp256r1" +}; +#endif + + void buf_put_ecc_key_string(buffer *buf, ecc_key *key) { + // XXX point compression int len = key->dp->size*2 + 1; buf_putint(len); int err = ecc_ansi_x963_export(key, buf_getwriteptr(buf, len), &len); @@ -13,5 +44,71 @@ int buf_get_ecc_key_string(buffer *buf, ecc_key *key) { } +// 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) +{ + ecc_point *result = NULL + mp_int *prime = NULL, *shared_secret = NULL; + int ret = DROPBEAR_FAILURE; + + /* type valid? */ + if (private_key->type != PK_PRIVATE) { + goto done; + } + + if (private_key->dp != public_key->dp) { + goto done; + } + +#if 0 + // XXX - possibly not neccessary tests? + if (ltc_ecc_is_valid_idx(private_key->idx) == 0 || ltc_ecc_is_valid_idx(public_key->idx) == 0) { + goto done; + } + + if (XSTRCMP(private_key->dp->name, public_key->dp->name) != 0) { + goto done; + } +#endif + + /* make new point */ + result = ltc_ecc_new_point(); + if (result == NULL) { + goto done; + } + + prime = m_malloc(sizeof(*prime)); + m_mp_init(prime); + + if (mp_read_radix(prime, (char *)private_key->dp->prime, 16) != CRYPT_OK) { + goto done; + } + if (ltc_mp.ecc_ptmul(private_key->k, &public_key->pubkey, result, prime, 1) != CRYPT_OK) { + goto done; + } + + err = DROPBEAR_SUCCESS; +done: + if (err == DROPBEAR_SUCCESS) { + shared_secret = prime; + prime = NULL; + } + + if (prime) { + mp_clear(prime); + m_free(prime); + } + ltc_ecc_del_point(result); + + if (err == DROPBEAR_FAILURE) { + dropbear_exit("ECC error"); + } + + return shared_secret; + return err; +} + +} #endif