Ë
    _QêjÁ¨  ã                   óº  — 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dZdZe j:                  j<                  e j:                  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(	 d;d„Z)d„ Z*d„ Z+d„ Z,d„ Z-d„ Z.d „ Z/d!„ Z0d"„ Z1d#„ Z2d$„ Z3d%„ Z4d&„ Z5d'„ Z6d(„ Z7d)„ Z8e j:                  js                  d* e jt                  ddd+¬,«       e jt                  d-dd.¬,«       e jt                  dd-d/¬,«       e jt                  d-d-d0¬,«      g«      d1„ «       Z;d<d2„Z<e j:                  js                  d3d-dg«      d4„ «       Z=e j:                  js                  d3d-dg«      d5„ «       Z>d6„ Z?d7„ Z@d8„ ZA G d9„ d:«      ZBy# e$ r dZdZ
Y �Œ¬w xY w)=é    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_prefixzkms-123zhttps://example.com/kmsÚ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    új/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/pyarrow/tests/parquet/test_encryption.pyr   r   9   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(   C   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,   M   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_   s   € Ü Ð!=Ó>Ð>r    )r$   ÚKmsConnectionConfigÚCryptoFactory)r/   Úkms_connection_configr5   Úcrypto_factorys       r   Úsetup_encryption_environmentr:   X   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)Údecoder:   Úwrite_encrypted_parquet)
Úpathr   Úfooter_key_nameÚcol_key_namer	   r
   Úencryption_configr/   r8   r9   s
             r   Úwrite_encrypted_filerC   h   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©rM   N)ÚPARQUET_NAMEr$   r%   r&   r'   r   Úuniform_encryptionrC   Ú
FOOTER_KEYÚCOL_KEYr   ÚDecryptionConfigurationÚread_encrypted_parquetÚequals©Útempdirr   r?   rB   r8   r9   Údecryption_configÚresult_tables           r   Ú!test_encrypted_parquet_write_readr[   ~   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	)
rE   TrF   rG   rH   rJ   )r	   rQ   rL   rM   rN   r    rO   N)rP   r$   r%   r&   r   rQ   rC   r'   rR   r   rT   rU   rV   rW   s           r   Ú)test_uniform_encrypted_parquet_write_readr]   �   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?   ÚtablerB   r8   r9   ra   Ú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_propertiesrb   Úread_metadataÚnum_columnsÚread_schemaÚlenÚnamesÚParquetFileÚread)	r?   rY   r8   r9   r+   rm   Úmetard   Úresults	            r   rU   rU   Ç   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   rF   rG   rH   rJ   rK   r<   rO   zIncorrect master key used©ÚmatchN)rP   r$   r%   r&   r'   r   rC   rR   rS   r   r:   r=   rT   ÚpytestÚraisesÚ
ValueErrorrU   )rX   r   r?   rB   Úwrong_kms_connection_configÚwrong_crypto_factoryrY   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ñ "ÜØÐ#Ð%@Ø ô	"÷"÷ "ñ "ú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 decryptionrx   N)r[   rz   r{   ÚIOErrorrb   rs   rP   rt   ©rX   r   s     r   Ú0test_encrypted_parquet_read_no_decryption_configr„     sL   € ô & g¨zÔ:ä	�‰”wÐ&6Ô	7ñ 6Ü
�‰�w¤Ñ-Ó.×3Ñ3Ô5÷6÷ 6ñ 6ú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�   rx   N)r[   rz   r{   r‚   rb   rn   rP   rƒ   s     r   Ú9test_encrypted_parquet_read_metadata_no_decryption_configr†   
  sE   € ô & g¨zÔ:ä	�‰”wÐ&6Ô	7ñ 1Ü
×Ñ˜¤<Ñ/Ô0÷1÷ 1ñ 1úó   ¨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�   rx   N)r[   rz   r{   r‚   rb   rp   rP   rƒ   s     r   Ú7test_encrypted_parquet_read_schema_no_decryption_configr‰     sC   € ô & g¨zÔ:Ü	�‰”wÐ&6Ô	7ñ /Ü
�‰�w¤Ñ-Ô.÷/÷ /ñ /ú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 setrx   r    N)	r$   r%   r&   rz   r{   ÚOSErrorrC   r'   rR   ©rX   r   r?   rB   s       r   Ú'test_encrypted_parquet_write_no_col_keyr�     sn   € ð Ð@Ñ@€Dô ×2Ñ2Ü"ô$Ðô 
�‰”wð%ô
&ñ Aô 	˜T :¬ÄÜ'¨Ð.?ô	A÷	A÷ Añ 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"   rQ   z2Cannot set both column_keys and uniform_encryptionrx   r    N)	r$   r%   r&   r'   rz   r{   r�   rC   rR   rŽ   s       r   Ú;test_encrypted_parquet_write_col_key_and_uniform_encryptionr‘   .  s€   € ð ÐTÑT€Dô ×2Ñ2Ü"ä˜3 ˜*ð
ð  ô!Ðô 
�‰”wØRô
Tñ Aô 	˜T :¬ÄÜ'¨Ð.?ô	A÷A÷ Añ Aú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 r1   r2   r3   s    r   r5   z;test_encrypted_parquet_write_kms_error.<locals>.kms_factoryK  s   € ô !Ð!=Ó>Ð>r    r	   rx   N)r$   r6   r7   rz   r{   ÚKeyErrorr>   ©rX   r   r(   r?   rB   r8   r5   r9   s           r   Ú&test_encrypted_parquet_write_kms_errorr˜   B  sy   € ð Ð?Ñ?€DØ/Ðô ×2Ñ2Ó4Ðò?ô
 ×%Ñ% kÓ2€NÜ	�‰”x |Ô	4ñ Gä  jÐ2CØ 5°~ô	G÷G÷ Gñ Gúó   Á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__e  s   € ä�L‰L×!Ñ! $Ô'Ø ˆD�Kr    c                 ó   — t        d«      ‚)NúCannot Wrap Key©r|   ©r¢   Ú	key_bytesÚmaster_key_identifiers      r   Úwrap_keyzStest_encrypted_parquet_write_kms_specific_error.<locals>.ThrowingKmsClient.wrap_keyj  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_keym  s   € ÜÐ0Ó1Ð1r    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__rŸ   r©   r­   © r    r   ÚThrowingKmsClientrœ   `  s   „ ñ	ò	!ò
	0ó	2r    r´   c                 ó   •—  ‰| «      S r1   r³   )r4   r´   s    €r   r5   zDtest_encrypted_parquet_write_kms_specific_error.<locals>.kms_factoryp  s   ø€ á Ð!=Ó>Ð>r    r¤   rx   N)r$   r6   rž   r7   rz   r{   r|   r>   )	rX   r   r(   r?   rB   r8   r5   r9   r´   s	           @r   Ú/test_encrypted_parquet_write_kms_specific_errorr¶   W  s‹   ø€ ð Ð?Ñ?€DØ/Ðô ×2Ñ2Ó4Ðô2œBŸL™Lô 2ô ?ô ×%Ñ% kÓ2€NÜ	�‰”zÐ):Ô	;ñ Gä  jÐ2CØ 5°~ô	G÷G÷ Gñ 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¥   r3   s    r   r5   zCtest_encrypted_parquet_write_kms_factory_error.<locals>.kms_factory„  s   € ÜÐ2Ó3Ð3r    rº   rx   N)r$   r6   r7   rz   r{   r|   r>   r—   s           r   Ú.test_encrypted_parquet_write_kms_factory_errorr»   {  s~   € ð ÐGÑG€DØ/Ðô ×2Ñ2Ó4Ðò4ô ×%Ñ% kÓ2€NÜ	�‰”zØ6ô
8ñ Gô 	   jÐ2CØ 5°~ô	G÷G÷ Gñ Gú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 r1   )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 r1   r³   r¦   s      r   r©   zXtest_encrypted_parquet_write_kms_factory_type_error.<locals>.WrongTypeKmsClient.wrap_key   ó   € Ør    c                  ó   — y r1   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 r1   r³   )r4   rÄ   s    €r   r5   zHtest_encrypted_parquet_write_kms_factory_type_error.<locals>.kms_factory¦  s   ø€ Ù!Ð">Ó?Ð?r    N)r$   r6   r7   rz   r{   Ú	TypeErrorr>   )	rX   r   r(   r?   rB   r8   r5   r9   rÄ   s	           @r   Ú3test_encrypted_parquet_write_kms_factory_type_errorrÇ   �  sƒ   ø€ ð ÐGÑG€DØ/Ðô ×2Ñ2Ó4Ð÷ñ ô@ô ×%Ñ% kÓ2€NÜ	�‰”yÓ	!ñ Gä  jÐ2CØ 5°~ô	G÷G÷ Gñ 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ç      $@rH   éÀ   )r&   r	   r"   r'   rL   Úplaintext_footerÚdouble_wrappingr   rM   r+   rN   )rB   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Ë   rH   rÌ   )r	   r"   rL   rÍ   rÎ   rM   r+   rN   rŒ   )r$   r%   r&   r'   r   r"   rL   rÍ   rÎ   rM   r+   rN   )rÏ   rB   Ú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¬«      | j                  k(  sJ ‚| j                  du sJ ‚t        j                  t        d¬«      d¬«      }t        d¬«      |j                  k(  sJ ‚|j                  du sJ ‚t        j                  «       }t        d¬«      |_        d|_        t        d¬«      |j                  k(  sJ ‚|j                  du sJ ‚t        j                  d¬«      }t        d¬«      |j                  k(  sJ ‚y )	NrË   rH   FrG   T)rM   Úread_kms_urli,  rO   )r$   rT   r   rM   rÓ   )Údefault_configrY   Údecryption_config_1Údecryption_config_2s       r   Ú/test_encrypted_parquet_decryption_configurationr×   Ó  s  € ä×/Ñ/Ó1€NÜ˜TÔ" n×&CÑ&CÒCÐCÐCØ×&Ñ&¨%Ñ/Ð/Ð/ô ×2Ñ2Ü ¨Ô-ØôÐô ˜SÔ!Ð%6×%EÑ%EÒEÐEÐEØ×)Ñ)¨TÑ1Ð1Ð1ô ×4Ñ4Ó6ÐÜ)2¸3Ô)?ÐÔ&Ø'+ÐÔ$Ü˜SÔ!Ð%8×%GÑ%GÒGÐGÐGØ×+Ñ+¨tÑ3Ð3Ð3ô ×4Ñ4ÀCÔHÐÜ˜SÔ!Ð%8×%GÑ%GÒGÐGÑGr    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/   )r8   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$   r6   rã   rä   rå   r/   )ræ   r8   Úkms_connection_config_1s      r   Ú(test_encrypted_parquet_kms_configurationrè   ì  s   € ò7ô ×2Ñ2Ø#ØØ"à$Ø$ñ
ô	Ðñ #Ð#8Ô9ä ×4Ñ4Ó6ÐØ.9ÐÔ+Ø/5ÐÔ,Ø/8ÐÔ,à Ø ñ/ÐÔ+ñ #Ð#:Õ;r    c                 óª  — | t         z  }dD �]·  }|r¬t        j                  j                  t        j                  g d¢«      t        j                  dddœdddœdd	dœgt        j
                  d
