return dialog
def _new_message(self, dialog: FinTSDialog, segments):
- return FinTSMessage(self.blz, self.username, self.pin, dialog.systemid, dialog.dialogid, dialog.msgno, segments)
+ return FinTSMessage(self.blz, self.username, self.pin, dialog.systemid, dialog.dialogid, dialog.msgno,
+ segments, dialog.tan_mechs)
def init(self):
logger.info('Initialize Dialog')
- seg_identification = HKIDN(3, self.blz, self.username, 0)
+ seg_identification = HKIDN(3, self.blz, self.username, self.systemid)
seg_prepare = HKVVB(4)
msg_init = FinTSMessage(self.blz, self.username, self.pin, self.systemid, self.dialogid, self.msgno, [
seg_identification,
seg_prepare,
- ])
+ ], self.tan_mechs)
logger.debug('Sending INIT: {}'.format(msg_init))
resp = self.send(msg_init)
logger.debug('Got INIT response: {}'.format(resp))
class FinTSMessage:
- def __init__(self, blz, username, pin, systemid, dialogid, msgno, encrypted_segments):
+ def __init__(self, blz, username, pin, systemid, dialogid, msgno, encrypted_segments, tan_mechs=None):
self.blz = blz
self.username = username
self.pin = pin
self.segments = []
self.encrypted_segments = []
+ if tan_mechs and '999' not in tan_mechs:
+ self.profile_version = 2
+ self.security_function = tan_mechs[0]
+ else:
+ self.profile_version = 1
+ self.security_function = '999'
+
sig_head = self.build_signature_head()
enc_head = self.build_encryption_head()
self.segments.append(enc_head)
def build_signature_head(self):
rand = random.SystemRandom()
self.secref = rand.randint(1000000, 9999999)
- return HNSHK(2, self.secref, self.blz, self.username, self.systemid)
+ return HNSHK(2, self.secref, self.blz, self.username, self.systemid, self.profile_version,
+ self.security_function)
def build_encryption_head(self):
- return HNVSK(998, self.blz, self.username, self.systemid)
+ return HNVSK(998, self.blz, self.username, self.systemid, self.profile_version)
def build_header(self):
l = sum([len(str(s)) for s in self.segments])
if id == "3920":
m = self.RE_TANMECH.search(msg)
if m:
- return m.group(0)
+ return [m.group(0)]
return False
def _get_segment_max_version(self, name):
SECURITY_FUNC = 999
SECURITY_BOUNDARY = 1 # SHM
SECURITY_SUPPLIER_ROLE = 1 # ISS
- PINTAN_VERSION = 1 # 1-step
- def __init__(self, segno, secref, blz, username, systemid):
+ def __init__(self, segno, secref, blz, username, systemid, profile_version, security_function=SECURITY_FUNC):
data = [
- ':'.join(['PIN', str(self.PINTAN_VERSION)]),
- self.SECURITY_FUNC,
+ ':'.join(['PIN', str(profile_version)]),
+ security_function,
secref,
self.SECURITY_BOUNDARY,
self.SECURITY_SUPPLIER_ROLE,
COMPRESSION_NONE = 0
SECURITY_SUPPLIER_ROLE = 1 # ISS
- PINTAN_VERSION = 1 # 1-step
- def __init__(self, segno, blz, username, systemid):
+ def __init__(self, segno, blz, username, systemid, profile_version):
data = [
- ':'.join(['PIN', str(self.PINTAN_VERSION)]),
+ ':'.join(['PIN', str(profile_version)]),
998,
self.SECURITY_SUPPLIER_ROLE,
':'.join(['1', '', str(systemid)]),