summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--certificate.go4
-rw-r--r--certificate_test.go22
-rw-r--r--order.go110
-rw-r--r--order_test.go9
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))
+
+ }
+}
diff --git a/order.go b/order.go
index eea8d5c..38578a0 100644
--- a/order.go
+++ b/order.go
@@ -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())
}