@@ -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