
    j                        d dl Z d dlmZ d dlZd dlZd dlZd dlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ  ej"                  e      Z ed	d
      Z edd      Z	  eddd      ZddZd ZddZd Zy#   edd      ZY xY w)    N)
namedtuple)sha256   )	AESCipher)DecodeError)MAX_PAYLOAD_LENGTH)header
TuyaHeaderz$prefix seqno cmd length total_lengthMessagePayloadzcmd payloadTuyaMessagez0seqno cmd retcode payload crc crc_good prefix iv)TiU  N)defaultsc           	         | j                   t        j                  k(  rt        j                  }|rt        j                  nt        j
                  }t        | j                        t        j                  |      z   }| j                   | j                  | j                  |f}n| j                   t        j                  k(  r|st        d      t        j                  }t        j                  }t        | j                        t        j                  |      dz
  z   dz   }t!        | j"                        t$        k(  r&|t        j                  t        j&                        z  }| j                   d| j                  | j                  |f}nt)        d| j                   z        t        j*                  |g| }| j                   t        j                  k(  rt-        |      }t!        | j"                        t$        k(  r<t        j*                  t        j&                  | j"                        | j                  z   }n| j                  }|j/                  |dd| j0                  sdn| j0                  |dd 	      }	||	t        j2                  z   z  }|S || j                  z  }|r*t5        j6                  ||t8              j;                         }
nt=        j>                  |      d
z  }
|t        j*                  ||
t        j@                        z  }|S )zPack a TuyaMessage into bytes.z1key must be provided to pack 6699-format messages      r   z0pack_message() cannot handle message format %08XFTN)
use_base64padivr	       )!prefixHPREFIX_55AA_VALUEMESSAGE_HEADER_FMT_55AAMESSAGE_END_FMT_HMACMESSAGE_END_FMT_55AAlenpayloadstructcalcsizeseqnocmdPREFIX_6699_VALUE	TypeErrorMESSAGE_HEADER_FMT_6699MESSAGE_END_FMT_6699typeretcodeintMESSAGE_RETCODE_FMT
ValueErrorpackr   encryptr   SUFFIX_6699_BINhmacnewr   digestbinasciicrc32SUFFIX_VALUE)msghmac_key
header_fmtend_fmtmsg_lenheader_datadatacipherrawdata2crcs              I/DATA/.local/lib/python3.12/site-packages/tinytuya/core/message_helper.pypack_messager?      sA   
zzQ(((..
,4!((!:P:Pckk"V__W%==

CIIswwA	q**	*PRR..
((ckk"foog&>&BCbH#vq'<'<==G

Asyy#''7DLszzY[[ ;;
2[2D
zzQ(((H&#++q44ckkCckkQC++C5QTQWQWT]`]c]clpqrqsltu)))) K 	((8T6299;C..&3CWc1>>;;K    c                 t   | d d t         j                  k(  rt         j                  }nt         j                  }t	        j
                  |      }t        |       |k  rt        d      t	        j                  || d |       }|d   }|t         j                  k(  r|\  }}}}||z   }nh|t         j                  k(  r(|\  }}	}}}||z   t        t         j                        z   }n-t        d|t         j                  t         j                  fz        |t        kD  rt        dt        |||fz        t        |||||      S )Nr   z Not enough data to unpack headerr   z-Header prefix wrong! %08X is not %08X or %08XzwHeader claims the packet size is over %d bytes!  It is most likely corrupt.  Claimed size: %d bytes. fmt:%s unpacked:%r)r   PREFIX_6699_BINr#   r   r   r   r   r   unpackr   r!   r,   r   r
   )
