
    "hj:                     X   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jR                  e*      Z+ G d de,      Z- e
j\                  ej^                         G d de,             Z0dZ1 e
j\                  ej^                         G d de0             Z2 e
j\                  ej^                         G d de0             Z3 G d de0      Z4y)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                        e Zd ZddZd Zd Zy)EncryptionMaterialsNc                     i | _         |r#t        |t              r|| _         nt        d      |r|rt        d      |rt        |t              st        d      || _        || _        || _        y )N0Invalid type, the type of mat_desc must be dict!z3Both key_pair and custom_master_key_id are not none0Invalid type, the type of key_pair must be dict!)desc
isinstancedictr   key_paircustom_master_key_id
passphrase)selfr   r"   r#   r$   s        I/root/.hermes/SkillClaw/.venv/lib/python3.12/site-packages/oss2/crypto.py__init__zEncryptionMaterials.__init__%   si    	$% 	!"TUU,STTJx6PQQ $8!$    c                 "    || j                   |<   y Nr   )r%   keyvalues      r&   add_descriptionz#EncryptionMaterials.add_description6   s    		#r(   c                 6    |D ]  }||   | j                   |<    y r*   r+   )r%   descriptionsr,   s      r&   add_descriptionsz$EncryptionMaterials.add_descriptions9   s#     	/C)#.DIIcN	/r(   )NNN)__name__
__module____qualname__r'   r.   r1    r(   r&   r   r   $   s    %"/r(   r   c                      e Zd ZdZddZej                  d        Zd Ze	d        Z
e	dd       Zej                  d        Zej                  d	        Zej                  d
        Zd Zej                  d        Zd Zd Zy)BaseCryptoProvideruF   CryptoProvider 基类，提供基础的数据加密解密adapter

    Nc                     |st        d      || _        d | _        d | _        d | _        i | _        |r#t        |t              r|| _        y t        d      y )Nz&Please initialize the value of cipher!r   )r   ciphercek_algwrap_algmat_descencryption_materials_dictr    r!   )r%   r9   r<   s      r&   r'   zBaseCryptoProvider.__init__D   sZ    FGG)+&(D) (!"TUU	 r(   c                      y r*   r5   r%   s    r&   get_keyzBaseCryptoProvider.get_keyR       r(   c                 6    | j                   j                         S r*   )r9   get_ivr?   s    r&   rC   zBaseCryptoProvider.get_ivV   s    {{!!##r(   c                 T    t        j                  | t        |j                              S r*   )r   make_cipher_adapterr   encrypt)streamr9   s     r&   make_encrypt_adapterz'BaseCryptoProvider.make_encrypt_adapterY   s    ((1HIIr(   c                 V    t        j                  | t        |j                        |      S r*   )r   rE   r   decrypt)rG   r9   discards      r&   make_decrypt_adapterz'BaseCryptoProvider.make_decrypt_adapter]   s     ((1H'RRr(   c                      y r*   r5   r%   encrypted_keys     r&   decrypt_encrypted_keyz(BaseCryptoProvider.decrypt_encrypted_keya   rA   r(   c                      y r*   r5   )r%   encrypted_ivs     r&   decrypt_encrypted_ivz'BaseCryptoProvider.decrypt_encrypted_ive   rA   r(   c                      y r*   r5   r%   encryption_materialss     r&   reset_encryption_materialsz-BaseCryptoProvider.reset_encryption_materialsi   rA   r(   c                 :    | j                   j                  ||      S r*   )r9   adjust_range)r%   startends      r&   rY   zBaseCryptoProvider.adjust_rangem   s    {{''s33r(   c                      y r*   r5   r?   s    r&   create_content_materialz*BaseCryptoProvider.create_content_materialp   rA   r(   c                     |j                   r3t        |j                   j                               }|| j                  |<   y y r*   )r   	frozensetitemsr=   )r%   rV   r,   s      r&   add_encryption_materialsz+BaseCryptoProvider.add_encryption_materialst   s:    $$055;;=>C2FD**3/ %r(   c                     |rEt        |j                               }|| j                  j                         v r| j                  |   S y y r*   )r_   r`   r=   keys)r%   r   r,   s      r&   get_encryption_materialsz+BaseCryptoProvider.get_encryption_materialsy   sG    DJJL)Cd4499;;55c:: < r(   r*   )r   )r2   r3   r4   __doc__r'   abcabstractmethodr@   rC   staticmethodrH   rL   rP   rS   rW   rY   r]   ra   rd   r5   r(   r&   r7   r7   >   s    V 	 $ J J S S 	  	  	 4 	 G
