我想使用C++在Win32中验证SSL证书.我想我想使用Cert*API,以便我可以获得Windows证书存储的好处.这就是我想出来的.
bool IsValidSSLCertificate( PCCERT_CONTEXT certificate, LPWSTR serverName )
{
LPTSTR usages[] = { szOID_PKIX_KP_SERVER_AUTH };
CERT_CHAIN_PARA params = { sizeof( params ) };
params.RequestedUsage.dwType = USAGE_MATCH_TYPE_AND;
params.RequestedUsage.Usage.cUsageIdentifier = _countof( usages );
params.RequestedUsage.Usage.rgpszUsageIdentifier = usages;
PCCERT_CHAIN_CONTEXT chainContext = 0;
if ( !CertGetCertificateChain( NULL,
certificate,
NULL,
NULL,
¶ms,
CERT_CHAIN_REVOCATION_CHECK_CHAIN,
NULL,
&chainContext ) )
{
return false;
}
SSL_EXTRA_CERT_CHAIN_POLICY_PARA sslPolicy = { sizeof( sslPolicy ) };
sslPolicy.dwAuthType = AUTHTYPE_SERVER;
sslPolicy.pwszServerName = serverName;
CERT_CHAIN_POLICY_PARA policy = { sizeof( policy ) }; …Run Code Online (Sandbox Code Playgroud) 我正在尝试一个词法分析器,我发现在程序的一个部分中从while循环切换到if语句和do-while循环导致代码变得快20%,这看起来很疯狂.我将编译器生成的代码的差异隔离到这些汇编代码段.有谁知道为什么快速代码更快?
在程序集中,'edi'是当前文本位置,'ebx'是文本的结尾,'isAlpha'是一个查找表,如果字符是字母,则为1,否则为0.
慢代码:
slow_loop:
00401897 cmp edi,ebx
00401899 je slow_done (4018AAh)
0040189B movzx eax,byte ptr [edi]
0040189E cmp byte ptr isAlpha (4533E0h)[eax],0
004018A5 je slow_done (4018AAh)
004018A7 inc edi
004018A8 jmp slow_loop (401897h)
slow_done:
Run Code Online (Sandbox Code Playgroud)
快速代码:
fast_loop:
0040193D inc edi
0040193E cmp edi,ebx
00401940 je fast_done (40194Eh)
00401942 movzx eax,byte ptr [edi]
00401945 cmp byte ptr isAlpha (4533E0h)[eax],0
0040194C jne fast_loop (40193Dh)
fast_done:
Run Code Online (Sandbox Code Playgroud)
如果我只针对仅包含字母"a"的兆字节文本运行这些汇编代码段,则快速代码的速度提高30%.我的猜测是慢速代码由于分支错误预测而变慢,但我认为在循环中这是一次性成本.
这是我用来测试两个片段的程序:
#include <Windows.h>
#include <string>
#include <iostream>
int main( int argc, char* argv[] )
{
static char …Run Code Online (Sandbox Code Playgroud)