浏览代码

Add SHA256DigestFromString function.

Jordan Russell 5 月之前
父节点
当前提交
35d9e27fac
共有 1 个文件被更改,包括 24 次插入1 次删除
  1. 24 1
      Components/SHA256.pas

+ 24 - 1
Components/SHA256.pas

@@ -9,7 +9,7 @@ unit SHA256;
 interface
 
 uses
-  System.Hash;
+  SysUtils, System.Hash;
 
 type
   TSHA256Context = record
@@ -24,6 +24,7 @@ function SHA256Final(var ctx: TSHA256Context): TSHA256Digest;
 function SHA256Buf(const Buffer; Len: Cardinal): TSHA256Digest;
 function SHA256DigestsEqual(const A, B: TSHA256Digest): Boolean;
 function SHA256DigestToString(const D: TSHA256Digest): String;
+function SHA256DigestFromString(const S: String): TSHA256Digest;
 
 implementation
 
@@ -82,4 +83,26 @@ begin
   SetString(Result, Buf, 64);
 end;
 
+function SHA256DigestFromString(const S: String): TSHA256Digest;
+begin
+  if Length(S) <> 64 then
+    raise EConvertError.Create('Invalid string length');
+
+  for var I := 0 to 63 do begin
+    var B: Byte;
+    const C = UpCase(S.Chars[I]);
+    case C of
+      '0'..'9': B := Byte(Ord(C) - Ord('0'));
+      'A'..'F': B := Byte(Ord(C) - (Ord('A') - 10));
+    else
+      raise EConvertError.Create('Invalid digit character');
+    end;
+    const ResultIndex = I shr 1;
+    if not Odd(I) then
+      Result[ResultIndex] := Byte(B shl 4)
+    else
+      Result[ResultIndex] := Result[ResultIndex] or B;
+  end;
+end;
+
 end.