Neues Thema starten

Auslesen der Seriennummer

Hallo zusammen,


wir sind uns inzwischen unsicher geworden, ob die Art und Weise, wie wir die Seriennummer auslesen korrekt ist... 


Ich bekomme von der entsprechenden DLL Funktion Bytes zurück, die ich dann nach Dokumentation Gastro-Mis nur mit Base64 encode?


Ist das korrekt? Vielleicht kann ein anderer Delphi-Kollege mir da helfen? :)


 

function TSwissbitAccess.tsePublicKey(pi : pWormInfo) : String;
var
  publicKey: PPByte;
  publicKeyLength: Pworm_uint;
  n : Integer;
  bytes : TBytes;
begin
  GetMem(publicKeyLength, 10);
  GetMem(publicKey, 20);

  worm_info_tsePublicKey(pi, publicKey, publicKeyLength);

  SetLength(bytes, (serialNumberLength^)-1);
  for n := 0 to (serialNumberLength^)-1 do begin
    bytes[n] := serialNumber^[n];
  end;

  Result := TNetEncoding.Base64.EncodeBytesToString(bytes);
end;

 


Danke und VG

Kevin


1 Person hat diese Frage

Sorry, das war der falsche Code im Zwischenspeicher :/


 Abruf der Seriennummer

function TSwissbitAccess.tseSerialNumber(pi : pWormInfo) : String;
var
  serialNumber: PPByte;
  serialNumberLength: Pworm_uint;
  n : Integer;
  bytes : TBytes;
begin
  GetMem(serialNumberLength, 10);
  GetMem(serialNumber, 20);

  worm_info_tseSerialNumber(pi, serialNumber, serialNumberLength);

  SetLength(bytes, (serialNumberLength^)-1);
  for n := 0 to (serialNumberLength^)-1 do begin
    bytes[n] := serialNumber^[n];
  end;

  Result := TNetEncoding.Base64.EncodeBytesToString(bytes);
end;

 

Wir machen das ganze so:  

procedure TSwissbitAccess.info_tseSerialNumber(info: Pointer; out serialNumber: String);
var
  tmpSerialNumber: PByteArray;
  tmpSerialNumberLength: Integer;
begin
  Assert(@worm_info_tseSerialNumber <> nil, 'Function not found: worm_info_tseSerialNumber');
  worm_info_tseSerialNumber(info, tmpSerialNumber, tmpSerialNumberLength);
  serialNumber := ByteArrayToHex(tmpSerialNumber, tmpSerialNumberLength);
end;

 

Die Funktion "ByteArrayToHex" macht dann folgendes: 

function TSwissbitAccess.ByteArrayToHex(bArray: PByteArray; Laenge: Integer): String;
var
  dataIn: TBytes;
  b: Byte;
begin
  SetLength(dataIn, Laenge);
  Move(bArray[0], dataIn[0], laenge);

  Result := '';
  for b in dataIn do
  begin
    Result := Result+IntToHex(b, 2);
  end;
end;

 Wir arbeiten mit Delphi XE3, deswegen kann es sein, dass wir das ein oder andere evtl. etwas anders machen, als es mit neueren Versionen möglich ist. 

@Dennis

Wie bindest Du die WormAPI.dll in Delphi XE3 ein?


mfg

Frank

Hallo Frank, 

wir nutzen die Stdcall-DLL und binden diese dynamisch ein.

Was brauchst du noch an Infos?


Mfg

Dennis


1 Person gefällt dies

@Dennis:


Das heißt du konvertierst die Bytes die zurückkommen nur in Hexadezimalform und gibst sie aus?
Weil in diesem Beispiel hier: https://gastro-misgmbh.freshdesk.com/support/solutions/articles/36000180682-code-samples

wird ja auch noch mit Base64 gehashed / verschlüsselt...


Das machst du wenn ich das sehe aktuell nicht, bin mir aber nicht ganz sicher ob ich das machen muss :D


MfG

Kevin

@Kevin


