a
    kÄ#d  ã                   @   sœ   d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	 G dd„ deƒZ
G dd	„ d	e
ƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )a+  
    field type definitions used by iec 60870-5-104 layer (iec104)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    :description:

        This file provides field definitions used by the IEC-60870-5-104
        implementation. Some of those fields are used exclusively by iec104
        (e.g. IEC104SequenceNumber) while others (LESignedShortField) are
        more common an may be moved to fields.py.

        normative references:
            - EN 60870-5-104:2006
            - EN 60870-5-4:1993
            - EN 60870-5-4:1994
é    N©Úorb)ÚFieldÚThreeBytesFieldÚBitField©Ú
RandSShortc                   @   s   e Zd ZdZdd„ ZdS )ÚLESignedShortFieldz*
    little endian signed short field
    c                 C   s   t  | ||d¡ d S )Nz<h©r   Ú__init__©ÚselfÚnameÚdefault© r   ú_/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/scada/iec104/iec104_fields.pyr   #   s    zLESignedShortField.__init__N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r	      s   r	   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚIEC60870_5_4_NormalizedFixPointzE
    defined as typ 4.1 in EN 60870-5-4:1993, sec. 5.4.1 (p. 10)
    c                 C   s   d  |  ||¡|¡S )zN
        show the fixed fp-number and its signed short representation
        z{} ({}))ÚformatÚi2h©r   ÚpktÚxr   r   r   Úi2repr,   s    z&IEC60870_5_4_NormalizedFixPoint.i2reprc                 C   s   |d S )Ng      à@r   r   r   r   r   r   3   s    z#IEC60870_5_4_NormalizedFixPoint.i2hc                 C   s   t ƒ S ©Nr   )r   r   r   r   Úrandval6   s    z'IEC60870_5_4_NormalizedFixPoint.randvalN)r   r   r   r   r   r   r   r   r   r   r   r   '   s   r   c                   @   s   e Zd ZdZdd„ ZdS )ÚLEIEEEFloatFieldz(
    little endian IEEE float field
    c                 C   s   t  | ||d¡ d S )Nz<fr
   r   r   r   r   r   @   s    zLEIEEEFloatField.__init__Nr   r   r   r   r   r    <   s   r    c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚLEThreeBytesFieldz)
    little endian three bytes field
    c                 C   s   t  | ||¡ d S r   )r   r   r   r   r   r   r   H   s    zLEThreeBytesField.__init__c                 C   s0   t  | j|  ||¡¡dd… d d d… }|| S )Né   é   éÿÿÿÿ)ÚstructÚpackÚfmtÚi2m)r   r   ÚsÚvalÚdatar   r   r   ÚaddfieldK   s    (zLEThreeBytesField.addfieldc              	   C   s@   |d d… d d d… }|dd … |   |t | jd| ¡d ¡fS )Né   r$   ó    r   )Úm2ir%   Úunpackr'   )r   r   r)   r+   r   r   r   ÚgetfieldO   s    zLEThreeBytesField.getfieldN©r   r   r   r   r   r,   r1   r   r   r   r   r!   D   s   r!   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚIEC104SequenceNumbera«  

    IEC 60870-5-104 uses the following encoding for sequence numbers
    (see EN 60870-5-104:2006, p. 13):

      bit ->7   6   5   4   3   2   1   0
          +---+---+---+---+---+---+---+---+---------+
          |   |   |   |   |   |   |LSB| 0 | =byte 0 |
          +---+---+---+---+---+---+---+---+---------+
          |MSB|   |   |   |   |   |   |   | =byte 1 |
          +---+---+---+---+---+---+---+---+---------+

    c                 C   s   t  | ||d¡ d S )Nz!Ir
   r   r   r   r   r   c   s    zIEC104SequenceNumber.__init__c                 C   s(   |d> d@ }|d? }|t t||gƒƒ S )Nr"   éþ   é   )ÚbytesÚ	bytearray)r   r   r)   r*   Úb0Úb1r   r   r   r,   f   s    zIEC104SequenceNumber.addfieldc                 C   s<   t |d ƒd@ d? }t |d ƒ}||d>  }|dd … |fS )Nr   r4   r"   r5   é   r   )r   r   r)   r8   r9   Zseq_numr   r   r   r1   l   s    zIEC104SequenceNumber.getfieldNr2   r   r   r   r   r3   T   s   r3   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚIEC104SignedSevenBitValuezO
    Typ 2.1, 7 Bit, [-64..63]

    see EN 60870-5-4:1994, Typ 2.1 (p. 13)
    c                 C   s   t  | ||d¡ d S )Nr5   )r   r   r   r   r   r   r   |   s    z"IEC104SignedSevenBitValue.__init__c                 C   s   |d@ r|d }|S )Né@   é€   r   r   r   r   r   r/      s    zIEC104SignedSevenBitValue.m2ic                 C   s$   d}|dk rd}|d }||B }|S )Nr   r<   r   )r   r   r   Úsignr   r   r   r(   †   s    zIEC104SignedSevenBitValue.i2mN)r   r   r   r   r   r/   r(   r   r   r   r   r;   u   s   r;   )r   r%   Zscapy.compatr   Zscapy.fieldsr   r   r   Zscapy.volatiler   r	   r   r    r!   r3   r;   r   r   r   r   Ú<module>   s   !