Как правильно прочитать файл pkcs # 7 - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть файл с отдельной подписью pkcs # 7 размером 267 байт.Я создаю его после выполнения функции

CryptSignMessage(
    &SigParams,
    TRUE,
    1,
    MessageArray,
    MessageSizeArray,
    pbSignedMessageBlob,
    &cbSignedMessageBlob)

и затем пишу содержимое pbSignedMessageBlob:

pbSignedMessageBlob[cbSignedMessageBlob] = '\0';
 FILE *file;
 file = fopen("c:\\path\\sign_pkcs7.pk7", "wb");
 fwrite(pbSignedMessageBlob, sizeof(BYTE), cbSignedMessageBlob, file);
 fclose(file);

Затем я пытаюсь проверить эту подпись и прочитать этот файл:

BYTE *pkcsContent;
FILE *file3;
file3 = fopen("c:\\users\\timur\\desktop\\sign_pkcs7.pk7", "rb");
pkcsContent = MyReadFile(file3, cbArray);
BYTE* MyReadFile(FILE *f, DWORD &len)
{
    size_t result;
    BYTE *buffer;
    if (f == NULL) 
    {
        fputs ("File error", stderr); 
        exit (1);
    }

fseek (f, 0, SEEK_END);
len = ftell (f);
rewind (f);

//buffer = (BYTE*) malloc (sizeof(char)*lSize);
buffer = new BYTE[len + 1];
if (buffer == NULL) 
{
    fputs ("Memory error", stderr); 
    exit (2);
}

result = fread (buffer, 1, len, f);
if (result != len) 
{
    fputs ("Reading error",stderr); 
    exit (3);
}
buffer[len] = '\0';

fclose (f);

    return buffer;
}

Но содержимое файла, которое я получаю в pkcsContent, имеет длину всего 37 байтов.Я также пытался управлять файлами, используя std :: fstream, но результат тот же.Может быть, неправильный способ записи файла на диск?

1 Ответ

0 голосов
/ 24 февраля 2012

Вы пытаетесь вычислить длину pkcsContent с помощью strlen (это мое предположение, так как вы завершаете буфер нулем в MyReadFil)? Вы не можете сделать это, потому что PKCS # 7 является двоичными данными и может содержать 0 где угодно.

...