PageRenderTime 29ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/js/lib/Socket.IO-node/support/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/MD2.as

http://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs
ActionScript | 124 lines | 77 code | 16 blank | 31 comment | 8 complexity | e26a7cb7be65c40935b5c6bece3d8041 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, MPL-2.0-no-copyleft-exception, BSD-3-Clause
  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. package com.hurlant.crypto.hash
  24. {
  25. import flash.utils.ByteArray;
  26. public class MD2 implements IHash
  27. {
  28. public static const HASH_SIZE:int = 16;
  29. public var pad_size:int = 48; // probably will never get used, only here for SSL 3.0 support
  30. private static const S:Array = [ // PI Digits
  31. 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, 19,
  32. 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, 76, 130, 202,
  33. 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, 138, 23, 229, 18,
  34. 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, 245, 142, 187, 47, 238, 122,
  35. 169, 104, 121, 145, 21, 178, 7, 63, 148, 194, 16, 137, 11, 34, 95, 33,
  36. 128, 127, 93, 154, 90, 144, 50, 39, 53, 62, 204, 231, 191, 247, 151, 3,
  37. 255, 25, 48, 179, 72, 165, 181, 209, 215, 94, 146, 42, 172, 86, 170, 198,
  38. 79, 184, 56, 210, 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241,
  39. 69, 157, 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2,
  40. 27, 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
  41. 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, 234, 38,
  42. 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, 129, 77, 82,
  43. 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, 8, 12, 189, 177, 74,
  44. 120, 136, 149, 139, 227, 99, 232, 109, 233, 203, 213, 254, 59, 0, 29, 57,
  45. 242, 239, 183, 14, 102, 88, 208, 228, 166, 119, 114, 248, 235, 117, 75, 10,
  46. 49, 68, 80, 180, 143, 237, 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 ];
  47. public function MD2() { }
  48. public function getInputSize():uint
  49. {
  50. return 16;
  51. }
  52. public function getPadSize():int {
  53. return pad_size;
  54. }
  55. public function getHashSize():uint
  56. {
  57. return HASH_SIZE;
  58. }
  59. public function hash(src:ByteArray):ByteArray
  60. {
  61. var savedLength:uint = src.length;
  62. // 3.1 Step 1. Padding
  63. var i:uint = (16-src.length%16) || 16;
  64. do {
  65. src[src.length]=i;
  66. } while (src.length%16!=0);
  67. // 3.2 Step 2. Checksum
  68. var len:uint = src.length;
  69. var checksum:ByteArray = new ByteArray;
  70. var L:uint = 0;
  71. for (i = 0;i<len;i+=16) {
  72. for (var j:uint=0;j<16;j++) {
  73. L = checksum[j] ^= S[src[i+j] ^ L];
  74. }
  75. }
  76. src.position = src.length;
  77. src.writeBytes(checksum);
  78. len += 16;
  79. // 3.3 Step 3. MD Buffer
  80. var X:ByteArray = new ByteArray;
  81. // 3.4 Process Message
  82. for (i=0;i<len;i+=16) {
  83. /* Copy block i into X */
  84. for (j=0;j<16;j++) {
  85. X[32+j] = (X[16+j] = src[i+j])^X[j];
  86. }
  87. var t:uint=0;
  88. /* Do 18 rounds */
  89. for (j=0;j<18;j++) {
  90. /* Round j. */
  91. for (var k:uint=0;k<48;k++) {
  92. X[k] = t = X[k]^S[t];
  93. }
  94. t = (t+j)&0xff;
  95. }
  96. }
  97. // 3.5 Step 5. Output
  98. X.length = 16;
  99. // restore original length;
  100. src.length = savedLength;
  101. return X;
  102. }
  103. public function toString():String
  104. {
  105. return "md2";
  106. }
  107. }
  108. }