ssl文档分析
这个问题是关于在openssl中使用hmac例程的。
由于openssl文档在某些方面有点薄弱,分析显示使用:
unsigned char *HMAC(const EVP_MD *evp_md, const void *key,
int key_len, const unsigned char *d, int n,
unsigned char *md, unsigned int *md_len);
从
here
,展示
我的库运行时的40%
致力于创造和毁灭
HMACK-CTX
在幕后。
还有两个额外的函数来创建和销毁
HMACK-CTX
明晰地:
hmac_ctx_init()初始化hmac_ctx
首次使用前。必须叫它。
hmac_ctx_cleanup()清除密钥并
来自HMAC CTX和
释放所有关联的资源。它
必须在hmac_ctx为否时调用
需要更长时间。
这两个函数调用的前缀是:
如果
消息未完全存储
在记忆中
我的数据完全适合内存,所以我选择了hmac函数——上面显示了其签名的函数。
如手册页所述,通过使用以下两个函数来使用上下文:
可以重复调用hmac_update()
有大量的信息
已验证(数据长度字节)。
hmac_final()放置消息
MD中的身份验证代码,必须
为哈希函数留出空间
输出。
适用范围
我的应用程序生成一个可信的(hmac,也使用nonce)cbc-bf加密协议缓冲区字符串。该代码将与各种Web服务器和框架Windows /Linux作为OS、NGINX、Apache和IIS作为Web服务器和Python/.NET和C++Web服务器过滤器进行接口。
上面的描述应该说明库需要是线程安全的,并且
潜在地
具有可恢复的处理状态——即,共享OS线程的轻量级线程(这可能会使线程本地内存不在图片中)。
问题
我该如何摆脱
每次调用40%的开销
以(1)线程安全/(2)可恢复状态的方式?(2)是可选的,因为我一次性拥有所有源数据,并且可以确保在不放弃对线程中间摘要创建的控制的情况下就地创建摘要。所以,
(1)可能可以使用线程本地内存来完成——但是我如何恢复CTX?做
HMACIM-最后()
呼叫使CTX可重复使用?.
(2)可选:在这种情况下,我必须创建一个ctx池。
(3)HMAC功能是如何做到这一点的?它是否在函数调用的范围内创建并销毁ctx?
psuedocode和注释将很有用。