o
    ɶd#                     @   sx   d dl Z d dlZd dlmZmZmZmZ d dlmZm	Z	 dZ
dZdZdZdZd	Zd
ZdZdZdZdZdd Zdd ZdS )    N)convert_to_bytesconvert_to_str&convert_bytes_to_base64_encoded_string&convert_base64_encoded_string_to_bytes)EncryptedDataHeader$EncryptedDataHeaderDataEncryptionKey   ZencryptedContentFormatZencryptedDataKeysZivZalgorithmIdZadditionalAuthenticatedDataZmasterKeyIdZvaultIdZencryptedDataKeyregionz>HI{json_metadata_length}sc                 C   s   g }| j D ]}|t|jt|jtt|jt	|j
i qt| jt|tt| jt| jtt| ji}t|}tjt|d}t|tt|t|}|S )N)json_metadata_length)encrypted_data_keysappend ENCRYPTED_DATA_KEY_MASTER_KEY_IDmaster_key_idENCRYPTED_DATA_KEY_VAULT_IDvault_id%ENCRYPTED_DATA_KEY_ENCRYPTED_DATA_KEYr   encrypted_data_key_bytesENCRYPTED_DATA_KEY_REGIONr	   %METADATA_KEY_ENCRYPTED_CONTENT_FORMATZencrypted_content_format METADATA_KEY_ENCRYPTED_DATA_KEYSMETADATA_KEY_IViv_bytesMETADATA_KEY_ALGORITHM_IDalgorithm_id*METADATA_KEY_ADDITIONAL_AUTHENTICATED_DATAr   #additional_authenticated_data_bytesjsondumpsSTRUCT_HEADER_FORMATformatlenstructpackSERIALIZATION_FORMAT_VERSIONr   )Zencrypted_data_headerr   Zencrypted_data_keymetadataZjson_header_as_stringZheader_formatZpacked_header r%   Iusr/lib/python3.10/site-packages/oci/encryption/internal/serialization.pyserialize_header*   s@   

r'   c              
      s  d}t |}d}t |}d}| |}t |||\}|| }|tkr,td|| |}t ||\}|| }d|}	| t |	}t |	|\}
|t |	 }t|
}zt	|W n tyw } z	tdt
|d }~ww tttg}ttttg}fdd|D }|rtd	d
|t}g }|D ]0  fdd|D }|rtdd
||t t tt t td qt|tttttd}|S )Nz>Hz>Ir   zOCould not deserialize header with unrecognized serialization format version: {}z{}sz1Could not parse metadata inside header. Error: {}c                    sJ   g | ]!}| vs!  |d d u s!t  |trt  |dkr|qS )Nr   )get
isinstancelistr    .0Zrequired_key)r$   r%   r&   
<listcomp>   s   J z2deserialize_header_from_stream.<locals>.<listcomp>zMInvalid header. The following metadata keys must be present and not null: {}.z, c                    s(   g | ]}| vs  |d d u r|qS )N)r(   r+   )encrypted_data_key_rawr%   r&   r-      s   ( zhInvalid header. The following metadata keys must be present and not null in each encrypted data key: {}.)r   r   r   r	   )r   r   r   r   )r!   calcsizereadunpack_fromr#   
ValueErrorr   r   r   loadsstrr   r   r   r   r   r   r   joinr(   r   r   r   r   r   r   )Zciphertext_streamZshort_formatZshort_size_offsetZunsigned_int_formatZunsigned_int_size_offsetoffsetZnext_contentZserialization_format_versionr
   Zchunk_formatZjson_metadata_bytesZjson_metadataeZrequired_top_level_keysZ required_encrypted_data_key_keysZmissing_or_none_top_level_keysZencrypted_data_keys_rawr   Zmissing_or_none_dek_keysheaderr%   )r.   r$   r&   deserialize_header_from_streamS   s   





	r9   )r!   r   Zoci.encryption.internal.utilsr   r   r   r   Zoci.encryption.internal.modelsr   r   r#   r   r   r   r   r   r   r   r   r   r   r'   r9   r%   r%   r%   r&   <module>   s$   )