if (!BN_hex2bn(&p, "D")) ABORT; if (!BN_hex2bn(&a, "7")) ABORT; if (!BN_hex2bn(&b, "C")) ABORT;
if (!BN_hex2bn(&p, "17")) ABORT; if (!BN_hex2bn(&a, "1")) ABORT; if (!BN_hex2bn(&b, "1")) ABORT;
int main(int argc, char *argv[])	{		BN_CTX *ctx = NULL;	BIGNUM *p, *a, *b;	EC_GROUP *group;	EC_POINT *P, *Q, *R;	BIGNUM *x, *y, *z;	unsigned char buf[100];	size_t i, len;		CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);	ERR_load_crypto_strings();#if 0 /* optional */	ctx = BN_CTX_new();	if (!ctx) ABORT;#endif	p = BN_new();	a = BN_new();	b = BN_new();	if (!p || !a || !b) ABORT;	if (!BN_hex2bn(&p, "D")) ABORT;	if (!BN_hex2bn(&a, "7")) ABORT;	if (!BN_hex2bn(&b, "C")) ABORT;		group = EC_GROUP_new(EC_GFp_mont_method());	if (!group) ABORT;	if (!EC_GROUP_set_curve_GFp(group, p, a, b, ctx)) ABORT;	if (!EC_GROUP_get_curve_GFp(group, p, a, b, ctx)) ABORT;	fprintf(stdout, "Curve defined by Weierstrass equation\n     y^2 = x^3 + a*x + b  (mod 0x");	BN_print_fp(stdout, p);	fprintf(stdout, ")\n     a = 0x");	BN_print_fp(stdout, a);	fprintf(stdout, "\n     b = 0x");	BN_print_fp(stdout, b);	fprintf(stdout, "\n");	P = EC_POINT_new(group);	Q = EC_POINT_new(group);	R = EC_POINT_new(group);	if (!P || !Q || !R) ABORT;		if (!EC_POINT_set_to_infinity(group, P)) ABORT;	if (!EC_POINT_is_at_infinity(group, P)) ABORT;	buf[0] = 0;	if (!EC_POINT_oct2point(group, Q, buf, 1, ctx)) ABORT;	if (!EC_POINT_add(group, P, P, Q, ctx)) ABORT;	if (!EC_POINT_is_at_infinity(group, P)) ABORT;	x = BN_new();	y = BN_new();	z = BN_new();	if (!x || !y || !z) ABORT;	if (!BN_hex2bn(&x, "C")) ABORT;	if (!EC_POINT_set_compressed_coordinates_GFp(group, Q, x, 1, ctx)) ABORT;	if (!EC_POINT_is_on_curve(group, Q, ctx))		{		if (!EC_POINT_get_affine_coordinates_GFp(group, Q, x, y, ctx)) ABORT;		fprintf(stderr, "Point is not on curve: x = 0x");		BN_print_fp(stderr, x);		fprintf(stderr, ", y = 0x");		BN_print_fp(stderr, y);		fprintf(stderr, "\n");		ABORT;		}	fprintf(stdout, "A cyclic subgroup:\n");	do		{		if (EC_POINT_is_at_infinity(group, P))			fprintf(stdout, "     point at infinity\n");		else			{			if (!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)) ABORT;			fprintf(stdout, "     x = 0x");			BN_print_fp(stdout, x);			fprintf(stdout, ", y = 0x");			BN_print_fp(stdout, y);			fprintf(stdout, "\n");			}				if (!EC_POINT_copy(R, P)) ABORT;		if (!EC_POINT_add(group, P, P, Q, ctx)) ABORT;#if 0 /* optional */		if (!EC_POINT_make_affine(group, P, ctx)) ABORT;#endif		}	while (!EC_POINT_is_at_infinity(group, P));	if (!EC_POINT_add(group, P, Q, R, ctx)) ABORT;	if (!EC_POINT_is_at_infinity(group, P)) ABORT;	len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_COMPRESSED, buf, sizeof buf, ctx);	if (len == 0) ABORT;	if (!EC_POINT_oct2point(group, P, buf, len, ctx)) ABORT;	if (0 != EC_POINT_cmp(group, P, Q, ctx)) ABORT;	fprintf(stdout, "Generator as octect string, compressed form:\n     ");	for (i = 0; i < len; i++) fprintf(stdout, "%02X", buf[i]);		len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_UNCOMPRESSED, buf, sizeof buf, ctx);	if (len == 0) ABORT;	if (!EC_POINT_oct2point(group, P, buf, len, ctx)) ABORT;	if (0 != EC_POINT_cmp(group, P, Q, ctx)) ABORT;	fprintf(stdout, "\nGenerator as octect string, uncompressed form:\n     ");	for (i = 0; i < len; i++) fprintf(stdout, "%02X", buf[i]);		len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_HYBRID, buf, sizeof buf, ctx);	if (len == 0) ABORT;	if (!EC_POINT_oct2point(group, P, buf, len, ctx)) ABORT;	if (0 != EC_POINT_cmp(group, P, Q, ctx)) ABORT;	fprintf(stdout, "\nGenerator as octect string, hybrid form:\n     ");	for (i = 0; i < len; i++) fprintf(stdout, "%02X", buf[i]);		if (!EC_POINT_get_Jprojective_coordinates_GFp(group, R, x, y, z, ctx)) ABORT;	fprintf(stdout, "\nA representation of the inverse of that generator in\nJacobian projective coordinates:\n     X = 0x");	BN_print_fp(stdout, x);	fprintf(stdout, ", Y = 0x");	BN_print_fp(stdout, y);	fprintf(stdout, ", Z = 0x");	BN_print_fp(stdout, z);	fprintf(stdout, "\n");	if (!EC_POINT_invert(group, P, ctx)) ABORT;	if (0 != EC_POINT_cmp(group, P, R, ctx)) ABORT;	/* ... */	if (ctx)		BN_CTX_free(ctx);	BN_free(p); BN_free(a);	BN_free(b);	EC_GROUP_free(group);	EC_POINT_free(P);	EC_POINT_free(Q);	EC_POINT_free(R);	BN_free(x); BN_free(y); BN_free(z);	ERR_free_strings();	ERR_remove_state(0);	CRYPTO_mem_leaks_fp(stderr);		return 0;	}