diff --git a/.DS_Store b/.DS_Store
index 1249fc9b3e7895e9bfa5e65f1a0823e32e6efe3b..f86ae3df346027e1412716157f341d40d84ed122 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/libSAEDEA.nimble b/libSAEDEA.nimble
index 7806509283fa5fbe992dc2c13db317eb502b92c9..c71f6211224362c6cacb204ba156e2f361d4929b 100644
--- a/libSAEDEA.nimble
+++ b/libSAEDEA.nimble
@@ -1,6 +1,6 @@
 # Package
 
-version       = "0.9.0"
+version       = "0.9.4"
 author        = "m33"
 description   = "Library implementing a variation of Simple And Efficient Data Encryption Algorithm (INTERNATIONAL JOURNAL OF SCIENTIFIC & TECHNOLOGY RESEARCH VOLUME 8, ISSUE 12, DECEMBER 2019 ISSN 2277-8616)"
 license       = "MIT"
diff --git a/src/libSAEDEA/saedea.nim b/src/libSAEDEA/saedea.nim
index 2f25d37bfb00619a7e20477b0339eaed63801664..adaec24d875cb669e23c0580ff85cca96739ae5c 100644
--- a/src/libSAEDEA/saedea.nim
+++ b/src/libSAEDEA/saedea.nim
@@ -21,11 +21,17 @@ proc gen_iv*(random_data: string): string =
 #
 # First pass of string encryption, xor the secret key and initialization vector
 #
-proc encrypt_stage1*(secret: string, iv: string): string =
+proc encrypt_stage1(secret: string, iv: string, len: int): string =
   var hidden_str: string
   var i = 0
-  while i < secret.len:
-    hidden_str.add(cast[char](cast[int32](secret[i]) xor cast[int32](iv[(i mod iv.len)])))
+
+  # xor on repeated secret text and iv up to cleartext length
+  while i < len:
+    hidden_str.add(cast[char](
+                    cast[int32](
+                      secret[i mod secret.len]) xor
+                    cast[int32](
+                      iv[(i mod iv.len)])))
     i+=1
   return hidden_str
 #endproc
@@ -36,31 +42,68 @@ proc encrypt_stage1*(secret: string, iv: string): string =
 #
 # First pass of string decryption, xor secret,initialization vector, then cypertext and the product
 #
-proc decrypt_stage1*(hidden: string, iv: string): string =
+proc decrypt_stage1(hidden: string, iv: string, len: int): string =
   var product: string
   var i = 0
-  while i < hidden.len:
-    product.add(cast[char](cast[int32](hidden[i]) xor cast[int32](iv[(i mod iv.len)])))
+
+  # xor on repeated ciphertext and iv up to cleartext length
+  while i < len:
+    product.add(cast[char](
+                  cast[int32](
+                    hidden[i mod hidden.len]) xor
+                  cast[int32](
+                    iv[(i mod iv.len)])))
     i+=1
   return product
 #endproc
 
 
+#
+# encrypt(text, secret, initialization vector, text length): string
+#
+# Simple encryption for text, using secret and a random initialization vector
+# The lenght of cleartext message is needed, this will produce an encrypted message
+# following the SAEDEA paper
+#
+proc encrypt*(text: string, secret: string, iv: string, len: int): string =
+  let intermediate = encrypt_stage1(secret, iv, len)
+  #return encode(encrypt_stage1(text, intermediate, text.len))
+  return encrypt_stage1(text, intermediate, len)
+#endproc
+
+
 #
 # encrypt(text, secret, initialization vector): string
 #
+# Light version
 # Simple encryption for text, using secret and a random initialization vector
 #
 proc encrypt*(text: string, secret: string, iv: string): string =
-  return encode(encrypt_stage1(text, encrypt_stage1(secret, iv)))
+  let intermediate = encrypt_stage1(secret, iv, text.len)
+  #return encode(encrypt_stage1(text, intermediate, text.len))
+  return encrypt_stage1(text, intermediate, intermediate.len)
 #endproc
 
+#
+# decrypt(hidden, secret, initialization vector, lenght of the cleartext message): string
+#
+# Simple decryption for ciphertext, using secret and a random initialization vector
+# The original cleartext lenght is needed
+#
+proc decrypt*(hidden_str: string, secret: string, iv: string, len: int): string =
+  let intermediate = decrypt_stage1(secret, iv, len)
+  #return decrypt_stage1(decode(hidden_str), intermediate, len)
+  return decrypt_stage1(hidden_str, intermediate, len)
+#endproc
 
 #
 # decrypt(hidden, secret, initialization vector): string
 #
