Форум программистов, компьютерный форум CyberForum.ru

Проблемы с выделением памяти - C++

Восстановить пароль Регистрация
 
Limb0
 Аватар для Limb0
19 / 19 / 0
Регистрация: 22.01.2012
Сообщений: 88
13.10.2013, 15:09     Проблемы с выделением памяти #1
Здравствуйте, я в своем проекте использую эту функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
#include "windows.h"
#include <wincrypt.h>
 
#ifndef CALG_HMAC
#define CALG_HMAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HMAC)
#endif
 
#ifndef CRYPT_IPSEC_HMAC_KEY
#define CRYPT_IPSEC_HMAC_KEY 0x00000100
#endif
 
#pragma comment(lib, "crypt32.lib")
 
using namespace std;
 
char * HMAC(char * str, char * password, DWORD AlgId);
 
 
typedef struct _my_blob{
BLOBHEADER header;
DWORD len;
BYTE key[0];
}my_blob;
 
 
int main(int argc, _TCHAR* argv[])
{
 
     char * hash_sha1 = HMAC("ROSDEVIL", "password", CALG_SHA1);
     char * hash_md5 = HMAC("ROSDEVIL", "password", CALG_MD5);
     
     cout<<"Hash HMAC-SHA1: "<<hash_sha1<<" ( "<<strlen(hash_sha1)<<" )"<<endl;
     cout<<"Hash HMAC-MD5: "<<hash_md5<<" ( "<<strlen(hash_md5)<<" )"<<endl;
     
     cin.get();
     return 0;
}
 
char * HMAC(char * str, char * password, DWORD AlgId = CALG_MD5){
 
   HCRYPTPROV  hProv = 0;
   HCRYPTHASH  hHash = 0;
   HCRYPTKEY   hKey = 0;
   HCRYPTHASH  hHmacHash = 0;
   BYTE    * pbHash = 0;
   DWORD       dwDataLen = 0;
   HMAC_INFO   HmacInfo;
 
   int err = 0;
   
   ZeroMemory(&HmacInfo, sizeof(HmacInfo));
   
   if (AlgId == CALG_MD5){
        HmacInfo.HashAlgid = CALG_MD5;
        pbHash = new BYTE[16];
        dwDataLen = 16;
   }else if(AlgId == CALG_SHA1){
        HmacInfo.HashAlgid = CALG_SHA1;
        pbHash = new BYTE[20];
        dwDataLen = 20;
   }else{
        return 0;     
   }
   
   ZeroMemory(pbHash, sizeof(dwDataLen));
   char * res = new char[dwDataLen * 2];
   
   my_blob * kb = NULL;
   DWORD kbSize = sizeof(my_blob) + strlen(password);
 
   kb = (my_blob*)malloc(kbSize);
   kb->header.bType = PLAINTEXTKEYBLOB;
   kb->header.bVersion = CUR_BLOB_VERSION;
   kb->header.reserved = 0;
   kb->header.aiKeyAlg = CALG_RC2;
   memcpy(&kb->key, password, strlen(password));
   kb->len = strlen(password);
 
 
   if (!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL,CRYPT_VERIFYCONTEXT | CRYPT_NEWKEYSET)){
      err = 1;
      goto Exit;
   }
 
 
   if (!CryptImportKey(hProv,  (BYTE*)kb, kbSize, 0, CRYPT_IPSEC_HMAC_KEY, &hKey)){
       err = 1;
       goto Exit;
   }
 
   if (!CryptCreateHash(hProv, CALG_HMAC, hKey, 0, &hHmacHash)){
       err = 1;
       goto Exit;
   }
   
   
   if (!CryptSetHashParam(hHmacHash, HP_HMAC_INFO, (BYTE*)&HmacInfo, 0)){
       err = 1;
       goto Exit;
   }
 
   if (!CryptHashData(hHmacHash, (BYTE*)str, strlen(str), 0)){
       err = 1;
       goto Exit;
   }
   
   if (!CryptGetHashParam(hHmacHash, HP_HASHVAL, pbHash, &dwDataLen, 0)){
       err = 1;
       goto Exit;
   }
 
   ZeroMemory(res, dwDataLen * 2);
   char * temp;
   temp = new char[3];
   ZeroMemory(temp, 3);
   for (unsigned int m = 0; m < dwDataLen; m++){
       sprintf(temp, "%2x", pbHash[m]);
       if (temp [1] == ' ') temp [1] = '0';  // note these two: they are two CORRECTIONS to the conversion in HEX, sometimes the Zeros are
       if (temp [0] == ' ') temp [0] = '0';  // printed with a space, so we replace spaces with zeros; (this error occurs mainly in HMAC-SHA1)
       sprintf(res,"%s%s", res,temp);  
   }
   
   delete [] temp;
 
    Exit:
    free(kb);
    if(hHmacHash)
        CryptDestroyHash(hHmacHash);
    if(hKey)
        CryptDestroyKey(hKey);
    if(hHash)
        CryptDestroyHash(hHash);    
    if(hProv)
        CryptReleaseContext(hProv, 0);
   
     
    if (err == 1){
        delete [] res;
        return "";      
    }
     
    return res;
}
Но проблема в том что когда я просто создаю проект с этим кодом тогда при любой длине строки char * str у меня все работает нормально, но когда я использую функцию в своем проекте, тогда все коректно работает только при небольшой длине (10-15 символов), а при большей длине, у меня эта функция выводит ошибку при любом выделении памяти с помощью оператора new "crypto_test.exe вызвал срабатывание точки останова." И открывается в вкладка в Visual studio 2012 malloc.c с вот таким кодом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
__forceinline void * __cdecl _heap_alloc (size_t size)
 
{
 
    if (_crtheap == 0) {
        _FF_MSGBANNER();    /* write run-time error banner */
 
        _NMSG_WRITE(_RT_CRT_NOTINIT);  /* write message */
        __crtExitProcess(255);  /* normally _exit(255) */
    }
 
    return HeapAlloc(_crtheap, 0, size ? size : 1);
}
То есть у меня ошибка сначала при этой строке 60 pbHash = new BYTE[20]; а если вынести это выделения за функцию, немного переделав ее, тогда появляется уже в этой строке ошибка char * res = new char[dwDataLen * 2]; Как решить это?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2013, 15:09     Проблемы с выделением памяти
Посмотрите здесь:

C++ ошибка с выделением памяти
C++ Строки с выделением динамической памяти
C++ Конструктор с выделением памяти
Проблема с выделением памяти C++
C++ Обращение к структуре в классе с выделением памяти
Проблемы с выделением памяти C++
C++ Работа со строками и выделением памяти
C++ Задача на строки с выделением памяти

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 16:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru