From 6e5aaceed5c89e323acc1ce701f8cdf573058c46 Mon Sep 17 00:00:00 2001 From: Benedict Date: Fri, 9 Dec 2016 18:28:21 +0100 Subject: dh: added a dh bignum implementation based on openssl --- lib/lib5.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/lib5.h | 16 ++++++++++++++++ 2 files changed, 66 insertions(+) (limited to 'lib') diff --git a/lib/lib5.c b/lib/lib5.c index 722cc46..60b0836 100644 --- a/lib/lib5.c +++ b/lib/lib5.c @@ -98,6 +98,56 @@ void do_dh_key_exchange(struct dh_param *dh) dh_get_session_key(dh); } +void dh_init_bignum(struct dh_param_bignum *dh) +{ + dh->A = BN_new(); + dh->B = BN_new(); + dh->a = BN_new(); + dh->b = BN_new(); + dh->p = BN_new(); + dh->g = BN_new(); + dh->s1 = BN_new(); + dh->s2 = BN_new(); + unsigned char *p = + "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024" + "e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd" + "3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec" + "6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f" + "24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361" + "c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552" + "bb9ed529077096966d670c354e4abc9804f1746c08ca237327fff" + "fffffffffffff"; + unsigned char *res = malloc(strlen(p)); + int len_dec = decode_hex_string(p, res); + BN_bin2bn(res, len_dec, dh->p); + BN_set_word(dh->g, 2); +} +void dh_generate_secret_keys_bignum(struct dh_param_bignum *dh) +{ + BN_pseudo_rand(dh->a, 8000, -1, -1); + BN_pseudo_rand(dh->b, 8000, -1, -1); +} + +void dh_generate_public_keys_bignum(struct dh_param_bignum *dh) +{ + BN_mod_exp(dh->A, dh->g, dh->a, dh->p, ctx); + BN_mod_exp(dh->B, dh->g, dh->b, dh->p, ctx); +} + +void dh_get_session_key_bignum(struct dh_param_bignum *dh) +{ + BN_mod_exp(dh->s1, dh->B, dh->a, dh->p, ctx); + BN_mod_exp(dh->s2, dh->A, dh->b, dh->p, ctx); +} + +void do_dh_key_exchange_bignum(struct dh_param_bignum *dh) +{ + dh_init_bignum(dh); + dh_generate_secret_keys_bignum(dh); + dh_generate_public_keys_bignum(dh); + dh_get_session_key_bignum(dh); +} + void sha1_key_from_dh(struct dh_param *dh, unsigned char *key) { char *s1_char; diff --git a/lib/lib5.h b/lib/lib5.h index d78da21..da3868d 100644 --- a/lib/lib5.h +++ b/lib/lib5.h @@ -19,6 +19,17 @@ struct dh_param { mpz_t s2; }; +struct dh_param_bignum { + BIGNUM *A; + BIGNUM *B; + BIGNUM *a; + BIGNUM *b; + BIGNUM *p; + BIGNUM *g; + BIGNUM *s1; + BIGNUM *s2; +}; + // global openssl context for auxaliry results BN_CTX *ctx; BIO *out; @@ -55,6 +66,11 @@ void dh_generate_secret_keys(struct dh_param *dh); void dh_generate_public_keys(struct dh_param *dh); void dh_get_session_key(struct dh_param *dh); void do_dh_key_exchange(struct dh_param *dh); +void dh_init_bignum(struct dh_param_bignum *dh); +void dh_generate_secret_keys_bignum(struct dh_param_bignum *dh); +void dh_generate_public_keys_bignum(struct dh_param_bignum *dh); +void dh_get_session_key_bignum(struct dh_param_bignum *dh); +void do_dh_key_exchange_bignum(struct dh_param_bignum *dh); void sha1_key_from_dh(struct dh_param *dh, unsigned char *key); void dh_mitm(struct dh_param *dh); int rsa_decrypt_bignum(BIGNUM *message, BIGNUM *res, struct rsa_key_bignum *private); -- cgit v1.2.3-70-g09d2