
    j"                     :   d dl mZ d dlZd dlZd dlZdD ]z  ZdxZxZxZZ		 edk(  r&d dl
mZ edd dv sedk(  r$d d	lmZ d d
lmZ d dlmZ nAedk(  rd dlZd dlmZ n1edk(  r!d dlZd dlmZ ej(                  d    dk  rdndZnedk(  rd dlZnxeZ	 n e	 ed       ej0                  e      Z G d de      Z G d de      Z G d de      Z G d de      Ze	dd dk(  r G d de      Z ye	dk(  r G d de      Z ye	dk(  r G d de      Z yy# e$ r Y w xY w)    )print_functionN)pyca/cryptographyPyCryptodomexPyCryptopyaesr   )__version__   )z0.z1.z2.z3.0)Cipher)modes)AESr   r      PyCryptodomer   zRNo crypto library found, please "pip install" cryptography, pycryptodome, or pyaesc                   T    e Zd Zd Zed        Zed        Zed        Zedd       Z	y)_AESCipher_Basec                     || _         y N)key)selfr   s     H/DATA/.local/lib/python3.12/site-packages/tinytuya/core/crypto_helper.py__init__z_AESCipher_Base.__init__.   s	        c                     | j                   st        d      |du rYt        j                  t        j
                        rd}|S t        t        j                         dz        d d j                  d      }|S )N#Crypto library does not support GCMTs   0123456789ab
      utf8)	CRYPTOLIB_HAS_GCMNotImplementedErrorlogisEnabledForloggingDEBUGstrtimeencode)clsivs     r   get_encryption_ivz!_AESCipher_Base.get_encryption_iv1   sj    $$%'LNN:0$ 	 r)*3B/66v>	r   c                 T    | j                   st        d      |du r
|d d }|dd  }||fS )Nr   Tr   )r   r   )r&   r'   datas      r   get_decryption_ivz!_AESCipher_Base.get_decryption_iv<   s=    $$%'LNN:crB9D4xr   c                 b    |t        |       |z  z
  }| |t        |      j                         z  z   S r   )lenchrr%   )sbspadnums      r   _padz_AESCipher_Base._padE   s1    c!frk!6CK..0000r   c                     t        | dd        }|dk  s|dkD  rt        d      |r.| | d  |t        |      j                         z  k7  rt        d      | d |  S )N      zinvalid padding length bytezinvalid padding data)ord
ValueErrorr.   r%   )r/   verify_paddingpadlens      r   _unpadz_AESCipher_Base._unpadJ   sh    QrsVA:":;;akfs6{7I7I7K.KL3446'{r   N)F)
__name__
__module____qualname__r   classmethodr(   r+   staticmethodr2   r;    r   r   r   r   -   sW         1 1  r   r   c                       e Zd ZddZddZy)_AESCipher_pycaNc                 T   |r| j                  |      }t        t        | j                        t	        j
                  |            j                         }|r|j                  |       |j                  |      |j                         z   }||z   |j                  z   }nu|r| j                  |d      }t        t        | j                        t	        j                               j                         }|j                  |      |j                         z   }|rt        j                  |      S |S )Nr6   )r(   Cryptor   r   Crypto_modesGCM	encryptorauthenticate_additional_dataupdatefinalizetagr2   ECBbase64	b64encode)r   raw
use_base64padr'   headerrH   crypted_texts           r   encryptz_AESCipher_pyca.encryptT   s    ''-BDHH|/?/?/CEOOQI66v>$++C093E3E3GGL,y}}<L$))C,CDHH|/?/?/ACMMOI$++C093E3E3GGL1;v-MMr   c                 @   |s?|rt        j                  |      }t        |      dz  dk7  rt        dt        |      z        |r| j	                  ||      \  }}|Dt        t        | j                        t        j                  |dz               j                         }nAt        t        | j                        t        j                  ||            j                         }|r||j                  |       |j                  |      |j                         z   }	nst        t        | j                        t        j                               j                         }|j                  |      |j                         z   }	| j!                  |	|      }	|r|	j#                  d      S |	S )Nr6   r   invalid length: %ds      utf-8)rN   	b64decoder-   r8   r+   rE   r   r   rF   CTR	decryptorrG   rI   rJ   rK   rM   r;   decode)
r   encrQ   decode_textr9   r'   rS   rL   r[   rP   s
             r   decryptz_AESCipher_pyca.decryptc   sP   &&s+3x"}! !5C!@AA,,b#7GB{"CM<3C3CBI\D\3]_iik	"CM<3C3CB3LNXXZ	3?66@""C)I,>,>,@@CDHH|/?/?/ACMMOI""C)I,>,>,@@C++c>2C&1szz'":s:r   TTFNTTFFNNr<   r=   r>   rU   r_   rA   r   r   rC   rC   S       N;r   rC   c                       e Zd ZddZddZy)_AESCipher_PyCryptoNc                    |r{| j                  |      }t        j                  | j                  t        j                  |      }|r|j                  |       |j                  |      \  }}|j                  |z   |z   }nT|r| j                  |d      }t        j                  | j                  t        j                        }|j                  |      }|rt        j                  |      S |S )N)modenoncer6   )rg   )r(   r   newr   MODE_GCMrJ   encrypt_and_digestrh   r2   MODE_ECBrU   rN   rO   )	r   rP   rQ   rR   r'   rS   cipherrT   rL   s	            r   rU   z_AESCipher_PyCrypto.encrypty   s    ''-BWWTXXCLLCFf% & 9 9# >L#!<<,6<L$))C,CWWTXXCLL9F!>>#.L1;v-MMr   c                 R   |s?|rt        j                  |      }t        |      dz  dk7  rt        dt        |      z        |r| j	                  ||      \  }}t        j                  | j                  t
        j                  |      }|r|j                  |       |r|j                  ||      }	nc|j                  |      }	nQt        j                  | j                  t
        j                        }|j                  |      }	| j                  |	|      }	|r|	j                  d      S |	S )Nr6   r   rW   )rh   rX   )rN   rY   r-   r8   r+   r   ri   r   rj   rJ   decrypt_and_verifyr_   rl   r;   r\   
