diff --git a/include/dap_enc_iaes.h b/include/dap_enc_iaes.h
index 8472dede0cf3699dee5e1b5b2a17aac1c9293afc..b1389eb6b74a0e952b0f86a4eb42d1b354322b9a 100755
--- a/include/dap_enc_iaes.h
+++ b/include/dap_enc_iaes.h
@@ -17,7 +17,7 @@ void dap_enc_aes_key_delete(struct dap_enc_key *a_key);
 void dap_enc_aes_key_generate(struct dap_enc_key * a_key, const void *kex_buf, size_t kex_size,
                               const void * seed, size_t seed_size, size_t key_size);
 
-size_t dap_enc_iaes256_calc_decode_size(const size_t size_in);
+size_t dap_enc_iaes256_calc_decode_max_size(const size_t size_in);
 size_t dap_enc_iaes256_calc_encode_size(const size_t size_in);
 
 size_t dap_enc_iaes256_cbc_decrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out);
diff --git a/src/dap_enc_iaes.c b/src/dap_enc_iaes.c
index f55d3bb30c959e435aa064b857e231dff9d33982..293e298dcf3bc78ffa519743dece4c3996a58acc 100755
--- a/src/dap_enc_iaes.c
+++ b/src/dap_enc_iaes.c
@@ -83,13 +83,13 @@ size_t dap_enc_iaes256_cbc_decrypt(struct dap_enc_key * a_key, const void * a_in
 
     *a_out = (uint8_t *) malloc(a_in_size);
 
-    return IAES_256_CBC_decrypt(a_in, *a_out, DAP_ENC_AES_KEY(a_key)->ivec, a_in_size, a_key->priv_key_data);
+    return dap_enc_iaes256_cbc_decrypt_fast(a_key, a_in, a_in_size, *a_out, a_in_size);
 }
 
 size_t dap_enc_iaes256_cbc_decrypt_fast(struct dap_enc_key * a_key, const void * a_in,
                                         size_t a_in_size, void * buf_out, size_t buf_out_size)
 {
-    if (a_in_size % 16) {
+    if (a_in_size % IAES_BLOCK_SIZE) {
         log_it(L_ERROR, "Bad in size");
         return 0;
     } else if(buf_out_size < a_in_size) {
@@ -97,30 +97,53 @@ size_t dap_enc_iaes256_cbc_decrypt_fast(struct dap_enc_key * a_key, const void *
         return 0;
     }
 
-    return IAES_256_CBC_decrypt(a_in, buf_out, DAP_ENC_AES_KEY(a_key)->ivec,
-                                a_in_size, a_key->priv_key_data);
+    size_t block_in32_size = IAES_BLOCK_SIZE/sizeof(uint32_t);
+    uint32_t round_decrypt_key[60];
+    uint32_t feedback[block_in32_size];
+
+    memcpy(&feedback[0], DAP_ENC_AES_KEY(a_key)->ivec, IAES_BLOCK_SIZE);
+    swap_endian((uint32_t *)a_key->priv_key_data, IAES_KEYSIZE/sizeof(uint32_t));
+    Key_Shedule_for_decrypT((uint32_t *)a_key->priv_key_data, round_decrypt_key);
+
+    void *data = buf_out;
+    const void *cdata = a_in;
+    size_t count_block, count32_word;
+    for(count_block = 0; count_block < (a_in_size/IAES_BLOCK_SIZE); count_block++){
+
+        AES256_dec_cernelT((uint32_t *)cdata + count_block*block_in32_size,
+                           (uint32_t *)data + count_block*block_in32_size, round_decrypt_key);
+
+        for (count32_word = 0; count32_word < block_in32_size; count32_word++)
+            *((uint32_t *)data + count_block * block_in32_size + count32_word) ^= feedback[count32_word];
+        memcpy(&feedback[0], (uint32_t *)cdata + count_block*block_in32_size, IAES_BLOCK_SIZE);
+    }
+//    for(int i = 0; i < 16; ++i)
+//    {printf("%.2x ", ((uint8_t*)data)[i]);}
+//    printf("\n");fflush(stdout);
+    swap_endian((uint32_t *)a_key->priv_key_data, IAES_KEYSIZE/sizeof(uint32_t));
+
+    return a_in_size - ((uint8_t *)data)[a_in_size - 1];
+
 }
 
 size_t dap_enc_iaes256_cbc_encrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out)
 {
     size_t length_data_new;
-    uint8_t *data_new;
 
-    length_data_new = iaes_block128_padding(a_in, &data_new, a_in_size);
-    *a_out = (uint8_t *)malloc(length_data_new);
+    length_data_new = dap_enc_iaes256_calc_encode_size(a_in_size);
 
-    IAES_256_CBC_encrypt(data_new, *a_out, DAP_ENC_AES_KEY(a_key)->ivec, length_data_new, a_key->priv_key_data);
+     *a_out = DAP_NEW_SIZE(uint8_t, length_data_new);
 
-    free(data_new);
+    dap_enc_iaes256_cbc_encrypt_fast(a_key, a_in, a_in_size, *a_out, length_data_new);
     return length_data_new;
 }
 
 size_t dap_enc_iaes256_calc_encode_size(const size_t size_in)
 {
-    return iaes_calc_block128_size(size_in);
+    return size_in + 1 + (IAES_BLOCK_SIZE - (size_in + 1)%IAES_BLOCK_SIZE)%IAES_BLOCK_SIZE;
 }
 
-size_t dap_enc_iaes256_calc_decode_size(const size_t size_in)
+size_t dap_enc_iaes256_calc_decode_max_size(const size_t size_in)
 {
     return size_in;
 }
@@ -128,24 +151,60 @@ size_t dap_enc_iaes256_calc_decode_size(const size_t size_in)
 size_t dap_enc_iaes256_cbc_encrypt_fast(struct dap_enc_key * a_key, const void * a_in,
                                         size_t a_in_size, void * buf_out, size_t buf_out_size)
 {
-    size_t out_size = iaes_calc_block128_size(a_in_size);
-
-    if((a_in_size % IAES_BLOCK_SIZE) == 0) {
-        IAES_256_CBC_encrypt(a_in, buf_out, DAP_ENC_AES_KEY(a_key)->ivec, out_size, a_key->priv_key_data);
-        return out_size;
-    }
-
+    size_t out_size = dap_enc_iaes256_calc_encode_size(a_in_size);
     if(buf_out_size < out_size) {
         log_it(L_ERROR, "buf_out_size less than expected encrypt out size data");
         return 0;
     }
-    uint8_t* data_in_new;
-    iaes_block128_padding(a_in, &data_in_new, a_in_size);
 
-    IAES_256_CBC_encrypt(data_in_new, buf_out, DAP_ENC_AES_KEY(a_key)->ivec,
-                         out_size, a_key->priv_key_data);
+    int last_block_from_in = a_in_size%IAES_BLOCK_SIZE;
+
+    size_t block_in32_size = IAES_BLOCK_SIZE/sizeof(uint32_t);
+    uint32_t feedback[block_in32_size];
+
+    memcpy(&feedback[0], DAP_ENC_AES_KEY(a_key)->ivec, IAES_BLOCK_SIZE);
+    swap_endian((uint32_t *)a_key->priv_key_data, IAES_KEYSIZE/sizeof(uint32_t));
+
+    size_t count_block, count32_word;
+    const void *data = a_in;
+    void *cdata = buf_out;
+    for(count_block = 0; count_block < (a_in_size - last_block_from_in)/IAES_BLOCK_SIZE; count_block++)
+    {
+        for (count32_word = 0; count32_word < block_in32_size; count32_word++)
+           *((uint32_t *)cdata + count_block * block_in32_size + count32_word) =
+                *((uint32_t *)data + count_block * block_in32_size + count32_word) ^ feedback[count32_word];
+
+        AES256_enc_cernelT(((uint32_t *)cdata + count_block * block_in32_size), feedback, (uint32_t *)a_key->priv_key_data);
+
+        memcpy ((uint32_t *)cdata + count_block * block_in32_size, &feedback[0], IAES_BLOCK_SIZE);
+    }
+    uint8_t tmp_in[IAES_BLOCK_SIZE];
+    memcpy(tmp_in, a_in + a_in_size/IAES_BLOCK_SIZE*IAES_BLOCK_SIZE, last_block_from_in);
+    int padd_size = IAES_BLOCK_SIZE - last_block_from_in;
+    for(int padd_num = 0; padd_num < padd_size - 1; ++padd_num)
+        tmp_in[last_block_from_in + padd_num] = 16;
+
+    tmp_in[IAES_BLOCK_SIZE - 1] = padd_size;
+
+    for (count32_word = 0; count32_word < block_in32_size; count32_word++)
+       *((uint32_t *)cdata + count_block * block_in32_size + count32_word) =
+            *((uint32_t *)tmp_in + count32_word) ^ feedback[count32_word];
+
+    AES256_enc_cernelT(((uint32_t *)cdata + count_block * block_in32_size), feedback, (uint32_t *)a_key->priv_key_data);
+
+    memcpy ((uint32_t *)cdata + count_block * block_in32_size, &feedback[0], IAES_BLOCK_SIZE);
+    swap_endian((uint32_t *)a_key->priv_key_data,IAES_KEYSIZE/sizeof(uint32_t));
+
+
+//    IAES_256_CBC_encrypt(a_in, buf_out, DAP_ENC_AES_KEY(a_key)->ivec, a_in_size - last_block_from_in, a_key->priv_key_data);
+//    uint8_t tmp_in[IAES_BLOCK_SIZE];
+//    memcpy(tmp_in, a_in + a_in_size/IAES_BLOCK_SIZE*IAES_BLOCK_SIZE, last_block_from_in);
+//    int padd_size = IAES_BLOCK_SIZE - last_block_from_in;
+//    for(int padd_num = 0; padd_num < padd_size; ++padd_num)
+//        tmp_in[last_block_from_in + padd_num] = 16;
 
-    free(data_in_new);
+//    tmp_in[last_block_from_in + IAES_BLOCK_SIZE - 1] = padd_size;
+//    IAES_256_CBC_encrypt(tmp_in, buf_out + a_in_size - last_block_from_in, buf_out + a_in_size - last_block_from_in - IAES_BLOCK_SIZE, IAES_BLOCK_SIZE, a_key->priv_key_data);
 
     return out_size;
 }
diff --git a/src/dap_enc_key.c b/src/dap_enc_key.c
index 8c787249fb00e3fa9e72c1dc75e2228ca1c01158..3a44d7370e4de9454a11208040ed9c6a39ac7066 100755
--- a/src/dap_enc_key.c
+++ b/src/dap_enc_key.c
@@ -79,7 +79,7 @@ struct dap_enc_key_callbacks{
         .gen_key_public = NULL,
         .gen_key_public_size = NULL,
         .enc_out_size = dap_enc_iaes256_calc_encode_size,
-        .dec_out_size = dap_enc_iaes256_calc_decode_size,
+        .dec_out_size = dap_enc_iaes256_calc_decode_max_size,
         .sign_get = NULL,
         .sign_verify = NULL
     },
diff --git a/src/iaes/dap_iaes_proto.h b/src/iaes/dap_iaes_proto.h
index bcaef77b3c24f191ba7cde8db1f792c84d3624c4..c3b44d37b64f37ee488ba8f4e6d6f3ed7593b7d0 100755
--- a/src/iaes/dap_iaes_proto.h
+++ b/src/iaes/dap_iaes_proto.h
@@ -6,6 +6,10 @@
 
 #define IAES_BLOCK_SIZE 16
 #define IAES_KEYSIZE 32
+void AES256_enc_cernelT(uint32_t * in, uint32_t * out, uint32_t * masterkey);
+void AES256_dec_cernelT(uint32_t * in, uint32_t * out, uint32_t * decr_key);
+void swap_endian(uint32_t *buff, unsigned long len);
+void Key_Shedule_for_decrypT(uint32_t * key, uint32_t * rounds_keys);
 
 void IAES_256_CBC_encrypt(const uint8_t *data, uint8_t *output, uint8_t * ivec, unsigned long length, uint8_t *masterkey);
 size_t IAES_256_CBC_decrypt(const uint8_t *cdata, uint8_t *output, uint8_t * ivec, unsigned long length, uint8_t *key);
diff --git a/src/iaes/iaes256_cbc_cernal.c b/src/iaes/iaes256_cbc_cernal.c
index 82abb79440f0f40b916bf9aeb985ce9a2651f17a..9052a2c996371a2fa153aab5139ad5e8e61a932a 100755
--- a/src/iaes/iaes256_cbc_cernal.c
+++ b/src/iaes/iaes256_cbc_cernal.c
@@ -13,16 +13,6 @@ size_t iaes_calc_block128_size(size_t length_data)
     return new_length_data;
 }
 
