1 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 ; 43 import java.security.NoSuchAlgorithmException ; 44 import java.security.NoSuchProviderException ; 45 import java.util.HashMap ; 46 import java.util.logging.Level ; 47 import java.util.logging.Logger ; 48 49 56 public class MhashModule extends AbstractQuercusModule { 57 private static final L10N L = new L10N(MhashModule.class); 58 private static final Logger 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 <Integer , MhashAlgorithm> _algorithmMap 90 = new HashMap <Integer , 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 []getLoadedExtensions() 126 { 127 return new String [] { "mhash" }; 128 } 129 130 131 private void addAlgorithm(int ordinal, String name, String 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 data, @Optional String key) 142 { 143 if (key.length() > 0) 144 throw new UnsupportedOperationException ("key"); 146 MhashAlgorithm algorithm = _algorithmMap.get(hash); 147 148 if (algorithm == null) 149 return BooleanValue.FALSE; 150 151 MessageDigest 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 StringValue dataV = new StringValueImpl(data); 161 162 byte[] result = messageDigest.digest(dataV.toString().getBytes()); 163 164 return new StringValueImpl(new String (result)); 165 } 166 167 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); } 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 197 public static class MhashAlgorithm 198 { 199 private String _name; 200 private String _javaName; 201 private String _javaProvider; 202 203 MhashAlgorithm(String name, String javaName, String javaProvider) 204 { 205 _name = name; 206 _javaName = javaName; 207 _javaProvider = javaProvider; 208 } 209 210 public MhashAlgorithm() 211 { 212 } 213 214 217 public void setName(String name) 218 { 219 _name = name; 220 } 221 222 public String getName() 223 { 224 return _name; 225 } 226 227 232 public void setJavaName(String javaName) 233 { 234 _javaName = javaName; 235 } 236 237 public String getJavaName() 238 { 239 return _javaName; 240 } 241 242 248 public void setJavaProvider(String javaProvider) 249 { 250 _javaProvider = javaProvider; 251 } 252 253 public String 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 271 public MessageDigest 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 ex) { 280 if (log.isLoggable(Level.FINE)) 281 log.log(Level.FINE, ex.toString(), ex); 282 283 return null; 284 } 285 catch (NoSuchProviderException 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 toString() 294 { 295 return 296 "MhashAlgorithm[name=" + _name + 297 " java-name=" + _javaName + 298 " java-provider=" + _javaProvider + 299 "]"; 300 } 301 } 302 } 303 304 | Popular Tags |