2.2 KiB
SM3 Sub-library of GMSSL
SM3 Cryptographic Hash Algorithm is a chinese national cryptographic hash algorithm standard published by the State Cryptography Administration Office of Security Commercial Code Administration (OSCCA) of China in December 2010. A draft of this algorithm can be found at
http://tools.ietf.org/html/draft-shen-sm3-hash-00
The SM3 take input messages as 512 bits blocks and generates 256 bits digest values, same as SHA-256.
The SM3 sub-library of GmSSL provides the implementation of SM3 hash
algorithm, with init/update/final style of interfaces. There is also a
demo program in demo/gmssl/sm3.c on how to implement a command line
tool with the the inner API of SM3 sub-library.
Usage
The SM3 sub-library provides the following C API:
void sm3_init(sm3_ctx_t *ctx);
void sm3_update(sm3_ctx_t *ctx, const unsigned char* data, size_t data_len);
void sm3_final(sm3_ctx_t *ctx, unsigned char digest[SM3_DIGEST_LENGTH]);
void sm3_compress(uint32_t digest[8], const unsigned char block[SM3_BLOCK_SIZE]);
void sm3(const unsigned char *data, size_t datalen, unsigned char digest[SM3_DIGEST_LENGTH]);
void sm3_hmac_init(sm3_hmac_ctx_t *ctx, const unsigned char *key, size_t key_len);
void sm3_hmac_update(sm3_hmac_ctx_t *ctx, const unsigned char *data, size_t data_len);
void sm3_hmac_final(sm3_hmac_ctx_t *ctx, unsigned char mac[sm3_hmac_MAC_SIZE]);
void sm3_hmac(const unsigned char *data, size_t data_len,
const unsigned char *key, size_t key_len, unsigned char mac[sm3_hmac_MAC_SIZE]);
Example on using C API to digest a message:
unsigend char buffer[SM3_DIGEST_LENGTH];
sm3("hello", strlen("hello"), buffer);
Example on using C API to digest a stream:
unsigned char dgst[SM3_DIGEST_LENGTH];
sm3_ctx_t ctx;
sm3_init(&ctx);
sm3_update(&ctx, "hello", strlen("hello"));
sm3_update(&ctx, "world", strlen("world"));
sm3_final(&ctx, dgst);
Example on using C API to generate a HMAC tag:
unsigned char mac[sm3_hmac_MAC_SIZE];
sm3_hmac_ctx_t ctx;
unsigned char key[16];
sm3_hmac_init(&ctx, key, sizeof(key));
sm3_hmac_update(&ctx, "hello", strlen("hello"));
sm3_hmac_update(&ctx, "world", strlen("world"));
sm3_hmac_final(&ctx, mac);