Browse Source

fcl-hash: fixed ASNParse_GetIntBytes for ASNSize<8

mattias 3 years ago
parent
commit
606f27563e
1 changed files with 24 additions and 2 deletions
  1. 24 2
      packages/fcl-hash/src/fpasn.pp

+ 24 - 2
packages/fcl-hash/src/fpasn.pp

@@ -65,6 +65,7 @@ procedure MibToId(Mib: String; var Result: String);
 procedure IdToMib(const Id: String; var Result: String); overload;
 procedure IdToMib(const Id: String; var Result: String); overload;
 function IdToMib(Buffer, BufferEnd: PByte): string; overload;
 function IdToMib(Buffer, BufferEnd: PByte): string; overload;
 procedure ASNDebug(const Buffer: TBytes; var Output: TBytes);
 procedure ASNDebug(const Buffer: TBytes; var Output: TBytes);
+procedure ASNDebugList(const Prefix: string; List: TStrings);
 procedure ASNParse(const Buffer: TBytes; List: TStrings);
 procedure ASNParse(const Buffer: TBytes; List: TStrings);
 procedure ASNParse_GetItem(List: TStrings; Index: integer; out ASNType, ASNSize: integer);
 procedure ASNParse_GetItem(List: TStrings; Index: integer; out ASNType, ASNSize: integer);
 function ASNParse_GetIntBytes(List: TStrings; ListIndex: integer; ID: int64): TBytes;
 function ASNParse_GetIntBytes(List: TStrings; ListIndex: integer; ID: int64): TBytes;
@@ -809,6 +810,16 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure ASNDebugList(const Prefix: string; List: TStrings);
+var
+  i, ASNType, ASNSize: Integer;
+begin
+  for i:=0 to List.Count-1 do begin
+    ASNParse_GetItem(List,i,ASNType,ASNSize);
+    writeln(Prefix,' ',i,'/',List.Count,' ASNType=',hexstr(ASNType,2),' ASNSize=',ASNSize,' S="',List[i],'"');
+  end;
+end;
+
 procedure ASNParse(const Buffer: TBytes; List: TStrings);
 procedure ASNParse(const Buffer: TBytes; List: TStrings);
 var
 var
   P, EndP: PByte;
   P, EndP: PByte;
@@ -833,12 +844,23 @@ end;
 function ASNParse_GetIntBytes(List: TStrings; ListIndex: integer; ID: int64
 function ASNParse_GetIntBytes(List: TStrings; ListIndex: integer; ID: int64
   ): TBytes;
   ): TBytes;
 var
 var
-  ASNType, ASNSize: Integer;
+  ASNType, ASNSize, i: Integer;
+  Value: Int64;
 begin
 begin
   ASNParse_GetItem(List,ListIndex,ASNType,ASNSize);
   ASNParse_GetItem(List,ListIndex,ASNType,ASNSize);
   if ASNType<>ASN1_INT then
   if ASNType<>ASN1_INT then
     raise Exception.Create(IntToStr(Id));
     raise Exception.Create(IntToStr(Id));
-  Result:=HexStrToBytes(List[ListIndex]);
+  if ASNSize<8 then
+  begin
+    SetLength(Result,ASNSize);
+    Value:=StrToInt64Def(List[ListIndex],0);
+    for i:=ASNSize-1 downto 0 do
+    begin
+      Result[i]:=Value and $ff;
+      Value:=Value shr 8;
+    end;
+  end else
+    Result:=HexStrToBytes(List[ListIndex]);
   if length(Result)<1 then
   if length(Result)<1 then
     raise Exception.Create(IntToStr(Id));
     raise Exception.Create(IntToStr(Id));
 end;
 end;