BMF-RKSV-Technik / at-registrierkassen-mustercode

111 stars 39 forks source link

ÜBERPRÜFUNG: "Gültigkeit der kryptographischen Kette": FEHLERHAFT #51

Closed anzun closed 8 years ago

anzun commented 8 years ago

Sehr geehrter Herr Teufl,

leider habe ich ein Problem beim Überprüfen der kryptographischen Kette, das ich nicht näher untersuchen kann....

test.zip

Können Sie mir hier weiterhelfen?

-----------Detailresultate fuer Paket-------------------
DEP Export Format Überprüfung

ÜBERPRÜFUNG: "DEP Export Format": ERFOLGREICH
++++++++++++++++++++++++++++++

-----------Detailresultate fuer Paket-------------------
Überprüfung von DEP-Export-Beleg-Gruppe 1

ÜBERPRÜFUNG: "Überprüfung ob Kassen-ID und Belegnummer einmalig": ERFOLGREICH
++++++++++++++++++++++++++++++

-----------Detailresultate fuer Paket-------------------
Überprüfung für Beleg 1

ÜBERPRÜFUNG: "Format: Anzahl Elemente": ERFOLGREICH
ÜBERPRÜFUNG: "Format: RK-Suite": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Datum/Uhrzeit Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Normal": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt1": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt2": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Besonders": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Null": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Normale Buchung": Es handelt sich um eine normale Buchung (keine Trainingsbuchung). (INFORMATION)
ÜBERPRÜFUNG: "Signatur kryptographisch": ERFOLGREICH
ÜBERPRÜFUNG: "Gültigkeit der kryptographischen Kette": ERFOLGREICH
ÜBERPRÜFUNG: "Verschlüsselter Umsatzzähler": ERFOLGREICH
++++++++++++++++++++++++++++++

-----------Detailresultate fuer Paket-------------------
Überprüfung für Beleg 2

ÜBERPRÜFUNG: "Format: Anzahl Elemente": ERFOLGREICH
ÜBERPRÜFUNG: "Format: RK-Suite": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Datum/Uhrzeit Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Normal": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt1": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt2": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Besonders": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Null": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Normale Buchung": Es handelt sich um eine normale Buchung (keine Trainingsbuchung). (INFORMATION)
ÜBERPRÜFUNG: "Signatur kryptographisch": ERFOLGREICH
ÜBERPRÜFUNG: "Gültigkeit der kryptographischen Kette": FEHLERHAFT
DETAILS: Gültigkeit der kryptographischen Kette ist nicht gegeben.

ÜBERPRÜFUNG: "Verschlüsselter Umsatzzähler": ERFOLGREICH
++++++++++++++++++++++++++++++
asitplus-pteufl commented 8 years ago

Hmm, kann ich so leider nicht sagen, weil entweder der Hash-Wert stimmt oder nicht.

Beim ersten Beleg stimmt es, d.h. sie verwenden wohl den HASH Algorithmus korrekt. Danach nicht mehr: Was ist denn der Input für den Hash-Algorithmus der weiteren Belege? Das muss die JWS-Repräsentation des vorigen Belegs sein (also eigentlich direkt der letzte Beleg der im DEP steht). Haben Sie das so oder ein Code Snippet das zeigt wie sie den Hash berechnen?

anzun commented 8 years ago

Gerne.

            // Von: e-commerce monitoring <hans.zeger@e-monitoring.at>
            // Datum: 11. März 2016 um 14:03
            // Betreff: Registrierkassenalgorithmuskennzeichen gemäß RKSV
            // Die Kennung für die RKS-CARD lautet AT2, der entsprechende String daher:
            // R1-AT2
            // Mit besten Grüßen
            // Hans G. Zeger, GF
            rka = "R1-AT2";
            /// <summary>
            /// derzeit ist die einzige relevante RK-Suite "R1" mit ES256, SHA-256
            /// und der JWSHeaderBase64Url = eyJhbGciOiJFUzI1NiJ9 dieser Base64-String entspricht {"alg":"ES256"}
            /// Folgende Parameter haengen vom AES Schluessel (Algorithmus) ab
            /// Anlage Seite 11 (2)
            /// Sobald ein in den Registrierkassenalgorithmuskennzeichen verwendeter Algorithmus nicht mehr
            /// im Anhang der SigV 2008 genannt wird und daher als unsicher gilt, 
            /// muss ein neues Registrierkassenalgorithmuskennzeichen mit sicheren Algorithmus definiert werden 
            /// und darf dieses auch bei bestehenden Registrierkassen nicht mehr eingesetzt werden...
            /// </summary>
            numberOfBytesExtractedFromPrevSigHash = 8;
            jwsSignatureAlgorithm = "ES256";
            aesKeySizeInBits = 256;
            keyStrengthInBytes = 32; // aesKeySizeInBits / 8 = Key Size: 32 Byte
            ivLengthInBytes = 16;
            hashAlgorithmForPreviousSignatureValue = "SHA-256";
            jwsHeaderBase64Url = "eyJhbGciOiJFUzI1NiJ9"; // = "eyJhbGciOiJFUzI1NiJ9" Base64-String entspricht {"alg":"ES256"}
                this.MachineCodeRepOfReceipt = "_" + rka
                    + "_" + this.CashRegisterId
                    + "_" + this.ReceiptNumber
                    + "_" + this.ReceiptDateTime
                    + "_" + strBetragSatzNormal
                    + "_" + strBetragSatzErmaessigt1
                    + "_" + strBetragSatzErmaessigt2
                    + "_" + strBetragSatzNull
                    + "_" + strBetragSatzBesonders
                    + "_" + this.TurnoverCounterBase64Encrypted
                    + "_" + this.SerialnumberCertificate
                    + "_" + this.SignatureExtractedSigPrev 
                    ;
