o
    jJ                     @   s  d dl Z d dlZd dlZd dlZd dlmZmZmZmZ d dl	m
Z
 ejeddZdd Zdd	 ZG d
d de jZG dd dZG dd de jZejejejejejejejgZG dd dZG dd dZG dd dZG dd dZ G dd dZ!G dd dZ"G dd dZ#G dd dZ$G d d! d!Z%G d"d# d#Z&G d$d% d%e jZ'G d&d' d'e jZ(G d(d) d)Z)G d*d+ d+Zefd,d-Z*d8d.d/Z+efd0d1Z,efd2d3Z-d4d5 Z.d6d7 Z/dS )9    N)AS_REQAS_REPAP_REQAP_REP)MetaData 5c33530deaf90d4db2ec4ae3786ec308bytes_lec                 C      t t| S N)cl_buffioBytesIOdata r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asyauth/protocols/spnegoex/protocol/messages.pycl_bytes      r   c                 C   sD   |  d}|d dkr|d S |d d }|  |}tj|dddS )N   r         bigF	byteordersigned)readint
from_bytes)buffxbcountyr   r   r   r      s   

r   c                   @   s    e Zd ZdZdZdZdZdZdS )PKU2U_TOKEN_TYPE    s    s    s    s    N)__name__
__module____qualname__
KRB_AP_REQ
KRB_AP_REP	KRB_ERROR
KRB_AS_REQ
KRB_AS_REPr   r   r   r   r#       s    r#   c                   @   s>   e Zd ZdddZedd Zedd Zdd	 Zd
d ZdS )PKU2U_TOKENr$   c                 C   s   || _ d | _td| _d S )N2b0601050207)tok_idinner_tokenbytesfromhex
_pku2u_oid)selfr/   r   r   r   __init__(   s   zPKU2U_TOKEN.__init__c                 C      t t| S r   )r-   from_bufferr   r   r   r   r   r   r   .      zPKU2U_TOKEN.from_bytesc                 C   s   t  }|  }| d t| }| d ||  | d 7 }t| }| |}t| d|_| ||   }|jtjkrGt||_	|S |jtj
krUt||_	|S |jtjkrct||_	|S |jtjkrqt||_	|S ||_	|S )Nr      )r-   tellr   r   r#   r/   r+   r   loadr0   r,   r   r(   r   r)   r   )r   tt_hdrtotal_length
oid_lengtht_oidt_datar   r   r   r7   2   s0   


	zPKU2U_TOKEN.from_bufferc                 C   sP   |dkr|j ddddS | | d d d}dt|B j dddd}|| S )	Nr   r   r   F)r         r   )to_bytes
