components/libtorrent/patches/rlibtorrent-03-dh-generate.patch
author Rich Burridge <rich.burridge@oracle.com>
Wed, 07 Jan 2015 06:54:22 -0800
branchs11-update
changeset 3590 1b75635bc6a3
parent 248 3011f7a1ed77
permissions -rw-r--r--
20230898 problem in UTILITY/ELINKS
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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