KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > caucho > quercus > lib > MhashModule


1 /*
2  * Copyright (c) 1998-2006 Caucho Technology -- all rights reserved
3  *
4  * This file is part of Resin(R) Open Source
5  *
6  * Each copy or derived work must preserve the copyright notice and this
7  * notice unmodified.
8  *
9  * Resin Open Source is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * Resin Open Source is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
17  * of NON-INFRINGEMENT. See the GNU General Public License for more
18  * details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Resin Open Source; if not, write to the
22  *
23  * Free Software Foundation, Inc.
24  * 59 Temple Place, Suite 330
25  * Boston, MA 02111-1307 USA
26  *
27  * @author Sam
28  */

29
30 package com.caucho.quercus.lib;
31
32 import com.caucho.config.ConfigException;
33 import com.caucho.quercus.annotation.Optional;
34 import com.caucho.quercus.env.BooleanValue;
35 import com.caucho.quercus.env.LongValue;
36 import com.caucho.quercus.env.StringValue;
37 import com.caucho.quercus.env.StringValueImpl;
38 import com.caucho.quercus.env.Value;
39 import com.caucho.quercus.module.AbstractQuercusModule;
40 import com.caucho.util.L10N;
41
42 import java.security.MessageDigest JavaDoc;
43 import java.security.NoSuchAlgorithmException JavaDoc;
44 import java.security.NoSuchProviderException JavaDoc;
45 import java.util.HashMap JavaDoc;
46 import java.util.logging.Level JavaDoc;
47 import java.util.logging.Logger JavaDoc;
48
49 /**
50  * Mhash functions.
51  *
52  * This module uses the {@link MessageDigest} class to calculate
53  * digests. Typical java installations support MD2, MD5, SHA1, SHA256, SHA384,
54  * and SHA512.
55  */

