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); }