枚举支持的协议
可以使用 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 支持的算法和密钥大小,并在内部生成受支持的密码套件列表。