File: HomogenizingCryptoServiceWrapper.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (58 lines) | stat: -rw-r--r-- 2,170 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//------------------------------------------------------------------------------
// <copyright file="HomogenizingCryptoServiceWrapper.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------

namespace System.Web.Security.Cryptography {
    using System;
    using System.Configuration;
    using System.Security.Cryptography;

    // Wraps an ICryptoService instance and homogenizes any exceptions that might occur.

    internal sealed class HomogenizingCryptoServiceWrapper : ICryptoService {

        public HomogenizingCryptoServiceWrapper(ICryptoService wrapped) {
            WrappedCryptoService = wrapped;
        }

        internal ICryptoService WrappedCryptoService {
            get;
            private set;
        }

        private static byte[] HomogenizeErrors(Func<byte[], byte[]> func, byte[] input) {
            // If the underlying method returns null or throws an exception, the
            // error will be homogenized as a single CryptographicException.

            byte[] output = null;
            bool allowExceptionToBubble = false;

            try {
                output = func(input);
                return output;
            }
            catch (ConfigurationException) {
                // ConfigurationException isn't a side channel; it means the application is misconfigured.
                // We need to bubble this up so that the developer can react to it.
                allowExceptionToBubble = true;
                throw;
            }
            finally {
                if (output == null && !allowExceptionToBubble) {
                    throw new CryptographicException();
                }
            }
        }

        public byte[] Protect(byte[] clearData) {
            return HomogenizeErrors(WrappedCryptoService.Protect, clearData);
        }

        public byte[] Unprotect(byte[] protectedData) {
            return HomogenizeErrors(WrappedCryptoService.Unprotect, protectedData);
        }

    }
}