mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-05-19 14:56:30 +08:00
Update SM9 schemes
Update SM9 schemes based on the default sm9bn256v1 r-ate pairing. To be continued.
This commit is contained in:
139
test/sm9test.c
139
test/sm9test.c
@@ -60,91 +60,96 @@ int main(int argc, char **argv)
|
||||
}
|
||||
#else
|
||||
# include <openssl/evp.h>
|
||||
# include <openssl/err.h>
|
||||
# include <openssl/sm9.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
static int sm9test_sign(const char *id, const unsigned char *msg, size_t msglen)
|
||||
{
|
||||
int err = 1;
|
||||
int curve_id = NID_sm2p256v1; //FIXME
|
||||
char *id = "guanzhi1980@gmail.com";
|
||||
char *in = "message to be signed or encrypted";
|
||||
int ret = 0;
|
||||
SM9PublicParameters *mpk = NULL;
|
||||
SM9MasterSecret *msk = NULL;
|
||||
SM9PrivateKey *sk = NULL;
|
||||
unsigned char dgst[32] = {0x01, 0x00};
|
||||
unsigned char *c = NULL;
|
||||
unsigned char *m = NULL;
|
||||
unsigned char *sig = NULL;
|
||||
size_t clen, mlen, siglen;
|
||||
unsigned char sig[256];
|
||||
size_t siglen = sizeof(sig);
|
||||
|
||||
/* setup */
|
||||
if (!SM9_setup_by_pairing_name(curve_id, SM9_HID_SIGN, &mpk, &msk)) {
|
||||
if (!SM9_setup(NID_sm9bn256v1, NID_sm9sign, NID_sm9hash1_with_sm3, &mpk, &msk)) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* keygen */
|
||||
if (!(sk = SM9_extract_private_key(mpk, msk, id, strlen(id)))) {
|
||||
if (!(sk = SM9_extract_private_key(msk, id, strlen(id)))) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* encrypt */
|
||||
clen = 0;
|
||||
if (!SM9_encrypt_with_recommended(mpk, (unsigned char *)in,
|
||||
strlen(in), NULL, &clen, id, strlen(id))) {
|
||||
if (!SM9_sign(NID_sm3, msg, sizeof(msg), sig, &siglen, sk)) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
if (!(c = OPENSSL_zalloc(clen))) {
|
||||
if (1 != SM9_verify(NID_sm3, msg, sizeof(msg), sig, siglen, mpk, id, strlen(id))) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
if (!SM9_encrypt_with_recommended(mpk, (unsigned char *)in,
|
||||
strlen(in), c, &clen, id, strlen(id))) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* decrypt */
|
||||
mlen = 0;
|
||||
if (!SM9_decrypt_with_recommended(mpk, c, clen, NULL, &mlen,
|
||||
sk, id, strlen(id))) {
|
||||
goto end;
|
||||
}
|
||||
if (!(m = OPENSSL_zalloc(mlen))) {
|
||||
goto end;
|
||||
}
|
||||
if (!SM9_decrypt_with_recommended(mpk, c, clen, m, &mlen,
|
||||
sk, id, strlen(id))) {
|
||||
goto end;
|
||||
}
|
||||
if (strlen(in) != mlen || memcmp(in, m, mlen) != 0) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* sign */
|
||||
siglen = 0;
|
||||
if (!SM9_sign(mpk, dgst, sizeof(dgst), NULL, &siglen, sk)) {
|
||||
goto end;
|
||||
}
|
||||
if (!(sig = OPENSSL_zalloc(siglen))) {
|
||||
goto end;
|
||||
}
|
||||
if (!SM9_sign(mpk, dgst, sizeof(dgst), sig, &siglen, sk)) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* verify */
|
||||
if (1 != SM9_verify(mpk, dgst, sizeof(dgst), sig, siglen,
|
||||
id, strlen(id))) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
err = 0;
|
||||
|
||||
ret = 1;
|
||||
end:
|
||||
SM9PublicParameters_free(mpk);
|
||||
SM9MasterSecret_free(msk);
|
||||
SM9PrivateKey_free(sk);
|
||||
OPENSSL_free(c);
|
||||
OPENSSL_free(m);
|
||||
OPENSSL_free(sig);
|
||||
//FIXME: return err;
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sm9test_enc(const char *id, const unsigned char *data, size_t datalen)
|
||||
{
|
||||
int ret = 0;
|
||||
SM9PublicParameters *mpk = NULL;
|
||||
SM9MasterSecret *msk = NULL;
|
||||
SM9PrivateKey *sk = NULL;
|
||||
unsigned char mbuf[1024] = {0};
|
||||
unsigned char cbuf[1024] = {0};
|
||||
size_t clen, mlen;
|
||||
|
||||
if (!SM9_setup(NID_sm9bn256v1, NID_sm9encrypt, NID_sm9hash1_with_sm3, &mpk, &msk)) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
if (!(sk = SM9_extract_private_key(msk, id, strlen(id)))) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
if (!SM9_encrypt(NID_sm9encrypt_with_sm3_xor, data, datalen,
|
||||
cbuf, &clen, mpk, id, strlen(id))) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
if (!SM9_decrypt(NID_sm9encrypt_with_sm3_xor, cbuf, clen,
|
||||
mbuf, &mlen, sk)) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
if (mlen != datalen || memcmp(mbuf, data, datalen) != 0) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
end:
|
||||
SM9PublicParameters_free(mpk);
|
||||
SM9MasterSecret_free(msk);
|
||||
SM9PrivateKey_free(sk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int err = 0;
|
||||
char *id = "guanzhi1980@gmail.com";
|
||||
unsigned char in[] = "message to be signed or encrypted";
|
||||
|
||||
if (!sm9test_sign(id, in, sizeof(in))) {
|
||||
err++;
|
||||
}
|
||||
if (!sm9test_enc(id, in, sizeof(in))) {
|
||||
err++;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user