2015-01-21 78 views
0

成功Creating a Secure Connection Using Schannel後,我使用QueryContextAttributes()獲取其連接屬性,傳遞SECPKG_ATTR_CONNECTION_INFO確定Schannel連接的屬性 - >返回未知值

返回的結構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) - >這是不確定的
SID:6 - >其含義取決於

任何人都遇到同樣問題的算法類型?任何人都可以解釋發生了什麼,或者什麼0x0000ae06代表?

回答

1

查看這裏找到的代碼http://pastebin.com/TKQJ85Z9請注意,該ID已添加到schannel庫中,但顯然VC頭沒有更新,無論如何,您可以從上面的代碼中看到(請參見pastebin URL ),該ID對應於「ECDHE」,也就是橢圓曲線DH與臨時密鑰交換

[編輯]

真正的問題是,價值是非官方的,只能通過一些互聯網搜索發現,這是爲什麼我發佈了一些示例代碼的鏈接;看,它只是發生在我通過看這個蠢https://twitter.com/ericlaw/status/301083494203928576

無論如何要找到答案,這聽起來像微軟CNG SDK的最新版本包含更新的頭文件和庫添加了一個新的常數「QueryContextAttributes「API調用,即SECPKG_ATTR_CIPHER_INFO這樣的調用返回的結構(見下面的代碼定義)命名,其成員」 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,並看一下附帶的幫助和頭。