2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System.Security / System.Security.Cryptography.Pkcs / ContentInfo.cs
1 //
2 // System.Security.Cryptography.Pkcs.ContentInfo
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
8 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 #if NET_2_0
31
32 using System;
33 using System.Security.Cryptography;
34
35 using Mono.Security;
36
37 namespace System.Security.Cryptography.Pkcs {
38
39         /*
40         * ContentInfo ::= SEQUENCE {
41         *       contentType ContentType,
42         *       content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL 
43         * }
44         * ContentType ::= OBJECT IDENTIFIER
45         */
46
47         public sealed class ContentInfo {
48
49                 private Oid _oid;
50                 private byte[] _content;
51
52                 // constructors
53
54                 public ContentInfo (byte[] content) 
55                         : this (new Oid ("1.2.840.113549.1.7.1"), content)
56                 {
57                 } 
58
59                 public ContentInfo (Oid oid, byte[] content) 
60                 {
61                         if (oid == null)
62                                 throw new ArgumentNullException ("oid");
63                         if (content == null)
64                                 throw new ArgumentNullException ("content");
65
66                         _oid = oid;
67                         _content = content;
68                 }
69
70                 ~ContentInfo () 
71                 {
72                 }
73
74                 // properties
75
76                 public byte[] Content { 
77                         get { return _content; }
78                 }
79
80                 public Oid ContentType { 
81                         get { return _oid; }
82                 }
83
84                 // static methods
85
86                 [MonoTODO("Incomplete OID support")]
87                 public static Oid GetContentType (byte[] encodedMessage)
88                 {
89 // FIXME: compatibility with fx 1.2.3400.0
90                         if (encodedMessage == null)
91                                 throw new NullReferenceException ();
92 //                              throw new ArgumentNullException ("algorithm");
93                         try {
94                                 PKCS7.ContentInfo ci = new PKCS7.ContentInfo (encodedMessage);
95                                 switch (ci.ContentType) {
96                                         // TODO - there are probably more - need testing
97                                         case PKCS7.Oid.signedData:
98                                                 return new Oid (ci.ContentType);
99                                         default:
100                                                 throw new CryptographicException ("Bad ASN1 - invalid OID");
101                                 }
102                         }
103                         catch (Exception e) {
104                                 throw new CryptographicException ("Bad ASN1 - invalid structure", e);
105                         }
106                 }
107         }
108 }
109
110 #endif