@@ -54,15 +54,14 @@ enum SPHINCSPLUS_EXAMPLE_ERROR {
5454 ERROR_SPHINCSPLUS_SYSCALL ,
5555 ERROR_SPHINCSPLUS_ENCODING ,
5656 ERROR_SPHINCSPLUS_ARGS ,
57+ ERROR_SPHINCSPLUS_PUBKEY ,
5758 ERROR_SPHINCSPLUS_WITNESS ,
5859 ERROR_SPHINCSPLUS_VERIFY ,
5960};
6061
6162#ifdef CKB_VM
6263// randombytes in sphincs+ depends on fcntl.h and unistd.h
63- void randombytes (unsigned char * x , unsigned long long xlen ) {
64- ASSERT (false);
65- }
64+ void randombytes (unsigned char * x , unsigned long long xlen ) { ASSERT (false); }
6665#endif // CKB_VM
6766
6867static int extract_witness_lock (uint8_t * witness , uint64_t len ,
@@ -226,28 +225,43 @@ int make_witness(WitnessArgsType *witness) {
226225 return 0 ;
227226}
228227
229- int get_sign (uint8_t * sign ) {
228+ // Witness data structure
229+ // |-----Signature data-----|-----Public Key-----|
230+ int get_sign_info (uint8_t * sign , uint8_t * pubkey ) {
230231 int err = CKB_SUCCESS ;
231232 size_t sign_size = sphincs_plus_get_sign_size ();
233+ size_t pubkey_size = sphincs_plus_get_pk_size ();
234+
232235 WitnessArgsType witness_args ;
233236
234237 uint8_t witness_data_source [MAX_WITNESS_SIZE ] = {0 };
238+ BytesOptType mol_lock ;
239+ mol2_cursor_t mol_lock_bytes ;
240+ size_t out_len ;
241+ uint8_t buffer [sign_size + pubkey_size ];
242+
235243 g_witness_data_source = witness_data_source ;
236244 CHECK (make_witness (& witness_args ));
237245
238- BytesOptType mol_lock = witness_args .t -> lock (& witness_args );
246+ mol_lock = witness_args .t -> lock (& witness_args );
239247 CHECK2 (!mol_lock .t -> is_none (& mol_lock ), ERROR_SPHINCSPLUS_WITNESS );
240248
241- mol2_cursor_t mol_lock_bytes = mol_lock .t -> unwrap (& mol_lock );
242- size_t out_len = mol2_read_at (& mol_lock_bytes , sign , sign_size );
249+ mol_lock_bytes = mol_lock .t -> unwrap (& mol_lock );
250+ CHECK2 (mol_lock_bytes .size == sign_size + pubkey_size ,
251+ ERROR_SPHINCSPLUS_WITNESS );
252+
253+ out_len = mol2_read_at (& mol_lock_bytes , buffer , sign_size + pubkey_size );
254+ CHECK2 (out_len == sign_size + pubkey_size , ERROR_SPHINCSPLUS_WITNESS );
255+
256+ memcpy (sign , buffer , sign_size );
257+ memcpy (pubkey , buffer + sign_size , pubkey_size );
243258
244- CHECK2 (out_len == sign_size , ERROR_SPHINCSPLUS_WITNESS );
245259exit :
246260 g_witness_data_source = NULL ;
247261 return err ;
248262}
249263
250- int get_public_key (uint8_t * pub_key ) {
264+ int get_public_key_hash (uint8_t * pub_key ) {
251265 int err = CKB_SUCCESS ;
252266
253267 uint8_t script [SCRIPT_SIZE ];
@@ -260,30 +274,39 @@ int get_public_key(uint8_t *pub_key) {
260274
261275 mol_seg_t args_seg = MolReader_Script_get_args (& script_seg );
262276 mol_seg_t args_bytes_seg = MolReader_Bytes_raw_bytes (& args_seg );
263- size_t pubkey_size = sphincs_plus_get_pk_size ();
264- CHECK2 ((args_bytes_seg .size == pubkey_size ), ERROR_SPHINCSPLUS_ARGS );
265- memcpy (pub_key , args_bytes_seg .ptr , pubkey_size );
277+ CHECK2 ((args_bytes_seg .size == BLAKE2B_BLOCK_SIZE ), ERROR_SPHINCSPLUS_ARGS );
278+ memcpy (pub_key , args_bytes_seg .ptr , BLAKE2B_BLOCK_SIZE );
266279
267280exit :
268281 return err ;
269282}
270283
271- int main () {
272- int err = CKB_SUCCESS ;
284+ int check_pubkey (uint8_t * pubkey , uint8_t * pubkey_hash ) {
285+ blake2b_state blake2b_ctx ;
286+ blake2b_init (& blake2b_ctx , BLAKE2B_BLOCK_SIZE );
287+ blake2b_update (& blake2b_ctx , pubkey , sphincs_plus_get_pk_size ());
288+ uint8_t msg [BLAKE2B_BLOCK_SIZE ];
289+ blake2b_final (& blake2b_ctx , msg , sizeof (msg ));
273290
274- // signature data size depends on args data(hash type)
275- uint8_t pubkey [sphincs_plus_get_pk_size ()];
276- err = get_public_key (pubkey );
277- if (err ) {
278- return err ;
291+ if (memcmp (pubkey_hash , msg , BLAKE2B_BLOCK_SIZE )) {
292+ return ERROR_SPHINCSPLUS_PUBKEY ;
293+ } else {
294+ return 0 ;
279295 }
296+ }
280297
298+ int main () {
299+ int err = CKB_SUCCESS ;
300+
301+ uint8_t pubkey_hash [BLAKE2B_BLOCK_SIZE ];
281302 uint8_t message [BLAKE2B_BLOCK_SIZE ];
282303 uint8_t sign [sphincs_plus_get_sign_size ()];
283- CHECK (generate_sighash_all (message , BLAKE2B_BLOCK_SIZE ));
284-
285- CHECK (get_sign (sign ));
304+ uint8_t pubkey [sphincs_plus_get_pk_size ()];
286305
306+ CHECK (get_public_key_hash (pubkey_hash ));
307+ CHECK (generate_sighash_all (message , BLAKE2B_BLOCK_SIZE ));
308+ CHECK (get_sign_info (sign , pubkey ));
309+ CHECK (check_pubkey (pubkey , pubkey_hash ));
287310 err = sphincs_plus_verify (sign , sphincs_plus_get_sign_size (), message ,
288311 BLAKE2B_BLOCK_SIZE , pubkey ,
289312 sphincs_plus_get_pk_size ());
0 commit comments