diff --git a/src/iaes/iaes256_cbc_cernal.c b/src/iaes/iaes256_cbc_cernal.c
index da867204fd48feecaa16f501c333ca0b9dd823dc..a61de19b7b267133d7f69ad71bee7f95655f0589 100755
--- a/src/iaes/iaes256_cbc_cernal.c
+++ b/src/iaes/iaes256_cbc_cernal.c
@@ -490,6 +490,7 @@ size_t IAES_256_CBC_decrypt(const uint8_t *cdata, uint8_t *data, uint8_t *ivec,
 
     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)
diff --git a/src/sig_dilithium/dilithium_poly.c b/src/sig_dilithium/dilithium_poly.c
index 26793937515f5e574240c02a8aa78264769f1eb0..fa6345bf1a8b6914271b8ecaba7924f15439ef1d 100755
--- a/src/sig_dilithium/dilithium_poly.c
+++ b/src/sig_dilithium/dilithium_poly.c
@@ -1,8 +1,8 @@
 #include <stdint.h>
 #include "dilithium_poly.h"
 
-#include "KeccakHash.h"
-#include "SimpleFIPS202.h"
+//#include "KeccakHash.h"
+//#include "SimpleFIPS202.h"
 
 /*************************************************/
 void poly_reduce(poly *a) {
@@ -184,25 +184,25 @@ void poly_uniform_eta(poly *a, const unsigned char seed[SEEDBYTES], unsigned cha
     unsigned char inbuf[SEEDBYTES + 1];
 
     unsigned char outbuf[2*SHAKE256_RATE];
-//  uint64_t state[25] = {0};
-    Keccak_HashInstance   ks;
+  uint64_t state[25] = {0};
+    //Keccak_HashInstance   ks;
 
     for(i= 0; i < SEEDBYTES; ++i)
         inbuf[i] = seed[i];
     inbuf[SEEDBYTES] = nonce;
 
-//  shake256_absorb(state, inbuf, SEEDBYTES + 1);
-//  shake256_squeezeblocks(outbuf, 2, state);  
+  shake256_absorb(state, inbuf, SEEDBYTES + 1);
+  shake256_squeezeblocks(outbuf, 2, state);  
 
-    Keccak_HashInitialize_SHAKE256( &ks );
-    Keccak_HashUpdate( &ks, inbuf, (SEEDBYTES + 1) * 8 );
-    Keccak_HashFinal( &ks, inbuf );
-    Keccak_HashSqueeze( &ks, outbuf, 2 * 8 * 8 );
+    //Keccak_HashInitialize_SHAKE256( &ks );
+    //Keccak_HashUpdate( &ks, inbuf, (SEEDBYTES + 1) * 8 );
+    //Keccak_HashFinal( &ks, inbuf );
+    //Keccak_HashSqueeze( &ks, outbuf, 2 * 8 * 8 );
 
     ctr = rej_eta(a->coeffs, NN, outbuf, 2*SHAKE256_RATE, p);
     if(ctr < NN) {
-//      shake256_squeezeblocks(outbuf, 1, state);
-        Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 );
+      shake256_squeezeblocks(outbuf, 1, state);
+       // Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 );
         rej_eta(a->coeffs + ctr, NN - ctr, outbuf, SHAKE256_RATE, p);
     }
 }
@@ -244,27 +244,27 @@ void poly_uniform_gamma1m1(poly *a, const unsigned char seed[SEEDBYTES + CRHBYTE
     unsigned char inbuf[SEEDBYTES + CRHBYTES + 2];
 
     unsigned char outbuf[5*SHAKE256_RATE];
-//  uint64_t state[25] = {0};
-    Keccak_HashInstance ks;
+    uint64_t state[25] = {0};
+//    Keccak_HashInstance ks;
 
     for(i = 0; i < SEEDBYTES + CRHBYTES; ++i)
         inbuf[i] = seed[i];
     inbuf[SEEDBYTES + CRHBYTES] = nonce & 0xFF;
     inbuf[SEEDBYTES + CRHBYTES + 1] = nonce >> 8;
 
-//  shake256_absorb(state, inbuf, SEEDBYTES + CRHBYTES + 2);
-//  shake256_squeezeblocks(outbuf, 5, state);
+    shake256_absorb(state, inbuf, SEEDBYTES + CRHBYTES + 2);
+    shake256_squeezeblocks(outbuf, 5, state);
 
-    Keccak_HashInitialize_SHAKE128( &ks );
-    Keccak_HashUpdate( &ks, inbuf, (SEEDBYTES + CRHBYTES + 2) * 8 );
-    Keccak_HashFinal( &ks, inbuf );
-    Keccak_HashSqueeze( &ks, outbuf, 5 * 8 * 8 );
+    //Keccak_HashInitialize_SHAKE128( &ks );
+    //Keccak_HashUpdate( &ks, inbuf, (SEEDBYTES + CRHBYTES + 2) * 8 );
+    //Keccak_HashFinal( &ks, inbuf );
+    //Keccak_HashSqueeze( &ks, outbuf, 5 * 8 * 8 );
 
     ctr = rej_gamma1m1(a->coeffs, NN, outbuf, 5*SHAKE256_RATE);
     if(ctr < NN) {
 
-//    shake256_squeezeblocks(outbuf, 1, state);
-        Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 );
+    shake256_squeezeblocks(outbuf, 1, state);
+        //Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 );
         rej_gamma1m1(a->coeffs + ctr, NN - ctr, outbuf, SHAKE256_RATE);
     }
 }
diff --git a/src/sig_dilithium/dilithium_sign.c b/src/sig_dilithium/dilithium_sign.c
index 38747a1f418ce543ea7e67d09547e38bf5f9ff3d..63ddd1a048bcfcbdb5128ff43f8585f2fd77e836 100755
--- a/src/sig_dilithium/dilithium_sign.c
+++ b/src/sig_dilithium/dilithium_sign.c
@@ -1,8 +1,8 @@
 #include <stdint.h>
 #include "dilithium_sign.h"
 
-#include "KeccakHash.h"
-#include "SimpleFIPS202.h"
+//#include "KeccakHash.h"
+//#include "SimpleFIPS202.h"
 
 /********************************************************************************************/
 void expand_mat(polyvecl mat[], const unsigned char rho[SEEDBYTES], dilithium_param_t *p)
