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);

        }


1 Person gefällt dies

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)

Anmelden oder Registrieren um einen Kommentar zu veröffentlichen