-size_t iaes_block128_padding(const void *data, uint8_t **data_new, size_t length_data)
-{
-    size_t length_data_new = iaes_calc_block128_size(length_data);
-
-    *data_new = (uint8_t *) malloc(length_data_new);
-    memcpy(*data_new, data, length_data);
-    memset(*data_new + length_data, 0x0, length_data_new - length_data);
-
-    return length_data_new;
-}
 
 void swap_endian(uint32_t *buff, unsigned long len)
 {
@@ -210,7 +200,7 @@ void IAES_256_CBC_encrypt(const uint8_t *data, uint8_t *cdata, uint8_t *ivec, un
         AES256_enc_cernelT(((uint32_t *)cdata + count_block * block_in32_size), feedback, (uint32_t *)masterkey);
 
         memcpy ((uint32_t *)cdata + count_block * block_in32_size, &feedback[0], IAES_BLOCK_SIZE);
-       }
+    }
     swap_endian((uint32_t *)masterkey,IAES_KEYSIZE/sizeof(uint32_t));
 }
 
@@ -483,19 +473,7 @@ size_t IAES_256_CBC_decrypt(const uint8_t *cdata, uint8_t *data, uint8_t *ivec,
         memcpy(&feedback[0], (uint32_t *)cdata + count_block*block_in32_size, IAES_BLOCK_SIZE);
     }
     swap_endian((uint32_t *)masterkey, IAES_KEYSIZE/sizeof(uint32_t));
