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 }