o
    ³©ió:  ã                   @   sŠ  d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
Z
ddlmZmZ ddlmZ ddlmZ ddlmZmZ ddlmZmZ dd	lmZmZmZ d
dlmZ d
dlmZ d
dlmZ d
dlm Z m!Z! d
dl"m#Z#m$Z$ d
dl%m&Z&m'Z'm(Z( e )e*¡Z+G dd„ de,ƒZ-e
 .ej/¡G dd„ de,ƒƒZ0dZ1e
 .ej/¡G dd„ de0ƒƒZ2e
 .ej/¡G dd„ de0ƒƒZ3G dd„ de0ƒZ4dS )u^   
oss2.encryption
~~~~~~~~~~~~~~

è¯¥æ¨¡å—åŒ…å«äº†å®¢æˆ·ç«¯åŠ è§£å¯†ç›¸å…³çš„å‡½æ•°å’Œç±»ã€‚
é    N)Úpartial)Ú
PKCS1_OAEPÚ
PKCS1_v1_5)ÚRSA)Úclient)ÚServerExceptionÚClientException)Úformat_typeÚmethod_type)ÚGenerateDataKeyRequestÚDecryptRequestÚEncryptRequesté   )Úmodels)Úheaders)Úutils)Úb64decode_from_stringÚb64encode_as_string)Úto_bytesÚ
to_unicode)ÚClientErrorÚOpenApiFormatErrorÚOpenApiServerErrorc                   @   s&   e Zd Zddd„Zdd„ Zdd„ ZdS )	ÚEncryptionMaterialsNc                 C   s`   i | _ |rt|tƒr|| _ ntdƒ‚|r|rtdƒ‚|r%t|tƒs%tdƒ‚|| _|| _|| _d S )Nú0Invalid type, the type of mat_desc must be dict!z3Both key_pair and custom_master_key_id are not noneú0Invalid type, the type of key_pair must be dict!)ÚdescÚ
isinstanceÚdictr   Úkey_pairÚcustom_master_key_idÚ
passphrase)Úselfr   r   r    r!   © r#   ú?/home/ubuntu/.local/lib/python3.10/site-packages/oss2/crypto.pyÚ__init__%   s   

zEncryptionMaterials.__init__c                 C   s   || j |< d S ©N©r   )r"   ÚkeyÚvaluer#   r#   r$   Úadd_description6   ó   z#EncryptionMaterials.add_descriptionc                 C   s   |D ]	}|| | j |< qd S r&   r'   )r"   Údescriptionsr(   r#   r#   r$   Úadd_descriptions9   s   ÿz$EncryptionMaterials.add_descriptions)NNN)Ú__name__Ú
__module__Ú__qualname__r%   r*   r-   r#   r#   r#   r$   r   $   s    
r   c                   @   sš   e Zd ZdZddd„Zejdd„ ƒZdd„ Ze	d	d
„ ƒZ
e	ddd„ƒZejdd„ ƒZejdd„ ƒZejdd„ ƒZdd„ Zejdd„ ƒZdd„ Zdd„ ZdS )ÚBaseCryptoProvideruF   CryptoProvider åŸºç±»ï¼Œæä¾›åŸºç¡€çš„æ•°æ®åŠ å¯†è§£å¯†adapter

    Nc                 C   sN   |st dƒ‚|| _d | _d | _d | _i | _|r%t|tƒr!|| _d S t dƒ‚d S )Nz&Please initialize the value of cipher!r   )r   ÚcipherÚcek_algÚwrap_algÚmat_descÚencryption_materials_dictr   r   )r"   r2   r5   r#   r#   r$   r%   D   s   

üzBaseCryptoProvider.__init__c                 C   ó   d S r&   r#   ©r"   r#   r#   r$   Úget_keyR   ó   zBaseCryptoProvider.get_keyc                 C   ó
   | j  ¡ S r&   )r2   Úget_ivr8   r#   r#   r$   r<   V   ó   
zBaseCryptoProvider.get_ivc                 C   s   t  | t|jƒ¡S r&   )r   Úmake_cipher_adapterr   Úencrypt)Ústreamr2   r#   r#   r$   Úmake_encrypt_adapterY   s   z'BaseCryptoProvider.make_encrypt_adapterr   c                 C   s   t  | t|jƒ|¡S r&   )r   r>   r   Údecrypt)r@   r2   Údiscardr#   r#   r$   Úmake_decrypt_adapter]   s   z'BaseCryptoProvider.make_decrypt_adapterc                 C   r7   r&   r#   ©r"   Úencrypted_keyr#   r#   r$   Údecrypt_encrypted_keya   r:   z(BaseCryptoProvider.decrypt_encrypted_keyc                 C   r7   r&   r#   )r"   Úencrypted_ivr#   r#   r$   Údecrypt_encrypted_ive   r:   z'BaseCryptoProvider.decrypt_encrypted_ivc                 C   r7   r&   r#   ©r"   Úencryption_materialsr#   r#   r$   Úreset_encryption_materialsi   r:   z-BaseCryptoProvider.reset_encryption_materialsc                 C   s   | j  ||¡S r&   )r2   Úadjust_range)r"   ÚstartÚendr#   r#   r$   rM   m   r+   zBaseCryptoProvider.adjust_rangec                 C   r7   r&   r#   r8   r#   r#   r$   Úcreate_content_materialp   r:   z*BaseCryptoProvider.create_content_materialc                 C   s&   |j rt|j  ¡ ƒ}|| j|< d S d S r&   )r   Ú	frozensetÚitemsr6   )r"   rK   r(   r#   r#   r$   Úadd_encryption_materialst   s   þz+BaseCryptoProvider.add_encryption_materialsc                 C   s0   |rt | ¡ ƒ}|| j ¡ v r| j| S d S d S r&   )rQ   rR   r6   Úkeys)r"   r   r(   r#   r#   r$   Úget_encryption_materialsy   s   
ýz+BaseCryptoProvider.get_encryption_materialsr&   )r   )r.   r/   r0   Ú__doc__r%   ÚabcÚabstractmethodr9   r<   ÚstaticmethodrA   rD   rG   rI   rL   rM   rP   rS   rU   r#   r#   r#   r$   r1   >   s*    






r1   z.oss-local-rsac                       sr   e Zd ZdZdZdZddde ¡ eef‡ fdd„	Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚLocalRsaProviderõ]  ä½¿ç”¨æœ¬åœ°RSAåŠ å¯†æ•°æ®å¯†é’¥ã€‚

        :param str dir: æœ¬åœ°RSAå…¬é’¥ç§é’¥å­˜å‚¨è·¯å¾„
        :param str key: æœ¬åœ°RSAå…¬é’¥ç§é’¥åç§°å‰ç¼€
        :param str passphrase: æœ¬åœ°RSAå…¬é’¥ç§é’¥å¯†ç 
        :param class cipher: æ•°æ®åŠ å¯†ï¼Œé»˜è®¤aes256ï¼Œç”¨æˆ·å¯è‡ªè¡Œå®žçŽ°å¯¹ç§°åŠ å¯†ç®—æ³•ï¼Œéœ€ç¬¦åˆAESCipheræ³¨é‡Šè§„åˆ™
    z.public_key.pemz.private_key.pemNÚ c              
      sî  t t| ƒj|d tj| _|ptj tj 	d¡t
¡}tj ||| ¡}tj ||| ¡}	zµtj |¡r‚tj |	¡r‚t|dƒ}
t tj|
 ¡ |d¡| _W d   ƒ n1 sVw   Y  t|	dƒ}
t tj|
 ¡ |d¡| _W d   ƒ W d S 1 szw   Y  W d S t d¡ t d¡}| ¡ }t |¡| _t |¡| _t |¡ t|dƒ}
|
 |j|d¡ W d   ƒ n1 sºw   Y  t|	dƒ}
|
 |j|d¡ W d   ƒ W d S 1 sÚw   Y  W d S  tttfyö } ztt |ƒƒ‚d }~ww )N)r2   ú~Úrb©r!   zOThe file path of private key or public key is not exist, will generate key pairi   Úwb)!ÚsuperrZ   r%   r   Ú#RSA_NONE_OAEPWithSHA1AndMGF1Paddingr4   ÚosÚpathÚjoinÚ
expanduserÚ_LOCAL_RSA_TMP_DIRÚexistsÚopenr   Únewr   Ú	importKeyÚreadÚ_LocalRsaProvider__decrypt_objÚ_LocalRsaProvider__encrypt_objÚloggerÚwarnÚgenerateÚ	publickeyr   Ú	makedir_pÚwriteÚ	exportKeyÚ
ValueErrorÚ	TypeErrorÚ
IndexErrorr   Ústr)r"   Údirr(   r!   r2   Úpub_key_suffixÚprivate_key_suffixÚkeys_dirÚpriv_key_pathÚpub_key_pathÚfÚprivate_keyÚ
public_keyÚe©Ú	__class__r#   r$   r%      s:   ÿ&ÿ


ÿ&ÿ€ÿzLocalRsaProvider.__init__c                 C   r;   r&   ©r2   r9   r8   r#   r#   r$   r9   ³   r=   zLocalRsaProvider.get_keyc              
   C   ó6   z|   |¡W S  ttfy } ztt|ƒƒ‚d }~ww r&   ©Ú_LocalRsaProvider__decrypt_datarw   rv   r   ry   ©r"   rF   rƒ   r#   r#   r$   rG   ¶   ó   €ÿz&LocalRsaProvider.decrypt_encrypted_keyc              
   C   r‡   r&   rˆ   ©r"   rH   rƒ   r#   r#   r$   rI   ¼   r‹   z%LocalRsaProvider.decrypt_encrypted_ivc                 C   s   t dƒ‚)Nz*do not support reset_encryption_materials!)r   rJ   r#   r#   r$   rL   Â   s   z+LocalRsaProvider.reset_encryption_materialsc           	      C   ó^   |   ¡ }|  |¡}|  ¡ }|  |¡}t | j¡}| j}| j}| ||¡ t 	|||||¡}|S r&   )
r9   Ú_LocalRsaProvider__encrypt_datar<   Úcopyr2   r4   r5   Ú
initializer   ÚContentCryptoMaterial©	r"   Ú	plain_keyrF   Úplain_ivrH   r2   r4   r5   Úcontent_crypto_materialr#   r#   r$   rP   Å   ó   

ÿz(LocalRsaProvider.create_content_materialc                 C   ó   | j  |¡S r&   )rn   r?   ©r"   Údatar#   r#   r$   Ú__encrypt_dataÔ   ó   zLocalRsaProvider.__encrypt_datac                 C   r—   r&   )rm   rB   r˜   r#   r#   r$   Ú__decrypt_data×   r›   zLocalRsaProvider.__decrypt_data)r.   r/   r0   rV   ÚDEFAULT_PUB_KEY_SUFFIXÚDEFAULT_PRIV_KEY_SUFFIXr   ÚAESCTRCipherr%   r9   rG   rI   rL   rP   rŽ   r‰   Ú__classcell__r#   r#   r„   r$   rZ   ƒ   s    ÿ#rZ   c                       sd   e Zd ZdZde ¡ df‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Z‡  ZS )ÚRsaProviderr[   Nc              
      s¬   t t| ƒj||d tj| _|rt|tƒstdƒ‚z(d|v r+t	 
tj|d |d¡| _d|v r?t	 
tj|d |d¡| _W d S W d S  ttfyU } ztt|ƒƒ‚d }~ww )N©r2   r5   r   r‚   r_   r   )ra   r¡   r%   r   Ú$RSA_NONE_PKCS1Padding_WRAP_ALGORITHMr4   r   r   r   r   rj   r   rk   Ú_RsaProvider__encrypt_objÚ_RsaProvider__decrypt_objrv   rw   ry   )r"   r   r!   r2   r5   rƒ   r„   r#   r$   r%   å   s    ÿ€ÿzRsaProvider.__init__c                 C   r;   r&   r†   r8   r#   r#   r$   r9   ö   r=   zRsaProvider.get_keyc              
   C   r‡   r&   ©Ú_RsaProvider__decrypt_datarw   rv   r   ry   rŠ   r#   r#   r$   rG   ù   r‹   z!RsaProvider.decrypt_encrypted_keyc              
   C   r‡   r&   r¦   rŒ   r#   r#   r$   rI   ÿ   r‹   z RsaProvider.decrypt_encrypted_ivc                 C   s   t |j|j| j|jƒS r&   )r¡   r   r!   r2   r   rJ   r#   r#   r$   rL     s   ÿz&RsaProvider.reset_encryption_materialsc           	      C   r   r&   )
r9   Ú_RsaProvider__encrypt_datar<   r   r2   r4   r5   r   r   r‘   r’   r#   r#   r$   rP   	  r–   z#RsaProvider.create_content_materialc                 C   r—   r&   )r¤   r?   r˜   r#   r#   r$   rš     r›   zRsaProvider.__encrypt_datac                 C   s"   | j  |t¡}|tkrtdƒ‚|S )Nz0Decrypted data error, please check you key pair!)r¥   rB   Úobjectr   )r"   r™   Údecrypted_datar#   r#   r$   rœ     s   zRsaProvider.__decrypt_data)r.   r/   r0   rV   r   rŸ   r%   r9   rG   rI   rL   rP   r¨   r§   r    r#   r#   r„   r$   r¡   Û   s    r¡   c                       sx   e Zd ZdZdde ¡ df‡ fdd„	Zdd„ Zdd„ Zdd
d„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚAliKMSProvideruó  ä½¿ç”¨aliyun kmsæœåŠ¡åŠ å¯†æ•°æ®å¯†é’¥ã€‚kmsçš„è¯¦ç»†è¯´æ˜Žå‚è§
        https://help.aliyun.com/product/28933.html?spm=a2c4g.11186623.3.1.jlYT4v
        æ­¤æŽ¥å£åœ¨py3.3ä¸‹æš‚æ—¶ä¸å¯ç”¨ï¼Œè¯¦è§
        https://github.com/aliyun/aliyun-openapi-python-sdk/issues/61

        :param str access_key_id: å¯ä»¥è®¿é—®kmså¯†é’¥æœåŠ¡çš„access_key_id
        :param str access_key_secret: å¯ä»¥è®¿é—®kmså¯†é’¥æœåŠ¡çš„access_key_secret
        :param str region: kmså¯†é’¥æœåŠ¡åœ°åŒº
        :param str cmkey: ç”¨æˆ·ä¸»å¯†é’¥
        :param str sts_token: security tokenï¼Œå¦‚æžœä½¿ç”¨çš„æ˜¯ä¸´æ—¶AKéœ€æä¾›
        :param str passphrase: kmså¯†é’¥æœåŠ¡å¯†ç 
        :param class cipher: æ•°æ®åŠ å¯†ï¼Œé»˜è®¤aes256ï¼Œå½“å‰ä»…æ”¯æŒé»˜è®¤å®žçŽ°
    Nc	           	         sf   t t| ƒj||d t|tjƒstdƒ‚tj| _	|| _
|| _|r&d| d nd| _t |||¡| _d S )Nr¢   z-AliKMSProvider only support AES256 cipher nowú{"x-passphrase":"ú"}r\   )ra   r«   r%   r   r   rŸ   r   r   ÚKMS_ALI_WRAP_ALGORITHMr4   r    Ú	sts_tokenÚcontextr   Ú	AcsClientÚ
kms_client)	r"   Úaccess_key_idÚaccess_key_secretÚregionÚcmk_idr¯   r!   r2   r5   r„   r#   r$   r%   1  s   zAliKMSProvider.__init__c                 C   s   |   ¡ \}}||fS r&   )Ú"_AliKMSProvider__generate_data_key)r"   r“   rF   r#   r#   r$   r9   =  s   zAliKMSProvider.get_keyc                 C   s   t |  |¡ƒS r&   )r   Ú_AliKMSProvider__decrypt_datarE   r#   r#   r$   rG   A  r+   z$AliKMSProvider.decrypt_encrypted_keyFc                 C   s   |r|   |¡S t|   |¡ƒS r&   )r¸   r   )r"   rH   Ú
deprecatedr#   r#   r$   rI   D  s   
z#AliKMSProvider.decrypt_encrypted_ivc                 C   s8   t   | ¡}|j|_|jrd|j d nd|_|j|_|S )Nr¬   r­   r\   )r   r    r!   r°   r   r5   )r"   rK   Úproviderr#   r#   r$   rL   I  s
   
z)AliKMSProvider.reset_encryption_materialsc           	      C   s\   |   ¡ \}}|  ¡ }|  t|ƒ¡}t | j¡}| j}| j}| ||¡ t	 
|||||¡}|S r&   )r9   r<   Ú_AliKMSProvider__encrypt_datar   r   r2   r4   r5   r   r   r‘   r’   r#   r#   r$   rP   P  s   ÿz&AliKMSProvider.create_content_materialc                 C   s|   t   ¡ }| tj¡ | tj¡ | | j¡ | 	d¡ | 
d¡ | | j¡ | jr/| | j¡ |  |¡}t|d ƒ|d fS )NÚAES_256é    Ú	PlaintextÚCiphertextBlob)r   Úset_accept_formatr	   ÚJSONÚ
set_methodr
   ÚPOSTÚ	set_KeyIdr    Úset_KeySpecÚset_NumberOfBytesÚset_EncryptionContextr°   r¯   Úset_STSTokenÚ_AliKMSProvider__dor   )r"   ÚreqÚrespr#   r#   r$   Ú__generate_data_key^  s   


z"AliKMSProvider.__generate_data_keyc                 C   sf   t   ¡ }| tj¡ | tj¡ | | j¡ | 	|¡ | 
| j¡ | jr*| | j¡ |  |¡}|d S )Nr¿   )r   rÀ   r	   rÁ   rÂ   r
   rÃ   rÄ   r    Úset_PlaintextrÇ   r°   r¯   rÈ   rÉ   ©r"   r™   rÊ   rË   r#   r#   r$   rš   o  s   

zAliKMSProvider.__encrypt_datac                 C   sZ   t   ¡ }| tj¡ | tj¡ | |¡ | | j	¡ | j
r$| | j
¡ |  |¡}|d S )Nr¾   )r   rÀ   r	   rÁ   rÂ   r
   rÃ   Úset_CiphertextBlobrÇ   r°   r¯   rÈ   rÉ   rÎ   r#   r#   r$   rœ   ~  s   

zAliKMSProvider.__decrypt_datac              
   C   s˜   z| j  |¡}t t|ƒ¡W S  ty% } zt|j|j|j	|j
ƒ‚d }~w ty5 } zt|j	ƒ‚d }~w tttfyK } ztdt|ƒ ƒ‚d }~ww )NzJson Error: )r²   Údo_action_with_exceptionÚjsonÚloadsr   r   r   Úhttp_statusÚ
request_idÚmessageÚ
error_coder   r   ÚKeyErrorrv   rw   r   ry   )r"   rÊ   Úbodyrƒ   r#   r#   r$   Ú__do‹  s   €
€€ÿzAliKMSProvider.__do)F)r.   r/   r0   rV   r   rŸ   r%   r9   rG   rI   rL   rP   r·   r»   r¸   rÉ   r    r#   r#   r„   r$   r«   "  s    ÿ
r«   )5rV   rW   ÚhashlibrÑ   rc   r   ÚloggingÚstructÚ	functoolsr   ÚsixÚCrypto.Cipherr   r   ÚCrypto.PublicKeyr   Úaliyunsdkcorer   Ú&aliyunsdkcore.acs_exception.exceptionsr   r   Úaliyunsdkcore.httpr	   r
   Úaliyunsdkkms.request.v20160120r   r   r   r\   r   r   r   r   r   Úcompatr   r   Ú
exceptionsr   r   r   Ú	getLoggerr.   ro   r©   r   Úadd_metaclassÚABCMetar1   rg   rZ   r¡   r«   r#   r#   r#   r$   Ú<module>   s@   

A

WF