diff options
| author | Merlin Scholz <merlin@scholz.ruhr> | 2026-05-13 20:15:33 +0200 |
|---|---|---|
| committer | Merlin Scholz <merlin@scholz.ruhr> | 2026-05-13 20:15:33 +0200 |
| commit | 57c9ff7ab110dc22c84993d54b52554bd79b86f1 (patch) | |
| tree | 8e86553b4e852672bc2a329248e28cda204abd8a | |
| parent | 06ac3c972583582d6b28fbaab995f68f7fea2957 (diff) | |
HIA works
| -rw-r--r-- | certificate.go | 4 | ||||
| -rw-r--r-- | certificate_test.go | 22 | ||||
| -rw-r--r-- | order.go | 110 | ||||
| -rw-r--r-- | order_test.go | 9 |
4 files changed, 139 insertions, 6 deletions
diff --git a/certificate.go b/certificate.go index 17de0a1..52bbb5c 100644 --- a/certificate.go +++ b/certificate.go @@ -3,7 +3,7 @@ package libebics import ( "crypto/rand" "crypto/rsa" - "crypto/sha1" + "crypto/sha256" "crypto/x509" "crypto/x509/pkix" "encoding/pem" @@ -76,7 +76,7 @@ func GenerateSelfSignedCertificate(ebicsCertificateType EbicsCertificateType, pr } func GetCertificateFingerprintAsString(ebicsCertificate *EbicsCertificate) string { - return fmt.Sprintf("% x", sha1.Sum(ebicsCertificate.x509Certificate)) + return fmt.Sprintf("% x", sha256.Sum256(ebicsCertificate.x509Certificate)) } func WriteCertificateToFile(ebicsCertificate *EbicsCertificate, path string) error { diff --git a/certificate_test.go b/certificate_test.go index dd0297b..a2d6e9b 100644 --- a/certificate_test.go +++ b/certificate_test.go @@ -92,3 +92,25 @@ func TestGenerateSelfSignedCertificateTriplet(t *testing.T) { } } } + +func TestPrintCertificateTripletFingerprints(t *testing.T) { + var filenamePrefix string + for _, ebicsCertificateType := range []EbicsCertificateType{A005, X002, E002} { + switch ebicsCertificateType { + case X002: + filenamePrefix = "authentication" + case E002: + filenamePrefix = "encryption" + case A005, A006: + filenamePrefix = "signature" + } + + loadedCertificate, err := ReadCertificateFromFile(filepath.Join("certs", filenamePrefix+"_cert.pem"), ebicsCertificateType) + if err != nil { + t.Error(err.Error()) + } + + t.Logf("Loaded %s certificate has following fingerprints: %s", filenamePrefix, GetCertificateFingerprintAsString(loadedCertificate)) + + } +} @@ -61,13 +61,36 @@ type EbicsDataTransfer struct { type EbicsSignaturePubKeyOrderData struct { XMLName xml.Name `xml:"esig:SignaturePubKeyOrderData"` - Esig string `xml:"xmlns:esi,attr"` + Esig string `xml:"xmlns:esig,attr"` Ds string `xml:"xmlns:ds,attr"` SignaturePubKeyInfo EbicsSignaturePubKeyInfo `xml:"esig:SignaturePubKeyInfo"` PartnerID string `xml:"esig:PartnerID"` UserID string `xml:"esig:UserID"` } +type EbicsHiaRequestOrderData struct { + XMLName xml.Name `xml:"HIARequestOrderData"` + Xmlns string `xml:"xmlns,attr"` + Esig string `xml:"xmlns:esig,attr"` + Ds string `xml:"xmlns:ds,attr"` + AuthenticationPubKeyInfo EbicsAuthenticationPubKeyInfo `xml:"AuthenticationPubKeyInfo"` + EncryptionPubKeyInfo EbicsEncryptionPubKeyInfo `xml:"EncryptionPubKeyInfo"` + PartnerID string `xml:"PartnerID"` + UserID string `xml:"UserID"` +} + +type EbicsAuthenticationPubKeyInfo struct { + XMLName xml.Name `xml:"AuthenticationPubKeyInfo"` + X509Data EbicsX509Data `xml:"ds:X509Data"` + AuthenticationVersion string `xml:"AuthenticationVersion"` // TODO Use ENUM +} + +type EbicsEncryptionPubKeyInfo struct { + XMLName xml.Name `xml:"EncryptionPubKeyInfo"` + X509Data EbicsX509Data `xml:"ds:X509Data"` + EncryptionVersion string `xml:"EncryptionVersion"` // TODO Use ENUM +} + type EbicsSignaturePubKeyInfo struct { XMLName xml.Name `xml:"esig:SignaturePubKeyInfo"` X509Data EbicsX509Data `xml:"ds:X509Data"` @@ -90,10 +113,12 @@ func GenerateIniRequest(signatureCertificate EbicsCertificate) (string, error) { zlibWriter := zlib.NewWriter(&zlibWriterBuffer) orderData := EbicsSignaturePubKeyOrderData{ + Esig: "http://www.ebics.org/S002", + Ds: "http://www.w3.org/2000/09/xmldsig#", SignaturePubKeyInfo: EbicsSignaturePubKeyInfo{ X509Data: EbicsX509Data{ X509Certificate: base64.StdEncoding.EncodeToString( - signatureCertificate.x509Certificate, + signatureCertificate.x509Certificate, // TODO Proper Base64 Marshalling ), }, SignatureVersion: signatureCertificate.ebicsCertificateType.String(), @@ -143,3 +168,84 @@ func GenerateIniRequest(signatureCertificate EbicsCertificate) (string, error) { return (xml.Header + string(marshal)), err } + +func GenerateHiaRequest(authenticationCertificate EbicsCertificate, encryptionCertificate EbicsCertificate) (string, error) { + + if authenticationCertificate.ebicsCertificateType != X002 { + return "", fmt.Errorf("authentication certificate has invalid certificate type %s", authenticationCertificate.ebicsCertificateType.String()) + } + + if encryptionCertificate.ebicsCertificateType != E002 { + return "", fmt.Errorf("encryption certificate has invalid certificate type %s", encryptionCertificate.ebicsCertificateType.String()) + } + + var zlibWriterBuffer bytes.Buffer + zlibWriter := zlib.NewWriter(&zlibWriterBuffer) + + orderData := EbicsHiaRequestOrderData{ + Xmlns: "urn:org:ebics:H005", + Esig: "http://www.ebics.org/S002", + Ds: "http://www.w3.org/2000/09/xmldsig#", + AuthenticationPubKeyInfo: EbicsAuthenticationPubKeyInfo{ + X509Data: EbicsX509Data{ + X509Certificate: base64.StdEncoding.EncodeToString( + authenticationCertificate.x509Certificate, // TODO Proper Base64 Marshalling + ), + }, + AuthenticationVersion: authenticationCertificate.ebicsCertificateType.String(), + }, + EncryptionPubKeyInfo: EbicsEncryptionPubKeyInfo{ + X509Data: EbicsX509Data{ + X509Certificate: base64.StdEncoding.EncodeToString( + encryptionCertificate.x509Certificate, // TODO Proper Base64 Marshalling + ), + }, + EncryptionVersion: encryptionCertificate.ebicsCertificateType.String(), + }, + PartnerID: "MV008078", + UserID: "SCHOLZ01", + } + + orderData_xml, err := xml.Marshal(orderData) + if err != nil { + return "", err + } + + fmt.Print(string(orderData_xml)) + + zlibWriter.Write(orderData_xml) + zlibWriter.Close() + + ini := EbicsUnsecuredRequest{ + Xmlns: "urn:org:ebics:H005", + Version: "H005", + Revision: "1", + Header: EbicsHeader{ + Authenticate: true, + Static: EbicsHeaderStatic{ + HostID: "MULTIVIA", + PartnerID: "MV008078", + UserID: "SCHOLZ01", + Product: EbicsProduct{ + Language: "en", + Name: "libebics", + }, + OrderDetails: EbicsOrderDetails{ + AdminOrderType: "HIA", + }, + SecurityMedium: "0000", + }, + }, + Body: EbicsBody{ + DataTransfer: EbicsDataTransfer{ + OrderData: base64.StdEncoding.EncodeToString( + zlibWriterBuffer.Bytes(), + ), + }, + }, + } + + marshal, err := xml.MarshalIndent(ini, "", " ") + + return (xml.Header + string(marshal)), err +} diff --git a/order_test.go b/order_test.go index 605042a..ff8119c 100644 --- a/order_test.go +++ b/order_test.go @@ -36,12 +36,17 @@ func TestSendIniRequest(t *testing.T) { } func TestSendHiaRequest(t *testing.T) { - signatureCertificate, err := ReadCertificateFromFile(filepath.Join("certs", "signature_cert.pem"), A005) + authenticationCertificate, err := ReadCertificateFromFile(filepath.Join("certs", "authentication_cert.pem"), X002) if err != nil { t.Error(err.Error()) } - ini, err := GenerateIniRequest(*signatureCertificate) + encryptionCertificate, err := ReadCertificateFromFile(filepath.Join("certs", "encryption_cert.pem"), E002) + if err != nil { + t.Error(err.Error()) + } + + ini, err := GenerateHiaRequest(*authenticationCertificate, *encryptionCertificate) if err != nil { t.Error(err.Error()) } |
