public override int Start()
 {
     int tests = 0;
     DataProtectionCryptoServiceProvider dp = new DataProtectionCryptoServiceProvider();
     tests += TestDP(dp, Encoding.ASCII.GetBytes(""));
     tests += TestDP(dp, Encoding.ASCII.GetBytes("a"));
     tests += TestDP(dp, Encoding.ASCII.GetBytes("Hello World!"));
     tests += TestDP(dp, Encoding.ASCII.GetBytes("DataProtectionCryptoServiceProvider"));
     tests += TestDP(dp, new byte[200]);
     return tests;
 }
 protected int TestDP(DataProtectionCryptoServiceProvider dp, byte[] data)
 {
     byte[] entropy = new byte[m_Random.Next(5, 123)];
     m_Random.NextBytes(entropy);
     byte[] enc, dec;
     // test without entropy
     try {
         enc = dp.ProtectData(ProtectionType.CurrentUser, data);
         dec = dp.UnprotectData(enc);
         if (!ArrayEquals(dec, data))
             AddError("DP-T01");
     } catch {
         AddError("DP-T02");
     }
     try {
         enc = dp.ProtectData(ProtectionType.LocalMachine, data);
         dec = dp.UnprotectData(enc);
         if (!ArrayEquals(dec, data))
             AddError("DP-T03");
     } catch {
         AddError("DP-T04");
     }
     // test with entropy
     dp.Entropy = entropy;
     try {
         enc = dp.ProtectData(ProtectionType.CurrentUser, data);
         dec = dp.UnprotectData(enc);
         if (!ArrayEquals(dec, data))
             AddError("DP-T05");
     } catch {
         AddError("DP-T06");
     }
     try {
         enc = dp.ProtectData(ProtectionType.LocalMachine, data);
         dec = dp.UnprotectData(enc);
         if (!ArrayEquals(dec, data))
             AddError("DP-T07");
     } catch {
         AddError("DP-T08");
     }
     // test MAC
     try {
         enc = dp.ProtectData(ProtectionType.LocalMachine, data);
         enc[enc.Length / 2] ^= 0xFF; // corrupt a byte
         dec = dp.UnprotectData(enc);
         AddError("DP-T09");
     } catch (CryptographicException) {
     } catch {
         AddError("DP-T10");
     }
     dp.Entropy = null;
     return 10;
 }