/* * Decrypts the WLAN key structure */ int DecodeWLANKeys (WLANKEY **keys, int *numkeys){ unsigned char tmp[3]; unsigned long long *out; unsigned long long *in; unsigned char *wkspace; unsigned long wkspacelen; unsigned long outlen; int i; wkspacelen = 0; RtlGetCompressionWorkSpaceSize( COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM, (ULONG *)&wkspacelen, (ULONG *)&outlen ); wkspace = malloc(wkspacelen); *keys = malloc (WLANKEYDATALEN); if (*keys == NULL || wkspacelen == 0 || wkspace == NULL){ return errno; } tmp[2] = 0; out = (unsigned long long *)(*keys); in = (unsigned long long *)encwlankeys; for (i=0; i < (WLANKEYDATACOMPRLEN + 7) / 8; i++){ in[i] ^= TEA_Rand(enckey, NULL); } outlen = 0; RtlDecompressBuffer( COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM, (UCHAR *)out, WLANKEYDATALEN, (UCHAR *)in, WLANKEYDATACOMPRLEN, &outlen ); if (outlen != WLANKEYDATALEN){ return 1; } if (numkeys != NULL){ *numkeys = WLANKEYDATALEN / sizeof(WLANKEY) - 1; } return ERROR_SUCCESS; }
BOOL kull_m_memory_quick_compress(IN PVOID data, IN DWORD size, IN OUT PVOID *compressedData, IN OUT PDWORD compressedSize) { BOOL status = FALSE; DWORD CompressBufferWorkSpaceSize, CompressFragmentWorkSpaceSize; PVOID WorkSpace; if(NT_SUCCESS(RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM, &CompressBufferWorkSpaceSize, &CompressFragmentWorkSpaceSize))) { if(WorkSpace = LocalAlloc(LPTR, CompressBufferWorkSpaceSize)) { if((*compressedData) = LocalAlloc(LPTR, size)) { status = NT_SUCCESS(RtlCompressBuffer(COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM, (PUCHAR) data, size, (PUCHAR) (*compressedData), size, 4096, compressedSize, WorkSpace)); if(!status) LocalFree(*compressedData); } LocalFree(WorkSpace); } } return status; }
BOOL CompressBuffer(PVOID pvInputBuffer,DWORD dwInputBufferSize,PVOID *ppvOutputBuffer,PDWORD pdwOutputBufferSize) { BOOL bRet = FALSE; DWORD dwCompressBufferWorkSpaceSize; DWORD dwCompressFragmentWorkSpaceSize; NTSTATUS St; St = RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1|COMPRESSION_ENGINE_STANDARD,&dwCompressBufferWorkSpaceSize,&dwCompressFragmentWorkSpaceSize); if (NT_SUCCESS(St)) { PVOID pvWorkSpace = malloc(dwCompressBufferWorkSpaceSize); if (pvWorkSpace) { PVOID pvCompressedBuffer = malloc(ALIGN_UP(dwInputBufferSize,0x1000)); if (pvCompressedBuffer) { St = RtlCompressBuffer(COMPRESSION_FORMAT_LZNT1|COMPRESSION_ENGINE_STANDARD,pvInputBuffer,dwInputBufferSize,pvCompressedBuffer,ALIGN_UP(dwInputBufferSize,0x1000),0x1000,pdwOutputBufferSize,pvWorkSpace); if (bRet = NT_SUCCESS(St)) { *ppvOutputBuffer = pvCompressedBuffer; } else { DbgPrint(__FUNCTION__"(): RtlCompressBuffer failed with status %lx\n",St); free(pvCompressedBuffer); } } free(pvWorkSpace); } } else { DbgPrint(__FUNCTION__"(): RtlGetCompressionWorkSpaceSize failed with status %lx\n",St); } return bRet; }