Du hast recht. Ich gebe das an der Stelle einfach als Hex zurück. Das Umwandeln in Base64 mache ich an einer anderen Stelle (bzw. hast du mich da gerade drauf gebracht :D) 


Bei den anderen Sachen (PublicKey und Signatur) habe ich das aber schon drin gehabt. 


MfG

Dennis

@Dennis


Haha, wir schaffen das hier doch gemeinsam :)


Kannst du mir den Gefallen tun und ein Beispiel von deinen PublicKey, Signatur und Seriennummer mal posten, damit ich sehe ob das irgendwie dem nahe kommt, was ich da habe?


VG

Kevin

@Kevin

Na klar: 

PublicKey: BIHrJW6EgK8G+T4OWvm9j1gfd/HIR5reu41yTGsNWzyAEgcAXuBweZF/Bp0X/g18O3ROMW9JLnaVD7fNPXQLRqiitiq2DRxAapSvBiew6YOlChm6J4X7ypuPDuKUL2h8ng==
Seriennummer: z05RFgap9pRGa0v8VIrqKFCiQULUbfqb79WIUpNlZXI=
Signatur: NB5hjDXC1eUvPgd6EvfqW8zCJ7ZjTu1HlxncPZIak7UX2t5Nrdmwp/sD4eqvB7xeUuUgkVdaObnMr5XE9gAo4FLvKX8Lgmxqo1OIdaGusvuga2W+25a/GH9kMlgR9BS/

 

 

@alle 

Die Seriennummer sollte immer im Oktett-Format übergeben werden (Taxonomie, Rechnung). Das Codebeispiel stammt noch von früher und wurde wahrscheinlich Copy-Paste eingefügt. Sie können die Seriennummer natürlich auch als Base64 speichern, aber übergeben sollten sie diese immer im Oktett-Format. PublicKey und Signatur dagegen als Base64-String :)

Die Seriennummer ist im Endeffekt nur der Hash des PublicKeys.

@Maximilian:


Jetzt stehe ich gerade auf dem Schlauch...

Oktett Format heißt ich soll die Bytes in Hexadezimaldarstellung als String ausgeben?


Genau :) Das ist bei der Seriennummer so vorgegeben.


1 Person gefällt dies

Vielleicht einmal zum Abgleich mit den Kollegen:


Seriennummer:76E0962B2DB01E75FDC23D8EA01EA61ACDD100A01EA5AD445DFDE307B517859C

Public Key:BAGqED33GyuUrluLNndB0BQhElWUF/XLiTe8hvotpPK44aMtym3E5uitejObf9MDBnaAaPorl7n5

M80RVvcNrU+SnKxpGh/AjT77NvN3d8dEcwpPFxZNFUzpeYNRIft+


@Dennis: Du hattest ja dann doch recht ;)



 

 

Hier auch nochmal meine Daten:
SerialNumber: 5CA0D982DC19297261B8239A2C1102A136CC730A2386EDC99F27B3D91DF58807
PublicKey:  BEysedQMmEEj1/v1KHXROJwCFWVaih8QO8caMfrndWO7C2vN/OSllcBx6+bdU72auWrvsMPF4RrabhML+6y8Pzghz/Jkewchw+1r9PJg1tvBMgZcC6q1IWSnhQxpIR/S8w==

@Kevin: Ich hätte ja auch mal nach schauen können :-D

Ist das so richtig für PublicKey?


  public string Myworm_info_tsePublicKey()
        {
            worm_info_tsePublicKey(info, out var intptr, out var count);

            byte[] publicKey = new byte[count];
            Marshal.Copy(intptr, publicKey, 0, count);

            string bitString = Convert.ToBase64String(publicKey);   
          
            return bitString;   
        }


Ergenbis:        BGS3kdfN5fV2LyYcCszUrciaz9kwoUCSIoTWN17j00pGox59vRjgUbXq / USoPD /          XbEb6HIIbIyqFtAqHAFXO77xI / zuV6VYjzS6ByKFANEhGRZps5ukLsG5qb07nYSFmfw ==

Anmelden oder Registrieren um einen Kommentar zu veröffentlichen