o
    `j                     @   st   d dl Z d dlZd dlZd dlZd dlZddlmZ d dlmZ e	e
Zdd ZG dd deZG d	d
 d
ZdS )    N   )SaslMechanism)KafkaConfigurationErrorc                 C   s   t dd t| |D S )Nc                 s   s    | ]	\}}||A V  qd S N ).0lbrbr   r   R/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/kafka/net/sasl/scram.py	<genexpr>       zxor_bytes.<locals>.<genexpr>)byteszip)leftrightr   r   r
   	xor_bytes   s   r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )SaslMechanismScramc                 K   s   | dds
td | ddstd | ddtjvr!td | ddd	kr.td
 |d | _|d | _t|d |d |d | _d| _	d S )Nsasl_plain_username z+sasl_plain_username required for SCRAM saslsasl_plain_passwordz+sasl_plain_password required for SCRAM saslsasl_mechanismzUnrecognized SCRAM mechanismsecurity_protocolSASL_PLAINTEXTz>Exchanging credentials in the clear during Sasl Authenticationr   )
getr   ScramClient
MECHANISMSlogwarningusername	mechanism_scram_client_state)selfconfigr   r   r
   __init__   s    



zSaslMechanismScram.__init__c                 C   s6   | j dkr
| j S | j dkr| j S td| j  )Nr   r   zNo auth_bytes for state: %s)r!   r    first_messagefinal_message
ValueErrorr"   r   r   r
   
auth_bytes'   s
   



zSaslMechanismScram.auth_bytesc                 C   sT   | j dkr| j| n| j dkr| j| ntd| j  |  j d7  _ |  S )Nr   r   z!Cannot receive bytes in state: %s)r!   r    process_server_first_messageprocess_server_final_messager'   is_done)r"   r)   r   r   r
   receive/   s   

zSaslMechanismScram.receivec                 C   
   | j dkS N   r!   r(   r   r   r
   r,   9   s   
zSaslMechanismScram.is_donec                 C   r.   r/   r1   r(   r   r   r
   is_authenticated<   s   
z#SaslMechanismScram.is_authenticatedc                 C   s   | j stdd| j| jf S )NzNot authenticated yet!z!Authenticated as %s via SASL / %s)r2   RuntimeErrorr   r   r(   r   r   r
   auth_details@   s   zSaslMechanismScram.auth_detailsN)	__name__
__module____qualname__r$   r)   r-   r,   r2   r4   r   r   r   r
   r      s    
r   c                   @   sR   e Zd ZejejdZdd Zdd Zdd Z	dd	 Z
d
d Zdd Zdd ZdS )r   )zSCRAM-SHA-256zSCRAM-SHA-512c                 C   s   t t ddd| _d| _d | _|d| _|d| _	| j
| | _d| ddd | _d | _d | _d | _d | _d | _d | _d S )N-r   utf-8    r      )struuiduuid4replaceencodenonceauth_messagesalted_passworduserpasswordr   hashfuncjoinlowersplithashname
stored_key
client_keyclient_signatureclient_proof
server_keyserver_signature)r"   rD   rE   r   r   r   r
   r$   L   s   
zScramClient.__init__c                 C   s*   d| j  d | j }|  j|7  _d| S )Ns   n=s   ,r=s   n,,)rD   rA   rB   )r"   client_first_barer   r   r
   r%   [   s   zScramClient.first_messagec              	   C   s2  |  j d| 7  _ tdd |ddD }|d d}|| js)td|| _|  j d| j 7  _ t	|d	 d}zt
|d
 }|dkrOtdW n ttfy]   tdw | || | | jd| _| | j | _| | j| j | _t| j| j| _| | jd| _| | j| j | _d S )N   ,c                 s       | ]	}| d dV  qdS =r   NrI   r   pairr   r   r
   r   b   r   z;ScramClient.process_server_first_message.<locals>.<genexpr>r9   ,rz.Server nonce, did not start with client nonce!s
   ,c=biws,r=sii@B ztoo many iterationszTInvalid value (not integer or too large) for Iteration count in server-first-messages
   Client Keys
   Server Key)rB   dictdecoderI   r@   
startswithrA   r'   base64	b64decodeint	TypeErrorcreate_salted_passwordhmacrC   rL   rF   digestrK   rM   r   rN   rO   rP   )r"   server_first_messageparamsserver_noncesalt
iterationsr   r   r
   r*   `   s.   z(ScramClient.process_server_first_messagec                 C   s   t j||| jd S )N)	digestmod)re   newrF   rf   )r"   keymsgr   r   r
   re   y   s   zScramClient.hmacc                 C   s   t | j| j||| _d S r   )hashlibpbkdf2_hmacrJ   rE   rC   )r"   rj   rk   r   r   r
   rd   |   s   
z"ScramClient.create_salted_passwordc                 C   s   d| j  d t| j S )Ns	   c=biws,r=s   ,p=)rA   r`   	b64encoderN   r(   r   r   r
   r&      s   zScramClient.final_messagec                 C   sD   t dd |ddD }| jt|d dkr tdd S )Nc                 s   rS   rT   rV   rW   r   r   r
   r      r   z;ScramClient.process_server_final_message.<locals>.<genexpr>r9   rY   vzServer sent wrong signature!)r]   r^   rI   rP   r`   ra   r@   r'   )r"   server_final_messagerh   r   r   r
   r+      s   z(ScramClient.process_server_final_messageN)r5   r6   r7   rp   sha256sha512r   r$   r%   r*   re   rd   r&   r+   r   r   r   r
   r   F   s    r   )r`   rp   re   loggingr=   abcr   kafka.errorsr   	getLoggerr5   r   r   r   r   r   r   r   r
   <module>   s    
3