16
16
/* fd_sign_in_ctx_t is a context object for each in (producer) mcache
17
17
connected to the sign tile. */
18
18
19
- typedef struct {
20
- ulong seq ;
21
- fd_frag_meta_t * mcache ;
22
- uchar * data ;
23
- } fd_sign_out_ctx_t ;
19
+ struct fd_sign_out_ctx {
20
+ fd_wksp_t * out_mem ;
21
+ ulong out_chunk0 ;
22
+ ulong out_wmark ;
23
+ ulong out_chunk ;
24
+ };
25
+ typedef struct fd_sign_out_ctx fd_sign_out_ctx_t ;
26
+
27
+ struct fd_sign_in_ctx {
28
+ int role ;
29
+ fd_wksp_t * mem ;
30
+ ulong chunk0 ;
31
+ ulong wmark ;
32
+ ulong mtu ;
33
+ };
34
+ typedef struct fd_sign_in_ctx fd_sign_in_ctx_t ;
24
35
25
36
typedef struct {
26
37
uchar _data [ FD_KEYGUARD_SIGN_REQ_MTU ];
@@ -31,10 +42,7 @@ typedef struct {
31
42
32
43
uchar event_concat [ 18UL + 32UL ];
33
44
34
- int in_role [ MAX_IN ];
35
- uchar * in_data [ MAX_IN ];
36
- ushort in_mtu [ MAX_IN ];
37
-
45
+ fd_sign_in_ctx_t in [ MAX_IN ];
38
46
fd_sign_out_ctx_t out [ MAX_IN ];
39
47
40
48
fd_sha512_t sha512 [ 1 ];
@@ -103,18 +111,19 @@ during_frag_sensitive( void * _ctx,
103
111
ulong sz ) {
104
112
(void )seq ;
105
113
(void )sig ;
106
- (void )chunk ;
107
114
108
115
fd_sign_ctx_t * ctx = (fd_sign_ctx_t * )_ctx ;
109
116
FD_TEST ( in_idx < MAX_IN );
110
117
111
- int role = ctx -> in_role [ in_idx ];
112
- uint mtu = ctx -> in_mtu [ in_idx ];
118
+ int role = ctx -> in [ in_idx ]. role ;
119
+ ulong mtu = ctx -> in [ in_idx ]. mtu ;
113
120
114
- if ( sz > mtu ) {
115
- FD_LOG_EMERG (( "oversz signing request (role=%d sz=%lu mtu=%u )" , role , sz , mtu ));
121
+ if ( chunk < ctx -> in [ in_idx ]. chunk0 || chunk > ctx -> in [ in_idx ]. wmark || sz > mtu ) {
122
+ FD_LOG_EMERG (( "oversz or out of bounds signing request (role=%d chunk=%lu sz=%lu mtu=%lu, chunk0=%lu, wmark=%lu )" , role , chunk , sz , mtu , ctx -> in [ in_idx ]. chunk0 , ctx -> in [ in_idx ]. wmark ));
116
123
}
117
- fd_memcpy ( ctx -> _data , ctx -> in_data [ in_idx ], sz );
124
+
125
+ void * src = fd_chunk_to_laddr ( ctx -> in [ in_idx ].mem , chunk );
126
+ fd_memcpy ( ctx -> _data , src , sz );
118
127
}
119
128
120
129
@@ -139,17 +148,15 @@ after_frag_sensitive( void * _ctx,
139
148
ulong tspub ,
140
149
fd_stem_context_t * stem ) {
141
150
(void )seq ;
142
- (void )tsorig ;
143
151
(void )tspub ;
144
- (void )stem ;
145
152
146
153
fd_sign_ctx_t * ctx = (fd_sign_ctx_t * )_ctx ;
147
154
148
155
int sign_type = (int )(uint )sig ;
149
156
150
157
FD_TEST ( in_idx < MAX_IN );
151
158
152
- int role = ctx -> in_role [ in_idx ];
159
+ int role = ctx -> in [ in_idx ]. role ;
153
160
154
161
fd_keyguard_authority_t authority = {0 };
155
162
memcpy ( authority .identity_pubkey , ctx -> public_key , 32 );
@@ -158,33 +165,40 @@ after_frag_sensitive( void * _ctx,
158
165
FD_LOG_EMERG (( "fd_keyguard_payload_authorize failed (role=%d sign_type=%d)" , role , sign_type ));
159
166
}
160
167
168
+ long sign_duration = - fd_tickcount ();
169
+
170
+ uchar * dst = fd_chunk_to_laddr ( ctx -> out [ in_idx ].out_mem , ctx -> out [ in_idx ].out_chunk );
171
+
161
172
switch ( sign_type ) {
162
173
case FD_KEYGUARD_SIGN_TYPE_ED25519 : {
163
- fd_ed25519_sign ( ctx -> out [ in_idx ]. data , ctx -> _data , sz , ctx -> public_key , ctx -> private_key , ctx -> sha512 );
174
+ fd_ed25519_sign ( dst , ctx -> _data , sz , ctx -> public_key , ctx -> private_key , ctx -> sha512 );
164
175
break ;
165
176
}
166
177
case FD_KEYGUARD_SIGN_TYPE_SHA256_ED25519 : {
167
178
uchar hash [ 32 ];
168
179
fd_sha256_hash ( ctx -> _data , sz , hash );
169
- fd_ed25519_sign ( ctx -> out [ in_idx ]. data , hash , 32UL , ctx -> public_key , ctx -> private_key , ctx -> sha512 );
180
+ fd_ed25519_sign ( dst , hash , 32UL , ctx -> public_key , ctx -> private_key , ctx -> sha512 );
170
181
break ;
171
182
}
172
183
case FD_KEYGUARD_SIGN_TYPE_PUBKEY_CONCAT_ED25519 : {
173
184
memcpy ( ctx -> concat + ctx -> public_key_base58_sz + 1UL , ctx -> _data , 9UL );
174
- fd_ed25519_sign ( ctx -> out [ in_idx ]. data , ctx -> concat , ctx -> public_key_base58_sz + 1UL + 9UL , ctx -> public_key , ctx -> private_key , ctx -> sha512 );
185
+ fd_ed25519_sign ( dst , ctx -> concat , ctx -> public_key_base58_sz + 1UL + 9UL , ctx -> public_key , ctx -> private_key , ctx -> sha512 );
175
186
break ;
176
187
}
177
188
case FD_KEYGUARD_SIGN_TYPE_FD_METRICS_REPORT_CONCAT_ED25519 : {
178
189
memcpy ( ctx -> event_concat + 18UL , ctx -> _data , 32UL );
179
- fd_ed25519_sign ( ctx -> out [ in_idx ]. data , ctx -> event_concat , 18UL + 32UL , ctx -> public_key , ctx -> private_key , ctx -> sha512 );
190
+ fd_ed25519_sign ( dst , ctx -> event_concat , 18UL + 32UL , ctx -> public_key , ctx -> private_key , ctx -> sha512 );
180
191
break ;
181
192
}
182
193
default :
183
194
FD_LOG_EMERG (( "invalid sign type: %d" , sign_type ));
184
195
}
185
196
186
- fd_mcache_publish ( ctx -> out [ in_idx ].mcache , 128UL , ctx -> out [ in_idx ].seq , 0UL , 0UL , 0UL , 0UL , 0UL , 0UL );
187
- ctx -> out [ in_idx ].seq = fd_seq_inc ( ctx -> out [ in_idx ].seq , 1UL );
197
+ sign_duration += fd_tickcount ();
198
+ fd_histf_sample ( ctx -> sign_duration , (ulong )sign_duration );
199
+
200
+ fd_stem_publish ( stem , in_idx , 0UL , ctx -> out [ in_idx ].out_chunk , 64UL , 0UL , tsorig , 0UL );
201
+ ctx -> out [ in_idx ].out_chunk = fd_dcache_compact_next ( ctx -> out [ in_idx ].out_chunk , 64UL , ctx -> out [ in_idx ].out_chunk0 , ctx -> out [ in_idx ].out_wmark );
188
202
}
189
203
190
204
static void
@@ -250,52 +264,55 @@ unprivileged_init_sensitive( fd_topo_t * topo,
250
264
ctx -> keyswitch = fd_keyswitch_join ( fd_topo_obj_laddr ( topo , tile -> keyswitch_obj_id ) );
251
265
derive_fields ( ctx );
252
266
253
- for ( ulong i = 0UL ; i < MAX_IN ; i ++ ) ctx -> in_role [ i ] = -1 ;
267
+ for ( ulong i = 0UL ; i < MAX_IN ; i ++ ) ctx -> in [ i ]. role = -1 ;
254
268
255
269
for ( ulong i = 0UL ; i < tile -> in_cnt ; i ++ ) {
256
270
fd_topo_link_t * in_link = & topo -> links [ tile -> in_link_id [ i ] ];
257
271
fd_topo_link_t * out_link = & topo -> links [ tile -> out_link_id [ i ] ];
258
272
259
273
if ( in_link -> mtu > FD_KEYGUARD_SIGN_REQ_MTU ) FD_LOG_CRIT (( "oversz link[%lu].mtu=%lu" , i , in_link -> mtu ));
260
- ctx -> in_data [ i ] = in_link -> dcache ;
261
- ctx -> in_mtu [ i ] = (ushort )in_link -> mtu ;
274
+ ctx -> in [ i ].mem = fd_wksp_containing ( in_link -> dcache );
275
+ ctx -> in [ i ].mtu = in_link -> mtu ;
276
+ ctx -> in [ i ].chunk0 = fd_dcache_compact_chunk0 ( ctx -> in [ i ].mem , in_link -> dcache );
277
+ ctx -> in [ i ].wmark = fd_dcache_compact_wmark ( ctx -> in [ i ].mem , in_link -> dcache , in_link -> mtu );
262
278
263
- ctx -> out [ i ].mcache = out_link -> mcache ;
264
- ctx -> out [ i ].data = out_link -> dcache ;
265
- ctx -> out [ i ].seq = 0UL ;
279
+ ctx -> out [ i ].out_mem = fd_wksp_containing ( out_link -> dcache );
280
+ ctx -> out [ i ].out_chunk0 = fd_dcache_compact_chunk0 ( ctx -> out [ i ].out_mem , out_link -> dcache );
281
+ ctx -> out [ i ].out_wmark = fd_dcache_compact_wmark ( ctx -> out [ i ].out_mem , out_link -> dcache , 64UL );
282
+ ctx -> out [ i ].out_chunk = ctx -> out [ i ].out_chunk0 ;
266
283
267
284
if ( !strcmp ( in_link -> name , "shred_sign" ) ) {
268
- ctx -> in_role [ i ] = FD_KEYGUARD_ROLE_LEADER ;
285
+ ctx -> in [ i ]. role = FD_KEYGUARD_ROLE_LEADER ;
269
286
FD_TEST ( !strcmp ( out_link -> name , "sign_shred" ) );
270
287
FD_TEST ( in_link -> mtu == 32UL );
271
288
FD_TEST ( out_link -> mtu == 64UL );
272
289
} else if ( !strcmp ( in_link -> name , "gossip_sign" ) ) {
273
- ctx -> in_role [ i ] = FD_KEYGUARD_ROLE_GOSSIP ;
290
+ ctx -> in [ i ]. role = FD_KEYGUARD_ROLE_GOSSIP ;
274
291
FD_TEST ( !strcmp ( out_link -> name , "sign_gossip" ) );
275
292
FD_TEST ( in_link -> mtu == 2048UL );
276
293
FD_TEST ( out_link -> mtu == 64UL );
277
294
} else if ( !strcmp ( in_link -> name , "repair_sign" )) {
278
- ctx -> in_role [ i ] = FD_KEYGUARD_ROLE_REPAIR ;
295
+ ctx -> in [ i ]. role = FD_KEYGUARD_ROLE_REPAIR ;
279
296
FD_TEST ( !strcmp ( out_link -> name , "sign_repair" ) );
280
297
FD_TEST ( in_link -> mtu == 2048UL );
281
298
FD_TEST ( out_link -> mtu == 64UL );
282
299
} else if ( !strcmp (in_link -> name , "send_sign" ) ) {
283
- ctx -> in_role [ i ] = FD_KEYGUARD_ROLE_SEND ;
300
+ ctx -> in [ i ]. role = FD_KEYGUARD_ROLE_SEND ;
284
301
FD_TEST ( !strcmp ( out_link -> name , "sign_send" ) );
285
302
FD_TEST ( in_link -> mtu == FD_TXN_MTU );
286
303
FD_TEST ( out_link -> mtu == 64UL );
287
304
} else if ( !strcmp (in_link -> name , "bundle_sign" ) ) {
288
- ctx -> in_role [ i ] = FD_KEYGUARD_ROLE_BUNDLE ;
305
+ ctx -> in [ i ]. role = FD_KEYGUARD_ROLE_BUNDLE ;
289
306
FD_TEST ( !strcmp ( out_link -> name , "sign_bundle" ) );
290
307
FD_TEST ( in_link -> mtu == 9UL );
291
308
FD_TEST ( out_link -> mtu == 64UL );
292
309
} else if ( !strcmp (in_link -> name , "event_sign" ) ) {
293
- ctx -> in_role [ i ] = FD_KEYGUARD_ROLE_EVENT ;
310
+ ctx -> in [ i ]. role = FD_KEYGUARD_ROLE_EVENT ;
294
311
FD_TEST ( !strcmp ( out_link -> name , "sign_event" ) );
295
312
FD_TEST ( in_link -> mtu == 32UL );
296
313
FD_TEST ( out_link -> mtu == 64UL );
297
314
} else if ( !strcmp (in_link -> name , "pack_sign" ) ) {
298
- ctx -> in_role [ i ] = FD_KEYGUARD_ROLE_BUNDLE_CRANK ;
315
+ ctx -> in [ i ]. role = FD_KEYGUARD_ROLE_BUNDLE_CRANK ;
299
316
FD_TEST ( !strcmp ( out_link -> name , "sign_pack" ) );
300
317
FD_TEST ( in_link -> mtu == 1232UL );
301
318
FD_TEST ( out_link -> mtu == 64UL );
0 commit comments