From 7f3ce788d5cbc136ce62eb50b4b860f0725eeab0 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 6 Dec 2013 15:04:04 +0000 Subject: [PATCH] [ADVAPI32/CRYPT] * Sync with Wine 1.7.1. CORE-7469 svn path=/trunk/; revision=61234 --- reactos/dll/win32/advapi32/crypt/crypt.c | 274 +++++++++++--- reactos/dll/win32/advapi32/crypt/crypt.h | 11 +- reactos/dll/win32/advapi32/crypt/crypt_arc4.c | 28 ++ .../dll/win32/advapi32/crypt/crypt_lmhash.c | 352 ++++++++++++++++++ reactos/dll/win32/advapi32/crypt/crypt_md4.c | 236 +++++++----- reactos/dll/win32/advapi32/crypt/crypt_md5.c | 201 +++++----- reactos/dll/win32/advapi32/misc/sysfunc.c | 76 ++-- reactos/media/doc/README.WINE | 2 +- 8 files changed, 904 insertions(+), 276 deletions(-) diff --git a/reactos/dll/win32/advapi32/crypt/crypt.c b/reactos/dll/win32/advapi32/crypt/crypt.c index 429cef7be21..ff734d5e139 100644 --- a/reactos/dll/win32/advapi32/crypt/crypt.c +++ b/reactos/dll/win32/advapi32/crypt/crypt.c @@ -24,6 +24,7 @@ * - Thread-safing */ +#define WINE_STRICT_PROTOTYPES #include WINE_DEFAULT_DEBUG_CHANNEL(crypt); @@ -44,7 +45,7 @@ VOID byteReverse(unsigned char *buf, unsigned longs) } while (--longs); } -static HWND crypt_hWindow ; +static HWND crypt_hWindow; #define CRYPT_Alloc(size) (LocalAlloc(LMEM_ZEROINIT, size)) #define CRYPT_Free(buffer) (LocalFree(buffer)) @@ -102,33 +103,38 @@ static inline PWSTR CRYPT_GetTypeKeyName(DWORD dwType, BOOL user) return keyname; } -/* CRYPT_UnicodeTOANSI +/* CRYPT_UnicodeToANSI * wstr - unicode string - * str - pointer to ANSI string - * strsize - size of buffer pointed to by str or -1 if we have to do the allocation + * str - pointer to ANSI string or pointer to null pointer if we have to do the allocation + * strsize - size of buffer pointed to by str * * returns TRUE if unsuccessful, FALSE otherwise. * if wstr is NULL, returns TRUE and sets str to NULL! Value of str should be checked after call */ static inline BOOL CRYPT_UnicodeToANSI(LPCWSTR wstr, LPSTR* str, int strsize) { - int count; - if (!wstr) { *str = NULL; return TRUE; } - count = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL); - if (strsize == -1) - *str = CRYPT_Alloc(count * sizeof(CHAR)); - else - count = min( count, strsize ); + + if (!*str) + { + strsize = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL); + *str = CRYPT_Alloc(strsize * sizeof(CHAR)); + } + else if (strsize < 0) + { + strsize = INT_MAX; /* windows will pretend that the buffer is infinitely long */ + } + if (*str) { - WideCharToMultiByte(CP_ACP, 0, wstr, -1, *str, count, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, wstr, -1, *str, strsize, NULL, NULL); return TRUE; } + SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } @@ -175,12 +181,9 @@ static BOOL CALLBACK CRYPT_VerifyImage(LPCSTR lpszImage, BYTE* pData) return TRUE; } -static BOOL CALLBACK CRYPT_ReturnhWnd(HWND *phWnd) +static void CALLBACK CRYPT_ReturnhWnd(HWND *phWnd) { - if (!phWnd) - return FALSE; - *phWnd = crypt_hWindow; - return TRUE; + if (phWnd) *phWnd = crypt_hWindow; } #define CRYPT_GetProvFunc(name) \ @@ -233,7 +236,7 @@ static PCRYPTPROV CRYPT_LoadProvider(PCWSTR pImage) /* FIXME: Not sure what the pbContextInfo field is for. * Does it need memory allocation? - */ + */ provider->pVTable->Version = 3; provider->pVTable->FuncVerifyImage = CRYPT_VerifyImage; provider->pVTable->FuncReturnhWnd = CRYPT_ReturnhWnd; @@ -477,13 +480,13 @@ BOOL WINAPI CryptAcquireContextW (HCRYPTPROV *phProv, LPCWSTR pszContainer, goto error; } pProv->pVTable->dwProvType = dwProvType; - if(!CRYPT_UnicodeToANSI(provname, &provnameA, -1)) + if(!CRYPT_UnicodeToANSI(provname, &provnameA, 0)) { /* CRYPT_UnicodeToANSI calls SetLastError */ goto error; } pProv->pVTable->pszProvName = provnameA; - if(!CRYPT_UnicodeToANSI(pszContainer, &pszContainerA, -1)) + if(!CRYPT_UnicodeToANSI(pszContainer, &pszContainerA, 0)) { /* CRYPT_UnicodeToANSI calls SetLastError */ goto error; @@ -541,8 +544,8 @@ BOOL WINAPI CryptAcquireContextA (HCRYPTPROV *phProv, LPCSTR pszContainer, PWSTR pProvider = NULL, pContainer = NULL; BOOL ret = FALSE; - TRACE("(%p, %s, %s, %d, %08x)\n", phProv, pszContainer, - pszProvider, dwProvType, dwFlags); + TRACE("(%p, %s, %s, %d, %08x)\n", phProv, debugstr_a(pszContainer), + debugstr_a(pszProvider), dwProvType, dwFlags); if ( !CRYPT_ANSIToUnicode(pszContainer, &pContainer, -1) ) { @@ -716,12 +719,8 @@ BOOL WINAPI CryptCreateHash (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, TRACE("(0x%lx, 0x%x, 0x%lx, %08x, %p)\n", hProv, Algid, hKey, dwFlags, phHash); - if (!prov) - { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - if (!phHash || prov->dwMagic != MAGIC_CRYPTPROV) + if (!prov || !phHash || prov->dwMagic != MAGIC_CRYPTPROV || + (key && key->dwMagic != MAGIC_CRYPTKEY)) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -738,7 +737,7 @@ BOOL WINAPI CryptCreateHash (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, } hash->pProvider = prov; - + hash->dwMagic = MAGIC_CRYPTHASH; if (prov->pFuncs->pCPCreateHash(prov->hPrivate, Algid, key ? key->hPrivate : 0, 0, &hash->hPrivate)) { @@ -747,6 +746,7 @@ BOOL WINAPI CryptCreateHash (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, } /* CSP error! */ + hash->dwMagic = 0; CRYPT_Free(hash); *phHash = 0; return FALSE; @@ -779,7 +779,9 @@ BOOL WINAPI CryptDecrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen); - if (!key || !pbData || !pdwDataLen || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key || !pbData || !pdwDataLen || + !key->pProvider || key->dwMagic != MAGIC_CRYPTKEY || + key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -820,7 +822,7 @@ BOOL WINAPI CryptDeriveKey (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData SetLastError(ERROR_INVALID_HANDLE); return FALSE; } - if (!phKey || prov->dwMagic != MAGIC_CRYPTPROV) + if (!phKey || prov->dwMagic != MAGIC_CRYPTPROV || hash->dwMagic != MAGIC_CRYPTHASH) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -832,6 +834,7 @@ BOOL WINAPI CryptDeriveKey (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData } key->pProvider = prov; + key->dwMagic = MAGIC_CRYPTKEY; if (prov->pFuncs->pCPDeriveKey(prov->hPrivate, Algid, hash->hPrivate, dwFlags, &key->hPrivate)) { *phKey = (HCRYPTKEY)key; @@ -839,6 +842,7 @@ BOOL WINAPI CryptDeriveKey (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData } /* CSP error! */ + key->dwMagic = 0; CRYPT_Free(key); *phKey = 0; return FALSE; @@ -870,7 +874,8 @@ BOOL WINAPI CryptDestroyHash (HCRYPTHASH hHash) return FALSE; } - if (!hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH || + hash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -878,6 +883,7 @@ BOOL WINAPI CryptDestroyHash (HCRYPTHASH hHash) prov = hash->pProvider; ret = prov->pFuncs->pCPDestroyHash(prov->hPrivate, hash->hPrivate); + hash->dwMagic = 0; CRYPT_Free(hash); return ret; } @@ -908,7 +914,8 @@ BOOL WINAPI CryptDestroyKey (HCRYPTKEY hKey) return FALSE; } - if (!key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key->pProvider || key->dwMagic != MAGIC_CRYPTKEY || + key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -916,6 +923,7 @@ BOOL WINAPI CryptDestroyKey (HCRYPTKEY hKey) prov = key->pProvider; ret = prov->pFuncs->pCPDestroyKey(prov->hPrivate, key->hPrivate); + key->dwMagic = 0; CRYPT_Free(key); return ret; } @@ -944,8 +952,8 @@ BOOL WINAPI CryptDuplicateHash (HCRYPTHASH hHash, DWORD *pdwReserved, TRACE("(0x%lx, %p, %08x, %p)\n", hHash, pdwReserved, dwFlags, phHash); orghash = (PCRYPTHASH)hHash; - if (!orghash || pdwReserved || !phHash || !orghash->pProvider || - orghash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!orghash || pdwReserved || !phHash || !orghash->pProvider || + orghash->dwMagic != MAGIC_CRYPTHASH || orghash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -965,11 +973,13 @@ BOOL WINAPI CryptDuplicateHash (HCRYPTHASH hHash, DWORD *pdwReserved, } newhash->pProvider = prov; + newhash->dwMagic = MAGIC_CRYPTHASH; if (prov->pFuncs->pCPDuplicateHash(prov->hPrivate, orghash->hPrivate, pdwReserved, dwFlags, &newhash->hPrivate)) { *phHash = (HCRYPTHASH)newhash; return TRUE; } + newhash->dwMagic = 0; CRYPT_Free(newhash); return FALSE; } @@ -997,7 +1007,8 @@ BOOL WINAPI CryptDuplicateKey (HCRYPTKEY hKey, DWORD *pdwReserved, DWORD dwFlags TRACE("(0x%lx, %p, %08x, %p)\n", hKey, pdwReserved, dwFlags, phKey); orgkey = (PCRYPTKEY)hKey; - if (!orgkey || pdwReserved || !phKey || !orgkey->pProvider || + if (!orgkey || pdwReserved || !phKey || !orgkey->pProvider || + orgkey->dwMagic != MAGIC_CRYPTKEY || orgkey->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); @@ -1018,11 +1029,13 @@ BOOL WINAPI CryptDuplicateKey (HCRYPTKEY hKey, DWORD *pdwReserved, DWORD dwFlags } newkey->pProvider = prov; + newkey->dwMagic = MAGIC_CRYPTKEY; if (prov->pFuncs->pCPDuplicateKey(prov->hPrivate, orgkey->hPrivate, pdwReserved, dwFlags, &newkey->hPrivate)) { *phKey = (HCRYPTKEY)newkey; return TRUE; } + newkey->dwMagic = 0; CRYPT_Free(newkey); return FALSE; } @@ -1059,7 +1072,8 @@ BOOL WINAPI CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p, %d)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen, dwBufLen); - if (!key || !pdwDataLen || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key || !pdwDataLen || !key->pProvider || + key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1189,7 +1203,7 @@ BOOL WINAPI CryptEnumProvidersA (DWORD dwIndex, DWORD *pdwReserved, { PWSTR str = NULL; DWORD bufsize; - BOOL ret; /* = FALSE; */ + BOOL ret; TRACE("(%d, %p, %08x, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags, pdwProvType, pszProvName, pcbProvName); @@ -1276,19 +1290,24 @@ BOOL WINAPI CryptEnumProviderTypesW (DWORD dwIndex, DWORD *pdwReserved, if (dwIndex >= numkeys) { SetLastError(ERROR_NO_MORE_ITEMS); + RegCloseKey(hKey); return FALSE; } keylen++; if ( !(keyname = CRYPT_Alloc(keylen*sizeof(WCHAR))) ) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); + RegCloseKey(hKey); return FALSE; } if ( RegEnumKeyW(hKey, dwIndex, keyname, keylen) ) { CRYPT_Free(keyname); + RegCloseKey(hKey); return FALSE; } RegOpenKeyW(hKey, keyname, &hSubkey); + RegCloseKey(hKey); + ch = keyname + strlenW(keyname); /* Convert "Type 000" to 0, etc/ */ *pdwProvType = *(--ch) - '0'; @@ -1300,11 +1319,11 @@ BOOL WINAPI CryptEnumProviderTypesW (DWORD dwIndex, DWORD *pdwReserved, if (result) { SetLastError(result); + RegCloseKey(hSubkey); return FALSE; } RegCloseKey(hSubkey); - RegCloseKey(hKey); return TRUE; } @@ -1375,7 +1394,8 @@ BOOL WINAPI CryptExportKey (HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType, TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p)\n", hKey, hExpKey, dwBlobType, dwFlags, pbData, pdwDataLen); - if (!key || !pdwDataLen || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key || !pdwDataLen || !key->pProvider || + key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1408,11 +1428,6 @@ BOOL WINAPI CryptGenKey (HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKE TRACE("(0x%lx, %d, %08x, %p)\n", hProv, Algid, dwFlags, phKey); - if (!prov) - { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } if (!phKey || !prov || prov->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); @@ -1425,7 +1440,7 @@ BOOL WINAPI CryptGenKey (HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKE } key->pProvider = prov; - + key->dwMagic = MAGIC_CRYPTKEY; if (prov->pFuncs->pCPGenKey(prov->hPrivate, Algid, dwFlags, &key->hPrivate)) { *phKey = (HCRYPTKEY)key; @@ -1433,6 +1448,7 @@ BOOL WINAPI CryptGenKey (HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKE } /* CSP error! */ + key->dwMagic = 0; CRYPT_Free(key); return FALSE; } @@ -1494,6 +1510,8 @@ BOOL WINAPI CryptGetDefaultProviderW (DWORD dwProvType, DWORD *pdwReserved, CRYPT_Free(keyname); result = RegQueryValueExW(hKey, nameW, NULL, NULL, (LPBYTE)pszProvName, pcbProvName); + RegCloseKey(hKey); + if (result) { if (result != ERROR_MORE_DATA) @@ -1504,7 +1522,6 @@ BOOL WINAPI CryptGetDefaultProviderW (DWORD dwProvType, DWORD *pdwReserved, return FALSE; } - RegCloseKey(hKey); return TRUE; } @@ -1518,7 +1535,7 @@ BOOL WINAPI CryptGetDefaultProviderA (DWORD dwProvType, DWORD *pdwReserved, { PWSTR str = NULL; DWORD bufsize; - BOOL ret = FALSE; + BOOL ret; TRACE("(%d, %p, %08x, %p, %p)\n", dwProvType, pdwReserved, dwFlags, pszProvName, pcbProvName); @@ -1571,7 +1588,8 @@ BOOL WINAPI CryptGetHashParam (HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, TRACE("(0x%lx, %d, %p, %p, %08x)\n", hHash, dwParam, pbData, pdwDataLen, dwFlags); - if (!hash || !pdwDataLen || !hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!hash || !pdwDataLen || !hash->pProvider || + hash->dwMagic != MAGIC_CRYPTHASH || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1609,7 +1627,8 @@ BOOL WINAPI CryptGetKeyParam (HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, TRACE("(0x%lx, %d, %p, %p, %08x)\n", hKey, dwParam, pbData, pdwDataLen, dwFlags); - if (!key || !pdwDataLen || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key || !pdwDataLen || !key->pProvider || + key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1693,7 +1712,7 @@ BOOL WINAPI CryptGetUserKey (HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUse } key->pProvider = prov; - + key->dwMagic = MAGIC_CRYPTKEY; if (prov->pFuncs->pCPGetUserKey(prov->hPrivate, dwKeySpec, &key->hPrivate)) { *phUserKey = (HCRYPTKEY)key; @@ -1701,6 +1720,7 @@ BOOL WINAPI CryptGetUserKey (HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUse } /* CSP Error */ + key->dwMagic = 0; CRYPT_Free(key); *phUserKey = 0; return FALSE; @@ -1733,7 +1753,8 @@ BOOL WINAPI CryptHashData (HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen SetLastError(ERROR_INVALID_HANDLE); return FALSE; } - if (!hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH || + hash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1771,7 +1792,8 @@ BOOL WINAPI CryptHashSessionKey (HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags return FALSE; } - if (!hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH || + hash->pProvider->dwMagic != MAGIC_CRYPTPROV || key->dwMagic != MAGIC_CRYPTKEY) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1806,7 +1828,9 @@ BOOL WINAPI CryptImportKey (HCRYPTPROV hProv, CONST BYTE *pbData, DWORD dwDataLe TRACE("(0x%lx, %p, %d, 0x%lx, %08x, %p)\n", hProv, pbData, dwDataLen, hPubKey, dwFlags, phKey); - if (!prov || !pbData || !dwDataLen || !phKey || prov->dwMagic != MAGIC_CRYPTPROV) + if (!prov || !pbData || !dwDataLen || !phKey || + prov->dwMagic != MAGIC_CRYPTPROV || + (pubkey && pubkey->dwMagic != MAGIC_CRYPTKEY)) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1819,6 +1843,7 @@ BOOL WINAPI CryptImportKey (HCRYPTPROV hProv, CONST BYTE *pbData, DWORD dwDataLe } importkey->pProvider = prov; + importkey->dwMagic = MAGIC_CRYPTKEY; if (prov->pFuncs->pCPImportKey(prov->hPrivate, pbData, dwDataLen, pubkey ? pubkey->hPrivate : 0, dwFlags, &importkey->hPrivate)) { @@ -1826,6 +1851,7 @@ BOOL WINAPI CryptImportKey (HCRYPTPROV hProv, CONST BYTE *pbData, DWORD dwDataLe return TRUE; } + importkey->dwMagic = 0; CRYPT_Free(importkey); return FALSE; } @@ -1866,7 +1892,8 @@ BOOL WINAPI CryptSignHashW (HCRYPTHASH hHash, DWORD dwKeySpec, LPCWSTR sDescript SetLastError(ERROR_INVALID_HANDLE); return FALSE; } - if (!pdwSigLen || !hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!pdwSigLen || !hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH || + hash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1920,7 +1947,8 @@ BOOL WINAPI CryptSetHashParam (HCRYPTHASH hHash, DWORD dwParam, CONST BYTE *pbDa TRACE("(0x%lx, %d, %p, %08x)\n", hHash, dwParam, pbData, dwFlags); - if (!hash || !pbData || !hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!hash || !pbData || !hash->pProvider || + hash->dwMagic != MAGIC_CRYPTHASH || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1953,7 +1981,8 @@ BOOL WINAPI CryptSetKeyParam (HCRYPTKEY hKey, DWORD dwParam, CONST BYTE *pbData, TRACE("(0x%lx, %d, %p, %08x)\n", hKey, dwParam, pbData, dwFlags); - if (!key || !pbData || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key || !pbData || !key->pProvider || + key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -2189,7 +2218,7 @@ BOOL WINAPI CryptVerifySignatureW (HCRYPTHASH hHash, CONST BYTE *pbSignature, DW TRACE("(0x%lx, %p, %d, 0x%lx, %s, %08x)\n", hHash, pbSignature, dwSigLen, hPubKey, debugstr_w(sDescription), dwFlags); - if (!hash || !key || + if (!hash || !key || key->dwMagic != MAGIC_CRYPTKEY || hash->dwMagic != MAGIC_CRYPTHASH || !hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { @@ -2222,3 +2251,132 @@ BOOL WINAPI CryptVerifySignatureA (HCRYPTHASH hHash, CONST BYTE *pbSignature, DW return result; } + +#ifndef __REACTOS__ +/****************************************************************************** + * SystemFunction030 (ADVAPI32.@) + * + * Tests if two blocks of 16 bytes are equal + * + * PARAMS + * b1,b2 [I] block of 16 bytes + * + * RETURNS + * TRUE if blocks are the same + * FALSE if blocks are different + */ +BOOL WINAPI SystemFunction030(LPCVOID b1, LPCVOID b2) +{ + return !memcmp(b1, b2, 0x10); +} + +/****************************************************************************** + * SystemFunction035 (ADVAPI32.@) + * + * Described here: +http://disc.server.com/discussion.cgi?disc=148775;article=942;title=Coding%2FASM%2FSystem + * + * NOTES + * Stub, always return TRUE. + */ +BOOL WINAPI SystemFunction035(LPCSTR lpszDllFilePath) +{ + FIXME("%s: stub\n", debugstr_a(lpszDllFilePath)); + return TRUE; +} + +/****************************************************************************** + * SystemFunction036 (ADVAPI32.@) + * + * MSDN documents this function as RtlGenRandom and declares it in ntsecapi.h + * + * PARAMS + * pbBufer [O] Pointer to memory to receive random bytes. + * dwLen [I] Number of random bytes to fetch. + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ + +BOOLEAN WINAPI SystemFunction036(PVOID pbBuffer, ULONG dwLen) +{ + int dev_random; + + dev_random = open("/dev/urandom", O_RDONLY); + if (dev_random != -1) + { + if (read(dev_random, pbBuffer, dwLen) == (ssize_t)dwLen) + { + close(dev_random); + return TRUE; + } + close(dev_random); + } + else + FIXME("couldn't open /dev/urandom\n"); + SetLastError(NTE_FAIL); + return FALSE; +} + +/* + These functions have nearly identical prototypes to CryptProtectMemory and CryptUnprotectMemory, + in crypt32.dll. + */ + +/****************************************************************************** + * SystemFunction040 (ADVAPI32.@) + * + * MSDN documents this function as RtlEncryptMemory and declares it in ntsecapi.h. + * + * PARAMS + * memory [I/O] Pointer to memory to encrypt. + * length [I] Length of region to encrypt in bytes. + * flags [I] Control whether other processes are able to decrypt the memory. + * RTL_ENCRYPT_OPTION_SAME_PROCESS + * RTL_ENCRYPT_OPTION_CROSS_PROCESS + * RTL_ENCRYPT_OPTION_SAME_LOGON + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: NTSTATUS error code + * + * NOTES + * length must be a multiple of RTL_ENCRYPT_MEMORY_SIZE. + * If flags are specified when encrypting, the same flag value must be given + * when decrypting the memory. + */ +NTSTATUS WINAPI SystemFunction040(PVOID memory, ULONG length, ULONG flags) +{ + FIXME("(%p, %x, %x): stub [RtlEncryptMemory]\n", memory, length, flags); + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction041 (ADVAPI32.@) + * + * MSDN documents this function as RtlDecryptMemory and declares it in ntsecapi.h. + * + * PARAMS + * memory [I/O] Pointer to memory to decrypt. + * length [I] Length of region to decrypt in bytes. + * flags [I] Control whether other processes are able to decrypt the memory. + * RTL_ENCRYPT_OPTION_SAME_PROCESS + * RTL_ENCRYPT_OPTION_CROSS_PROCESS + * RTL_ENCRYPT_OPTION_SAME_LOGON + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: NTSTATUS error code + * + * NOTES + * length must be a multiple of RTL_ENCRYPT_MEMORY_SIZE. + * If flags are specified when encrypting, the same flag value must be given + * when decrypting the memory. + */ +NTSTATUS WINAPI SystemFunction041(PVOID memory, ULONG length, ULONG flags) +{ + FIXME("(%p, %x, %x): stub [RtlDecryptMemory]\n", memory, length, flags); + return STATUS_SUCCESS; +} +#endif /* !__REACTOS __ */ diff --git a/reactos/dll/win32/advapi32/crypt/crypt.h b/reactos/dll/win32/advapi32/crypt/crypt.h index cfbb98758c3..a3e4f0a14ca 100644 --- a/reactos/dll/win32/advapi32/crypt/crypt.h +++ b/reactos/dll/win32/advapi32/crypt/crypt.h @@ -57,6 +57,8 @@ typedef struct tagPROVFUNCS } PROVFUNCS, *PPROVFUNCS; #define MAGIC_CRYPTPROV 0xA39E741F +#define MAGIC_CRYPTKEY 0xA39E741E +#define MAGIC_CRYPTHASH 0xA39E741D typedef struct tagCRYPTPROV { @@ -70,12 +72,14 @@ typedef struct tagCRYPTPROV typedef struct tagCRYPTKEY { + DWORD dwMagic; PCRYPTPROV pProvider; HCRYPTKEY hPrivate; /*CSP's handle - Should not be given to application under any circumstances!*/ } CRYPTKEY, *PCRYPTKEY; typedef struct tagCRYPTHASH { + DWORD dwMagic; PCRYPTPROV pProvider; HCRYPTHASH hPrivate; /*CSP's handle - Should not be given to application under any circumstances!*/ } CRYPTHASH, *PCRYPTHASH; @@ -83,9 +87,9 @@ typedef struct tagCRYPTHASH #define MAXPROVTYPES 999 extern unsigned char *CRYPT_DEShash( unsigned char *dst, const unsigned char *key, - const unsigned char *src ); + const unsigned char *src ) DECLSPEC_HIDDEN; extern unsigned char *CRYPT_DESunhash( unsigned char *dst, const unsigned char *key, - const unsigned char *src ); + const unsigned char *src ) DECLSPEC_HIDDEN; void byteReverse(unsigned char *buf, unsigned longs); struct ustring { @@ -111,7 +115,6 @@ VOID WINAPI MD4Update( MD4_CTX *ctx, const unsigned char *buf, unsigned int len VOID WINAPI MD4Final(MD4_CTX *ctx); void arc4_init(arc4_info *a4i, const BYTE *key, unsigned int keyLen); void arc4_ProcessString(arc4_info *a4i, BYTE *inoutString, unsigned int length); -NTSTATUS WINAPI SystemFunction032(struct ustring *data, struct ustring *key); - +NTSTATUS WINAPI SystemFunction032(struct ustring *data, const struct ustring *key); #endif /* __WINE_CRYPT_H_ */ diff --git a/reactos/dll/win32/advapi32/crypt/crypt_arc4.c b/reactos/dll/win32/advapi32/crypt/crypt_arc4.c index 7d2381b4583..f38783bf673 100644 --- a/reactos/dll/win32/advapi32/crypt/crypt_arc4.c +++ b/reactos/dll/win32/advapi32/crypt/crypt_arc4.c @@ -17,6 +17,7 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + /* http://cryptopp.sourceforge.net/docs/ref521/arc4_8cpp-source.html */ #include @@ -65,3 +66,30 @@ void arc4_ProcessString(arc4_info *a4i, BYTE *inoutString, unsigned int length) a4i->y = y; } +#ifndef __REACTOS__ +/****************************************************************************** + * SystemFunction032 [ADVAPI32.@] + * + * Encrypts a string data using ARC4 + * + * PARAMS + * data [I/O] data to encrypt + * key [I] key data + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_UNSUCCESSFUL + * + * NOTES + * see http://web.it.kth.se/~rom/ntsec.html#crypto-strongavail + */ +NTSTATUS WINAPI SystemFunction032(struct ustring *data, const struct ustring *key) +{ + arc4_info a4i; + + arc4_init(&a4i, key->Buffer, key->Length); + arc4_ProcessString(&a4i, data->Buffer, data->Length); + + return STATUS_SUCCESS; +} +#endif diff --git a/reactos/dll/win32/advapi32/crypt/crypt_lmhash.c b/reactos/dll/win32/advapi32/crypt/crypt_lmhash.c index 129c9842075..e5d04b110ac 100644 --- a/reactos/dll/win32/advapi32/crypt/crypt_lmhash.c +++ b/reactos/dll/win32/advapi32/crypt/crypt_lmhash.c @@ -45,3 +45,355 @@ NTSTATUS WINAPI SystemFunction006( LPCSTR password, LPSTR hash ) return STATUS_SUCCESS; } + +#ifndef __REACTOS__ +/****************************************************************************** + * SystemFunction008 [ADVAPI32.@] + * + * Creates a LM response from a challenge and a password hash + * + * PARAMS + * challenge [I] Challenge from authentication server + * hash [I] NTLM hash (from SystemFunction006) + * response [O] response to send back to the server + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_UNSUCCESSFUL + * + * NOTES + * see http://davenport.sourceforge.net/ntlm.html#theLmResponse + * + */ +NTSTATUS WINAPI SystemFunction008(const BYTE *challenge, const BYTE *hash, LPBYTE response) +{ + BYTE key[7*3]; + + if (!challenge || !response) + return STATUS_UNSUCCESSFUL; + + memset(key, 0, sizeof key); + memcpy(key, hash, 0x10); + + CRYPT_DEShash(response, key, challenge); + CRYPT_DEShash(response+8, key+7, challenge); + CRYPT_DEShash(response+16, key+14, challenge); + + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction009 [ADVAPI32.@] + * + * Seems to do the same as SystemFunction008 ... + */ +NTSTATUS WINAPI SystemFunction009(const BYTE *challenge, const BYTE *hash, LPBYTE response) +{ + return SystemFunction008(challenge, hash, response); +} + +/****************************************************************************** + * SystemFunction001 [ADVAPI32.@] + * + * Encrypts a single block of data using DES + * + * PARAMS + * data [I] data to encrypt (8 bytes) + * key [I] key data (7 bytes) + * output [O] the encrypted data (8 bytes) + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_UNSUCCESSFUL + * + */ +NTSTATUS WINAPI SystemFunction001(const BYTE *data, const BYTE *key, LPBYTE output) +{ + if (!data || !output) + return STATUS_UNSUCCESSFUL; + CRYPT_DEShash(output, key, data); + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction002 [ADVAPI32.@] + * + * Decrypts a single block of data using DES + * + * PARAMS + * data [I] data to decrypt (8 bytes) + * key [I] key data (7 bytes) + * output [O] the decrypted data (8 bytes) + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_UNSUCCESSFUL + * + */ +NTSTATUS WINAPI SystemFunction002(const BYTE *data, const BYTE *key, LPBYTE output) +{ + if (!data || !output) + return STATUS_UNSUCCESSFUL; + CRYPT_DESunhash(output, key, data); + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction003 [ADVAPI32.@] + * + * Hashes a key using DES and a fixed datablock + * + * PARAMS + * key [I] key data (7 bytes) + * output [O] hashed key (8 bytes) + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_UNSUCCESSFUL + * + */ +NTSTATUS WINAPI SystemFunction003(const BYTE *key, LPBYTE output) +{ + if (!output) + return STATUS_UNSUCCESSFUL; + CRYPT_DEShash(output, key, CRYPT_LMhash_Magic); + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction004 [ADVAPI32.@] + * + * Encrypts a block of data with DES in ECB mode, preserving the length + * + * PARAMS + * data [I] data to encrypt + * key [I] key data (up to 7 bytes) + * output [O] buffer to receive encrypted data + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_BUFFER_TOO_SMALL if the output buffer is too small + * Failure: STATUS_INVALID_PARAMETER_2 if the key is zero length + * + * NOTES + * Encrypt buffer size should be input size rounded up to 8 bytes + * plus an extra 8 bytes. + */ +NTSTATUS WINAPI SystemFunction004(const struct ustring *in, + const struct ustring *key, + struct ustring *out) +{ + union { + unsigned char uc[8]; + unsigned int ui[2]; + } data; + unsigned char deskey[7]; + unsigned int crypt_len, ofs; + + if (key->Length<=0) + return STATUS_INVALID_PARAMETER_2; + + crypt_len = ((in->Length+7)&~7); + if (out->MaximumLength < (crypt_len+8)) + return STATUS_BUFFER_TOO_SMALL; + + data.ui[0] = in->Length; + data.ui[1] = 1; + + if (key->LengthBuffer, key->Length); + } + else + memcpy(deskey, key->Buffer, sizeof deskey); + + CRYPT_DEShash(out->Buffer, deskey, data.uc); + + for(ofs=0; ofs<(crypt_len-8); ofs+=8) + CRYPT_DEShash(out->Buffer+8+ofs, deskey, in->Buffer+ofs); + + memset(data.uc, 0, sizeof data.uc); + memcpy(data.uc, in->Buffer+ofs, in->Length +8-crypt_len); + CRYPT_DEShash(out->Buffer+8+ofs, deskey, data.uc); + + out->Length = crypt_len+8; + + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction005 [ADVAPI32.@] + * + * Decrypts a block of data with DES in ECB mode + * + * PARAMS + * data [I] data to decrypt + * key [I] key data (up to 7 bytes) + * output [O] buffer to receive decrypted data + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_BUFFER_TOO_SMALL if the output buffer is too small + * Failure: STATUS_INVALID_PARAMETER_2 if the key is zero length + * + */ +NTSTATUS WINAPI SystemFunction005(const struct ustring *in, + const struct ustring *key, + struct ustring *out) +{ + union { + unsigned char uc[8]; + unsigned int ui[2]; + } data; + unsigned char deskey[7]; + unsigned int ofs, crypt_len; + + if (key->Length<=0) + return STATUS_INVALID_PARAMETER_2; + + if (key->LengthBuffer, key->Length); + } + else + memcpy(deskey, key->Buffer, sizeof deskey); + + CRYPT_DESunhash(data.uc, deskey, in->Buffer); + + if (data.ui[1] != 1) + return STATUS_UNKNOWN_REVISION; + + crypt_len = data.ui[0]; + if (crypt_len > out->MaximumLength) + return STATUS_BUFFER_TOO_SMALL; + + for (ofs=0; (ofs+8)Buffer+ofs, deskey, in->Buffer+ofs+8); + + if (ofsBuffer+ofs+8); + memcpy(out->Buffer+ofs, data.uc, crypt_len-ofs); + } + + out->Length = crypt_len; + + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction012 [ADVAPI32.@] + * SystemFunction014 [ADVAPI32.@] + * SystemFunction016 [ADVAPI32.@] + * SystemFunction018 [ADVAPI32.@] + * SystemFunction020 [ADVAPI32.@] + * SystemFunction022 [ADVAPI32.@] + * + * Encrypts two DES blocks with two keys + * + * PARAMS + * data [I] data to encrypt (16 bytes) + * key [I] key data (two lots of 7 bytes) + * output [O] buffer to receive encrypted data (16 bytes) + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_UNSUCCESSFUL if the input or output buffer is NULL + */ +NTSTATUS WINAPI SystemFunction012(const BYTE *in, const BYTE *key, LPBYTE out) +{ + if (!in || !out) + return STATUS_UNSUCCESSFUL; + + CRYPT_DEShash(out, key, in); + CRYPT_DEShash(out+8, key+7, in+8); + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction013 [ADVAPI32.@] + * SystemFunction015 [ADVAPI32.@] + * SystemFunction017 [ADVAPI32.@] + * SystemFunction019 [ADVAPI32.@] + * SystemFunction021 [ADVAPI32.@] + * SystemFunction023 [ADVAPI32.@] + * + * Decrypts two DES blocks with two keys + * + * PARAMS + * data [I] data to decrypt (16 bytes) + * key [I] key data (two lots of 7 bytes) + * output [O] buffer to receive decrypted data (16 bytes) + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_UNSUCCESSFUL if the input or output buffer is NULL + */ +NTSTATUS WINAPI SystemFunction013(const BYTE *in, const BYTE *key, LPBYTE out) +{ + if (!in || !out) + return STATUS_UNSUCCESSFUL; + + CRYPT_DESunhash(out, key, in); + CRYPT_DESunhash(out+8, key+7, in+8); + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction024 [ADVAPI32.@] + * + * Encrypts two DES blocks with a 32 bit key... + * + * PARAMS + * data [I] data to encrypt (16 bytes) + * key [I] key data (4 bytes) + * output [O] buffer to receive encrypted data (16 bytes) + * + * RETURNS + * Success: STATUS_SUCCESS + */ +NTSTATUS WINAPI SystemFunction024(const BYTE *in, const BYTE *key, LPBYTE out) +{ + BYTE deskey[0x10]; + + memcpy(deskey, key, 4); + memcpy(deskey+4, key, 4); + memcpy(deskey+8, key, 4); + memcpy(deskey+12, key, 4); + + CRYPT_DEShash(out, deskey, in); + CRYPT_DEShash(out+8, deskey+7, in+8); + + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction025 [ADVAPI32.@] + * + * Decrypts two DES blocks with a 32 bit key... + * + * PARAMS + * data [I] data to encrypt (16 bytes) + * key [I] key data (4 bytes) + * output [O] buffer to receive encrypted data (16 bytes) + * + * RETURNS + * Success: STATUS_SUCCESS + */ +NTSTATUS WINAPI SystemFunction025(const BYTE *in, const BYTE *key, LPBYTE out) +{ + BYTE deskey[0x10]; + + memcpy(deskey, key, 4); + memcpy(deskey+4, key, 4); + memcpy(deskey+8, key, 4); + memcpy(deskey+12, key, 4); + + CRYPT_DESunhash(out, deskey, in); + CRYPT_DESunhash(out+8, deskey+7, in+8); + + return STATUS_SUCCESS; +} +#endif /* !__REACTOS__ */ diff --git a/reactos/dll/win32/advapi32/crypt/crypt_md4.c b/reactos/dll/win32/advapi32/crypt/crypt_md4.c index b32eebd6184..9726a425c3d 100644 --- a/reactos/dll/win32/advapi32/crypt/crypt_md4.c +++ b/reactos/dll/win32/advapi32/crypt/crypt_md4.c @@ -35,95 +35,7 @@ #include -/* The three core functions */ - -#define rotl32(x,n) (((x) << ((unsigned int)(n))) | ((x) >> (32 - (unsigned int)(n)))) - -#define F( x, y, z ) (((x) & (y)) | ((~x) & (z))) -#define G( x, y, z ) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) -#define H( x, y, z ) ((x) ^ (y) ^ (z)) - -#define FF( a, b, c, d, x, s ) { \ - (a) += F( (b), (c), (d) ) + (x); \ - (a) = rotl32( (a), (s) ); \ - } -#define GG( a, b, c, d, x, s ) { \ - (a) += G( (b), (c), (d) ) + (x) + (unsigned int)0x5a827999; \ - (a) = rotl32( (a), (s) ); \ - } -#define HH( a, b, c, d, x, s ) { \ - (a) += H( (b), (c), (d) ) + (x) + (unsigned int)0x6ed9eba1; \ - (a) = rotl32( (a), (s) ); \ - } - -/* - * The core of the MD4 algorithm - */ -static void MD4Transform( unsigned int buf[4], const unsigned int in[16] ) -{ - register unsigned int a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - FF( a, b, c, d, in[0], 3 ); - FF( d, a, b, c, in[1], 7 ); - FF( c, d, a, b, in[2], 11 ); - FF( b, c, d, a, in[3], 19 ); - FF( a, b, c, d, in[4], 3 ); - FF( d, a, b, c, in[5], 7 ); - FF( c, d, a, b, in[6], 11 ); - FF( b, c, d, a, in[7], 19 ); - FF( a, b, c, d, in[8], 3 ); - FF( d, a, b, c, in[9], 7 ); - FF( c, d, a, b, in[10], 11 ); - FF( b, c, d, a, in[11], 19 ); - FF( a, b, c, d, in[12], 3 ); - FF( d, a, b, c, in[13], 7 ); - FF( c, d, a, b, in[14], 11 ); - FF( b, c, d, a, in[15], 19 ); - - GG( a, b, c, d, in[0], 3 ); - GG( d, a, b, c, in[4], 5 ); - GG( c, d, a, b, in[8], 9 ); - GG( b, c, d, a, in[12], 13 ); - GG( a, b, c, d, in[1], 3 ); - GG( d, a, b, c, in[5], 5 ); - GG( c, d, a, b, in[9], 9 ); - GG( b, c, d, a, in[13], 13 ); - GG( a, b, c, d, in[2], 3 ); - GG( d, a, b, c, in[6], 5 ); - GG( c, d, a, b, in[10], 9 ); - GG( b, c, d, a, in[14], 13 ); - GG( a, b, c, d, in[3], 3 ); - GG( d, a, b, c, in[7], 5 ); - GG( c, d, a, b, in[11], 9 ); - GG( b, c, d, a, in[15], 13 ); - - HH( a, b, c, d, in[0], 3 ); - HH( d, a, b, c, in[8], 9 ); - HH( c, d, a, b, in[4], 11 ); - HH( b, c, d, a, in[12], 15 ); - HH( a, b, c, d, in[2], 3 ); - HH( d, a, b, c, in[10], 9 ); - HH( c, d, a, b, in[6], 11 ); - HH( b, c, d, a, in[14], 15 ); - HH( a, b, c, d, in[1], 3 ); - HH( d, a, b, c, in[9], 9 ); - HH( c, d, a, b, in[5], 11 ); - HH( b, c, d, a, in[13], 15 ); - HH( a, b, c, d, in[3], 3 ); - HH( d, a, b, c, in[11], 9 ); - HH( c, d, a, b, in[7], 11 ); - HH( b, c, d, a, in[15], 15 ); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} +static void MD4Transform( unsigned int buf[4], unsigned int const in[16] ); /* * Start MD4 accumulation. Set bit count to 0 and buffer to mysterious @@ -240,3 +152,149 @@ VOID WINAPI MD4Final( MD4_CTX *ctx ) byteReverse( (unsigned char *)ctx->buf, 4 ); memcpy( ctx->digest, ctx->buf, 16 ); } + +/* The three core functions */ + +#define rotl32(x,n) (((x) << ((unsigned int)(n))) | ((x) >> (32 - (unsigned int)(n)))) + +#define F( x, y, z ) (((x) & (y)) | ((~x) & (z))) +#define G( x, y, z ) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) +#define H( x, y, z ) ((x) ^ (y) ^ (z)) + +#define FF( a, b, c, d, x, s ) { \ + (a) += F( (b), (c), (d) ) + (x); \ + (a) = rotl32( (a), (s) ); \ + } +#define GG( a, b, c, d, x, s ) { \ + (a) += G( (b), (c), (d) ) + (x) + (unsigned int)0x5a827999; \ + (a) = rotl32( (a), (s) ); \ + } +#define HH( a, b, c, d, x, s ) { \ + (a) += H( (b), (c), (d) ) + (x) + (unsigned int)0x6ed9eba1; \ + (a) = rotl32( (a), (s) ); \ + } + +/* + * The core of the MD4 algorithm + */ +static void MD4Transform( unsigned int buf[4], const unsigned int in[16] ) +{ + register unsigned int a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + FF( a, b, c, d, in[0], 3 ); + FF( d, a, b, c, in[1], 7 ); + FF( c, d, a, b, in[2], 11 ); + FF( b, c, d, a, in[3], 19 ); + FF( a, b, c, d, in[4], 3 ); + FF( d, a, b, c, in[5], 7 ); + FF( c, d, a, b, in[6], 11 ); + FF( b, c, d, a, in[7], 19 ); + FF( a, b, c, d, in[8], 3 ); + FF( d, a, b, c, in[9], 7 ); + FF( c, d, a, b, in[10], 11 ); + FF( b, c, d, a, in[11], 19 ); + FF( a, b, c, d, in[12], 3 ); + FF( d, a, b, c, in[13], 7 ); + FF( c, d, a, b, in[14], 11 ); + FF( b, c, d, a, in[15], 19 ); + + GG( a, b, c, d, in[0], 3 ); + GG( d, a, b, c, in[4], 5 ); + GG( c, d, a, b, in[8], 9 ); + GG( b, c, d, a, in[12], 13 ); + GG( a, b, c, d, in[1], 3 ); + GG( d, a, b, c, in[5], 5 ); + GG( c, d, a, b, in[9], 9 ); + GG( b, c, d, a, in[13], 13 ); + GG( a, b, c, d, in[2], 3 ); + GG( d, a, b, c, in[6], 5 ); + GG( c, d, a, b, in[10], 9 ); + GG( b, c, d, a, in[14], 13 ); + GG( a, b, c, d, in[3], 3 ); + GG( d, a, b, c, in[7], 5 ); + GG( c, d, a, b, in[11], 9 ); + GG( b, c, d, a, in[15], 13 ); + + HH( a, b, c, d, in[0], 3 ); + HH( d, a, b, c, in[8], 9 ); + HH( c, d, a, b, in[4], 11 ); + HH( b, c, d, a, in[12], 15 ); + HH( a, b, c, d, in[2], 3 ); + HH( d, a, b, c, in[10], 9 ); + HH( c, d, a, b, in[6], 11 ); + HH( b, c, d, a, in[14], 15 ); + HH( a, b, c, d, in[1], 3 ); + HH( d, a, b, c, in[9], 9 ); + HH( c, d, a, b, in[5], 11 ); + HH( b, c, d, a, in[13], 15 ); + HH( a, b, c, d, in[3], 3 ); + HH( d, a, b, c, in[11], 9 ); + HH( c, d, a, b, in[7], 11 ); + HH( b, c, d, a, in[15], 15 ); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +#ifndef __REACTOS__ +/****************************************************************************** + * SystemFunction007 [ADVAPI32.@] + * + * MD4 hash a unicode string + * + * PARAMS + * string [I] the string to hash + * output [O] the md4 hash of the string (16 bytes) + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_UNSUCCESSFUL + * + */ +NTSTATUS WINAPI SystemFunction007(const UNICODE_STRING *string, LPBYTE hash) +{ + MD4_CTX ctx; + + MD4Init( &ctx ); + MD4Update( &ctx, (const BYTE *)string->Buffer, string->Length ); + MD4Final( &ctx ); + memcpy( hash, ctx.digest, 0x10 ); + + return STATUS_SUCCESS; +} + +/****************************************************************************** + * SystemFunction010 [ADVAPI32.@] + * SystemFunction011 [ADVAPI32.@] + * + * MD4 hashes 16 bytes of data + * + * PARAMS + * unknown [] seems to have no effect on the output + * data [I] pointer to data to hash (16 bytes) + * output [O] the md4 hash of the data (16 bytes) + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_UNSUCCESSFUL + * + */ +NTSTATUS WINAPI SystemFunction010(LPVOID unknown, const BYTE *data, LPBYTE hash) +{ + MD4_CTX ctx; + + MD4Init( &ctx ); + MD4Update( &ctx, data, 0x10 ); + MD4Final( &ctx ); + memcpy( hash, ctx.digest, 0x10 ); + + return STATUS_SUCCESS; +} +#endif /* !__REACTOS__ */ diff --git a/reactos/dll/win32/advapi32/crypt/crypt_md5.c b/reactos/dll/win32/advapi32/crypt/crypt_md5.c index 1837eb023a8..52648f786a1 100644 --- a/reactos/dll/win32/advapi32/crypt/crypt_md5.c +++ b/reactos/dll/win32/advapi32/crypt/crypt_md5.c @@ -43,106 +43,7 @@ typedef struct unsigned char digest[16]; } MD5_CTX; - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1( x, y, z ) (x & y | ~x & z) */ -#define F1( x, y, z ) (z ^ (x & (y ^ z))) -#define F2( x, y, z ) F1( z, x, y ) -#define F3( x, y, z ) (x ^ y ^ z) -#define F4( x, y, z ) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP( f, w, x, y, z, data, s ) \ - ( w += f( x, y, z ) + data, w = w << s | w >> (32 - s), w += x ) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. MD5Update blocks - * the data and converts bytes into longwords for this routine. - */ -static void MD5Transform( unsigned int buf[4], const unsigned int in[16] ) -{ - register unsigned int a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP( F1, a, b, c, d, in[0] + 0xd76aa478, 7 ); - MD5STEP( F1, d, a, b, c, in[1] + 0xe8c7b756, 12 ); - MD5STEP( F1, c, d, a, b, in[2] + 0x242070db, 17 ); - MD5STEP( F1, b, c, d, a, in[3] + 0xc1bdceee, 22 ); - MD5STEP( F1, a, b, c, d, in[4] + 0xf57c0faf, 7 ); - MD5STEP( F1, d, a, b, c, in[5] + 0x4787c62a, 12 ); - MD5STEP( F1, c, d, a, b, in[6] + 0xa8304613, 17 ); - MD5STEP( F1, b, c, d, a, in[7] + 0xfd469501, 22 ); - MD5STEP( F1, a, b, c, d, in[8] + 0x698098d8, 7 ); - MD5STEP( F1, d, a, b, c, in[9] + 0x8b44f7af, 12 ); - MD5STEP( F1, c, d, a, b, in[10] + 0xffff5bb1, 17 ); - MD5STEP( F1, b, c, d, a, in[11] + 0x895cd7be, 22 ); - MD5STEP( F1, a, b, c, d, in[12] + 0x6b901122, 7 ); - MD5STEP( F1, d, a, b, c, in[13] + 0xfd987193, 12 ); - MD5STEP( F1, c, d, a, b, in[14] + 0xa679438e, 17 ); - MD5STEP( F1, b, c, d, a, in[15] + 0x49b40821, 22 ); - - MD5STEP( F2, a, b, c, d, in[1] + 0xf61e2562, 5 ); - MD5STEP( F2, d, a, b, c, in[6] + 0xc040b340, 9 ); - MD5STEP( F2, c, d, a, b, in[11] + 0x265e5a51, 14 ); - MD5STEP( F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20 ); - MD5STEP( F2, a, b, c, d, in[5] + 0xd62f105d, 5 ); - MD5STEP( F2, d, a, b, c, in[10] + 0x02441453, 9 ); - MD5STEP( F2, c, d, a, b, in[15] + 0xd8a1e681, 14 ); - MD5STEP( F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20 ); - MD5STEP( F2, a, b, c, d, in[9] + 0x21e1cde6, 5 ); - MD5STEP( F2, d, a, b, c, in[14] + 0xc33707d6, 9 ); - MD5STEP( F2, c, d, a, b, in[3] + 0xf4d50d87, 14 ); - MD5STEP( F2, b, c, d, a, in[8] + 0x455a14ed, 20 ); - MD5STEP( F2, a, b, c, d, in[13] + 0xa9e3e905, 5 ); - MD5STEP( F2, d, a, b, c, in[2] + 0xfcefa3f8, 9 ); - MD5STEP( F2, c, d, a, b, in[7] + 0x676f02d9, 14 ); - MD5STEP( F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20 ); - - MD5STEP( F3, a, b, c, d, in[5] + 0xfffa3942, 4 ); - MD5STEP( F3, d, a, b, c, in[8] + 0x8771f681, 11 ); - MD5STEP( F3, c, d, a, b, in[11] + 0x6d9d6122, 16 ); - MD5STEP( F3, b, c, d, a, in[14] + 0xfde5380c, 23 ); - MD5STEP( F3, a, b, c, d, in[1] + 0xa4beea44, 4 ); - MD5STEP( F3, d, a, b, c, in[4] + 0x4bdecfa9, 11 ); - MD5STEP( F3, c, d, a, b, in[7] + 0xf6bb4b60, 16 ); - MD5STEP( F3, b, c, d, a, in[10] + 0xbebfbc70, 23 ); - MD5STEP( F3, a, b, c, d, in[13] + 0x289b7ec6, 4 ); - MD5STEP( F3, d, a, b, c, in[0] + 0xeaa127fa, 11 ); - MD5STEP( F3, c, d, a, b, in[3] + 0xd4ef3085, 16 ); - MD5STEP( F3, b, c, d, a, in[6] + 0x04881d05, 23 ); - MD5STEP( F3, a, b, c, d, in[9] + 0xd9d4d039, 4 ); - MD5STEP( F3, d, a, b, c, in[12] + 0xe6db99e5, 11 ); - MD5STEP( F3, c, d, a, b, in[15] + 0x1fa27cf8, 16 ); - MD5STEP( F3, b, c, d, a, in[2] + 0xc4ac5665, 23 ); - - MD5STEP( F4, a, b, c, d, in[0] + 0xf4292244, 6 ); - MD5STEP( F4, d, a, b, c, in[7] + 0x432aff97, 10 ); - MD5STEP( F4, c, d, a, b, in[14] + 0xab9423a7, 15 ); - MD5STEP( F4, b, c, d, a, in[5] + 0xfc93a039, 21 ); - MD5STEP( F4, a, b, c, d, in[12] + 0x655b59c3, 6 ); - MD5STEP( F4, d, a, b, c, in[3] + 0x8f0ccc92, 10 ); - MD5STEP( F4, c, d, a, b, in[10] + 0xffeff47d, 15 ); - MD5STEP( F4, b, c, d, a, in[1] + 0x85845dd1, 21 ); - MD5STEP( F4, a, b, c, d, in[8] + 0x6fa87e4f, 6 ); - MD5STEP( F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10 ); - MD5STEP( F4, c, d, a, b, in[6] + 0xa3014314, 15 ); - MD5STEP( F4, b, c, d, a, in[13] + 0x4e0811a1, 21 ); - MD5STEP( F4, a, b, c, d, in[4] + 0xf7537e82, 6 ); - MD5STEP( F4, d, a, b, c, in[11] + 0xbd3af235, 10 ); - MD5STEP( F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15 ); - MD5STEP( F4, b, c, d, a, in[9] + 0xeb86d391, 21 ); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} +static void MD5Transform( unsigned int buf[4], const unsigned int in[16] ); /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious @@ -259,3 +160,103 @@ VOID WINAPI MD5Final( MD5_CTX *ctx ) byteReverse( (unsigned char *)ctx->buf, 4 ); memcpy( ctx->digest, ctx->buf, 16 ); } + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1( x, y, z ) (x & y | ~x & z) */ +#define F1( x, y, z ) (z ^ (x & (y ^ z))) +#define F2( x, y, z ) F1( z, x, y ) +#define F3( x, y, z ) (x ^ y ^ z) +#define F4( x, y, z ) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP( f, w, x, y, z, data, s ) \ + ( w += f( x, y, z ) + data, w = w << s | w >> (32 - s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void MD5Transform( unsigned int buf[4], const unsigned int in[16] ) +{ + register unsigned int a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP( F1, a, b, c, d, in[0] + 0xd76aa478, 7 ); + MD5STEP( F1, d, a, b, c, in[1] + 0xe8c7b756, 12 ); + MD5STEP( F1, c, d, a, b, in[2] + 0x242070db, 17 ); + MD5STEP( F1, b, c, d, a, in[3] + 0xc1bdceee, 22 ); + MD5STEP( F1, a, b, c, d, in[4] + 0xf57c0faf, 7 ); + MD5STEP( F1, d, a, b, c, in[5] + 0x4787c62a, 12 ); + MD5STEP( F1, c, d, a, b, in[6] + 0xa8304613, 17 ); + MD5STEP( F1, b, c, d, a, in[7] + 0xfd469501, 22 ); + MD5STEP( F1, a, b, c, d, in[8] + 0x698098d8, 7 ); + MD5STEP( F1, d, a, b, c, in[9] + 0x8b44f7af, 12 ); + MD5STEP( F1, c, d, a, b, in[10] + 0xffff5bb1, 17 ); + MD5STEP( F1, b, c, d, a, in[11] + 0x895cd7be, 22 ); + MD5STEP( F1, a, b, c, d, in[12] + 0x6b901122, 7 ); + MD5STEP( F1, d, a, b, c, in[13] + 0xfd987193, 12 ); + MD5STEP( F1, c, d, a, b, in[14] + 0xa679438e, 17 ); + MD5STEP( F1, b, c, d, a, in[15] + 0x49b40821, 22 ); + + MD5STEP( F2, a, b, c, d, in[1] + 0xf61e2562, 5 ); + MD5STEP( F2, d, a, b, c, in[6] + 0xc040b340, 9 ); + MD5STEP( F2, c, d, a, b, in[11] + 0x265e5a51, 14 ); + MD5STEP( F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20 ); + MD5STEP( F2, a, b, c, d, in[5] + 0xd62f105d, 5 ); + MD5STEP( F2, d, a, b, c, in[10] + 0x02441453, 9 ); + MD5STEP( F2, c, d, a, b, in[15] + 0xd8a1e681, 14 ); + MD5STEP( F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20 ); + MD5STEP( F2, a, b, c, d, in[9] + 0x21e1cde6, 5 ); + MD5STEP( F2, d, a, b, c, in[14] + 0xc33707d6, 9 ); + MD5STEP( F2, c, d, a, b, in[3] + 0xf4d50d87, 14 ); + MD5STEP( F2, b, c, d, a, in[8] + 0x455a14ed, 20 ); + MD5STEP( F2, a, b, c, d, in[13] + 0xa9e3e905, 5 ); + MD5STEP( F2, d, a, b, c, in[2] + 0xfcefa3f8, 9 ); + MD5STEP( F2, c, d, a, b, in[7] + 0x676f02d9, 14 ); + MD5STEP( F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20 ); + + MD5STEP( F3, a, b, c, d, in[5] + 0xfffa3942, 4 ); + MD5STEP( F3, d, a, b, c, in[8] + 0x8771f681, 11 ); + MD5STEP( F3, c, d, a, b, in[11] + 0x6d9d6122, 16 ); + MD5STEP( F3, b, c, d, a, in[14] + 0xfde5380c, 23 ); + MD5STEP( F3, a, b, c, d, in[1] + 0xa4beea44, 4 ); + MD5STEP( F3, d, a, b, c, in[4] + 0x4bdecfa9, 11 ); + MD5STEP( F3, c, d, a, b, in[7] + 0xf6bb4b60, 16 ); + MD5STEP( F3, b, c, d, a, in[10] + 0xbebfbc70, 23 ); + MD5STEP( F3, a, b, c, d, in[13] + 0x289b7ec6, 4 ); + MD5STEP( F3, d, a, b, c, in[0] + 0xeaa127fa, 11 ); + MD5STEP( F3, c, d, a, b, in[3] + 0xd4ef3085, 16 ); + MD5STEP( F3, b, c, d, a, in[6] + 0x04881d05, 23 ); + MD5STEP( F3, a, b, c, d, in[9] + 0xd9d4d039, 4 ); + MD5STEP( F3, d, a, b, c, in[12] + 0xe6db99e5, 11 ); + MD5STEP( F3, c, d, a, b, in[15] + 0x1fa27cf8, 16 ); + MD5STEP( F3, b, c, d, a, in[2] + 0xc4ac5665, 23 ); + + MD5STEP( F4, a, b, c, d, in[0] + 0xf4292244, 6 ); + MD5STEP( F4, d, a, b, c, in[7] + 0x432aff97, 10 ); + MD5STEP( F4, c, d, a, b, in[14] + 0xab9423a7, 15 ); + MD5STEP( F4, b, c, d, a, in[5] + 0xfc93a039, 21 ); + MD5STEP( F4, a, b, c, d, in[12] + 0x655b59c3, 6 ); + MD5STEP( F4, d, a, b, c, in[3] + 0x8f0ccc92, 10 ); + MD5STEP( F4, c, d, a, b, in[10] + 0xffeff47d, 15 ); + MD5STEP( F4, b, c, d, a, in[1] + 0x85845dd1, 21 ); + MD5STEP( F4, a, b, c, d, in[8] + 0x6fa87e4f, 6 ); + MD5STEP( F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10 ); + MD5STEP( F4, c, d, a, b, in[6] + 0xa3014314, 15 ); + MD5STEP( F4, b, c, d, a, in[13] + 0x4e0811a1, 21 ); + MD5STEP( F4, a, b, c, d, in[4] + 0xf7537e82, 6 ); + MD5STEP( F4, d, a, b, c, in[11] + 0xbd3af235, 10 ); + MD5STEP( F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15 ); + MD5STEP( F4, b, c, d, a, in[9] + 0xeb86d391, 21 ); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} diff --git a/reactos/dll/win32/advapi32/misc/sysfunc.c b/reactos/dll/win32/advapi32/misc/sysfunc.c index 97d4ad24403..d105b64ea54 100644 --- a/reactos/dll/win32/advapi32/misc/sysfunc.c +++ b/reactos/dll/win32/advapi32/misc/sysfunc.c @@ -477,7 +477,7 @@ SystemFunction029(INT a, INT b) * FALSE if blocks are different */ BOOL -WINAPI SystemFunction030(PVOID b1, PVOID b2) +WINAPI SystemFunction030(LPCVOID b1, LPCVOID b2) { return !memcmp(b1, b2, 0x10); } @@ -500,7 +500,7 @@ WINAPI SystemFunction030(PVOID b1, PVOID b2) * see http://web.it.kth.se/~rom/ntsec.html#crypto-strongavail */ NTSTATUS -WINAPI SystemFunction032(struct ustring *data, struct ustring *key) +WINAPI SystemFunction032(struct ustring *data, const struct ustring *key) { arc4_info a4i; @@ -540,15 +540,19 @@ SystemFunction034(INT a, INT b) } -/********************************************************************** +/****************************************************************************** + * SystemFunction035 (ADVAPI32.@) * - * @unimplemented + * Described here: +http://disc.server.com/discussion.cgi?disc=148775;article=942;title=Coding%2FASM%2FSystem + * + * NOTES + * Stub, always return TRUE. */ -BOOL -WINAPI -SystemFunction035(LPCSTR lpszDllFilePath) +BOOL WINAPI SystemFunction035(LPCSTR lpszDllFilePath) { - return TRUE; + //FIXME("%s: stub\n", debugstr_a(lpszDllFilePath)); + return TRUE; } /****************************************************************************** @@ -616,32 +620,56 @@ SystemFunction036(PVOID pbBuffer, ULONG dwLen) /****************************************************************************** * SystemFunction040 (ADVAPI32.@) * - * PARAMS: - * memory : pointer to memory to encrypt - * length : length of region to encrypt, in bytes. must be multiple of RTL_ENCRYPT_MEMORY_SIZE - * flags : RTL_ENCRYPT_OPTION_SAME_PROCESS | RTL_ENCRYPT_OPTION_CROSS_PROCESS, | RTL_ENCRYPT_OPTION_SAME_LOGON - * control whether other processes are able to decrypt the memory. The same value must be given - * when decrypting the memory. + * MSDN documents this function as RtlEncryptMemory and declares it in ntsecapi.h. + * + * PARAMS + * memory [I/O] Pointer to memory to encrypt. + * length [I] Length of region to encrypt in bytes. + * flags [I] Control whether other processes are able to decrypt the memory. + * RTL_ENCRYPT_OPTION_SAME_PROCESS + * RTL_ENCRYPT_OPTION_CROSS_PROCESS + * RTL_ENCRYPT_OPTION_SAME_LOGON + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: NTSTATUS error code + * + * NOTES + * length must be a multiple of RTL_ENCRYPT_MEMORY_SIZE. + * If flags are specified when encrypting, the same flag value must be given + * when decrypting the memory. */ -NTSTATUS WINAPI SystemFunction040(PVOID memory, ULONG length, ULONG flags) /* RtlEncryptMemory */ +NTSTATUS WINAPI SystemFunction040(PVOID memory, ULONG length, ULONG flags) { - //FIXME("(%p, %lx, %lx): stub [RtlEncryptMemory]\n", memory, length, flags); + //FIXME("(%p, %x, %x): stub [RtlEncryptMemory]\n", memory, length, flags); return STATUS_SUCCESS; } /****************************************************************************** * SystemFunction041 (ADVAPI32.@) * - * PARAMS: - * memory : pointer to memory to decrypt - * length : length of region to decrypt, in bytes. must be multiple of RTL_ENCRYPT_MEMORY_SIZE - * flags : RTL_ENCRYPT_OPTION_SAME_PROCESS | RTL_ENCRYPT_OPTION_CROSS_PROCESS, | RTL_ENCRYPT_OPTION_SAME_LOGON - * control whether other processes are able to decrypt the memory. The same value must be given - * when encrypting the memory. + * MSDN documents this function as RtlDecryptMemory and declares it in ntsecapi.h. + * + * PARAMS + * memory [I/O] Pointer to memory to decrypt. + * length [I] Length of region to decrypt in bytes. + * flags [I] Control whether other processes are able to decrypt the memory. + * RTL_ENCRYPT_OPTION_SAME_PROCESS + * RTL_ENCRYPT_OPTION_CROSS_PROCESS + * RTL_ENCRYPT_OPTION_SAME_LOGON + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: NTSTATUS error code + * + * NOTES + * length must be a multiple of RTL_ENCRYPT_MEMORY_SIZE. + * If flags are specified when encrypting, the same flag value must be given + * when decrypting the memory. */ -NTSTATUS WINAPI SystemFunction041(PVOID memory, ULONG length, ULONG flags) /* RtlDecryptMemory */ +NTSTATUS WINAPI SystemFunction041(PVOID memory, ULONG length, ULONG flags) { - //FIXME("(%p, %lx, %lx): stub [RtlDecryptMemory]\n", memory, length, flags); + //FIXME("(%p, %x, %x): stub [RtlDecryptMemory]\n", memory, length, flags); return STATUS_SUCCESS; } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index c55f8398736..dd7ab5a0d7e 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -249,7 +249,7 @@ check Wine current souces first as it may already be fixed. reactos/lib/3rdparty/strmbase # Synced to Wine-1.7.1 advapi32 - - reactos/dll/win32/advapi32/crypt/*.c # Unknown + reactos/dll/win32/advapi32/crypt/*.c # Synced to Wine-1.7.1 reactos/dll/win32/advapi32/sec/cred.c # Out of Sync reactos/dll/win32/advapi32/sec/sid.c # Out of Sync