gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libeufin] 02/02: PDF key letter generation


From: gnunet
Subject: [libeufin] 02/02: PDF key letter generation
Date: Tue, 16 Jun 2020 11:09:43 +0200

This is an automated email from the git hooks/post-receive script.

dold pushed a commit to branch master
in repository libeufin.

commit f332cafcc7ffc97cf22aaf3283f5de4894e2d25b
Author: Florian Dold <florian.dold@gmail.com>
AuthorDate: Tue Jun 16 14:36:29 2020 +0530

    PDF key letter generation
---
 integration-tests/util.py                          |  2 +-
 nexus/build.gradle                                 |  3 +
 nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt  | 19 +++++
 .../kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt | 84 ++++++++++++++++++++++
 4 files changed, 107 insertions(+), 1 deletion(-)

diff --git a/integration-tests/util.py b/integration-tests/util.py
index bb4a457..0be4183 100644
--- a/integration-tests/util.py
+++ b/integration-tests/util.py
@@ -20,7 +20,7 @@ def checkPort(port):
 def kill(name, s):
     print(f"terminating {name} ...")
     s.terminate()
-    s.wait(1)
+    s.wait()
     print("terminated!")
 
 
diff --git a/nexus/build.gradle b/nexus/build.gradle
index 7fcfaa7..f015e7e 100644
--- a/nexus/build.gradle
+++ b/nexus/build.gradle
@@ -82,6 +82,9 @@ dependencies {
     implementation "io.ktor:ktor-auth:$ktor_version"
     implementation "io.ktor:ktor-jackson:$ktor_version"
 
+    // PDF generation
+    implementation 'com.itextpdf:itext7-core:7.1.11'
+
     testImplementation group: 'junit', name: 'junit', version: '4.12'
 }
 
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
index 8ca4b9f..2fd6b9f 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
@@ -35,6 +35,10 @@ import com.github.ajalt.clikt.parameters.arguments.argument
 import com.github.ajalt.clikt.parameters.options.default
 import com.github.ajalt.clikt.parameters.options.option
 import com.github.ajalt.clikt.parameters.options.prompt
+import com.itextpdf.kernel.pdf.PdfDocument
+import com.itextpdf.kernel.pdf.PdfWriter
+import com.itextpdf.layout.Document
+import com.itextpdf.layout.element.Paragraph
 import io.ktor.application.ApplicationCall
 import io.ktor.application.ApplicationCallPipeline
 import io.ktor.application.call
@@ -70,6 +74,7 @@ import org.slf4j.event.Level
 import tech.libeufin.nexus.ebics.*
 import tech.libeufin.util.*
 import tech.libeufin.util.CryptoUtil.hashpw
+import java.io.ByteArrayOutputStream
 import java.io.PrintWriter
 import java.io.StringWriter
 import java.net.URLEncoder
@@ -778,6 +783,20 @@ fun serverMain(dbName: String) {
                 call.respond(object {})
             }
 