;r(   r7   z.oss-local-rsac                        e Zd ZdZdZdZddd ej                         eef fd	Zd Z	d Z
d	 Zd
 Zd Zd Zd Z x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                    t         t        |   |       t        j                  | _        |xsA t        j                  j                  t        j                  j                  d      t              }t        j                  j                  |||z         }t        j                  j                  |||z         }		 t        j                  j                  |      rt        j                  j                  |	      rt        |d      5 }
t        j                  t        j                   |
j#                         |            | _        d d d        t        |	d      5 }
t        j                  t        j                   |
j#                         |            | _        d d d        y t(        j+                  d       t        j,                  d      }|j/                         }t        j                  |      | _        t        j                  |      | _        t1        j2                  |       t        |d      5 }
|
j5                  |j7                  |             d d d        t        |	d      5 }
|
j5                  |j7                  |             d d d        y # 1 sw Y   MxY w# 1 sw Y   y xY w# 1 sw Y   YxY w# 1 sw Y   y xY w# t8        t:        t<        f$ r}t?        tA        |            d }~ww xY w)N)r9   ~rbr$   zOThe file path of private key or public key is not exist, will generate key pairi   wb)!superrj   r'   r   #RSA_NONE_OAEPWithSHA1AndMGF1Paddingr;   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$   r9   pub_key_suffixprivate_key_suffixkeys_dirpriv_key_pathpub_key_pathfprivate_key
public_keye	__class__s                 r&   r'   zLocalRsaProvider.__init__   sA    	.f.=CCS"'',,rww'9'9#'>@RSXs5G/GHww||HcN.BC	&ww~~m,1M-. h!)3affh[e8f)gD&h ,- h)3affh[e8f)gD&h h mn!ll40(224
%/^^J%?"%/^^K%@")-. J!GGK11Z1HIJ ,- IGGJ00J0GHI I%h hh hJ JI IIz2 	&c!f%%	&s   7A
J; >J
?J; >JJ; BJ; )"J#J; "J/J; 
JJ; J J;  J; #J,(J; /J84J; 8J; ;K(K##K(c                 6    | j                   j                         S r*   r9   r@   r?   s    r&   r@   zLocalRsaProvider.get_key       {{""$$r(   c                 |    	 | j                  |      S # t        t        f$ r}t        t	        |            d }~ww xY wr*   _LocalRsaProvider__decrypt_datar   r   r   r   r%   rO   r   s      r&   rP   z&LocalRsaProvider.decrypt_encrypted_key   <    	&&&}55:& 	&c!f%%	&    ;6;c                 |    	 | j                  |      S # t        t        f$ r}t        t	        |            d }~ww xY wr*   r   r%   rR   r   s      r&   rS   z%LocalRsaProvider.decrypt_encrypted_iv   <    	&&&|44:& 	&c!f%%	&r   c                     t        d      )Nz*do not support reset_encryption_materials!)r   rU   s     r&   rW   z+LocalRsaProvider.reset_encryption_materials   s    FGGr(   c                 N   | j                         }| j                  |      }| j                         }| j                  |      }t        j                  | j                        }| j
                  }| j                  }|j                  ||       t        j                  |||||      }|S r*   )
