Browse Source

* Do not make assumptions about string encoding

Michaël Van Canneyt 3 years ago
parent
commit
82c27c72c9

+ 29 - 1
packages/fcl-base/src/basenenc.pp

@@ -97,8 +97,36 @@ Function Base64 : TAlphabetEncoder;
 Function Base64URL : TAlphabetEncoder;
 Function GetStandardEncoder(aEncoder : TStandardEncoder): TAlphabetEncoder;
 
+Function GetRawStringBytes(S : String) : TBytes;
+Function GetRawStringFromBytes(B : TBytes) : RawByteString;
+
 implementation
 
+Function GetRawStringFromBytes(B : TBytes) : RawByteString;
+
+Var
+  L : Integer;
+
+begin
+  L:=Length(B);
+  SetLength(Result,L);
+  If L>0 then
+    Move(B[0],Result[1],L);
+end;
+
+Function GetRawStringBytes(S : String) : TBytes;
+
+Var
+  L : Integer;
+
+begin
+  L:=Length(S);
+  SetLength(Result,L);
+  If L>0 then
+    Move(S[1],Result[0],L);
+end;
+
+
 Function TAlphabetEncoder.Encode(aBuffer : TBytes; doPad : Boolean = True) : AnsiString;
 
 begin
@@ -109,7 +137,7 @@ end;
 function TAlphabetEncoder.Encode(Const aBuffer: AnsiString; doPad : Boolean = True): AnsiString;
 
 begin
-  Result:=Encode(TEncoding.UTF8.GetAnsiBytes(aBuffer),DoPad);
+  Result:=Encode(GetRawBytesFromString(aBuffer),DoPad);
 end;
 
 

+ 1 - 1
packages/fcl-hash/src/fpasn.pp

@@ -767,7 +767,7 @@ begin
     BufToString(S2);
     if S2[1] = Char(#00) then
       Delete(S2,1,1);
-    BytesToHexStr(S,TEncoding.UTF8.GetAnsiBytes(S2));
+    BytesToHexStr(S,GetRawStringBytes(S2));
   end;
   ASNParseAdd(List, S, ASNType, ASNSize);
 end;

+ 3 - 3
packages/fcl-hash/src/fppem.pp

@@ -59,7 +59,7 @@ begin
   PemLoadPublicKey64FromList(List,PrivateKey,PublicKey,PublicKeyX64,PublicKeyY64);
   // Thumbprint
   S:='{"crv":"P-256","kty":"EC","x":"' + PublicKeyX64 + '","y":"' + PublicKeyY64 + '"}';
-  TSHA256.DigestBase64(TEncoding.UTF8.GetAnsiBytes(S),True,ThumbPrint);
+  TSHA256.DigestBase64(GetRawStringBytes(S),True,ThumbPrint);
 end;
 
 procedure PemLoadPublicKey64FromList(List: TStrings; out PrivateKey: TEccPrivateKey; out PublicKey: TEccPublicKey; out PublicKeyX64, PublicKeyY64: AnsiString);
@@ -346,12 +346,12 @@ end;
 
 procedure PemToDER(PEM: TBytes; const BeginTag, EndTag: String; out DER: TBytes);
 begin
-  DER:=PemToDER(TEncoding.UTF8.GetAnsiString(PEM),BeginTag,EndTag);
+  DER:=PemToDER(GetRawStringFromBytes(PEM),BeginTag,EndTag);
 end;
 
 procedure ASNParsePemSection(const PEM: TBytes; List: TStrings; const BeginTag, EndTag: String);
 begin
-  ASNParsePemSection(TEncoding.UTF8.GetAnsiString(PEM),List,BeginTag,EndTag);
+  ASNParsePemSection(GetRawStringFromBytes(PEM),List,BeginTag,EndTag);
 end;
 
 procedure ASNParsePemSection(const PEM: String; List: TStrings; const BeginTag, EndTag: String);