
    Wwgz              
       ^   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mZ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mZ d dlmZmZ dd	lmZmZmZmZmZ dd
lmZm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2 ddl3m4Z4 e G d d             Z5dee6e7f   de7fdZ8	 d5de7de5dee7   fdZ9	 d5de7de5de7dee7   fdZ:dddZ;de7fdZ<	 d5de7de7dee7   de7fd Z=ej|                   G d! d"ej~                               Z@ G d# d$ej                  e-      ZB G d% d&e%e j                        ZD G d' d(eDe0      ZE G d) d*eDe1      ZF G d+ d,eDe2      ZG ej                  d-      ZId. ZJd/ ZKd0 ZLd1ej                  fd2ZNe*j                   G d3 d4e*             ZP e-j                  eB       y)6    N)	dataclass)sha256sha384sha512)DictOptionalTupleUnion)core)Cipher
algorithmsmodes)genericmisc   )compute_o_value_legacycompute_o_value_legacy_prepcompute_u_value_r2compute_u_value_r34legacy_normalise_pw)aes_cbc_decryptaes_cbc_encryptrc4_encrypt)	
AuthResult
AuthStatusCryptFilterCryptFilterBuilderCryptFilterConfigurationIdentityCryptFilterPdfKeyNotAvailableErrorSecurityHandlerSecurityHandlerVersion)SerialisableCredentialSerialisedCredential)AESCryptFilterMixinAESGCMCryptFilterMixinRC4CryptFilterMixin)StandardPermissionsc                   F    e Zd ZU eed<   eed<   eed<   ededd fd       Zy)_R6KeyEntry
hash_valuevalidation_saltkey_saltentryreturnc                 N    t        |      dk(  sJ t        |d d |dd |dd       S )N0       (   )lenr*   )clsr.   s     W/var/www/horilla/myenv/lib/python3.12/site-packages/pyhanko/pdf_utils/crypt/standard.py
from_bytesz_R6KeyEntry.from_bytes0   s5    5zR5":uR|U2b\BB    N)__name__
__module____qualname__bytes__annotations__classmethodr7    r8   r6   r*   r*   *   s7    OCu C C Cr8   r*   passwordr/   c                 l    t        | t              r | syddlm}  ||       j	                  d      } | d d S )Nr8   r   )saslprepzutf-8   )
isinstancestr	_saslpreprB   encode)r@   rB   s     r6   _r6_normalise_pwrH   6   s6    (C 'H%,,W5DS>r8   pw_bytesr.   u_entryc                 N    t        | |j                  |      }||j                  k(  S N)_r6_hash_algor,   r+   )rI   r.   rJ   purported_hashs       r6   _r6_password_authenticaterO   A   s)     #8U-B-BGLNU----r8   e_entryc                     t        | |j                  |      }t        |      dk(  sJ t        ||t	        d      d      S )Nr2      Fkeydataivuse_padding)rM   r-   r4   r   r<   )rI   r.   rP   rJ   
interm_keys        r6   _r6_derive_file_keyrY   H   sB     xAJw<2Wr r8   TF)T   F   input_bytesc                 ,    t        d | D              dz  S )Nc              3   &   K   | ]	  }|d z    yw)   Nr?   ).0bs     r6   	<genexpr>z_bytes_mod_3.<locals>.<genexpr>Z   s     *q1u*s   r_   )sum)r\   s    r6   _bytes_mod_3rd   X   s    *k**Q..r8   current_saltc                    t        |       }t        |      dk(  sJ |j                  |       |r!t        |      dk(  sJ |j                  |       |j                         }t         t        t
        f}dx}}|dk  s||dz
  kD  rs| |z   |xs dz   dz  }t        |dd ||dd d	
      d   }	|t        |	dd          }
 |
|	      j                         }|	t        |	      dz
     }|dz  }|dk  rj||dz
  kD  rs|dd S )u3   
    Algorithm 2.B in ISO 32000-2 § 7.6.4.3.4
       r1   r   @   r2   r8   NrR   FrS   r   )r   r4   updatedigestr   r   r   rd   )rI   re   rJ   initial_hashkhashesround_nolast_byte_valk1e	next_hashs              r6   rM   rM   ]   s*    (#L|!!!%7|r!!!G$Aff%F  H}
R-=8b=8lgn-3#2RAbH%


 <#2/0	aL!#a&1*A R-=8b=8 Sb6Mr8   c                   \    e Zd ZdZdZdZdZdZdZdZ		 de
j                  fd	Zedd
       Zy) StandardSecuritySettingsRevisionz;Indicate the standard security handler revision to emulate.   r_            Nr/   c                 p    | j                   }|t        j                         S t        j                  |      S rL   )valuer   
NullObjectNumberObject)selfvals     r6   as_pdf_objectz.StandardSecuritySettingsRevision.as_pdf_object   s3    jj$'KG 	
5<5I5I#5N	
r8   c                 X    	 t        |      S # t        $ r t         j                  cY S w xY wrL   )rt   
ValueErrorOTHER)r5   rz   s     r6   from_numberz,StandardSecuritySettingsRevision.from_number   s-    	:3E:: 	:3999	:s   
 )))r/   rt   )r9   r:   r;   __doc__	RC4_BASICRC4_EXTENDEDRC4_OR_AES128AES256AES_GCMr   r   	PdfObjectr   r>   r   r?   r8   r6   rt   rt   {   sN    EILMFGE
w00 
 : :r8   rt   c                       e Zd Zdej                  fdej                  ddifgZedefd       Zde	fdZ
ede	fd	       Zy
)_PasswordCredential	pwd_bytesid1optionalTr/   c                      y)Nr   r?   r5   s    r6   get_namez_PasswordCredential.get_name   s    r8   c                 "    | j                         S rL   )dumpr}   s    r6   
_ser_valuez_PasswordCredential._ser_value   s    yy{r8   rU   c                 r    	 t         j                  |      S # t        $ r t        j                  d      w xY w)Nz)Failed to deserialise password credential)r   loadr   r   PdfReadError)r5   rU   s     r6   _deser_valuez _PasswordCredential._deser_value   s<    	Q&++D11 	Q##$OPP	Qs    6N)r9   r:   r;   r   OctetString_fieldsr>   rE   r   r<   r   r   r?   r8   r6   r   r      sq    	d&&'	  :t"45G
   E  Q Q Qr8   r   c                   ^     e Zd ZU dZdZed   ed<   ed        Z fdZ	de
fdZ fd	Z xZS )
StandardCryptFilterzB
    Crypt filter for use with the standard security handler.
    NStandardSecurityHandler_handlerc                 n    t        | j                  t              r| j                  j                  S t        rL   )rD   r   r   _auth_failedNotImplementedErrorr   s    r6   r   z StandardCryptFilter._auth_failed   s'    dmm%<===---!!r8   c                 ^    t        |t              st        t        |   |       d | _        y rL   )rD   r   	TypeErrorsuper_set_security_handler_shared_key)r}   handler	__class__s     r6   r   z)StandardCryptFilter._set_security_handler   s(    '#:;O%g.r8   r/   c                 R    | j                   sJ | j                   j                         S rL   )r   get_file_encryption_keyr   s    r6   derive_shared_encryption_keyz0StandardCryptFilter.derive_shared_encryption_key   s!    }}}}}4466r8   c                 h    t         |          }t        j                  | j                        |d<   |S )N/Length)r   r   r   r|   keylen)r}   resultr   s     r6   r   z!StandardCryptFilter.as_pdf_object   s0    &( $00=yr8   )r9   r:   r;   r   r   r   r=   propertyr   r   r<   r   r   __classcell__r   s   @r6   r   r      sG     59Hh018" "
 7e 7 r8   r   c                       e Zd ZdZy)StandardAESCryptFilterz=
    AES crypt filter for the standard security handler.
    Nr9   r:   r;   r   r?   r8   r6   r   r           	r8   r   c                       e Zd ZdZy)StandardAESGCMCryptFilterzA
    AES-GCM crypt filter for the standard security handler.
    Nr   r?   r8   r6   r   r      r   r8   r   c                       e Zd ZdZy)StandardRC4CryptFilterz=
    RC4 crypt filter for the standard security handler.
    Nr   r?   r8   r6   r   r      r   r8   r   z/StdCFc                 N    t        t        t        |       it        t              S Nr   default_stream_filterdefault_string_filter)r   STD_CFr   r   s    r6   _std_rc4_configr      #    #	'v67$$ r8   c                 N    t        t        t        |       it        t              S r   )r   r   r   r   s    r6   _std_aes_configr      r   r8   c                  J    t        t        t               it        t              S )Nr   )r   r   r   r?   r8   r6   _std_gcm_configr      s!    #	*,-$$ r8   cfdictc                 D    | j                  dd      }t        |dz        S )Nr   r3   rg   r   )getr   )r   _acts_as_defaultkeylen_bitss      r6   #_build_legacy_standard_crypt_filterr      s$     **Y+K!)9::r8   c                       e Zd ZU dZ ej
                  d      e ej
                  d      d  ej
                  d      d  ej
                  d      d  ej
                  d	      d
 iZeej
                  e	f   e
d<   edefd       Zeddd ej                         ddfdedefd       Zed ej                         dddfdededefd       Zed*d       Z	 	 	 	 	 	 	 d+dedededee   dee   f
 fdZedej6                  defd        Zedej6                  fd!       Zedef fd"       Z d# Z!d$efd%Z"d$efd&Z#	 d,d$ee   de$fd'Z%de&e'ee   f   fd(Z(defd)Z) xZ*S )-r   a  
    Implementation of the standard (password-based) security handler.

    You shouldn't have to instantiate :class:`.StandardSecurityHandler` objects
    yourself. For encrypting new documents, use :meth:`build_from_pw`
    or :meth:`build_from_pw_legacy`.

    For decrypting existing documents, pyHanko will take care of instantiating
    security handlers through :meth:`.SecurityHandler.build`.
    z/V2z/AESV2c                     t        d      S )NrR   r   r   ___s     r6   <lambda>z StandardSecurityHandler.<lambda>      4J5
 r8   z/AESV3c                     t        d      S )Nr2   r   r   r   s     r6   r   z StandardSecurityHandler.<lambda>  r   r8   z/AESV4c                     t               S rL   )r   r   s     r6   r   z StandardSecurityHandler.<lambda>  s
    4M4O r8   z	/Identityc                     t               S rL   )r   r   s     r6   r   z StandardSecurityHandler.<lambda>  s
    7J7L r8   _known_crypt_filtersr/   c                 ,    t        j                  d      S )N	/Standard)r   
NameObjectr   s    r6   r   z StandardSecurityHandler.get_name  s    !!+..r8   NrR   Trevpermsc
                 ~   t        |      }|t        |      n|}|t        j                  kD  rt        | d      |t        j                  k(  rd}n|r|t        j                  k(  rd}t        |||j                  |      }|t        j                  k(  rX|t        j                  z  t        j                  z  t        j                  z  t        j                  z  }t        ||||      \  }}nt        ||j                  |||||	      \  }}|t        j                  k(  rt        j                  }n4|t        j                  k(  rt        j                  }nt        j                   }|t        j                  k(  r||rt#        d      }nt%        |      } | d||||||||	d|
}||_        t)        ||d      |_        |S )a  
        Initialise a legacy password-based security handler, to attach to a
        :class:`~.pyhanko.pdf_utils.writer.PdfFileWriter`.
        Any remaining keyword arguments will be passed to the constructor.

        .. danger::
            The functionality implemented by this handler is deprecated in the
            PDF standard. We only provide it for testing purposes, and to
            interface with legacy systems.

        :param rev:
            Security handler revision to use, see
            :class:`.StandardSecuritySettingsRevision`.
        :param id1:
            The first part of the document ID.
        :param desired_owner_pass:
            Desired owner password.
        :param desired_user_pass:
            Desired user password.
        :param keylen_bytes:
            Length of the key (in bytes).
        :param use_aes128:
            Use AES-128 instead of RC4 (default: ``True``).
        :param perms:
            Permission bits to set
        :param crypt_filter_config:
            Custom crypt filter configuration. PyHanko will supply a reasonable
            default if none is specified.
        :return:
            A :class:`StandardSecurityHandler` instance.
        z/ is not supported by this bootstrapping method.   rR   r   )versionrevisionlegacy_keylen
perm_flagsodataudatacrypt_filter_configencrypt_metadatar   r   r?   )r   rt   r   r   r   r   rz   r(   ALLOW_FORM_FILLINGALLOW_ASSISTIVE_TECHNOLOGYALLOW_REASSEMBLYALLOW_HIGH_QUALITY_PRINTINGr   r   r"   RC4_40RC4_LONGER_KEYSr   r   r   r   _credential)r5   r   r   desired_owner_passdesired_user_passkeylen_bytes
use_aes128r   r   r   kwargso_entryrJ   rT   r   shs                   r6   build_from_pw_legacyz,StandardSecurityHandler.build_from_pw_legacy"  s   Z 11CD !,   12# 	
 1???%FG  2<<<L3"B"P"PPL( 1399l

 2<<< %889%@@A &667 &AA	B  .!7E3LGS /!		 LGS 2@@@,::G4>>>,33G,<<G 3AAA#+&5R&@#&5\&J# 

& 3-

 

 ,,S9
 	r8   Fpdf_macuse_gcmc                    t        |      }|t        |      n|}	t        j                  d      }
t        j                  d      }t        j                  d      }t        |	|      }||z   |z   }t        |	|      }t	        ||
t        d      d      \  }}t        |      dk(  sJ t        j                  d      }t        j                  d      }t        |||      }||z   |z   }t        |||      }t	        ||
t        d      d      \  }}t        |      dk(  sJ |r|t        j                   z  }|j                         ddd   }|dz   |rd	nd
z   dz   t        j                  d      z   }t        t        j                  |
      t        j                               }|j                         }|j!                  |      |j#                         z   }|rt        j                  d      }nd}|r!t$        j&                  }t(        j&                  }n t$        j*                  }t(        j*                  } | d||d||||||||d|} |
| _        t/        d|i      | _        | S )a  
        Initialise a password-based security handler backed by AES-256,
        to attach to a :class:`~.pyhanko.pdf_utils.writer.PdfFileWriter`.
        This handler will use the new PDF 2.0 encryption scheme.

        Any remaining keyword arguments will be passed to the constructor.

        :param desired_owner_pass:
            Desired owner password.
        :param desired_user_pass:
            Desired user password.
        :param perms:
            Desired usage permissions.
        :param encrypt_metadata:
            Whether to set up the security handler for encrypting metadata
            as well.
        :param pdf_mac:
            Include an ISO/TS 32004 MAC.
        :param use_gcm:
            Use AES-GCM (ISO/TS 32003) to encrypt strings and streams.

            .. danger::
                Due to the way PDF encryption works, the authentication
                guarantees of AES-GCM only apply to the content of individual
                strings and streams. The PDF file structure itself is not
                authenticated. Document-level integrity protection is provided
                by the ``pdf_mac=True`` option.

            .. warning::
                This option is disabled by default because support for
                ISO/TS 32003 is not available in mainstream PDF
                software yet. This default may change in the future.
        :return:
            A :class:`StandardSecurityHandler` instance.
        Nr2   rg   rR   F)rW   s      T   F   adbrv   )r   r   r   r   r   r   oeseedueseedencrypted_permsr   kdf_saltr   r?   )rH   secretstoken_bytesrM   r   r<   r4   r(   TOLERATE_MISSING_PDF_MACas_bytesr   r   AESr   ECB	encryptorri   finalizer"   r   rt   r   r   r   r   )!r5   r   r   r   r   r   r   r   owner_pw_bytesuser_pw_bytesencryption_keyu_validation_salt
u_key_saltu_hashrJ   u_interm_keyr   ue_seedo_validation_salt
o_key_salto_hashr   o_interm_keyoe_seedperms_bytesextd_perms_bytescipherr  r  r  r   r   r   s!                                    r6   build_from_pwz%StandardSecurityHandler.build_from_pw  s   \ **<= !, ./ 	
 !,,R0#//2((+
}.?@,,z9$]J?$.%)

7 7|r!!!#//2((+
~/@'J,,z9$^ZI$.%)

7 7|r!!!)BBBBEnn&tt,'tT3  !!!$	% 	 
~6		D$$&	-.1C1C1EE 	 **2.HH,44G7??H,33G7>>H 
+-
 
 (,k>-JK	r8   c                 >   t        |       t        |      cxk(  rdk(  sn t        j                  d| d      |r!|rt        |      t        |      cxk(  rdk(  sn t        j                  d| d      |rt        |      dk7  rt        j                  d| d      y )Nr1   z2/U and /O entries must be 48 bytes long in a rev. z security handlerr2   z;/UE and /OE must be present and be 32 bytes long in a rev. rR   z6/Perms must be present and be 16 bytes long in a rev. )r4   r   PdfError)r   r   r  r  r  r   s         r6   _check_r6_valuesz(StandardSecurityHandler._check_r6_values  s    E
c%j.B.--u-/  VCK3v;,L",L--u-/  #o"6""<--u-/  #=r8   r   r   r   r   r  c                    ||t         j                  k(  rt        d      }ns|t         j                  k(  rt        |      }nT|t         j                  k(  rt               }n6|t         j                  k\  r|t        d      }nt        j                  d      t        | -  ||||
||       || _        || _        | j                  t        j                  z   | _        |t"        j                  k\  r5| j$                  j'                  |||||	       || _        || _        |	| _        nIt/        |      t/        |      cxk(  rdk(  sn t        j                  d      d x| _        x| _        | _        || _        || _        d | _        d| _        y )Nr   r2   z1Could not impute a reasonable crypt filter config)r   compat_entriesr  zD/U and /O entries must be 32 bytes long in a legacy security handlerF)r"   r   r   r   r   r   r   r   r   r   r   __init__r   r   r(   r  _mac_requiredrt   r   r!  r  r  r  r4   r   r   r   r   )r}   r   r   r   r   r   r   r  r  r  r   r   r#  r  r   s                 r6   r$  z StandardSecurityHandler.__init__,  s     &0777&5a&8#2BBB&5m&D#2:::&5&7#1888'/ '6b&9#mmG  	-) 	 	
 !
JJ,EEE
 7>>>NN++uffo !DK DK#2D J#e*22mm.  @DCDKC$+(<

,0!r8   encrypt_dictc                 ~   |j                  dd      }|dz  dk7  rt        j                  d      |dz  }	 |d   }|d   }d	t        j
                  d
t        fd}d	t        j
                  d
t        fd}t        ||j                  d|t        j                               |j                  dd |j                  dd |j                  d|      |j                  d|      |j                  d|      |j                  dt        d      |j                  dd       	      S # t        $ r t        j                  d      w xY w)a  
        Gather and preprocess the "easy" metadata values in an encryption
        dictionary, and turn them into constructor kwargs.

        This function processes ``/Length``, ``/P``, ``/Perms``, ``/O``, ``/U``,
        ``/OE``, ``/UE`` and ``/EncryptMetadata``.
        r   r3   rg   r   z"Key length must be a multiple of 8/O/Uz!/O and /U entries must be presentxr/   c                     t        | t        j                  t        j                  f      s!t	        j
                  dt        |              | j                  S )NzExpected string, but got )rD   r   TextStringObjectByteStringObjectr   r   typeoriginal_bytesr*  s    r6   
_get_byteszFStandardSecurityHandler.gather_encryption_metadata.<locals>._get_bytes  sK    G,,g.F.FG ''*CDG9(MNN###r8   c                     t        | t        j                        rt        j                  |       S t        j                  d|  d      )NzCannot parse z as a permission indicator)rD   r   r|   r(   from_sint32r   r   r0  s    r6   _parse_permissionszNStandardSecurityHandler.gather_encryption_metadata.<locals>._parse_permissions  sC    !W112*66q99''#A3&@A r8   /P)defaultNr1   /OE/UE/Perms/EncryptMetadataT/KDFSaltc                 r    t        | t        j                  t        j                  f      r| j                  S d S rL   )rD   r   r,  r-  r/  r0  s    r6   r   zDStandardSecurityHandler.gather_encryption_metadata.<locals>.<lambda>  s:    !G44g6N6NO $$ 
  r8   )	r   r   r   r   r  r  r  r   r  )r   r   r   KeyErrorr   r   r<   r(   dictget_and_applyallow_everythingr/  bool)r5   r&  r   r   r   r   r1  r4  s           r6   gather_encryption_metadataz2StandardSecurityHandler.gather_encryption_metadatan  sg    #&&y"5!O!-- DEE!	E &E &E	$'++ 	$ 	$	'"3"3 	8K 	  #11"+<<> 2 
 &&s+&&s+--eZ@--eZ@(66xL)77"D$ 8  "//	
 	
%  	E-- CDD	Es   
D D<c                     t        j                  |d         }t        j                  |d         }t        d||| j	                  |      d| j                  |      S )N/V/R)r   r   r   r?   )r"   r   rt   r   process_crypt_filtersrB  )r5   r&  vrs       r6   instantiate_from_pdf_objectz3StandardSecurityHandler.instantiate_from_pdf_object  si     #..|D/AB,88d9KL& 
 # 9 9, G
 ,,\:	
 	
r8   c                 4    t         |   xs | j                  S rL   )r   pdf_mac_enabledr%  )r}   r   s    r6   rK  z'StandardSecurityHandler.pdf_mac_enabled  s    w&<$*<*<<r8   c                    t        j                         }t        j                  d      |d<   t        j                  | j                        |d<   t        j                  | j
                        |d<   t        j                  | j                  j                               |d<   | j                  r"t        j                  | j                        |d<   | j                  s| j                  t        j                  k(  r%t        j                  | j                  dz        |d<   | j                  j                         |d	<   | j                   j                         |d
<   | j                  t        j                  kD  rKt        j"                  | j$                        |d<   |j'                  | j(                  j                                | j                   t*        j,                  k\  rft        j                  | j.                        |d<   t        j                  | j0                        |d<   t        j                  | j2                        |d<   |S )Nr   z/Filterr(  r)  r5  r;  rg   r   rD  rE  r:  r7  r8  r9  )r   DictionaryObjectr   r-  r   r   r|   r   	as_sint32	_kdf_salt_compat_entriesr   r"   r   r   r   r   BooleanObjectr   ri   r   rt   r   r  r  r  )r}   r   s     r6   r   z%StandardSecurityHandler.as_pdf_object  s   ))+#..{;y//

;t//

;t++DJJ,@,@,BCt>>!(!9!9$..!IF:   ||5EEE ' 4 4T[[1_ EF9||113t}}224t<<0@@@)0)>)>%%*F%& MM$22@@BC==<CCC#44T[[AF5M#44T[[AF5M&778L8LMF8r8   r   c           	      R   | j                   }| j                  }|t        j                  k(  r&t	        || j
                  | j                  |      \  }}nPt        ||j                  | j                  | j
                  | j                  || j                        \  }}|d d }|d d }||k(  |fS )NrR   )r   r   rt   r   r   r   r   r   rz   r   r   )r}   r   r@   r   
user_tokenuser_tok_suppliedrT   s          r6   _auth_user_password_legacyz2StandardSecurityHandler._auth_user_password_legacy  s    mmZZ
2<<<%7$**djj#&"s &9		



%%&"s !2#2 6#CRJ J.33r8   c                 2   t        ||d      }| j                  }t        ||j                  | j                        }|t
        j                  k(  rt        || j                        }n@| j                  }t        ddd      D ]"  t        fd|D              }t        ||      }$ |}| j                  ||      \  }	}|	r|| _        t        j                  |fS | j                  ||      \  }
}|
r|| _        t        j                  |fS t        j                   d fS )Nr      r   c              3   (   K   | ]	  }|z    y wrL   r?   )r`   ra   is     r6   rb   z?StandardSecurityHandler._authenticate_legacy.<locals>.<genexpr>  s     3!A3s   )r   r   r   rz   r   rt   r   r   r   ranger<   rU  r   r   OWNERUSERFAILED)r}   r   r@   credr   rT   prp_userpassr~   new_keyowner_passworduser_passwordrY  s              @r6   _authenticate_legacyz,StandardSecurityHandler._authenticate_legacy  s   "##FG mm)(CIIt{{K2<<<&sDJJ7L**C2r2& 03s33!'3/0 L"==c<P#D##S(( "<<S(Ks#D??C''  $&&r8   c                 H   t        |t              rt        j                  |      }t        |t        t
        t        f      s"t        j                  dt        |       d      t        |t              r|d   j                  }|d   j                  }| j                  }|t        j                  k\  r| j                  |      \  }}n7|t        j                  d      t        |      }| j!                  ||      \  }}||| _        nd| _        t'        || j(                        S )a  
        Authenticate a user to this security handler.

        :param credential:
            The credential to use (a password in this case).
        :param id1:
            First part of the document ID. This is mandatory for legacy
            encryption handlers, but meaningless otherwise.
        :return:
            An :class:`AuthResult` object indicating the level of access
            obtained.
        z]Standard authentication credential must be a string, byte string or _PasswordCredential, not .r   r   z+id1 must be specified for legacy encryptionT)statuspermission_flags)rD   r$   r#   deserialiser   rE   r<   r   r   r.  nativer   rt   r   _authenticate_r6r   rc  r   r   r   r   )r}   
credentialr   r   resrT   s         r6   authenticatez$StandardSecurityHandler.authenticate  s    j"67/;;JGJ*':C&GH##J'(+ 
 j"56U#**C#K077J mm2999,,Z8HC{''A  -Z8J00jAHC?"D $DtzzBBr8   c           
         t        |      }t        j                  | j                        }t        j                  | j                        }t        ||| j                        r3t        j                  }t        ||| j                  | j                        }nFt        ||      r(t        j                  }t        ||| j                        }nt        j                  d fS t        t        j                  |      t!        j"                               }|j%                         }|j'                  | j(                        |j+                         z   }	|	dd dk(  }
|
| j,                  t/        j0                  t3        j4                  d|	d d       d         k(  z  }
	 t6        |	d      }|
|| j8                  k(  z  }
|
st=        j>                  d	      tA        d
|i      | _!        ||fS # t:        $ r d}
Y :w xY w)N	      r  z<Irv   r   rg   FznFile decryption key didn't decrypt permission flags correctly -- file permissions may have been tampered with.r   )"rH   r*   r7   r   r   rO   r   r[  rY   r  r\  r  r]  r   r   r
  r   r  	decryptorri   r  r  r   r(   	from_uintstructunpack_EXPECTED_PERMS_8r   r=  r   r   r   r   )r}   r@   rI   o_entry_splitu_entry_splitr   rT   r  rq  decrypted_p_entryperms_okdecr_metadata_flags               r6   rj  z(StandardSecurityHandler._authenticate_r68  s   #H-#..tzz:#..tzz:$X}djjI%%F%-djjC 'x?__F%ht{{KC$$d** 
s+UYY[9$$&	T112Y5G5G5II 	
 %Qr*f4DJJ"5"?"?MM$ 1"1 56q9#
 
 	
	!23DQ3G!H*d.C.CCCH --M  /X/FGs{  	H	s   G G('G(c                 \    | j                   }|t        | j                  rd      d      |S )aQ  
        Retrieve the (global) file encryption key for this security handler.

        :return:
            The file encryption key as a :class:`bytes` object.
        :raise misc.PdfReadError:
            Raised if this security handler was instantiated from an encryption
            dictionary and no credential is available.
        zAuthentication failed.z7No key available to decrypt, please authenticate first.)r   r    r   )r}   rT   s     r6   r   z/StandardSecurityHandler.get_file_encryption_keyg  sF     ;)$$ )  O 
 
r8   )rw   )NNNTNTNrL   )+r9   r:   r;   r   r   r   r   r   r   r   r=   r>   rE   r   r(   r@  rt   r   rA  r  staticmethodr!  r"   r   r   r<   r$  rM  r>  rB  rI  r   rK  r   rU  rc  r   rm  r	   r   rj  r   r   r   s   @r6   r   r     s   	 	5!#F8$ '
 	8$ '
 	8$&O;')L
J$w113EEF 
 / / /  %I%8%I%I%K x-x #x xt  %I%8%I%I%Kz #	z z z zx  2 BF$(@"'@" 3@"
 (@" &&>?@" 5/@"D =
"33=
	=
 =
~ 

"33

 

 = = =84e 4,' '6 26*C'*C	*CZ-E*huo2M,N -^ r8   r   rL   )Qabcenumr  rs  dataclassesr   hashlibr   r   r   typingr   r   r	   r
   
asn1cryptor   &cryptography.hazmat.primitives.ciphersr   r   r   pyhanko.pdf_utilsr   r   _legacyr   r   r   r   r   _utilr   r   r   apir   r   r   r   r   r   r    r!   r"   cred_serr#   r$   filter_mixinsr%   r&   r'   permissionsr(   r*   rE   r<   rH   rO   rY   ru  rd   rM   uniqueVersionEnumrt   Sequencer   ABCr   r   r   r   r   r   r   r   r   rM  r   registerr   r?   r8   r6   <module>r     s)   
    ! * * / /  L L +  A @
 
 
 C 
 - C C CuS%Z0 U  EI..'.2:5/.  $	


 
 e_	
  u- /e / FJ#(3;E?
< :t'7'7 : :6Q$--)? Q*+sww >	02E 		 35K 		02E 	 
		H	%;$$; r	o r	 r	j      3 4r8   