
    F/j3                        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mZmZ d dlmZmZ d dlmZ  ed	d
      dz
  ZdZdZdZdZddidd	iddidZ G d de      Z	 ddZd Z	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 ddZ y)    N)
InvalidTag)default_backend)hashes)HKDF)Cipher
algorithmsmodes)EncodingPublicFormat)ec                  pad)	aes128gcmaesgcm	aesgcm128c                       e Zd ZdZd Zy)ECEExceptionz&Exception for ECE encryption functionsc                     || _         y )N)message)selfr   s     O/var/www/html/maxservice/venv/lib/python3.12/site-packages/http_ece/__init__.py__init__zECEException.__init__   s	        N)__name__
__module____qualname____doc__r    r   r   r   r      s
    0r   r   c	                    d}	d}
d}d }d }|t         vrt        d      | dvrt        d| z         |t        |      t        k7  rt        d	      ||t        d
       || ||||      \  }}	n|}|t        d      |dk(  r |d|	      }
 |d|	      }n|dk(  rd}
d}n|dk(  rd}
d}|d}|L|dk(  r|	}n	 |dd      }t	        t        j                         d||t                     }|j                  |      }t	        t        j                         t        ||
t                     }t	        t        j                         t        ||t                     }|j                  |      |j                  |      fS )a  Derive the encryption key

    :param mode: operational mode (encrypt or decrypt)
    :type mode: enumerate('encrypt', 'decrypt)
    :param salt: encryption salt value
    :type salt: str
    :param key: raw key
    :type key: str
    :param private_key: DH private key
    :type key: object
    :param dh: Diffie Helman public key value
    :type dh: str
    :param keyid: key identifier label
    :type keyid: str
    :param keylabel: label for aesgcm/aesgcm128
    :type keylabel: str
    :param auth_secret: authorization secret
    :type auth_secret: str
    :param version: Content Type identifier
    :type version: enumerate('aes128gcm', 'aesgcm', 'aesgcm128')

    r    c                     d| z   dz   |z   S )Ns   Content-Encoding:     r#   )baseinfo_contexts     r   
build_infozderive_key.<locals>.build_info?   s    $t+e3lBBr   c                 J   d }t        |t        j                        r1|}|j                  t        j
                  t        j                        }n2t        j                  j                  t        j                         |      }|j                         j                  t        j
                  t        j                        }| dk(  r|}|}	n|}|}	|dk(  r	d|	z   |z   }
n&|j                  d      dz    ||	      z    ||      z   }
|j                  t        j                         |      |
fS )Nc                 F    t        j                  dt        |             | z   S )Nz!H)structpacklen)keys    r   length_prefixz4derive_key.<locals>.derive_dh.<locals>.length_prefixC   s    ;;tSX.44r   encryptr   s   WebPush: info utf-8r'   )
isinstancer   EllipticCurvePublicKeypublic_bytesr
   X962r   UncompressedPointfrom_encoded_point	SECP256R1
