1 //
2 // BinarySecretSecurityToken.cs
3 //
4 // Author:
5 //	Atsushi Enomoto <atsushi@ximian.com>
6 //
7 // Copyright (C) 2006 Novell, Inc.  http://www.novell.com
8 //
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:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
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.
27 //
28 using System;
29 using System.Collections.ObjectModel;
30 using System.Xml;
31 using System.IdentityModel.Policy;
32 using System.IdentityModel.Tokens;
33 
34 namespace System.ServiceModel.Security.Tokens
35 {
36 	public class BinarySecretSecurityToken : SecurityToken
37 	{
38 		ReadOnlyCollection<SecurityKey> keys;
39 
40 		string id;
41 		byte [] key;
42 		bool allow_crypto;
43 		DateTime valid_from = DateTime.Now.ToUniversalTime ();
44 
BinarySecretSecurityToken(string id, bool allowCrypto)45 		BinarySecretSecurityToken (string id, bool allowCrypto)
46 		{
47 			this.id = id;
48 			allow_crypto = allowCrypto;
49 		}
50 
BinarySecretSecurityToken(byte [] key)51 		public BinarySecretSecurityToken (byte [] key)
52 			: this ("uuid:" + Guid.NewGuid ().ToString (), key)
53 		{
54 		}
55 
BinarySecretSecurityToken(string id, byte [] key)56 		public BinarySecretSecurityToken (string id, byte [] key)
57 			: this (id, key, false)
58 		{
59 		}
60 
BinarySecretSecurityToken(string id, byte [] key, bool allowCrypto)61 		protected BinarySecretSecurityToken (string id, byte [] key, bool allowCrypto)
62 			: this (id, allowCrypto)
63 		{
64 			if (key == null)
65 				throw new ArgumentNullException ("key");
66 			this.key = key;
67 
68 			SecurityKey [] arr = new SecurityKey [] {new InMemorySymmetricSecurityKey (key)};
69 			keys = new ReadOnlyCollection<SecurityKey> (arr);
70 		}
71 
BinarySecretSecurityToken(int keySizeInBits)72 		public BinarySecretSecurityToken (int keySizeInBits)
73 			: this ("uuid:" + Guid.NewGuid ().ToString (), keySizeInBits)
74 		{
75 		}
76 
BinarySecretSecurityToken(string id, int keySizeInBits)77 		public BinarySecretSecurityToken (string id, int keySizeInBits)
78 			: this (id, keySizeInBits, false)
79 		{
80 		}
81 
BinarySecretSecurityToken(string id, int keySizeInBits, bool allowCrypto)82 		protected BinarySecretSecurityToken (string id, int keySizeInBits, bool allowCrypto)
83 			: this (id, allowCrypto)
84 		{
85 			if (keySizeInBits < 0)
86 				throw new ArgumentOutOfRangeException ("keySizeInBits");
87 
88 			this.key = new byte [keySizeInBits >> 3 + (keySizeInBits % 8 == 0 ? 0 : 1)];
89 
90 			SecurityKey [] arr = new SecurityKey [] {new InMemorySymmetricSecurityKey (key)};
91 			keys = new ReadOnlyCollection<SecurityKey> (arr);
92 		}
93 
94 		public override DateTime ValidFrom {
95 			get { return valid_from; }
96 		}
97 
98 		public override DateTime ValidTo {
99 			get { return DateTime.MaxValue.AddDays (-1); }
100 		}
101 
102 		public override string Id {
103 			get { return id; }
104 		}
105 
106 		public int KeySize {
107 			get { return key.Length; }
108 		}
109 
110 		public override ReadOnlyCollection<SecurityKey> SecurityKeys {
111 			get { return keys; }
112 		}
113 
GetKeyBytes()114 		public byte [] GetKeyBytes ()
115 		{
116 			return (byte []) key.Clone ();
117 		}
118 	}
119 }
120