/
encryption.go
62 lines (53 loc) · 1.67 KB
/
encryption.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package message
import (
"crypto/rand"
"github.com/mitch000001/go-hbci/segment"
)
const encryptionInitializationVector = "\x00\x00\x00\x00\x00\x00\x00\x00"
// GenerateMessageKey generates a random key with 16 bytes
func GenerateMessageKey() ([]byte, error) {
b := make([]byte, 16)
_, err := rand.Read(b)
if err != nil {
return nil, err
}
return b, nil
}
// NewEncryptedMessage creates a new encrypted message
func NewEncryptedMessage(header *segment.MessageHeaderSegment, end *segment.MessageEndSegment, hbciVersion segment.HBCIVersion) *EncryptedMessage {
e := &EncryptedMessage{
hbciVersion: hbciVersion,
}
e.ClientMessage = NewBasicMessageWithHeaderAndEnd(header, end, e)
return e
}
// EncryptedMessage represents an encrypted message
type EncryptedMessage struct {
ClientMessage
EncryptionHeader segment.EncryptionHeader
EncryptedData *segment.EncryptedDataSegment
hbciVersion segment.HBCIVersion
}
// HBCIVersion returns the HBCIVersion of this message
func (e *EncryptedMessage) HBCIVersion() segment.HBCIVersion {
return e.hbciVersion
}
// HBCISegments returns all segments within the message
func (e *EncryptedMessage) HBCISegments() []segment.ClientSegment {
return []segment.ClientSegment{
e.EncryptionHeader,
e.EncryptedData,
}
}
// Decrypt decrypts the message using the CryptoProvider
func (e *EncryptedMessage) Decrypt(provider CryptoProvider) (BankMessage, error) {
decryptedMessageBytes, err := provider.Decrypt(e.EncryptedData.Data.Val())
if err != nil {
return nil, err
}
decryptedMessage, err := NewDecryptedMessage(e.MessageHeader(), e.MessageEnd(), decryptedMessageBytes)
if err != nil {
return nil, err
}
return decryptedMessage, nil
}