]> www.wagner.pp.ru Git - oss/ctypescrypto.git/blob - ctypescrypto/ec.py
3d880cb6a5c174ec671b24e42de555ec11680dab
[oss/ctypescrypto.git] / ctypescrypto / ec.py
1 """
2 Support for EC keypair operation missing form public libcrypto API
3 """
4 from ctypescrypto.pkey import PKey, PKeyError
5 from ctypes import c_void_p,c_char_p,c_int,byref
6 from ctypescrypto import libcrypto
7
8 def create(curve,data):
9         """
10                 Creates EC keypair from the just secret key and curve name
11                 
12                 @param curve - name of elliptic curve
13                 @param num - long number representing key
14         """
15         ec=libcrypto.EC_KEY_new_by_curve_name(curve.nid)
16         if ec is None:  
17                 raise PKeyError("EC_KEY_new_by_curvename")
18         group=libcrypto.EC_KEY_get0_group(ec)
19         if group is None:
20                 raise PKeyError("EC_KEY_get0_group")
21         libcrypto.EC_GROUP_set_asn1_flag(group,1)
22         raw_key=libcrypto.BN_new()
23         if raw_key is None:
24                 raise PKeyError("BN_new")
25         ctx=libcrypto.BN_CTX_new()
26         if ctx is None:
27                 raise PKeyError("BN_CTX_new")
28         if libcrypto.BN_bin2bn(data,len(data),raw_key) is None:
29                 raise PKeyError("BN_bin2bn")
30         order=libcrypto.BN_new()
31         if order is None:
32                 raise PKeyError("BN_new")
33         priv_key = libcrypto.BN_new()
34         if priv_key is None:
35                 raise PKeyError("BN_new")
36         if libcrypto.EC_GROUP_get_order(group,order,ctx) <=0:
37                 raise PKeyError("EC_GROUP_get_order")
38         if libcrypto.BN_nnmod(priv_key,raw_key,order,ctx) <=0:
39                 raise PKeyError("BN_nnmod")
40         if libcrypto.EC_KEY_set_private_key(ec,priv_key)<=0:
41                 raise PKeyError("EC_KEY_set_private_key")
42         pub_key=libcrypto.EC_POINT_new(group)
43         if pub_key is None:
44                 raise PKeyError("EC_POINT_new")
45         if libcrypto.EC_POINT_mul(group,pub_key,priv_key,None,None,ctx)<=0:
46                 raise PKeyError("EC_POINT_mul")
47         if libcrypto.EC_KEY_set_public_key(ec,pub_key)<=0:
48                 raise PKeyError("EC_KEY_set_public_key")
49         libcrypto.BN_free(raw_key)
50         libcrypto.BN_free(order)
51         libcrypto.BN_free(priv_key)
52         libcrypto.BN_CTX_free(ctx)
53         p=libcrypto.EVP_PKEY_new()
54         if p is None:
55                 raise PKeyError("EVP_PKEY_new") 
56         if libcrypto.EVP_PKEY_set1_EC_KEY(p,ec)<=0:
57                 raise PKeyError("EVP_PKEY_set1_EC_KEY")
58         libcrypto.EC_KEY_free(ec)
59         return PKey(ptr=p,cansign=True)
60
61
62 libcrypto.EVP_PKEY_new.restype=c_void_p
63 libcrypto.BN_new.restype=c_void_p
64 libcrypto.BN_free.argtypes=(c_void_p,)
65 libcrypto.BN_CTX_new.restype=c_void_p
66 libcrypto.BN_CTX_free.argtypes=(c_void_p,)
67 libcrypto.BN_bin2bn.argtypes=(c_char_p,c_int,c_void_p)
68 libcrypto.EC_KEY_set_private_key.argtypes=(c_void_p,c_void_p)
69 libcrypto.EC_POINT_new.argtypes=(c_void_p,)
70 libcrypto.EC_POINT_new.restype=c_void_p
71 libcrypto.EC_POINT_mul.argtypes=(c_void_p,c_void_p,c_void_p,c_void_p,c_void_p,c_void_p)
72 libcrypto.EC_KEY_set_public_key.argtypes=(c_void_p,c_void_p)
73
74