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);
86 public void DontDecryptLastBlock_CBC_ANSIX923 ()
88 DontDecryptLastBlock (CipherMode.CBC, PaddingMode.ANSIX923);
92 public void DontDecryptLastBlock_CBC_ISO10126 ()
94 DontDecryptLastBlock (CipherMode.CBC, PaddingMode.ISO10126);
98 [ExpectedException (typeof (CryptographicException))]
99 public void DontDecryptLastBlock_CFB_None ()
101 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.None);
105 public void DontDecryptLastBlock_CFB_PKCS7 ()
107 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.PKCS7);
111 [ExpectedException (typeof (CryptographicException))]
112 public void DontDecryptLastBlock_CFB_Zeros ()
114 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.Zeros);
118 public void DontDecryptLastBlock_CFB_ANSIX923 ()
120 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.ANSIX923);
124 public void DontDecryptLastBlock_CFB_ISO10126 ()
126 DontDecryptLastBlock (CipherMode.CFB, PaddingMode.ISO10126);
130 [ExpectedException (typeof (CryptographicException))]
131 public void DontDecryptLastBlock_ECB_None ()
133 DontDecryptLastBlock (CipherMode.ECB, PaddingMode.None);
137 public void DontDecryptLastBlock_ECB_PKCS7 ()
139 DontDecryptLastBlock (CipherMode.ECB, PaddingMode.PKCS7);
143 [ExpectedException (typeof (CryptographicException))]
144 public void DontDecryptLastBlock_ECB_Zeros ()
146 DontDecryptLastBlock (CipherMode.ECB, PaddingMode.Zeros);
150 public void DontDecryptLastBlock_ECB_ANSIX923 ()
152 DontDecryptLastBlock (CipherMode.ECB, PaddingMode.ANSIX923);
156 public void DontDecryptLastBlock_ECB_ISO10126 ()
158 DontDecryptLastBlock (CipherMode.ECB, PaddingMode.ISO10126);
161 // see bug #80439 (2nd try, reopened)
162 // same as DontDecryptLastBlock except
163 // a. the encryption transform was final (padding was added)
164 // b. we can call/test decryption TransformFinalBlock too
165 public void DontDecryptLastBlock_Final (CipherMode mode, PaddingMode padding)
167 SymmetricAlgorithm algo = Algorithm;
169 algo.Padding = padding;
170 ICryptoTransform enc = algo.CreateEncryptor ();
171 byte[] plaintext = new byte[BlockSize * 7];
172 byte[] encdata = enc.TransformFinalBlock (plaintext, 0, plaintext.Length);
174 case PaddingMode.None:
175 case PaddingMode.Zeros:
176 Assert.AreEqual (BlockSize * 7, encdata.Length, "encdata");
179 Assert.AreEqual (BlockSize * 8, encdata.Length, "encdata");
183 ICryptoTransform dec = algo.CreateDecryptor ();
184 byte[] decdata = new byte[plaintext.Length];
185 dec.TransformBlock (encdata, 0, encdata.Length, decdata, 0);
187 Assert.AreEqual (plaintext, decdata, "TransformBlock." + mode.ToString ());
189 dec = algo.CreateDecryptor ();
190 byte[] final = dec.TransformFinalBlock (encdata, 0, encdata.Length);
191 Assert.AreEqual (plaintext, final, "TransformFinalBlock." + mode.ToString ());
195 public void DontDecryptLastBlock_Final_CBC_None ()
197 DontDecryptLastBlock_Final (CipherMode.CBC, PaddingMode.None);
201 public void DontDecryptLastBlock_Final_CBC_PKCS7 ()
203 DontDecryptLastBlock_Final (CipherMode.CBC, PaddingMode.PKCS7);
207 public void DontDecryptLastBlock_Final_CBC_Zeros ()
209 DontDecryptLastBlock_Final (CipherMode.CBC, PaddingMode.Zeros);
213 public void DontDecryptLastBlock_Final_CBC_ANSIX923 ()
215 DontDecryptLastBlock_Final (CipherMode.CBC, PaddingMode.ANSIX923);
219 public void DontDecryptLastBlock_Final_CBC_ISO10126 ()
221 DontDecryptLastBlock_Final (CipherMode.CBC, PaddingMode.ISO10126);
225 public void DontDecryptLastBlock_Final_CFB_None ()
227 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.None);
231 public void DontDecryptLastBlock_Final_CFB_PKCS7 ()
233 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.PKCS7);
237 public void DontDecryptLastBlock_Final_CFB_Zeros ()
239 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.Zeros);
243 public void DontDecryptLastBlock_Final_CFB_ANSIX923 ()
245 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.ANSIX923);
249 public void DontDecryptLastBlock_Final_CFB_ISO10126 ()
251 DontDecryptLastBlock_Final (CipherMode.CFB, PaddingMode.ISO10126);
255 public void DontDecryptLastBlock_Final_ECB_None ()
257 DontDecryptLastBlock_Final (CipherMode.ECB, PaddingMode.None);
261 public void DontDecryptLastBlock_Final_ECB_PKCS7 ()
263 DontDecryptLastBlock_Final (CipherMode.ECB, PaddingMode.PKCS7);
267 public void DontDecryptLastBlock_Final_ECB_Zeros ()
269 DontDecryptLastBlock_Final (CipherMode.ECB, PaddingMode.Zeros);
273 public void DontDecryptLastBlock_Final_ECB_ANSIX923 ()
275 DontDecryptLastBlock_Final (CipherMode.ECB, PaddingMode.ANSIX923);
279 public void DontDecryptLastBlock_Final_ECB_ISO10126 ()
281 DontDecryptLastBlock_Final (CipherMode.ECB, PaddingMode.ISO10126);
284 // similar to previous case but here we try to skip several blocks
285 // i.e. encdata.Length versus decdata.Length
286 public void DontDecryptMultipleBlock (CipherMode mode, PaddingMode padding)
288 SymmetricAlgorithm algo = Algorithm;
290 algo.Padding = padding;
291 ICryptoTransform enc = algo.CreateEncryptor ();
292 byte[] plaintext = new byte[BlockSize * 7];
293 byte[] encdata = new byte[BlockSize * 8];
294 int len = enc.TransformBlock (plaintext, 0, plaintext.Length, encdata, 0);
295 Assert.AreEqual (plaintext.Length, len, "encdata");
297 ICryptoTransform dec = algo.CreateDecryptor ();
298 byte[] decdata = new byte[BlockSize];
299 dec.TransformBlock (encdata, 0, encdata.Length, decdata, 0);
303 [ExpectedException (typeof (CryptographicException))]
304 public void DontDecryptMultipleBlock_CBC_None ()
306 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.None);
310 [ExpectedException (typeof (CryptographicException))]
311 public void DontDecryptMultipleBlock_CBC_PKCS7 ()
313 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.PKCS7);
317 [ExpectedException (typeof (CryptographicException))]
318 public void DontDecryptMultipleBlock_CBC_Zeros ()
320 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.Zeros);
324 [ExpectedException (typeof (CryptographicException))]
325 public void DontDecryptMultipleBlock_CBC_ANSIX923 ()
327 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.ANSIX923);
331 [ExpectedException (typeof (CryptographicException))]
332 public void DontDecryptMultipleBlock_CBC_ISO10126 ()
334 DontDecryptMultipleBlock (CipherMode.CBC, PaddingMode.ISO10126);
338 [ExpectedException (typeof (CryptographicException))]
339 public void DontDecryptMultipleBlock_CFB_None ()
341 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.None);
345 [ExpectedException (typeof (CryptographicException))]
346 public void DontDecryptMultipleBlock_CFB_PKCS7 ()
348 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.PKCS7);
352 [ExpectedException (typeof (CryptographicException))]
353 public void DontDecryptMultipleBlock_CFB_Zeros ()
355 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.Zeros);
359 [ExpectedException (typeof (CryptographicException))]
360 public void DontDecryptMultipleBlock_CFB_ANSIX923 ()
362 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.ANSIX923);
366 [ExpectedException (typeof (CryptographicException))]
367 public void DontDecryptMultipleBlock_CFB_ISO10126 ()
369 DontDecryptMultipleBlock (CipherMode.CFB, PaddingMode.ISO10126);
373 [ExpectedException (typeof (CryptographicException))]
374 public void DontDecryptMultipleBlock_ECB_None ()
376 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.None);
380 [ExpectedException (typeof (CryptographicException))]
381 public void DontDecryptMultipleBlock_ECB_PKCS7 ()
383 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.PKCS7);
387 [ExpectedException (typeof (CryptographicException))]
388 public void DontDecryptMultipleBlock_ECB_Zeros ()
390 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.Zeros);
394 [ExpectedException (typeof (CryptographicException))]
395 public void DontDecryptMultipleBlock_ECB_ANSIX923 ()
397 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.ANSIX923);
401 [ExpectedException (typeof (CryptographicException))]
402 public void DontDecryptMultipleBlock_ECB_ISO10126 ()
404 DontDecryptMultipleBlock (CipherMode.ECB, PaddingMode.ISO10126);
407 // similar to previous case but here the encryption transform was final
408 public void DontDecryptMultipleBlock_Final (CipherMode mode, PaddingMode padding)
410 SymmetricAlgorithm algo = Algorithm;
412 algo.Padding = padding;
413 ICryptoTransform enc = algo.CreateEncryptor ();
414 byte[] plaintext = new byte[BlockSize * 7];
415 byte[] encdata = enc.TransformFinalBlock (plaintext, 0, plaintext.Length);
417 case PaddingMode.None:
418 case PaddingMode.Zeros:
419 Assert.AreEqual (BlockSize * 7, encdata.Length, "encdata");
422 Assert.AreEqual (BlockSize * 8, encdata.Length, "encdata");
426 ICryptoTransform dec = algo.CreateDecryptor ();
427 byte[] decdata = new byte[BlockSize];
428 dec.TransformBlock (encdata, 0, encdata.Length, decdata, 0);
432 [ExpectedException (typeof (CryptographicException))]
433 public void DontDecryptMultipleBlock_Final_CBC_None ()
435 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.None);
439 [ExpectedException (typeof (CryptographicException))]
440 public void DontDecryptMultipleBlock_Final_CBC_PKCS7 ()
442 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.PKCS7);
446 [ExpectedException (typeof (CryptographicException))]
447 public void DontDecryptMultipleBlock_Final_CBC_Zeros ()
449 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.Zeros);
453 [ExpectedException (typeof (CryptographicException))]
454 public void DontDecryptMultipleBlock_Final_CBC_ANSIX923 ()
456 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.ANSIX923);
460 [ExpectedException (typeof (CryptographicException))]
461 public void DontDecryptMultipleBlock_Final_CBC_ISO10126 ()
463 DontDecryptMultipleBlock_Final (CipherMode.CBC, PaddingMode.ISO10126);
467 [ExpectedException (typeof (CryptographicException))]
468 public void DontDecryptMultipleBlock_Final_CFB_None ()
470 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.None);
474 [ExpectedException (typeof (CryptographicException))]
475 public void DontDecryptMultipleBlock_Final_CFB_PKCS7 ()
477 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.PKCS7);
481 [ExpectedException (typeof (CryptographicException))]
482 public void DontDecryptMultipleBlock_Final_CFB_Zeros ()
484 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.Zeros);
488 [ExpectedException (typeof (CryptographicException))]
489 public void DontDecryptMultipleBlock_Final_CFB_ANSIX923 ()
491 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.ANSIX923);
495 [ExpectedException (typeof (CryptographicException))]
496 public void DontDecryptMultipleBlock_Final_CFB_ISO10126 ()
498 DontDecryptMultipleBlock_Final (CipherMode.CFB, PaddingMode.ISO10126);
502 [ExpectedException (typeof (CryptographicException))]
503 public void DontDecryptMultipleBlock_Final_ECB_None ()
505 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.None);
509 [ExpectedException (typeof (CryptographicException))]
510 public void DontDecryptMultipleBlock_Final_ECB_PKCS7 ()
512 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.PKCS7);
516 [ExpectedException (typeof (CryptographicException))]
517 public void DontDecryptMultipleBlock_Final_ECB_Zeros ()
519 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.Zeros);
523 [ExpectedException (typeof (CryptographicException))]
524 public void DontDecryptMultipleBlock_Final_ECB_ANSIX923 ()
526 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.ANSIX923);
530 [ExpectedException (typeof (CryptographicException))]
531 public void DontDecryptMultipleBlock_Final_ECB_ISO10126 ()
533 DontDecryptMultipleBlock_Final (CipherMode.ECB, PaddingMode.ISO10126);
539 public class DESTransformTest: SymmetricAlgorithmTransformTest {
541 public override SymmetricAlgorithm Algorithm {
542 get { return DES.Create (); }
545 // from Lauren Bedoule
546 // note: this test case works only for CBC
547 private void EncryptEncryptDecryptDecrypt (CipherMode mode, PaddingMode padding)
549 SymmetricAlgorithm des = Algorithm;
551 des.Padding = padding;
552 des.IV = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
553 des.Key = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
554 byte[] input = new byte[48] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
555 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF,
556 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
557 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
558 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
559 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F};
560 byte[] result1 = new byte[48];
561 byte[] result2 = new byte[48];
563 ICryptoTransform encryptor = des.CreateEncryptor ();
564 int len = encryptor.TransformBlock (input, 0, input.Length, result1, 0);
565 Assert.AreEqual (48, len, "enc1");
566 len = encryptor.TransformBlock (result1, 0, result1.Length, result2, 0);
567 Assert.AreEqual (48, len, "enc2");
569 des.IV = new byte[] { 0x0F, 0x93, 0x8D, 0xED, 0xE3, 0x37, 0xA3, 0x09 };
570 byte[] result3 = new byte[40];
571 ICryptoTransform decryptor = des.CreateDecryptor ();
572 byte[] result4 = new byte[40];
573 len = decryptor.TransformBlock (result2, 0, result2.Length, result3, 0);
574 Assert.AreEqual (40, len, "dec1");
575 for (int i = 0; i < 40; i++) {
576 Assert.AreEqual (result1[i], result3[i], "dec1." + i);
578 len = decryptor.TransformBlock (result3, 0, len, result4, 0);
579 Assert.AreEqual (40, len, "dec2");
580 for (int i = 0; i < 8; i++) {
581 Assert.AreEqual (result1[40 + i], result4[i], "dec2." + i);
583 for (int i = 8; i < 16; i++) {
584 Assert.AreEqual (result2[i - 8 + 40], result4[i], "dec2." + i);
586 for (int i = 16; i < 40; i++) {
587 Assert.AreEqual (input[i - 16 + 8], result4[i], "dec2." + i);
592 [ExpectedException (typeof (CryptographicException))]
593 public void EncryptEncryptDecryptDecrypt_CBC_None ()
595 EncryptEncryptDecryptDecrypt (CipherMode.CBC, PaddingMode.None);
599 public void EncryptEncryptDecryptDecrypt_CBC_PKCS7 ()
601 EncryptEncryptDecryptDecrypt (CipherMode.CBC, PaddingMode.PKCS7);
605 [ExpectedException (typeof (CryptographicException))]
606 public void EncryptEncryptDecryptDecrypt_CBC_Zeros ()
608 EncryptEncryptDecryptDecrypt (CipherMode.CBC, PaddingMode.Zeros);
612 public void EncryptEncryptDecryptDecrypt_CBC_ANSIX923 ()
614 EncryptEncryptDecryptDecrypt (CipherMode.CBC, PaddingMode.ANSIX923);
618 public void EncryptEncryptDecryptDecrypt_CBC_ISO10126 ()
620 EncryptEncryptDecryptDecrypt (CipherMode.CBC, PaddingMode.ISO10126);
626 public class RC2TransformTest: SymmetricAlgorithmTransformTest {
628 public override SymmetricAlgorithm Algorithm {
629 get { return RC2.Create (); }
634 public class Rijndael128TransformTest: SymmetricAlgorithmTransformTest {
636 public override SymmetricAlgorithm Algorithm {
637 get { return Rijndael.Create (); }
640 public override int BlockSize {
646 public class Rijndael192TransformTest: SymmetricAlgorithmTransformTest {
648 public override SymmetricAlgorithm Algorithm {
650 SymmetricAlgorithm algo = Rijndael.Create ();
651 algo.BlockSize = 192;
652 algo.FeedbackSize = 192;
657 public override int BlockSize {
663 public class Rijndael256TransformTest: SymmetricAlgorithmTransformTest {
665 public override SymmetricAlgorithm Algorithm {
667 SymmetricAlgorithm algo = Rijndael.Create ();
668 algo.BlockSize = 256;
669 algo.FeedbackSize = 256;
674 public override int BlockSize {
680 public class TripleDESTransformTest: SymmetricAlgorithmTransformTest {
682 public override SymmetricAlgorithm Algorithm {
683 get { return TripleDES.Create (); }