Функции SHA_256 портят пространство памяти

Я пытался использовать функции SHA_256 в sha256.h в системе FreeBSD 9.1, но похоже, что это повреждает пространство памяти моей программы, вызывая все виды маниакального поведения. Я написал быструю программу, чтобы просто играть с этими функциями, и до сих пор у меня проблемы.

В приведенном ниже примере int i изменяется, когда я вызываю SHA256_Init(), как показано выходными данными операторов printf(), окружающих его.

Это то, что я запускаю код.

$ ./miner "hello world"  
i = 0  
i = 32  
0000000032      9010a9cf81ce2c28a642fd03ddf6da5790c65c30cd4a148c4257d3fe488bacc7

Почему это значение меняется на 32? Я что-то пропустил? Код ниже...

#include <sha256.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#define DIFFICULTY 0

int main(int argc, const char **argv) {
    uint nonce, i, j;
    SHA256_CTX ctx;
    size_t arglen;
    unsigned char digest[32];
    char * data;

    if(argc < 1) exit(1);
    arglen = strlen(argv[1]);
    data = malloc(arglen + 1);
    char digestStr[65];
    i = 0;
    do {
        nonce = i;
        strncpy(data, argv[1], arglen + 1);

        printf("i = %i\n", i);
        SHA256_Init(&ctx);
        printf("i = %i\n", i);

        SHA256_Update(&ctx, data, arglen);
        SHA256_Update(&ctx, (unsigned char *) &nonce, sizeof(nonce));
        SHA256_Final(digest, &ctx);
        SHA256_End(&ctx, digestStr);
        printf("%010i\t%s\n", i, digestStr);

        j = 0;
        while(j < 32 && digest[j] == '\0') {
            j++;
        }
        i++;
    } while(j < DIFFICULTY);

    free(data);
    return 0;
}

1 ответ

У меня была точно такая же проблема, и я решил ее.

Проблема в том, что вы включаете в свой код другой заголовок, чем библиотека SHA2, которую вы используете в своем приложении.

В моем случае структура SHA256_CTX имела другой размер в библиотеке openSSL. Структура библиотеки openSSL была на 8 байтов больше, чем длина структуры в файле.

Функция SHA256_Init(&ctx) выполняет memset для структуры SHA256_CTX, которая затем повреждает 8 дополнительных случайных байтов после структуры. Я говорю случайный, потому что он будет делать разные вещи в сборке релиза или отладки, потому что оптимизирующий компилятор будет перемещать ваши переменные.

Другие вопросы по тегам