小编bri*_*ery的帖子

在Win32中验证SSL证书的正确方法是什么?

我想使用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,
                                   &params,
                                   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)

c++ windows ssl winapi ssl-certificate

20
推荐指数
2
解决办法
6611
查看次数

为什么这个汇编代码更快?

我正在尝试一个词法分析器,我发现在程序的一个部分中从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)

c++ performance x86 lexer micro-optimization

13
推荐指数
1
解决办法
1253
查看次数