summaryrefslogtreecommitdiff
path: root/lib/lib5.c
diff options
context:
space:
mode:
authorBenedict <benedict@0xb8000.de>2016-12-09 18:28:21 +0100
committerBenedict <benedict@0xb8000.de>2017-02-21 13:00:26 +0100
commit6e5aaceed5c89e323acc1ce701f8cdf573058c46 (patch)
tree852da958ee723254f8e00601c55de52300791174 /lib/lib5.c
parentc735b384e726558608b5442bd42f0df7a7e2daf6 (diff)
dh: added a dh bignum implementation based on openssl
Diffstat (limited to 'lib/lib5.c')
-rw-r--r--lib/lib5.c50
1 files changed, 50 insertions, 0 deletions
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;