Ë
    tPêj‘%  ã            	       ó‚  — U d dl Z d dlZd dlmZmZmZ d dlmZ dZee	d<   dZ
ee	d<   dZee	d	<   d
Zee	d<   d„ Zdefd„Zdedefd„Zdedededz  defd„Zdedededz  defd„Zdededefd„Zdededefd„Zdededefd„Zdedededz  fd„Zd%dededz  fd„Z	 	 d&dededed    d!efd"„Zdedefd#„Zdededefd$„Zy)'é    N)ÚFinalÚLiteralÚcast)Úverbose_proxy_loggerzv2:gcm:Ú_V2_GCM_PREFIXÚencryption_algorithmÚ_ENCRYPTION_ALGORITHM_SETTINGzaes-256-gcmÚ_ALGO_AES_GCMzxsalsa20-poly1305Ú_ALGO_XSALSA20c                  óF   — ddl m}  t        j                  dd «      }|€| }|S )Nr   )Ú
master_keyÚLITELLM_SALT_KEY)Úlitellm.proxy.proxy_serverr   ÚosÚgetenv)r   Úsalt_keys     úu/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/common_utils/encrypt_decrypt_utils.pyÚ_get_salt_keyr      s&   € Ý5ä�y‰yÐ+¨TÓ2€HàÐØˆà€Oó    Úreturnc                  óÔ   — 	 ddl m}  | j                  t        t        «      }t        |t        «      r|j                  «       t        k(  rt        S t        S # t
        $ r	 t        cY S w xY w)a+  
    Resolve the configured at-rest encryption algorithm for *new writes*.

    Read from ``general_settings.encryption_algorithm`` at write time. Defaults to
    the legacy XSalsa20-Poly1305 algorithm so deployments that have not opted in
    keep producing byte-for-byte identical ciphertext.
    r   )Úgeneral_settings)
r   r   Úgetr	   r   Ú	ExceptionÚ
isinstanceÚstrÚlowerr
   )r   Úalgos     r   Ú_get_encryption_algorithmr   "   s[   € ðÝ?à&×*Ñ*Ô+HÌ.ÓYˆô �$œÔ §¡£´Ò!>ÜÐÜÐøô ò ô Òðús   ‚ A ÁA'Á&A'Úsigning_keyc                 ód   — ddl }|j                  | j                  «       «      j                  «       S )ax  Derive a 32-byte key from the salt/master key (shared by both algorithms).

    Known limitation: this is a single-pass, unsalted ``SHA-256`` of the key, not
    a dedicated KDF (HKDF/PBKDF2). It is the *same* derivation the legacy nacl
    path already uses, so the AES path introduces no new weakness and stays
    interoperable with existing key sourcing; AES-256-GCM's per-value 12-byte
    random nonce gives the unique (key, nonce) pairs GCM requires. Moving both
    algorithms to HKDF-SHA256 would be more defensible in an audit but is a
    separate, coordinated change (it must re-derive or re-encrypt existing data).
    r   N)ÚhashlibÚsha256ÚencodeÚdigest)r    r"   s     r   Ú_derive_keyr&   8   s(   € ó à�>‰>˜+×,Ñ,Ó.Ó/×6Ñ6Ó8Ð8r   ÚvalueÚaadc                 ó    — ddl m} t        j                  d«      }| |t	        |«      «      j                  || j                  d«      |«      z   S ©Nr   )ÚAESGCMé   úutf-8)Ú+cryptography.hazmat.primitives.ciphers.aeadr+   r   Úurandomr&   Úencryptr$   )r'   r    r(   r+   Únonces        r   Ú_seal_aes_gcmr2   H   sA   € ÝBä—:‘:˜b“>€Eà‘6œ+ kÓ2Ó3×;Ñ;¸EÀ5Ç<Á<ÐPWÓCXÐZ]Ó^Ñ^Ð^r   Úsealedc                 ó|   — ddl m}  |t        |«      «      j                  | d d | dd  |«      j	                  d«      S r*   )r.   r+   r&   ÚdecryptÚdecode)r3   r    r(   r+   s       r   Ú_open_aes_gcmr7   P   s>   € ÝBñ
 ”+˜kÓ*Ó+×3Ñ3°F¸3¸B°KÀÈÈÀÈcÓR×YÑYÐZaÓbÐbr   c                 ót   — t        | |d¬«      }t        t        j                  |«      j	                  d«      z   S )zFEncrypt under AES-256-GCM and return the versioned ``v2:gcm:`` string.N©r'   r    r(   r-   )r2   r   Úbase64Úurlsafe_b64encoder6   ©r'   r    r3   s      r   Ú_encrypt_aes_gcmr=   Y   s1   € ä!¨¸;ÈDÔQ€FÜœF×4Ñ4°VÓ<×CÑCÀGÓLÑLÐLr   c                 óh   — t        j                  | t        t        «      d «      }t	        ||d¬«      S )zLDecrypt a versioned ``v2:gcm:`` string produced by :func:`_encrypt_aes_gcm`.N©r3   r    r(   )r:   Úurlsafe_b64decodeÚlenr   r7   r<   s      r   Ú_decrypt_aes_gcmrB   _   s.   € ä×,Ñ,¨U´3´~Ó3FÐ3HÐ-IÓJ€FÜ °KÀTÔJÐJr   Úprefixc                 óò   — t        «       }t        |t        «      st        d«      ‚t	        | ||j                  d«      ¬«      }|t        j                  |«      j                  d«      j                  d«      z   S )zhAES-256-GCM as unpadded base64url behind ``prefix``, which is also the AAD so a token can't change kind.z:Set LITELLM_SALT_KEY or a master key to mint bearer tokensr-   r9   Úasciiú=)
