代码讲解 static HcfResult CheckRsaCipherParams(CipherAttr *params) { int32_t opensslPadding = 0; if (params->algo != HCF_ALG_RSA) { LOGE("Cipher algo %u is invalid.", params->algo); return HCF_INVALID_PARAMS; } if (GetOpensslPadding(params->paddingMode, &opensslPadding) != HCF_SUCCESS) { LOGE("Cipher create without padding"); return HCF_INVALID_PARAMS; } if (params->paddingMode == HCF_ALG_NOPADDING && (GetOpensslDigestAlg(params->md) != NULL || GetOpensslDigestAlg(params->mgf1md) != NULL)) { LOGE("Nopadding don't need md or mgf1md"); return HCF_INVALID_PARAMS; } if (params->paddingMode == HCF_OPENSSL_RSA_PKCS1_OAEP_PADDING && GetOpensslDigestAlg(params->md) == NULL) { LOGE("md is NULL"); return HCF_INVALID_PARAMS; } if (params->paddingMode == HCF_OPENSSL_RSA_PKCS1_OAEP_PADDING && GetOpensslDigestAlg(params->mgf1md) == NULL) { LOGE("Use pkcs1_oaep padding, but mgf1md is NULL"); return HCF_INVALID_PARAMS; } return HCF_SUCCESS; }
时间: 2024-04-28 12:19:38 浏览: 103
这是一段 C 语言代码,函数名为 CheckRsaCipherParams,接受一个指向 CipherAttr 结构体的指针参数,返回一个 HcfResult 枚举类型的值。
函数主要是用于检查 RSA 加密算法的参数是否合法。首先判断传入的算法类型是否为 RSA,如果不是则返回 HCF_INVALID_PARAMS。接着根据传入的 paddingMode 参数获取 OpenSSL 的填充方式,如果获取失败则返回 HCF_INVALID_PARAMS。然后判断是否使用了 HCF_ALG_NOPADDING 填充方式,如果是则不需要传入 md 或 mgf1md 参数,如果传入了则返回 HCF_INVALID_PARAMS。接着判断是否使用了 HCF_OPENSSL_RSA_PKCS1_OAEP_PADDING 填充方式,如果是则需要同时传入 md 和 mgf1md 参数,如果其中一个参数为 NULL 则返回 HCF_INVALID_PARAMS。最后如果所有的判断都通过,则返回 HCF_SUCCESS 表示参数合法。
相关问题
static void SetKeyLength(HcfAlgParaValue value, void *cipher) { CipherAttr *cipherAttr = (CipherAttr *)cipher; cipherAttr->keySize = value; switch (value) { case HCF_ALG_AES_128: case HCF_ALG_AES_192: case HCF_ALG_AES_256: cipherAttr->algo = HCF_ALG_AES; break; case HCF_ALG_3DES_192: cipherAttr->algo = HCF_ALG_DES; break; case HCF_OPENSSL_RSA_512: case HCF_OPENSSL_RSA_768: case HCF_OPENSSL_RSA_1024: case HCF_OPENSSL_RSA_2048: case HCF_OPENSSL_RSA_3072: case HCF_OPENSSL_RSA_4096: case HCF_OPENSSL_RSA_8192: cipherAttr->algo = HCF_ALG_RSA; break; default: LOGE("Invalid algo %u.", value); break; } }代码解析
这段代码定义了一个名为 "SetKeyLength" 的静态函数,该函数接受两个参数:一个是 HcfAlgParaValue 类型的值,另一个是 void 指针类型的 cipher。cipher 在函数内部被转换为 CipherAttr 指针类型。
函数实现中,将传入的 value 赋值给 cipherAttr 指向的 CipherAttr 结构体的 keySize 成员变量。然后根据 value 的值,判断算法类型并赋值给 cipherAttr 指向的 CipherAttr 结构体的 algo 成员变量。最后,如果 value 的值不属于预定义的算法类型,则输出一条错误日志。
在代码中,HCF_ALG_AES_128、HCF_ALG_AES_192、HCF_ALG_AES_256、HCF_ALG_3DES_192、HCF_OPENSSL_RSA_512、HCF_OPENSSL_RSA_768、HCF_OPENSSL_RSA_1024、HCF_OPENSSL_RSA_2048、HCF_OPENSSL_RSA_3072、HCF_OPENSSL_RSA_4096、HCF_OPENSSL_RSA_8192 都是预定义的常量。
static void SetKeyLength(HcfAlgParaValue value, void *attr) { SymKeyAttr *keyAttr = (SymKeyAttr *)attr; switch (value) { case HCF_ALG_AES_128: keyAttr->algo = HCF_ALG_AES; keyAttr->keySize = AES_KEY_SIZE_128; break; case HCF_ALG_AES_192: keyAttr->algo = HCF_ALG_AES; keyAttr->keySize = AES_KEY_SIZE_192; break; case HCF_ALG_AES_256: keyAttr->algo = HCF_ALG_AES; keyAttr->keySize = AES_KEY_SIZE_256; break; case HCF_ALG_SM4_128: keyAttr->algo = HCF_ALG_SM4; keyAttr->keySize = SM4_KEY_SIZE_128; break; case HCF_ALG_3DES_192: keyAttr->algo = HCF_ALG_DES; keyAttr->keySize = DES_KEY_SIZE_192; break; default: break; } }代码解析
这段代码定义了一个名为 SetKeyLength 的函数,它的作用是根据给定的 HcfAlgParaValue 值设置 SymKeyAttr 结构体中的算法标识符和密钥长度。
该函数接收两个参数,第一个参数是 HcfAlgParaValue 枚举类型的值,用于指定要设置的密钥长度。第二个参数是一个指向 SymKeyAttr 结构体的指针,用于指定要设置的密钥属性。
该函数使用 switch 语句根据给定的密钥长度值,设置 SymKeyAttr 结构体中的算法标识符和密钥长度。具体地,当 value 的值为 HCF_ALG_AES_128 时,将算法标识符设置为 HCF_ALG_AES,将密钥长度设置为 AES_KEY_SIZE_128;当 value 的值为 HCF_ALG_AES_192 时,将算法标识符设置为 HCF_ALG_AES,将密钥长度设置为 AES_KEY_SIZE_192;当 value 的值为 HCF_ALG_AES_256 时,将算法标识符设置为 HCF_ALG_AES,将密钥长度设置为 AES_KEY_SIZE_256;当 value 的值为 HCF_ALG_SM4_128 时,将算法标识符设置为 HCF_ALG_SM4,将密钥长度设置为 SM4_KEY_SIZE_128;当 value 的值为 HCF_ALG_3DES_192 时,将算法标识符设置为 HCF_ALG_DES,将密钥长度设置为 DES_KEY_SIZE_192。如果 value 的值不在上述情况中,该函数不做任何操作。
需要注意的是,该函数中的算法标识符和密钥长度的设置是通过修改 SymKeyAttr 结构体中的成员变量实现的。
阅读全文