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

📄 ectest.c

📁 开源的ssl算法openssl,版本0.9.8H
💻 C
📖 第 1 页 / 共 3 页
字号:
/* crypto/ec/ectest.c *//* * Originally written by Bodo Moeller for the OpenSSL project. *//* ==================================================================== * 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). * *//* ==================================================================== * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. * * Portions of the attached software ("Contribution") are developed by  * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. * * The Contribution is licensed pursuant to the OpenSSL open source * license provided above. * * The elliptic curve binary polynomial software is originally written by  * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. * */#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>#include <openssl/obj_mac.h>#include <openssl/objects.h>#include <openssl/rand.h>#include <openssl/bn.h>#if defined(_MSC_VER) && defined(_MIPS_) && (_MSC_VER/100==12)/* suppress "too big too optimize" warning */#pragma warning(disable:4959)#endif#define ABORT do { \	fflush(stdout); \	fprintf(stderr, "%s:%d: ABORT\n", __FILE__, __LINE__); \	ERR_print_errors_fp(stderr); \	EXIT(1); \} while (0)void prime_field_tests(void);void char2_field_tests(void);void internal_curve_test(void);#define TIMING_BASE_PT 0#define TIMING_RAND_PT 1#define TIMING_SIMUL 2#if 0static void timings(EC_GROUP *group, int type, BN_CTX *ctx)	{	clock_t clck;	int i, j;	BIGNUM *s;	BIGNUM *r[10], *r0[10];	EC_POINT *P;			s = BN_new();	if (s == NULL) ABORT;	fprintf(stdout, "Timings for %d-bit field, ", EC_GROUP_get_degree(group));	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));	for (i = 0; i < 10; i++)		{		if ((r[i] = BN_new()) == NULL) ABORT;		if (!BN_pseudo_rand(r[i], BN_num_bits(s), 0, 0)) ABORT;		if (type != TIMING_BASE_PT)			{			if ((r0[i] = BN_new()) == NULL) ABORT;			if (!BN_pseudo_rand(r0[i], BN_num_bits(s), 0, 0)) ABORT;			}		}	clck = clock();	for (i = 0; i < 10; i++)		{		for (j = 0; j < 10; j++)			{			if (!EC_POINT_mul(group, P, (type != TIMING_RAND_PT) ? r[i] : NULL, 				(type != TIMING_BASE_PT) ? P : NULL, (type != TIMING_BASE_PT) ? r0[i] : NULL, ctx)) ABORT;			}		}	clck = clock() - clck;	fprintf(stdout, "\n");#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	if (type == TIMING_BASE_PT) {		fprintf(stdout, "%i %s in %.2f " UNIT "\n", i*j,			"base point multiplications", (double)clck/CLOCKS_PER_SEC);	} else if (type == TIMING_RAND_PT) {		fprintf(stdout, "%i %s in %.2f " UNIT "\n", i*j,			"random point multiplications", (double)clck/CLOCKS_PER_SEC);	} else if (type == TIMING_SIMUL) {		fprintf(stdout, "%i %s in %.2f " UNIT "\n", i*j,			"s*P+t*Q operations", (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);	for (i = 0; i < 10; i++)		{		BN_free(r[i]);		if (type != TIMING_BASE_PT) BN_free(r0[i]);		}	}#endifvoid prime_field_tests()	{		BN_CTX *ctx = NULL;	BIGNUM *p, *a, *b;	EC_GROUP *group;	EC_GROUP *P_160 = NULL, *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;	#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)) ABORT;		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 secp160r1 (Certicom Research SEC 2 Version 1.0, section 2.4.2, 2000)	 * -- not a NIST curve, but commonly used */		if (!BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF")) ABORT;	if (1 != BN_is_prime_ex(p, BN_prime_checks, ctx, NULL)) ABORT;	if (!BN_hex2bn(&a, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC")) ABORT;	if (!BN_hex2bn(&b, "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45")) ABORT;	if (!EC_GROUP_set_curve_GFp(group, p, a, b, ctx)) ABORT;	if (!BN_hex2bn(&x, "4A96B5688EF573284664698968C38BB913CBFC82")) ABORT;	if (!BN_hex2bn(&y, "23a628553168947d59dcc912042351377ac5fb32")) ABORT;	if (!EC_POINT_set_affine_coordinates_GFp(group, P, x, y, ctx)) ABORT;	if (!EC_POINT_is_on_curve(group, P, ctx)) ABORT;	if (!BN_hex2bn(&z, "0100000000000000000001F4C8F927AED3CA752257")) ABORT;	if (!EC_GROUP_set_generator(group, P, z, BN_value_one())) ABORT;	if (!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)) ABORT;	fprintf(stdout, "\nSEC2 curve secp160r1 -- Generator:\n     x = 0x");	BN_print_fp(stdout, x);	fprintf(stdout, "\n     y = 0x");	BN_print_fp(stdout, y);	fprintf(stdout, "\n");	/* G_y value taken from the standard: */	if (!BN_hex2bn(&z, "23a628553168947d59dcc912042351377ac5fb32")) ABORT;	if (0 != BN_cmp(y, z)) ABORT;	fprintf(stdout, "verify degree ...");	if (EC_GROUP_get_degree(group) != 160) ABORT;	fprintf(stdout, " ok\n");		fprintf(stdout, "verify group order ...");	fflush(stdout);	if (!EC_GROUP_get_order(group, z, ctx)) ABORT;	if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;	if (!EC_POINT_is_at_infinity(group, Q)) ABORT;	fprintf(stdout, ".");	fflush(stdout);	if (!EC_GROUP_precompute_mult(group, ctx)) ABORT;	if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;	if (!EC_POINT_is_at_infinity(group, Q)) ABORT;	fprintf(stdout, " ok\n");	if (!(P_160 = EC_GROUP_new(EC_GROUP_method_of(group)))) ABORT;	if (!EC_GROUP_copy(P_160, group)) ABORT;	/* Curve P-192 (FIPS PUB 186-2, App. 6) */		if (!BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF")) ABORT;	if (1 != BN_is_prime_ex(p, BN_prime_checks, ctx, NULL)) ABORT;	if (!BN_hex2bn(&a, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC")) ABORT;	if (!BN_hex2bn(&b, "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1")) ABORT;	if (!EC_GROUP_set_curve_GFp(group, p, a, b, ctx)) ABORT;	if (!BN_hex2bn(&x, "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012")) ABORT;	if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 1, ctx)) ABORT;	if (!EC_POINT_is_on_curve(group, P, ctx)) ABORT;	if (!BN_hex2bn(&z, "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831")) ABORT;	if (!EC_GROUP_set_generator(group, P, z, BN_value_one())) ABORT;	if (!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)) ABORT;	fprintf(stdout, "\nNIST curve P-192 -- Generator:\n     x = 0x");	BN_print_fp(stdout, x);	fprintf(stdout, "\n     y = 0x");	BN_print_fp(stdout, y);	fprintf(stdout, "\n");	/* G_y value taken from the standard: */	if (!BN_hex2bn(&z, "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811")) ABORT;	if (0 != BN_cmp(y, z)) ABORT;	fprintf(stdout, "verify degree ...");	if (EC_GROUP_get_degree(group) != 192) ABORT;	fprintf(stdout, " ok\n");		fprintf(stdout, "verify group order ...");	fflush(stdout);	if (!EC_GROUP_get_order(group, z, ctx)) ABORT;	if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;	if (!EC_POINT_is_at_infinity(group, Q)) ABORT;	fprintf(stdout, ".");	fflush(stdout);#if 0	if (!EC_GROUP_precompute_mult(group, ctx)) ABORT;#endif	if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;	if (!EC_POINT_is_at_infinity(group, Q)) ABORT;	fprintf(stdout, " ok\n");	if (!(P_192 = EC_GROUP_new(EC_GROUP_method_of(group)))) ABORT;	if (!EC_GROUP_copy(P_192, group)) ABORT;	/* Curve P-224 (FIPS PUB 186-2, App. 6) */		if (!BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001")) ABORT;	if (1 != BN_is_prime_ex(p, BN_prime_checks, ctx, NULL)) ABORT;

⌨️ 快捷键说明

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