Neues Thema starten

Zertifikat der Swissbit-TSE auslesen

Hallo!


Für den DSFinV-K-Export benötigt man ja das Zertifkat der TSE (TSE_Zertifikat_I). Nun bietet das Swissbit-SDK eine Methode worm_getLogMessageCertificate() um das Zertifikat zu bekommen.


Leider ist der Aufruf so nie woanders verwendet und wir bringen es nicht hin unter c#. Wir schaffen es einfach nicht, einen bereits allokierten byte-buffer zu übergeben - sonst macht das immer das SDK.


Wir schaffen es, die länge auszulesen (out uint32 und den buffer als null übergeben) - aber den buffer dann auch befüllen, gelingt nicht.


Wäre super, wenn uns hier wer weiterhelfen könnte.

Dank im Voraus.


Sind ein wenig weiter. Der pInvoke Call schaut folgend aus:


 private static extern int worm_getLogMessageCertificate(IntPtr context, IntPtr publicKey, out UInt32 certificateLength);


Dann erstellen wir uns einen unmanaged-point, allokieren Speicher. Rufen die Methode ein erstes Mal (mit null-pointer) auf, um die tatscähliche größe zu bekommen.


IntPtr unmanagedPointer = Marshal.AllocHGlobal(1024*1024);

worm_getLogMessageCertificate(wormContext, IntPtr.Zero, out var certificateBufferLen));


Das funkt auch soweit. Nur beim zweiten Aufruf, um das Zertifikat zu bekommen, scheiten wir dann beim auslesen. Inzwischen kommen zwar keine Fehler mehr, aber die geschriebene Datei ist in der angegeben Größe voll mit "NULLs"


worm_getLogMessageCertificate(wormContext, unmanagedPointer, out certificateBufferLen);

certificateBuffer = new byte[certificateBufferLen*1024+1];
Marshal.Copy(certificateBuffer, 0, unmanagedPointer, (int)certificateBufferLen);
System.IO.File.WriteAllBytes(@"c:\temp\tse.pem", certificateBuffer);



Hallo @Tech Nick,


so funktioniert es bei mir mit C#:


public string GetLogMessageCertificate()

        {

            //CTSS aktivieren if not active

            if (!info.IsCTSSInterfaceActive())

                worm_tse_ctss_enable(worm_context);

 

            var length = 0;

 

            //1. request -> get length

            var error = worm_getLogMessageCertificate(worm_context, IntPtr.Zero, ref length);

            if (error != WormError.WORM_ERROR_NOERROR)

            {

                throw new Exception("Failed to get log message certificate, error: " + error);

            }

            IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(byte)) * length);

 

            //2. request -> get certificate

            error = worm_getLogMessageCertificate(worm_context, p, ref length);

            if (error != WormError.WORM_ERROR_NOERROR)

            {

                throw new Exception("Failed to get log message certificate, error: " + error);

            }

            var buffer = new byte[length];

            Marshal.Copy(p, buffer, 0, length);

            Marshal.FreeHGlobal(p);

 

            return Encoding.ASCII.GetString(buffer);

        }


2 Personen gefällt das

Hallo Vitalii Vasiak.


Vielen Dank für das Code Snippet. Es funktioniert so.


Der eigentliche Fehler war so klein und einfach - statt dem out für die Länge ein ref.


lg

Wo bekommt ihr eigentlich die ganzen Methoden her? Ich finde dazu irgendwie nichts und das SDK ist ja nur sehr lückenhaft befüllt mir den ganzen Informationen?


z.B. IsCTSSInterfaceActive

wie lese ich den Algorithmus aus?

Wie registriere ich nach dem Setup eine zweite Kasse auf der TSE?


könnt ihr mir da evtl. helfen?


Besten Dank.

Ich habe versucht, das ganze in VB-NET zu portieren - klappt leider nicht -> Rückgabe = 1 - ungültiger Parameter. Bisher konnte ich alle Funktionen der API wrappen, nur hier scheitere ich.


<DllImport("WormApi.dll", SetLastError:=True, CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)>

    Public Shared Function worm_getLogMessageCertificate(ByVal worm_context As IntPtr, ByRef cert As IntPtr, ByRef certLen As UInt32) As Integer

    End Function


Dim result As Integer = 0

Dim certLen As UInt32 = 0

result = worm_getLogMessageCertificate(worm_context, IntPtr.Zero, certLen)

Wie passt das exportierte Zertifikat überhaupt mit dem DSFinV-K-Export zusammen?


In der Spezifikation ist mit TSE_ZERTIFIKAT_I  und TSE_ZERTIFIKAT_II nur für 2000 Base64 Zeichen platz. Wenn ich das Zertifikat der TSE nun exportiere und nach Base64 umwandele ist die Zeichenkette 4405 Zeichen lang.

Natürlich kann ich dem Finanzamt nun die ersten 2000 Zeichen exportieren, aber was möchten die mit dem Teil anfangen? Dann haben sie den ersten von den drei Zertifikatsabschnitten und einen Teil des zweiten Abschnitts. Ich persönlich habe damit kein Problem damit :) Intern speichere ich es komplett und exportiere es denen auch wohl nur zum Teil. Sinn macht es für mich aber wenig...

Die aktuelle Version der DSFinV-K von vergangener Woche adressiert  dieses Thema.

Hat irgendjemand im Forum die Funktion zum Auslesen des TSE-Zertifikat

GetLogMessageCertificate()

unter VB.NET zum Laufen bekommen?
Ich komme nicht über den Fehler 1 (ungültige Parameter) hinweg.

 

Unter welcher Zertifizierungs ID ist die SwissbitTSE  zertifiziert?


Bei  cryptovision TSE ist unter der Zertifizierungs-ID BSI-K-TR-0374-2020.


Gibt es da eine Funktion wo ich es einfach auslesen kann?

Und welche der drei TSE-Zertifikat brauch ich für DSFinV_K in Kapitel "3.2.7 Datei: Stamm_TSE " für "TSE_ZERTIFIKAT_I /V"?

 

>Und welche der drei TSE-Zertifikat brauch ich für DSFinV_K in Kapitel "3.2.7 Datei: Stamm_TSE " für >"TSE_ZERTIFIKAT_I /V"?


Hallo,


ist die Frage mittlerweile gelöst?

In meinen TAR Dateien sind aich 3 Zertifikate in der PEM Datei vorhanden.

Welches wird benötigt?


Danke


"Und welche der drei TSE-Zertifikat brauch ich für DSFinV_K in Kapitel "3.2.7 Datei: Stamm_TSE " für "TSE_ZERTIFIKAT_I /V"?"


Ich habe das gleiche Problem, die PEM Datei in den TAR exporten enthält 3 Zertifikate. Welche nimmst du?


VG

Matthias

Da sie nicht benannt sind, habe ich einfach alles gespeichert. Die ganze PEM-Datei für "TSE_ZERTIFIKAT_I /V"


Falls dass falsch sein sollte, kann man ja immer noch Anpassungen vornehmen. Hab auch keine richtige  Antwort dafür bekommen. 

Aber bei Cryptovision-TSE, wird eine Tar-Datei mit drei Cert-Dateien als Inhalt zurückgegeben, eine diese Dateien besitzt dieselbe PublicKey wie der TSE. Diese Cert-Datei sollte dafür dann verwendet werden. 


Ich wusste auch nicht, dass man PEM-Dateien auch entpacken kann.

>Da sie nicht benannt sind, habe ich einfach alles gespeichert. Die ganze PEM-Datei für "TSE_ZERTIFIKAT_I >/V"


OK, vielen Dank, so mache ich es jetzt auch.

Die PEM Datei in den TAR Exporten ist exakt der gleiche Inhalt wie der String, den die Funktion GetLogMessageCertificate bei mir liefert. Damit wird das schon seine Richtigkeit haben.


VG


Anmelden oder Registrieren um einen Kommentar zu veröffentlichen