@@ -273,14 +273,14 @@ void QAESEncryption::invShiftRows()
273273 it[11 ] = (quint8)temp;
274274}
275275
276- QByteArray QAESEncryption::ivXor (const QByteArray in , const QByteArray iv )
276+ QByteArray QAESEncryption::byteXor (const QByteArray a , const QByteArray b )
277277{
278- QByteArray::const_iterator it = in .begin ();
279- QByteArray::const_iterator it_iv = iv .begin ();
278+ QByteArray::const_iterator it_a = a .begin ();
279+ QByteArray::const_iterator it_b = b .begin ();
280280 QByteArray ret;
281281
282282 for (int i = 0 ; i < m_blocklen; i++)
283- ret.insert (i,it [i] ^ it_iv [i]);
283+ ret.insert (i,it_a [i] ^ it_b [i]);
284284
285285 return ret;
286286}
@@ -345,45 +345,78 @@ QByteArray QAESEncryption::invCipher(const QByteArray expKey, const QByteArray i
345345
346346QByteArray QAESEncryption::encode (const QByteArray rawText, const QByteArray key, const QByteArray iv)
347347{
348- if (m_mode = = CBC && (iv.isNull () || iv.size () != m_blocklen))
348+ if (m_mode > = CBC && (iv.isNull () || iv.size () != m_blocklen))
349349 return QByteArray ();
350350
351351 QByteArray ret;
352352 QByteArray expandedKey = expandKey (key);
353353 QByteArray alignedText (rawText);
354354 QByteArray ivTemp (iv);
355355
356-
357356 alignedText.append (getPadding (rawText.size (), m_blocklen), 0 ); // filling the array with zeros
358357
359- for (int i=0 ; i < alignedText.size (); i+= m_blocklen){
360- if (m_mode == CBC)
361- alignedText.replace (i, m_blocklen, ivXor (alignedText.mid (i, m_blocklen),ivTemp));
362-
363- ret.append (cipher (expandedKey, alignedText.mid (i, m_blocklen)));
358+ // Preparation for CFB
359+ if (m_mode == CFB)
360+ ret.append (byteXor (alignedText.mid (0 , m_blocklen), cipher (expandedKey, iv)));
364361
365- if (m_mode == CBC)
362+ // Looping thru all blocks
363+ for (int i=0 ; i < alignedText.size (); i+= m_blocklen){
364+ switch (m_mode)
365+ {
366+ case ECB:
367+ ret.append (cipher (expandedKey, alignedText.mid (i, m_blocklen)));
368+ break ;
369+ case CBC:
370+ alignedText.replace (i, m_blocklen, byteXor (alignedText.mid (i, m_blocklen),ivTemp));
371+ ret.append (cipher (expandedKey, alignedText.mid (i, m_blocklen)));
366372 ivTemp = ret.mid (i, m_blocklen);
373+ break ;
374+ case CFB:
375+ if (i+m_blocklen < alignedText.size ())
376+ ret.append (byteXor (alignedText.mid (i+m_blocklen, m_blocklen),
377+ cipher (expandedKey, ret.mid (i, m_blocklen))));
378+ break ;
379+ default :
380+ // do nothing
381+ break ;
382+ }
367383 }
368384 return ret;
369385}
370386
371387QByteArray QAESEncryption::decode (const QByteArray rawText, const QByteArray key, const QByteArray iv)
372388{
373- if (m_mode = = CBC && (iv.isNull () || iv.size () != m_blocklen))
389+ if (m_mode > = CBC && (iv.isNull () || iv.size () != m_blocklen))
374390 return QByteArray ();
375391
376392 QByteArray ret;
377393 QByteArray expandedKey = expandKey (key);
378- QByteArray alignedText (rawText);
379394 QByteArray ivTemp (iv);
380395
381- for (int i=0 ; i < alignedText.size (); i+= m_blocklen){
382- ret.append (invCipher (expandedKey, alignedText.mid (i, m_blocklen)));
383-
384- if (m_mode == CBC) {
385- ret.replace (i, m_blocklen, ivXor (ret.mid (i, m_blocklen),ivTemp));
386- ivTemp = alignedText.mid (i, m_blocklen);
396+ // Preparation for CFB
397+ if (m_mode == CFB)
398+ ret.append (byteXor (rawText.mid (0 , m_blocklen), cipher (expandedKey, iv)));
399+
400+ for (int i=0 ; i < rawText.size (); i+= m_blocklen){
401+ switch (m_mode)
402+ {
403+ case ECB:
404+ ret.append (invCipher (expandedKey, rawText.mid (i, m_blocklen)));
405+ break ;
406+ case CBC:
407+ ret.append (invCipher (expandedKey, rawText.mid (i, m_blocklen)));
408+ ret.replace (i, m_blocklen, byteXor (ret.mid (i, m_blocklen),ivTemp));
409+ ivTemp = rawText.mid (i, m_blocklen);
410+ break ;
411+ case CFB:
412+ if (i+m_blocklen < rawText.size ()){
413+ ret.append (byteXor (rawText.mid (i+m_blocklen, m_blocklen),
414+ cipher (expandedKey, rawText.mid (i, m_blocklen))));
415+ }
416+ break ;
417+ default :
418+ // do nothing
419+ break ;
387420 }
388421 }
389422 return ret;
0 commit comments