Sehr geehrte Kolleginnen und Kollegen,
leider ist es uns bis jetzt noch nicht gelungen, unser Problem zu lösen und bitten daher um Hilfe: Im Anhang finden Sie einen Screenshot der Fehlermeldung, sowie eine .rxj Datei, welche das Problem veranschaulichen soll.
Die zu implementierende Klasse aus der BouncyCastle Library lautet "SHA256Digest" org.bouncycastle.crypto.digests.SHA256Digest
Unserer Meinung nach entsteht das Problem folgendermaßen: Die Klasse besitzt die Methode "doFinal", als Parameter unter anderem ein leeres ByteArray (mit passender Größe!) bekommt. In dieses ByteArray werden die verarbeiteten Daten hineinkopiert. Dies ist in Java problemlos möglich, allerdings sind wir in oorexx bislang daran gescheitert.
verwendete versionen: ooRexx: Open Object Rexx Version 5.0.0 r12342 BSF4ooRexx: bsf4ooRexx-v641-20211118-bin.jar JAVA: openjdk version "17.0.1" 2021-10-19 LTS BouncyCastle: bcprov-ext-jdk15on-170.jar
Wir sind für jegliche Hilfe dankbar! Mit freundlichen Grüßen Antonia und Elias
Liebe Gruppe,
bitte posten Sie die Rexx-Anweisungen und die *vollständige* Fehlerausgabe, die entsteht!
Wenn Sie nicht alle Informationen so exakt wie möglich mitteilen, kann man Ihnen nicht direkt helfen!
Mit freundlichem Gruß
Rony G. Flatscher
On 29.01.2022 16:54, Elias Haueis wrote:
Sehr geehrte Kolleginnen und Kollegen,
leider ist es uns bis jetzt noch nicht gelungen, unser Problem zu lösen und bitten daher um Hilfe: Im Anhang finden Sie einen Screenshot der Fehlermeldung, sowie eine .rxj Datei, welche das Problem veranschaulichen soll.
Die zu implementierende Klasse aus der BouncyCastle Library lautet "SHA256Digest" org.bouncycastle.crypto.digests.SHA256Digest
Unserer Meinung nach entsteht das Problem folgendermaßen: Die Klasse besitzt die Methode "doFinal", als Parameter unter anderem ein leeres ByteArray (mit passender Größe!) bekommt. In dieses ByteArray werden die verarbeiteten Daten hineinkopiert. Dies ist in Java problemlos möglich, allerdings sind wir in oorexx bislang daran gescheitert. verwendete versionen: ooRexx: Open Object Rexx Version 5.0.0 r12342 BSF4ooRexx: bsf4ooRexx-v641-20211118-bin.jar JAVA: openjdk version "17.0.1" 2021-10-19 LTS BouncyCastle: bcprov-ext-jdk15on-170.jar
Wir sind für jegliche Hilfe dankbar! Mit freundlichen Grüßen Antonia und Elias
Sehr geehrter Herr Professor Flatscher,
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: */ 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)
::requires bsf.cls [cid:5bcc315c-a7b0-4644-b146-4f71cc120d13]
Mit freundlichen Grüßen Elias Haueis
________________________________ Von: Aj2021w aj2021w-bounces@alice.wu.ac.at im Auftrag von Rony G. Flatscher Rony.Flatscher@wu.ac.at Gesendet: Samstag, 29. Jänner 2022 17:17 An: aj2021w@alice.wu.ac.at aj2021w@alice.wu.ac.at Betreff: Re: [Aj2021w] Abschlussprojekt, Bitte um Hilfe
Liebe Gruppe,
bitte posten Sie die Rexx-Anweisungen und die *vollständige* Fehlerausgabe, die entsteht!
Wenn Sie nicht alle Informationen so exakt wie möglich mitteilen, kann man Ihnen nicht direkt helfen!
Mit freundlichem Gruß
Rony G. Flatscher
On 29.01.2022 16:54, Elias Haueis wrote: Sehr geehrte Kolleginnen und Kollegen,
leider ist es uns bis jetzt noch nicht gelungen, unser Problem zu lösen und bitten daher um Hilfe: Im Anhang finden Sie einen Screenshot der Fehlermeldung, sowie eine .rxj Datei, welche das Problem veranschaulichen soll.
Die zu implementierende Klasse aus der BouncyCastle Library lautet "SHA256Digest" org.bouncycastle.crypto.digests.SHA256Digest
Unserer Meinung nach entsteht das Problem folgendermaßen: Die Klasse besitzt die Methode "doFinal", als Parameter unter anderem ein leeres ByteArray (mit passender Größe!) bekommt. In dieses ByteArray werden die verarbeiteten Daten hineinkopiert. Dies ist in Java problemlos möglich, allerdings sind wir in oorexx bislang daran gescheitert.
verwendete versionen: ooRexx: Open Object Rexx Version 5.0.0 r12342 BSF4ooRexx: bsf4ooRexx-v641-20211118-bin.jar JAVA: openjdk version "17.0.1" 2021-10-19 LTS BouncyCastle: bcprov-ext-jdk15on-170.jar
Wir sind für jegliche Hilfe dankbar! Mit freundlichen Grüßen Antonia und Elias
-- -- __________________________________________________________________________________
Prof. Dr. Rony G. Flatscher Department Wirtschaftsinformatik und Operations Management Institut für Wirtschaftsinformatik und Gesellschaft D2c 2.086 WU Wien Welthandelsplatz 1 A-1020 Wien/Vienna, Austria/Europe
http://www.wu.ac.at __________________________________________________________________________________
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
-- __________________________________________________________________________________
Prof. Dr. Rony G. Flatscher Department Wirtschaftsinformatik und Operations Management Institut für Wirtschaftsinformatik und Gesellschaft D2c 2.086 WU Wien Welthandelsplatz 1 A-1020 Wien/Vienna, Austria/Europe
http://www.wu.ac.at __________________________________________________________________________________
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
Lieber Herr Haueis, liebe Frau Buchner,
so, hatte etwas Zeit, konnte BouncyCastle 169 hier zum Download finden:
https://polydistortion.net/bc/, konkret: https://polydistortion.net/bc/download/bcprov-ext-jdk15on-169.jar
Nach dem Herunterladen und Hinzufügen zu meinem CLASSPATH funktioniert das folgende Programm, das ich aus pädagogischen Gründen etwas abgeändert habe:
a = "Some test string" -- some value to be digetsted arr=BsfRawBytes(a) -- turn into a Java byte array say "digesting :" pp(a)
-- create a SHA256Digest object sha256=.bsf~new("org.bouncycastle.crypto.digests.SHA256Digest") sha256~update(arr, 0, length(a))
-- create byte array to receive final digest array1 = bsf.createJavaArray("byte.class", sha256~getDigestSize) sha256~doFinal(array1, 0)
-- turn Java byte array into a Rexx string final=BsfRawBytes(array1) say "sha256 digest (raw):" pp(final) -- show raw digest say "sha256 digest (hex):" pp(final~c2x) -- show hexadecimal value
::requires "BSF.CLS" -- load ooRexx-Java bridge
Die Ausgabe:
digesting : [Some test string] sha256 digest (raw): [╝ǧ_┼↨Ñ^°K ┴ⁿêyπoW║4ƒ0╔4ê⌐¼◄qâαÜ] sha256 digest (hex): [BC80155FC517A55EF84B00C1FC8879E36F57BA349F30C93488A9AC117183E09A]
Hinweis für alle Seminarteilnehmer: probieren Sie es aus, mit BouncyCastle können Sie alle state-of-the-art Kryptografietechniken einfach in Ihren Rexxprogrammen einsetzen! :)
Mit freundlichem Gruß
Rony G. Flatscher
... cut ...
__________________________________________________________________________________
Prof. Dr. Rony G. Flatscher Department Wirtschaftsinformatik und Operations Management Institut für Wirtschaftsinformatik und Gesellschaft D2c 2.086 WU Wien Welthandelsplatz 1 A-1020 Wien/Vienna, Austria/Europe
http://www.wu.ac.at __________________________________________________________________________________
Sehr geehrter Herr Professor Flatscher,
Vielen Dank für Ihre Antwort und die schnelle und ausführliche Lösung unseres Problems! Sie haben uns sehr beim Projekt geholfen.
Bezüglich des Termines der Präsentation würden wir Mittwoch, 18:00 Uhr bevorzugen.
Mit freundlichen Grüßen Elias und Antonia ________________________________ Von: Aj2021w aj2021w-bounces@alice.wu.ac.at im Auftrag von Rony G. Flatscher Rony.Flatscher@wu.ac.at Gesendet: Samstag, 29. Jänner 2022 20:00 An: aj2021w@alice.wu.ac.at aj2021w@alice.wu.ac.at Betreff: [Aj2021w] Nutshell (Re: Abschlussprojekt, Bitte um Hilfe
Lieber Herr Haueis, liebe Frau Buchner,
so, hatte etwas Zeit, konnte BouncyCastle 169 hier zum Download finden:
https://polydistortion.net/bc/https://polydistortion.net/bc/, konkret: https://polydistortion.net/bc/download/bcprov-ext-jdk15on-169.jarhttps://polydistortion.net/bc/download/bcprov-ext-jdk15on-169.jar
Nach dem Herunterladen und Hinzufügen zu meinem CLASSPATH funktioniert das folgende Programm, das ich aus pädagogischen Gründen etwas abgeändert habe:
a = "Some test string" -- some value to be digetsted arr=BsfRawBytes(a) -- turn into a Java byte array say "digesting :" pp(a)
-- create a SHA256Digest object sha256=.bsf~new("org.bouncycastle.crypto.digests.SHA256Digest") sha256~update(arr, 0, length(a))
-- create byte array to receive final digest array1 = bsf.createJavaArray("byte.class", sha256~getDigestSize) sha256~doFinal(array1, 0)
-- turn Java byte array into a Rexx string final=BsfRawBytes(array1) say "sha256 digest (raw):" pp(final) -- show raw digest say "sha256 digest (hex):" pp(final~c2x) -- show hexadecimal value
::requires "BSF.CLS" -- load ooRexx-Java bridge
Die Ausgabe:
digesting : [Some test string] sha256 digest (raw): [╝ǧ_┼↨Ñ^°K ┴ⁿêyπoW║4ƒ0╔4ê⌐¼◄qâαÜ] sha256 digest (hex): [BC80155FC517A55EF84B00C1FC8879E36F57BA349F30C93488A9AC117183E09A]
Hinweis für alle Seminarteilnehmer: probieren Sie es aus, mit BouncyCastle können Sie alle state-of-the-art Kryptografietechniken einfach in Ihren Rexxprogrammen einsetzen! :)
Mit freundlichem Gruß
Rony G. Flatscher
... cut ...
__________________________________________________________________________________
Prof. Dr. Rony G. Flatscher Department Wirtschaftsinformatik und Operations Management Institut für Wirtschaftsinformatik und Gesellschaft D2c 2.086 WU Wien Welthandelsplatz 1 A-1020 Wien/Vienna, Austria/Europe
http://www.wu.ac.at __________________________________________________________________________________