diff options
Diffstat (limited to 'crypto/ecdsa/ecdsatest.c')
-rw-r--r-- | crypto/ecdsa/ecdsatest.c | 692 |
1 files changed, 692 insertions, 0 deletions
diff --git a/crypto/ecdsa/ecdsatest.c b/crypto/ecdsa/ecdsatest.c new file mode 100644 index 0000000000..1f2cef0331 --- /dev/null +++ b/crypto/ecdsa/ecdsatest.c @@ -0,0 +1,692 @@ +/* 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). + * + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#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> + +#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 + +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]; + +void clear_ecdsa(ECDSA *ecdsa) +{ + 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; + } +} + +int set_p192_param(ECDSA *ecdsa) +{ + BN_CTX *ctx=NULL; + int ret=0; + + if (!ecdsa) + return 0; + if ((ctx = BN_CTX_new()) == NULL) goto err; + clear_ecdsa(ecdsa); + + if ((ecdsa->group = EC_GROUP_get_group_by_name(EC_GROUP_X9_62_PRIME_192V1)) == NULL) + { + 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; +} + +int set_p239_param(ECDSA *ecdsa) +{ + BN_CTX *ctx=NULL; + int ret=0; + + if (!ecdsa) + return 0; + if ((ctx = BN_CTX_new()) == NULL) goto err; + clear_ecdsa(ecdsa); + + if ((ecdsa->group = EC_GROUP_get_group_by_name(EC_GROUP_X9_62_PRIME_239V1)) == NULL) + { + 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; +} + +int test_sig_vrf(ECDSA *ecdsa, const unsigned char* dgst) +{ + int ret=0,type=0; + unsigned char *buffer=NULL; + unsigned int buf_len; + clock_t time; + + 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; + + time = clock(); + if (!ECDSA_sign(type, dgst , 20, buffer, &buf_len, ecdsa)) + { + BIO_printf(bio_err, "ECDSA_sign() FAILED \n"); + goto err; + } + time = clock() - time; + BIO_printf(bio_err, " [ ECDSA_sign() %.2f"UNIT, (double)time/(CLOCKS_PER_SEC)); + + time = clock(); + ret = ECDSA_verify(type, dgst, 20, buffer, buf_len, ecdsa); + if (ret != 1) + { + BIO_printf(bio_err, "ECDSA_verify() FAILED \n"); + goto err; + } + time = clock() - time; + BIO_printf(bio_err, " and ECDSA_verify() %.2f"UNIT" ] ", (double)time/(CLOCKS_PER_SEC)); + +err: OPENSSL_free(buffer); + return(ret == 1); +} + +int test_x962_sig_vrf(ECDSA *ecdsa, const unsigned char *dgst, + 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; + + if (!ecdsa || !ecdsa->group || !ecdsa->pub_key || !ecdsa->priv_key) + return 0; + if ((point = EC_POINT_new(ecdsa->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; + if ((ctx = BN_CTX_new()) == NULL) goto err; + if (!BN_bin2bn(dgst, 20, m)) goto err; + if (!BN_dec2bn(&k, k_in)) goto err; + if (!EC_POINT_mul(ecdsa->group, point, k, NULL, NULL, ctx)) goto err; + if (!EC_POINT_get_affine_coordinates_GFp(ecdsa->group, point, x, y, ctx)) goto err; + if (!EC_GROUP_get_order(ecdsa->group, ord, ctx)) goto err; + if ((ecdsa->r = BN_dup(x)) == NULL) goto err; + if ((ecdsa->kinv = BN_mod_inverse(NULL, k, ord, ctx)) == NULL) goto err; + + if ((sig = ECDSA_do_sign(dgst, 20, ecdsa)) == NULL) + { + 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; + } + ret = ECDSA_do_verify(dgst, 20, sig, ecdsa); + 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); +} + +int ecdsa_cmp(const ECDSA *a, const ECDSA *b) +{ + 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) +{ + ECDSA *ecdsa=NULL, *ret_ecdsa=NULL; + 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; + clock_t time; + unsigned char *buffer=NULL; + unsigned char *pp; + long buf_len=0; + double time_d; + EVP_MD_CTX *md_ctx=NULL; + + + RAND_seed(rnd_seed, sizeof(rnd_seed)); + + if (bio_err == NULL) + bio_err=BIO_new_fp(stderr, BIO_NOCLOSE); + + CRYPTO_malloc_debug_init(); + CRYPTO_dbg_set_options(V_CRYPTO_MDEBUG_ALL); + CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); + + ERR_load_crypto_strings(); + + if ((ecdsa = ECDSA_new()) == NULL) goto err; + + set_p192_param(ecdsa); + ECDSA_print(bio_err, ecdsa, 0); + + /* en- decode tests */ + + /* i2d_ - d2i_ECDSAParameters() */ + BIO_printf(bio_err, "\nTesting i2d_ - d2i_ECDSAParameters \n"); + buf_len = i2d_ECDSAParameters(ecdsa, NULL); + if (!buf_len || (buffer = OPENSSL_malloc(buf_len)) == NULL) goto err; + pp = buffer; + if (!i2d_ECDSAParameters(ecdsa, &pp)) goto err; + pp = buffer; + if ((ret_ecdsa = d2i_ECDSAParameters(&ret_ecdsa, (const unsigned char **)&pp, + buf_len)) == NULL) goto err; + ECDSAParameters_print(bio_err, ret_ecdsa); + if (ecdsa_cmp(ecdsa, ret_ecdsa)) goto err; + OPENSSL_free(buffer); + buffer = NULL; + ECDSA_free(ret_ecdsa); + ret_ecdsa = NULL; + + /* i2d_ - d2i_ECDSAPrivateKey() */ + BIO_printf(bio_err, "\nTesting i2d_ - d2i_ECDSAPrivateKey \n"); + buf_len = i2d_ECDSAPrivateKey(ecdsa, NULL); + if (!buf_len || (buffer = OPENSSL_malloc(buf_len)) == NULL) goto err; + pp = buffer; + if (!i2d_ECDSAPrivateKey(ecdsa, &pp)) goto err; + pp = buffer; + if ((ret_ecdsa = d2i_ECDSAPrivateKey(&ret_ecdsa, (const unsigned char**)&pp, + buf_len)) == NULL) goto err; + ECDSA_print(bio_err, ret_ecdsa, 0); + if (ecdsa_cmp(ecdsa, ret_ecdsa)) goto err; + ECDSA_free(ret_ecdsa); + ret_ecdsa = NULL; + OPENSSL_free(buffer); + buffer = NULL; + + /* i2d_ - d2i_ECDSAPublicKey() */ + + BIO_printf(bio_err, "\nTesting i2d_ - d2i_ECDSAPublicKey \n"); + buf_len = i2d_ECDSAPublicKey(ecdsa, NULL); + if (!buf_len || (buffer = OPENSSL_malloc(buf_len)) == NULL) goto err; + pp = buffer; + if (!i2d_ECDSAPublicKey(ecdsa, &pp)) goto err; + pp = buffer; + if ((ret_ecdsa = d2i_ECDSAPublicKey(&ret_ecdsa , (const unsigned char**)&pp, + buf_len)) == NULL) goto err; + ECDSA_print(bio_err, ret_ecdsa, 0); + if (ecdsa_cmp(ecdsa, ret_ecdsa)) goto err; + OPENSSL_free(buffer); + buffer = NULL; + ECDSA_free(ret_ecdsa); + ret_ecdsa = NULL; + + /* X509_PUBKEY_set() & X509_PUBKEY_get() */ + + BIO_printf(bio_err, "\nTesting X509_PUBKEY_{get,set} : "); + if ((pkey = EVP_PKEY_new()) == NULL) goto err; + EVP_PKEY_assign_ECDSA(pkey, ecdsa); + 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; + ret_ecdsa = EVP_PKEY_get1_ECDSA(ret_pkey); + 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; + ECDSA_free(ret_ecdsa); + 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; + ret_ecdsa = EVP_PKEY_get1_ECDSA(ret_pkey); + 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; + ECDSA_free(ret_ecdsa); + ret_ecdsa = NULL; + PKCS8_PRIV_KEY_INFO_free(pkcs8); + BIO_printf(bio_err, "PKCS8_NO_OCTET : "); + if ((pkcs8 = EVP_PKEY2PKCS8_broken(pkey, PKCS8_NO_OCTET)) == NULL) goto err; + if ((ret_pkey = EVP_PKCS82PKEY(pkcs8)) == NULL) goto err; + ret_ecdsa = EVP_PKEY_get1_ECDSA(ret_pkey); + 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; + ECDSA_free(ret_ecdsa); + ret_ecdsa = NULL; + PKCS8_PRIV_KEY_INFO_free(pkcs8); + BIO_printf(bio_err, "PKCS8_EMBEDDED_PARAM : "); + if ((pkcs8 = EVP_PKEY2PKCS8_broken(pkey, PKCS8_EMBEDDED_PARAM)) == NULL) goto err; + if ((ret_pkey = EVP_PKCS82PKEY(pkcs8)) == NULL) goto err; + ret_ecdsa = EVP_PKEY_get1_ECDSA(ret_pkey); + 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; + ECDSA_free(ret_ecdsa); + ret_ecdsa = NULL; + PKCS8_PRIV_KEY_INFO_free(pkcs8); + BIO_printf(bio_err, "PKCS8_NS_DB : "); + if ((pkcs8 = EVP_PKEY2PKCS8_broken(pkey, PKCS8_NS_DB)) == NULL) goto err; + if ((ret_pkey = EVP_PKCS82PKEY(pkcs8)) == NULL) goto err; + ret_ecdsa = EVP_PKEY_get1_ECDSA(ret_pkey); + 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; + ECDSA_free(ret_ecdsa); + ret_ecdsa = NULL; + EVP_PKEY_free(pkey); + pkey = NULL; + ecdsa = NULL; + PKCS8_PRIV_KEY_INFO_free(pkcs8); + 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 : "); + if ((ecdsa = ECDSA_new()) == NULL) goto err; + 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"); + + ECDSA_free(ecdsa); + ecdsa = NULL; + OPENSSL_free(dgst); + dgst = NULL; + + + /* NIST PRIME CURVES TESTS */ + /* EC_GROUP_NIST_PRIME_192 */ + for (i=0; i<ECDSA_NIST_TESTS; i++) + if (!RAND_bytes(digest[i], 20)) goto err; + + BIO_printf(bio_err, "\nTesting sign & verify with NIST Prime-Curve P-192 : \n"); + ECDSA_free(ecdsa); + if ((ecdsa = ECDSA_new()) == NULL) goto err; + if ((ecdsa->group = EC_GROUP_get_group_by_name(EC_GROUP_NIST_PRIME_192)) == NULL) goto err; + if (!ECDSA_generate_key(ecdsa)) goto err; + time = clock(); + for (i=0; i<ECDSA_NIST_TESTS; i++) + if ((signatures[i] = ECDSA_do_sign(digest[i], 20, ecdsa)) == NULL) goto err; + time = clock() - time; + time_d = (double)time / 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, time_d, time_d / ECDSA_NIST_TESTS); + time = clock(); + for (i=0; i<ECDSA_NIST_TESTS; i++) + if (!ECDSA_do_verify(digest[i], 20, signatures[i], ecdsa)) goto err; + time = clock() - time; + time_d = (double)time / 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, time_d, time_d/ECDSA_NIST_TESTS); + for (i=0; i<ECDSA_NIST_TESTS; i++) + { + ECDSA_SIG_free(signatures[i]); + signatures[i] = NULL; + } + + /* EC_GROUP_NIST_PRIME_224 */ + BIO_printf(bio_err, "Testing sign & verify with NIST Prime-Curve P-224 : \n"); + ECDSA_free(ecdsa); + if ((ecdsa = ECDSA_new()) == NULL) goto err; + if ((ecdsa->group = EC_GROUP_get_group_by_name(EC_GROUP_NIST_PRIME_224)) == NULL) goto err; + if (!ECDSA_generate_key(ecdsa)) goto err; + time = clock(); + for (i=0; i<ECDSA_NIST_TESTS; i++) + if ((signatures[i] = ECDSA_do_sign(digest[i], 20, ecdsa)) == NULL) goto err; + time = clock() - time; + time_d = (double)time / 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, time_d, time_d / ECDSA_NIST_TESTS); + time = clock(); + for (i=0; i<ECDSA_NIST_TESTS; i++) + if (!ECDSA_do_verify(digest[i], 20, signatures[i], ecdsa)) goto err; + time = clock() - time; + time_d = (double)time / 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, time_d, time_d/ECDSA_NIST_TESTS); + for (i=0; i<ECDSA_NIST_TESTS; i++) + { + ECDSA_SIG_free(signatures[i]); + signatures[i] = NULL; + } + + /* EC_GROUP_NIST_PRIME_256 */ + BIO_printf(bio_err, "Testing sign & verify with NIST Prime-Curve P-256 : \n"); + ECDSA_free(ecdsa); + if ((ecdsa = ECDSA_new()) == NULL) goto err; + if ((ecdsa->group = EC_GROUP_get_group_by_name(EC_GROUP_NIST_PRIME_256)) == NULL) goto err; + if (!ECDSA_generate_key(ecdsa)) goto err; + time = clock(); + for (i=0; i<ECDSA_NIST_TESTS; i++) + if ((signatures[i] = ECDSA_do_sign(digest[i], 20, ecdsa)) == NULL) goto err; + time = clock() - time; + time_d = (double)time / 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, time_d, time_d / ECDSA_NIST_TESTS); + time = clock(); + for (i=0; i<ECDSA_NIST_TESTS; i++) + if (!ECDSA_do_verify(digest[i], 20, signatures[i], ecdsa)) goto err; + time = clock() - time; + time_d = (double)time / 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, time_d, time_d/ECDSA_NIST_TESTS); + for (i=0; i<ECDSA_NIST_TESTS; i++) + { + ECDSA_SIG_free(signatures[i]); + signatures[i] = NULL; + } + + /* EC_GROUP_NIST_PRIME_384 */ + BIO_printf(bio_err, "Testing sign & verify with NIST Prime-Curve P-384 : \n"); + ECDSA_free(ecdsa); + if ((ecdsa = ECDSA_new()) == NULL) goto err; + if ((ecdsa->group = EC_GROUP_get_group_by_name(EC_GROUP_NIST_PRIME_384)) == NULL) goto err; + if (!ECDSA_generate_key(ecdsa)) goto err; + time = clock(); + for (i=0; i<ECDSA_NIST_TESTS; i++) + if ((signatures[i] = ECDSA_do_sign(digest[i], 20, ecdsa)) == NULL) goto err; + time = clock() - time; + time_d = (double)time / 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, time_d, time_d / ECDSA_NIST_TESTS); + time = clock(); + for (i=0; i<ECDSA_NIST_TESTS; i++) + if (!ECDSA_do_verify(digest[i], 20, signatures[i], ecdsa)) goto err; + time = clock() - time; + time_d = (double)time / 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, time_d, time_d/ECDSA_NIST_TESTS); + for (i=0; i<ECDSA_NIST_TESTS; i++) + { + ECDSA_SIG_free(signatures[i]); + signatures[i] = NULL; + } + + /* EC_GROUP_NIST_PRIME_521 */ + BIO_printf(bio_err, "Testing sign & verify with NIST Prime-Curve P-521 : \n"); + ECDSA_free(ecdsa); + if ((ecdsa = ECDSA_new()) == NULL) goto err; + if ((ecdsa->group = EC_GROUP_get_group_by_name(EC_GROUP_NIST_PRIME_521)) == NULL) goto err; + if (!ECDSA_generate_key(ecdsa)) goto err; + time = clock(); + for (i=0; i<ECDSA_NIST_TESTS; i++) + if ((signatures[i] = ECDSA_do_sign(digest[i], 20, ecdsa)) == NULL) goto err; + time = clock() - time; + time_d = (double)time / 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, time_d, time_d / ECDSA_NIST_TESTS); + time = clock(); + for (i=0; i<ECDSA_NIST_TESTS; i++) + if (!ECDSA_do_verify(digest[i], 20, signatures[i], ecdsa)) goto err; + time = clock() - time; + time_d = (double)time / 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, time_d, time_d/ECDSA_NIST_TESTS); + ECDSA_free(ecdsa); + ecdsa = NULL; + for (i=0; i<ECDSA_NIST_TESTS; i++) + { + ECDSA_SIG_free(signatures[i]); + signatures[i] = NULL; + } + + OPENSSL_free(buffer); + buffer = NULL; + EVP_PKEY_free(pkey); + pkey = NULL; + ecdsa = 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); + if (ecdsa) ECDSA_free(ecdsa); + if (d) BN_free(d); + if (dgst) OPENSSL_free(dgst); + if (md_ctx) EVP_MD_CTX_destroy(md_ctx); + 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 |