openssl耗时代码分析

Posted by LuckXiang on March 15, 2018

芯片不支持硬浮点运算且算法没有进行过汇编优化,导致openssl里边的某些运算速度比较慢,本次分析的目的就是找到耗时比较大的代码,然后看看能否汇编优化或者去掉某些无用计算。

EVP_VerifyFinal 耗时1.2s

该函数使用公钥pkey和ctx结构里面的信息验证sigbuf里面的数据的签名。事实上,该函数先调用EVP_MD_CTX_copy_ex函数将原来的ctx拷贝一份,然后调用EVP_DigestFinal_ex函数完成拷贝的ctx的信息摘要计算,最后才使用公钥进行签名的验证工作。
因为该函数实际上处理的是原来ctx函数的一个拷贝,所以原来的ctx结构还可以调用EVP_VerifyUpdate和EVP_VerifyFinal函数进行更多的数据处理和签名验证工作。
在使用完之后,ctx必须使用EVP_MD_CTX_cleanup函数释放内存,否则就会导致内存泄漏。
此外,至于信息摘要算法和签名算法的关联的关系,请参照信息摘要算法部分的说明。
该函数调用成功返回1,失败则返回0或-1。

EC_KEY_set_group EC_KEY_generate_key 耗时900ms

在程序中往往通过函数EC_KEY_set_group(eckey, group)对EC_KEY的grope进行赋值(将grope赋值给eckey):
调用EC_KEY_generate_key来生成私钥和公钥.
密钥可以来自于私钥文件。如果密钥来自于私钥文件,可以首先调用PEM的相关函数,生成EVP_PKEY,然后调用EVP_PKEY_get1_EC_KEY函数从EVP_PKEY中取得EC_KEY。需要注意的是,从EVP_PKEY中取得的EC_KEY可能没有设置椭圆曲线参数EC_GROUP。所以,或者手动设置EC_GROUP,或者创建一个新的EC_KEY,然后调用EC_KEY_set_private_key和EC_KEY_set_public_key函数将私钥和公钥设置进来。

EC_GROUP_get_degree ECDH_compute_key 耗时1s

int EC_GROUP_get_degree(const EC_GROUP *group) 说明:获取椭圆曲线密钥长度。对于素数域Fp来说,是大数p的长度;对二进制域F2m来说,等于m;
密钥生成算法ECDH_Generate_Key,输出一个公钥和私钥对(ECDH_pub_key, ECDH_pri_key),ECDH_pri_key需要秘密地保存,ECDH_pub_key可以公开发送给对方。
密钥协商算法ECDH_compute_key,以对方的公钥和自己的私钥作为输入,计算出一个密钥Key,ECDH_compute_key算法使得通信双方计算出的密钥Key是一致的

优化结果

汇编优化效果不明显,分析代码流程,EVP_VerifyFinal函数运算的结果并没有用,去掉之后 https链接过程从3.1s优化到了1.9s