From 6c7876f6dfa9de2ccac02ef2d171ff518cac1e29 Mon Sep 17 00:00:00 2001 From: Zhi Guan Date: Mon, 1 Aug 2022 17:27:25 +0800 Subject: [PATCH] Add SM9 demos --- demos/sm9/Makefile | 10 ++++++++ demos/sm9/sm9_encrypt_demo.c | 38 +++++++++++++++++++++++++++++++ demos/sm9/sm9_keygen_demo.c | 26 +++++++++++++++++++++ demos/sm9/sm9_sign_demo.c | 44 ++++++++++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 demos/sm9/Makefile create mode 100644 demos/sm9/sm9_encrypt_demo.c create mode 100644 demos/sm9/sm9_keygen_demo.c create mode 100644 demos/sm9/sm9_sign_demo.c diff --git a/demos/sm9/Makefile b/demos/sm9/Makefile new file mode 100644 index 00000000..96e469f3 --- /dev/null +++ b/demos/sm9/Makefile @@ -0,0 +1,10 @@ +all: + cc sm9_keygen_demo.c -lgmssl -o sm9_keygen_demo + cc sm9_sign_demo.c -lgmssl -o sm9_sign_demo + cc sm9_encrypt_demo.c -lgmssl -o sm9_encrypt_demo + +clean: + rm -fr sm9_keygen_demo + rm -fr sm9_sign_demo + rm -fr sm9_encrypt_demo + diff --git a/demos/sm9/sm9_encrypt_demo.c b/demos/sm9/sm9_encrypt_demo.c new file mode 100644 index 00000000..b3153604 --- /dev/null +++ b/demos/sm9/sm9_encrypt_demo.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include + + +int main(void) +{ + SM9_ENC_MASTER_KEY master; + SM9_ENC_MASTER_KEY master_public; + SM9_ENC_KEY key; + const char *id = "Alice"; + uint8_t buf[512]; + uint8_t *p = buf; + const uint8_t *cp = buf; + size_t len; + char mbuf[256]; + size_t mlen; + int ret; + + sm9_enc_master_key_generate(&master); + sm9_enc_master_key_extract_key(&master, id, strlen(id), &key); + + sm9_enc_master_public_key_to_der(&master, &p, &len); + sm9_enc_master_public_key_from_der(&master_public, &cp, &len); + + sm9_encrypt(&master_public, id, strlen(id), (uint8_t *)"hello", strlen("hello"), buf, &len); + ret = sm9_decrypt(&key, id, strlen(id), buf, len, (uint8_t *)mbuf, &mlen); + if (ret != 1) { + fprintf(stderr, "decrypt failed\n"); + return 1; + } + mbuf[mlen] = 0; + printf("decrypt result: %s\n", mbuf); + + return 0; +} diff --git a/demos/sm9/sm9_keygen_demo.c b/demos/sm9/sm9_keygen_demo.c new file mode 100644 index 00000000..a1055e74 --- /dev/null +++ b/demos/sm9/sm9_keygen_demo.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include + + +int main(void) +{ + SM9_SIGN_MASTER_KEY sign_master; + SM9_SIGN_KEY sign_key; + + sm9_sign_master_key_generate(&sign_master); + + printf("SM9 Master Secret\n"); + sm9_sign_master_key_info_encrypt_to_pem(&sign_master, "P@ssw0rd", stdout); + + printf("SM9 Public Parameters\n"); + sm9_sign_master_public_key_to_pem(&sign_master, stdout); + + sm9_sign_master_key_extract_key(&sign_master, "alice", strlen("alice"), &sign_key); + + printf("SM9 private key for ID '%s'\n", "alice"); + sm9_sign_key_info_encrypt_to_pem(&sign_key, "123456", stdout); + + return 0; +} diff --git a/demos/sm9/sm9_sign_demo.c b/demos/sm9/sm9_sign_demo.c new file mode 100644 index 00000000..667b0c89 --- /dev/null +++ b/demos/sm9/sm9_sign_demo.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include + + +int main(void) +{ + SM9_SIGN_MASTER_KEY sign_master; + SM9_SIGN_MASTER_KEY sign_master_public; + SM9_SIGN_KEY sign_key; + SM9_SIGN_CTX sign_ctx; + const char *id = "Alice"; + uint8_t sig[SM9_SIGNATURE_SIZE]; + size_t siglen; + uint8_t buf[512]; + uint8_t *p = buf; + const uint8_t *cp = buf; + size_t len; + int ret; + + sm9_sign_master_key_generate(&sign_master); + + sm9_sign_master_key_extract_key(&sign_master, id, strlen(id), &sign_key); + + sm9_sign_init(&sign_ctx); + sm9_sign_update(&sign_ctx, (uint8_t *)"hello world", strlen("hello world")); + sm9_sign_finish(&sign_ctx, &sign_key, sig, &siglen); + + format_bytes(stdout, 0, 0, "signature", sig, siglen); + + + sm9_sign_master_public_key_to_der(&sign_master, &p, &len); + sm9_sign_master_public_key_from_der(&sign_master_public, &cp, &len); + + sm9_verify_init(&sign_ctx); + sm9_verify_update(&sign_ctx, (uint8_t *)"hello world", strlen("hello world")); + ret = sm9_verify_finish(&sign_ctx, sig, siglen, &sign_master_public, id, strlen(id)); + printf("verify %s\n", ret == 1 ? "success" : "failure"); + + + return 0; +}