o
    ëÉ¶d®  ã                   @   sj   d dl mZ d dlZd dlZd dlZd dlZG dd„ dƒZdd„ Zddd	„Zd
d„ Z	dd„ Z
ddd„ZdS )é    )Úabsolute_importNc                   @   s   e Zd ZdZdd„ ZdS )ÚDevNullza
    Simple class to supress errors which may occur when importing hashlib
    in FIPS mode.
    c                 C   s   d S ©N© )ÚselfÚmsgr   r   ú,usr/lib/python3.10/site-packages/oci/fips.pyÚwrite   s   zDevNull.writeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r      s    r   c                 C   s<   t  | ¡}| t  d¡¡ ddl}t|dƒs|j|_dS dS )zQ
    Override libcrypto and add FIPS_mode function to ssl if it is not there
    é   r   NÚ	FIPS_mode)ÚctypesÚCDLLZFIPS_mode_setÚc_intÚsslÚhasattrr   )Úfips_libcrypto_pathZ
_bs_cryptor   r   r   r   Úoverride_libcrypto   s   

ÿr   Ú c                 C   s   t dƒ‚)zm
    Placeholder md5 function for hashlib so it won't segfault when called after
    enabling FIPS mode.
    zmd5 disabled for fips)Ú
ValueError)Zintitial_messager   r   r   Úmd5!   s   r   c               	   C   sB   t j} z
tƒ t _ddl}W n ttfy   Y nw | t _t|_dS )z¬
    hashlib.md5 is imported by urllib3, which is required by requests,
    which is used by oci (python sdk).  This will cause errors so we need to
    patch hashlib.
    r   N)ÚsysÚstderrr   ÚhashlibÚRuntimeErrorr   r   )r   r   r   r   r   Úpatch_hashlib_md5*   s   ÿ
r   c                  C   sX   ddl } ddl}t|dƒsdS | ¡ dkrdS z
|  d¡ ¡ }W dS  ty+   Y dS w )zZ
    Verify that ssl.FIPS_mode() returns 1 and that using md5 raises an
    exception
    r   Nr   Fr   ó   Hello World
T)r   r   r   r   r   Ú	hexdigestr   )r   r   Údigestr   r   r   Úis_fips_mode;   s   
ür"   c                 C   sÈ   t  d tttƒ¡¡}| t  ¡ ¡ | s)dtj	v rtj	d } n
dtj	v r)tj	d } | rbt
| ƒ ddl}z| d¡ ¡ }tƒ  W n	 tyH   Y nw | d | ¡¡ tƒ r[| d¡ dS | d	¡ dS dS )
zG
    Enable FIPS mode by overriding libcrypto and patching hashlib
    z{}.{}ZFIPS_LIBCRYPTO_PATHZ"OCI_PYTHON_SDK_FIPS_LIBCRYPTO_PATHr   Nr   zUsing '{}' for libcyptozFIPS mode is activezFailed to enter FIPS mode)ÚloggingÚ	getLoggerÚformatr
   ÚidÚenable_fips_modeÚ
addHandlerÚNullHandlerÚosÚenvironr   r   r   r    r   r   Úinfor"   Úerror)r   Úloggerr   r!   r   r   r   r'   S   s*   



þír'   )r   r   )Ú
__future__r   r   r   r#   r*   r   r   r   r   r"   r'   r   r   r   r   Ú<module>   s   	
	