2 // MonoTests.System.Security.SymmetricAlgorithmTransformTest.cs
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // Copyright (C) 2007 Novell, Inc (http://www.novell.com)
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
30 using System.Security.Cryptography;
32 using NUnit.Framework;
34 namespace MonoTests.System.Security.Cryptography {
36 public abstract class SymmetricAlgorithmTransformTest {
38 public abstract SymmetricAlgorithm Algorithm { get; }
40 public virtual int BlockSize {
46 public void DontDecryptLastBlock (CipherMode mode, PaddingMode padding)
48 SymmetricAlgorithm algo = Algorithm;
50 algo.Padding = padding;
51 ICryptoTransform enc = algo.CreateEncryptor ();
52 byte[] plaintext = new byte[BlockSize * 7];
53 byte[] encdata = new byte[BlockSize * 8];
54 int len = enc.TransformBlock (plaintext, 0, plaintext.Length, encdata, 0);
55 Assert.AreEqual (plaintext.Length, len, "encdata");
57 ICryptoTransform dec = algo.CreateDecryptor ();
58 byte[] decdata = new byte[plaintext.Length];
59 len = dec.TransformBlock (encdata, 0, encdata.Length, decdata, 0);
60 Assert.AreEqual (plaintext.Length, len, "decdata");
62 Assert.AreEqual (plaintext, decdata, "TransformBlock." + mode.ToString ());
66 [ExpectedException (typeof (CryptographicException))]
67 public void DontDecryptLastBlock_CBC_None ()
69 DontDecryptLastBlock (CipherMode.CBC, PaddingMode.None);
73 public void DontDecryptLastBlock_CBC_PKCS7 ()
75 DontDecryptLastBlock (CipherMode.CBC, PaddingMode.PKCS7);
79 [ExpectedException (typeof (CryptographicException))]
80 public void DontDecryptLastBlock_CBC_Zeros ()
82 DontDecryptLastBlock (CipherMode.CBC, PaddingMode.Zeros);
85 public void DontDecryptLastBlock_CBC_ANSIX923 ()
87 DontDecryptLastBlock (CipherMode.CBC, PaddingMode.ANSIX923);
91 public void DontDecryptLastBlock_CBC_ISO10126 ()
93 DontDecryptLastBlock (CipherMode.CBC, PaddingMode.ISO10126);
96 [ExpectedException (typeof (CryptographicException))]
97 public void DontDecryptLastBlock_CFB_None ()
99 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.None);
103 public virtual void DontDecryptLastBlock_CFB_PKCS7 ()
105 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.PKCS7);
109 [ExpectedException (typeof (CryptographicException))]
110 public void DontDecryptLastBlock_CFB_Zeros ()
112 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.Zeros);
115 public void DontDecryptLastBlock_CFB_ANSIX923 ()
117 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.ANSIX923);
121 public void DontDecryptLastBlock_CFB_ISO10126 ()
123 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.ISO10126);
126 [ExpectedException (typeof (CryptographicException))]
127 public void DontDecryptLastBlock_ECB_None ()
129 DontDecryptLastBlock (CipherMode.ECB, PaddingMode.None);
133 public void DontDecryptLastBlock_ECB_PKCS7 ()
135 DontDecryptLastBlock (CipherMode.ECB, PaddingMode.PKCS7);
139 [ExpectedException (typeof (CryptographicException))]
140 public void DontDecryptLastBlock_ECB_Zeros ()
142 DontDecryptLastBlock (CipherMode.ECB, PaddingMode.Zeros);
145 public void DontDecryptLastBlock_ECB_ANSIX923 ()
147 DontDecryptLastBlock (CipherMode.ECB, PaddingMode.ANSIX923);
151 public void DontDecryptLastBlock_ECB_ISO10126 ()
153 DontDecryptLastBlock (CipherMode.ECB, PaddingMode.ISO10126);
155 // see bug #80439 (2nd try, reopened)
156 // same as DontDecryptLastBlock except
157 // a. the encryption transform was final (padding was added)
158 // b. we can call/test decryption TransformFinalBlock too
159 public void DontDecryptLastBlock_Final (CipherMode mode, PaddingMode padding)
161 SymmetricAlgorithm algo = Algorithm;
163 algo.Padding = padding;
164 ICryptoTransform enc = algo.CreateEncryptor ();
165 byte[] plaintext = new byte[BlockSize * 7];
166 byte[] encdata = enc.TransformFinalBlock (plaintext, 0, plaintext.Length);
168 case PaddingMode.None:
169 case PaddingMode.Zeros:
170 Assert.AreEqual (BlockSize * 7, encdata.Length, "encdata");
173 Assert.AreEqual (BlockSize * 8, encdata.Length, "encdata");
177 ICryptoTransform dec = algo.CreateDecryptor ();
178 byte[] decdata = new byte[plaintext.Length];
179 dec.TransformBlock (encdata, 0, encdata.Length, decdata, 0);
181 Assert.AreEqual (plaintext, decdata, "TransformBlock." + mode.ToString ());
183 dec = algo.CreateDecryptor ();
184 byte[] final = dec.TransformFinalBlock (encdata, 0, encdata.Length);
185 Assert.AreEqual (plaintext, final, "TransformFinalBlock." + mode.ToString ());
189 public void DontDecryptLastBlock_Final_CBC_None ()
191 DontDecryptLastBlock_Final (CipherMode.CBC, PaddingMode.None);
195 public void DontDecryptLastBlock_Final_CBC_PKCS7 ()
197 DontDecryptLastBlock_Final (CipherMode.CBC, PaddingMode.PKCS7);
201 public void DontDecryptLastBlock_Final_CBC_Zeros ()
203 DontDecryptLastBlock_Final (CipherMode.CBC, PaddingMode.Zeros);
206 public void DontDecryptLastBlock_Final_CBC_ANSIX923 ()
208 DontDecryptLastBlock_Final (CipherMode.CBC, PaddingMode.ANSIX923);
212 public void DontDecryptLastBlock_Final_CBC_ISO10126 ()
214 DontDecryptLastBlock_Final (CipherMode.CBC, PaddingMode.ISO10126);
217 public virtual void DontDecryptLastBlock_Final_CFB_None ()
219 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.None);
223 public virtual void DontDecryptLastBlock_Final_CFB_PKCS7 ()
225 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.PKCS7);
229 public virtual void DontDecryptLastBlock_Final_CFB_Zeros ()
231 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.Zeros);
234 public void DontDecryptLastBlock_Final_CFB_ANSIX923 ()
236 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.ANSIX923);
240 public void DontDecryptLastBlock_Final_CFB_ISO10126 ()
242 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.ISO10126);
245 public void DontDecryptLastBlock_Final_ECB_None ()
247 DontDecryptLastBlock_Final (CipherMode.ECB, PaddingMode.None);
251 public void DontDecryptLastBlock_Final_ECB_PKCS7 ()
253 DontDecryptLastBlock_Final (CipherMode.ECB, PaddingMode.PKCS7);
257 public void DontDecryptLastBlock_Final_ECB_Zeros ()
259 DontDecryptLastBlock_Final (CipherMode.ECB, PaddingMode.Zeros);
262 public void DontDecryptLastBlock_Final_ECB_ANSIX923 ()
264 DontDecryptLastBlock_Final (CipherMode.ECB, PaddingMode.ANSIX923);
268 public void DontDecryptLastBlock_Final_ECB_ISO10126 ()
270 DontDecryptLastBlock_Final (CipherMode.ECB, PaddingMode.ISO10126);
272 // similar to previous case but here we try to skip several blocks
273 // i.e. encdata.Length versus decdata.Length
274 public void DontDecryptMultipleBlock (CipherMode mode, PaddingMode padding)
276 SymmetricAlgorithm algo = Algorithm;
278 algo.Padding = padding;
279 ICryptoTransform enc = algo.CreateEncryptor ();
280 byte[] plaintext = new byte[BlockSize * 7];
281 byte[] encdata = new byte[BlockSize * 8];
282 int len = enc.TransformBlock (plaintext, 0, plaintext.Length, encdata, 0);
283 Assert.AreEqual (plaintext.Length, len, "encdata");
285 ICryptoTransform dec = algo.CreateDecryptor ();
286 byte[] decdata = new byte[BlockSize];
287 dec.TransformBlock (encdata, 0, encdata.Length, decdata, 0);
291 [ExpectedException (typeof (CryptographicException))]
292 public void DontDecryptMultipleBlock_CBC_None ()
294 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.None);
298 [ExpectedException (typeof (CryptographicException))]
299 public virtual void DontDecryptMultipleBlock_CBC_PKCS7 ()
301 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.PKCS7);
305 [ExpectedException (typeof (CryptographicException))]
306 public void DontDecryptMultipleBlock_CBC_Zeros ()
308 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.Zeros);
311 [ExpectedException (typeof (CryptographicException))]
312 public void DontDecryptMultipleBlock_CBC_ANSIX923 ()
314 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.ANSIX923);
318 [ExpectedException (typeof (CryptographicException))]
319 public void DontDecryptMultipleBlock_CBC_ISO10126 ()
321 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.ISO10126);
324 [ExpectedException (typeof (CryptographicException))]
325 public virtual void DontDecryptMultipleBlock_CFB_None ()
327 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.None);
331 [ExpectedException (typeof (CryptographicException))]
332 public virtual void DontDecryptMultipleBlock_CFB_PKCS7 ()
334 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.PKCS7);
338 [ExpectedException (typeof (CryptographicException))]
339 public void DontDecryptMultipleBlock_CFB_Zeros ()
341 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.Zeros);
344 [ExpectedException (typeof (CryptographicException))]
345 public void DontDecryptMultipleBlock_CFB_ANSIX923 ()
347 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.ANSIX923);
351 [ExpectedException (typeof (CryptographicException))]
352 public void DontDecryptMultipleBlock_CFB_ISO10126 ()
354 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.ISO10126);
357 [ExpectedException (typeof (CryptographicException))]
358 public void DontDecryptMultipleBlock_ECB_None ()
360 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.None);
364 [ExpectedException (typeof (CryptographicException))]
365 public virtual void DontDecryptMultipleBlock_ECB_PKCS7 ()
367 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.PKCS7);
371 [ExpectedException (typeof (CryptographicException))]
372 public void DontDecryptMultipleBlock_ECB_Zeros ()
374 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.Zeros);
377 [ExpectedException (typeof (CryptographicException))]
378 public void DontDecryptMultipleBlock_ECB_ANSIX923 ()
380 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.ANSIX923);
384 [ExpectedException (typeof (CryptographicException))]
385 public void DontDecryptMultipleBlock_ECB_ISO10126 ()
387 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.ISO10126);
389 // similar to previous case but here the encryption transform was final
390 public void DontDecryptMultipleBlock_Final (CipherMode mode, PaddingMode padding)
392 SymmetricAlgorithm algo = Algorithm;
394 algo.Padding = padding;
395 ICryptoTransform enc = algo.CreateEncryptor ();
396 byte[] plaintext = new byte[BlockSize * 7];
397 byte[] encdata = enc.TransformFinalBlock (plaintext, 0, plaintext.Length);
399 case PaddingMode.None:
400 case PaddingMode.Zeros:
401 Assert.AreEqual (BlockSize * 7, encdata.Length, "encdata");
404 Assert.AreEqual (BlockSize * 8, encdata.Length, "encdata");
408 ICryptoTransform dec = algo.CreateDecryptor ();
409 byte[] decdata = new byte[BlockSize];
410 dec.TransformBlock (encdata, 0, encdata.Length, decdata, 0);
414 [ExpectedException (typeof (CryptographicException))]
415 public void DontDecryptMultipleBlock_Final_CBC_None ()
417 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.None);
421 [ExpectedException (typeof (CryptographicException))]
422 public virtual void DontDecryptMultipleBlock_Final_CBC_PKCS7 ()
424 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.PKCS7);
428 [ExpectedException (typeof (CryptographicException))]
429 public void DontDecryptMultipleBlock_Final_CBC_Zeros ()
431 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.Zeros);
434 [ExpectedException (typeof (CryptographicException))]
435 public void DontDecryptMultipleBlock_Final_CBC_ANSIX923 ()
437 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.ANSIX923);
441 [ExpectedException (typeof (CryptographicException))]
442 public void DontDecryptMultipleBlock_Final_CBC_ISO10126 ()
444 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.ISO10126);
447 [ExpectedException (typeof (CryptographicException))]
448 public virtual void DontDecryptMultipleBlock_Final_CFB_None ()
450 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.None);
454 [ExpectedException (typeof (CryptographicException))]
455 public virtual void DontDecryptMultipleBlock_Final_CFB_PKCS7 ()
457 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.PKCS7);
461 [ExpectedException (typeof (CryptographicException))]
462 public void DontDecryptMultipleBlock_Final_CFB_Zeros ()
464 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.Zeros);
467 [ExpectedException (typeof (CryptographicException))]
468 public void DontDecryptMultipleBlock_Final_CFB_ANSIX923 ()
470 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.ANSIX923);
474 [ExpectedException (typeof (CryptographicException))]
475 public void DontDecryptMultipleBlock_Final_CFB_ISO10126 ()
477 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.ISO10126);
480 [ExpectedException (typeof (CryptographicException))]
481 public void DontDecryptMultipleBlock_Final_ECB_None ()
483 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.None);
487 [ExpectedException (typeof (CryptographicException))]
488 public virtual void DontDecryptMultipleBlock_Final_ECB_PKCS7 ()
490 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.PKCS7);
494 [ExpectedException (typeof (CryptographicException))]
495 public void DontDecryptMultipleBlock_Final_ECB_Zeros ()
497 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.Zeros);
500 [ExpectedException (typeof (CryptographicException))]
501 public void DontDecryptMultipleBlock_Final_ECB_ANSIX923 ()
503 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.ANSIX923);
507 [ExpectedException (typeof (CryptographicException))]
508 public void DontDecryptMultipleBlock_Final_ECB_ISO10126 ()
510 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.ISO10126);
513 private void TransformBlock_One (ICryptoTransform ct, int expected)
515 byte[] data = new byte[ct.InputBlockSize];
516 Assert.AreEqual (expected, ct.TransformBlock (data, 0, ct.InputBlockSize, data, 0));
519 public void Encryptor_TransformBlock_One (PaddingMode padding, CipherMode mode, int expected)
521 SymmetricAlgorithm sa = Algorithm;
522 sa.Padding = padding;
524 TransformBlock_One (sa.CreateEncryptor (), expected);
528 public void CreateEncryptor_TransformBlock_One_PKCS7_ECB ()
530 Encryptor_TransformBlock_One (PaddingMode.PKCS7, CipherMode.ECB, BlockSize);
534 public void CreateEncryptor_TransformBlock_One_PKCS7_CBC ()
536 Encryptor_TransformBlock_One (PaddingMode.PKCS7, CipherMode.CBC, BlockSize);
540 public virtual void CreateEncryptor_TransformBlock_One_PKCS7_CFB ()
542 Encryptor_TransformBlock_One (PaddingMode.PKCS7, CipherMode.CFB, BlockSize);
546 public void CreateEncryptor_TransformBlock_One_Zeros_ECB ()
548 Encryptor_TransformBlock_One (PaddingMode.Zeros, CipherMode.ECB, BlockSize);
552 public void CreateEncryptor_TransformBlock_One_Zeros_CBC ()
554 Encryptor_TransformBlock_One (PaddingMode.Zeros, CipherMode.CBC, BlockSize);
558 public virtual void CreateEncryptor_TransformBlock_One_Zeros_CFB ()
560 Encryptor_TransformBlock_One (PaddingMode.Zeros, CipherMode.CFB, BlockSize);
564 public void CreateEncryptor_TransformBlock_One_None_ECB ()
566 Encryptor_TransformBlock_One (PaddingMode.None, CipherMode.ECB, BlockSize);
570 public void CreateEncryptor_TransformBlock_One_None_CBC ()
572 Encryptor_TransformBlock_One (PaddingMode.None, CipherMode.CBC, BlockSize);
576 public virtual void CreateEncryptor_TransformBlock_One_None_CFB ()
578 Encryptor_TransformBlock_One (PaddingMode.None, CipherMode.CFB, BlockSize);
582 public void CreateEncryptor_TransformBlock_One_ANSIX923_ECB ()
584 Encryptor_TransformBlock_One (PaddingMode.ANSIX923, CipherMode.ECB, BlockSize);
588 public void CreateEncryptor_TransformBlock_One_ANSIX923_CBC ()
590 Encryptor_TransformBlock_One (PaddingMode.ANSIX923, CipherMode.CBC, BlockSize);
594 public void CreateEncryptor_TransformBlock_One_ANSIX923_CFB ()
596 Encryptor_TransformBlock_One (PaddingMode.ANSIX923, CipherMode.CFB, BlockSize);
600 public void CreateEncryptor_TransformBlock_One_ISO10126_ECB ()
602 Encryptor_TransformBlock_One (PaddingMode.ISO10126, CipherMode.ECB, BlockSize);
606 public void CreateEncryptor_TransformBlock_One_ISO10126_CBC ()
608 Encryptor_TransformBlock_One (PaddingMode.ISO10126, CipherMode.CBC, BlockSize);
612 public void CreateEncryptor_TransformBlock_One_ISO10126_CFB ()
614 Encryptor_TransformBlock_One (PaddingMode.ISO10126, CipherMode.CFB, BlockSize);
617 public void Decryptor_TransformBlock_One (PaddingMode padding, CipherMode mode, int expected)
619 SymmetricAlgorithm sa = Algorithm;
620 sa.Padding = padding;
622 TransformBlock_One (sa.CreateDecryptor (), expected);
626 public void CreateDecryptor_TransformBlock_One_PKCS7_ECB ()
628 Decryptor_TransformBlock_One (PaddingMode.PKCS7, CipherMode.ECB, 0);
632 public void CreateDecryptor_TransformBlock_One_PKCS7_CBC ()
634 Decryptor_TransformBlock_One (PaddingMode.PKCS7, CipherMode.CBC, 0);
638 public virtual void CreateDecryptor_TransformBlock_One_PKCS7_CFB ()
640 Decryptor_TransformBlock_One (PaddingMode.PKCS7, CipherMode.CFB, 0);
644 public void CreateDecryptor_TransformBlock_One_Zeros_ECB ()
646 Decryptor_TransformBlock_One (PaddingMode.Zeros, CipherMode.ECB, BlockSize);
650 public void CreateDecryptor_TransformBlock_One_Zeros_CBC ()
652 Decryptor_TransformBlock_One (PaddingMode.Zeros, CipherMode.CBC, BlockSize);
656 public virtual void CreateDecryptor_TransformBlock_One_Zeros_CFB ()
658 Decryptor_TransformBlock_One (PaddingMode.Zeros, CipherMode.CFB, BlockSize);
662 public void CreateDecryptor_TransformBlock_One_None_ECB ()
664 Decryptor_TransformBlock_One (PaddingMode.None, CipherMode.ECB, BlockSize);
668 public void CreateDecryptor_TransformBlock_One_None_CBC ()
670 Decryptor_TransformBlock_One (PaddingMode.None, CipherMode.CBC, BlockSize);
674 public virtual void CreateDecryptor_TransformBlock_One_None_CFB ()
676 Decryptor_TransformBlock_One (PaddingMode.None, CipherMode.CFB, BlockSize);
679 public void CreateDecryptor_TransformBlock_One_ANSIX923_ECB ()
681 Decryptor_TransformBlock_One (PaddingMode.ANSIX923, CipherMode.ECB, 0);
685 public void CreateDecryptor_TransformBlock_One_ANSIX923_CBC ()
687 Decryptor_TransformBlock_One (PaddingMode.ANSIX923, CipherMode.CBC, 0);
691 public void CreateDecryptor_TransformBlock_One_ANSIX923_CFB ()
693 Decryptor_TransformBlock_One (PaddingMode.ANSIX923, CipherMode.CFB, 0);
697 public void CreateDecryptor_TransformBlock_One_ISO10126_ECB ()
699 Decryptor_TransformBlock_One (PaddingMode.ISO10126, CipherMode.ECB, 0);
703 public void CreateDecryptor_TransformBlock_One_ISO10126_CBC ()
705 Decryptor_TransformBlock_One (PaddingMode.ISO10126, CipherMode.CBC, 0);
709 public void CreateDecryptor_TransformBlock_One_ISO10126_CFB ()
711 Decryptor_TransformBlock_One (PaddingMode.ISO10126, CipherMode.CFB, 0);
716 public class DESTransformTest: SymmetricAlgorithmTransformTest {
718 public override SymmetricAlgorithm Algorithm {
719 get { return DES.Create (); }
722 // from Lauren Bedoule
723 // note: this test case works only for CBC
724 private void EncryptEncryptDecryptDecrypt (CipherMode mode, PaddingMode padding)
726 SymmetricAlgorithm des = Algorithm;
728 des.Padding = padding;
729 des.IV = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
730 des.Key = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
731 byte[] input = new byte[48] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
732 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF,
733 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
734 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
735 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
736 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F};
737 byte[] result1 = new byte[48];
738 byte[] result2 = new byte[48];
740 ICryptoTransform encryptor = des.CreateEncryptor ();
741 int len = encryptor.TransformBlock (input, 0, input.Length, result1, 0);
742 Assert.AreEqual (48, len, "enc1");
743 len = encryptor.TransformBlock (result1, 0, result1.Length, result2, 0);
744 Assert.AreEqual (48, len, "enc2");
746 des.IV = new byte[] { 0x0F, 0x93, 0x8D, 0xED, 0xE3, 0x37, 0xA3, 0x09 };
747 byte[] result3 = new byte[40];
748 ICryptoTransform decryptor = des.CreateDecryptor ();
749 byte[] result4 = new byte[40];
750 len = decryptor.TransformBlock (result2, 0, result2.Length, result3, 0);
751 Assert.AreEqual (40, len, "dec1");
752 for (int i = 0; i < 40; i++) {
753 Assert.AreEqual (result1[i], result3[i], "dec1." + i);
755 len = decryptor.TransformBlock (result3, 0, len, result4, 0);
756 Assert.AreEqual (40, len, "dec2");
757 for (int i = 0; i < 8; i++) {
758 Assert.AreEqual (result1[40 + i], result4[i], "dec2." + i);
760 for (int i = 8; i < 16; i++) {
761 Assert.AreEqual (result2[i - 8 + 40], result4[i], "dec2." + i);
763 for (int i = 16; i < 40; i++) {
764 Assert.AreEqual (input[i - 16 + 8], result4[i], "dec2." + i);
769 [ExpectedException (typeof (CryptographicException))]
770 public void EncryptEncryptDecryptDecrypt_CBC_None ()
772 EncryptEncryptDecryptDecrypt (CipherMode.CBC, PaddingMode.None);
776 public void EncryptEncryptDecryptDecrypt_CBC_PKCS7 ()
778 EncryptEncryptDecryptDecrypt (CipherMode.CBC, PaddingMode.PKCS7);
782 [ExpectedException (typeof (CryptographicException))]
783 public void EncryptEncryptDecryptDecrypt_CBC_Zeros ()
785 EncryptEncryptDecryptDecrypt (CipherMode.CBC, PaddingMode.Zeros);
788 public void EncryptEncryptDecryptDecrypt_CBC_ANSIX923 ()
790 EncryptEncryptDecryptDecrypt (CipherMode.CBC, PaddingMode.ANSIX923);
794 public void EncryptEncryptDecryptDecrypt_CBC_ISO10126 ()
796 EncryptEncryptDecryptDecrypt (CipherMode.CBC, PaddingMode.ISO10126);
801 public class RC2TransformTest: SymmetricAlgorithmTransformTest {
803 public override SymmetricAlgorithm Algorithm {
804 get { return RC2.Create (); }
808 public abstract class RijndaelTransformTest: SymmetricAlgorithmTransformTest {
810 // Rijndael is the only managed crypto transform implementation and, before Fx 2.0,
811 // suffers from different issues than CSP-based CryptoAPITransform. In contrast
812 // Mono has a single (managed) implementation for all crypto transforms.
814 // The first case is that MS reports that OFB (output feedback) mode isn't
815 // supported even if this isn't the requested mode (CFB). We ignore those cases
816 // to (a) don't mess with existing Mono-only code and (b) it's the 2.0 behavior
820 [Category ("NotWorking")]
821 [ExpectedException (typeof (CryptographicException))]
822 public override void DontDecryptLastBlock_CFB_PKCS7 ()
824 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.PKCS7);
828 [Category ("NotWorking")]
829 [ExpectedException (typeof (CryptographicException))]
830 public override void DontDecryptLastBlock_Final_CFB_PKCS7 ()
832 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.PKCS7);
836 [Category ("NotWorking")]
837 [ExpectedException (typeof (CryptographicException))]
838 public override void DontDecryptLastBlock_Final_CFB_None ()
840 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.None);
844 [Category ("NotWorking")]
845 [ExpectedException (typeof (CryptographicException))]
846 public override void DontDecryptLastBlock_Final_CFB_Zeros ()
848 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.Zeros);
852 [Category ("NotWorking")]
853 [ExpectedException (typeof (CryptographicException))]
854 public override void CreateEncryptor_TransformBlock_One_PKCS7_CFB ()
856 Encryptor_TransformBlock_One (PaddingMode.PKCS7, CipherMode.CFB, BlockSize);
860 [Category ("NotWorking")]
861 [ExpectedException (typeof (CryptographicException))]
862 public override void CreateEncryptor_TransformBlock_One_Zeros_CFB ()
864 Encryptor_TransformBlock_One (PaddingMode.Zeros, CipherMode.CFB, BlockSize);
868 [Category ("NotWorking")]
869 [ExpectedException (typeof (CryptographicException))]
870 public override void CreateEncryptor_TransformBlock_One_None_CFB ()
872 Encryptor_TransformBlock_One (PaddingMode.None, CipherMode.CFB, BlockSize);
876 [Category ("NotWorking")]
877 [ExpectedException (typeof (CryptographicException))]
878 public override void CreateDecryptor_TransformBlock_One_PKCS7_CFB ()
880 Decryptor_TransformBlock_One (PaddingMode.PKCS7, CipherMode.CFB, BlockSize);
884 [Category ("NotWorking")]
885 [ExpectedException (typeof (CryptographicException))]
886 public override void CreateDecryptor_TransformBlock_One_Zeros_CFB ()
888 Decryptor_TransformBlock_One (PaddingMode.Zeros, CipherMode.CFB, BlockSize);
892 [Category ("NotWorking")]
893 [ExpectedException (typeof (CryptographicException))]
894 public override void CreateDecryptor_TransformBlock_One_None_CFB ()
896 Decryptor_TransformBlock_One (PaddingMode.None, CipherMode.CFB, BlockSize);
899 // The second case is that the MS managed transform (Rijndael) throws a CryptographicException
900 // (like 2.0) where the unmanaged one (CryptoAPITransform) throws an IndexOutOfRangeException.
901 // Since Mono has a single implementation we're ignoring this "special" case (wrong exception)
902 // in favor of the most "used" one. Note that it doesn't much affect existing code.
905 [Category ("NotWorking")]
906 [ExpectedException (typeof (CryptographicException))]
907 public override void DontDecryptMultipleBlock_CBC_PKCS7 ()
909 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.PKCS7);
913 [Category ("NotWorking")]
914 [ExpectedException (typeof (CryptographicException))]
915 public override void DontDecryptMultipleBlock_CFB_PKCS7 ()
917 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.PKCS7);
921 [Category ("NotWorking")]
922 [ExpectedException (typeof (CryptographicException))]
923 public override void DontDecryptMultipleBlock_ECB_PKCS7 ()
925 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.PKCS7);
929 [Category ("NotWorking")]
930 [ExpectedException (typeof (CryptographicException))]
931 public override void DontDecryptMultipleBlock_Final_CBC_PKCS7 ()
933 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.PKCS7);
937 [Category ("NotWorking")]
938 [ExpectedException (typeof (CryptographicException))]
939 public override void DontDecryptMultipleBlock_Final_CFB_PKCS7 ()
941 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.PKCS7);
945 [Category ("NotWorking")]
946 [ExpectedException (typeof (CryptographicException))]
947 public override void DontDecryptMultipleBlock_Final_ECB_PKCS7 ()
949 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.PKCS7);
955 public class Rijndael128TransformTest: RijndaelTransformTest {
957 public override SymmetricAlgorithm Algorithm {
958 get { return Rijndael.Create (); }
961 public override int BlockSize {
967 public class Rijndael192TransformTest: RijndaelTransformTest {
969 public override SymmetricAlgorithm Algorithm {
971 SymmetricAlgorithm algo = Rijndael.Create ();
972 algo.BlockSize = 192;
973 algo.FeedbackSize = 192;
978 public override int BlockSize {
984 public class Rijndael256TransformTest: RijndaelTransformTest {
986 public override SymmetricAlgorithm Algorithm {
988 SymmetricAlgorithm algo = Rijndael.Create ();
989 algo.BlockSize = 256;
990 algo.FeedbackSize = 256;
995 public override int BlockSize {
1001 public class TripleDESTransformTest: SymmetricAlgorithmTransformTest {
1003 public override SymmetricAlgorithm Algorithm {
1004 get { return TripleDES.Create (); }