BMF-RKSV-Technik / at-registrierkassen-mustercode

111 stars 39 forks source link

Signaturerstellung #486

Open shawtaylor opened 7 years ago

shawtaylor commented 7 years ago

Hallo,

was muss ich den an textString übergeben, damit eine richtige Signatur erstellt wird? Verstehe ich nicht.

string textString = "Das ist ein Beispieltext der anstelle eines Registrierkasseneintrags signiert wird... "; byte[] text = Encoding.Unicode.GetBytes(textString); SHA256Managed crypt = new SHA256Managed(); byte[] hash = crypt.ComputeHash(text, 0, text.Length); crypt.Dispose();

   string hashString = Convert.ToBase64String(hash);

// String pin = "123456"; string pin = CardINI.ReadString("Card", "PIN", "123456");

    byte[] signature = null;
    for (int i = 0; i < 4; i++) {
        Stopwatch sw = new Stopwatch();
        sw.Restart();
        signature = smartCard.sign(pin, hash);
        sw.Stop();

    }

    smartCard.prepareSignature();
    for (int i = 0; i < 4; i++) {
        Stopwatch sw = new Stopwatch();
        sw.Restart();
        signature = smartCard.signWithoutSelection(pin, hash);
        sw.Stop();

    }
    string s3 = Convert.ToBase64String(signature);
    Console.WriteLine("Signature:  " + s3);

    CardINI.Write("Card", "Signature", s3.ToString());
    CardINI.Write("Card", "SignatureTime", DateTime.Now.ToString() );

    bool bOK = smartCard.verify(signature, text);
ErichFreitag commented 7 years ago

Wenn ich die Frage richtig verstehe - das was sie signieren wollen. Also wahrscheinlich header.payload, siehe Detailfragen 3.1.

shawtaylor commented 7 years ago

Klappt leider nicht. Vielleicht hat einer ja eine Idee. Signatur.zip

Habe mal meinen Quellcode (mit Testdaten) beigelegt.

Starten mit..... \NurSignatur\SampleClient\libReadCard.sln

florian-aistleithner commented 7 years ago

Also wir haben von Globaltrust ein Dokument mit Beispielcode in unterschiedlichen Programmiersprachen bekommen, wie man Daten mit der Smartcard signiert. Am Besten du fragst mal bei deiner Certificate Authority (A-Trust, Globaltrust, den dritten hab ich vergessen) nach.

Und was genau man signieren muss steht in dem Dokument mit den Detailfragen. Auch der Mustercode war hier sehr hilfreich!

Noch ein Tipp: Die ECDSA-Signatur muss nicht mittels DER encodiert werden, das benötigt nur der java verifier, sondern mit base64 (je nachdem ob fürs jws mit urlSafe oder für den maschinenlesbaren code/qr-code nicht url-safe)

EDIT: Ich sehe grad, das ist ja gar kein java, sondern c#-code...

larifari commented 7 years ago

Das Signaturverfahren heisst SHA256 ECDSA. Die Signaturkarte (also zumindestens die von A-trust) macht aber nur den ECDSA Teil, den SHA256 über JWSHeader.JWSPayload mußt Du vorher selber machen.