ecdsatest.c 19.8 KB
Newer Older
B
Bodo Möller 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
/* crypto/ecdsa/ecdsatest.c */
/* ====================================================================
 * Copyright (c) 2000-2002 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
 *    licensing@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).
 *
 */
B
Bodo Möller 已提交
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
/* ====================================================================
 * 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.
 *
 * In addition, Sun covenants to all licensees who provide a reciprocal
 * covenant with respect to their own patents if any, not to sue under
 * current and future patent claims necessarily infringed by the making,
 * using, practicing, selling, offering for sale and/or otherwise
 * disposing of the Contribution as delivered hereunder 
 * (or portions thereof), provided that such covenant shall not apply:
 *  1) for code that a licensee deletes from the Contribution;
 *  2) separates from the Contribution; or
 *  3) for infringements caused by:
 *       i) the modification of the Contribution or
 *      ii) the combination of the Contribution with other software or
 *          devices where such combination causes the infringement.
 *
 * The elliptic curve binary polynomial software is originally written by 
 * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
 *
 */

B
Bodo Möller 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#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

#ifdef OPENSSL_NO_ECDSA
int main(int argc, char * argv[]) { puts("Elliptic curves are disabled."); return 0; }
#else

104 105 106 107 108 109 110 111
#include <openssl/crypto.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/x509.h>
#include <openssl/ecdsa.h>
#include <openssl/engine.h>
#include <openssl/err.h>

B
Bodo Möller 已提交
112 113 114 115 116 117 118
static BIO *bio_err=NULL;
static const char rnd_seed[] = "string to make the random number generator think it has entropy";

#define	ECDSA_NIST_TESTS	10
ECDSA_SIG*	signatures[ECDSA_NIST_TESTS];
unsigned char	digest[ECDSA_NIST_TESTS][20];

B
Bodo Möller 已提交
119 120 121 122 123 124 125 126 127
/* some declarations */
void clear_ecdsa(EC_KEY *);
int set_p192_param(EC_KEY *);
int set_p239_param(EC_KEY *);
int test_sig_vrf(EC_KEY *, const unsigned char *);
int test_x962_sig_vrf(EC_KEY *, const unsigned char *,
                           const char *, const char *, const char *);
int ecdsa_cmp(const EC_KEY *, const EC_KEY *);

128
void clear_ecdsa(EC_KEY *ecdsa)
B
Bodo Möller 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
{
	if (!ecdsa)
		return;
	if (ecdsa->group)
	{
		EC_GROUP_free(ecdsa->group);
		ecdsa->group = NULL;
	}
	if (ecdsa->pub_key)
	{
		EC_POINT_free(ecdsa->pub_key);
		ecdsa->pub_key = NULL;
	}
	if (ecdsa->priv_key)
	{
		BN_free(ecdsa->priv_key);
		ecdsa->priv_key = NULL;
	}
}

149
int set_p192_param(EC_KEY *ecdsa)
B
Bodo Möller 已提交
150 151 152 153 154 155 156 157 158
{
	BN_CTX	 *ctx=NULL;
	int 	 ret=0;

	if (!ecdsa)
		return 0;
	if ((ctx = BN_CTX_new()) == NULL) goto err;
	clear_ecdsa(ecdsa);
	
159
	if ((ecdsa->group = EC_GROUP_new_by_nid(NID_X9_62_prime192v1)) == NULL)
B
Bodo Möller 已提交
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
	{
		BIO_printf(bio_err,"ECDSA_SET_GROUP_P_192_V1() failed \n");
		goto err;
	}
	if ((ecdsa->pub_key = EC_POINT_new(ecdsa->group)) == NULL)
	{
		BIO_printf(bio_err,"EC_POINT_new failed \n");
		goto err;
	}

	if (!BN_dec2bn(&(ecdsa->priv_key), "651056770906015076056810763456358567190100156695615665659"))	goto err;
	if (!EC_POINT_mul(ecdsa->group,ecdsa->pub_key,ecdsa->priv_key,NULL,NULL,ctx))
	{
		BIO_printf(bio_err,"EC_POINT_mul() failed \n");
		goto err;
	}
	ret = 1;

err :	if (ctx)	BN_CTX_free(ctx);
	return ret;
}

