如何基于标志动态使用FIPS和非FIPS openssl库?

时间:2016-09-21 10:23:47

标签: openssl shared-libraries fips

我正在使用FIPS和OpenSSL库。当我不想要FIPS时,由于FIPS自检,系统性能会下降。由于性能问题,我希望有以下解决方案: -

  1. LibA - > OpenSSL + FIPS
  2. LibB - >仅限OpenSLL
  3. 当我启用FIPS时,它会触及/ tmp目录中的文件&重新启动系统。 现在,基于文件的存在,我想要加载LibA或LibB。 在这里,LibA和& LibB是使用FIPS或不使用FIPS的openssl库。

    有可能吗?如果是,怎么样? 还有其他更好的解决方案吗?

    注意: - 平台是LINUX。

1 个答案:

答案 0 :(得分:1)

  

我希望有以下解决方案:

     
      
  • LibA - > OpenSSL + FIPS
  •   
  • LibB - >仅限OpenSLL
  •   

要启用或禁用FIPS,请致电FIPS_mode_set。如果库具有FIPS功能,则FIPS_mode_set(1)应启用该模式,而FIPS_mode_set(0)禁用FIPS算法。

我认为在你想要的用法中,当加载libA时,它会检查临时文件,如果文件存在则只调用FIPS_mode_set(1)

如果您编译并链接FIPS功能和FIPS功能不强,那么您应该使用OPENSSL_FIPS保护代码。

所以可能是这样的:

#ifdef OPENSSL_FIPS

int mode, ret = 0; unsigned long err = 0;
mode = FIPS_mode();

if (temp_file_exsts && mode == 0)
{      
    ret = FIPS_mode_set(1 /*on*/);
    err = ERR_get_error();
}
else if (temp_file_exsts && mode != 0))
{
    ret = FIPS_mode_set(0 /*off*/);
    err = ERR_get_error();
}
else
{
    printf("Who knows...");  
}

if(ret != 1)
{
    printf("FIPS_mode_set failed: %lx.", err);    
}
#endif
  

如何动态使用FIPS和非FIPS

您使用dlopen和朋友。您必须执行一些技巧以确保libA始终在libB之前加载/运行时链接。研究它并在遇到问题时提出新问题。

  

它触及/ tmp目录中的文件&重新启动系统

研究如何编写临时文件以及如何以编程方式重新启动系统。如果你遇到麻烦,可以提出一个新问题。