diff --git a/include/dap_enc_key.h b/include/dap_enc_key.h
index 5c73591aa0aef1c80e3acae67d1c202e6000f519..0d47a9aa4a87cc005c7e83e99210e86ac33e62c0 100755
--- a/include/dap_enc_key.h
+++ b/include/dap_enc_key.h
@@ -143,6 +143,8 @@ typedef size_t (*dap_enc_callback_dataop_t)(struct dap_enc_key *key, const void
 
 typedef size_t (*dap_enc_callback_dataop_na_t)(struct dap_enc_key *key, const void *in,
                                             const size_t in_size,void * out, const size_t out_size_max);
+typedef size_t (*dap_enc_callback_dataop_na_ext_t)(struct dap_enc_key *key, const void *in,
+                                            const size_t in_size,void * out, const size_t out_size_max, const void *extra_param, const int extra_param_len);
 
 typedef int (*dap_enc_callback_sign_op_t)(struct dap_enc_key *key, const void *in,
                                             const size_t in_size,void * out, const size_t out_size_max);
@@ -180,6 +182,7 @@ typedef void (*dap_enc_callback_size_t)(struct dap_enc_key *, size_t);
 typedef void (*dap_enc_callback_str_t)(struct dap_enc_key *, const char*);
 typedef char* (*dap_enc_callback_r_str_t)(struct dap_enc_key *);
 typedef size_t (*dap_enc_callback_calc_out_size)(const size_t);
+typedef size_t (*dap_enc_get_allpbkList) (struct dap_enc_key *b_key, const void *allpbkList, const int allpbknum);
 
 typedef struct dap_enc_key {
     size_t priv_key_data_size;
@@ -196,6 +199,7 @@ typedef struct dap_enc_key {
     dap_enc_callback_dataop_t dec;
     dap_enc_callback_dataop_na_t enc_na;
     dap_enc_callback_dataop_na_t dec_na;
+    dap_enc_callback_dataop_na_ext_t dec_na_ext;
 
     dap_enc_callback_sign_op_t sign_get;
     dap_enc_callback_sign_op_t sign_verify;
@@ -203,6 +207,11 @@ typedef struct dap_enc_key {
     dap_enc_gen_alice_shared_key gen_alice_shared_key;
     dap_enc_gen_bob_shared_key gen_bob_shared_key;
 
+    void *pbkListdata;
+    size_t pbkListsize;
+    dap_enc_get_allpbkList getallpbkList;
+
+
     void * _inheritor; // WARNING! Inheritor must have only serealizeble/deserializeble data (copy)
     size_t _inheritor_size;
 } dap_enc_key_t;
diff --git a/include/dap_enc_ringct20.h b/include/dap_enc_ringct20.h
index e3388126373444ef99c07fda7217b2c12c5d39ab..39cfef2e1b879742fce114dd6ed72fd8bfbfbedc 100644
--- a/include/dap_enc_ringct20.h
+++ b/include/dap_enc_ringct20.h
@@ -5,6 +5,7 @@
 #include "dap_enc_key.h"
 
 
+size_t CRUTCH_gen_pbk_list(const ringct20_param_t *p, void **pbklist, const int pbknum);
 
 void dap_enc_sig_ringct20_set_type(DAP_RINGCT20_SIGN_SECURITY type);
 
@@ -14,6 +15,11 @@ void dap_enc_sig_ringct20_key_new_generate(struct dap_enc_key * key, const void
                                     size_t kex_size, const void * seed, size_t seed_size,
                                     size_t key_size);
 
+size_t dap_enc_sig_ringct20_get_sign_with_pbkList(struct dap_enc_key * key, const void * msg,
+        const size_t msg_size, void * signature, const size_t signature_size);
+size_t dap_enc_sig_ringct20_verify_sign_with_pbkList(struct dap_enc_key * key, const void * msg,
+        const size_t msg_size, void * signature, const size_t signature_size, const void *pbkList_buf, const int wpbkList);
+
 size_t dap_enc_sig_ringct20_get_sign(struct dap_enc_key * key,const void * msg,
                                   const size_t msg_size, void * signature, const size_t signature_size);
 
diff --git a/src/dap_enc_key.c b/src/dap_enc_key.c
index 3a44d7370e4de9454a11208040ed9c6a39ac7066..198a851c2bb391664f8a99c5b1e849c21d4f0aeb 100755
--- a/src/dap_enc_key.c
+++ b/src/dap_enc_key.c
@@ -48,6 +48,7 @@ struct dap_enc_key_callbacks{
     dap_enc_callback_dataop_t dec;
     dap_enc_callback_dataop_na_t enc_na;
     dap_enc_callback_dataop_na_t dec_na;
+    dap_enc_callback_dataop_na_ext_t dec_na_ext;
 
     dap_enc_callback_sign_op_t sign_get;
     dap_enc_callback_sign_op_t sign_verify;
@@ -258,8 +259,9 @@ struct dap_enc_key_callbacks{
         .name = "SIG_RINGCT20",
         .enc = NULL,
         .dec = NULL,
-        .enc_na = dap_enc_sig_ringct20_get_sign,
+        .enc_na = dap_enc_sig_ringct20_get_sign_with_pbkList,//dap_enc_sig_ringct20_get_sign,
         .dec_na = dap_enc_sig_ringct20_verify_sign,
+        .dec_na_ext = dap_enc_sig_ringct20_verify_sign_with_pbkList,
         .gen_key_public = NULL,
         .gen_key_public_size = NULL,
         .gen_bob_shared_key = NULL,
@@ -275,7 +277,6 @@ struct dap_enc_key_callbacks{
 };
 
 const size_t c_callbacks_size = sizeof(s_callbacks) / sizeof(s_callbacks[0]);
-
 /**
  * @brief dap_enc_key_init
  * @return
diff --git a/src/dap_enc_ringct20.c b/src/dap_enc_ringct20.c
index dd4b6050fb9f2df1a5a7a361e8a2a813a3f47964..ffaca3c5f32efecc1ceb61f7b5c621969bd9c286 100644
--- a/src/dap_enc_ringct20.c
+++ b/src/dap_enc_ringct20.c
@@ -85,22 +85,31 @@ void ringct20_unpack_pbk(const uint8_t *pbk, poly_ringct20 *a, const ringct20_pa
     unpacked_size += rct_p->POLY_RINGCT20_SIZE_PACKED;
 }
 
-void ringct20_unpack_sig(const uint8_t *sig, poly_ringct20 *a_list,
-                         poly_ringct20 *c1, poly_ringct20 **t, poly_ringct20 *h, const ringct20_param_t *rct_p)
+void ringct20_unpack_sig(const uint8_t *sig, DAP_RINGCT20_SIGN_SECURITY *sec_kind, poly_ringct20 **a_list,
+                         poly_ringct20 *c1, poly_ringct20 ***t, poly_ringct20 *h, const ringct20_param_t *rct_p, int *wLen)
 {
     uint32_t unpacked_size = 0;
+    //unpack sec_kind
+    memcpy(sec_kind, sig + unpacked_size, sizeof(DAP_RINGCT20_SIGN_SECURITY));
+    unpacked_size += sizeof(DAP_RINGCT20_SIGN_SECURITY);
+    //unpack wLen
+    memcpy(wLen, sig + unpacked_size, sizeof(*wLen));
+    unpacked_size += sizeof(*wLen);
     //unpack a_list
-    for(uint32_t i = 0; i < rct_p->wLen; ++i)
+    *a_list = malloc(rct_p->POLY_RINGCT20_SIZE* *wLen);
+    for(int i = 0; i < *wLen; ++i)
     {
-        poly_frombytes(a_list + i, sig + unpacked_size);
+        poly_frombytes(*a_list + i, sig + unpacked_size);
         unpacked_size += rct_p->POLY_RINGCT20_SIZE_PACKED;
     }
     //unpack t[W][M]
-    for(uint32_t j = 0; j < rct_p->wLen; ++j)
+    *t  = malloc(*wLen *sizeof(poly_ringct20*));
+    for(int j = 0; j < *wLen; ++j)
     {
-        for(uint32_t i = 0; i < rct_p->M; ++i)
+        (*t)[j] = malloc(rct_p->M*rct_p->POLY_RINGCT20_SIZE);
+        for(int i = 0; i < rct_p->M; ++i)
         {
-            poly_frombytes(t[j] + i, sig + unpacked_size);
+            poly_frombytes((*t)[j] + i, sig + unpacked_size);
             unpacked_size += rct_p->POLY_RINGCT20_SIZE_PACKED;
         }
     }
@@ -111,19 +120,28 @@ void ringct20_unpack_sig(const uint8_t *sig, poly_ringct20 *a_list,
     poly_frombytes(c1, sig + unpacked_size);
     unpacked_size += rct_p->POLY_RINGCT20_SIZE_PACKED;
 }
-
 void ringct20_pack_sig(uint8_t *sig, const poly_ringct20 *a_list,
-                         poly_ringct20 *c1,  poly_ringct20 **t, const poly_ringct20 *h, const ringct20_param_t *rct_p)
+                         poly_ringct20 *c1,  poly_ringct20 **t, const poly_ringct20 *h, const ringct20_param_t *rct_p, const int wLen)
 {
     uint32_t packed_size = 0;
+    //pack sec_kind
+    memcpy(sig + packed_size, &(rct_p->kind), sizeof(DAP_RINGCT20_SIGN_SECURITY));
+    packed_size += sizeof(DAP_RINGCT20_SIGN_SECURITY);
+    //pack wLen
+    memcpy(sig + packed_size, &(wLen), sizeof(wLen));
+    packed_size += sizeof(wLen);
     //pack a_list
-    for(uint32_t i = 0; i < rct_p->wLen; ++i)
+    for(uint32_t i = 0; i < wLen; ++i)
     {
         poly_tobytes(sig + packed_size, a_list + i);
         packed_size += rct_p->POLY_RINGCT20_SIZE_PACKED;
     }
+//    for(int i = 0; i < 16; ++i)
+//        printf("%.2x ", sig[i]);
+//    printf(" = sig\n"); fflush(stdout);
+
     //pack t[W][M]
-    for(uint32_t j = 0; j < rct_p->wLen; ++j)
+    for(uint32_t j = 0; j < wLen; ++j)
     {
         for(uint32_t i = 0; i < rct_p->M; ++i)
         {
@@ -139,33 +157,106 @@ void ringct20_pack_sig(uint8_t *sig, const poly_ringct20 *a_list,
     packed_size += rct_p->POLY_RINGCT20_SIZE_PACKED;
 }
 
-#define CRUTCH
-
-int get_pbk_list(poly_ringct20 *aList, const ringct20_param_t *p, const int Pi)
+int get_pbk_list(poly_ringct20 *aList, const ringct20_param_t *p, const int Pi, const int wLen,
+                 const ringct20_public_key_t *allpbk, const int allpbknum)
 {
 
-#ifndef CRUTCH
-    return -1;//Здесь должно быть обращение за списком публичных ключей
-    ringct20_public_key_t *pbk_list;
-   // pbk_list = malloc()
-#else
+    if(allpbk == 0 || allpbknum == 0)
+        return -1;
+    if(wLen < allpbknum/2)
+    {
+        log_it(L_ERROR, "Too big wLen chosen");
+        return -1;
+    }
+    int *pos_pbk_ist = DAP_NEW_SIZE(int, sizeof(int)*wLen);
+    int try_count = 0;
+    for(int i = 0; i < wLen && try_count < 3*wLen; ++i)
+    {
+        if(i == Pi)
+            continue;
+        pos_pbk_ist[i] = -1;
+        do
+        {
+            pos_pbk_ist[i] = random_uint32_t(allpbknum);
+            pos_pbk_ist[i]++;
+            if(allpbk[pos_pbk_ist[i]].kind != p->kind)
+                pos_pbk_ist[i] = -1;
+            for(int j = 0; j < i && pos_pbk_ist[i] != -1; ++j)
+                if(j != Pi && pos_pbk_ist[j] == pos_pbk_ist[i])
+                   pos_pbk_ist[i] = -1;
+        }while(pos_pbk_ist[i] != -1 && try_count < 3*wLen);
+        ringct20_unpack_pbk(allpbk[pos_pbk_ist[i]].data, aList + i, p);
+        if(try_count >= 3*wLen)
+        {
+            log_it(L_ERROR, "tired to choise so many pbk");
+            DAP_DELETE(pos_pbk_ist);
+            return -1;
+        }
+    }
+    DAP_DELETE(pos_pbk_ist);
+    return 0;//Здесь должно быть обращение за списком публичных ключей
+return 0;
+
+}
+
+size_t CRUTCH_gen_pbk_list(const ringct20_param_t *p, void **pbklist, const int pbknum)
+{
+    size_t size_pbkkey = p->RINGCT20_PBK_SIZE + sizeof (DAP_RINGCT20_SIGN_SECURITY);
+    size_t pbklistsize = size_pbkkey*pbknum;
     //get a list of some pbk
     {
+        poly_ringct20 pbk_poly;
         poly_ringct20 *Stmp = malloc(p->POLY_RINGCT20_SIZE*p->mLen);
-        for(uint32_t i = 0; i < p->wLen; ++i)
+        *pbklist = DAP_NEW_SIZE(uint8_t, size_pbkkey*pbknum);
+        for(int i = 0; i < pbknum; ++i)
         {
-            if(i == (uint32_t) Pi)
-                continue;
             LRCT_SampleKey(Stmp, p->mLen);
-            LRCT_KeyGen(aList + i, p->A, Stmp, p->mLen);
+            LRCT_KeyGen(&pbk_poly, p->A, Stmp, p->mLen);
+            *(DAP_RINGCT20_SIGN_SECURITY*)((*pbklist) + size_pbkkey*i) = p->kind;
+            ringct20_pack_pbk(((*pbklist) + size_pbkkey*i + sizeof(DAP_RINGCT20_SIGN_SECURITY)), &pbk_poly, p);
         }
         free(Stmp);
     }
-#endif
-return 0;
-
+    return pbklistsize;
 }
+int CRUTCH_get_pbk_list(poly_ringct20 *aList, const ringct20_param_t *p, const int Pi, const int wLen)
+{
+    int allpbknum = 4*wLen;
+    ringct20_public_key_t *allpbk = DAP_NEW_SIZE(ringct20_public_key_t, sizeof(ringct20_public_key_t)*allpbknum);
+    void *allpbk_buf = NULL;
+    CRUTCH_gen_pbk_list(p, &allpbk_buf, allpbknum);
+    size_t size_pbkkey = p->RINGCT20_PBK_SIZE + sizeof (DAP_RINGCT20_SIGN_SECURITY);
+    for(int i = 0; i < allpbknum; ++i)
+    {
+        allpbk[i].kind = *(DAP_RINGCT20_SIGN_SECURITY*)(allpbk_buf + size_pbkkey*i);
+        allpbk[i].data = allpbk_buf + size_pbkkey*i + sizeof(DAP_RINGCT20_SIGN_SECURITY);
+    }
 
+//    poly_ringct20 pbk_poly;
+//    //get a list of some pbk
+//    {
+//        poly_ringct20 *Stmp = malloc(p->POLY_RINGCT20_SIZE*p->mLen);
+//        for(int i = 0; i < allpbknum; ++i)
+//        {
+//            LRCT_SampleKey(Stmp, p->mLen);
+//            LRCT_KeyGen(&pbk_poly, p->A, Stmp, p->mLen);
+//            allpbk[i].kind = p->kind;
+//            allpbk[i].data = DAP_NEW_SIZE(uint8_t,p->RINGCT20_PBK_SIZE);
+//            ringct20_pack_pbk(allpbk[i].data, &pbk_poly, p);
+//        }
+//        free(Stmp);
+//    }
+    int res = get_pbk_list(aList,p,Pi,wLen, allpbk,allpbknum);
+    //free the list of some pbk
+//    for(int i = 0; i < allpbknum; ++i)
+//    {
+//        DAP_DELETE(allpbk[i].data);
+//    }
+    DAP_DELETE(allpbk);
+    DAP_DELETE(allpbk_buf);
+
+    return res;
+}
 int ringct20_crypto_sign( ringct20_signature_t *sig, const unsigned char *m, unsigned long long mlen, const ringct20_private_key_t *private_key)
 {
     ringct20_param_t *p = calloc(sizeof(ringct20_param_t),1);
@@ -183,8 +274,7 @@ int ringct20_crypto_sign( ringct20_signature_t *sig, const unsigned char *m, uns
 
     LRCT_KeyGen(aList + Pi, p->A,S,p->mLen);
 
-    get_pbk_list(aList, p, Pi);
-
+    CRUTCH_get_pbk_list(aList, p, Pi, p->mLen);
 
     poly_ringct20 h;
     poly_ringct20 *u = malloc(p->POLY_RINGCT20_SIZE*p->M);
@@ -217,15 +307,15 @@ int ringct20_crypto_sign( ringct20_signature_t *sig, const unsigned char *m, uns
     LRCT_SigGen(&c1, t, &h, p->A, p->H, S, u, p->mLen, aList, p->wLen, Pi, m, mlen);
     sig->sig_len = p->RINGCT20_SIG_SIZE;// + mlen;
     sig->sig_data = malloc(sig->sig_len);
-//    memcpy(sig->sig_data,m,mlen);//TOCORRECT
-    ringct20_pack_sig(sig->sig_data,aList,&c1, t, &h, p);
+//  memcpy(sig->sig_data,m,mlen);//TOCORRECT
+    ringct20_pack_sig(sig->sig_data, aList,&c1, t, &h, p, p->wLen);
 
 
     free(aList);
     free(S);
     free(u);
 
-    for(uint32_t i = 0; i < p->wLen; ++i)
+    for(int i = 0; i < p->wLen; ++i)
         free(t[i]);
     free(t);
 
@@ -238,8 +328,104 @@ void ringct20_signature_delete(ringct20_signature_t *sig){
     free(sig->sig_data);
     sig->sig_data = NULL;
 }
+
+/**
+ * @brief check msg[msg_size] sig with pbkList[wpbkList]
+ * @param msg
+ * @param msg_size
+ * @param sig
+ * @param pbkList
+ * @param wpbkList
+ * @return 0 if sign ckeck with pbkList[wpbkList]
+ */
+int ringct20_crypto_sign_open_with_pbkList(const unsigned char * msg, const unsigned long long msg_size,
+    const ringct20_signature_t * sig, const void *pbkList_buf, const int wpbkList)
+//const ringct20_public_key_t* pbkList)
+{
+
+    int wLenSig;
+    if(sig->sig_len < sizeof(DAP_RINGCT20_SIGN_SECURITY) + sizeof(wLenSig))
+        return -1;
+    DAP_RINGCT20_SIGN_SECURITY sec_kind = *(DAP_RINGCT20_SIGN_SECURITY*)sig->sig_data;
+    wLenSig = *(typeof (&wLenSig))(sig->sig_data + sizeof(DAP_RINGCT20_SIGN_SECURITY));
+
+    if(wpbkList != 0 && wLenSig != wpbkList)
+    {
+        return -1;
+    }
+    ringct20_param_t *p = calloc(sizeof(ringct20_param_t),1);
+    if (! ringct20_params_init( p, sec_kind))
+    {
+        ringct20_params_free(p);
+        return -1;
+    }
+
+    if(sig->sig_len < p->RINGCT20_SIG_SIZE)
+    {
+        ringct20_params_free(p);
+        return -1;
+    }
+
+    poly_ringct20 *aList = NULL;
+    poly_ringct20 h;
+    poly_ringct20 c1;
+    poly_ringct20** t = NULL;//[w][M]//TOCORRECT to *t;
+    ringct20_unpack_sig(sig->sig_data, &sec_kind, &aList,&c1, &t, &h, p, &wLenSig);
+
+    if(wpbkList)
+    {
+        ringct20_public_key_t* pbkList = DAP_NEW_SIZE(ringct20_public_key_t, sizeof(ringct20_public_key_t)*wpbkList);
+        size_t size_pbkkey = p->RINGCT20_PBK_SIZE + sizeof (DAP_RINGCT20_SIGN_SECURITY);
+
+        for(int i = 0; i < wpbkList; i++)
+        {
+            pbkList[i].kind = *(DAP_RINGCT20_SIGN_SECURITY*)(pbkList_buf+size_pbkkey*i);
+            pbkList[i].data = (uint8_t*)(pbkList_buf+size_pbkkey*i + sizeof(DAP_RINGCT20_SIGN_SECURITY));
+            //printf("i = %d secKind = %d, kind = %d\n",i, sec_kind , pbkList[i].kind);fflush(stdout);
+            if(sec_kind != pbkList[i].kind)
+            {
+                if(aList)
+                   free(aList);
+                if(t)
+                {
+                    for(int i = 0; i < wLenSig; ++i)
+                        free(t[i]);
+                    free(t);
+                }
+                ringct20_params_free(p);
+                DAP_DELETE(pbkList);
+                return -1;
+            }
+        }
+
+        for(int i = 0; i < wLenSig; ++i)
+            ringct20_unpack_pbk(pbkList[i].data, aList + i, p);
+        DAP_DELETE(pbkList);
+    }
+    int result = 1;
+
+    result = 1 ^ LRCT_SigVer(&c1, t, p->A, p->H, p->mLen, &h, aList, wLenSig, msg, msg_size);
+
+    if(aList)
+       free(aList);
+    if(t)
+    {
+        for(int i = 0; i < wLenSig; ++i)
+            free(t[i]);
+        free(t);
+    }
+    ringct20_params_free(p);
+    return result;
+}
+
+
 int ringct20_crypto_sign_open( const unsigned char * msg, const unsigned long long msg_size, const ringct20_signature_t * sig, const ringct20_public_key_t* public_key)
 {
+    if(sig->sig_len < sizeof(DAP_RINGCT20_SIGN_SECURITY))
+        return -1;
+    DAP_RINGCT20_SIGN_SECURITY sec_kind = *(DAP_RINGCT20_SIGN_SECURITY*)sig->sig_data;
+    if(sec_kind != public_key->kind)
+        return -1;
     ringct20_param_t *p = calloc(sizeof(ringct20_param_t),1);
     if (! ringct20_params_init( p, public_key->kind)){
         ringct20_params_free(p);
@@ -247,23 +433,21 @@ int ringct20_crypto_sign_open( const unsigned char * msg, const unsigned long lo
     }
     if(sig->sig_len < p->RINGCT20_SIG_SIZE)
     {
+        ringct20_params_free(p);
         return -1;
     }
 
-    poly_ringct20 *aList = malloc(p->POLY_RINGCT20_SIZE*p->wLen);
-
+    poly_ringct20 *aList = NULL;
     poly_ringct20 h;
     poly_ringct20 c1;
-    poly_ringct20** t;//[w][M]//TOCORRECT to *t;
-    t  = malloc(p->wLen*sizeof(poly_ringct20*));
-    for(uint32_t i = 0; i < p->wLen; ++i)
-        t[i] = malloc(p->M*p->POLY_RINGCT20_SIZE);
-    ringct20_unpack_sig(sig->sig_data,aList,&c1, t, &h, p);
-    //CRUTCH ADD test pbk in aList
+    poly_ringct20** t = NULL;//[w][M]//TOCORRECT to *t;
+    int wLenSig = 0;
+    ringct20_unpack_sig(sig->sig_data, &sec_kind, &aList,&c1, &t, &h, p, &wLenSig);
+
     int pbk_in_aList = 0;
     poly_ringct20 a_pi;
     ringct20_unpack_pbk(public_key->data, &a_pi, p);
-    for(uint32_t i = 0; i < p->wLen; ++i)
+    for(int i = 0; i < wLenSig; ++i)
     {
         if(poly_equal(&a_pi, aList + i))
         {
@@ -275,14 +459,16 @@ int ringct20_crypto_sign_open( const unsigned char * msg, const unsigned long lo
     int result = 1;
 
     if(pbk_in_aList)
-        result = 1 ^ LRCT_SigVer(&c1, t, p->A, p->H, p->mLen, &h, aList, p->wLen, msg, msg_size);
+        result = 1 ^ LRCT_SigVer(&c1, t, p->A, p->H, p->mLen, &h, aList, wLenSig, msg, msg_size);
 
-
-    free(aList);
-
-    for(uint32_t i = 0; i < p->wLen; ++i)
-        free(t[i]);
-    free(t);
+    if(aList)
+       free(aList);
+    if(t)
+    {
+        for(int i = 0; i < wLenSig; ++i)
+            free(t[i]);
+        free(t);
+    }
     ringct20_params_free(p);
     return result;
 }
@@ -378,31 +564,32 @@ void dap_enc_sig_ringct20_set_type(DAP_RINGCT20_SIGN_SECURITY type)
 {
     _ringct20_type = type;
 }
-
+size_t dap_enc_sig_ringct20_getallpbk(dap_enc_key_t *key, const void *allpbkList, const int allpbknum);
 void dap_enc_sig_ringct20_key_new(struct dap_enc_key *key) {
 
     key->type = DAP_ENC_KEY_TYPE_SIG_RINGCT20;
     key->enc = NULL;
-    key->enc_na = (dap_enc_callback_dataop_na_t) dap_enc_sig_ringct20_get_sign;
+    key->enc_na = (dap_enc_callback_dataop_na_t) dap_enc_sig_ringct20_get_sign_with_pbkList;//dap_enc_sig_ringct20_get_sign;
     key->dec_na = (dap_enc_callback_dataop_na_t) dap_enc_sig_ringct20_verify_sign;
-//    key->gen_bob_shared_key = (dap_enc_gen_bob_shared_key) dap_enc_sig_ringct20_get_sign;
-//    key->gen_alice_shared_key = (dap_enc_gen_alice_shared_key) dap_enc_sig_ringct20_verify_sign;
-}
+    key->dec_na_ext = (dap_enc_callback_dataop_na_ext_t) dap_enc_sig_ringct20_verify_sign_with_pbkList;//dap_enc_sig_ringct20_verify_sign;
+    key->getallpbkList = (dap_enc_get_allpbkList) dap_enc_sig_ringct20_getallpbk;
+    key->pbkListsize = 0;
+    key->pbkListdata = NULL;
 
-// generation key pair for sign Alice
-// OUTPUT:
-// a_key->data  --- Alice's public key
-// alice_priv  ---  Alice's private key
-// alice_msg_len --- Alice's private key length
+}
 
+size_t dap_enc_sig_ringct20_getallpbk(dap_enc_key_t *key, const void *allpbkList, const int allpbkListsize)
+{
+    key->pbkListdata = DAP_NEW_SIZE(uint8_t, allpbkListsize);
+    memcpy(key->pbkListdata, allpbkList, allpbkListsize);
+    key->pbkListsize= allpbkListsize;
+    return 0;
+}
 
 void dap_enc_sig_ringct20_key_new_generate(struct dap_enc_key * key, const void *kex_buf,
         size_t kex_size, const void * seed, size_t seed_size,
         size_t key_size)
 {
-//    (void) kex_buf;
-//    (void) kex_size;
-//    (void) key_size;
 
     int32_t retcode;
 
@@ -410,7 +597,6 @@ void dap_enc_sig_ringct20_key_new_generate(struct dap_enc_key * key, const void
     dap_enc_sig_ringct20_set_type(ringct20_type);
 
 
-    //int32_t type = 2;
     key->priv_key_data_size = sizeof(ringct20_private_key_t);
     key->pub_key_data_size = sizeof(ringct20_public_key_t);
     key->priv_key_data = malloc(key->priv_key_data_size);
@@ -426,6 +612,108 @@ void dap_enc_sig_ringct20_key_new_generate(struct dap_enc_key * key, const void
     }
 }
 
+int ringct20_crypto_sign_with_pbkList( ringct20_signature_t *sig, const unsigned char *m,
+    unsigned long long mlen, const ringct20_private_key_t *private_key, const void *allpbk_buf, const int allpbk_size)
+{
+
+    ringct20_param_t *p = calloc(sizeof(ringct20_param_t),1);
+    if (! ringct20_params_init( p, private_key->kind)){
+        ringct20_params_free(p);
+        return -1;
+    }
+    const int wLen = p->wLen;
+
+    int Pi = random_uint32_t(wLen);
+    poly_ringct20 *aList = malloc(p->POLY_RINGCT20_SIZE*wLen);
+    poly_ringct20 *S =  malloc(p->POLY_RINGCT20_SIZE*p->mLen);
+    ringct20_unpack_prk(private_key->data,S,p);
+
+    LRCT_KeyGen(aList + Pi, p->A,S,p->mLen);
+
+    //CRUTCH_get_pbk_list(aList, p, Pi, p->mLen);
+    size_t size_pbkkey = p->RINGCT20_PBK_SIZE + sizeof (DAP_RINGCT20_SIGN_SECURITY);
+    int filled_pbk_num = 0, sizeused = 0;
+    for(; filled_pbk_num < wLen && sizeused < allpbk_size;++filled_pbk_num)
+    {
+        if(filled_pbk_num == Pi)
+            continue;
+        DAP_RINGCT20_SIGN_SECURITY curkind = *(DAP_RINGCT20_SIGN_SECURITY*)(allpbk_buf + sizeused);
+        if(curkind != p->kind)
+            break;
+        ringct20_unpack_pbk((allpbk_buf + sizeused + sizeof(DAP_RINGCT20_SIGN_SECURITY)), aList + filled_pbk_num, p);
+        sizeused += size_pbkkey;
+    }
+    if(filled_pbk_num < wLen)
+    {
+        log_it(L_ERROR, "RINGCT20: not enough pbkeys use CRUTCH_gen_pbk_list and key->getallpbkList");
+        DAP_DELETE(aList);
+        DAP_DELETE(S);
+        return -1;
+    }
+
+
+    poly_ringct20 h;
+    poly_ringct20 *u = malloc(p->POLY_RINGCT20_SIZE*p->M);
+    poly_ringct20 c1;
+    poly_ringct20** t;//[w][M]//TOCORRECT to *t;
+    t  = malloc(wLen*sizeof(poly_ringct20*));
+    for(int i = 0; i < wLen; ++i)
+        t[i] = malloc(p->M*p->POLY_RINGCT20_SIZE);
+
+    unsigned char *bt = malloc(NEWHOPE_POLYBYTES);
+
+    for (int i = 0; i < wLen; i++)
+    {
+        for (int k = 0; k < p->M; k++)
+        {
+            poly_init(t[i] + k);
+        }
+
+    }
+
+    for (int k = 0; k < p->M; k++)
+    {
+        randombytes(bt, NEWHOPE_POLYBYTES);
+        poly_frombytes(u + k, bt);
+        poly_serial(u + k);
+        //poly_print(u+k);
+    }
+
+    free(bt);
+    LRCT_SigGen(&c1, t, &h, p->A, p->H, S, u, p->mLen, aList, wLen, Pi, m, mlen);
+    sig->sig_len = p->RINGCT20_SIG_SIZE;// + mlen;
+    sig->sig_data = malloc(sig->sig_len);
+//  memcpy(sig->sig_data,m,mlen);//TOCORRECT
+    ringct20_pack_sig(sig->sig_data, aList,&c1, t, &h, p, wLen);
+
+
+    free(aList);
+    free(S);
+    free(u);
+
+    for(int i = 0; i < wLen; ++i)
+        free(t[i]);
+    free(t);
+
+    ringct20_params_free(p);
+    return 0;
+}
+
+size_t dap_enc_sig_ringct20_get_sign_with_pbkList(struct dap_enc_key * key, const void * msg,
+        const size_t msg_size, void * signature, const size_t signature_size)
+{
+    if(signature_size < sizeof(ringct20_signature_t)) {
+        log_it(L_ERROR, "bad signature size");
+        return 0;
+    }
+
+    if(!ringct20_crypto_sign_with_pbkList((ringct20_signature_t *) signature, (const unsigned char *) msg, msg_size, key->priv_key_data, key->pbkListdata, key->pbkListsize))
+        return signature_size;
+    else
+        return 0;
+}
+
+
 size_t dap_enc_sig_ringct20_get_sign(struct dap_enc_key * key, const void * msg,
         const size_t msg_size, void * signature, const size_t signature_size)
 {
@@ -445,14 +733,30 @@ size_t dap_enc_sig_ringct20_verify_sign(struct dap_enc_key * key, const void * m
 {
     if(signature_size < sizeof(ringct20_signature_t)) {
         log_it(L_ERROR, "bad signature size");
-        return 0;
+        return 1;
     }
 
     return (ringct20_crypto_sign_open( (unsigned char *) msg, msg_size, (ringct20_signature_t *) signature, key->pub_key_data));
 }
 
+size_t dap_enc_sig_ringct20_verify_sign_with_pbkList(struct dap_enc_key * key, const void * msg,
+        const size_t msg_size, void * signature, const size_t signature_size, const void *pbkList_buf, const int wpbkList)
+{
+    if(signature_size < sizeof(ringct20_signature_t)) {
+        log_it(L_ERROR, "bad signature size");
+        return 1;
+    }
+
+    return ringct20_crypto_sign_open_with_pbkList( (unsigned char *) msg, msg_size, (ringct20_signature_t *) signature, pbkList_buf, wpbkList);
+}
+
 void dap_enc_sig_ringct20_key_delete(struct dap_enc_key * key)
 {
+    if(key->pbkListsize)
+    {
+        DAP_DELETE(key->pbkListdata);
+        key->pbkListsize = 0;
+    }
     ringct20_private_and_public_keys_delete((ringct20_private_key_t *) key->priv_key_data,
             (ringct20_public_key_t *) key->pub_key_data);
 }
diff --git a/src/ringct20/ringct20_params.c b/src/ringct20/ringct20_params.c
index 89455e6752197630d9d49ae25adec18cddb3fb26..c55598f55b96e82fb0db8f6b46af2813ca8bbe01 100644
--- a/src/ringct20/ringct20_params.c
+++ b/src/ringct20/ringct20_params.c
@@ -77,7 +77,7 @@ uint8_t H_bpoly_MAXSEC[14][NEWHOPE_POLYBYTES] = {
 #error "NEWHOPE_N must be either 512 or 1024..
 #endif
 
-bool ringct20_params_init(ringct20_param_t *ringct20_p, DAP_RINGCT20_SIGN_SECURITY kind)
+bool ringct20_params_init(ringct20_param_t *ringct20_p, DAP_RINGCT20_SIGN_SECURITY kind)//, const int wLen)
 {
 //    static int first_init = 1;//CRUTCH
 //    if(first_init)
@@ -128,7 +128,7 @@ bool ringct20_params_init(ringct20_param_t *ringct20_p, DAP_RINGCT20_SIGN_SECURI
     }
     ringct20_p->RINGCT20_PBK_SIZE = ringct20_p->POLY_RINGCT20_SIZE_PACKED;
     ringct20_p->RINGCT20_PRK_SIZE = ringct20_p->mLen*ringct20_p->POLY_RINGCT20_SIZE_PACKED;
-    ringct20_p->RINGCT20_SIG_SIZE = (ringct20_p->wLen +
+    ringct20_p->RINGCT20_SIG_SIZE = sizeof(ringct20_p->wLen)+sizeof(DAP_RINGCT20_SIGN_SECURITY) + (ringct20_p->wLen +
                                      ringct20_p->M*ringct20_p->wLen + 1 +1)*ringct20_p->POLY_RINGCT20_SIZE_PACKED;
 
 
diff --git a/src/ringct20/ringct20_params.h b/src/ringct20/ringct20_params.h
index a7c7e2ac0db47019a5e9df58ecff321487b3a9af..b02bcd3af91ead36d659dbcb868faaf0b4000349 100644
--- a/src/ringct20/ringct20_params.h
+++ b/src/ringct20/ringct20_params.h
@@ -19,20 +19,29 @@ typedef enum  {
     RINGCT20_MINSEC = 0, RINGCT20_MIDSEC, RINGCT20_MAXSEC
 }DAP_RINGCT20_SIGN_SECURITY;
 
+typedef struct {
+  DAP_RINGCT20_SIGN_SECURITY kind;                 /* the kind of ringct20       */
+  unsigned char *data;
+}ringct20_public_key_t;
+
+
 typedef struct {
   DAP_RINGCT20_SIGN_SECURITY kind;    //  the kind of Dilithium (i.e. *this* choice of parameters)
-  uint32_t M;
-  uint32_t mLen;
-  uint32_t wLen;//number of public key
-  uint32_t Pi;//number of our key//known prk
+  int M;
+  int mLen;
+  int wLen;//number of public key
+  int Pi;//number of our key//known prk
   poly_ringct20 *A;//fixed PubParams
   poly_ringct20 *H;//fixed PubParams
 
-  uint32_t POLY_RINGCT20_SIZE_PACKED;
-  uint32_t POLY_RINGCT20_SIZE;
-  uint32_t RINGCT20_PBK_SIZE;
-  uint32_t RINGCT20_PRK_SIZE;
-  uint32_t RINGCT20_SIG_SIZE;
+  ringct20_public_key_t *allpbk;
+  int allpbknum;
+
+  size_t POLY_RINGCT20_SIZE_PACKED;
+  size_t POLY_RINGCT20_SIZE;
+  size_t RINGCT20_PBK_SIZE;
+  size_t RINGCT20_PRK_SIZE;
+  size_t RINGCT20_SIG_SIZE;
 
 /*  uint32_t PARAM_K;
   uint32_t PARAM_L;
@@ -60,11 +69,6 @@ typedef struct {
   unsigned char *data;
 } ringct20_private_key_t;
 
-typedef struct {
-  DAP_RINGCT20_SIGN_SECURITY kind;                 /* the kind of ringct20       */
-  unsigned char *data;
-} ringct20_public_key_t;
-
 typedef struct {
   DAP_RINGCT20_SIGN_SECURITY kind;                      /* the kind of ringct20       */
   unsigned char *sig_data;
diff --git a/test/crypto/dap_enc_ringct20_test.c b/test/crypto/dap_enc_ringct20_test.c
index ba0fdaa5ff80ae8001afcc0626f90b3e8f65ad33..24d7b6cfc37df06b66564c99f03823bdf92b521e 100644
--- a/test/crypto/dap_enc_ringct20_test.c
+++ b/test/crypto/dap_enc_ringct20_test.c
@@ -3,8 +3,114 @@
 #include "ringct20/ringct20_params.h"
 #include "rand/dap_rand.h"
 
+
+static void test_signing_verifying2(void)
+{
+    size_t source_size = 1 + random_uint32_t(20);
+    uint8_t * source = DAP_NEW_SIZE(uint8_t, source_size);
+    randombytes(source, source_size);
+    size_t seed_size = sizeof(uint8_t);
+    uint8_t seed[seed_size];
+
+    randombytes(seed, seed_size);
+
+    dap_enc_key_t* key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_SIG_RINGCT20, NULL, 0, seed, seed_size, 0);
+
+    const int allpbknum = 100;
+    void *allpbk_buf = NULL;
+    ringct20_param_t *p = calloc(sizeof(ringct20_param_t),1);
+    if (! ringct20_params_init( p, RINGCT20_MINSEC))
+    {
+        ringct20_params_free(p);
+        return;
+    }
+
+    size_t allpbk_size = CRUTCH_gen_pbk_list(p, &allpbk_buf, allpbknum);
+    key->getallpbkList(key, allpbk_buf,allpbk_size);
+
+    size_t max_signature_size = dap_enc_ringct20_calc_signature_size();
+    uint8_t* sig = calloc(max_signature_size, 1);
+
+
+
+    size_t siglen = key->enc_na(key, source, source_size, sig, max_signature_size);
+    dap_assert_PIF(siglen > 0, "Signing message");
+
+//Extract aList//CRUTCH
+    uint8_t *sigdata = (uint8_t*)*(int*)(sig + 4);
+//    for(int i = 0; i < 16; ++i)
+//        printf("%.2x ", sigdata[i]);
+//    printf(" = sig_extract\n"); fflush(stdout);
+    uint32_t unpacked_size = 0;
+    //unpack sec_kind
+    //memcpy(sec_kind, sigdata + unpacked_size, sizeof(DAP_RINGCT20_SIGN_SECURITY));
+    unpacked_size += sizeof(DAP_RINGCT20_SIGN_SECURITY);
+    //unpack wLen
+    int wLen;
+    memcpy(&wLen, sigdata + unpacked_size, sizeof(wLen));
+//    printf("wLen = %x\n", wLen);fflush(stdout);
+    unpacked_size += sizeof(wLen);
+    //unpack a_list
+    size_t poly_size = 896;
+    size_t pbk_size = 4 + poly_size;
+    uint8_t *pbkList_buf = DAP_NEW_SIZE(uint8_t, pbk_size*wLen);
+    for(int i = 0; i < wLen; ++i)
+    {
+        *(int*)(pbkList_buf + i*pbk_size + 0) = 0;//kind CRUTCH
+        memcpy(pbkList_buf + i*pbk_size + 4, sigdata + unpacked_size, poly_size);
+        unpacked_size += poly_size;
+    }
+//Extrackt aList
+
+   // size_t verify = key->dec_na(key, source, source_size, sig, siglen);
+//    for(int i = 0; i < 32; ++i)
+//        printf("%.2x ", pbkList_buf[i]);
+//    printf(" = pbkList_buf\n"); fflush(stdout);
+//    for(int i = 0; i < 32; ++i)
+//        printf("%.2x ", pbkList_buf[pbk_size+i]);
+//    printf(" = pbkList_buf\n"); fflush(stdout);
+//    for(int i = 0; i < 32; ++i)
+//        printf("%.2x ", pbkList_buf[pbk_size*2+i]);
+//    printf(" = pbkList_buf\n"); fflush(stdout);
+
+    size_t verify = key->dec_na_ext(key, source, source_size, sig, siglen,pbkList_buf,wLen);
+//Corrupt pbkList
+    int numpbk = 3;
+//    for(int i = 0; i < 32; ++i)
+//        printf("%.2x ", ((uint8_t*)allpbk_buf)[numpbk*pbk_size + i]);
+//    printf(" = allpbk\n"); fflush(stdout);
+    memcpy(pbkList_buf, allpbk_buf + numpbk*pbk_size, pbk_size);//Replace first pbk key with random pbk key
+
+//Corrupt pbkList
+
+//    for(int i = 0; i < 32; ++i)
+//        printf("%.2x ", pbkList_buf[i]);
+//    printf(" = corrupt pbkList_buf\n"); fflush(stdout);
+//    for(int i = 0; i < 32; ++i)
+//        printf("%.2x ", pbkList_buf[i+pbk_size]);
+//    printf(" = corrupt pbkList_buf\n"); fflush(stdout);
+//    for(int i = 0; i < 32; ++i)
+//        printf("%.2x ", pbkList_buf[i+2*pbk_size]);
+//    printf(" = corrupt pbkList_buf\n"); fflush(stdout);
+    size_t verify_corrupt_sign = key->dec_na_ext(key, source, source_size, sig, siglen,pbkList_buf,wLen);
+
+    //printf("verify = %d, verify_corrupt_sign = %d\n", verify, verify_corrupt_sign);fflush(stdout);
+    dap_assert_PIF(!verify, "Verifying signature");
+    dap_assert_PIF(verify_corrupt_sign, "to Reject Corrupt signature");
+
+    ringct20_signature_delete((ringct20_signature_t*)sig);
+
+    DAP_DELETE(allpbk_buf);
+    ringct20_params_free(p);
+    DAP_DELETE(source);
+    free(sig);
+    dap_enc_key_delete(key);
+}
+
+//DEBUG TO USE IT get back:dap_enc_sig_ringct20_get_sign_with_pbkList,//dap_enc_sig_ringct20_get_sign,
 static void test_signing_verifying(void)
 {
+
     size_t source_size = 1 + random_uint32_t(20);
     uint8_t * source = DAP_NEW_SIZE(uint8_t, source_size);
     randombytes(source, source_size);
@@ -51,7 +157,7 @@ void dap_enc_ringct20_tests_run(const int times)
     char print_buf[512];
     sprintf_s(print_buf, 512, "Signing and verifying message %d time", times);
 
-    benchmark_mgs_time(print_buf, benchmark_test_time(test_signing_verifying, times));
+    benchmark_mgs_time(print_buf, benchmark_test_time(test_signing_verifying2, times));
 
     cleanup_test_case();
 }
diff --git a/test/crypto/dap_enc_test.c b/test/crypto/dap_enc_test.c
index 2f65e109ec777f1f8de440af9d03bc94b8e2cdf7..94b09beaa439a6848ed70c806e6ba61b60cb0d79 100755
--- a/test/crypto/dap_enc_test.c
+++ b/test/crypto/dap_enc_test.c
@@ -12,7 +12,7 @@
 #include "dap_enc.h"
 
 #define TEST_SER_FILE_NAME "keystorage.txt"
-void test_encode_decode(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size)
+void test_encypt_decrypt(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size)
 {
     dap_print_module_name(dap_enc_get_type_name(key_type));
 
@@ -75,7 +75,7 @@ void test_encode_decode(int count_steps, const dap_enc_key_type_t key_type, cons
     dap_pass_msg("Encode and decode");
 }
 
-void test_encode_decode_fast(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size)
+void test_encypt_decrypt_fast(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size)
 {
     const size_t buf_size = 4096;
     char buf_encrypt_out[buf_size];
diff --git a/test/crypto/dap_enc_test.h b/test/crypto/dap_enc_test.h
index 5b375d1d2cdaf685d9f6d26b149e85dbc940581e..7a5036dd20d84eaeb496481497554ed3ca2b127a 100755
--- a/test/crypto/dap_enc_test.h
+++ b/test/crypto/dap_enc_test.h
@@ -1,6 +1,6 @@
 #pragma once
 #include "dap_enc_key.h"
-void test_encode_decode(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size);
-void test_encode_decode_fast(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size);
+void test_encypt_decrypt(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size);
+void test_encypt_decrypt_fast(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size);
 
 void dap_enc_tests_run(void);
diff --git a/test/crypto/main.c b/test/crypto/main.c
index 98a06898b19a36ebe248d66b31099fba861805bf..208592653d7d8ad09be2b01d819bd71e4a4ce865 100755
--- a/test/crypto/main.c
+++ b/test/crypto/main.c
@@ -12,26 +12,25 @@
 #include "rand/dap_rand.h"
 
 #include "dap_common.h"
-void dap_enc_bf_tests_run();
 
 int main(void)
 {
  // switch off debug info from library
     dap_log_level_set(L_CRITICAL);
 
+    dap_enc_ringct20_tests_run(10);return 0;
     dap_enc_tests_run();
 
-    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);
+    test_encypt_decrypt      (1000, DAP_ENC_KEY_TYPE_BF_CBC,     0);
+    test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_BF_CBC,     0);
+    test_encypt_decrypt      (1000, DAP_ENC_KEY_TYPE_BF_OFB,     0);
+    test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_BF_OFB,     0);
+    test_encypt_decrypt      (1000, DAP_ENC_KEY_TYPE_GOST_OFB,   32);
+    test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_GOST_OFB,   32);
+    test_encypt_decrypt      (1000, DAP_ENC_KEY_TYPE_IAES,       32);
+    test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_IAES,       32);
+    test_encypt_decrypt      (1000, DAP_ENC_KEY_TYPE_OAES,       32);
+    test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_OAES,       32);
 
     dap_enc_picnic_tests_run();
     dap_enc_sig_bliss_tests_run();