author | david.comay@oracle.com |
Fri, 09 Sep 2016 16:31:02 -0700 | |
changeset 6878 | 252671ed151a |
parent 248 | 3011f7a1ed77 |
permissions | -rw-r--r-- |
248
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
1 |
--- libtorrent-0.12.2.orig/src/utils/diffie_hellman.cc Wed May 7 12:19:12 2008 |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
2 |
+++ libtorrent-0.12.2/src/utils/diffie_hellman.cc Sun Jun 15 10:51:31 2008 |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
3 |
@@ -47,6 +47,80 @@ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
4 |
|
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
5 |
namespace torrent { |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
6 |
|
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
7 |
+static int generate_key(DH *dh) |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
8 |
+ { |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
9 |
+ int ok=0; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
10 |
+ int generate_new_key=0; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
11 |
+ unsigned l; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
12 |
+ BN_CTX *ctx; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
13 |
+ BN_MONT_CTX *mont=NULL; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
14 |
+ BIGNUM *pub_key=NULL,*priv_key=NULL; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
15 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
16 |
+ ctx = BN_CTX_new(); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
17 |
+ if (ctx == NULL) goto err; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
18 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
19 |
+ if (dh->priv_key == NULL) |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
20 |
+ { |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
21 |
+ priv_key=BN_new(); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
22 |
+ if (priv_key == NULL) goto err; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
23 |
+ generate_new_key=1; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
24 |
+ } |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
25 |
+ else |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
26 |
+ priv_key=dh->priv_key; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
27 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
28 |
+ if (dh->pub_key == NULL) |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
29 |
+ { |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
30 |
+ pub_key=BN_new(); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
31 |
+ if (pub_key == NULL) goto err; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
32 |
+ } |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
33 |
+ else |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
34 |
+ pub_key=dh->pub_key; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
35 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
36 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
37 |
+ if (dh->flags & DH_FLAG_CACHE_MONT_P) |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
38 |
+ { |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
39 |
+ mont = BN_MONT_CTX_set_locked((BN_MONT_CTX **)(&dh->method_mont_p), |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
40 |
+ CRYPTO_LOCK_DH, dh->p, ctx); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
41 |
+ if (!mont) |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
42 |
+ goto err; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
43 |
+ } |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
44 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
45 |
+ if (generate_new_key) |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
46 |
+ { |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
47 |
+ l = dh->length ? dh->length : BN_num_bits(dh->p)-1; /* secret exponent length */ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
48 |
+ if (!BN_rand(priv_key, l, 0, 0)) |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
49 |
+ if (!BN_pseudo_rand(priv_key, l, 0, 0)) goto err; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
50 |
+ } |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
51 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
52 |
+ { |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
53 |
+ BIGNUM local_prk; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
54 |
+ BIGNUM *prk; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
55 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
56 |
+ if ((dh->flags & DH_FLAG_NO_EXP_CONSTTIME) == 0) |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
57 |
+ { |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
58 |
+ BN_init(&local_prk); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
59 |
+ prk = &local_prk; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
60 |
+ BN_with_flags(prk, priv_key, BN_FLG_EXP_CONSTTIME); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
61 |
+ } |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
62 |
+ else |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
63 |
+ prk = priv_key; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
64 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
65 |
+ if (!dh->meth->bn_mod_exp(dh, pub_key, dh->g, prk, dh->p, ctx, mont)) goto err; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
66 |
+ } |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
67 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
68 |
+ dh->pub_key=pub_key; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
69 |
+ dh->priv_key=priv_key; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
70 |
+ ok=1; |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
71 |
+err: |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
72 |
+ if (ok != 1) { |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
73 |
+ } |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
74 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
75 |
+ if ((pub_key != NULL) && (dh->pub_key == NULL)) BN_free(pub_key); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
76 |
+ if ((priv_key != NULL) && (dh->priv_key == NULL)) BN_free(priv_key); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
77 |
+ BN_CTX_free(ctx); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
78 |
+ return(ok); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
79 |
+} |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
80 |
+ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
81 |
DiffieHellman::DiffieHellman(const unsigned char *prime, int primeLength, |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
82 |
const unsigned char *generator, int generatorLength) : |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
83 |
m_secret(NULL) { |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
84 |
@@ -56,7 +130,8 @@ |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
85 |
m_dh->p = BN_bin2bn(prime, primeLength, NULL); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
86 |
m_dh->g = BN_bin2bn(generator, generatorLength, NULL); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
87 |
|
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
88 |
- DH_generate_key(m_dh); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
89 |
+ if (!generate_key(m_dh)) |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
90 |
+ throw internal_error("Unable to generate encryption key."); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
91 |
#else |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
92 |
throw internal_error("Compiled without encryption support."); |
3011f7a1ed77
7046137 move *torrent to userland
Mike Sullivan <Mike.Sullivan@Oracle.COM>
parents:
diff
changeset
|
93 |
#endif |