成功Creating a Secure Connection Using Schannel后,我使用QueryContextAttributes()获取其连接属性,并传递SECPKG_ATTR_CONNECTION_INFO
。
返回的结构SecPkgContext_ConnectionInfo
包含字段aiExch
,其中包含我要查找的信息 - 即使用的密钥交换算法。
我正在使用它几个月,并且它总是返回两个预定义值CALG_RSA_KEYX
或CALG_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
代表什么?
答案 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并查看附带的帮助和标题。