@@ -63,20 +63,23 @@ typedef struct {
6363 uint8_t replay_counter [REPLAY_COUNTER_LEN ];
6464} pin_keys_t ;
6565
66- typedef struct {
67- const char * document ;
68- const char * on_reply ;
69- const char * data ;
70- } pin_data_t ;
71-
72- // The urls may be overridden in storage, otherwise use the default
73- static void add_urls (CborEncoder * encoder , const char * document )
66+ // The urls may be overridden in storage, otherwise use the defaults
67+ static void send_http_request_reply (jade_process_t * process , const char * document , const char * data )
7468{
69+ JADE_ASSERT (process );
70+ JADE_ASSERT (document );
71+ JADE_ASSERT (data );
72+
73+ // Prepare request data
74+ data_request_t pin_data
75+ = { .method = "POST" , .accept = "json" , .on_reply = "pin" , .strdata = data , .rawdata_len = 0 , .num_urls = 0 };
76+
77+ // Add urls - bespoke pinserver urls or defaults if not set
7578 char buf [MAX_PINSVR_URL_LENGTH ];
7679 char urlA [sizeof (buf ) + sizeof (PINSERVER_DOC_GET_PIN )];
7780 char urlB [sizeof (buf ) + sizeof (PINSERVER_DOC_GET_PIN )];
7881
79- // Get first URL (defaults to h/coded url)
82+ // Add first URL (defaults to h/coded url)
8083 size_t urlA_len = 0 ;
8184 const bool urlASet = storage_get_pinserver_urlA (buf , sizeof (buf ), & urlA_len );
8285 if (urlASet && urlA_len <= 1 ) {
@@ -85,9 +88,10 @@ static void add_urls(CborEncoder* encoder, const char* document)
8588 } else {
8689 urlA_len = snprintf (urlA , sizeof (urlA ), "%s/%s" , urlASet ? buf : PINSERVER_URL , document );
8790 JADE_ASSERT (urlA_len > 0 && urlA_len < sizeof (urlA ));
91+ pin_data .urls [pin_data .num_urls ++ ] = urlA ;
8892 }
8993
90- // Get second URL (defaults to h/coded onion)
94+ // Add second URL (defaults to h/coded onion)
9195 size_t urlB_len = 0 ;
9296 const bool urlBSet = storage_get_pinserver_urlB (buf , sizeof (buf ), & urlB_len );
9397 if (urlBSet && urlB_len <= 1 ) {
@@ -96,97 +100,20 @@ static void add_urls(CborEncoder* encoder, const char* document)
96100 } else {
97101 urlB_len = snprintf (urlB , sizeof (urlB ), "%s/%s" , urlBSet ? buf : PINSERVER_ONION , document );
98102 JADE_ASSERT (urlB_len > 0 && urlB_len < sizeof (urlB ));
103+ pin_data .urls [pin_data .num_urls ++ ] = urlB ;
99104 }
100105
101106 JADE_ASSERT (urlASet == urlBSet );
102- const char * urls [2 ] = { urlA , urlB };
103- add_string_array_to_map (encoder , "urls" , urls , 2 );
104- }
105-
106- // {
107- // "http_request": {
108- // // params can be passed directly to gdk.http_request()
109- // "params": {
110- // "urls": [],
111- // "root_certificates": [`certificate`]' ** only present if user has set an additional certificate
112- // "method": "POST",
113- // "accept": "json",
114- // "data": `data`
115- // }
116- // "on-reply": `on_reply` ** the result of gdk.http_request(params) should be passed to this method
117- // }
118- static void http_post_reply (const void * ctx , CborEncoder * container )
119- {
120- JADE_ASSERT (ctx );
121- JADE_ASSERT (container );
122107
108+ // Add any user certificate
123109 size_t cert_len = 0 ;
124110 char user_certificate [MAX_PINSVR_CERTIFICATE_LENGTH ];
125- const bool have_certificate = storage_get_pinserver_cert (user_certificate , sizeof (user_certificate ), & cert_len );
126-
127- const pin_data_t * reply_data = (const pin_data_t * )ctx ;
128- JADE_ASSERT (reply_data -> document );
129- JADE_ASSERT (reply_data -> on_reply );
130- JADE_ASSERT (reply_data -> data );
131-
132- CborEncoder root_map ;
133- CborError cberr = cbor_encoder_create_map (container , & root_map , 1 );
134- JADE_ASSERT (cberr == CborNoError );
135-
136- // Envelope data for http request
137- cberr = cbor_encode_text_stringz (& root_map , "http_request" );
138- JADE_ASSERT (cberr == CborNoError );
139-
140- CborEncoder http_encoder ;
141- cberr = cbor_encoder_create_map (& root_map , & http_encoder , 2 );
142- JADE_ASSERT (cberr == CborNoError );
143-
144- cberr = cbor_encode_text_stringz (& http_encoder , "params" );
145- JADE_ASSERT (cberr == CborNoError );
146-
147- CborEncoder params_encoder ;
148- const size_t num_params = have_certificate ? 5 : 4 ;
149- cberr = cbor_encoder_create_map (& http_encoder , & params_encoder , num_params );
150- JADE_ASSERT (cberr == CborNoError );
151-
152- // The urls (tls and onion) and any associated root certificate we may require
153- // These may be the built-in defaults, or may have been overridden (in storage)
154- add_urls (& params_encoder , reply_data -> document );
155-
156- if (have_certificate ) {
157- const char * root_certificates [] = { user_certificate };
158- add_string_array_to_map (& params_encoder , "root_certificates" , root_certificates , 1 );
111+ if (storage_get_pinserver_cert (user_certificate , sizeof (user_certificate ), & cert_len ) && cert_len ) {
112+ pin_data .certificate = user_certificate ;
159113 }
160114
161- // The method here is always POST and the payload always json
162- add_string_to_map (& params_encoder , "method" , "POST" );
163- add_string_to_map (& params_encoder , "accept" , "json" );
164-
165- // Add payload data
166- cberr = cbor_encode_text_stringz (& params_encoder , "data" );
167- JADE_ASSERT (cberr == CborNoError );
168-
169- CborEncoder data_encoder ;
170- cberr = cbor_encoder_create_map (& params_encoder , & data_encoder , 1 );
171- JADE_ASSERT (cberr == CborNoError );
172-
173- // Payload data - one large opaque base64 string
174- add_string_to_map (& data_encoder , "data" , reply_data -> data );
175-
176- cberr = cbor_encoder_close_container (& params_encoder , & data_encoder );
177- JADE_ASSERT (cberr == CborNoError );
178-
179- cberr = cbor_encoder_close_container (& http_encoder , & params_encoder );
180- JADE_ASSERT (cberr == CborNoError );
181-
182- // Add function to call with server's reply payload
183- add_string_to_map (& http_encoder , "on-reply" , reply_data -> on_reply );
184-
185- cberr = cbor_encoder_close_container (& root_map , & http_encoder );
186- JADE_ASSERT (cberr == CborNoError );
187-
188- cberr = cbor_encoder_close_container (container , & root_map );
189- JADE_ASSERT (cberr == CborNoError );
115+ // Send reply message
116+ jade_process_reply_to_message_result (process -> ctx , & pin_data , http_request_reply );
190117}
191118
192119// Hepler to tweak the server static key into a session key
@@ -535,8 +462,7 @@ static pinserver_result_t pinserver_interaction(jade_process_t* process, const u
535462 }
536463
537464 // Build and send cbor reply
538- const pin_data_t pin_data = { .document = document , .on_reply = "pin" , .data = data };
539- jade_process_reply_to_message_result (process -> ctx , & pin_data , http_post_reply );
465+ send_http_request_reply (process , document , data );
540466
541467 // Get the server's aes key for the given pin/key data
542468 uint8_t serverkey [AES_KEY_LEN_256 ];
0 commit comments