@@ -18,7 +18,8 @@ void expand_mat(polyvecl mat[], const unsigned char rho[SEEDBYTES], dilithium_pa
   for(i = 0; i < p->PARAM_K; ++i) {
     for(j = 0; j < p->PARAM_L; ++j) {
       inbuf[SEEDBYTES] = i + (j << 4);
-      SHAKE128(outbuf, sizeof(outbuf), inbuf, SEEDBYTES + 1);
+      //SHAKE128(outbuf, sizeof(outbuf), inbuf, SEEDBYTES + 1);
+      shake128(outbuf, sizeof(outbuf), inbuf, SEEDBYTES + 1);
       dilithium_poly_uniform(mat[i].vec + j, outbuf);
     }
   }
@@ -30,22 +31,22 @@ void challenge(poly *c, const unsigned char mu[CRHBYTES], const polyveck *w1, di
     unsigned int i, b, pos;
     unsigned char inbuf[CRHBYTES + p->PARAM_K * p->PARAM_POLW1_SIZE_PACKED];
     unsigned char outbuf[SHAKE256_RATE];
-//    uint64_t state[25] = {0}, signs, mask;
-    uint64_t signs, mask;
-    Keccak_HashInstance ks;
+    uint64_t state[25] = {0}, signs, mask;
+    //uint64_t signs, mask;
+    //Keccak_HashInstance ks;
 
     for(i = 0; i < CRHBYTES; ++i)
         inbuf[i] = mu[i];
     for(i = 0; i < p->PARAM_K; ++i)
         polyw1_pack(inbuf + CRHBYTES + i * p->PARAM_POLW1_SIZE_PACKED, w1->vec + i);
 
-//    shake256_absorb(state, inbuf, sizeof(inbuf));
-//    shake256_squeezeblocks(outbuf, 1, state);
+    shake256_absorb(state, inbuf, sizeof(inbuf));
+    shake256_squeezeblocks(outbuf, 1, state);
 
-    Keccak_HashInitialize_SHAKE256( &ks );
-    Keccak_HashUpdate( &ks, inbuf, sizeof(inbuf) * 8 );
-    Keccak_HashFinal( &ks, inbuf );
-    Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 );
+    //Keccak_HashInitialize_SHAKE256( &ks );
+    //Keccak_HashUpdate( &ks, inbuf, sizeof(inbuf) * 8 );
+    //Keccak_HashFinal( &ks, inbuf );
+    //Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 );
 
     signs = 0;
     for(i = 0; i < 8; ++i)
@@ -60,8 +61,8 @@ void challenge(poly *c, const unsigned char mu[CRHBYTES], const polyveck *w1, di
     for(i = 196; i < 256; ++i) {
         do {
             if(pos >= SHAKE256_RATE) {
-//              shake256_squeezeblocks(outbuf, 1, state);
-                Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 );
+              shake256_squeezeblocks(outbuf, 1, state);
+//                Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 );
                 pos = 0;
             }
 
@@ -154,7 +155,8 @@ int dilithium_crypto_sign_keypair(dilithium_public_key_t *public_key, dilithium_
 
     randombytes(seedbuf, SEEDBYTES);
 
-    SHAKE256(seedbuf, 3*SEEDBYTES, seedbuf, SEEDBYTES);
+    //SHAKE256(seedbuf, 3*SEEDBYTES, seedbuf, SEEDBYTES);
+    shake256(seedbuf, 3*SEEDBYTES, seedbuf, SEEDBYTES);
     rho = seedbuf;
     rhoprime = rho + SEEDBYTES;
     key = rho + 2*SEEDBYTES;
@@ -180,7 +182,8 @@ int dilithium_crypto_sign_keypair(dilithium_public_key_t *public_key, dilithium_
     polyveck_power2round(&t1, &t0, &t, p);
     dilithium_pack_pk(public_key->data, rho, &t1, p);
 
-    SHAKE256(tr, CRHBYTES, public_key->data, p->CRYPTO_PUBLICKEYBYTES);
+    //SHAKE256(tr, CRHBYTES, public_key->data, p->CRYPTO_PUBLICKEYBYTES);
+    shake256(tr, CRHBYTES, public_key->data, p->CRYPTO_PUBLICKEYBYTES);
     dilithium_pack_sk(private_key->data, rho, key, tr, &s1, &s2, &t0, p);
 
     free(p);
@@ -222,7 +225,8 @@ int dilithium_crypto_sign( dilithium_signature_t *sig, const unsigned char *m, u
     for(i = 0; i < CRHBYTES; ++i)
         sig->sig_data[p->CRYPTO_BYTES - CRHBYTES + i] = tr[i];
 
-    SHAKE256(mu, CRHBYTES, sig->sig_data + p->CRYPTO_BYTES - CRHBYTES, CRHBYTES + mlen);
+    //SHAKE256(mu, CRHBYTES, sig->sig_data + p->CRYPTO_BYTES - CRHBYTES, CRHBYTES + mlen);
+    shake256(mu, CRHBYTES, sig->sig_data + p->CRYPTO_BYTES - CRHBYTES, CRHBYTES + mlen);
 
     expand_mat(mat, rho, p);
     polyvecl_ntt(&s1, p);
@@ -347,8 +351,10 @@ int dilithium_crypto_sign_open( unsigned char *m, unsigned long long mlen, dilit
         for(i = 0; i < mlen; ++i)
             tmp_m[CRHBYTES + i] = m[i];
 
-    SHAKE256(tmp_m, CRHBYTES, public_key->data, p->CRYPTO_PUBLICKEYBYTES);
-    SHAKE256(mu, CRHBYTES, tmp_m, CRHBYTES + mlen);
+    //SHAKE256(tmp_m, CRHBYTES, public_key->data, p->CRYPTO_PUBLICKEYBYTES);
+    //SHAKE256(mu, CRHBYTES, tmp_m, CRHBYTES + mlen);
+    shake256(tmp_m, CRHBYTES, public_key->data, p->CRYPTO_PUBLICKEYBYTES);
+    shake256(mu, CRHBYTES, tmp_m, CRHBYTES + mlen);
     free(tmp_m);
 
     expand_mat(mat, rho, p);