Statistics
| Branch: | Revision:

root / trunk / hammock / src / netCF / Hammock.Compact / Security / Cryptography / HMACSHA1.cs @ 0eea575a

History | View | Annotate | Download (2.2 kB)

1
using System;
2
using System.Security.Cryptography;
3
using Hammock.Mono.Security.Cryptography;
4

    
5
namespace Hammock.Security.Cryptography
6
{
7
  public class HMACSHA1 : KeyedHashAlgorithm
8
  {
9
    private readonly HMACAlgorithm hmac;
10
    private bool m_disposed;
11

    
12
    public override sealed byte[] Key
13
    {
14
      get
15
      {
16
        return base.Key;
17
      }
18
      set
19
      {
20
        this.hmac.Key = value;
21
        base.Key = value;
22
      }
23
    }
24

    
25
    public string HashName
26
    {
27
      get
28
      {
29
        return this.hmac.HashName;
30
      }
31
      set
32
      {
33
        if (this.State == 0)
34
          this.hmac.HashName = value;
35
      }
36
    }
37

    
38
    public HMACSHA1()
39
      : this(KeyBuilder.Key(8))
40
    {
41
    }
42

    
43
    public HMACSHA1(byte[] rgbKey)
44
    {
45
      this.hmac = new HMACAlgorithm("SHA1");
46
      this.HashSizeValue = 160;
47
      this.Key = rgbKey;
48
      this.m_disposed = false;
49
    }
50

    
51
    ~HMACSHA1()
52
    {
53
      this.Dispose(false);
54
    }
55

    
56
    protected override void Dispose(bool disposing)
57
    {
58
      if (!this.m_disposed)
59
      {
60
        if (this.hmac != null)
61
          this.hmac.Dispose();
62
        base.Dispose(disposing);
63
        this.m_disposed = true;
64
      }
65
    }
66

    
67
    public override void Initialize()
68
    {
69
      if (this.m_disposed)
70
        throw new ObjectDisposedException("HMACSHA1");
71
      else if (!(this.hmac.Algo is SHA1))
72
      {
73
        throw new InvalidCastException(string.Format("Invalid hash algorithm '{0}', expected '{1}'.", this.hmac.Algo == null ? (object)"none" : (object)this.hmac.Algo.GetType().ToString(), (object)"SHA1"));
74
      }
75
      else
76
      {
77
        this.State = 0;
78
        this.hmac.Initialize();
79
      }
80
    }
81

    
82
    protected override void HashCore(byte[] rgb, int ib, int cb)
83
    {
84
      if (this.m_disposed)
85
      {
86
        throw new ObjectDisposedException("HMACSHA1");
87
      }
88
      else
89
      {
90
        if (this.State == 0)
91
        {
92
          this.Initialize();
93
          this.State = 1;
94
        }
95
        this.hmac.Core(rgb, ib, cb);
96
      }
97
    }
98

    
99
    protected override byte[] HashFinal()
100
    {
101
      if (this.m_disposed)
102
      {
103
        throw new ObjectDisposedException("HMACSHA1");
104
      }
105
      else
106
      {
107
        this.State = 0;
108
        return this.hmac.Final();
109
      }
110
    }
111
  }
112
}