1 // 2 // KeyedHashAlgorithmTest.cs - NUnit Test Cases for KeyedHashAlgorithm 3 // 4 // Author: 5 // Sebastien Pouliot <sebastien@ximian.com> 6 // 7 // (C) 2002 Motus Technologies Inc. (http://www.motus.com) 8 // Copyright (C) 2004, 2007 Novell, Inc (http://www.novell.com) 9 // 10 11 using NUnit.Framework; 12 using System; 13 using System.Security.Cryptography; 14 using System.Text; 15 16 namespace MonoTests.System.Security.Cryptography { 17 18 // KeyedHashAlgorithm is a abstract class - so most of it's functionality wont 19 // be tested here (but will be in its descendants). 20 21 [TestFixture] 22 public class KeyedHashAlgorithmTest : HashAlgorithmTestBase { 23 24 [SetUp] SetUp()25 public override void SetUp () 26 { 27 hash = KeyedHashAlgorithm.Create (); 28 (hash as KeyedHashAlgorithm).Key = new byte [8]; 29 } 30 31 // Note: These tests will only be valid without a "machine.config" file 32 // or a "machine.config" file that do not modify the default algorithm 33 // configuration. 34 private const string defaultHMACSHA1 = "System.Security.Cryptography.HMACSHA1"; 35 private const string defaultMACTripleDES = "System.Security.Cryptography.MACTripleDES"; 36 private const string defaultKeyedHash = defaultHMACSHA1; 37 38 [Test] Create()39 public override void Create () 40 { 41 // try the default keyed hash algorithm (created in SetUp) 42 Assert.AreEqual (defaultKeyedHash, KeyedHashAlgorithm.Create ().ToString (), "KeyedHashAlgorithm.Create()"); 43 44 // try to build all hash algorithms 45 hash = KeyedHashAlgorithm.Create ("HMACSHA1"); 46 Assert.AreEqual (defaultHMACSHA1, hash.ToString (), "KeyedHashAlgorithm.Create('HMACSHA1')"); 47 hash = KeyedHashAlgorithm.Create ("System.Security.Cryptography.HMACSHA1"); 48 Assert.AreEqual (defaultHMACSHA1, hash.ToString (), "KeyedHashAlgorithm.Create('System.Security.Cryptography.HMACSHA1')"); 49 hash = KeyedHashAlgorithm.Create ("System.Security.Cryptography.KeyedHashAlgorithm" ); 50 Assert.AreEqual (defaultKeyedHash, hash.ToString (), "KeyedHashAlgorithm.Create('System.Security.Cryptography.KeyedHashAlgorithm')"); 51 52 hash = KeyedHashAlgorithm.Create ("MACTripleDES"); 53 Assert.AreEqual (defaultMACTripleDES, hash.ToString (), "KeyedHashAlgorithm.Create('MACTripleDES')"); 54 hash = KeyedHashAlgorithm.Create ("System.Security.Cryptography.MACTripleDES"); 55 Assert.AreEqual (defaultMACTripleDES, hash.ToString (), "KeyedHashAlgorithm.Create('System.Security.Cryptography.MACTripleDES')"); 56 57 // try to build invalid implementation 58 hash = KeyedHashAlgorithm.Create ("InvalidKeyedHash"); 59 Assert.IsNull (hash, "KeyedHashAlgorithm.Create('InvalidKeyedHash')"); 60 } 61 62 [Test] 63 [ExpectedException (typeof (ArgumentNullException))] CreateNull()64 public override void CreateNull () 65 { 66 hash = KeyedHashAlgorithm.Create (null); 67 } 68 69 [Test] Key()70 public void Key () 71 { 72 KeyedHashAlgorithm kh = (KeyedHashAlgorithm) hash; 73 Assert.IsNotNull (kh.Key, "KeyedHashAlgorithm.Key not null (random key)"); 74 byte[] key = { 0x01, 0x02, 0x03 }; 75 byte[] keybackup = (byte[]) key.Clone (); 76 kh.Key = key; 77 // the KeyedHashAlgorithm use a copy of the key (not a reference to) 78 key [0] = 0x00; 79 Assert.AreEqual (kh.Key, keybackup, "KeyedHashAlgorithm key[0]-before"); 80 // you can't change individual bytes from a key 81 kh.Key [0] = 0x00; 82 Assert.AreEqual (kh.Key, keybackup, "KeyedHashAlgorithm.Key[0]-after"); 83 } 84 85 [Test] 86 [ExpectedException (typeof (CryptographicException))] ChangeKey()87 public void ChangeKey () 88 { 89 KeyedHashAlgorithm kh = (KeyedHashAlgorithm) hash; 90 byte[] key = { 0x01, 0x02, 0x03 }; 91 byte[] keybackup = (byte[]) key.Clone (); 92 kh.Key = key; 93 94 // can't change a key after starting an operation 95 kh.TransformBlock (key, 0, 3, keybackup, 0); 96 kh.Key = keybackup; 97 } 98 } 99 100 } 101