Lieber Herr Haueis,
habe in der Eile übersehen, dass update() mit einem Argument ein einzelnes byte erwartet, also müssen Sie die Version mit drei Argumenten verwenden, in etwa (ungestet):
a = "TESTSTRING" sha256=.bsf~new("org.bouncycastle.crypto.digests.SHA256Digest") sha256~update(BsfRawBytes(a), 0, length(a)) array1 = bsf.createJavaArray("byte.class", sha256~getDigestSize) sha256~doFinal(array1, 0)
Mit freundlichem Gruß
Rony G. Flatscher
On 29.01.2022 19:13, Rony G. Flatscher wrote:
Lieber Herr Haueis,
On 29.01.2022 18:03, Elias Haueis wrote:
die Fehlermeldung entsteht beim ausführen des Programms im Anhang, Zeile 18 , beim Aufruf der zuvor beschriebenen Methode. Die Dateien sind erneut im Anhang und hier: SHA256Digest = bsf.import("org.bouncycastle.crypto.digests.SHA256Digest")
a = "TESTSTRING" /* init */ sha256 = SHA256Digest~new /* sha256~update(BsfRawBytes(a), 0, length(BsfRawBytes(a))) */ /* java erkennt die argumente bei der oberen ausführung als strings, deswegen invokestrict: */
Das glaube ich nicht. Es ist zwar das dritte Argument falsch, aber prinzipiell ist die auskommentierte Anweisung korrekt. Nur, wenn Sie die Fehlermeldung nicht genau studieren, die Sie erhalten, kommen Sie sofort auf eine falsche Spur und zu falschen Theorien, die dann zu umständlichen Ansätzen führen, die aber dann oft ins Leere führen.
BsfRawBytes(a) erzeugt einen Java-Bytearray vom primitiven Typ "byte" und liefert ein Rexx-Objekt, das dieses Java-Objekt repräsentiert. Die Rexx-Funktion LENGTH() funktioniert nur für Rexx-Zeichenketten. In Ihrem Fall bewirkt die Nutzung von LENGTH() mit einem Objekt als Argument, dass ooRexx dem Objekt die Nachricht "string" schickt, um eine Zeichenkette zu erhalten, auf die dann LENGTH() ausgeführt wird.
Wenn ich die richtigen JavaDocs von BountyCastle gefunden habe (Sie geben diese Information, also den URL zu den JavaDocs Ihrer Fehlermeldung leider nicht mit), gibt es zwei Versionen von update(), eine mit einem Argument (byte Array) und eine mit drei Argumenten (byte-Array, offset, Anzahl der bytes, die verarbeitet werden sollen).
Die beiden folgenden Anweisungen müssten daher in Ihrem Fall funktionieren (ungetestet):
sha256~update(BsfRawBytes(a))
oder
sha256~update(BsfRawBytes(a),0,length(a))
Bitte probieren Sie es aus und lassen uns das Ergebnis wissen!
sha256~bsf.invokeStrict("update",object, BsfRawBytes(a),integer, 0,integer, length((a))) /* wird benötig zum erstellen des Bytearrays passender größe: */ digestsize = sha256~getDigestSize()
/* result = sha256~bsf.invokeStrict("doFinal", ,integer, 1) */ array1 = bsf.createJavaArray("byte.class", digestsize) /* ausgabe = sha256~doFinal(array1, 1) */ /* selbes problem: zweites argument wird als string erkannt, sollte integer sein */ ausgabe = sha256~bsf.invokeStrict("doFinal", Byte, array1, integer, 1)
Das 1. doFinal-Argument "array1" ist kein einzelnes "byte", sondern ein Java-Objekt vom Typ byte-Array. bsf.inovkeStrict wird daher bei der Angabe des Datentyps "Byte" eine Rexx-Zeichenkette verarbeiten, die einen Bytewert repräsentiert (gültige Werte sind Zeichenketten von "0" bis "255"). Da aber keine Zeichenkette, sondern ein Objekt übergeben wird, wird zunächst die Nachricht "string" dem Objekt "array1" geschickt und von der resultierenden Zeichenkette (letztendlich "objectname" des Objekts) übergeben, konkret (aufgrund der Fehlermeldung) "B@5b464ce8", was tatsächlich keine Zahl repräsentiert, daher auch der Fehler.
Das 2. doFinal-Argument ist laut den JavaDocs von "doFinal" die Zahl der bytes, vom Anfang des byte-Arrays gezählt, wo das Ergebnis gespeichert werden soll. Dies müsste in Ihrem Fall "0" sein, es soll das Ergebnis in den byte-Array von Anfang an (vom ersten Element an) übertragen werden. Java-Arrays sind 0-indiziert, daher "0".
Die Anweisung müsste daher lauten (ungetestet):
sha256~doFinal(array1, 0)
Bitte probieren Sie es aus und lassen uns das Ergebnis wissen!
::requires bsf.cls
Der Code-Abschnitt, den Sie zeigen könnte so geschrieben werden (ungetestet):
a = "TESTSTRING" sha256=.bsf~new("org.bouncycastle.crypto.digests.SHA256Digest") sha256~update(BsfRawBytes(a)) array1 = bsf.createJavaArray("byte.class", sha256~getDigestSize) sha256~doFinal(array1, 0)
Arbeiten Sie gerade mit Frau Buchner zusammen?
Mit freundlichem Gruß
Rony G. Flatscher