Статус: Участник
Группы: Участники
Зарегистрирован: 23.08.2018(UTC) Сообщений: 29
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
Код:
FILE *mf;
// Переменная, в которую поочередно будут помещаться считываемые байты
int sym;
// Открытие фала с режимом доступа «только чтение» и привязка к нему
// потока данных
printf("opening file: ");
mf = fopen("filename", "rb");
fseek(mf, 0, SEEK_END);
long len = ftell(mf);
fseek(mf, 0, SEEK_SET);
char s1[len];
char s2[len];
int q = 0;
BYTE * arrStr[len];
int strIndex = 0;
printf("Start reading file\n");
while (1) {
// Чтение одного байта из файла
sym = fgetc(mf);
//Проверка на конец файла или ошибку чтения
if (sym == EOF) {
// Проверяем что именно произошло: кончился файл
// или это ошибка чтения
if (feof(mf) != 0) {
//Если файл закончился, выводим сообщение о завершении чтения
//и выходим из бесконечного цикла
printf("\nend\n");
char* sc = strcpy(malloc(q), s1);
arrStr[strIndex] = sc;
q = 0;
break;
} else {
//Если при чтении произошла ошибка, выводим сообщение об
// ошибке и выходим из бесконечного цикла
printf("\nerror\n");
break;
}
}
//Если файл не закончился, и не было ошибки чтения
//выводим код считанного символа на экран
s2[q] = sym;
s1[q++] = sym;
if (sym == '\0') {
char* sc = strcpy(malloc(q), s1);
arrStr[strIndex] = sc;
q = 0;
strIndex++;
continue;
}
}
Так я читаю данные из файла. Здесь в s2 считываются все данные до конца файла, включая символы конца строки '\0' (данный вариант был изначально в примере и для простого текстового файла работает на ура. Однако, как я писал выше, при считывании pdf файла - появляются в середине символы '\0', за счет чего CryptSignMessage подписывает данные только до первого вхождения '\0'). в s1 считываются данные до первого вхождения '\0' и полученная строка записывается в массив arrStr, после чего в s1 начинает считываться следующая строка. далее на основе полученного массива "arrStr" составляется массив размеров - "MessageSizeArray" и передается в CryptSignMessage. Код:
if (CryptSignMessage(
&SigParams,
FALSE,
1,
arrStr,
MessageSizeArray,
NULL,
&cbSignedMessageBlob)) {
printf(TEXT("%d bytes needed for the encoded BLOB.\n"), cbSignedMessageBlob);
} else {
HandleError(TEXT("Getting signed BLOB size failed"));
goto exit_SignMessage;
}
// Allocate memory for the signed BLOB.
if (!(pbSignedMessageBlob = (BYTE*) malloc(cbSignedMessageBlob))) {
HandleError(TEXT("Memory allocation error while signing."));
goto exit_SignMessage;
}
// Get the signed message BLOB.
if (CryptSignMessage(
&SigParams,
FALSE,
1,
arrStr,
MessageSizeArray,
pbSignedMessageBlob,
&cbSignedMessageBlob)) {
printf(TEXT("The message was signed successfully. \n"));
// pbSignedMessageBlob now contains the signed BLOB.
fReturn = TRUE;
} else {
HandleError(TEXT("Error getting signed BLOB"));
goto exit_SignMessage;
}
Однако, CryptSignMessage опять же подписывает только одну строку байтов. (и эта подпись проверяется и своей программой и криптоАрм-ом, но подписывается лишь часть файла). Пока пробую сделать присоединенную подпись , но в конечном итоге необходима отсоединенная. p.s. я видимо спутал, строки символов со строками байтов. но, насколько я понимаю, считываются пустые байты (null) и при передачи набор байтов с пустыми по середине в CryptSignMessage, CryptSignMessage работает с ними как со строкой - соответственно для подписи использует данные от начала до первого пустого байта.
|