t        j                  «       fdt        j                  «       fg«      ¬«      t        j                  g d¢«      dœ«      }n|}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!        |||||«       t#        j$                  |«      5 }	|	j'                  dd¬«      }
|j(                  |
j(                  k(  sJ ‚|j+                  dg«      j-                  |
«      sJ ‚	 ddd«       �Œº y# 1 sw Y   �ŒÆxY w)a  
    Write an encrypted parquet, with plaintext footer and with single wrapping,
    verify it's encrypted, and then read plaintext columns. Runs once with a
    flat schema and once where the encrypted column `b` is itself a nested
    (struct) field.
    )FTr   r   r   )r   r   r   é   é   é   r   r   )Útyper   r   r   r   TF)r	   r"   rÍ   rÎ   r<   r.   c                 ó   — t        | «      S r1   r2   r3   s    r   r5   zStest_encrypted_parquet_write_read_plain_footer_single_wrapping.<locals>.kms_factory0  s   € Ü$Ð%AÓBÐBr    r   )Úcolumnsrl   N)rP   r   r   r   r   ÚstructÚint32r$   r%   r&   r'   r6   rR   r=   rS   r7   r>   rb   rs   rt   Únum_rowsÚselectrV   )rX   r   r?   Únestedrf   rB   r8   r5   r9   rv   rZ   s              r   Ú>test_encrypted_parquet_write_read_plain_footer_single_wrappingrõ   	  s«  € ð ”\Ñ!€Dàó )<ˆÙÜ—H‘H×(Ñ(Ü—X‘XšiÓ(Ü—X‘XØ 1Ñ%¨Q°QÑ'7¸qÀqÑ9IÐJÜŸ™ S¬"¯(©(«*Ð$5¸¼R¿X¹X»ZÐ7HÐ#IÓJôLô —X‘XšoÓ.ñ*ó ‰Eð ˆEô ×6Ñ6Ü&ä˜s C˜jðð "Ø!ô#Ðô !#× 6Ñ 6ä¤×!2Ñ!2°7Ó!;ÜœgŸn™n¨WÓ5ðô!
Ðò	Cô ×)Ñ)¨+Ó6ˆä  eÐ->Ø 5°~ô	Gô �^‰^˜DÓ!ð 	< VØ!Ÿ;™;¨sÀ˜;ÓFˆLØ—>‘> \×%:Ñ%:Ò:Ð:Ð:Ø—<‘<  Ó&×-Ñ-¨lÔ;Ð;Ñ;÷	<ñ 	<ñM)<÷L	<ñ 	<ús   Å)AGÇG	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)rP   rC   r&   r'   rR   rS   r   r$   rT   rU   r   Ú_parquet_encryptionÚFileSystemKeyMaterialStoreÚfor_filerq   Úget_key_id_setr"   ÚallÚget_key_materialrV   )rX   r   r,   r?   r8   r9   rY   rZ   Ú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¸!�×&Ñ& qÓ)°Ò5Ò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 r1   )r   r3   s    r   r5   z8test_external_key_material_rotation.<locals>.kms_factoryu  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 r1   )Ú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_keys•  s€   ø€ Ø$ ]Ñ3ˆÙØ!/×!;Ñ!;Ñà!/×!;Ñ!;ÐÜ,Ð-?Ó@Ñˆˆ:�qà" =Ñ1ˆÙØ -× 9Ñ 9Ñà -× 9Ñ 9ÐÜ+Ð,=Ó>‰ˆˆ9�að ˜IÒ%Ð%Ñ%r    )rP   r$   r%   r&   r'   r6   r7   r>   r   Úrefresh_key_access_tokenÚrotate_master_keysr   rU   rT   ÚstrrV   )Úreusable_tempdirr   r  r  r?   rB   r8   r5   r9   Útable_read_after_rotationr  r  r  s     ``       @@r   Ú#test_external_key_material_rotationr  X  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                 ó&   ‡ ‡— ‰€t         Šˆˆ fd„}|S )zˆCreate a KMS client factory that appends the KMS instance ID and URL of
    each connection configuration it is given to created_configsc                 ób   •— ‰j                  | j                  | j                  f«        ‰| «      S r1   )Úappendrã   rä   )r4   Úclient_classÚcreated_configss    €€r   r5   z*recording_kms_factory.<locals>.kms_factory±  s6   ø€ Ø×ÑØ)×9Ñ9Ø)×:Ñ:ð<ô	=ñ Ð8Ó9Ð9r    r2   )r#  r"  r5   s   `` r   Úrecording_kms_factoryr$  «  s   ù€ ð ÐÜ(ˆõ:ð
 Ðr    rÓ   c                 óD  — | t         z  }t        t        j                  d«      t        t
        j                  d«      i}t        j                  t        t        |¬«      }t        j                  t        «      }t        |||||«       t        |«       t        j                  |¬«      }g }	t        j                  t        |	«      «      }
t        j                  |¬«      }t!        ||||
«      }|j#                  |«      sJ ‚|r|	t        t        fgk(  sJ ‚y|	t        dfgk(  sJ ‚y)zxRead a file written with KMS connection properties configured, using a
    KmsConnectionConfig that doesn't specify themr<   )rã   rä   r/   r.   ©rÓ   ÚDEFAULTN)rP   r&   rR   r=   r'   rS   r$   r6   ÚKMS_INSTANCE_IDÚKMS_INSTANCE_URLr7   r   r>   r   r$  rT   rU   rV   )rX   r   r(   rÓ   r?   r/   Úwrite_configÚwrite_crypto_factoryÚread_configr#  Úread_crypto_factoryrY   rZ   s                r   Útest_read_kms_url_from_filer.  ¹  s   € ð
 ”\Ñ!€Däœ×*Ñ*¨7Ó3Ü”g—n‘n WÓ-ð€Oô
 ×)Ñ)Ü'Ü)Ø'ô)€Lô ×+Ñ+Ô,=Ó>ÐÜ˜D *Ð.EØ(Ð*>ô@ä˜$Ôô ×(Ñ(¸ÔI€KØ€OÜ×*Ñ*Ü˜oÓ.ó0Ðä×2Ñ2Ø!ô#Ðä)ØÐ Ð.AóC€Là×Ñ˜\Ô*Ð*Ð*áà¤OÔ5EÐ#FÐ"GÒGÐGÑGð ¤O°YÐ#?Ð"@Ò@Ð@Ñ@r    c                 óª  — | t         z  }t        j                  t        t        ddgid¬«      }t        j
                  t        t        d¬«      }t        j                  t        «      }t        |||||«       t        j
                  d¬«      }g }t        j                  t        |t        «      «      }	|	j                  |||¬	«       |r|d
t        t        fgk(  sJ ‚|d
t        dfgk(  sJ ‚t        |«      }
|
t           }|j                  dk(  sJ ‚|j                  dk(  sJ ‚t!        |t        j"                  «       ||	d¬«      }|j%                  |«      sJ ‚y)z†Rotate the keys of a file written with KMS connection properties
    configured, using a KmsConnectionConfig that doesn't specify themr   r   Fr*   r  )rã   rä   rå   r	  r  r&  )Ú r0  r'  r÷   N)rP   r$   r%   r&   r'   r6   r(  r)  r7   r   r>   r$  r  r   rã   rä   rU   rT   rV   )r  r   rÓ   r?   rB   r*  r+  Úrotation_configr#  Úrotation_crypto_factoryÚrotated_keysÚfooter_key_materialr  s                r   Ú)test_key_rotation_reads_kms_url_from_filer5  á  su  € ð
 œlÑ*€DÜ×2Ñ2Ü"Ü! C¨ :Ð.Ø#ô%Ðô ×)Ñ)Ü'Ü)Øô€Lô ×+Ñ+Ô,CÓDÐÜ˜D *Ð.?ÀØ0ô2ô ×,Ñ,¸cÔB€OØ€OÜ ×.Ñ.Ü˜oÔ/FÓGóIÐà×.Ñ.Ø˜¨Lð /ô :ñ ð  8¬oÔ?OÐ-PÐ"QÒQÐQÐQð  8¬o¸yÐ-IÐ"JÒJÐJÐJô .¨dÓ3€LØ&¤Ñ7ÐØ×.Ñ.°)Ò;Ð;Ð;Ø×/Ñ/°9Ò<Ð<Ð<ä 6ØÜ
×"Ñ"Ó$ØØØ#ô!%Ðð ×ÑÐ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.rG   rH   rO   é2   Nri   Trk   )rP   rC   r&   r'   rR   rS   r   r$   rT   r   Úrangerm   rb   rs   rt   rV   )rX   r   r(   r?   r8   r9   rY   Úirm   rv   rZ   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
    rG   rH   rO   ri   Trk   N)rP   rC   r&   r'   rR   rS   r   r$   rT   r   rm   rb   rs   rt   rV   )
rX   r   r(   r?   r8   r9   rY   rm   rv   rZ   s
             r   Ú%test_read_with_deleted_crypto_factoryr<  1  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.rG   rH   rO   ri   N)rP   rC   r&   r'   rR   rS   r$   rT   r   rm   rb   Ú
read_tablerV   )	rX   r   r(   r?   r8   r9   rY   rm   rZ   s	            r   Ú!test_encrypted_parquet_read_tabler?  I  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_   ri   )rq   r$   Úcreate_encryption_propertiesrb   re   Úcreate_decryption_propertiesr>  rV   )r¢   rX   r   rB  r?   Ú	enc_propsÚ	dec_propsrv   s           r   Útest_roundtrip_key_sizesz0TestDirectKeyEncryption.test_roundtrip_key_sizesf  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_   ri   )	r$   rJ  ÚDIRECT_KEY_128ÚDIRECT_AAD_PREFIXrb   re   rK  r>  rV   ©r¢   rX   r   r?   rL  rM  rv   s          r   Útest_roundtrip_with_aad_prefixz6TestDirectKeyEncryption.test_roundtrip_with_aad_prefixs  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	   rQ  Ústore_aad_prefixr_   rŒ   ÚAADrx   ri   NrP  )r$   rJ  rR  rS  rb   re   rK  rz   r{   r‚   r>  rV   )r¢   rX   r   r?   rL  Údec_props_no_aadrM  rv   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ñ 	HÜ�M‰M˜$Ð6FÕG÷	Hô ×3Ñ3Ü%Ü(ô
ˆ	ô —‘˜t¸9ÔEˆØ× Ñ  Ô(Ð(Ñ(÷	Hð 	Hú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.parquetrP  r_   s   wrong_prefixrX  rx   ri   )r$   rJ  rR  rS  rb   re   rK  rz   r{   r‚   r>  )r¢   rX   r   r?   rL  rM  s         r   Útest_wrong_aad_prefix_failsz3TestDirectKeyEncryption.test_wrong_aad_prefix_fails�  s‚   € ØÐ3Ñ3ˆä×3Ñ3Ü%Ü(ô
ˆ	ô 	�‰�z 4¸yÕIä×3Ñ3Ü%Ø&ô
ˆ	ô �]‰]œ7¨%Ô0ñ 	AÜ�M‰M˜$°iÕ@÷	A÷ 	Añ 	Aú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_   Úrbrê   s   PARE©r$   rJ  rR  rb   re   Úopenrt   ©r¢   rX   r   r?   rL  ÚfÚmagics          r   Ú"test_encrypted_file_has_pare_magicz:TestDirectKeyEncryption.test_encrypted_file_has_pare_magic­  sl   € ØÐ/Ñ/ˆä×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Œ   ri   ©r$   rJ  rR  rb   re   rK  r>  rV   rT  s          r   Útest_plaintext_footerz-TestDirectKeyEncryption.test_plaintext_footer¸  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	   rL   r_   rŒ   ri   rg  rT  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Údecryptrx   ri   )
r$   rJ  rR  rb   re   rK  rz   r{   r‚   r>  )r¢   rX   r   r?   rL  Ú	wrong_keyrM  s          r   Útest_wrong_key_failsz,TestDirectKeyEncryption.test_wrong_key_failsÔ  sz   € ØÐ3Ñ3ˆä×3Ñ3Ü%ô'ˆ	ä
�‰�z 4¸yÕIà'ˆ	Ü×3Ñ3¸yÔIˆ	Ü�]‰]œ7¨)Ô4ñ 	AÜ�M‰M˜$°iÕ@÷	A÷ 	Añ 	Aú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 metadatarx   )	r$   rJ  rR  rb   re   rz   r{   r‚   r>  )r¢   rX   r   r?   rL  s        r   Ú%test_reading_without_decryption_failsz=TestDirectKeyEncryption.test_reading_without_decryption_failsà  s`   € ØÐ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_filesri   N)rb   re   r$   rK  rR  r>  rV   )r¢   rX   r   r?   rM  rv   s         r   Útest_allow_plaintext_filesz2TestDirectKeyEncryption.test_allow_plaintext_filesê  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Œ   Ú	plaintextrx   ri   N)	rb   re   r$   rK  rR  rz   r{   r‚   r>  )r¢   rX   r   r?   rM  s        r   Ú'test_plaintext_file_rejected_by_defaultz?TestDirectKeyEncryption.test_plaintext_file_rejected_by_defaultö  sc   € àÐ5Ñ5ˆÜ
�‰�z 4Ô(ä×3Ñ3Ü%ô'ˆ	ä�]‰]œ7¨+Ô6ñ 	AÜ�M‰M˜$°iÕ@÷	A÷ 	Añ 	Aú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_integrityri   Nrg  rT  s          r   Ú!test_check_footer_integrity_falsez9TestDirectKeyEncryption.test_check_footer_integrity_false   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.parquetTrf  r_   r^  rê   Ns   PAR1r_  ra  s          r   Ú$test_plaintext_footer_has_par1_magicz<TestDirectKeyEncryption.test_plaintext_footer_has_par1_magic  sq   € àÐ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 bytesrx   s   shortrŒ   r    )rz   r{   r|   r$   rJ  rK  ©r¢   s    r   Útest_invalid_key_length_raisesz6TestDirectKeyEncryption.test_invalid_key_length_raises  sª   € Ü�]‰]œ:Ð-BÔCñ 	AÜ×+Ñ+°xÕ@÷	Aô �]‰]œ:Ð-BÔCñ 	<Ü×+Ñ+°sÕ;÷	<ô �]‰]œ:Ð-BÔCñ 	AÜ×+Ñ+°xÕ@÷	Að 	A÷	Að 	Aú÷	<ð 	<ú÷	Að 	Aúó#   œ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 namerx   ÚINVALIDrj  )rz   r{   r|   r$   rJ  rR  r~  s    r   Útest_invalid_algorithm_raisesz5TestDirectKeyEncryption.test_invalid_algorithm_raises'  s:   € Ü�]‰]œ:Ð-BÔ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 bytesrx   Ú0123456789abcdefrŒ   )rz   r{   rÆ   r$   rJ  rK  r~  s    r   Ú!test_footer_key_rejects_non_bytesz9TestDirectKeyEncryption.test_footer_key_rejects_non_bytes.  s«   € Ü�]‰]œ9Ð,FÔGñ 	KÜ×+Ñ+Ð7IÕJ÷	Kô �]‰]œ9Ð,FÔGñ 	KÜ×+Ñ+Ð7IÕJ÷	Kô �]‰]œ9Ð,FÔGñ 	=Ü×+Ñ+°tÕ<÷	=ð 	=÷	Kð 	Kú÷	Kð 	Kú÷	=ð 	=úr€  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 bytesrx   Ú	not_bytesrP  )rz   r{   rÆ   r$   rJ  rR  )r¢   rX   r   s      r   Útest_aad_prefix_rejects_strz3TestDirectKeyEncryption.test_aad_prefix_rejects_str8  s:   € Ü�]‰]œ9Ð,FÔGñ 	Ü×+Ñ+Ü)Ø&õ÷	÷ 	ñ 	úr„  N)r¯   r°   r±   r²   rz   ÚmarkÚparametrizerR  ÚDIRECT_KEY_192ÚDIRECT_KEY_256rN  rU  rZ  r\  rd  rh  rk  ro  rq  rt  rw  rz  r|  r  rƒ  r‡  rŠ  r³   r    r   rA  rA  c  s�   „ ÙPà‡[�[×Ñ˜UØ˜¨ð%â)ð ó +ñ)ó+ð)ò)ò )ò4Aò 	 ò)ò)ò
Aò ò
)òAò)ò òAòò=ór    rA  )Tr1   )Crz   Údatetimer   Úpyarrowr   Úpyarrow.parquetÚparquetrb   Úpyarrow.parquet.encryptionÚ
encryptionr$   Ú pyarrow.tests.parquet.encryptionr   r   r   r   r   ÚImportErrorrP   rR   r&   rS   r'   rR  r�  rŽ  rS  r(  r)  r‹  Úparquet_encryptionÚ
pytestmarkÚfixturer   r(   r,   r:   rC   r[   r]   r>   rU   r   r„   r†   r‰   r�   r‘   r˜   r¶   r»   rÇ   rÑ   r×   rè   rõ   r  rŒ  Úparamr  r$  r.  r5  r:  r<  r?  rA  r³   r    r   ú<module>r›     sl  ðó" Ý Û ð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Hò2<ò:3<òl+ð2 ‡�×ÑØ2Øˆ�‰�T˜4Ð$5Ô6Øˆ�‰�U˜DÐ%?Ô@Øˆ�‰�T˜5Ð%>Ô?Øˆ�‰�U˜EÐ&7Ô8ð	5:ó;ñJ8ó;ðJ8óZð ‡�×Ñ˜¨%°¨Ó7ñ$Aó 8ð$AðN ‡�×Ñ˜¨%°¨Ó7ñ/8ó 8ð/8òd/ò:+ò0+÷4Zò ZøðY ò Ø	€BØ	ƒBðús   �G Ç	GÇG