r9   fmt
header_lenunpackedr   r   r    payload_lentotal_lengthunknowns
             r>   parse_headerrJ   F   sT   RaA%%%''''%J
4y:<==}}c4#46Ha[F$$$*2'sK"Z/	1&&	&3;0["Z/#a6G6G2HH IVUVUhUhjkj}j}L~~ ''  T  Xj  kv  wz  {C  WD  D  E  	EfeS+|DDr@   c           
      V   |t        |       }|j                  t        j                  k(  r|t	        j
                  t        j                        }|rt        j                  nt        j                  }|rdn"t	        j
                  t        j                        }||j                  z   }n|j                  t        j                  k(  rU|st        d      t	        j
                  t        j                        }t        j                  }d}||j                  z   dz   }nt        d|j                  z        t!        |       |k  r8t"        j%                  d||j                  z   t!        |              t'        d      t	        j
                  |      }|sdn,t	        j(                  t        j                  | |||z          d   }	| ||z   | }
t	        j(                  ||
| d       \  }}d}|
d|  }
|j                  t        j                  k(  r|r=t+        j,                  || d||j                  z   |z
   t.              j1                         }n+t3        j4                  | d||j                  z   |z
         d	z  }|t        j6                  k7  r%t"        j%                  d
|t        j6                         ||k7  rW|r>t"        j%                  dt3        j8                  |      t3        j8                  |             nt"        j%                  d||       ||k(  }d}n|j                  t        j                  k(  r|
dd }|
dd }
	 t;        |      }|j=                  |
ddd|| d| |      }
d}t	        j
                  t        j                        }|du rn;|7|
dd dk7  r/|
||dz    dk(  r$t	        j
                  t        j                        }nd}|r/t	        j(                  t        j                  |
d|       d   }	|
|d }
t?        |j@                  |jB                  |	|
|||j                        S #  d}Y xY w)z Unpack bytes into a TuyaMessage.Nr   z3key must be provided to unpack 6699-format messagesr   z2unpack_message() cannot handle message format %08XzMunpack_message(): not enough data to unpack payload! need %d but only have %dz!Not enough data to unpack payloadFr   z!Suffix prefix wrong! %08X != %08XzHMAC checksum wrong! %r != %rzCRC wrong! %08X != %08Xr   )r   decode_textverify_paddingr   r	   tagTr      {)"rJ   r   r   r   r   r   r   r   r   r(   lengthr!   r"   r#   r$   r)   r   logdebugr   rC   r-   r.   r   r/   r0   r1   r2   hexlifyr   decryptr   r   r    )r9   r4   r	   
no_retcoderE   r6   retcode_lenr7   end_lenr&   r   r=   suffixcrc_goodhave_crcr   r:   s                    r>   unpack_messager[   f   s   ~d#}}+++__Q%>%>?
,4!((!:P:P%a6??1;P;P+Qv}},	!--	-RTT__Q%>%>?
((v}},q0NQWQ^Q^^``
4y7		acmntn{n{c{  ~A  BF  ~G  	H=>>oog&G"aa6K6KTR\]ghs]sMt(uvw(xG:k)'2G--');<KCHix G}}+++xx$/RFMM1I70R*SU[\cceH~~d+NZ-Ew,N&OPS]]HQ^^#II961>>R(?		98;K;KH;UW_WgWghkWlm		3XsC(?	!--	-Sb\"#,	*Fnng%Uchmox|}~  @J  yK  QTn  UGH ooa&;&;<GAaLD$8W[Q\]^Q^=_cg=g //!*?*?@KKmmA$9$97<K;PQRSTGkl+Gv||VZZ'3RXR_R_acdd	Hs   6(P" "P(c                     t        |       dk  ryt        j                  d| dd t        j                         | dd t        j                  k(  S )z-Check to see if payload has valid Tuya suffixr   Fzbuffer %r = %rN)r   rQ   rR   r   
SUFFIX_BIN)r   s    r>   
has_suffixr_      sA    
7|aIIall;23<1<<''r@   )N)NNF)r0   collectionsr   r-   loggingr   hashlibr   crypto_helperr   
exceptionsr   constr    r	   r   	getLogger__name__rQ   r
   r   r   r?   rJ   r[   r_    r@   r>   <module>rj      s     "     $ # % g! &LM
,m<`],^i{|K
'TE@FeR(o`],^_Ks   A4 4B