/* * 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. */ /***************************************************************************** AESTests.cpp Contains test cases to test the AES implementation *****************************************************************************/ #include #include #include "AESTests.h" #include "CryptoFactory.h" #include "AESKey.h" #include CPPUNIT_TEST_SUITE_REGISTRATION(AESTests); void AESTests::setUp() { aes = NULL; aes = CryptoFactory::i()->getSymmetricAlgorithm(SymAlgo::AES); // Check the return value CPPUNIT_ASSERT(aes != NULL); } void AESTests::tearDown() { if (aes != NULL) { CryptoFactory::i()->recycleSymmetricAlgorithm(aes); } fflush(stdout); } void AESTests::testBlockSize() { CPPUNIT_ASSERT(aes->getBlockSize() == 16); } void AESTests::testCBC() { char testKeys128[][33] = { "00000000000000000000000000000000", "0102030405060708090A0B0C0D0E0F10", "404142434445464748494A4B4C4D4E4F", "89436760984679018453504364534464", "49587346983643545706904580436731" }; char testKeys192[][49] = { "000000000000000000000000000000000000000000000000", "0102030405060708090A0B0C0D0E0F101213141516171819", "404142434445464748494A4B4C4D4E4F5051525354555657", "096874395874290867409857496743857632098479834634", "439867439058743095864395348375043296845094854983" }; char testKeys256[][65] = { "0000000000000000000000000000000000000000000000000000000000000000", "0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20", "404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F", "4394398576098257436095746985679043867498572406874967416846341641", "4369006859867098670492857409386741095643756930847023587048579014" }; char testData[][256] = { "4938673409687134684698438657403986439058740935874395813968496846", "549813644389670948567490687546098245665626527788", "64398769586792586795867965624526", "468376458463264536" }; char testResult[5][4][3][256] = { { { "6CAEC72F5E101C66550215ACAB6B874C62E7BD074C0A09A8EE4562EFCB4E560A3E90FA0F50391087824FC27F57618E5C", "E20E3123AC64FCA5536E0A2DC48DBEBCECB3F260EFF4A0EB99D72F57EF38DED336EB9DD0B968D24C91E63974E7445A21", "C7910B1634DB493998608875A4652B20C64202ED507D9DBA06F62EB20A63C32FB6C9669D42A0AC29D773E6D40A63A2AC" }, { "8F48A65BF638FEDB7E6F59BAC8C110FEBA933F106D564119B88569E758B7FB83", "125E1D93DC2C43A6FAFC508DB6F9A4A9F390D102C2300F0A3617CE95027BFAA3", "FACB8DEF1B476400DE9796D5058E9086ECF04C927F5C160161C7A34D8288EB3C" }, { "C810E96482F109C9A05D2B1BEBAC7966BB7784F58A5478C1A07EC0DB39F6D87B", "2385391BB8F2DD97280B1FAEFACB6B5C4FE12A2274D6B967509CF18500A640D6", "47549520EADA1A5D931EACCC922F88BA2E386089BF97C790FD2CD38553334AE4" }, { "A7D9EAE80224624188CAA7012140E946", "6ECD5C71ECA4AB9C3B71E91721CA2043", "2F77AA438E9259F268985668B00650E5" } }, { { "FCB2FB6BF8ED8910F023A934EB9DA550E4D5B469D75B9390F4A207E54F29412450E52E980862DC80B89F6D1D10B68AA5", "7EF0F65513CFE3E0D21305E2ECCBB3554B0DE119720C5A86337E57F74795BC23ED9CB82A951DE3D00D7A0DC8997319DD", "5B83BFDB6EF3AEA5191F2EE3366EDE10480E9459C0DE2994DD9C6408A377DFFF8121A38CFD1AA864559B9A435A3BDD6D" }, { "81D667193D42BF19C456F4A1F7070C047D94C7EE8136FA315F938162FDDA20C1", "2EFBA2B689C0F775097F98B569A1F20004F1A75F0C53473969DBE586ABCAE04D", "447326913AA4565951D987F59B48870DD9285EEFCF64B429C2220E4F3E0D9DE2" }, { "891DF30BAEA2D24408A9C788D59DBAC7A6F34311813216311E18E9ED7122DB1A", "F1629B62ECDF3CDAA3DA0EBB31EE37691AF4EB2B6F9CF04A9861935B2C167D02", "C7BD348D5E6696CB8BA813B96EA5C42C5C3C3629D18FC9DAF1B50A0AE4843C5B" }, { "91C44D109D46C8E8656793680D43BE94", "E68D8E49A19F155B7ED7253120B0D117", "FAED8666F695C85283ECF51C96DB41CE" } }, { { "0CCFB49FE2B7E93A556E56B2C616885FBB0515F55A4210FE2F492A4775F078655CB21691CA6A54819C2D885954809D00", "2FC6C785D683FC35304DD161A21FA1B256F9FBB2817F1F3BEBCE7C1E292EC6999641AA6953C0FAB6DFC2942CABD32DFB", "31FAF4E3DA19D2372666AC635FFE361E33AD7865AEF616273D8F3B471F77A0998C6A41497168A65F621D912C54A4AF28" }, { "0B3842152A6365ED14AD952ABBBAF0EED2E8F36250DD25DDA301490FDE05219B", "696BF21A887A04E194DCC18719E1BD623D8BD25A0CEF5EC2E21312ACE6C81F40", "A2C8E61471EC80FE39AC0D8F720FEA8F2D23D04596A751C755E51CD357BCA5E0" }, { "5E0EA3AFBE191A16854C7960F087958F577EA4F80160F521A12D2211FAC25E16", "F5475B4FD48F969123C9F7FB08C7E902CCA282F167BBAFF1A7C7EDDB7BCBAC76", "380CB860EC6DEF4F9329F4BE826DE1FE61A71629DD978F00BEFB349ACBD0BAD8" }, { "BA1452E755E6A43E43B10DD2C1530093", "07CA52926D4E8F2F6055E6E0251CB9E5", "AB99E5FEE195B4433667AD3074A9322E" } }, { { "D2D46E577723B30E6B5FC96DC18B2C55E0EACCB07CE07C7F30FD113A987E2A2059AB7DF8985C1AE525EFAD9CE111893C", "CC5B220688AC0231DBC03C8886C0D0109840B9E58FBB1A6B6C261ED9E7979E951818033A25778FF328786D1777790078", "4B4A0B3D6D4E770BECC574BF66CD401942DC4D0DCD0EC65F99B2925B688BB217FCB5C946BE986C440C93279F4670CD43" }, { "29C76D62D3C4F7FECCBFD7A73B06E2ECA7AA3B2D4BE79EC945B0B88C813264D8", "B898DCE11F3D6BB2182208E0BBBA7F404FE415D4D6D0772960E7CE3549B9899C", "11E9552009836B51F241E972D680A9F397260163D9D5369BFC1B136FB4206966" }, { "539FC6EDAE21EDDC1CC4650367F527467916A6990E540146238AA9CD6B3B4ADE", "2D9DE2BC47DAFCF7867134110C541EBCD72D67B1B23DEF6805DBFF4A4D90EF91", "BF484690835FF61C4A7873A996EEB91F553978A40360E192273D3923E04DFE1E" }, { "4910EFFFBF571C98D51802F04A42213E", "EDD1880FC4D41293BC74B98AF3D8A010", "F8BCC258A6CD7FAA4EDF16A3CF5573C4" } }, { { "C2061BD0B4274B5CB4E408B492991F4195FDBFCDED1BC57442151B182BA6E8075AAF858F357C262E0034B9B5F839D823", "6EEFEBCC9F8C607D21A158E23980EFA6EC234DC6EA668A446F467F4AE87521F18DC1800D87A5EBC63C444F810557B61D", "00C952BA54614A1F11B0D59F3F469A859F62CCE0D35073B91B461302A7F37BD0B23401482DFCEE66ABD12C05615C9862" }, { "B36553D93EEF04AE247DBCBDDB8C039FFAC8AC1B0EF14C2E4BA653F089924451", "90670C9DE58F95431591FA2BE8EA1B4B3F5BDBFC0B5199F94A41E4FC7B6B1645", "A065415413D3A08E4B42A3F2681B8D122167A1E3F92D38C305761D9BF80131F1" }, { "12A758F161543F2842138B8C2453C3A05A90BE9F92CB3DD10C40AB9D1D746B49", "DF1F4DDFFE1032C812FC6F35AB2B3A7B0E8D26DA49DEC8F5E08D108DB1283BEA", "FDCB66159E1B5CF1BE9F7271EF2C35D5E9F7485E32D16C6AC865E64619DB8724" }, { "1FC224DCB64848B5E8F9FB91C542991F", "1F8C5F65F9205098B47E26894B9154D9", "19763CAC206EDFDEBEDAD9C274DEE1C1" } } }; char testIV[][33] = { "00000000000000000000000000000000", "0102030405060708090A0B0C0D0E0F10", "404142434445464748494A4B4C4D4E4F", "69836472094875029486750948672066", "48670943876904867104398574908554" }; for (int i = 0; i < 5; i++) { ByteString keyData128(testKeys128[i]); ByteString keyData192(testKeys192[i]); ByteString keyData256(testKeys256[i]); AESKey aesKey128(128); CPPUNIT_ASSERT(aesKey128.setKeyBits(keyData128)); AESKey aesKey192(192); CPPUNIT_ASSERT(aesKey192.setKeyBits(keyData192)); AESKey aesKey256(256); CPPUNIT_ASSERT(aesKey256.setKeyBits(keyData256)); ByteString IV(testIV[i]); for (int j = 0; j < 4; j++) { ByteString plainText(testData[j]), shsmPlainText; ByteString cipherText; ByteString shsmCipherText, OB; // Test 128-bit key cipherText = ByteString(testResult[i][j][0]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey128, SymMode::CBC, IV)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey128, SymMode::CBC, IV)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); shsmPlainText += OB; CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); // Test 192-bit key cipherText = ByteString(testResult[i][j][1]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey192, SymMode::CBC, IV)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey192, SymMode::CBC, IV)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); shsmPlainText += OB; CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); // Test 256-bit key cipherText = ByteString(testResult[i][j][2]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey256, SymMode::CBC, IV)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey256, SymMode::CBC, IV)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); shsmPlainText += OB; CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); } } } void AESTests::testECB() { char testKeys128[][33] = { "00000000000000000000000000000000", "0102030405060708090A0B0C0D0E0F10", "404142434445464748494A4B4C4D4E4F", "89436760984679018453504364534464", "49587346983643545706904580436731" }; char testKeys192[][49] = { "000000000000000000000000000000000000000000000000", "0102030405060708090A0B0C0D0E0F101213141516171819", "404142434445464748494A4B4C4D4E4F5051525354555657", "096874395874290867409857496743857632098479834634", "439867439058743095864395348375043296845094854983" }; char testKeys256[][65] = { "0000000000000000000000000000000000000000000000000000000000000000", "0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20", "404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F", "4394398576098257436095746985679043867498572406874967416846341641", "4369006859867098670492857409386741095643756930847023587048579014" }; char testData[][256] = { "4938673409687134684698438657403986439058740935874395813968496846", "549813644389670948567490687546098245665626527788", "64398769586792586795867965624526", "468376458463264536" }; char testResult[5][4][3][256] = { { { "6CAEC72F5E101C66550215ACAB6B874CD26479922B98D9839D7DA729B557ABA00143DB63EE66B0CDFF9F69917680151E", "E20E3123AC64FCA5536E0A2DC48DBEBC0E4E53BDA45FFC97C677951A891A6B7502BB292527E726FD51EB29894D6F0AAD", "C7910B1634DB493998608875A4652B205750B3B761DA7718E120C23A575F7D821F788FE6D86C317549697FBF0C07FA43" }, { "8F48A65BF638FEDB7E6F59BAC8C110FE0E5E6370CBEFACFA0D7A5744030A481B", "125E1D93DC2C43A6FAFC508DB6F9A4A933738D14C219340D5F4D7203DEDCA7E1", "FACB8DEF1B476400DE9796D5058E90863A9A8C8BB2420B9A85BA3E8F87BB48F2" }, { "C810E96482F109C9A05D2B1BEBAC79660143DB63EE66B0CDFF9F69917680151E", "2385391BB8F2DD97280B1FAEFACB6B5C02BB292527E726FD51EB29894D6F0AAD", "47549520EADA1A5D931EACCC922F88BA1F788FE6D86C317549697FBF0C07FA43" }, { "A7D9EAE80224624188CAA7012140E946", "6ECD5C71ECA4AB9C3B71E91721CA2043", "2F77AA438E9259F268985668B00650E5" } }, { { "8947CE273536C8A4D1E878F38371B9A8D2B3B45496779386CBA32CA70001D6AA6CC00A66D2AD83FFD76E9A2BCAD89A01", "B151340CFECADA3AE176637D0A78686E2063E1A602C85D03AE648BDF4FA57C36F7F1878D088644BD5FB43D3C0FE1C30C", "C19AE024C8F6B8E3383F675DF463512E273AAD7D0B88F22D5225EF09D2E37118D45D7C5AA26BCA9D6B1D5DDBF68F9EF6" }, { "16C30BBAE7CDB2EE1E02275B79A064F6EE69FB37C8E039400435782F550CF86A", "F6C869D28D2D167C50BEE8F605D33021CB9173567B8B4AB3EEC68F0298324B78", "07DB563F7E31F1E670A02F97E8D120C7EE3FCEBBF2FDC2D37FC17D93ED1A778B" }, { "52902B599686234833C4D420A9BF17FF6CC00A66D2AD83FFD76E9A2BCAD89A01", "B17FA9EA89D5578A844B3D82891330B1F7F1878D088644BD5FB43D3C0FE1C30C", "74BC55BE85291E0D1FA4A4444051CF65D45D7C5AA26BCA9D6B1D5DDBF68F9EF6" }, { "3F00CAAC6FA432A7C1826CA4DA7C55D6", "9C2DBF449FF2C4AC1CFD7C43D200D33A", "E2183AB600A986806D86ADA4EE38E562" } }, { { "23741EF993CBA04E5C67B42A16CA4D100BA6DF745E6D90818500DEC1CFC9811DBD3ACBFC853ED5DE825266C3B1883EC4", "F14D0EB7DFDB9B8960B0E47D7F4828E8756C38BA83655AAC466986ECB229A66FA390265A4BF5F50A8DFFAD253701E418", "0AAE579A796C94AF4FFB9D7C71381CB5E68E15465F30D7085A72D0CCEC7030BBC9CB7B3859E1A550BCBF11B624022C56" }, { "AFCD6801459845C88548CC337BDD4D8B87E81D9D6AC945E14E3C4E0AC976A4B9", "117129A4775FC84E703F2F2C54B1B55DC4A79241F6CB0A37A8D551D71983D944", "1128250DA7C9A1BBE6A61AC01F28D4D9E3027C3625BD5514AE5DFE4B9132DAFA" }, { "B275BDAF14AE286643C533258343F822BD3ACBFC853ED5DE825266C3B1883EC4", "93ACFCCFE2C4736B6492A673A59DACE2A390265A4BF5F50A8DFFAD253701E418", "2C2165E6491662A855FD7A20CDFF23BDC9CB7B3859E1A550BCBF11B624022C56" }, { "30BBF52D760BAEA653FD03E5E84E583A", "F5F55DF3FC4D9CF2A2829BACA774A51A", "7EE196D148C11FA4998A90C6C7932395" } }, { { "44C2B3344B002BB7A6994E1C74CC7BA70CE55BF44FD96506B553F0EFD3FE02B28329D59D480B0C1714A0DC60EB9FA8CE", "568C7627FD2519BE6031F052DE8F680860F7680460E92A524EA912174BE17B1337D593DEF15FB5BA64F03D1AAE276775", "99E36C0097BCFE41945C064EFA476FF4AA6048F909BEDE32A649F1035A2FB83CD601D09C3FDB36BC61B8CDE5BDD73804" }, { "D748E8E93D29775BD8831E3BC1E1ABF75F484C7CC693521A66A5AB1637822E40", "010103778E123E5140F8D0356DA831E1587DB7E416AE9FAD14C6E2F78DC83148", "A8B8926E8FB762A1AB8CD9FA08507D77872C8EAAAFF3527572F49497B8B366C9" }, { "CFF3212C7E94C2DD65EC1CDC998D6C4B8329D59D480B0C1714A0DC60EB9FA8CE", "324D16FEEC9DCA75A80F4B80175F8A7537D593DEF15FB5BA64F03D1AAE276775", "850567F4F0200CFBF88F1A6D35CAF6D9D601D09C3FDB36BC61B8CDE5BDD73804" }, { "417F142D7609AE701B3D263FFECE4502", "E0DC994D8DC01C4EB2ECD19AD120C3D1", "FB26CC4E48B40EAB755FF65164EFB406" } }, { { "048AEE75741BC60D01B512A53FEE97238F294743E7A351FAF589DD9E040BB8AF0F59D8F60E9C700F10025B5E69828819", "67FB10E52640B1E060F3D7868524721AC375DC76628B0D79C5F40ADC653FC001B50C33356548289D3E70EB7FBC0E2B56", "31953FF249D7519D3C39FB21D70A41033286A320193CC938C5ACBBCA2B25340829799212E3CABACE0BFD4424427705AB" }, { "8D8D50FA4619F0E1B821DCA4ACBDFD46AE92D76A0B95A0331D61C4A7032D9705", "10685E8F632AC41D92E3A0403BB20C79868BD6F94691226EC54D7220C45E7233", "C5FF99FD1BC2BFDBEA62894B279DE6CBF51CCD00362A557DB9D9102DAF623A50" }, { "0330B8FF58E4E6E956B4F81F7A4770200F59D8F60E9C700F10025B5E69828819", "C79BABE5B34B305B05E38013DC5568F7B50C33356548289D3E70EB7FBC0E2B56", "98BEE460FF803288C898A900DD08CE2529799212E3CABACE0BFD4424427705AB" }, { "9A4FD3A26DD0D3A12F224E5E7A06EB76", "B86FE6F088C3A6497F21BCB29DB703D1", "313CC604B301DACA48CDB6F405AA7938" } } }; char testIV[][33] = { "00000000000000000000000000000000", "0102030405060708090A0B0C0D0E0F10", "404142434445464748494A4B4C4D4E4F", "69836472094875029486750948672066", "48670943876904867104398574908554" }; for (int i = 0; i < 5; i++) { ByteString keyData128(testKeys128[i]); ByteString keyData192(testKeys192[i]); ByteString keyData256(testKeys256[i]); AESKey aesKey128(128); CPPUNIT_ASSERT(aesKey128.setKeyBits(keyData128)); AESKey aesKey192(192); CPPUNIT_ASSERT(aesKey192.setKeyBits(keyData192)); AESKey aesKey256(256); CPPUNIT_ASSERT(aesKey256.setKeyBits(keyData256)); ByteString IV(testIV[i]); for (int j = 0; j < 4; j++) { ByteString plainText(testData[j]), shsmPlainText; ByteString cipherText; ByteString shsmCipherText, OB; // Test 128-bit key // Get the reference for the encrypted data cipherText = ByteString(testResult[i][j][0]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey128, SymMode::ECB, IV)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey128, SymMode::ECB, IV)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); shsmPlainText += OB; CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); // Test 192-bit key cipherText = ByteString(testResult[i][j][1]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey192, SymMode::ECB, IV)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey192, SymMode::ECB, IV)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); shsmPlainText += OB; CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); // Test 256-bit key cipherText = ByteString(testResult[i][j][2]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey256, SymMode::ECB, IV)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey256, SymMode::ECB, IV)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); shsmPlainText += OB; CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); } } } void AESTests::testCTR() { // Test vectors from RFC3686 char testKeys128[][33] = { "AE6852F8121067CC4BF7A5765577F39E", "7E24067817FAE0D743D6CE1F32539163", "7691BE035E5020A8AC6E618529F9A0DC" }; char testKeys192[][49] = { "16AF5B145FC9F579C175F93E3BFB0EED863D06CCFDB78515", "7C5CB2401B3DC33C19E7340819E0F69C678C3DB8E6F6A91A", "02BF391EE8ECB159B959617B0965279BF59B60A786D3E0FE" }; char testKeys256[][65] = { "776BEFF2851DB06F4C8A0542C8696F6C6A81AF1EEC96B4D37FC1D689E6C1C104", "F6D66D6BD52D59BB0796365879EFF886C66DD51A5B6A99744B50590C87A23884", "FF7A617CE69148E4F1726E2F43581DE2AA62D9F805532EDFF1EED687FB54153D" }; char testData[][256] = { "53696E676C6520626C6F636B206D7367", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223" }; char testResult[3][3][256] = { { "E4095D4FB7A7B3792D6175A3261311B8", "4B55384FE259C9C84E7935A003CBE928", "145AD01DBF824EC7560863DC71E3E0C0" }, { "5104A106168A72D9790D41EE8EDAD388EB2E1EFC46DA57C8FCE630DF9141BE28", "453243FC609B23327EDFAAFA7131CD9F8490701C5AD4A79CFC1FE0FF42F4FB00", "F05E231B3894612C49EE000B804EB2A9B8306B508F839D6A5530831D9344AF1C" }, { "C1CF48A89F2FFDD9CF4652E9EFDB72D74540A42BDE6D7836D59A5CEAAEF3105325B2072F", "96893FC55E5C722F540B7DD1DDF7E758D288BC95C69165884536C811662F2188ABEE0935", "EB6C52821D0BBBF7CE7594462ACA4FAAB407DF866569FD07F48CC0B583D6071F1EC0E6B8" } }; char testCB[3][3][33] = { { "00000030000000000000000000000001", "0000004836733C147D6D93CB00000001", "00000060DB5672C97AA8F0B200000001" }, { "006CB6DBC0543B59DA48D90B00000001", "0096B03B020C6EADC2CB500D00000001", "00FAAC24C1585EF15A43D87500000001" }, { "00E0017B27777F3F4A1786F000000001", "0007BDFD5CBD60278DCC091200000001", "001CC5B751A51D70A1C1114800000001" } }; for (int i = 0; i < 3; i++) { ByteString keyData128(testKeys128[i]); ByteString keyData192(testKeys192[i]); ByteString keyData256(testKeys256[i]); AESKey aesKey128(128); CPPUNIT_ASSERT(aesKey128.setKeyBits(keyData128)); AESKey aesKey192(192); CPPUNIT_ASSERT(aesKey192.setKeyBits(keyData192)); AESKey aesKey256(256); CPPUNIT_ASSERT(aesKey256.setKeyBits(keyData256)); ByteString plainText(testData[i]), shsmPlainText; ByteString CB; ByteString cipherText; ByteString shsmCipherText, OB; // Test 128-bit key CB = ByteString(testCB[i][0]); cipherText = ByteString(testResult[i][0]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey128, SymMode::CTR, CB)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey128, SymMode::CTR, CB)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); shsmPlainText += OB; CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); // Test 192-bit key CB = ByteString(testCB[i][1]); cipherText = ByteString(testResult[i][1]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey192, SymMode::CTR, CB)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey192, SymMode::CTR, CB)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); shsmPlainText += OB; CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); // Test 256-bit key CB = ByteString(testCB[i][2]); cipherText = ByteString(testResult[i][2]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey256, SymMode::CTR, CB)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey256, SymMode::CTR, CB)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); shsmPlainText += OB; CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); } } #ifdef WITH_AES_GCM void AESTests::testGCM() { // Test vectors from NIST via Botan char test128[8][6][256] = { { "00000000000000000000000000000000", "000000000000000000000000", "", "", "10", "58E2FCCEFA7E3061367F1D57A4E7455A" }, { "00000000000000000000000000000000", "000000000000000000000000", "00000000000000000000000000000000", "", "10", "0388DACE60B6A392F328C2B971B2FE78AB6E47D42CEC13BDF53A67B21257BDDF" }, { "FEFFE9928665731C6D6A8F9467308308", "CAFEBABEFACEDBADDECAF888", "D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B391AAFD255", "", "10", "42831EC2217774244B7221B784D0D49CE3AA212F2C02A4E035C17E2329ACA12E21D514B25466931C7D8F6A5AAC84AA051BA30B396A0AAC973D58E091473F59854D5C2AF327CD64A62CF35ABD2BA6FAB4" }, { "FEFFE9928665731C6D6A8F9467308308", "CAFEBABEFACEDBADDECAF888", "D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39", "FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2", "10", "42831EC2217774244B7221B784D0D49CE3AA212F2C02A4E035C17E2329ACA12E21D514B25466931C7D8F6A5AAC84AA051BA30B396A0AAC973D58E0915BC94FBC3221A5DB94FAE95AE7121A47" }, { "FEFFE9928665731C6D6A8F9467308308", "CAFEBABEFACEDBAD", "D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39", "FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2", "10", "61353B4C2806934A777FF51FA22A4755699B2A714FCDC6F83766E5F97B6C742373806900E49F24B22B097544D4896B424989B5E1EBAC0F07C23F45983612D2E79E3B0785561BE14AACA2FCCB" }, { "FEFFE9928665731C6D6A8F9467308308", "9313225DF88406E555909C5AFF5269AA6A7A9538534F7DA1E4C303D2A318A728C3C0C95156809539FCF0E2429A6B525416AEDBF5A0DE6A57A637B39B", "D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39", "FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2", "10", "8CE24998625615B603A033ACA13FB894BE9112A5C3A211A8BA262A3CCA7E2CA701E4A9A4FBA43C90CCDCB281D48C7C6FD62875D2ACA417034C34AEE5619CC5AEFFFE0BFA462AF43C1699D050" }, { "FEFFE9928665731C6D6A8F9467308308", "CAFEBABEFACEDBAD", "D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39", "FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2", "C", "61353B4C2806934A777FF51FA22A4755699B2A714FCDC6F83766E5F97B6C742373806900E49F24B22B097544D4896B424989B5E1EBAC0F07C23F45983612D2E79E3B0785561BE14A" }, { "FEFFE9928665731C6D6A8F9467308308", "9313225DF88406E555909C5AFF5269AA6A7A9538534F7DA1E4C303D2A318A728C3C0C95156809539FCF0E2429A6B525416AEDBF5A0DE6A57A637B39B", "D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39", "FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2", "C", "8CE24998625615B603A033ACA13FB894BE9112A5C3A211A8BA262A3CCA7E2CA701E4A9A4FBA43C90CCDCB281D48C7C6FD62875D2ACA417034C34AEE5619CC5AEFFFE0BFA462AF43C" } }; char test192[8][6][256] = { { "000000000000000000000000000000000000000000000000", "000000000000000000000000", "", "", "10", "cd33b28ac773f74ba00ed1f312572435" }, { "000000000000000000000000000000000000000000000000", "000000000000000000000000", "00000000000000000000000000000000", "", "10", "98e7247c07f0fe411c267e4384b0f6002ff58d80033927ab8ef4d4587514f0fb" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c", "cafebabefacedbaddecaf888", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255", "", "10", "3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade2569924a7c8587336bfb118024db8674a14" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c", "cafebabefacedbaddecaf888", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", "feedfacedeadbeeffeedfacedeadbeefabaddad2", "10", "3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda27102519498e80f1478f37ba55bd6d27618c" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c", "cafebabefacedbad", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", "feedfacedeadbeeffeedfacedeadbeefabaddad2", "10", "0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f765dcc57fcf623a24094fcca40d3533f8" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c", "9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", "feedfacedeadbeeffeedfacedeadbeefabaddad2", "10", "d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373bdcf566ff291c25bbb8568fc3d376a6d9" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c", "cafebabefacedbaddecaf888", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", "feedfacedeadbeeffeedfacedeadbeefabaddad2", "C", "3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda27102519498e80f1478f37ba55bd" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c", "cafebabefacedbad", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", "feedfacedeadbeeffeedfacedeadbeefabaddad2", "C", "0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f765dcc57fcf623a24094fcca4" } }; char test256[8][6][256] = { { "0000000000000000000000000000000000000000000000000000000000000000", "000000000000000000000000", "", "", "10", "530f8afbc74536b9a963b4f1c4cb738b" }, { "0000000000000000000000000000000000000000000000000000000000000000", "000000000000000000000000", "00000000000000000000000000000000", "", "10", "cea7403d4d606b6e074ec5d3baf39d18d0d1c8a799996bf0265b98b5d48ab919" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308", "cafebabefacedbaddecaf888", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255", "", "10", "522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015adb094dac5d93471bdec1a502270e3cc6c" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308", "cafebabefacedbaddecaf888", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", "feedfacedeadbeeffeedfacedeadbeefabaddad2", "10", "522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f66276fc6ece0f4e1768cddf8853bb2d551b" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308", "cafebabefacedbad", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", "feedfacedeadbeeffeedfacedeadbeefabaddad2", "10", "c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f3a337dbf46a792c45e454913fe2ea8f2", }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308", "9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", "feedfacedeadbeeffeedfacedeadbeefabaddad2", "10", "5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3fa44a8266ee1c8eb0c8b5d4cf5ae9f19a" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308", "cafebabefacedbaddecaf888", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", "feedfacedeadbeeffeedfacedeadbeefabaddad2", "C", "522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f66276fc6ece0f4e1768cddf8853" }, { "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308", "cafebabefacedbad", "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39", "feedfacedeadbeeffeedfacedeadbeefabaddad2", "C", "c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f3a337dbf46a792c45e454913" } }; for (int i = 0; i < 8; i++) { ByteString keyData128(test128[i][0]); ByteString keyData192(test192[i][0]); ByteString keyData256(test256[i][0]); AESKey aesKey128(128); CPPUNIT_ASSERT(aesKey128.setKeyBits(keyData128)); AESKey aesKey192(192); CPPUNIT_ASSERT(aesKey192.setKeyBits(keyData192)); AESKey aesKey256(256); CPPUNIT_ASSERT(aesKey256.setKeyBits(keyData256)); ByteString IV; ByteString plainText; ByteString AAD; size_t tagBits; ByteString cipherText; ByteString shsmPlainText; ByteString shsmCipherText; ByteString OB; // Test 128-bit key IV = ByteString(test128[i][1]); plainText = ByteString(test128[i][2]); AAD = ByteString(test128[i][3]); tagBits = ByteString(test128[i][4]).long_val(); cipherText = ByteString(test128[i][5]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey128, SymMode::GCM, IV, true, 0, AAD, tagBits)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey128, SymMode::GCM, IV, true, 0, AAD, tagBits)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); CPPUNIT_ASSERT(OB.size() == 0); CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); // Test 192-bit key IV = ByteString(test192[i][1]); plainText = ByteString(test192[i][2]); AAD = ByteString(test192[i][3]); tagBits = ByteString(test192[i][4]).long_val(); cipherText = ByteString(test192[i][5]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey192, SymMode::GCM, IV, true, 0, AAD, tagBits)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey192, SymMode::GCM, IV, true, 0, AAD, tagBits)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); CPPUNIT_ASSERT(OB.size() == 0); CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); // Test 256-bit key IV = ByteString(test256[i][1]); plainText = ByteString(test256[i][2]); AAD = ByteString(test256[i][3]); tagBits = ByteString(test256[i][4]).long_val(); cipherText = ByteString(test256[i][5]); // Now, do the same thing using our AES implementation shsmCipherText.wipe(); CPPUNIT_ASSERT(aes->encryptInit(&aesKey256, SymMode::GCM, IV, true, 0, AAD, tagBits)); CPPUNIT_ASSERT(aes->encryptUpdate(plainText, OB)); shsmCipherText += OB; CPPUNIT_ASSERT(aes->encryptFinal(OB)); shsmCipherText += OB; CPPUNIT_ASSERT(shsmCipherText == cipherText); // Check that we can get the plain text shsmPlainText.wipe(); CPPUNIT_ASSERT(aes->decryptInit(&aesKey256, SymMode::GCM, IV, true, 0, AAD, tagBits)); CPPUNIT_ASSERT(aes->decryptUpdate(shsmCipherText, OB)); CPPUNIT_ASSERT(OB.size() == 0); CPPUNIT_ASSERT(aes->decryptFinal(OB)); shsmPlainText += OB; CPPUNIT_ASSERT(shsmPlainText == plainText); } } #endif void AESTests::testWrap(const char testKeK[][128], const char testKey[][128], const char testCt[][128], const int testCnt, SymWrap::Type mode) { for (int i = 0; i < testCnt; i++) { ByteString kekData(testKeK[i]); ByteString keyData(testKey[i]); AESKey aesKeK(kekData.size() * 8); CPPUNIT_ASSERT(aesKeK.setKeyBits(kekData)); ByteString wrapped; ByteString expectedCt(testCt[i]); CPPUNIT_ASSERT(aes->wrapKey(&aesKeK, mode, keyData, wrapped)); CPPUNIT_ASSERT(wrapped.size() == expectedCt.size()); CPPUNIT_ASSERT(wrapped == expectedCt); ByteString unwrapped; CPPUNIT_ASSERT(aes->unwrapKey(&aesKeK, mode, wrapped, unwrapped)); CPPUNIT_ASSERT(unwrapped.size() == keyData.size()); CPPUNIT_ASSERT(unwrapped == keyData); /* #ifdef HAVE_AES_KEY_WRAP_PAD keyData.resize(20); ByteString padwrapped; CPPUNIT_ASSERT(aes->wrapKey(&aesKeK, SymWrap::AES_KEYWRAP_PAD, keyData, padwrapped)); CPPUNIT_ASSERT(padwrapped.size() == 32); ByteString padunwrapped; CPPUNIT_ASSERT(aes->unwrapKey(&aesKeK, SymWrap::AES_KEYWRAP_PAD, padwrapped, padunwrapped)); CPPUNIT_ASSERT(padunwrapped == keyData); #endif */ } } // RFC 3394 tests void AESTests::testWrapWoPad() { char testKeK[][128] = { "000102030405060708090A0B0C0D0E0F", // section 4.1 "000102030405060708090A0B0C0D0E0F1011121314151617", // section 4.2 "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", // section 4.3 "000102030405060708090A0B0C0D0E0F1011121314151617", // section 4.4 "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", // section 4.5 "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", // section 4.6 }; char testKey[][128] = { "00112233445566778899AABBCCDDEEFF", "00112233445566778899AABBCCDDEEFF", "00112233445566778899AABBCCDDEEFF", "00112233445566778899AABBCCDDEEFF0001020304050607", "00112233445566778899AABBCCDDEEFF0001020304050607", "00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F" }; char testCt[][128] = { "1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5", "96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D", "64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7", "031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2", "A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1", "28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21" }; testWrap(testKeK, testKey, testCt, sizeof(testKeK) / 128, SymWrap::AES_KEYWRAP); } // RFC 5649 tests void AESTests::testWrapPad() { char testKeK[][128] = { "5840DF6E29B02AF1AB493B705BF16EA1AE8338F4DCC176A8", // section 6 example 1 "5840DF6E29B02AF1AB493B705BF16EA1AE8338F4DCC176A8", // section 6 example 2 }; char testKey[][128] = { "C37B7E6492584340BED12207808941155068F738", "466F7250617369" }; char testCt[][128] = { "138BDEAA9B8FA7FC61F97742E72248EE5AE6AE5360D1AE6A5F54F373FA543B6A", "AFBEB0F07DFBF5419200F2CCB50BB24F" }; testWrap(testKeK, testKey, testCt, sizeof(testKeK) / 128, SymWrap::AES_KEYWRAP_PAD); }