public_keyencodeexchangeECDH)modeversionprivate_keydhkeylabelr1   pubkeyencodedsender_pub_keyreceiver_pub_keycontexts              r   	derive_dhzderive_key.<locals>.derive_dhB   s   	5 b"334F0N0NOB..AA",,.RTUF((*77MM<99
 9$N!N&k!*-==NG ( 012  /0  ##BGGIv6??r   Invalid version)r2   decryptzunknown 'mode' specified: Nz'salt' must be a 16 octet valuezDH requires a private_key)r?   r@   rA   rB   rC   zunable to determine the secretr   s   aesgcms   noncer   s   Content-Encoding: aesgcm128s   Content-Encoding: noncer   s   Content-Encoding: aes128gcm s   Content-Encoding: nonce s   auth    )	algorithmlengthsaltinfobackend)
versionsr   r/   
KEY_LENGTHr   r   SHA256r   deriveNONCE_LENGTH)r?   r@   rO   r0   rA   rB   auth_secretkeyidrC   rH   keyinfo	nonceinfor*   rI   secretrP   	hkdf_authhkdf_key
hkdf_nonces                      r   
derive_keyr_   "   s   2 GGIC@@ h,--))7$>??|s4yJ.<==	~:;;%#
 ~;<<(Y0x1		K	0.		K	42	:Kk!Dgs+Dmmo#%
	 !!&)--/!H --/!J ??6"J$5$5f$===r   c                     |dz	  dk7  rt        d      t        j                  d| dd       \  }| dd t        j                  d||z        z   S )z"Generate an initialization vector.@   r   zCounter too bigz!Q   N)r   r-   unpackr.   )r(   countermasks      r   ivrf      sR    2!,--mmD$qr(+GT8fkk$$777r   c
                   	 d }
d }	fd}d }	t         vrt        d      t         	   d   }	dk(  r:	  |
|       }|d	   }|d
   }|d   }||s|}n|j                  d      }|d   } |dz  }t	        d	|||||||	      \  }}||k  rt        d      |}	dk7  r!|dz  }t        |       |z  dk(  rt        d      d}d}	 t        t        dt        |       |            D ]F  } ||||| |||z          }	dk(  r||z   t        |       k\  }| |||      z  }n| ||      z  }|dz  }H 	 |S # t        $ r t        d      w xY w# t        $ r(}t        dj                  t        |                  d}~ww xY w)a  
    Decrypt a data block

    :param content: Data to be decrypted
    :type content: str
    :param salt: Encryption salt
    :type salt: str
    :param key: local public key
    :type key: str
    :param private_key: DH private key
    :type key: object
    :param keyid: Internal key identifier for private key info
    :type keyid: str
    :param dh: Remote Diffie Hellman sequence (omit for aes128gcm)
    :type dh: str
    :param rs: Record size
    :type rs: int
    :param auth_secret: Authorization secret
    :type auth_secret: str
    :param version: ECE Method version
    :type version: enumerate('aes128gcm', 'aesgcm', 'aesgcm128')
    :return: Decrypted message content
    :rtype str

    c                     t        j                  d| dd       d   }| dd t        j                  d| dd       d   | dd|z    | d|z   d dS )	zParse an aes128gcm content body and extract the header values.

        :param content: The encrypted body of the message
        :type content: str

        !B      r   Nr   !L)rO   rsrX   content)r-   rc   )rn   id_lens     r   parse_content_headerz%decrypt.<locals>.parse_content_header   sg     tWR^4Q7CRL--gbn5a8R"v+.rF{}-	
 	
