/flash-src/third-party/com/gsolo/encryption/SHA1.as

http://github.com/gimite/web-socket-js · ActionScript · 218 lines · 133 code · 30 blank · 55 comment · 17 complexity · b13fac7b871bf7eff770d28dd2fc7f59 MD5 · raw file

  1. package com.gsolo.encryption {
  2. public class SHA1 {
  3. /*
  4. * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
  5. * in FIPS PUB 180-1
  6. * Version 2.1a Copyright Paul Johnston 2000 - 2002.
  7. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
  8. * Distributed under the BSD License
  9. * See http://pajhome.org.uk/crypt/md5 for details.
  10. *
  11. * Converted to AS3 By Geoffrey Williams
  12. */
  13. /*
  14. * Configurable variables. You may need to tweak these to be compatible with
  15. * the server-side, but the defaults work in most cases.
  16. */
  17. public static const HEX_FORMAT_LOWERCASE:uint = 0;
  18. public static const HEX_FORMAT_UPPERCASE:uint = 1;
  19. public static const BASE64_PAD_CHARACTER_DEFAULT_COMPLIANCE:String = "";
  20. public static const BASE64_PAD_CHARACTER_RFC_COMPLIANCE:String = "=";
  21. public static const BITS_PER_CHAR_ASCII:uint = 8;
  22. public static const BITS_PER_CHAR_UNICODE:uint = 8;
  23. public static var hexcase:uint = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
  24. public static var b64pad:String = ""; /* base-64 pad character. "=" for strict RFC compliance */
  25. public static var chrsz:uint = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
  26. public static function encrypt (string:String):String {
  27. return hex_sha1 (string);
  28. }
  29. /*
  30. * These are the functions you'll usually want to call
  31. * They take string arguments and return either hex or base-64 encoded strings
  32. */
  33. public static function hex_sha1 (string:String):String {
  34. return binb2hex (core_sha1( str2binb(string), string.length * chrsz));
  35. }
  36. public static function b64_sha1 (string:String):String {
  37. return binb2b64 (core_sha1 (str2binb (string), string.length * chrsz));
  38. }
  39. public static function str_sha1 (string:String):String {
  40. return binb2str (core_sha1 (str2binb (string), string.length * chrsz));
  41. }
  42. public static function hex_hmac_sha1 (key:String, data:String):String {
  43. return binb2hex (core_hmac_sha1 (key, data));
  44. }
  45. public static function b64_hmac_sha1 (key:String, data:String):String {
  46. return binb2b64 (core_hmac_sha1 (key, data));
  47. }
  48. public static function str_hmac_sha1 (key:String, data:String):String {
  49. return binb2str (core_hmac_sha1 (key, data));
  50. }
  51. /*
  52. * Perform a simple self-test to see if the VM is working
  53. */
  54. public static function sha1_vm_test ():Boolean {
  55. return hex_sha1 ("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
  56. }
  57. /*
  58. * Calculate the SHA-1 of an array of big-endian words, and a bit length
  59. */
  60. public static function core_sha1 (x:Array, len:Number):Array {
  61. /* append padding */
  62. x[len >> 5] |= 0x80 << (24 - len % 32);
  63. x[((len + 64 >> 9) << 4) + 15] = len;
  64. var w:Array = new Array(80);
  65. var a:Number = 1732584193;
  66. var b:Number = -271733879;
  67. var c:Number = -1732584194;
  68. var d:Number = 271733878;
  69. var e:Number = -1009589776;
  70. for(var i:Number = 0; i < x.length; i += 16) {
  71. var olda:Number = a;
  72. var oldb:Number = b;
  73. var oldc:Number = c;
  74. var oldd:Number = d;
  75. var olde:Number = e;
  76. for(var j:Number = 0; j < 80; j++) {
  77. if(j < 16) w[j] = x[i + j];
  78. else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
  79. var t:Number = safe_add (safe_add (rol (a, 5), sha1_ft (j, b, c, d)), safe_add (safe_add (e, w[j]), sha1_kt (j)));
  80. e = d;
  81. d = c;
  82. c = rol(b, 30);
  83. b = a;
  84. a = t;
  85. }
  86. a = safe_add(a, olda);
  87. b = safe_add(b, oldb);
  88. c = safe_add(c, oldc);
  89. d = safe_add(d, oldd);
  90. e = safe_add(e, olde);
  91. }
  92. return [a, b, c, d, e];
  93. }
  94. /*
  95. * Perform the appropriate triplet combination function for the current
  96. * iteration
  97. */
  98. public static function sha1_ft (t:Number, b:Number, c:Number, d:Number):Number {
  99. if(t < 20) return (b & c) | ((~b) & d);
  100. if(t < 40) return b ^ c ^ d;
  101. if(t < 60) return (b & c) | (b & d) | (c & d);
  102. return b ^ c ^ d;
  103. }
  104. /*
  105. * Determine the appropriate additive constant for the current iteration
  106. */
  107. public static function sha1_kt (t:Number):Number {
  108. return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;
  109. }
  110. /*
  111. * Calculate the HMAC-SHA1 of a key and some data
  112. */
  113. public static function core_hmac_sha1 (key:String, data:String):Array {
  114. var bkey:Array = str2binb (key);
  115. if (bkey.length > 16) bkey = core_sha1 (bkey, key.length * chrsz);
  116. var ipad:Array = new Array(16), opad:Array = new Array(16);
  117. for(var i:Number = 0; i < 16; i++) {
  118. ipad[i] = bkey[i] ^ 0x36363636;
  119. opad[i] = bkey[i] ^ 0x5C5C5C5C;
  120. }
  121. var hash:Array = core_sha1 (ipad.concat (str2binb(data)), 512 + data.length * chrsz);
  122. return core_sha1 (opad.concat (hash), 512 + 160);
  123. }
  124. /*
  125. * Add integers, wrapping at 2^32. This uses 16-bit operations internally
  126. * to work around bugs in some JS interpreters.
  127. */
  128. public static function safe_add (x:Number, y:Number):Number {
  129. var lsw:Number = (x & 0xFFFF) + (y & 0xFFFF);
  130. var msw:Number = (x >> 16) + (y >> 16) + (lsw >> 16);
  131. return (msw << 16) | (lsw & 0xFFFF);
  132. }
  133. /*
  134. * Bitwise rotate a 32-bit number to the left.
  135. */
  136. public static function rol (num:Number, cnt:Number):Number {
  137. return (num << cnt) | (num >>> (32 - cnt));
  138. }
  139. /*
  140. * Convert an 8-bit or 16-bit string to an array of big-endian words
  141. * In 8-bit function, characters >255 have their hi-byte silently ignored.
  142. */
  143. public static function str2binb (str:String):Array {
  144. var bin:Array = new Array ();
  145. var mask:Number = (1 << chrsz) - 1;
  146. for (var i:Number = 0; i < str.length * chrsz; i += chrsz) bin[i>>5] |= (str.charCodeAt (i / chrsz) & mask) << (32 - chrsz - i%32);
  147. return bin;
  148. }
  149. /*
  150. * Convert an array of big-endian words to a string
  151. */
  152. public static function binb2str (bin:Array):String {
  153. var str:String = "";
  154. var mask:Number = (1 << chrsz) - 1;
  155. for (var i:Number = 0; i < bin.length * 32; i += chrsz) str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
  156. return str;
  157. }
  158. /*
  159. * Convert an array of big-endian words to a hex string.
  160. */
  161. public static function binb2hex (binarray:Array):String {
  162. var hex_tab:String = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  163. var str:String = "";
  164. for(var i:Number = 0; i < binarray.length * 4; i++) {
  165. str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
  166. hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
  167. }
  168. return str;
  169. }
  170. /*
  171. * Convert an array of big-endian words to a base-64 string
  172. */
  173. public static function binb2b64 (binarray:Array):String {
  174. var tab:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  175. var str:String = "";
  176. for(var i:Number = 0; i < binarray.length * 4; i += 3) {
  177. var triplet:Number = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16)
  178. | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
  179. | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
  180. for(var j:Number = 0; j < 4; j++) {
  181. if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
  182. else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
  183. }
  184. }
  185. return str;
  186. }
  187. }
  188. }