Ë
    Éš§jÑ•  ã                   óX  — d dl Z d dlmZ d dlZ	 d dlmZ d dlmc m	Z
 d dlmZmZmZmZmZ dZdZdZdZdZd	Zd
ZdZdZe j6                  j8                  e j6                  j                  gZ e j<                  d¬«      d„ «       Z e j<                  d¬«      d„ «       Z  e j<                  d¬«      d„ «       Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&	 d7d„Z'd„ Z(d„ Z)d„ Z*d„ Z+d„ Z,d„ Z-d„ Z.d „ Z/d!„ Z0d"„ Z1d#„ Z2d$„ Z3d%„ Z4e j6                  jk                  d&¬'«      d(„ «       Z6d)„ Z7e j6                  jq                  d* e jr                  ddd+¬,«       e jr                  d-dd.¬,«       e jr                  dd-d/¬,«       e jr                  d-d-d0¬,«      g«      d1„ «       Z:d2„ Z;d3„ Z<d4„ Z= G d5„ d6«      Z>y# e$ r dZdZ
Y �Œ{w xY w)8é    N)Ú	timedelta)ÚInMemoryKmsClientÚMockVersioningKmsClientÚverify_file_encryptedÚread_external_keys_to_dictÚparse_wrapped_keyzencrypted_table.in_mem.parquets   0123456789112345Ú
footer_keys   1234567890123450Úcol_keys   0123456789abcdefs   0123456789abcdef01234567s    0123456789abcdef0123456789abcdefs   test_aad_prefixÚmodule)Úscopec                  óÊ   — t         j                  j                  t        j                  g d¢«      t        j                  g d¢«      t        j                  g d¢«      dœ«      } | S )N)é   é   é   )ÚaÚbÚc)ÚxÚyÚz)ÚpaÚTableÚfrom_pydictÚarray)Ú
data_tables    úhC:\Users\Luka\AppData\Local\Temp\pip-target-o84fipzb\lib\python\pyarrow/tests/parquet/test_encryption.pyr   r   7   sG   € ä—‘×%Ñ%Ü�X‰X’iÓ Ü�X‰X’oÓ&Ü�X‰X’oÓ&ñ'ó €Jð
 Ðó    c                  óL   — t        j                  t        t        ddgi¬«      } | S )Nr   r   )r	   Úcolumn_keys©ÚpeÚEncryptionConfigurationÚFOOTER_KEY_NAMEÚCOL_KEY_NAME)Úbasic_encryption_configs    r   r%   r%   A   s,   € ä ×8Ñ8Ü"ä˜3 ˜*ð
ôÐð
 #Ð"r   c                  óN   — t        j                  t        t        ddgid¬«      } | S )Nr   r   F)r	   r   Úinternal_key_materialr    )Úexternal_encryption_configs    r   r(   r(   K   s1   € ä!#×!;Ñ!;Ü"ä˜3 ˜*ð
ð $ô"%Ðð &Ð%r   c                 óf   — t        j                  | ¬«      }d„ }t        j                  |«      }||fS )z…
    Sets up and returns the KMS connection configuration and crypto factory
    based on provided KMS configuration parameters.
    ©Úcustom_kms_confc                 ó   — t        | «      S ©N©r   ©Úkms_connection_configurations    r   Úkms_factoryz1setup_encryption_environment.<locals>.kms_factory]   ó   € Ü Ð!=Ó>Ð>r   )r!   ÚKmsConnectionConfigÚCryptoFactory)r+   Úkms_connection_configr1   Úcrypto_factorys       r   Úsetup_encryption_environmentr7   V   s7   € ô
 ×2Ñ2À?ÔSÐò?ô ×%Ñ% kÓ2€Nà  .Ð0Ð0r   c                 óŒ   — ||j                  d«      ||j                  d«      i}t        |«      \  }}	t        | ||||	«       ||	fS )zL
    Writes an encrypted parquet file based on the provided parameters.
    úUTF-8)Údecoder7   Úwrite_encrypted_parquet)
Úpathr   Úfooter_key_nameÚcol_key_namer	   r
   Úencryption_configr+   r5   r6   s
             r   Úwrite_encrypted_filer@   f   sc   € ð 	˜×*Ñ*¨7Ó3Ø�g—n‘n WÓ-ð€Oô -IØó-Ñ)Ð˜>ô ˜D *Ð.?Ø1°>ôCð ! .Ð0Ð0r   c           	      óv  — | t         z  }t        j                  t        t        ddgidt        d¬«      d¬«      }|j                  du sJ ‚t        ||t        t        t        t        |«      \  }}t        |«       t        j                  t        d¬«      ¬	«      }t        ||||«      }|j                  |«      sJ ‚y
)úDWrite an encrypted parquet, verify it's encrypted, and then read it.r   r   Ú
AES_GCM_V1ç      @©Úminutesé   ©r	   r   Úencryption_algorithmÚcache_lifetimeÚdata_key_length_bitsF©rJ   N)ÚPARQUET_NAMEr!   r"   r#   r$   r   Úuniform_encryptionr@   Ú
FOOTER_KEYÚCOL_KEYr   ÚDecryptionConfigurationÚread_encrypted_parquetÚequals©Útempdirr   r<   r?   r5   r6   Údecryption_configÚresult_tables           r   Ú!test_encrypted_parquet_write_readrX   |   sÅ   € à”\Ñ!€Dô
 ×2Ñ2Ü"ä˜3 ˜*ð
ð *Ü ¨Ô-Ø ô"Ðð ×/Ñ/°5Ñ8Ð8Ð8ä,@Øˆjœ/¬<¼ÄWØó-Ñ)Ð˜>ô ˜$Ôô ×2Ñ2Ü ¨Ô-ô/Ðä)ØÐÐ!6¸óH€Là×Ñ˜\Ô*Ð*Ñ*r   c           	      ó^  — | t         z  }t        j                  t        ddt	        d¬«      d¬«      }|j
                  du sJ ‚t        ||t        t        t        d|«      \  }}t        |«       t        j                  t	        d¬«      ¬«      }t        ||||«      }|j                  |«      sJ ‚y	)
rB   TrC   rD   rE   rG   )r	   rN   rI   rJ   rK   r   rL   N)rM   r!   r"   r#   r   rN   r@   r$   rO   r   rQ   rR   rS   rT   s           r   Ú)test_uniform_encrypted_parquet_write_readrZ   ›   s¸   € à”\Ñ!€Dô ×2Ñ2Ü"ØØ)Ü ¨Ô-Ø ô"Ðð ×/Ñ/°4Ñ7Ð7Ð7ä,@Øˆjœ/¬<¼ÀSØó-Ñ)Ð˜>ô ˜$Ôô ×2Ñ2Ü ¨Ô-ô/Ðä)ØÐÐ!6¸óH€Là×Ñ˜\Ô*Ð*Ñ*r   c                 ó   — |j                   r|j                  ||«      }n|j                  ||| «      }|€J ‚t        j                  | |j                  |¬«      5 }|j                  |«       d d d «       y # 1 sw Y   y xY w)N©Úencryption_properties)r'   Úfile_encryption_propertiesÚpqÚParquetWriterÚschemaÚwrite_table)r<   Útabler?   r5   r6   r^   Úwriters          r   r;   r;   ¶   s„   € à×.Ò.Ø%3×%NÑ%NØ!Ð#4ó&6Ñ"ð &4×%NÑ%NØ!Ð#4°dó&<Ð"à%Ð1Ð1Ð1Ü	×	Ñ	Ø�%—,‘,Ø"<õ
>àAGØ×Ñ˜5Ô!÷
>÷ 
>ñ 
>ús   ÁA4Á4A=Tc                 ó^  — |r|j                  ||«      }n|j                  ||| «      }|€J ‚t        j                  | |¬«      }|j                  dk(  sJ ‚t        j                  | |¬«      }t        |j                  «      dk(  sJ ‚t        j                  | |¬«      }|j                  d¬«      S )N©Údecryption_propertiesr   T©Úuse_threads)	Úfile_decryption_propertiesr_   Úread_metadataÚnum_columnsÚread_schemaÚlenÚnamesÚParquetFileÚread)	r<   rV   r5   r6   r'   rj   Úmetara   Úresults	            r   rR   rR   Å   sÄ   € ñ Ø%3×%NÑ%NØ!Ð#4ó&6Ñ"ð &4×%NÑ%NØ!Ð#4°dó&<Ð"ð &Ð1Ð1Ð1Ü×ÑØÐ$>ô@€Dà×Ñ˜qÒ Ð Ð Ü�^‰^ØÐ$>ô@€Fäˆv�|‰|Ó Ò!Ð!Ð!ä�^‰^ØÐ$>ô@€Fà�;‰; 4ˆ;Ó(Ð(r   c           	      ó
  — | t         z  }t        j                  t        t        ddgidt        d¬«      d¬«      }t        ||t        t        t        t        |«       t        |«       t        t        t        j                  d«      t        t        j                  d«      i«      \  }}t        j                  t        d¬«      ¬	«      }t        j                  t        d
¬«      5  t!        ||||«       ddd«       y# 1 sw Y   yxY w)zYWrite an encrypted parquet, verify it's encrypted,
    and then read it using wrong keys.r   r   rC   rD   rE   rG   rH   r9   rL   zIncorrect master key used©ÚmatchN)rM   r!   r"   r#   r$   r   r@   rO   rP   r   r7   r:   rQ   ÚpytestÚraisesÚ
ValueErrorrR   )rU   r   r<   r?   Úwrong_kms_connection_configÚwrong_crypto_factoryrV   s          r   Ú+test_encrypted_parquet_write_read_wrong_keyr|   Ü   sç   € ð ”\Ñ!€Dô
 ×2Ñ2Ü"ä˜3 ˜*ð
ð *Ü ¨Ô-Ø ô"Ðô ˜˜z¬?¼LÜ#¤WÐ.?ôAô ˜$Ôä8TÜœŸ™¨Ó0Ü”j×'Ñ'¨Ó0ðVó 9Ñ5ÐÐ!5ô
 ×2Ñ2Ü ¨Ô-ô/Ðä	�‰”zÐ)EÖ	FÜØÐ#Ð%@Ø ô	"÷ 
G×	FÑ	Fús   Ã!C9Ã9Dc                 óÐ   — t        | |«       t        j                  t        d¬«      5  t	        j
                  | t        z  «      j                  «        ddd«       y# 1 sw Y   yxY w)zmWrite an encrypted parquet, verify it's encrypted,
    but then try to read it without decryption properties.úno decryptionru   N)rX   rw   rx   ÚIOErrorr_   rp   rM   rq   ©rU   r   s     r   Ú0test_encrypted_parquet_read_no_decryption_configr�   ÿ   sC   € ô & g¨zÔ:ä	�‰”wÐ&6Ö	7Ü
�‰�w¤Ñ-Ó.×3Ñ3Ô5÷ 
8×	7Ñ	7ús   ¨+AÁA%c                 ó´   — t        | |«       t        j                  t        d¬«      5  t	        j
                  | t        z  «       ddd«       y# 1 sw Y   yxY w)zwWrite an encrypted parquet, verify it's encrypted,
    but then try to read its metadata without decryption properties.r~   ru   N)rX   rw   rx   r   r_   rk   rM   r€   s     r   Ú9test_encrypted_parquet_read_metadata_no_decryption_configrƒ     s<   € ô & g¨zÔ:ä	�‰”wÐ&6Ö	7Ü
×Ñ˜¤<Ñ/Ô0÷ 
8×	7Ñ	7úó   ¨AÁAc                 ó´   — t        | |«       t        j                  t        d¬«      5  t	        j
                  | t        z  «       ddd«       y# 1 sw Y   yxY w)zuWrite an encrypted parquet, verify it's encrypted,
    but then try to read its schema without decryption properties.r~   ru   N)rX   rw   rx   r   r_   rm   rM   r€   s     r   Ú7test_encrypted_parquet_read_schema_no_decryption_configr†     s:   € ô & g¨zÔ:Ü	�‰”wÐ&6Ö	7Ü
�‰�w¤Ñ-Ô.÷ 
8×	7Ñ	7úr„   c           
      óÜ   — | dz  }t        j                  t        ¬«      }t        j                  t
        d¬«      5  t        ||t        t        t        d|«       ddd«       y# 1 sw Y   yxY w)úMWrite an encrypted parquet, but give only footer key,
    without column key.z)encrypted_table_no_col_key.in_mem.parquet©r	   z4Either column_keys or uniform_encryption must be setru   r   N)	r!   r"   r#   rw   rx   ÚOSErrorr@   r$   rO   ©rU   r   r<   r?   s       r   Ú'test_encrypted_parquet_write_no_col_keyrŒ     se   € ð Ð@Ñ@€Dô ×2Ñ2Ü"ô$Ðô 
�‰”wð%ö
&ô 	˜T :¬ÄÜ'¨Ð.?ô	A÷	
&÷ 
&ñ 
&ús   »A"Á"A+c           
      óð   — | dz  }t        j                  t        t        ddgid¬«      }t	        j
                  t        d¬«      5  t        ||t        t        t        d|«       d	d	d	«       y	# 1 sw Y   y	xY w)
rˆ   z=encrypted_table_col_key_and_uniform_encryption.in_mem.parquetr   r   T)r	   r   rN   z2Cannot set both column_keys and uniform_encryptionru   r   N)	r!   r"   r#   r$   rw   rx   rŠ   r@   rO   r‹   s       r   Ú;test_encrypted_parquet_write_col_key_and_uniform_encryptionrŽ   ,  sz   € ð ÐTÑT€Dô ×2Ñ2Ü"ä˜3 ˜*ð
ð  ô!Ðô 
�‰”wØRö
Tô 	˜T :¬ÄÜ'¨Ð.?ô	A÷
T÷ 
Tñ 
Tús   ÁA,Á,A5c                 óè   — | dz  }|}t        j                  «       }d„ }t        j                  |«      }t        j                  t
        d¬«      5  t        |||||«       ddd«       y# 1 sw Y   yxY w)ú<Write an encrypted parquet, but raise KeyError in KmsClient.ú(encrypted_table_kms_error.in_mem.parquetc                 ó   — t        | «      S r-   r.   r/   s    r   r1   z;test_encrypted_parquet_write_kms_error.<locals>.kms_factoryI  s   € ô !Ð!=Ó>Ð>r   r	   ru   N)r!   r3   r4   rw   rx   ÚKeyErrorr;   ©rU   r   r%   r<   r?   r5   r1   r6   s           r   Ú&test_encrypted_parquet_write_kms_errorr•   @  sl   € ð Ð?Ñ?€DØ/Ðô ×2Ñ2Ó4Ðò?ô
 ×%Ñ% kÓ2€NÜ	�‰”x |Ö	4ä  jÐ2CØ 5°~ô	G÷ 
5×	4Ñ	4úó   ÁA(Á(A1c                 ó   ‡— | dz  }|}t        j                  «       } G d„ dt         j                  «      Šˆfd„}t        j                  |«      }t	        j
                  t        d¬«      5  t        |||||«       ddd«       y# 1 sw Y   yxY w)r�   r‘   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)úJtest_encrypted_parquet_write_kms_specific_error.<locals>.ThrowingKmsClientzVA KmsClient implementation that throws exception in
        wrap/unwrap calls
        c                 óP   — t         j                  j                  | «       || _        y)z%Create an InMemoryKmsClient instance.N)r!   Ú	KmsClientÚ__init__Úconfig©Úselfr�   s     r   rœ   zStest_encrypted_parquet_write_kms_specific_error.<locals>.ThrowingKmsClient.__init__c  s   € ä�L‰L×!Ñ! $Ô'Ø ˆD�Kr   c                 ó   — t        d«      ‚)NúCannot Wrap Key©ry   ©rŸ   Ú	key_bytesÚmaster_key_identifiers      r   Úwrap_keyzStest_encrypted_parquet_write_kms_specific_error.<locals>.ThrowingKmsClient.wrap_keyh  s   € ÜÐ.Ó/Ð/r   c                 ó   — t        d«      ‚)NzCannot Unwrap Keyr¢   ©rŸ   Úwrapped_keyr¥   s      r   Ú
unwrap_keyzUtest_encrypted_parquet_write_kms_specific_error.<locals>.ThrowingKmsClient.unwrap_keyk  s   € ÜÐ0Ó1Ð1r   N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__rœ   r¦   rª   © r   r   ÚThrowingKmsClientr™   ^  s   „ ñ	ò	!ò
	0ó	2r   r±   c                 ó   •—  ‰| «      S r-   r°   )r0   r±   s    €r   r1   zDtest_encrypted_parquet_write_kms_specific_error.<locals>.kms_factoryn  s   ø€ á Ð!=Ó>Ð>r   r¡   ru   N)r!   r3   r›   r4   rw   rx   ry   r;   )	rU   r   r%   r<   r?   r5   r1   r6   r±   s	           @r   Ú/test_encrypted_parquet_write_kms_specific_errorr³   U  s~   ø€ ð Ð?Ñ?€DØ/Ðô ×2Ñ2Ó4Ðô2œBŸL™Lô 2ô ?ô ×%Ñ% kÓ2€NÜ	�‰”zÐ):Ö	;ä  jÐ2CØ 5°~ô	G÷ 
<×	;Ñ	;ús   Á+BÂBc                 óè   — | dz  }|}t        j                  «       }d„ }t        j                  |«      }t        j                  t
        d¬«      5  t        |||||«       ddd«       y# 1 sw Y   yxY w)z@Write an encrypted parquet, but raise ValueError in kms_factory.ú0encrypted_table_kms_factory_error.in_mem.parquetc                 ó   — t        d«      ‚)NúCannot create KmsClientr¢   r/   s    r   r1   zCtest_encrypted_parquet_write_kms_factory_error.<locals>.kms_factory‚  s   € ÜÐ2Ó3Ð3r   r·   ru   N)r!   r3   r4   rw   rx   ry   r;   r”   s           r   Ú.test_encrypted_parquet_write_kms_factory_errorr¸   y  su   € ð ÐGÑG€DØ/Ðô ×2Ñ2Ó4Ðò4ô ×%Ñ% kÓ2€NÜ	�‰”zØ6ö
8ô 	   jÐ2CØ 5°~ô	G÷
8÷ 
8ñ 
8úr–   c                 óþ   ‡— | dz  }|}t        j                  «       } G d„ d«      Šˆfd„}t        j                  |«      }t        j                  t
        «      5  t        |||||«       ddd«       y# 1 sw Y   yxY w)z_Write an encrypted parquet, but use wrong KMS client type
    that doesn't implement KmsClient.rµ   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)úOtest_encrypted_parquet_write_kms_factory_type_error.<locals>.WrongTypeKmsClientz4This is not an implementation of KmsClient.
        c                 ó&   — |j                   | _        y r-   )r+   Úmaster_keys_maprž   s     r   rœ   zXtest_encrypted_parquet_write_kms_factory_type_error.<locals>.WrongTypeKmsClient.__init__›  s   € Ø#)×#9Ñ#9ˆDÕ r   c                  ó   — y r-   r°   r£   s      r   r¦   zXtest_encrypted_parquet_write_kms_factory_type_error.<locals>.WrongTypeKmsClient.wrap_keyž  ó   € Ør   c                  ó   — y r-   r°   r¨   s      r   rª   zZtest_encrypted_parquet_write_kms_factory_type_error.<locals>.WrongTypeKmsClient.unwrap_key¡  r¿   r   Nr«   r°   r   r   ÚWrongTypeKmsClientr»   —  s   „ ñ	ò	:ò	ó	r   rÁ   c                 ó   •—  ‰| «      S r-   r°   )r0   rÁ   s    €r   r1   zHtest_encrypted_parquet_write_kms_factory_type_error.<locals>.kms_factory¤  s   ø€ Ù!Ð">Ó?Ð?r   N)r!   r3   r4   rw   rx   Ú	TypeErrorr;   )	rU   r   r%   r<   r?   r5   r1   r6   rÁ   s	           @r   Ú3test_encrypted_parquet_write_kms_factory_type_errorrÄ   �  sv   ø€ ð ÐGÑG€DØ/Ðô ×2Ñ2Ó4Ð÷ñ ô@ô ×%Ñ% kÓ2€NÜ	�‰”yÕ	!ä  jÐ2CØ 5°~ô	G÷ 
"×	!Ñ	!ús   ÁA3Á3A<c            
      óJ  — d„ } t        j                  t        t        ddgidddt	        d¬«      dd	¬
«      } | |«       t        j                  t        ¬«      }t        ddgi|_        d|_        d|_        d|_        t	        d¬«      |_	        d|_
        d	|_         | |«       y )Nc                 ó0  — t         | j                  k(  sJ ‚ddg| j                  t           k(  sJ ‚d| j                  k(  sJ ‚| j
                  sJ ‚| j                  rJ ‚t        d¬«      | j                  k(  sJ ‚| j                  rJ ‚d| j                  k(  sJ ‚y )Nr   r   ÚAES_GCM_CTR_V1ç      $@rE   éÀ   )r#   r	   r   r$   rI   Úplaintext_footerÚdouble_wrappingr   rJ   r'   rK   )r?   s    r   Ú!validate_encryption_configurationzZtest_encrypted_parquet_encryption_configuration.<locals>.validate_encryption_configuration¯  s¦   € ÜÐ"3×">Ñ">Ò>Ð>Ð>Ø�SˆzÐ.×:Ñ:¼<ÑHÒHÐHÐHØÐ#4×#IÑ#IÒIÐIÐIØ ×1Ò1Ð1Ð1Ø$×4Ò4Ð4Ð4Ü Ô&Ð*;×*JÑ*JÒJÐJÐJØ$×:Ò:Ð:Ð:ØÐ'×<Ñ<Ò<Ð<Ñ<r   r   r   rÇ   TFrÈ   rE   rÉ   )r	   r   rI   rÊ   rË   rJ   r'   rK   r‰   )r!   r"   r#   r$   r   r   rI   rÊ   rË   rJ   r'   rK   )rÌ   r?   Úencryption_config_1s      r   Ú/test_encrypted_parquet_encryption_configurationrÎ   ®  sµ   € ò=ô ×2Ñ2Ü"Ü! C¨ :Ð0Ø-ØØÜ ¨Ô.Ø#Ø ô	Ðñ &Ð&7Ô8ä×4Ñ4Ü"ô$Ðä'3°c¸3°ZÐ&BÐÔ#Ø/?ÐÔ,Ø+/ÐÔ(Ø*/ÐÔ'Ü)2¸4Ô)@ÐÔ&Ø05ÐÔ-Ø/2ÐÔ,Ù%Ð&9Õ:r   c                  óú   — t        j                  t        d¬«      ¬«      } t        d¬«      | j                  k(  sJ ‚t        j                  «       }t        d¬«      |_        t        d¬«      |j                  k(  sJ ‚y )NrÈ   rE   rL   )r!   rQ   r   rJ   )rV   Údecryption_config_1s     r   Ú/test_encrypted_parquet_decryption_configurationrÑ   Ñ  sl   € Ü×2Ñ2Ü ¨Ô.ô0Ðä˜TÔ"Ð&7×&FÑ&FÒFÐFÐFä×4Ñ4Ó6ÐÜ)2¸4Ô)@ÐÔ&Ü˜TÔ"Ð&9×&HÑ&HÒHÐHÑHr   c                  óÈ   — d„ } t        j                  ddddddœ¬«      } | |«       t        j                  «       }d|_        d|_        d|_        dddœ|_         | |«       y )	Nc                 ó’   — d| j                   k(  sJ ‚d| j                  k(  sJ ‚d| j                  k(  sJ ‚dddœ| j                  k(  sJ ‚y )NÚ	Instance1ÚURL1ÚMyTokenÚkey_material_1Úkey_material_2©Úkey1Úkey2©Úkms_instance_idÚkms_instance_urlÚkey_access_tokenr+   )r5   s    r   Úvalidate_kms_connection_configzPtest_encrypted_parquet_kms_configuration.<locals>.validate_kms_connection_configÜ  sb   € ØÐ3×CÑCÒCÐCÐCØÐ.×?Ñ?Ò?Ð?Ð?ØÐ1×BÑBÒBÐBÐBØ)Ð3CÑDØ%×5Ñ5ò6ð 	7ñ 6r   rÔ   rÕ   rÖ   r×   rØ   rÙ   rÜ   )r!   r3   rÝ   rÞ   rß   r+   )rà   r5   Úkms_connection_config_1s      r   Ú(test_encrypted_parquet_kms_configurationrâ   Û  s   € ò7ô ×2Ñ2Ø#ØØ"à$Ø$ñ
ô	Ðñ #Ð#8Ô9ä ×4Ñ4Ó6ÐØ.9ÐÔ+Ø/5ÐÔ,Ø/8ÐÔ,à Ø ñ/ÐÔ+ñ #Ð#:Õ;r   zNPlaintext footer - reading plaintext column subset reads encrypted columns too)Úreasonc                 ó>  — | t         z  }t        j                  t        t        ddgidd¬«      }t        j
                  t        t        j                  d«      t        t        j                  d«      i¬«      }d„ }t        j                  |«      }t        |||||«       y	)
z‹Write an encrypted parquet, with plaintext footer
    and with single wrapping,
    verify it's encrypted, and then read plaintext columns.r   r   TF)r	   r   rÊ   rË   r9   r*   c                 ó   — t        | «      S r-   r.   r/   s    r   r1   zStest_encrypted_parquet_write_read_plain_footer_single_wrapping.<locals>.kms_factory  r2   r   N)rM   r!   r"   r#   r$   r3   rO   r:   rP   r4   r;   )rU   r   r<   r?   r5   r1   r6   s          r   Ú>test_encrypted_parquet_write_read_plain_footer_single_wrappingræ   ø  sœ   € ð ”\Ñ!€Dô
 ×2Ñ2Ü"ä˜3 ˜*ð
ð ØôÐô ×2Ñ2äœZ×.Ñ.¨wÓ7Üœ'Ÿ.™.¨Ó1ð
ôÐò?ô ×%Ñ% kÓ2€Nä˜D *Ð.?Ø1°>õCr   c           	      ó  — | t         z  }t        ||t        t        t        t
        |«      \  }}t        |«       t        j                  «       }t        ||||d¬«      }t        j                  j                  j                  |«      }t        |j                  «       x}	«      t        |j                   t           «      dz   k(  sJ ‚t#        |	D �
cg c]  }
|j%                  |
«      du‘Œ c}
«      sJ ‚|j'                  |«      sJ ‚yc c}
w )zˆWrite an encrypted parquet file with external key material, verify
    it's encrypted, then read both the table and external store.
    F©r'   r   N)rM   r@   r#   r$   rO   rP   r   r!   rQ   rR   r   Ú_parquet_encryptionÚFileSystemKeyMaterialStoreÚfor_filern   Úget_key_id_setr   ÚallÚget_key_materialrS   )rU   r   r(   r<   r5   r6   rV   rW   ÚstoreÚkey_idsÚks              r   Ú*test_encrypted_parquet_write_read_externalrò   !  s  € ð
 ”\Ñ!€Dä,@Øˆjœ/¬<¼ÄWØ"ó-$Ñ)Ð˜>ô ˜$Ôä×2Ñ2Ó4ÐÜ)ØÐÐ!6¸Ø#ô%€Lô ×"Ñ"×=Ñ=×FÑFÀtÓL€Eä˜%×.Ñ.Ó0Ð0ˆwÓ1ÜÐ&×2Ñ2´<Ñ@ÓAÀAÑEòGð Gð Gä¹wÓG¹w¸!�×&Ñ& qÓ)°Ò5¸wÑGÔHÐHÐHØ×Ñ˜\Ô*Ð*Ñ*ùò Hs   ÃD)Údouble_wrap_initialÚdouble_wrap_rotatedzdouble wrapping)ÚidFzsingle to double wrappedzdouble to singe wrappedzsingle wrappingc                 óz  ‡‡‡‡— | t         z  }t        j                  t        t        ddgid‰¬«      }t        j
                  d¬«      }d„ }t        j                  |«      }t        |||||«       t        |«      Š|j                  d«       |j                  ||‰¬	«       t        |«      Št        |«       t        |t        j                  «       ||d¬
«      }	t        ‰v sJ ‚t        ‰v sJ ‚t        ‰v sJ ‚t        ‰v sJ ‚dt        ddfˆˆˆˆfd„}
 |
t        «        |
t        «       |j                  |	«      sJ ‚y)a£  Tests CryptoFactory.rotate_master_keys

    Note: The CryptoFactory.rotate_master_keys() double_wrapping keword arg
    may be either True (the default) or False regardless of whether
    EncryptionConfig.double_wrapping was set to true (also the default) when
    the external key material store was written. This means double wrapping may
    be set one way initially and then applied or removed during rotation.
    r   r   F)r	   r   r'   rË   Ú1)rß   c                 ó   — t        | «      S r-   )r   r/   s    r   r1   z8test_external_key_material_rotation.<locals>.kms_factoryW  s   € Ü&Ð'CÓDÐDr   Ú2)rË   rè   Úmaster_key_idÚreturnNc                 óÐ   •— ‰	|    }‰
r|j                   }n|j                  }t        |«      \  }}}‰|    }‰r|j                   }n|j                  }t        |«      \  }}}||k  sJ ‚y r-   )Úwrapped_kekÚwrapped_dekr   )rú   Úbefore_key_matÚbefore_key_wrappedÚ_Ú
before_verÚafter_key_matÚafter_key_wrappedÚ	after_verÚ
after_keysÚbefore_keysró   rô   s           €€€€r   Úcheck_rotated_external_keyszHtest_external_key_material_rotation.<locals>.check_rotated_external_keysw  s€   ø€ Ø$ ]Ñ3ˆÙØ!/×!;Ñ!;Ñà!/×!;Ñ!;ÐÜ,Ð-?Ó@Ñˆˆ:�qà" =Ñ1ˆÙØ -× 9Ñ 9Ñà -× 9Ñ 9ÐÜ+Ð,=Ó>‰ˆˆ9�að ˜IÒ%Ð%Ñ%r   )rM   r!   r"   r#   r$   r3   r4   r;   r   Úrefresh_key_access_tokenÚrotate_master_keysr   rR   rQ   ÚstrrS   )Úreusable_tempdirr   ró   rô   r<   r?   r5   r1   r6   Útable_read_after_rotationr  r  r  s     ``       @@r   Ú#test_external_key_material_rotationr  :  s]  û€ ð& œlÑ*€DÜ×2Ñ2Ü"Ü! C¨ :Ð.Ø#Ø+ô	-Ðô ×2Ñ2ÀCÔHÐòEä×%Ñ% kÓ2€NÜØØØØØôô -¨TÓ2€Kð ×2Ñ2°3Ô7à×%Ñ%ØØØ+ð &ô -ô
 ,¨DÓ1€JÜ˜$ÔÜ 6ØÜ
×"Ñ"Ó$ØØØ#ô!%Ðô ˜kÑ)Ð)Ð)Ü˜;Ñ&Ð&Ð&Ü˜jÑ(Ð(Ð(Ü˜:Ñ%Ð%Ð%ð&´3ð &¸4÷ &ð &ñ"  ¤Ô0Ù¤Ô-Ø×ÑÐ6Ô7Ð7Ñ7r   c           	      óx  — | t         z  }t        ||t        t        t        t
        |«      \  }}t        |«       t        j                  t        d¬«      ¬«      }t        d«      D ]T  }|j                  ||«      }|€J ‚t        j                  ||¬«      }	|	j                  d¬«      }
|j                  |
«      rŒTJ ‚ y)	z`Write an encrypted parquet, verify it's encrypted,
    and then read it multithreaded in a loop.rD   rE   rL   é2   Nrf   Trh   )rM   r@   r#   r$   rO   rP   r   r!   rQ   r   Úrangerj   r_   rp   rq   rS   )rU   r   r%   r<   r5   r6   rV   Úirj   rs   rW   s              r   Útest_encrypted_parquet_loopr  �  sÀ   € ð ”\Ñ!€Dô
 -AØˆjœ/¬<¼ÄWØó-!Ñ)Ð˜>ô ˜$Ôä×2Ñ2Ü ¨Ô-ô/Ðô �2ŽYˆà%3×%NÑ%NØ!Ð#4ó&6Ð"à)Ð5Ð5Ð5ä—‘ØÐ(BôDˆà—{‘{¨t�{Ó4ˆØ× Ñ  Õ.Ð.Ð.ñ r   c           	      óR  — | t         z  }t        ||t        t        t        t
        |«      \  }}t        |«       t        j                  t        d¬«      ¬«      }|j                  ||«      }~t        j                  ||¬«      }|j                  d¬«      }	|j                  |	«      sJ ‚y)z^
    Test that decryption properties can be used if the crypto factory is no longer alive
    rD   rE   rL   rf   Trh   N)rM   r@   r#   r$   rO   rP   r   r!   rQ   r   rj   r_   rp   rq   rS   )
rU   r   r%   r<   r5   r6   rV   rj   rs   rW   s
             r   Ú%test_read_with_deleted_crypto_factoryr  ª  s¦   € ð ”\Ñ!€DÜ,@Øˆjœ/¬<¼ÄWØó-!Ñ)Ð˜>ô ˜$Ôô ×2Ñ2Ü ¨Ô-ô/Ðà!/×!JÑ!JØÐ0ó"2Ðàä�^‰^ØÐ$>ô@€Fà—;‘;¨4�;Ó0€LØ×Ñ˜\Ô*Ð*Ñ*r   c           	      ój  — | t         z  }t        ||t        t        t        t
        |«      \  }}t        j                  t        d¬«      ¬«      }|j                  ||«      }t        j                  ||¬«      }|j                  |«      sJ ‚t        j                  | |¬«      }|j                  |«      sJ ‚y)z>Write an encrypted parquet then read it back using read_table.rD   rE   rL   rf   N)rM   r@   r#   r$   rO   rP   r!   rQ   r   rj   r_   Ú
read_tablerS   )	rU   r   r%   r<   r5   r6   rV   rj   rW   s	            r   Ú!test_encrypted_parquet_read_tabler  Â  sµ   € à”\Ñ!€Dô -AØˆjœ/¬<¼ÄWØó-!Ñ)Ð˜>ô ×2Ñ2Ü ¨Ô-ô/Ðà!/×!JÑ!JØÐ0ó"2Ðô —=‘= Ð=WÔX€Lð ×Ñ˜\Ô*Ð*Ð*ô —=‘=ØÐ'AôC€Là×Ñ˜\Ô*Ð*Ñ*r   c                   óÂ   — e Zd ZdZej
                  j                  deee	gg d¢¬«      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d„ Zd„ Zy)ÚTestDirectKeyEncryptionzFTests for create_encryption_properties / create_decryption_properties.Úkey)Úaes128Úaes192Úaes256)Úidsc                 ó
  — |dt        |«      dz  › d�z  }t        j                  |¬«      }t        j                  |||¬«       t        j
                  |¬«      }t        j                  ||¬«      }|j                  |«      sJ ‚y )NÚdirect_é   z.parquetr‰   r\   rf   )rn   r!   Úcreate_encryption_propertiesr_   rb   Úcreate_decryption_propertiesr  rS   )rŸ   rU   r   r  r<   Ú	enc_propsÚ	dec_propsrs   s           r   Útest_roundtrip_key_sizesz0TestDirectKeyEncryption.test_roundtrip_key_sizesß  ss   € ð ˜7¤3 s£8¨a¡< .°Ð9Ñ9ˆä×3Ñ3¸sÔCˆ	Ü
�‰�z 4¸yÕIä×3Ñ3¸sÔCˆ	Ü—‘˜t¸9ÔEˆØ× Ñ  Ô(Ð(Ñ(r   c                 ó  — |dz  }t        j                  t        t        ¬«      }t	        j
                  |||¬«       t        j                  t        t        ¬«      }t	        j                  ||¬«      }|j                  |«      sJ ‚y )Nzdirect_aad.parquet©r	   Ú
aad_prefixr\   rf   )	r!   r#  ÚDIRECT_KEY_128ÚDIRECT_AAD_PREFIXr_   rb   r$  r  rS   ©rŸ   rU   r   r<   r%  r&  rs   s          r   Útest_roundtrip_with_aad_prefixz6TestDirectKeyEncryption.test_roundtrip_with_aad_prefixì  sq   € ØÐ-Ñ-ˆä×3Ñ3Ü%Ü(ô
ˆ	ô 	�‰�z 4¸yÕIä×3Ñ3Ü%Ü(ô
ˆ	ô —‘˜t¸9ÔEˆØ× Ñ  Ô(Ð(Ñ(r   c                 óÒ  — |dz  }t        j                  t        t        d¬«      }t	        j
                  |||¬«       t        j                  t        ¬«      }t        j                  t        d¬«      5  t	        j                  ||¬«       d	d	d	«       t        j                  t        t        ¬
«      }t	        j                  ||¬«      }|j                  |«      sJ ‚y	# 1 sw Y   ŒSxY w)z;When store_aad_prefix=False, reader must supply aad_prefix.zdirect_aad_not_stored.parquetF)r	   r*  Ústore_aad_prefixr\   r‰   ÚAADru   rf   Nr)  )r!   r#  r+  r,  r_   rb   r$  rw   rx   r   r  rS   )rŸ   rU   r   r<   r%  Údec_props_no_aadr&  rs   s           r   Ú$test_roundtrip_aad_prefix_not_storedz<TestDirectKeyEncryption.test_roundtrip_aad_prefix_not_storedü  s¹   € àÐ8Ñ8ˆä×3Ñ3Ü%Ü(Ø"ô
ˆ	ô
 	�‰�z 4¸yÕIô ×:Ñ:Ü%ô
Ðô �]‰]œ7¨%Ö0Ü�M‰M˜$Ð6FÕG÷ 1ô ×3Ñ3Ü%Ü(ô
ˆ	ô —‘˜t¸9ÔEˆØ× Ñ  Ô(Ð(Ñ(÷ 1Ð0ús   Á3CÃC&c                 ó@  — |dz  }t        j                  t        t        ¬«      }t	        j
                  |||¬«       t        j                  t        d¬«      }t        j                  t        d¬«      5  t	        j                  ||¬«       d d d «       y # 1 sw Y   y xY w)Nzdirect_wrong_aad.parquetr)  r\   s   wrong_prefixr1  ru   rf   )r!   r#  r+  r,  r_   rb   r$  rw   rx   r   r  )rŸ   rU   r   r<   r%  r&  s         r   Útest_wrong_aad_prefix_failsz3TestDirectKeyEncryption.test_wrong_aad_prefix_fails  su   € ØÐ3Ñ3ˆä×3Ñ3Ü%Ü(ô
ˆ	ô 	�‰�z 4¸yÕIä×3Ñ3Ü%Ø&ô
ˆ	ô �]‰]œ7¨%Ö0Ü�M‰M˜$°iÕ@÷ 1×0Ñ0ús   Á3BÂBc                 óä   — |dz  }t        j                  t        ¬«      }t        j                  |||¬«       t        |d«      5 }|j                  d«      }d d d «       dk(  sJ ‚y # 1 sw Y   ŒxY w)Nzdirect_magic.parquetr‰   r\   Úrbé   s   PARE©r!   r#  r+  r_   rb   Úopenrq   ©rŸ   rU   r   r<   r%  ÚfÚmagics          r   Ú"test_encrypted_file_has_pare_magicz:TestDirectKeyEncryption.test_encrypted_file_has_pare_magic&  se   € ØÐ/Ñ/ˆä×3Ñ3Ü%ô'ˆ	ä
�‰�z 4¸yÕIä�$˜Ô Ø—F‘F˜1“IˆE÷ à˜ÒÐÑ÷ Ðús   ÁA&Á&A/c                 óü   — |dz  }t        j                  t        d¬«      }t        j                  |||¬«       t        j
                  t        ¬«      }t        j                  ||¬«      }|j                  |«      sJ ‚y )Nzdirect_plaintext_footer.parquetT©r	   rÊ   r\   r‰   rf   ©r!   r#  r+  r_   rb   r$  r  rS   r-  s          r   Útest_plaintext_footerz-TestDirectKeyEncryption.test_plaintext_footer1  sl   € ØÐ:Ñ:ˆä×3Ñ3Ü%Ø!ô
ˆ	ô 	�‰�z 4¸yÕIä×3Ñ3Ü%ô'ˆ	ä—‘˜t¸9ÔEˆØ× Ñ  Ô(Ð(Ñ(r   c                 óü   — |dz  }t        j                  t        d¬«      }t        j                  |||¬«       t        j
                  t        ¬«      }t        j                  ||¬«      }|j                  |«      sJ ‚y )Nzdirect_ctr.parquetrÇ   ©r	   rI   r\   r‰   rf   rA  r-  s          r   Útest_aes_gcm_ctr_v1_algorithmz5TestDirectKeyEncryption.test_aes_gcm_ctr_v1_algorithm?  sl   € ØÐ-Ñ-ˆä×3Ñ3Ü%Ø!1ô
ˆ	ô 	�‰�z 4¸yÕIä×3Ñ3Ü%ô'ˆ	ä—‘˜t¸9ÔEˆØ× Ñ  Ô(Ð(Ñ(r   c                 ó0  — |dz  }t        j                  t        ¬«      }t        j                  |||¬«       d}t        j
                  |¬«      }t        j                  t        d¬«      5  t        j                  ||¬«       d d d «       y # 1 sw Y   y xY w)Nzdirect_wrong_key.parquetr‰   r\   s   fedcba9876543210Údecryptru   rf   )
r!   r#  r+  r_   rb   r$  rw   rx   r   r  )rŸ   rU   r   r<   r%  Ú	wrong_keyr&  s          r   Útest_wrong_key_failsz,TestDirectKeyEncryption.test_wrong_key_failsM  sm   € ØÐ3Ñ3ˆä×3Ñ3Ü%ô'ˆ	ä
�‰�z 4¸yÕIà'ˆ	Ü×3Ñ3¸yÔIˆ	Ü�]‰]œ7¨)Ö4Ü�M‰M˜$°iÕ@÷ 5×4Ñ4ús   Á+BÂBc                 óü   — |dz  }t        j                  t        ¬«      }t        j                  |||¬«       t        j                  t        d¬«      5  t        j                  |«       d d d «       y # 1 sw Y   y xY w)Nzdirect_no_decrypt.parquetr‰   r\   zencrypted metadataru   )	r!   r#  r+  r_   rb   rw   rx   r   r  )rŸ   rU   r   r<   r%  s        r   Ú%test_reading_without_decryption_failsz=TestDirectKeyEncryption.test_reading_without_decryption_failsY  sX   € ØÐ4Ñ4ˆä×3Ñ3Ü%ô'ˆ	ä
�‰�z 4¸yÕIä�]‰]œ7Ð*>Ö?Ü�M‰M˜$Ô÷ @×?Ñ?ús   ÁA2Á2A;c                 óÄ   — |dz  }t        j                  ||«       t        j                  t        d¬«      }t        j
                  ||¬«      }|j                  |«      sJ ‚y)zAPlaintext file reads should work when allow_plaintext_files=True.zplaintext.parquetT)r	   Úallow_plaintext_filesrf   N)r_   rb   r!   r$  r+  r  rS   )rŸ   rU   r   r<   r&  rs   s         r   Útest_allow_plaintext_filesz2TestDirectKeyEncryption.test_allow_plaintext_filesc  sW   € àÐ,Ñ,ˆÜ
�‰�z 4Ô(ä×3Ñ3Ü%Ø"&ô
ˆ	ô —‘˜t¸9ÔEˆØ× Ñ  Ô(Ð(Ñ(r   c                 óü   — |dz  }t        j                  ||«       t        j                  t        ¬«      }t        j                  t        d¬«      5  t        j                  ||¬«       ddd«       y# 1 sw Y   yxY w)zBDefault allow_plaintext_files=False should reject plaintext files.zplaintext_rejected.parquetr‰   Ú	plaintextru   rf   N)	r_   rb   r!   r$  r+  rw   rx   r   r  )rŸ   rU   r   r<   r&  s        r   Ú'test_plaintext_file_rejected_by_defaultz?TestDirectKeyEncryption.test_plaintext_file_rejected_by_defaulto  sV   € àÐ5Ñ5ˆÜ
�‰�z 4Ô(ä×3Ñ3Ü%ô'ˆ	ä�]‰]œ7¨+Ö6Ü�M‰M˜$°iÕ@÷ 7×6Ñ6ús   ÁA2Á2A;c                 óü   — |dz  }t        j                  t        ¬«      }t        j                  |||¬«       t        j
                  t        d¬«      }t        j                  ||¬«      }|j                  |«      sJ ‚y)z;check_footer_integrity=False should still allow decryption.zdirect_no_footer_check.parquetr‰   r\   F)r	   Úcheck_footer_integrityrf   NrA  r-  s          r   Ú!test_check_footer_integrity_falsez9TestDirectKeyEncryption.test_check_footer_integrity_falsey  sl   € àÐ9Ñ9ˆä×3Ñ3Ü%ô'ˆ	ä
�‰�z 4¸yÕIä×3Ñ3Ü%Ø#(ô
ˆ	ô —‘˜t¸9ÔEˆØ× Ñ  Ô(Ð(Ñ(r   c                 óæ   — |dz  }t        j                  t        d¬«      }t        j                  |||¬«       t        |d«      5 }|j                  d«      }ddd«       dk(  sJ ‚y# 1 sw Y   ŒxY w)	z:plaintext_footer=True should produce PAR1 magic, not PARE.zdirect_plaintext_magic.parquetTr@  r\   r7  r8  Ns   PAR1r9  r;  s          r   Ú$test_plaintext_footer_has_par1_magicz<TestDirectKeyEncryption.test_plaintext_footer_has_par1_magicˆ  sj   € àÐ9Ñ9ˆä×3Ñ3Ü%Ø!ô
ˆ	ô 	�‰�z 4¸yÕIä�$˜Ô Ø—F‘F˜1“IˆE÷ à˜ÒÐÑ÷ Ðús   ÁA'Á'A0c                 ó¨  — t        j                  t        d¬«      5  t        j                  d¬«       d d d «       t        j                  t        d¬«      5  t        j                  d¬«       d d d «       t        j                  t        d¬«      5  t        j
                  d¬«       d d d «       y # 1 sw Y   Œ~xY w# 1 sw Y   ŒPxY w# 1 sw Y   y xY w)Nz16, 24, or 32 bytesru   s   shortr‰   r   )rw   rx   ry   r!   r#  r$  ©rŸ   s    r   Útest_invalid_key_length_raisesz6TestDirectKeyEncryption.test_invalid_key_length_raises–  s�   € Ü�]‰]œ:Ð-BÖCÜ×+Ñ+°xÕ@÷ Dô �]‰]œ:Ð-BÖCÜ×+Ñ+°sÕ;÷ Dô �]‰]œ:Ð-BÖCÜ×+Ñ+°xÕ@÷ DÐC÷ DÐCú÷ DÐCú÷ DÐCúó#   œB0ÁB<ÂCÂ0B9Â<CÃCc                 óš   — t        j                  t        d¬«      5  t        j                  t
        d¬«       d d d «       y # 1 sw Y   y xY w)NzInvalid cipher nameru   ÚINVALIDrD  )rw   rx   ry   r!   r#  r+  rX  s    r   Útest_invalid_algorithm_raisesz5TestDirectKeyEncryption.test_invalid_algorithm_raises   s2   € Ü�]‰]œ:Ð-BÖCÜ×+Ñ+Ü)Ø%.õ÷ D×CÑCúó   œAÁA
c                 ó¨  — t        j                  t        d¬«      5  t        j                  d¬«       d d d «       t        j                  t        d¬«      5  t        j
                  d¬«       d d d «       t        j                  t        d¬«      5  t        j                  d ¬«       d d d «       y # 1 sw Y   Œ~xY w# 1 sw Y   ŒPxY w# 1 sw Y   y xY w)Nzfooter_key must be bytesru   Ú0123456789abcdefr‰   )rw   rx   rÃ   r!   r#  r$  rX  s    r   Ú!test_footer_key_rejects_non_bytesz9TestDirectKeyEncryption.test_footer_key_rejects_non_bytes§  s’   € Ü�]‰]œ9Ð,FÖGÜ×+Ñ+Ð7IÕJ÷ Hô �]‰]œ9Ð,FÖGÜ×+Ñ+Ð7IÕJ÷ Hô �]‰]œ9Ð,FÖGÜ×+Ñ+°tÕ<÷ HÐG÷ HÐGú÷ HÐGú÷ HÐGúrZ  c                 óš   — t        j                  t        d¬«      5  t        j                  t
        d¬«       d d d «       y # 1 sw Y   y xY w)Nzaad_prefix must be bytesru   Ú	not_bytesr)  )rw   rx   rÃ   r!   r#  r+  )rŸ   rU   r   s      r   Útest_aad_prefix_rejects_strz3TestDirectKeyEncryption.test_aad_prefix_rejects_str±  s2   € Ü�]‰]œ9Ð,FÖGÜ×+Ñ+Ü)Ø&õ÷ H×GÑGúr^  N)r¬   r­   r®   r¯   rw   ÚmarkÚparametrizer+  ÚDIRECT_KEY_192ÚDIRECT_KEY_256r'  r.  r3  r5  r>  rB  rE  rI  rK  rN  rQ  rT  rV  rY  r]  ra  rd  r°   r   r   r  r  Ü  s�   „ ÙPà‡[�[×Ñ˜UØ˜¨ð%â)ð ó +ñ)ó+ð)ò)ò )ò4Aò 	 ò)ò)ò
Aò ò
)òAò)ò òAòò=ór   r  )T)?rw   Údatetimer   Úpyarrowr   Úpyarrow.parquetÚparquetr_   Úpyarrow.parquet.encryptionÚ
encryptionr!   Ú pyarrow.tests.parquet.encryptionr   r   r   r   r   ÚImportErrorrM   rO   r#   rP   r$   r+  rg  rh  r,  re  Úparquet_encryptionÚ
pytestmarkÚfixturer   r%   r(   r7   r@   rX   rZ   r;   rR   r|   r�   rƒ   r†   rŒ   rŽ   r•   r³   r¸   rÄ   rÎ   rÑ   râ   Úxfailræ   rò   rf  Úparamr  r  r  r  r  r°   r   r   Ú<module>rv     s.  ðó" Ý Û ðEÝ ß+Ð+÷
Eõ Eð 0€Ø €
Ø€Ø
€Ø€à$€Ø,€Ø4€Ø&Ð ð ‡K�K×"Ñ"Ø
‡K�K×Ñð€
ð €‡��hÔñó  ðð €‡��hÔñ#ó  ð#ð €‡��hÔñ&ó  ð&ò1ò 1ò,+ò>+ò6"ð" 26ó)ò. "òF6ò1ò/òAò"Aò(Gò*!GòHGò(GòB ;òFIò<ð: ‡�×Ñð 2Ðó 3ñCó3ðCòN+ð2 ‡�×ÑØ2Øˆ�‰�T˜4Ð$5Ô6Øˆ�‰�U˜DÐ%?Ô@Øˆ�‰�T˜5Ð%>Ô?Øˆ�‰�U˜EÐ&7Ô8ð	5:ó;ñJ8ó;ðJ8òZ/ò:+ò0+÷4Zò ZøðK ò Ø	€BØ	ƒBðús   �F Æ	F)Æ(F)