Skip to content

Commit 242365b

Browse files
committed
Update SPHINCS+
1 parent aa28fc5 commit 242365b

File tree

4 files changed

+557
-88
lines changed

4 files changed

+557
-88
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ if (ENABLE_SPHINCS)
455455
add_definitions(-DENABLE_SPHINCS)
456456
list(APPEND src src/sphincs.c)
457457
#list(APPEND tools tools/sphincskeygen.c tools/sphincssign.c tools/sphincsverify.c)
458-
#list(APPEND tests sphincs)
458+
list(APPEND tests sphincs)
459459

460460
option(ENABLE_SPHINCS_CROSSCHECK "Enable SPHINCS SHA-256 cross-check" ON)
461461
if (ENABLE_SPHINCS_CROSSCHECK)

include/gmssl/sphincs.h

Lines changed: 62 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4945
enum {
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-
6155
typedef 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?
8564
typedef 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

9372
typedef 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

10781
typedef 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

12498
typedef 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

133107
typedef 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

142145
typedef uint8_t sphincs_adrsc_t[22];
143146

@@ -160,20 +163,33 @@ typedef struct {
160163
// sizeof(sphincs_secret_t) == n, when sm3/sha256, n == 16
161164
typedef 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);
165175
void 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

179195
typedef struct {

0 commit comments

Comments
 (0)