56 public class MhashModule extends AbstractQuercusModule {
57   private static final L10N L = new L10N(MhashModule.class);
58   private static final Logger JavaDoc log
59     = Logger.getLogger(MhashModule.class.getName());
60
61   public static final int MHASH_CRC32 = 0;
62   public static final int MHASH_MD5 = 1;
63   public static final int MHASH_SHA1 = 2;
64   public static final int MHASH_HAVAL256 = 3;
65   public static final int MHASH_RIPEMD160 = 5;
66   public static final int MHASH_TIGER = 7;
67   public static final int MHASH_GOST = 8;
68   public static final int MHASH_CRC32B = 9;
69   public static final int MHASH_HAVAL224 = 10;
70   public static final int MHASH_HAVAL192 = 11;
71   public static final int MHASH_HAVAL160 = 12;
72   public static final int MHASH_HAVAL128 = 13;
73   public static final int MHASH_TIGER128 = 14;
74   public static final int MHASH_TIGER160 = 15;
75   public static final int MHASH_MD4 = 16;
76   public static final int MHASH_SHA256 = 17;
77   public static final int MHASH_ADLER32 = 18;
78   public static final int MHASH_SHA224 = 19;
79   public static final int MHASH_SHA512 = 20;
80   public static final int MHASH_SHA384 = 21;
81   public static final int MHASH_WHIRLPOOL = 22;
82   public static final int MHASH_RIPEMD128 = 23;
83   public static final int MHASH_RIPEMD256 = 24;
84   public static final int MHASH_RIPEMD320 = 25;
85   public static final int MHASH_SNEFRU128 = 26;
86   public static final int MHASH_SNEFRU256 = 27;
87   public static final int MHASH_MD2 = 28;
88
89   private HashMap JavaDoc<Integer JavaDoc, MhashAlgorithm> _algorithmMap
90     = new HashMap JavaDoc<Integer JavaDoc, MhashAlgorithm>();
91
92   private int _highestOrdinal;
93
94   public MhashModule()
95   {
96     addAlgorithm(MHASH_CRC32, "CRC32", "CRC32");
97     addAlgorithm(MHASH_MD5, "MD5", "MD5");
98     addAlgorithm(MHASH_SHA1, "SHA1", "SHA-1");
99     addAlgorithm(MHASH_HAVAL256, "HAVAL256", "HAVAL-256");
100     addAlgorithm(MHASH_RIPEMD160, "RIPEMD160", "RIPEMD-160");
101     addAlgorithm(MHASH_TIGER, "TIGER", "TIGER");
102     addAlgorithm(MHASH_GOST, "GOST", "GOST");
103     addAlgorithm(MHASH_CRC32B, "CRC32B", "CRC32B");
104     addAlgorithm(MHASH_HAVAL224, "HAVAL224", "HAVAL-224");
105     addAlgorithm(MHASH_HAVAL192, "HAVAL192", "HAVAL-192");
106     addAlgorithm(MHASH_HAVAL160, "HAVAL160", "HAVAL-160");
107     addAlgorithm(MHASH_HAVAL128, "HAVAL128", "HAVAL-128");
108     addAlgorithm(MHASH_TIGER128, "TIGER128", "TIGER-128");
109     addAlgorithm(MHASH_TIGER160, "TIGER160", "TIGER-160");
110     addAlgorithm(MHASH_MD4, "MD4", "MD4");
111     addAlgorithm(MHASH_SHA256, "SHA256", "SHA-256");
112     addAlgorithm(MHASH_ADLER32, "ADLER32", "ADLER-32");
113     addAlgorithm(MHASH_SHA224, "SHA224", "SHA-224");
114     addAlgorithm(MHASH_SHA512, "SHA512", "SHA-512");
115     addAlgorithm(MHASH_SHA384, "SHA384", "SHA-384");
116     addAlgorithm(MHASH_WHIRLPOOL, "WHIRLPOOL", "WHIRLPOOL");
117     addAlgorithm(MHASH_RIPEMD128, "RIPEMD128", "RIPEMD-128");
118     addAlgorithm(MHASH_RIPEMD256, "RIPEMD256", "RIPEMD-256");
119     addAlgorithm(MHASH_RIPEMD320, "RIPEMD320", "RIPEMD-320");
120     addAlgorithm(MHASH_SNEFRU128, "SNEFRU128", "SNEFRU-128");
121     addAlgorithm(MHASH_SNEFRU256, "SNEFRU256", "SNEFRU-256");
122     addAlgorithm(MHASH_MD2, "MD2", "MD2");
123   }
124
125   public String JavaDoc []getLoadedExtensions()
126   {
127     return new String JavaDoc[] { "mhash" };
128   }
129
130
131   private void addAlgorithm(int ordinal, String JavaDoc name, String JavaDoc javaName)
132   {
133     MhashAlgorithm algorithm = new MhashAlgorithm(name, javaName, null);
134
135     _algorithmMap.put(ordinal, algorithm);
136
137     if (ordinal > _highestOrdinal)
138       _highestOrdinal = ordinal;
139   }
140
141   public Value mhash(int hash, String JavaDoc data, @Optional String JavaDoc key)
142   {
143     if (key.length() > 0)
144       throw new UnsupportedOperationException JavaDoc("key"); // XXX:
145

146     MhashAlgorithm algorithm = _algorithmMap.get(hash);
147
148     if (algorithm == null)
149       return BooleanValue.FALSE;
150
151     MessageDigest JavaDoc messageDigest = algorithm.createMessageDigest();
152
153     if (messageDigest == null) {
154       log.warning(L.l("no MessageDigest for {0}", algorithm));
155
156       return BooleanValue.FALSE;
157     }
158
159     // XXX: s/b "StringValue data" as parameter
160
StringValue dataV = new StringValueImpl(data);
161
162     byte[] result = messageDigest.digest(dataV.toString().getBytes());
163
164     return new StringValueImpl(new String JavaDoc(result));
165   }
166
167   /**
168    * Returns the highest available hash id.
169    */

170   public int mhash_count()
171   {
172     return _highestOrdinal;
173   }
174
175   public Value mhash_get_block_size(int hash)
176   {
177     MhashAlgorithm algorithm = _algorithmMap.get(hash);
178
179     if (algorithm == null || algorithm.createMessageDigest() == null)
180       return BooleanValue.FALSE;
181
182     return new LongValue(512); // XXX: stubbed
183
}
184
185   public Value mhash_get_hash_name(int hash)
186   {
187     MhashAlgorithm algorithm = _algorithmMap.get(hash);
188
189     if (algorithm == null)
190       return BooleanValue.FALSE;
191     else
192       return new StringValueImpl(algorithm.getName());
193   }
194
195   // XXX: public String mhash_keygen_s2k(int hash, String password, String salt, int bytes)
196

197   public static class MhashAlgorithm
198   {
199     private String JavaDoc _name;
200     private String JavaDoc _javaName;
201     private String JavaDoc _javaProvider;
202
203     MhashAlgorithm(String JavaDoc name, String JavaDoc javaName, String JavaDoc javaProvider)
204     {
205       _name = name;
206       _javaName = javaName;
207       _javaProvider = javaProvider;
208     }
209
210     public MhashAlgorithm()
211     {
212     }
213
214     /**
215      * The php name, for example `CRC32'.
216      */

217     public void setName(String JavaDoc name)
218     {
219       _name = name;
220     }
221
222     public String JavaDoc getName()
223     {
224       return _name;
225     }
226
227     /**
228      * The algorithm name to use when creating the java {@link MessageDigest}.
229      *
230      * @see MessageDigest#getInstance(String)
231      */

232     public void setJavaName(String JavaDoc javaName)
233     {
234       _javaName = javaName;
235     }
236
237     public String JavaDoc getJavaName()
238     {
239       return _javaName;
240     }
241
242     /**
243      * The provider name to use when creating the java {@link MessageDigest},
244      * null for the default.
245      *
246      * @see MessageDigest#getInstance(String, String)
247      */

248     public void setJavaProvider(String JavaDoc javaProvider)
249     {
250       _javaProvider = javaProvider;
251     }
252
253     public String JavaDoc getJavaProvider()
254     {
255       return _javaProvider;
256     }
257
258     public void init()
259       throws ConfigException
260     {
261       if (_name == null)
262         throw new ConfigException(L.l("`{0}' is required", "name"));
263
264       if (_javaName == null)
265         throw new ConfigException(L.l("`{0}' is required", "java-name"));
266     }
267
268     /**
269      * Create a MessageDigest using the javaName (and javaProvider, if not null).
270      */

271     public MessageDigest JavaDoc createMessageDigest()
272     {
273       try {
274         if (_javaProvider != null)
275           return MessageDigest.getInstance(_javaName, _javaProvider);
276         else
277           return MessageDigest.getInstance(_javaName);
278       }
279       catch (NoSuchAlgorithmException JavaDoc ex) {
280         if (log.isLoggable(Level.FINE))
281           log.log(Level.FINE, ex.toString(), ex);
282
283         return null;
284       }
285       catch (NoSuchProviderException JavaDoc ex) {
286         if (log.isLoggable(Level.FINE))
287           log.log(Level.FINE, ex.toString(), ex);
288
289         return null;
290       }
291     }
292
293     public String JavaDoc toString()
294     {
295       return
296         "MhashAlgorithm[name=" + _name +
297         " java-name=" + _javaName +
298         " java-provider=" + _javaProvider +
299         "]";
300     }
301   }
302 }
303
304
Popular Tags