bit_lengthlen)r4   r    lbr<   r   r   r   length_encodeL   s
   zPKU2U_TOKEN.length_encodec                 C   sZ   d}||  t| j7 }|| j7 }|| jj7 }|| j7 }d}||  t|7 }||7 }|S )N      `)rH   rF   r3   r/   valuer0   )r4   r   r<   r   r   r   rD   T   s   

zPKU2U_TOKEN.to_bytesN)r$   )	r%   r&   r'   r5   staticmethodr   r7   rH   rD   r   r   r   r   r-   '   s    


r-   c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
MESSAGE_TYPEr   r   r9               rB   N)r%   r&   r'   INITIATOR_NEGOACCEPTOR_NEGOINITIATOR_META_DATAACCEPTOR_META_DATA	CHALLENGE
AP_REQUESTVERIFYALERTr   r   r   r   rM   a   s    rM   c                   @      e Zd ZdZdd ZdS )BYTE_VECTORz
		BYTE_VECTOR encapsulates a variable length array of octets (or bytes)
		that are stored consecutively.  Each element in is a byte (8 bits).
	c                 C      d | _ d | _d S r   )ByteArrayOffsetByteArrayLengthr4   r   r   r   r5   s      
zBYTE_VECTOR.__init__Nr%   r&   r'   __doc__r5   r   r   r   r   r[   n   s    r[   c                   @   rZ   )AUTH_SCHEME_VECTORz
		AUTH_SCHEME_VECTOR encapsulates a variable length array of
		AUTH_SCHEMEs that are stored consecutively.  Each element is a
		structure of the type AUTH_SCHEME.
	c                 C   r\   r   )AuthSchemeArrayOffsetAuthSchemeCountr_   r   r   r   r5   }   r`   zAUTH_SCHEME_VECTOR.__init__Nra   r   r   r   r   rc   w   s    rc   c                   @   rZ   )EXTENSION_VECTORz
		EXTENSION_VECTOR encapsulates a variable length array of EXTENSIONs
		that are stored consecutively.  Each element is a structure of the
		type EXTENSION.

	c                 C   r\   r   )ExtensionArrayOffsetExtensionCountr_   r   r   r   r5      r`   zEXTENSION_VECTOR.__init__Nra   r   r   r   r   rf      s    rf   c                   @   s0   e Zd ZdZdd Zedd Zedd ZdS )		EXTENSIONzT
	This part is not tested, as the RFC doesn't define any extensions at the moment!
	c                 C      d | _ d | _d | _d | _d S r   )ExtensionTyperg   ExtensionArrayLengthExtensionValuer_   r   r   r   r5         
zEXTENSION.__init__c                 C   r6   r   )ri   r7   r   r   r   r   r   r   r      r8   zEXTENSION.from_bytesc                 C   sl   t  }tj| dddd|_tj| dddd|_tj| dddd|_| |j | |j|_|S NrO   littleFr   )	ri   r   r   r   rk   rg   rl   seekrm   r   msgr   r   r   r7      s   zEXTENSION.from_bufferN)r%   r&   r'   rb   r5   rL   r   r7   r   r   r   r   ri      s    
ri   c                   @   ,   e Zd Zdd Zedd Zedd ZdS )CHECKSUMc                 C   s(   d| _ d | _d | _d | _d | _d | _d S )N   )cbHeaderLengthChecksumSchemeChecksumTypeChecksumArrayOffsetChecksumArrayLengthChecksumValuer_   r   r   r   r5         
zCHECKSUM.__init__c                 C   r6   r   )ru   r7   r   r   r   r   r   r   r      r8   zCHECKSUM.from_bytesc                 C   s   |   }t }tj| dddd|_tj| dddd|_tj| dddd|_tj| dddd|_tj| dddd|_	|j	dkrU| 
|j | |j	|_|S NrO   rp   Fr   r   )r:   ru   r   r   r   rw   rx   ry   rz   r{   rq   r|   r   start_offsetrs   r   r   r   r7      s   
zCHECKSUM.from_bufferNr%   r&   r'   r5   rL   r   r7   r   r   r   r   ru      s    	
ru   c                   @   4   e Zd Zdd Zdd Zedd Zedd Zd	S )
MESSAGE_HEADERc                 C   s.   d| _ d | _d | _d | _d | _d | _d| _d S )Ns   NEGOEXTS(   )	SignatureMessageTypeSequenceNumrw   cbMessageLengthConversationId_hdrsizer_   r   r   r   r5         
zMESSAGE_HEADER.__init__c                 C   sn   | j }|| jjjdddd7 }|| jjdddd7 }|| jjdddd7 }|| jjdddd7 }|| j7 }|S ro   )r   r   rK   rD   r   rw   r   r   )r4   r<   r   r   r   rD      s   
zMESSAGE_HEADER.to_bytesc                 C   r6   r   )r   r7   r   r   r   r   r   r   r      r8   zMESSAGE_HEADER.from_bytesc                 C   s   t  }| d|_ttj| dddd|_tj| dddd|_tj| dddd|_tj| dddd|_	| d|_
|S )NrC   rO   rp   Fr      )r   r   r   rM   r   r   r   r   rw   r   r   rr   r   r   r   r7      s   zMESSAGE_HEADER.from_bufferNr%   r&   r'   r5   rD   rL   r   r7   r   r   r   r   r      s    		
r   c                   @   r   )
NEGO_MESSAGEc                 C   sH   d | _ td| _d| _d| _d| _d| _d| _d| _	g | _
tg| _d S )N    r   `   )HeaderosurandomRandomProtocolVersionrd   re   rg   rh   msgsize
ExtensionsNEGOEXTS_DEFAULT_AUTHIDAuthSchemesr_   r   r   r   r5      s   zNEGO_MESSAGE.__init__c                 C   sR  | j | j_| j | _t }| jD ]}||j |  j	d7  _	q|
d | }t }t| jdkrN| j t| | _| jD ]}|| |  jd7  _q?|
d || 7 }| j t| | j_| j }|| j7 }|| jjdddd7 }|| jjdddd7 }|| j	jdddd7 }|| jjdddd7 }|| jjdddd7 }||7 }|S )Nr   r   rC   rp   Fr   rO   )r   r   rw   rd   r   r   r   writer	   re   rq   r   rF   r   rg   	to_bufferrh   r   rD   r   r   )r4   r   authpayloadextresr   r   r   rD      s4   







