
    ,hM                         d dl Z d dlmZ d dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZmZ d dlmZmZmZ dZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZ  G d de!      Z" G d de#      Z$ G d de#      Z%y)    N)Hash)Random)DerSequenceDerOctetStringDerObjectId
DerInteger)AES)padunpad)PBKDF1PBKDF2scryptz1.2.840.113549.1.5.3z1.2.840.113549.1.5.6z1.2.840.113549.1.5.10z1.2.840.113549.1.5.11z1.2.840.113549.1.5.13z1.2.840.113549.1.5.12z1.3.6.1.4.1.11591.4.11z1.2.840.113549.2.7z1.2.840.113549.3.7z2.16.840.1.101.3.4.1.2z2.16.840.1.101.3.4.1.22z2.16.840.1.101.3.4.1.42z2.16.840.1.101.3.4.1.6z2.16.840.1.101.3.4.1.26z2.16.840.1.101.3.4.1.46c                       e Zd Zy)	PbesErrorN)__name__
__module____qualname__     Q/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/Crypto/IO/_PBES.pyr   r   C   s    r   r   c                        e Zd ZdZed        Zy)PBES1zDeprecated encryption scheme with password-based key derivation
    (originally defined in PKCS#5 v1.5, but still present in `v2.0`__).

    .. __: http://www.ietf.org/rfc/rfc2898.txt
    c                 R   t               j                  |       }t               j                  |d         }t               j                  |d         j                  }t	               j                  |d         j
                  }i }|t        k(  rddlm} ddl	m
} |}	|}
nc|t        k(  rddlm} ddl	m} |}	|}
d|d<   nD|t        k(  rddlm} ddl	m
} |}	|}
n*|t        k(  rddlm} ddl	m} |}	|}
d|d<   nt!        d	      t               j                  |d   d
      }t               j                  |d         j                  }|d   }t#        ||d||	      }|dd |dd }} |
j$                  ||
j&                  |fi |}|j)                  |      }t+        ||j,                        S )ax  Decrypt a piece of data using a passphrase and *PBES1*.

        The algorithm to use is automatically detected.

        :Parameters:
          data : byte string
            The piece of data to decrypt.
          passphrase : byte string
            The passphrase to use for decrypting the data.
        :Returns:
          The decrypted data, as a binary string.
        r      )MD5)DES)ARC2@   effective_keylen)SHA1zUnknown OID for PBES1   nr_elements   N   )r   decoder   payloadr   value_OID_PBE_WITH_MD5_AND_DES_CBCCrypto.Hashr   Crypto.Cipherr   _OID_PBE_WITH_MD5_AND_RC2_CBCr   _OID_PBE_WITH_SHA1_AND_DES_CBCr    _OID_PBE_WITH_SHA1_AND_RC2_CBCr   r   newMODE_CBCdecryptr   
block_size)data
passphraseenc_private_key_infoencrypted_algorithmencrypted_datapbe_oidcipher_paramsr   r   hashmodmoduler   r    
pbe_paramssalt
iterationskey_ivkeyivcipherpts                        r   r1   zPBES1.decrypt   s     +}33D9)m223G3JK')001Ea1HIQQ-&&':1'=>DD33')GF55'*GF02M,-66()GF66(*GF02M,-344 ]))*=a*@a)P
&&z!}5==]

D"j'B!*fQRjRC"FF^^N+R**++r   N)r   r   r   __doc__staticmethodr1   r   r   r   r   r   }   s     :, :,r   r   c                   2    e Zd ZdZedd       Zed        Zy)PBES2zEncryption scheme with password-based key derivation
    (defined in `PKCS#5 v2.0`__).

    .. __: http://www.ietf.org/rfc/rfc2898.txt.Nc                 	   |i }|t        j                         j                  }t        j                  d      }|j                  |      }|t        d|z        |j                  d      r%d}|j                  d      }|j                  d      }	nd}|j                  d      }	d}
