Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

compute the remainder of the BIGNUM divided by any integer modulo

given some string, let assume , hello world. I know that the string in bits is: 01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100. so the value of the bits is 126207244316550804821666916. I was able to create code that give my the value of the bits. now I want to compute the remainder of the BIGNUM divided by any integer modulus, let assume 1024. I expect to get number between 0 to 1023. but when i trying to apply the modulo , i get error: Segmentation fault (core dumped)

this is the code that I using:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/bn.h>


int main() {

    unsigned char message[] = "hello world"; //message
    //hello world = 01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
    //the value of bits is 126207244316550804821666916
    int length = strlen((char *)message);
    int i,j;

    BIGNUM *bn = BN_new();
    BN_zero(bn);

    for (i = 0; i < length; i++) {
        for(int j=0; j<8; j++){
            if (message[i] >> (7-j) & 1) {
                BN_lshift(bn, bn, 1);
                BN_add_word(bn, 1);
            }
            else {
                BN_lshift(bn, bn, 1);
            }
        }

    }

    BIGNUM *modolus = BN_new();
    BN_set_word(modolus, 1024);

    BN_mod(bn, bn, modolus, NULL);
    
    char *dec = BN_bn2dec(bn);
    printf("%s\n", dec);

    OPENSSL_free(dec);
    BN_free(bn);
    BN_free(modolus);

    return 0;

}


I’m new to C, i not sure what is exactly wrong here. after the loop i expect to get in bn the value 126207244316550804821666916, and its seems right. but when make module with 1024, i got error.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

You can’t pass a null pointer as the context argument. It needs a pointer to a valid BN_CTX object.

For example,

BN_CTX *ctx = BN_CTX_new();
BN_mod(bn, bn, modolus, ctx);
BN_CTX_free(ctx);

In real code you’ll want to allocate the context object ahead of time and re-use it for subsequent computations instead of freeing it right away, of course.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading