⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ectest.c

📁 openssl包含TLS
💻 C
📖 第 1 页 / 共 2 页
字号:
/* crypto/ec/ectest.c *//* ==================================================================== * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. All advertising materials mentioning features or use of this *    software must display the following acknowledgment: *    "This product includes software developed by the OpenSSL Project *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to *    endorse or promote products derived from this software without *    prior written permission. For written permission, please contact *    openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" *    nor may "OpenSSL" appear in their names without prior written *    permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following *    acknowledgment: *    "This product includes software developed by the OpenSSL Project *    for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com).  This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */#include <stdio.h>#include <stdlib.h>#ifdef FLAT_INC#include "e_os.h"#else#include "../e_os.h"#endif#include <string.h>#include <time.h>#ifdef OPENSSL_NO_ECint main(int argc, char * argv[]) { puts("Elliptic curves are disabled."); return 0; }#else#include <openssl/ec.h>#ifndef OPENSSL_NO_ENGINE#include <openssl/engine.h>#endif#include <openssl/err.h>#define ABORT do { \	fflush(stdout); \	fprintf(stderr, "%s:%d: ABORT\n", __FILE__, __LINE__); \	ERR_print_errors_fp(stderr); \	EXIT(1); \} while (0)#if 0static void timings(EC_GROUP *group, int multi, BN_CTX *ctx)	{	clock_t clck;	int i, j;	BIGNUM *s, *s0;	EC_POINT *P;			s = BN_new();	s0 = BN_new();	if (s == NULL || s0 == NULL) ABORT;	if (!EC_GROUP_get_curve_GFp(group, s, NULL, NULL, ctx)) ABORT;	fprintf(stdout, "Timings for %d bit prime, ", (int)BN_num_bits(s));	if (!EC_GROUP_get_order(group, s, ctx)) ABORT;	fprintf(stdout, "%d bit scalars ", (int)BN_num_bits(s));	fflush(stdout);	P = EC_POINT_new(group);	if (P == NULL) ABORT;	EC_POINT_copy(P, EC_GROUP_get0_generator(group));	clck = clock();	for (i = 0; i < 10; i++)		{		if (!BN_pseudo_rand(s, BN_num_bits(s), 0, 0)) ABORT;		if (multi)			{			if (!BN_pseudo_rand(s0, BN_num_bits(s), 0, 0)) ABORT;			}		for (j = 0; j < 10; j++)			{			if (!EC_POINT_mul(group, P, s, multi ? P : NULL, multi ? s0 : NULL, ctx)) ABORT;			}		fprintf(stdout, ".");		fflush(stdout);		}	fprintf(stdout, "\n");		clck = clock() - clck;#ifdef CLOCKS_PER_SEC	/* "To determine the time in seconds, the value returned	 * by the clock function should be divided by the value	 * of the macro CLOCKS_PER_SEC."	 *                                       -- ISO/IEC 9899 */#	define UNIT "s"#else	/* "`CLOCKS_PER_SEC' undeclared (first use this function)"	 *                            -- cc on NeXTstep/OpenStep */#	define UNIT "units"#	define CLOCKS_PER_SEC 1#endif	fprintf(stdout, "%i %s in %.2f " UNIT "\n", i*j,		multi ? "s*P+t*Q operations" : "point multiplications",		(double)clck/CLOCKS_PER_SEC);	fprintf(stdout, "average: %.4f " UNIT "\n", (double)clck/(CLOCKS_PER_SEC*i*j));	EC_POINT_free(P);	BN_free(s);	BN_free(s0);	}#endifint main(int argc, char *argv[])	{		BN_CTX *ctx = NULL;	BIGNUM *p, *a, *b;	EC_GROUP *group;	EC_GROUP *P_192 = NULL, *P_224 = NULL, *P_256 = NULL, *P_384 = NULL, *P_521 = NULL;	EC_POINT *P, *Q, *R;	BIGNUM *x, *y, *z;	unsigned char buf[100];	size_t i, len;	int k;		/* enable memory leak checking unless explicitly disabled */	if (!((getenv("OPENSSL_DEBUG_MEMORY") != NULL) && (0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off"))))		{		CRYPTO_malloc_debug_init();		CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);		}	else		{		/* OPENSSL_DEBUG_MEMORY=off */		CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);		}	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);	ERR_load_crypto_strings();#if 1 /* 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, "17")) ABORT;	if (!BN_hex2bn(&a, "1")) ABORT;	if (!BN_hex2bn(&b, "1")) ABORT;		group = EC_GROUP_new(EC_GFp_mont_method()); /* applications should use EC_GROUP_new_curve_GFp	                                             * so that the library gets to choose the EC_METHOD */	if (!group) ABORT;	if (!EC_GROUP_set_curve_GFp(group, p, a, b, ctx)) ABORT;	{		EC_GROUP *tmp;		tmp = EC_GROUP_new(EC_GROUP_method_of(group));		if (!tmp) ABORT;		if (!EC_GROUP_copy(tmp, group));		EC_GROUP_free(group);		group = tmp;	}		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, "D")) 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");	k = 100;	do		{		if (k-- == 0) ABORT;		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 */		{			EC_POINT *points[3];					points[0] = R;			points[1] = Q;			points[2] = P;			if (!EC_POINTs_make_affine(group, 2, points, 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;	/* Curve P-192 (FIPS PUB 186-2, App. 6) */		if (!BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF")) ABORT;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -