libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit 7ce7b83e2dbbaff530e74b4b5006b742471d59f8
parent d3521c623c46918adf121ec2dad3b0d33498bad0
Author: Marcello Stanisci <stanisci.m@gmail.com>
Date:   Wed, 29 Jan 2020 09:23:41 +0100

avoid NULL primary key

Diffstat:
Mnexus/src/main/kotlin/tech/libeufin/nexus/DB.kt | 1-
Mnexus/src/main/kotlin/tech/libeufin/nexus/Main.kt | 3++-
Msandbox/build.gradle | 1-
Msandbox/src/main/python/libeufin-cli | 4++--
Mutil/build.gradle | 10++--------
Autil/src/test/kotlin/EbicsMessagesTest.kt | 352+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dutil/src/test/resources/EbicsMessagesTest.kt | 351-------------------------------------------------------------------------------
7 files changed, 358 insertions(+), 364 deletions(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt @@ -26,7 +26,6 @@ object EbicsSubscribersTable : IdTable<String>() { class EbicsSubscriberEntity(id: EntityID<String>) : Entity<String>(id) { companion object : EntityClass<String, EbicsSubscriberEntity>(EbicsSubscribersTable) - var ebicsURL by EbicsSubscribersTable.ebicsURL var hostID by EbicsSubscribersTable.hostID var partnerID by EbicsSubscribersTable.partnerID diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt @@ -38,6 +38,7 @@ import io.ktor.response.respondText import io.ktor.routing.* import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty +import org.jetbrains.exposed.dao.EntityID import org.jetbrains.exposed.sql.StdOutSqlLogger import org.jetbrains.exposed.sql.addLogger import org.jetbrains.exposed.sql.transactions.transaction @@ -69,7 +70,7 @@ fun testData() { transaction { addLogger(StdOutSqlLogger) - EbicsSubscriberEntity.new { + EbicsSubscriberEntity.new(id = "default-customer") { ebicsURL = "http://localhost:5000/ebicsweb" userID = "USER1" partnerID = "PARTNER1" diff --git a/sandbox/build.gradle b/sandbox/build.gradle @@ -50,7 +50,6 @@ dependencies { application { - mainClassName = "tech.libeufin.sandbox.MainKt" } diff --git a/sandbox/src/main/python/libeufin-cli b/sandbox/src/main/python/libeufin-cli @@ -342,7 +342,7 @@ def sync(obj, customer_id): print(resp.content.decode("utf-8")) -@ebics.command(help="Retrieve all subscribers in the system") +@ebics.command(help="Retrieve all the customers managed by Nexus") @click.pass_obj def subscribers(obj): @@ -350,7 +350,7 @@ def subscribers(obj): try: resp = get(url) except Exception: - print("Could not reach the bank") + print("Could not reach Nexus at {}".format(url)) return print(resp.content.decode("utf-8")) diff --git a/util/build.gradle b/util/build.gradle @@ -4,12 +4,10 @@ plugins { id 'application' } - sourceCompatibility = "11" targetCompatibility = "11" version '1.0-snapshot' - compileKotlin { kotlinOptions { @@ -46,9 +44,4 @@ dependencies { testImplementation group: 'junit', name: 'junit', version: '4.12' testImplementation 'org.jetbrains.kotlin:kotlin-test-junit:1.3.50' testImplementation 'org.jetbrains.kotlin:kotlin-test:1.3.50' -} - -application { - mainClassName = "tech.libeufin.util.MainKt" -} - +} +\ No newline at end of file diff --git a/util/src/test/kotlin/EbicsMessagesTest.kt b/util/src/test/kotlin/EbicsMessagesTest.kt @@ -0,0 +1,351 @@ +import junit.framework.TestCase.assertEquals +import org.apache.xml.security.binding.xmldsig.SignatureType +import org.junit.Test +import org.w3c.dom.Element +import tech.libeufin.util.ebics_h004.* +import tech.libeufin.util.ebics_hev.HEVResponse +import tech.libeufin.util.ebics_hev.SystemReturnCodeType +import tech.libeufin.util.ebics_s001.SignatureTypes +import tech.libeufin.util.CryptoUtil +import tech.libeufin.util.XMLUtil +import javax.xml.datatype.DatatypeFactory +import kotlin.test.assertNotNull +import kotlin.test.assertTrue + +class EbicsMessagesTest { + /** + * Tests the JAXB instantiation of non-XmlRootElement documents, + * as notably are the inner XML strings carrying keys in INI/HIA + * messages. + */ + @Test + fun testImportNonRoot() { + val classLoader = ClassLoader.getSystemClassLoader() + val ini = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<SignaturePubKeyOrderData xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ebics.org/S001 http://www.ebics.org/S001/ebics_signature.xsd\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"http://www.ebics.org/S001\">\n <SignaturePubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>s5ktpg3xGjbZZgVTYtW+0e6xsWg142UwvoM3mfuM+qrkIa5bPUGQLH6BRL9IejYosPhoA6jwMBSxO8LfaageyZJt2M5wHklJYz3fADtQrV1bk5R92OaY/9ZZdHxw3xY93tm5JfVrMDW9DEK5B1hUzYFdjuN/qu2/sdE9mwhx2YjYwwdSQzv6MhbtSK9OAJjPGo3fkxsht6maSmRCdgxplIOSO2mmP1wjUzbVUMcrRk9KDMvnb3kCxiTm+evvxX6J4wpY1bAWukolJbaALHlFtgTo1LnulUe/BxiKx9HpmuEAaPsk8kgduXsz5OqH2g/Vyw75x51aKVPxOTBPyP+4kQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <SignatureVersion>A006</SignatureVersion>\n </SignaturePubKeyInfo>\n <PartnerID>flo-kid</PartnerID>\n <UserID>flo-uid</UserID>\n</SignaturePubKeyOrderData>") + assert(ini != null) + val jaxb = XMLUtil.convertStringToJaxb<SignatureTypes.SignaturePubKeyOrderData>(ini.readText()) + assertEquals("A006", jaxb.value.signaturePubKeyInfo.signatureVersion) + } + + /** + * Test string -> JAXB + */ + @Test + fun testStringToJaxb() { + val classLoader = ClassLoader.getSystemClassLoader() + val ini = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ebicsUnsecuredRequest Revision=\"1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\" Version=\"H004\"\n xmlns=\"urn:org:ebics:H004\">\n <header authenticate=\"true\">\n <static>\n <HostID>myhost</HostID>\n <PartnerID>k1</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>INI</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>\n eJx9U1tzmkAUfu9M/wNDH524XIINjprBaOIFCopg8CWzyHK/GHaR1V9fhtg0bWrf9nzfdy57LoN7mqXMEZU4KvIhy3c5lkH5vvCiPBiyFfFv7tj70dcvAzMKckiqEhmVu0QnvfRQOYEEMo1/jvsUR0M2JOTQB6Cu624tdosyAALH8eBZU819iDJ4E+WYwHyPWKbR93ELqsUekjb5B3fkRnvcRjCbCMxVBrTmC/5VXJdij72U5OErFXGAk0Gj8Rq3bxf1f7KzzfcZ5u8GzHO/aImGekNsmFboAjWgh/trU/mEvzFa4VVphUdYSsghEOlT7O52gb1xyLbDoR7F24C/Faz6WGhi5lda57VM5lByDetppc5647Uqz1HsFNgIC6UX19rYpPqd6kMYoNNuQQRNqmdJunDOoq9MyKq0eTeR1rKgQwfIu503o7VIHVkkmbTw7VKbbOXJdCmN+dA6O49eXP0Ar5UAsDeVszqkghM7de2Zq/Oxp4UuMZeyrixi46kQ/YTikPQyaGbrBy+gh3Sum7qQZQZfx9bZtS1tX64TeTnRjrkrJg802mQddDzS597itj44vKtsq6RIFy5U1Fn6SIJNwat5lVoIjGm0pPLskFVTBRo4uUsCr3rGZ0l/nQkBsE/1d4lKPFzaBtU3Y+NkdG6T1XA4AB+a/Gfrp/RQ5CgnI2WljFvdO/I+O/DP4Q3A50H/Xgv77YZGCsf1BuAT3O4QuLZEAwOWJEflfDJK+CbPu9WSFm7fVcNcns1BgmsXOfoJ1l5CIg==\n </OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>") + val jaxb = XMLUtil.convertStringToJaxb<EbicsUnsecuredRequest>(ini.readText()) + println("jaxb loaded") + assertEquals( + "INI", + jaxb.value.header.static.orderDetails.orderType + ) + } + + /** + * Test JAXB -> string + */ + @Test + fun testJaxbToString() { + val hevResponseJaxb = HEVResponse().apply { + this.systemReturnCode = SystemReturnCodeType().apply { + this.reportText = "[EBICS_OK]" + this.returnCode = "000000" + } + this.versionNumber = listOf(HEVResponse.VersionNumber.create("H004", "02.50")) + } + XMLUtil.convertJaxbToString(hevResponseJaxb) + } + + /** + * Test DOM -> JAXB + */ + @Test + fun testDomToJaxb() { + val classLoader = ClassLoader.getSystemClassLoader() + val ini = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ebicsUnsecuredRequest Revision=\"1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\" Version=\"H004\"\n xmlns=\"urn:org:ebics:H004\">\n <header authenticate=\"true\">\n <static>\n <HostID>myhost</HostID>\n <PartnerID>k1</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>INI</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>\n eJx9U1tzmkAUfu9M/wNDH524XIINjprBaOIFCopg8CWzyHK/GHaR1V9fhtg0bWrf9nzfdy57LoN7mqXMEZU4KvIhy3c5lkH5vvCiPBiyFfFv7tj70dcvAzMKckiqEhmVu0QnvfRQOYEEMo1/jvsUR0M2JOTQB6Cu624tdosyAALH8eBZU819iDJ4E+WYwHyPWKbR93ELqsUekjb5B3fkRnvcRjCbCMxVBrTmC/5VXJdij72U5OErFXGAk0Gj8Rq3bxf1f7KzzfcZ5u8GzHO/aImGekNsmFboAjWgh/trU/mEvzFa4VVphUdYSsghEOlT7O52gb1xyLbDoR7F24C/Faz6WGhi5lda57VM5lByDetppc5647Uqz1HsFNgIC6UX19rYpPqd6kMYoNNuQQRNqmdJunDOoq9MyKq0eTeR1rKgQwfIu503o7VIHVkkmbTw7VKbbOXJdCmN+dA6O49eXP0Ar5UAsDeVszqkghM7de2Zq/Oxp4UuMZeyrixi46kQ/YTikPQyaGbrBy+gh3Sum7qQZQZfx9bZtS1tX64TeTnRjrkrJg802mQddDzS597itj44vKtsq6RIFy5U1Fn6SIJNwat5lVoIjGm0pPLskFVTBRo4uUsCr3rGZ0l/nQkBsE/1d4lKPFzaBtU3Y+NkdG6T1XA4AB+a/Gfrp/RQ5CgnI2WljFvdO/I+O/DP4Q3A50H/Xgv77YZGCsf1BuAT3O4QuLZEAwOWJEflfDJK+CbPu9WSFm7fVcNcns1BgmsXOfoJ1l5CIg==\n </OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>")!! + val iniDom = XMLUtil.parseStringIntoDom(ini.readText()) + XMLUtil.convertDomToJaxb<EbicsUnsecuredRequest>( + EbicsUnsecuredRequest::class.java, + iniDom + ) + } + + @Test + fun testKeyMgmgResponse() { + val responseXml = EbicsKeyManagementResponse().apply { + header = EbicsKeyManagementResponse.Header().apply { + mutable = EbicsKeyManagementResponse.MutableHeaderType().apply { + reportText = "foo" + returnCode = "bar" + } + _static = EbicsKeyManagementResponse.EmptyStaticHeader() + } + version = "H004" + body = EbicsKeyManagementResponse.Body().apply { + returnCode = EbicsKeyManagementResponse.ReturnCode().apply { + authenticate = true + value = "000000" + } + } + } + val text = XMLUtil.convertJaxbToString(responseXml) + assertTrue(text.isNotEmpty()) + } + + @Test + fun testParseHiaRequestOrderData() { + val classLoader = ClassLoader.getSystemClassLoader() + val hia = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<HIARequestOrderData xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:org:ebics:H004 ebics_orders_H004.xsd\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"urn:org:ebics:H004\">\n <AuthenticationPubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>0Ekicvrcj2+8tsF+DZsWihl9W7AyVwtMLxq3qefSWagpfnV7BVsKYIJ/OhiWpvr3dz6K5lHSatzhG1x//jrZt6VHn5Wkkb0M0vayPUiZbe5s2aLabqfOTrt8TPnHwjZMChDHRmGoKI0OzLyQJ6MIfQrHZ5t61ccWubYO/bgbSnP9H39k8QEp0kmW4Tf4u+28GTLgueNAaaPTdCozZjrST4fH9nyhBUZ3nl+vZ+AiUNdl5UfV109CXhCm3safLboUus6ZcYLm6gTaiwJEdRX7HYbnAQZ5gcoXVz/oyxJqTkicVOLPrTAfi3UmFrnIVF8XBtOPdIXHzSpxZ3yT8gH4zQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <AuthenticationVersion>X002</AuthenticationVersion>\n </AuthenticationPubKeyInfo>\n <EncryptionPubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>0Ekicvrcj2+8tsF+DZsWihl9W7AyVwtMLxq3qefSWagpfnV7BVsKYIJ/OhiWpvr3dz6K5lHSatzhG1x//jrZt6VHn5Wkkb0M0vayPUiZbe5s2aLabqfOTrt8TPnHwjZMChDHRmGoKI0OzLyQJ6MIfQrHZ5t61ccWubYO/bgbSnP9H39k8QEp0kmW4Tf4u+28GTLgueNAaaPTdCozZjrST4fH9nyhBUZ3nl+vZ+AiUNdl5UfV109CXhCm3safLboUus6ZcYLm6gTaiwJEdRX7HYbnAQZ5gcoXVz/oyxJqTkicVOLPrTAfi3UmFrnIVF8XBtOPdIXHzSpxZ3yT8gH4zQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <EncryptionVersion>E002</EncryptionVersion>\n </EncryptionPubKeyInfo>\n <PartnerID>PARTNER1</PartnerID>\n <UserID>USER1</UserID>\n</HIARequestOrderData>")!!.readText() + XMLUtil.convertStringToJaxb<HIARequestOrderData>(hia) + } + + @Test + fun testHiaLoad() { + val classLoader = ClassLoader.getSystemClassLoader() + val hia = classLoader.getResource("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ebicsUnsecuredRequest xmlns=\"urn:org:ebics:H004\"\n xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\"\n Version=\"H004\"\n Revision=\"1\">\n <header authenticate=\"true\">\n <static>\n <HostID>LIBEUFIN-SANDBOX</HostID>\n <PartnerID>CUSTM001</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>HIA</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>eJzNlsmyo0YWhvf1FBW3l0SZZBY3VHIwCwESM0g7ZpCYxAxPb/mWh7ZdrlUvmhX8Z/gzyPNl5P7npSo/T0nXF0399Q35Cbz9fPi0P8qMmTzHpB8uXZx0fDAEn1+Jdf8e91/f8mFo32F4nuefZuynpstgFAAAAxp+5cR9kf3n7dPn7z0fLb6+jV39/qp6T8Ii6t+PAOA/yn9PXh3/YvpR9+FrAYD8sHbpi39ZLwL7mmpFeVIFX4q6H4I6St4Or157ZhzypB6KKBheP0UfQyVZ5TptDh9G+2+CG5RjcvjNeh/376bF/F3+FtCaeCzH/sCccjF6CEpIHO9qNg7sk6vEJqcu5+zCjy3Te4YaE00r3WCcLidQGGEqJ4uoRMrcaQFlAnAK2xDVb1T2KGFMbW87hbMe9m5XzjCb6kuIareAuStQx66uzs+PUlk5oQim7B6eoNW2qo4Ljxu4jbFWLM4M7n4geL2ZNSiMnxum8+d+YTntqIqVV3eS06KTHYeBuOmqaXA1Ar/csDRAAFFNmr8cGc07u8ZC9TidnjhurtHURIQpvLBIf6Uj/5xQT2pGj62hFy2jbldl1wQtTkKbBKm0d2pWZIxX6Q6brViRT8Hl5UeW6FnsgIC1YQslccVX8AhjALHjgHF/ENYD8+3O7ZLOjPhJWvOeMniZ3ayU8F9rAxgdA9xMO1mN0ITDKKWuzZ23hRWH6P3ZKRn3FBhahVPVUOgmF1Br6mWEGkoWQ9h1eXcWlHsA5sGwVg6PurNwXCdWaw70kceyi3Gye6IjoQTPmksNZ5SAyYFlYQD2HLzenvaur+j7YOw20fN9ZEQK+yYyl0AYctO+tL7HmmVR6lw3hpVuLQpfJxvUcjJfsQ+pQCzmVCuiBpbg+DR1uktRiLu3+LHTSiTqQrWN+QF3a4lGdo/NMirzSlakYYUsCgekexluTTKjt4LKV65gMNMX5fIM3xBPu3PUGepNk19iM6yPa4K3z9m8X4KU3gVayt7E+jGR7DWwoZlcyj38X4P7l2kWlrapX3QcGINhP9L+UH6HAf4+DXu7qBJrCKr2gAJk9wVBvgDERpB3BLxjxG0P/xn/Bhr8D9L+hqb77dg6+ACge/j7sV+Bhn9E9F6oo25t/7eoqyBWNpkKhBnWdoKGuhmCBRJ82aiLXKO+c69WObdyykqpGrcg2A+PPp8it7LPdjNhK5BiMEIn6h6QgJHjEWsmk3Jz+9arzzIBzYNz3qj0mNT8xVTYUR8xVxXWklfOR9nz6FQ6z/gI7Gwkg6kTjx2OnisyF3DN823VzoSr4g5ryJwbHMquYT4NDSEM0PbsLwYsRRPq9lvpA5nnoqlXi9vTCYT4FkyoE7QDt5aBImu2fMdO5d0bBJftAd5cSFpop0IvJKXEH4KxYVdK8B7lsp0JfSmIiwiriH9a+plTZiGxZc8hezlARdah8KgLdshknHN6xLyi0SWHjCm6cYu2J4n6VkCYMjfdzMMxRs1sRCsAt9LXlrr01YT4jeM2RE95x8qg+zShwUrm7MyWCdonrmK+SL8U8gsGwbCZbECR3PP5ihjNrA6ryssn9bR6BnTlRnBkNYmdG6aEuzBLGnrk1WxY2VwBGH5S6tCp/VFGBobwT2FY2JSrPquMjHjlFnGFWDCutPVlcNIwljSFU34Ws5h4bdgq2eKUHV+jcHVQx5v74z2uToGp3xmRjGxpTkTEnnnaf7zQb+rdLpo0DlJL7ZwxCJ8OJIRM6iQvetZRo4sQoCTSbQp1HVovaZ95jUK/zljDup8ehRVrEBGCRGZmzukmaSZn61EXF/pRszUNjc8sVSdM9+Wuq1WA6f+vqP+J5e8oCx+Y/1P/QPzfKN7rQTfUSSfzB8HnjsxZEl5uf2i/Zjj9x6vNqIK5h3/7+rSHv3MJOnz6BXLJ7gw=</OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>\n")!! + val hiaDom = XMLUtil.parseStringIntoDom(hia.readText()) + val x: Element = hiaDom.getElementsByTagNameNS( + "urn:org:ebics:H004", + "OrderDetails" + )?.item(0) as Element + + x.setAttributeNS( + "http://www.w3.org/2001/XMLSchema-instance", + "type", + "UnsecuredReqOrderDetailsType" + ) + + XMLUtil.convertDomToJaxb<EbicsUnsecuredRequest>( + EbicsUnsecuredRequest::class.java, + hiaDom + ) + } + + @Test + fun testLoadInnerKey() { + val jaxbKey = run { + val classLoader = ClassLoader.getSystemClassLoader() + val file = classLoader.getResource( + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<SignaturePubKeyOrderData xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ebics.org/S001 http://www.ebics.org/S001/ebics_signature.xsd\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"http://www.ebics.org/S001\">\n <SignaturePubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>s5ktpg3xGjbZZgVTYtW+0e6xsWg142UwvoM3mfuM+qrkIa5bPUGQLH6BRL9IejYosPhoA6jwMBSxO8LfaageyZJt2M5wHklJYz3fADtQrV1bk5R92OaY/9ZZdHxw3xY93tm5JfVrMDW9DEK5B1hUzYFdjuN/qu2/sdE9mwhx2YjYwwdSQzv6MhbtSK9OAJjPGo3fkxsht6maSmRCdgxplIOSO2mmP1wjUzbVUMcrRk9KDMvnb3kCxiTm+evvxX6J4wpY1bAWukolJbaALHlFtgTo1LnulUe/BxiKx9HpmuEAaPsk8kgduXsz5OqH2g/Vyw75x51aKVPxOTBPyP+4kQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <SignatureVersion>A006</SignatureVersion>\n </SignaturePubKeyInfo>\n <PartnerID>flo-kid</PartnerID>\n <UserID>flo-uid</UserID>\n</SignaturePubKeyOrderData>" + ) + assertNotNull(file) + XMLUtil.convertStringToJaxb<SignatureTypes.SignaturePubKeyOrderData>(file.readText()) + } + + val modulus = jaxbKey.value.signaturePubKeyInfo.pubKeyValue.rsaKeyValue.modulus + val exponent = jaxbKey.value.signaturePubKeyInfo.pubKeyValue.rsaKeyValue.exponent + CryptoUtil.loadRsaPublicKeyFromComponents(modulus, exponent) + } + + @Test + fun testLoadIniMessage() { + val classLoader = ClassLoader.getSystemClassLoader() + val text = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ebicsUnsecuredRequest Revision=\"1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\" Version=\"H004\"\n xmlns=\"urn:org:ebics:H004\">\n <header authenticate=\"true\">\n <static>\n <HostID>myhost</HostID>\n <PartnerID>k1</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>INI</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>\n eJx9U1tzmkAUfu9M/wNDH524XIINjprBaOIFCopg8CWzyHK/GHaR1V9fhtg0bWrf9nzfdy57LoN7mqXMEZU4KvIhy3c5lkH5vvCiPBiyFfFv7tj70dcvAzMKckiqEhmVu0QnvfRQOYEEMo1/jvsUR0M2JOTQB6Cu624tdosyAALH8eBZU819iDJ4E+WYwHyPWKbR93ELqsUekjb5B3fkRnvcRjCbCMxVBrTmC/5VXJdij72U5OErFXGAk0Gj8Rq3bxf1f7KzzfcZ5u8GzHO/aImGekNsmFboAjWgh/trU/mEvzFa4VVphUdYSsghEOlT7O52gb1xyLbDoR7F24C/Faz6WGhi5lda57VM5lByDetppc5647Uqz1HsFNgIC6UX19rYpPqd6kMYoNNuQQRNqmdJunDOoq9MyKq0eTeR1rKgQwfIu503o7VIHVkkmbTw7VKbbOXJdCmN+dA6O49eXP0Ar5UAsDeVszqkghM7de2Zq/Oxp4UuMZeyrixi46kQ/YTikPQyaGbrBy+gh3Sum7qQZQZfx9bZtS1tX64TeTnRjrkrJg802mQddDzS597itj44vKtsq6RIFy5U1Fn6SIJNwat5lVoIjGm0pPLskFVTBRo4uUsCr3rGZ0l/nQkBsE/1d4lKPFzaBtU3Y+NkdG6T1XA4AB+a/Gfrp/RQ5CgnI2WljFvdO/I+O/DP4Q3A50H/Xgv77YZGCsf1BuAT3O4QuLZEAwOWJEflfDJK+CbPu9WSFm7fVcNcns1BgmsXOfoJ1l5CIg==\n </OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>")!!.readText() + XMLUtil.convertStringToJaxb<EbicsUnsecuredRequest>(text) + } + + @Test + fun testLoadResponse() { + val response = EbicsResponse().apply { + version = "H004" + header = EbicsResponse.Header().apply { + _static = EbicsResponse.StaticHeaderType() + mutable = EbicsResponse.MutableHeaderType().apply { + this.reportText = "foo" + this.returnCode = "bar" + this.transactionPhase = EbicsTypes.TransactionPhaseType.INITIALISATION + } + } + authSignature = SignatureType() + body = EbicsResponse.Body().apply { + returnCode = EbicsResponse.ReturnCode().apply { + authenticate = true + value = "asdf" + } + } + } + print(XMLUtil.convertJaxbToString(response)) + } + + @Test + fun testLoadHpb() { + val classLoader = ClassLoader.getSystemClassLoader() + val text = classLoader.getResource("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ebics:ebicsNoPubKeyDigestsRequest xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns:ebics=\"urn:org:ebics:H004\" xmlns=\"http://www.w3.org/2001/XMLSchema\" Version=\"H004\" Revision=\"1\">\n <ebics:header authenticate=\"true\">\n <ebics:static>\n <ebics:HostID>EBIXQUAL</ebics:HostID>\n <ebics:Nonce>0749134D19E160DA4ACA366180113D44</ebics:Nonce>\n <ebics:Timestamp>2018-11-01T11:10:35Z</ebics:Timestamp>\n <ebics:PartnerID>EXCHANGE</ebics:PartnerID>\n <ebics:UserID>TALER</ebics:UserID>\n <ebics:OrderDetails>\n <ebics:OrderType>HPB</ebics:OrderType>\n <ebics:OrderAttribute>DZHNN</ebics:OrderAttribute>\n </ebics:OrderDetails>\n <ebics:SecurityMedium>0000</ebics:SecurityMedium>\n </ebics:static>\n <ebics:mutable/>\n </ebics:header>\n <ebics:AuthSignature>\n <ds:SignedInfo>\n <ds:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>\n <ds:SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"/>\n <ds:Reference URI=\"#xpointer(//*[@authenticate='true'])\">\n <ds:Transforms>\n <ds:Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>\n </ds:Transforms>\n <ds:DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"/>\n <ds:DigestValue>yuwpcvmVrNrc1t58aulF6TiqKO+CNe7Dhwaa6V/cKws=</ds:DigestValue>\n </ds:Reference>\n </ds:SignedInfo>\n <ds:SignatureValue>chhF4/yxSz2WltTR0/DPf01WyncNx3P1XJDr0SylVMVWWSY9S1dYyJKgGOW+g7C/\nHYzrGcFwKrejf79DH3F2Ek8NJLsAFzf/0oxff2eYEe0SlxjXmgsubeMOy5PKB9Ag\nZiQYMiNy9gaatqcW79E3n/r1nD/lwLsped/4jzWdY+Gfj3z6d18vymmGymbHqIaR\nhawk/Iu/tpMQ3dbvIFbzn9LLMmzfQzG2ZPy3BiQNVWr3aSLl9qG4U9zeK6OyH2/Z\ng1EEnjfJa/+pTCeJmyoDBwgaJWcuCRQmWjvxvbM4ckYnrFkhvLf24on2ydmUeipp\nsMl8q1khyWUC0P0h6otZhD1SUdf1rt14r16bdy1r0ieTVm6m3qXhcX5MXagvFci0\n0OE2mOgf/GXE2WiJLAbRh06s9OvAzHUq4QGQwbkprMBMFw4uxONyNzYl+F9aA5Ic\nAwebf7/dfDJIHZc8XkwY1jNJrmCTzRyTP5eDN4bDPoHqTotDo1CMFaHtnkygg/Lg\nqoirV8mHfqnO4XQBOCUiHZ6mzz81l+O7dYg65cYx9Z76q2cv1PxsMb7Eo4nvux5S\nQPuuid0G5lomHXM/uM3mu4vXcDluCoffgTDimxs0I9X+PB7a2vgSMezwYkj8dA69\nvszH1hwek7DRbRfKUo6HUxl49Gsk0XYG/K30M5fS5JE=</ds:SignatureValue>\n </ebics:AuthSignature>\n <ebics:body/>\n</ebics:ebicsNoPubKeyDigestsRequest>\n")!!.readText() + XMLUtil.convertStringToJaxb<EbicsNpkdRequest>(text) + } + + @Test + fun testHtd() { + val htd = HTDResponseOrderData().apply { + this.partnerInfo = EbicsTypes.PartnerInfo().apply { + this.accountInfoList = listOf( + EbicsTypes.AccountInfo().apply { + this.id = "acctid1" + this.accountHolder = "Mina Musterfrau" + this.accountNumberList = listOf( + EbicsTypes.GeneralAccountNumber().apply { + this.international = true + this.value = "AT411100000237571500" + } + ) + this.currency = "EUR" + this.description = "some account" + this.bankCodeList = listOf( + EbicsTypes.GeneralBankCode().apply { + this.international = true + this.value = "ABAGATWWXXX" + } + ) + } + ) + this.addressInfo = EbicsTypes.AddressInfo().apply { + this.name = "Foo" + } + this.bankInfo = EbicsTypes.BankInfo().apply { + this.hostID = "MYHOST" + } + this.orderInfoList = listOf( + EbicsTypes.AuthOrderInfoType().apply { + this.description = "foo" + this.orderType = "CCC" + this.orderFormat = "foo" + this.transferType = "Upload" + } + ) + } + this.userInfo = EbicsTypes.UserInfo().apply { + this.name = "Some User" + this.userID = EbicsTypes.UserIDType().apply { + this.status = 2 + this.value = "myuserid" + } + this.permissionList = listOf( + EbicsTypes.UserPermission().apply { + this.orderTypes = "CCC ABC" + } + ) + } + } + + val str = XMLUtil.convertJaxbToString(htd) + println(str) + assert(XMLUtil.validateFromString(str)) + } + + + @Test + fun testHkd() { + val hkd = HKDResponseOrderData().apply { + this.partnerInfo = EbicsTypes.PartnerInfo().apply { + this.accountInfoList = listOf( + EbicsTypes.AccountInfo().apply { + this.id = "acctid1" + this.accountHolder = "Mina Musterfrau" + this.accountNumberList = listOf( + EbicsTypes.GeneralAccountNumber().apply { + this.international = true + this.value = "AT411100000237571500" + } + ) + this.currency = "EUR" + this.description = "some account" + this.bankCodeList = listOf( + EbicsTypes.GeneralBankCode().apply { + this.international = true + this.value = "ABAGATWWXXX" + } + ) + } + ) + this.addressInfo = EbicsTypes.AddressInfo().apply { + this.name = "Foo" + } + this.bankInfo = EbicsTypes.BankInfo().apply { + this.hostID = "MYHOST" + } + this.orderInfoList = listOf( + EbicsTypes.AuthOrderInfoType().apply { + this.description = "foo" + this.orderType = "CCC" + this.orderFormat = "foo" + this.transferType = "Upload" + } + ) + } + this.userInfoList = listOf( + EbicsTypes.UserInfo().apply { + this.name = "Some User" + this.userID = EbicsTypes.UserIDType().apply { + this.status = 2 + this.value = "myuserid" + } + this.permissionList = listOf( + EbicsTypes.UserPermission().apply { + this.orderTypes = "CCC ABC" + } + ) + }) + } + + val str = XMLUtil.convertJaxbToString(hkd) + println(str) + assert(XMLUtil.validateFromString(str)) + } + + @Test + fun testEbicsRequestInitializationPhase() { + val ebicsRequestObj = EbicsRequest().apply { + this.version = "H004" + this.revision = 1 + this.authSignature = SignatureType() + this.header = EbicsRequest.Header().apply { + this.authenticate = true + this.mutable = EbicsRequest.MutableHeader().apply { + this.transactionPhase = EbicsTypes.TransactionPhaseType.INITIALISATION + } + this.static = EbicsRequest.StaticHeaderType().apply { + this.hostID = "myhost" + this.nonce = ByteArray(16) + this.timestamp = + DatatypeFactory.newDefaultInstance().newXMLGregorianCalendar(2019, 5, 5, 5, 5, 5, 0, 0) + this.partnerID = "mypid01" + this.userID = "myusr01" + this.product = EbicsTypes.Product().apply { + this.instituteID = "test" + this.language = "en" + this.value = "test" + } + this.orderDetails = EbicsRequest.OrderDetails().apply { + this.orderAttribute = "DZHNN" + this.orderID = "OR01" + this.orderType = "BLA" + this.orderParams = EbicsRequest.StandardOrderParams() + } + this.bankPubKeyDigests = EbicsRequest.BankPubKeyDigests().apply { + this.authentication = EbicsTypes.PubKeyDigest().apply { + this.algorithm = "foo" + this.value = ByteArray(32) + this.version = "X002" + } + this.encryption = EbicsTypes.PubKeyDigest().apply { + this.algorithm = "foo" + this.value = ByteArray(32) + this.version = "E002" + } + } + this.securityMedium = "0000" + } + } + this.body = EbicsRequest.Body().apply { + } + } + + val str = XMLUtil.convertJaxbToString(ebicsRequestObj) + val doc = XMLUtil.parseStringIntoDom(str) + val pair = CryptoUtil.generateRsaKeyPair(1024) + XMLUtil.signEbicsDocument(doc, pair.private) + val finalStr = XMLUtil.convertDomToString(doc) + assert(XMLUtil.validateFromString(finalStr)) + } +} +\ No newline at end of file diff --git a/util/src/test/resources/EbicsMessagesTest.kt b/util/src/test/resources/EbicsMessagesTest.kt @@ -1,350 +0,0 @@ -import junit.framework.TestCase.assertEquals -import org.apache.xml.security.binding.xmldsig.SignatureType -import org.junit.Test -import org.w3c.dom.Element -import tech.libeufin.util.ebics_h004.* -import tech.libeufin.util.ebics_hev.HEVResponse -import tech.libeufin.util.ebics_hev.SystemReturnCodeType -import tech.libeufin.util.ebics_s001.SignatureTypes -import tech.libeufin.util.CryptoUtil -import tech.libeufin.util.XMLUtil -import javax.xml.datatype.DatatypeFactory -import kotlin.test.assertNotNull -import kotlin.test.assertTrue - -class EbicsMessagesTest { - /** - * Tests the JAXB instantiation of non-XmlRootElement documents, - * as notably are the inner XML strings carrying keys in INI/HIA - * messages. - */ - @Test - fun testImportNonRoot() { - val classLoader = ClassLoader.getSystemClassLoader() - val ini = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<SignaturePubKeyOrderData xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ebics.org/S001 http://www.ebics.org/S001/ebics_signature.xsd\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"http://www.ebics.org/S001\">\n <SignaturePubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>s5ktpg3xGjbZZgVTYtW+0e6xsWg142UwvoM3mfuM+qrkIa5bPUGQLH6BRL9IejYosPhoA6jwMBSxO8LfaageyZJt2M5wHklJYz3fADtQrV1bk5R92OaY/9ZZdHxw3xY93tm5JfVrMDW9DEK5B1hUzYFdjuN/qu2/sdE9mwhx2YjYwwdSQzv6MhbtSK9OAJjPGo3fkxsht6maSmRCdgxplIOSO2mmP1wjUzbVUMcrRk9KDMvnb3kCxiTm+evvxX6J4wpY1bAWukolJbaALHlFtgTo1LnulUe/BxiKx9HpmuEAaPsk8kgduXsz5OqH2g/Vyw75x51aKVPxOTBPyP+4kQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <SignatureVersion>A006</SignatureVersion>\n </SignaturePubKeyInfo>\n <PartnerID>flo-kid</PartnerID>\n <UserID>flo-uid</UserID>\n</SignaturePubKeyOrderData>") - val jaxb = XMLUtil.convertStringToJaxb<SignatureTypes.SignaturePubKeyOrderData>(ini.readText()) - assertEquals("A006", jaxb.value.signaturePubKeyInfo.signatureVersion) - } - - /** - * Test string -> JAXB - */ - @Test - fun testStringToJaxb() { - val classLoader = ClassLoader.getSystemClassLoader() - val ini = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ebicsUnsecuredRequest Revision=\"1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\" Version=\"H004\"\n xmlns=\"urn:org:ebics:H004\">\n <header authenticate=\"true\">\n <static>\n <HostID>myhost</HostID>\n <PartnerID>k1</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>INI</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>\n eJx9U1tzmkAUfu9M/wNDH524XIINjprBaOIFCopg8CWzyHK/GHaR1V9fhtg0bWrf9nzfdy57LoN7mqXMEZU4KvIhy3c5lkH5vvCiPBiyFfFv7tj70dcvAzMKckiqEhmVu0QnvfRQOYEEMo1/jvsUR0M2JOTQB6Cu624tdosyAALH8eBZU819iDJ4E+WYwHyPWKbR93ELqsUekjb5B3fkRnvcRjCbCMxVBrTmC/5VXJdij72U5OErFXGAk0Gj8Rq3bxf1f7KzzfcZ5u8GzHO/aImGekNsmFboAjWgh/trU/mEvzFa4VVphUdYSsghEOlT7O52gb1xyLbDoR7F24C/Faz6WGhi5lda57VM5lByDetppc5647Uqz1HsFNgIC6UX19rYpPqd6kMYoNNuQQRNqmdJunDOoq9MyKq0eTeR1rKgQwfIu503o7VIHVkkmbTw7VKbbOXJdCmN+dA6O49eXP0Ar5UAsDeVszqkghM7de2Zq/Oxp4UuMZeyrixi46kQ/YTikPQyaGbrBy+gh3Sum7qQZQZfx9bZtS1tX64TeTnRjrkrJg802mQddDzS597itj44vKtsq6RIFy5U1Fn6SIJNwat5lVoIjGm0pPLskFVTBRo4uUsCr3rGZ0l/nQkBsE/1d4lKPFzaBtU3Y+NkdG6T1XA4AB+a/Gfrp/RQ5CgnI2WljFvdO/I+O/DP4Q3A50H/Xgv77YZGCsf1BuAT3O4QuLZEAwOWJEflfDJK+CbPu9WSFm7fVcNcns1BgmsXOfoJ1l5CIg==\n </OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>") - val jaxb = XMLUtil.convertStringToJaxb<EbicsUnsecuredRequest>(ini.readText()) - println("jaxb loaded") - assertEquals( - "INI", - jaxb.value.header.static.orderDetails.orderType - ) - } - - /** - * Test JAXB -> string - */ - @Test - fun testJaxbToString() { - val hevResponseJaxb = HEVResponse().apply { - this.systemReturnCode = SystemReturnCodeType().apply { - this.reportText = "[EBICS_OK]" - this.returnCode = "000000" - } - this.versionNumber = listOf(HEVResponse.VersionNumber.create("H004", "02.50")) - } - XMLUtil.convertJaxbToString(hevResponseJaxb) - } - - /** - * Test DOM -> JAXB - */ - @Test - fun testDomToJaxb() { - val classLoader = ClassLoader.getSystemClassLoader() - val ini = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ebicsUnsecuredRequest Revision=\"1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\" Version=\"H004\"\n xmlns=\"urn:org:ebics:H004\">\n <header authenticate=\"true\">\n <static>\n <HostID>myhost</HostID>\n <PartnerID>k1</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>INI</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>\n eJx9U1tzmkAUfu9M/wNDH524XIINjprBaOIFCopg8CWzyHK/GHaR1V9fhtg0bWrf9nzfdy57LoN7mqXMEZU4KvIhy3c5lkH5vvCiPBiyFfFv7tj70dcvAzMKckiqEhmVu0QnvfRQOYEEMo1/jvsUR0M2JOTQB6Cu624tdosyAALH8eBZU819iDJ4E+WYwHyPWKbR93ELqsUekjb5B3fkRnvcRjCbCMxVBrTmC/5VXJdij72U5OErFXGAk0Gj8Rq3bxf1f7KzzfcZ5u8GzHO/aImGekNsmFboAjWgh/trU/mEvzFa4VVphUdYSsghEOlT7O52gb1xyLbDoR7F24C/Faz6WGhi5lda57VM5lByDetppc5647Uqz1HsFNgIC6UX19rYpPqd6kMYoNNuQQRNqmdJunDOoq9MyKq0eTeR1rKgQwfIu503o7VIHVkkmbTw7VKbbOXJdCmN+dA6O49eXP0Ar5UAsDeVszqkghM7de2Zq/Oxp4UuMZeyrixi46kQ/YTikPQyaGbrBy+gh3Sum7qQZQZfx9bZtS1tX64TeTnRjrkrJg802mQddDzS597itj44vKtsq6RIFy5U1Fn6SIJNwat5lVoIjGm0pPLskFVTBRo4uUsCr3rGZ0l/nQkBsE/1d4lKPFzaBtU3Y+NkdG6T1XA4AB+a/Gfrp/RQ5CgnI2WljFvdO/I+O/DP4Q3A50H/Xgv77YZGCsf1BuAT3O4QuLZEAwOWJEflfDJK+CbPu9WSFm7fVcNcns1BgmsXOfoJ1l5CIg==\n </OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>")!! - val iniDom = XMLUtil.parseStringIntoDom(ini.readText()) - XMLUtil.convertDomToJaxb<EbicsUnsecuredRequest>( - EbicsUnsecuredRequest::class.java, - iniDom - ) - } - - @Test - fun testKeyMgmgResponse() { - val responseXml = EbicsKeyManagementResponse().apply { - header = EbicsKeyManagementResponse.Header().apply { - mutable = EbicsKeyManagementResponse.MutableHeaderType().apply { - reportText = "foo" - returnCode = "bar" - } - _static = EbicsKeyManagementResponse.EmptyStaticHeader() - } - version = "H004" - body = EbicsKeyManagementResponse.Body().apply { - returnCode = EbicsKeyManagementResponse.ReturnCode().apply { - authenticate = true - value = "000000" - } - } - } - val text = XMLUtil.convertJaxbToString(responseXml) - assertTrue(text.isNotEmpty()) - } - - @Test - fun testParseHiaRequestOrderData() { - val classLoader = ClassLoader.getSystemClassLoader() - val hia = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<HIARequestOrderData xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:org:ebics:H004 ebics_orders_H004.xsd\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"urn:org:ebics:H004\">\n <AuthenticationPubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>0Ekicvrcj2+8tsF+DZsWihl9W7AyVwtMLxq3qefSWagpfnV7BVsKYIJ/OhiWpvr3dz6K5lHSatzhG1x//jrZt6VHn5Wkkb0M0vayPUiZbe5s2aLabqfOTrt8TPnHwjZMChDHRmGoKI0OzLyQJ6MIfQrHZ5t61ccWubYO/bgbSnP9H39k8QEp0kmW4Tf4u+28GTLgueNAaaPTdCozZjrST4fH9nyhBUZ3nl+vZ+AiUNdl5UfV109CXhCm3safLboUus6ZcYLm6gTaiwJEdRX7HYbnAQZ5gcoXVz/oyxJqTkicVOLPrTAfi3UmFrnIVF8XBtOPdIXHzSpxZ3yT8gH4zQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <AuthenticationVersion>X002</AuthenticationVersion>\n </AuthenticationPubKeyInfo>\n <EncryptionPubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>0Ekicvrcj2+8tsF+DZsWihl9W7AyVwtMLxq3qefSWagpfnV7BVsKYIJ/OhiWpvr3dz6K5lHSatzhG1x//jrZt6VHn5Wkkb0M0vayPUiZbe5s2aLabqfOTrt8TPnHwjZMChDHRmGoKI0OzLyQJ6MIfQrHZ5t61ccWubYO/bgbSnP9H39k8QEp0kmW4Tf4u+28GTLgueNAaaPTdCozZjrST4fH9nyhBUZ3nl+vZ+AiUNdl5UfV109CXhCm3safLboUus6ZcYLm6gTaiwJEdRX7HYbnAQZ5gcoXVz/oyxJqTkicVOLPrTAfi3UmFrnIVF8XBtOPdIXHzSpxZ3yT8gH4zQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <EncryptionVersion>E002</EncryptionVersion>\n </EncryptionPubKeyInfo>\n <PartnerID>PARTNER1</PartnerID>\n <UserID>USER1</UserID>\n</HIARequestOrderData>")!!.readText() - XMLUtil.convertStringToJaxb<HIARequestOrderData>(hia) - } - - @Test - fun testHiaLoad() { - val classLoader = ClassLoader.getSystemClassLoader() - val hia = classLoader.getResource("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ebicsUnsecuredRequest xmlns=\"urn:org:ebics:H004\"\n xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\"\n Version=\"H004\"\n Revision=\"1\">\n <header authenticate=\"true\">\n <static>\n <HostID>LIBEUFIN-SANDBOX</HostID>\n <PartnerID>CUSTM001</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>HIA</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>eJzNlsmyo0YWhvf1FBW3l0SZZBY3VHIwCwESM0g7ZpCYxAxPb/mWh7ZdrlUvmhX8Z/gzyPNl5P7npSo/T0nXF0399Q35Cbz9fPi0P8qMmTzHpB8uXZx0fDAEn1+Jdf8e91/f8mFo32F4nuefZuynpstgFAAAAxp+5cR9kf3n7dPn7z0fLb6+jV39/qp6T8Ii6t+PAOA/yn9PXh3/YvpR9+FrAYD8sHbpi39ZLwL7mmpFeVIFX4q6H4I6St4Or157ZhzypB6KKBheP0UfQyVZ5TptDh9G+2+CG5RjcvjNeh/376bF/F3+FtCaeCzH/sCccjF6CEpIHO9qNg7sk6vEJqcu5+zCjy3Te4YaE00r3WCcLidQGGEqJ4uoRMrcaQFlAnAK2xDVb1T2KGFMbW87hbMe9m5XzjCb6kuIareAuStQx66uzs+PUlk5oQim7B6eoNW2qo4Ljxu4jbFWLM4M7n4geL2ZNSiMnxum8+d+YTntqIqVV3eS06KTHYeBuOmqaXA1Ar/csDRAAFFNmr8cGc07u8ZC9TidnjhurtHURIQpvLBIf6Uj/5xQT2pGj62hFy2jbldl1wQtTkKbBKm0d2pWZIxX6Q6brViRT8Hl5UeW6FnsgIC1YQslccVX8AhjALHjgHF/ENYD8+3O7ZLOjPhJWvOeMniZ3ayU8F9rAxgdA9xMO1mN0ITDKKWuzZ23hRWH6P3ZKRn3FBhahVPVUOgmF1Br6mWEGkoWQ9h1eXcWlHsA5sGwVg6PurNwXCdWaw70kceyi3Gye6IjoQTPmksNZ5SAyYFlYQD2HLzenvaur+j7YOw20fN9ZEQK+yYyl0AYctO+tL7HmmVR6lw3hpVuLQpfJxvUcjJfsQ+pQCzmVCuiBpbg+DR1uktRiLu3+LHTSiTqQrWN+QF3a4lGdo/NMirzSlakYYUsCgekexluTTKjt4LKV65gMNMX5fIM3xBPu3PUGepNk19iM6yPa4K3z9m8X4KU3gVayt7E+jGR7DWwoZlcyj38X4P7l2kWlrapX3QcGINhP9L+UH6HAf4+DXu7qBJrCKr2gAJk9wVBvgDERpB3BLxjxG0P/xn/Bhr8D9L+hqb77dg6+ACge/j7sV+Bhn9E9F6oo25t/7eoqyBWNpkKhBnWdoKGuhmCBRJ82aiLXKO+c69WObdyykqpGrcg2A+PPp8it7LPdjNhK5BiMEIn6h6QgJHjEWsmk3Jz+9arzzIBzYNz3qj0mNT8xVTYUR8xVxXWklfOR9nz6FQ6z/gI7Gwkg6kTjx2OnisyF3DN823VzoSr4g5ryJwbHMquYT4NDSEM0PbsLwYsRRPq9lvpA5nnoqlXi9vTCYT4FkyoE7QDt5aBImu2fMdO5d0bBJftAd5cSFpop0IvJKXEH4KxYVdK8B7lsp0JfSmIiwiriH9a+plTZiGxZc8hezlARdah8KgLdshknHN6xLyi0SWHjCm6cYu2J4n6VkCYMjfdzMMxRs1sRCsAt9LXlrr01YT4jeM2RE95x8qg+zShwUrm7MyWCdonrmK+SL8U8gsGwbCZbECR3PP5ihjNrA6ryssn9bR6BnTlRnBkNYmdG6aEuzBLGnrk1WxY2VwBGH5S6tCp/VFGBobwT2FY2JSrPquMjHjlFnGFWDCutPVlcNIwljSFU34Ws5h4bdgq2eKUHV+jcHVQx5v74z2uToGp3xmRjGxpTkTEnnnaf7zQb+rdLpo0DlJL7ZwxCJ8OJIRM6iQvetZRo4sQoCTSbQp1HVovaZ95jUK/zljDup8ehRVrEBGCRGZmzukmaSZn61EXF/pRszUNjc8sVSdM9+Wuq1WA6f+vqP+J5e8oCx+Y/1P/QPzfKN7rQTfUSSfzB8HnjsxZEl5uf2i/Zjj9x6vNqIK5h3/7+rSHv3MJOnz6BXLJ7gw=</OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>\n")!! - val hiaDom = XMLUtil.parseStringIntoDom(hia.readText()) - val x: Element = hiaDom.getElementsByTagNameNS( - "urn:org:ebics:H004", - "OrderDetails" - )?.item(0) as Element - - x.setAttributeNS( - "http://www.w3.org/2001/XMLSchema-instance", - "type", - "UnsecuredReqOrderDetailsType" - ) - - XMLUtil.convertDomToJaxb<EbicsUnsecuredRequest>( - EbicsUnsecuredRequest::class.java, - hiaDom - ) - } - - @Test - fun testLoadInnerKey() { - val jaxbKey = run { - val classLoader = ClassLoader.getSystemClassLoader() - val file = classLoader.getResource( - "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<SignaturePubKeyOrderData xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ebics.org/S001 http://www.ebics.org/S001/ebics_signature.xsd\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"http://www.ebics.org/S001\">\n <SignaturePubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>s5ktpg3xGjbZZgVTYtW+0e6xsWg142UwvoM3mfuM+qrkIa5bPUGQLH6BRL9IejYosPhoA6jwMBSxO8LfaageyZJt2M5wHklJYz3fADtQrV1bk5R92OaY/9ZZdHxw3xY93tm5JfVrMDW9DEK5B1hUzYFdjuN/qu2/sdE9mwhx2YjYwwdSQzv6MhbtSK9OAJjPGo3fkxsht6maSmRCdgxplIOSO2mmP1wjUzbVUMcrRk9KDMvnb3kCxiTm+evvxX6J4wpY1bAWukolJbaALHlFtgTo1LnulUe/BxiKx9HpmuEAaPsk8kgduXsz5OqH2g/Vyw75x51aKVPxOTBPyP+4kQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <SignatureVersion>A006</SignatureVersion>\n </SignaturePubKeyInfo>\n <PartnerID>flo-kid</PartnerID>\n <UserID>flo-uid</UserID>\n</SignaturePubKeyOrderData>" - ) - assertNotNull(file) - XMLUtil.convertStringToJaxb<SignatureTypes.SignaturePubKeyOrderData>(file.readText()) - } - - val modulus = jaxbKey.value.signaturePubKeyInfo.pubKeyValue.rsaKeyValue.modulus - val exponent = jaxbKey.value.signaturePubKeyInfo.pubKeyValue.rsaKeyValue.exponent - CryptoUtil.loadRsaPublicKeyFromComponents(modulus, exponent) - } - - @Test - fun testLoadIniMessage() { - val classLoader = ClassLoader.getSystemClassLoader() - val text = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ebicsUnsecuredRequest Revision=\"1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\" Version=\"H004\"\n xmlns=\"urn:org:ebics:H004\">\n <header authenticate=\"true\">\n <static>\n <HostID>myhost</HostID>\n <PartnerID>k1</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>INI</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>\n eJx9U1tzmkAUfu9M/wNDH524XIINjprBaOIFCopg8CWzyHK/GHaR1V9fhtg0bWrf9nzfdy57LoN7mqXMEZU4KvIhy3c5lkH5vvCiPBiyFfFv7tj70dcvAzMKckiqEhmVu0QnvfRQOYEEMo1/jvsUR0M2JOTQB6Cu624tdosyAALH8eBZU819iDJ4E+WYwHyPWKbR93ELqsUekjb5B3fkRnvcRjCbCMxVBrTmC/5VXJdij72U5OErFXGAk0Gj8Rq3bxf1f7KzzfcZ5u8GzHO/aImGekNsmFboAjWgh/trU/mEvzFa4VVphUdYSsghEOlT7O52gb1xyLbDoR7F24C/Faz6WGhi5lda57VM5lByDetppc5647Uqz1HsFNgIC6UX19rYpPqd6kMYoNNuQQRNqmdJunDOoq9MyKq0eTeR1rKgQwfIu503o7VIHVkkmbTw7VKbbOXJdCmN+dA6O49eXP0Ar5UAsDeVszqkghM7de2Zq/Oxp4UuMZeyrixi46kQ/YTikPQyaGbrBy+gh3Sum7qQZQZfx9bZtS1tX64TeTnRjrkrJg802mQddDzS597itj44vKtsq6RIFy5U1Fn6SIJNwat5lVoIjGm0pPLskFVTBRo4uUsCr3rGZ0l/nQkBsE/1d4lKPFzaBtU3Y+NkdG6T1XA4AB+a/Gfrp/RQ5CgnI2WljFvdO/I+O/DP4Q3A50H/Xgv77YZGCsf1BuAT3O4QuLZEAwOWJEflfDJK+CbPu9WSFm7fVcNcns1BgmsXOfoJ1l5CIg==\n </OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>")!!.readText() - XMLUtil.convertStringToJaxb<EbicsUnsecuredRequest>(text) - } - - @Test - fun testLoadResponse() { - val response = EbicsResponse().apply { - version = "H004" - header = EbicsResponse.Header().apply { - _static = EbicsResponse.StaticHeaderType() - mutable = EbicsResponse.MutableHeaderType().apply { - this.reportText = "foo" - this.returnCode = "bar" - this.transactionPhase = EbicsTypes.TransactionPhaseType.INITIALISATION - } - } - authSignature = SignatureType() - body = EbicsResponse.Body().apply { - returnCode = EbicsResponse.ReturnCode().apply { - authenticate = true - value = "asdf" - } - } - } - print(XMLUtil.convertJaxbToString(response)) - } - - @Test - fun testLoadHpb() { - val classLoader = ClassLoader.getSystemClassLoader() - val text = classLoader.getResource("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ebics:ebicsNoPubKeyDigestsRequest xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns:ebics=\"urn:org:ebics:H004\" xmlns=\"http://www.w3.org/2001/XMLSchema\" Version=\"H004\" Revision=\"1\">\n <ebics:header authenticate=\"true\">\n <ebics:static>\n <ebics:HostID>EBIXQUAL</ebics:HostID>\n <ebics:Nonce>0749134D19E160DA4ACA366180113D44</ebics:Nonce>\n <ebics:Timestamp>2018-11-01T11:10:35Z</ebics:Timestamp>\n <ebics:PartnerID>EXCHANGE</ebics:PartnerID>\n <ebics:UserID>TALER</ebics:UserID>\n <ebics:OrderDetails>\n <ebics:OrderType>HPB</ebics:OrderType>\n <ebics:OrderAttribute>DZHNN</ebics:OrderAttribute>\n </ebics:OrderDetails>\n <ebics:SecurityMedium>0000</ebics:SecurityMedium>\n </ebics:static>\n <ebics:mutable/>\n </ebics:header>\n <ebics:AuthSignature>\n <ds:SignedInfo>\n <ds:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>\n <ds:SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"/>\n <ds:Reference URI=\"#xpointer(//*[@authenticate='true'])\">\n <ds:Transforms>\n <ds:Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>\n </ds:Transforms>\n <ds:DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"/>\n <ds:DigestValue>yuwpcvmVrNrc1t58aulF6TiqKO+CNe7Dhwaa6V/cKws=</ds:DigestValue>\n </ds:Reference>\n </ds:SignedInfo>\n <ds:SignatureValue>chhF4/yxSz2WltTR0/DPf01WyncNx3P1XJDr0SylVMVWWSY9S1dYyJKgGOW+g7C/\nHYzrGcFwKrejf79DH3F2Ek8NJLsAFzf/0oxff2eYEe0SlxjXmgsubeMOy5PKB9Ag\nZiQYMiNy9gaatqcW79E3n/r1nD/lwLsped/4jzWdY+Gfj3z6d18vymmGymbHqIaR\nhawk/Iu/tpMQ3dbvIFbzn9LLMmzfQzG2ZPy3BiQNVWr3aSLl9qG4U9zeK6OyH2/Z\ng1EEnjfJa/+pTCeJmyoDBwgaJWcuCRQmWjvxvbM4ckYnrFkhvLf24on2ydmUeipp\nsMl8q1khyWUC0P0h6otZhD1SUdf1rt14r16bdy1r0ieTVm6m3qXhcX5MXagvFci0\n0OE2mOgf/GXE2WiJLAbRh06s9OvAzHUq4QGQwbkprMBMFw4uxONyNzYl+F9aA5Ic\nAwebf7/dfDJIHZc8XkwY1jNJrmCTzRyTP5eDN4bDPoHqTotDo1CMFaHtnkygg/Lg\nqoirV8mHfqnO4XQBOCUiHZ6mzz81l+O7dYg65cYx9Z76q2cv1PxsMb7Eo4nvux5S\nQPuuid0G5lomHXM/uM3mu4vXcDluCoffgTDimxs0I9X+PB7a2vgSMezwYkj8dA69\nvszH1hwek7DRbRfKUo6HUxl49Gsk0XYG/K30M5fS5JE=</ds:SignatureValue>\n </ebics:AuthSignature>\n <ebics:body/>\n</ebics:ebicsNoPubKeyDigestsRequest>\n")!!.readText() - XMLUtil.convertStringToJaxb<EbicsNpkdRequest>(text) - } - - @Test - fun testHtd() { - val htd = HTDResponseOrderData().apply { - this.partnerInfo = EbicsTypes.PartnerInfo().apply { - this.accountInfoList = listOf( - EbicsTypes.AccountInfo().apply { - this.id = "acctid1" - this.accountHolder = "Mina Musterfrau" - this.accountNumberList = listOf( - EbicsTypes.GeneralAccountNumber().apply { - this.international = true - this.value = "AT411100000237571500" - } - ) - this.currency = "EUR" - this.description = "some account" - this.bankCodeList = listOf( - EbicsTypes.GeneralBankCode().apply { - this.international = true - this.value = "ABAGATWWXXX" - } - ) - } - ) - this.addressInfo = EbicsTypes.AddressInfo().apply { - this.name = "Foo" - } - this.bankInfo = EbicsTypes.BankInfo().apply { - this.hostID = "MYHOST" - } - this.orderInfoList = listOf( - EbicsTypes.AuthOrderInfoType().apply { - this.description = "foo" - this.orderType = "CCC" - this.orderFormat = "foo" - this.transferType = "Upload" - } - ) - } - this.userInfo = EbicsTypes.UserInfo().apply { - this.name = "Some User" - this.userID = EbicsTypes.UserIDType().apply { - this.status = 2 - this.value = "myuserid" - } - this.permissionList = listOf( - EbicsTypes.UserPermission().apply { - this.orderTypes = "CCC ABC" - } - ) - } - } - - val str = XMLUtil.convertJaxbToString(htd) - println(str) - assert(XMLUtil.validateFromString(str)) - } - - - @Test - fun testHkd() { - val hkd = HKDResponseOrderData().apply { - this.partnerInfo = EbicsTypes.PartnerInfo().apply { - this.accountInfoList = listOf( - EbicsTypes.AccountInfo().apply { - this.id = "acctid1" - this.accountHolder = "Mina Musterfrau" - this.accountNumberList = listOf( - EbicsTypes.GeneralAccountNumber().apply { - this.international = true - this.value = "AT411100000237571500" - } - ) - this.currency = "EUR" - this.description = "some account" - this.bankCodeList = listOf( - EbicsTypes.GeneralBankCode().apply { - this.international = true - this.value = "ABAGATWWXXX" - } - ) - } - ) - this.addressInfo = EbicsTypes.AddressInfo().apply { - this.name = "Foo" - } - this.bankInfo = EbicsTypes.BankInfo().apply { - this.hostID = "MYHOST" - } - this.orderInfoList = listOf( - EbicsTypes.AuthOrderInfoType().apply { - this.description = "foo" - this.orderType = "CCC" - this.orderFormat = "foo" - this.transferType = "Upload" - } - ) - } - this.userInfoList = listOf( - EbicsTypes.UserInfo().apply { - this.name = "Some User" - this.userID = EbicsTypes.UserIDType().apply { - this.status = 2 - this.value = "myuserid" - } - this.permissionList = listOf( - EbicsTypes.UserPermission().apply { - this.orderTypes = "CCC ABC" - } - ) - }) - } - - val str = XMLUtil.convertJaxbToString(hkd) - println(str) - assert(XMLUtil.validateFromString(str)) - } - - @Test - fun testEbicsRequestInitializationPhase() { - val ebicsRequestObj = EbicsRequest().apply { - this.version = "H004" - this.revision = 1 - this.authSignature = SignatureType() - this.header = EbicsRequest.Header().apply { - this.authenticate = true - this.mutable = EbicsRequest.MutableHeader().apply { - this.transactionPhase = EbicsTypes.TransactionPhaseType.INITIALISATION - } - this.static = EbicsRequest.StaticHeaderType().apply { - this.hostID = "myhost" - this.nonce = ByteArray(16) - this.timestamp = - DatatypeFactory.newDefaultInstance().newXMLGregorianCalendar(2019, 5, 5, 5, 5, 5, 0, 0) - this.partnerID = "mypid01" - this.userID = "myusr01" - this.product = EbicsTypes.Product().apply { - this.instituteID = "test" - this.language = "en" - this.value = "test" - } - this.orderDetails = EbicsRequest.OrderDetails().apply { - this.orderAttribute = "DZHNN" - this.orderID = "OR01" - this.orderType = "BLA" - this.orderParams = EbicsRequest.StandardOrderParams() - } - this.bankPubKeyDigests = EbicsRequest.BankPubKeyDigests().apply { - this.authentication = EbicsTypes.PubKeyDigest().apply { - this.algorithm = "foo" - this.value = ByteArray(32) - this.version = "X002" - } - this.encryption = EbicsTypes.PubKeyDigest().apply { - this.algorithm = "foo" - this.value = ByteArray(32) - this.version = "E002" - } - } - this.securityMedium = "0000" - } - } - this.body = EbicsRequest.Body().apply { - } - } - - val str = XMLUtil.convertJaxbToString(ebicsRequestObj) - val doc = XMLUtil.parseStringIntoDom(str) - val pair = CryptoUtil.generateRsaKeyPair(1024) - XMLUtil.signEbicsDocument(doc, pair.private) - val finalStr = XMLUtil.convertDomToString(doc) - assert(XMLUtil.validateFromString(finalStr)) - } -} -\ No newline at end of file