r   c           	         t        t        j                  |       t        j                  t        ||      |t         d        t                     j                         }|j                  |d t                |j                         z   S )N)tagrQ   )r   r   AESr	   GCMrf   
TAG_LENGTHr   	decryptorupdatefinalize)r0   noncerd   rn   rw   s        r   decrypt_recordzdecrypt.<locals>.decrypt_record   sr    NN3IIb(gzkl.CD#%
 )+	 	
 * 569K9K9MMMr   c           	          t            d   }t        j                  d t        j                  dd|z  z   | d|             }||z   t        |       kD  s| |||z    d|z  k7  rt        d      | ||z   d  S )Nr   c                     | dz  |z  S )N   r#   )xys     r   <lambda>z/decrypt.<locals>.unpad_legacy.<locals>.<lambda>   s    a! r   !Br   r'   zBad padding)rR   	functoolsreducer-   rc   r/   r   )datapad_sizer   r@   s      r   unpad_legacyzdecrypt.<locals>.unpad_legacy   s    G$U+#MM#x0$q2BC
 c>CI%hC)HcM*
 }--HsN$%%r   c                    t        |       dz
  }t        t        |       dz
  dd      D ]Q  }t        j                  d| ||dz          d   }|dk7  s(|s|dk7  rt	        d      |r|dk7  rt	        d      | d| c S  t	        d      )	Nr   r   r   zrecord delimiter != 1r   zlast record delimiter != 2zall zero record plaintext)r/   ranger-   rc   r   )r   lastivs       r   unpadzdecrypt.<locals>.unpad   s    IMs4y1}b"- 	!Ac4AE?3A6AAvQ&'>??AF&'CDDAay 	! 677r   rJ   r   r   z"Could not parse the content headerrO   rm   rX   Nr3   rn   r   rK   r@   rO   r0   rA   rB   rW   rX   rC   Record size too smallr   zMessage truncatedr   r   zDecryption error: {})rR   r   	Exceptiondecoder_   r/   listr   r   formatrepr)rn   rO   r0   rA   rB   rW   rX   rC   rm   r@   rp   r{   r   r   overheadcontent_headerkey_nonce_chunkresultrd   r   r   r   exs            `               r   rK   rK      s   L
N
&
8 h,-- 'H+	E1':N f%D!w'"2BLL)E +B
NT6 
X~233E+w<%1$233FG
DeAs7|U34 	A!$QY9OPD+%E	c'l2%d++,t,,qLG	 MY  	ECDD	ET  D188bBCCDs$   D- A(E -E	E6#E11E6c
                 p  	 	fd}
d }	t         vrt        d      |t        j                  d      }t	        d	|||||||	      \  }}t         	   d   }	dk(  r|dz  }t        |       }nt        |       d	z   }||k  rt        d
      ||z
  }d}d}t        t        d||            D ]"  }| |
|||| |||z    ||z   |k\        z  }|d	z  }$ 	dk(  rb|?|=|j                         j                  t        j                  t        j                        }n|xs dj                  d      } |||||      S |S )a  
    Encrypt a data block

    :param content: block of data to encrypt
    :type content: str
    :param salt: Encryption salt
    :type salt: str
    :param key: Encryption key data
    :type key: str
    :param private_key: DH private key
    :type key: object
    :param keyid: Internal key identifier for private key info
    :type keyid: str
    :param dh: Remote Diffie Hellman sequence
    :type dh: str
    :param rs: Record size
    :type rs: int
    :param auth_secret: Authorization secret
    :type auth_secret: str
    :param version: ECE Method version
    :type version: enumerate('aes128gcm', 'aesgcm', 'aesgcm128')
    :return: Encrypted message content
    :rtype str

    c           	      r   t        t        j                  |       t        j                  t        ||            t                     j                         }dk(  r|j                  ||rdndz         }n!|j                  dt           d   z  |z         }||j                         z  }||j                  z  }|S )Nrs   r         r'   r   )r   r   rt   r	   ru   rf   r   	encryptorrx   rR   ry   rr   )r0   rz   rd   bufr   r   r   r@   s          r   encrypt_recordzencrypt.<locals>.encrypt_record]  s    NN3IIb()#%
 )+	 	 k!##Cd7$HID##Wx/@/G%G3$NOD	""$$	r   c                     t        |      dkD  rt        d      | }|t        kD  rt        d      |t        j                  d|      z  }|t        j                  dt        |            z  }||z  }||z   S )a  Compose the header and content of an aes128gcm encrypted
        message body

        :param salt: The sender's salt value
        :type salt: str
        :param content: The encrypted body of the message
        :type content: str
        :param rs: Override for the content length
        :type rs: int
        :param keyid: The keyid to use for this message
        :type keyid: str

           zkeyid is too longzToo much contentrl   ri   )r/   r   MAX_RECORD_SIZEr-   r.   )rO   rn   rm   rX   headers        r   compose_aes128gcmz"encrypt.<locals>.compose_aes128gcml  sw     u:233122&++dB''&++dCJ//%r   rJ   r   r2   r   r   r   r   r   r   r   r%   r3   )rX   )rR   r   osurandomr_   r/   r   r   r;   r6   r
   r7   r   r8   r<   )rn   rO   r0   rA   rB   rW   rX   rC   rm   r@   r   r   r   r   r   end
chunk_sizer   rd   r   kids            `           r   r2   r2   7  s   L 0 h,--|zz"~
NT6  'H+B'l'lQ	X~233hJFG %3
+, .&'71q:~#>ZTW@W
 	
 	1	
 +=[4((*77|==C ;B&&w/C vr==Mr   )P-256)	NNNNNNr   i   r   )!r   r   r-   cryptography.exceptionsr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   'cryptography.hazmat.primitives.kdf.hkdfr   &cryptography.hazmat.primitives.ciphersr   r   r	   ,cryptography.hazmat.primitives.serializationr
   r   )cryptography.hazmat.primitives.asymmetricr   powr   MIN_RECORD_SIZErS   rV   rv   rR   r   r   r_   rf   rK   r2   r#   r   r   <module>r      s     	  . 8 1 8 L L O 8a*q.

 aj9  MT>D8 

HZ 

{r   