
    iR                     0    S SK r S SKrS SKr " S S5      rg)    Nc            	       6   \ rS rSrSr/ SQr/ SQr/ SQr/ SQr/ SQr	/ SQ/ S	Q/ S
Q/ SQ/ SQ/ SQ/ SQ/ SQ/r
/ SQr/ SQrS\SS4S jrS\S\4S jrS\S\4S jr\S\S\4S j5       r\S\S\4S j5       rS\S\R,                  \R,                  \      4S jrS\R,                  \   S\S\R,                  \   4S jrS\S\R,                  \   4S  jrS!\S\4S" jrS!\S\4S# jrS!\R,                  \   S\R,                  \   S\R,                  \   4S$ jrS%rg)&DES	   ar  Creates a DES cipher.

Creates a DES cipher class with the key initialised. This key must be 8 bytes in length. This only supports the
ECB cipher mode as that is what is used in the LM hash calculation.

Thanks to http://page.math.tu-berlin.de/~kant/teaching/hess/krypto-ws2006/des.htm for helping work through this.

Args:
    key: The 8-byte key to use in the Cipher.
)88   0   (                r   9   1   )   !         r      :   2   *   "         
      ;   3   +   #   >   6   .   &               =   5   -   %               <   4   ,   $                           )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )0r.   r   r      r   r7   r   r8   r&   r/   r5   r   r%   r   r:   r;   r         r'   r   r9   r6   r   r   r   r$   r3   r"   r!   r,   '   r   r2   r	   /   r   r   r#   7   r   r1   r*   r   r   r   r4      )@r   r   r   r   r   r   r   r   r   r   r   r   r8   r9   r:   r;   r(   r)   r*   r+   r,   r-   r.   r/   ?   rA   r@   r?   rB   r<   r>   r=   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r0   r1   r2   r3   r4   r5   r6   r7   r    r!   r"   r#   r$   r%   r&   r'   )0rB   r   r   r   r;   r7   r;   r7   r/   r'   r=   r   r=   r   r   r   r:   r6   r:   r6   r.   r&   r>   r   r>   r   r   r   r9   r5   r9   r5   r-   r%   r<   r
   r<   r
   r   r   r8   r4   r8   r4   r,   r$   rB   r   )@r&   r7   r.   r   r   r>   r:   r   r;   r   r'   r6   r/   r   r   r=   r   r>   r=   r7   r&   r   r.   r   r   r'   r6   r:   r   r/   r;   r   r7   r   r&   r   r.   r'   r   r:   r>   r6   r   r=   r;   r   r/   r   r>   r6   r   r   r7   r   r   r=   r/   r:   r;   r&   r   r   r'   r.   )@r>   r   r   r&   r'   r:   r;   r7   r   r=   r   r.   r6   r   r/   r   r;   r.   r7   r=   r>   r   r   r&   r6   r   r   r   r'   r   r:   r/   r   r&   r=   r:   r   r7   r.   r   r/   r   r6   r'   r   r;   r   r>   r.   r   r   r   r;   r>   r7   r   r:   r'   r=   r6   r   r/   r&   r   )@r   r   r   r&   r'   r;   r>   r/   r   r.   r6   r=   r:   r7   r   r   r.   r=   r   r   r;   r7   r'   r   r   r   r/   r&   r6   r:   r>   r   r.   r'   r7   r   r   r>   r;   r   r:   r   r   r6   r/   r   r&   r=   r   r   r.   r   r'   r   r   r=   r7   r>   r&   r;   r:   r/   r   r6   )@r=   r.   r&   r;   r   r'   r   r   r   r   r   r/   r:   r6   r7   r>   r.   r   r:   r/   r'   r>   r   r;   r7   r=   r   r6   r   r   r&   r   r   r'   r   r   r6   r:   r=   r.   r>   r   r;   r&   r/   r   r   r7   r;   r>   r   r'   r   r   r.   r   r   r7   r/   r:   r6   r=   r   r&   )@r   r6   r7   r   r=   r   r:   r'   r   r/   r;   r>   r.   r   r&   r   r&   r:   r   r6   r7   r=   r.   r   r/   r   r>   r   r;   r   r   r'   r7   r   r   r:   r   r.   r=   r   r>   r   r6   r/   r'   r;   r   r&   r:   r   r6   r=   r   r&   r   r.   r'   r>   r   r   r   r7   r/   r;   )@r6   r   r   r>   r   r   r'   r   r   r.   r;   r7   r&   r=   r/   r:   r   r>   r7   r   r=   r6   r   r/   r'   r   r.   r&   r   r:   r;   r   r   r&   r>   r/   r   r   r6   r;   r=   r   r7   r   r   r.   r:   r'   r7   r;   r   r6   r   r/   r>   r   r:   r&   r   r=   r'   r   r   r.   )@r7   r:   r   r&   r>   r   r   r.   r;   r6   r   r=   r/   r   r'   r   r.   r   r:   r=   r7   r   r   r   r&   r;   r/   r6   r   r>   r   r'   r   r7   r:   r.   r6   r;   r=   r&   r   r>   r'   r   r   r/   r   r   r'   r:   r.   r   r   r7   r   r=   r   r/   r   r>   r&   r   r;   r6   )@r.   r   r   r7   r'   r>   r:   r   r   r   r;   r&   r/   r   r6   r=   r   r>   r.   r   r   r;   r=   r7   r6   r/   r'   r:   r   r&   r   r   r=   r:   r7   r   r   r6   r&   r   r   r'   r   r.   r>   r;   r/   r   r   r   r&   r=   r7   r   r   r.   r>   r6   r   r   r;   r/   r'   r:   ) r>   r'   r9   r5   r4   r:   r8   r   r   r&   r%   r   r7   r   r$   r   r   r=   r<   r.   rB   r   r   r   r   r6   r,   r/   r-   r   r;   r
   )@r?   r=   r@   r>   rA   r<   rC   rB   r#   r'   r"   r&   r!   r%   r    r$   r+   r/   r*   r.   r)   r-   r(   r,   r3   r7   r2   r6   r1   r5   r0   r4   r   r;   r   r:   r   r9   r   r8   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r   r
   keyreturnNc                     [        U5      S:w  a  [        S5      eXl        U R                  U R                  5      U l        g )Nr   z.DES encryption key should be 8 bytes in length)len