|	d	k(  r(d
dl	m
} d}|}|j                  }t        }d |d      i}n(|	dk(  r)d}t        }t        j                  }t        }d |d      i}n|	dk(  r)d}t        }t        j                  }t        }d |d      i}n|	dk(  r)d}t        }t        j                  }t         }d |d      i}n|	dk(  r+d}t        }t        j"                  }t$        }d |d      i}d}
nn|	dk(  r+d}t        }t        j"                  }t&        }d |d      i}d}
n>|	dk(  r+d}t        }t        j"                  }t(        }d |d      i}d}
nt        d|	z        t+        |j-                               d
   } ||j/                  dd            }|dk(  r|j/                  dd      }t1        j                        }t3        |||||      }t5        t7        |      t9        |      g      }|dk7  rP	 t0        j:                  j                  d |!      j<                  }|jA                  t5        tC        |      g             t5        tC        tD              |g      }n|dk(  r|j/                  dd#      }|j/                  d$d      }|j/                  d%d&      }tG        ||||||      }t5        tC        tH              t5        t7        |      t9        |      t9        |      t9        |      g      g      }nt        d'|j                  d&      z          |j                  ||fi |}|
r|jK                  |       \  }}||z   }n%|jM                  tO        | |jP                              }t5        tC        |      t7        |      g      }t5        t5        tC        tR              t5        ||g      g      t7        |      g      } | jU                         S # t>        $ r t        d"      w xY w)(a	  Encrypt a piece of data using a passphrase and *PBES2*.

        :Parameters:
          data : byte string
            The piece of data to encrypt.
          passphrase : byte string
            The passphrase to use for encrypting the data.
          protection : string
            The identifier of the encryption algorithm to use.
            The default value is '``PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC``'.
          prot_params : dictionary
            Parameters of the protection algorithm.

            +------------------+-----------------------------------------------+
            | Key              | Description                                   |
            +==================+===============================================+
            | iteration_count  | The KDF algorithm is repeated several times to|
            |                  | slow down brute force attacks on passwords    |
            |                  | (called *N* or CPU/memory cost in scrypt).    |
            |                  |                                               |
            |                  | The default value for PBKDF2 is 1 000.        |
            |                  | The default value for scrypt is 16 384.       |
            +------------------+-----------------------------------------------+
            | salt_size        | Salt is used to thwart dictionary and rainbow |
            |                  | attacks on passwords. The default value is 8  |
            |                  | bytes.                                        |
            +------------------+-----------------------------------------------+
            | block_size       | *(scrypt only)* Memory-cost (r). The default  |
            |                  | value is 8.                                   |
            +------------------+-----------------------------------------------+
            | parallelization  | *(scrypt only)* CPU-cost (p). The default     |
            |                  | value is 1.                                   |
            +------------------+-----------------------------------------------+


          randfunc : callable
            Random number generation function; it should accept
            a single integer N and return a string of random data,
            N bytes long. If not specified, a new RNG will be
            instantiated from ``Crypto.Random``.

        :Returns:
          The encrypted data, as a binary string.
        z5^(PBKDF2WithHMAC-([0-9A-Z-]+)|scrypt)And([0-9A-Z-]+)$zUnknown protection %sPBKDFpbkdf2r!      r   FzDES-EDE3-CBCr   DES3   rA   r%   z
AES128-CBCr$   z
AES192-CBCz
AES256-CBC    z
AES128-GCMnonce   Tz
AES192-GCMz
AES256-GCMzUnknown encryption mode '%s'	salt_sizeiteration_counti  hmac_hash_moduler    r   )	digestmodzNo OID for HMAC hash algorithmi @  r2   parallelizationr   zUnknown KDF )+r   r/   readrecompilematch
ValueError
startswithgroupr+   rM   r0   _OID_DES_EDE3_CBCr	   _OID_AES128_CBC_OID_AES192_CBC_OID_AES256_CBCMODE_GCM_OID_AES128_GCM_OID_AES192_GCM_OID_AES256_GCMlistvaluesgetr   r   r   r   r   HMACoidKeyErrorappendr   _OID_PBKDF2r   _OID_SCRYPTencrypt_and_digestencryptr
   r2   
_OID_PBES2encode)!r3   r4   
protectionprot_paramsrandfuncpatternrespbkdfpbkdf2_hmac_algoenc_algoaeadrM   key_sizer;   cipher_modeenc_oid	enc_paramiv_noncer=   countrV   r@   pbkdf2_paramshmac_oidkdf_infoscrypt_rscrypt_prB   cttagr7   enc_infor5   s!                                    r   rq   zPBES2.encrypt   s   ^ Kzz|((H**UVmmJ';4zABB  )E"yy|yy|HEyy|H~%*HF--K'Gx{+I%HF,,K%Gx|,I%HF,,K%Gx|,I%HF,,K%Gx|,I%HF,,K%G (2,/ID%HF,,K%G (2,/ID%HF,,K%G (2,/ID;hFGG	((*+A.Q78 HOO$5t<E!12I!*3	5C ( .t 4 *5 1) M
  6)G#yy}}SI}FJJH $$[+h2G1H%IJ",!$ H
 hOO$5u=E"|Q7H"'8!<HT8(4C",&t,"5)"8,"8,	! $ H ^ciil:;; C:	://5GB#XN#^^Cf6G6G,HING$x( 
   +J'   >*
,
 
  $**,,k   G$%EFFGs   +Q+ +R c                 	   t               j                  | d      }t               j                  |d         }t               j                  |d         j                  }t	               j                  |d         j
                  }|t        k7  rt        d      t               j                  |d   d      }t               j                  |d   d      }t	               j                  |d         j
                  }d}	|t        k(  rt               j                  |d   d      }
