components/erlang/patches/ssh.patch
changeset 346 d28be18217b8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/erlang/patches/ssh.patch	Mon Jun 27 02:58:43 2011 -0700
@@ -0,0 +1,197 @@
+--- otp_src_R12B-5/lib/ssh/src/ssh_connection_handler.erl	Mon Sep  1 14:51:52 2008
++++ otp_src_R12B-5-patch/lib/ssh/src/ssh_connection_handler.erl	Thu Jun 23 10:56:21 2011
+@@ -94,8 +94,6 @@
+ %% initialize. 
+ %%--------------------------------------------------------------------
+ init([Role, Manager, Socket, SshOpts]) ->
+-    {A,B,C} = erlang:now(),
+-    random:seed(A, B, C),
+     {NumVsn, StrVsn} = ssh_transport:versions(Role, SshOpts),
+     ssh_bits:install_messages(ssh_transport:transport_messages(NumVsn)),
+     {Protocol, Callback, CloseTag} = 
+--- otp_src_R12B-5/lib/crypto/c_src/crypto_drv.c	Tue Nov  4 11:52:34 2008
++++ otp_src_R12B-5-patch/lib/crypto/c_src/crypto_drv.c	Thu Jun 23 11:33:31 2011
+@@ -208,6 +208,9 @@
+ #define DRV_SHA512_FINAL        58
+ #endif
+ 
++#define DRV_STRONG_RAND_BYTES   59
++#define DRV_STRONG_RAND_MPINT   60
++
+ /* #define DRV_CBC_IDEA_ENCRYPT    34 */
+ /* #define DRV_CBC_IDEA_DECRYPT    35 */
+ 
+@@ -604,7 +607,39 @@
+         bin->orig_bytes[0] |= or_mask; /* bottommask */
+         return rlen;
+         break;
+-      
++
++    case DRV_STRONG_RAND_BYTES:
++	/* buf = <<rlen:32/integer>> */
++        if (len != 4)
++            return -1;
++	rlen = get_int32(buf);
++        *rbuf = (char *)(bin = driver_alloc_binary(rlen));
++	if (bin==NULL)
++            return -1;
++        if (RAND_bytes(bin->orig_bytes,rlen) != 1)
++            return -1;
++	return rlen;
++
++    case DRV_STRONG_RAND_MPINT:
++        /* buf = <<rlen:32/integer,topmask:8/integer,bottommask:8/integer>> */
++        if (len != 6)
++            return -1;
++        bn_rand = BN_new();
++        if (! bn_rand )
++            return -1;
++
++        if (!BN_rand(bn_rand, get_int32(buf), buf[4], buf[5])) {
++            BN_free(bn_rand);
++            return -1;
++        }
++
++        dlen = BN_num_bytes(bn_rand);
++        *rbuf = (char *)(bin = driver_alloc_binary(dlen));
++        put_int32(bin->orig_bytes, dlen);
++        BN_bn2bin(bn_rand, bin->orig_bytes+4);
++        BN_free(bn_rand);
++        return 1;
++
+     case DRV_RAND_UNIFORM:
+       /* buf = <<from_len:32/integer,bn_from:from_len/binary,   *
+        *         to_len:32/integer,bn_to:to_len/binary>>        */
+--- otp_src_R12B-5/lib/crypto/src/crypto.erl	Tue Nov  4 11:52:34 2008
++++ otp_src_R12B-5-patch/lib/crypto/src/crypto.erl	Thu Jun 23 11:35:29 2011
+@@ -40,6 +40,7 @@
+ -export([rsa_private_encrypt/3, rsa_public_decrypt/3]).
+ -export([dh_generate_key/1, dh_generate_key/2, dh_compute_key/3]).
+ -export([rand_bytes/1, rand_bytes/3, rand_uniform/2]).
++-export([strong_rand_bytes/1, strong_rand_mpint/3]).
+ -export([mod_exp/3, mpint/1, erlint/1]).
+ %% -export([idea_cbc_encrypt/3, idea_cbc_decrypt/3]).
+ -export([aes_cbc_128_encrypt/3, aes_cbc_128_decrypt/3]).
+@@ -110,6 +111,8 @@
+ %% -define(SHA512_UPDATE,	 57).
+ %% -define(SHA512_FINAL,	 58).
+ 
++-define(STRONG_RAND_BYTES,	 59).
++-define(STRONG_RAND_MPINT,	 60).
+ 
+ %% -define(IDEA_CBC_ENCRYPT, 34).
+ %% -define(IDEA_CBC_DECRYPT, 35).
+@@ -125,6 +128,8 @@
+ 		    des_ede3_cbc_encrypt, des_ede3_cbc_decrypt,
+ 		    aes_cfb_128_encrypt, aes_cfb_128_decrypt,
+ 		    rand_bytes,
++		    strong_rand_bytes,
++		    strong_rand_mpint,
+ 		    rand_uniform,
+ 		    mod_exp,
+ 		    dss_verify,dss_sign,
+@@ -321,10 +326,19 @@
+ 
+ rand_bytes(Bytes) ->
+     rand_bytes(Bytes, 0, 0).
++
++strong_rand_bytes(Bytes) ->
++    control(?STRONG_RAND_BYTES,[<<Bytes:32/integer>>]).
++
+ rand_bytes(Bytes, Topmask, Bottommask) ->
+     control(?RAND_BYTES,[<<Bytes:32/integer,
+ 			  Topmask:8/integer,
+ 			  Bottommask:8/integer>>]).
++
++strong_rand_mpint(Bits, Top, Bottom) ->
++    control(?STRONG_RAND_MPINT,[<<Bits:32/integer,
++			  Top:8/integer,
++			  Bottom:8/integer>>]).
+ 
+ rand_uniform(From,To) when is_binary(From), is_binary(To) ->
+     case control(?RAND_UNIFORM,[From,To]) of
+--- otp_src_R12B-5/lib/ssh/src/ssh_bits.erl	Mon Sep  1 14:51:49 2008
++++ otp_src_R12B-5-patch/lib/ssh/src/ssh_bits.erl	Thu Jun 23 10:56:25 2011
+@@ -33,7 +33,7 @@
+ %% integer utils
+ -export([isize/1]).
+ -export([irandom/1, irandom/3]).
+--export([random/1, random/3]).
++-export([random/1]).
+ -export([xor_bits/2, fill_bits/2]).
+ -export([i2bin/2, bin2i/1]).
+ 
+@@ -400,9 +400,6 @@
+ irandom(Bits) ->
+     irandom(Bits, 1, 0).
+ 
+-%% irandom_odd(Bits) ->
+-%%     irandom(Bits, 1, 1).
+-
+ %%
+ %% irandom(N, Top, Bottom)
+ %%
+@@ -413,22 +410,8 @@
+ %%       Bot = 0 - do not set the least signifcant bit
+ %%       Bot = 1 - set the least signifcant bit (i.e always odd)
+ %%
+-irandom(0, _Top, _Bottom) -> 
+-    0;
+-irandom(Bits, Top, Bottom) ->
+-    Bytes = (Bits+7) div 8,
+-    Skip  = (8-(Bits rem 8)) rem 8,
+-    TMask = case Top of
+-		  0 -> 0;
+-		  1 -> 16#80;
+-		  2 -> 16#c0
+-	      end,
+-    BMask = case Bottom of
+-		0 -> 0;
+-		1 -> (1 bsl Skip)
+-	    end,
+-    <<X:Bits/big-unsigned-integer, _:Skip>> = random(Bytes, TMask, BMask),
+-    X.
++irandom(Bits, Top, Bottom) -> 
++    crypto:erlint(crypto:strong_rand_mpint(Bits, Top - 1, Bottom)).
+ 
+ %%
+ %% random/1
+@@ -435,37 +419,9 @@
+ %%   Generate N random bytes
+ %%
+ random(N) ->
+-    random(N, 0, 0).
++    crypto:strong_rand_bytes(N).
+ 
+-random(N, TMask, BMask) ->
+-    list_to_binary(rnd(N, TMask, BMask)).
+-
+-%% random/3
+-%%   random(Bytes, TopMask, BotMask)
+-%% where 
+-%% Bytes is the number of bytes to generate
+-%% TopMask is bitwised or'ed to the first byte
+-%% BotMask is bitwised or'ed to the last byte
+ %%
+-rnd(0, _TMask, _BMask) ->
+-    [];
+-rnd(1, TMask, BMask) ->
+-    [(rand8() bor TMask) bor BMask];
+-rnd(N, TMask, BMask) ->
+-    [(rand8() bor TMask) | rnd_n(N-1, BMask)].
+-
+-rnd_n(1, BMask) ->
+-    [rand8() bor BMask];
+-rnd_n(I, BMask) ->
+-    [rand8() | rnd_n(I-1, BMask)].
+-
+-rand8() ->
+-    (rand32() bsr 8) band 16#ff.
+-
+-rand32() ->
+-    random:uniform(16#100000000) -1.
+-
+-%%
+ %% Base 64 encode/decode
+ %%
+