openssl engine引擎 使用流程和函数介绍(5)
-
引擎结构:每个引擎都有一个对应的
ENGINE
结构体,其中定义了引擎的属性、方法、名称等信息。引擎可以实现各种密码算法、加密算法、随机数生成器等功能。 -
引擎的方法:引擎可以提供各种密码学操作的方法,如加密、解密、签名、验证等。通过调用引擎的方法,可以使用定制的算法来执行这些操作。
-
引擎的初始化:在使用引擎之前,需要进行引擎的初始化。这包括加载引擎、注册引擎等步骤。可以使用
ENGINE_load_builtin_engines()
和ENGINE_register_all_complete()
函数进行初始化。 -
引擎的加载和使用:动态引擎可以通过
ENGINE_by_id
函数获取,并通过各种控制函数进行配置和使用。引擎可以在需要时加载和卸载,从而动态地扩展 OpenSSL 功能。 -
引擎控制:引擎可以通过控制函数来接收和处理各种命令,以实现特定的功能。控制函数可以用于配置引擎参数、获取信息等。
-
引擎的设计:您可以设计和实现自己的引擎,以满足特定的加密需求或硬件支持。引擎可以在软件和硬件之间提供抽象层,以便在不同环境下使用相同的 OpenSSL 接口。
-
引擎的安全性:引擎可以用于提供定制的密码学实现,但需要注意安全性问题。错误的引擎实现可能导致安全漏洞,因此引擎的实现需要经过严格的测试和验证。
-
引擎初始化:
在使用引擎方法之前,您需要初始化 OpenSSL 引擎系统。这可以通过调用
ENGINE_load_builtin_engines()
和ENGINE_register_all_complete()
函数来完成。这些函数会初始化 OpenSSL 引擎系统并注册内置的引擎。ENGINE_load_builtin_engines(); ENGINE_register_all_complete();
-
加载自定义引擎:
使用
ENGINE_by_id()
函数加载您自定义的引擎。如果您的引擎需要进行初始化,您可以使用ENGINE_init()
函数进行初始化。ENGINE *my_engine = ENGINE_by_id("my_engine"); if (!my_engine) { // 处理加载失败情况 } if (!ENGINE_init(my_engine)) { // 处理初始化失败情况 }
-
获取方法:
使用
ENGINE_get_RSA()
、ENGINE_get_DH()
、ENGINE_get_ECDH()
、ENGINE_get_ECDSA()
等函数获取相应的方法结构体。const RSA_METHOD *rsa_meth = ENGINE_get_RSA(my_engine); const DH_METHOD *dh_meth = ENGINE_get_DH(my_engine); const ECDH_METHOD *ecdh_meth = ENGINE_get_ECDH(my_engine); const ECDSA_METHOD *ecdsa_meth = ENGINE_get_ECDSA(my_engine);
-
使用方法:
使用获得的方法结构体来调用引擎中的方法。例如,如果您的引擎实现了自定义的 RSA 加密,您可以使用 RSA 方法来执行加密操作。
RSA *rsa = RSA_new_method(my_engine); if (!rsa) { // 处理创建失败情况 } if (!RSA_generate_key_ex(rsa, bits, e, NULL)) { // 处理密钥生成失败情况 }
-
清理引擎资源:
在使用引擎方法后,不要忘记释放相关的资源。使用
ENGINE_finish()
和ENGINE_free()
函数来完成资源清理。ENGINE_finish(my_engine); ENGINE_free(my_engine);
请注意,上述步骤是一个一般性的流程,您需要根据您自己的引擎和使用情况进行适当的调整。同时,确保您的引擎实现了正确的方法并提供了相应的功能。具体的方法结构体和函数调用可能会根据您的引擎的实现而有所不同。最好的方法是查阅 OpenSSL 的文档,并根据您的引擎特点进行调整和实现。
rand
在bind_pp绑定函数中绑定使用方法时候
static int bind_pp(ENGINE *e)
{
if(!ENGINE_set_id(e,eng_id)||
!ENGINE_set_name(e,eng_name)||
!ENGINE_set_RAND(e,&rand_method)||
!ENGINE_set_destroy_function(e,myrand_destroy)||
!ENGINE_set_init_function(e,myrand_init)||
!ENGINE_set_finish_function(e,myrand_finish))
return 0;
//RAND_set_rand_method(&rand_method); //在使用引擎时候使用自己结构体中自定义的方法而非默认方法
printf("ERR_load_rsa success\n");
return 1;
}
int main()
{
```openssl引擎初始化
```加载引擎
···引擎初始化
/*ENGINE_set_default_RAND() 函数用于设置默认的随机数生成方法为指定的引擎的随机数生成方法。这意味着在调用 OpenSSL 的随机数生成函数时,将会使用您指定的引擎中的随机数生成方法。*/
ENGINE_set_default_RAND(e); //与上面RAND_set_rand_method(&rand_method);效果一样
}
函数介绍
当涉及OpenSSL引擎(Engine)的函数时,以下是一些常用函数的详细介绍,包括参数、返回值和功能说明:
-
ENGINE_load_dynamic():
- 参数:
id
- 引擎的ID,dyn_id
- 动态引擎库的路径,init_list_add
- 控制初始化时是否添加到列表中。 - 返回值:成功加载引擎时返回1,失败时返回0。
- 功能:加载一个动态引擎库,
dyn_id
参数指定了库的路径,init_list_add
参数决定是否在初始化时将该引擎添加到列表中,这样后续可以通过ENGINE_by_id()
获取引擎对象。
- 参数:
-
ENGINE_by_id():
- 参数:
id
- 引擎的ID。 - 返回值:成功时返回引擎对象,失败时返回NULL。
- 功能:根据引擎名称获取一个引擎对象,可以进一步用于配置和使用引擎的加速功能。
- 参数:
-
ENGINE_free():
- 参数:
e
- 引擎对象。 - 返回值:无。
- 功能:释放引擎对象的资源,应在使用完引擎后调用以避免内存泄漏。
- 参数:
-
ENGINE_ctrl_cmd_string():
- 参数:
e
- 引擎对象,cmd_string
- 控制命令字符串,prompt
- 是否需要提示用户输入密码。 - 返回值:命令的返回值,可能因命令不同而有所不同。
- 功能:向引擎发送控制命令,可以用于配置或控制引擎的各种行为。例如,可以通过此函数指定密码设备的PIN码。
- 参数:
-
ENGINE_set_default():
- 参数:
e
- 引擎对象,flags
- 标志,用于确定引擎类型。 - 返回值:成功时返回1,失败时返回0。
- 功能:设置默认的引擎,使得加密操作默认使用指定的引擎。
flags
参数可指定引擎的类型,如RSA、DSA等。
- 参数:
-
ENGINE_get_cipher():
- 参数:
nid
- 加密算法的标识符。 - 返回值:指向EVP_CIPHER结构的指针,描述了所请求的加密算法。
- 功能:获取支持的加密算法列表中具有给定标识符的加密算法。
- 参数:
-
ENGINE_get_digest():
- 参数:
nid
- 摘要算法的标识符。 - 返回值:指向EVP_MD结构的指针,描述了所请求的摘要算法。
- 功能:获取支持的摘要算法列表中具有给定标识符的摘要算法。
- 参数:
-
ENGINE_finish():
- 参数:
e
- 引擎对象。 - 返回值:成功时返回1,失败时返回0。
- 功能:完成引擎的使用,释放相关资源,应在不再使用引擎时调用。
- 参数:
-
ENGINE_init():
- 参数:
e
- 引擎对象。 - 返回值:成功时返回1,失败时返回0。
- 功能:初始化引擎,准备它以供后续使用,应在使用引擎前调用。
- 参数:
-
ENGINE_ctrl():
- 参数:
e
- 引擎对象,cmd
- 控制命令标识,i
- 整数参数,p
- 指向数据的指针,f
- 函数指针。 - 返回值:命令的返回值,可能因命令不同而有所不同。
- 功能:控制引擎的操作,比如加载、卸载、初始化、终止等。
- 参数:
-
ENGINE_set_flags():
- 参数:
e
- 引擎对象,flags
- 标志位。 - 返回值:无。
- 功能:设置引擎的标志,影响引擎的行为,例如启用或禁用特定功能。
- 参数:
-
ENGINE_register_ciphers():
- 参数:
e
- 引擎对象。 - 返回值:成功时返回1,失败时返回0。
- 功能:注册自定义的加密算法到引擎中,以便后续可以通过引擎使用这些算法。
- 参数:
-
ENGINE_register_digests():
- 参数:
e
- 引擎对象。 - 返回值:成功时返回1,失败时返回0。
- 功能:注册自定义的摘要算法到引擎中,以便后续可以通过引擎使用这些算法。
- 参数:
-
ENGINE_register_all_complete():
- 参数:无。
- 返回值:成功时返回1,失败时返回0。
- 功能:注册所有支持的加密算法和摘要算法到引擎中,确保可以在引擎中使用所有默认算法。
-
ENGINE_cleanup():
- 参数:无。
- 返回值:无。
- 功能:清理引擎相关资源,应在不再需要引擎时调用。