2009-10-01 4 views
2

Я пытаюсь использовать функции BN_ * в OpenSSL. В частности, у меня есть следующий код:Проблема с функцией BN_bn2bin от OpenSSL

#import <openssl/bn.h> 
BIGNUM * num = BN_new(); 
BN_set_word(num, 42); 
char * buffer = malloc((BN_num_bytes(num)+1) * sizeof(char)); 
buffer[BN_num_bytes(num)] = '\0'; 
int len = BN_bn2bin(num, buffer); 
printf("42 in binary is %s\n", buffer); 

Однако, когда я делаю это, я не получаю строку из единиц и нулей. Вместо этого он печатает "42 in binary is *". Насколько я могу судить, и от очень ограниченное количество примеров, доступных в Интернете, с которыми я сравнивал это, я реализовал это правильно.

Любые идеи, почему это не работает?

ответ

6

BN_bn2bin не создает печатную строку - вместо этого он создает представление, которое действительно является бинарным (то есть последовательностью бит). Более конкретно, это создает представление о количестве людей в большом конце. Поскольку 42 вписывается в один байт, вы получаете один байт 0x2a, который является «*» в ASCII.

Если вам нужно представление 0/1, вам необходимо выполнить итерацию по всем байтам и выполнить печать самостоятельно (например, с помощью сдвига или таблицы поиска).

+0

DOH! Я должен был подумать о том, чтобы взглянуть на значение асия! Я предполагал, что, поскольку он указан в документах рядом с bn2hex и bn2dec, он будет работать одинаково. Bummer ... Спасибо за разъяснение. знак равно –

0

Вот код, который фактически выводит вывод BN_bn2bin в печатную строку точно так же, как вывод BN_bn2dec и BN_bn2hex. Он находится в библиотеке NodeJS, но написан на C++ для скорости. Принимал меня весь день и, вероятно, не был оптимальным (потому что я не написал ни одного кода на C++ с первого года работы uni). Но он проходит кучу модульных тестов, поэтому я знаю, что это работает!

https://github.com/malcolmocean/node-bignum

if (BN_is_zero(&bignum->bignum_)) { 
    to = (char*) OPENSSL_malloc(2*sizeof(char)); 
    to[0] = '0'; 
    to[1] = '\0'; 
} else { 
    unsigned char *binary = (unsigned char*) OPENSSL_malloc(BN_num_bytes(&bignum->bignum_)*sizeof(unsigned char)); 
    int len = BN_bn2bin(&bignum->bignum_, binary); 
    to = (char*) OPENSSL_malloc((len*8+2)*sizeof(char)); 
    int offset = 0; 
    if (BN_is_negative(&bignum->bignum_)) { 
    to[0] = '-'; 
    offset--; 
    } 
    unsigned char x = binary[0]; 
    while (!(x & 128) && x) { 
    x = x << 1; 
    offset++; 
    } 
    for (int i = 0; i < len; i++) { 
    unsigned char bits = binary[i]; 

    int j=7; 
    while(bits) { 
     if (bits & 1) { 
     to[8*i+j-offset] = '1'; 
     } else { 
     to[8*i+j-offset] = '0'; 
     } 
     bits = bits >> 1; 
     j--; 
    } 
    if (i > 0) { 
     while (j >= 0) { 
     to[8*i+j-offset] = '0'; 
     j--; 
     } 
    } 
    } 
    to[8*len-offset] = '\0'; 
    OPENSSL_free(binary); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^