ValueErrorrD   _create_subkeys_subkeys)selfrD   s     N/home/james-whalen/.local/lib/python3.13/site-packages/spnego/_ntlm_raw/des.py__init__DES.__init__|  s4    s8q=MNN,,TXX6    datac                     [         R                  " 5       n[        S[        U5      S5       H:  nXUS-    R	                  SS5      nUR                  U R                  U5      5        M<     UR                  5       $ )zEncrypt a byte string.

DES encrypts the data based on the key it was initialised with. The data will be right padded with b" " if
it is not a multiple of 8.

Args:
    data: The byte string to encrypt.

Returns:
    bytes: The encrypted byte string.
r   r       )ioBytesIOrangerG   ljustwrite_encode_blockgetvalue)rK   rP   encrypted_dataiblocks        rL   encryptDES.encrypt  sj     q#d)Q'AQUO))!W5E  !3!3E!:; ( &&((rO   c                    [         R                  " 5       n[        S[        U5      S5       HD  nXUS-    n[        U5      S:w  a  [	        S5      eUR                  U R                  U5      5        MF     UR                  5       $ )zDecrypt a byte string.

DES decrypts the data based on the key it was initialised with.

Args:
    data: The byte string to decrypt

Returns:
    bytes: The decrypted byte string.
r   r   z2DES decryption block must be a multiple of 8 bytes)rS   rT   rU   rG   rH   rW   _decode_blockrY   )rK   rP   decrypted_datar[   r\   s        rL   decryptDES.decrypt  st     q#d)Q'AQUOE5zQ !UVV  !3!3E!:; ( &&((rO   c                 L   [        U 5      S:w  a  [        S[        U 5      -  5      eSn[        SS5       H  nUS:X  a   [        R                  " SXUS-    5      S   nOzUS:X  a&  [        R                  " SU SS 5      S   nUS-  S	-  nON[        R                  " SXS-
  U 5      S   n[        R                  " SXUS-    5      S   nUSU-
  -  S	-  XB-	  -  nUS
-  nU[        [        R                  U5      S-  (       + 5      -  nU[        R                  " SU5      -  nM     U$ )u  Convert 7 byte key to 8 bytes.

This takes in an a bytes string of 7 bytes and converts it to a bytes
string of 8 bytes with the odd parity bit being set to every 8 bits,

For example

b""
00000001 00000010 00000011 00000100 00000101 00000110 00000111

is converted to

b"a@)"
00000001 10000000 10000000 01100001 01000000 00101001 00011001 00001110

https://crypto.stackexchange.com/questions/15799/des-with-actual-7-byte-key

Args:
    key: The 7-byte sized key

Returns:
    bytes: The expanded 8-byte key.
r=   z3DES 7-byte key is not 7 bytes in length, actual: %drO   r   r   Br   r'      )	rG   rH   rU   structunpackintr   	bit_countpack)rD   new_keyr[   	new_value
next_values        rL   key56_to_key64DES.key56_to_key64  s.   2 s8q=RUXY\U]]^^q!AAv"MM#sq1u~>qA	a"MM#s1Qx8;	&!^t3	"MM#sq51~>qA	#]]3A?B
'AE2d:joM	 "I-I "CCMM),Ds,J(J$KKIv{{3	22G! $ rO   r[   c                 B    SnU (       a  X S-
  -  n US-  nU (       a  M  U$ )Nr   r    )r[   counts     rL   rk   DES.bit_count  s.     QJAQJE a rO   c                    U R                  U5      nU R                   Vs/ s H  o2U   PM	     nnUSS /nUSS /n[        U R                  5       HK  u  pxUR	                  U R                  XW   U5      5        UR	                  U R                  Xg   U5      5        MM     / n	[        SS5       H;  nXW   Xg   -   n
U R                   Vs/ s H  o:U   PM	     nnU	R	                  U5        M=     U	$ s  snf s  snf )Nr   r4   r   r   r   )	_get_bits_pc1	enumerate_shift_indexesappend_shift_bitsrU   _pc2)rK   rD   key_bitsxpc1_bitscdr[   shift_indexsubkeyscdsubkey_bitss               rL   rI   DES._create_subkeys  s    >>#& *.3AQK3 a^b_ ((;(;<NAHHT%%adK89HHT%%adK89 = 24q"AB*.))4)Qa5)K4NN;' 
 # 4 5s   C/C4bitsshiftsc                 `    S/S-  n[        S5       H  nXB-   nUS:  a  US-
  nX   X4'   M     U$ )Nr   r4   )rU   )rK   r   r   new_bitsr[   r   s         rL   r|   DES._shift_bits   sE    38rA*Kb )B.+HK	  rO   c                 R   / n[        [        U5      5       GH  n[        R                  " SXUS-    5      S   nUR	                  US-  (       a  SOS5        UR	                  US-  (       a  SOS5        UR	                  US-  (       a  SOS5        UR	                  US-  (       a  SOS5        UR	                  US-  (       a  SOS5        UR	                  US	-  (       a  SOS5        UR	                  US
-  (       a  SOS5        UR	                  US-  (       a  SOS5        GM     U$ )Nre   r   r      @   r	   r   r   r7   r   )rU   rG   rh   ri   r{   )rK   rP   r   r[   bs        rL   rw   DES._get_bits
  s    s4y!Ac4AE?3A6AKKQX1-KKQX1-KKQX1-KKQX1-KKQX1-KKQX1-KKQX1-KKQX1- " rO   r\   c                    U R                  U5      nU R                   Vs/ s H  o2U   PM	     nnUSS /nUSS /n[        S5       Hv  nU R                  Xg   U R                  U   5      n[        S5       V	s/ s H  n	[        X   XW   U	   :g  5      PM     n
n	UR                  Xg   5        UR                  U
5        Mx     US   US   -   nU R                   Vs/ s H  o;U   PM	     nnSn[        SSS5       HW  n[        SR                  XUS-     Vs/ s H  n[        U5      PM     sn5      S5      nU[        R                  " S	U5      -  nMY     U$ s  snf s  sn	f s  snf s  snf )
Nr   r	   r   r   rO   r    r   re   )rw   _iprU   _compute_blockrJ   rj   r{   	_final_ipjoinstrrh   rl   )rK   r\   
block_bitsr   lrleftrightr[   computed_blockknew_rrlencrypted_bitsencrypted_bytesi_bytes                  rL   rX   DES._encode_block  s_   ^^E*
%)XX.XmX.1RzBrrA!004==;KLNCH9M9aS*dgaj899EMKK!LL  2Yb!)-8AQ%8q"aA.QU2K!L2KQ#a&2K!LMqQFv{{377O ! ' / N 9 "Ms   E8EE E%c                    U R                  U5      nS/S-  n[        U R                  5       H  u  pEX$   X5'   M     / /S-  n/ /S-  nUSS US'   USS US'   [        SSS5       He  nU R	                  XtS-      U R
                  U   5      n[        S5       V	s/ s H  n	[        X   XdS-      U	   :g  5      PM     n
n	XtS-      Xd'   XU'   Mg     US   US   -   nS/S-  n[        U R                  5       H  u  pEX   X'   M     S	n[        SSS
5       HW  n[        SR                  XUS
-     Vs/ s H  n[        U5      PM     sn5      S5      nU[        R                  " SU5      -  nMY     U$ s  sn	f s  snf )Nr   r   r   r	   r   r>   r   rO   r   r   r   re   )rw   ry   r   rU   r   rJ   rj   r   r   r   rh   rl   )rK   r\   r   r   r[   idxr   r   r   r   new_lr   decrypted_bitsdecrypted_bytesr   r   s                   rL   r`   DES._decode_block/  s   ^^E*
S2X/FA mBG 0 13tby/1dRiqHb	b9Rr2r"A!00!edmmA>NONHMb	R	1S*eEl1o=>	ERE{EHG	 # !WuQxr)FA"$%N * q"aA.QU2K!L2KQ#a&2K!LMqQFv{{377O !  S "Ms   "E/.E4c                 D   U R                    Vs/ s H  o1U   PM	     nn[        S5       Vs/ s H  n[        X%   XE   :g  5      PM     nn/ nSn[        SSS5       GH  nXeUS-    n	[        U	S   5      [        U	S   5      /n
U	SS  Vs/ s H  n[        U5      PM     nn[        SR	                  U
5      S5      n[        SR	                  U5      S5      nUS-  U-   nU R
                  U   U   nUS-  nUR                  US	-  (       a  SOS5        UR                  US
-  (       a  SOS5        UR                  US-  (       a  SOS5        UR                  US-  (       a  SOS5        GM     U R                   Vs/ s H  o7U   PM	     nnU$ s  snf s  snf s  snf s  snf )Nr   r   r'   r   r   r   r   r   r   r7   )_e_bit_selectionrU   rj   r   r   _s_boxesr{   _p)rK   r\   rD   r   expanded_blockr[   	new_block
s_box_perm
s_box_itercurrent_blockrow_bitscolumn_bits	s_box_rows_box_columns_box_addresss_box_valuefinal_blocks                    rL   r   DES._compute_blockK  s   ,0,A,AB,Aq(,AB?DRyIy!S>#445y	I 

q"aA%!a%0MM!,-s=3D/EFH+82+>?+>a3q6+>K?BGGH-q1Irww{3Q7L&^|;M--
3MBK!OJ;#4a!<;#4a!<;#4a!<;#4a!< !  /3gg6g!}g61 CI @ 7s   FF	F<F)rJ   rD   )__name__
__module____qualname____firstlineno____doc__rx   rz   r}   r   r   r   r   r   bytesrM   r]   rb   staticmethodrp   rj   rk   typingListrI   r|   rw   rX   r`   r   __static_attributes__rs   rO   rL   r   r   	   s   	9Dx FN1DhACH1jA	
DA	
DA	
DA	
DA	
DA	
DA	
DA	
_QHh!
BHAIF7E 7d 7)E )e )()E )e ), .E .e . .` S S  5 V[[S9I-J 0C 0 # &++cBR e C(8 5 U .5 U 8FKK$4 6;;s;K PVP[P[\_P` rO   r   )rS   rh   r   r   rs   rO   rL   <module>r      s    
  [ [rO   