182
int set_p239_param(EC_KEY *ecdsa)
B
Bodo Möller 已提交
183 184 185 186 187 188 189 190 191
{
	BN_CTX	 *ctx=NULL;
	int 	 ret=0;

	if (!ecdsa)
		return 0;
	if ((ctx = BN_CTX_new()) == NULL) goto err;
	clear_ecdsa(ecdsa);
	
192
	if ((ecdsa->group = EC_GROUP_new_by_nid(NID_X9_62_prime239v1)) == NULL)
B
Bodo Möller 已提交
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
	{
		BIO_printf(bio_err,"ECDSA_SET_GROUP_P_239_V1() failed \n");
		goto err;
	}
	if ((ecdsa->pub_key = EC_POINT_new(ecdsa->group)) == NULL)
	{
		BIO_printf(bio_err,"EC_POINT_new failed \n");
		goto err;
	}

	if (!BN_dec2bn(&(ecdsa->priv_key), "876300101507107567501066130761671078357010671067781776716671676178726717"))	goto err;
	if (!EC_POINT_mul(ecdsa->group,ecdsa->pub_key,ecdsa->priv_key,NULL,NULL,ctx))
	{
		BIO_printf(bio_err,"EC_POINT_mul() failed \n");
		goto err;
	}
	ret = 1;

err :	if (ctx)	BN_CTX_free(ctx);
	return ret;
}

215
int test_sig_vrf(EC_KEY *ecdsa, const unsigned char* dgst)
B
Bodo Möller 已提交
216 217 218 219
{
        int       ret=0,type=0;
        unsigned char *buffer=NULL;
        unsigned int  buf_len;
220
        clock_t  tim;
B
Bodo Möller 已提交
221 222 223 224 225 226 227 228 229 230 231
 
        if (!ecdsa || !ecdsa->group || !ecdsa->pub_key || !ecdsa->priv_key)
                return 0;
        if ((buf_len = ECDSA_size(ecdsa)) == 0)
        {
                BIO_printf(bio_err, "ECDSA_size() == 0 \n");
                goto err;
        }
        if ((buffer = OPENSSL_malloc(buf_len)) == NULL)
                goto err;
 
232
        tim = clock();
B
Bodo Möller 已提交
233 234 235 236 237
        if (!ECDSA_sign(type, dgst , 20, buffer, &buf_len, ecdsa))
        {
                BIO_printf(bio_err, "ECDSA_sign() FAILED \n");
                goto err;
        }
238 239
        tim = clock() - tim;
        BIO_printf(bio_err, " [ ECDSA_sign() %.2f"UNIT, (double)tim/(CLOCKS_PER_SEC));
B
Bodo Möller 已提交
240
 
241
        tim = clock();
B
Bodo Möller 已提交
242 243 244 245 246 247
        ret = ECDSA_verify(type, dgst, 20, buffer, buf_len, ecdsa);
        if (ret != 1)
        {
                BIO_printf(bio_err, "ECDSA_verify() FAILED \n");
                goto err;
        }
248 249
        tim = clock() - tim;
        BIO_printf(bio_err, " and ECDSA_verify() %.2f"UNIT" ] ", (double)tim/(CLOCKS_PER_SEC));
B
Bodo Möller 已提交
250 251 252 253 254
 
err:    OPENSSL_free(buffer);
        return(ret == 1);
}

255
int test_x962_sig_vrf(EC_KEY *eckey, const unsigned char *dgst,
B
Bodo Möller 已提交
256 257 258 259 260 261 262 263
                           const char *k_in, const char *r_in, const char *s_in)
{
        int       ret=0;
        ECDSA_SIG *sig=NULL;
        EC_POINT  *point=NULL;
        BIGNUM    *r=NULL,*s=NULL,*k=NULL,*x=NULL,*y=NULL,*m=NULL,*ord=NULL;
        BN_CTX    *ctx=NULL;
        char      *tmp_char=NULL;
264 265 266 267
	ECDSA_DATA *ecdsa = ecdsa_check(eckey);;
	
        if (!eckey || !eckey->group || !eckey->pub_key || !eckey->priv_key
		|| !ecdsa)
B
Bodo Möller 已提交
268
                return 0;
269 270 271 272 273
        if ((point = EC_POINT_new(eckey->group)) == NULL) goto err;
        if ((r = BN_new()) == NULL || (s = BN_new()) == NULL 
		|| (k = BN_new()) == NULL || (x = BN_new()) == NULL || 
		(y = BN_new()) == NULL || (m = BN_new()) == NULL ||
		(ord = BN_new()) == NULL) goto err;
B
Bodo Möller 已提交
274 275 276
        if ((ctx = BN_CTX_new()) == NULL) goto err;
        if (!BN_bin2bn(dgst, 20, m)) goto err;
        if (!BN_dec2bn(&k, k_in)) goto err;
277 278 279 280
        if (!EC_POINT_mul(eckey->group, point, k, NULL, NULL, ctx)) goto err;
        if (!EC_POINT_get_affine_coordinates_GFp(eckey->group, point, x, y,
		ctx)) goto err;
        if (!EC_GROUP_get_order(eckey->group, ord, ctx)) goto err;
B
Bodo Möller 已提交
281
        if ((ecdsa->r = BN_dup(x)) == NULL) goto err;
282 283
        if ((ecdsa->kinv = BN_mod_inverse(NULL, k, ord, ctx)) == NULL)
		goto err;
B
Bodo Möller 已提交
284
 
285
        if ((sig = ECDSA_do_sign(dgst, 20, eckey)) == NULL)
B
Bodo Möller 已提交
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
        {
                BIO_printf(bio_err,"ECDSA_do_sign() failed \n");
                goto err;
        }
 
        if (!BN_dec2bn(&r, r_in)) goto err;
        if (!BN_dec2bn(&s, s_in)) goto err;
        if (BN_cmp(sig->r,r) != 0 || BN_cmp(sig->s,s) != 0)
        {
                tmp_char = OPENSSL_malloc(128);
                if (tmp_char == NULL) goto err;
                tmp_char = BN_bn2dec(sig->r);
                BIO_printf(bio_err,"unexpected signature \n");
                BIO_printf(bio_err,"sig->r = %s\n",tmp_char);
                tmp_char = BN_bn2dec(sig->s);
                BIO_printf(bio_err,"sig->s = %s\n",tmp_char);
                goto err;
        }
304
	        ret = ECDSA_do_verify(dgst, 20, sig, eckey);
B
Bodo Möller 已提交
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
        if (ret != 1)
        {
                BIO_printf(bio_err,"ECDSA_do_verify : signature verification failed \n");
                goto err;
        }
 
        ret = 1;
err :   if (r)    BN_free(r);
        if (s)    BN_free(s);
        if (k)    BN_free(k);
        if (x)    BN_free(x);
        if (y)    BN_free(y);
	if (m)	  BN_free(m);
        if (ord)  BN_free(ord);
        if (sig)  ECDSA_SIG_free(sig);
        if (ctx)  BN_CTX_free(ctx);
        if (point) EC_POINT_free(point);
        if (tmp_char) OPENSSL_free(tmp_char);
        return(ret == 1);
}

