HcfAlgValue type = impl->attr.algo; if (type == HCF_ALG_AES) { if (strcpy_s(algoName, MAX_KEY_STR_SIZE, AES_ALG_NAME) != EOK) { LOGE("aes algoName strcpy_s failed!"); goto clearup; } if (strcpy_s(algoName + aesSize, MAX_KEY_STR_SIZE - aesSize, keySizeChar) != EOK) { LOGE("aes algoName size strcpy_s failed!"); goto clearup; } } else if (type == HCF_ALG_DES) { if (strcpy_s(algoName, MAX_KEY_STR_SIZE, DES_ALG_NAME) != EOK) { LOGE("des algoName strcpy_s failed!"); goto clearup; } if (strcpy_s(algoName + desSize, MAX_KEY_STR_SIZE - desSize, keySizeChar) != EOK) { LOGE("des algoName size strcpy_s failed!"); goto clearup; } } else { LOGE("unsupport algo!"); goto clearup; } return algoName; clearup: HcfFree(algoName); return NULL; }代码解析
时间: 2024-02-14 12:36:08 浏览: 14
这段代码主要是根据传入的算法类型(HcfAlgValue type = impl->attr.algo;)来生成算法名称,将算法名称和密钥长度拼接到一起,返回生成的算法名称(return algoName;)。如果生成算法名称和密钥长度的过程中出现错误,则会释放已经分配的内存(HcfFree(algoName);)并返回 NULL。如果传入的算法类型不支持,则会输出错误信息(LOGE("unsupport algo!");)并返回 NULL。这段代码主要是在进行加密操作时使用的。
相关问题
static char *GetAlgoName(HcfSymKeyGeneratorSpiOpensslImpl *impl) { char keySizeChar[MAX_KEY_STR_SIZE] = { 0 }; if (sprintf_s(keySizeChar, MAX_KEY_STR_SIZE, "%d", impl->attr.keySize) < 0) { LOGE("Invalid input parameter!"); return NULL; } char *algoName = (char *)HcfMalloc(MAX_KEY_STR_SIZE, 0); if (algoName == NULL) { LOGE("algoName malloc failed!"); return NULL; } HcfAlgValue type = impl->attr.algo; if (type == HCF_ALG_AES) { int32_t aesSize = strlen(AES_ALG_NAME); if (strcpy_s(algoName, MAX_KEY_STR_SIZE, AES_ALG_NAME) != EOK) { LOGE("aes algoName strcpy_s failed!"); goto clearup; } if (strcpy_s(algoName + aesSize, MAX_KEY_STR_SIZE - aesSize, keySizeChar) != EOK) { LOGE("aes algoName size strcpy_s failed!"); goto clearup; } } else if (type == HCF_ALG_SM4) { int32_t sm4Size = strlen(SM4_ALG_NAME); if (strcpy_s(algoName, MAX_KEY_STR_SIZE, SM4_ALG_NAME) != EOK) { LOGE("sm4 algoName strcpy_s failed!"); goto clearup; } if (strcpy_s(algoName + sm4Size, MAX_KEY_STR_SIZE - sm4Size, keySizeChar) != EOK) { LOGE("sm4 algoName size strcpy_s failed!"); goto clearup; } } else if (type == HCF_ALG_DES) { int32_t desSize = strlen(DES_ALG_NAME); if (strcpy_s(algoName, MAX_KEY_STR_SIZE, DES_ALG_NAME) != EOK) { LOGE("des algoName strcpy_s failed!"); goto clearup; } if (strcpy_s(algoName + desSize, MAX_KEY_STR_SIZE - desSize, keySizeChar) != EOK) { LOGE("des algoName size strcpy_s failed!"); goto clearup; } } else { LOGE("unsupport algo!"); goto clearup; } return algoName; clearup: HcfFree(algoName); return NULL; }简化代码
这段代码的作用是根据输入的加密算法类型和密钥长度生成算法名称,并返回该名称的字符串。如果生成失败,会返回NULL。
简化后的代码如下:
```
static char *GetAlgoName(HcfSymKeyGeneratorSpiOpensslImpl *impl) {
char keySizeChar[MAX_KEY_STR_SIZE] = { 0 };
if (sprintf_s(keySizeChar, MAX_KEY_STR_SIZE, "%d", impl->attr.keySize) < 0) {
return NULL;
}
char *algoName = (char *)HcfMalloc(MAX_KEY_STR_SIZE, 0);
if (algoName == NULL) {
return NULL;
}
HcfAlgValue type = impl->attr.algo;
int32_t algSize;
const char *algName;
if (type == HCF_ALG_AES) {
algName = AES_ALG_NAME;
} else if (type == HCF_ALG_SM4) {
algName = SM4_ALG_NAME;
} else if (type == HCF_ALG_DES) {
algName = DES_ALG_NAME;
} else {
HcfFree(algoName);
return NULL;
}
algSize = strlen(algName);
if (strcpy_s(algoName, MAX_KEY_STR_SIZE, algName) != EOK) {
HcfFree(algoName);
return NULL;
}
if (strcpy_s(algoName + algSize, MAX_KEY_STR_SIZE - algSize, keySizeChar) != EOK) {
HcfFree(algoName);
return NULL;
}
return algoName;
}
```
static HcfResult GetEncoded(HcfKey *self, HcfBlob *key) { if ((self == NULL) || (key == NULL)) { LOGE("Invalid input parameter!"); return HCF_INVALID_PARAMS; } if (!IsClassMatch((const HcfObjectBase *)self, OPENSSL_SYM_KEY_CLASS)) { LOGE("Class is not match."); return HCF_INVALID_PARAMS; } SymKeyImpl *impl = (SymKeyImpl *)self; if ((impl->keyMaterial.data == NULL) || (impl->keyMaterial.len == 0)) { LOGE("Invalid SymKeyImpl parameter!"); return HCF_INVALID_PARAMS; } key->data = (uint8_t *)HcfMalloc(impl->keyMaterial.len, 0); if (key->data == NULL) { LOGE("malloc keyMaterial failed!"); return HCF_ERR_MALLOC; } (void)memcpy_s(key->data, impl->keyMaterial.len, impl->keyMaterial.data, impl->keyMaterial.len); key->len = impl->keyMaterial.len; return HCF_SUCCESS; }代码解析
这段代码是一个静态方法 GetEncoded 的实现,功能是获取一个 HcfKey 对象的加密后的密钥,并将其保存到 HcfBlob 对象中。代码中首先对输入参数进行了判空处理,如果输入参数为空则返回 HCF_INVALID_PARAMS 错误码。然后通过 IsClassMatch 方法判断 HcfKey 对象的类型是否为 OPENSSL_SYM_KEY_CLASS,如果不是则返回 HCF_INVALID_PARAMS 错误码。接着将 HcfKey 对象强制转换为 SymKeyImpl 类型,并对其 keyMaterial 属性进行判空处理,如果为空则返回 HCF_INVALID_PARAMS 错误码。然后通过 HcfMalloc 方法为 HcfBlob 对象的 data 分配内存,并将密钥数据复制到其中。最后将密钥数据的长度赋值给 HcfBlob 对象的 len 属性,并返回 HCF_SUCCESS 错误码表示方法执行成功。