]> www.wagner.pp.ru Git - oss/ctypescrypto.git/blobdiff - ctypescrypto/pkey.py
fixed derive for GOST2001
[oss/ctypescrypto.git] / ctypescrypto / pkey.py
index fdf384d3f446c2f97c43e2531e7a457dc9749cb7..56e8746ecb919201bf5fcdde568c91f3225c24e7 100644 (file)
@@ -36,10 +36,10 @@ class PKey(object):
                        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(object):
                        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(object):
                        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(object):
                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:
@@ -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,)