r   r]   rQ   r^   r9   r'   rS   rL   rm   rP   s
             r   r_   z_AESCipher_PyCrypto.decrypt   s    &&s+3x"}! !5C!@AA,,b#7GBWWTXXs||2>Ff%//S9nnS)WWTXXs||4F..%C++c>2C&1szz'":s:r   r`   ra   rb   rA   r   r   re   re   x   rc   r   re   c                       e Zd ZddZddZy)_AESCipher_pyaesNc                 P   |rt        d      t        j                  j                  t        j                  | j
                        |rt        j                  nt        j                        }|j                  |      }||j                         z  }|rt        j                  |      S |S )N7pyaes does not support GCM, please install PyCryptodome)r   r   blockfeeder	EncrypterAESModeOfOperationECBr   PADDING_DEFAULTPADDING_NONEfeedrN   rO   )r   rP   rQ   rR   r'   rS   rm   rT   s           r   rU   z_AESCipher_pyaes.encrypt   s    %'`bb "",,''1%(E!!e.@.@
 {{3'%1;v-MMr   c                    |rt        d      |rt        j                  |      }t        |      dz  dk7  rt	        dt        |      z        t
        j                  j                  t        j                  | j                        |rt
        j                  nt
        j                        }|j                  |      }	|	|j                         z  }	|r| j                  |	|      }	|r|	j                  d      S |	S )Nrt   r6   r   rW   rX   )r   rN   rY   r-   r8   r   ru   	Decrypterrw   r   ry   rx   rz   r;   r\   rp   s
             r   r_   z_AESCipher_pyaes.decrypt   s    %'`bb""3'Cs8b=A1CH<=="",,''1"0Ee6K6K

 kk#v{{}S.!A3&1szz'":s:r   r`   ra   rb   rA   r   r   rr   rr      s    N;r   rr      c            
           e Zd ZeZdj	                  ej                  D  cg c]  }t        |       c}}}       Z e	e
dd      Zyc c}}} w )	AESCipher.rj   FN)r<   r=   r>   	CRYPTOLIBjoinrE   version_infor#   CRYPTOLIB_VERgetattrr   r   .0xr#   s   000r   r   r      sE    	63F3F"G3Fa3q63F"GI#S*e= #Hs   Ar   c            
           e Zd ZeZdj	                  ej                  D  cg c]  }t        |       c}}}       ZdZ	yc c}}} w )r   r   FN)
r<   r=   r>   r   r   r   VERSIONr#   r   r   r   s   000r   r   r      s8    	5=="A=a3q6="AC! #Bs   A c                   (    e Zd ZeZeZ eedd      Zy)r   rG   FN)	r<   r=   r>   r   Crypto_versionr   r   rF   r   rA   r   r   r   r      s    	&#\5%Ar   )!
__future__r   rN   r!   r$   clibrE   rF   r   r   cryptographyr   r   &cryptography.hazmat.primitives.ciphersr
   r   1cryptography.hazmat.primitives.ciphers.algorithms
CryptodomeCryptodome.CipherCrypto.Cipherr   r   ImportErrorModuleNotFoundError	getLoggerr<   r   objectr   rC   re   rr   r   rA   r   r   <module>r      st   &   GD.22F2\2C)&&Br"&88nPU>UOTM_$ (-Z)!'!4!4Q!7!!;:DW_	5 H: 
r
ssg!$f $L#;o #;J#;/ #;J#; #;J Ra=J>' > '"$ " %%BO B &Q  s   DADDDD