1 // 2 // RC2 CFB Unit Tests 3 // 4 // Author: 5 // Sebastien Pouliot <sebastien@xamarin.com> 6 // 7 // Copyright (C) 2013 Xamarin Inc (http://www.xamarin.com) 8 // 9 // Permission is hereby granted, free of charge, to any person obtaining 10 // a copy of this software and associated documentation files (the 11 // "Software"), to deal in the Software without restriction, including 12 // without limitation the rights to use, copy, modify, merge, publish, 13 // distribute, sublicense, and/or sell copies of the Software, and to 14 // permit persons to whom the Software is furnished to do so, subject to 15 // the following conditions: 16 // 17 // The above copyright notice and this permission notice shall be 18 // included in all copies or substantial portions of the Software. 19 // 20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 // 28 29 using System; 30 using System.Collections.Generic; 31 using System.Security.Cryptography; 32 33 using NUnit.Framework; 34 35 namespace MonoTests.System.Security.Cryptography { 36 37 [TestFixture] 38 public class Rc2CfbTests : LimitedCfbTests { 39 GetInstance()40 protected override SymmetricAlgorithm GetInstance () 41 { 42 return RC2.Create (); 43 } 44 45 [Test] Roundtrip()46 public void Roundtrip () 47 { 48 ProcessBlockSizes (GetInstance ()); 49 } 50 51 static Dictionary<int, string> test_vectors = new Dictionary<int, string> () { 52 // padding None : Length of the data to encrypt is invalid. 53 // block size: 64, key size: 40, padding: PKCS7, feedback: 8 54 { 1076363784, "3F-B2-FC-4A-44-A6-47-31" }, 55 // block size: 64, key size: 40, padding: Zeros, feedback: 8 56 { 1076364040, "3F-B5-03-E3-28-89-FD-01" }, 57 // block size: 64, key size: 40, padding: ANSIX923, feedback: 8 58 { 1076364296, "3F-B5-03-E3-28-89-FD-06" }, 59 // block size: 64, key size: 40, padding: ISO10126, feedback: 8 60 { 1076364552, "3F-1D-16-2D-49-17-90-3D" }, 61 // padding None : Length of the data to encrypt is invalid. 62 // block size: 64, key size: 48, padding: PKCS7, feedback: 8 63 { 1076888072, "2D-78-28-8C-D0-94-A1-3A" }, 64 // block size: 64, key size: 48, padding: Zeros, feedback: 8 65 { 1076888328, "2D-7F-12-B8-25-CD-45-9B" }, 66 // block size: 64, key size: 48, padding: ANSIX923, feedback: 8 67 { 1076888584, "2D-7F-12-B8-25-CD-45-9C" }, 68 // block size: 64, key size: 48, padding: ISO10126, feedback: 8 69 { 1076888840, "2D-21-AA-BF-FC-09-24-11" }, 70 // padding None : Length of the data to encrypt is invalid. 71 // block size: 64, key size: 56, padding: PKCS7, feedback: 8 72 { 1077412360, "CB-48-99-CB-FF-73-EB-24" }, 73 // block size: 64, key size: 56, padding: Zeros, feedback: 8 74 { 1077412616, "CB-4F-5B-19-90-24-2F-E4" }, 75 // block size: 64, key size: 56, padding: ANSIX923, feedback: 8 76 { 1077412872, "CB-4F-5B-19-90-24-2F-E3" }, 77 // block size: 64, key size: 56, padding: ISO10126, feedback: 8 78 { 1077413128, "CB-02-DF-DB-D7-31-01-25" }, 79 // padding None : Length of the data to encrypt is invalid. 80 // block size: 64, key size: 64, padding: PKCS7, feedback: 8 81 { 1077936648, "14-42-51-73-8F-E0-F6-6D" }, 82 // block size: 64, key size: 64, padding: Zeros, feedback: 8 83 { 1077936904, "14-45-77-33-55-01-58-25" }, 84 // block size: 64, key size: 64, padding: ANSIX923, feedback: 8 85 { 1077937160, "14-45-77-33-55-01-58-22" }, 86 // block size: 64, key size: 64, padding: ISO10126, feedback: 8 87 { 1077937416, "14-FB-AE-82-D0-19-6F-1D" }, 88 // padding None : Length of the data to encrypt is invalid. 89 // block size: 64, key size: 72, padding: PKCS7, feedback: 8 90 { 1078460936, "7E-BC-54-EF-A3-24-49-16" }, 91 // block size: 64, key size: 72, padding: Zeros, feedback: 8 92 { 1078461192, "7E-BB-E3-35-54-06-5B-E4" }, 93 // block size: 64, key size: 72, padding: ANSIX923, feedback: 8 94 { 1078461448, "7E-BB-E3-35-54-06-5B-E3" }, 95 // block size: 64, key size: 72, padding: ISO10126, feedback: 8 96 { 1078461704, "7E-1D-43-1C-9A-92-07-BD" }, 97 // padding None : Length of the data to encrypt is invalid. 98 // block size: 64, key size: 80, padding: PKCS7, feedback: 8 99 { 1078985224, "D5-15-A2-A6-64-90-AA-E0" }, 100 // block size: 64, key size: 80, padding: Zeros, feedback: 8 101 { 1078985480, "D5-12-CA-68-08-80-BF-9A" }, 102 // block size: 64, key size: 80, padding: ANSIX923, feedback: 8 103 { 1078985736, "D5-12-CA-68-08-80-BF-9D" }, 104 // block size: 64, key size: 80, padding: ISO10126, feedback: 8 105 { 1078985992, "D5-3F-2F-2D-4E-5F-74-D4" }, 106 // padding None : Length of the data to encrypt is invalid. 107 // block size: 64, key size: 88, padding: PKCS7, feedback: 8 108 { 1079509512, "65-D3-D6-A7-50-E1-08-40" }, 109 // block size: 64, key size: 88, padding: Zeros, feedback: 8 110 { 1079509768, "65-D4-55-EF-48-D3-F9-D1" }, 111 // block size: 64, key size: 88, padding: ANSIX923, feedback: 8 112 { 1079510024, "65-D4-55-EF-48-D3-F9-D6" }, 113 // block size: 64, key size: 88, padding: ISO10126, feedback: 8 114 { 1079510280, "65-E0-13-D5-55-8A-47-F8" }, 115 // padding None : Length of the data to encrypt is invalid. 116 // block size: 64, key size: 96, padding: PKCS7, feedback: 8 117 { 1080033800, "9F-45-33-EB-04-82-11-32" }, 118 // block size: 64, key size: 96, padding: Zeros, feedback: 8 119 { 1080034056, "9F-42-40-E4-97-D4-86-EA" }, 120 // block size: 64, key size: 96, padding: ANSIX923, feedback: 8 121 { 1080034312, "9F-42-40-E4-97-D4-86-ED" }, 122 // block size: 64, key size: 96, padding: ISO10126, feedback: 8 123 { 1080034568, "9F-1A-3A-46-7C-73-7D-58" }, 124 // padding None : Length of the data to encrypt is invalid. 125 // block size: 64, key size: 104, padding: PKCS7, feedback: 8 126 { 1080558088, "57-FC-F7-61-8A-3C-BC-9F" }, 127 // block size: 64, key size: 104, padding: Zeros, feedback: 8 128 { 1080558344, "57-FB-71-C9-C6-5C-08-D1" }, 129 // block size: 64, key size: 104, padding: ANSIX923, feedback: 8 130 { 1080558600, "57-FB-71-C9-C6-5C-08-D6" }, 131 // block size: 64, key size: 104, padding: ISO10126, feedback: 8 132 { 1080558856, "57-10-94-F8-51-B5-98-5D" }, 133 // padding None : Length of the data to encrypt is invalid. 134 // block size: 64, key size: 112, padding: PKCS7, feedback: 8 135 { 1081082376, "AE-21-D0-F5-89-E3-80-1E" }, 136 // block size: 64, key size: 112, padding: Zeros, feedback: 8 137 { 1081082632, "AE-26-C6-2E-05-FA-AF-68" }, 138 // block size: 64, key size: 112, padding: ANSIX923, feedback: 8 139 { 1081082888, "AE-26-C6-2E-05-FA-AF-6F" }, 140 // block size: 64, key size: 112, padding: ISO10126, feedback: 8 141 { 1081083144, "AE-4D-6F-DE-06-5F-40-71" }, 142 // padding None : Length of the data to encrypt is invalid. 143 // block size: 64, key size: 120, padding: PKCS7, feedback: 8 144 { 1081606664, "22-63-22-B7-1F-5A-75-DB" }, 145 // block size: 64, key size: 120, padding: Zeros, feedback: 8 146 { 1081606920, "22-64-0F-2B-17-29-20-E7" }, 147 // block size: 64, key size: 120, padding: ANSIX923, feedback: 8 148 { 1081607176, "22-64-0F-2B-17-29-20-E0" }, 149 // block size: 64, key size: 120, padding: ISO10126, feedback: 8 150 { 1081607432, "22-C9-FD-42-71-DF-E1-E8" }, 151 // padding None : Length of the data to encrypt is invalid. 152 // block size: 64, key size: 128, padding: PKCS7, feedback: 8 153 { 1082130952, "7E-00-0A-7E-E1-52-24-2F" }, 154 // block size: 64, key size: 128, padding: Zeros, feedback: 8 155 { 1082131208, "7E-07-99-69-E5-4E-3D-7D" }, 156 // block size: 64, key size: 128, padding: ANSIX923, feedback: 8 157 { 1082131464, "7E-07-99-69-E5-4E-3D-7A" }, 158 // block size: 64, key size: 128, padding: ISO10126, feedback: 8 159 { 1082131720, "7E-B2-6D-A9-60-A9-CC-05" }, 160 }; 161 GetExpectedResult(SymmetricAlgorithm algo, byte [] encryptedData)162 protected override string GetExpectedResult (SymmetricAlgorithm algo, byte [] encryptedData) 163 { 164 #if false 165 return base.GetExpectedResult (algo, encryptedData); 166 #else 167 return test_vectors [GetId (algo)]; 168 #endif 169 } 170 } 171 }