zNEGO_MESSAGE.to_bytesc                 C   r6   r   )r   r7   r   r   r   r   r   r   r     r8   zNEGO_MESSAGE.from_bytesc                 C   s   |   }t }t| |_| d|_tj| dddd|_	tj| dddd|_
tj| dddd|_tj| dddd|_tj| dddd|_g |_|jdkrv| ||j
  t|jD ]}| d}|jtj|d	 qd|jdkr| ||j  t| }|j| |S )
Nr   rC   rp   Fr   rO   r   r   r   )r:   r   r   r7   r   r   r   r   r   r   rd   re   rg   rh   r   rq   rangeappenduuidUUIDri   r   )r   r   rs   i	auth_dataext_datar   r   r   r7     s(   



zNEGO_MESSAGE.from_bufferNr   r   r   r   r   r      s    !
r   c                   @   r   )
EXCHANGE_MESSAGEc                 C   s.   d | _ d | _d | _d | _d | _d| _d | _d S )N@   )r   
AuthSchemeExchangeOffsetExchangeByteCountExchanger   exchange_data_rawr_   r   r   r   r5   :  r   zEXCHANGE_MESSAGE.__init__c                 C   s~   t | j| _| j| _| j| j | j_| j| j_| j }|| j	j
7 }|| jjdddd7 }|| jjdddd7 }|| j7 }|S ro   )rF   r   r   r   r   r   r   rw   rD   r   r	   r4   r   r   r   r   rD   C  s   


zEXCHANGE_MESSAGE.to_bytesc                 C   r6   r   )r   r7   r   r   r   r   r   r   r   R  r8   zEXCHANGE_MESSAGE.from_bytesc                 C   s   |   }t }t| |_tj| dd|_t	j
| dddd|_t	j
| dddd|_| ||j  | |j}||_|jjtjtjfv rTt
|}||_|S |jjtjtjfv rht|}||_|S ||_|S )Nr   r   rO   rp   Fr   )r:   r   r   r7   r   r   r   r   r   r   r   r   r   rq   r   r   rM   rW   rV   r-   r   rT   rU   r   r;   )r   r   rs   	exch_datatokenr   r   r   r7   V  s&   
	
zEXCHANGE_MESSAGE.from_bufferNr   r   r   r   r   r   9  s    	
r   c                   @   r   )
VERIFY_MESSAGEc                 C   s:   d | _ d | _d| _d| _d | _d | _d | _d | _d| _d S )Nrv   r   P   )	r   r   rw   rx   ry   rz   r{   Checksumr   r_   r   r   r   r5   q  s   
zVERIFY_MESSAGE.__init__c                 C   s   t | j| _| j| _| jt | j | j_| j| j_| j }|| j	j
7 }|| jjdddd7 }|| jjdddd7 }|| jjdddd7 }|| jjdddd7 }|| jjdddd7 }|d7 }|| j7 }|S )NrO   rp   Fr   s       )rF   r   r{   r   rz   r   r   rw   rD   r   r	   rx   ry   r   r   r   r   rD   }  s   


