From 3f2b2bcdce29547b4fe9cda117c638a2eb005bfe Mon Sep 17 00:00:00 2001
From: Thomas Geymayer <tomgey@gmail.com>
Date: Wed, 14 Nov 2018 12:10:55 +0100
Subject: [PATCH] Fix ISO removePadding

Fix removing of ISO padding when no padding was added.
---
 qaesencryption.cpp | 41 +++++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/qaesencryption.cpp b/qaesencryption.cpp
index 7c7cece..2f771b1 100644
--- a/qaesencryption.cpp
+++ b/qaesencryption.cpp
@@ -22,6 +22,9 @@ QByteArray QAESEncryption::ExpandKey(QAESEncryption::Aes level, QAESEncryption::
 
 QByteArray QAESEncryption::RemovePadding(const QByteArray &rawText, QAESEncryption::Padding padding)
 {
+    if (rawText.isEmpty())
+        return rawText;
+
     QByteArray ret(rawText);
     switch (padding)
     {
@@ -34,8 +37,24 @@ QByteArray QAESEncryption::RemovePadding(const QByteArray &rawText, QAESEncrypti
         ret.remove(ret.length() - ret.at(ret.length()-1), ret.at(ret.length()-1));
         break;
     case Padding::ISO:
-        ret.truncate(ret.lastIndexOf(0x80));
+    {
+        // Find the last byte which is not zero
+        int marker_index = ret.length() - 1;
+        for (; marker_index >= 0; --marker_index)
+        {
+            if (ret.at(marker_index) != 0x00)
+            {
+                break;
+            }
+        }
+
+        // And check if it's the byte for marking padding
+        if (ret.at(marker_index) == static_cast<char>(0x80))
+        {
+            ret.truncate(marker_index);
+        }
         break;
+    }
     default:
         //do nothing
         break;
@@ -489,23 +508,5 @@ QByteArray QAESEncryption::decode(const QByteArray &rawText, const QByteArray &k
 
 QByteArray QAESEncryption::removePadding(const QByteArray &rawText)
 {
-    QByteArray ret(rawText);
-    switch (m_padding)
-    {
-    case Padding::ZERO:
-        //Works only if the last byte of the decoded array is not zero
-        while (ret.at(ret.length()-1) == 0x00)
-            ret.remove(ret.length()-1, 1);
-        break;
-    case Padding::PKCS7:
-        ret.remove(ret.length() - ret.at(ret.length()-1), ret.at(ret.length()-1));
-        break;
-    case Padding::ISO:
-        ret.truncate(ret.lastIndexOf(0x80));
-        break;
-    default:
-        //do nothing
-        break;
-    }
-    return ret;
+    return RemovePadding(rawText, m_padding);
 }