~ubuntu-branches/ubuntu/wily/rtmpdump/wily-proposed

« back to all changes in this revision

Viewing changes to librtmp/dh.h

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2014-04-11 22:08:17 UTC
  • mfrom: (6.1.5 sid)
  • Revision ID: package-import@ubuntu.com-20140411220817-gef1vkyrygbyd87i
Tags: 2.4+20131018.git79459a2-2
Depends on libgmp-dev and nettle-dev to librtmpdev (Closes: #744242)

Show diffs side-by-side

added added

removed removed

Lines of Context:
61
61
  MP_set(&dh->ctx.P, dh->p);
62
62
  MP_set(&dh->ctx.G, dh->g);
63
63
  dh->ctx.len = 128;
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);
77
77
}
78
78
 
79
79
#elif defined(USE_GNUTLS)
80
 
#include <gcrypt.h>
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)
 
80
#include <gmp.h>
 
81
#include <nettle/bignum.h>
 
82
#include <gnutls/crypto.h>
 
83
typedef mpz_ptr MP_t;
 
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)
94
96
 
95
97
typedef struct MDH {
96
98
  MP_t p;
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)
105
107
 
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);
108
 
 
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)
 
109
{
 
110
  int num_bytes;
 
111
  uint32_t seed;
 
112
  gmp_randstate_t rs;
 
113
 
 
114
  num_bytes = (mpz_sizeinbase(dh->p, 2) + 7) / 8 - 1;
 
115
  if (num_bytes <= 0 || num_bytes > 18000)
 
116
    return 0;
 
117
 
 
118
  dh->priv_key = calloc(1, sizeof(*dh->priv_key));
 
119
  if (!dh->priv_key)
 
120
    return 0;
 
121
  mpz_init2(dh->priv_key, 1);
 
122
  gnutls_rnd(GNUTLS_RND_RANDOM, &seed, sizeof(seed));
 
123
  gmp_randinit_mt(rs);
 
124
  gmp_randseed_ui(rs, seed);
 
125
  mpz_urandomb(dh->priv_key, rs, num_bytes);
 
126
  gmp_randclear(rs);
 
127
 
 
128
  dh->pub_key = calloc(1, sizeof(*dh->pub_key));
 
129
  if (!dh->pub_key)
 
130
    return 0;
 
131
  mpz_init2(dh->pub_key, 1);
 
132
  if (!dh->pub_key) {
 
133
    mpz_clear(dh->priv_key);
 
134
    free(dh->priv_key);
 
135
    return 0;
 
136
  }
 
137
 
 
138
  mpz_powm(dh->pub_key, dh->g, dh->priv_key, dh->p);
 
139
 
 
140
  return 1;
 
141
}
 
142
 
110
143
static int MDH_compute_key(uint8_t *secret, size_t len, MP_t pub, MDH *dh)
111
144
{
112
 
  MP_t sec = gnutls_calc_dh_key(pub, dh->priv_key, dh->p);
113
 
  if (sec)
114
 
    {
115
 
          MP_setbin(sec, secret, len);
116
 
          MP_free(sec);
117
 
          return 0;
118
 
        }
119
 
  else
120
 
    return -1;
 
145
  mpz_ptr k;
 
146
  int num_bytes;
 
147
 
 
148
  num_bytes = (mpz_sizeinbase(dh->p, 2) + 7) / 8;
 
149
  if (num_bytes <= 0 || num_bytes > 18000)
 
150
    return -1;
 
151
 
 
152
  k = calloc(1, sizeof(*k));
 
153
  if (!k)
 
154
    return -1;
 
155
  mpz_init2(k, 1);
 
156
 
 
157
  mpz_powm(k, pub, dh->priv_key, dh->p);
 
158
  nettle_mpz_get_str_256(len, secret, k);
 
159
  mpz_clear(k);
 
160
  free(k);
 
161
 
 
162
  /* return the length of the shared secret key like DH_compute_key */
 
163
  return len;
121
164
}
122
165
 
123
166
#else /* USE_OPENSSL */