r   r   r   Ú
ValueErrorr2   r$   r:   r;   r6   Úrstrip)r'   rC   r   r3   s       r   Úencrypt_bearer_tokenrI   e   sc   € ä#“o€HÜ�h¤Ô$ÜÐUÓVÐVÜ!¨¸8ÈÏÉÐW^ÓI_Ô`€FØ”F×,Ñ,¨VÓ4×;Ñ;¸GÓD×KÑKÈCÓPÑPÐPr   Útokenc                 ó,  — t        «       }t        |t        «      r| j                  |«      sy| j	                  |«      }	 t        j                  |dt        |«       dz  z  z   dd¬«      }t        |||j                  d«      ¬«      S # t        $ r Y yw xY w)	zVNone unless ``token`` came from :func:`encrypt_bearer_token` with the same ``prefix``.NrF   é   s   -_T)ÚaltcharsÚvalidater-   r?   )r   r   r   Ú
startswithÚremoveprefixr:   Ú	b64decoderA   r7   r$   r   )rJ   rC   r   Úencodedr3   s        r   Údecrypt_bearer_tokenrS   n   sŽ   € ä#“o€HÜ�h¤Ô$¨E×,<Ñ,<¸VÔ,DØØ×'Ñ'¨Ó/€GðÜ×(Ñ(¨°3¼3¸w»<¸-È!Ñ:KÑ3LÑ)LÐW\ÐgkÔlˆÜ F¸ÀfÇmÁmÐT[ÓF\Ô]Ð]øÜò Ùðús   ¿AB Â	BÂBÚnew_encryption_keyc                 óh  — |xs
 t        «       }	 t        | t        «      r_t        «       t        k(  rt        | t        t        |«      ¬«      S t        | |¬«      }t        j                  |«      j                  d«      }|S t        j                  dt        | «      | «       | S # t        $ r}|‚d }~ww xY w)N©r'   r    r-   zTInvalid value type passed to encrypt_value: %s for Value: %s
 Value must be a string)r   r   r   r   r
   r=   r   Úencrypt_valuer:   r;   r6   r   ÚdebugÚtyper   )r'   rT   r    Úencrypted_valueÚes        r   Úencrypt_value_helperr\   {   s¤   € Ø+Ò>¬}«€KðÜ�eœSÔ!Ü(Ó*¬mÒ;ô (¨eÄÄcÈ;ÓAWÔXÐXä+°%À[ÔQˆOä$×6Ñ6°ÓG×NÑNÈwÓWˆOà"Ð"ä×"Ñ"ØcÔeiÐjoÓepÐrwô	
ð ˆøÜò Øˆûðús#   �;B! Á2B! Á?!B! Â!	B1Â*B,Â,B1ÚkeyÚexception_type)rX   ÚerrorÚreturn_original_valuec                 ó  — t        «       }	 t        | t        «      rU| j                  t        «      rt        | t        t        |«      ¬«      S 	 t        j                  | «      }t        ||¬«      } | S | S # t        $ r t        j                  | «      }Y Œ1w xY w# t        $ rl}d|› d|› d�}|dk(  r t        j                  |«       |r| nd cY d }~S t        j                  d|«       |r| cY d }~S t        j                  |«       Y d }~y d }~ww xY w)NrV   z Error decrypting value for key: z8, Did your master_key/salt key change recently? 
Error: zX
Set permanent salt key - https://docs.litellm.ai/docs/proxy/prod#5-set-litellm-salt-keyrX   z3Unable to decrypt value for key: %s, returning None)r   r   r   rO   r   rB   r   r:   r@   r   rQ   Údecrypt_valuer   rX   Ú	exception)r'   r]   r^   r`   r    Údecoded_b64r[   Úerror_messages           r   Údecrypt_value_helperrf   ”   s	  € ô '›€Kð Ü�eœSÔ!ð ×Ñ¤Ô/Ü'¨eÄÄcÈ;ÓAWÔXÐXð6Ü$×6Ñ6°uÓ=�ô
 "¨ÀÔMˆEØˆLð ˆøô ò 6ä$×.Ñ.¨uÓ5’ð6ûô ò Ø:¸3¸%Ð?xÐyzÐx{ð  |Uð  VˆØ˜WÒ$Ü ×&Ñ& }Ô5Ù1‘5°tÕ;ä×"Ñ"Ð#XÐZ]Ô^Ù Ø�Lä ×*Ñ*¨=Ô9äûðúsY   Œ?B ÁA3 Á"B Á1B Á3BÂB ÂBÂB Â	DÂ (DÃDÃDÃ'DÃ-DÄDc                 óö   — dd l }dd l}dd l}|j                  |j	                  «       «      }|j                  «       }|j                  j                  |«      }| j	                  d«      }|j                  |«      }|S )Nr   r-   )	r"   Únacl.secretÚ
nacl.utilsr#   r$   r%   ÚsecretÚ	SecretBoxr0   )	r'   r    r"   ÚnaclÚhash_objectÚ
hash_bytesÚboxÚvalue_bytesÚ	encrypteds	            r   rW   rW   ¿   sl   € ÛãÛð !Ÿ™¨×(:Ñ(:Ó(<Ó=€KØ#×*Ñ*Ó,€Jð —‘×&Ñ& zÓ2€Cð Ÿ™ gÓ.€Kà—{‘{ ;Ó/€IàÐr   c                 ó<  — dd l }dd l}dd l}|j                  |j	                  «       «      }|j                  «       }|j                  j                  |«      }	 t        | «      dk(  ry|j                  | «      }|j                  d«      }|S # t        $ r}|‚d }~ww xY w)Nr   Ú r-   )r"   rh   ri   r#   r$   r%   rj   rk   rA   r5   r6   r   )	r'   r    r"   rl   rm   rn   ro   Ú	plaintextr[   s	            r   rb   rb   Ô   s”   € ÛãÛð !Ÿ™¨×(:Ñ(:Ó(<Ó=€KØ#×*Ñ*Ó,€Jð —‘×&Ñ& zÓ2€CðÜˆu‹:˜Š?Øà—K‘K Ó&ˆ	Ø×$Ñ$ WÓ-ˆ	ØÐøÜò Øˆûðús   ÁB Á'#B Â	BÂBÂB)N)r_   F)r:   r   Útypingr   r   r   Úlitellm._loggingr   r   Ú__annotations__r	   r
   r   r   r   r   Úbytesr&   r2   r7   r=   rB   rI   rS   r\   Úboolrf   rW   rb   © r   r   ú<module>r{      s­  ðÜ Û 	ß 'Ñ 'å 1ð "€�Ó !ð (>Ð ˜uÓ =Ø$€ˆuÓ $Ø+€�Ó +òð 3ó ð,9˜Sð 9 Uó 9ð _˜ð _¨3ð _°U¸T±\ð _Àeó _ðc˜%ð c¨cð c¸À¹ð cÈó cðM˜Cð M¨cð M°có MðK˜Cð K¨cð K°có KðQ ð Q¨Sð Q°Só Qð
 ð 
¨Sð 
°S¸4±Zó 
ñ ð ¸¸t¹ó ð8 18Ø"'ñ	(Øð(à	ð(ð Ð,Ñ-ð(ð  ó	(ðV˜ð ¨3ó ð*˜ð ¨Sð °Sô r   