@@ -40,24 +40,18 @@ extern "C" {
4040# define HASH256_BLOCK_SIZE SM3_BLOCK_SIZE
4141#endif
4242
43- /*
44- In order to make keeping track of the types easier throughout the pseudo-code in the rest of
45- this document, we refer to them respectively using the constants WOTS_HASH, WOTS_PK, TREE,
46- FORS_TREE, FORS_ROOTS, WOTS_PRF, and FORS_PRF.
47- */
43+
4844
4945enum {
50- SPHINCS_ADRS_TYPE_WOTS_PRF = 0 ,
46+ SPHINCS_ADRS_TYPE_WOTS_HASH = 0 ,
5147 SPHINCS_ADRS_TYPE_WOTS_PK = 1 ,
52- SPHINCS_ADRS_TYPE_HASHTREE = 2 ,
48+ SPHINCS_ADRS_TYPE_TREE = 2 ,
5349 SPHINCS_ADRS_TYPE_FORS_TREE = 3 ,
54- SPHINCS_ADRS_TYPE_FORS_ROOT = 4 ,
55- SPHINCS_ADRS_TYPE_WOTS_KEYGEN = 5 ,
56- SPHINCS_ADRS_TYPE_FORS_KEYGEN = 6 ,
50+ SPHINCS_ADRS_TYPE_FORS_ROOTS = 4 ,
51+ SPHINCS_ADRS_TYPE_WOTS_PRF = 5 ,
52+ SPHINCS_ADRS_TYPE_FORS_PRF = 6 ,
5753};
5854
59- typedef uint8_t sphincs_adrs_t [32 ];
60-
6155typedef struct {
6256 uint32_t layer_address ;
6357 uint32_t tree_address [3 ];
@@ -67,28 +61,13 @@ typedef struct {
6761 uint32_t hash_address ;
6862} SPHINCS_ADRS_WOTS_HASH ;
6963
70- void sphincs_adrs_copy_layer_address (sphincs_adrs_t dst , const sphincs_adrs_t src );
71- void sphincs_adrs_copy_tree_address (sphincs_adrs_t dst , const sphincs_adrs_t src );
72- void sphincs_adrs_copy_type (sphincs_adrs_t dst , const sphincs_adrs_t src );
73- void sphincs_adrs_copy_keypair_address (sphincs_adrs_t dst , const sphincs_adrs_t src );
74- void sphincs_adrs_copy_chain_address (sphincs_adrs_t dst , const sphincs_adrs_t src );
75- void sphincs_adrs_copy_hash_address (sphincs_adrs_t dst , const sphincs_adrs_t src );
76-
77- void sphincs_adrs_set_layer_address (sphincs_adrs_t adrs , const uint32_t address );
78- void sphincs_adrs_set_tree_address (sphincs_adrs_t adrs , const uint64_t address );
79- void sphincs_adrs_set_type (sphincs_adrs_t adrs , const uint32_t type );
80- void sphincs_adrs_set_keypair_address (sphincs_adrs_t adrs , const uint32_t address );
81- void sphincs_adrs_set_chain_address (sphincs_adrs_t adrs , const uint32_t address );
82- void sphincs_adrs_set_hash_address (sphincs_adrs_t adrs , const uint32_t address );
83-
84- // 所有的padding都在最后,是否意味着可以不用padding?
8564typedef struct {
8665 uint32_t layer_address ;
8766 uint32_t tree_address [3 ];
8867 uint32_t type ; // = 1
8968 uint32_t keypair_address ;
90- uint32_t padding [3 ]; // = {0,0,0}
91- } SPHINCS_ADRS_WOTS_PK_COMP ;
69+ uint32_t padding [2 ];
70+ } SPHINCS_ADRS_WOTS_PK ;
9271
9372typedef struct {
9473 uint32_t layer_address ;
@@ -97,12 +76,7 @@ typedef struct {
9776 uint32_t padding ; // = 0
9877 uint32_t tree_height ;
9978 uint32_t tree_index ;
100- } SPHINCS_ADRS_HASHTREE ;
101-
102- void sphincs_adrs_copy_tree_height (sphincs_adrs_t dst , const sphincs_adrs_t src );
103- void sphincs_adrs_copy_tree_index (sphincs_adrs_t dst , const sphincs_adrs_t src );
104- void sphincs_adrs_set_tree_height (sphincs_adrs_t adrs , uint32_t height );
105- void sphincs_adrs_set_tree_index (sphincs_adrs_t adrs , uint32_t index );
79+ } SPHINCS_ADRS_TREE ;
10680
10781typedef struct {
10882 uint32_t layer_address ;
@@ -118,8 +92,8 @@ typedef struct {
11892 uint32_t tree_address [3 ];
11993 uint32_t type ; // = 4
12094 uint32_t keypair_address ;
121- uint32_t padding [2 ]; // = {0,0}
122- } SPHINCS_ADRS_FORS_ROOT ;
95+ uint32_t padding [2 ];
96+ } SPHINCS_ADRS_FORS_ROOTS ;
12397
12498typedef struct {
12599 uint32_t layer_address ;
@@ -128,7 +102,7 @@ typedef struct {
128102 uint32_t keypair_address ;
129103 uint32_t chain_address ;
130104 uint32_t hash_address ; // = 0
131- } SPHINCS_ADRS_WOTS_KEYGEN ;
105+ } SPHINCS_ADRS_WOTS_PRF ;
132106
133107typedef struct {
134108 uint32_t layer_address ;
@@ -137,7 +111,36 @@ typedef struct {
137111 uint32_t keypair_address ;
138112 uint32_t tree_height ; // = 0
139113 uint32_t tree_index ;
140- } SPHINCS_ADRS_FORS_KEYGEN ;
114+ } SPHINCS_ADRS_FORS_PRF ;
115+
116+ typedef uint8_t sphincs_adrs_t [32 ];
117+
118+ void sphincs_adrs_copy_layer_address (sphincs_adrs_t dst , const sphincs_adrs_t src );
119+ void sphincs_adrs_copy_tree_address (sphincs_adrs_t dst , const sphincs_adrs_t src );
120+ void sphincs_adrs_copy_type (sphincs_adrs_t dst , const sphincs_adrs_t src );
121+ void sphincs_adrs_copy_keypair_address (sphincs_adrs_t dst , const sphincs_adrs_t src );
122+ void sphincs_adrs_copy_chain_address (sphincs_adrs_t dst , const sphincs_adrs_t src );
123+ void sphincs_adrs_copy_hash_address (sphincs_adrs_t dst , const sphincs_adrs_t src );
124+ void sphincs_adrs_copy_tree_height (sphincs_adrs_t dst , const sphincs_adrs_t src );
125+ void sphincs_adrs_copy_tree_index (sphincs_adrs_t dst , const sphincs_adrs_t src );
126+
127+ void sphincs_adrs_set_layer_address (sphincs_adrs_t adrs , const uint32_t address );
128+ void sphincs_adrs_set_tree_address (sphincs_adrs_t adrs , const uint64_t address );
129+ void sphincs_adrs_set_type (sphincs_adrs_t adrs , const uint32_t type );
130+ void sphincs_adrs_set_keypair_address (sphincs_adrs_t adrs , const uint32_t address );
131+ void sphincs_adrs_set_chain_address (sphincs_adrs_t adrs , const uint32_t address );
132+ void sphincs_adrs_set_hash_address (sphincs_adrs_t adrs , const uint32_t address );
133+ void sphincs_adrs_set_tree_height (sphincs_adrs_t adrs , uint32_t height );
134+ void sphincs_adrs_set_tree_index (sphincs_adrs_t adrs , uint32_t index );
135+
136+ typedef struct {
137+ uint8_t layer_address ;
138+ uint64_t tree_address ;
139+ uint8_t type ;
140+ uint32_t others [3 ];
141+ } SPHINCS_ADRSC ;
142+
143+ #define SPHINCS_ADRSC_SIZE 22
141144
142145typedef uint8_t sphincs_adrsc_t [22 ];
143146
@@ -160,20 +163,33 @@ typedef struct {
160163// sizeof(sphincs_secret_t) == n, when sm3/sha256, n == 16
161164typedef uint8_t sphincs_secret_t [16 ];
162165
166+ typedef sphincs_secret_t sphincs_wots_key_t [35 ];
167+ typedef sphincs_secret_t sphincs_wots_sig_t [35 ];
163168
169+ int sphincs_wots_key_print (FILE * fp , int fmt , int ind , const char * label , const sphincs_wots_key_t key );
170+ int sphincs_wots_sig_print (FILE * fp , int fmt , int ind , const char * label , const sphincs_wots_sig_t sig );
164171
172+ void sphincs_wots_derive_sk (const sphincs_secret_t secret ,
173+ const sphincs_secret_t seed , const sphincs_adrs_t in_adrs ,
174+ sphincs_wots_key_t sk );
165175void sphincs_wots_chain (const sphincs_secret_t x ,
166176 const sphincs_secret_t seed , const sphincs_adrs_t ots_adrs ,
167177 int start , int steps , sphincs_secret_t y );
178+ void sphincs_wots_sk_to_pk (const sphincs_wots_key_t sk ,
179+ const sphincs_secret_t seed , const sphincs_adrs_t ots_adrs ,
180+ sphincs_wots_key_t pk );
181+ void sphincs_wots_pk_to_root (const sphincs_wots_key_t pk ,
182+ const sphincs_secret_t seed , const sphincs_adrs_t in_adrs ,
183+ sphincs_secret_t root );
184+ void sphincs_base_w_and_checksum (const sphincs_secret_t dgst , int steps [35 ]);
185+ void sphincs_wots_sign (const sphincs_wots_key_t sk ,
186+ const sphincs_secret_t seed , const sphincs_adrs_t ots_adrs ,
187+ const sphincs_secret_t dgst , sphincs_wots_sig_t sig );
188+ void sphincs_wots_sig_to_pk (const sphincs_wots_sig_t sig ,
189+ const sphincs_secret_t seed , const sphincs_adrs_t ots_adrs ,
190+ const sphincs_secret_t dgst , sphincs_wots_key_t pk );
168191
169192
170- typedef sphincs_secret_t sphincs_wots_key_t [35 ];
171- typedef sphincs_secret_t sphincs_wots_sig_t [35 ];
172-
173-
174- void sphincs_wots_derive_sk (const sphincs_secret_t secret ,
175- const sphincs_secret_t seed , const sphincs_adrs_t adrs ,
176- sphincs_wots_key_t sk );
177193
178194
179195typedef struct {
0 commit comments