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