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

如何基于标志动态使用FIPS和非FIPS openssl库?,openssl,shared-libraries,fips,Openssl,Shared Libraries,Fips,我正在使用FIPS和OpenSSL库。当我不需要FIPS时,由于FIPS自检,系统性能会下降。由于性能问题,我希望有以下解决方案:- LibA->OpenSSL+FIPS 仅限LibB->OpenSLL 当我启用FIPS时,它会触及/tmp目录中的一个文件并重新启动系统。 现在,基于文件的存在,我想加载LibA或LibB。 在这里,LibA和LibB都是带有fip或不带fip的openssl库 有可能做到吗?如果是,如何进行? 还有其他更好的解决办法吗 注意:-平台是LINUX 我希望有以下解决

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

  • LibA->OpenSSL+FIPS
  • 仅限LibB->OpenSLL
  • 当我启用FIPS时,它会触及/tmp目录中的一个文件并重新启动系统。 现在,基于文件的存在,我想加载LibA或LibB。 在这里,LibA和LibB都是带有fip或不带fip的openssl库

    有可能做到吗?如果是,如何进行? 还有其他更好的解决办法吗

    注意:-平台是LINUX

    我希望有以下解决方案:

    • LibA->OpenSSL+FIPS
    • 仅限LibB->OpenSLL
    要启用或禁用FIPS,请调用<如果库支持FIPS,则代码>FIPS\模式\设置(1)应启用该模式,而
    FIPS\模式\设置(0)
    禁用FIPS算法

    我认为在您想要的用法中,当加载
    libA
    时,它会检查temp文件,并且仅在文件存在时调用
    FIPS\u mode\u set(1)

    如果编译并链接FIPS-capable和FIPS-non-capable,那么应该使用
    OPENSSL\u-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
    

    如何动态使用FIP和非FIP

    您可以使用
    dlopen
    和朋友。您必须执行一些技巧,以确保
    libA
    总是在
    libB
    之前加载/运行时链接。如果你有困难,研究一下并问一个新问题


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


    研究如何编写临时文件以及如何以编程方式重新启动系统。如果你有困难,可以问一个新问题。

    我能够完成第一部分和最后一部分。我在使用基于FIPS标志的FIPS和非FIPS库时被阻止。让我试试你的建议。谢谢