# Source code for fints.segments.message

    from fints.fields import (
        CodeField, DataElementField, DataElementGroupField,
        SegmentSequenceField, ZeroPaddedNumericField,
    )
    from fints.formals import (
        Certificate, CompressionFunction, EncryptionAlgorithm,
        HashAlgorithm, KeyName, ReferenceMessage, SecurityApplicationArea,
        SecurityDateTime, SecurityIdentificationDetails, SecurityProfile,
        SecurityRole, SignatureAlgorithm, UserDefinedSignature,
    )

    from .base import FinTS3Segment

    class HNHBK3(FinTS3Segment):
        """Nachrichtenkopf"""
        message_size = ZeroPaddedNumericField(length=12, _d="Größe der Nachricht (nach Verschlüsselung und Komprimierung)")
        hbci_version = DataElementField(type='num', max_length=3, _d="HBCI-Version")
        dialog_id = DataElementField(type='id', _d="Dialog-ID")
        message_number = DataElementField(type='num', max_length=4, _d="Nachrichtennummer")
        reference_message = DataElementGroupField(type=ReferenceMessage, required=False, _d="Bezugsnachricht")

    class HNHBS1(FinTS3Segment):
        """Nachrichtenabschluss"""
        message_number = DataElementField(type='num', max_length=4, _d="Nachrichtennummer")

    class HNVSK3(FinTS3Segment):
        """Verschlüsselungskopf, version 3

        Source: FinTS Financial Transaction Services, Sicherheitsverfahren HBCI"""
        security_profile = DataElementGroupField(type=SecurityProfile, _d="Sicherheitsprofil")
        security_function = DataElementField(type='code', max_length=3, _d="Sicherheitsfunktion, kodiert")
        security_role = CodeField(SecurityRole, max_length=3, _d="Rolle des Sicherheitslieferanten, kodiert")
        security_identification_details = DataElementGroupField(type=SecurityIdentificationDetails, _d="Sicherheitsidentifikation, Details")
        security_datetime = DataElementGroupField(type=SecurityDateTime, _d="Sicherheitsdatum und -uhrzeit")
        encryption_algorithm = DataElementGroupField(type=EncryptionAlgorithm, _d="Verschlüsselungsalgorithmus")
        key_name = DataElementGroupField(type=KeyName, _d="Schlüsselname")
        compression_function = CodeField(CompressionFunction, max_length=3, _d="Komprimierungsfunktion")
        certificate = DataElementGroupField(type=Certificate, required=False, _d="Zertifikat")

    class HNVSD1(FinTS3Segment):
        """Verschlüsselte Daten, version 1

        Source: FinTS Financial Transaction Services, Sicherheitsverfahren HBCI"""
        data = SegmentSequenceField(_d="Daten, verschlüsselt")

    class HNSHK4(FinTS3Segment):
        """Signaturkopf, version 4

        Source: FinTS Financial Transaction Services, Sicherheitsverfahren HBCI"""
        security_profile = DataElementGroupField(type=SecurityProfile, _d="Sicherheitsprofil")
        security_function = DataElementField(type='code', max_length=3, _d="Sicherheitsfunktion, kodiert")
        security_reference = DataElementField(type='an', max_length=14, _d="Sicherheitskontrollreferenz")
        security_application_area = CodeField(SecurityApplicationArea, max_length=3, _d="Bereich der Sicherheitsapplikation, kodiert")
        security_role = CodeField(SecurityRole, max_length=3, _d="Rolle des Sicherheitslieferanten, kodiert")
        security_identification_details = DataElementGroupField(type=SecurityIdentificationDetails, _d="Sicherheitsidentifikation, Details")
        security_reference_number = DataElementField(type='num', max_length=16, _d="Sicherheitsreferenznummer")
        security_datetime = DataElementGroupField(type=SecurityDateTime, _d="Sicherheitsdatum und -uhrzeit")
        hash_algorithm = DataElementGroupField(type=HashAlgorithm, _d="Hashalgorithmus")
        signature_algorithm = DataElementGroupField(type=SignatureAlgorithm, _d="Signaturalgorithmus")
        key_name = DataElementGroupField(type=KeyName, _d="Schlüsselname")
        certificate = DataElementGroupField(type=Certificate, required=False, _d="Zertifikat")

    class HNSHA2(FinTS3Segment):
        """Signaturabschluss, version 2

        Source: FinTS Financial Transaction Services, Sicherheitsverfahren HBCI"""
        security_reference = DataElementField(type='an', max_length=14, _d="Sicherheitskontrollreferenz")
        validation_result = DataElementField(type='bin', max_length=512, required=False, _d="Validierungsresultat")
        user_defined_signature = DataElementGroupField(type=UserDefinedSignature, required=False, _d="Benutzerdefinierte Signatur")