X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=ctypescrypto%2Fpkey.py;h=56e8746ecb919201bf5fcdde568c91f3225c24e7;hb=3ddc0864d900227434283bfc5956e0c4342a6b01;hp=59a53486f9f62e877cf1748fc5e6c83f5f15a063;hpb=72a7754bfee5206288d9211b740dae7b2ca9618b;p=oss%2Fctypescrypto.git diff --git a/ctypescrypto/pkey.py b/ctypescrypto/pkey.py index 59a5348..56e8746 100644 --- a/ctypescrypto/pkey.py +++ b/ctypescrypto/pkey.py @@ -30,16 +30,16 @@ def password_callback(buf,length,rwflag,u): _cb=CALLBACK_FUNC(password_callback) -class PKey: +class PKey(object): def __init__(self,ptr=None,privkey=None,pubkey=None,format="PEM",cansign=False,password=None): if not ptr is None: self.key=ptr self.cansign=cansign if not privkey is None or not pubkey is None: - raise TypeError("Just one of pubkey or privkey can be specified") + raise TypeError("Just one of ptr, pubkey or privkey can be specified") elif not privkey is None: if not pubkey is None: - raise TypeError("Just one of pubkey or privkey can be specified") + raise TypeError("Just one of ptr, pubkey or privkey can be specified") b=Membio(privkey) self.cansign=True if format == "PEM": @@ -129,17 +129,22 @@ class PKey: raise PKeyError("Initailizing derive context") if libcrypto.EVP_PKEY_derive_init(ctx)<1: raise PKeyError("derive_init") - self._configure_context(self,ctx,kwargs) + + + self._configure_context(ctx,kwargs,["ukm"]) if libcrypto.EVP_PKEY_derive_set_peer(ctx,peerkey.key)<=0: raise PKeyError("Cannot set peer key") + if "ukm" in kwargs: + if libcrypto.EVP_PKEY_CTX_ctrl(ctx,-1,1<<10,8,8,kwargs["ukm"])<=0: + raise PKeyError("Cannot set UKM") keylen=c_long(0) if libcrypto.EVP_PKEY_derive(ctx,None,byref(keylen))<=0: raise PKeyError("computing shared key length") - buf=create_string_buffer(keylen) + buf=create_string_buffer(keylen.value) if libcrypto.EVP_PKEY_derive(ctx,buf,byref(keylen))<=0: raise PKeyError("computing actual shared key") libcrypto.EVP_PKEY_CTX_free(ctx) - return buf.raw[:keylen] + return buf.raw[:keylen.value] @staticmethod def generate(algorithm,**kwargs): """ @@ -152,7 +157,7 @@ class PKey: rsa_keygen_bits=number - size of key to be generated rsa_keygen_pubexp - RSA public expontent(default 65537) - Algorithn specific parameters for DSA,DH and EC + Algorithm specific parameters for DSA,DH and EC paramsfrom=PKey object @@ -172,7 +177,7 @@ class PKey: clear_err_stack() pkey_id=c_int(0) libcrypto.EVP_PKEY_asn1_get0_info(byref(pkey_id),None,None,None,None,ameth) - libcrypto.ENGINE_finish(tmpeng) + #libcrypto.ENGINE_finish(tmpeng) if "paramsfrom" in kwargs: ctx=libcrypto.EVP_PKEY_CTX_new(kwargs["paramsfrom"].key,None) else: @@ -241,9 +246,9 @@ class PKey: continue rv=libcrypto.EVP_PKEY_CTX_ctrl_str(ctx,oper,str(opts[oper])) if rv==-2: - raise PKeyError("Parameter %s is not supported by key"%(oper)) + raise PKeyError("Parameter %s is not supported by key"%(oper,)) if rv<1: - raise PKeyError("Error setting parameter %s"(oper)) + raise PKeyError("Error setting parameter %s"%(oper,)) # Declare function prototypes libcrypto.EVP_PKEY_cmp.argtypes=(c_void_p,c_void_p) libcrypto.PEM_read_bio_PrivateKey.restype=c_void_p @@ -262,7 +267,9 @@ libcrypto.EVP_PKEY_asn1_get0_info.argtypes=(POINTER(c_int),POINTER(c_int),POINTE libcrypto.EVP_PKEY_cmp.restype=c_int libcrypto.EVP_PKEY_cmp.argtypes=(c_void_p,c_void_p) libcrypto.EVP_PKEY_CTX_ctrl_str.restype=c_int -libcrypto.EVP_PKEY_CTX_ctrl_str.argtypes=(c_void_p,) +libcrypto.EVP_PKEY_CTX_ctrl_str.argtypes=(c_void_p,c_void_p,c_void_p) +libcrypto.EVP_PKEY_CTX_ctrl.restype=c_int +libcrypto.EVP_PKEY_CTX_ctrl.argtypes=(c_void_p,c_int,c_int,c_int,c_int,c_void_p) libcrypto.EVP_PKEY_CTX_free.argtypes=(c_void_p,) libcrypto.EVP_PKEY_CTX_new.restype=c_void_p libcrypto.EVP_PKEY_CTX_new.argtypes=(c_void_p,c_void_p) @@ -291,3 +298,4 @@ libcrypto.PEM_write_bio_PrivateKey.argtypes=(c_void_p,c_void_p,c_void_p,c_char_p libcrypto.PEM_write_bio_PUBKEY.argtypes=(c_void_p,c_void_p) libcrypto.i2d_PUBKEY_bio.argtypes=(c_void_p,c_void_p) libcrypto.i2d_PrivateKey_bio.argtypes=(c_void_p,c_void_p) +libcrypto.ENGINE_finish.argtypes=(c_void_p,)