瀏覽代碼

Fix crypto functions that use charCodeAt to get each byte from a String (#5091)

charCodeAt returns a short on UTF-16 platforms; So convert them to bytes first on those platforms
Closes #5090
Cauê Waneck 9 年之前
父節點
當前提交
300df2f769
共有 4 個文件被更改,包括 20 次插入3 次删除
  1. 4 1
      std/haxe/crypto/Md5.hx
  2. 4 1
      std/haxe/crypto/Sha1.hx
  3. 4 1
      std/haxe/crypto/Sha256.hx
  4. 8 0
      tests/unit/src/unit/issues/Issue5090.hx

+ 4 - 1
std/haxe/crypto/Md5.hx

@@ -137,6 +137,9 @@ class Md5 {
 	}
 
 	static function str2blks( str : String ){
+#if !(neko || cpp || php)
+		var str = haxe.io.Bytes.ofString(str);
+#end
 		var nblk = ((str.length + 8) >> 6) + 1;
 		var blks = new Array();
 
@@ -154,7 +157,7 @@ class Md5 {
 		var max = str.length;
 		var l = max * 8;
 		while( i < max ) {
-			blks[i >> 2] |= StringTools.fastCodeAt(str, i) << (((l + i) % 4) * 8);
+			blks[i >> 2] |= #if !(neko || cpp || php) str.get(i) #else StringTools.fastCodeAt(str, i) #end << (((l + i) % 4) * 8);
 			i++;
 		}
 		blks[i >> 2] |= 0x80 << (((l + i) % 4) * 8);

+ 4 - 1
std/haxe/crypto/Sha1.hx

@@ -105,6 +105,9 @@ class Sha1 {
 		Append padding bits and the length, as described in the SHA1 standard.
 	 */
 	static function str2blks( s :String ) : Array<Int> {
+#if !(neko || cpp || php)
+		var s = haxe.io.Bytes.ofString(s);
+#end
 		var nblk = ((s.length + 8) >> 6) + 1;
 		var blks = new Array<Int>();
 
@@ -112,7 +115,7 @@ class Sha1 {
 			blks[i] = 0;
 		for (i in 0...s.length){
 			var p = i >> 2;
-			blks[p] |= s.charCodeAt(i) << (24 - ((i & 3) << 3));
+			blks[p] |= #if !(neko || cpp || php) s.get(i) #else s.charCodeAt(i) #end << (24 - ((i & 3) << 3));
 		}
 		var i = s.length;
 		var p = i >> 2;

+ 4 - 1
std/haxe/crypto/Sha256.hx

@@ -113,6 +113,9 @@ class Sha256 {
 		Append padding bits and the length, as described in the SHA1 standard.
 	 */
 	static function str2blks( s :String ) : Array<Int> {
+#if !(neko || cpp || php)
+		var s = haxe.io.Bytes.ofString(s);
+#end
 		var nblk = ((s.length + 8) >> 6) + 1;
 		var blks = new Array<Int>();
 
@@ -120,7 +123,7 @@ class Sha256 {
 			blks[i] = 0;
 		for (i in 0...s.length){
 			var p = i >> 2;
-			blks[p] |= s.charCodeAt(i) << (24 - ((i & 3) << 3));
+			blks[p] |= #if !(neko || cpp || php) s.get(i) #else s.charCodeAt(i) #end << (24 - ((i & 3) << 3));
 		}
 		var i = s.length;
 		var p = i >> 2;

+ 8 - 0
tests/unit/src/unit/issues/Issue5090.hx

@@ -0,0 +1,8 @@
+package unit.issues;
+
+class Issue5090 extends Test {
+  public function test() {
+    eq(haxe.crypto.Sha1.encode('olá'), '3e16889d494632f3c528fb3a3756435f8aa88788');
+    eq(haxe.crypto.Sha1.encode('𝄞'), 'e4a5ca681e4b2fa112844dca54e7b868086aee0b');
+  }
+}