326
int ecdsa_cmp(const EC_KEY *a, const EC_KEY *b)
B
Bodo Möller 已提交
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
{
	int 	ret=1;
	BN_CTX	*ctx=NULL;
	BIGNUM	*tmp_a1=NULL, *tmp_a2=NULL, *tmp_a3=NULL;
	BIGNUM	*tmp_b1=NULL, *tmp_b2=NULL, *tmp_b3=NULL;

	if ((ctx = BN_CTX_new()) == NULL) return 1;
	if ((tmp_a1 = BN_new()) == NULL || (tmp_a2 = BN_new()) == NULL || (tmp_a3 = BN_new()) == NULL) goto err;
	if ((tmp_b1 = BN_new()) == NULL || (tmp_b2 = BN_new()) == NULL || (tmp_b3 = BN_new()) == NULL) goto err;

	if (a->pub_key && b->pub_key)
		if (EC_POINT_cmp(a->group, a->pub_key, b->pub_key, ctx) != 0) goto err;
	if (a->priv_key && b->priv_key)
		if (BN_cmp(a->priv_key, b->priv_key) != 0) goto err;
	if (!EC_GROUP_get_curve_GFp(a->group, tmp_a1, tmp_a2, tmp_a3, ctx)) goto err;
	if (!EC_GROUP_get_curve_GFp(a->group, tmp_b1, tmp_b2, tmp_b3, ctx)) goto err;
	if (BN_cmp(tmp_a1, tmp_b1) != 0) goto err;
	if (BN_cmp(tmp_a2, tmp_b2) != 0) goto err;
	if (BN_cmp(tmp_a3, tmp_b3) != 0) goto err;

	ret = 0;
err:	if (tmp_a1) BN_free(tmp_a1);
	if (tmp_a2) BN_free(tmp_a2);
	if (tmp_a3) BN_free(tmp_a3);
	if (tmp_b1) BN_free(tmp_b1);
	if (tmp_b2) BN_free(tmp_b2);
	if (tmp_b3) BN_free(tmp_b3);
	if (ctx) BN_CTX_free(ctx);
	return(ret);
}