r@   _LocalRsaProvider__encrypt_datarC   copyr9   r;   r<   
initializer   ContentCryptoMaterial	r%   	plain_keyrO   plain_ivrR   r9   r;   r<   content_crypto_materials	            r&   r]   z(LocalRsaProvider.create_content_material       LLN	++I6;;=**844;;'====)X."(">">vxQ^`l?G#I&&r(   c                 8    | j                   j                  |      S r*   )r   rF   r%   datas     r&   __encrypt_datazLocalRsaProvider.__encrypt_data       !!))$//r(   c                 8    | j                   j                  |      S r*   )r~   rJ   r   s     r&   __decrypt_datazLocalRsaProvider.__decrypt_data   r   r(   )r2   r3   r4   re   DEFAULT_PUB_KEY_SUFFIXDEFAULT_PRIV_KEY_SUFFIXr   AESCTRCipherr'   r@   rP   rS   rW   r]   r   r   __classcell__r   s   @r&   rj   rj      s[     /0RDASASASAU 6Kb!&F%&&H'00r(   rj   c                   r     e Zd ZdZd ej
                         df fd	Zd Zd Zd Z	d Z
d Zd	 Zd
 Z xZS )RsaProviderrk   Nc                    t         t        |   ||       t        j                  | _        |rt        |t              st        d      	 d|v r2t        j                  t        j                  |d   |            | _        d|v r3t        j                  t        j                  |d   |            | _        y y # t        t         f$ r}t        t#        |            d }~ww xY w)Nr9   r<   r   r   rp   r   )rr   r   r'   r   $RSA_NONE_PKCS1Padding_WRAP_ALGORITHMr;   r    r!   r   r   r{   r   r|   _RsaProvider__encrypt_obj_RsaProvider__decrypt_objr   r   r   )r%   r"   r$   r9   r<   r   r   s         r&   r'   zRsaProvider.__init__   s    k4)()KDDJx6PQQ	&x'%/^^CMM(<BXeo4p%q"(%/^^CMM(=BYfp4q%r" )I& 	&c!f%%	&s   
A,B8 8C CC c                 6    | j                   j                         S r*   r   r?   s    r&   r@   zRsaProvider.get_key   r   r(   c                 |    	 | j                  |      S # t        t        f$ r}t        t	        |            d }~ww xY wr*   _RsaProvider__decrypt_datar   r   r   r   r   s      r&   rP   z!RsaProvider.decrypt_encrypted_key   r   r   c                 |    	 | j                  |      S # t        t        f$ r}t        t	        |            d }~ww xY wr*   r   r   s      r&   rS   z RsaProvider.decrypt_encrypted_iv   r   r   c                 n    t        |j                  |j                  | j                  |j                        S r*   )r   r"   r$   r9   r   rU   s     r&   rW   z&RsaProvider.reset_encryption_materials  s3    /88:N:Y:Y[_[f[f/446 	6r(   c                 N   | j                         }| j                  |      }| j                         }| j                  |      }t        j                  | j                        }| j
                  }| j                  }|j                  ||       t        j                  |||||      }|S r*   )
r@   _RsaProvider__encrypt_datarC   r   r9   r;   r<   r   r   r   r   s	            r&   r]   z#RsaProvider.create_content_material	  r   r(   c                 8    | j                   j                  |      S r*   )r   rF   r   s     r&   r   zRsaProvider.__encrypt_data  r   r(   c                 n    | j                   j                  |t              }|t        k(  rt        d      |S )Nz0Decrypted data error, please check you key pair!)r   rJ   objectr   )r%   r   decrypted_datas      r&   r   zRsaProvider.__decrypt_data  s4    ++33D&AV#PQQr(   )r2   r3   r4   re   r   r   r'   r@   rP   rS   rW   r]   r   r   r   r   s   @r&   r   r      sF     -19K9K9K9MX\ &"%&&6'0r(   r   c                        e Zd ZdZdd ej
                         df fd	Zd Zd ZddZ	d Z
d Zd	 Zd
 Zd Zd Z x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	                    t         t        |   ||       t        |t        j
                        st        d      t        j                  | _	        || _
        || _        |rd|z   dz   nd| _        t        j                  |||      | _        y )Nr   z-AliKMSProvider only support AES256 cipher now{"x-passphrase":""}rl   )rr   r   r'   r    r   r   r   r   KMS_ALI_WRAP_ALGORITHMr;   r#   	sts_tokencontextr   	AcsClient
kms_client)
r%   access_key_idaccess_key_secretregioncmk_idr   r$   r9   r<   r   s
            r&   r'   zAliKMSProvider.__init__1  s     	nd,FX,N&%"4"45MNN66$*!"BL*Z7$>RT **=:KVTr(   c                 0    | j                         \  }}||fS r*   )"_AliKMSProvider__generate_data_key)r%   r   rO   s      r&   r@   zAliKMSProvider.get_key=  s     #'#;#;#= 	=-''r(   c                 6    t        | j                  |            S r*   )r   _AliKMSProvider__decrypt_datarN   s     r&   rP   z$AliKMSProvider.decrypt_encrypted_keyA  s    $T%8%8%GHHr(   c                 \    |r| j                  |      S t        | j                  |            S r*   )r   r   )r%   rR   
