44#define RSAENH_MAGIC_KEY 0x73620457u
45#define RSAENH_MAX_KEY_SIZE 64
46#define RSAENH_MAX_BLOCK_SIZE 24
47#define RSAENH_KEYSTATE_IDLE 0
48#define RSAENH_KEYSTATE_ENCRYPTING 1
49#define RSAENH_KEYSTATE_MASTERKEY 2
54#define RSAENH_MAGIC_HASH 0x85938417u
55#define RSAENH_HASHSTATE_HASHING 1
56#define RSAENH_HASHSTATE_FINISHED 2
116#define RSAENH_PERSONALITY_BASE 0u
117#define RSAENH_PERSONALITY_STRONG 1u
118#define RSAENH_PERSONALITY_ENHANCED 2u
119#define RSAENH_PERSONALITY_SCHANNEL 3u
120#define RSAENH_PERSONALITY_AES 4u
122#define RSAENH_MAGIC_CONTAINER 0x26384993u
139#define RSAENH_HMAC_DEF_IPAD_CHAR 0x36
140#define RSAENH_HMAC_DEF_OPAD_CHAR 0x5c
141#define RSAENH_HMAC_DEF_PAD_LEN 64
142#define RSAENH_HMAC_BLOCK_LEN 64
143#define RSAENH_DES_EFFECTIVE_KEYLEN 56
144#define RSAENH_DES_STORAGE_KEYLEN 64
145#define RSAENH_3DES112_EFFECTIVE_KEYLEN 112
146#define RSAENH_3DES112_STORAGE_KEYLEN 128
147#define RSAENH_3DES_EFFECTIVE_KEYLEN 168
148#define RSAENH_3DES_STORAGE_KEYLEN 192
149#define RSAENH_MAGIC_RSA2 0x32415352
150#define RSAENH_MAGIC_RSA1 0x31415352
151#define RSAENH_PKC_BLOCKTYPE 0x02
152#define RSAENH_SSL3_VERSION_MAJOR 3
153#define RSAENH_SSL3_VERSION_MINOR 0
154#define RSAENH_TLS1_VERSION_MAJOR 3
155#define RSAENH_TLS1_VERSION_MINOR 1
156#define RSAENH_REGKEY "Software\\Wine\\Crypto\\RSA\\%s"
158#define RSAENH_MIN(a,b) ((a)<(b)?(a):(b))
162#define RSAENH_MAX_ENUMALGS 24
163#define RSAENH_PCT1_SSL2_SSL3_TLS1 (CRYPT_FLAG_PCT1|CRYPT_FLAG_SSL2|CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1)
164#define S(s) sizeof(s), s
168 {
CALG_RC2, 40, 40, 56, 0,
S(
"RC2"),
S(
"RSA Data Security's RC2")},
169 {
CALG_RC4, 40, 40, 56, 0,
S(
"RC4"),
S(
"RSA Data Security's RC4")},
170 {
CALG_DES, 56, 56, 56, 0,
S(
"DES"),
S(
"Data Encryption Standard (DES)")},
176 {
CALG_MAC, 0, 0, 0, 0,
S(
"MAC"),
S(
"Message Authentication Code")},
179 {
CALG_HMAC, 0, 0, 0, 0,
S(
"HMAC"),
S(
"Hugo's MAC (HMAC)")},
180 {0, 0, 0, 0, 0,
S(
""),
S(
"")}
183 {
CALG_RC2, 128, 40, 128, 0,
S(
"RC2"),
S(
"RSA Data Security's RC2")},
184 {
CALG_RC4, 128, 40, 128, 0,
S(
"RC4"),
S(
"RSA Data Security's RC4")},
185 {
CALG_DES, 56, 56, 56, 0,
S(
"DES"),
S(
"Data Encryption Standard (DES)")},
186 {
CALG_3DES_112, 112, 112, 112, 0,
S(
"3DES TWO KEY"),
S(
"Two Key Triple DES")},
187 {
CALG_3DES, 168, 168, 168, 0,
S(
"3DES"),
S(
"Three Key Triple DES")},
193 {
CALG_MAC, 0, 0, 0, 0,
S(
"MAC"),
S(
"Message Authentication Code")},
196 {
CALG_HMAC, 0, 0, 0, 0,
S(
"HMAC"),
S(
"Hugo's MAC (HMAC)")},
197 {0, 0, 0, 0, 0,
S(
""),
S(
"")}
200 {
CALG_RC2, 128, 40, 128, 0,
S(
"RC2"),
S(
"RSA Data Security's RC2")},
201 {
CALG_RC4, 128, 40, 128, 0,
S(
"RC4"),
S(
"RSA Data Security's RC4")},
202 {
CALG_DES, 56, 56, 56, 0,
S(
"DES"),
S(
"Data Encryption Standard (DES)")},
203 {
CALG_3DES_112, 112, 112, 112, 0,
S(
"3DES TWO KEY"),
S(
"Two Key Triple DES")},
204 {
CALG_3DES, 168, 168, 168, 0,
S(
"3DES"),
S(
"Three Key Triple DES")},
210 {
CALG_MAC, 0, 0, 0, 0,
S(
"MAC"),
S(
"Message Authentication Code")},
213 {
CALG_HMAC, 0, 0, 0, 0,
S(
"HMAC"),
S(
"Hugo's MAC (HMAC)")},
214 {0, 0, 0, 0, 0,
S(
""),
S(
"")}
225 {
CALG_MAC, 0, 0, 0, 0,
S(
"MAC"),
S(
"Message Authentication Code")},
228 {
CALG_HMAC, 0, 0, 0, 0,
S(
"HMAC"),
S(
"Hugo's MAC (HMAC)")},
236 {
CALG_TLS1PRF, 0, 0, -1, 0,
S(
"TLS1 PRF"),
S(
"TLS1 Pseudo Random Function")},
237 {0, 0, 0, 0, 0,
S(
""),
S(
"")}
240 {
CALG_RC2, 128, 40, 128, 0,
S(
"RC2"),
S(
"RSA Data Security's RC2")},
241 {
CALG_RC4, 128, 40, 128, 0,
S(
"RC4"),
S(
"RSA Data Security's RC4")},
242 {
CALG_DES, 56, 56, 56, 0,
S(
"DES"),
S(
"Data Encryption Standard (DES)")},
243 {
CALG_3DES_112, 112, 112, 112, 0,
S(
"3DES TWO KEY"),
S(
"Two Key Triple DES")},
244 {
CALG_3DES, 168, 168, 168, 0,
S(
"3DES"),
S(
"Three Key Triple DES")},
245 {
CALG_AES_128, 128, 128, 128, 0,
S(
"AES-128"),
S(
"Advanced Encryption Standard (AES-128)")},
246 {
CALG_AES_192, 192, 192, 192, 0,
S(
"AES-192"),
S(
"Advanced Encryption Standard (AES-192)")},
247 {
CALG_AES_256, 256, 256, 256, 0,
S(
"AES-256"),
S(
"Advanced Encryption Standard (AES-256)")},
256 {
CALG_MAC, 0, 0, 0, 0,
S(
"MAC"),
S(
"Message Authentication Code")},
259 {
CALG_HMAC, 0, 0, 0, 0,
S(
"HMAC"),
S(
"Hugo's MAC (HMAC)")},
260 {0, 0, 0, 0, 0,
S(
""),
S(
"")}
391 if (dwParamSize > *pdwBufferSize)
394 *pdwBufferSize = dwParamSize;
397 memcpy(pbBuffer, pbParam, dwParamSize);
399 *pdwBufferSize = dwParamSize;
413 return pKeyContainer;
466 dst->cbData =
src->cbData;
529 unsigned int encrypted_len,
i,
j,
k;
531 if (!
final && (*data_len %
key->dwBlockLen))
537 encrypted_len = (*data_len /
key->dwBlockLen + (
final ? 1 : 0)) *
key->dwBlockLen;
541 *data_len = encrypted_len;
544 if (encrypted_len > buf_len)
546 *data_len = encrypted_len;
552 for (
i = *data_len;
i < encrypted_len;
i++)
data[
i] = encrypted_len - *data_len;
553 *data_len = encrypted_len;
555 for (
i = 0,
in =
data;
i < *data_len;
i +=
key->dwBlockLen,
in +=
key->dwBlockLen)
557 switch (
key->dwMode) {
562 for (
j = 0;
j <
key->dwBlockLen;
j++)
563 in[
j] ^= chain_vector[
j];
568 for (
j = 0;
j <
key->dwBlockLen;
j++)
572 for (
k = 0;
k <
key->dwBlockLen - 1;
k++)
573 chain_vector[
k] = chain_vector[
k+1];
574 chain_vector[
k] =
out[
j];
598 if (!hmac_info)
return;
625 (*dst)->pbInnerString =
NULL;
626 (*dst)->pbOuterString =
NULL;
627 if ((*dst)->cbInnerString == 0) (*dst)->cbInnerString = block_len;
628 (*dst)->pbInnerString =
malloc((*dst)->cbInnerString);
629 if (!(*dst)->pbInnerString) {
633 if (
src->cbInnerString)
634 memcpy((*dst)->pbInnerString,
src->pbInnerString,
src->cbInnerString);
637 if ((*dst)->cbOuterString == 0) (*dst)->cbOuterString = block_len;
638 (*dst)->pbOuterString =
malloc((*dst)->cbOuterString);
639 if (!(*dst)->pbOuterString) {
643 if (
src->cbOuterString)
644 memcpy((*dst)->pbOuterString,
src->pbOuterString,
src->cbOuterString);
688 if (!pCryptHash->
hash.desc)
701 dwLen =
sizeof(
DWORD);
738 FIXME(
"Key lookup failed.\n");
755 FIXME(
"block_encrypt failed.\n");
774 FIXME(
"block_encrypt failed.\n");
825 FIXME(
"Key lookup failed.\n");
831 FIXME(
"block_encrypt failed.\n");
897 key->dwKeyLen = key_len >> 3;
898 key->dwEffectiveKeyLen = 0;
909 key->dwSaltLen = 16 -
key->dwKeyLen;
913 memset(
key->abInitVector, 0,
sizeof(
key->abInitVector));
914 memset(&
key->siSChannelInfo.saEncAlg, 0,
sizeof(
key->siSChannelInfo.saEncAlg));
915 memset(&
key->siSChannelInfo.saMACAlg, 0,
sizeof(
key->siSChannelInfo.saMACAlg));
942 key->dwBlockLen = 16;
948 key->dwBlockLen = key_len >> 3;
998 if (dwKeyLen == 0) dwKeyLen = peaAlgidInfo->
dwDefaultLen;
1043 dwKeyLen > peaAlgidInfo->
dwMaxLen ||
1044 dwKeyLen < peaAlgidInfo->dwMinLen)
1046 TRACE(
"key len %ld out of bounds (%ld, %ld)\n", dwKeyLen,
1075 szValueName =
"KeyExchangeKeyPair";
1078 szValueName =
"SignatureKeyPair";
1081 WARN(
"invalid key spec %ld\n", dwKeySpec);
1156 szValueName =
"KeyExchangePermissions";
1159 szValueName =
"SignaturePermissions";
1162 WARN(
"invalid key spec %ld\n", dwKeySpec);
1189 sizeof(
pKey->dwPermissions));
1371 free( pKeyContainer );
1428 return hKeyContainer;
1446 DWORD dwValueType, dwLen;
1485 dwLen =
sizeof(
pKey->dwPermissions);
1487 (
BYTE *)&
pKey->dwPermissions, &dwLen);
1538 dwProtectFlags, &hCryptKey))
1541 dwProtectFlags, &hCryptKey))
1545 return hKeyContainer;
1570 static const struct tagOIDDescriptor {
1573 const BYTE abOID[19];
1574 } aOIDDescriptor[] = {
1575 {
CALG_MD2, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48,
1576 0x86, 0xf7, 0x0d, 0x02, 0x02, 0x05, 0x00, 0x04, 0x10 } },
1577 {
CALG_MD4, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48,
1578 0x86, 0xf7, 0x0d, 0x02, 0x04, 0x05, 0x00, 0x04, 0x10 } },
1579 {
CALG_MD5, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48,
1580 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 } },
1581 {
CALG_SHA, 15, { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03,
1582 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 } },
1583 {
CALG_SHA_256, 19, { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
1584 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
1585 0x05, 0x00, 0x04, 0x20 } },
1586 {
CALG_SHA_384, 19, { 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
1587 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02,
1588 0x05, 0x00, 0x04, 0x30 } },
1589 {
CALG_SHA_512, 19, { 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
1590 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03,
1591 0x05, 0x00, 0x04, 0x40 } },
1597 for (dwIdxOID = 0; aOIDDescriptor[dwIdxOID].aiAlgid; dwIdxOID++) {
1598 if (aOIDDescriptor[dwIdxOID].aiAlgid == aiAlgid)
break;
1601 if (!aOIDDescriptor[dwIdxOID].aiAlgid) {
1608 pbSignature[0] = 0x6b;
1609 for (
i=1;
i < dwLen - dwHashLen - 3;
i++) {
1610 pbSignature[
i] = 0xbb;
1612 pbSignature[
i++] = 0xba;
1613 for (
j=0;
j < dwHashLen;
j++,
i++) {
1614 pbSignature[
i] = abHashValue[
j];
1616 pbSignature[
i++] = 0x33;
1617 pbSignature[
i++] = 0xcc;
1619 pbSignature[0] = 0x00;
1620 pbSignature[1] = 0x01;
1622 for (
i=2;
i < dwLen - 1 - dwHashLen;
i++) {
1623 pbSignature[
i] = 0xff;
1625 pbSignature[
i++] = 0x00;
1627 for (
i=2;
i < dwLen - 1 - aOIDDescriptor[dwIdxOID].dwLen - dwHashLen;
i++) {
1628 pbSignature[
i] = 0xff;
1630 pbSignature[
i++] = 0x00;
1631 for (
j=0;
j < aOIDDescriptor[dwIdxOID].dwLen;
j++) {
1632 pbSignature[
i++] = aOIDDescriptor[dwIdxOID].abOID[
j];
1635 for (
j=0;
j < dwHashLen;
j++) {
1636 pbSignature[
i++] = abHashValue[
j];
1688 if (
i >= dwBufferLen)
break;
1698 }
while (
i < dwBufferLen);
1727 DWORD dwHalfSecretLen;
1731 TRACE(
"(hProv=%08Ix, hSecret=%08Ix, pblobLabel=%p, pblobSeed=%p, pbBuffer=%p, dwBufferLen=%ld)\n",
1732 hProv, hSecret, pblobLabel, pblobSeed, pbBuffer, dwBufferLen);
1739 dwHalfSecretLen = (pSecret->
dwKeyLen+1)/2;
1745 memset(pbBuffer, 0, dwBufferLen);
1757 if (!
tls1_p(hHMAC, &blobLabelSeed, pbBuffer, dwBufferLen))
goto exit;
1763 if (!
tls1_p(hHMAC, &blobLabelSeed, pbBuffer, dwBufferLen))
goto exit;
1794 if (dwDataLen > dwBufferLen-11) {
1799 memmove(abBuffer + dwBufferLen - dwDataLen, abData, dwDataLen);
1803 for (
i=2;
i < dwBufferLen - dwDataLen - 1;
i++)
1806 for (
i-=8;
i < dwBufferLen - dwDataLen - 1;
i++)
1832 BYTE *pbHashInput, *pbCounter;
1834 DWORD dwLen, dwHashLen;
1838 dwLen =
sizeof(dwHashLen);
1851 pbHashInput =
malloc(dwSeedLength +
sizeof(
DWORD));
1861 pbCounter = pbHashInput + dwSeedLength;
1902 DWORD dwLen, dwHashLen;
1903 DWORD dwDbLen, dwSeedLen;
1910 dwLen =
sizeof(dwHashLen);
1913 if (dwDataLen > dwBufferLen - 2 * dwHashLen - 2)
1919 if (dwBufferLen < 2 * dwHashLen + 2)
1925 pbPadded =
malloc(dwBufferLen);
1935 dwSeedLen = dwHashLen;
1936 pbDb = pbPadded + 1 + dwHashLen;
1937 dwDbLen = dwBufferLen - dwSeedLen - 1;
1944 memset(pbDb + dwHashLen, 0, dwDbLen - dwHashLen - 1 - dwDataLen);
1946 pbDb[dwDbLen - dwDataLen - 1] = 1;
1948 memcpy(pbDb + dwDbLen - dwDataLen, abData, dwDataLen);
1955 for (
i = 0;
i < dwDbLen;
i++) pbDb[
i] ^= blobDbMask.
pbData[
i];
1960 for (
i = 0;
i < dwHashLen;
i++)
pbSeed[
i] ^= blobSeedMask.pbData[
i];
1962 memcpy(abBuffer, pbPadded, dwBufferLen);
2023 for (
i=2;
i<dwDataLen;
i++)
2027 if ((
i == dwDataLen) || (*dwBufferLen < dwDataLen -
i - 1) ||
2034 *dwBufferLen = dwDataLen -
i - 1;
2035 memmove(abBuffer, abData +
i + 1, *dwBufferLen);
2062 const BYTE *pbPaddedSeed, *pbPaddedDb;
2063 BYTE *pbUnpaddedSeed, *pbUnpaddedDb;
2064 DWORD dwLen, dwHashLen;
2065 DWORD dwSeedLen, dwDbLen;
2066 DWORD dwZeroCount, dwMsgCount;
2072 dwLen =
sizeof(dwHashLen);
2074 if (dwDataLen < 2 * dwHashLen + 2)
2081 pbHashValue =
malloc(dwHashLen);
2091 pbBuffer =
malloc(dwDataLen - 1);
2098 pbPaddedSeed = abData + 1;
2099 pbPaddedDb = abData + 1 + dwHashLen;
2100 pbUnpaddedSeed = pbBuffer;
2101 pbUnpaddedDb = pbBuffer + dwHashLen;
2102 dwSeedLen = dwHashLen;
2103 dwDbLen = dwDataLen - dwHashLen - 1;
2108 for (
i = 0;
i < dwSeedLen;
i++) pbUnpaddedSeed[
i] = pbPaddedSeed[
i] ^ blobSeedMask.pbData[
i];
2113 for (
i = 0;
i < dwDbLen;
i++) pbUnpaddedDb[
i] = pbPaddedDb[
i] ^ blobDbMask.
pbData[
i];
2120 while (dwHashLen + dwZeroCount + 1 <= dwDbLen && pbUnpaddedDb[dwHashLen + dwZeroCount] == 0) dwZeroCount++;
2121 dwMsgCount = dwDbLen - dwHashLen - dwZeroCount - 1;
2123 if (dwHashLen + dwZeroCount + 1 > dwDbLen || abData[0] ||
result || pbUnpaddedDb[dwHashLen + dwZeroCount] != 1
2124 || *dwBufferLen < dwMsgCount)
2130 *dwBufferLen = dwMsgCount;
2131 memcpy(abBuffer, pbUnpaddedDb + dwHashLen + dwZeroCount + 1, dwMsgCount);
2198 TRACE(
"(phProv=%p, pszContainer=%s, dwFlags=%08lx, pVTable=%p)\n", phProv,
2201 if (pszContainer && *pszContainer)
2207 DWORD dwLen =
sizeof(szKeyContainerName);
2225 TRACE(
"Can't create new keyset, already exists\n");
2234 if (pszContainer && *pszContainer) {
2235 TRACE(
"pszContainer should be empty\n");
2283 TRACE(
"(hProv=%08Ix, Algid=%08x, hKey=%08Ix, dwFlags=%08lx, phHash=%p)\n",
hProv, Algid,
hKey,
2287 if (!peaAlgidInfo)
return FALSE;
2315 ((!pCryptKey->siSChannelInfo.blobClientRandom.cbData) ||
2316 (!pCryptKey->siSChannelInfo.blobServerRandom.cbData)))
2330 if (!pCryptHash)
return FALSE;
2351 static const char keyex[] =
"key expansion";
2352 BYTE key_expansion[
sizeof keyex];
2355 memcpy( key_expansion, keyex,
sizeof keyex );
2358 static const char msec[] =
"master secret";
2359 BYTE master_secret[
sizeof msec];
2361 BYTE abKeyValue[48];
2363 memcpy( master_secret, msec,
sizeof msec );
2409 TRACE(
"(hProv=%08Ix, hHash=%08Ix)\n",
hProv, hHash);
2480 TRACE(
"(hUID=%08Ix, hHash=%08Ix, pdwReserved=%p, dwFlags=%08lx, phHash=%p)\n", hUID, hHash,
2481 pdwReserved,
dwFlags, phHash);
2495 if (!phHash || pdwReserved ||
dwFlags)
2505 *pDestHash = *pSrcHash;
2535 TRACE(
"(hUID=%08Ix, hKey=%08Ix, pdwReserved=%p, dwFlags=%08lx, phKey=%p)\n", hUID,
hKey,
2550 if (!phKey || pdwReserved ||
dwFlags)
2560 *pDestKey = *pSrcKey;
2604 TRACE(
"(hProv=%08Ix, hKey=%08Ix, hHash=%08Ix, Final=%d, dwFlags=%08lx, pbData=%p, "
2632 FIXME(
"Can't get algid info.\n");
2663 *pdwDataLen = dwBufLen;
2676 if (dwBufLen < pCryptKey->dwBlockLen) {
2726 TRACE(
"(hProv=%08Ix, hKey=%08Ix, hHash=%08Ix, Final=%d, dwFlags=%08lx, pbData=%p, "
2756 if (Final && !*pdwDataLen)
2766 switch (pCryptKey->
dwMode) {
2794 if (
pbData[*pdwDataLen-1] &&
2796 pbData[*pdwDataLen-1] <= *pdwDataLen) {
2800 for (
i = 1; padOkay &&
i <
pbData[*pdwDataLen-1];
i++)
2804 *pdwDataLen -=
pbData[*pdwDataLen-1];
2836 if (*pdwDataLen>dwMax ||
2857 if (*pdwDataLen < dwDataLen) {
2859 *pdwDataLen = dwDataLen;
2878 *pdwDataLen = dwDataLen;
2896 if (*pdwDataLen < dwDataLen) {
2898 *pdwDataLen = dwDataLen;
2912 *pdwDataLen = dwDataLen;
2936 if (*pdwDataLen < dwDataLen) {
2938 *pdwDataLen = dwDataLen;
2951 *pdwDataLen = dwDataLen;
2965 if (*pdwDataLen < dwDataLen) {
2967 *pdwDataLen = dwDataLen;
2979 *pdwDataLen = dwDataLen;
3016 switch ((
BYTE)dwBlobType)
3069 TRACE(
"(hProv=%08Ix, hKey=%08Ix, hPubKey=%08Ix, dwBlobType=%08lx, dwFlags=%08lx, pbData=%p,"
3150 FIXME(
"unimplemented for CRYPT_IPSEC_HMAC_KEY\n");
3159 ERR(
"datalen %ld not long enough for a BLOBHEADER + RSAPUBKEY\n",
3166 ERR(
"unexpected magic %08lx\n", pRSAPubKey->
magic);
3171 (pRSAPubKey->
bitlen >> 3) + (5 * ((pRSAPubKey->
bitlen+8)>>4))))
3174 (pRSAPubKey->
bitlen >> 3) + (5 * ((pRSAPubKey->
bitlen+8)>>4));
3176 ERR(
"blob too short for pub key: expect %ld, got %ld\n",
3177 expectedLen, dwDataLen);
3194 TRACE(
"installing signing key\n");
3200 TRACE(
"installing key exchange key\n");
3242 FIXME(
"unimplemented for CRYPT_IPSEC_HMAC_KEY\n");
3300 const BYTE *pbKeyStream = (
const BYTE*)(pAlgid + 1);
3306 FIXME(
"unimplemented for CRYPT_IPSEC_HMAC_KEY\n");
3324 if (!pbDecrypted)
return FALSE;
3340 dwKeyLen =
info->dwDefaultLen;
3341 if (dwKeyLen < info->dwMinLen / 8 || dwKeyLen > 128)
3343 WARN(
"Invalid RC2 key, len %ld.\n", dwKeyLen);
3397 const DWORD *pKeyLen = (
const DWORD *)(pBlobHeader + 1);
3398 const BYTE *pbKeyStream = (
const BYTE*)(pKeyLen + 1);
3493 TRACE(
"blob type: %x\n", pBlobHeader->
bType);
3494 switch (pBlobHeader->
bType)
3539 TRACE(
"(hProv=%08Ix, pbData=%p, dwDataLen=%ld, hPubKey=%08Ix, dwFlags=%08lx, phKey=%p)\n",
3572 TRACE(
"(hProv=%08Ix, aiAlgid=%d, dwFlags=%08lx, phKey=%p)\n",
hProv, Algid,
dwFlags, phKey);
3665 TRACE(
"(hProv=%08Ix, dwLen=%ld, pbBuffer=%p)\n",
hProv, dwLen, pbBuffer);
3703 TRACE(
"(hProv=%08Ix, hHash=%08Ix, dwParam=%08lx, pbData=%p, pdwDataLen=%p, dwFlags=%08lx)\n",
3803 TRACE(
"(hProv=%08Ix, hKey=%08Ix, dwParam=%08lx, pbData=%p, dwFlags=%08lx)\n",
hProv,
hKey,
3914 if (
blob->cbData > 24)
3930 DWORD keylen, deflen;
3944 if (!keylen || keylen > 1024)
3957 && keylen != deflen)
4036 TRACE(
"(hProv=%08Ix, hKey=%08Ix, dwParam=%08lx, pbData=%p, pdwDataLen=%p dwFlags=%08lx)\n",
4079 dwValue = pCryptKey->
dwKeyLen << 3;
4086 dwValue = pCryptKey->
dwKeyLen << 3;
4150 static const BYTE abWTF[96] = {
4151 0xb0, 0x25, 0x63, 0x86, 0x9c, 0xab, 0xb6, 0x37,
4152 0xe8, 0x82, 0x00, 0x72, 0x06, 0xb2, 0x00, 0x3b,
4153 0x60, 0x35, 0x00, 0x3b, 0x88, 0xce, 0x00, 0x82,
4154 0xbc, 0x7a, 0x00, 0xb7, 0x4f, 0x7e, 0x00, 0xde,
4155 0x92, 0xf1, 0x00, 0x83, 0xea, 0x5e, 0x00, 0xc8,
4156 0x12, 0x1e, 0xd4, 0x06, 0xf7, 0x66, 0x00, 0x01,
4157 0x29, 0xa4, 0x00, 0xf8, 0x24, 0x0c, 0x00, 0x33,
4158 0x06, 0x80, 0x00, 0x02, 0x46, 0x0b, 0x00, 0x6d,
4159 0x5b, 0xca, 0x00, 0x9a, 0x10, 0xf0, 0x00, 0x05,
4160 0x19, 0xd0, 0x00, 0x2c, 0xf6, 0x27, 0x00, 0xaa,
4161 0x7c, 0x6f, 0x00, 0xb9, 0xd8, 0x72, 0x00, 0x03,
4162 0xf3, 0x81, 0x00, 0xfa, 0xe8, 0x26, 0x00, 0xca
4165 TRACE(
"(hProv=%08Ix, dwParam=%08lx, pbData=%p, pdwDataLen=%p, dwFlags=%08lx)\n",
4220 dwTemp = 0x00000200;
4237 dwTemp = *pdwDataLen;
4363 TRACE(
"(hProv=%08Ix, Algid=%d, hBaseData=%08Ix, dwFlags=%08lx phKey=%p)\n",
hProv, Algid,
4389 int need_padding, copy_len;
4410 if (dwLen == 16 || dwLen == 20)
4416 need_padding = dwLen < pCryptKey->
dwKeyLen;
4472 if (!pMasterKey->siSChannelInfo.saEncAlg.Algid ||
4473 !pMasterKey->siSChannelInfo.saEncAlg.cBits)
4478 *phKey =
new_key(
hProv, pMasterKey->siSChannelInfo.saEncAlg.Algid,
4484 2 * (pMasterKey->siSChannelInfo.saMACAlg.cBits / 8) +
4486 (pMasterKey->siSChannelInfo.saEncAlg.cBits / 8) : 0)),
4487 pMasterKey->siSChannelInfo.saEncAlg.cBits / 8);
4490 2 * (pMasterKey->siSChannelInfo.saMACAlg.cBits / 8) +
4491 2 * (pMasterKey->siSChannelInfo.saEncAlg.cBits / 8) +
4503 pMasterKey->siSChannelInfo.saMACAlg.cBits / 8 : 0),
4504 pMasterKey->siSChannelInfo.saMACAlg.cBits / 8);
4543 TRACE(
"(hProv=%08Ix, dwKeySpec=%08lx, phUserKey=%p)\n",
hProv, dwKeySpec, phUserKey);
4602 TRACE(
"(hProv=%08Ix, hHash=%08Ix, pbData=%p, dwDataLen=%ld, dwFlags=%08lx)\n",
4678 for (
i=0;
i<
pKey->dwKeyLen/2;
i++) {
4679 bTemp = abKeyValue[
i];
4680 abKeyValue[
i] = abKeyValue[
pKey->dwKeyLen-
i-1];
4681 abKeyValue[
pKey->dwKeyLen-
i-1] = bTemp;
4749 TRACE(
"(hProv=%08Ix, hHash=%08Ix, dwParam=%08lx, pbData=%p, dwFlags=%08lx)\n",
4791 if (pCryptKey->aiAlgid ==
CALG_HMAC && !pCryptKey->dwKeyLen) {
4793 pCryptKey->blobHmacKey.cbData);
4874 FIXME(
"unimplemented parameter %08lx\n", dwParam);
4908 TRACE(
"(hProv=%08Ix, hHash=%08Ix, dwKeySpec=%08lx, sDescription=%s, dwFlags=%08lx, "
4909 "pbSignature=%p, pdwSigLen=%p)\n",
hProv, hHash, dwKeySpec,
debugstr_w(sDescription),
4910 dwFlags, pbSignature, pdwSigLen);
4931 if (pCryptKey->
dwKeyLen > *pdwSigLen)
4947 dwHashLen =
sizeof(
DWORD);
4991 TRACE(
"(hProv=%08Ix, hHash=%08Ix, pbSignature=%p, dwSigLen=%ld, hPubKey=%08Ix, sDescription=%s, "
4992 "dwFlags=%08lx)\n",
hProv, hHash, pbSignature, dwSigLen, hPubKey,
debugstr_w(sDescription),
5016 if (dwSigLen != pCryptKey->
dwKeyLen)
5022 if (!hHash || !pbSignature)
5036 dwHashLen =
sizeof(
DWORD);
5042 pbConstructed =
malloc(dwSigLen);
5043 if (!pbConstructed) {
5048 pbDecrypted =
malloc(dwSigLen);
5057 !
memcmp(pbDecrypted, pbConstructed, dwSigLen)) {
5064 !
memcmp(pbDecrypted, pbConstructed, dwSigLen)) {
5072 free(pbConstructed);
static DWORD const fdwReason
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define RegCloseKey(hKey)
#define ERROR_INSUFFICIENT_BUFFER
LONG WINAPI RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData)
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
LONG WINAPI RegCreateKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD Reserved, _In_ LPSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_ LPDWORD lpdwDisposition)
LONG WINAPI RegEnumKeyExA(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
LONG WINAPI RegDeleteKeyA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey)
DWORD WINAPI SetSecurityInfo(HANDLE handle, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, PSID psidOwner, PSID psidGroup, PACL pDacl, PACL pSacl)
DWORD WINAPI GetSecurityInfo(HANDLE handle, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, PSID *ppsidOwner, PSID *ppsidGroup, PACL *ppDacl, PACL *ppSacl, PSECURITY_DESCRIPTOR *ppSecurityDescriptor)
BOOL WINAPI GetUserNameA(LPSTR lpszName, LPDWORD lpSize)
static const WCHAR setup_key[]
BOOL WINAPI CryptUnprotectData(DATA_BLOB *pDataIn, LPWSTR *ppszDataDescr, DATA_BLOB *pOptionalEntropy, PVOID pvReserved, CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct, DWORD dwFlags, DATA_BLOB *pDataOut)
BOOL WINAPI CryptProtectData(DATA_BLOB *pDataIn, LPCWSTR szDataDescr, DATA_BLOB *pOptionalEntropy, PVOID pvReserved, CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct, DWORD dwFlags, DATA_BLOB *pDataOut)
#define ERROR_INVALID_PARAMETER
#define DLL_PROCESS_ATTACH
#define DLL_PROCESS_DETACH
#define INVALID_HANDLE_VALUE
#define ERROR_NO_MORE_ITEMS
static DWORD DWORD * dwLength
static void cleanup(void)
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
DWORD WINAPI GetSecurityDescriptorLength(PSECURITY_DESCRIPTOR descr)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
_ACRTIMP size_t __cdecl strlen(const char *)
_ACRTIMP int __cdecl strcmp(const char *, const char *)
BOOL lookup_handle(struct handle_table *lpTable, HCRYPTKEY handle, DWORD dwType, OBJECTHDR **lplpObject)
BOOL release_handle(struct handle_table *lpTable, HCRYPTKEY handle, DWORD dwType)
void destroy_handle_table(struct handle_table *lpTable)
void init_handle_table(struct handle_table *lpTable)
BOOL is_valid_handle(struct handle_table *lpTable, HCRYPTKEY handle, DWORD dwType)
HCRYPTKEY new_object(struct handle_table *lpTable, size_t cbSize, DWORD dwType, DESTRUCTOR destructor, OBJECTHDR **ppObject)
BOOL copy_handle(struct handle_table *lpTable, HCRYPTKEY handle, DWORD dwType, HCRYPTKEY *copy)
BOOL WINAPI RSAENH_CPEncrypt(HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen)
static BOOL unpad_data_oaep(HCRYPTPROV hProv, const BYTE *abData, DWORD dwDataLen, BYTE *abBuffer, DWORD *dwBufferLen, DWORD dwFlags)
static BOOL build_hash_signature(BYTE *pbSignature, DWORD dwLen, ALG_ID aiAlgid, const BYTE *abHashValue, DWORD dwHashLen, DWORD dwFlags)
BOOL WINAPI RSAENH_CPDecrypt(HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
#define RSAENH_KEYSTATE_IDLE
BOOL WINAPI RSAENH_CPSignHash(HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwKeySpec, LPCWSTR sDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen)
BOOL block_encrypt(CRYPTKEY *key, BYTE *data, DWORD *data_len, DWORD buf_len, BOOL final, KEY_CONTEXT *context, BYTE *chain_vector)
static const PROV_ENUMALGS_EX * get_algid_info(HCRYPTPROV hProv, ALG_ID algid)
static void release_key_container_keys(KEYCONTAINER *pKeyContainer)
static BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey, DWORD dwBlobType, DWORD dwFlags, BOOL force, BYTE *pbData, DWORD *pdwDataLen)
#define RSAENH_MAGIC_HASH
BOOL WINAPI RSAENH_CPGenKey(HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey)
static void store_key_permissions(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec)
BOOL WINAPI RSAENH_CPExportKey(HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTKEY hPubKey, DWORD dwBlobType, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
static void store_key_container_permissions(KEYCONTAINER *pKeyContainer)
BOOL WINAPI RSAENH_CPGenRandom(HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer)
static BOOL crypt_export_simple(CRYPTKEY *pCryptKey, CRYPTKEY *pPubKey, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
BOOL WINAPI RSAENH_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer, DWORD dwFlags, PVTableProvStruc pVTable)
#define RSAENH_SSL3_VERSION_MINOR
static BOOL unpad_data(HCRYPTPROV hProv, const BYTE *abData, DWORD dwDataLen, BYTE *abBuffer, DWORD *dwBufferLen, DWORD dwFlags)
#define RSAENH_3DES112_EFFECTIVE_KEYLEN
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID reserved)
#define RSAENH_MAGIC_RSA2
BOOL WINAPI RSAENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD dwFlags)
BOOL WINAPI RSAENH_CPVerifySignature(HCRYPTPROV hProv, HCRYPTHASH hHash, const BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCWSTR sDescription, DWORD dwFlags)
static void free_data_blob(PCRYPT_DATA_BLOB pBlob)
BOOL WINAPI RSAENH_CPGetHashParam(HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
BOOL WINAPI RSAENH_CPDeriveKey(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey)
#define RSAENH_DES_STORAGE_KEYLEN
BOOL WINAPI RSAENH_CPSetHashParam(HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD dwFlags)
static BOOL pad_data(HCRYPTPROV hProv, const BYTE *abData, DWORD dwDataLen, BYTE *abBuffer, DWORD dwBufferLen, DWORD dwFlags)
static BOOL concat_data_blobs(PCRYPT_DATA_BLOB dst, const PCRYPT_DATA_BLOB src1, const PCRYPT_DATA_BLOB src2)
#define RSAENH_KEYSTATE_ENCRYPTING
static BOOL pad_data_oaep(HCRYPTPROV hProv, const BYTE *abData, DWORD dwDataLen, BYTE *abBuffer, DWORD dwBufferLen, DWORD dwFlags)
static LPCSTR map_key_spec_to_key_pair_name(DWORD dwKeySpec)
static void release_and_install_key(HCRYPTPROV hProv, HCRYPTKEY src, HCRYPTKEY *dest, DWORD fStoreKey)
#define RSAENH_PERSONALITY_SCHANNEL
#define RSAENH_HMAC_DEF_OPAD_CHAR
BOOL WINAPI RSAENH_CPGetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
#define RSAENH_PERSONALITY_STRONG
static BOOL crypt_export_private_key(CRYPTKEY *pCryptKey, BOOL force, BYTE *pbData, DWORD *pdwDataLen)
static HCRYPTKEY new_key(HCRYPTPROV hProv, ALG_ID aiAlgid, DWORD dwFlags, CRYPTKEY **ppCryptKey)
BOOL WINAPI RSAENH_CPReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
BOOL WINAPI RSAENH_CPGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey)
struct tagKEYCONTAINER KEYCONTAINER
BOOL WINAPI RSAENH_CPDestroyHash(HCRYPTPROV hProv, HCRYPTHASH hHash)
#define RSAENH_3DES112_STORAGE_KEYLEN
static BOOL copy_param(BYTE *pbBuffer, DWORD *pdwBufferSize, const BYTE *pbParam, DWORD dwParamSize)
BOOL WINAPI RSAENH_CPHashSessionKey(HCRYPTPROV hProv, HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags)
BOOL WINAPI RSAENH_CPDuplicateKey(HCRYPTPROV hUID, HCRYPTKEY hKey, DWORD *pdwReserved, DWORD dwFlags, HCRYPTKEY *phKey)
static BOOL open_container_key(LPCSTR pszContainerName, DWORD dwFlags, REGSAM access, HKEY *phKey)
static BOOL delete_container_key(LPCSTR pszContainerName, DWORD dwFlags)
struct tagCRYPTHASH CRYPTHASH
#define RSAENH_TLS1_VERSION_MINOR
static void destroy_key(OBJECTHDR *pObject)
#define RSAENH_SSL3_VERSION_MAJOR
static void store_key_container_keys(KEYCONTAINER *pKeyContainer)
static BOOL tls1_prf(HCRYPTPROV hProv, HCRYPTPROV hSecret, const PCRYPT_DATA_BLOB pblobLabel, const PCRYPT_DATA_BLOB pblobSeed, BYTE *pbBuffer, DWORD dwBufferLen)
static BOOL import_plaintext_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags, HCRYPTKEY *phKey)
static BOOL pad_data_pkcs1(const BYTE *abData, DWORD dwDataLen, BYTE *abBuffer, DWORD dwBufferLen, DWORD dwFlags)
static BOOL create_container_key(KEYCONTAINER *pKeyContainer, REGSAM sam, HKEY *phKey)
#define RSAENH_MAX_KEY_SIZE
#define RSAENH_PCT1_SSL2_SSL3_TLS1
#define RSAENH_MAGIC_CONTAINER
#define RSAENH_PERSONALITY_AES
static KEYCONTAINER * get_key_container(HCRYPTPROV hProv)
#define RSAENH_DES_EFFECTIVE_KEYLEN
#define RSAENH_MAX_ENUMALGS
static BOOL import_private_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags, BOOL fStoreKey, HCRYPTKEY *phKey)
static BOOL tls1_p(HCRYPTHASH hHMAC, const PCRYPT_DATA_BLOB pblobSeed, BYTE *pbBuffer, DWORD dwBufferLen)
#define RSAENH_HASHSTATE_FINISHED
struct tagCRYPTKEY CRYPTKEY
BOOL WINAPI RSAENH_CPCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash)
#define RSAENH_MAX_BLOCK_SIZE
static BOOL copy_hmac_info(PHMAC_INFO *dst, const HMAC_INFO *src, DWORD block_len)
static BOOL pkcs1_mgf1(HCRYPTPROV hProv, const BYTE *pbSeed, DWORD dwSeedLength, DWORD dwLength, PCRYPT_DATA_BLOB pbMask)
BOOL WINAPI RSAENH_CPSetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD dwFlags)
static const PROV_ENUMALGS_EX aProvEnumAlgsEx[5][RSAENH_MAX_ENUMALGS+1]
static BOOL copy_data_blob(PCRYPT_DATA_BLOB dst, const PCRYPT_DATA_BLOB src)
#define RSAENH_PERSONALITY_BASE
BOOL WINAPI RSAENH_CPDuplicateHash(HCRYPTPROV hUID, HCRYPTHASH hHash, DWORD *pdwReserved, DWORD dwFlags, HCRYPTHASH *phHash)
static HCRYPTPROV read_key_container(PCHAR pszContainerName, DWORD dwFlags, const VTableProvStruc *pVTable)
static BOOL unpad_data_pkcs1(const BYTE *abData, DWORD dwDataLen, BYTE *abBuffer, DWORD *dwBufferLen, DWORD dwFlags)
static HCRYPTPROV new_key_container(PCCH pszContainerName, DWORD dwFlags, const VTableProvStruc *pVTable)
BOOL WINAPI RSAENH_CPGetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
#define RSAENH_3DES_STORAGE_KEYLEN
#define RSAENH_TLS1_VERSION_MAJOR
static BOOL import_public_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags, HCRYPTKEY *phKey)
static HCRYPTKEY alloc_key(HCRYPTPROV hprov, ALG_ID alg_id, DWORD flags, DWORD key_len, CRYPTKEY **ret_key)
BOOL WINAPI RSAENH_CPImportKey(HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey)
#define RSAENH_HMAC_BLOCK_LEN
BOOL WINAPI RSAENH_CPDestroyKey(HCRYPTPROV hProv, HCRYPTKEY hKey)
static void destroy_hash(OBJECTHDR *pObject)
static void finalize_hash(CRYPTHASH *pCryptHash)
#define RSAENH_KEYSTATE_MASTERKEY
#define RSAENH_3DES_EFFECTIVE_KEYLEN
static void update_hash(CRYPTHASH *pCryptHash, const BYTE *pbData, DWORD dwDataLen)
static BOOL crypt_export_public_key(CRYPTKEY *pCryptKey, BYTE *pbData, DWORD *pdwDataLen)
static BOOL import_symmetric_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey)
static BOOL init_hash(CRYPTHASH *pCryptHash)
static BOOL import_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, BOOL fStoreKey, HCRYPTKEY *phKey)
#define RSAENH_MAGIC_RSA1
#define RSAENH_HMAC_DEF_IPAD_CHAR
static void init_data_blob(PCRYPT_DATA_BLOB pBlob)
static void free_hmac_info(PHMAC_INFO hmac_info)
static BOOL read_key_value(HCRYPTPROV hKeyContainer, HKEY hKey, DWORD dwKeySpec, DWORD dwFlags, HCRYPTKEY *phCryptKey)
static LPCSTR map_key_spec_to_permissions_name(DWORD dwKeySpec)
#define RSAENH_HMAC_DEF_PAD_LEN
#define RSAENH_HASHSTATE_HASHING
static BOOL crypt_export_plaintext_key(CRYPTKEY *pCryptKey, BYTE *pbData, DWORD *pdwDataLen)
struct _RSAENH_TLS1PRF_PARAMS RSAENH_TLS1PRF_PARAMS
static void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec, DWORD dwFlags)
static void destroy_key_container(OBJECTHDR *pObjectHdr)
struct _RSAENH_SCHANNEL_INFO RSAENH_SCHANNEL_INFO
#define RSAENH_PKC_BLOCKTYPE
#define RSAENH_PERSONALITY_ENHANCED
BOOL WINAPI RSAENH_CPHashData(HCRYPTPROV hProv, HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
static const uint32_t k[]
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLuint GLint GLboolean GLint GLenum access
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
HLOCAL NTAPI LocalFree(HLOCAL hMem)
BOOL import_public_key_impl(ALG_ID algid, const BYTE *src, DWORD keylen, DWORD pubexp, KEY_CONTEXT *ctx)
BOOL new_key_impl(ALG_ID algid, KEY_CONTEXT *ctx, DWORD keylen)
BOOL sign_hash_impl(KEY_CONTEXT *ctx, const BYTE *in, BYTE *out)
BOOL setup_key_impl(ALG_ID algid, KEY_CONTEXT *ctx, DWORD keylen, DWORD effective_keylen, DWORD saltlen, const BYTE *secret)
BOOL free_key_impl(ALG_ID algid, KEY_CONTEXT *ctx)
BOOL export_public_key_impl(const KEY_CONTEXT *ctx, BYTE *dst, DWORD *pubexp)
BOOL duplicate_key_impl(ALG_ID algid, const KEY_CONTEXT *src, KEY_CONTEXT *dst)
BOOL import_private_key_impl(ALG_ID algid, const BYTE *src, DWORD keylen, DWORD pubexp, KEY_CONTEXT *ctx)
BOOL init_hash_impl(ALG_ID algid, struct hash *hash)
BOOL decrypt_block_impl(ALG_ID algid, KEY_CONTEXT *ctx, const BYTE *in, BYTE *out)
BOOL encrypt_block_impl(ALG_ID algid, KEY_CONTEXT *ctx, const BYTE *in, BYTE *out)
BOOL export_private_key_impl(const KEY_CONTEXT *ctx, BYTE *dst, DWORD *pubexp)
BOOL verify_signature_impl(KEY_CONTEXT *ctx, const BYTE *in, BYTE *out)
BOOL encrypt_stream_impl(ALG_ID algid, KEY_CONTEXT *ctx, BYTE *stream, DWORD len)
static DWORD hash_len_impl(const struct hash *hash)
#define RSAENH_MAX_HASH_SIZE
static void update_hash_impl(struct hash *hash, const BYTE *data, DWORD len)
static void finalize_hash_impl(struct hash *hash, BYTE *hash_value, DWORD hash_size)
static DWORD hash_block_len_impl(const struct hash *hash)
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
#define ACCESS_SYSTEM_SECURITY
#define REG_OPTION_NON_VOLATILE
BOOL WINAPI GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID *pGroup, LPBOOL lpbGroupDefaulted)
BOOL WINAPI GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL lpbSaclPresent, PACL *pSacl, LPBOOL lpbSaclDefaulted)
BOOL WINAPI GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL lpbDaclPresent, PACL *pDacl, LPBOOL lpbDaclDefaulted)
BOOL WINAPI GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID *pOwner, LPBOOL lpbOwnerDefaulted)
CRYPT_DATA_BLOB blobServerRandom
CRYPT_DATA_BLOB blobClientRandom
CRYPT_DATA_BLOB blobLabel
const SYMCRYPT_HASH * desc
BYTE abHashValue[RSAENH_MAX_HASH_SIZE]
BYTE abChainVector[RSAENH_MAX_BLOCK_SIZE]
RSAENH_TLS1PRF_PARAMS tpPRFParams
DWORD buffered_hash_bytes
CRYPT_DATA_BLOB blobHmacKey
RSAENH_SCHANNEL_INFO siSChannelInfo
BYTE abInitVector[RSAENH_MAX_BLOCK_SIZE]
BYTE abKeyValue[RSAENH_MAX_KEY_SIZE]
BYTE abChainVector[RSAENH_MAX_BLOCK_SIZE]
CHAR szProvName[MAX_PATH]
HCRYPTKEY hSignatureKeyPair
HCRYPTKEY hKeyExchangeKeyPair
DWORD dwEnumContainersCtr
VOID SYMCRYPT_CALL SymCryptInit(void)
PCSYMCRYPT_HMAC_MD5_EXPANDED_KEY pKey
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
#define PP_KEYSET_SEC_DESCR
#define MS_ENH_RSA_AES_PROV_XP_A
#define ALG_CLASS_MSG_ENCRYPT
#define CRYPTPROTECT_LOCAL_MACHINE
#define CRYPT_VERIFYCONTEXT
#define PROV_RSA_SCHANNEL
#define CALG_SCHANNEL_MASTER_HASH
#define CRYPT_FLAG_SIGNING
#define CRYPT_X931_FORMAT
#define ALG_CLASS_DATA_ENCRYPT
#define CRYPT_DELETEKEYSET
#define PP_ENUMCONTAINERS
#define CRYPT_CREATE_SALT
#define CALG_SCHANNEL_MAC_KEY
#define KP_EFFECTIVE_KEYLEN
#define PP_UNIQUE_CONTAINER
#define PP_SIG_KEYSIZE_INC
#define PP_KEYX_KEYSIZE_INC
struct _PUBLICKEYSTRUC BLOBHEADER
#define MS_DEF_RSA_SCHANNEL_PROV_A
#define MS_ENHANCED_PROV_A
#define CRYPT_IMPL_SOFTWARE
#define CRYPT_SSL2_FALLBACK
#define CRYPT_LITTLE_ENDIAN
#define CRYPT_IPSEC_HMAC_KEY
#define PP_CRYPT_COUNT_KEY_USE
#define CALG_SCHANNEL_ENC_KEY
#define CRYPT_MACHINE_KEYSET
#define MS_ENH_RSA_AES_PROV_A
#define NTE_BAD_HASH_STATE
#define NTE_BAD_PUBLIC_KEY
#define NTE_BAD_SIGNATURE
#define NTE_BAD_KEY_STATE
#define HKEY_LOCAL_MACHINE
#define HKEY_CURRENT_USER
#define DACL_SECURITY_INFORMATION
#define OWNER_SECURITY_INFORMATION
#define GROUP_SECURITY_INFORMATION
#define SACL_SECURITY_INFORMATION