Update SM9 schemes

Update SM9 schemes based on the default sm9bn256v1 r-ate pairing. To be continued.
This commit is contained in:
Zhi Guan
2018-09-28 22:21:44 +08:00
parent c7aa2cc1ff
commit b54a3d35e6
21 changed files with 6629 additions and 7367 deletions

View File

@@ -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