-
-    size_t i, padding = 0;
-    size_t end = length > 16 ? length - 16 : 0;
-	if(length>0)
-        for(i = length-1; i >= end; i--)
-        {
-            if(data[i] == 0)
-                padding++;
-            else
-                break;
-        }
-
-    return length - padding;
+    return length;
 }
 
 
diff --git a/test/crypto/dap_enc_test.c b/test/crypto/dap_enc_test.c
index 6cb74b1622871bb0fdc6c8aad8695dc0552cd6d8..2f65e109ec777f1f8de440af9d03bc94b8e2cdf7 100755
--- a/test/crypto/dap_enc_test.c
+++ b/test/crypto/dap_enc_test.c
@@ -35,7 +35,7 @@ void test_encode_decode(int count_steps, const dap_enc_key_type_t key_type, cons
 
         uint8_t *source = DAP_NEW_SIZE(uint8_t, source_size+verb);
 
-        randombase64(source, source_size);
+        randombytes(source, source_size);//randombase64(source, source_size);
 //        for(int i = 0; i < source_size; ++i)
 //            printf("%.2x ", source[i]);
 //        printf(" = len(%d)\n", source_size);fflush(stdout);
@@ -99,7 +99,7 @@ void test_encode_decode_fast(int count_steps, const dap_enc_key_type_t key_type,
         source_size = 1 + random_uint32_t(2000);
 
         uint8_t *source = DAP_NEW_SIZE(uint8_t,source_size + 0);
-        randombase64(source, source_size);
+        randombytes(source, source_size);//randombase64(source, source_size);
 
 
         size_t encrypted_size = key->enc_na(key, source, source_size, buf_encrypt_out, buf_size);
@@ -125,65 +125,62 @@ static void _encrypt_decrypt(enum dap_enc_key_type key_type,
                              size_t count_steps)
 {
     size_t source_size = 1;
-    const int MAX_SEED_SIZE = 14;
+    const int MAX_SEED_SIZE = 100;
     uint8_t seed[MAX_SEED_SIZE];
     for (size_t i = 0; i < count_steps; i++) {
-        int step = 2;// + random_uint32_t( 20);
-        source_size = (size_t)step;
+        source_size = 1 + random_uint32_t(2000);
 
         const char *kex_data = "123";
         size_t kex_size = strlen(kex_data);
-        const size_t seed_size = 2;// + random_uint32_t(MAX_SEED_SIZE-1);
+        const size_t seed_size = 1 + random_uint32_t(MAX_SEED_SIZE-1);
 
         randombytes(seed, seed_size);
-        printf("i = %d ss = %d, ss=%d\n",i, source_size,seed_size );fflush(stdout);
+//        printf("i = %d ss = %d, ss=%d\n",i, source_size,seed_size );fflush(stdout);
         uint8_t *source = DAP_NEW_SIZE(uint8_t, source_size);
-        printf(".");fflush(stdout);
+//        printf(".");fflush(stdout);
         randombytes(source, source_size);
-        printf(".");fflush(stdout);
+//        printf(".");fflush(stdout);
         dap_enc_key_t* key = dap_enc_key_new_generate(key_type, kex_data, kex_size, seed, seed_size, 0);
-        printf(".");fflush(stdout);
+//        printf(".");fflush(stdout);
 
         size_t encrypt_buff_size = dap_enc_code_out_size(key, source_size, data_type);
         uint8_t *encrypt_result = DAP_NEW_SIZE(uint8_t, encrypt_buff_size);
-        printf(".");fflush(stdout);
+//        printf(".");fflush(stdout);
         size_t encrypted_size = dap_enc_code(key, source,
                                              source_size,
                                              encrypt_result,
                                              encrypt_buff_size,
                                              data_type);
-        printf(".");fflush(stdout);
+//        printf(".");fflush(stdout);
         size_t min_decode_buff_size = dap_enc_decode_out_size(key, encrypt_buff_size, data_type);
-        printf(".");fflush(stdout);
+//        printf(".");fflush(stdout);
         uint8_t *decode_result = DAP_NEW_SIZE(uint8_t, min_decode_buff_size);
-        printf(".");fflush(stdout);
+//        printf(".");fflush(stdout);
         size_t out_size = dap_enc_decode(key,
                                          encrypt_result,
                                          encrypted_size,
                                          decode_result,
                                          min_decode_buff_size,
                                          data_type);
-        printf("source_size = %d, out_size = %d, min_decode_buff_size = %d, encrypt_buff_size = %d, encrypted_size = %d\n",
-               source_size, out_size,min_decode_buff_size, encrypt_buff_size, encrypted_size);
-        printf("%.2x%.2x\n", source[0], source[1]);
-        printf(".");fflush(stdout);
+//        printf("source_size = %d, out_size = %d, min_decode_buff_size = %d, encrypt_buff_size = %d, encrypted_size = %d\n",
+//               source_size, out_size,min_decode_buff_size, encrypt_buff_size, encrypted_size);
+//        printf("%.2x%.2x\n", source[0], source[1]);
+//        printf(".");fflush(stdout);
 
         dap_assert_PIF(source_size == out_size, "Check result decode size");
 
-        printf(".");fflush(stdout);
+//        printf(".");fflush(stdout);
         dap_assert_PIF(memcmp(source, decode_result, source_size) == 0, "Check source and encode->decode data");
-        printf(".");fflush(stdout);
-#ifdef xxxxx
+//        printf(".");fflush(stdout);
+//#ifdef xxxxx
 
 
 
-#endif
+//#endif
         DAP_DELETE(decode_result);
         DAP_DELETE(encrypt_result);
         DAP_DELETE(source);
-        printf(".");fflush(stdout);
         dap_enc_key_delete(key);
-        printf(".\n");fflush(stdout);
     }
 }
 
@@ -466,9 +463,9 @@ static void test_serealize_deserealize_pub_priv(dap_enc_key_type_t key_type)
 void dap_enc_tests_run() {
     dap_print_module_name("dap_enc");
     init_test_case();
-    test_encode_decode_raw(500);return;
-    test_encode_decode_raw_b64(50);
-    test_encode_decode_raw_b64_url_safe(50);
+    test_encode_decode_raw(500);
+    test_encode_decode_raw_b64(500);
+    test_encode_decode_raw_b64_url_safe(500);
     test_key_transfer_msrln();
     dap_print_module_name("dap_enc serealize->deserealize IAES");
     test_serealize_deserealize(DAP_ENC_KEY_TYPE_IAES);
diff --git a/test/crypto/main.c b/test/crypto/main.c
index 6d833774cf5943dfae30e7434441d9f56e3ed04e..98a06898b19a36ebe248d66b31099fba861805bf 100755
--- a/test/crypto/main.c
+++ b/test/crypto/main.c
@@ -19,19 +19,19 @@ int main(void)
  // switch off debug info from library
     dap_log_level_set(L_CRITICAL);
 
-    dap_enc_tests_run();return 0;
+    dap_enc_tests_run();
 
-    dap_enc_ringct20_tests_run(100);
-    test_encode_decode      (100, DAP_ENC_KEY_TYPE_BF_CBC,0);
-    test_encode_decode_fast (100, DAP_ENC_KEY_TYPE_BF_CBC,0);
-    test_encode_decode      (100, DAP_ENC_KEY_TYPE_BF_OFB,0);
-    test_encode_decode_fast (100, DAP_ENC_KEY_TYPE_BF_OFB,0);
-    test_encode_decode      (100, DAP_ENC_KEY_TYPE_GOST_OFB,32);
-    test_encode_decode_fast (100, DAP_ENC_KEY_TYPE_GOST_OFB,32);
-    test_encode_decode      (100, DAP_ENC_KEY_TYPE_IAES,32);
-    test_encode_decode_fast (100, DAP_ENC_KEY_TYPE_IAES,32);
-    test_encode_decode      (100, DAP_ENC_KEY_TYPE_OAES,32);
-    test_encode_decode_fast (100, DAP_ENC_KEY_TYPE_OAES,32);
+    dap_enc_ringct20_tests_run(1000);
+    test_encode_decode      (1000, DAP_ENC_KEY_TYPE_BF_CBC,0);
+    test_encode_decode_fast (1000, DAP_ENC_KEY_TYPE_BF_CBC,0);
+    test_encode_decode      (1000, DAP_ENC_KEY_TYPE_BF_OFB,0);
+    test_encode_decode_fast (1000, DAP_ENC_KEY_TYPE_BF_OFB,0);
+    test_encode_decode      (1000, DAP_ENC_KEY_TYPE_GOST_OFB,32);
+    test_encode_decode_fast (1000, DAP_ENC_KEY_TYPE_GOST_OFB,32);
+    test_encode_decode      (1000, DAP_ENC_KEY_TYPE_IAES,32);
+    test_encode_decode_fast (1000, DAP_ENC_KEY_TYPE_IAES,32);
+    test_encode_decode      (1000, DAP_ENC_KEY_TYPE_OAES,32);
+    test_encode_decode_fast (1000, DAP_ENC_KEY_TYPE_OAES,32);
 
     dap_enc_picnic_tests_run();
     dap_enc_sig_bliss_tests_run();