2015-01-21 9 views
0

После успешного Creating a Secure Connection Using Schannel, я получаю его атрибуты подключения с использованием QueryContextAttributes(), минуя SECPKG_ATTR_CONNECTION_INFO.Определить атрибуты соединения Schannel -> возвращает неизвестное значение

Возвращенная структура SecPkgContext_ConnectionInfo содержит поле aiExch, в котором хранится информация, которую я ищу, а именно используемый алгоритм обмена ключами.

Я использую это в течение нескольких месяцев, и он всегда возвращается один из двух заданных значений CALG_RSA_KEYX или CALG_DH_EPHEM. Но так как через пару недель (когда я считаю, что патч обновления Schannel был выдан Microsoft) возвращает неизвестное значение: 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 Обратите внимание, что идентификатор был добавлен в библиотеку schannel, но, видимо, заголовки VC не обновлялись, как вы можете видеть из приведенного выше кода (см. URL-адрес pastebin), что идентификатор соответствует «ECDHE», то есть эллиптической кривой DH с эфемерным обменом ключами

[править]

реальная проблема заключается в том, что значение является неофициальным и может быть найдено только некоторыми интернеты-поиском, это почему я разместил ссылку на некоторый пример кода; Понимаете, это просто случилось со мной, чтобы найти ответ, глядя на этот упрек https://twitter.com/ericlaw/status/301083494203928576

Во всяком случае, это звучит как самая последняя версия Microsoft 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); 
} 

для дальнейшей Infos, пожалуйста, получить MS CNG SDK и посмотреть на помощь и включены заголовки.