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.


Auch ich hänge bei GetLogMessageCertificate unter VB.Net fest (Fehler 1 ungültige Parameter) und würde mich über einen Tip freuen :


<DllImport("WormAPI.dll", CallingConvention:=CallingConvention.Cdecl)>

        Public Shared Function worm_getLogMessageCertificate(<[In]> ByVal context As IntPtr, <Out> ByRef certificate As IntPtr, <[In], Out> ByRef certificateLength As UInt32) As Integer

        End Function


Dim length As Integer = 0

Dim result = worm_getLogMessageCertificate(Me.worm_context, IntPtr.Zero, length)

Hallo,


Ich denke, du musst deine Variable length dann auch als unsigned int32 deklarieren!

Dim length as Unit32 = 0

Sonst passt ja deine Aufrufkonvention nicht. Ich gehe davon aus das der normale integer in VB.Net 64bittig ist.



Hallo, 

danke für die Rückmeldung ein uint32 und auch ein ulong für leider zum gleichen Ergebnis und es wird immer der Fehler 1 zurückgegeben.

Die Funktion worm_getLogMessageCertificate will bei certLength einen Zeiger auf einen UInt32!!! Keinen Uint32, du musst deinen Funktionsaufruf anpassen.


Dann ist es korrekt, einmal die Funktion aufrufen um die Länge des Zertifikats zu ermitten, dann damit dem Speicher auf das Array of AnsiChar reservieren und die Funktion noch mal mit dem Zeiger auf des ByteArray aufrufen.

VG

Danke für die Antwort, aber: In Vb.Net spielt im Gegensatz zu C# oder anderen Sprachen die Groß/Kleinschreibung im Code keinerlei Rolle. UInt32 oder Uint32 ist also das gleiche, es funktioniert leider nicht.

Ich hab aber mit keiner Silbe  geschrieben, dass du Gross/Kleinschreibung beachten sollst!

Ich hab geschrieben, dass die Funktion einen Zeiger(Pointer) auf eine UInt32 haben will und keinen UInt32 egal wie er geschrieben ist. Auch in VB wird es himmelweiter Unterschied sein, ob ein Integer oder einen Zeiger auf die Adress eines  Integer erwartet wird.

Der Pointer ist in Vb.Net ist bereits mit dem Schlüsselwort ByRef bei der Deklaration von worm_getLogMessageCertificate realisiert.

Ich würde es trotzdem so definieren:

statt ByRef certificateLength As UInt32

in ByVal certificateLength As IntPtr


und dann so aufrufen:

     Dim length As Unit32= 0
      Dim lenPtr AS IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(length))
      Dim result = worm_getLogMessageCertificate(Me.worm_context, IntPtr.Zero, lenPtr)
      length = Marshal.ReadInt32(lenPtr)
      Marshal.FreeHGlobal(ip)

Danke, es bleibt leider ohne Erfolg. Auch bei dieser Änderung bleibt es bei Fehler 1 (Invalid Parameter). 

Meine Definition:
    <DllImport("WormAPI.dll", CallingConvention:=CallingConvention.Cdecl)>
    Private Shared Function worm_getLogMessageCertificate(ByVal worm_context As IntPtr, ByVal certificate As Byte(), ByRef certificateLength As UInt32) As Integer
    End Function


Der Funktionsaufruf:

        Dim nCertLength As UInt32 = 0
        Dim Certificat As Byte() = Nothing
        Try
            Dim result As Integer = worm_getLogMessageCertificate(Worm_context, Nothing, nCertLength)

            If result <> 0 Then Throw New Exception(cMe & "." & cM & " : (1) Fehler beim Export des Zertifikats : " & result)

            Certificat = New Byte(nCertLength - 1) {}
            result = worm_getLogMessageCertificate(Worm_context, Certificat, nCertLength)

            If result <> 0 Then Throw New Exception(cMe & "." & cM & " : (2) Fehler beim Export des Zertifikats : " & result)
        Catch ex As Exception
            Protokoll(cMe & "." & cM & " : " & ex.ToString)
        Finally
            ExportCertificate = Certificat
        End Try

Und dann noch das Schreiben des Byte-Arrays in die Textdatei.

Using stream As FileStream = New FileStream(strFileName, FileMode.OpenOrCreate, FileAccess.Write)
Dim bytes As Byte() = cSwissBit.ks_TSE.ExportCertificate()
   stream.Write(bytes, 0, bytes.Length)
End Using

Funktioniert :)
Ich habe aber sehr lange gebraucht, bis ich diese Lösung hatte.


1 Person gefällt dies

Danke, damit hat es funktioniert. In der "Managed"-Welt sind die ganzen "P/Invokes" manchmal ein wenig irreführend. Idealerweise hätte der Hersteller der Sticks direkt einen Wrapper für die gängigsten Sprache  erstellen sollen.

Moin allerseits,


ich hol die Sachen mit der Anzahl der Zertifikate in der PEM-Datei nochmal hoch.

In der c-Doku steht unter "Modules -> Exporting Stored Data":


"Returns the certificate that can be used to verify the signatures of all log messages created by the TSE.

The returned data is a single PEM file, which contains multiple certificates, since the TSE's certificate is signed by other certificates. To verify the signature, only the leaf certificate (the first one in the PEM file) is required. To make sure the leaf certificate is genuine, the next certificate in the file can be used to verify the previous certificate until the last certificate is about to be checked, which will be the root certificate that must be trusted by the system. 

..."


Ich verstehe das so, dass nur das erste Zertifikat für die Prüfung der Signatur von Bedeutung ist. die beiden anderen dienen nur der Prüfung des ersten ...


Somit würde ich sagen, nur das erste muss in den  DSFinV-K-Export einfließen.


Hallo Thomas Metzler,

das ist korrekt.

Dieses PEM-File ist eine Zertifikats-Chain und umfaßt mehrere Zertifikate.

Das erste ist das Zertifikat der TSE, der Rest sind sog. Zwischenzertifikate. Diese dienen der Prüfung des ersten Zertifikates bis hin zum Root-Zertifikat (verankert im Browser oder im Betriebssystem).

Alle Zertifikate im PEM-File sind Base64 codiert.

Viele Grüße

U. Kleinert

Anmelden oder Registrieren um einen Kommentar zu veröffentlichen