security/nss/lib/freebl/ecl/tests/ec2_test.c

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 #include "mpi.h"
     6 #include "mplogic.h"
     7 #include "mpprime.h"
     8 #include "mp_gf2m.h"
     9 #include "ecl.h"
    10 #include "ecl-curve.h"
    11 #include "ec2.h"
    12 #include <stdio.h>
    13 #include <strings.h>
    14 #include <assert.h>
    16 #include <time.h>
    17 #include <sys/time.h>
    18 #include <sys/resource.h>
    20 /* Time k repetitions of operation op. */
    21 #define M_TimeOperation(op, k) { \
    22 	double dStart, dNow, dUserTime; \
    23 	struct rusage ru; \
    24 	int i; \
    25 	getrusage(RUSAGE_SELF, &ru); \
    26 	dStart = (double)ru.ru_utime.tv_sec+(double)ru.ru_utime.tv_usec*0.000001; \
    27 	for (i = 0; i < k; i++) { \
    28 		{ op; } \
    29 	}; \
    30 	getrusage(RUSAGE_SELF, &ru); \
    31 	dNow = (double)ru.ru_utime.tv_sec+(double)ru.ru_utime.tv_usec*0.000001; \
    32 	dUserTime = dNow-dStart; \
    33 	if (dUserTime) printf("    %-45s k: %6i, t: %6.2f sec\n", #op, k, dUserTime); \
    34 }
    36 /* Test curve using generic field arithmetic. */
    37 #define ECTEST_GENERIC_GF2M(name_c, name) \
    38 	printf("Testing %s using generic implementation...\n", name_c); \
    39 	params = EC_GetNamedCurveParams(name); \
    40 	if (params == NULL) { \
    41 			printf("  Error: could not construct params.\n"); \
    42 			res = MP_NO; \
    43 			goto CLEANUP; \
    44 	} \
    45 	ECGroup_free(group); \
    46 	group = ECGroup_fromHex(params); \
    47 	if (group == NULL) { \
    48 		printf("  Error: could not construct group.\n"); \
    49 		res = MP_NO; \
    50 		goto CLEANUP; \
    51 	} \
    52 	MP_CHECKOK( ectest_curve_GF2m(group, ectestPrint, ectestTime, 1) ); \
    53 	printf("... okay.\n");
    55 /* Test curve using specific field arithmetic. */
    56 #define ECTEST_NAMED_GF2M(name_c, name) \
    57 	printf("Testing %s using specific implementation...\n", name_c); \
    58 	ECGroup_free(group); \
    59 	group = ECGroup_fromName(name); \
    60 	if (group == NULL) { \
    61 		printf("  Warning: could not construct group.\n"); \
    62 		printf("... failed; continuing with remaining tests.\n"); \
    63 	} else { \
    64 		MP_CHECKOK( ectest_curve_GF2m(group, ectestPrint, ectestTime, 0) ); \
    65 		printf("... okay.\n"); \
    66 	}
    68 /* Performs basic tests of elliptic curve cryptography over binary
    69  * polynomial fields. If tests fail, then it prints an error message,
    70  * aborts, and returns an error code. Otherwise, returns 0. */
    71 int
    72 ectest_curve_GF2m(ECGroup *group, int ectestPrint, int ectestTime,
    73 				  int generic)
    74 {
    76 	mp_int one, order_1, gx, gy, rx, ry, n;
    77 	int size;
    78 	mp_err res;
    79 	char s[1000];
    81 	/* initialize values */
    82 	MP_CHECKOK(mp_init(&one));
    83 	MP_CHECKOK(mp_init(&order_1));
    84 	MP_CHECKOK(mp_init(&gx));
    85 	MP_CHECKOK(mp_init(&gy));
    86 	MP_CHECKOK(mp_init(&rx));
    87 	MP_CHECKOK(mp_init(&ry));
    88 	MP_CHECKOK(mp_init(&n));
    90 	MP_CHECKOK(mp_set_int(&one, 1));
    91 	MP_CHECKOK(mp_sub(&group->order, &one, &order_1));
    93 	/* encode base point */
    94 	if (group->meth->field_dec) {
    95 		MP_CHECKOK(group->meth->field_dec(&group->genx, &gx, group->meth));
    96 		MP_CHECKOK(group->meth->field_dec(&group->geny, &gy, group->meth));
    97 	} else {
    98 		MP_CHECKOK(mp_copy(&group->genx, &gx));
    99 		MP_CHECKOK(mp_copy(&group->geny, &gy));
   100 	}
   102 	if (ectestPrint) {
   103 		/* output base point */
   104 		printf("  base point P:\n");
   105 		MP_CHECKOK(mp_toradix(&gx, s, 16));
   106 		printf("    %s\n", s);
   107 		MP_CHECKOK(mp_toradix(&gy, s, 16));
   108 		printf("    %s\n", s);
   109 		if (group->meth->field_enc) {
   110 			printf("  base point P (encoded):\n");
   111 			MP_CHECKOK(mp_toradix(&group->genx, s, 16));
   112 			printf("    %s\n", s);
   113 			MP_CHECKOK(mp_toradix(&group->geny, s, 16));
   114 			printf("    %s\n", s);
   115 		}
   116 	}
   118 #ifdef ECL_ENABLE_GF2M_PT_MUL_AFF
   119 	/* multiply base point by order - 1 and check for negative of base
   120 	 * point */
   121 	MP_CHECKOK(ec_GF2m_pt_mul_aff
   122 			   (&order_1, &group->genx, &group->geny, &rx, &ry, group));
   123 	if (ectestPrint) {
   124 		printf("  (order-1)*P (affine):\n");
   125 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   126 		printf("    %s\n", s);
   127 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   128 		printf("    %s\n", s);
   129 	}
   130 	MP_CHECKOK(group->meth->field_add(&ry, &rx, &ry, group->meth));
   131 	if ((mp_cmp(&rx, &group->genx) != 0)
   132 		|| (mp_cmp(&ry, &group->geny) != 0)) {
   133 		printf("  Error: invalid result (expected (- base point)).\n");
   134 		res = MP_NO;
   135 		goto CLEANUP;
   136 	}
   137 #endif
   139 	/* multiply base point by order - 1 and check for negative of base
   140 	 * point */
   141 	MP_CHECKOK(ec_GF2m_pt_mul_mont
   142 			   (&order_1, &group->genx, &group->geny, &rx, &ry, group));
   143 	if (ectestPrint) {
   144 		printf("  (order-1)*P (montgomery):\n");
   145 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   146 		printf("    %s\n", s);
   147 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   148 		printf("    %s\n", s);
   149 	}
   150 	MP_CHECKOK(group->meth->field_add(&ry, &rx, &ry, group->meth));
   151 	if ((mp_cmp(&rx, &group->genx) != 0)
   152 		|| (mp_cmp(&ry, &group->geny) != 0)) {
   153 		printf("  Error: invalid result (expected (- base point)).\n");
   154 		res = MP_NO;
   155 		goto CLEANUP;
   156 	}
   158 #ifdef ECL_ENABLE_GF2M_PROJ
   159 	/* multiply base point by order - 1 and check for negative of base
   160 	 * point */
   161 	MP_CHECKOK(ec_GF2m_pt_mul_proj
   162 			   (&order_1, &group->genx, &group->geny, &rx, &ry, group));
   163 	if (ectestPrint) {
   164 		printf("  (order-1)*P (projective):\n");
   165 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   166 		printf("    %s\n", s);
   167 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   168 		printf("    %s\n", s);
   169 	}
   170 	MP_CHECKOK(group->meth->field_add(&ry, &rx, &ry, group->meth));
   171 	if ((mp_cmp(&rx, &group->genx) != 0)
   172 		|| (mp_cmp(&ry, &group->geny) != 0)) {
   173 		printf("  Error: invalid result (expected (- base point)).\n");
   174 		res = MP_NO;
   175 		goto CLEANUP;
   176 	}
   177 #endif
   179 	/* multiply base point by order - 1 and check for negative of base
   180 	 * point */
   181 	MP_CHECKOK(ECPoint_mul(group, &order_1, NULL, NULL, &rx, &ry));
   182 	if (ectestPrint) {
   183 		printf("  (order-1)*P (ECPoint_mul):\n");
   184 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   185 		printf("    %s\n", s);
   186 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   187 		printf("    %s\n", s);
   188 	}
   189 	MP_CHECKOK(ec_GF2m_add(&ry, &rx, &ry, group->meth));
   190 	if ((mp_cmp(&rx, &gx) != 0) || (mp_cmp(&ry, &gy) != 0)) {
   191 		printf("  Error: invalid result (expected (- base point)).\n");
   192 		res = MP_NO;
   193 		goto CLEANUP;
   194 	}
   196 	/* multiply base point by order - 1 and check for negative of base
   197 	 * point */
   198 	MP_CHECKOK(ECPoint_mul(group, &order_1, &gx, &gy, &rx, &ry));
   199 	if (ectestPrint) {
   200 		printf("  (order-1)*P (ECPoint_mul):\n");
   201 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   202 		printf("    %s\n", s);
   203 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   204 		printf("    %s\n", s);
   205 	}
   206 	MP_CHECKOK(ec_GF2m_add(&ry, &rx, &ry, group->meth));
   207 	if ((mp_cmp(&rx, &gx) != 0) || (mp_cmp(&ry, &gy) != 0)) {
   208 		printf("  Error: invalid result (expected (- base point)).\n");
   209 		res = MP_NO;
   210 		goto CLEANUP;
   211 	}
   213 #ifdef ECL_ENABLE_GF2M_PT_MUL_AFF
   214 	/* multiply base point by order and check for point at infinity */
   215 	MP_CHECKOK(ec_GF2m_pt_mul_aff
   216 			   (&group->order, &group->genx, &group->geny, &rx, &ry,
   217 				group));
   218 	if (ectestPrint) {
   219 		printf("  (order)*P (affine):\n");
   220 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   221 		printf("    %s\n", s);
   222 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   223 		printf("    %s\n", s);
   224 	}
   225 	if (ec_GF2m_pt_is_inf_aff(&rx, &ry) != MP_YES) {
   226 		printf("  Error: invalid result (expected point at infinity).\n");
   227 		res = MP_NO;
   228 		goto CLEANUP;
   229 	}
   230 #endif
   232 	/* multiply base point by order and check for point at infinity */
   233 	MP_CHECKOK(ec_GF2m_pt_mul_mont
   234 			   (&group->order, &group->genx, &group->geny, &rx, &ry,
   235 				group));
   236 	if (ectestPrint) {
   237 		printf("  (order)*P (montgomery):\n");
   238 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   239 		printf("    %s\n", s);
   240 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   241 		printf("    %s\n", s);
   242 	}
   243 	if (ec_GF2m_pt_is_inf_aff(&rx, &ry) != MP_YES) {
   244 		printf("  Error: invalid result (expected point at infinity).\n");
   245 		res = MP_NO;
   246 		goto CLEANUP;
   247 	}
   249 #ifdef ECL_ENABLE_GF2M_PROJ
   250 	/* multiply base point by order and check for point at infinity */
   251 	MP_CHECKOK(ec_GF2m_pt_mul_proj
   252 			   (&group->order, &group->genx, &group->geny, &rx, &ry,
   253 				group));
   254 	if (ectestPrint) {
   255 		printf("  (order)*P (projective):\n");
   256 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   257 		printf("    %s\n", s);
   258 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   259 		printf("    %s\n", s);
   260 	}
   261 	if (ec_GF2m_pt_is_inf_aff(&rx, &ry) != MP_YES) {
   262 		printf("  Error: invalid result (expected point at infinity).\n");
   263 		res = MP_NO;
   264 		goto CLEANUP;
   265 	}
   266 #endif
   268 	/* multiply base point by order and check for point at infinity */
   269 	MP_CHECKOK(ECPoint_mul(group, &group->order, NULL, NULL, &rx, &ry));
   270 	if (ectestPrint) {
   271 		printf("  (order)*P (ECPoint_mul):\n");
   272 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   273 		printf("    %s\n", s);
   274 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   275 		printf("    %s\n", s);
   276 	}
   277 	if (ec_GF2m_pt_is_inf_aff(&rx, &ry) != MP_YES) {
   278 		printf("  Error: invalid result (expected point at infinity).\n");
   279 		res = MP_NO;
   280 		goto CLEANUP;
   281 	}
   283 	/* multiply base point by order and check for point at infinity */
   284 	MP_CHECKOK(ECPoint_mul(group, &group->order, &gx, &gy, &rx, &ry));
   285 	if (ectestPrint) {
   286 		printf("  (order)*P (ECPoint_mul):\n");
   287 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   288 		printf("    %s\n", s);
   289 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   290 		printf("    %s\n", s);
   291 	}
   292 	if (ec_GF2m_pt_is_inf_aff(&rx, &ry) != MP_YES) {
   293 		printf("  Error: invalid result (expected point at infinity).\n");
   294 		res = MP_NO;
   295 		goto CLEANUP;
   296 	}
   298 	/* check that (order-1)P + (order-1)P + P == (order-1)P */
   299 	MP_CHECKOK(ECPoints_mul
   300 			   (group, &order_1, &order_1, &gx, &gy, &rx, &ry));
   301 	MP_CHECKOK(ECPoints_mul(group, &one, &one, &rx, &ry, &rx, &ry));
   302 	if (ectestPrint) {
   303 		printf
   304 			("  (order-1)*P + (order-1)*P + P == (order-1)*P (ECPoints_mul):\n");
   305 		MP_CHECKOK(mp_toradix(&rx, s, 16));
   306 		printf("    %s\n", s);
   307 		MP_CHECKOK(mp_toradix(&ry, s, 16));
   308 		printf("    %s\n", s);
   309 	}
   310 	MP_CHECKOK(ec_GF2m_add(&ry, &rx, &ry, group->meth));
   311 	if ((mp_cmp(&rx, &gx) != 0) || (mp_cmp(&ry, &gy) != 0)) {
   312 		printf("  Error: invalid result (expected (- base point)).\n");
   313 		res = MP_NO;
   314 		goto CLEANUP;
   315 	}
   317 	/* test validate_point function */
   318 	if (ECPoint_validate(group, &gx, &gy) != MP_YES) {
   319 		printf("  Error: validate point on base point failed.\n");
   320 		res = MP_NO;
   321 		goto CLEANUP;
   322 	}
   323 	MP_CHECKOK(mp_add_d(&gy, 1, &ry));
   324 	if (ECPoint_validate(group, &gx, &ry) != MP_NO) {
   325 		printf("  Error: validate point on invalid point passed.\n");
   326 		res = MP_NO;
   327 		goto CLEANUP;
   328 	}
   330 	if (ectestTime) {
   331 		/* compute random scalar */
   332 		size = mpl_significant_bits(&group->meth->irr);
   333 		if (size < MP_OKAY) {
   334 			goto CLEANUP;
   335 		}
   336 		MP_CHECKOK(mpp_random_size(&n, (size + ECL_BITS - 1) / ECL_BITS));
   337 		MP_CHECKOK(group->meth->field_mod(&n, &n, group->meth));
   338 		/* timed test */
   339 		if (generic) {
   340 #ifdef ECL_ENABLE_GF2M_PT_MUL_AFF
   341 			M_TimeOperation(MP_CHECKOK
   342 							(ec_GF2m_pt_mul_aff
   343 							 (&n, &group->genx, &group->geny, &rx, &ry,
   344 							  group)), 100);
   345 #endif
   346 			M_TimeOperation(MP_CHECKOK
   347 							(ECPoint_mul(group, &n, NULL, NULL, &rx, &ry)),
   348 							100);
   349 			M_TimeOperation(MP_CHECKOK
   350 							(ECPoints_mul
   351 							 (group, &n, &n, &gx, &gy, &rx, &ry)), 100);
   352 		} else {
   353 			M_TimeOperation(MP_CHECKOK
   354 							(ECPoint_mul(group, &n, NULL, NULL, &rx, &ry)),
   355 							100);
   356 			M_TimeOperation(MP_CHECKOK
   357 							(ECPoint_mul(group, &n, &gx, &gy, &rx, &ry)),
   358 							100);
   359 			M_TimeOperation(MP_CHECKOK
   360 							(ECPoints_mul
   361 							 (group, &n, &n, &gx, &gy, &rx, &ry)), 100);
   362 		}
   363 	}
   365   CLEANUP:
   366 	mp_clear(&one);
   367 	mp_clear(&order_1);
   368 	mp_clear(&gx);
   369 	mp_clear(&gy);
   370 	mp_clear(&rx);
   371 	mp_clear(&ry);
   372 	mp_clear(&n);
   373 	if (res != MP_OKAY) {
   374 		printf("  Error: exiting with error value %i\n", res);
   375 	}
   376 	return res;
   377 }
   379 /* Prints help information. */
   380 void
   381 printUsage()
   382 {
   383 	printf("Usage: ecp_test [--print] [--time]\n");
   384 	printf
   385 		("	--print     Print out results of each point arithmetic test.\n");
   386 	printf
   387 		("	--time      Benchmark point operations and print results.\n");
   388 }
   390 /* Performs tests of elliptic curve cryptography over binary polynomial
   391  * fields. If tests fail, then it prints an error message, aborts, and
   392  * returns an error code. Otherwise, returns 0. */
   393 int
   394 main(int argv, char **argc)
   395 {
   397 	int ectestTime = 0;
   398 	int ectestPrint = 0;
   399 	int i;
   400 	ECGroup *group = NULL;
   401 	ECCurveParams *params = NULL;
   402 	mp_err res;
   404 	/* read command-line arguments */
   405 	for (i = 1; i < argv; i++) {
   406 		if ((strcasecmp(argc[i], "time") == 0)
   407 			|| (strcasecmp(argc[i], "-time") == 0)
   408 			|| (strcasecmp(argc[i], "--time") == 0)) {
   409 			ectestTime = 1;
   410 		} else if ((strcasecmp(argc[i], "print") == 0)
   411 				   || (strcasecmp(argc[i], "-print") == 0)
   412 				   || (strcasecmp(argc[i], "--print") == 0)) {
   413 			ectestPrint = 1;
   414 		} else {
   415 			printUsage();
   416 			return 0;
   417 		}
   418 	}
   420 	/* generic arithmetic tests */
   421 	ECTEST_GENERIC_GF2M("SECT-131R1", ECCurve_SECG_CHAR2_131R1);
   423 	/* specific arithmetic tests */
   424 	ECTEST_NAMED_GF2M("NIST-K163", ECCurve_NIST_K163);
   425 	ECTEST_NAMED_GF2M("NIST-B163", ECCurve_NIST_B163);
   426 	ECTEST_NAMED_GF2M("NIST-K233", ECCurve_NIST_K233);
   427 	ECTEST_NAMED_GF2M("NIST-B233", ECCurve_NIST_B233);
   428 	ECTEST_NAMED_GF2M("NIST-K283", ECCurve_NIST_K283);
   429 	ECTEST_NAMED_GF2M("NIST-B283", ECCurve_NIST_B283);
   430 	ECTEST_NAMED_GF2M("NIST-K409", ECCurve_NIST_K409);
   431 	ECTEST_NAMED_GF2M("NIST-B409", ECCurve_NIST_B409);
   432 	ECTEST_NAMED_GF2M("NIST-K571", ECCurve_NIST_K571);
   433 	ECTEST_NAMED_GF2M("NIST-B571", ECCurve_NIST_B571);
   434 	ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB163V1", ECCurve_X9_62_CHAR2_PNB163V1);
   435 	ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB163V2", ECCurve_X9_62_CHAR2_PNB163V2);
   436 	ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB163V3", ECCurve_X9_62_CHAR2_PNB163V3);
   437 	ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB176V1", ECCurve_X9_62_CHAR2_PNB176V1);
   438 	ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB191V1", ECCurve_X9_62_CHAR2_TNB191V1);
   439 	ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB191V2", ECCurve_X9_62_CHAR2_TNB191V2);
   440 	ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB191V3", ECCurve_X9_62_CHAR2_TNB191V3);
   441 	ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB208W1", ECCurve_X9_62_CHAR2_PNB208W1);
   442 	ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB239V1", ECCurve_X9_62_CHAR2_TNB239V1);
   443 	ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB239V2", ECCurve_X9_62_CHAR2_TNB239V2);
   444 	ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB239V3", ECCurve_X9_62_CHAR2_TNB239V3);
   445 	ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB272W1", ECCurve_X9_62_CHAR2_PNB272W1);
   446 	ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB304W1", ECCurve_X9_62_CHAR2_PNB304W1);
   447 	ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB359V1", ECCurve_X9_62_CHAR2_TNB359V1);
   448 	ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB368W1", ECCurve_X9_62_CHAR2_PNB368W1);
   449 	ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB431R1", ECCurve_X9_62_CHAR2_TNB431R1);
   450 	ECTEST_NAMED_GF2M("SECT-113R1", ECCurve_SECG_CHAR2_113R1);
   451 	ECTEST_NAMED_GF2M("SECT-113R2", ECCurve_SECG_CHAR2_113R2);
   452 	ECTEST_NAMED_GF2M("SECT-131R1", ECCurve_SECG_CHAR2_131R1);
   453 	ECTEST_NAMED_GF2M("SECT-131R2", ECCurve_SECG_CHAR2_131R2);
   454 	ECTEST_NAMED_GF2M("SECT-163K1", ECCurve_SECG_CHAR2_163K1);
   455 	ECTEST_NAMED_GF2M("SECT-163R1", ECCurve_SECG_CHAR2_163R1);
   456 	ECTEST_NAMED_GF2M("SECT-163R2", ECCurve_SECG_CHAR2_163R2);
   457 	ECTEST_NAMED_GF2M("SECT-193R1", ECCurve_SECG_CHAR2_193R1);
   458 	ECTEST_NAMED_GF2M("SECT-193R2", ECCurve_SECG_CHAR2_193R2);
   459 	ECTEST_NAMED_GF2M("SECT-233K1", ECCurve_SECG_CHAR2_233K1);
   460 	ECTEST_NAMED_GF2M("SECT-233R1", ECCurve_SECG_CHAR2_233R1);
   461 	ECTEST_NAMED_GF2M("SECT-239K1", ECCurve_SECG_CHAR2_239K1);
   462 	ECTEST_NAMED_GF2M("SECT-283K1", ECCurve_SECG_CHAR2_283K1);
   463 	ECTEST_NAMED_GF2M("SECT-283R1", ECCurve_SECG_CHAR2_283R1);
   464 	ECTEST_NAMED_GF2M("SECT-409K1", ECCurve_SECG_CHAR2_409K1);
   465 	ECTEST_NAMED_GF2M("SECT-409R1", ECCurve_SECG_CHAR2_409R1);
   466 	ECTEST_NAMED_GF2M("SECT-571K1", ECCurve_SECG_CHAR2_571K1);
   467 	ECTEST_NAMED_GF2M("SECT-571R1", ECCurve_SECG_CHAR2_571R1);
   468 	ECTEST_NAMED_GF2M("WTLS-1 (113)", ECCurve_WTLS_1);
   469 	ECTEST_NAMED_GF2M("WTLS-3 (163)", ECCurve_WTLS_3);
   470 	ECTEST_NAMED_GF2M("WTLS-4 (113)", ECCurve_WTLS_4);
   471 	ECTEST_NAMED_GF2M("WTLS-5 (163)", ECCurve_WTLS_5);
   472 	ECTEST_NAMED_GF2M("WTLS-10 (233)", ECCurve_WTLS_10);
   473 	ECTEST_NAMED_GF2M("WTLS-11 (233)", ECCurve_WTLS_11);
   475   CLEANUP:
   476 	EC_FreeCurveParams(params);
   477 	ECGroup_free(group);
   478 	if (res != MP_OKAY) {
   479 		printf("Error: exiting with error value %i\n", res);
   480 	}
   481 	return res;
   482 }

mercurial