zVERIFY_MESSAGE.to_bytesc                 C   r6   r   )r   r7   r   r   r   r   r   r   r     r8   zVERIFY_MESSAGE.from_bytesc                 C   s   |   }t }t| |_tj| dd|_t	j
| dddd|_t	j
| dddd|_t	j
| dddd|_t	j
| dddd|_t	j
| dddd|_|jdkre| |j | |j|_|S Nr   r   rO   rp   Fr   r   )r:   r   r   r7   r   r   r   r   r   r   r   rw   rx   ry   rz   r{   rq   r   r   r   r   r   r7     s   
zVERIFY_MESSAGE.from_bufferNr   r   r   r   r   r   p  s    
r   c                   @   rt   )ALERT_MESSAGEc                 C   s(   d | _ d | _d | _d | _d | _g | _d S r   )r   r   	ErrorCodeAlertArrayOffset
AlertCountAlertsr_   r   r   r   r5     r}   zALERT_MESSAGE.__init__c                 C   r6   r   )r   r7   r   r   r   r   r   r   r     r8   zALERT_MESSAGE.from_bytesc                 C   s   |   }t }t| |_tj| dd|_t	j
| dddd|_t	j
| dddd|_t	j
| dddd|_|jdkrY| ||j  t|jD ]}|jt|  qM|S r   )r:   r   r   r7   r   r   r   r   r   r   r   r   r   r   rq   r   r   r   Alert)r   r   rs   _r   r   r   r7     s   
zALERT_MESSAGE.from_bufferNr   r   r   r   r   r     s    	
r   c                   @      e Zd ZdZdS )
ALERT_TYPEr   N)r%   r&   r'   PULSEr   r   r   r   r         r   c                   @   r   )ALERT_VERIFYr   N)r%   r&   r'   NO_KEYr   r   r   r   r     r   r   c                   @   s   e Zd Zdd ZdS )ALERT_PULSEc                 C   r\   r   )rw   Reasonr_   r   r   r   r5     r`   zALERT_PULSE.__init__N)r%   r&   r'   r5   r   r   r   r   r     s    r   c                   @   rt   )rY   c                 C   rj   r   )	AlertTypeAlertDataOffsetAlertDataLength
AlertValuer_   r   r   r   r5     rn   zALERT.__init__c                 C   r6   r   )rY   r7   r   r   r   r   r   r   r     r8   zALERT.from_bytesc                 C   s   |   }t }ttj| dddd|_tj| dddd|_tj| dddd|_|jdkr?| 	|j | |j|_
|S r~   )r:   rY   r   r   r   r   r   r   r   rq   r   r   r   r   r   r7     s   
zALERT.from_bufferNr   r   r   r   r   rY     s    
rY   c                 C   s:   t  }tj|_| |_||_t }||_||_||_	|
 S r   )r   rM   rT   r   r   r   r   r   r   r   rD   )
seq_numberconv_idmetadata
authschemehdremr   r   r   generate_initiator_metadata  s   r   c                 C   sJ   t  }tj|_| |_||_t }||_|d ur||_|d ur!||_	|
 S r   )r   rM   rR   r   r   r   r   r   r   r   rD   )r   r   authschemes
extensionsr   negor   r   r   generate_init_nego  s   r   c                 C   sX   t  }tj|_| |_||_t }||_||_t	 }||_
||_| |_| | fS r   )r   rM   rW   r   r   r   r   r   r   r-   r/   r0   rD   r   )r   r   ap_reqtok_typer   r   exchanger   r   r   r   generate_ap_req  s   
r   c                 C   s@   t  }tj|_| |_||_t }||_||_||_	||_
| S r   )r   rM   rX   r   r   r   r   r   r   r   ry   rD   )r   r   checksumchecksumtyper   r   verifyr   r   r   generate_verify  s   r   c                 C   r
   r   )negoexts_parse_bufferr   r   r   r   r   r   negoexts_parse_bytes&  r   r   c                 C   s  i }|   }| dd |   }| | d}|   |kr|dkr|d8 }|   }t| }| | | |j}|jtjtj	fv rHt
|}n*|jtjtjtjtjfv r[t|}n|jtjkrgt|}n|jtjkrrt|}|||j< |   |kr|dks!|dkrtd |S )Nr   r9      r   SAD)r:   rq   r   r7   r   r   r   rM   rR   rS   r   r   rV   rT   rU   rW   r   rX   r   rY   r   print)r   resdstartendmaxiterr   r   r   r   r   r   r   )  s2   




r   )NN)0enumr   r   r   "minikerberos.protocol.asn1_structsr   r   r   r   minikerberos.protocol.rfc4556r   r   r1   r2   r   r   r   Enumr#   r-   rM   rR   rV   rT   rU   rW   rX   rY   NEGOEXT_MESSAGE_TYPESr[   rc   rf   ri   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sB    	: 
	
#Q76 