+# Light version
 # Simple decryption for ciphertext, using secret and a random initialization vector
 #
 proc decrypt*(hidden_str: string, secret: string, iv: string): string =
-  return decrypt_stage1(decode(hidden_str), decrypt_stage1(secret, iv))
+  let intermediate = decrypt_stage1(secret, iv, hidden_str.len)
+  #return decrypt_stage1(decode(hidden_str), intermediate, len)
+  return decrypt_stage1(hidden_str, intermediate, intermediate.len)
 #endproc
diff --git a/tests/test1 b/tests/test1
new file mode 100755
index 0000000000000000000000000000000000000000..f2edaab11976af99a75f06cb1dddf37078c6880f
Binary files /dev/null and b/tests/test1 differ
diff --git a/tests/test1.nim b/tests/test1.nim
index 90a07ce69999b30857d5aec82a142311333c199b..63ada14f7c559848ae5985c73dc43505197f8c1d 100644
--- a/tests/test1.nim
+++ b/tests/test1.nim
@@ -1,23 +1,63 @@
-# This is just an example to get you started. You may wish to put all of your
-# tests into a single file, or separate them into multiple `test1`, `test2`
-# etc. files (better names are recommended, just make sure the name starts with
-# the letter 't').
-#
 # To run these tests, simply execute `nimble test`.
 
 import unittest
-import strutils
 import times
 import libSAEDEA
 
-var text = "This is a clear text message... 12 12 123 and the current time is:" & $getTime()
-var secret = "shared secret"
-var iv = gen_iv("true random data")
-var encrypted = encrypt(text, secret, iv)
-var decrypted = decrypt(encrypted, secret, iv)
-echo "Secret:", secret
-echo "IV:", iv
-echo "Cleartext:", text
-echo "Decrypted:", decrypted
-echo "Encrypted:", encrypted
-check count(text, decrypted, false) == 1
+proc cmpStrChars(s1: string, s2: string): bool =
+  if s1.len != s2.len:
+    return false
+  for i in 0..s1.len-1:
+    if s1[i] != s2[i]:
+      return false
+  return true
+
+let text = "This is a clear text message... ABCDEF 12 12 123 1234 12345 123456 $*[]@!%ù 🤖😱🎰🔮📿💈⚗️🔭🔬 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod... And the current time is:" & $getTime()
+let secret = "A shared secret"
+let iv = gen_iv("some random data" & $getTime())
+
+var encrypted = encrypt(text, secret, iv, text.len)
+var decrypted = decrypt(encrypted, secret, iv, text.len)
+
+var encrypted_light = encrypt(text, secret, iv)
+var decrypted_light = decrypt(encrypted, secret, iv)
+  #echo "Secret:", secret
+  #echo "IV:", iv
+  #echo "Cleartext:", text
+  #echo "Decrypted:", decrypted
+  #echo "Encrypted:", encrypted
+  #echo "Decrypted_light:", decrypted_light
+
+echo "Matching test"
+check cmpStrChars(text, decrypted) == true
+
+echo "Wrong secret test"
+decrypted = decrypt(encrypted, "wrong secret", iv, text.len)
+check cmpStrChars(text, decrypted) == false
+
+echo "Wrong IV test"
+decrypted = decrypt(encrypted, secret, "wrong iv", text.len)
+check cmpStrChars(text, decrypted) == false
+
+echo "Wrong length test"
+decrypted = decrypt(encrypted, secret, iv, 987654)
+check cmpStrChars(text, decrypted) == false
+
+echo "All wrong test"
+decrypted = decrypt(encrypted, "wrong value", "wrong value", 123456)
+check cmpStrChars(text, decrypted) == false
+
+echo "Matching test with light encryption"
+check cmpStrChars(text, decrypted_light) == true
+
+echo "Wrong secret test with light encryption"
+decrypted_light = decrypt(encrypted, "wrong secret", iv)
+check cmpStrChars(text, decrypted_light) == false
+
+echo "Wrong IV test with light encryption"
+decrypted_light = decrypt(encrypted, secret, "wrong iv")
+check cmpStrChars(text, decrypted_light) == false
+
+echo "All wrong test with light encryption"
+decrypted_light = decrypt(encrypted, "wrong secret", "wrong iv")
+check cmpStrChars(text, decrypted_light) == false