1# Before `make install' is performed this script should be runnable with 2# `make test'. After `make install' it should work as `perl Crypt-OpenSSL-EC.t' 3 4######################### 5 6# change 'tests => 2' to 'tests => last_test_to_print'; 7 8use strict; 9use warnings; 10 11use Test::More tests => 19; 12BEGIN { use_ok('Crypt::OpenSSL::EC'); use_ok('Crypt::OpenSSL::Bignum') }; 13 14my $fail = 0; 15foreach my $constname (qw( 16 EC_F_COMPUTE_WNAF EC_F_D2I_ECPARAMETERS EC_F_D2I_ECPKPARAMETERS 17 EC_F_D2I_ECPRIVATEKEY EC_F_DO_EC_KEY_PRINT EC_F_ECKEY_PARAM2TYPE 18 EC_F_ECKEY_PARAM_DECODE EC_F_ECKEY_PRIV_DECODE EC_F_ECKEY_PRIV_ENCODE 19 EC_F_ECKEY_PUB_DECODE EC_F_ECKEY_PUB_ENCODE EC_F_ECKEY_TYPE2PARAM 20 EC_F_ECPARAMETERS_PRINT EC_F_ECPARAMETERS_PRINT_FP 21 EC_F_ECPKPARAMETERS_PRINT EC_F_ECPKPARAMETERS_PRINT_FP 22 EC_F_ECP_NIST_MOD_192 EC_F_ECP_NIST_MOD_224 EC_F_ECP_NIST_MOD_256 23 EC_F_ECP_NIST_MOD_521 EC_F_EC_ASN1_GROUP2CURVE 24 EC_F_EC_ASN1_GROUP2FIELDID EC_F_EC_ASN1_GROUP2PARAMETERS 25 EC_F_EC_ASN1_GROUP2PKPARAMETERS EC_F_EC_ASN1_PARAMETERS2GROUP 26 EC_F_EC_ASN1_PKPARAMETERS2GROUP EC_F_EC_EX_DATA_SET_DATA 27 EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 28 EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 29 EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE EC_F_EC_GF2M_SIMPLE_OCT2POINT 30 EC_F_EC_GF2M_SIMPLE_POINT2OCT 31 EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 32 EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 33 EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 34 EC_F_EC_GFP_MONT_FIELD_DECODE EC_F_EC_GFP_MONT_FIELD_ENCODE 35 EC_F_EC_GFP_MONT_FIELD_MUL EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE 36 EC_F_EC_GFP_MONT_FIELD_SQR EC_F_EC_GFP_MONT_GROUP_SET_CURVE 37 EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP EC_F_EC_GFP_NIST_FIELD_MUL 38 EC_F_EC_GFP_NIST_FIELD_SQR EC_F_EC_GFP_NIST_GROUP_SET_CURVE 39 EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 40 EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 41 EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP 42 EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 43 EC_F_EC_GFP_SIMPLE_OCT2POINT EC_F_EC_GFP_SIMPLE_POINT2OCT 44 EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 45 EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 46 EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 47 EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 48 EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 49 EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 50 EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP EC_F_EC_GROUP_CHECK 51 EC_F_EC_GROUP_CHECK_DISCRIMINANT EC_F_EC_GROUP_COPY 52 EC_F_EC_GROUP_GET0_GENERATOR EC_F_EC_GROUP_GET_COFACTOR 53 EC_F_EC_GROUP_GET_CURVE_GF2M EC_F_EC_GROUP_GET_CURVE_GFP 54 EC_F_EC_GROUP_GET_DEGREE EC_F_EC_GROUP_GET_ORDER 55 EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 56 EC_F_EC_GROUP_NEW EC_F_EC_GROUP_NEW_BY_CURVE_NAME 57 EC_F_EC_GROUP_NEW_FROM_DATA EC_F_EC_GROUP_PRECOMPUTE_MULT 58 EC_F_EC_GROUP_SET_CURVE_GF2M EC_F_EC_GROUP_SET_CURVE_GFP 59 EC_F_EC_GROUP_SET_EXTRA_DATA EC_F_EC_GROUP_SET_GENERATOR 60 EC_F_EC_KEY_CHECK_KEY EC_F_EC_KEY_COPY EC_F_EC_KEY_GENERATE_KEY 61 EC_F_EC_KEY_NEW EC_F_EC_KEY_PRINT EC_F_EC_KEY_PRINT_FP 62 EC_F_EC_POINTS_MAKE_AFFINE EC_F_EC_POINT_ADD EC_F_EC_POINT_CMP 63 EC_F_EC_POINT_COPY EC_F_EC_POINT_DBL 64 EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 65 EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 66 EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP EC_F_EC_POINT_INVERT 67 EC_F_EC_POINT_IS_AT_INFINITY EC_F_EC_POINT_IS_ON_CURVE 68 EC_F_EC_POINT_MAKE_AFFINE EC_F_EC_POINT_MUL EC_F_EC_POINT_NEW 69 EC_F_EC_POINT_OCT2POINT EC_F_EC_POINT_POINT2OCT 70 EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 71 EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 72 EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 73 EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 74 EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 75 EC_F_EC_POINT_SET_TO_INFINITY EC_F_EC_PRE_COMP_DUP EC_F_EC_PRE_COMP_NEW 76 EC_F_EC_WNAF_MUL EC_F_EC_WNAF_PRECOMPUTE_MULT EC_F_I2D_ECPARAMETERS 77 EC_F_I2D_ECPKPARAMETERS EC_F_I2D_ECPRIVATEKEY EC_F_I2O_ECPUBLICKEY 78 EC_F_O2I_ECPUBLICKEY EC_F_OLD_EC_PRIV_DECODE EC_F_PKEY_EC_CTRL 79 EC_F_PKEY_EC_CTRL_STR EC_F_PKEY_EC_DERIVE EC_F_PKEY_EC_KEYGEN 80 EC_F_PKEY_EC_PARAMGEN EC_F_PKEY_EC_SIGN EC_PKEY_NO_PARAMETERS 81 EC_PKEY_NO_PUBKEY EC_R_ASN1_ERROR EC_R_ASN1_UNKNOWN_FIELD 82 EC_R_BUFFER_TOO_SMALL EC_R_D2I_ECPKPARAMETERS_FAILURE EC_R_DECODE_ERROR 83 EC_R_DISCRIMINANT_IS_ZERO EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 84 EC_R_FIELD_TOO_LARGE EC_R_GROUP2PKPARAMETERS_FAILURE 85 EC_R_I2D_ECPKPARAMETERS_FAILURE EC_R_INCOMPATIBLE_OBJECTS 86 EC_R_INVALID_ARGUMENT EC_R_INVALID_COMPRESSED_POINT 87 EC_R_INVALID_COMPRESSION_BIT EC_R_INVALID_CURVE 88 EC_R_INVALID_DIGEST_TYPE EC_R_INVALID_ENCODING EC_R_INVALID_FIELD 89 EC_R_INVALID_FORM EC_R_INVALID_GROUP_ORDER 90 EC_R_INVALID_PENTANOMIAL_BASIS EC_R_INVALID_PRIVATE_KEY 91 EC_R_INVALID_TRINOMIAL_BASIS EC_R_KEYS_NOT_SET EC_R_MISSING_PARAMETERS 92 EC_R_MISSING_PRIVATE_KEY EC_R_NOT_A_NIST_PRIME 93 EC_R_NOT_A_SUPPORTED_NIST_PRIME EC_R_NOT_IMPLEMENTED 94 EC_R_NOT_INITIALIZED EC_R_NO_FIELD_MOD EC_R_NO_PARAMETERS_SET 95 EC_R_PASSED_NULL_PARAMETER EC_R_PKPARAMETERS2GROUP_FAILURE 96 EC_R_POINT_AT_INFINITY EC_R_POINT_IS_NOT_ON_CURVE EC_R_SLOT_FULL 97 EC_R_UNDEFINED_GENERATOR EC_R_UNDEFINED_ORDER EC_R_UNKNOWN_GROUP 98 EC_R_UNKNOWN_ORDER EC_R_UNSUPPORTED_FIELD EC_R_WRONG_ORDER 99 EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID OPENSSL_ECC_MAX_FIELD_BITS 100 OPENSSL_EC_NAMED_CURVE POINT_CONVERSION_COMPRESSED 101 POINT_CONVERSION_HYBRID POINT_CONVERSION_UNCOMPRESSED)) { 102 next if (eval "my \$a = $constname; 1"); 103 if ($@ =~ /^Your vendor has not defined Crypt::OpenSSL::EC macro $constname/) { 104 print "# pass: $@"; 105 } else { 106 print "# fail: $@"; 107 $fail = 1; 108 } 109 110} 111 112ok( $fail == 0 , 'Constants' ); 113######################### 114 115# Insert your test code below, the Test::More module is use()ed here so read 116# its man page ( perldoc Test::More ) for help writing this test script. 117 118# Exercise basic creation and destruction code: 119 120my $method = Crypt::OpenSSL::EC::EC_GFp_mont_method(); 121ok($method); 122$method = Crypt::OpenSSL::EC::EC_GFp_mont_method(); 123ok($method); 124 125my $group = Crypt::OpenSSL::EC::EC_GROUP::new($method); 126$group = Crypt::OpenSSL::EC::EC_GROUP::new($method); 127ok($group); 128 129my $point = Crypt::OpenSSL::EC::EC_POINT::new($group); 130ok($point); 131$point = Crypt::OpenSSL::EC::EC_POINT::new($group); 132ok($point); 133 134my $key = Crypt::OpenSSL::EC::EC_KEY::new(); 135ok($key); 136$key = Crypt::OpenSSL::EC::EC_KEY::new(); 137ok($key); 138 139my $bignum = $key->get0_private_key(); 140ok($bignum); 141 142$group = $key->get0_group(); 143ok($group); 144 145$point = $key->get0_public_key(); 146ok($point); 147 148my $nid = 415; # NID_X9_62_prime256v1 149$group = Crypt::OpenSSL::EC::EC_GROUP::new_by_curve_name($nid); 150my $ctx = Crypt::OpenSSL::Bignum::CTX->new(); 151my $order = Crypt::OpenSSL::Bignum->zero; 152$group->get_order( $order, $ctx ); 153my $eckey = Crypt::OpenSSL::EC::EC_KEY::new(); 154ok($eckey); 155ok($eckey->set_group($group)); 156ok($eckey->generate_key()); 157$bignum = $eckey->get0_private_key(); 158ok($bignum); 159#print '$bignum ', $bignum, "\n"; 160my $binary = $bignum->to_bin; 161ok($binary); 162my $K = $eckey->get0_public_key(); 163ok($K); 164#print '$K: ', $K, "\n"; 165