确定Schannel连接的属性 - >返回未知值

时间:2015-01-21 11:47:20

标签: windows network-programming schannel

成功Creating a Secure Connection Using Schannel后,我使用QueryContextAttributes()获取其连接属性,并传递SECPKG_ATTR_CONNECTION_INFO

返回的结构SecPkgContext_ConnectionInfo包含字段aiExch,其中包含我要查找的信息 - 即使用的密钥交换算法。

我正在使用它几个月,并且它总是返回两个预定义值CALG_RSA_KEYXCALG_DH_EPHEM.中的一个但是因为几周(当我相信微软发布了Schannel更新补丁时)它返回一个未知值:0x0000ae06

使用这些宏,可以将ALG_ID拆分为其组件:

#define GET_ALG_CLASS(x)                (x & (7 << 13))
#define GET_ALG_TYPE(x)                 (x & (15 << 9))
#define GET_ALG_SID(x)                  (x & (511))

据此,0x0000ae06意味着:

班级:ALG_CLASS_KEY_EXCHANGE
输入:(7 << 9) - &gt;这是未定义的 SID:6 - &gt;其含义取决于算法的类型

有人遇到过同样的问题吗?任何人都可以解释发生了什么,或0x0000ae06代表什么?

1 个答案:

答案 0 :(得分:1)

看看这里找到的代码http://pastebin.com/TKQJ85Z9请注意,ID已添加到schannel库中,但显然VC头文件无论如何都没有更新,正如您从上面的代码中看到的那样(参见pastebin URL),该ID对应于“ECDHE”,即Elliptic Curve DH与短暂密钥交换

[编辑]

真正的问题是该值是非官方的,只能通过某些互联网搜索找到,这就是我将链接发布到一些示例代码的原因;看,我突然想到通过查看这个twit https://twitter.com/ericlaw/status/301083494203928576

来找到答案

无论如何,听起来最新版本的Microsoft CNG SDK包含更新的标头和库,为“ QueryContextAttributes ”API调用添加新常量,即 SECPKG_ATTR_CIPHER_INFO < / strong>此类调用返回一个结构(请参阅下面的代码中的定义),其成员名为“ szCipherSuite ”报告正在使用的密码的完整字符串,例如“ TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384

以下是此类通话的一些示例代码

/*
// -- http://www.microsoft.com/en-us/download/details.aspx?id=1251
typedef struct _SecPkgContext_CipherInfo
{

    DWORD dwVersion;
    DWORD dwProtocol;
    DWORD dwCipherSuite;
    DWORD dwBaseCipherSuite;
    WCHAR szCipherSuite[SZ_ALG_MAX_SIZE];
    WCHAR szCipher[SZ_ALG_MAX_SIZE];
    DWORD dwCipherLen;
    DWORD dwCipherBlockLen;    // in bytes
    WCHAR szHash[SZ_ALG_MAX_SIZE];
    DWORD dwHashLen;
    WCHAR szExchange[SZ_ALG_MAX_SIZE];
    DWORD dwMinExchangeLen;
    DWORD dwMaxExchangeLen;
    WCHAR szCertificate[SZ_ALG_MAX_SIZE];
    DWORD dwKeyType;
} SecPkgContext_CipherInfo, *PSecPkgContext_CipherInfo;
*/    

static void DisplayConnectionInfo(CtxtHandle *phContext)
{
  SECURITY_STATUS Status;
  SecPkgContext_CipherInfo CipherInfo = { SECPKGCONTEXT_CIPHERINFO_V1 };

  Status = QueryContextAttributes( phContext, SECPKG_ATTR_CIPHER_INFO, &CipherInfo);    
  if(Status != SEC_E_OK) 
  { 
    printf("Error 0x%x querying cipher info\n", Status); 
    return; 
  }

  printf("%S\n", CipherInfo.szCipherSuite);
}

如需更多信息,请获取MS CNG SDK并查看附带的帮助和标题。