PageRenderTime 52ms CodeModel.GetById 35ms app.highlight 13ms RepoModel.GetById 1ms app.codeStats 0ms

/flash-src/third-party/com/hurlant/crypto/hash/MD2.as

http://github.com/gimite/web-socket-js
ActionScript | 124 lines | 77 code | 16 blank | 31 comment | 8 complexity | e26a7cb7be65c40935b5c6bece3d8041 MD5 | raw file
  1/**
  2 * MD2
  3 * 
  4 * An ActionScript 3 implementation of the RSA Data Security, Inc MD2 Message
  5 * Digest Algorithm, as defined in RFC 1319
  6 * Copyright (c) 2007 Henri Torgemane
  7 * 
  8 * See LICENSE.txt for full license information.
  9 * 
 10 * Excerpt from http://en.wikipedia.org/wiki/MD2:
 11 * > 
 12 * > Rogier and Chauvaud (1997) described collisions of MD2's compression function,
 13 * > although they were unable to extend the attack to the full MD2.
 14 * > 
 15 * > In 2004, MD2 was shown to be vulnerable to a preimage attack with time 
 16 * > complexity equivalent to 2104 applications of the compression function 
 17 * > (Muller, 2004). 
 18 * > The author concludes, "MD2 can no longer be considered a secure one-way 
 19 * > hash function".
 20 * 
 21 * also, this implementaton is quite slow.
 22 */
 23
 24package com.hurlant.crypto.hash
 25{
 26	import flash.utils.ByteArray;
 27
 28	public class MD2 implements IHash
 29	{
 30		public static const HASH_SIZE:int = 16;
 31		public var pad_size:int = 48; // probably will never get used, only here for SSL 3.0 support
 32		
 33		private static const S:Array = [ // PI Digits
 34 41,  46,  67, 201, 162, 216, 124,   1,  61,  54,  84, 161, 236, 240,   6,  19,
 35 98, 167,   5, 243, 192, 199, 115, 140, 152, 147,  43, 217, 188,  76, 130, 202,
 36 30, 155,  87,  60, 253, 212, 224,  22, 103,  66, 111,  24, 138,  23, 229,  18,
 37190,  78, 196, 214, 218, 158, 222,  73, 160, 251, 245, 142, 187,  47, 238, 122,
 38169, 104, 121, 145,  21, 178,   7,  63, 148, 194,  16, 137,  11,  34,  95,  33,
 39128, 127,  93, 154,  90, 144,  50,  39,  53,  62, 204, 231, 191, 247, 151,   3,
 40255,  25,  48, 179,  72, 165, 181, 209, 215,  94, 146,  42, 172,  86, 170, 198,
 41 79, 184,  56, 210, 150, 164, 125, 182, 118, 252, 107, 226, 156, 116,   4, 241,
 42 69, 157, 112,  89, 100, 113, 135,  32, 134,  91, 207, 101, 230,  45, 168,   2,
 43 27,  96,  37, 173, 174, 176, 185, 246,  28,  70,  97, 105,  52,  64, 126,  15,
 44 85,  71, 163,  35, 221,  81, 175,  58, 195,  92, 249, 206, 186, 197, 234,  38,
 45 44,  83,  13, 110, 133,  40, 132,   9, 211, 223, 205, 244,  65, 129,  77,  82,
 46106, 220,  55, 200, 108, 193, 171, 250,  36, 225, 123,   8,  12, 189, 177,  74,
 47120, 136, 149, 139, 227,  99, 232, 109, 233, 203, 213, 254,  59,   0,  29,  57,
 48242, 239, 183,  14, 102,  88, 208, 228, 166, 119, 114, 248, 235, 117,  75,  10,
 49 49,  68,  80, 180, 143, 237,  31,  26, 219, 153, 141,  51, 159,  17, 131,  20 ];
 50		
 51
 52        public function MD2() { }
 53
 54		public function getInputSize():uint
 55		{
 56			return 16;
 57		}
 58		
 59		public function getPadSize():int {
 60			return pad_size;
 61		}
 62		
 63		public function getHashSize():uint
 64		{
 65			return HASH_SIZE;
 66		}
 67		
 68		public function hash(src:ByteArray):ByteArray
 69		{
 70			var savedLength:uint = src.length;
 71			
 72			// 3.1 Step 1. Padding
 73			var i:uint = (16-src.length%16) || 16;
 74			do {
 75				src[src.length]=i;
 76			} while (src.length%16!=0);
 77			
 78			// 3.2 Step 2. Checksum
 79			var len:uint = src.length;
 80			var checksum:ByteArray = new ByteArray;
 81			var L:uint = 0;
 82			for (i = 0;i<len;i+=16) {
 83				for (var j:uint=0;j<16;j++) {
 84					L = checksum[j] ^= S[src[i+j] ^ L];
 85				}
 86			}
 87			src.position = src.length;
 88			src.writeBytes(checksum);
 89			len += 16;
 90			
 91			// 3.3 Step 3. MD Buffer
 92			var X:ByteArray = new ByteArray;
 93
 94			// 3.4 Process Message
 95			for (i=0;i<len;i+=16) {
 96				
 97				/* Copy block i into X */
 98				for (j=0;j<16;j++) {
 99					X[32+j] = (X[16+j] = src[i+j])^X[j];
100				}
101				var t:uint=0;
102				/* Do 18 rounds */
103				for (j=0;j<18;j++) {
104					/* Round j. */
105					for (var k:uint=0;k<48;k++) {
106						X[k] = t = X[k]^S[t];
107					}
108					t = (t+j)&0xff;
109				}
110			}
111			// 3.5 Step 5. Output
112			X.length = 16;
113			// restore original length;
114			src.length = savedLength;
115			return X;
116		}
117		
118		public function toString():String
119		{
120			return "md2";
121		}
122		
123	}
124}