From 3c2d75ed98a1196f1893a18d0e5acaa8073e2f12 Mon Sep 17 00:00:00 2001 From: John Jiang Date: Wed, 8 Jan 2025 17:11:48 +0800 Subject: [PATCH] TKSS-1028: Reset struct members after freeing them --- .../crypto/provider/nativeImpl/NativeSM4.java | 4 +- kona-crypto/src/main/jni/kona_sm2_cipher.c | 20 +++++-- .../src/main/jni/kona_sm2_keyagreement.c | 49 ++++++++++++++---- kona-crypto/src/main/jni/kona_sm2_signature.c | 17 ++++-- .../resources/libKonaCrypto-linux-aarch64.so | Bin 82608 -> 82608 bytes .../resources/libKonaCrypto-linux-x86_64.so | Bin 61224 -> 61224 bytes 6 files changed, 68 insertions(+), 22 deletions(-) diff --git a/kona-crypto/src/main/java/com/tencent/kona/crypto/provider/nativeImpl/NativeSM4.java b/kona-crypto/src/main/java/com/tencent/kona/crypto/provider/nativeImpl/NativeSM4.java index cf339b1d..d3b231aa 100644 --- a/kona-crypto/src/main/java/com/tencent/kona/crypto/provider/nativeImpl/NativeSM4.java +++ b/kona-crypto/src/main/java/com/tencent/kona/crypto/provider/nativeImpl/NativeSM4.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024, THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2024, 2025, THL A29 Limited, a Tencent company. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify @@ -185,7 +185,7 @@ void setIV(byte[] iv) { if (pointer == 0 || nativeCrypto().sm4GCMSetIV(pointer, iv) != OPENSSL_SUCCESS) { - throw new IllegalStateException("SM4 re-init context operation failed"); + throw new IllegalStateException("SM4 setting IV operation failed"); } this.iv = iv; diff --git a/kona-crypto/src/main/jni/kona_sm2_cipher.c b/kona-crypto/src/main/jni/kona_sm2_cipher.c index 07e81e0b..7082e5a5 100644 --- a/kona-crypto/src/main/jni/kona_sm2_cipher.c +++ b/kona-crypto/src/main/jni/kona_sm2_cipher.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024, THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2024, 2025, THL A29 Limited, a Tencent company. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,6 +67,7 @@ JNIEXPORT jlong JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeC uint8_t* pri_key_buf = OPENSSL_malloc(SM2_PRI_KEY_LEN); if (!pri_key_buf) { (*env)->ReleaseByteArrayElements(env, key, key_bytes, JNI_ABORT); + return OPENSSL_FAILURE; } memcpy(pri_key_buf, (const uint8_t*)key_bytes, SM2_PRI_KEY_LEN); @@ -75,6 +76,7 @@ JNIEXPORT jlong JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeC if (!pub_key_buf) { OPENSSL_free(pri_key_buf); (*env)->ReleaseByteArrayElements(env, key, key_bytes, JNI_ABORT); + return OPENSSL_FAILURE; } memcpy(pub_key_buf, (const uint8_t*)key_bytes + SM2_PRI_KEY_LEN, SM2_PUB_KEY_LEN); @@ -93,6 +95,7 @@ JNIEXPORT jlong JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeC EVP_PKEY_CTX* pctx = sm2_create_pkey_ctx(pkey); if (pctx == NULL) { EVP_PKEY_free(pkey); + return OPENSSL_FAILURE; } @@ -100,6 +103,7 @@ JNIEXPORT jlong JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeC if (ctx == NULL) { EVP_PKEY_free(pkey); EVP_PKEY_CTX_free(pctx); + return OPENSSL_FAILURE; } ctx->pkey = pkey; @@ -110,8 +114,14 @@ JNIEXPORT jlong JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeC void sm2_cipher_ctx_free(SM2_CIPHER_CTX* ctx) { if (ctx != NULL) { - if (ctx->pkey != NULL) EVP_PKEY_free(ctx->pkey); - if (ctx->pctx != NULL) EVP_PKEY_CTX_free(ctx->pctx); + if (ctx->pkey != NULL) { + EVP_PKEY_free(ctx->pkey); + ctx->pkey = NULL; + } + if (ctx->pctx != NULL) { + EVP_PKEY_CTX_free(ctx->pctx); + ctx->pctx = NULL; + } OPENSSL_free(ctx); } @@ -159,7 +169,7 @@ uint8_t* sm2_encrypt(EVP_PKEY_CTX* ctx, const uint8_t* plaintext, size_t plainte JNIEXPORT jbyteArray JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeCrypto_sm2CipherEncrypt (JNIEnv* env, jobject thisObj, jlong pointer, jbyteArray plaintext) { SM2_CIPHER_CTX* ctx = (SM2_CIPHER_CTX*)pointer; - if (ctx == NULL) { + if (ctx == NULL || ctx->pctx == NULL) { return NULL; } @@ -233,7 +243,7 @@ uint8_t* sm2_decrypt(EVP_PKEY_CTX* ctx, const uint8_t* ciphertext, size_t cipher JNIEXPORT jbyteArray JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeCrypto_sm2CipherDecrypt (JNIEnv* env, jobject thisObj, jlong pointer, jbyteArray ciphertext) { SM2_CIPHER_CTX* ctx = (SM2_CIPHER_CTX*)pointer; - if (ctx == NULL) { + if (ctx == NULL || ctx->pctx == NULL) { return NULL; } diff --git a/kona-crypto/src/main/jni/kona_sm2_keyagreement.c b/kona-crypto/src/main/jni/kona_sm2_keyagreement.c index 8d40c524..1718534c 100644 --- a/kona-crypto/src/main/jni/kona_sm2_keyagreement.c +++ b/kona-crypto/src/main/jni/kona_sm2_keyagreement.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024, THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2024, 2025, THL A29 Limited, a Tencent company. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,8 +59,14 @@ SM2_KEYEX_CTX* sm2_create_keyex_ctx() { void sm2_free_keyex_ctx(SM2_KEYEX_CTX* ctx) { if (ctx != NULL) { - if (ctx->sm3_ctx != NULL) EVP_MD_CTX_free(ctx->sm3_ctx); - if (ctx->bn_ctx != NULL) BN_CTX_free(ctx->bn_ctx); + if (ctx->sm3_ctx != NULL) { + EVP_MD_CTX_free(ctx->sm3_ctx); + ctx->sm3_ctx = NULL; + } + if (ctx->bn_ctx != NULL) { + BN_CTX_free(ctx->bn_ctx); + ctx->bn_ctx = NULL; + } OPENSSL_free(ctx); } @@ -358,14 +364,35 @@ int sm2_derive_key(uint8_t* key_out, int key_len, void sm2_keyex_params_free(SM2_KEYEX_PARAMS* ctx) { if (ctx != NULL) { - if (ctx->pri_key != NULL) BN_free(ctx->pri_key); - if (ctx->pub_key != NULL) EC_POINT_free(ctx->pub_key); - if (ctx->e_pri_key != NULL) BN_free(ctx->e_pri_key); - if (ctx->id != NULL) OPENSSL_free(ctx->id); + if (ctx->pri_key != NULL) { + BN_free(ctx->pri_key); + ctx->pri_key = NULL; + } + if (ctx->pub_key != NULL) { + EC_POINT_free(ctx->pub_key); + ctx->pub_key = NULL; + } + if (ctx->e_pri_key != NULL) { + BN_free(ctx->e_pri_key); + ctx->e_pri_key = NULL; + } + if (ctx->id != NULL) { + OPENSSL_free(ctx->id); + ctx->id = NULL; + } - if (ctx->peer_pub_key != NULL) EC_POINT_free(ctx->peer_pub_key); - if (ctx->peer_e_pub_key != NULL) EC_POINT_free(ctx->peer_e_pub_key); - if (ctx->peer_id != NULL) OPENSSL_free(ctx->peer_id); + if (ctx->peer_pub_key != NULL) { + EC_POINT_free(ctx->peer_pub_key); + ctx->peer_pub_key = NULL; + } + if (ctx->peer_e_pub_key != NULL) { + EC_POINT_free(ctx->peer_e_pub_key); + ctx->peer_e_pub_key = NULL; + } + if (ctx->peer_id != NULL) { + OPENSSL_free(ctx->peer_id); + ctx->peer_id = NULL; + } OPENSSL_free(ctx); } @@ -382,7 +409,7 @@ JNIEXPORT void JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeCr } JNIEXPORT jbyteArray JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeCrypto_sm2DeriveKey - (JNIEnv* env, jobject thisObj, jlong pointer, + (JNIEnv* env, jobject thisObj, jlong pointer, jbyteArray priKey, jbyteArray pubKey, jbyteArray ePriKey, jbyteArray id, jbyteArray peerPubKey, jbyteArray peerEPubKey, jbyteArray peerId, jboolean isInitiator, jint sharedKeyLength) { diff --git a/kona-crypto/src/main/jni/kona_sm2_signature.c b/kona-crypto/src/main/jni/kona_sm2_signature.c index e1ba9e6a..40b35876 100644 --- a/kona-crypto/src/main/jni/kona_sm2_signature.c +++ b/kona-crypto/src/main/jni/kona_sm2_signature.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024, THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2024, 2025, THL A29 Limited, a Tencent company. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -177,9 +177,18 @@ JNIEXPORT jlong JNICALL Java_com_tencent_kona_crypto_provider_nativeImpl_NativeC void sm2_signature_ctx_free(SM2_SIGNATURE_CTX* ctx) { if (ctx != NULL) { - if (ctx->mctx != NULL) EVP_MD_CTX_free(ctx->mctx); - if (ctx->pctx != NULL) EVP_PKEY_CTX_free(ctx->pctx); - if (ctx->pkey != NULL) EVP_PKEY_free(ctx->pkey); + if (ctx->mctx != NULL) { + EVP_MD_CTX_free(ctx->mctx); + ctx->mctx = NULL; + } + if (ctx->pctx != NULL) { + EVP_PKEY_CTX_free(ctx->pctx); + ctx->pctx = NULL; + } + if (ctx->pkey != NULL) { + EVP_PKEY_free(ctx->pkey); + ctx->pkey = NULL; + } OPENSSL_free(ctx); } diff --git a/kona-crypto/src/main/resources/libKonaCrypto-linux-aarch64.so b/kona-crypto/src/main/resources/libKonaCrypto-linux-aarch64.so index 3d558237adfdb51bf357e742f12ed6cbab408b98..69c97a0f7fd4aa1b0d6fc09a5c2643938498418e 100755 GIT binary patch delta 7610 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 delta 7597 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 a&BLATm6lyX%Rp>g!xc4F)Hc7=;eP>}To5M! delta 8613 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 l