首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用加密引擎和硬件加速器进行的openssl速度测试会导致虚假的计时结果。

使用加密引擎和硬件加速器进行的openssl速度测试会导致虚假的计时结果。
EN

Stack Overflow用户
提问于 2016-02-11 21:13:16
回答 1查看 2.7K关注 0票数 4

我正在尝试为我的硬件获得密码性能测试,同时使用openssl速度测试命令。

我执行的第一个测试没有启用硬件加速器:

代码语言:javascript
复制
$ openssl speed -evp aes-128-cbc -engine cryptodev
Doing aes-128-cbc for 3s on 16 size blocks: 4437806 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 64 size blocks: 1244528 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 256 size blocks: 322780 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 1024 size blocks: 81429 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 8192 size blocks: 10215 aes-128-cbc's in 3.00s

OpenSSL 1.0.1j 15 Oct 2014
built on: Thu Jul 23 18:58:46 CDT 2015
options:bn(64,32) rc4(ptr,char) des(idx,cisc,16,long) aes(partial) idea(int) blowfish(ptr)
compiler: arm-poky-linux-gnueabi-gcc  -march=armv7-a -mthumb-interwork -mfloat-abi=hard
-mfpu=neon -mtune=cortex-a9 --sysroot=... -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS
-D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN   -DTERMIO  -O2 -pipe -g 
-feliminate-unused-debug-types -Wall -Wa,--noexecstack -DHAVE_CRYPTODEV -DUSE_CRYPTODEV_DIGESTS
-DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM
-DAES_ASM -DGHASH_ASM

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-cbc      23668.30k    26549.93k    27543.89k    27794.43k    27893.76k

然后启用硬件加速器并获得以下结果:

代码语言:javascript
复制
$ openssl speed -evp aes-128-cbc -engine cryptodev
engine "cryptodev" set.
Doing aes-128-cbc for 3s on 16 size blocks: 39552 aes-128-cbc's in ***0.08s***
Doing aes-128-cbc for 3s on 64 size blocks: 37060 aes-128-cbc's in ***0.05s***
Doing aes-128-cbc for 3s on 256 size blocks: 32674 aes-128-cbc's in ***0.07s***
Doing aes-128-cbc for 3s on 1024 size blocks: 26101 aes-128-cbc's in ***0.06s***
Doing aes-128-cbc for 3s on 8192 size blocks: 8286 aes-128-cbc's in ***0.02s***

OpenSSL 1.0.1j 15 Oct 2014
built on: Thu Jul 23 18:58:46 CDT 2015
options:bn(64,32) rc4(ptr,char) des(idx,cisc,16,long) aes(partial) idea(int) blowfish(ptr)
compiler: arm-poky-linux-gnueabi-gcc  -march=armv7-a -mthumb-interwork -mfloat-abi=hard
-mfpu=neon -mtune=cortex-a9 --sysroot=.... -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS
-D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN   -DTERMIO  -O2 -pipe -g 
-feliminate-unused-debug-types -Wall -Wa,--noexecstack -DHAVE_CRYPTODEV -DUSE_CRYPTODEV_DIGESTS
-DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM
-DAES_ASM -DGHASH_ASM

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes

我的问题是,为什么测试要运行10s毫秒,而测试应该针对每个块大小运行3秒。这是OpenSSL中的一个bug吗?

我查看了OpenSSL版本1.0.1j中的代码,下面是我所发现的:

代码语言:javascript
复制
#ifndef OPENSSL_NO_AES
        if (doit[D_CBC_128_AES])
                {
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_CBC_128_AES],c[D_CBC_128_AES][j],lengths[j]);
                        Time_F(START);
                        for (count=0,run=1; COND(c[D_CBC_128_AES][j]); count++)
                                AES_cbc_encrypt(buf,buf,
                                        (unsigned long)lengths[j],&aes_ks1,
                                        iv,AES_ENCRYPT);
                        d=Time_F(STOP);
                        print_result(D_CBC_128_AES,j,count,d);
                        }
                }

在这里,Time_F的定义如下:

代码语言:javascript
复制
static double Time_F(int s)
        {
        return app_tminterval(s,usertime);
        }
#endif

app_tminterval被定义为:

代码语言:javascript
复制
#else
#include <sys/time.h>
#include <sys/resource.h>

double app_tminterval(int stop,int usertime)
        {
        double          ret = 0;
        struct rusage   rus;
        struct timeval  now;
        static struct timeval tmstart;

        if (usertime)           getrusage(RUSAGE_SELF,&rus), now = rus.ru_utime;
        else                    gettimeofday(&now,NULL);

        if (stop==TM_START)     tmstart = now;
        else                    ret = ( (now.tv_sec+now.tv_usec*1e-6)
                                        - (tmstart.tv_sec+tmstart.tv_usec*1e-6) );

        return ret;
        }
#endif

在这里,我感到困惑的是,当没有硬件加速器的实际测试运行3s时,应用程序间隔停止不到10 3s的时间是如何处理的。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-08 10:04:26

使用-elapsed来度量总时间。

Openssl测量cpu时间,当您将算法卸载到硬件加速器时,它会释放cpu使用量。因此,openssl不会计算大部分时间,因为它是在cpu之外使用的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35350124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档