* Do not make assumptions about string encoding

This commit is contained in:
Michaël Van Canneyt 2022-05-04 10:00:38 +02:00
parent c6e9c7c1f8
commit 82c27c72c9
3 changed files with 33 additions and 5 deletions

View File

@ -97,8 +97,36 @@ Function Base64 : TAlphabetEncoder;
Function Base64URL : TAlphabetEncoder; Function Base64URL : TAlphabetEncoder;
Function GetStandardEncoder(aEncoder : TStandardEncoder): TAlphabetEncoder; Function GetStandardEncoder(aEncoder : TStandardEncoder): TAlphabetEncoder;
Function GetRawStringBytes(S : String) : TBytes;
Function GetRawStringFromBytes(B : TBytes) : RawByteString;
implementation 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; Function TAlphabetEncoder.Encode(aBuffer : TBytes; doPad : Boolean = True) : AnsiString;
begin begin
@ -109,7 +137,7 @@ end;
function TAlphabetEncoder.Encode(Const aBuffer: AnsiString; doPad : Boolean = True): AnsiString; function TAlphabetEncoder.Encode(Const aBuffer: AnsiString; doPad : Boolean = True): AnsiString;
begin begin
Result:=Encode(TEncoding.UTF8.GetAnsiBytes(aBuffer),DoPad); Result:=Encode(GetRawBytesFromString(aBuffer),DoPad);
end; end;

View File

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

View File

@ -59,7 +59,7 @@ begin
PemLoadPublicKey64FromList(List,PrivateKey,PublicKey,PublicKeyX64,PublicKeyY64); PemLoadPublicKey64FromList(List,PrivateKey,PublicKey,PublicKeyX64,PublicKeyY64);
// Thumbprint // Thumbprint
S:='{"crv":"P-256","kty":"EC","x":"' + PublicKeyX64 + '","y":"' + PublicKeyY64 + '"}'; 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; end;
procedure PemLoadPublicKey64FromList(List: TStrings; out PrivateKey: TEccPrivateKey; out PublicKey: TEccPublicKey; out PublicKeyX64, PublicKeyY64: AnsiString); 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); procedure PemToDER(PEM: TBytes; const BeginTag, EndTag: String; out DER: TBytes);
begin begin
DER:=PemToDER(TEncoding.UTF8.GetAnsiString(PEM),BeginTag,EndTag); DER:=PemToDER(GetRawStringFromBytes(PEM),BeginTag,EndTag);
end; end;
procedure ASNParsePemSection(const PEM: TBytes; List: TStrings; const BeginTag, EndTag: String); procedure ASNParsePemSection(const PEM: TBytes; List: TStrings; const BeginTag, EndTag: String);
begin begin
ASNParsePemSection(TEncoding.UTF8.GetAnsiString(PEM),List,BeginTag,EndTag); ASNParsePemSection(GetRawStringFromBytes(PEM),List,BeginTag,EndTag);
end; end;
procedure ASNParsePemSection(const PEM: String; List: TStrings; const BeginTag, EndTag: String); procedure ASNParsePemSection(const PEM: String; List: TStrings; const BeginTag, EndTag: String);