diff --git a/package.json b/package.json index 633312f9..16390103 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "license": "MIT", "dependencies": { "@abaplint/cli": "^2.106.5", - "@abaplint/runtime": "^2.8.23", + "@abaplint/runtime": "^2.8.24", "@abaplint/database-sqlite": "^2.8.0", - "@abaplint/transpiler-cli": "^2.8.23" + "@abaplint/transpiler-cli": "^2.8.24" } } diff --git a/src/sxml/cl_sec_sxml_writer.clas.abap b/src/sxml/cl_sec_sxml_writer.clas.abap new file mode 100644 index 00000000..1e855fb1 --- /dev/null +++ b/src/sxml/cl_sec_sxml_writer.clas.abap @@ -0,0 +1,34 @@ +CLASS cl_sec_sxml_writer DEFINITION PUBLIC. + PUBLIC SECTION. + CONSTANTS co_aes128_algorithm TYPE string VALUE 'http://www.w3.org/2001/04/xmlenc#aes128-cbc' ##NO_TEXT. + CONSTANTS co_aes192_algorithm TYPE string VALUE 'http://www.w3.org/2001/04/xmlenc#aes192-cbc' ##NO_TEXT. + CONSTANTS co_aes256_algorithm TYPE string VALUE 'http://www.w3.org/2001/04/xmlenc#aes256-cbc' ##NO_TEXT. + + CLASS-METHODS crypt_aes_ctr + IMPORTING + input TYPE xstring + key TYPE xstring + iv TYPE xstring + algorithm TYPE string DEFAULT co_aes128_algorithm + EXPORTING + result TYPE xstring. +ENDCLASS. + +CLASS cl_sec_sxml_writer IMPLEMENTATION. + + METHOD crypt_aes_ctr. + ASSERT algorithm = co_aes128_algorithm. + + WRITE '@KERNEL const crypto = await import("crypto");'. + + WRITE '@KERNEL const js_key = Buffer.from(key.get(), "hex");'. + WRITE '@KERNEL const js_iv = Buffer.from(iv.get(), "hex");'. + WRITE '@KERNEL const js_input = Buffer.from(input.get(), "hex");'. + + WRITE '@KERNEL const cipher = crypto.createDecipheriv("aes-128-ctr", js_key, js_iv);'. + WRITE '@KERNEL const encrypted = cipher.update(js_input);'. + + WRITE '@KERNEL result.set(encrypted.toString("hex").toUpperCase());'. + ENDMETHOD. + +ENDCLASS. \ No newline at end of file diff --git a/src/sxml/cl_sec_sxml_writer.clas.testclasses.abap b/src/sxml/cl_sec_sxml_writer.clas.testclasses.abap new file mode 100644 index 00000000..1782fc7b --- /dev/null +++ b/src/sxml/cl_sec_sxml_writer.clas.testclasses.abap @@ -0,0 +1,33 @@ +CLASS ltcl_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. + + PRIVATE SECTION. + METHODS crypt_aes_ctr FOR TESTING RAISING cx_static_check. + +ENDCLASS. + +CLASS ltcl_test IMPLEMENTATION. + + METHOD crypt_aes_ctr. + + DATA lv_emptyiv TYPE xstring VALUE '00000000000000000000000000000000'. + DATA lv_hash TYPE xstring. + DATA lv_key TYPE xstring. + + lv_key = '00112233445566778899112233445566'. + + cl_sec_sxml_writer=>crypt_aes_ctr( + EXPORTING + input = lv_emptyiv + key = lv_key + iv = lv_emptyiv + algorithm = cl_sec_sxml_writer=>co_aes128_algorithm + IMPORTING + result = lv_hash ). + + cl_abap_unit_assert=>assert_equals( + act = lv_hash + exp = '7223C1833065A1AFB8C900B221EDE011' ). + + ENDMETHOD. + +ENDCLASS. \ No newline at end of file