#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/time.h>

#include <openssl/bn.h>
#include <openssl/rand.h>
#include <openssl/objects.h>


void generate_and_print(int bits) {
	BN_CTX *ctx;
	BIGNUM *add, *rem, *p, *q, *N;
	char *tmp;

	ctx = BN_CTX_new();
	BN_CTX_init(ctx);
	BN_CTX_start(ctx);
	
	add = BN_new(); BN_set_word(add, 4);
	rem = BN_new(); BN_set_word(rem, 3);

	p = BN_new();
	BN_generate_prime(p, bits-9, 1, add, rem, NULL, NULL);
	q = BN_new();
	BN_generate_prime(q, bits, 1, add, rem, NULL, NULL);

	N = BN_new();
	BN_mul(N, p, q, ctx);

	/* output */
	tmp = BN_bn2dec(p);
	printf("p=%s\n", tmp);
	OPENSSL_free(tmp);

	tmp = BN_bn2dec(q);
	printf("q=%s\n", tmp);
	OPENSSL_free(tmp);

	tmp = BN_bn2dec(N);
	printf("N=%s\n", tmp);
	OPENSSL_free(tmp);


	BN_free(add);
	BN_free(rem);
	BN_free(p);
	BN_free(q);
	BN_free(N);
	BN_CTX_end(ctx);
	BN_CTX_free(ctx);
}

int main(int argc, char* argv[]) {
	int bits = 80;
	if(argc>1) {
		bits = atoi(argv[1]);
	}
	generate_and_print(bits);
	return 0;
}



