Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TKSS-936: NativeSM2Signature should free EVP_PKEY_CTX and EVP_PKEY #937

Merged
merged 1 commit into from
Nov 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 28 additions & 11 deletions kona-crypto/src/main/jni/kona_crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -1085,7 +1085,7 @@ JNIEXPORT jlong JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeC
return KONA_BAD;
}

SM2_CIPHER_CTX* ctx = (SM2_CIPHER_CTX*)malloc(sizeof(SM2_CIPHER_CTX));
SM2_CIPHER_CTX* ctx = (SM2_CIPHER_CTX*)OPENSSL_malloc(sizeof(SM2_CIPHER_CTX));
ctx->pkey = pkey;
ctx->pctx = pctx;

Expand Down Expand Up @@ -1256,7 +1256,13 @@ JNIEXPORT jbyteArray JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_Na
/* ***** SM2 cipher end ***** */

/* ***** SM2 signature start ***** */
EVP_MD_CTX* sm2_create_md_ctx(EVP_PKEY* pkey, const unsigned char* id, size_t id_len, int is_sign) {
typedef struct {
EVP_PKEY* pkey;
EVP_PKEY_CTX* pctx;
EVP_MD_CTX* mctx;
} SM2_SIGNATURE_CTX;

SM2_SIGNATURE_CTX* sm2_create_md_ctx(EVP_PKEY* pkey, const unsigned char* id, size_t id_len, int is_sign) {
if (pkey == NULL || id == NULL || id_len == 0) {
return NULL;
}
Expand Down Expand Up @@ -1298,7 +1304,12 @@ EVP_MD_CTX* sm2_create_md_ctx(EVP_PKEY* pkey, const unsigned char* id, size_t id
}
}

return mctx;
SM2_SIGNATURE_CTX* ctx = OPENSSL_malloc(sizeof(SM2_SIGNATURE_CTX));
ctx->pkey = pkey;
ctx->pctx = pctx;
ctx->mctx = mctx;

return ctx;
}

JNIEXPORT jlong JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeCrypto_sm2SignatureCreateCtx
Expand Down Expand Up @@ -1357,12 +1368,16 @@ JNIEXPORT jlong JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeC
OPENSSL_free(pub_key_buf);
}

long pointer = pkey == NULL ? KONA_BAD : (jlong)sm2_create_md_ctx(pkey, (const unsigned char *)id_bytes, id_len, isSign);
if (pkey == NULL) {
return KONA_BAD;
}

SM2_SIGNATURE_CTX* ctx = sm2_create_md_ctx(pkey, (const unsigned char *)id_bytes, id_len, isSign);

(*env)->ReleaseByteArrayElements(env, key, key_bytes, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, id, id_bytes, JNI_ABORT);

return (jlong)pointer;
return (jlong)ctx;
}

JNIEXPORT void JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeCrypto_sm2SignatureFreeCtx
Expand All @@ -1371,9 +1386,11 @@ JNIEXPORT void JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeCr
return;
}

EVP_MD_CTX *ctx = (EVP_MD_CTX *)pointer;
SM2_SIGNATURE_CTX *ctx = (SM2_SIGNATURE_CTX *)pointer;
if (ctx != NULL) {
EVP_MD_CTX_free(ctx);
EVP_MD_CTX_free(ctx->mctx);
EVP_PKEY_CTX_free(ctx->pctx);
EVP_PKEY_free(ctx->pkey);
}
}

Expand Down Expand Up @@ -1409,7 +1426,7 @@ unsigned char* sm2_sign(EVP_MD_CTX* ctx, const unsigned char* msg, size_t msg_le

JNIEXPORT jbyteArray JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeCrypto_sm2SignatureSign
(JNIEnv *env, jobject thisObj, jlong pointer, jbyteArray message) {
EVP_MD_CTX *ctx = (EVP_MD_CTX *)pointer;
SM2_SIGNATURE_CTX *ctx = (SM2_SIGNATURE_CTX *)pointer;
if (ctx == NULL) {
return NULL;
}
Expand All @@ -1421,7 +1438,7 @@ JNIEXPORT jbyteArray JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_Na
}

size_t sig_len = 0;
unsigned char* sig_buf = sm2_sign(ctx, (unsigned char *)msg_bytes, msg_len, &sig_len);
unsigned char* sig_buf = sm2_sign(ctx->mctx, (unsigned char *)msg_bytes, msg_len, &sig_len);

(*env)->ReleaseByteArrayElements(env, message, msg_bytes, JNI_ABORT);

Expand Down Expand Up @@ -1462,7 +1479,7 @@ int sm2_verify(EVP_MD_CTX* ctx, const unsigned char* msg, size_t msg_len, const

JNIEXPORT jint JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeCrypto_sm2SignatureVerify
(JNIEnv *env, jobject thisObj, jlong pointer, jbyteArray message, jbyteArray signature) {
EVP_MD_CTX *ctx = (EVP_MD_CTX *)pointer;
SM2_SIGNATURE_CTX *ctx = (SM2_SIGNATURE_CTX *)pointer;
if (ctx == NULL) {
return KONA_BAD;
}
Expand All @@ -1480,7 +1497,7 @@ JNIEXPORT jint JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeCr
return KONA_BAD;
}

int verified = sm2_verify(ctx, (unsigned char *)msg_bytes, msg_len, (unsigned char *)sig_bytes, sig_len) == OPENSSL_SUCCESS
int verified = sm2_verify(ctx->mctx, (unsigned char *)msg_bytes, msg_len, (unsigned char *)sig_bytes, sig_len) == OPENSSL_SUCCESS
? KONA_GOOD : KONA_BAD;

(*env)->ReleaseByteArrayElements(env, message, msg_bytes, JNI_ABORT);
Expand Down
Binary file modified kona-crypto/src/main/resources/libKonaCrypto-linux-aarch64.so
Binary file not shown.
Binary file modified kona-crypto/src/main/resources/libKonaCrypto-linux-x86_64.so
Binary file not shown.