@@ -9,18 +9,33 @@ def __init__(self):
9
9
self .txKey = None
10
10
11
11
12
+ class CoSignerResponseV3 :
13
+ def __init__ (self ):
14
+ # action
15
+ self .action = None
16
+ # approvalId
17
+ self .approvalId = None
18
+
19
+
12
20
class CoSignerConverter :
13
21
14
22
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 )
20
35
21
36
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 )
24
39
required_keys = {
25
40
'key' ,
26
41
'sig' ,
@@ -65,10 +80,50 @@ def request_convert(self, co_signer_call_back):
65
80
66
81
return json .loads (r .decode ())
67
82
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
+
68
123
# It has been Deprecated,Please use convertCoSignerResponseWithNewCryptoType
69
124
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 )
72
127
73
128
ret = dict ()
74
129
@@ -98,8 +153,8 @@ def response_converter(self, co_signer_response: CoSignerResponse):
98
153
return ret
99
154
100
155
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 )
103
158
104
159
ret = dict ()
105
160
0 commit comments