diff --git a/include/key_list.h b/include/key_list.h
index fffa8638c223df7d5d9032aeaee31cc92a4b7af8..2159cb9fe6b7d6d50159a19c3586a7b684087357 100644
--- a/include/key_list.h
+++ b/include/key_list.h
@@ -1,3 +1,7 @@
+#ifndef KEY_LIST_H
+#define KEY_LIST_H
+
+
 #include "dap_common.h"
 #include "dap_enc_key.h"
 #include <stdint.h>
@@ -24,3 +28,5 @@ dap_enc_key_t *key_list_get_key(key_list_t *list, uint8_t key);
 #ifdef __cplusplus
 }
 #endif
+
+#endif
diff --git a/src/key_list.c b/src/key_list.c
index 9f09de1adaa895d2f6be4554a7a028444c78139b..83e35a9d20f684f4f2c978b7e2862590c2e3c07a 100644
--- a/src/key_list.c
+++ b/src/key_list.c
@@ -54,4 +54,4 @@ dap_enc_key_t *key_list_get_key(key_list_t *list, uint8_t key){
         return NULL;
     }
     return list->keys[index];
-}
\ No newline at end of file
+}
diff --git a/src/libdap-crypto-python.c b/src/libdap-crypto-python.c
index 51d93c61f1ae722445b4ede36a4c77ee52e2c174..8baebb8917f8dc0b68b1488a2ef29d3590130450 100644
--- a/src/libdap-crypto-python.c
+++ b/src/libdap-crypto-python.c
@@ -11,6 +11,7 @@ static PyObject* dap_crypto_init(PyObject *self, PyObject *args){
         return PyLong_FromLong(-2);
     }
     keys = key_list_init();
+    keys_iaes = keys;
     return PyLong_FromLong(0);
 }
 
diff --git a/src/wrapping_dap_enc_key.c b/src/wrapping_dap_enc_key.c
index a07892a405e828e464441fb6aff545e73fe6814a..5e608da77475b52ff2d4bc89cf1f4a4d39239ec0 100644
--- a/src/wrapping_dap_enc_key.c
+++ b/src/wrapping_dap_enc_key.c
@@ -32,11 +32,11 @@ PyObject* dap_enc_key_get_dec_size_py(PyObject *self, PyObject *args){
 
 // allocate memory for key struct
 PyObject* dap_enc_key_new_py(PyObject *self, PyObject *args){
-    int type_key;
-    if(!PyArg_ParseTuple(args, "i", &type_key)){
+    uint8_t type_key;
+    if(!PyArg_ParseTuple(args, "h", &type_key)){
         return NULL;
     }
-    if (type_key < 0 || type_key > 16){
+    if (type_key > 16){
         return PyLong_FromLong(-1);
     }
     dap_enc_key_t *new_key = dap_enc_key_new(type_key);
@@ -45,18 +45,25 @@ PyObject* dap_enc_key_new_py(PyObject *self, PyObject *args){
 }
 
 /// default gen key
-PyObject *dap_enc_key_new_generate_py(PyObject *self, PyObject *args){ ///!!!!!!! ERR
-    /*int type_key;
-    PyObject *kex_buf;
-    size_t kex_size;
-    PyObject* seed,
-    size_t seed_size;
-    size_t key_size
-    if (PyArg_ParseTuple(args, "i|O|n|O|n|n", &type_key, &kex_buf, &kex_size, &seed, &seed_size, &key_size)){
+PyObject *dap_enc_key_new_generate_py(PyObject *self, PyObject *args){
+    uint8_t in_type_key;
+    PyBytesObject *in_kex_buf;
+    size_t in_kex_size;
+    PyBytesObject *in_seed;
+    size_t in_seed_size;
+    size_t in_key_size;
+    if (!PyArg_ParseTuple(args, "h|S|n|S|n|n", &in_type_key, &in_kex_buf, &in_kex_size, &in_seed,
+                         &in_seed_size, &in_key_size)){
         return NULL;
     }
-    //dap_enc_key_new_generate - restart*/
-    return PyLong_FromLong(0);
+    if (in_type_key > 16){
+        return PyLong_FromLong(-1);
+    }
+    void *kex_buf = PyBytes_AsString((PyObject*)in_kex_buf);
+    void *seed = PyBytes_AsString((PyObject*)in_seed);
+    dap_enc_key_t *new_key = dap_enc_key_new_generate(in_type_key, kex_buf, in_kex_size, seed, in_seed_size, in_key_size);
+    uint8_t new_key_id = key_list_add_element(keys, new_key);
+    return PyLong_FromLong(new_key_id);
 }
 
 // update struct dap_enc_key_t after insert foreign keys
@@ -134,4 +141,4 @@ PyObject *dap_enc_key_delete_py(PyObject *self, PyObject *args){
     key_list_del_element(keys, key_id);
     dap_enc_key_delete(key);
     return PyLong_FromLong(0);
-}
\ No newline at end of file
+}