deprecateds      r&   rS   z#AliKMSProvider.decrypt_encrypted_ivD  s,    &&|44$T%8%8%FGGr(   c                     t        j                   |       }|j                  |_        |j                  rd|j                  z   dz   nd|_        |j                  |_        |S )Nr   r   rl   )r   r#   r$   r   r   r<   )r%   rV   providers      r&   rW   z)AliKMSProvider.reset_encryption_materialsI  sZ    99T?(<(Q(Q%[o[z[z.1E1P1PPSWW  AC055r(   c                 D   | j                         \  }}| j                         }| j                  t        |            }t	        j                  | j
                        }| j                  }| j                  }|j                  ||       t        j                  |||||      }|S r*   )r@   rC   _AliKMSProvider__encrypt_datar   r   r9   r;   r<   r   r   r   r   s	            r&   r]   z&AliKMSProvider.create_content_materialP  s    #'<<> 	=;;=**+>x+HI4;;'====)X."(">">vxQ^`l?G#I&&r(   c                    t        j                          }|j                  t        j                         |j	                  t
        j                         |j                  | j                         |j                  d       |j                  d       |j                  | j                         | j                  r|j                  | j                         | 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resps      r&   __generate_data_keyz"AliKMSProvider.__generate_data_key^  s    $;;=k../{''(d//0	"b!!!$,,/>>T^^,yy~$T+%67>N9OOOr(   c                    t        j                          }|j                  t        j                         |j	                  t
        j                         |j                  | j                         |j                  |       |j                  | j                         | j                  r|j                  | j                         | j                  |      }|d   S )Nr   )r   r   r
   r   r   r   r   r   r#   set_Plaintextr   r   r   r   r   r%   r   r   r   s       r&   r   zAliKMSProvider.__encrypt_datao  s    ++-k../{''(d//0$!!$,,/>>T^^,yy~$%%r(   c                 x   t        j                          }|j                  t        j                         |j	                  t
        j                         |j                  |       |j                  | j                         | j                  r|j                  | j                         | j                  |      }|d   S )Nr   )r   r   r
   r   r   r   r   set_CiphertextBlobr   r   r   r   r   r   s       r&   r   zAliKMSProvider.__decrypt_data~  s    ++-k../{''(t$!!$,,/>>T^^,yy~K  r(   c                    	 | j                   j                  |      }t        j                  t	        |            S # t
        $ r;}t        |j                  |j                  |j                  |j                        d }~wt        $ r}t        |j                        d }~wt        t        t        f$ r}t!        dt#        |      z         d }~ww xY w)NzJson Error: )r   do_action_with_exceptionjsonloadsr   r   r   http_status
request_idmessage
error_coder	   r   KeyErrorr   r   r   r   )r%   r   bodyr   s       r&   __dozAliKMSProvider.__do  s    	>??;;C@D::j.// 	[$Q]]ALL!))Q\\ZZ 	)aii((*i0 	>$^c!f%<==	>s-   8; 	C6A::CBC2C		C)F)r2   r3   r4   re   r   r   r'   r@   rP   rS   rW   r]   r   r   r   r   r   r   s   @r&   r   r   "  sX     TXdh***,t
U(IH
'P"&!
>r(   r   )5re   rf   hashlibr   rt   r   loggingstruct	functoolsr   sixCrypto.Cipherr   r   Crypto.PublicKeyr   aliyunsdkcorer   &aliyunsdkcore.acs_exception.exceptionsr   r	   aliyunsdkcore.httpr
   r   aliyunsdkkms.request.v20160120r   r   r   rl   r   r   r   r   r   compatr   r   
exceptionsr   r   r   	getLoggerr2   r   r   r   add_metaclassABCMetar7   rx   rj   r   r   r5   r(   r&   <module>r     s      	     
 0     S 7 a a    = ( K K			8	$/& /4 3;;>; >;  >;B &  3;;T0) T0  T0n 3;;C$ C  CLs>' s>r(   