Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ASN.1 / DER dekodieren (https://www.delphipraxis.net/207568-asn-1-der-dekodieren.html)

OlliWW 9. Apr 2021 10:50

ASN.1 / DER dekodieren
 
Hallo,

Ich hoffe das hier ist der richtige Teilbereich, falls nicht, bitte verschieben.

Ich versuche gerade ein DER kodiertes ByteArray in einen (lesbaren) String umzuwandeln. Ich habe zwar bei Github irgendwelche Code Beispiele gefunden, die liefern aber nur wirres Zeug. Gibt es vielleicht eine schöne Methode in den Indy Komponenten oder in Delphi nativ?

Ich wäre für ein bisschen Hilfe dankbar :)

Bbommel 9. Apr 2021 11:47

AW: ASN.1 / DER dekodieren
 
Ich bin über ein ähnliches Problem gestolpert, als ich neulich "JSON Web Keys" auswerten wollte, um mit diesen Zertifikaten dann wiederum ein Token zu verifizieren. Da kam auch etwas in diesem DER-Format vor. Mein Code hier wandelt dieses X509/DER-kodierte Gedöns in einen ganz "normalen" String im PEM-Format um. Dabei helfen die Indys insofern, weil sie halt die ganzen Befehle der OpenSSL-Bibliothek bereitstellen, d.h., die eigentliche Arbeit macht OpenSSL und dort findet man auch die Doku zu den ganzen nötigen Kommandos.

Hier also mein Code - ob er genau zu deinem Problem passt, kann ich nicht sagen, aber ich vermute, es wird zumindest einiges dabei sein, was in eine passende Richtung geht:

Delphi-Quellcode:
function TwebConfig.ConvertBaseX509ToPEM(aWebKey: string): string;

(* Wenn wir ein Zertifikat vom OAuth-Server als JSON Web Key abfragen, so ist das dort in einem etwas anstrengenden
   Format angegeben, dass wir nicht direkt verwenden können. Was wir wollen: ein ganz normales Zertifikat im gängingen
   PEM-Format. Was wir haben: Einen Base64-String, welcher das Zertifikat im Format X509 enthält und das wiederum
   im Format "DER" (irgendwas aus den Achtzigern...) kodiert. Wenn man ein paarmal den Kopf gegen die Wand gehauen
   hat, versteht man irgendwann, wie man die OpenSSL-Bibliothek nutzen kann, um zum gewünschten PEM-Format zu kommen.
*)

var
  byteArray: TBytes;
  bytePubKey: TBytes;
  certX509: PX509;
  bio: PBIO;
  PArray: Pointer;

begin
  if IdSSLOpenSSLHeaders.Load then begin
    try
      byteArray:=TNetEncoding.Base64.DecodeStringToBytes(aWebKey);
      // das Array und auch einen Pointer auf das Array dürfen wir an d2i_x509 nicht direkt übergeben, sondern müssen
      // ihn in eine andere Pointer-Variable kopieren, da d2i diesen Pointer nachher hinter das übergebene Byte-Array
      // zeigen lässt. Wir würden den Speichermanager zerschießen, wenn wir direkt das Array bzw. einen Pointer darauf übergeben.
      // Und ja: wir übergeben tatsächlich einen Pointer auf den Pointer - somit kann eben der eigentliche Pointer
      // geändert werden (letztlich wird so also ein "var-Parameter" realisiert.
      PArray:=@byteArray[0];
      certX509:=d2i_X509(nil,@PArray,length(byteArray));
      if certX509<>nil then begin
        bio:=BIO_new(BIO_s_mem);
        PEM_write_bio_X509(bio,certX509);
        SetLength(bytePubKey,bio.num_write);
        BIO_read(bio,bytePubKey,BIo.num_write);
        Result:=string(PAnsiChar(@bytePubKey[0]));
        BIO_free(bio);
        X509_free(certX509);
        SetLength(bytePubKey,0);
      end else
        Result:='';
    except
      on e: exception do begin
        Result:='';
        fLastError:=_('Fehler bei der Verarbeitung des Öffentlichen Schlüssels aus dem JSON Web Key.')+' '+_('Fehlermeldung:')+' '+e.Message;
      end;
    end;
    SetLength(byteArray,0);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz