
    i                         d dl mZ d dlmZ d dlZd dlZ ej        e          Zd dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZ dZ eed	z            Zd
Z eed	z            Z edddg          Z G d de          ZdS )    )
namedtuple)	lru_cacheN)	_cqltypes)ColumnEncryptionPolicy)padding)Cipher
algorithmsmodes         ColDatakeytypec                       e Zd Zej        ZddZd Zd Zd Z	d Z
d Zd Zd	 Zdd
Z ed          d             ZdS )AES256ColumnEncryptionPolicyNc                     || _         | j         r-t          | j                   t          k    st          d          nt	          j        t                    | _         i | _        i | _        d S )Nz\This policy uses AES-256 with CBC mode and therefore expects a 128-bit initialization vector)ivlenAES256_BLOCK_SIZE_BYTES
ValueErrorosurandomcoldataciphers)selfr   s     w/Users/user/workspace/sujinbaek/cqa-test-app/venv/lib/python3.11/site-packages/cassandra/column_encryption/_policies.py__init__z%AES256ColumnEncryptionPolicy.__init__1   sn     7 	:tw<<#::: !  A  A  A ; j!899DG     c                 b   t          j        t                                                    }|                    |          |                                z   }|                     |          }|                                }| j        |                    |          z   |                                z   S N)	r   PKCS7AES256_BLOCK_SIZEpadderupdatefinalize_get_cipher	encryptorr   )r   coldesc	obj_bytesr$   padded_bytescipherr(   s          r   encryptz$AES256ColumnEncryptionPolicy.encryptC   s     01188::}}Y//&//2C2CC!!'**$$&&	w)),777):L:L:N:NNNr   c                    |d t                    }|t           d          }|                     ||          }|                                }|                    |          |                                z   }t          j        t                                                    }|                    |          |                                z   S )N)r   )	r   r'   	decryptorr%   r&   r   r"   r#   unpadder)	r   r)   bytesr   encrypted_bytesr,   r/   r+   r0   s	            r   decryptz$AES256ColumnEncryptionPolicy.decryptS   s    +++, 7 8 89!!'b!11$$&&	 ''889;M;M;O;OO=!233<<>>|,,x/@/@/B/BBBr   c                 n   |st          d          |st          d          |st          d          |t          j                    vr"t          d                    |                    t	          |          t
          k    st          d          t          |t          |                   | j        |<   d S )Nz-ColDesc supplied to add_column cannot be Nonez)Key supplied to add_column cannot be Nonez*Type supplied to add_column cannot be NonezType %s is not a supported typez@AES256 column encryption policy expects a 256-bit encryption key)r   r   keysformatr   AES256_KEY_SIZE_BYTESr   r   )r   r)   r   r   s       r   
add_columnz'AES256ColumnEncryptionPolicy.add_column^   s     	NLMMM 	JHIII 	KIJJJy~''''>EEdKKLLL3xx000_``` 'Yt_ = =Wr   c                     || j         v S r!   )r   r   r)   s     r   contains_columnz,AES256ColumnEncryptionPolicy.contains_columnl   s    $,&&r   c                     |st          d          |st          d          | j                            |          }|s"t          d                    |                    |                     ||j                            |d                     S )Nz5ColDesc supplied to encode_and_encrypt cannot be Nonez4Object supplied to encode_and_encrypt cannot be Nonez%Could not find ColData for ColDesc %s)r   r   getr6   r-   r   	serialize)r   r)   objr   s       r   encode_and_encryptz/AES256ColumnEncryptionPolicy.encode_and_encrypto   s     	VTUUU 	USTTT,""7++ 	VDKKGTTUUU||GW\%;%;C%F%FGGGr   c                 >    t           j                                        S r!   )r   _build_cipher
cache_info)r   s    r   rC   z'AES256ColumnEncryptionPolicy.cache_infoy   s    +9DDFFFr   c                 &    | j         |         j        S r!   )r   r   r:   s     r   column_typez(AES256ColumnEncryptionPolicy.column_type|   s    |G$))r   c                     	 | j         |         }t                              |j        |p| j                  S # t
          $ r# t          d                    |                    w xY w)z
        Access relevant state from this instance necessary to create a Cipher and then get one,
        hopefully returning a cached instance if we've already done so (and it hasn't been evicted)
        zCould not find column {})r   r   rB   r   r   KeyErrorr   r6   )r   r)   r   r   s       r   r'   z(AES256ColumnEncryptionPolicy._get_cipher   sp    
	Il7+G/==gk2=QUQXYYY 	I 	I 	I7>>wGGHHH	Is	   36 -A#r   )maxsizec                 v    t          t          j        |           t                              |                    S r!   )r   r	   AES256r   mode)r   r   s     r   rB   z*AES256ColumnEncryptionPolicy._build_cipher   s-    j',,.J.O.OPR.S.STTTr   r!   )__name__
__module____qualname__r
   CBCrK   r   r-   r3   r8   r;   r@   rC   rE   r'   r   rB    r   r   r   r   &   s         9D   $O O O 	C 	C 	C> > >' ' 'H H HG G G* * *	I 	I 	I 	I YsU U U U Ur   r   )collectionsr   	functoolsr   loggingr   	getLoggerrL   logcassandra.cqltypesr   cassandra.policiesr   cryptography.hazmat.primitivesr   &cryptography.hazmat.primitives.ciphersr   r	   r
   r#   intr   AES256_KEY_SIZEr7   r   r   rP   r   r   <module>r\      s7  " # " " " " "        				g!! ( ( ( ( ( ( 5 5 5 5 5 5 2 2 2 2 2 2 L L L L L L L L L L #/!344 Oa/00 
*Yv
/
/gU gU gU gU gU#9 gU gU gU gU gUr   