@@ -9,18 +9,33 @@ def __init__(self):
99 self .txKey = None
1010
1111
12+ class CoSignerResponseV3 :
13+ def __init__ (self ):
14+ # action
15+ self .action = None
16+ # approvalId
17+ self .approvalId = None
18+
19+
1220class CoSignerConverter :
1321
1422 def __init__ (self , config ):
15- self .api_pub_key = config ['apiPubKey' ]
16- if config .get ('bizPrivKey' ):
17- self .biz_privKey = PEM_PRIVATE_HEAD + config ['bizPrivKey' ] + PEM_PRIVATE_END
18- if config .get ('bizPrivKeyPemFile' ):
19- self .biz_privKey = load_rsa_private_key (config ['bizPrivKeyPemFile' ])
23+ # Supports both coSignerPubKey and apiPublKey
24+ self .co_signer_pub_key = config .get ('coSignerPubKey' ) or config .get ('apiPubKey' )
25+
26+ # Supports both approvalCallbackServicePrivateKey and bizPrivKey
27+ private_key = config .get ('approvalCallbackServicePrivateKey' ) or config .get ('bizPrivKey' )
28+ if private_key :
29+ self .approval_callback_service_private_key = PEM_PRIVATE_HEAD + private_key + PEM_PRIVATE_END
30+
31+ # Supports both approvalCallbackServicePrivateKeyPemFile and bizPrivKeyPemFile
32+ pem_file = config .get ('approvalCallbackServicePrivateKeyPemFile' ) or config .get ('bizPrivKeyPemFile' )
33+ if pem_file :
34+ self .approval_callback_service_private_key = load_rsa_private_key (pem_file )
2035
2136 def request_convert (self , co_signer_call_back ):
22- platform_rsa_pk = get_rsa_key (PEM_PUBLIC_HEAD + self .api_pub_key + PEM_PUBLIC_END )
23- api_user_rsa_sk = get_rsa_key (self .biz_privKey )
37+ platform_rsa_pk = get_rsa_key (PEM_PUBLIC_HEAD + self .co_signer_pub_key + PEM_PUBLIC_END )
38+ api_user_rsa_sk = get_rsa_key (self .approval_callback_service_private_key )
2439 required_keys = {
2540 'key' ,
2641 'sig' ,
@@ -65,10 +80,50 @@ def request_convert(self, co_signer_call_back):
6580
6681 return json .loads (r .decode ())
6782
83+ def request_v3_convert (self , co_signer_call_back ):
84+ platform_rsa_pk = get_rsa_key (PEM_PUBLIC_HEAD + self .co_signer_pub_key + PEM_PUBLIC_END )
85+ required_keys = {
86+ 'version' ,
87+ 'sig' ,
88+ 'bizContent' ,
89+ 'timestamp' ,
90+ }
91+
92+ missing_keys = required_keys .difference (co_signer_call_back .keys ())
93+ if missing_keys :
94+ raise Exception (co_signer_call_back )
95+ co_signer_call_back ['version' ] = 'v3'
96+ sig = co_signer_call_back .pop ('sig' )
97+
98+ need_sign_message = sort_request (co_signer_call_back )
99+ v = rsa_pass_verify (platform_rsa_pk , need_sign_message , sig )
100+ if not v :
101+ raise Exception ("rsa verify: false" )
102+ return json .loads (b64decode (co_signer_call_back ['bizContent' ]).decode ())
103+
104+ def response_v3_converter (self , co_signer_response : CoSignerResponseV3 ):
105+ api_user_rsa_sk = get_rsa_key (self .approval_callback_service_private_key )
106+ ret = dict ()
107+ response_data = json .dumps (co_signer_response .__dict__ ).replace ('\' ' , '\" ' ).replace ('\n ' , '' ).encode ('utf-8' )
108+
109+ if response_data is not None :
110+ ret ['bizContent' ] = b64encode (response_data ).decode ()
111+
112+ ret ['timestamp' ] = str (int (time .time () * 1000 ))
113+ ret ['code' ] = str ('200' )
114+ ret ['version' ] = str ('v3' )
115+ ret ['message' ] = str ('SUCCESS' )
116+
117+ # 4 sign request
118+ need_sign_message = sort_request (ret )
119+ ret ['sig' ] = rsa_pss_sign (api_user_rsa_sk , need_sign_message )
120+ return ret
121+
122+
68123 # It has been Deprecated,Please use convertCoSignerResponseWithNewCryptoType
69124 def response_converter (self , co_signer_response : CoSignerResponse ):
70- platform_rsa_pk = get_rsa_key (PEM_PUBLIC_HEAD + self .api_pub_key + PEM_PUBLIC_END )
71- api_user_rsa_sk = get_rsa_key (self .biz_privKey )
125+ platform_rsa_pk = get_rsa_key (PEM_PUBLIC_HEAD + self .co_signer_pub_key + PEM_PUBLIC_END )
126+ api_user_rsa_sk = get_rsa_key (self .approval_callback_service_private_key )
72127
73128 ret = dict ()
74129
@@ -98,8 +153,8 @@ def response_converter(self, co_signer_response: CoSignerResponse):
98153 return ret
99154
100155 def response_converter_with_new_crypto_type (self , co_signer_response : CoSignerResponse ):
101- platform_rsa_pk = get_rsa_key (PEM_PUBLIC_HEAD + self .api_pub_key + PEM_PUBLIC_END )
102- api_user_rsa_sk = get_rsa_key (self .biz_privKey )
156+ platform_rsa_pk = get_rsa_key (PEM_PUBLIC_HEAD + self .co_signer_pub_key + PEM_PUBLIC_END )
157+ api_user_rsa_sk = get_rsa_key (self .approval_callback_service_private_key )
103158
104159 ret = dict ()
105160
0 commit comments