61
61
MP_set(&dh->ctx.P, dh->p);
62
62
MP_set(&dh->ctx.G, dh->g);
64
dhm_make_public(&dh->ctx, 1024, out, 1, havege_rand, &RTMP_TLS_ctx->hs);
64
dhm_make_public(&dh->ctx, 1024, out, 1, havege_random, &RTMP_TLS_ctx->hs);
65
65
MP_new(dh->pub_key);
66
66
MP_new(dh->priv_key);
67
67
MP_set(dh->pub_key, &dh->ctx.GX);
79
79
#elif defined(USE_GNUTLS)
81
typedef gcry_mpi_t MP_t;
82
#define MP_new(m) m = gcry_mpi_new(1)
83
#define MP_set_w(mpi, w) gcry_mpi_set_ui(mpi, w)
84
#define MP_cmp(u, v) gcry_mpi_cmp(u, v)
85
#define MP_set(u, v) gcry_mpi_set(u, v)
86
#define MP_sub_w(mpi, w) gcry_mpi_sub_ui(mpi, mpi, w)
87
#define MP_cmp_1(mpi) gcry_mpi_cmp_ui(mpi, 1)
88
#define MP_modexp(r, y, q, p) gcry_mpi_powm(r, y, q, p)
89
#define MP_free(mpi) gcry_mpi_release(mpi)
90
#define MP_gethex(u, hex, res) res = (gcry_mpi_scan(&u, GCRYMPI_FMT_HEX, hex, 0, 0) == 0)
91
#define MP_bytes(u) (gcry_mpi_get_nbits(u) + 7) / 8
92
#define MP_setbin(u,buf,len) gcry_mpi_print(GCRYMPI_FMT_USG,buf,len,NULL,u)
93
#define MP_getbin(u,buf,len) gcry_mpi_scan(&u,GCRYMPI_FMT_USG,buf,len,NULL)
81
#include <nettle/bignum.h>
82
#include <gnutls/crypto.h>
84
#define MP_new(m) m = malloc(sizeof(*m)); mpz_init2(m, 1)
85
#define MP_set_w(mpi, w) mpz_set_ui(mpi, w)
86
#define MP_cmp(u, v) mpz_cmp(u, v)
87
#define MP_set(u, v) mpz_set(u, v)
88
#define MP_sub_w(mpi, w) mpz_sub_ui(mpi, mpi, w)
89
#define MP_cmp_1(mpi) mpz_cmp_ui(mpi, 1)
90
#define MP_modexp(r, y, q, p) mpz_powm(r, y, q, p)
91
#define MP_free(mpi) mpz_clear(mpi); free(mpi)
92
#define MP_gethex(u, hex, res) u = malloc(sizeof(*u)); mpz_init2(u, 1); res = (mpz_set_str(u, hex, 16) == 0)
93
#define MP_bytes(u) (mpz_sizeinbase(u, 2) + 7) / 8
94
#define MP_setbin(u,buf,len) nettle_mpz_get_str_256(len,buf,u)
95
#define MP_getbin(u,buf,len) u = malloc(sizeof(*u)); mpz_init2(u, 1); nettle_mpz_set_str_256_u(u,len,buf)
95
97
typedef struct MDH {
103
105
#define MDH_new() calloc(1,sizeof(MDH))
104
106
#define MDH_free(dh) do {MP_free(((MDH*)(dh))->p); MP_free(((MDH*)(dh))->g); MP_free(((MDH*)(dh))->pub_key); MP_free(((MDH*)(dh))->priv_key); free(dh);} while(0)
106
extern MP_t gnutls_calc_dh_secret(MP_t *priv, MP_t g, MP_t p);
107
extern MP_t gnutls_calc_dh_key(MP_t y, MP_t x, MP_t p);
109
#define MDH_generate_key(dh) (dh->pub_key = gnutls_calc_dh_secret(&dh->priv_key, dh->g, dh->p))
108
static int MDH_generate_key(MDH *dh)
114
num_bytes = (mpz_sizeinbase(dh->p, 2) + 7) / 8 - 1;
115
if (num_bytes <= 0 || num_bytes > 18000)
118
dh->priv_key = calloc(1, sizeof(*dh->priv_key));
121
mpz_init2(dh->priv_key, 1);
122
gnutls_rnd(GNUTLS_RND_RANDOM, &seed, sizeof(seed));
124
gmp_randseed_ui(rs, seed);
125
mpz_urandomb(dh->priv_key, rs, num_bytes);
128
dh->pub_key = calloc(1, sizeof(*dh->pub_key));
131
mpz_init2(dh->pub_key, 1);
133
mpz_clear(dh->priv_key);
138
mpz_powm(dh->pub_key, dh->g, dh->priv_key, dh->p);
110
143
static int MDH_compute_key(uint8_t *secret, size_t len, MP_t pub, MDH *dh)
112
MP_t sec = gnutls_calc_dh_key(pub, dh->priv_key, dh->p);
115
MP_setbin(sec, secret, len);
148
num_bytes = (mpz_sizeinbase(dh->p, 2) + 7) / 8;
149
if (num_bytes <= 0 || num_bytes > 18000)
152
k = calloc(1, sizeof(*k));
157
mpz_powm(k, pub, dh->priv_key, dh->p);
158
nettle_mpz_get_str_256(len, secret, k);
162
/* return the length of the shared secret key like DH_compute_key */
123
166
#else /* USE_OPENSSL */