01: /* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
02: /*
03: Copyright (c) 2002-2008 ymnk, JCraft,Inc. All rights reserved.
04:
05: Redistribution and use in source and binary forms, with or without
06: modification, are permitted provided that the following conditions are met:
07:
08: 1. Redistributions of source code must retain the above copyright notice,
09: this list of conditions and the following disclaimer.
10:
11: 2. Redistributions in binary form must reproduce the above copyright
12: notice, this list of conditions and the following disclaimer in
13: the documentation and/or other materials provided with the distribution.
14:
15: 3. The names of the authors may not be used to endorse or promote products
16: derived from this software without specific prior written permission.
17:
18: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
19: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
21: INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
22: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24: OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27: EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28: */
29:
30: package com.jcraft.jsch.jce;
31:
32: import java.security.SecureRandom;
33:
34: public class Random implements com.jcraft.jsch.Random {
35: private byte[] tmp = new byte[16];
36: private SecureRandom random = null;
37:
38: public Random() {
39:
40: // We hope that 'new SecureRandom()' will use NativePRNG algorithm
41: // on Sun's Java5 for GNU/Linux and Solaris.
42: // It seems NativePRNG refers to /dev/urandom and it must not be blocked,
43: // but NativePRNG is slower than SHA1PRNG ;-<
44: // TIPS: By adding option '-Djava.security.egd=file:/dev/./urandom'
45: // SHA1PRNG will be used instead of NativePRNG.
46: // On MacOSX, 'new SecureRandom()' will use NativePRNG algorithm and
47: // it is also slower than SHA1PRNG.
48: // On Windows, 'new SecureRandom()' will use SHA1PRNG algorithm.
49: random = new SecureRandom();
50:
51: /*
52: try{
53: random=SecureRandom.getInstance("SHA1PRNG");
54: return;
55: }
56: catch(java.security.NoSuchAlgorithmException e){
57: // System.err.println(e);
58: }
59:
60: // The following code is for IBM's JCE
61: try{
62: random=SecureRandom.getInstance("IBMSecureRandom");
63: return;
64: }
65: catch(java.security.NoSuchAlgorithmException ee){
66: //System.err.println(ee);
67: }
68: */
69: }
70:
71: public void fill(byte[] foo, int start, int len) {
72: /*
73: // This case will not become true in our usage.
74: if(start==0 && foo.length==len){
75: random.nextBytes(foo);
76: return;
77: }
78: */
79: if (len > tmp.length) {
80: tmp = new byte[len];
81: }
82: random.nextBytes(tmp);
83: System.arraycopy(tmp, 0, foo, start, len);
84: }
85: }
|