+            get("/bank-connections/{connid}/keyletter") {
+                val conn = transaction {
+                    authenticateRequest(call.request)
+                    requireBankConnection(call, "connid")
+                }
+                when (conn.type) {
+                    "ebics" -> {
+                        val pdfBytes = getEbicsKeyLetterPdf(conn)
+                        call.respondBytes(pdfBytes, ContentType("application", 
"pdf"))
+                    }
+                    else -> throw NexusError(HttpStatusCode.NotImplemented, 
"keyletter not supporte dfor ${conn.type}")
+                }
+            }
+
             get("/bank-connections/{connid}/messages") {
                 val ret = transaction {
                     val list = BankMessageList()
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
index 9cb61f7..1170aa3 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
@@ -26,6 +26,11 @@ package tech.libeufin.nexus.ebics
 import com.fasterxml.jackson.databind.JsonNode
 import com.fasterxml.jackson.databind.ObjectMapper
 import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
+import com.itextpdf.kernel.pdf.PdfDocument
+import com.itextpdf.kernel.pdf.PdfWriter
+import com.itextpdf.layout.Document
+import com.itextpdf.layout.element.AreaBreak
+import com.itextpdf.layout.element.Paragraph
 import io.ktor.application.Application
 import io.ktor.application.ApplicationCall
 import io.ktor.application.call
@@ -47,6 +52,10 @@ import tech.libeufin.nexus.*
 import tech.libeufin.nexus.logger
 import tech.libeufin.util.*
 import tech.libeufin.util.ebics_h004.HTDResponseOrderData
+import java.io.ByteArrayOutputStream
+import java.security.interfaces.RSAPrivateCrtKey
+import java.time.LocalDateTime
+import java.time.format.DateTimeFormatter
 import java.util.*
 import javax.crypto.EncryptedPrivateKeyInfo
 
@@ -479,4 +488,79 @@ suspend fun connectEbics(client: HttpClient, connId: 
String) {
             subscriberEntity.bankEncryptionPublicKey = 
ExposedBlob((hpbData.encryptionPubKey.encoded))
         }
     }
+}
+
+fun formatHex(ba: ByteArray): String {
+    var out = ""
+    for (i in ba.indices) {
+        val b = ba[i]
+        if (i > 0 && i % 16 == 0) {
+            out += "\n"
+        }
+        out += java.lang.String.format("%02X", b)
+        out += " "
+    }
+    return out
+}
+
+fun getEbicsKeyLetterPdf(conn: NexusBankConnectionEntity): ByteArray {
+    val ebicsSubscriber = transaction { 
getEbicsSubscriberDetails(conn.id.value) }
+
+    val po = ByteArrayOutputStream()
+    val pdfWriter = PdfWriter(po)
+    val pdfDoc = PdfDocument(pdfWriter)
+    val date = LocalDateTime.now()
+    val dateStr = date.format(DateTimeFormatter.ISO_LOCAL_DATE)
+
+    fun writeCommon(doc: Document) {
+        doc.add(Paragraph("""
+            Datum: $dateStr
+            Teilnehmer: ${conn.id.value}
+            Host-ID: ${ebicsSubscriber.hostId}
+            User-ID: ${ebicsSubscriber.userId}
+            Partner-ID: ${ebicsSubscriber.partnerId}
+            ES version: A006
+        """.trimIndent()))
+    }
+
+    fun writeKey(doc: Document, priv: RSAPrivateCrtKey) {
+        val pub = CryptoUtil.getRsaPublicFromPrivate(priv)
+        val hash = CryptoUtil.getEbicsPublicKeyHash(pub)
+        
doc.add(Paragraph("Exponent:\n${formatHex(pub.publicExponent.toByteArray())}"))
+        doc.add(Paragraph("Modulus:\n${formatHex(pub.modulus.toByteArray())}"))
+        doc.add(Paragraph("SHA-256 hash:\n${formatHex(hash)}"))
+    }
+
+    fun writeSigLine(doc: Document) {
+        doc.add(Paragraph("Ort / Datum: ________________"))
+        doc.add(Paragraph("Firma / Name: ________________"))
+        doc.add(Paragraph("Unterschrift: ________________"))
+    }
+
+    Document(pdfDoc).use {
+        it.add(Paragraph("Signaturschlüssel").setFontSize(24f))
+        writeCommon(it)
+        it.add(Paragraph("Öffentlicher Schlüssel (Public key for the 
electronic signature)"))
+        writeKey(it, ebicsSubscriber.customerSignPriv)
+        it.add(Paragraph("\n"))
+        writeSigLine(it)
+        it.add(AreaBreak())
+
+        it.add(Paragraph("Authentifikationsschlüssel").setFontSize(24f))
+        writeCommon(it)
+        it.add(Paragraph("Öffentlicher Schlüssel (Public key for the 
identification and authentication signature)"))
+        writeKey(it, ebicsSubscriber.customerAuthPriv)
+        it.add(Paragraph("\n"))
+        writeSigLine(it)
+        it.add(AreaBreak())
+
+        it.add(Paragraph("Verschlüsselungsschlüssel").setFontSize(24f))
+        writeCommon(it)
+        it.add(Paragraph("Öffentlicher Schlüssel (Public encryption key)"))
+        it.add(Paragraph("\n"))
+        writeKey(it, ebicsSubscriber.customerSignPriv)
+        writeSigLine(it)
+    }
+    pdfWriter.flush()
+    return po.toByteArray()
 }
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]