]> sjero.net Git - linphone/blob - p2pproxy/dependencies-src/jxse-src-2.5/impl/src/net/jxta/impl/util/JxtaHash.java
1d10121b6c225ecf0ec7abe6e21ca48385b5773b
[linphone] / p2pproxy / dependencies-src / jxse-src-2.5 / impl / src / net / jxta / impl / util / JxtaHash.java
1 /*
2  * Copyright (c) 2001-2007 Sun Microsystems, Inc.  All rights reserved.
3  *  
4  *  The Sun Project JXTA(TM) Software License
5  *  
6  *  Redistribution and use in source and binary forms, with or without 
7  *  modification, are permitted provided that the following conditions are met:
8  *  
9  *  1. Redistributions of source code must retain the above copyright notice,
10  *     this list of conditions and the following disclaimer.
11  *  
12  *  2. Redistributions in binary form must reproduce the above copyright notice, 
13  *     this list of conditions and the following disclaimer in the documentation 
14  *     and/or other materials provided with the distribution.
15  *  
16  *  3. The end-user documentation included with the redistribution, if any, must 
17  *     include the following acknowledgment: "This product includes software 
18  *     developed by Sun Microsystems, Inc. for JXTA(TM) technology." 
19  *     Alternately, this acknowledgment may appear in the software itself, if 
20  *     and wherever such third-party acknowledgments normally appear.
21  *  
22  *  4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must 
23  *     not be used to endorse or promote products derived from this software 
24  *     without prior written permission. For written permission, please contact 
25  *     Project JXTA at http://www.jxta.org.
26  *  
27  *  5. Products derived from this software may not be called "JXTA", nor may 
28  *     "JXTA" appear in their name, without prior written permission of Sun.
29  *  
30  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
31  *  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
32  *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN 
33  *  MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
34  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
35  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
36  *  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
37  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
38  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
39  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40  *  
41  *  JXTA is a registered trademark of Sun Microsystems, Inc. in the United 
42  *  States and other countries.
43  *  
44  *  Please see the license information page at :
45  *  <http://www.jxta.org/project/www/license.html> for instructions on use of 
46  *  the license in source files.
47  *  
48  *  ====================================================================
49  *  
50  *  This software consists of voluntary contributions made by many individuals 
51  *  on behalf of Project JXTA. For more information on Project JXTA, please see 
52  *  http://www.jxta.org.
53  *  
54  *  This license is based on the BSD license adopted by the Apache Foundation. 
55  */
56 package net.jxta.impl.util;
57
58
59 import java.util.*;
60 import java.io.File;
61 import java.math.BigInteger;
62 import java.io.InputStream;
63 import java.io.IOException;
64 import java.io.ByteArrayInputStream;
65 import java.security.MessageDigest;
66 import java.security.NoSuchAlgorithmException;
67
68 import java.util.logging.Logger;
69 import java.util.logging.Level;
70 import net.jxta.logging.Logging;
71
72
73 /**
74  *  A message digest wrapper to provide hashing using java.security.MesssageDigest
75  */
76 public class JxtaHash {
77     private final static Logger LOG = Logger.getLogger(JxtaHash.class.getName());
78     public final static String SHA = "SHA";
79     public final static String SHA1 = "SHA1";
80     public final static String MD2 = "MD2";
81     public final static String MD5 = "MD5";
82     public final static String DSA = "DSA";
83     public final static String RSA = "RSA";
84     public final static String SHA1withDSA = "SHA1WITHDSA";
85     private MessageDigest dig = null;
86
87     /**
88      * Default JxtaHash constructor, with the default algorithm SHA1
89      *
90      */
91     public JxtaHash() {
92         try {
93             dig = MessageDigest.getInstance(SHA1);
94         } catch (NoSuchAlgorithmException ex) {
95             if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
96                 LOG.fine(ex.toString());
97             }
98         }
99     }
100
101     /**
102      * Default JxtaHash constructor, with the default algorithm SHA1
103      *
104      * @param  expression  message to hash
105      */
106     public JxtaHash(String expression) {
107         this(SHA1, expression);
108     }
109
110     /**
111      * Constructor for the JxtaHash object
112      *
113      * @deprecated This implementation may produce inconsistent results
114      * based upon varience of the locale. (The locale of getBytes() is
115      * not defined).
116      *
117      * @param  algorithm   algorithm - the name of the algorithm requested
118      * @param  expression  expression to digest
119      */
120     @Deprecated
121     public JxtaHash(String algorithm, String expression) {
122                 
123         this(algorithm, expression.getBytes());
124     }
125
126     /**
127      * Constructor for the JxtaHash object
128      *
129      * @param  algorithm   algorithm - the name of the algorithm requested
130      * @param  expression  expression to digest
131      */
132     public JxtaHash(String algorithm, byte[] expression) {
133         try {
134             dig = MessageDigest.getInstance(algorithm);
135             if (expression != null) {
136                 dig.update(expression);
137             }
138         } catch (NoSuchAlgorithmException ex) {
139             if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
140                 LOG.fine(ex.toString());
141             }
142         }
143     }
144
145     /**
146      * Constructor for the JxtaHash object
147      *
148      * @param  expression  expression to digest
149      */
150     public void update(String expression) {
151         if (expression != null) {
152             dig.update(expression.getBytes());
153         }
154     }
155
156     /**
157      *  Gets the digest as digestInteger
158      *
159      * @return    The digestInteger value
160      */
161     public BigInteger getDigestInteger() {
162
163         return new BigInteger(dig.digest());
164     }
165
166     /**
167      *  Gets the digest as digestInteger
168      *
169      * @param  expression  expression to digest
170      * @return             The digestInteger value
171      */
172     public BigInteger getDigestInteger(byte[] expression) {
173         dig.reset();
174         dig.update(expression);
175         return new BigInteger(dig.digest());
176     }
177
178     /**
179      *  Gets the digest as digestInteger
180      *
181      * @param  expression  expression to digest
182      * @return             The digestInteger value
183      */
184     public BigInteger getDigestInteger(String expression) {
185
186         return getDigestInteger(expression.getBytes());
187     }
188
189     /**
190      *   Returns a int whose value is (getDigestInteger mod m).
191      *
192      * @param  m  the modulus.
193      * @return    (getDigestInteger mod m).
194      */
195     public int mod(long m) {
196         BigInteger bi = getDigestInteger();
197         BigInteger mod = new BigInteger(longToBytes(m));
198         BigInteger result = bi.mod(mod);
199
200         return result.intValue();
201     }
202
203     /**
204      *  convert a long into the byte array
205      *
206      * @param  value  long value to convert
207      * @return        byte array
208      */
209     private byte[] longToBytes(long value) {
210         byte[] bytes = new byte[8];
211
212         for (int eachByte = 0; eachByte < 8; eachByte++) {
213             bytes[eachByte] = (byte) (value >> ((7 - eachByte) * 8L));
214         }
215         return bytes;
216     }
217
218 }
219