int main(void)
{
360
	EC_KEY	 	*ecdsa=NULL, *ret_ecdsa=NULL;
B
Bodo Möller 已提交
361 362 363 364 365 366 367
	BIGNUM	 	*d=NULL;
	X509_PUBKEY 	*x509_pubkey=NULL;
	PKCS8_PRIV_KEY_INFO *pkcs8=NULL;
	EVP_PKEY 	*pkey=NULL, *ret_pkey=NULL;
	int 	 	dgst_len=0;
	unsigned char 	*dgst=NULL;
	int 	 	ret = 0, i=0;
368
	clock_t		tim;
B
Bodo Möller 已提交
369 370 371
	unsigned char 	*buffer=NULL;
	unsigned char   *pp;
	long		buf_len=0;
372
	double		tim_d;
B
Bodo Möller 已提交
373 374
	EVP_MD_CTX	*md_ctx=NULL;
	
375 376 377 378 379 380 381 382 383 384 385 386
	/* 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);
B
Bodo Möller 已提交
387

388
	ERR_load_crypto_strings();
B
Bodo Möller 已提交
389 390 391 392

	if (bio_err == NULL)
		bio_err=BIO_new_fp(stderr, BIO_NOCLOSE);

393
	RAND_seed(rnd_seed, sizeof(rnd_seed));
B
Bodo Möller 已提交
394

395
	if ((ecdsa = EC_KEY_new()) == NULL)   goto err;
B
Bodo Möller 已提交
396 397

	set_p192_param(ecdsa);
398
	EC_KEY_print(bio_err, ecdsa, 0);
B
Bodo Möller 已提交
399 400 401

	/* en- decode tests */

402
	/* i2d_ - d2i_ECParameters() */
B
Bodo Möller 已提交
403
	BIO_printf(bio_err, "\nTesting i2d_ - d2i_ECDSAParameters \n");
404
	buf_len = i2d_ECParameters(ecdsa, NULL);
B
Bodo Möller 已提交
405 406
	if (!buf_len || (buffer = OPENSSL_malloc(buf_len)) == NULL) goto err;
	pp = buffer;
407
	if (!i2d_ECParameters(ecdsa, &pp)) goto err;
B
Bodo Möller 已提交
408
	pp = buffer;
409
	if ((ret_ecdsa = d2i_ECParameters(&ret_ecdsa, (const unsigned char **)&pp, 
B
Bodo Möller 已提交
410
			buf_len)) == NULL) goto err;
411
	ECParameters_print(bio_err, ret_ecdsa);
B
Bodo Möller 已提交
412 413 414
	if (ecdsa_cmp(ecdsa, ret_ecdsa)) goto err;
	OPENSSL_free(buffer);
	buffer = NULL;
415
	EC_KEY_free(ret_ecdsa);
B
Bodo Möller 已提交
416 417
	ret_ecdsa = NULL;

418
	/* i2d_ - d2i_ECPrivateKey() */
B
Bodo Möller 已提交
419
	BIO_printf(bio_err, "\nTesting i2d_ - d2i_ECDSAPrivateKey \n");
420
	buf_len = i2d_ECPrivateKey(ecdsa, NULL);
B
Bodo Möller 已提交
421 422
	if (!buf_len || (buffer = OPENSSL_malloc(buf_len)) == NULL) goto err;
	pp = buffer;
423
	if (!i2d_ECPrivateKey(ecdsa, &pp)) goto err;
B
Bodo Möller 已提交
424
	pp = buffer;
425
	if ((ret_ecdsa = d2i_ECPrivateKey(&ret_ecdsa, (const unsigned char**)&pp, 
B
Bodo Möller 已提交
426
			buf_len)) == NULL) goto err;
427
	EC_KEY_print(bio_err, ret_ecdsa, 0);
B
Bodo Möller 已提交
428
	if (ecdsa_cmp(ecdsa, ret_ecdsa)) goto err;
429
	EC_KEY_free(ret_ecdsa);
B
Bodo Möller 已提交
430 431 432 433 434 435 436 437
	ret_ecdsa = NULL;
	OPENSSL_free(buffer);
	buffer = NULL;

	/* X509_PUBKEY_set() &  X509_PUBKEY_get() */	

	BIO_printf(bio_err, "\nTesting X509_PUBKEY_{get,set}            : ");
	if ((pkey = EVP_PKEY_new()) == NULL) goto err;
438
	EVP_PKEY_assign_EC_KEY(pkey, ecdsa);
B
Bodo Möller 已提交
439 440 441 442
	if ((x509_pubkey = X509_PUBKEY_new()) == NULL) goto err;
	if (!X509_PUBKEY_set(&x509_pubkey, pkey)) goto err;

	if ((ret_pkey = X509_PUBKEY_get(x509_pubkey)) == NULL) goto err;
443
	ret_ecdsa = EVP_PKEY_get1_EC_KEY(ret_pkey);
B
Bodo Möller 已提交
444 445 446 447 448 449 450 451 452 453 454
	EVP_PKEY_free(ret_pkey);
	ret_pkey = NULL;

	if (ecdsa_cmp(ecdsa, ret_ecdsa)) 
	{
		BIO_printf(bio_err, "TEST FAILED \n");
		goto err;
	}
	else BIO_printf(bio_err, "TEST OK \n");
	X509_PUBKEY_free(x509_pubkey);
	x509_pubkey = NULL;
455
	EC_KEY_free(ret_ecdsa);
B
Bodo Möller 已提交
456 457 458 459 460 461 462
	ret_ecdsa = NULL;

	/* Testing PKCS8_PRIV_KEY_INFO <-> EVP_PKEY */
	BIO_printf(bio_err, "Testing PKCS8_PRIV_KEY_INFO <-> EVP_PKEY : \n");
	BIO_printf(bio_err, "PKCS8_OK              : ");
	if ((pkcs8 = EVP_PKEY2PKCS8_broken(pkey, PKCS8_OK)) == NULL) goto err;
	if ((ret_pkey = EVP_PKCS82PKEY(pkcs8)) == NULL) goto err;
463
	ret_ecdsa = EVP_PKEY_get1_EC_KEY(ret_pkey);
B
Bodo Möller 已提交
464 465 466 467 468 469 470 471
	if (ecdsa_cmp(ecdsa, ret_ecdsa))
	{
		BIO_printf(bio_err, "TEST FAILED \n");
		goto err;
	}
	else BIO_printf(bio_err, "TEST OK \n");
	EVP_PKEY_free(ret_pkey);
	ret_pkey = NULL;
472
	EC_KEY_free(ret_ecdsa);
B
Bodo Möller 已提交
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
	ret_ecdsa = NULL;
	PKCS8_PRIV_KEY_INFO_free(pkcs8);
	EVP_PKEY_free(pkey);
	pkey  = NULL;
	ecdsa = NULL;
	pkcs8 = NULL;

	/* sign and verify tests */
	if ((d = BN_new()) == NULL) goto err;
 
        if (!BN_dec2bn(&d, "968236873715988614170569073515315707566766479517")) goto err;
        dgst_len = BN_num_bytes(d);
	if ((dgst = OPENSSL_malloc(dgst_len)) == NULL) goto err;
        if (!BN_bn2bin(d, dgst)) goto err;

        BIO_printf(bio_err, "Performing tests based on examples H.3.1 and H.3.2 of X9.62 \n");
 
        BIO_printf(bio_err, "PRIME_192_V1 : ");
491
	if ((ecdsa = EC_KEY_new()) == NULL) goto err;
B
Bodo Möller 已提交
492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508
        if (!set_p192_param(ecdsa)) goto err;
        if (!test_x962_sig_vrf(ecdsa, dgst, "6140507067065001063065065565667405560006161556565665656654",
                               "3342403536405981729393488334694600415596881826869351677613",
                               "5735822328888155254683894997897571951568553642892029982342"))
                goto err;
        else
                BIO_printf(bio_err, "OK\n");
        BIO_printf(bio_err, "PRIME_239_V1 : ");
        if (!set_p239_param(ecdsa))
                goto err;
        if (!test_x962_sig_vrf(ecdsa, dgst, "700000017569056646655505781757157107570501575775705779575555657156756655",
                               "308636143175167811492622547300668018854959378758531778147462058306432176",
                               "323813553209797357708078776831250505931891051755007842781978505179448783"))
                goto err;
        else
                BIO_printf(bio_err, "OK\n");

509
	EC_KEY_free(ecdsa);
B
Bodo Möller 已提交
510 511 512 513 514
	ecdsa = NULL;
	OPENSSL_free(dgst);
	dgst = NULL;

	for (i=0; i<ECDSA_NIST_TESTS; i++)
B
Bodo Möller 已提交
515 516 517 518 519 520 521 522 523
		if (!RAND_bytes(digest[i], 20)) goto err;

 	BIO_printf(bio_err, "\n");

/* Macro for each test */
#define ECDSA_GROUP_TEST(text, curve) \
 	BIO_printf(bio_err, "Testing sign & verify with %s : \n", text); \
	EC_KEY_free(ecdsa); \
	if ((ecdsa = EC_KEY_new()) == NULL) goto err; \
524
	if ((ecdsa->group = EC_GROUP_new_by_nid(curve)) == NULL) goto err; \
B
Bodo Möller 已提交
525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
	if (!EC_KEY_generate_key(ecdsa)) goto err; \
        tim = clock(); \
        for (i=0; i<ECDSA_NIST_TESTS; i++) \
                if ((signatures[i] = ECDSA_do_sign(digest[i], 20, ecdsa)) == NULL) goto err; \
        tim = clock() - tim; \
	tim_d = (double)tim / CLOCKS_PER_SEC; \
        BIO_printf(bio_err, "%d x ECDSA_do_sign()   in %.2f"UNIT" => average time for ECDSA_do_sign()   %.4f"UNIT"\n" \
		, ECDSA_NIST_TESTS, tim_d, tim_d / ECDSA_NIST_TESTS); \
	tim = clock(); \
	for (i=0; i<ECDSA_NIST_TESTS; i++) \
		if (!ECDSA_do_verify(digest[i], 20, signatures[i], ecdsa)) goto err; \
	tim = clock() - tim; \
	tim_d = (double)tim / CLOCKS_PER_SEC; \
	BIO_printf(bio_err, "%d x ECDSA_do_verify() in %.2f"UNIT" => average time for ECDSA_do_verify() %.4f"UNIT"\n" \
                , ECDSA_NIST_TESTS, tim_d, tim_d/ECDSA_NIST_TESTS); \
	for (i=0; i<ECDSA_NIST_TESTS; i++) \
	{ \
		ECDSA_SIG_free(signatures[i]); \
		signatures[i] = NULL; \
B
Bodo Möller 已提交
544
	}
B
Bodo Möller 已提交
545 546
	
	/* NIST PRIME CURVES TESTS */
547 548 549 550 551
	ECDSA_GROUP_TEST("NIST Prime-Curve P-192", NID_X9_62_prime192v1);
	ECDSA_GROUP_TEST("NIST Prime-Curve P-224", NID_secp224r1);
	ECDSA_GROUP_TEST("NIST Prime-Curve P-256", NID_X9_62_prime256v1);
	ECDSA_GROUP_TEST("NIST Prime-Curve P-384", NID_secp384r1);
	ECDSA_GROUP_TEST("NIST Prime-Curve P-521", NID_secp521r1);
B
Bodo Möller 已提交
552
	/* NIST BINARY CURVES TESTS */
553 554 555 556 557 558 559 560 561 562
	ECDSA_GROUP_TEST("NIST Binary-Curve K-163", NID_sect163k1);
	ECDSA_GROUP_TEST("NIST Binary-Curve B-163", NID_sect163r2);
	ECDSA_GROUP_TEST("NIST Binary-Curve K-233", NID_sect233k1);
	ECDSA_GROUP_TEST("NIST Binary-Curve B-233", NID_sect233r1);
	ECDSA_GROUP_TEST("NIST Binary-Curve K-283", NID_sect283k1);
	ECDSA_GROUP_TEST("NIST Binary-Curve B-283", NID_sect283r1);
	ECDSA_GROUP_TEST("NIST Binary-Curve K-409", NID_sect409k1);
	ECDSA_GROUP_TEST("NIST Binary-Curve B-409", NID_sect409r1);
	ECDSA_GROUP_TEST("NIST Binary-Curve K-571", NID_sect571k1);
	ECDSA_GROUP_TEST("NIST Binary-Curve B-571", NID_sect571r1);
B
Bodo Möller 已提交
563
#undef ECDSA_GROUP_TEST
B
Bodo Möller 已提交
564

565
	EC_KEY_free(ecdsa);
B
Bodo Möller 已提交
566 567 568 569 570 571 572 573 574 575 576 577 578
	ecdsa = NULL;
	OPENSSL_free(buffer);
	buffer = NULL;
	EVP_PKEY_free(pkey);
	pkey = NULL;
	
	ret = 1;
err:	if (!ret) 	
		BIO_printf(bio_err, "TEST FAILED \n");
	else 
		BIO_printf(bio_err, "TEST PASSED \n");
	if (!ret)
		ERR_print_errors(bio_err);
579
	if (ecdsa)	EC_KEY_free(ecdsa);
B
Bodo Möller 已提交
580 581 582
	if (d)		BN_free(d);
	if (dgst)	OPENSSL_free(dgst);
	if (md_ctx)	EVP_MD_CTX_destroy(md_ctx);
B
Bodo Möller 已提交
583
	if (pkey)	EVP_PKEY_free(pkey);
B
Bodo Möller 已提交
584 585 586 587 588 589 590 591 592 593 594 595 596
	CRYPTO_cleanup_all_ex_data();
	ERR_remove_state(0);
	ERR_free_strings();
	CRYPTO_mem_leaks(bio_err);
	if (bio_err != NULL)
	{
		BIO_free(bio_err);
		bio_err = NULL;
	}
	return(0);
}	

#endif