Clean code

This commit is contained in:
Zhi Guan
2026-06-22 23:40:58 +08:00
parent 8ed5e266d1
commit 5581ad21b8
18 changed files with 1105 additions and 1150 deletions

View File

@@ -15,9 +15,6 @@
#include <string.h>
#include <stdint.h>
#include <gmssl/sm3.h>
#ifdef ENABLE_SHA2
#include <gmssl/sha2.h>
#endif
#ifdef __cplusplus
@@ -47,7 +44,7 @@ extern "C" {
#define SPHINCS_TBS_SIZE (SPHINCS_TBS_FORS_SIZE + SPHINCS_TBS_TREE_ADDRESS_SIZE + SPHINCS_TBS_KEYPAIR_ADDRESS_SIZE) // = 30
// sizeof(sphincs_hash128_t) == n, when sm3/sha256, n == 16
// sizeof(sphincs_hash128_t) == n, when sm3, n == 16
#define SPHINCS_DIGEST_SIZE 16
// only support w = 16, w_bits = 4
@@ -60,29 +57,7 @@ extern "C" {
typedef uint8_t sphincs_hash128_t[16];
typedef uint8_t sphincs_hash256_t[32];
#if defined(ENABLE_SPHINCS_CROSSCHECK) && defined(ENABLE_SHA2) && !defined(SPHINCS_HASH256_CTX)
# define SPHINCS_HASH256_CTX SHA256_CTX
# define sphincs_hash256_init sha256_init
# define sphincs_hash256_update sha256_update
# define sphincs_hash256_finish sha256_finish
# define SPHINCS_HASH256_BLOCK_SIZE SHA256_BLOCK_SIZE
# define SPHINCS_HMAC256_CTX SHA256_HMAC_CTX
# define sphincs_hmac256_init sha256_hmac_init
# define sphincs_hmac256_update sha256_hmac_update
# define sphincs_hmac256_finish sha256_hmac_finish
#else
# define SPHINCS_HASH256_CTX SM3_CTX
# define sphincs_hash256_init sm3_init
# define sphincs_hash256_update sm3_update
# define sphincs_hash256_finish sm3_finish
# define SPHINCS_HASH256_BLOCK_SIZE SM3_BLOCK_SIZE
# define SPHINCS_HMAC256_CTX SM3_HMAC_CTX
# define sphincs_hmac256_init sm3_hmac_init
# define sphincs_hmac256_update sm3_hmac_update
# define sphincs_hmac256_finish sm3_hmac_finish
#endif
typedef uint8_t sphincs_sm3_digest_t[32];
// ADRS scheme
@@ -351,8 +326,8 @@ int sphincs_signature_print_ex(FILE *fp, int fmt, int ind, const char *label, co
int sphincs_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen);
typedef struct {
SPHINCS_HMAC256_CTX hmac_ctx;
SPHINCS_HASH256_CTX hash_ctx;
SM3_HMAC_CTX hmac_ctx;
SM3_CTX hash_ctx;
SPHINCS_SIGNATURE sig;
int state; // after init 0, after prepare 1, after update 2
size_t round1_msglen;

View File

@@ -18,7 +18,7 @@ extern "C" {
#define GMSSL_VERSION_NUM 30300
#define GMSSL_VERSION_STR "GmSSL 3.3.0-dev.1158"
#define GMSSL_VERSION_STR "GmSSL 3.3.0-dev.1159"
int gmssl_version_num(void);
const char *gmssl_version_str(void);

View File

@@ -15,33 +15,13 @@
#include <string.h>
#include <stdint.h>
#include <gmssl/sm3.h>
#ifdef ENABLE_SHA2
#include <gmssl/sha2.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef uint8_t xmss_hash256_t[32];
// Crosscheck with data from xmss-reference (SHA-256), except the XMSS signature.
#if defined(ENABLE_XMSS_CROSSCHECK) && defined(ENABLE_SHA2) && !defined(HASH256_CTX)
# define XMSS_HASH256_CTX SHA256_CTX
# define xmss_hash256_init sha256_init
# define xmss_hash256_update sha256_update
# define xmss_hash256_finish sha256_finish
# define XMSS_HASH256_BLOCK_SIZE SHA256_BLOCK_SIZE
#else
# define XMSS_HASH256_CTX SM3_CTX
# define xmss_hash256_init sm3_init
# define xmss_hash256_update sm3_update
# define xmss_hash256_finish sm3_finish
# define XMSS_HASH256_BLOCK_SIZE SM3_BLOCK_SIZE
#endif
typedef uint8_t xmss_sm3_digest_t[32];
// ADRS scheme
@@ -112,50 +92,41 @@ void xmss_adrs_set_hash_address(xmss_adrs_t adrs, uint32_t address);
void xmss_adrs_set_tree_index(xmss_adrs_t adrs, uint32_t index);
void xmss_adrs_set_key_and_mask(xmss_adrs_t adrs, uint32_t key_and_mask);
int xmss_adrs_print(FILE *fp, int fmt, int ind, const char *label, const xmss_hash256_t adrs);
int xmss_adrs_print(FILE *fp, int fmt, int ind, const char *label, const xmss_sm3_digest_t adrs);
// WOTS+ with SM3/SHA256
// WOTS+ with SM3
#define XMSS_WOTS_WINTERNITZ_W 16 // rfc 8391 named algors only support w = 2^4 = 16
#define XMSS_WOTS_NUM_CHAINS 67
typedef xmss_hash256_t xmss_wots_key_t[XMSS_WOTS_NUM_CHAINS];
typedef xmss_hash256_t xmss_wots_sig_t[XMSS_WOTS_NUM_CHAINS];
typedef xmss_sm3_digest_t xmss_wots_key_t[XMSS_WOTS_NUM_CHAINS];
typedef xmss_sm3_digest_t xmss_wots_sig_t[XMSS_WOTS_NUM_CHAINS];
void xmss_wots_derive_sk(const xmss_hash256_t secret,
const xmss_hash256_t seed, const xmss_adrs_t adrs,
void xmss_wots_derive_sk(const xmss_sm3_digest_t secret,
const xmss_sm3_digest_t seed, const xmss_adrs_t adrs,
xmss_wots_key_t sk);
void xmss_wots_chain(const xmss_hash256_t x,
const xmss_hash256_t seed, const xmss_adrs_t adrs,
int start, int steps, xmss_hash256_t y);
void xmss_wots_chain(const xmss_sm3_digest_t x,
const xmss_sm3_digest_t seed, const xmss_adrs_t adrs,
int start, int steps, xmss_sm3_digest_t y);
void xmss_wots_sk_to_pk(const xmss_wots_key_t sk,
const xmss_hash256_t seed, const xmss_adrs_t adrs,
const xmss_sm3_digest_t seed, const xmss_adrs_t adrs,
xmss_wots_key_t pk);
void xmss_wots_sign(const xmss_wots_key_t sk,
const xmss_hash256_t seed, const xmss_adrs_t adrs,
const xmss_hash256_t dgst, xmss_wots_sig_t sig);
const xmss_sm3_digest_t seed, const xmss_adrs_t adrs,
const xmss_sm3_digest_t dgst, xmss_wots_sig_t sig);
void xmss_wots_sig_to_pk(const xmss_wots_sig_t sig,
const xmss_hash256_t seed, const xmss_adrs_t adrs,
const xmss_hash256_t dgst, xmss_wots_key_t pk);
const xmss_sm3_digest_t seed, const xmss_adrs_t adrs,
const xmss_sm3_digest_t dgst, xmss_wots_key_t pk);
void xmss_wots_pk_to_root(const xmss_wots_key_t pk,
const xmss_hash256_t seed, const xmss_adrs_t adrs,
xmss_hash256_t wots_root);
void xmss_wots_derive_root(const xmss_hash256_t secret,
const xmss_hash256_t seed, const xmss_adrs_t adrs,
xmss_hash256_t wots_root);
int xmss_wots_verify(const xmss_hash256_t wots_root,
const xmss_hash256_t seed, const xmss_adrs_t adrs,
const xmss_hash256_t dgst, const xmss_wots_sig_t sig);
// from RFC 8391 table 7
enum {
XMSS_SHA2_10_256 = 0x00000001,
XMSS_SHA2_16_256 = 0x00000002,
XMSS_SHA2_20_256 = 0x00000003,
};
const xmss_sm3_digest_t seed, const xmss_adrs_t adrs,
xmss_sm3_digest_t wots_root);
void xmss_wots_derive_root(const xmss_sm3_digest_t secret,
const xmss_sm3_digest_t seed, const xmss_adrs_t adrs,
xmss_sm3_digest_t wots_root);
int xmss_wots_verify(const xmss_sm3_digest_t wots_root,
const xmss_sm3_digest_t seed, const xmss_adrs_t adrs,
const xmss_sm3_digest_t dgst, const xmss_wots_sig_t sig);
enum {
XMSS_SM3_10_256 = 0x10000001, // height = 10, sigs = 2^10
@@ -165,22 +136,9 @@ enum {
#define XMSS_MAX_HEIGHT 20
// Crosscheck with data from xmss-reference (SHA-256), except the XMSS signature.
#if defined(ENABLE_XMSS_CROSSCHECK) && defined(ENABLE_SHA2)
# define XMSS_HASH256_10_256 XMSS_SHA2_10_256
# define XMSS_HASH256_16_256 XMSS_SHA2_16_256
# define XMSS_HASH256_20_256 XMSS_SHA2_20_256
# define XMSS_HASH256_10_256_NAME "XMSS_SHA2_10_256"
# define XMSS_HASH256_16_256_NAME "XMSS_SHA2_16_256"
# define XMSS_HASH256_20_256_NAME "XMSS_SHA2_20_256"
#else
# define XMSS_HASH256_10_256 XMSS_SM3_10_256
# define XMSS_HASH256_16_256 XMSS_SM3_16_256
# define XMSS_HASH256_20_256 XMSS_SM3_20_256
# define XMSS_HASH256_10_256_NAME "XMSS_SM3_10_256"
# define XMSS_HASH256_16_256_NAME "XMSS_SM3_16_256"
# define XMSS_HASH256_20_256_NAME "XMSS_SM3_20_256"
#endif
#define XMSS_SM3_10_256_NAME "XMSS_SM3_10_256"
#define XMSS_SM3_16_256_NAME "XMSS_SM3_16_256"
#define XMSS_SM3_20_256_NAME "XMSS_SM3_20_256"
char *xmss_type_name(uint32_t xmss_type);
uint32_t xmss_type_from_name(const char *name);
@@ -188,21 +146,21 @@ uint32_t xmss_type_from_name(const char *name);
int xmss_type_to_height(uint32_t xmss_type, size_t *height);
size_t xmss_num_tree_nodes(size_t height);
void xmss_build_tree(const xmss_hash256_t secret,
const xmss_hash256_t seed, const xmss_adrs_t adrs,
size_t height, xmss_hash256_t *tree); // tree[xmss_num_tree_nodes(height)]
void xmss_build_auth_path(const xmss_hash256_t *tree, size_t height,
uint32_t index, xmss_hash256_t *auth_path); // auth_path[height]
void xmss_build_root(const xmss_hash256_t wots_root, uint32_t index,
const xmss_hash256_t seed, const xmss_adrs_t adrs,
const xmss_hash256_t *auth_path, size_t height,
xmss_hash256_t xmss_root);
void xmss_build_tree(const xmss_sm3_digest_t secret,
const xmss_sm3_digest_t seed, const xmss_adrs_t adrs,
size_t height, xmss_sm3_digest_t *tree); // tree[xmss_num_tree_nodes(height)]
void xmss_build_auth_path(const xmss_sm3_digest_t *tree, size_t height,
uint32_t index, xmss_sm3_digest_t *auth_path); // auth_path[height]
void xmss_build_root(const xmss_sm3_digest_t wots_root, uint32_t index,
const xmss_sm3_digest_t seed, const xmss_adrs_t adrs,
const xmss_sm3_digest_t *auth_path, size_t height,
xmss_sm3_digest_t xmss_root);
typedef struct {
uint32_t xmss_type;
xmss_hash256_t seed;
xmss_hash256_t root;
xmss_sm3_digest_t seed;
xmss_sm3_digest_t root;
} XMSS_PUBLIC_KEY;
#define XMSS_PUBLIC_KEY_SIZE (4 + 32 + 32) // = 68
@@ -214,16 +172,16 @@ typedef int (*xmss_key_update_callback)(XMSS_KEY *key);
typedef struct XMSS_KEY_st {
XMSS_PUBLIC_KEY public_key;
uint32_t index;
xmss_hash256_t secret;
xmss_hash256_t sk_prf;
xmss_hash256_t *tree; // xmss_hash256_t[2^(h + 1) - 1]
xmss_sm3_digest_t secret;
xmss_sm3_digest_t sk_prf;
xmss_sm3_digest_t *tree; // xmss_sm3_digest_t[2^(h + 1) - 1]
xmss_key_update_callback update_callback;
void *update_param;
} XMSS_KEY;
// XMSS_SHA2_10_256: 65,640
// XMSS_SHA2_16_256: 4,194,408
// XMSS_SHA2_20_256: 67,108,968
// XMSS_SM3_10_256: 65,640
// XMSS_SM3_16_256: 4,194,408
// XMSS_SM3_20_256: 67,108,968
int xmss_private_key_size(uint32_t xmss_type, size_t *keysize);
//#define XMSS_PRIVATE_KEY_SIZE (XMSS_PUBLIC_KEY_SIZE + 32 + 32 + 4) // = 136
@@ -245,9 +203,9 @@ int xmss_private_key_print(FILE *fp, int fmt, int ind, const char *label, const
typedef struct {
uint32_t index; // < 2^(XMSS_MAX_HEIGHT) = 2^20, always encode to 4 bytes
xmss_hash256_t random;
xmss_sm3_digest_t random;
xmss_wots_sig_t wots_sig;
xmss_hash256_t auth_path[XMSS_MAX_HEIGHT];
xmss_sm3_digest_t auth_path[XMSS_MAX_HEIGHT];
} XMSS_SIGNATURE;
// XMSS_SM3_10_256 2500 bytes
@@ -265,7 +223,7 @@ int xmss_signature_print_ex(FILE *fp, int fmt, int ind, const char *label, const
typedef struct {
XMSS_PUBLIC_KEY xmss_public_key;
XMSS_SIGNATURE xmss_sig;
XMSS_HASH256_CTX hash256_ctx;
SM3_CTX sm3_ctx;
} XMSS_SIGN_CTX;
int xmss_sign_init(XMSS_SIGN_CTX *ctx, XMSS_KEY *key);
@@ -289,55 +247,14 @@ enum {
XMSSMT_SM3_60_12_256 = 0x00000008,
};
// from rfc 8391 table 8
enum {
XMSSMT_RESERVED = 0x00000000,
XMSSMT_SHA2_20_2_256 = 0x00000001,
XMSSMT_SHA2_20_4_256 = 0x00000002,
XMSSMT_SHA2_40_2_256 = 0x00000003,
XMSSMT_SHA2_40_4_256 = 0x00000004,
XMSSMT_SHA2_40_8_256 = 0x00000005,
XMSSMT_SHA2_60_3_256 = 0x00000006,
XMSSMT_SHA2_60_6_256 = 0x00000007,
XMSSMT_SHA2_60_12_256 = 0x00000008,
};
#if defined(ENABLE_XMSS_CROSSCHECK) && defined(ENABLE_SHA2)
# define XMSSMT_HASH256_20_2_256 XMSSMT_SHA2_20_2_256
# define XMSSMT_HASH256_20_4_256 XMSSMT_SHA2_20_4_256
# define XMSSMT_HASH256_40_2_256 XMSSMT_SHA2_40_2_256
# define XMSSMT_HASH256_40_4_256 XMSSMT_SHA2_40_4_256
# define XMSSMT_HASH256_40_8_256 XMSSMT_SHA2_40_8_256
# define XMSSMT_HASH256_60_3_256 XMSSMT_SHA2_60_3_256
# define XMSSMT_HASH256_60_6_256 XMSSMT_SHA2_60_6_256
# define XMSSMT_HASH256_60_12_256 XMSSMT_SHA2_60_12_256
# define XMSSMT_HASH256_20_2_256_NAME "XMSSMT_SHA2_20_2_256"
# define XMSSMT_HASH256_20_4_256_NAME "XMSSMT_SHA2_20_4_256"
# define XMSSMT_HASH256_40_2_256_NAME "XMSSMT_SHA2_40_2_256"
# define XMSSMT_HASH256_40_4_256_NAME "XMSSMT_SHA2_40_4_256"
# define XMSSMT_HASH256_40_8_256_NAME "XMSSMT_SHA2_40_8_256"
# define XMSSMT_HASH256_60_3_256_NAME "XMSSMT_SHA2_60_3_256"
# define XMSSMT_HASH256_60_6_256_NAME "XMSSMT_SHA2_60_6_256"
# define XMSSMT_HASH256_60_12_256_NAME "XMSSMT_SHA2_60_12_256"
#else
# define XMSSMT_HASH256_20_2_256 XMSSMT_SM3_20_2_256
# define XMSSMT_HASH256_20_4_256 XMSSMT_SM3_20_4_256
# define XMSSMT_HASH256_40_2_256 XMSSMT_SM3_40_2_256
# define XMSSMT_HASH256_40_4_256 XMSSMT_SM3_40_4_256
# define XMSSMT_HASH256_40_8_256 XMSSMT_SM3_40_8_256
# define XMSSMT_HASH256_60_3_256 XMSSMT_SM3_60_3_256
# define XMSSMT_HASH256_60_6_256 XMSSMT_SM3_60_6_256
# define XMSSMT_HASH256_60_12_256 XMSSMT_SM3_60_12_256
# define XMSSMT_HASH256_20_2_256_NAME "XMSSMT_SM3_20_2_256"
# define XMSSMT_HASH256_20_4_256_NAME "XMSSMT_SM3_20_4_256"
# define XMSSMT_HASH256_40_2_256_NAME "XMSSMT_SM3_40_2_256"
# define XMSSMT_HASH256_40_4_256_NAME "XMSSMT_SM3_40_4_256"
# define XMSSMT_HASH256_40_8_256_NAME "XMSSMT_SM3_40_8_256"
# define XMSSMT_HASH256_60_3_256_NAME "XMSSMT_SM3_60_3_256"
# define XMSSMT_HASH256_60_6_256_NAME "XMSSMT_SM3_60_6_256"
# define XMSSMT_HASH256_60_12_256_NAME "XMSSMT_SM3_60_12_256"
#endif
#define XMSSMT_SM3_20_2_256_NAME "XMSSMT_SM3_20_2_256"
#define XMSSMT_SM3_20_4_256_NAME "XMSSMT_SM3_20_4_256"
#define XMSSMT_SM3_40_2_256_NAME "XMSSMT_SM3_40_2_256"
#define XMSSMT_SM3_40_4_256_NAME "XMSSMT_SM3_40_4_256"
#define XMSSMT_SM3_40_8_256_NAME "XMSSMT_SM3_40_8_256"
#define XMSSMT_SM3_60_3_256_NAME "XMSSMT_SM3_60_3_256"
#define XMSSMT_SM3_60_6_256_NAME "XMSSMT_SM3_60_6_256"
#define XMSSMT_SM3_60_12_256_NAME "XMSSMT_SM3_60_12_256"
char *xmssmt_type_name(uint32_t xmssmt_type);
uint32_t xmssmt_type_from_name(const char *name);
@@ -350,11 +267,11 @@ size_t xmssmt_num_trees_nodes(size_t height, size_t layers);
typedef struct {
uint32_t xmssmt_type;
xmss_hash256_t seed;
xmss_hash256_t root;
xmss_sm3_digest_t seed;
xmss_sm3_digest_t root;
} XMSSMT_PUBLIC_KEY;
#define XMSSMT_PUBLIC_KEY_SIZE (4 + sizeof(xmss_hash256_t) + sizeof(xmss_hash256_t)) // = 68 bytes
#define XMSSMT_PUBLIC_KEY_SIZE (4 + sizeof(xmss_sm3_digest_t) + sizeof(xmss_sm3_digest_t)) // = 68 bytes
typedef struct XMSSMT_KEY_st XMSSMT_KEY;
@@ -363,9 +280,9 @@ typedef int (*xmssmt_key_update_callback)(XMSSMT_KEY *key);
typedef struct XMSSMT_KEY_st {
XMSSMT_PUBLIC_KEY public_key;
uint64_t index; // in [0, 2^60 - 1]
xmss_hash256_t secret;
xmss_hash256_t sk_prf;
xmss_hash256_t *trees;
xmss_sm3_digest_t secret;
xmss_sm3_digest_t sk_prf;
xmss_sm3_digest_t *trees;
xmss_wots_sig_t wots_sigs[XMSSMT_MAX_LAYERS - 1];
xmssmt_key_update_callback update_callback;
void *update_param;
@@ -382,7 +299,7 @@ typedef struct XMSSMT_KEY_st {
XMSSMT_SM3_60_12_256: 47,916 bytes
*/
int xmssmt_private_key_size(uint32_t xmssmt_type, size_t *len);
int xmssmt_build_auth_path(const xmss_hash256_t *tree, size_t height, size_t layers, uint64_t index, xmss_hash256_t *auth_path);
int xmssmt_build_auth_path(const xmss_sm3_digest_t *tree, size_t height, size_t layers, uint64_t index, xmss_sm3_digest_t *auth_path);
int xmssmt_key_generate(XMSSMT_KEY *key, uint32_t xmssmt_type);
int xmssmt_key_set_update_callback(XMSSMT_KEY *key, xmssmt_key_update_callback update_cb, void *param);
@@ -399,9 +316,9 @@ void xmssmt_key_cleanup(XMSSMT_KEY *key);
typedef struct {
uint64_t index;
xmss_hash256_t random;
xmss_sm3_digest_t random;
xmss_wots_sig_t wots_sigs[XMSSMT_MAX_LAYERS];
xmss_hash256_t auth_path[XMSSMT_MAX_HEIGHT];
xmss_sm3_digest_t auth_path[XMSSMT_MAX_HEIGHT];
} XMSSMT_SIGNATURE;
int xmssmt_index_to_bytes(uint64_t index, uint32_t xmssmt_type, uint8_t **out, size_t *outlen);
@@ -420,7 +337,7 @@ int xmssmt_signature_print(FILE *fp, int fmt, int ind, const char *label, const
typedef struct {
XMSSMT_PUBLIC_KEY xmssmt_public_key;
XMSSMT_SIGNATURE xmssmt_sig;
XMSS_HASH256_CTX hash256_ctx;
SM3_CTX sm3_ctx;
} XMSSMT_SIGN_CTX;
int xmssmt_sign_init(XMSSMT_SIGN_CTX *ctx, XMSSMT_KEY *key);