枚举支持的协议

可以使用 PP_ENUMALGS 或 PP_ENUMALGS_EX调用 CryptGetProvParam 来列出支持的协议和密码套件。 PP_ENUMALGS_EX值的工作方式类似于 PP_ENUMALGS 但返回 一个PROV_ENUMALGS_EX 结构,该结构包含有关提供程序支持的算法的详细信息。

有关定义的协议标志及其值的详细信息,请参阅 协议标志

鉴于 hCryptProv 成员是使用 CryptAcquireContext 获取的开放加密上下文句柄,其 dwProvType 参数设置为 PROV_RSA_SCHANNEL,以下示例列出了 CSP 中可用的所有算法的名称。

PROV_ENUMALGS_EX EnumAlgs;     //   Structure to hold information on 
                               //   a supported algorithm
DWORD dFlag = CRYPT_FIRST;     //   Flag indicating that the first
                               //   supported algorithm is to be
                               //   enumerated. Changed to 0 after the
                               //   first call to the function.
cbData = sizeof(PROV_ENUMALGS_EX);

while( CryptGetProvParam(
    hCryptProv,          // handle to an open cryptographic provider
    PP_ENUMALGS_EX, 
    (BYTE *)&EnumAlgs,  // information on the next algorithm
    &cbData,            // number of bytes in the PROV_ENUMALGS_EX
    dFlag))             // flag to indicate whether this is a first or
                        // subsequent algorithm supported by the
                        // CSP.
{
    printf("Supported Algorithm name %s\n", EnumAlgs.szName);
    dFlag = CRYPT_NEXT;          // Set to CRYPT_NEXT after the first call,
} //  end of while loop. When all of the supported algorithms have
  //  been enumerated, the function returns FALSE.

下表列出了典型的国内PROV_RSA_SCHANNEL CSP 返回的一些算法。 请注意,在此示例中,CSP 不支持 SSL2 SHA MAC 和 SSL2 DES 加密。

算法标识符 最小密钥长度 最大密钥长度 协议 算法名称
CALG_RSA_KEYX 512 2048 0x0007 “RSA_KEYX”
CALG_MD5 128 128 0x0007 “MD5”
CALG_SHA 160 160 0x0005 “SHA”
CALG_RC4 40 128 0x0007 “RC4”
CALG_DES 56 56 0x0005 “DES”

 

为了准备发送 ClientHello 或 ServerHello 消息, Schannel 协议引擎枚举 CSP 支持的算法和密钥大小,并在内部生成受支持的密码套件列表。