string strJWSPayloadBase64Url = RksvHelper.Base64UrlEncode(Encoding.UTF8.GetBytes(this.MachineCodeRepOfReceipt));
string strJWSDataToBeSigned = jwsHeaderBase64Url + "." + strJWSPayloadBase64Url;
byte[] utf8DataToSign = Encoding.UTF8.GetBytes(strJWSDataToBeSigned);
this.SignatureBase64Url = RksvHelper.Base64UrlEncode(this.Signature);
this.JwsCompact = jwsHeaderBase64Url + "." + strJWSPayloadBase64Url + "." + this.SignatureBase64Url;
byte[] byteArrayHashedJwsCompact = mySHA256.ComputeHash(Encoding.UTF8.GetBytes(this.JwsCompact));
this.SignatureExtractedForNextSigPrev = extractBytesToBase64String(byteArrayHashedJwsCompact, numberOfBytesExtractedFromPrevSigHash);
webITSol commented 8 years ago

Das Problem haben wir gehabt wie wir den falschen (nicht den vorigen) Beleg zum Verketten geladen haben. Laden Sie SignatureExtractedForNextSigPrev tatsächlich von dem Beleg davor? (Außer beim ersten.)

anzun commented 8 years ago

Ja, genau

so sieht mein TestCode aus: myReceipt2RksvSignature.SignatureExtractedSigPrev = myStartReceiptRksvSignature.SignatureExtractedForNextSigPrev;

webITSol commented 8 years ago

Dann weiß ich leider auch nicht weiter. Aber wenn nur der 1. Beleg keine Fehlermeldung verursacht geht wahrscheinlich bei der Verkettung etwas schief. (Laden von SignatureExtractedForNextSigPrev, Laden von myStartReceiptRksvSignature (muss ja immer auf den vorigen Beleg zeigen), Reihenfolge beim Export,...)

anzun commented 8 years ago

Ja, ich habe den Test absichtlich sehr einfach gehalten: ich lasse alle Belege im Speicher und kann direkt auf die SignatureExtractedForNextSigPrev zugreifen. Auch die Reihenfolge ist dadurch absolut sichergestellt...

Daher meine Frage - kann ich mehr als nur "Gültigkeit der kryptographischen Kette": FEHLERHAFT zurückerhalten....

anzun commented 8 years ago

Wobei ich nicht ausschließen möchte, dass sich beim Umbau von Version 0.5 auf Version 0.6 (in Bezug auf Prüftool) in meiner Applikation ein Fehler eingeschlichen hat...

anzun commented 8 years ago

2016-03-22_09-50_screenshot_gdat-win7-test

asitplus-pteufl commented 8 years ago

Ich hab jetzt ihren 2. Beleg dekodiert: Beleg: "eyJhbGciOiJFUzI1NiJ9.X1IxLUFUMl80NTZfMl8yMDE2LTAzLTE4VDEzOjUxOjE0XzEsMDBfMjAwLDAwXzMwMDAsMDBfNTAwMDAwMCwwMF80MDAwMCwwMF9EckJyNGdaWXNkcHFKV0ZCK2k3bitBPT1fMDEwNEE3M0Q0NTU3RkNFMDI2MTIwQUMzNTZfNmJDVTVuU1JJZVg0U0d3K0xiZ3JoQT09.D0_nhmsMqR5asEFFQyvWEqTfEtOOibBCMZbmTqHbyHkp695LvHlp3skpoiNnToKnGW_LwCZzG_WgQPnySn1CFg",

Dekodierter Plaintext (das 2.Element): _R1-AT2_456_2_2016-03-18T13:51:14_1,00_200,00_3000,00_5000000,00_40000,00_DrBr4gZYsdpqJWFB+i7n+A==_0104A73D4557FCE026120AC356_6bCU5nSRIeX4SGw+LbgrhA==

Der Verkettungswert ist hier 6bCU5nSRIeX4SGw+LbgrhA==, der ist viel zu lange... da sollten ja nur die 8 bytes stehen.

anzun commented 8 years ago

Danke für den Hinweis.

ivLengthInBytes anstelle numberOfBytesExtractedFromPrevSigHash verwendet ... daher!

anzun commented 8 years ago

DANKE!

------------------Ergebnisse------------------
Verifikationsmodul: at.asitplus.regkassen.verification.core.verification.verificationmodules.DEPExportFormatVerificationModule

-----------Detailresultate fuer Paket-------------------
DEP Export Format Überprüfung

ÜBERPRÜFUNG: "DEP Export Format": ERFOLGREICH
++++++++++++++++++++++++++++++

-----------Detailresultate fuer Paket-------------------
Überprüfung von DEP-Export-Beleg-Gruppe 1

ÜBERPRÜFUNG: "Überprüfung ob Kassen-ID und Belegnummer einmalig": ERFOLGREICH
++++++++++++++++++++++++++++++

-----------Detailresultate fuer Paket-------------------
Überprüfung für Beleg 1

ÜBERPRÜFUNG: "Format: Anzahl Elemente": ERFOLGREICH
ÜBERPRÜFUNG: "Format: RK-Suite": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Datum/Uhrzeit Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Normal": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt1": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt2": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Besonders": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Null": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Normale Buchung": Es handelt sich um eine normale Buchung (keine Trainingsbuchung). (INFORMATION)
ÜBERPRÜFUNG: "Signatur kryptographisch": ERFOLGREICH
ÜBERPRÜFUNG: "Gültigkeit der kryptographischen Kette": ERFOLGREICH
ÜBERPRÜFUNG: "Verschlüsselter Umsatzzähler": ERFOLGREICH
++++++++++++++++++++++++++++++

-----------Detailresultate fuer Paket-------------------
Überprüfung für Beleg 2

ÜBERPRÜFUNG: "Format: Anzahl Elemente": ERFOLGREICH
ÜBERPRÜFUNG: "Format: RK-Suite": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Datum/Uhrzeit Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Normal": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt1": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt2": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Besonders": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Null": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Normale Buchung": Es handelt sich um eine normale Buchung (keine Trainingsbuchung). (INFORMATION)
ÜBERPRÜFUNG: "Signatur kryptographisch": ERFOLGREICH
ÜBERPRÜFUNG: "Gültigkeit der kryptographischen Kette": ERFOLGREICH
ÜBERPRÜFUNG: "Verschlüsselter Umsatzzähler": ERFOLGREICH
++++++++++++++++++++++++++++++

-----------Detailresultate fuer Paket-------------------
Überprüfung für Beleg 3

ÜBERPRÜFUNG: "Format: Anzahl Elemente": ERFOLGREICH
ÜBERPRÜFUNG: "Format: RK-Suite": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Datum/Uhrzeit Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Normal": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt1": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt2": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Besonders": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Null": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Normale Buchung": Es handelt sich um eine Stornobuchung (keine Trainingsbuchung). (INFORMATION)
ÜBERPRÜFUNG: "Signatur kryptographisch": ERFOLGREICH
ÜBERPRÜFUNG: "Gültigkeit der kryptographischen Kette": ERFOLGREICH
ÜBERPRÜFUNG: "Verschlüsselter Umsatzzähler": ERFOLGREICH
++++++++++++++++++++++++++++++

-----------Detailresultate fuer Paket-------------------
Überprüfung für Beleg 4

ÜBERPRÜFUNG: "Format: Anzahl Elemente": ERFOLGREICH
ÜBERPRÜFUNG: "Format: RK-Suite": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Datum/Uhrzeit Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Normal": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt1": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt2": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Besonders": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Null": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Normale Buchung": Es handelt sich um eine Trainingsbuchung.  (INFORMATION)
ÜBERPRÜFUNG: "Signatur kryptographisch": ERFOLGREICH
ÜBERPRÜFUNG: "Gültigkeit der kryptographischen Kette": ERFOLGREICH
ÜBERPRÜFUNG: "Verschlüsselter Umsatzzähler": ERFOLGREICH
++++++++++++++++++++++++++++++

-----------Detailresultate fuer Paket-------------------
Überprüfung für Beleg 5

ÜBERPRÜFUNG: "Format: Anzahl Elemente": ERFOLGREICH
ÜBERPRÜFUNG: "Format: RK-Suite": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Datum/Uhrzeit Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Normal": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt1": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Ermaessigt2": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Besonders": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Satz-Null": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Zeichen - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Umsatzzähler": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Signatur": ERFOLGREICH
ÜBERPRÜFUNG: "Format: Base64 Dekodierung/Kodierung - Verkettung voriger Beleg": ERFOLGREICH
ÜBERPRÜFUNG: "Normale Buchung": Es handelt sich um eine normale Buchung (keine Trainingsbuchung). (INFORMATION)
ÜBERPRÜFUNG: "Signatur kryptographisch": ERFOLGREICH
ÜBERPRÜFUNG: "Gültigkeit der kryptographischen Kette": ERFOLGREICH
ÜBERPRÜFUNG: "Verschlüsselter Umsatzzähler": ERFOLGREICH
++++++++++++++++++++++++++++++
asitplus-pteufl commented 8 years ago

gerne, perfekt wenn es jetzt funktioniert!