BMF-RKSV-Technik / at-registrierkassen-mustercode

111 stars 39 forks source link

Sig-Voriger-Beleg Vorgehensweise #473

Closed ep27 closed 7 years ago

ep27 commented 7 years ago

Hallo,

es hat hier schon einen ähnliches Problem gegeben (#376), aber aber mein Problem wird dadurch nicht leider auch nicht gelöst.

Ich habe mal aus dem DEP der cashbox-Demo 2 aufeinanderfolgende Zeilen kopiert: "eyJhbGciOiJFUzI1NiJ9.X1IxLUFUMF9ERU1PLUNBU0gtQk9YOTI0XzYzNTM1OF8yMDE3LTAzLTIyVDEzOjI4OjI4XzAsMDBfNTgsNTNfLTUsNTdfMTgsODBfOTEsMzlfVkZKQl81NDgyODA0MTk3OTUzOTU0NjUyX09BbmhIWWMwa2Q0PQ.R0yc5gX1CikMRwIqJUq97Uv4Cz_skvStLoGlSrheFZY3YiIdtex41Ws5A9iedGw1I2_pevp4NCTHrORYKEqyZg", "eyJhbGciOiJFUzI1NiJ9.X1IxLUFUMF9ERU1PLUNBU0gtQk9YOTI0XzYzNTM1OV8yMDE3LTAzLTIyVDEzOjI4OjI4Xy0xLDI3XzMsMDdfOSw1N18wLDAwXzQ0LDI2X1ZGSkJfNTQ4MjgwNDE5Nzk1Mzk1NDY1Ml9DbGRtSjlYZVdQWT0.U2ljaGVyaGVpdHNlaW5yaWNodHVuZyBhdXNnZWZhbGxlbg",

Entschlüsselt gibt das

_R1-AT0_DEMO-CASH-BOX924_635358_2017-03-22T13:28:28_0,0058,53-5,57_18,80_91,39_VFJB_5482804197953954652_OAnhHYc0kd4 und _R1-AT0_DEMO-CASH-BOX924_6353592017-03-22T13:28:28-1,27_3,07_9,57_0,00_44,26_VFJB_5482804197953954652_CldmJ9XeWP

womit bei der 2. Zeile der Wert sig-voriger Beleg CldmJ9XeWP ist.

Zur Berechnung dieser Signatur nimmt man ja von der ersten Zeile das Ergebnis der Signaturerstellung (also R0yc5gX1CikMRwIqJUq97Uv4Cz_skvStLoGlSrheFZY3YiIdtex41Ws5A9iedGw1I2_pevp4NCTHrORYKEqyZg) lässt sha256 drüberlaufen und erhält 28c2e48cb7061b8fd8a818851ed4bde683d1b0cb4578eb2dbe996c79399bcfcd und nimmt schließlich die ersten 8 Bytes was 16 hex-Zeichen sind, also 28c2e48cb7061b8f

Die codiert man wieder base64 und erhält MjhjMmU0OGNiNzA2MWI4Zg== was so gar nicht dem Wert CldmJ9XeWP entspricht, der tatsächlich im Datenerfassungsprotokoll der nächsten Zeile steht. Das sehe ich ja noch ein, weil ich den Hexwert als String codiert habe. Mache ich in PHP ein hex2bin und konvertiere das dann nach base64 erhalte ich KMLkjLcGG48= was zwar längenmäßig eher hinkommt, aber trotzdem nichts mit dem Wert im Datenerfassungsprotokoll zu tun hat.

Kann mir jemand sagen, wo ich den Fehler mache?

ep27 commented 7 years ago

Also einen Fehler habe ich schon gefunden. Wenn ich nicht nur die Signatur, sondern die gesamte Zeile also mit Algorithmus und Belegcodierung eingebe( in meinem Beispiel also eyJhbGciOiJFUzI1NiJ9.X1IxLUFUMF9ERU1PLUNBU0gtQk9YOTI0XzYzNTM1OV8yMDE3LTAzLTIyVDEzOjI4OjI4Xy0xLDI3XzMsMDdfOSw1N18wLDAwXzQ0LDI2X1ZGSkJfNTQ4MjgwNDE5Nzk1Mzk1NDY1Ml9DbGRtSjlYZVdQWT0.U2ljaGVyaGVpdHNlaW5yaWNodHVuZyBhdXNnZWZhbGxlbg), bekomme ich als Signatur CldmJ9XeWPY= - was im Endeffekt 2 Zeichen zu viel sind. Wieso die zu viel sind würde mich aber noch interessieren...

andreasschiestl commented 7 years ago

der Hash wird nicht nur von der Signatur berechnet sondern von der Kompakten JWS-Darstellung, das ist das was auch ins DEP geschrieben: <JWS-Header>.<JWS-Payload>.<JWS-Signatur> davon wird der SHA256 berechnet und davon 8 Bytes extrahiert und Base64 kodiert.

ep27 commented 7 years ago

Danke - das habe ich mittlerweile mitbekommen, aber trotzdem ist mein Ergebnis nicht ganz gleich - CldmJ9XeWPY= statt CldmJ9XeWP - ich gehe mal davon aus, dass ich nicht nach Belieben hinten was weglassen kann?

Für alle die es interessiert - ich mache es so:

$hash=hash("sha256",$input);
$hex=substr($hash,0,16);
$bin= hex2bin($hex);
print( base64_encode($bin));

aber das Ergebnis ist zu lang..

andreasschiestl commented 7 years ago

wer sagt dass CldmJ9XeWPY= zu lang ist, das sind 8 Bytes und es müssen 8 Bytes sein, CldmJ9XeWP wären nur 7 Bytes

ep27 commented 7 years ago

Vielen Dank - es steht so im DEP, das das Referenzprogramm (regkassen-demo-release-0.5) ausgibt und da steht eben CldmJ9XeWP drinnen und man denkt sich, dass das stimmen sollte, was da ausgegeben wird - man will ja seine Werte mit was vergleichen. Und nachdem ich auf diesem Gebiet kein Experte bin, habe ich angenommen, dass ich einen Fehler gemacht habe. Mit 7 Bytes habe ich es auch probiert, da habe ich CldmJ9XeWA== rausbekommen und 7,5 Bytes geht mit meinem Code nicht, weil hex2bin keine hex-Zahlen mit ungerader Länge annimmt.

Irgendwie bleibt einem da dann ein ungutes Gefühl, wenn man das Ergebnis nicht reproduzieren kann, auch wenn man sich recht sicher ist, alles richtig gemacht zu haben...

andreasschiestl commented 7 years ago

Ich würde mich an die das Dokument mit den Detailfragen halten und dort (Seite 31) ist es genauso lang. Ich habe das Demoprojekt nie ausgeführt sondern nur mal kurz überflogen.

ep27 commented 7 years ago

Das war der beste Tipp, den ich überhaupt bekommen konnte - ich habe nämlich dieses Dokument gar nicht gehabt und immer in den Detailspezifikationen nachgeschaut die nicht sehr ergiebig sind. Also Tausend Dank!