t               j                  |
d         j                  }|
d   }t        |
      dz
  }d}|dkD  r	 |
|   dz
  }	|dz  }|dz  }t        }|dkD  rt               j                  |
|         }t	               j                  |d         j
                  }n|t        k(  rrt               j                  |d   d      }t               j                  |d         j                  }d	D cg c]  }||   	 c}\  }}}t        |      d
kD  r|d
   }	nd}	nt        d      t               j                  |d         }t	               j                  |d         j
                  }d}|t        k(  rddlm} |}|j                   }d}d}n|t"        k(  rt$        }t$        j                   }d}d}n|t&        k(  rt$        }t$        j                   }d}d}n|t(        k(  rt$        }t$        j                   }d}d}n|t*        k(  rt$        }t$        j,                  }d}d}d}nZ|t.        k(  rt$        }t$        j,                  }d}d}d}n4|t0        k(  rt$        }t$        j,                  }d}d}d}nt        d|z         |	r|	|k7  rt        d      t               j                  |d         j                  }|t        k(  rD	 t2        j4                  j6                     }t3        j:                  |      }t=        |||||      } nt?        ||||      }  |j:                  | |fi ||i}!t        |      |!j@                  k  rtC        d      |r(|!j@                  }"|!jE                  |d|"  ||" d       }#|#S |!jG                  |      }$tI        |$|!j@                        }#|#S # t        $ r Y Sw xY wc c}w # t8        $ r t        dz        w xY w)ax  Decrypt a piece of data using a passphrase and *PBES2*.

        The algorithm to use is automatically detected.

        :Parameters:
          data : byte string
            The piece of data to decrypt.
          passphrase : byte string
            The passphrase to use for decrypting the data.
        :Returns:
          The decrypted data, as a binary string.
        r!   r"   r   r   zNot a PBES2 objectN)r!   rK      )r      )r   r!   rK   r   zUnsupported PBES2 KDFFrL   rN   rA   r$   rO   rP   TzUnsupported PBES2 cipher z9Mismatch between PBES2 KDF parameters and selected cipherzUnsupported HMAC %srT   zToo little data to decrypt)%r   r&   r   r'   r   r(   rr   r   rn   len	TypeError_OID_HMAC_SHA1ro   r_   r+   rM   r0   r`   r	   ra   rb   rd   rc   re   rf   r   rj   _hmac2hash_oidrl   r/   r   r   r2   r\   decrypt_and_verifyr1   r   )%r3   r4   r5   r{   r7   r8   pbes2_paramsr   kdf_oidkdf_key_lengthr   r=   rS   leftidxpbkdf2_prf_oidpbkdf2_prf_algo_idscrypt_paramsxr   r   r   r   r|   rM   r;   r~   r}   cipher_paramr   hmac_hash_module_oidrU   r@   rB   tag_lenrC   	pt_paddeds%                                        r   r1   zPBES2.decrypt  s     +}33Da3H=''(<Q(?@')001Ea1HIQQ-&&x{399j 011"}++HQKQ+G =''QQ'G-&&x{399 k!'M00!)0TM!#**=+;<DDD+A.O}%)DCax%23%7!%;NAID1HC ,Nax%0]%9%9-:L%M"!,!5!56H6K!L!R!R#'M00!&0QM!#**=+;<DDD<E3G78 4A3C 3G/OXx=!A%!.q!1!%344 =''Q8-&&x{399''*F--KHL'F,,KHL'F,,KHL'F,,KHL'F,,KH"LD'F,,KH"LD'F,,KH"LD7(BCCn8 3 4 4 "#**8A;7?? k!H'+yy'?'?'O$  $xx(<=T8_*:<C T8_!8-CCHh0GH ~!2!229::''G**>)G8+D+97()+DFB 	 ~6Iy&"3"34B	S ! 3GH  H 5 FGGHs$   $R= SS =	S
	S
S*)NN)r   r   r   rD   rE   rq   r1   r   r   r   rG   rG      s4    3
 - -B W Wr   rG   )&rY   Cryptor   r   Crypto.Util.asn1r   r   r   r   r+   r	   Crypto.Util.Paddingr
   r   Crypto.Protocol.KDFr   r   r   r)   r,   r-   r.   rr   rn   ro   r   r_   r`   ra   rb   rd   re   rf   r\   r   objectr   rG   r   r   r   <module>r      s   D 
   
  * 6 6 6  6 !8 !8 $
%&%( *++*++	
 	tB,F B,J`F `r   