во время отладки значения красного цвета отображаются
_host__ void nouveau128( int argc, char *argv[] ) {
uchar4 *h_round_keys;
uchar4 *d_cipher_key, *d_round_keys;
uint8_t *d_sbox, *d_inv_sbox;
char *h_file;
char *d_file;
size_t file_size;
char fname[80],fname1[80], fname2[80];
/* объявляем массив из двух блоков */
uint64_t blocks[2];
/* считываем от пользователя ключи и заносим в массив */
getkeys(blocks);
printf ("%llx %llx, blocks[1], blocks[0]");
// Создание 128-битный шифр-ключ из двух uint64_t
d_cipher_key = d_generateCipherKey128( blocks[1], blocks[0]/*0x95A8EE8E89979B9E, 0xFDCBC6EB9797528D*/ ); // в этой строчке
printf("Enter src file name: ");
gets_s(fname);
// Загружает файл с диска
file_size = loadFileIntoMemory(&h_file, fname); число указанное в ошибке появляется в этой строчке // в этой строчке
// Выделяет память для различных ресурсов
h_round_keys = (uchar4 *) malloc(11 * 4 * sizeof(uchar4));
cudaMalloc((void **) &d_round_keys, 11 * 4 * sizeof(uchar4)); // в этой строчке
cudaMalloc((void **) &d_sbox, 256 * sizeof(uint8_t));
cudaMalloc((void **) &d_inv_sbox, 256 * sizeof(uint8_t));
cudaMalloc((void **) &d_file, file_size * sizeof(char));
// Копии памяти на устройстве
cudaMemcpy(d_sbox, s_box, 256 * sizeof(uint8_t), cudaMemcpyHostToDevice);
cudaMemcpy(d_inv_sbox, inv_s_box, 256 * sizeof(uint8_t), cudaMemcpyHostToDevice);
cudaMemcpy(d_file, h_file, file_size * sizeof(char), cudaMemcpyHostToDevice);
// Создает вокруг ключи, сохраняя их на глобальной памяти
d_round_keys = d_expandKey128( d_cipher_key, d_sbox ); // в этой строчке
// Шифрование файлов
h_file = encryptHostToHost128(h_file, file_size, d_sbox, d_round_keys); //ошибка выскакивает после этой строчки // в этой строчке,а затем ошибка.
printf("Enter dst file name: ");
gets_s(fname1);
//Записывает зашифрованный файл на диске
writeToFile(h_file, fname1, file_size);
// Расшифровка файлов
h_file = decryptHostToHost128(h_file, file_size, d_inv_sbox, d_round_keys);
printf("Enter res file name: ");
gets_s(fname2);
//Пишет расшифрованный файл на диск
writeToFile(h_file, fname2, file_size);
// Освобождает память, которая больше не используется
free(h_round_keys);
free(h_file);
cudaFree(d_cipher_key);
cudaFree(d_round_keys);
cudaFree(d_inv_sbox);
cudaFree(d_sbox);
cudaFree(d_file);
}
__host__ /*inline*/ uchar4 * d_generateCipherKey128( uint64_t block1, uint64_t block2 )
{
uchar4 *d_cipher_key;
uchar4 *h_cipher_key = (uchar4 *) malloc(4 * sizeof(uchar4));
// Создает ключ шифрования на хосте из двух блоков uint64_t
h_generateCipherKey128(h_cipher_key, block1, block2);
// Выделяет память для ключа шифрования устройства, копирование хозяина к ней
cudaMalloc((void **) &d_cipher_key, 4 * sizeof(uchar4));
cudaMemcpy(d_cipher_key, h_cipher_key, 4 * sizeof(uchar4), cudaMemcpyHostToDevice);
// Освобождает память, используемая для временного ключа шифра принимающей
free(h_cipher_key);
return d_cipher_key;
}
__host__ void getkeys(uint64_t *blocks)
{
int done = 0; /* флаг выхода из цикла ввода */
/* Пока пользователь не введёт правильное число */
while (!done) {
char buf[32 + 1]; /* буффер куда будет для введённой строки + конец строки '\0' */
int len; /* длина строки */
char *p; /* b указывает на текущее 32 битное число, куда будем заносить результат */
uint32_t *b; /* p указывает на начало строки в котором находится 32 битное hex число в ASCII виде */
printf ("Enter 128 bit number (16 byte, 32 hex digit): ");
fflush (stdout);
fgets(buf, sizeof(buf), stdin);
len = strlen(buf);
if (len != 32)
{
printf ("Must be from 32 hex digits\n");
continue;
}
done = 1;
b = (uint32_t *)blocks;
for (p = buf + len - 8; done && buf <= p; b++, p -= 8)
{
char *endptr;
*b = strtoul(p, &endptr, 16);
if ((errno == ERANGE && (*b == LONG_MAX || *b == LONG_MIN))
|| (errno != 0 && *b == 0)
|| (endptr == p))
{
printf ("Error (%s), wrong number\n", strerror(errno));
done = 0;
continue;
}
*p = 0; /* отрезаем от введённой пользователем строки очередное 32 битное hex число*/
}
}
}