diff --git a/plugin/openssl_plugin/common/inc/openssl_adapter.h b/plugin/openssl_plugin/common/inc/openssl_adapter.h index 315f56357d9ee839c8ebb7854ccba4b5845f6cfa..f830458b651c148fc5bff7698b0ba99dd219b8b3 100644 --- a/plugin/openssl_plugin/common/inc/openssl_adapter.h +++ b/plugin/openssl_plugin/common/inc/openssl_adapter.h @@ -331,6 +331,8 @@ int OpensslPkcs5Pbkdf2Hmac(const char *pass, int passlen, const unsigned char *s EC_GROUP *OpensslEcGroupNewByCurveName(int nid); +int OpensslEvpEncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); int OpensslEvpCipherCtxCtrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr); DH *OpensslDhNew(void); diff --git a/plugin/openssl_plugin/common/src/openssl_adapter.c b/plugin/openssl_plugin/common/src/openssl_adapter.c index 2007b8754b0a7d3d1464cc2cee9d8efbb452c283..f4ec918e71f389bc50f8ff5498fefd36844d05f0 100644 --- a/plugin/openssl_plugin/common/src/openssl_adapter.c +++ b/plugin/openssl_plugin/common/src/openssl_adapter.c @@ -1288,6 +1288,12 @@ EC_GROUP *OpensslEcGroupNewByCurveName(int nid) return EC_GROUP_new_by_curve_name(nid); } +int OpensslEvpEncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv) +{ + return EVP_EncryptInit(ctx, cipher, key, iv); +} + int OpensslEvpCipherCtxCtrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) { return EVP_CIPHER_CTX_ctrl(ctx, type, arg, ptr); diff --git a/plugin/openssl_plugin/key/sym_key_generator/src/sym_key_openssl.c b/plugin/openssl_plugin/key/sym_key_generator/src/sym_key_openssl.c index 6d7ff0aff14f70c033588f8b3025abb5c8a40dbe..135851303522a29641ce15a2f3ab9fed1fcae5f1 100644 --- a/plugin/openssl_plugin/key/sym_key_generator/src/sym_key_openssl.c +++ b/plugin/openssl_plugin/key/sym_key_generator/src/sym_key_openssl.c @@ -148,6 +148,42 @@ static HcfResult HcfSymmKeySpiCreate(int32_t keyLen, SymKeyImpl *symKey) return res; } +static HcfResult HcfDesSymmKeySpiCreate(int32_t keyLen, SymKeyImpl *symKey) +{ + if ((keyLen == 0) || (symKey == NULL)) { + LOGE("Invalid input parameter!"); + return HCF_INVALID_PARAMS; + } + uint8_t *keyMaterial = (uint8_t *)HcfMalloc(keyLen, 0); + if (keyMaterial == NULL) { + LOGE("keyMaterial malloc failed!"); + return HCF_ERR_MALLOC; + } + EVP_CIPHER_CTX *ctx = OpensslEvpCipherCtxNew(); + if (ctx == NULL) { + LOGE("Failed to create EVP_CIPHER_CTX!"); + HcfFree(keyMaterial); + return HCF_ERR_CRYPTO_OPERATION; + } + if (OpensslEvpEncryptInit(ctx, OpensslEvpDesEcb(), NULL, NULL) != HCF_OPENSSL_SUCCESS) { + HcfPrintOpensslError(); + LOGD("[error] EVP_CipherInit failed!"); + return false; + } + if (OpensslEvpCipherCtxCtrl(ctx, EVP_CTRL_RAND_KEY, 0, keyMaterial) != 1) { + HcfPrintOpensslError(); + LOGE("EVP_CIPHER_CTX_ctrl failed to validate DES key!"); + EVP_CIPHER_CTX_free(ctx); + HcfFree(keyMaterial); + return HCF_INVALID_PARAMS; + } + + EVP_CIPHER_CTX_free(ctx); + symKey->keyMaterial.data = keyMaterial; + symKey->keyMaterial.len = keyLen; + return HCF_SUCCESS; +} + static void DestroySymKeyGeneratorSpi(HcfObjectBase *base) { if (base == NULL) { @@ -270,11 +306,21 @@ static HcfResult GenerateSymmKey(HcfSymKeyGeneratorSpi *self, HcfSymKey **symmKe return HCF_ERR_MALLOC; } HcfSymKeyGeneratorSpiOpensslImpl *impl = (HcfSymKeyGeneratorSpiOpensslImpl *)self; - HcfResult res = HcfSymmKeySpiCreate(impl->attr.keySize / KEY_BIT, returnSymmKey); - if (res != HCF_SUCCESS) { - HcfFree(returnSymmKey); - return res; + HcfResult res = HCF_SUCCESS; + if (impl->attr.algo == HCF_ALG_DES) { + res = HcfDesSymmKeySpiCreate(impl->attr.keySize / KEY_BIT, returnSymmKey); + if (res != HCF_SUCCESS) { + HcfFree(returnSymmKey); + return res; + } + } else { + res = HcfSymmKeySpiCreate(impl->attr.keySize / KEY_BIT, returnSymmKey); + if (res != HCF_SUCCESS) { + HcfFree(returnSymmKey); + return res; + } } + returnSymmKey->algoName = GetAlgoName(impl, impl->attr.keySize); returnSymmKey->key.clearMem = ClearMem; returnSymmKey->key.key.getEncoded = GetEncoded; @@ -283,7 +329,7 @@ static HcfResult GenerateSymmKey(HcfSymKeyGeneratorSpi *self, HcfSymKey **symmKe returnSymmKey->key.key.base.destroy = DestroySymKeySpi; returnSymmKey->key.key.base.getClass = GetSymKeyClass; *symmKey = (HcfSymKey *)returnSymmKey; - return HCF_SUCCESS; + return res; } static bool IsBlobKeyLenValid(SymKeyAttr attr, const HcfBlob *key)