aboutsummaryrefslogtreecommitdiffstats
path: root/SoftHSMv2/src/lib/crypto/test/DESTests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SoftHSMv2/src/lib/crypto/test/DESTests.cpp')
-rw-r--r--SoftHSMv2/src/lib/crypto/test/DESTests.cpp1164
1 files changed, 1164 insertions, 0 deletions
diff --git a/SoftHSMv2/src/lib/crypto/test/DESTests.cpp b/SoftHSMv2/src/lib/crypto/test/DESTests.cpp
new file mode 100644
index 0000000..bcb1c6b
--- /dev/null
+++ b/SoftHSMv2/src/lib/crypto/test/DESTests.cpp
@@ -0,0 +1,1164 @@
+/*
+ * Copyright (c) 2010 SURFnet bv
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*****************************************************************************
+ DESTests.cpp
+
+ Contains test cases to test the DES implementation
+ *****************************************************************************/
+
+#include <stdlib.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include "DESTests.h"
+#include "CryptoFactory.h"
+#include "DESKey.h"
+#include <stdio.h>
+
+CPPUNIT_TEST_SUITE_REGISTRATION(DESTests);
+
+void DESTests::setUp()
+{
+ des = NULL;
+
+ des = CryptoFactory::i()->getSymmetricAlgorithm(SymAlgo::DES);
+
+ // Check the return value
+ CPPUNIT_ASSERT(des != NULL);
+}
+
+void DESTests::tearDown()
+{
+ if (des != NULL)
+ {
+ CryptoFactory::i()->recycleSymmetricAlgorithm(des);
+ }
+
+ fflush(stdout);
+}
+
+void DESTests::testBlockSize()
+{
+ CPPUNIT_ASSERT(des->getBlockSize() == 8);
+}
+
+void DESTests::testCBC()
+{
+#ifndef WITH_FIPS
+ char testKeys56[][17] =
+ {
+ "0000000000000000",
+ "0102030405060708",
+ "4041424344454647",
+ "4698436794236871",
+ "0940278947239572"
+ };
+
+ char testKeys112[][33] =
+ {
+ "00000000000000000000000000000000",
+ "0102030405060708090A0B0C0D0E0F10",
+ "404142434445464748494A4B4C4D4E4F",
+ "64398647034486943598534703463870",
+ "87406984068406984607412103517413"
+ };
+#endif
+
+ char testKeys168[][49] =
+ {
+ "000000000000000000000000000000000000000000000000",
+ "0102030405060708090A0B0C0D0E0F101112131415161718",
+ "404142434445464748494A4B4C4D4E4F5051525354555657",
+ "643906874509874309687459084769847562436043696747",
+ "430135460496813044639085714376487549490586439575"
+ };
+
+ char testData[][256] =
+ {
+ "4938673409687134684698438657403986439058740935874395813968496846",
+ "549813644389670948567490687546098245665626527788",
+ "64398769586792586795867965624526",
+ "468376458463264536"
+ };
+
+ char testResult[5][4][3][256] = {
+ {
+ {
+ "ACC8B1BE444EEA9E016A46EF600E9B3FB2C87DE8CE9BE5394917AABB0A04639A3BFF1E250FE971D7",
+ "ACC8B1BE444EEA9E016A46EF600E9B3FB2C87DE8CE9BE5394917AABB0A04639A3BFF1E250FE971D7",
+ "ACC8B1BE444EEA9E016A46EF600E9B3FB2C87DE8CE9BE5394917AABB0A04639A3BFF1E250FE971D7"
+ },
+ {
+ "F9A1913AA27A05379506BE00D5F7398F67722076A3439E759BA729A58E8FEE64",
+ "F9A1913AA27A05379506BE00D5F7398F67722076A3439E759BA729A58E8FEE64",
+ "F9A1913AA27A05379506BE00D5F7398F67722076A3439E759BA729A58E8FEE64"
+ },
+ {
+ "36FD5581BB31F3E27910895DC2F2599CD0F8B8F002220588",
+ "36FD5581BB31F3E27910895DC2F2599CD0F8B8F002220588",
+ "36FD5581BB31F3E27910895DC2F2599CD0F8B8F002220588"
+ },
+ {
+ "B81DA29972385E55CB453A17B6D88D22",
+ "B81DA29972385E55CB453A17B6D88D22",
+ "B81DA29972385E55CB453A17B6D88D22"
+ }
+ },
+ {
+ {
+ "EE16FFE3CC4D4589766FA0957FB728A75D44A00D9BEBE2D43C4D4F3A5AFDB49730CFD4DF46D3AEF6",
+ "A070EE9DED89EE198E0E9B3CEB4879BB0244AB7FCD3450ED044BB5EE0AC8F7797383FDB8AAEF77B8",
+ "E7C594590C9CA00B376B702CE3B92C3F699B3EEEB2CEA08FA551350C837BF031FCAF4E1E97450327"
+ },
+ {
+ "D4142C47C700069F3E71EA6B1EF301B9B97261543ED75B32242C05A253B077B8",
+ "102BBE7D93CD0EF66280D3FA1F2A3976FB9C4D1B155D19E4985ADB86015DDE8C",
+ "600C3A75AC6EB4C4609BA6B7ED273ED56E59CD49FC911C33DD8DFCA384BAA462"
+ },
+ {
+ "47452120CD84CC32FC72F3B8600E5C43EEE192A29BC6BCB7",
+ "ADCF4292A32E51A7843CC8590E6934083A2CC847082FF2B4",
+ "D0FA596AC00BDA870999FD3FA2494C3C8B40B261EB3066F6"
+ },
+ {
+ "6BD20CDBE6E6ECAD6ED829FB43E92751",
+ "AE4379E371E295F63423F861B59111F0",
+ "2757FC58EDEEB8499EA9B49AB2729BAD"
+ }
+ },
+ {
+ {
+ "298621D5237F6230067DE7871DDBA6991E85CA14AD661D21357240923604D23A6A4119277B75B331",
+ "2C9F4FC0ACE7C8A4847472A0D5DDD42F36D3B2C46144B5A0ECDBB59806472E6257952DFD4DB9EBE5",
+ "679A832C630207E76BC1FF8371C61CA2518E37FE97EDED1B171E3E11807250145736949368AC822B"
+ },
+ {
+ "80FFD37B545675BB8C7CD317A73AB48CC0A39D3D9C11474EC3FD1220A066C034",
+ "F9228036718792EE86A85626AB1BC05E17F9CE21FF5D1723D0442CE852F004C3",
+ "D5F5F1EA7D8C2038FEDCBEDF157A5D2469A941FEC696D74DB8359CA5AECDD4CE"
+ },
+ {
+ "1ABB1CC10F589D993030A978B1B7F44AD52FFFEBF23638CA",
+ "D2423F54FA4978C95E4B13EF4DD6AA82DFD772F0FDAF5AD1",
+ "8128EC49D71F5711E5304E7C4423C63AD0EFC45453B66583"
+ },
+ {
+ "B9EE976AB97396047510C1DEA5C86A4B",
+ "46BA1930042146B31BD8FAF3AE6F3414",
+ "46EF3BCCA73E33C03D81BFE0DFFA7ABD"
+ }
+ },
+ {
+ {
+ "30D1B2556D516F20C2FD117FE0355845FBB0B11ABE5922A7EAA19C3A48E30207218321B3F0F30A6D",
+ "CBFA560297901DD691CDFDF98675BD7FF3A64FDCC0EF02F29C81105D3ECAC4E2803E2279F4476B35",
+ "4A30EC10433BE3695DC2B064E6240419C7BF81F1EE7640D5E2FFFA106666A2CEBF18DB954A992B5E"
+ },
+ {
+ "61FFB2E5A73170603E48F9823E6DF7105C9A909CC2F5CEDBEA7E60C076355B37",
+ "8408BD722B12031D17A1645AA59B05E2A50F7002B19877D6EB1C9BB7107C523F",
+ "97EF5791017B10CF07FB8144C19633522CBBE55DC63EF608F8734EE6484C0B0E"
+ },
+ {
+ "7205DC463B3D5EC858C8E7A13844A1A8FF21C0D615CA56AF",
+ "D5D08C1DC728A47CD55A2ACBB811294962022E745F4BCDF4",
+ "7761189D73039A3F06BDDF00B308D7A43BE7BEA1CE9D042E"
+ },
+ {
+ "1702428661BA4CFE686CFDEDFFAA6A27",
+ "9218A89B0A7AEC7E6E2AF1CA493B2829",
+ "6EEB9F7DDF66CED3DB74F7E8DE0CB2CD"
+ }
+ },
+ {
+ {
+ "4FD3A4C759827F6E188E542B83A858026C17FD1DEF21477A964D122B62EE55FA9DB3CCF05A768C83",
+ "F2C8B52652970805EE60ECECC8369C98443463F1C3A5A6357DFDFEE6B7F1EF0CF05523B5469E4555",
+ "21FCBDC92C07F112D19742F5100F2A995E27CB282D73DF5CFEC802C629A279BD4E498C98D170003E"
+ },
+ {
+ "3FD4C32A44DC0A9605A5A793C57E94826E80FC9E8E9620BBC2E02FE41A62A2D3",
+ "4FC88F1E88C3B5A76CF6BE5FA8205BA6F7FA201F7C40E8F0F9CA156E140A4EC5",
+ "CCE31260C967F4B9BB3D2D31F82320715E434C1313D911C58CE7E42AA78DA831"
+ },
+ {
+ "714766BE5CB60DA99DC0BD4E7E655ADE7F26E45F372EF1BF",
+ "00064542E2B4821B4E9173DA6FD1ABAE45C5E5CF26DB506D",
+ "4D88D531C20E63A39372F275329BDBEBE15E7D2C32F2A98F"
+ },
+ {
+ "4933917C9B56124914D2B76DE221BA13",
+ "7F2D1CA9D942630FE1E954E4176E84A5",
+ "9A46902F3997F0EB121981DAEC6D89C4"
+ }
+ }
+ };
+
+ char testIV[][33] =
+ {
+ "0000000000000000",
+ "0102030405060708",
+ "4041424344454647",
+ "4693867334098764",
+ "6209876098547207"
+ };
+
+ for (int i = 0; i < 5; i++)
+ {
+#ifndef WITH_FIPS
+ ByteString keyData56(testKeys56[i]);
+ CPPUNIT_ASSERT(keyData56.size() == 8);
+ ByteString keyData112(testKeys112[i]);
+ CPPUNIT_ASSERT(keyData112.size() == 16);
+#endif
+ ByteString keyData168(testKeys168[i]);
+ CPPUNIT_ASSERT(keyData168.size() == 24);
+
+#ifndef WITH_FIPS
+ DESKey desKey56(56);
+ CPPUNIT_ASSERT(desKey56.setKeyBits(keyData56));
+ DESKey desKey112(112);
+ CPPUNIT_ASSERT(desKey112.setKeyBits(keyData112));
+#endif
+ DESKey desKey168(168);
+ CPPUNIT_ASSERT(desKey168.setKeyBits(keyData168));
+
+ ByteString IV(testIV[i]);
+
+ for (int j = 0; j < 4; j++)
+ {
+ ByteString plainText(testData[j]), shsmPlainText;
+ ByteString cipherText;
+ ByteString shsmCipherText, OB;
+
+#ifndef WITH_FIPS
+ // Test 56-bit key
+ cipherText = ByteString(testResult[i][j][0]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey56, SymMode::CBC, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey56, SymMode::CBC, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+
+ // Test 112-bit key
+ cipherText = ByteString(testResult[i][j][1]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey112, SymMode::CBC, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey112, SymMode::CBC, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+#endif
+
+ // Test 168-bit key
+ cipherText = ByteString(testResult[i][j][2]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey168, SymMode::CBC, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey168, SymMode::CBC, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+ }
+ }
+}
+
+void DESTests::testECB()
+{
+#ifndef WITH_FIPS
+ char testKeys56[][17] =
+ {
+ "0000000000000000",
+ "0102030405060708",
+ "4041424344454647",
+ "4698436794236871",
+ "0940278947239572"
+ };
+
+ char testKeys112[][33] =
+ {
+ "00000000000000000000000000000000",
+ "0102030405060708090A0B0C0D0E0F10",
+ "404142434445464748494A4B4C4D4E4F",
+ "64398647034486943598534703463870",
+ "87406984068406984607412103517413"
+ };
+#endif
+
+ char testKeys168[][49] =
+ {
+ "000000000000000000000000000000000000000000000000",
+ "0102030405060708090A0B0C0D0E0F101112131415161718",
+ "404142434445464748494A4B4C4D4E4F5051525354555657",
+ "643906874509874309687459084769847562436043696747",
+ "430135460496813044639085714376487549490586439575"
+ };
+
+ char testData[][256] =
+ {
+ "4938673409687134684698438657403986439058740935874395813968496846",
+ "549813644389670948567490687546098245665626527788",
+ "64398769586792586795867965624526",
+ "468376458463264536"
+ };
+
+ char testResult[5][4][3][256] = {
+ {
+ {
+ "ACC8B1BE444EEA9E44404B8595B7667982F1BDF99F419F083249964334F2B15F7E422822773666C0",
+ "ACC8B1BE444EEA9E44404B8595B7667982F1BDF99F419F083249964334F2B15F7E422822773666C0",
+ "ACC8B1BE444EEA9E44404B8595B7667982F1BDF99F419F083249964334F2B15F7E422822773666C0"
+ },
+ {
+ "F9A1913AA27A0537CA0BB1A6417C4037978BC92CEFCD10BB7E422822773666C0",
+ "F9A1913AA27A0537CA0BB1A6417C4037978BC92CEFCD10BB7E422822773666C0",
+ "F9A1913AA27A0537CA0BB1A6417C4037978BC92CEFCD10BB7E422822773666C0"
+ },
+ {
+ "36FD5581BB31F3E2ADA81678B64A0F3C7E422822773666C0",
+ "36FD5581BB31F3E2ADA81678B64A0F3C7E422822773666C0",
+ "36FD5581BB31F3E2ADA81678B64A0F3C7E422822773666C0"
+ },
+ {
+ "B81DA29972385E55EA1F3677CDC02D27",
+ "B81DA29972385E55EA1F3677CDC02D27",
+ "B81DA29972385E55EA1F3677CDC02D27"
+ }
+ },
+ {
+ {
+ "278B2CA6259C30E180CCB62E69F0841F235507E2FB3404FC2BC223E37E32B3A78207EA5D3E19A5FD",
+ "417579E3ABEF6F0D620B4FF88E2220457466420803140BFEFBA062A2A41D7C15061019377C6BFD8A",
+ "A676D0404F0F105B2073B9DD19C8C434428098BFC5AF1292FE12477340395F118F45B5BE23F16C4E"
+ },
+ {
+ "7D004390E5638E54077E2551B01BD52BFA1B98403ECE1AEF8207EA5D3E19A5FD",
+ "391B84593FEA836450318A6E943F1C3A4A6BD74E5001EB7A061019377C6BFD8A",
+ "DEAF58111ECCCB449F0C2564B52E360E4AACC8672ABBDF1A8F45B5BE23F16C4E"
+ },
+ {
+ "A6947F9EF4159BAE636A70B904059BC38207EA5D3E19A5FD",
+ "14ADFE212E27BF7F409395B45577F2C8061019377C6BFD8A",
+ "FF87BF761FC159F4442B3B4593233BC48F45B5BE23F16C4E"
+ },
+ {
+ "3A1777DAAAC85389EE0B499A90AE1739",
+ "376E61DF2EAFE5B523964A03885AD085",
+ "E4D81EE64FE8FB187EB7B5E80E075C73"
+ }
+ },
+ {
+ {
+ "F105809DF621715F4D3492E1EEC4A7DE0775A0632ECC13429DF0DC695A60882FA47F93E855A1445B",
+ "77C85215179312315997B4D0E997DB413176C80A8ED9F5EB9B726200224CE97C20A8A19F543BCCBD",
+ "AF1477E32B5BB1CA46D26B6020B3B48DB0A90A97B1BA60F032ADA648296EC92DEE924AA617423FD1"
+ },
+ {
+ "0FB3C3D9D93E0025F87909CD351D0116C0F684A204015E2CA47F93E855A1445B",
+ "67A66DB3209C406D2FE31AF6C36D24C7B32D0F8F1EAFA90020A8A19F543BCCBD",
+ "F85B1F07D788C59CD3DE6D562A175725DF596847ADEA8764EE924AA617423FD1"
+ },
+ {
+ "243A34CD70CE3819B9510980B6EFF3EAA47F93E855A1445B",
+ "997E145467B88D9D4C923797F539AC1620A8A19F543BCCBD",
+ "836788D7AD1F879B405438775FFD6D76EE924AA617423FD1"
+ },
+ {
+ "70856D6B67EE353F27EBB96462DACE63",
+ "D02F2A92C175A58001D89C4AEC476384",
+ "4ED379A40187826CAA90D2D6A05D5A9B"
+ }
+ },
+ {
+ {
+ "C79F67ABCE6F741CF6D5B7B4870397779AEB89F48805DD1A28305E804A4A2B91114E1CF0C7FA91DA",
+ "42956EA3B9415E8FE75B667A7C6B1ADF64D08E53C38DE733A776A97C7A8FC27E32945078552FA3E2",
+ "3685365AD0F07609E13CCDE69CEDC8CCA0C37262A87B734286B9119643AC3BABE435BDA25919BE86"
+ },
+ {
+ "09B882774309CC2B117586F5FA8BF7E4A5DA2A65E137665B114E1CF0C7FA91DA",
+ "0E52A9ABE753758D3C4F6326A8F689282D1DAB8AF6FC8CFF32945078552FA3E2",
+ "8DB6B9D50B5B8CE7DA56546CFF36C16BA3159E0EB7BD649AE435BDA25919BE86"
+ },
+ {
+ "025F9704F6ACD844BCFC6EBA809CD871114E1CF0C7FA91DA",
+ "1692C6A1DF9192C6D4125991EA9A9CBE32945078552FA3E2",
+ "6B848E67225EDDCCD7E8EC89ACDAA0AFE435BDA25919BE86"
+ },
+ {
+ "9D01CD89916AEE48AFE528A376E07AE9",
+ "6FA6A689405048060D65E1B1240B76B7",
+ "7EADEB7073D2EA995C5ED613C978817F"
+ }
+ },
+ {
+ {
+ "A98D0E8E72C589D80D240F192CF65C30FF3A1AB9D8CE54B09AA249C72E395AC3B40F19A649C1B237",
+ "33AC43C7A936665859431D18C089EE45F1356C34F5DF462D81BBFA42380A7E4F6732A473091A3673",
+ "FD4F2F77CCE20147CD0932B2E2D8D5978523F6A03D59E31E1F678A5DA4C350132E94F199555C371E"
+ },
+ {
+ "39453F3BF3C0CAE54279D96F4592359A5AEE6DD04D5F6162B40F19A649C1B237",
+ "E2AFCEEFF2317C520D890D7F2CB91ACD99D5DCAEC9C409016732A473091A3673",
+ "CB19BF88B2DEDDE981E048379A47BDF77ED5F815034CB07A2E94F199555C371E"
+ },
+ {
+ "9D466BACFA69266F7CC26D2C8B8CD203B40F19A649C1B237",
+ "265FDBCCF5F2325B3C8770ABEEECA4166732A473091A3673",
+ "C61E9B86A8A663AE1566CFFCF2046D6B2E94F199555C371E"
+ },
+ {
+ "380091B24160152B63EF067F6C189385",
+ "548EB237B455CBA0100A5C52A6F28C2B",
+ "066C3B0C5E6AF1E9BDD3DDAE5040F809"
+ }
+ }
+ };
+
+ char testIV[][33] =
+ {
+ "0000000000000000",
+ "0102030405060708",
+ "4041424344454647",
+ "4693867334098764",
+ "6209876098547207"
+ };
+
+ for (int i = 0; i < 5; i++)
+ {
+#ifndef WITH_FIPS
+ ByteString keyData56(testKeys56[i]);
+ CPPUNIT_ASSERT(keyData56.size() == 8);
+ ByteString keyData112(testKeys112[i]);
+ CPPUNIT_ASSERT(keyData112.size() == 16);
+#endif
+ ByteString keyData168(testKeys168[i]);
+ CPPUNIT_ASSERT(keyData168.size() == 24);
+
+#ifndef WITH_FIPS
+ DESKey desKey56(56);
+ CPPUNIT_ASSERT(desKey56.setKeyBits(keyData56));
+ DESKey desKey112(112);
+ CPPUNIT_ASSERT(desKey112.setKeyBits(keyData112));
+#endif
+ DESKey desKey168(168);
+ CPPUNIT_ASSERT(desKey168.setKeyBits(keyData168));
+
+ ByteString IV(testIV[i]);
+
+ for (int j = 0; j < 4; j++)
+ {
+ ByteString plainText(testData[j]), shsmPlainText;
+ ByteString cipherText;
+ ByteString shsmCipherText, OB;
+
+#ifndef WITH_FIPS
+ // Test 56-bit key
+ cipherText = ByteString(testResult[i][j][0]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey56, SymMode::ECB, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey56, SymMode::ECB, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+
+ // Test 112-bit key
+ cipherText = ByteString(testResult[i][j][1]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey112, SymMode::ECB, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey112, SymMode::ECB, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+#endif
+
+ // Test 168-bit key
+ cipherText = ByteString(testResult[i][j][2]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey168, SymMode::ECB, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey168, SymMode::ECB, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+ }
+ }
+}
+
+void DESTests::testOFB()
+{
+#ifndef WITH_FIPS
+ char testKeys56[][17] =
+ {
+ "0000000000000000",
+ "0102030405060708",
+ "4041424344454647",
+ "4698436794236871",
+ "0940278947239572"
+ };
+
+ char testKeys112[][33] =
+ {
+ "00000000000000000000000000000000",
+ "0102030405060708090A0B0C0D0E0F10",
+ "404142434445464748494A4B4C4D4E4F",
+ "64398647034486943598534703463870",
+ "87406984068406984607412103517413"
+ };
+#endif
+
+ char testKeys168[][49] =
+ {
+ "000000000000000000000000000000000000000000000000",
+ "0102030405060708090A0B0C0D0E0F101112131415161718",
+ "404142434445464748494A4B4C4D4E4F5051525354555657",
+ "643906874509874309687459084769847562436043696747",
+ "430135460496813044639085714376487549490586439575"
+ };
+
+ char testData[][256] =
+ {
+ "4938673409687134684698438657403986439058740935874395813968496846",
+ "549813644389670948567490687546098245665626527788",
+ "64398769586792586795867965624526",
+ "468376458463264536"
+ };
+
+ char testResult[5][4][3][256] = {
+ {
+ {
+ "C59E2ADDC8D9529368469843865740390AE5DDB1B5B816204395813968496846",
+ "C59E2ADDC8D9529368469843865740390AE5DDB1B5B816204395813968496846",
+ "C59E2ADDC8D9529368469843865740390AE5DDB1B5B816204395813968496846"
+ },
+ {
+ "D83E5E8D823844AE48567490687546090EE32BBFE7E3542F",
+ "D83E5E8D823844AE48567490687546090EE32BBFE7E3542F",
+ "D83E5E8D823844AE48567490687546090EE32BBFE7E3542F"
+ },
+ {
+ "E89FCA8099D6B1FF6795867965624526",
+ "E89FCA8099D6B1FF6795867965624526",
+ "E89FCA8099D6B1FF6795867965624526"
+ },
+ {
+ "CA253BAC45D205E236",
+ "CA253BAC45D205E236",
+ "CA253BAC45D205E236"
+ }
+ },
+ {
+ {
+ "3E9FB188FC11138D05109EA396CA48E1681DF27A857C3C4A9E92D3DC85A5F313",
+ "3440BEFCF35DC87716D8440F71BAF9ACD0441E10B9E5B525F0584499620086E2",
+ "DDB35281888DF064195C42D45E4E2571AD62113A228B5107D1AC849861C199C0"
+ },
+ {
+ "233FC5D8B6F005B02500727078E84ED16C1B0474D7277E45",
+ "29E0CAACB9BCDE4A36C8A8DC9F98FF9CD442E81EEBBEF72A",
+ "C01326D1C26CE659394CAE07B06C2341A964E73470D01308"
+ },
+ {
+ "139E51D5AD1EF0E10AC3809975FF4DFE",
+ "19415EA1A2522B1B190B5A35928FFCB3",
+ "F0B2B2DCD9821308168F5CEEBD7B206E"
+ },
+ {
+ "3124A0F9711A44FC5B",
+ "3BFBAF8D7E569F0648",
+ "D20843F00586A71547"
+ }
+ },
+ {
+ {
+ "E376288A10BD52CB7162ADA9A732D24B574B1E7CB4FF5C791FFEA2E481AD3049",
+ "FD82CFAE85B8581FFCF489F467D94B1B4FAAAEDDE4EC531ABD30D7EA235896AA",
+ "24D9411BA456571900244AEA3EA7159BAA96522B6F891606A8D9A559FE218A9B"
+ },
+ {
+ "FED65CDA5A5C44F65172417A4910D47B534DE872E6A41E76",
+ "E022BBFECF594E22DCE4652789FB4D2B4BAC58D3B6B71115",
+ "3979354BEEB741242034A639D08513ABAE90A4253DD25409"
+ },
+ {
+ "CE77C8D741B2B1A77EB1B3934407D754",
+ "D0832FF3D4B7BB73F32797CE84EC4E04",
+ "09D8A146F559B4750FF754D0DD921084"
+ },
+ {
+ "ECCD39FB9DB605BA2F",
+ "F239DEDF08B30F6EA2",
+ "2B62506A295D00685E"
+ }
+ },
+ {
+ {
+ "740A4786C73A7C6B52DAF270161895E13B4437C56B9837827C2FE237532F4C19",
+ "581B63C58404AEBECFDFD51D74A79836C11514685B47F3B02A2419AF0AA8C625",
+ "D5FCB196868673D136D480E0B6EFC33C589131D87A4AC004A6E0DE8ADC8DE611"
+ },
+ {
+ "69AA33D68DDB6A5672CA1EA3F83A93D13F42C1CB39C3758D",
+ "45BB1795CEE5B883EFCF39CE9A859E06C513E266091CB1BF",
+ "C85CC5C6CC6765EC16C46C3358CDC50C5C97C7D62811820B"
+ },
+ {
+ "590BA7DB96359F075D09EC4AF52D90FE",
+ "751A8398D50B4DD2C00CCB2797929D29",
+ "F8FD51CBD78990BD39079EDA55DAC623"
+ },
+ {
+ "7BB156F74A312B1A0C",
+ "57A072B4090FF9CF91",
+ "DA47A0E70B8D24A068"
+ }
+ },
+ {
+ {
+ "0855A84EAD2176C3F10B9DCFC8D1A379AF616FC5C5CD4E6D434353C52832F9F6",
+ "A8420E97462B0215AAC1DB0835D4064C6A8B123327FC396C9520BEA70B59B412",
+ "3461DEDF1B4893E16706900E1DDBE351E90C1300B9B01E8A518A01AD56E9AC8C"
+ },
+ {
+ "15F5DC1EE7C060FED11B711C26F3A549AB6799CB97960C62",
+ "B5E27AC70CCA14288AD137DBDBF6007C6E8DE43D75A77B63",
+ "29C1AA8F51A985DC47167CDDF3F9E561ED0AE50EEBEB5C85"
+ },
+ {
+ "25544813FC2E95AFFED883F52BE4A666",
+ "8543EECA1724E179A512C532D6E10353",
+ "19603E824A47708D68D58E34FEEEE64E"
+ },
+ {
+ "07EEB93F202A21B2AF",
+ "A7F91FE6CB205564F4",
+ "3BDACFAE9643C49039"
+ }
+ }
+ };
+
+ char testIV[][33] =
+ {
+ "0000000000000000",
+ "0102030405060708",
+ "4041424344454647",
+ "4693867334098764",
+ "6209876098547207"
+ };
+
+ for (int i = 0; i < 5; i++)
+ {
+#ifndef WITH_FIPS
+ ByteString keyData56(testKeys56[i]);
+ CPPUNIT_ASSERT(keyData56.size() == 8);
+ ByteString keyData112(testKeys112[i]);
+ CPPUNIT_ASSERT(keyData112.size() == 16);
+#endif
+ ByteString keyData168(testKeys168[i]);
+ CPPUNIT_ASSERT(keyData168.size() == 24);
+
+#ifndef WITH_FIPS
+ DESKey desKey56(56);
+ CPPUNIT_ASSERT(desKey56.setKeyBits(keyData56));
+ DESKey desKey112(112);
+ CPPUNIT_ASSERT(desKey112.setKeyBits(keyData112));
+#endif
+ DESKey desKey168(168);
+ CPPUNIT_ASSERT(desKey168.setKeyBits(keyData168));
+
+ ByteString IV(testIV[i]);
+
+ for (int j = 0; j < 4; j++)
+ {
+ ByteString plainText(testData[j]), shsmPlainText;
+ ByteString cipherText;
+ ByteString shsmCipherText, OB;
+
+#ifndef WITH_FIPS
+ // Test 56-bit key
+ cipherText = ByteString(testResult[i][j][0]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey56, SymMode::OFB, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey56, SymMode::OFB, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+
+ // Test 112-bit key
+ cipherText = ByteString(testResult[i][j][1]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey112, SymMode::OFB, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey112, SymMode::OFB, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+#endif
+
+ // Test 168-bit key
+ cipherText = ByteString(testResult[i][j][2]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey168, SymMode::OFB, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey168, SymMode::OFB, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+ }
+ }
+}
+
+void DESTests::testCFB()
+{
+#ifndef WITH_FIPS
+ char testKeys56[][17] =
+ {
+ "0000000000000000",
+ "0102030405060708",
+ "4041424344454647",
+ "4698436794236871",
+ "0940278947239572"
+ };
+
+ char testKeys112[][33] =
+ {
+ "00000000000000000000000000000000",
+ "0102030405060708090A0B0C0D0E0F10",
+ "404142434445464748494A4B4C4D4E4F",
+ "64398647034486943598534703463870",
+ "87406984068406984607412103517413"
+ };
+#endif
+
+ char testKeys168[][49] =
+ {
+ "000000000000000000000000000000000000000000000000",
+ "0102030405060708090A0B0C0D0E0F101112131415161718",
+ "404142434445464748494A4B4C4D4E4F5051525354555657",
+ "643906874509874309687459084769847562436043696747",
+ "430135460496813044639085714376487549490586439575"
+ };
+
+ char testData[][256] =
+ {
+ "4938673409687134684698438657403986439058740935874395813968496846",
+ "549813644389670948567490687546098245665626527788",
+ "64398769586792586795867965624526",
+ "468376458463264536"
+ };
+
+ char testResult[5][4][3][256] = {
+ {
+ {
+ "C59E2ADDC8D95293F8ED346ADAF018111F0B6726349664FF9B02C46C2EC5B96F",
+ "C59E2ADDC8D95293F8ED346ADAF018111F0B6726349664FF9B02C46C2EC5B96F",
+ "C59E2ADDC8D95293F8ED346ADAF018111F0B6726349664FF9B02C46C2EC5B96F"
+ },
+ {
+ "D83E5E8D823844AE748E369586FA76A2BFD1E668EC78D67B",
+ "D83E5E8D823844AE748E369586FA76A2BFD1E668EC78D67B",
+ "D83E5E8D823844AE748E369586FA76A2BFD1E668EC78D67B"
+ },
+ {
+ "E89FCA8099D6B1FFB3A24C435B847A73",
+ "E89FCA8099D6B1FFB3A24C435B847A73",
+ "E89FCA8099D6B1FFB3A24C435B847A73"
+ },
+ {
+ "CA253BAC45D205E270",
+ "CA253BAC45D205E270",
+ "CA253BAC45D205E270"
+ }
+ },
+ {
+ {
+ "3E9FB188FC11138D49C438ABB98A3846671A4DB257AA62C7929CD55A43E46D88",
+ "3440BEFCF35DC8773DD631A9C8CCF222009D45E301BBF6432A78E99416CE87D8",
+ "DDB35281888DF06446772085E3DE849298B4BE0089979260DDC59FACB17AD0BE"
+ },
+ {
+ "233FC5D8B6F005B0966FB313EA0DDFBECF19CBC937445A56",
+ "29E0CAACB9BCDE4AB219A19AA77E2C9A407C98A18BD56FDF",
+ "C01326D1C26CE6592FA4E9909D93A85BE005431046661C73"
+ },
+ {
+ "139E51D5AD1EF0E1E74DD9919AE65DB6",
+ "19415EA1A2522B1B5972F5DCBEEF4E01",
+ "F0B2B2DCD9821308815ADB01F0A16B76"
+ },
+ {
+ "3124A0F9711A44FC92",
+ "3BFBAF8D7E569F06CF",
+ "D20843F00586A715DB"
+ }
+ },
+ {
+ {
+ "E376288A10BD52CB06B42B4582A425907D2DF490EC14B478507BCDE58CE95B02",
+ "FD82CFAE85B8581F1409EB62D06A98E05C401607619DE1235822E2DEB74737E1",
+ "24D9411BA4565719BE9FF1A4D91F23B3BF8980A706747077583C8EB84AF63745"
+ },
+ {
+ "FED65CDA5A5C44F619325429C78F464D271807342B10F899",
+ "E022BBFECF594E22ABC22FA25024B6FD8F61337CBD1F023D",
+ "3979354BEEB741241F0D219B5521A488F870C849275FF8B9"
+ },
+ {
+ "CE77C8D741B2B1A7E488B94EB32C96FD",
+ "D0832FF3D4B7BB73AEC7646A3686ABCF",
+ "09D8A146F559B475A6258D03BC6F8BD3"
+ },
+ {
+ "ECCD39FB9DB605BAB2",
+ "F239DEDF08B30F6EE4",
+ "2B62506A295D00687E"
+ }
+ },
+ {
+ {
+ "740A4786C73A7C6B435071A654DA8FCC75BA3299969E327A2ABC7024378CF3AA",
+ "581B63C58404AEBE49FA5FA4032918813075279E836DFE9BAEDF37D9B21ABEE1",
+ "D5FCB196868673D1FA9C8A67E6A2449354B292E1A76BA11C416A394116857B29"
+ },
+ {
+ "69AA33D68DDB6A561FB6D6218FAC0E812514782FC6059E46",
+ "45BB1795CEE5B883232EBCCB672FC9C4803C6B827825FE94",
+ "C85CC5C6CC6765EC466B8F8AC8DFC91CB916F617873AF187"
+ },
+ {
+ "590BA7DB96359F07DB2F2CE68748425C",
+ "751A8398D50B4DD24E4681B6D0E880FC",
+ "F8FD51CBD78990BD5D088ECA798DA0E6"
+ },
+ {
+ "7BB156F74A312B1A8C",
+ "57A072B4090FF9CF1B",
+ "DA47A0E70B8D24A043"
+ }
+ },
+ {
+ {
+ "0855A84EAD2176C3D2C3DE4FB868CA2C1B0DF550E187E29808C45594C070FBF4",
+ "A8420E97462B02158D2CABD1574D072F8D83123CED9BA7CEDD7C2799E168F32D",
+ "3461DEDF1B4893E182BE36017DEBC6669B15269DFA4435A31EB1A0CE6A845176"
+ },
+ {
+ "15F5DC1EE7C060FEDC9B1B43A20588E7A073A300BEFC4CAD",
+ "B5E27AC70CCA142857CB807226DC1EA9B31BE81C0FDCD3FB",
+ "29C1AA8F51A985DC7E530E6EB7AEAC246F2ED097D09851CC"
+ },
+ {
+ "25544813FC2E95AF817E0897D4E22ECD",
+ "8543EECA1724E179543979F02103C150",
+ "19603E824A47708D80E29D3A61BAE5EA"
+ },
+ {
+ "07EEB93F202A21B250",
+ "A7F91FE6CB205564F2",
+ "3BDACFAE9643C49027"
+ }
+ }
+ };
+ char testIV[][33] =
+ {
+ "0000000000000000",
+ "0102030405060708",
+ "4041424344454647",
+ "4693867334098764",
+ "6209876098547207"
+ };
+
+ for (int i = 0; i < 5; i++)
+ {
+#ifndef WITH_FIPS
+ ByteString keyData56(testKeys56[i]);
+ CPPUNIT_ASSERT(keyData56.size() == 8);
+ ByteString keyData112(testKeys112[i]);
+ CPPUNIT_ASSERT(keyData112.size() == 16);
+#endif
+ ByteString keyData168(testKeys168[i]);
+ CPPUNIT_ASSERT(keyData168.size() == 24);
+
+#ifndef WITH_FIPS
+ DESKey desKey56(56);
+ CPPUNIT_ASSERT(desKey56.setKeyBits(keyData56));
+ DESKey desKey112(112);
+ CPPUNIT_ASSERT(desKey112.setKeyBits(keyData112));
+#endif
+ DESKey desKey168(168);
+ CPPUNIT_ASSERT(desKey168.setKeyBits(keyData168));
+
+ ByteString IV(testIV[i]);
+
+ for (int j = 0; j < 4; j++)
+ {
+ ByteString plainText(testData[j]), shsmPlainText;
+ ByteString cipherText;
+ ByteString shsmCipherText, OB;
+
+#ifndef WITH_FIPS
+ // Test 56-bit key
+ cipherText = ByteString(testResult[i][j][0]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey56, SymMode::CFB, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey56, SymMode::CFB, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+
+ // Test 112-bit key
+ cipherText = ByteString(testResult[i][j][1]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey112, SymMode::CFB, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey112, SymMode::CFB, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+#endif
+
+ // Test 168-bit key
+ cipherText = ByteString(testResult[i][j][2]);
+
+ // Now, do the same thing using our DES implementation
+ shsmCipherText.wipe();
+ CPPUNIT_ASSERT(des->encryptInit(&desKey168, SymMode::CFB, IV));
+
+ CPPUNIT_ASSERT(des->encryptUpdate(plainText, OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(des->encryptFinal(OB));
+ shsmCipherText += OB;
+
+ CPPUNIT_ASSERT(shsmCipherText == cipherText);
+
+ // Check that we can get the plain text
+ shsmPlainText.wipe();
+ CPPUNIT_ASSERT(des->decryptInit(&desKey168, SymMode::CFB, IV));
+
+ CPPUNIT_ASSERT(des->decryptUpdate(shsmCipherText, OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(des->decryptFinal(OB));
+ shsmPlainText += OB;
+
+ CPPUNIT_ASSERT(shsmPlainText == plainText);
+ }
+ }
+}